Updated Articles Pages (#1329)
* Updated Articles Pages * fixes * Links removed * Fixed url * light theme fix * toc fix * new article categories * categorize articles * fix article preview images * rename categories --------- Co-authored-by: trean <trean.mi@gmail.com> Co-authored-by: generall <andrey@vasnetsov.com>
@@ -5,4 +5,8 @@ description: Articles about vector search and similarity larning related topics.
|
||||
section_title: Check out our latest publications
|
||||
subtitle: Check out our latest publications
|
||||
img: /articles_data/title-img.png
|
||||
partition: learn
|
||||
learnButton: Learn More
|
||||
isMainPage: true
|
||||
toc_start_level: 2
|
||||
---
|
||||
|
||||
@@ -8,6 +8,7 @@ weight: -150
|
||||
author: Kacper Łukawski
|
||||
author_link: https://www.kacperlukawski.com
|
||||
date: 2024-11-22T00:00:00.000Z
|
||||
category: rag-and-genai
|
||||
---
|
||||
|
||||
Standard [Retrieval Augmented Generation](/articles/what-is-rag-in-ai/) follows a predictable, linear path: receive
|
||||
|
||||
@@ -13,6 +13,7 @@ tags:
|
||||
- Vector Database
|
||||
- Machine Learning
|
||||
- Information Retrieval
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
# How to Optimize Vector Search Using Batch Search in Qdrant 0.10.0
|
||||
|
||||
@@ -22,6 +22,7 @@ tags:
|
||||
weight: -130
|
||||
|
||||
aliases: [ /blog/binary-quantization-openai/ ]
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
OpenAI Ada-003 embeddings are a powerful tool for natural language processing (NLP). However, the size of the embeddings are a challenge, especially with real-time search and retrieval. In this article, we explore how you can use Qdrant's Binary Quantization to enhance the performance and efficiency of OpenAI embeddings.
|
||||
@@ -217,4 +218,4 @@ Binary quantization is exceptional if you need to work with large volumes of dat
|
||||
|
||||
The article gives examples of data sets and configuration you can use to get going. Our documentation covers [adding large datasets to Qdrant](/documentation/tutorials/bulk-upload/) to your Qdrant instance as well as [more quantization methods](/documentation/guides/quantization/).
|
||||
|
||||
Want to discuss these findings and learn more about Binary Quantization? [Join our Discord community.](https://discord.gg/qdrant)
|
||||
Want to discuss these findings and learn more about Binary Quantization? [Join our Discord community.](https://discord.gg/qdrant)
|
||||
|
||||
@@ -14,6 +14,7 @@ keywords:
|
||||
- vector search
|
||||
- binary quantization
|
||||
- memory optimization
|
||||
category: qdrant-internals
|
||||
---
|
||||
|
||||
# Optimizing High-Dimensional Vectors with Binary Quantization
|
||||
|
||||
@@ -12,6 +12,7 @@ keywords:
|
||||
- hybrid search
|
||||
- sparse embeddings
|
||||
- bm25
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
<aside role="status">
|
||||
|
||||
@@ -11,6 +11,7 @@ author_link: https://medium.com/@yusufsarigoz
|
||||
date: 2022-06-28T13:00:00+03:00
|
||||
draft: false
|
||||
# aliases: [ /articles/cars-recognition/ ]
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
Supervised classification is one of the most widely used training objectives in machine learning,
|
||||
|
||||
@@ -16,6 +16,7 @@ keywords:
|
||||
- chatgpt plugin
|
||||
- knowledge base
|
||||
- similarity search
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
In recent months, ChatGPT has revolutionised the way we communicate, learn, and interact
|
||||
|
||||
@@ -15,6 +15,7 @@ keywords:
|
||||
- reranking
|
||||
- fastembed
|
||||
- qsoc'24
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Data Exploration
|
||||
description: Learn how you can leverage vector similarity beyond just search. Reveal hidden patterns and insights in your data, provide recommendations, and navigate data space.
|
||||
category: data-exploration
|
||||
url: /articles/data-exploration/
|
||||
isCategoryPage: true
|
||||
weight: 30
|
||||
---
|
||||
@@ -15,6 +15,7 @@ keywords: # Keywords for SEO
|
||||
- Secure AI Data Management
|
||||
- Qdrant Data Security
|
||||
- Enterprise Data Compliance
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
Data stored in vector databases is often proprietary to the enterprise and may include sensitive information like customer records, legal contracts, electronic health records (EHR), financial data, and intellectual property. Moreover, strong security measures become critical to safeguarding this data. If the data stored in a vector database is not secured, it may open a vulnerability known as "[embedding inversion attack](https://arxiv.org/abs/2004.00053)," where malicious actors could potentially [reconstruct the original data from the embeddings](https://arxiv.org/pdf/2305.03010) themselves.
|
||||
|
||||
@@ -9,6 +9,7 @@ weight: 8
|
||||
author: George Panchuk
|
||||
author_link: https://medium.com/@george.panchuk
|
||||
date: 2022-07-18T10:18:00.000Z
|
||||
category: data-exploration
|
||||
# aliases: [ /articles/dataset-quality/ ]
|
||||
---
|
||||
Nowadays, people create a huge number of applications of various types and solve problems in different areas.
|
||||
|
||||
@@ -15,6 +15,7 @@ keywords:
|
||||
- vector search
|
||||
- best practices
|
||||
- anti-patterns
|
||||
category: qdrant-internals
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ author: Yusuf Sarıgöz
|
||||
author_link: https://medium.com/@yusufsarigoz
|
||||
date: 2022-05-04T13:00:00+03:00
|
||||
draft: false
|
||||
category: machine-learning
|
||||
# aliases: [ /articles/detecting-coffee-anomalies/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -11,13 +11,13 @@ author_link: https://www.linkedin.com/in/j16n/
|
||||
date: 2024-08-31T10:39:48.312Z
|
||||
draft: false
|
||||
keywords:
|
||||
|
||||
- dimension reduction
|
||||
- web assembly
|
||||
- qsoc'24
|
||||
- vector similarity
|
||||
- tsne
|
||||
- qdrant data visualization
|
||||
category: ecosystem
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ keywords:
|
||||
- multimodal
|
||||
- state-of-the-art
|
||||
- vector-search
|
||||
category: data-exploration
|
||||
---
|
||||
|
||||
# Discovery needs context
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Ecosystem
|
||||
description: Tools, libraries and integrations around Qdrant vector search engine.
|
||||
category: ecosystem
|
||||
url: /articles/ecosystem/
|
||||
isCategoryPage: true
|
||||
weight:
|
||||
---
|
||||
@@ -11,6 +11,7 @@ author_link: https://medium.com/@yusufsarigoz
|
||||
date: 2022-08-23T13:00:00+03:00
|
||||
draft: false
|
||||
aliases: [ /articles/embedding-recycler/ ]
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
A recent [paper](https://arxiv.org/abs/2207.04993)
|
||||
|
||||
@@ -9,6 +9,7 @@ weight: 9
|
||||
author: George Panchuk
|
||||
author_link: https://medium.com/@george.panchuk
|
||||
date: 2022-06-28T08:57:07.604Z
|
||||
category: practicle-examples
|
||||
# aliases: [ /articles/faq-question-answering/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ keywords:
|
||||
- embeddings
|
||||
- ONNX Runtime
|
||||
- quantized embedding model
|
||||
category: ecosystem
|
||||
---
|
||||
|
||||
Data Science and Machine Learning practitioners often find themselves navigating through a labyrinth of models, libraries, and frameworks. Which model to choose, what embedding size, and how to approach tokenizing, are just some questions you are faced with when starting your work. We understood how many data scientists wanted an easier and more intuitive means to do their embedding work. This is why we built FastEmbed, a Python library engineered for speed, efficiency, and usability. We have created easy to use default workflows, handling the 80% use cases in NLP embedding.
|
||||
|
||||
@@ -10,6 +10,7 @@ weight: 60
|
||||
date: 2019-11-24T22:44:08+03:00
|
||||
author: Andrei Vasnetsov
|
||||
author_link: https://blog.vasnetsov.com/
|
||||
category: qdrant-internals
|
||||
# aliases: [ /articles/filtrable-hnsw/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ weight: -30
|
||||
author: Kacper Łukawski
|
||||
author_link: https://medium.com/@lukawskikacper
|
||||
date: 2023-09-05T11:32:00.000Z
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
Not every search journey begins with a specific destination in mind. Sometimes, you just want to explore and see what’s out there and what you might like.
|
||||
|
||||
@@ -10,12 +10,12 @@ author: Zein Wen
|
||||
author_link: https://www.linkedin.com/in/zishenwen/
|
||||
date: 2023-10-12T08:00:00+03:00
|
||||
draft: false
|
||||
keywords:
|
||||
|
||||
keywords:
|
||||
- payload filtering
|
||||
- geo polygon
|
||||
- search condition
|
||||
- gsoc'23
|
||||
- gsoc'23
|
||||
category: qdrant-internals
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ weight: -150
|
||||
author: Kacper Łukawski
|
||||
author_link: https://kacperlukawski.com
|
||||
date: 2024-07-25T00:00:00.000Z
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
It's been over a year since we published the original article on how to build a hybrid
|
||||
|
||||
@@ -14,6 +14,7 @@ keywords:
|
||||
- immutable data structures
|
||||
- perfect hashing
|
||||
- defragmentation
|
||||
category: qdrant-internals
|
||||
---
|
||||
|
||||
## Data Structures 101
|
||||
|
||||
@@ -15,6 +15,7 @@ keywords:
|
||||
- linux
|
||||
- optimization
|
||||
aliases: [ /articles/io-uring/ ]
|
||||
category: qdrant-internals
|
||||
---
|
||||
|
||||
With Qdrant [version 1.3.0](https://github.com/qdrant/qdrant/releases/tag/v1.3.0) we
|
||||
|
||||
@@ -18,6 +18,7 @@ keywords:
|
||||
- question answering
|
||||
- openai
|
||||
- embeddings
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
# Streamlining Question Answering: Simplifying Integration with LangChain and Qdrant
|
||||
|
||||
@@ -8,6 +8,7 @@ weight: -160
|
||||
author: Kacper Łukawski
|
||||
author_link: https://kacperlukawski.com
|
||||
date: 2024-08-14T00:00:00.000Z
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
\* At least any open-source model, since you need access to its internals.
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Machine Learning
|
||||
description: Explore Machine Learning principles and practices which make modern semantic similarity search possible. Apply Qdrant and vector search capabilities to your ML projects.
|
||||
category: machine-learning
|
||||
url: /articles/machine-learning/
|
||||
isCategoryPage: true
|
||||
weight: 40
|
||||
---
|
||||
@@ -9,6 +9,7 @@ weight: 7
|
||||
author: Andrei Vasnetsov
|
||||
author_link: https://blog.vasnetsov.com/
|
||||
date: 2022-12-07T10:18:00.000Z
|
||||
category: qdrant-internals
|
||||
# aliases: [ /articles/memory-consumption/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ weight: 20
|
||||
author: Andrei Vasnetsov
|
||||
author_link: https://blog.vasnetsov.com/
|
||||
date: 2021-05-15T10:18:00.000Z
|
||||
category: machine-learning
|
||||
# aliases: [ /articles/metric-learning-tips/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ tags:
|
||||
- sparse retrieval
|
||||
- splade
|
||||
- bm25
|
||||
category: machine-learning
|
||||
---
|
||||
|
||||
Finding enough time to study all the modern solutions while keeping your production running is rarely feasible.
|
||||
|
||||
@@ -14,6 +14,7 @@ keywords:
|
||||
- custom sharding
|
||||
- multiple partitions
|
||||
- vector database
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
# Scaling Your Machine Learning Setup: The Power of Multitenancy and Custom Sharding in Qdrant
|
||||
|
||||
@@ -10,6 +10,7 @@ weight: 50
|
||||
author: Andrey Vasnetsov
|
||||
author_link: https://blog.vasnetsov.com/
|
||||
date: 2021-06-10T10:18:00.000Z
|
||||
category: vector-search-manuals
|
||||
# aliases: [ /articles/neural-search-tutorial/ ]
|
||||
---
|
||||
# Neural Search 101: A Comprehensive Guide and Step-by-Step Tutorial
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Practical Examples
|
||||
description: Building blocks and reference implementations to help you get started with Qdrant. Learn how to use Qdrant to solve real-world problems and build the next generation of AI applications.
|
||||
category: practicle-examples
|
||||
url: /articles/practicle-examples/
|
||||
isCategoryPage: true
|
||||
weight: 60
|
||||
---
|
||||
@@ -14,6 +14,7 @@ keywords:
|
||||
- vector search
|
||||
- product quantization
|
||||
- memory optimization
|
||||
category: qdrant-internals
|
||||
aliases: [ /articles/product_quantization/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ keywords:
|
||||
- cohere
|
||||
- co.embed
|
||||
- embeddings
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
Bi-encoders are probably the most efficient way of setting up a semantic Question Answering system.
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Qdrant Internals
|
||||
description: Take a look under the hood of Qdrant’s high-performance vector search engine. Explore the architecture, components, and design principles the Qdrant Vector Search Engine is built on.
|
||||
category: qdrant-internals
|
||||
url: /articles/qdrant-internals/
|
||||
isCategoryPage: true
|
||||
weight: 20
|
||||
---
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: RAG & GenAI
|
||||
description: Leverage Qdrant for Retrieval-Augmented Generation (RAG) and build AI Agents
|
||||
category: rag-and-genai
|
||||
url: /articles/rag-and-genai/
|
||||
isCategoryPage: true
|
||||
weight: 50
|
||||
---
|
||||
@@ -15,6 +15,7 @@ keywords:
|
||||
- vector search
|
||||
- retrieval augmented generation
|
||||
- gemini 1.5
|
||||
category: rag-and-genai
|
||||
---
|
||||
|
||||
# Is RAG Dead? The Role of Vector Databases in AI Efficiency and Vector Search
|
||||
|
||||
@@ -17,6 +17,7 @@ keywords:
|
||||
- quotient
|
||||
- optimization
|
||||
- rag
|
||||
category: rag-and-genai
|
||||
---
|
||||
|
||||
In today's fast-paced, information-rich world, AI is revolutionizing knowledge management. The systematic process of capturing, distributing, and effectively using knowledge within an organization is one of the fields in which AI provides exceptional value today.
|
||||
|
||||
@@ -14,6 +14,7 @@ keywords:
|
||||
- vector search
|
||||
- scalar quantization
|
||||
- memory optimization
|
||||
category: qdrant-internals
|
||||
---
|
||||
# Efficiency Unleashed: The Power of Scalar Quantization
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ author_link: https://llogiq.github.io
|
||||
date: 2023-08-14T00:00:00+01:00
|
||||
draft: false
|
||||
keywords: search, semantic, vector, llm, integration, benchmark, recommend, performance, rust
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
Qdrant is one of the fastest vector search engines out there, so while looking for a demo to show off, we came upon the idea to do a search-as-you-type box with a fully semantic search backend. Now we already have a semantic/keyword hybrid search on our website. But that one is written in Python, which incurs some overhead for the interpreter. Naturally, I wanted to see how fast I could go using Rust.
|
||||
|
||||
@@ -18,6 +18,7 @@ tags:
|
||||
- AI applications
|
||||
- data retrieval
|
||||
- efficient data storage
|
||||
category: rag-and-genai
|
||||
---
|
||||
|
||||
## What is Semantic Cache?
|
||||
|
||||
@@ -11,6 +11,7 @@ author_link: https://llogiq.github.io
|
||||
date: 2023-07-12T10:00:00+01:00
|
||||
draft: false
|
||||
keywords: rust, serverless, lambda, semantic, search
|
||||
category: practicle-examples
|
||||
---
|
||||
|
||||
Do you want to insert a semantic search function into your website or online app? Now you can do so - without spending any money! In this example, you will learn how to create a free prototype search engine for your own non-commercial purposes.
|
||||
|
||||
@@ -15,6 +15,7 @@ keywords:
|
||||
- SPLADE
|
||||
- hybrid search
|
||||
- vector search
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
Think of a library with a vast index card system. Each index card only has a few keywords marked out (sparse vector) of a large possible set for each book (document). This is what sparse vectors enable for text.
|
||||
|
||||
@@ -14,6 +14,7 @@ tags:
|
||||
- Database
|
||||
- Search
|
||||
- Similarity Search
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
# How to Optimize Vector Storage by Storing Multiple Vectors Per Object
|
||||
|
||||
@@ -9,6 +9,7 @@ weight: 30
|
||||
author: Yusuf Sarıgöz
|
||||
author_link: https://medium.com/@yusufsarigoz
|
||||
date: 2022-03-24T15:12:00+03:00
|
||||
category: machine-learning
|
||||
# aliases: [ /articles/triplet-loss/ ]
|
||||
---
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ weight: -200
|
||||
author: Sabrina Aquino, David Myriel
|
||||
author_link:
|
||||
date: 2024-09-10T00:00:00.000Z
|
||||
category: vector-search-manuals
|
||||
---
|
||||
Imagine you sell computer hardware. To help shoppers easily find products on your website, you need to have a **user-friendly [search engine](https://qdrant.tech)**.
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Vector Search Manuals
|
||||
description: Take full control of your vector data with Qdrant. Learn how to easily store, organize, and optimize vectors for high-performance similarity search.
|
||||
category: vector-search-manuals
|
||||
url: /articles/vector-search-manuals/
|
||||
isCategoryPage: true
|
||||
weight: 10
|
||||
---
|
||||
@@ -17,6 +17,7 @@ keywords:
|
||||
- discovery
|
||||
- diversity
|
||||
- recommendation
|
||||
category: data-exploration
|
||||
---
|
||||
|
||||
# Vector Similarity: Unleashing Data Insights Beyond Traditional Search
|
||||
|
||||
@@ -11,13 +11,13 @@ author_link: https://kartik-gupta-ij.vercel.app/
|
||||
date: 2023-08-28T08:00:00+03:00
|
||||
draft: false
|
||||
keywords:
|
||||
|
||||
- vector reduction
|
||||
- console
|
||||
- gsoc'23
|
||||
- vector similarity
|
||||
- exploration
|
||||
- recommendation
|
||||
category: ecosystem
|
||||
---
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ tags:
|
||||
- embeddings
|
||||
- machine-learning
|
||||
- artificial intelligence
|
||||
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
> **Embeddings** are numerical machine learning representations of the semantic of the input data. They capture the meaning of complex, high-dimensional data, like text, images, or audio, into vectors. Enabling algorithms to process and analyze the data more efficiently.
|
||||
|
||||
@@ -15,6 +15,7 @@ tags:
|
||||
- vector-search
|
||||
- vector-database
|
||||
- embeddings
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
## What Is a Vector Database?
|
||||
|
||||
@@ -17,7 +17,7 @@ tags:
|
||||
- product quantization
|
||||
- scalar quantization
|
||||
- vector compression
|
||||
|
||||
category: vector-search-manuals
|
||||
---
|
||||
|
||||
Vector quantization is a data compression technique used to reduce the size of high-dimensional data. Compressing vectors reduces memory usage while maintaining nearly all of the essential information. This method allows for more efficient storage and faster search operations, particularly in large datasets.
|
||||
|
||||
@@ -18,8 +18,7 @@ tags:
|
||||
- embeddings
|
||||
- llm rag
|
||||
- rag application
|
||||
|
||||
|
||||
category: rag-and-genai
|
||||
---
|
||||
|
||||
> Retrieval-augmented generation (RAG) integrates external information retrieval into the process of generating responses by Large Language Models (LLMs). It searches a database for information beyond its pre-trained knowledge base, significantly improving the accuracy and relevance of the generated responses.
|
||||
|
||||
@@ -96,4 +96,4 @@ Qdrant is an AI-native vector database and a semantic search engine. You can use
|
||||
|
||||
| [A Complete Guide to Filtering in Vector Search](/articles/vector-search-filtering/) </br> Beginner & advanced examples showing how to improve precision in vector search.| [Building Hybrid Search with Query API](/articles/hybrid-search/) </br> Build a pure vector-based hybrid search system with our new fusion feature.|
|
||||
|----------------------------------------------|-------------------------------|
|
||||
| [Multitenancy and Sharding: Best Practices](/articles/multitenancy/) </br> Combine two powerful features for complete data isolation and scaling.| [Benefits of Binary Quantization in Vector Search](/articles/binary-quantization/) </br> Compress data points while retaining essential meaning for extreme search performance.|
|
||||
| [Multitenancy and Sharding: Best Practices](/articles/multitenancy/) </br> Combine two powerful features for complete data isolation and scaling.| [Benefits of Binary Quantization in Vector Search](/articles/binary-quantization/) </br> Compress data points while retaining essential meaning for extreme search performance.|
|
||||
|
||||
@@ -16,9 +16,9 @@ menuItems:
|
||||
- id: menu-2
|
||||
name: Build
|
||||
url: /documentation/build/
|
||||
# - id: menu-3
|
||||
# name: Learn
|
||||
# url: /documentation/learn/
|
||||
- id: menu-3
|
||||
name: Learn
|
||||
url: /articles/
|
||||
- id: menu-4
|
||||
name: API Reference
|
||||
url: https://api.qdrant.tech/api-reference
|
||||
|
||||
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 261 KiB After Width: | Height: | Size: 208 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 337 KiB After Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 158 KiB |
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 130 KiB |
@@ -1,31 +1,134 @@
|
||||
@use '../../helpers/functions' as *;
|
||||
@use 'sass:math';
|
||||
|
||||
.dev-portal-articles-posts {
|
||||
.docs-articles {
|
||||
&__title {
|
||||
margin-bottom: math.div($spacer, 2);
|
||||
font-size: $spacer * 1.5;
|
||||
line-height: $spacer * 2;
|
||||
color: $neutral-98;
|
||||
}
|
||||
|
||||
&__description {
|
||||
margin-bottom: 0;
|
||||
color: $neutral-70;
|
||||
}
|
||||
|
||||
&__blocks {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: $spacer * 5;
|
||||
padding-bottom: $spacer * 3;
|
||||
}
|
||||
|
||||
&__block {
|
||||
&-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: $spacer * 1.5;
|
||||
}
|
||||
|
||||
&-link {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__list {
|
||||
padding-bottom: $spacer * 3;
|
||||
}
|
||||
|
||||
&__posts {
|
||||
margin-top: $spacer * 2;
|
||||
}
|
||||
|
||||
&__pagination {
|
||||
padding-top: $spacer * 5;
|
||||
}
|
||||
|
||||
.post {
|
||||
&-preview {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
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 {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
gap: $spacer * 0.5;
|
||||
font-size: pxToRem(14);
|
||||
line-height: pxToRem(21);
|
||||
color: $neutral-50;
|
||||
}
|
||||
[data-theme="light"] & {
|
||||
&-about {
|
||||
color: $neutral-30;
|
||||
}
|
||||
&-title {
|
||||
color: $neutral-30;
|
||||
}
|
||||
&-description {
|
||||
color: $neutral-50;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.post-sm {
|
||||
.post-title {
|
||||
font-size: pxToRem(18);
|
||||
line-height: pxToRem(27);
|
||||
}
|
||||
|
||||
.post-description {
|
||||
font-size: pxToRem(14);
|
||||
line-height: pxToRem(21);
|
||||
}
|
||||
}
|
||||
|
||||
.post-md {
|
||||
.post-title {
|
||||
font-size: pxToRem(20);
|
||||
line-height: pxToRem(30);
|
||||
}
|
||||
|
||||
.post-description {
|
||||
font-size: $spacer;
|
||||
line-height: $spacer * 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(xl) {
|
||||
&__block {
|
||||
&-header {
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: flex-end;
|
||||
gap: $spacer * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[data-theme="light"] & {
|
||||
&__title {
|
||||
color: $neutral-30;
|
||||
}
|
||||
&__description {
|
||||
color: $neutral-50;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,59 @@
|
||||
padding-bottom: $spacer * 1.5;
|
||||
font-weight: 400;
|
||||
|
||||
&__header {
|
||||
margin-bottom: $spacer * 2;
|
||||
|
||||
.documentation-article__header-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: $spacer * 0.5;
|
||||
margin-bottom: $spacer;
|
||||
padding: $spacer * 0.5 0;
|
||||
color: $neutral-70;
|
||||
&:hover {
|
||||
color: $neutral-90;
|
||||
svg path {
|
||||
stroke: $neutral-90;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.documentation-article__header-title {
|
||||
margin-bottom: $spacer;
|
||||
padding-top: 0;
|
||||
font-size: $spacer * 2;
|
||||
line-height: pxToRem(38);
|
||||
color: $neutral-98;
|
||||
}
|
||||
|
||||
.documentation-article__header-about {
|
||||
margin-bottom: $spacer * 2;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
gap: $spacer * 0.5;
|
||||
font-size: pxToRem(14);
|
||||
line-height: pxToRem(21);
|
||||
color: $neutral-90;
|
||||
|
||||
p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.documentation-article__header-preview {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: $spacer * 2;
|
||||
line-height: pxToRem(38);
|
||||
@@ -60,6 +113,13 @@
|
||||
|
||||
@include media-breakpoint-up(xl) {
|
||||
width: 100%;
|
||||
|
||||
&__header {
|
||||
.documentation-article__header-title {
|
||||
font-size: $spacer * 2.5;
|
||||
line-height: pxToRem(50);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,5 +144,20 @@
|
||||
@extend .table-light;
|
||||
}
|
||||
}
|
||||
&__header-link {
|
||||
color: $neutral-50;
|
||||
svg path {
|
||||
stroke: $neutral-50;
|
||||
}
|
||||
&:hover {
|
||||
color: $neutral-30;
|
||||
svg path {
|
||||
stroke: $neutral-30;
|
||||
}
|
||||
}
|
||||
}
|
||||
&__header-about {
|
||||
color: $neutral-50;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,6 +200,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
&__articles-link {
|
||||
&.active {
|
||||
background-color: $neutral-20;
|
||||
border-radius: $spacer * 0.5;
|
||||
|
||||
a {
|
||||
color: $neutral-98;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(xl) {
|
||||
height: calc(100vh - 80px);
|
||||
width: pxToRem(256);
|
||||
@@ -364,5 +375,16 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
&__articles-link {
|
||||
&.active {
|
||||
background-color: $neutral-90;
|
||||
border-radius: $spacer * 0.5;
|
||||
|
||||
a {
|
||||
color: $neutral-30;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,10 @@ import 'qdrant-page-search/dist/js/search.min.js';
|
||||
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'documentation' });
|
||||
}
|
||||
|
||||
if (/articles/.test(window.location?.pathname)) {
|
||||
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'articles' });
|
||||
}
|
||||
|
||||
if (/blog/.test(window.location?.pathname)) {
|
||||
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'blog' });
|
||||
}
|
||||
|
||||
@@ -4,14 +4,11 @@ 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`,
|
||||
),
|
||||
document.querySelectorAll(`${contentSelector} h1[id], ${contentSelector} h2[id], ${contentSelector} h3[id]`),
|
||||
);
|
||||
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();
|
||||
@@ -46,7 +43,6 @@ class TableOfContents {
|
||||
// Setup Intersection Observer
|
||||
setupObserver() {
|
||||
const observerCallback = (entries) => {
|
||||
|
||||
entries.forEach((entry) => {
|
||||
const entryIndex = this.headings.indexOf(entry.target);
|
||||
const isIntersecting = entry.isIntersecting;
|
||||
@@ -57,7 +53,7 @@ class TableOfContents {
|
||||
this.currentlyVisibleHeaderIds.delete(entryIndex);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
if (this.currentlyVisibleHeaderIds.size !== 0) {
|
||||
let minimalVisibleHeaderId = Math.min(...Array.from(this.currentlyVisibleHeaderIds));
|
||||
this.setActiveLink(minimalVisibleHeaderId);
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
{{ define "main" }}
|
||||
{{ partial "site-header" . }}
|
||||
{{ partial "qdrant-articles-hero" . }}
|
||||
|
||||
{{ partial "qdrant-articles-posts" . }}
|
||||
|
||||
{{ with (.Site.GetPage "/headless/get-started-blogs") }}
|
||||
{{ partial "get-started-small" (dict "context" . "class" "get-started-blogs") }}
|
||||
{{ end }}
|
||||
|
||||
{{ partial "newsletter" . }}
|
||||
{{ 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,9 +1,11 @@
|
||||
{{ define "main" }}
|
||||
{{ partial "site-header" . }}
|
||||
|
||||
{{ partial "qdrant-post" (dict "context" . "variant" "centered") }}
|
||||
|
||||
{{ with (.Site.GetPage "/headless/get-started-blogs") }}
|
||||
{{ partial "get-started-small" (dict "context" . "class" "get-started-blogs") }}
|
||||
{{ end }}
|
||||
{{ 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" "docs" "documentation") .Section }}
|
||||
{{ if in (slice "blog" "docs" "documentation" "articles") .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 in (slice "docs" "documentation") .Section }}
|
||||
{{ if in (slice "docs" "documentation" "articles") .Section }}
|
||||
{{ $documentationCss := resources.Get "css/documentation.scss" | toCSS $opts | minify | resources.Fingerprint "sha512" }}
|
||||
<link
|
||||
href="{{ $documentationCss.RelPermalink }}"
|
||||
|
||||
@@ -10,25 +10,172 @@
|
||||
<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" . }}
|
||||
{{ if eq .Section "documentation" }}
|
||||
{{ if .Params.content }}
|
||||
<div class="documentation__article-wrapper">
|
||||
<div class="docs-core documentation-article">
|
||||
{{ partial "documentation/custom-content.html" . }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ else }}
|
||||
{{ else }}
|
||||
|
||||
<div class="documentation__article-wrapper">
|
||||
{{ if not (eq .Params.breadcrumb false) }}
|
||||
<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 }}
|
||||
{{ end }}
|
||||
|
||||
{{ if eq .Section "articles" }}
|
||||
{{ $subject := site.GetPage "articles" }}
|
||||
{{ $currentNode := .Params }}
|
||||
|
||||
{{ if .Params.isMainPage }}
|
||||
<div class="docs-articles docs-articles__blocks">
|
||||
{{ range $subject.Pages }}
|
||||
{{ if .Params.isCategoryPage }}
|
||||
<div class="docs-articles__block">
|
||||
<div class="docs-articles__block-header">
|
||||
<div>
|
||||
<h4 class="docs-articles__title">{{ .Params.title }}</h4>
|
||||
<p class="docs-articles__description">{{ .Params.description }}</p>
|
||||
</div>
|
||||
<a href="{{ .Params.url }}" class="docs-articles__block-link button button_outlined button_sm">
|
||||
{{ $currentNode.learnButton }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{{ $category := .Params.category }}
|
||||
|
||||
<div class="docs-articles__posts">
|
||||
<div class="row gy-4">
|
||||
{{ $list := first 0 site.Pages }}
|
||||
|
||||
{{ range $subject.Pages }}
|
||||
{{ if and (eq .Params.category $category) (not .Params.isCategoryPage) }}
|
||||
{{ $list = $list | append . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $all := $list.ByPublishDate.Reverse }}
|
||||
{{ range first 3 $all }}
|
||||
<article class="col-12 col-lg-4 post post-sm">
|
||||
<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>·</span>
|
||||
<p>{{ time.Format "January 02, 2006" .Date }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</article>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
{{ else if .Params.isCategoryPage }}
|
||||
<div class="docs-articles docs-articles__list">
|
||||
{{ partial "documentation/breadcrumbs" . }}
|
||||
{{ end }}
|
||||
|
||||
<article class="documentation-article">
|
||||
{{ partial "article-content.html" . }}
|
||||
</article>
|
||||
{{ partial "documentation/feedback.html" . }}
|
||||
</div>
|
||||
{{ partial "table-of-contents" . }}
|
||||
<h4 class="docs-articles__title">{{ .Params.title }}</h4>
|
||||
<p class="docs-articles__description">{{ .Params.description }}</p>
|
||||
|
||||
{{ $category := .Params.category }}
|
||||
|
||||
<div class="docs-articles__posts">
|
||||
<div class="row gx-4 gy-5">
|
||||
{{ $list := first 0 site.Pages }}
|
||||
{{ range $subject.Pages }}
|
||||
{{ if and (eq .Params.category $category) (not .Params.isCategoryPage) }}
|
||||
{{ $list = $list | append . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ $all := $list.ByPublishDate.Reverse }}
|
||||
{{ $paginator := .Paginate $all 14 }}
|
||||
|
||||
{{ range $paginator.Pages }}
|
||||
<article class="col-12 col-lg-6 post post-md">
|
||||
<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>·</span>
|
||||
<p>{{ time.Format "January 02, 2006" .Date }}</p>
|
||||
</div>
|
||||
</a>
|
||||
</article>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="docs-articles__pagination col-12">
|
||||
{{ if gt $paginator.TotalPages 1 }}
|
||||
{{ partial "pagination" $paginator }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ else }}
|
||||
<div class="documentation__article-wrapper">
|
||||
{{ partial "documentation/breadcrumbs" . }}
|
||||
|
||||
<article class="documentation-article">
|
||||
<div class="documentation-article__header">
|
||||
{{ $firstUrlElement := index (split .RelPermalink "/") 1 }}
|
||||
{{ $url := path.Join $firstUrlElement .Params.category }}
|
||||
|
||||
<a href="/{{ $url }}/" class="documentation-article__header-link">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.6668 8.00004H1.3335M1.3335 8.00004L6.00016 12.6667M1.3335 8.00004L6.00016 3.33337" stroke="#8F98B3" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
{{ with (.Site.GetPage $url) }}
|
||||
Back to {{ .Params.Title }}
|
||||
{{ end }}
|
||||
</a>
|
||||
<h1 class="documentation-article__header-title">{{ .Params.title }}</h1>
|
||||
<div class="documentation-article__header-about">
|
||||
<p>{{ .Params.author }}</p>
|
||||
<span>·</span>
|
||||
<p>{{ time.Format "January 02, 2006" .Date }}</p>
|
||||
</div>
|
||||
{{ if .Params.preview_dir }}
|
||||
<picture class="documentation-article__header-preview">
|
||||
<source srcset="{{ .Params.preview_dir }}/title.webp" type="image/webp" />
|
||||
<img alt="{{ .Title }}" src="{{ .Params.preview_dir }}/title.jpg" />
|
||||
</picture>
|
||||
{{ else }}
|
||||
<picture class="documentation-article__preview">
|
||||
{{ partial "preview-image" (dict "context" . "default_file_name" "title.jpg" "preview_file" .Params.title_preview_image) }}
|
||||
</picture>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
{{ partial "article-content.html" . }}
|
||||
</article>
|
||||
{{ partial "documentation/feedback.html" . }}
|
||||
</div>
|
||||
{{ partial "table-of-contents" . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ partial "documentation/footer.html" . }}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<a
|
||||
class="menu-link {{- if eq (lower .name) $partition }}active{{- end -}}"
|
||||
href="{{ .url }}"
|
||||
{{ if (eq $index 3) }}target="_blank"{{ end }}
|
||||
{{ if (eq $index 4) }}target="_blank"{{ end }}
|
||||
>
|
||||
{{ .name }}
|
||||
</a>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{{ $partition := .partition }}
|
||||
{{ $section := .Section }}
|
||||
|
||||
{{ $currentNode := .context }}
|
||||
<div class="docs-menu">
|
||||
@@ -18,93 +19,115 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{{ $subject := site.GetPage "documentation" }}
|
||||
{{ if eq $currentNode.Section "documentation" }}
|
||||
{{ $subject := site.GetPage "documentation" }}
|
||||
|
||||
|
||||
<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 }}
|
||||
{{- if (eq .Params.type "external-link") }}external-link{{ end -}} "
|
||||
>
|
||||
<div class="docs-menu__links-group-heading">
|
||||
<a
|
||||
href="{{ if (eq .Params.type "external-link") }}
|
||||
{{ .Params.external_url }}
|
||||
{{ else }}
|
||||
{{ .Permalink }}
|
||||
{{ end }}"
|
||||
{{ if (eq .Params.type "external-link") }}target="_blank"{{ end }}
|
||||
>
|
||||
{{ .Title }}
|
||||
</a>
|
||||
<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 }}
|
||||
{{- if (eq .Params.type "external-link") }}external-link{{ end -}} "
|
||||
>
|
||||
<div class="docs-menu__links-group-heading">
|
||||
<a
|
||||
href="{{ if (eq .Params.type "external-link") }}
|
||||
{{ .Params.external_url }}
|
||||
{{ else }}
|
||||
{{ .Permalink }}
|
||||
{{ end }}"
|
||||
{{ if (eq .Params.type "external-link") }}target="_blank"{{ end }}
|
||||
>
|
||||
{{ .Title }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if and (.IsSection) (not .Params.hideInSidebar) }}
|
||||
{{ if and (.IsSection) (not .Params.hideInSidebar) }}
|
||||
|
||||
<!-- current page is active or any sub-page is active -->
|
||||
{{ $isActive := false }}
|
||||
{{ range .RegularPages }}
|
||||
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
|
||||
{{ $isActive = true }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
<!-- current page is active or any sub-page is active -->
|
||||
{{ $isActive := false }}
|
||||
{{ range .RegularPages }}
|
||||
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
|
||||
{{ $isActive = true }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
|
||||
{{ $isActive = true }}
|
||||
{{ end }}
|
||||
{{ $sectionLink := .Permalink }}
|
||||
|
||||
{{ $sectionLink := .Permalink }}
|
||||
|
||||
{{ if .Params.is_empty }}
|
||||
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
|
||||
{{ end }}
|
||||
{{ if .Params.is_empty }}
|
||||
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
|
||||
{{ end }}
|
||||
|
||||
|
||||
<details
|
||||
class="docs-menu__links-group link-group {{ if $isActive }}active{{ end }}"
|
||||
{{ if $isActive }}open{{ end }}
|
||||
>
|
||||
<summary class="docs-menu__links-group-heading">
|
||||
<a href="{{ $sectionLink }}">
|
||||
{{ .Title }}
|
||||
</a>
|
||||
</summary>
|
||||
<details
|
||||
class="docs-menu__links-group link-group {{ if $isActive }}active{{ end }}"
|
||||
{{ if $isActive }}open{{ end }}
|
||||
>
|
||||
<summary class="docs-menu__links-group-heading">
|
||||
<a href="{{ $sectionLink }}">
|
||||
{{ .Title }}
|
||||
</a>
|
||||
</summary>
|
||||
|
||||
<nav>
|
||||
<ul class="docs-menu__links-submenu">
|
||||
{{ range .RegularPages }}
|
||||
{{ if (eq .Params.type "external-link") }}
|
||||
<li class="docs-menu__links-submenu-item">
|
||||
<a href="{{ .Params.external_url }}" target="_blank">
|
||||
{{ .Title }}
|
||||
{{ partial "svg" "external-link.svg" }}
|
||||
</a>
|
||||
</li>
|
||||
{{ else if not .Params.hideInSidebar }}
|
||||
<li
|
||||
class="docs-menu__links-submenu-item{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
|
||||
active
|
||||
{{ end }}"
|
||||
>
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
</li>
|
||||
<nav>
|
||||
<ul class="docs-menu__links-submenu">
|
||||
{{ range .RegularPages }}
|
||||
{{ if (eq .Params.type "external-link") }}
|
||||
<li class="docs-menu__links-submenu-item">
|
||||
<a href="{{ .Params.external_url }}" target="_blank">
|
||||
{{ .Title }}
|
||||
{{ partial "svg" "external-link.svg" }}
|
||||
</a>
|
||||
</li>
|
||||
{{ else if not .Params.hideInSidebar }}
|
||||
<li
|
||||
class="docs-menu__links-submenu-item{{ if eq .File.UniqueID $currentNode.File.UniqueID }}
|
||||
active
|
||||
{{ end }}"
|
||||
>
|
||||
<a href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
</nav>
|
||||
</details>
|
||||
</ul>
|
||||
</nav>
|
||||
</details>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</nav>
|
||||
</nav>
|
||||
{{ end }}
|
||||
|
||||
{{ if eq $currentNode.Section "articles" }}
|
||||
<h3 class="docs-menu__links-title">Learn</h3>
|
||||
<nav>
|
||||
<div class="docs-menu__links-group">
|
||||
{{ $subject := site.GetPage "articles" }}
|
||||
|
||||
{{ range $subject.Pages }}
|
||||
{{ if .Params.isCategoryPage }}
|
||||
<div
|
||||
class="docs-menu__articles-link docs-menu__links-group-heading
|
||||
{{ if eq .File.UniqueID $currentNode.File.UniqueID }} active{{ end }}"
|
||||
>
|
||||
<a href="{{ .Params.url }}">{{ .Params.title }}</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
</nav>
|
||||
{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<script src="{{ $filterChartJs.RelPermalink }}"></script>
|
||||
{{ end }}
|
||||
|
||||
{{ if in (slice "docs" "documentation") .Section }}
|
||||
{{ if in (slice "docs" "documentation" "articles") .Section }}
|
||||
{{ $documentationJs := resources.Get "/js/documentation.js" | js.Build | minify | resources.Fingerprint "sha512" }}
|
||||
<script src="{{ $documentationJs.RelPermalink }}"></script>
|
||||
{{ end }}
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
</script>
|
||||
{{ end }}
|
||||
|
||||
{{ if or (in (slice "docs" "documentation") .Section) (and (not .IsPage) (eq .Section "blog")) }}
|
||||
{{ if or (in (slice "docs" "documentation" "articles") .Section) (and (not .IsPage) (eq .Section "blog")) }}
|
||||
{{ $pageSearchJs := resources.Get "/js/search/search.js" | js.Build | minify | resources.Fingerprint "sha512" }}
|
||||
<script src="{{ $pageSearchJs.RelPermalink }}" type="module"></script>
|
||||
{{ end }}
|
||||
@@ -115,7 +115,7 @@
|
||||
<script src="{{ $anchorJs.RelPermalink }}"></script>
|
||||
{{ end }}
|
||||
|
||||
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") }}
|
||||
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") (eq .Section "articles") }}
|
||||
<script>
|
||||
document.addEventListener('keydown', function (event) {
|
||||
if ((event.metaKey || event.ctrlKey) && event.key === 'k') {
|
||||
|
||||
@@ -2,12 +2,17 @@
|
||||
{{ if gt (.TableOfContents | len) 34 }}
|
||||
<div class="table-of-contents">
|
||||
<p class="table-of-contents__head">On this page:</p>
|
||||
|
||||
{{ .TableOfContents }}
|
||||
{{ $tocStartLevel := .Params.toc_start_level }}
|
||||
{{ if not $tocStartLevel }}
|
||||
{{ $tocStartLevel = default 1 $.Parent.Params.toc_start_level }}
|
||||
{{ end }}
|
||||
{{ $tocEndLevel := default 3 .Params.toc_end_level }}
|
||||
{{ $tocOrdered := false }}
|
||||
{{ .Fragments.ToHTML $tocStartLevel $tocEndLevel $tocOrdered | safeHTML }}
|
||||
|
||||
|
||||
<ul class="table-of-contents__external-links">
|
||||
{{ if eq .Section "documentation" }}
|
||||
{{ if or (eq .Section "documentation") (eq .Section "articles") }}
|
||||
<li class="table-of-contents__link">
|
||||
<a href="{{ .Site.Params.githubDocPrefix }}{{ path.Clean .File.Path }}" target="_blank">
|
||||
{{ partial "svg" "github.svg" }}
|
||||
|
||||