Merge branch 'master' into rig-int

This commit is contained in:
David Myriel
2024-11-14 15:20:41 -08:00
committed by GitHub
128 changed files with 2431 additions and 384 deletions
+3 -3
View File
@@ -6,17 +6,17 @@ command = "bash -x ./install-and-build.sh"
HUGO_VERSION = "0.123.0" HUGO_VERSION = "0.123.0"
DART_SASS_VERSION = "1.70.0" DART_SASS_VERSION = "1.70.0"
NODE_VERSION = "20.10.0" NODE_VERSION = "20.10.0"
HUGO_PARAMS_segmentWriteKey = "HtxD8cbIlx3I98cyMdEFl6tBcJ3Cwagc" HUGO_PARAMS_segmentWriteKey = "UOgPyE2GbtD4lletUP2uWfBGQQSfkzf1"
[context.production.environment] [context.production.environment]
HUGO_ENV = "production" HUGO_ENV = "production"
HUGO_ENABLEGITINFO = "true" HUGO_ENABLEGITINFO = "true"
DEPLOY_PRIME_URL = "https://qdrant.tech" DEPLOY_PRIME_URL = "https://qdrant.tech"
HUGO_PARAMS_segmentWriteKey = "FDCshQlKE2lWbOkvTXYHXY9Vof3ZFKoV" HUGO_PARAMS_segmentWriteKey = "eQYi1nZE2zQSmnHuxjMRlDd2uLl65oHe"
[context.deploy-preview.environment] [context.deploy-preview.environment]
HUGO_ENV = "staging" HUGO_ENV = "staging"
HUGO_PARAMS_segmentWriteKey = "kcpVTrfNQqfL07HhMjVM08g0a3aH2Oek" HUGO_PARAMS_segmentWriteKey = "DZ49RYXkFEV0pY6DG4i0RyxyobSovIlU"
[[headers]] [[headers]]
for = "/*" for = "/*"
+3
View File
@@ -107,6 +107,9 @@ disableKinds = ["taxonomy", "term"]
[markup.highlight] [markup.highlight]
noClasses = false noClasses = false
codeFences=true codeFences=true
[markup.tableOfContents]
startLevel = 1
endLevel = 3
[related] [related]
includeNewer = true includeNewer = true
@@ -44,9 +44,9 @@ FastEmbed already had support for embeddings, but re-ranking with cross-encoders
One thing I had to ensure was that the new class hierarchy was user-friendly. Users should be able to work with cross-encoders without needing to know the complexities of the underlying models. For instance, they should be able to just write: One thing I had to ensure was that the new class hierarchy was user-friendly. Users should be able to work with cross-encoders without needing to know the complexities of the underlying models. For instance, they should be able to just write:
```python ```python
from fastembed import TextCrossEncoder from fastembed.rerank.cross_encoder import TextCrossEncoder
encoder = TextCrossEncoder(model_name='Xenova/ms-marco-MiniLM-L-6-v2') encoder = TextCrossEncoder(model_name="Xenova/ms-marco-MiniLM-L-6-v2")
scores = encoder.rerank(query, documents) scores = encoder.rerank(query, documents)
``` ```
@@ -2,7 +2,74 @@
title: Home title: Home
weight: 2 weight: 2
hideTOC: true hideTOC: true
breadcrumb: false
content:
- partial: "documentation/banners/banner-a"
title: Qdrant Documentation
description: Qdrant is an AI-native vector database and a semantic search engine. You can use it to extract meaningful information from unstructured data.
linkDescription: <a href="https://github.com/qdrant/qdrant_demo/" target="_blank">Clone this repo now</a> and build a search engine in five minutes.
cloudButton:
text: Cloud Quickstart
url: /documentation/quickstart-cloud/
localButton:
text: Local Quickstart
url: /documentation/quickstart/
contained: true
- partial: documentation/banners/banner-d
developingTitle: Ready to start developing?
developingDescription: Qdrant is open-source and can be self-hosted. However, the quickest way to get started is with our <a href="https://qdrant.to/cloud" target="_blank">free tier</a> on Qdrant Cloud. It scales easily and provides a UI where you can interact with data.
developingBlock:
title: Create your first Qdrant Cloud cluster today
button:
text: Get Started
url: https://qdrant.to/cloud
image:
src: /img/rocket.svg
alt: Rocket
- partial: documentation/sections/cards-section
title: Optimize Qdrant's performance
description: Boost search speed, reduce latency, and improve the accuracy and memory usage of your Qdrant deployment.
button:
text: Learn More
url: /documentation/guides/optimize/
cardsPartial: documentation/cards/docs-cards
cards:
- id: 1
tag: Documents
icon:
src: /icons/outline/documentation-blue.svg
alt: Documents
title: Distributed Deployment
description: Scale Qdrant beyond a single node and optimize for high availability, fault tolerance, and billion-scale performance.
link:
url: /documentation/guides/distributed_deployment/
text: Read More
- id: 2
tag: Documents
icon:
src: /icons/outline/documentation-blue.svg
alt: Documents
title: Multitenancy
description: Build vector search apps that serve millions of users. Learn about data isolation, security, and performance tuning.
link:
url: /documentation/guides/multiple-partitions/
text: Read More
- id: 3
tag: Blog
tagColor: violet
icon:
src: /icons/outline/blog-purple.svg
alt: Blog
title: Vector Quantization
description: Learn about cutting-edge techniques for vector quantization and how they can be used to improve search performance.
link:
url: /articles/what-is-vector-quantization/
text: Read More
partition: qdrant
--- ---
THIS CONTENT IS GOING TO BE IGNORED FOR NOW
# Documentation # Documentation
Qdrant is an AI-native vector database and a semantic search engine. You can use it to extract meaningful information from unstructured data. Want to see how it works? [Clone this repo now](https://github.com/qdrant/qdrant_demo/) and build a search engine in five minutes. Qdrant is an AI-native vector database and a semantic search engine. You can use it to extract meaningful information from unstructured data. Want to see how it works? [Clone this repo now](https://github.com/qdrant/qdrant_demo/) and build a search engine in five minutes.
@@ -0,0 +1,49 @@
---
title: Build World-Class Applications
slug: build
breadcrumb: false
content:
- partial: documentation/banners/banner-c
title: Build World-Class Applications
description: Dev-portal Build
image:
src: /img/dev-portal-build/spanish-ai-app-hero.png
alt: Spanish AI app.png
startedButton:
text: Get Started
url: https://qdrant.to/cloud
- partial: documentation/sections/cards-section
title: Start Building
description: Deploy and manage high-performance vector search clusters across cloud environments. Easily scale with fully managed cloud solutions, integrate seamlessly across hybrid setups, or maintain complete control with private cloud deployments in Kubernetes.
cardsPartial: documentation/cards/docs-cards
cards:
- id: 1
image:
src: /img/dev-portal-build/search.png
alt: Search
title: Search
description: Build a simple neural search service with Qdrant and FastEmbed. Learn how to upload data, create indexes, and run search queries.
link:
url: /documentation/tutorials/hybrid-search-fastembed/
text: Read More
- id: 2
image:
src: /img/dev-portal-build/rag.png
alt: RAG
title: RAG
description: Build end-to-end prototype chatbots. Learn how Qdrant integrates with popular RAG frameworks like LangChain and Llamaindex.
link:
url: /documentation/frameworks/langchain/
text: Read More
- id: 3
image:
src: /img/dev-portal-build/pipelines.png
alt: Pipelines
title: Pipelines
description: Integrate Qdrant into your data infrastructure by connecting with popular data engineering tools.
link:
url: /documentation/send-data/
text: Read More
partition: build
hideInSidebar: true
---
@@ -0,0 +1,73 @@
---
title: Welcome to Qdrant Cloud
slug: cloud-intro
breadcrumb: false
content:
- partial: documentation/banners/banner-b
title: Welcome to Qdrant Cloud
description: Dev-portal Cloud
image:
src: /img/dev-portal-cloud/dev-portal-cloud-hero.png
alt: Qdrant cloud dashboard
startedButton:
text: Get Started
url: https://qdrant.to/cloud
- partial: documentation/sections/cards-section
title: Managed Services
description: Deploy and manage high-performance vector search clusters across cloud environments. Easily scale with fully managed cloud solutions, integrate seamlessly across hybrid setups, or maintain complete control with private cloud deployments in Kubernetes.
cardsPartial: documentation/cards/docs-cards
cards:
- id: 1
image:
src: /img/dev-portal-cloud/managed-cloud.png
alt: Qdrant Cloud
title: Qdrant Cloud
description: Qdrant Managed Cloud is our SaaS solution, providing managed Qdrant database clusters on the cloud.
link:
url: /documentation/cloud/
text: Read More
- id: 2
image:
src: /img/dev-portal-cloud/hybrid-cloud.png
alt: Hybrid Cloud
title: Hybrid Cloud
description: Deploy and manage your vector database across diverse environments, ensuring performance, security, and cost efficiency.
link:
url: /documentation/hybrid-cloud/
text: Read More
- id: 3
image:
src: /img/dev-portal-cloud/private-cloud.png
alt: Private Cloud
title: Private Cloud
description: Qdrant Private Cloud allows you to manage Qdrant database clusters in any Kubernetes cluster on any infrastructure.
link:
url: /documentation/private-cloud/
text: Read More
- partial: documentation/sections/cards-section
title: Customer Support
description: Stream, index, and migrate data to Qdrant with these essential tools and strategies.
cardsPartial: documentation/cards/docs-cards
cardsPerRow: 2
cards:
- id: 1
icon:
src: /icons/outline/discord-purple.svg
alt: Discord icon
title: Community Support
description: Join 6,000+ active members to learn, collaborate, and participate in Qdrant’s latest activities.
link:
text: Join our Discord
url: https://qdrant.to/discord
- id: 2
icon:
src: /icons/outline/support-blue.svg
alt: Support icon
title: Qdrant Cloud Support
description: Paying customers have access to our Support team. Links to the support portal are available in the Qdrant Cloud Console.
link:
text: Join Qdrant
url: https://qdrant.to/cloud
partition: cloud
hideInSidebar: true
---
@@ -3,6 +3,7 @@ title: Managed Cloud
weight: 12 weight: 12
aliases: aliases:
- /documentation/overview/qdrant-alternatives/documentation/cloud/ - /documentation/overview/qdrant-alternatives/documentation/cloud/
partition: cloud
--- ---
# About Qdrant Managed Cloud # About Qdrant Managed Cloud
@@ -2,6 +2,7 @@
title: Concepts title: Concepts
weight: 8 weight: 8
# If the index.md file is empty, the link to the section will be hidden from the sidebar # If the index.md file is empty, the link to the section will be hidden from the sidebar
partition: qdrant
--- ---
# Concepts # Concepts
@@ -859,7 +859,7 @@ curl -X PATCH http://localhost:6333/collections/{collection_name} \
```python ```python
client.update_collection( client.update_collection(
collection_name="{collection_name}", collection_name="{collection_name}",
optimizer_config=models.OptimizersConfigDiff(indexing_threshold=10000), optimizers_config=models.OptimizersConfigDiff(indexing_threshold=10000),
) )
``` ```
@@ -1,6 +1,7 @@
--- ---
title: Data Management title: Data Management
weight: 18 weight: 18
partition: build
--- ---
## Data Management Integrations ## Data Management Integrations
@@ -1,6 +1,7 @@
--- ---
title: Practice Datasets title: Practice Datasets
weight: 29 weight: 29
partition: build
--- ---
# Common Datasets in Snapshot Format # Common Datasets in Snapshot Format
@@ -0,0 +1,11 @@
---
#Delimiter files are used to separate the list of documentation pages into sections.
title: "Interfaces"
type: delimiter
weight: 25 # Change this weight to change order of sections
sitemapExclude: True
_build:
publishResources: false
render: never
partition: cloud
---
@@ -2,9 +2,10 @@
#Delimiter files are used to separate the list of documentation pages into sections. #Delimiter files are used to separate the list of documentation pages into sections.
title: "Support" title: "Support"
type: delimiter type: delimiter
weight: 27 # Change this weight to change order of sections weight: 30 # Change this weight to change order of sections
sitemapExclude: True sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
render: never render: never
partition: cloud
--- ---
@@ -3,6 +3,7 @@
title: "Examples" title: "Examples"
type: delimiter type: delimiter
weight: 24 # Change this weight to change order of sections weight: 24 # Change this weight to change order of sections
partition: build
sitemapExclude: True sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
@@ -7,4 +7,5 @@ sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
render: never render: never
--- partition: qdrant
---
@@ -7,4 +7,5 @@ sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
render: never render: never
partition: build
--- ---
@@ -7,4 +7,5 @@ sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
render: never render: never
partition: cloud
--- ---
@@ -0,0 +1,11 @@
---
#Delimiter files are used to separate the list of documentation pages into sections.
title: "Support"
type: delimiter
weight: 30 # Change this weight to change order of sections
sitemapExclude: True
_build:
publishResources: false
render: never
partition: qdrant
---
@@ -7,4 +7,5 @@ sitemapExclude: True
_build: _build:
publishResources: false publishResources: false
render: never render: never
partition: qdrant
--- ---
@@ -2,6 +2,7 @@
--- ---
title: Embeddings title: Embeddings
weight: 19 weight: 19
partition: build
--- ---
# Supported Embedding Providers & Models # Supported Embedding Providers & Models
@@ -1,6 +1,7 @@
--- ---
title: Build Prototypes title: Build Prototypes
weight: 26 weight: 26
partition: build
--- ---
# Examples # Examples
@@ -1,5 +1,6 @@
--- ---
title: FAQ title: FAQ
weight: 28 weight: 31
partition: qdrant
is_empty: true is_empty: true
--- ---
@@ -1,6 +1,7 @@
--- ---
title: "FastEmbed" title: "FastEmbed"
weight: 6 weight: 6
partition: qdrant
--- ---
# What is FastEmbed? # What is FastEmbed?
@@ -1,31 +1,36 @@
--- ---
title: Frameworks title: Frameworks
weight: 20 weight: 20
partition: build
--- ---
## Framework Integrations ## Framework Integrations
| Framework | Description | | Framework | Description |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| [AutoGen](/documentation/frameworks/autogen/) | Framework from Microsoft building LLM applications using multiple conversational agents. | | [AutoGen](/documentation/frameworks/autogen/) | Framework from Microsoft building LLM applications using multiple conversational agents. |
| [Canopy](/documentation/frameworks/canopy/) | Framework from Pinecone for building RAG applications using LLMs and knowledge bases. | | [Canopy](/documentation/frameworks/canopy/) | Framework from Pinecone for building RAG applications using LLMs and knowledge bases. |
| [Cheshire Cat](/documentation/frameworks/cheshire-cat/) | Framework to create personalized AI assistants using custom data. | | [Cheshire Cat](/documentation/frameworks/cheshire-cat/) | Framework to create personalized AI assistants using custom data. |
| [DocArray](/documentation/frameworks/docarray/) | Python library for managing data in multi-modal AI applications. | | [DocArray](/documentation/frameworks/docarray/) | Python library for managing data in multi-modal AI applications. |
| [DSPy](/documentation/frameworks/dspy/) | Framework for algorithmically optimizing LM prompts and weights. | | [DSPy](/documentation/frameworks/dspy/) | Framework for algorithmically optimizing LM prompts and weights. |
| [Fifty-One](/documentation/frameworks/fifty-one/) | Toolkit for building high-quality datasets and computer vision models. | | [Feast](/documentation/frameworks/feast/) | Open-source feature store to operate production ML systems at scale as a set of features. |
| [Genkit](/documentation/frameworks/genkit/) | Framework to build, deploy, and monitor production-ready AI-powered apps. | | [Fifty-One](/documentation/frameworks/fifty-one/) | Toolkit for building high-quality datasets and computer vision models. |
| [Haystack](/documentation/frameworks/haystack/) | LLM orchestration framework to build customizable, production-ready LLM applications. | | [Genkit](/documentation/frameworks/genkit/) | Framework to build, deploy, and monitor production-ready AI-powered apps. |
| [Lakechain](/documentation/frameworks/lakechain/) | Python framework for deploying document processing pipelines on AWS using infrastructure-as-code. | | [Haystack](/documentation/frameworks/haystack/) | LLM orchestration framework to build customizable, production-ready LLM applications. |
| [Langchain](/documentation/frameworks/langchain/) | Python framework for building context-aware, reasoning applications using LLMs. | | [Lakechain](/documentation/frameworks/lakechain/) | Python framework for deploying document processing pipelines on AWS using infrastructure-as-code. |
| [Langchain-Go](/documentation/frameworks/langchain-go/) | Go framework for building context-aware, reasoning applications using LLMs. | | [Langchain](/documentation/frameworks/langchain/) | Python framework for building context-aware, reasoning applications using LLMs. |
| [Langchain4j](/documentation/frameworks/langchain4j/) | Java framework for building context-aware, reasoning applications using LLMs. | | [Langchain-Go](/documentation/frameworks/langchain-go/) | Go framework for building context-aware, reasoning applications using LLMs. |
| [LlamaIndex](/documentation/frameworks/llama-index/) | A data framework for building LLM applications with modular integrations. | | [Langchain4j](/documentation/frameworks/langchain4j/) | Java framework for building context-aware, reasoning applications using LLMs. |
| [Mem0](/documentation/frameworks/mem0/) | Self-improving memory layer for LLM applications, enabling personalized AI experiences. | | [LlamaIndex](/documentation/frameworks/llama-index/) | A data framework for building LLM applications with modular integrations. |
| [MemGPT](/documentation/frameworks/memgpt/) | System to build LLM agents with long term memory & custom tools | | [Mem0](/documentation/frameworks/mem0/) | Self-improving memory layer for LLM applications, enabling personalized AI experiences. |
| [Pandas-AI](/documentation/frameworks/pandas-ai/) | Python library to query/visualize your data (CSV, XLSX, PostgreSQL, etc.) in natural language | | [MemGPT](/documentation/frameworks/memgpt/) | System to build LLM agents with long term memory & custom tools |
| [Rig-rs](/documentation/frameworks/rig-rs/) | Rust library for building scalable, modular, and ergonomic LLM-powered applications. | | [Neo4j GraphRAG](/documentation/frameworks/neo4j-graphrag/) | Package to build graph retrieval augmented generation (GraphRAG) applications using Neo4j and Python. |
| [Semantic Router](/documentation/frameworks/semantic-router/) | Python library to build a decision-making layer for AI applications using vector search. | | [Pandas-AI](/documentation/frameworks/pandas-ai/) | Python library to query/visualize your data (CSV, XLSX, PostgreSQL, etc.) in natural language |
| [Spring AI](/documentation/frameworks/spring-ai/) | Java AI framework for building with Spring design principles such as portability and modular design. | | [Ragbits](/documentation/frameworks/ragbits/) | Python package that offers essential "bits" for building powerful Retrieval-Augmented Generation (RAG) applications. |
| [Sycamore](/documentation/frameworks/sycamore/) | Document processing engine for ETL, RAG, LLM-based applications, and analytics on unstructured data. | | [Rig-rs](/documentation/frameworks/rig-rs/) | Rust library for building scalable, modular, and ergonomic LLM-powered applications. |
| [txtai](/documentation/frameworks/txtai/) | Python library for semantic search, LLM orchestration and language model workflows. | | [Semantic Router](/documentation/frameworks/semantic-router/) | Python library to build a decision-making layer for AI applications using vector search. |
| [Vanna AI](/documentation/frameworks/vanna-ai/) | Python RAG framework for SQL generation and querying. | | [Spring AI](/documentation/frameworks/spring-ai/) | Java AI framework for building with Spring design principles such as portability and modular design. |
| [Sycamore](/documentation/frameworks/sycamore/) | Document processing engine for ETL, RAG, LLM-based applications, and analytics on unstructured data. |
| [txtai](/documentation/frameworks/txtai/) | Python library for semantic search, LLM orchestration and language model workflows. |
| [Vanna AI](/documentation/frameworks/vanna-ai/) | Python RAG framework for SQL generation and querying. |
@@ -0,0 +1,63 @@
---
title: Feast
---
## Feast
[Feast (**Fe**ature **St**ore)](https://docs.feast.dev) is an open-source feature store that helps teams operate production ML systems at scale by allowing them to define, manage, validate, and serve features for production AI/ML.
Qdrant is available as a supported vectorstore in Feast to integrate in your workflows.
## Insatallation
To use the Qdrant online store, you need to install Feast with the `qdrant` extra.
```bash
pip install 'feast[qdrant]'
```
## Usage
An example config with Qdrant could look like:
```yaml
project: my_feature_repo
registry: data/registry.db
provider: local
online_store:
type: qdrant
host: xyz-example.eu-central.aws.cloud.qdrant.io
port: 6333
api_key: <your-own-key>
vector_len: 384
# Reference: https://qdrant.tech/documentation/concepts/vectors/#named-vectors
# vector_name: text-vec
write_batch_size: 100
```
You can refer to the Feast [reference](https://rtd.feast.dev/en/master/index.html#) for the full list of configuration options.
## Retrieving Documents
The Qdrant online store supports retrieving document vectors for a given list of entity keys. The document vectors are returned as a dictionary where the key is the entity key and the value being the vector.
```python
from feast import FeatureStore
feature_store = FeatureStore(repo_path="feature_store.yaml")
query_vector = [1.0, 2.0, 3.0, 4.0, 5.0]
top_k = 5
feature_values = feature_store.retrieve_online_documents(
feature="my_feature",
query=query_vector,
top_k=top_k
)
```
## 📚 Further Reading
- [Feast Docs](http://docs.feast.dev/)
- [Feast Reference](https://rtd.feast.dev/en/master/index.html/)
- [Source](https://github.com/feast-dev/feast/tree/master/sdk/python/feast/infra/online_stores/)
@@ -0,0 +1,69 @@
---
title: Neo4j GraphRAG
---
# Neo4j GraphRAG
[Neo4j GraphRAG](https://neo4j.com/docs/neo4j-graphrag-python/current/) is a Python package to build graph retrieval augmented generation (GraphRAG) applications using Neo4j and Python. As a first-party library, it offers a robust, feature-rich, and high-performance solution, with the added assurance of long-term support and maintenance directly from Neo4j. It offers a Qdrant retriever natively to search for vectors stored in a Qdrant collection.
## Installation
```bash
pip install neo4j-graphrag[qdrant]
```
## Usage
A vector query with Neo4j and Qdrant could look like:
```python
from neo4j import GraphDatabase
from neo4j_graphrag.retrievers import QdrantNeo4jRetriever
from qdrant_client import QdrantClient
from examples.embedding_biology import EMBEDDING_BIOLOGY
NEO4J_URL = "neo4j://localhost:7687"
NEO4J_AUTH = ("neo4j", "password")
with GraphDatabase.driver(NEO4J_URL, auth=NEO4J_AUTH) as neo4j_driver:
retriever = QdrantNeo4jRetriever(
driver=neo4j_driver,
client=QdrantClient(url="http://localhost:6333"),
collection_name="{collection_name}",
id_property_external="neo4j_id",
id_property_neo4j="id",
)
retriever.search(query_vector=[0.5523, 0.523, 0.132, 0.523, ...], top_k=5)
```
Alternatively, you can use any [Langchain embeddings providers](https://python.langchain.com/docs/integrations/text_embedding/), to vectorize text queries automatically.
```python
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from neo4j import GraphDatabase
from neo4j_graphrag.retrievers import QdrantNeo4jRetriever
from qdrant_client import QdrantClient
NEO4J_URL = "neo4j://localhost:7687"
NEO4J_AUTH = ("neo4j", "password")
with GraphDatabase.driver(NEO4J_URL, auth=NEO4J_AUTH) as neo4j_driver:
embedder = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
retriever = QdrantNeo4jRetriever(
driver=neo4j_driver,
client=QdrantClient(url="http://localhost:6333"),
collection_name="{collection_name}",
id_property_external="neo4j_id",
id_property_neo4j="id",
embedder=embedder,
)
retriever.search(query_text="my user query", top_k=10)
```
## Further Reading
- [Neo4j GraphRAG Reference](https://neo4j.com/docs/neo4j-graphrag-python/current/index.html)
- [Qdrant Retriever Reference](https://neo4j.com/docs/neo4j-graphrag-python/current/user_guide_rag.html#qdrant-neo4j-retriever-user-guide)
- [Source](https://github.com/neo4j/neo4j-graphrag-python/tree/main/src/neo4j_graphrag/retrievers/external/qdrant)
@@ -0,0 +1,83 @@
---
title: Ragbits
---
# Ragbits
[Ragbit](https://ragbits.deepsense.ai) is a Python package that offers essential "bits" for building powerful Retrieval-Augmented Generation (RAG) applications. It prioritizes developer experience by providing a simple and intuitive API. It also includes a comprehensive set of tools for seamlessly building, testing, and deploying your RAG applications efficiently.
Qdrant is available as a vectorstore in Ragbits to ingest and search search documents from a collection.
## Installation
Install the Python package that comes bundled with the Qdrant integration.
```bash
pip install ragbits
```
## Usage
An example usage of Ragbits and Qdrant would look something like this:
The following example uses [OpenAI embeddings](https://platform.openai.com/docs/guides/embeddings) via [LiteLLM](https://www.litellm.ai).
```python
import asyncio
from qdrant_client import AsyncQdrantClient
from ragbits.core.embeddings.litellm import LiteLLMEmbeddings
from ragbits.core.vector_stores.qdrant import QdrantVectorStore
from ragbits.document_search import DocumentSearch, SearchConfig
from ragbits.document_search.documents.document import DocumentMeta
documents = [
DocumentMeta.create_text_document_from_literal(
"RIP boiled water. You will be mist."
),
DocumentMeta.create_text_document_from_literal(
"Why programmers don't like to swim? Because they're scared of the floating points."
),
DocumentMeta.create_text_document_from_literal("This one is completely unrelated."),
]
async def main() -> None:
embedder = LiteLLMEmbeddings(
model="text-embedding-3-small",
)
vector_store = QdrantVectorStore(
client=AsyncQdrantClient(url="http://localhost:6333"),
collection_name="{collection_name}",
)
document_search = DocumentSearch(
embedder=embedder,
vector_store=vector_store,
)
await document_search.ingest(documents)
all_documents = await vector_store.list()
print([doc.metadata["content"] for doc in all_documents])
query = "I write computer software. Tell me something."
vector_store_kwargs = {
"k": 1,
"max_distance": None,
}
results = await document_search.search(
query,
config=SearchConfig(vector_store_kwargs=vector_store_kwargs),
)
print(f"Documents similar to: {query}")
print([element.get_key() for element in results])
```
</details>
## 📚 Further Reading
- Ragbits [Documentation](http://ragbits.deepsense.ai)
- [Source Code](https://github.com/deepsense-ai/ragbits)
@@ -3,4 +3,5 @@ title: Guides
weight: 9 weight: 9
# If the index.md file is empty, the link to the section will be hidden from the sidebar # If the index.md file is empty, the link to the section will be hidden from the sidebar
is_empty: true is_empty: true
partition: qdrant
--- ---
@@ -1,6 +1,7 @@
--- ---
title: Hybrid Cloud title: Hybrid Cloud
weight: 13 weight: 13
partition: cloud
--- ---
# Qdrant Hybrid Cloud # Qdrant Hybrid Cloud
@@ -1,6 +1,7 @@
--- ---
title: Infrastructure title: Infrastructure
weight: 21 weight: 21
partition: build
--- ---
## Infrastructure Integrations ## Infrastructure Integrations
@@ -1,6 +1,7 @@
--- ---
title: API & SDKs title: API & SDKs
weight: 6 weight: 6
partition: qdrant
aliases: aliases:
- /documentation/interfaces/ - /documentation/interfaces/
--- ---
@@ -1,6 +1,7 @@
--- ---
title: Observability title: Observability
weight: 22 weight: 22
partition: build
--- ---
## Observability Integrations ## Observability Integrations
@@ -3,6 +3,7 @@ title: What is Qdrant?
weight: 3 weight: 3
aliases: aliases:
- overview - overview
partition: qdrant
--- ---
# Introduction # Introduction
@@ -1,16 +1,18 @@
--- ---
title: Platforms title: Platforms
weight: 23 weight: 23
partition: build
--- ---
## Platform Integrations ## Platform Integrations
| Platform | Description | | Platform | Description |
| --------------------------- | ---------------------------------------------------------------------------------------- | | -------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [Apify](/documentation/platforms/apify/) | Platform to build web scrapers and automate web browser tasks. | | [Apify](/documentation/platforms/apify/) | Platform to build web scrapers and automate web browser tasks. |
| [Bubble](/documentation/platforms/bubble/) | Development platform for application development with a no-code interface | | [Bubble](/documentation/platforms/bubble/) | Development platform for application development with a no-code interface |
| [BuildShip](/documentation/platforms/buildship/) | Low-code visual builder to create APIs, scheduled jobs, and backend workflows. | | [BuildShip](/documentation/platforms/buildship/) | Low-code visual builder to create APIs, scheduled jobs, and backend workflows. |
| [DocsGPT](/documentation/platforms/docsgpt/) | Tool for ingesting documentation sources and enabling conversations and queries. | | [DocsGPT](/documentation/platforms/docsgpt/) | Tool for ingesting documentation sources and enabling conversations and queries. |
| [Kotaemon](/documentation/platforms/kotaemon/) | Open-source & customizable RAG UI for chatting with your documents. |
| [Make](/documentation/platforms/make/) | Cloud platform to build low-code workflows by integrating various software applications. | | [Make](/documentation/platforms/make/) | Cloud platform to build low-code workflows by integrating various software applications. |
| [N8N](/documentation/platforms/n8n/) | Platform for node-based, low-code workflow automation. | | [N8N](/documentation/platforms/n8n/) | Platform for node-based, low-code workflow automation. |
| [Pipedream](/documentation/platforms/pipedream/) | Platform for connecting apps and developing event-driven automation. | | [Pipedream](/documentation/platforms/pipedream/) | Platform for connecting apps and developing event-driven automation. |
@@ -0,0 +1,33 @@
---
title: Kotaemon
---
# Kotaemon
[Kotaemon](https://github.com/Cinnamon/kotaemon) is open-source clean & customizable RAG UI for chatting with your documents. Built with both end users and developers in mind.
Qdrant is supported as a vectorstore in Kotaemon for ingesting and retrieving documents.
## Configuration
- Refer to [Getting started](https://cinnamon.github.io/kotaemon/) guide to set up Kotaemon.
- To configure Kotaemon to use Qdrant as the vector store, update the `flowsettings.py` as follows.
```python
KH_VECTORSTORE = {
"__type__": "kotaemon.storages.QdrantVectorStore",
"url": "https://xyz-example.eu-central.aws.cloud.qdrant.io:6333",
"api_key": "<provide-your-own-key>'",
"client_kwargs": {} # Additional options to pass to qdrant_client.QdrantClient
}
```
- Restart Kotaemon for the changes to take effect.
The reference for all the Qdrant client options can be found [here](https://python-client.qdrant.tech/qdrant_client.qdrant_client)
## Further reading
- [Kotaemon Documentation](https://cinnamon.github.io/kotaemon/)
- [Source](https://github.com/Cinnamon/kotaemon)
@@ -1,6 +1,7 @@
--- ---
title: Private Cloud title: Private Cloud
weight: 14 weight: 14
partition: cloud
--- ---
# Qdrant Private Cloud # Qdrant Private Cloud
@@ -1,6 +1,7 @@
--- ---
title: Qdrant Cloud API title: Qdrant Cloud API
weight: 15 weight: 26
partition: cloud
--- ---
# Qdrant Cloud API # Qdrant Cloud API
@@ -1,8 +1,8 @@
--- ---
title: Cloud Quickstart title: Cloud Quickstart
weight: 4 weight: 4
partition: qdrant
aliases: aliases:
- quickstart-cloud
- ../cloud-quick-start - ../cloud-quick-start
- cloud-quick-start - cloud-quick-start
- cloud-quickstart - cloud-quickstart
@@ -124,3 +124,4 @@ When ready, use the Console and our complete REST API to try other operations.
Now that you have a Qdrant Cloud cluster up and running, you should [test remote access](/documentation/cloud/authentication/#test-cluster-access) with a Qdrant Client. Now that you have a Qdrant Cloud cluster up and running, you should [test remote access](/documentation/cloud/authentication/#test-cluster-access) with a Qdrant Client.
For more about Qdrant Cloud, check our [dedicated documentation](/documentation/cloud-intro/).
@@ -1,10 +1,10 @@
--- ---
title: Local Quickstart title: Local Quickstart
weight: 5 weight: 5
partition: qdrant
aliases: aliases:
- quick_start - quick_start
- quick-start - quick-start
- quickstart
--- ---
# How to Get Started with Qdrant Locally # How to Get Started with Qdrant Locally
@@ -1,6 +1,7 @@
--- ---
title: Release Notes title: Release Notes
weight: 30 weight: 32
partition: qdrant
type: external-link type: external-link
external_url: https://github.com/qdrant/qdrant/releases external_url: https://github.com/qdrant/qdrant/releases
sitemapExclude: True sitemapExclude: True
@@ -1,6 +1,7 @@
--- ---
title: Send Data to Qdrant title: Send Data to Qdrant
weight: 25 weight: 25
partition: build
--- ---
## How to Send Your Data to a Qdrant Cluster ## How to Send Your Data to a Qdrant Cluster
@@ -1,6 +1,7 @@
--- ---
title: Support title: Support
weight: 16 weight: 35
partition: cloud
aliases: aliases:
- /documentation/cloud/support/ - /documentation/cloud/support/
--- ---
@@ -6,6 +6,7 @@ is_empty: false
aliases: aliases:
- how-to - how-to
- tutorials - tutorials
partition: qdrant
--- ---
# Tutorials # Tutorials
@@ -159,7 +159,7 @@ Image.open(client.search(
![Coffee Image](/docs/coffee.jpg) ![Coffee Image](/docs/coffee.jpg)
<h3 style="font-size: 1.25em;">Image-to-Text</h3> ### Image-to-Text
Now, let's do a reverse search with an image: Now, let's do a reverse search with an image:
@@ -0,0 +1,16 @@
---
title: Was this page useful?
positiveButton:
text: "Yes"
url: /#
icon:
src: /icons/outline/thumb-up.svg
alt: Thumb up icon
negativeButton:
text: "No"
url: /#
icon:
src: /icons/outline/thumb-down.svg
alt: Thumb down icon
sitemapExclude: true
---
@@ -0,0 +1,27 @@
---
logIn:
text: Log in
url: https://cloud.qdrant.io/
startFree:
text: Start Free
url: https://cloud.qdrant.io/
logoLink: /
menuItems:
- id: menu-0
name: Qdrant
url: /documentation/
- id: menu-1
name: Cloud
url: /documentation/cloud-intro/
- id: menu-2
name: Build
url: /documentation/build/
# - id: menu-3
# name: Learn
# url: /documentation/learn/
- id: menu-4
name: API Reference
url: https://api.qdrant.tech/api-reference
external: true
sitemapExclude: true
---
+5 -1
View File
@@ -81,7 +81,7 @@ menuItems:
url: https://qdrant.to/roadmap url: https://qdrant.to/roadmap
- id: 5 - id: 5
name: Changelog name: Changelog
url: https://github.com/qdrant/qdrant/releases url: https://github.com/qdrant/qdrant/releases
- id: 6 - id: 6
name: Status Page name: Status Page
url: https://status.qdrant.io/ url: https://status.qdrant.io/
@@ -133,5 +133,9 @@ bages:
- src: /img/gdpr-badge.png - src: /img/gdpr-badge.png
alt: "heyData GDPR" alt: "heyData GDPR"
url: https://heydata.eu/ url: https://heydata.eu/
question: Ready to get started with Qdrant?
questionButton:
text: Start Free
url: https://qdrant.to/cloud/
sitemapExclude: true sitemapExclude: true
--- ---
+1 -1
View File
@@ -1,6 +1,6 @@
--- ---
stats: stats:
githubStars: 20.4k githubStars: 20.5k
discordMembers: 6.9k discordMembers: 6.9k
twitterFollowers: 7.5k twitterFollowers: 7.5k
--- ---
@@ -2,7 +2,7 @@
title: Why join Qdrant for Startups? title: Why join Qdrant for Startups?
mainCard: mainCard:
title: Discount for Qdrant Cloud title: Discount for Qdrant Cloud
description: Enjoy a discount on <a href="https://cloud.qdrant.io/" target="_blank">Qdrant Cloud</a> for the first year. description: Enjoy a 20% discount on <a href="https://cloud.qdrant.io/" target="_blank">Qdrant Cloud</a> for the first year.
image: image:
src: /img/qdrant-for-startups-benefits/card1.png src: /img/qdrant-for-startups-benefits/card1.png
alt: Qdrant Discount for Startups alt: Qdrant Discount for Startups
+22 -18
View File
@@ -1,5 +1,17 @@
--- ---
title: Meet our Stars title: Meet our Stars
mainCards:
- id: 0
headTitle: Distinguished Ambassador
headIcon:
src: /icons/fill/sparks-purple.svg
alt: Sparks
image:
src: /img/stars/m-k-pavan-kumar.jpg
alt: M K Pavan Kumar Photo
name: M K Pavan Kumar
position: Data Scientist and Lead GenAI
description: Kameshwara Pavan Kumar Mantha is a seasoned technology expert with 14 years of extensive experience in full stack development, cloud solutions, and artificial intelligence.<br><br>Specializing in Generative AI and Large Language Models, Pavan has established himself as a leader in these cutting-edge domains.
cards: cards:
- id: 0 - id: 0
image: image:
@@ -30,84 +42,76 @@ cards:
position: Founder of SciPhi position: Founder of SciPhi
description: Physics PhD, Quant @ Citadel and Founder at SciPhi description: Physics PhD, Quant @ Citadel and Founder at SciPhi
- id: 4 - id: 4
image:
src: /img/stars/m-k-pavan-kumar.jpg
alt: M K Pavan Kumar Photo
name: M K Pavan Kumar
position: Data Scientist and Lead GenAI
description: A seasoned technology expert with 14 years of experience in full stack development, cloud solutions, & artificial intelligence
distinguished: true
- id: 5
image: image:
src: /img/stars/niranjan-akella.jpg src: /img/stars/niranjan-akella.jpg
alt: Niranjan Akella Photo alt: Niranjan Akella Photo
name: Niranjan Akella name: Niranjan Akella
position: Scientist by Heart & AI Engineer position: Scientist by Heart & AI Engineer
description: I build & deploy AI models like LLMs, Diffusion Models & Vision Models at scale description: I build & deploy AI models like LLMs, Diffusion Models & Vision Models at scale
- id: 6 - id: 5
image: image:
src: /img/stars/bojan-jakimovski.jpg src: /img/stars/bojan-jakimovski.jpg
alt: Bojan Jakimovski Photo alt: Bojan Jakimovski Photo
name: Bojan Jakimovski name: Bojan Jakimovski
position: Machine Learning Engineer position: Machine Learning Engineer
description: I'm really excited to show the power of the Qdrant as vector database description: I'm really excited to show the power of the Qdrant as vector database
- id: 7 - id: 6
image: image:
src: /img/stars/haydar-kulekci.jpg src: /img/stars/haydar-kulekci.jpg
alt: Haydar KULEKCI Photo alt: Haydar KULEKCI Photo
name: Haydar KULEKCI name: Haydar KULEKCI
position: Senior Software Engineer position: Senior Software Engineer
description: I am a senior software engineer and consultant with over 10 years of experience in data management, processing, and software development. description: I am a senior software engineer and consultant with over 10 years of experience in data management, processing, and software development.
- id: 8 - id: 7
image: image:
src: /img/stars/nicola-procopio.jpg src: /img/stars/nicola-procopio.jpg
alt: Nicola Procopio Photo alt: Nicola Procopio Photo
name: Nicola Procopio name: Nicola Procopio
position: Senior Data Scientist @ Fincons Group position: Senior Data Scientist @ Fincons Group
description: Nicola, a data scientist and open-source enthusiast since 2009, has used Qdrant since 2023. He developed fastembed for Haystack, vector search for Cheshire Cat A.I., and shares his expertise through articles, tutorials, and talks. description: Nicola, a data scientist and open-source enthusiast since 2009, has used Qdrant since 2023. He developed fastembed for Haystack, vector search for Cheshire Cat A.I., and shares his expertise through articles, tutorials, and talks.
- id: 9 - id: 8
image: image:
src: /img/stars/eduardo-vasquez.jpg src: /img/stars/eduardo-vasquez.jpg
alt: Eduardo Vasquez Photo alt: Eduardo Vasquez Photo
name: Eduardo Vasquez name: Eduardo Vasquez
position: Data Scientist and MLOps Engineer position: Data Scientist and MLOps Engineer
description: I am a Data Scientist and MLOps Engineer exploring generative AI and LLMs, creating YouTube content on RAG workflows and fine-tuning LLMs. I hold an MSc in Statistics and Data Science. description: I am a Data Scientist and MLOps Engineer exploring generative AI and LLMs, creating YouTube content on RAG workflows and fine-tuning LLMs. I hold an MSc in Statistics and Data Science.
- id: 10 - id: 9
image: image:
src: /img/stars/benito-martin.jpg src: /img/stars/benito-martin.jpg
alt: Benito Martin Photo alt: Benito Martin Photo
name: Benito Martin name: Benito Martin
position: Independent Consultant | Data Science, ML and AI Project Implementation | Teacher and Course Content Developer position: Independent Consultant | Data Science, ML and AI Project Implementation | Teacher and Course Content Developer
description: Over the past year, Benito developed MLOps and LLM projects. Based in Switzerland, Benito continues to advance his skills. description: Over the past year, Benito developed MLOps and LLM projects. Based in Switzerland, Benito continues to advance his skills.
- id: 11 - id: 10
image: image:
src: /img/stars/nirant-kasliwal.jpg src: /img/stars/nirant-kasliwal.jpg
alt: Nirant Kasliwal Photo alt: Nirant Kasliwal Photo
name: Nirant Kasliwal name: Nirant Kasliwal
position: FastEmbed Creator position: FastEmbed Creator
description: I'm a Machine Learning consultant specializing in NLP and Vision systems for early-stage products. I've authored an NLP book recommended by Dr. Andrew Ng to Stanford's CS230 students and maintain FastEmbed at Qdrant for speed. description: I'm a Machine Learning consultant specializing in NLP and Vision systems for early-stage products. I've authored an NLP book recommended by Dr. Andrew Ng to Stanford's CS230 students and maintain FastEmbed at Qdrant for speed.
- id: 12 - id: 11
image: image:
src: /img/stars/denzell-ford.jpg src: /img/stars/denzell-ford.jpg
alt: Denzell Ford Photo alt: Denzell Ford Photo
name: Denzell Ford name: Denzell Ford
position: Founder at Trieve, has been using Qdrant since late 2022. position: Founder at Trieve, has been using Qdrant since late 2022.
description: Denzell Ford, the founder of Trieve, has been using Qdrant since late 2022. He's passionate about helping people in the community. description: Denzell Ford, the founder of Trieve, has been using Qdrant since late 2022. He's passionate about helping people in the community.
- id: 13 - id: 12
image: image:
src: /img/stars/pavan-nagula.jpg src: /img/stars/pavan-nagula.jpg
alt: Pavan Nagula Photo alt: Pavan Nagula Photo
name: Pavan Nagula name: Pavan Nagula
position: Data Scientist | Machine Learning and Generative AI position: Data Scientist | Machine Learning and Generative AI
description: I'm Pavan, a data scientist specializing in AI, ML, and big data analytics. I love experimenting with new technologies in the AI and ML space, and Qdrant is a place where I've seen such innovative implementations recently. description: I'm Pavan, a data scientist specializing in AI, ML, and big data analytics. I love experimenting with new technologies in the AI and ML space, and Qdrant is a place where I've seen such innovative implementations recently.
- id: 14 - id: 13
image: image:
src: /img/stars/guohao-li.jpg src: /img/stars/guohao-li.jpg
alt: Guohao Li Photo alt: Guohao Li Photo
name: Guohao Li name: Guohao Li
position: Founder of Eigent.AI position: Founder of Eigent.AI
description: Guohao Li the founder of Eigent.AI, an artificial intelligence researcher and an open-source contributor working on building intelligent agents that can perceive, learn, communicate, reason, and act. He is the core lead of the open source projects CAMEL-AI.org. description: Guohao Li the founder of Eigent.AI, an artificial intelligence researcher and an open-source contributor working on building intelligent agents that can perceive, learn, communicate, reason, and act. He is the core lead of the open source projects CAMEL-AI.org.
- id: 15 - id: 14
image: image:
src: /img/stars/sahin-utar.jpg src: /img/stars/sahin-utar.jpg
alt: Şahin Utar Photo alt: Şahin Utar Photo
+4 -4
View File
@@ -12,7 +12,7 @@
"anchor-js": "^5.0.0", "anchor-js": "^5.0.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"qdrant-page-search": "^1.0.8" "qdrant-page-search": "^1.0.10"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-env": "^7.23.9", "@babel/preset-env": "^7.23.9",
@@ -3173,9 +3173,9 @@
} }
}, },
"node_modules/qdrant-page-search": { "node_modules/qdrant-page-search": {
"version": "1.0.9", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/qdrant-page-search/-/qdrant-page-search-1.0.9.tgz", "resolved": "https://registry.npmjs.org/qdrant-page-search/-/qdrant-page-search-1.0.10.tgz",
"integrity": "sha512-297elNEhqo/ETFl4ZdoMWD92l7hSTDYckm6BYk6+iTnC9qECGoM9xnIkzbgCdNtIpfjFi6VfuLXysxzvwQha0A==" "integrity": "sha512-ZNWXClp8EpfVGmI4qgcPFsSbXSAZ4iZx7hU04henwDV9x3OjjpMNY8jAbReK9/EtjraWEwGdRaArhRK0HzC/MQ=="
}, },
"node_modules/queue-microtask": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
+1 -1
View File
@@ -21,7 +21,7 @@
"anchor-js": "^5.0.0", "anchor-js": "^5.0.0",
"bootstrap": "^5.3.3", "bootstrap": "^5.3.3",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"qdrant-page-search": "^1.0.8" "qdrant-page-search": "^1.0.10"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-env": "^7.23.9", "@babel/preset-env": "^7.23.9",
Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 78 KiB

@@ -22,6 +22,19 @@ html {
} }
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: $neutral-50 $neutral-20; scrollbar-color: $neutral-50 $neutral-20;
&[data-theme="light"] {
&::-webkit-scrollbar-thumb {
background: $neutral-80;
}
&::-webkit-scrollbar-track {
background: $neutral-94;
}
&::-webkit-scrollbar-thumb:hover {
background: $neutral-90;
}
scrollbar-color: $neutral-80 $neutral-94;
}
} }
.scrolled { .scrolled {
@@ -1,8 +1,15 @@
@import 'base'; @import 'base';
@import 'partials/theme-switch'; @import 'partials/theme-switch';
@import 'partials/docs-menu'; @import 'partials/documentation/documentation-menu';
@import 'partials/documentation'; @import 'partials/documentation/docs-card';
@import 'partials/documentation-article'; @import 'partials/documentation/documentation';
@import 'partials/documentation/documentation-article';
@import 'partials/documentation/docs';
@import 'partials/documentation/docs-header';
@import 'partials/documentation/docs-breadcrumbs';
@import 'partials/documentation/docs-feedback';
@import 'partials/documentation/docs-articles-posts';
@import 'partials/table-of-contents'; @import 'partials/table-of-contents';
@import 'partials/feedback'; @import 'partials/feedback';
@import 'partials/documentation/docs-footer';
@import 'search/dark-theme'; @import 'search/dark-theme';
@@ -106,3 +106,4 @@
@import 'partials/rag-evaluation-guide-kubernetes-clusters'; @import 'partials/rag-evaluation-guide-kubernetes-clusters';
@import 'partials/rag-evaluation-guide-features'; @import 'partials/rag-evaluation-guide-features';
@import 'partials/progress-bar'; @import 'partials/progress-bar';
@import 'partials/table-of-contents';
@@ -1,29 +0,0 @@
@use '../helpers/functions' as *;
.documentation {
padding-top: $spacer;
background-color: $neutral-10;
color: $neutral-70;
&__container {
@extend .container;
max-width: pxToRem(1440);
padding: 0 $spacer;
}
@include media-breakpoint-up(xl) {
padding-top: $spacer * 4;
padding-bottom: $spacer * 7.5;
&__container {
padding: 0 $spacer * 2.5;
}
}
}
[data-theme='light'] {
.documentation {
background-color: $neutral-98;
color: $neutral-30;
}
}
@@ -6,7 +6,8 @@
color: $neutral-98; color: $neutral-98;
cursor: pointer; cursor: pointer;
&:hover { &:hover,
&.active {
color: $primary-50; color: $primary-50;
} }
} }
@@ -34,62 +34,6 @@
padding-bottom: $spacer * 5; padding-bottom: $spacer * 5;
order: 3; order: 3;
} }
&__nav {
a {
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-20;
}
&-title {
display: none;
margin-bottom: $spacer * 0.5;
padding: 0 $spacer * 0.5 $spacer * 0.5;
font-size: $spacer;
line-height: $spacer * 1.5;
color: $neutral-20;
}
nav {
display: none;
margin-bottom: $spacer;
ul {
padding-left: 0;
}
li {
list-style: none;
a {
display: block;
margin-bottom: math.div($spacer, 4);
padding: math.div($spacer, 4) $spacer * 0.5;
}
}
}
&-links {
display: flex;
justify-content: space-between;
gap: pxToRem(12);
padding-bottom: $spacer * 1.5;
border-bottom: pxToRem(1) solid $neutral-80;
a {
display: flex;
align-items: center;
gap: $spacer * 0.5;
padding-left: $spacer * 0.5;
svg {
height: $spacer;
width: $spacer;
}
}
}
}
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
@@ -123,30 +67,6 @@
&__content { &__content {
width: calc(100% - $spacer * 19); width: calc(100% - $spacer * 19);
} }
&__nav {
position: sticky;
top: $spacer * 4;
right: 0;
width: $spacer * 15;
padding-top: $spacer;
&-title {
display: block;
}
nav {
display: block;
}
&-links {
flex-direction: column;
padding-top: $spacer * 1.5;
padding-bottom: 0;
border-top: pxToRem(1) solid $neutral-80;
border-bottom: none;
}
}
} }
} }
} }
@@ -16,11 +16,16 @@
z-index: 1; z-index: 1;
} }
&__cards {
row-gap: pxToRem(30);
}
&__card { &__card {
position: relative; position: relative;
width: 100%; width: 100%;
max-width: pxToRem(255); max-width: pxToRem(255);
height: 100%; height: 100%;
min-height: pxToRem(375);
margin: 0 auto; margin: 0 auto;
padding: $spacer * 1.5; padding: $spacer * 1.5;
border-radius: pxToRem(12); border-radius: pxToRem(12);
@@ -52,13 +57,6 @@
color: $neutral-90; color: $neutral-90;
} }
&-distinguished {
margin-bottom: $spacer * 0.5;
font-size: pxToRem(12);
line-height: pxToRem(21);
color: $secondary-violet-70;
}
&-description { &-description {
margin-bottom: 0; margin-bottom: 0;
font-size: pxToRem(14); font-size: pxToRem(14);
@@ -78,6 +76,61 @@
} }
} }
&__main-card {
display: flex;
flex-direction: column-reverse;
align-items: center;
justify-content: space-between;
max-width: none;
min-height: auto;
gap: $spacer * 1.5;
&-content {
max-width: pxToRem(431);
}
&-head {
display: flex;
align-items: center;
justify-content: center;
gap: $spacer * 0.5;
margin-bottom: $spacer;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $secondary-violet-70;
img {
width: $spacer;
height: $spacer;
}
}
&-title {
margin-bottom: $spacer * 0.5;
font-size: $spacer * 2;
line-height: $spacer * 2.5;
color: $neutral-98;
}
&-subtitle {
color: $neutral-90;
}
&-description {
margin-bottom: 0;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-60;
}
&-image {
position: relative;
width: 100%;
max-width: pxToRem(431);
z-index: 1;
}
}
&__overlay { &__overlay {
position: absolute; position: absolute;
right: 0; right: 0;
@@ -95,30 +148,23 @@
&__title { &__title {
margin-bottom: $spacer * 5; margin-bottom: $spacer * 5;
font-size: $spacer * 4; font-size: $spacer * 3.5;
line-height: pxToRem(67); line-height: pxToRem(67);
} }
&__cards > div { &__cards {
&:nth-of-type(1), row-gap: $spacer * 2.5;
&:nth-of-type(3) {
.stars-list__card {
margin: 0 0 0 auto;
}
}
&:nth-of-type(2),
&:nth-of-type(4) {
.stars-list__card {
margin: 0 auto 0 0;
}
}
} }
}
@include media-breakpoint-up(xl) { &__main-card {
&__card { flex-direction: row;
margin: 0 auto !important; align-items: flex-start;
padding: $spacer * 3.5 $spacer * 3;
text-align: left;
&-head {
justify-content: start;
}
} }
} }
} }
@@ -1,20 +1,28 @@
@use '../helpers/functions' as *; @use '../helpers/functions' as *;
@use 'sass:math';
.table-of-contents { .table-of-contents {
background-color: $neutral-10; scrollbar-width: none;
margin-bottom: -1px;
&__head {
display: none;
margin-bottom: 0;
padding: 0 math.div($spacer, 2) $spacer;
color: $neutral-20;
}
&__title { &__title {
display: none; display: none;
color: $neutral-98; color: $neutral-30;
margin-bottom: $spacer; margin-bottom: math.div($spacer, 4);
font-size: map-get($font-sizes-text, 'md'); padding: math.div($spacer, 4) math.div($spacer, 2);
line-height: pxToRem(24); font-size: pxToRem(14);
line-height: pxToRem(21);
} }
nav { nav {
display: none; display: none;
padding-bottom: pxToRem(12); padding-bottom: $spacer;
ul { ul {
padding-left: 0; padding-left: 0;
@@ -27,15 +35,26 @@
a { a {
display: block; display: block;
margin-bottom: pxToRem(12); padding: math.div($spacer, 4) math.div($spacer, 2);
color: $neutral-70; color: $neutral-30;
font-weight: 400;
font-size: pxToRem(14);
line-height: pxToRem(21);
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
transition: all 0.3s;
&:hover { &:hover {
color: $primary-50; color: $primary-50;
} }
&.active {
font-weight: 600;
background-color: $neutral-90;
color: $neutral-30;
border-radius: $spacer * 0.5;
}
} }
& > ul > li { & > ul > li {
@@ -45,8 +64,8 @@
} }
&__external-links { &__external-links {
border-top: 1px solid $neutral-50; border-top: 1px solid $neutral-90;
border-bottom: 1px solid $neutral-50; border-bottom: 1px solid $neutral-90;
list-style: none; list-style: none;
padding: $spacer * 1.5 0; padding: $spacer * 1.5 0;
margin: 0; margin: 0;
@@ -54,6 +73,8 @@
&__link { &__link {
margin-bottom: pxToRem(12); margin-bottom: pxToRem(12);
font-size: pxToRem(14);
line-height: pxToRem(21);
&:last-of-type { &:last-of-type {
margin-bottom: 0; margin-bottom: 0;
@@ -63,8 +84,16 @@
display: flex; display: flex;
align-items: center; align-items: center;
gap: calc($spacer / 2); gap: calc($spacer / 2);
padding: 0 math.div($spacer, 2);
color: $neutral-30;
font-weight: 500;
&:hover { &:hover {
text-decoration: underline; color: $primary-50;
text-decoration: none;
svg path {
fill: $primary-50;
}
} }
} }
@@ -72,36 +101,113 @@
display: block; display: block;
width: pxToRem(16); width: pxToRem(16);
height: pxToRem(16); height: pxToRem(16);
path {
fill: $neutral-30;
}
} }
} }
@include media-breakpoint-up(xl) { @include media-breakpoint-up(xl) {
max-height: calc(100vh - 80px);
width: pxToRem(232);
position: sticky;
overflow-x: hidden;
overflow-y: auto;
top: $spacer * 5;
margin-bottom: pxToRem(220);
flex-shrink: 0;
&__external-links {
border-bottom: none;
}
nav, nav,
&__head,
&__title { &__title {
display: block; display: block;
} }
} }
[data-theme='light'] & { [data-theme='dark'] & {
background-color: $neutral-98; &__title,
margin-bottom: $spacer * 2; &__head {
color: $neutral-98;
&__title {
color: $neutral-30;
} }
a { a {
color: $neutral-30; color: $neutral-70;
transition: all 0.3s;
&:hover {
color: $neutral-98;
}
&.active {
font-weight: 600;
background-color: $neutral-30;
color: $neutral-90;
border-radius: $spacer * 0.5;
}
} }
&__external-links { &__external-links {
border-top: 1px solid $neutral-90; border-top: 1px solid $neutral-20;
border-bottom: 1px solid $neutral-90; border-bottom: 1px solid $neutral-20;
} }
&__link { &__link {
a { a {
color: $primary-50; color: $neutral-98;
transition:
color 0.3s,
fill 0.25s;
svg path {
fill: $neutral-98;
}
&:hover {
text-decoration: underline;
color: $neutral-98;
svg path {
fill: $neutral-98;
}
}
}
}
}
// scoped styles
.documentation & {
&__external-links {
display: none;
}
@include media-breakpoint-up(xl) {
padding: $spacer * 1.5 $spacer $spacer * 1.5 pxToRem(40);
&__external-links {
display: block;
}
}
}
.qdrant-blog-post & {
&__external-links {
display: flex;
justify-content: space-between;
column-gap: pxToRem(12);
padding-bottom: $spacer * 1.5;
}
@include media-breakpoint-down(xl) {
&__external-links {
padding-top: 0;
border-top: 0;
}
&__link {
margin: 0;
}
}
@include media-breakpoint-up(xl) {
width: $spacer * 15;
padding-top: $spacer;
&__external-links {
flex-direction: column;
} }
} }
} }
@@ -0,0 +1,31 @@
@use '../../helpers/functions' as *;
@use 'sass:math';
.dev-portal-articles-posts {
.post {
&-preview {
padding-bottom: 0;
margin-bottom: $spacer;
border-radius: $spacer * 0.5;
height: auto;
}
&-title {
margin-bottom: math.div($spacer, 4);
font-size: pxToRem(18);
line-height: pxToRem(27);
color: $neutral-98;
}
&-description {
margin-bottom: $spacer * 0.5;
font-size: pxToRem(14);
line-height: pxToRem(21);
color: $neutral-70;
}
&-about {
color: $neutral-50;
}
}
}
@@ -0,0 +1,50 @@
@use '../../helpers/functions' as *;
@use 'sass:math';
.docs-breadcrumbs {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: pxToRem(10);
padding: 0;
margin: 0 0 $spacer * 2.5 0;
&__crumb {
list-style: none;
text-transform: capitalize;
font-size: pxToRem(14);
line-height: pxToRem(21);
padding: math.div($spacer, 4) 0;
font-weight: 400;
&:last-child {
color: $neutral-98;
}
& > a {
color: $neutral-50;
&:hover {
text-decoration: underline;
}
}
&-separator {
list-style: none;
height: pxToRem(12);
width: pxToRem(12);
background-image: url("data:image/svg+xml,%3Csvg width='12' height='13' viewBox='0 0 12 13' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 1.5L9 6.5L4 11.5' stroke='%23576280' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
background-repeat: no-repeat;
background-position: center;
background-size: cover;
}
}
[data-theme='light'] & {
&__crumb {
&:last-child {
color: $neutral-20;
}
}
}
}
@@ -0,0 +1,44 @@
@use '../../helpers/functions' as *;
.docs-feedback {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: $spacer;
padding: $spacer * 2.5 0;
&__title {
color: $neutral-98;
font-size: pxToRem(18);
line-height: pxToRem(27);
margin: 0;
}
&__buttons {
display: flex;
gap: $spacer * 0.5;
}
&__button {
display: flex;
align-items: center;
gap: $spacer * 0.5;
box-shadow: 0 0 0 pxToRem(1) $neutral-30;
}
@include media-breakpoint-up(xl) {
justify-content: flex-start;
}
[data-theme='light'] & {
&__title {
color: $neutral-20;
}
&__button {
img {
filter: invert(1);
}
}
}
}
@@ -0,0 +1,84 @@
@use '../../helpers/functions' as *;
.docs-footer {
&__cta {
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: $spacer * 2.5 0;
border-top: 1px solid $neutral-20;
border-bottom: 1px solid $neutral-20;
color: $neutral-98;
h4 {
margin-bottom: $spacer * 1.5;
padding: 0 !important;
font-size: pxToRem(20);
line-height: pxToRem(30);
font-weight: 500;
}
}
&__bottom {
@extend .footer__bottom;
}
&__bottom-content {
@extend .footer__bottom-content;
& span,
& a {
color: $neutral-70;
font-weight: 400;
font-size: map-get($font-sizes-text, 's');
line-height: pxToRem(21);
}
& a {
text-decoration: none;
}
}
&__bottom-links {
@extend .footer__bottom-links;
}
@include media-breakpoint-up(xl) {
&__bottom {
@extend .footer__bottom;
}
&__bottom-content {
@extend .footer__bottom-content;
}
&__cta {
flex-direction: row;
justify-content: space-between;
h4 {
margin: 0;
}
}
}
[data-theme='light'] & {
color: $neutral-30;
&__bottom-content * {
color: $neutral-30;
}
&__cta {
border-top-color: $neutral-80;
border-bottom-color: $neutral-80;
color: $neutral-30;
h4 {
border-color: $neutral-20;
}
}
}
}
@@ -0,0 +1,75 @@
@use '../../helpers/functions' as *;
.docs-header {
position: sticky;
top: 0;
background: $neutral-10;
z-index: 4;
.logo {
width: pxToRem(148);
}
.main-menu {
border-bottom: pxToRem(1) solid $neutral-20;
&__links {
margin-right: auto;
padding-left: 0;
}
&__buttons {
&-input {
width: pxToRem(300);
height: pxToRem(35);
position: relative;
margin-right: $spacer * 1.5;
svg {
position: absolute;
top: 50%;
left: $spacer;
transform: translateY(-50%);
}
button {
height: 100%;
padding-left: $spacer * 2.5;
color: $neutral-70;
text-align: left;
font-size: pxToRem(14);
line-height: pxToRem(18);
&:after {
content: '';
display: block;
width: 1rem;
height: 1rem;
position: absolute;
top: 50%;
left: $spacer;
transform: translateY(-50%);
background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_6269_137)'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1.8335 6.66665C1.8335 3.99727 3.99745 1.83331 6.66683 1.83331C9.33621 1.83331 11.5002 3.99727 11.5002 6.66665C11.5002 7.99157 10.9671 9.19197 10.1037 10.0651C10.097 10.0711 10.0904 10.0773 10.0839 10.0838C10.0775 10.0902 10.0713 10.0968 10.0653 10.1035C9.19215 10.9669 7.99175 11.5 6.66683 11.5C3.99745 11.5 1.8335 9.33602 1.8335 6.66665ZM10.423 11.1299C9.40815 11.9848 8.09765 12.5 6.66683 12.5C3.44517 12.5 0.833496 9.88831 0.833496 6.66665C0.833496 3.44498 3.44517 0.833313 6.66683 0.833313C9.88849 0.833313 12.5002 3.44498 12.5002 6.66665C12.5002 8.09746 11.985 9.40796 11.1301 10.4228L15.0204 14.3131C15.2156 14.5084 15.2156 14.8249 15.0204 15.0202C14.8251 15.2155 14.5085 15.2155 14.3133 15.0202L10.423 11.1299Z' fill='%238F98B3'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_6269_137'%3E%3Crect width='16' height='16' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
}
}
}
}
}
.menu-mobile {
padding-top: pxToRem(12);
}
@include media-breakpoint-up(xl) {
.main-menu {
height: $spacer * 5;
padding: pxToRem(22) $spacer * 1.5;
}
}
}
@include media-breakpoint-up(xl) {
.scrolled .main-menu {
padding: $spacer * 2 $spacer * 1.5 $spacer * 0.5;
}
}
@@ -0,0 +1,289 @@
@use '../../helpers/functions' as *;
@use 'sass:math';
.docs {
&-core {
h2 {
padding-top: 0;
margin-bottom: $spacer * 0.5;
}
p {
margin-bottom: $spacer * 1.5;
}
a.button:hover {
text-decoration: none;
}
section {
margin-bottom: $spacer * 4;
}
&__overlay {
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
top: 0;
left: 0;
&:before,
&:after {
content: '';
display: block;
position: absolute;
width: pxToRem(294);
height: pxToRem(240);
background-position: bottom;
background-size: cover;
z-index: 1;
}
&:before {
left: 0;
bottom: 0;
background-image: url('/img/blurred/blurred-light-17.svg');
}
&:after {
top: 0;
right: 0;
background-image: url('/img/blurred/blurred-light-18.svg');
}
}
&__hero {
width: 100%;
padding: $spacer * 1.5 $spacer * 1.5 $spacer * 2;
background: linear-gradient(180deg, $neutral-20 0%, rgba(14, 20, 36, 0.1) 100%);
text-align: center;
border: pxToRem(1) solid $neutral-20;
border-radius: pxToRem(12);
&-title {
padding-top: 0 !important;
margin-bottom: $spacer * 0.5 !important;
font-size: pxToRem(32); // take from variables
color: $neutral-98;
line-height: pxToRem(40);
}
&-description {
margin-bottom: $spacer * 0.5 !important;
}
&-link {
margin-bottom: $spacer * 2 !important;
}
&-buttons {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: $spacer * 1.5;
}
}
&__developing {
&-block {
position: relative;
overflow: hidden;
padding: $spacer * 1.5 $spacer;
background: url('/img/stars-pattern.png') $neutral-10;
border: pxToRem(1) solid $neutral-20;
border-radius: $spacer * 0.5;
&-text {
position: relative;
text-align: center;
z-index: 2;
h3 {
font-size: pxToRem(20);
line-height: pxToRem(30);
font-weight: 500;
padding: 0;
margin-bottom: $spacer * 1.5;
}
a {
font-size: pxToRem(14);
font-weight: 500;
}
}
&-image {
position: relative;
height: $spacer * 10;
z-index: 2;
img {
height: 100%;
margin: $spacer * 2 auto 0;
}
}
}
}
}
&__hero {
display: flex;
justify-content: space-between;
position: relative;
flex-direction: column;
gap: $spacer * 2;
width: 100%;
min-height: pxToRem(240);
padding: $spacer * 1.5 $spacer;
background: url('/img/stars-pattern.png') $neutral-10;
border: pxToRem(1) solid $neutral-20;
border-radius: pxToRem(12);
&-content {
position: relative;
align-self: center;
text-align: center;
z-index: 2;
}
&-title {
max-width: pxToRem(400);
padding-top: 0 !important;
margin-bottom: $spacer * 1.5 !important;
font-size: pxToRem(32); // take from variables
color: $neutral-98;
line-height: pxToRem(40);
}
&-image {
position: relative;
align-self: center;
width: 100%;
max-width: pxToRem(360) !important;
margin: 0 !important;
z-index: 2;
}
a {
font-size: pxToRem(14);
font-weight: 500;
}
}
&-cloud {
&__hero {
.dev-portal__hero-image {
max-width: pxToRem(459) !important;
}
}
}
@include media-breakpoint-up(lg) {
&__hero {
flex-direction: row;
gap: 0;
padding: 0 $spacer * 2.5;
&-content {
text-align: left;
}
&-image {
align-self: end;
}
}
&-core {
&__hero {
padding: $spacer * 1.5 pxToRem(120);
}
&__developing {
&-block {
padding: 0;
&-text {
text-align: left;
h3,
a {
margin-left: $spacer * 2.5;
}
}
&-image {
img {
margin: 0 0 0 auto;
}
}
}
}
}
}
@include media-breakpoint-up(xl) {
&__article {
width: calc(100% - 256px);
min-height: calc(100vh - 80px);
padding: $spacer * 1.5 $spacer * 5 0;
margin: 0 0 0 pxToRem(256);
border-left: pxToRem(1) solid $neutral-20;
&-content {
width: calc(100% - 232px);
padding-right: $spacer * 2.5;
}
&-table {
width: pxToRem(232);
}
}
}
[data-theme='light'] & {
.docs-core__hero {
background: linear-gradient(180deg, $neutral-20 0%, $neutral-10 100%);
color: $neutral-70;
&-title {
color: $neutral-98;
}
.button_outlined {
color: $neutral-100;
box-shadow: 0 0 0 1px $neutral-60;
&:hover {
box-shadow: 0 0 0 2px $neutral-60;
}
}
}
.docs-core__developing-block {
h3 {
color: $neutral-98;
}
.button_outlined {
color: $neutral-100;
box-shadow: 0 0 0 1px $neutral-60;
&:hover {
box-shadow: 0 0 0 2px $neutral-60;
}
}
}
&__hero-content {
h1 {
color: $neutral-98;
}
.button_outlined {
color: $neutral-100;
box-shadow: 0 0 0 1px $neutral-60;
&:hover {
box-shadow: 0 0 0 2px $neutral-60;
}
}
}
@include media-breakpoint-up(xl) {
&__article {
border-left-color: $neutral-80;
}
}
}
}
@@ -1,9 +1,9 @@
@use '../helpers/functions' as *; @use '../../helpers/functions' as *;
@use '../mixins/mixins' as *; @use '../../mixins/mixins' as *;
.documentation-article { .documentation-article {
padding-top: $spacer * 2;
padding-bottom: $spacer * 1.5; padding-bottom: $spacer * 1.5;
font-weight: 400;
h1 { h1 {
font-size: $spacer * 2; font-size: $spacer * 2;
@@ -17,17 +17,19 @@
h3, h3,
h4 { h4 {
font-size: $spacer * 1.5; font-size: $spacer * 1.5;
font-weight: 500;
line-height: pxToRem(34); line-height: pxToRem(34);
color: $neutral-98; color: $neutral-98;
margin-bottom: $spacer; margin-bottom: $spacer;
padding-top: $spacer * 0.5; padding-top: $spacer * 0.5;
} }
p, summary { p,
summary {
margin-bottom: $spacer; margin-bottom: $spacer;
} }
a:hover { a:not([class]):hover {
text-decoration: underline; text-decoration: underline;
} }
@@ -57,8 +59,7 @@
} }
@include media-breakpoint-up(xl) { @include media-breakpoint-up(xl) {
margin: -8px 0 -16px; width: 100%;
padding: 0 $spacer * 1.5;
} }
} }
@@ -1,9 +1,11 @@
@use '../helpers/functions' as *; @use '../../helpers/functions' as *;
@use 'sass:math';
.docs-menu { .docs-menu {
background-color: $neutral-20; background-color: $neutral-20;
border-top: 1px solid $neutral-30; border-top: 1px solid $neutral-30;
margin: 0 -16px; margin: 0 (-$spacer) $spacer * 2;
scrollbar-width: thin;
&__header { &__header {
display: flex; display: flex;
@@ -11,6 +13,9 @@
justify-content: space-between; justify-content: space-between;
padding: pxToRem(15) pxToRem(20); padding: pxToRem(15) pxToRem(20);
cursor: pointer; cursor: pointer;
.docs-menu__button svg {
transition: transform 0.2s;
}
&.active { &.active {
.docs-menu__button svg { .docs-menu__button svg {
@@ -29,7 +34,7 @@
&__content { &__content {
display: none; display: none;
padding: $spacer * 1.5 $spacer * 2 pxToRem(12); padding: pxToRem(12) $spacer * 1.5;
&.active { &.active {
display: block; display: block;
@@ -38,8 +43,7 @@
&__input { &__input {
position: relative; position: relative;
margin-top: $spacer; margin: $spacer * 2 0;
margin-bottom: $spacer * 2;
svg { svg {
position: absolute; position: absolute;
@@ -49,20 +53,19 @@
} }
button { button {
padding-left: $spacer * 2.8; padding-left: $spacer * 2.5;
color: $neutral-70; color: $neutral-70;
&:after { &:after {
content: ''; content: '';
display: block; display: block;
width: 1rem; width: $spacer;
height: 1rem; height: $spacer;
margin-top: 1px;
position: absolute; position: absolute;
top: 50%; top: 50%;
left: $spacer; left: $spacer;
transform: translateY(-50%); transform: translateY(-50%);
background: url('/icons/outline/search-white.svg') no-repeat; background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_6269_137)'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M1.8335 6.66665C1.8335 3.99727 3.99745 1.83331 6.66683 1.83331C9.33621 1.83331 11.5002 3.99727 11.5002 6.66665C11.5002 7.99157 10.9671 9.19197 10.1037 10.0651C10.097 10.0711 10.0904 10.0773 10.0839 10.0838C10.0775 10.0902 10.0713 10.0968 10.0653 10.1035C9.19215 10.9669 7.99175 11.5 6.66683 11.5C3.99745 11.5 1.8335 9.33602 1.8335 6.66665ZM10.423 11.1299C9.40815 11.9848 8.09765 12.5 6.66683 12.5C3.44517 12.5 0.833496 9.88831 0.833496 6.66665C0.833496 3.44498 3.44517 0.833313 6.66683 0.833313C9.88849 0.833313 12.5002 3.44498 12.5002 6.66665C12.5002 8.09746 11.985 9.40796 11.1301 10.4228L15.0204 14.3131C15.2156 14.5084 15.2156 14.8249 15.0204 15.0202C14.8251 15.2155 14.5085 15.2155 14.3133 15.0202L10.423 11.1299Z' fill='%238F98B3'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_6269_137'%3E%3Crect width='16' height='16' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
} }
} }
} }
@@ -80,23 +83,24 @@
} }
&__links { &__links {
&-title { &-title {
margin-bottom: 0;
padding: math.div($spacer, 2);
color: $neutral-98; color: $neutral-98;
font-weight: bold; font-weight: bold;
font-size: pxToRem(18); font-size: $spacer;
line-height: pxToRem(27); line-height: $spacer * 1.5;
margin: 0 0 $spacer;
padding-top: $spacer * 0.5; &:not(:nth-of-type(1)) {
margin-top: pxToRem(12);
padding-top: $spacer;
}
} }
&-group { &-group {
padding-bottom: pxToRem(4);
&-heading { &-heading {
display: block; display: block;
position: relative; position: relative;
margin-bottom: $spacer * 0.5;
// hide native details marker // hide native details marker
&::-webkit-details-marker { &::-webkit-details-marker {
display: none; display: none;
@@ -107,6 +111,9 @@
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
color: $neutral-70; color: $neutral-70;
font-size: pxToRem(14);
line-height: pxToRem(21);
font-weight: 400;
} }
} }
@@ -116,31 +123,53 @@
width: pxToRem(10); width: pxToRem(10);
height: pxToRem(10); height: pxToRem(10);
position: absolute; position: absolute;
top: pxToRem(7); top: pxToRem(10);
right: pxToRem(4); right: $spacer;
background-image: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3.16667 0.916341C3.10476 0.869913 3.03115 0.841641 2.95409 0.834692C2.87702 0.827742 2.79954 0.842391 2.73033 0.876997C2.66112 0.911602 2.60291 0.964797 2.56223 1.03062C2.52155 1.09644 2.5 1.17229 2.5 1.24967V8.74968C2.5 8.82706 2.52155 8.90291 2.56223 8.96873C2.60291 9.03455 2.66112 9.08775 2.73033 9.12235C2.79954 9.15696 2.87702 9.17161 2.95409 9.16466C3.03115 9.15771 3.10476 9.12944 3.16667 9.08301L8.16667 5.33301C8.21842 5.2942 8.26042 5.24387 8.28934 5.18601C8.31827 5.12816 8.33333 5.06436 8.33333 4.99967C8.33333 4.93499 8.31827 4.87119 8.28934 4.81334C8.26042 4.75548 8.21842 4.70515 8.16667 4.66634L3.16667 0.916341Z' fill='%238F98B3'/%3E%3C/svg%3E%0A"); background-image: url("data:image/svg+xml,%3Csvg width='10' height='11' viewBox='0 0 10 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.832764 3.41669L4.99943 7.58335L9.1661 3.41669' stroke='%238F98B3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
background-size: cover; background-size: cover;
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
transition: transform 0.3s;
} }
&.active { &.active {
.docs-menu__links-group-heading > a { .docs-menu__links-group-heading > a {
padding: pxToRem(4) 0 pxToRem(4) $spacer;
border-left: pxToRem(1) solid $primary-50;
font-weight: 600; font-weight: 600;
background-color: $neutral-30; background-color: $neutral-30;
color: $neutral-90; color: $neutral-90;
border-radius: $spacer * 0.5;
} }
summary:after { summary:after {
top: pxToRem(11); top: pxToRem(10);
} }
} }
&[open=''] { &[open=''] {
summary:after { summary:after {
background-image: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.66732 8.16667C4.70781 8.21588 4.75871 8.25552 4.81634 8.28273C4.87397 8.30995 4.93692 8.32406 5.00065 8.32406C5.06439 8.32406 5.12733 8.30995 5.18496 8.28273C5.2426 8.25552 5.29349 8.21588 5.33398 8.16667L9.08399 3.16667C9.13041 3.10476 9.15869 3.03115 9.16564 2.95409C9.17258 2.87702 9.15794 2.79954 9.12333 2.73033C9.08872 2.66112 9.03553 2.60291 8.96971 2.56223C8.90388 2.52155 8.82803 2.5 8.75065 2.5H1.25065C1.17327 2.5 1.09742 2.52155 1.0316 2.56223C0.965773 2.60291 0.912579 2.66112 0.877973 2.73033C0.843368 2.79954 0.828719 2.87702 0.835668 2.95409C0.842617 3.03115 0.87089 3.10476 0.917318 3.16667L4.66732 8.16667Z' fill='%238F98B3'/%3E%3C/svg%3E%0A"); transform: rotate(180deg);
}
}
a {
padding: math.div($spacer, 4) $spacer * 1.5 math.div($spacer, 4) math.div($spacer, 2);
// margin-bottom: math.div($spacer, 4);
}
&.external-link {
.docs-menu__links-group-heading {
&:after {
content: '';
display: block;
width: pxToRem(10);
height: pxToRem(10);
position: absolute;
top: 50%;
right: $spacer;
background: url('/icons/outline/external-link.svg') no-repeat;
background-size: contain;
margin-top: $spacer * -0.5;
}
} }
} }
} }
@@ -150,7 +179,6 @@
padding-left: $spacer; padding-left: $spacer;
&-item { &-item {
margin-bottom: $spacer * 0.5;
list-style: none; list-style: none;
a { a {
@@ -159,6 +187,7 @@
align-items: center; align-items: center;
color: $neutral-70; color: $neutral-70;
font-size: pxToRem(14); font-size: pxToRem(14);
font-weight: 400;
line-height: pxToRem(21); line-height: pxToRem(21);
} }
@@ -172,9 +201,17 @@
} }
@include media-breakpoint-up(xl) { @include media-breakpoint-up(xl) {
background-color: $neutral-10; height: calc(100vh - 80px);
width: pxToRem(256);
flex-shrink: 0;
position: sticky;
overflow-x: hidden;
top: $spacer * 5;
padding: $spacer $spacer $spacer;
background-color: transparent;
border-top: none; border-top: none;
margin: 0; margin: 0;
border-right: pxToRem(1) solid $neutral-20;
&__header { &__header {
display: none; display: none;
@@ -186,11 +223,20 @@
} }
&__input { &__input {
margin-bottom: 0; display: none;
} }
&__links { &__links {
margin-top: $spacer * 1.5; &-title {
&:not(:nth-of-type(1)) {
border-top: pxToRem(1) solid $neutral-20;
}
}
& > :last-child {
padding-bottom: $spacer;
border-bottom: pxToRem(1) solid $neutral-20;
}
} }
&__links-group { &__links-group {
@@ -249,7 +295,8 @@
} }
summary:after { summary:after {
background-image: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3.16667 0.916341C3.10476 0.869913 3.03115 0.841641 2.95409 0.834692C2.87702 0.827742 2.79954 0.842391 2.73033 0.876997C2.66112 0.911602 2.60291 0.964797 2.56223 1.03062C2.52155 1.09644 2.5 1.17229 2.5 1.24967V8.74968C2.5 8.82706 2.52155 8.90291 2.56223 8.96873C2.60291 9.03455 2.66112 9.08775 2.73033 9.12235C2.79954 9.15696 2.87702 9.17161 2.95409 9.16466C3.03115 9.15771 3.10476 9.12944 3.16667 9.08301L8.16667 5.33301C8.21842 5.2942 8.26042 5.24387 8.28934 5.18601C8.31827 5.12816 8.33333 5.06436 8.33333 4.99967C8.33333 4.93499 8.31827 4.87119 8.28934 4.81334C8.26042 4.75548 8.21842 4.70515 8.16667 4.66634L3.16667 0.916341Z' fill='%2328324d'/%3E%3C/svg%3E"); background-image: url("data:image/svg+xml,%3Csvg width='10' height='7' viewBox='0 0 10 7' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg id='Group'%3E%3Cpath id='Vector' d='M0.833374 1.4165L5.00004 5.58317L9.16671 1.4165' stroke='%2328324D' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E%0A");
transition: transform 0.3s;
} }
&.active { &.active {
@@ -261,7 +308,7 @@
&[open=''] { &[open=''] {
summary:after { summary:after {
background-image: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.66732 8.16667C4.70781 8.21588 4.75871 8.25552 4.81634 8.28273C4.87397 8.30995 4.93692 8.32406 5.00065 8.32406C5.06439 8.32406 5.12733 8.30995 5.18496 8.28273C5.2426 8.25552 5.29349 8.21588 5.33398 8.16667L9.08399 3.16667C9.13041 3.10476 9.15869 3.03115 9.16564 2.95409C9.17258 2.87702 9.15794 2.79954 9.12333 2.73033C9.08872 2.66112 9.03553 2.60291 8.96971 2.56223C8.90388 2.52155 8.82803 2.5 8.75065 2.5H1.25065C1.17327 2.5 1.09742 2.52155 1.0316 2.56223C0.965773 2.60291 0.912579 2.66112 0.877973 2.73033C0.843368 2.79954 0.828719 2.87702 0.835668 2.95409C0.842617 3.03115 0.87089 3.10476 0.917318 3.16667L4.66732 8.16667Z' fill='%2328324d'/%3E%3C/svg%3E"); transform: rotate(180deg);
} }
} }
@@ -289,16 +336,32 @@
} }
} }
&__links > :last-child,
&__links-title:not(:nth-of-type(1)) {
border-color: $neutral-80;
}
@include media-breakpoint-up(xl) { @include media-breakpoint-up(xl) {
background-color: $neutral-98; border-right-color: $neutral-80;
&__links-group { &__links-group {
&.active { &.active {
.docs-menu__links-group-heading > a { .docs-menu__links-group-heading > a {
background-color: $neutral-94;
color: $neutral-30; color: $neutral-30;
} }
} }
&.external-link {
.docs-menu__links-group-heading {
&:after {
mask: url('/icons/outline/external-link.svg') no-repeat;
-webkit-mask: url('/icons/outline/external-link.svg') no-repeat;
mask-size: contain;
-webkit-mask-size: contain;
background: $neutral-30;
}
}
}
} }
} }
} }
@@ -0,0 +1,55 @@
@use '../../helpers/functions' as *;
.documentation {
background-color: $neutral-10;
min-height: calc(100vh - 80px);
color: $neutral-70;
&__container {
@extend .container;
margin: 0;
max-width: 100%;
}
&__article-wrapper {
width: 100%;
}
&__content-wrapper {
display: flex;
flex-wrap: wrap;
}
@include media-breakpoint-up(xl) {
&__container {
max-width: 100vw !important;
padding: 0;
}
&__content {
$side-menu-width: pxToRem(256);
width: calc(100% - #{$side-menu-width});
padding: $spacer * 1.5 $spacer * 2.5 $spacer * 3.5;
}
&__content-wrapper {
max-width: calc(1136px - $spacer * 2.5 * 1.5);
margin: 0 auto;
}
&__article-wrapper {
$toc-width: pxToRem(232);
width: calc(100% - #{$toc-width});
flex: 1;
}
}
[data-theme='light'] & {
background-color: $neutral-94;
color: $neutral-30;
.button_outlined {
color: $neutral-30;
box-shadow: 0 0 0 1px $neutral-70;
&:hover {
box-shadow: 0 0 0 2px $neutral-70;
}
}
}
}
@@ -0,0 +1,134 @@
@use '../../helpers/functions' as *;
@use 'sass:math';
.docs-card {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: pxToRem(12);
height: 100%;
width: 100%;
max-width: pxToRem(456);
margin: 0 auto;
padding: $spacer * 1.5;
border: pxToRem(1) solid $neutral-20;
background: linear-gradient(180deg, $neutral-20 0%, rgba(14, 20, 36, 0.1) 100%);
border-radius: pxToRem(12);
overflow: hidden;
color: $neutral-70;
&__tag {
display: flex;
align-items: center;
gap: $spacer * 0.5;
color: $secondary-blue-50;
&_violet {
color: $secondary-violet-50;
}
&_teal {
color: $secondary-teal-50;
}
}
img.docs-card__icon {
width: $spacer * 1.5;
height: $spacer * 1.5;
margin: 0;
// :has() selector only works in newer versions of browsers
// but in this case it has just minor visual effect
&:has(+ span) {
width: auto;
height: $spacer * 0.9;
}
}
img.docs-card__image {
$correctingMargin: $spacer * -1.5;
width: calc(100% + $spacer * 3);
max-width: none;
margin: $correctingMargin $correctingMargin $spacer * 0.75 $correctingMargin;
}
&__title,
h3.docs-card__title {
font-size: pxToRem(20);
line-height: pxToRem(30);
color: $neutral-98;
margin: 0;
padding: 0;
}
&__description,
p.docs-card__description {
font-size: pxToRem(14);
line-height: pxToRem(21);
margin: 0;
@include media-breakpoint-up(lg) {
flex-grow: 1;
}
}
&__arrow {
margin: auto 0 0 auto;
&:after {
content: '';
display: block;
margin-top: pxToRem(12);
height: $spacer;
width: $spacer;
background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10 3.33337L14.6667 8.00004L10 12.6667' stroke='%238F98B3' stroke-width='1.33333' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M1.33331 8H14.6666' stroke='%238F98B3' stroke-width='1.33333' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
background-repeat: no-repeat;
background-size: cover;
background-position: center;
}
}
a.docs__card-link {
margin: 0 0 $spacer * 2 $spacer * 1.5;
&:hover {
text-decoration: none;
}
}
&:hover {
background: linear-gradient(180deg, $neutral-20 0%, #0e1424 100%);
.docs-card__arrow:after {
background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.0001 3.33337L14.6667 8.00004L10.0001 12.6667' stroke='%23DC244C' stroke-width='1.33333' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M1.33337 8.00006H14.6667' stroke='%23DC244C' stroke-width='1.33333' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A");
}
.docs-card__link {
$icon-width: pxToRem(20);
padding-right: calc($icon-width + 6px);
&:after {
animation: dash 0.3s ease-in-out forwards;
}
&:before {
animation: dash 0.3s ease-in-out forwards;
}
}
}
@include media-breakpoint-up(lg) {
max-width: none;
}
[data-theme='light'] & {
background: $neutral-98;
border-color: $neutral-90;
color: $neutral-10;
.docs-card__title {
color: $neutral-10;
}
&:hover {
.docs-card__title {
color: $primary-50;
}
}
}
}
@@ -1,3 +1,6 @@
export const LG_BREAKPOINT = 992; export const LG_BREAKPOINT = 992;
export const XL_BREAKPOINT = 1200; export const XL_BREAKPOINT = 1200;
export const XXL_BREAKPOINT = 1400; export const XXL_BREAKPOINT = 1400;
// Offset for content navigation from the top of the page
export const DOCS_HEADER_OFFSET = 100;
@@ -1,5 +1,6 @@
import ThemeSwitch from './theme-switch.js'; import ThemeSwitch from './theme-switch.js';
import { XL_BREAKPOINT } from './constants'; import { XL_BREAKPOINT } from './constants';
import TableOfContents from './table-of-content';
const themeSwitch = new ThemeSwitch(); const themeSwitch = new ThemeSwitch();
@@ -15,10 +16,10 @@ document.addEventListener('DOMContentLoaded', () => {
sidebar.classList.toggle('active'); sidebar.classList.toggle('active');
}); });
const moveSearchButton = function() { const moveSearchButton = function () {
const checkIfFirstChildIsSearch = (element) => { const checkIfFirstChildIsSearch = (element) => {
return element.children.length > 0 && element.children[0].classList.contains('docs-menu__input'); return element.children.length > 0 && element.children[0].classList.contains('docs-menu__input');
} };
const isMobile = window.innerWidth <= XL_BREAKPOINT; const isMobile = window.innerWidth <= XL_BREAKPOINT;
if (isMobile && !checkIfFirstChildIsSearch(docsMenu)) { if (isMobile && !checkIfFirstChildIsSearch(docsMenu)) {
@@ -26,9 +27,14 @@ document.addEventListener('DOMContentLoaded', () => {
} else if (!isMobile && !checkIfFirstChildIsSearch(sidebar)) { } else if (!isMobile && !checkIfFirstChildIsSearch(sidebar)) {
sidebar.before(searchbar); sidebar.before(searchbar);
} }
} };
moveSearchButton(); moveSearchButton();
window.addEventListener('resize', moveSearchButton); window.addEventListener('resize', moveSearchButton);
// if #TableOfContents and .documentation-article exists on the page, initialize TableOfContents class
if (document.getElementById('TableOfContents') && document.querySelector('.documentation-article')) {
new TableOfContents('#TableOfContents', '.documentation-article');
}
}); });
@@ -2,6 +2,7 @@ import scrollHandler from './scroll-handler';
import { XXL_BREAKPOINT } from './constants'; import { XXL_BREAKPOINT } from './constants';
import { initGoToTopButton, getCookie } from './helpers'; import { initGoToTopButton, getCookie } from './helpers';
import { loadSegment, createSegmentStoredPage } from './segment-helpers'; import { loadSegment, createSegmentStoredPage } from './segment-helpers';
import TableOfContents from './table-of-content';
createSegmentStoredPage(); createSegmentStoredPage();
@@ -31,11 +32,17 @@ document.addEventListener('DOMContentLoaded', function () {
let menuOffset = window.innerWidth >= 1400 ? PADDING_PART_TO_HIDE : 0; // 24px is a PART of padding-top which we want to scroll over let menuOffset = window.innerWidth >= 1400 ? PADDING_PART_TO_HIDE : 0; // 24px is a PART of padding-top which we want to scroll over
function addScrollStateToPage() { function addScrollStateToPage() {
if (!header) {
return;
}
header.style.minHeight = `${header.offsetHeight}px`; header.style.minHeight = `${header.offsetHeight}px`;
body.classList.add('scrolled'); body.classList.add('scrolled');
} }
function removeScrollStateFromPage() { function removeScrollStateFromPage() {
if (!header) {
return;
}
header.style.minHeight = ''; header.style.minHeight = '';
body.classList.remove('scrolled'); body.classList.remove('scrolled');
} }
@@ -95,4 +102,8 @@ document.addEventListener('DOMContentLoaded', function () {
}); });
initGoToTopButton('#scrollToTopBtn'); initGoToTopButton('#scrollToTopBtn');
if (document.getElementById('TableOfContents') && document.querySelector('.qdrant-post__body')) {
new TableOfContents('#TableOfContents', '.qdrant-post__body');
}
}); });
@@ -1,7 +1,7 @@
import 'qdrant-page-search/dist/js/search.min.js'; import 'qdrant-page-search/dist/js/search.min.js';
(function () { (function () {
if (/documentation/.test(window.location?.pathname)) { if (/documentation|docs/.test(window.location?.pathname)) {
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'documentation' }); window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'documentation' });
} }
@@ -0,0 +1,85 @@
import { DOCS_HEADER_OFFSET } from './constants';
class TableOfContents {
constructor(tocSelector, contentSelector) {
this.tocLinks = Array.from(document.querySelectorAll(`${tocSelector} a`));
this.headings = Array.from(
document.querySelectorAll(
`${contentSelector} h1, ${contentSelector} h2, ${contentSelector} h3`,
),
);
this.currentActiveIndex = -1; // Track the current active heading index
this.currentActive = null; // Track the current active heading element
this.debounceTimeout = null;
this.currentlyVisibleHeaderIds = new Set();
this.headerOffset = DOCS_HEADER_OFFSET + 10;
this.init();
}
// Initialize the Table of Contents functionality
init() {
this.setupObserver();
}
// Clear 'active' class from all links
clearActiveClasses() {
this.tocLinks.forEach((link) => link.classList.remove('active'));
}
// Set active link with debounce
setActiveLink(index) {
if (index !== this.currentActiveIndex) {
this.clearActiveClasses();
if (this.tocLinks[index]) {
this.tocLinks[index].classList.add('active');
this.currentActiveIndex = index;
this.currentActive = this.headings[index];
}
}
}
// Setup Intersection Observer
setupObserver() {
const observerCallback = (entries) => {
entries.forEach((entry) => {
const entryIndex = this.headings.indexOf(entry.target);
const isIntersecting = entry.isIntersecting;
if (isIntersecting) {
this.currentlyVisibleHeaderIds.add(entryIndex);
} else {
this.currentlyVisibleHeaderIds.delete(entryIndex);
}
});
if (this.currentlyVisibleHeaderIds.size !== 0) {
let minimalVisibleHeaderId = Math.min(...Array.from(this.currentlyVisibleHeaderIds));
this.setActiveLink(minimalVisibleHeaderId);
} else {
// No intersection found
// If current active heading is below the viewport, then set current active to one above it
if (this.currentActive && this.currentActive.getBoundingClientRect().top > this.headerOffset) {
this.setActiveLink(this.currentActiveIndex - 1);
}
}
};
// Observer options
const observerOptions = {
root: null,
rootMargin: `-${this.headerOffset}px 0px -25% 0px`,
threshold: 0.0, // Lower threshold for better visibility
};
const observer = new IntersectionObserver(observerCallback, observerOptions);
this.headings.forEach((heading) => observer.observe(heading));
}
}
export default TableOfContents;
@@ -1,5 +1,6 @@
import AnchorJS from 'anchor-js'; import AnchorJS from 'anchor-js';
import { scrollIntoViewWithOffset } from '../helpers'; import { scrollIntoViewWithOffset } from '../helpers';
import { DOCS_HEADER_OFFSET } from '../constants';
const anchors = new AnchorJS(); const anchors = new AnchorJS();
anchors.options.placement = 'left'; anchors.options.placement = 'left';
@@ -8,19 +9,19 @@ anchors.options.class = 'text-decoration-none';
document.addEventListener('DOMContentLoaded', function (event) { document.addEventListener('DOMContentLoaded', function (event) {
anchors.add('.qdrant-post__body :is(h1, h2, h3, h4, h5, h6)'); anchors.add('.qdrant-post__body :is(h1, h2, h3, h4, h5, h6)');
if (/documentation/.test(window.location?.pathname)) { if (/documentation/.test(window.location?.pathname)) {
anchors.add('.documentation-article :is(h1, h2, h3, h4, h5, h6)'); anchors.add('.documentation-article > :is(h1, h2, h3, h4, h5, h6)');
} }
// scroll to anchors: // scroll to anchors:
let offset = 100; let offset = DOCS_HEADER_OFFSET;
if (window.location.hash) { if (window.location.hash) {
scrollIntoViewWithOffset(window.location.hash.replace('#', ''), offset).catch((e) => { scrollIntoViewWithOffset(window.location.hash.replace('#', ''), offset);
console.error(e);
});
} }
document.querySelectorAll('a[href^="#"]').forEach((anchor) => { let allLinks = document.querySelectorAll('a[href^="#"]');
allLinks.forEach((anchor) => {
const target = anchor.getAttribute('href'); const target = anchor.getAttribute('href');
anchor.addEventListener('click', function (e) { anchor.addEventListener('click', function (e) {
e.preventDefault(); e.preventDefault();
@@ -1,5 +1,11 @@
{{ define "main" }} <!doctype html>
{{ partial "site-header" . }} <html lang="en">
{{- partial "head.html" . -}}
{{ partial "documentation" . }} <body>
{{ end }} <main>
{{ partial "documentation/header" . }}
{{ partial "documentation/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -1,5 +1,11 @@
{{ define "main" }} <!doctype html>
{{ partial "site-header" . }} <html lang="en">
{{- partial "head.html" . -}}
{{ partial "documentation" . }} <body>
{{ end }} <main>
{{ partial "documentation/header" . }}
{{ partial "documentation/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -6,7 +6,7 @@
<link href="{{ $splideCss.RelPermalink }}" rel="stylesheet" integrity="{{ $splideCss.Data.Integrity }}" /> <link href="{{ $splideCss.RelPermalink }}" rel="stylesheet" integrity="{{ $splideCss.Data.Integrity }}" />
{{ end }} {{ end }}
{{ if in (slice "blog" "documentation") .Section }} {{ if in (slice "blog" "docs" "documentation") .Section }}
{{ $pageSearchCss := resources.Get "css/search/search.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }} {{ $pageSearchCss := resources.Get "css/search/search.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link href="{{ $pageSearchCss.RelPermalink }}" rel="stylesheet" integrity="{{ $pageSearchCss.Data.Integrity }}" /> <link href="{{ $pageSearchCss.RelPermalink }}" rel="stylesheet" integrity="{{ $pageSearchCss.Data.Integrity }}" />
{{ end }} {{ end }}
@@ -21,7 +21,7 @@
/> />
{{ end }} {{ end }}
{{ if eq .Section "documentation" }} {{ if in (slice "docs" "documentation") .Section }}
{{ $documentationCss := resources.Get "css/documentation.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }} {{ $documentationCss := resources.Get "css/documentation.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link <link
href="{{ $documentationCss.RelPermalink }}" href="{{ $documentationCss.RelPermalink }}"
@@ -35,7 +35,7 @@
<link href="{{ $benchmarksCss.RelPermalink }}" rel="stylesheet" integrity="{{ $benchmarksCss.Data.Integrity }}" /> <link href="{{ $benchmarksCss.RelPermalink }}" rel="stylesheet" integrity="{{ $benchmarksCss.Data.Integrity }}" />
{{ end }} {{ end }}
{{ if not (in (slice "hybrid-cloud" "documentation" "benchmarks") .Section) }} {{ if not (in (slice "hybrid-cloud" "docs" "documentation" "benchmarks") .Section) }}
{{ $mainCss := resources.Get "css/main.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }} {{ $mainCss := resources.Get "css/main.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link href="{{ $mainCss.RelPermalink }}" rel="stylesheet" integrity="{{ .Data.Integrity }}" crossorigin="anonymous" /> <link href="{{ $mainCss.RelPermalink }}" rel="stylesheet" integrity="{{ .Data.Integrity }}" crossorigin="anonymous" />
{{ end }} {{ end }}
@@ -1,5 +0,0 @@
<div class="col-12 col-xl-8">
<article class="documentation-article">
{{ partial "article-content.html" . }}
</article>
</div>
@@ -1,9 +0,0 @@
<section class="documentation documentation_theme-light">
<div class="documentation__container">
<div class="row gx-4">
{{ partial "docs-menu" . }}
{{ partial "documentation-article" . }}
{{ partial "table-of-contents" . }}
</div>
</div>
</section>
@@ -0,0 +1,13 @@
<section class="docs-core__hero">
<h1 class="docs-core__hero-title">{{ .title }}</h1>
<p class="docs-core__hero-description">{{ .description }}</p>
<p class="docs-core__hero-link">{{ .linkDescription | safeHTML }}</p>
<div class="docs-core__hero-buttons">
<a href="{{ .cloudButton.url }}" {{ if strings.HasPrefix .cloudButton.url "https://" }}target="_blank"{{ end }} class="button button_contained button_sm">
{{ .cloudButton.text }}
</a>
<a href="{{ .localButton.url }}" {{ if strings.HasPrefix .localButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm">
{{ .localButton.text }}
</a>
</div>
</section>
@@ -0,0 +1,10 @@
<section class="docs-cloud__hero docs__hero">
<div class="docs__hero-content">
<h1 class="docs__hero-title">{{ .title }}</h1>
<a href="{{ .startedButton.url }}" {{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm docs__hero-button">
{{ .startedButton.text }}
</a>
</div>
<img class="docs__hero-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
<div class="docs-core__overlay"></div>
</section>
@@ -0,0 +1,10 @@
<section class="docs-build__hero docs__hero">
<div class="docs__hero-content">
<h1 class="docs__hero-title">{{ .title }}</h1>
<a href="{{ .startedButton.url }}" {{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm docs__hero-button">
{{ .startedButton.text }}
</a>
</div>
<img class="docs__hero-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
<div class="docs-core__overlay"></div>
</section>
@@ -0,0 +1,19 @@
<section class="docs-core__developing">
<h2>{{ .developingTitle }}</h2>
<p>{{ .developingDescription | safeHTML }}</p>
<div class="docs-core__developing-block">
<div class="row align-items-center">
<div class="docs-core__developing-block-text col-12 col-lg-7">
<h3 class="docs-core__developing-bloc-title">{{ .developingBlock.title }}</h3>
<a href="{{ .developingBlock.button.url }}" {{ if strings.HasPrefix .developingBlock.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm" target="_blank">
{{ .developingBlock.button.text }}
</a>
</div>
<div class="docs-core__developing-block-image col-12 col-lg-5">
<img src="{{ .developingBlock.image.src }}" alt="{{ .image.alt }}" />
</div>
<div class="docs-core__overlay"></div>
</div>
</div>
</section>
@@ -0,0 +1,13 @@
<ul class="docs-breadcrumbs">
{{ $rellink := "" }}
{{ $paths := (split .RelPermalink "/") }}
{{ $len := sub (len $paths) 2 }}
{{ range first $len $paths }}
{{ if gt (len . ) 0 }}
{{ $rellink = printf "%s/%s" $rellink . }}
<li class="docs-breadcrumbs__crumb"><a href="{{ $rellink }}/">{{ humanize . }}</a></li>
<li class="docs-breadcrumbs__crumb-separator"></li>
{{ end }}
{{ end }}
<li class="docs-breadcrumbs__crumb">{{ .Params.title | safeHTML }}</li>
</ul>
@@ -0,0 +1,36 @@
{{ $cardsPerRow := .cardsPerRow }}
{{ $cardsPerRow = $cardsPerRow | int }}
{{ $cardsPerRow = div 12 $cardsPerRow }}
{{ $cardsPerRow = print $cardsPerRow }}
{{ $cardsPerRow = printf "col-12 col-lg-%s" $cardsPerRow }}
{{ $cardsPerRow = print $cardsPerRow }}
<div class="{{- $cardsPerRow -}}">
<a
href="{{ .card.link.url }}"
{{ if strings.HasPrefix .card.link.url "https://" }}target="_blank"{{ end }}
class="docs-card"
>
{{ if or (.card.tag) (.card.icon) }}
<div class="docs-card__tag {{ if .card.tagColor }}docs-card__tag_{{- .card.tagColor -}}{{ end }}">
{{ if .card.icon }}
<img class="docs-card__icon" src="{{ .card.icon.src }}" alt="{{ .card.icon.alt }}" />
{{ end }}
{{ if .card.tag }}
<span>{{ .card.tag }}</span>
{{ end }}
</div>
{{ end }}
{{ if .card.image }}
<img class="docs-card__image" src="{{ .card.image.src }}" alt="{{ .card.image.alt }}" />
{{ end }}
<h3 class="docs-card__title">{{ .card.title }}</h3>
<p class="docs-card__description">{{ .card.description }}</p>
{{ if .card.link.text }}
<span class="docs-card__link link link_sm">{{ .card.link.text }}</span>
{{ else }}
<div class="docs-card__arrow"></div>
{{ end }}
</a>
</div>
@@ -0,0 +1,39 @@
<!--documentation content layout, aka middle part of the documentation page where the actual content is displayed-->
<section class="docs documentation">
<div class="documentation__container">
<div class="d-flex flex-column flex-xl-row">
{{ $partition := partial "get-partition.html" (dict "page" .) }}
{{ partial "documentation/sidebar-menu" (dict "context" . "partition" $partition) }}
<div class="documentation__content">
<!-- todo: update this and styles to support both types of content on the same page-->
<div class="documentation__content-wrapper">
{{ if .Params.content }}
<div class="documentation__article-wrapper">
<div class="docs-core documentation-article">
{{ partial "documentation/custom-content.html" . }}
</div>
</div>
{{ else }}
<div class="documentation__article-wrapper">
{{ if not (eq .Params.breadcrumb false) }}
{{ partial "documentation/breadcrumbs" . }}
{{ end }}
<article class="documentation-article">
{{ partial "article-content.html" . }}
</article>
{{ partial "documentation/feedback.html" . }}
</div>
{{ partial "table-of-contents" . }}
{{ end }}
{{ partial "documentation/footer.html" . }}
</div>
</div>
</div>
</div>
</section>
@@ -0,0 +1,6 @@
<!--template for displaying `content` list from front matter-->
{{ if .Params.content }}
{{ range .Params.content }}
{{ partial .partial . }}
{{ end }}
{{ end }}
@@ -0,0 +1,36 @@
<section class="dev-portal-articles-posts">
<div class="dev-portal-articles-posts__articles row gx-3 gy-5 gy-lg-4">
{{ $all := ($.Site.GetPage "articles" .Section).Pages.ByPublishDate.Reverse }}
{{ $paginator := .Paginate $all 14 }}
{{ range $paginator.Pages }}
{{ .Scratch.Set "scope" "list" }}
{{ $link := .Permalink }}
{{ if .Params.external_link }}
{{ $link = .Params.external_link }}
{{ end }}
<article class="col-12 col-lg-6 col-xl-4 post">
<a class="post-link" href="{{ .RelPermalink }}">
<div class="post-preview">
<img src="{{ .Params.preview_dir }}/preview.jpg" alt="Preview" />
</div>
<h6 class="post-title">{{ .Params.title }}</h6>
<p class="post-description">{{ .Params.description }}</p>
<div class="post-about">
<p>{{ .Params.author }}</p>
<span>&middot;</span>
<p>{{ time.Format "January 02, 2006" .Date }}</p>
</div>
</a>
</article>
{{ end }}
</div>
<div class="row">
<div class="qdrant-articles-posts__pagination col-12">
{{ if gt $paginator.TotalPages 1 }}
{{ partial "pagination" $paginator }}
{{ end }}
</div>
</div>
</section>
@@ -0,0 +1,15 @@
{{ with (.Site.GetPage "/headless/docs-feedback") }}
<section class="docs-feedback">
<h5 class="docs-feedback__title">{{ .Params.title }}</h5>
<div class="docs-feedback__buttons">
<a href="{{ .Params.positiveButton.url }}" class="button button_outlined button_sm docs-feedback__button">
<img src="{{ .Params.positiveButton.icon.src }}" alt="{{ .Params.positiveButton.icon.alt }}">
{{ .Params.positiveButton.text }}
</a>
<a href="{{ .Params.negativeButton.url }}" class="button button_outlined button_sm docs-feedback__button">
<img src="{{ .Params.negativeButton.icon.src }}" alt="{{ .Params.negativeButton.icon.alt }}">
{{ .Params.negativeButton.text }}
</a>
</div>
</section>
{{end }}
@@ -0,0 +1,21 @@
{{ with (.Site.GetPage "/headless/footer") }}
<footer class="docs-footer w-100 py-0 pt-0 pb-4 pb-xl-0">
<div class="docs-footer__cta">
<h4>{{ .Params.question }}</h4>
<a href="{{ .Params.questionButton.url }}" class="button button_outlined button_sm" target="_blank">
{{ .Params.questionButton.text }}
</a>
</div>
<div class="docs-footer__bottom">
<div class="docs-footer__bottom-content">
<span>{{ .Params.copyright }}</span>
<div class="footer__bottom-links">
<a href="{{ .Params.termsLink.url }}">{{ .Params.termsLink.text }}</a>
<a href="{{ .Params.privacyLink.url }}">{{ .Params.privacyLink.text }}</a>
<a href="{{ .Params.impressumLink.url }}">{{ .Params.impressumLink.text }}</a>
</div>
</div>
</div>
</footer>
{{ end }}
@@ -0,0 +1,145 @@
<header class="docs-header">
{{ $partition := partial "get-partition.html" (dict "page" .) }}
{{ with (.Site.GetPage "/headless/docs-header") }}
<div class="main-menu z-5">
<a href="{{ .Params.logoLink }}">
{{ partial "logo.html" . }}
</a>
<div class="d-flex d-xl-none justify-content-end align-items-center gap-4">
<div class="d-block d-xl-none">
{{ partial "theme-switch" . }}
</div>
<button type="button" class="main-menu__trigger">{{ partial "svg" "hamburger-menu-white.svg" }}</button>
</div>
<ul class="main-menu__links">
{{ range $index, $element := .Params.menuItems }}
<li class="main-menu__item">
{{ if .url }}
<a
class="menu-link {{- if eq (lower .name) $partition }}active{{- end -}}"
href="{{ .url }}"
{{ if (eq $index 3) }}target="_blank"{{ end }}
>
{{ .name }}
</a>
{{ else }}
<span>{{ .name }}</span>
{{ end }}
{{ if .subMenuItems }}
<ul class="main-menu__submenu">
{{ if .url }}
<li class="main-menu__section-link">
<a class="link link_neutral link_sm" href="{{ .url }}">
{{ .name }}
</a>
</li>
{{ end }}
{{ range .subMenuItems }}
<li class="main-menu__submenu-item">
<a
href="{{ .url }}"
{{ if strings.HasPrefix .url "http" }}target="_blank" rel="noopener noreferrer nofollow"{{ end }}
>
<img src="/img/menu/{{ .icon }}" draggable="false" />
<span>{{ .name }}</span>
</a>
</li>
{{ end }}
</ul>
{{ end }}
</li>
{{ end }}
</ul>
<div class="main-menu__buttons">
<div class="main-menu__buttons-input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
type="button"
name="search"
data-target="#searchModal"
>
Search
</button>
</div>
{{ partial "theme-switch" . }}
<a data-metric-loc="nav" href="{{ .Params.logIn.url }}" class="menu-link mx-3" target="_blank"
>{{ .Params.logIn.text }}</a
>
<a
data-metric-loc="nav"
href="{{ .Params.startFree.url }}"
class="button button_contained button_sm"
target="_blank"
>
{{ .Params.startFree.text }}
</a>
</div>
</div>
<div class="menu-mobile">
<div class="menu-mobile__header">
{{ partial "logo.html" . }}
<button type="button" class="menu-mobile__close">{{ partial "svg" "close.svg" }}</button>
</div>
<ul class="menu-mobile__items">
{{ range .Params.menuItems }}
<li class="menu-mobile__item" data-path="{{ .id }}">
<div class="menu-mobile__item-content">
{{ if and (not .subMenuItems) .url }}
<a href="{{ .url }}">
{{ .name }}
</a>
{{ else }}
{{ .name }}
{{ end }}
{{ if .subMenuItems }}
<button type="button" class="menu-mobile__expand">{{ partial "svg" "arrow-sm-down.svg" }}</button>
{{ end }}
</div>
{{ if .subMenuItems }}
<ul class="menu-mobile__subitems">
{{ if .url }}
<li class="menu-mobile__section-link">
<a class="link link_neutral link_sm" href="{{ .url }}">
{{ .name }}
</a>
</li>
{{ end }}
{{ range .subMenuItems }}
<a href="{{ .url }}">
<li class="menu-mobile__subitem">
<span style="background-image: url(/img/menu/{{ .icon }})"> </span>
{{ .name }}
</li>
</a>
{{ end }}
</ul>
{{ end }}
</li>
{{ end }}
</ul>
<div class="menu-mobile__controls">
<a
data-metric-loc="mobile_nav"
href="{{ .Params.logIn.url }}"
class="button button_outlined button_lg menu-mobile__login"
target="_blank"
>
{{ .Params.logIn.text }}
</a>
<a
data-metric-loc="mobile_nav"
href="{{ .Params.startFree.url }}"
class="button button_contained button_lg"
target="_blank"
>
{{ .Params.startFree.text }}
</a>
</div>
</div>
{{ end }}
</header>
@@ -0,0 +1,25 @@
{{ $context := . }}
<section class="docs-core__data">
<div class="d-flex justify-content-between align-items-center flex-wrap column-gap-4 mb-5 mb-lg-3">
<div>
<h2>{{ .title }}</h2>
<p class="mb-3">{{ .description }}</p>
</div>
{{ if .button }}
<a
href="{{ .button.url }}"
{{ if strings.HasPrefix .button.url "https://" }}target="_blank"{{ end }}
class="button button_outlined button_sm"
>
{{ .button.text }}
</a>
{{ end }}
</div>
<div class="row g-4 g-lg-3">
{{ range $index, $element := .cards }}
{{ $cardsPerRow := $context.cardsPerRow | default 3 }}
{{ partial $context.cardsPartial (dict "card" $element "cardsPerRow" $cardsPerRow) }}
{{ end }}
</div>
</section>

Some files were not shown because too many files have changed in this diff Show More