Merge branch 'master' into int-feast

This commit is contained in:
David Myriel
2024-11-14 15:15:41 -08:00
committed by GitHub
128 changed files with 2344 additions and 364 deletions
+3
View File
@@ -107,6 +107,9 @@ disableKinds = ["taxonomy", "term"]
[markup.highlight]
noClasses = false
codeFences=true
[markup.tableOfContents]
startLevel = 1
endLevel = 3
[related]
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:
```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)
```
@@ -41,7 +41,7 @@ Imagine you have a PDF packed with complex layouts, tables, and images, and you
### Why is ColPali Better?
This entire process can be time-consuming, especially for complex documents, with each page often taking over seven seconds to process. For text-heavy documents, this approach might suffice, but real-world data is often rich and complex, making traditional extraction methods less effective.
This entire process can require too many steps, especially for complex documents, with each page often taking over seven seconds to process. For text-heavy documents, this approach might suffice, but real-world data is often rich and complex, making traditional extraction methods less effective.
This is where ColPali comes into play. **ColPali, or Contextualized Late Interaction Over PaliGemma**, uses a vision language model (VLM) to simplify and enhance the document retrieval process.
@@ -50,7 +50,7 @@ Instead of relying on text-only methods, ColPali generates contextualized **mult
## How ColPali Works Under the Hood
![Qdrant and Colpali](/blog/qdrant-colpali/qdrant-colpali-1.png)
Rather than relying on OCR, ColPali **processes the entire document as an image** using a Vision Encoder. It creates multi-vector embeddings that capture both the textual content and the visual structure of the document which are then passed through a Language Model (LLM), which integrates the information into a representation that retains both text and visual features.
Rather than relying on OCR, ColPali **processes the entire document as an image** using a Vision Encoder. It creates multi-vector embeddings that capture both the textual content and the visual structure of the document which are then passed through a Large Language Model (LLM), which integrates the information into a representation that retains both text and visual features.
Here’s a step-by-step look at the ColPali architecture and how it enhances document retrieval:
@@ -91,7 +91,7 @@ Our goal is to go through a dataset of multilingual newspaper articles like the
### Results
> In our testing, the search time was reduced to 0.81 seconds.
> Success! Tests shows that search time is 2x faster than with Scalar Quantization.
This is significantly faster than with Scalar Quantization, and we still retrieved the top document matches with remarkable accuracy.
@@ -2,7 +2,74 @@
title: Home
weight: 2
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
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
aliases:
- /documentation/overview/qdrant-alternatives/documentation/cloud/
partition: cloud
---
# About Qdrant Managed Cloud
@@ -2,6 +2,7 @@
title: Concepts
weight: 8
# If the index.md file is empty, the link to the section will be hidden from the sidebar
partition: qdrant
---
# Concepts
@@ -859,7 +859,7 @@ curl -X PATCH http://localhost:6333/collections/{collection_name} \
```python
client.update_collection(
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
weight: 18
partition: build
---
## Data Management Integrations
@@ -1,6 +1,7 @@
---
title: Practice Datasets
weight: 29
partition: build
---
# 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.
title: "Support"
type: delimiter
weight: 27 # Change this weight to change order of sections
weight: 30 # Change this weight to change order of sections
sitemapExclude: True
_build:
publishResources: false
render: never
partition: cloud
---
@@ -3,6 +3,7 @@
title: "Examples"
type: delimiter
weight: 24 # Change this weight to change order of sections
partition: build
sitemapExclude: True
_build:
publishResources: false
@@ -7,4 +7,5 @@ sitemapExclude: True
_build:
publishResources: false
render: never
---
partition: qdrant
---
@@ -7,4 +7,5 @@ sitemapExclude: True
_build:
publishResources: false
render: never
partition: build
---
@@ -7,4 +7,5 @@ sitemapExclude: True
_build:
publishResources: false
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:
publishResources: false
render: never
partition: qdrant
---
@@ -2,6 +2,7 @@
---
title: Embeddings
weight: 19
partition: build
---
# Supported Embedding Providers & Models
@@ -1,6 +1,7 @@
---
title: Build Prototypes
weight: 26
partition: build
---
# Examples
@@ -1,5 +1,6 @@
---
title: FAQ
weight: 28
weight: 31
partition: qdrant
is_empty: true
---
@@ -1,6 +1,7 @@
---
title: "FastEmbed"
weight: 6
partition: qdrant
---
# What is FastEmbed?
@@ -1,6 +1,7 @@
---
title: Frameworks
weight: 20
partition: build
---
## Framework Integrations
@@ -12,7 +13,7 @@ weight: 20
| [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. |
| [DSPy](/documentation/frameworks/dspy/) | Framework for algorithmically optimizing LM prompts and weights. |
| [Feast](/documentation/frameworks/feast/) | Open-source feature store to operate production ML systems at scale as a set of features. |
| [Feast](/documentation/frameworks/feast/) | Open-source feature store to operate production ML systems at scale as a set of features. |
| [Fifty-One](/documentation/frameworks/fifty-one/) | Toolkit for building high-quality datasets and computer vision models. |
| [Genkit](/documentation/frameworks/genkit/) | Framework to build, deploy, and monitor production-ready AI-powered apps. |
| [Haystack](/documentation/frameworks/haystack/) | LLM orchestration framework to build customizable, production-ready LLM applications. |
@@ -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
# If the index.md file is empty, the link to the section will be hidden from the sidebar
is_empty: true
partition: qdrant
---
@@ -1,6 +1,7 @@
---
title: Hybrid Cloud
weight: 13
partition: cloud
---
# Qdrant Hybrid Cloud
@@ -1,6 +1,7 @@
---
title: Infrastructure
weight: 21
partition: build
---
## Infrastructure Integrations
@@ -1,6 +1,7 @@
---
title: API & SDKs
weight: 6
partition: qdrant
aliases:
- /documentation/interfaces/
---
@@ -1,6 +1,7 @@
---
title: Observability
weight: 22
partition: build
---
## Observability Integrations
@@ -3,6 +3,7 @@ title: What is Qdrant?
weight: 3
aliases:
- overview
partition: qdrant
---
# Introduction
@@ -1,16 +1,18 @@
---
title: Platforms
weight: 23
partition: build
---
## Platform Integrations
| Platform | Description |
| --------------------------- | ---------------------------------------------------------------------------------------- |
| Platform | Description |
| -------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [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 |
| [BuildShip](/documentation/platforms/buildship/) | Low-code visual builder to create APIs, scheduled jobs, and backend workflows. |
| [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. |
| [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. |
| [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. |
@@ -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
weight: 14
partition: cloud
---
# Qdrant Private Cloud
@@ -1,6 +1,7 @@
---
title: Qdrant Cloud API
weight: 15
weight: 26
partition: cloud
---
# Qdrant Cloud API
@@ -1,8 +1,8 @@
---
title: Cloud Quickstart
weight: 4
partition: qdrant
aliases:
- quickstart-cloud
- ../cloud-quick-start
- cloud-quick-start
- 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.
For more about Qdrant Cloud, check our [dedicated documentation](/documentation/cloud-intro/).
@@ -1,10 +1,10 @@
---
title: Local Quickstart
weight: 5
partition: qdrant
aliases:
- quick_start
- quick-start
- quickstart
---
# How to Get Started with Qdrant Locally
@@ -1,6 +1,7 @@
---
title: Release Notes
weight: 30
weight: 32
partition: qdrant
type: external-link
external_url: https://github.com/qdrant/qdrant/releases
sitemapExclude: True
@@ -1,6 +1,7 @@
---
title: Send Data to Qdrant
weight: 25
partition: build
---
## How to Send Your Data to a Qdrant Cluster
@@ -1,6 +1,7 @@
---
title: Support
weight: 16
weight: 35
partition: cloud
aliases:
- /documentation/cloud/support/
---
@@ -6,6 +6,7 @@ is_empty: false
aliases:
- how-to
- tutorials
partition: qdrant
---
# Tutorials
@@ -159,7 +159,7 @@ Image.open(client.search(
![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:
@@ -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
- id: 5
name: Changelog
url: https://github.com/qdrant/qdrant/releases
url: https://github.com/qdrant/qdrant/releases
- id: 6
name: Status Page
url: https://status.qdrant.io/
@@ -133,5 +133,9 @@ bages:
- src: /img/gdpr-badge.png
alt: "heyData GDPR"
url: https://heydata.eu/
question: Ready to get started with Qdrant?
questionButton:
text: Start Free
url: https://qdrant.to/cloud/
sitemapExclude: true
---
+1 -1
View File
@@ -1,6 +1,6 @@
---
stats:
githubStars: 20.4k
githubStars: 20.5k
discordMembers: 6.9k
twitterFollowers: 7.5k
---
@@ -2,7 +2,7 @@
title: Why join Qdrant for Startups?
mainCard:
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:
src: /img/qdrant-for-startups-benefits/card1.png
alt: Qdrant Discount for Startups
+22 -18
View File
@@ -1,5 +1,17 @@
---
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:
- id: 0
image:
@@ -30,84 +42,76 @@ cards:
position: Founder of SciPhi
description: Physics PhD, Quant @ Citadel and Founder at SciPhi
- 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:
src: /img/stars/niranjan-akella.jpg
alt: Niranjan Akella Photo
name: Niranjan Akella
position: Scientist by Heart & AI Engineer
description: I build & deploy AI models like LLMs, Diffusion Models & Vision Models at scale
- id: 6
- id: 5
image:
src: /img/stars/bojan-jakimovski.jpg
alt: Bojan Jakimovski Photo
name: Bojan Jakimovski
position: Machine Learning Engineer
description: I'm really excited to show the power of the Qdrant as vector database
- id: 7
- id: 6
image:
src: /img/stars/haydar-kulekci.jpg
alt: Haydar KULEKCI Photo
name: Haydar KULEKCI
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.
- id: 8
- id: 7
image:
src: /img/stars/nicola-procopio.jpg
alt: Nicola Procopio Photo
name: Nicola Procopio
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.
- id: 9
- id: 8
image:
src: /img/stars/eduardo-vasquez.jpg
alt: Eduardo Vasquez Photo
name: Eduardo Vasquez
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.
- id: 10
- id: 9
image:
src: /img/stars/benito-martin.jpg
alt: Benito Martin Photo
name: Benito Martin
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.
- id: 11
- id: 10
image:
src: /img/stars/nirant-kasliwal.jpg
alt: Nirant Kasliwal Photo
name: Nirant Kasliwal
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.
- id: 12
- id: 11
image:
src: /img/stars/denzell-ford.jpg
alt: Denzell Ford Photo
name: Denzell Ford
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.
- id: 13
- id: 12
image:
src: /img/stars/pavan-nagula.jpg
alt: Pavan Nagula Photo
name: Pavan Nagula
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.
- id: 14
- id: 13
image:
src: /img/stars/guohao-li.jpg
alt: Guohao Li Photo
name: Guohao Li
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.
- id: 15
- id: 14
image:
src: /img/stars/sahin-utar.jpg
alt: Şahin Utar Photo
+4 -4
View File
@@ -12,7 +12,7 @@
"anchor-js": "^5.0.0",
"bootstrap": "^5.3.3",
"clipboard": "^2.0.11",
"qdrant-page-search": "^1.0.8"
"qdrant-page-search": "^1.0.10"
},
"devDependencies": {
"@babel/preset-env": "^7.23.9",
@@ -3173,9 +3173,9 @@
}
},
"node_modules/qdrant-page-search": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/qdrant-page-search/-/qdrant-page-search-1.0.9.tgz",
"integrity": "sha512-297elNEhqo/ETFl4ZdoMWD92l7hSTDYckm6BYk6+iTnC9qECGoM9xnIkzbgCdNtIpfjFi6VfuLXysxzvwQha0A=="
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/qdrant-page-search/-/qdrant-page-search-1.0.10.tgz",
"integrity": "sha512-ZNWXClp8EpfVGmI4qgcPFsSbXSAZ4iZx7hU04henwDV9x3OjjpMNY8jAbReK9/EtjraWEwGdRaArhRK0HzC/MQ=="
},
"node_modules/queue-microtask": {
"version": "1.2.3",
+1 -1
View File
@@ -21,7 +21,7 @@
"anchor-js": "^5.0.0",
"bootstrap": "^5.3.3",
"clipboard": "^2.0.11",
"qdrant-page-search": "^1.0.8"
"qdrant-page-search": "^1.0.10"
},
"devDependencies": {
"@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-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 {
@@ -1,8 +1,15 @@
@import 'base';
@import 'partials/theme-switch';
@import 'partials/docs-menu';
@import 'partials/documentation';
@import 'partials/documentation-article';
@import 'partials/documentation/documentation-menu';
@import 'partials/documentation/docs-card';
@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/feedback';
@import 'partials/documentation/docs-footer';
@import 'search/dark-theme';
@@ -106,3 +106,4 @@
@import 'partials/rag-evaluation-guide-kubernetes-clusters';
@import 'partials/rag-evaluation-guide-features';
@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;
cursor: pointer;
&:hover {
&:hover,
&.active {
color: $primary-50;
}
}
@@ -34,62 +34,6 @@
padding-bottom: $spacer * 5;
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) {
@@ -123,30 +67,6 @@
&__content {
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;
}
&__cards {
row-gap: pxToRem(30);
}
&__card {
position: relative;
width: 100%;
max-width: pxToRem(255);
height: 100%;
min-height: pxToRem(375);
margin: 0 auto;
padding: $spacer * 1.5;
border-radius: pxToRem(12);
@@ -52,13 +57,6 @@
color: $neutral-90;
}
&-distinguished {
margin-bottom: $spacer * 0.5;
font-size: pxToRem(12);
line-height: pxToRem(21);
color: $secondary-violet-70;
}
&-description {
margin-bottom: 0;
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 {
position: absolute;
right: 0;
@@ -95,30 +148,23 @@
&__title {
margin-bottom: $spacer * 5;
font-size: $spacer * 4;
font-size: $spacer * 3.5;
line-height: pxToRem(67);
}
&__cards > div {
&:nth-of-type(1),
&: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;
}
}
&__cards {
row-gap: $spacer * 2.5;
}
}
@include media-breakpoint-up(xl) {
&__card {
margin: 0 auto !important;
&__main-card {
flex-direction: row;
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 'sass:math';
.table-of-contents {
background-color: $neutral-10;
margin-bottom: -1px;
scrollbar-width: none;
&__head {
display: none;
margin-bottom: 0;
padding: 0 math.div($spacer, 2) $spacer;
color: $neutral-20;
}
&__title {
display: none;
color: $neutral-98;
margin-bottom: $spacer;
font-size: map-get($font-sizes-text, 'md');
line-height: pxToRem(24);
color: $neutral-30;
margin-bottom: math.div($spacer, 4);
padding: math.div($spacer, 4) math.div($spacer, 2);
font-size: pxToRem(14);
line-height: pxToRem(21);
}
nav {
display: none;
padding-bottom: pxToRem(12);
padding-bottom: $spacer;
ul {
padding-left: 0;
@@ -27,15 +35,26 @@
a {
display: block;
margin-bottom: pxToRem(12);
color: $neutral-70;
padding: math.div($spacer, 4) math.div($spacer, 2);
color: $neutral-30;
font-weight: 400;
font-size: pxToRem(14);
line-height: pxToRem(21);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
transition: all 0.3s;
&:hover {
color: $primary-50;
}
&.active {
font-weight: 600;
background-color: $neutral-90;
color: $neutral-30;
border-radius: $spacer * 0.5;
}
}
& > ul > li {
@@ -45,8 +64,8 @@
}
&__external-links {
border-top: 1px solid $neutral-50;
border-bottom: 1px solid $neutral-50;
border-top: 1px solid $neutral-90;
border-bottom: 1px solid $neutral-90;
list-style: none;
padding: $spacer * 1.5 0;
margin: 0;
@@ -54,6 +73,8 @@
&__link {
margin-bottom: pxToRem(12);
font-size: pxToRem(14);
line-height: pxToRem(21);
&:last-of-type {
margin-bottom: 0;
@@ -63,8 +84,16 @@
display: flex;
align-items: center;
gap: calc($spacer / 2);
padding: 0 math.div($spacer, 2);
color: $neutral-30;
font-weight: 500;
&:hover {
text-decoration: underline;
color: $primary-50;
text-decoration: none;
svg path {
fill: $primary-50;
}
}
}
@@ -72,36 +101,113 @@
display: block;
width: pxToRem(16);
height: pxToRem(16);
path {
fill: $neutral-30;
}
}
}
@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,
&__head,
&__title {
display: block;
}
}
[data-theme='light'] & {
background-color: $neutral-98;
margin-bottom: $spacer * 2;
&__title {
color: $neutral-30;
[data-theme='dark'] & {
&__title,
&__head {
color: $neutral-98;
}
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 {
border-top: 1px solid $neutral-90;
border-bottom: 1px solid $neutral-90;
border-top: 1px solid $neutral-20;
border-bottom: 1px solid $neutral-20;
}
&__link {
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 '../mixins/mixins' as *;
@use '../../helpers/functions' as *;
@use '../../mixins/mixins' as *;
.documentation-article {
padding-top: $spacer * 2;
padding-bottom: $spacer * 1.5;
font-weight: 400;
h1 {
font-size: $spacer * 2;
@@ -17,17 +17,19 @@
h3,
h4 {
font-size: $spacer * 1.5;
font-weight: 500;
line-height: pxToRem(34);
color: $neutral-98;
margin-bottom: $spacer;
padding-top: $spacer * 0.5;
}
p, summary {
p,
summary {
margin-bottom: $spacer;
}
a:hover {
a:not([class]):hover {
text-decoration: underline;
}
@@ -57,8 +59,7 @@
}
@include media-breakpoint-up(xl) {
margin: -8px 0 -16px;
padding: 0 $spacer * 1.5;
width: 100%;
}
}
@@ -1,9 +1,11 @@
@use '../helpers/functions' as *;
@use '../../helpers/functions' as *;
@use 'sass:math';
.docs-menu {
background-color: $neutral-20;
border-top: 1px solid $neutral-30;
margin: 0 -16px;
margin: 0 (-$spacer) $spacer * 2;
scrollbar-width: thin;
&__header {
display: flex;
@@ -11,6 +13,9 @@
justify-content: space-between;
padding: pxToRem(15) pxToRem(20);
cursor: pointer;
.docs-menu__button svg {
transition: transform 0.2s;
}
&.active {
.docs-menu__button svg {
@@ -29,7 +34,7 @@
&__content {
display: none;
padding: $spacer * 1.5 $spacer * 2 pxToRem(12);
padding: pxToRem(12) $spacer * 1.5;
&.active {
display: block;
@@ -38,8 +43,7 @@
&__input {
position: relative;
margin-top: $spacer;
margin-bottom: $spacer * 2;
margin: $spacer * 2 0;
svg {
position: absolute;
@@ -49,20 +53,19 @@
}
button {
padding-left: $spacer * 2.8;
padding-left: $spacer * 2.5;
color: $neutral-70;
&:after {
content: '';
display: block;
width: 1rem;
height: 1rem;
margin-top: 1px;
width: $spacer;
height: $spacer;
position: absolute;
top: 50%;
left: $spacer;
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 {
&-title {
margin-bottom: 0;
padding: math.div($spacer, 2);
color: $neutral-98;
font-weight: bold;
font-size: pxToRem(18);
line-height: pxToRem(27);
margin: 0 0 $spacer;
padding-top: $spacer * 0.5;
font-size: $spacer;
line-height: $spacer * 1.5;
&:not(:nth-of-type(1)) {
margin-top: pxToRem(12);
padding-top: $spacer;
}
}
&-group {
padding-bottom: pxToRem(4);
&-heading {
display: block;
position: relative;
margin-bottom: $spacer * 0.5;
// hide native details marker
&::-webkit-details-marker {
display: none;
@@ -107,6 +111,9 @@
justify-content: space-between;
align-items: center;
color: $neutral-70;
font-size: pxToRem(14);
line-height: pxToRem(21);
font-weight: 400;
}
}
@@ -116,31 +123,53 @@
width: pxToRem(10);
height: pxToRem(10);
position: absolute;
top: pxToRem(7);
right: pxToRem(4);
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");
top: pxToRem(10);
right: $spacer;
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-position: center;
background-repeat: no-repeat;
transition: transform 0.3s;
}
&.active {
.docs-menu__links-group-heading > a {
padding: pxToRem(4) 0 pxToRem(4) $spacer;
border-left: pxToRem(1) solid $primary-50;
font-weight: 600;
background-color: $neutral-30;
color: $neutral-90;
border-radius: $spacer * 0.5;
}
summary:after {
top: pxToRem(11);
top: pxToRem(10);
}
}
&[open=''] {
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;
&-item {
margin-bottom: $spacer * 0.5;
list-style: none;
a {
@@ -159,6 +187,7 @@
align-items: center;
color: $neutral-70;
font-size: pxToRem(14);
font-weight: 400;
line-height: pxToRem(21);
}
@@ -172,9 +201,17 @@
}
@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;
margin: 0;
border-right: pxToRem(1) solid $neutral-20;
&__header {
display: none;
@@ -186,11 +223,20 @@
}
&__input {
margin-bottom: 0;
display: none;
}
&__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 {
@@ -249,7 +295,8 @@
}
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 {
@@ -261,7 +308,7 @@
&[open=''] {
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) {
background-color: $neutral-98;
border-right-color: $neutral-80;
&__links-group {
&.active {
.docs-menu__links-group-heading > a {
background-color: $neutral-94;
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 XL_BREAKPOINT = 1200;
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 { XL_BREAKPOINT } from './constants';
import TableOfContents from './table-of-content';
const themeSwitch = new ThemeSwitch();
@@ -15,10 +16,10 @@ document.addEventListener('DOMContentLoaded', () => {
sidebar.classList.toggle('active');
});
const moveSearchButton = function() {
const moveSearchButton = function () {
const checkIfFirstChildIsSearch = (element) => {
return element.children.length > 0 && element.children[0].classList.contains('docs-menu__input');
}
};
const isMobile = window.innerWidth <= XL_BREAKPOINT;
if (isMobile && !checkIfFirstChildIsSearch(docsMenu)) {
@@ -26,9 +27,14 @@ document.addEventListener('DOMContentLoaded', () => {
} else if (!isMobile && !checkIfFirstChildIsSearch(sidebar)) {
sidebar.before(searchbar);
}
}
};
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 { initGoToTopButton, getCookie } from './helpers';
import { loadSegment, createSegmentStoredPage } from './segment-helpers';
import TableOfContents from './table-of-content';
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
function addScrollStateToPage() {
if (!header) {
return;
}
header.style.minHeight = `${header.offsetHeight}px`;
body.classList.add('scrolled');
}
function removeScrollStateFromPage() {
if (!header) {
return;
}
header.style.minHeight = '';
body.classList.remove('scrolled');
}
@@ -95,4 +102,8 @@ document.addEventListener('DOMContentLoaded', function () {
});
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';
(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' });
}
@@ -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 { scrollIntoViewWithOffset } from '../helpers';
import { DOCS_HEADER_OFFSET } from '../constants';
const anchors = new AnchorJS();
anchors.options.placement = 'left';
@@ -8,19 +9,19 @@ anchors.options.class = 'text-decoration-none';
document.addEventListener('DOMContentLoaded', function (event) {
anchors.add('.qdrant-post__body :is(h1, h2, h3, h4, h5, h6)');
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:
let offset = 100;
let offset = DOCS_HEADER_OFFSET;
if (window.location.hash) {
scrollIntoViewWithOffset(window.location.hash.replace('#', ''), offset).catch((e) => {
console.error(e);
});
scrollIntoViewWithOffset(window.location.hash.replace('#', ''), offset);
}
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
let allLinks = document.querySelectorAll('a[href^="#"]');
allLinks.forEach((anchor) => {
const target = anchor.getAttribute('href');
anchor.addEventListener('click', function (e) {
e.preventDefault();
@@ -1,5 +1,11 @@
{{ define "main" }}
{{ partial "site-header" . }}
{{ partial "documentation" . }}
{{ end }}
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<main>
{{ partial "documentation/header" . }}
{{ partial "documentation/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -1,5 +1,11 @@
{{ define "main" }}
{{ partial "site-header" . }}
{{ partial "documentation" . }}
{{ end }}
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<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 }}" />
{{ 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" }}
<link href="{{ $pageSearchCss.RelPermalink }}" rel="stylesheet" integrity="{{ $pageSearchCss.Data.Integrity }}" />
{{ end }}
@@ -21,7 +21,7 @@
/>
{{ end }}
{{ if eq .Section "documentation" }}
{{ if in (slice "docs" "documentation") .Section }}
{{ $documentationCss := resources.Get "css/documentation.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
<link
href="{{ $documentationCss.RelPermalink }}"
@@ -35,7 +35,7 @@
<link href="{{ $benchmarksCss.RelPermalink }}" rel="stylesheet" integrity="{{ $benchmarksCss.Data.Integrity }}" />
{{ 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" }}
<link href="{{ $mainCss.RelPermalink }}" rel="stylesheet" integrity="{{ .Data.Integrity }}" crossorigin="anonymous" />
{{ 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>
@@ -1,32 +1,37 @@
{{ $currentNode := . }}
<div class="col-12 col-xl-2">
<div class="docs-menu">
<div id="sidebar-toggle" class="docs-menu__header">
<h2>Docs Menu</h2>
<button type="button" class="docs-menu__button">{{ partial "svg" "arrow-sm-down-white.svg" }}</button>
{{ $partition := .partition }}
{{ $currentNode := .context }}
<div class="docs-menu">
<div id="sidebar-toggle" class="docs-menu__header">
<h2>Docs Menu</h2>
<button type="button" class="docs-menu__button">{{ partial "svg" "arrow-sm-down-white.svg" }}</button>
</div>
<div id="sidebar" class="docs-menu__content">
<div class="docs-menu__input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
type="button"
name="search"
data-target="#searchModal"
>
Search
</button>
</div>
<div id="sidebar" class="docs-menu__content">
<div class="docs-menu__input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
type="button"
name="search"
data-target="#searchModal"
>
Search
</button>
</div>
{{ $subject := site.GetPage "documentation" }}
{{ $subject := site.GetPage "documentation" }}
<nav class="docs-menu__links">
{{ range $subject.Pages }}
<nav class="docs-menu__links">
{{ range $subject.Pages }}
{{ if and (eq .Params.partition $partition) (not .Params.hideInSidebar) }}
{{ if (eq .Params.type "delimiter") }}
<h3 class="docs-menu__links-title">{{ .Title }}</h3>
{{ else }}
{{ if and (.IsPage) (not .Params.hideInSidebar) }}
<div class="docs-menu__links-group {{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}">
<div
class="docs-menu__links-group {{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}
{{- if (eq .Params.type "external-link") }}external-link{{ end -}} "
>
<div class="docs-menu__links-group-heading">
<a
href="{{ if (eq .Params.type "external-link") }}
@@ -37,9 +42,6 @@
{{ if (eq .Params.type "external-link") }}target="_blank"{{ end }}
>
{{ .Title }}
{{ if (eq .Params.type "external-link") }}
{{ partial "svg" "external-link.svg" }}
{{ end }}
</a>
</div>
</div>
@@ -102,7 +104,7 @@
{{ end }}
{{ end }}
{{ end }}
</nav>
</div>
{{ end }}
</nav>
</div>
</div>

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