Add Course page (#1844)

* Add Course page

* Added shortcodes and buttons to navigate to the next page

* move course images from layout

* decouple documentation and course layout

* decouple course sidebar

* move accordion js handlers into global unconditional js

* enable search on courses

* allow nested courses

* disable links for now

---------

Co-authored-by: generall <andrey@vasnetsov.com>
This commit is contained in:
nastyapash
2025-08-14 22:42:19 +02:00
committed by GitHub
co-authored by generall
parent cbd9061f6b
commit d758ddcb81
54 changed files with 1069 additions and 63 deletions
+4
View File
@@ -0,0 +1,4 @@
---
---
# Welcome to Qdrant Courses
@@ -0,0 +1,109 @@
---
title: Qdrant Essentials Course
page_title: Qdrant Essentials Course
description: The ultimate guide to production-grade vector search is here. And it’s free.
content:
sidebarTitle: Qdrant Essentials
menuTitle:
text: Course Overview
url: /course/essentials/
getStarted:
text: Get Started
url: /course/essentials/day-0/
nextButton: Continue to Next Video
nextDay: Complete
title: Qdrant Essentials Course
description: The ultimate guide to production-grade vector search is here. And it’s free.
partition: course
---
# Qdrant Essentials Course
The ultimate guide to production-grade vector search is here. And it’s free.
From your first vector upsert to optimizing high-performance retrieval at scale, this free course takes you from zero to production-ready. Learn how to build efficient vector search, fine-tune Qdrant for maximum performance, and keep your system lightweight, even when working with billions of vectors.
{{< course-card
title="Skills you’ll gain:"
image="/icons/outline/training-white.svg"
type="wide-list">}}
- Vector search fundamentals
- Performance optimization
- Hybrid and similarity search
- Portfolio project development
{{< /course-card >}}
## What Is the Course?
No matter if you're exploring vector search for the first time or fine-tuning a large-scale RAG system, this free course gives you the practical foundation and advanced skills you need.
Over 9 days (plus bonus content), you’ll build up from the fundamentals to advanced deployment strategies with Qdrant. Each module focuses on a single concept or capability, paired with a hands-on exercise to apply what you’ve learned. You will start with basics, build confidence, and gradually progress to complex topics. 
Every day includes a hands-on exercise or mini-project, like creating a collection, uploading points, building a hybrid search pipeline, or tuning the HNSW index.
At the end, you’ll bring everything together by building a full production-grade vector search application. You’ll graduate with a portfolio-worthy project, plus a deep understanding of how to apply Qdrant in production scenarios.
## Course Overview
{{< accordion >}}
- title: "Days 0: Setup, Orientation & “Hello Qdrant!”"
content: |
- Welcome & Course Orientation
- Environment Setup
- Mini “Hello Qdrant!” Demo
- title: "Day 1: Core Qdrant Data Model & Vector Search 101"
content: Content
- title: "Days 2: Indexing & Vector Storage Architecture"
content: Content
- title: "Day 3: Hybrid Search"
content: Content
- title: "Day 4: Optimizations & Query APIs"
content: Content
{{< /accordion >}}
## Certificate of Completion
image
## Who Is the Course For?
You! But really, this course is great for hands-on professionals who need to build or improve applications with semantic or hybrid search capabilities, or developers exploring vector databases for the first time.
If your job title includes:
- Machine Learning Engineer
- Backend Developer
- Data Engineer
- Search Engineer
- MLOps Engineer
you’re in the right spot.
## Pre-Reqs
You don’t need prior Qdrant or vector database experience, but you should be comfortable with:
- Basic Python programming
- Running commands in your terminal
- Working with APIs or Python SDKs
- Some ML background (e.g., embeddings)
Optional but helpful:
- Docker basics
- Experience with search systems or deploying applications
{{< course-card
title="Why Start Today"
image="/icons/outline/rocket-white-light.svg"
link="/course/day-0/">}}
- Seeing practical examples (e.g., hybrid search, sparse+dense vectors)
- Learning key deployment tactics (multi-node clusters, on-disk indexing, RBAC)
- Building a final portfolio-grade project to showcase
{{< /course-card >}}
@@ -0,0 +1,6 @@
---
title: Certification
url: /course/certification/
---
# Certification
@@ -0,0 +1,13 @@
---
title: Day 0
isLesson: true
weight: 1
---
{{< date >}} Day 0 {{< /date >}}
# Setup, Orientation & “Hello Qdrant!”
Welcome to Day 0! Today we’ll lay the foundation for everything in the course. Let’s get started with setting up your environment, and creating your first collection. By the end of this, you’ll have your first similarity search running! In total, the three videos are about 20 minutes total.
## Video 01: Course Overview
@@ -0,0 +1,9 @@
---
title: Video 02
weight: 2
---
{{< date >}} Day 0 {{< /date >}}
# Video 02: Set Up Your Environment
@@ -0,0 +1,9 @@
---
title: Video 03
weight: 3
---
{{< date >}} Day 0 {{< /date >}}
# Video 03: Create a Collection
@@ -0,0 +1,9 @@
---
title: Day 1
isLesson: true
weight: 4
---
{{< date >}} Day 1 {{< /date >}}
# Day 1
@@ -0,0 +1,9 @@
---
title: Video 02
weight: 5
---
{{< date >}} Day 1 {{< /date >}}
# Video 02: Set Up Your Environment
@@ -0,0 +1,9 @@
---
title: Day 2
isLesson: true
weight: 6
---
{{< date >}} Day 2 {{< /date >}}
# Day 2
@@ -0,0 +1,9 @@
---
title: Day 3
isLesson: true
weight: 7
---
{{< date >}} Day 3 {{< /date >}}
# Day 3
@@ -0,0 +1,9 @@
---
title: Day 4
isLesson: true
weight: 8
---
{{< date >}} Day 4 {{< /date >}}
# Day 4
@@ -0,0 +1,59 @@
---
title: Day 9 (Bonus)
isLesson: true
weight: 9
---
{{< date >}} Day 9 {{< /date >}}
# Bonus: Advanced Configurations
{{< cards-list >}}
- icon: /courses/course-integrations/crew-ai.svg
title: Building Agents with CrewAI and Qdrant
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/haystack.svg
title: Haystack
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/jina.svg
title: Jina
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/n8n.svg
title: n8n
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/camel-ai.svg
title: Camel-AI
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/tensorlake.svg
title: Tensorlake
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/vectorize.svg
title: Vectorize.io
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/unstructured.svg
title: Unstructured.io
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/quotient.svg
title: Quotient
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/superlinked.svg
title: Superlinked
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/twelveLabs.svg
title: TwelveLabs
content: Qdrant is compatible with Cohere co.embed API.
- icon: /courses/course-integrations/aparavi.svg
title: APARAVI
content: Qdrant is compatible with Cohere co.embed API.
{{< /cards-list >}}
@@ -0,0 +1,51 @@
---
title: FAQ
url: /course/faq/
---
# Qdrant Essentials Course FAQs
## Who is this course for?
Engineers and developers working with semantic or hybrid search, building LLM pipelines, or exploring vector databases for the first time. No prior experience with Qdrant or vector search is needed.
## Is the course free?
Yes, completely free. No credit card required.
## Do I get a certificate of completion?
Yes! But just watching the videos doesn’t quite get you there. You need to [[insert instructions]](/#) to obtain the certification. And, you’ll also have your project to add to your portfolio!
## How much time should I spend on this course?
Each “Day” of this course is designed to be completed in 1 day. Day 0 is the quickest, and then there are 8 days of content. So you are looking at a minimum of 9 days, but don’t forget about the bonus content.
The good news is that you can take as much time as you need to complete the course since it is on-demand and at your own pace.
## What tools do I need?
Python, Docker, and optionally Qdrant Cloud. We walk you through setup on Day 0.
## Can I use Qdrant locally or do I need a cloud account?
You can do either. We support both local (via Docker) and Qdrant Cloud setups.
## What if I get stuck or have a question?
Join the Qdrant Discord. Our team and community are ready to help.
## Where can I get the code for the course?
Look at each Day’s page of content. You can also find them in this repo.
{{< course-card
title="Why Start Today"
image="/icons/outline/rocket-white-light.svg"
link="/course/day-0/">}}
- Seeing practical examples (e.g., hybrid search, sparse+dense vectors)
- Learning key deployment tactics (multi-node clusters, on-disk indexing, RBAC)
- Building a final portfolio-grade project to showcase
{{< /course-card >}}
@@ -28,5 +28,10 @@ menuItems:
url: https://api.qdrant.tech/api-reference
external: true
icon: roadmap-white.svg
# - id: menu-5
# name: Course
# url: /course/
# external: true
# icon: roadmap-white.svg
sitemapExclude: true
---
@@ -0,0 +1,6 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.5077 8.44812V13.3247L21.3709 13.4615H8.92876V39.075H34.6335V26.4961H39.5556V40.7613C39.5556 42.1796 37.8529 43.9252 36.41 43.9963L6.96626 43.9999C5.40484 43.6654 4.20711 42.4658 4.00293 40.8561L4.00749 11.5947C4.03392 10.2274 5.80864 8.44812 7.15039 8.44812H21.5067H21.5077Z" fill="white"/>
<path d="M22.7836 32.6032C21.7545 30.0902 20.8557 27.5124 19.73 25.0376L15.0357 36.4316H11.6631L17.9188 21.5821C18.494 20.5302 20.9833 20.5694 21.5858 21.5411L27.888 36.4316H24.4699C23.8473 35.1946 23.3086 33.8857 22.7836 32.6032C22.8127 32.6542 22.779 32.595 22.7836 32.6032Z" fill="white"/>
<path d="M26.4619 3.99976V8.97116H39.0299V21.6212H44.0396V7.65311C44.0396 5.63501 42.4198 3.99976 40.4218 3.99976H26.4619Z" fill="#FE9014"/>
<path d="M17.1924 31.194L18.3619 28.3564L22.2185 31.194L24.469 36.4316L17.1924 31.194Z" fill="#FE9014"/>
</svg>

After

Width:  |  Height:  |  Size: 946 B

@@ -0,0 +1,3 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.8203 5.12109V16.4062L21.0273 12.1895C21.9553 11.1975 24.4276 10.7009 25.8516 11.8809C27.2553 13.0427 28.3257 14.2978 28.7578 14.6699C29.7778 15.5839 30.372 15.5359 31.418 14.6699C32.8397 13.4921 35.0652 13.5561 36.3633 14.8555L39.334 17.8945C40.57 19.2807 42.6721 23.042 41.5605 27.6914C41.3526 28.5552 41.1887 28.8701 40.8809 29.6758L42.4707 36.3516L40.9414 44H37.2305L39.2363 36.3516L37.2305 29.6758L34.1992 44H30.4902L33.5195 29.6758H25.7285L28.7578 44H25.1094L22.0176 29.6758L20.4121 36.3516L22.0176 44H18.4297L17.1758 36.3516L18.4297 29.6758C16.5536 28.5396 12.7401 24.9511 12.4941 19.6914C12.2462 14.4365 12.3901 10.971 12.4941 9.89648C11.8342 9.91848 10.5144 10.0177 9.64844 9.33789C8.22644 9.70989 6.804 9.1532 6 8.5332L7.29883 6.73437C7.58694 6.4023 8.31237 5.70461 8.90625 5.55664C9.50067 5.40658 14.9568 4.53797 17.6367 4L16.8203 5.12109ZM12.3535 6.75391L13.2187 7.65234L14.084 6.75391L13.2187 5.91992L12.3535 6.75391Z" fill="#4C19E8"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,3 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.9969 6.09357C16.9454 7.81332 8.34669 19.5388 8.26852 29.0756C8.19035 37.4398 12.9587 42.2082 21.4011 42.13C31.5632 42.0519 42.9761 31.7334 39.6929 25.6361C38.6767 23.6819 37.5824 23.6037 35.6281 25.3234C33.2048 27.434 33.1266 25.7925 35.3154 20.9459C37.9732 14.9268 37.895 12.8944 34.8464 9.53306C31.8759 6.40625 28.7491 5.2337 24.9969 6.09357ZM33.0485 9.22038C36.488 12.269 36.6443 15.6303 33.752 21.9621C31.6414 26.6523 30.4689 27.2777 27.9674 24.7763C26.0913 22.9002 25.935 19.5388 27.5766 15.6303C29.2963 11.6437 29.0618 10.9401 26.7167 13.1289C21.0884 18.21 16.9454 27.9031 18.5088 32.0461C19.2124 33.844 19.7595 34.1567 22.6518 34.1567C26.873 34.1567 32.1886 31.5771 34.6901 28.2157C37.3478 24.7763 38.9112 24.7763 38.9112 28.1376C38.9112 34.0003 29.14 41.192 21.3229 41.192C11.8644 41.192 7.17414 34.0003 9.98827 23.8382C11.3172 19.3043 16.7109 11.8782 20.6976 9.22038C25.6223 5.93723 29.2963 5.93723 33.0485 9.22038Z" fill="#F0F3FA"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,3 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M37.682 33.6904C37.682 34.015 37.4174 34.2768 37.0917 34.2768C34.1551 34.2768 31.7748 31.9118 31.7748 28.994V19.498C31.7748 15.2837 28.3362 11.8681 24.0958 11.8681C19.8555 11.8681 16.6057 15.2848 16.6057 19.498V23.0157C16.5989 23.3337 16.8533 23.5966 17.1721 23.6023C17.1767 23.6023 17.1801 23.6023 17.1846 23.6023H20.5396C20.8653 23.609 21.1355 23.3516 21.1423 23.027C21.1423 23.0225 21.1423 23.0191 21.1423 23.0146V19.3553C21.1423 17.734 22.4642 16.4207 24.0958 16.4207C25.7276 16.4207 27.0494 17.734 27.0494 19.3553V41.4134C27.0426 41.7438 26.7678 42.0067 26.4354 41.9999C23.5124 41.9999 21.1423 39.645 21.1423 36.7407C21.1423 36.7328 21.1423 36.7249 21.1423 36.7171V29.6738C21.1355 29.3479 20.8675 29.0872 20.5396 29.0872H17.1846C16.8646 29.0872 16.6057 29.3445 16.6057 29.6625C16.6057 29.667 16.6057 29.6704 16.6057 29.6749V32.023C16.6057 34.9408 14.0365 37.3058 11.0999 37.3058C10.7732 37.3058 10.5098 37.043 10.5098 36.7193V19.4991C10.5098 12.0434 16.5921 6 24.0958 6C31.5996 6 37.682 12.0434 37.682 19.4991V33.6904Z" fill="#0EAF9C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,5 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.87853 33.0184C6.46871 33.0184 7.75705 31.7301 7.75705 30.1399C7.75705 28.5497 6.46871 27.2614 4.87853 27.2614C3.28834 27.2614 2 28.5497 2 30.1399C2 31.7301 3.28834 33.0184 4.87853 33.0184Z" fill="#EB6161"/>
<path d="M13.9486 21.07C14.3241 21.07 14.6259 21.3718 14.6259 21.7472L14.5891 27.2614C14.5891 30.4049 12.0639 32.9669 8.92774 33.0184H8.83203V27.2761H8.85412L8.8762 21.762C8.8762 21.3865 9.17804 21.0847 9.5535 21.0847H13.956C13.9486 21.0847 13.9486 21.07 13.9486 21.07ZM22.7903 21.07C23.1658 21.07 23.4676 21.3718 23.4676 21.7472V29.4626C23.4676 29.838 23.1658 30.1399 22.7903 30.1399H18.3879C18.0124 30.1399 17.7106 29.838 17.7106 29.4626V21.7472C17.7106 21.3718 18.0124 21.07 18.3879 21.07H22.7903ZM29.7179 21.0479H29.8136C32.6333 21.0847 34.9302 23.3595 35.0112 26.1865V29.4479C35.0112 29.8233 34.7093 30.1252 34.3339 30.1252H27.2222C26.8468 30.1252 26.5449 29.8233 26.5449 29.4479V21.7252C26.5449 21.3497 26.8468 21.0479 27.2222 21.0479C27.2149 21.0479 29.7179 21.0479 29.7179 21.0479ZM41.3719 30.0442C39.0014 29.8969 37.102 27.9166 37.102 25.5092C37.102 23.0061 39.1339 20.9742 41.6369 20.9742C44.0443 20.9742 46.0247 22.8589 46.1719 25.2442V29.3669C46.1719 29.7423 45.8701 30.0442 45.4946 30.0442C45.4872 30.0442 41.3719 30.0442 41.3719 30.0442Z" fill="#009191"/>
<path d="M20.5817 19.9951C22.1718 19.9951 23.4602 18.7067 23.4602 17.1166C23.4602 15.5264 22.1718 14.238 20.5817 14.238C18.9915 14.238 17.7031 15.5264 17.7031 17.1166C17.7031 18.7067 18.9915 19.9951 20.5817 19.9951Z" fill="#FBCB67"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,10 @@
<svg width="48" height="30" viewBox="0 0 48 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10745_1218)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.384 10.8C47.384 13.451 45.2349 15.6 42.584 15.6C40.3474 15.6 38.4681 14.0703 37.9352 12H31.2336C30.0604 12 29.0592 12.8482 28.8663 14.0054L28.669 15.1891C28.4817 16.313 27.9132 17.2911 27.1092 18C27.9132 18.7089 28.4817 19.687 28.669 20.8109L28.8663 21.9946C29.0592 23.1518 30.0604 24 31.2336 24H33.1352C33.6681 21.9297 35.5474 20.4 37.784 20.4C40.4349 20.4 42.584 22.549 42.584 25.2C42.584 27.851 40.4349 30 37.784 30C35.5474 30 33.6681 28.4703 33.1352 26.4H31.2336C28.8872 26.4 26.8847 24.7036 26.499 22.3891L26.3016 21.2054C26.1088 20.0482 25.1075 19.2 23.9343 19.2H21.9766C21.3774 21.1681 19.5479 22.6 17.384 22.6C15.22 22.6 13.3905 21.1681 12.7914 19.2H9.9766C9.37744 21.1681 7.54792 22.6 5.38398 22.6C2.73302 22.6 0.583984 20.4509 0.583984 17.8C0.583984 15.149 2.73302 13 5.38398 13C7.69204 13 9.6196 14.629 10.0797 16.8H12.6883C13.1484 14.629 15.0759 13 17.384 13C19.692 13 21.6196 14.629 22.0797 16.8H23.9343C25.1075 16.8 26.1088 15.9518 26.3016 14.7946L26.499 13.6109C26.8847 11.2964 28.8872 9.6 31.2336 9.6H37.9352C38.4681 7.52973 40.3474 6 42.584 6C45.2349 6 47.384 8.14903 47.384 10.8ZM44.984 10.8C44.984 12.1255 43.9095 13.2 42.584 13.2C41.2585 13.2 40.184 12.1255 40.184 10.8C40.184 9.47452 41.2585 8.4 42.584 8.4C43.9095 8.4 44.984 9.47452 44.984 10.8ZM5.38398 20.2C6.70948 20.2 7.78396 19.1255 7.78396 17.8C7.78396 16.4745 6.70948 15.4 5.38398 15.4C4.0585 15.4 2.98398 16.4745 2.98398 17.8C2.98398 19.1255 4.0585 20.2 5.38398 20.2ZM17.384 20.2C18.7095 20.2 19.784 19.1255 19.784 17.8C19.784 16.4745 18.7095 15.4 17.384 15.4C16.0585 15.4 14.984 16.4745 14.984 17.8C14.984 19.1255 16.0585 20.2 17.384 20.2ZM37.784 27.6C39.1095 27.6 40.184 26.5255 40.184 25.2C40.184 23.8745 39.1095 22.8 37.784 22.8C36.4585 22.8 35.384 23.8745 35.384 25.2C35.384 26.5255 36.4585 27.6 37.784 27.6Z" fill="#EA4B71"/>
</g>
<defs>
<clipPath id="clip0_10745_1218">
<rect width="48" height="24" fill="white" transform="translate(0 6)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,4 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.4201 34.5843L9.12988 19.2919L24.4201 3.99951L39.7093 19.2919L33.8353 25.167L24.4201 15.7497L20.879 19.2919L30.2942 28.7081L24.4201 34.5843ZM11.4639 19.2919L24.4201 32.2493L27.9602 28.7081L18.5461 19.2919L24.4201 13.4157L33.8342 22.833L37.3753 19.2919L24.4201 6.33242L11.4639 19.2919Z" fill="#FE552E"/>
<path d="M24.419 43.9995L9.12988 28.7071L15.0039 22.832L24.4201 32.2493L27.9602 28.7081L18.5461 19.2919L24.4201 13.4157L39.7093 28.7071L24.419 43.9995ZM11.4639 28.7071L24.419 41.6655L37.3753 28.7071L24.4201 15.7497L20.879 19.2919L30.2942 28.7081L24.4201 34.5843L15.005 25.166L11.4639 28.7071Z" fill="#FE552E"/>
</svg>

After

Width:  |  Height:  |  Size: 729 B

@@ -0,0 +1,4 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M43.8447 26.5257C43.5658 29.2211 42.7645 31.7586 41.526 34.0287C40.2876 34.5386 38.7947 34.8906 36.8521 34.8906C32.7725 34.8906 30.5996 33.3126 28.8513 32.0501C27.3579 30.9693 26.2771 30.1921 23.8733 30.1921C21.4694 30.1921 20.3892 30.9693 18.8958 32.0501C17.148 33.3126 14.9746 34.8906 10.8955 34.8906C8.96494 34.8906 7.45953 34.5386 6.22105 34.0287C4.98257 31.7586 4.18129 29.2211 3.90234 26.5257C4.66707 26.9509 5.3106 27.4242 5.91757 27.8614C7.41096 28.9421 8.47917 29.7188 10.8955 29.7188C13.2994 29.7188 14.3796 28.9421 15.873 27.8609C17.6208 26.5989 19.7943 25.0323 23.8738 25.0323C27.9528 25.0323 30.1258 26.5989 31.8741 27.8614C33.3675 28.9421 34.4482 29.7188 36.8521 29.7188C39.2559 29.7188 40.3361 28.9421 41.83 27.8609C42.4245 27.4242 43.08 26.9629 43.8447 26.5257ZM36.6457 39.9657C34.8229 41.4731 32.7469 42.6447 30.5144 43.4263C29.9074 43.0617 29.3611 42.6611 28.8633 42.297C27.3699 41.2162 26.2892 40.4395 23.8853 40.4395C21.4815 40.4395 20.4012 41.2162 18.9079 42.297C18.398 42.6611 17.8642 43.0497 17.2452 43.4263C15.0127 42.6447 12.9367 41.4731 11.1139 39.9657C13.372 39.9297 14.4282 39.1645 15.873 38.1083C17.6208 36.8457 19.7943 35.2797 23.8733 35.2797C27.9528 35.2797 30.1258 36.8457 31.8741 38.1083C33.3189 39.1645 34.3751 39.9172 36.6457 39.9657Z" fill="#62D84E"/>
<path d="M23.874 4.40582C34.3959 4.40582 43.0257 12.5018 43.874 22.8053H37.5048C36.682 16.0054 30.8968 10.743 23.874 10.743C16.8513 10.743 11.066 16.0054 10.2432 22.8048H3.87402C4.72238 12.5018 13.3517 4.40582 23.874 4.40582Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,30 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.0299 20.9175C11.7199 20.9175 11.4689 20.6665 11.4689 20.3565V19.6017C11.4689 19.2917 11.7199 19.0407 12.0299 19.0407H24.7762C25.0862 19.0407 25.3372 19.2917 25.3372 19.6017V20.3565C25.3372 20.6665 25.0862 20.9175 24.7762 20.9175H12.0299Z" fill="white"/>
<path d="M2.561 20.9175C2.251 20.9175 2 20.6665 2 20.3565V19.6017C2 19.2917 2.251 19.0407 2.561 19.0407H9.05262C9.36262 19.0407 9.61362 19.2917 9.61362 19.6017V20.3565C9.61362 20.6665 9.36262 20.9175 9.05262 20.9175H2.561Z" fill="white"/>
<path d="M29.3286 20.9175C29.0185 20.9175 28.7675 20.6665 28.7675 20.3565V19.6017C28.7675 19.2917 29.0185 19.0407 29.3286 19.0407H36.8981C37.2081 19.0407 37.4591 19.2917 37.4591 19.6017V20.3565C37.4591 20.6665 37.2081 20.9175 36.8981 20.9175H29.3286Z" fill="white"/>
<path d="M30.5798 18.2218C30.2698 18.2218 30.0188 17.9708 30.0188 17.6607V16.906C30.0188 16.596 30.2698 16.345 30.5798 16.345H36.8988C37.2088 16.345 37.4598 16.596 37.4598 16.906V17.6607C37.4598 17.9708 37.2088 18.2218 36.8988 18.2218H30.5798Z" fill="white"/>
<path d="M38.9923 18.2218C38.6823 18.2218 38.4313 17.9708 38.4313 17.6607V16.906C38.4313 16.596 38.6823 16.345 38.9923 16.345H43.7587C44.0687 16.345 44.3197 16.596 44.3197 16.906V17.6607C44.3197 17.9708 44.0687 18.2218 43.7587 18.2218H38.9923Z" fill="white"/>
<path d="M36.4899 15.4586C36.1808 15.4586 35.9289 15.2076 35.9289 14.8976V14.1429C35.9289 13.8337 36.1808 13.5819 36.4899 13.5819H42.0761C42.3861 13.5819 42.6371 13.8337 42.6371 14.1429V14.8976C42.6371 15.2076 42.3861 15.4586 42.0761 15.4586H36.4899Z" fill="white"/>
<path d="M38.6008 12.7638C38.2916 12.7638 38.0398 12.5128 38.0398 12.2028V11.448C38.0398 11.138 38.2916 10.887 38.6008 10.887H39.4638C39.773 10.887 40.0248 11.138 40.0248 11.448V12.2028C40.0248 12.5128 39.773 12.7638 39.4638 12.7638H38.6008Z" fill="white"/>
<path d="M30.9869 15.4586C30.6777 15.4586 30.4268 15.2076 30.4268 14.8976V14.1429C30.4268 13.8337 30.6777 13.5819 30.9869 13.5819H31.85C32.16 13.5819 32.411 13.8337 32.411 14.1429V14.8976C32.411 15.2076 32.16 15.4586 31.85 15.4586H30.9869Z" fill="white"/>
<path d="M18.5866 34.4193C18.2766 34.4193 18.0256 34.1683 18.0256 33.8583V33.0384C18.0256 32.7292 18.2766 32.4782 18.5866 32.4782H20.894C21.204 32.4782 21.455 32.7292 21.455 33.0384V33.8583C21.455 34.1683 21.204 34.4193 20.894 34.4193H18.5866Z" fill="white"/>
<path d="M24.5158 34.4193C24.2067 34.4193 23.9557 34.1683 23.9557 33.8583V33.0384C23.9557 32.7292 24.2067 32.4782 24.5158 32.4782H25.6378C25.9469 32.4782 26.1988 32.7292 26.1988 33.0384V33.8583C26.1988 34.1683 25.9469 34.4193 25.6378 34.4193H24.5158Z" fill="white"/>
<path d="M27.7932 34.4193C27.4832 34.4193 27.2322 34.1683 27.2322 33.8583V33.0384C27.2322 32.7292 27.4832 32.4782 27.7932 32.4782H32.7101C33.0201 32.4782 33.2711 32.7292 33.2711 33.0384V33.8583C33.2711 34.1683 33.0201 34.4193 32.7101 34.4193H27.7932Z" fill="white"/>
<path d="M30.8175 31.7213C30.5084 31.7213 30.2574 31.4703 30.2574 31.1611V30.3412C30.2574 30.0312 30.5084 29.7802 30.8175 29.7802H32.1984C32.5075 29.7802 32.7585 30.0312 32.7585 30.3412V31.1611C32.7585 31.4703 32.5075 31.7213 32.1984 31.7213H30.8175Z" fill="white"/>
<path d="M13.8594 34.4193C13.5503 34.4193 13.2993 34.1683 13.2993 33.8583V33.0384C13.2993 32.7292 13.5503 32.4782 13.8594 32.4782H14.7225C15.0325 32.4782 15.2835 32.7292 15.2835 33.0384V33.8583C15.2835 34.1683 15.0325 34.4193 14.7225 34.4193H13.8594Z" fill="white"/>
<path d="M22.424 35.7332C22.424 35.432 22.6609 35.1731 22.985 35.1731H23.8472C24.1493 35.1731 24.4082 35.41 24.4082 35.7332V36.5751C24.4082 36.8763 24.1713 37.1353 23.8472 37.1353H22.985C22.6829 37.1353 22.424 36.8983 22.424 36.5751V35.7332Z" fill="white"/>
<path d="M21.0653 39.8087C20.7553 39.8087 20.5043 39.5577 20.5043 39.2477V38.4287C20.5043 38.1187 20.7553 37.8677 21.0653 37.8677H21.8201C22.1301 37.8677 22.3811 38.1187 22.3811 38.4287V39.2477C22.3811 39.5577 22.1301 39.8087 21.8201 39.8087H21.0653Z" fill="white"/>
<path d="M28.5281 10.068C28.219 10.068 27.968 9.81705 27.968 9.50704V8.75229C27.968 8.44228 28.219 8.19128 28.5281 8.19128H29.8659C30.175 8.19128 30.4269 8.44228 30.4269 8.75229V9.50704C30.4269 9.81705 30.175 10.068 29.8659 10.068H28.5281Z" fill="white"/>
<path d="M14.5961 18.2218C14.2861 18.2218 14.0351 17.9708 14.0351 17.6607V16.906C14.0351 16.596 14.2861 16.345 14.5961 16.345H19.7297C20.0388 16.345 20.2898 16.596 20.2898 16.906V17.6607C20.2898 17.9708 20.0388 18.2218 19.7297 18.2218H14.5961Z" fill="white"/>
<path d="M26.2196 12.7638C25.9096 12.7638 25.6586 12.5128 25.6586 12.2028V11.448C25.6586 11.138 25.9096 10.887 26.2196 10.887H28.8943C29.2034 10.887 29.4553 11.138 29.4553 11.448V12.2028C29.4553 12.5128 29.2034 12.7638 28.8943 12.7638H26.2196Z" fill="white"/>
<path d="M23.872 15.4586C23.562 15.4586 23.311 15.2076 23.311 14.8976V14.1429C23.311 13.8337 23.562 13.5819 23.872 13.5819H28.8972C29.2063 13.5819 29.4582 13.8337 29.4582 14.1429V14.8976C29.4582 15.2076 29.2063 15.4586 28.8972 15.4586H23.872Z" fill="white"/>
<path d="M42.981 20.9175C42.671 20.9175 42.42 20.6665 42.42 20.3565V19.6017C42.42 19.2917 42.671 19.0407 42.981 19.0407H45.439C45.749 19.0407 46 19.2917 46 19.6017V20.3565C46 20.6665 45.749 20.9175 45.439 20.9175H42.981Z" fill="white"/>
<path d="M9.15955 23.6137C8.84954 23.6137 8.59855 23.3627 8.59855 23.0527V22.298C8.59855 21.9888 8.84954 21.7378 9.15955 21.7378H25.7448C26.0548 21.7378 26.3058 21.9888 26.3058 22.298V23.0527C26.3058 23.3627 26.0548 23.6137 25.7448 23.6137H9.15955Z" fill="white"/>
<path d="M25.2288 29.004C24.9188 29.004 24.6678 28.753 24.6678 28.443V27.6883C24.6678 27.3783 24.9188 27.1273 25.2288 27.1273H31.03C31.34 27.1273 31.591 27.3783 31.591 27.6883V28.443C31.591 28.753 31.34 29.004 31.03 29.004H25.2288Z" fill="white"/>
<path d="M12.0299 26.3083C11.7199 26.3083 11.4689 26.0573 11.4689 25.7482V24.9934C11.4689 24.6834 11.7199 24.4324 12.0299 24.4324H33.4035C33.7135 24.4324 33.9645 24.6834 33.9645 24.9934V25.7482C33.9645 26.0573 33.7135 26.3083 33.4035 26.3083H12.0299Z" fill="white"/>
<path d="M8.57768 29.004C8.26855 29.004 8.01755 28.753 8.01755 28.443V27.6883C8.01755 27.3783 8.26855 27.1273 8.57768 27.1273H15.8249C16.1349 27.1273 16.3859 27.3783 16.3859 27.6883V28.443C16.3859 28.753 16.1349 29.004 15.8249 29.004H8.57768Z" fill="white"/>
<path d="M16.2134 31.7213C15.9034 31.7213 15.6524 31.4703 15.6524 31.1611V30.3412C15.6524 30.0312 15.9034 29.7802 16.2134 29.7802H17.8313C18.1404 29.7802 18.3914 30.0312 18.3914 30.3412V31.1611C18.3914 31.4703 18.1404 31.7213 17.8313 31.7213H16.2134Z" fill="white"/>
<path d="M25.8736 31.7213C25.5644 31.7213 25.3126 31.4703 25.3126 31.1611V30.3412C25.3126 30.0312 25.5644 29.7802 25.8736 29.7802H27.7072C28.0163 29.7802 28.2682 30.0312 28.2682 30.3412V31.1611C28.2682 31.4703 28.0163 31.7213 27.7072 31.7213H25.8736Z" fill="white"/>
<path d="M11.1466 31.7213C10.8366 31.7213 10.5856 31.4703 10.5856 31.1611V30.3412C10.5856 30.0312 10.8366 29.7802 11.1466 29.7802H12.8067C13.1167 29.7802 13.3677 30.0312 13.3677 30.3412V31.1611C13.3677 31.4703 13.1167 31.7213 12.8067 31.7213H11.1466Z" fill="white"/>
<path d="M29.3286 23.6137C29.0185 23.6137 28.7675 23.3627 28.7675 23.0527V22.298C28.7675 21.9888 29.0185 21.7378 29.3286 21.7378H35.3455C35.6555 21.7378 35.9065 21.9888 35.9065 22.298V23.0527C35.9065 23.3627 35.6555 23.6137 35.3455 23.6137H29.3286Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,5 @@
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M31 10V13.1332H39.4025V34.8668H31V38H43V10H31Z" fill="white"/>
<path d="M19.0897 16L24.0651 27.0062L29.1708 16H33L25.6541 32H22.2677L15 16H19.0897Z" fill="white"/>
<path d="M17 38H5V10H17V13.1332H8.59748V34.8668H17V38Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 347 B

@@ -6,3 +6,8 @@
@import 'components/copy-btn';
@import 'components/lang-switcher';
@import 'components/alerts';
@import 'components/list';
@import 'components/cards-list';
@import 'components/accordion';
@import 'components/course-card';
@import 'components/date';
@@ -0,0 +1,65 @@
@use '../helpers/functions' as *;
@use 'sass:math';
.accordion-dark {
display: flex;
flex-direction: column;
gap: $spacer * 1.5;
width: 100%;
margin-bottom: $spacer * 2;
&__item {
border: pxToRem(1) solid $neutral-20;
background: linear-gradient($neutral-20, #0e1424);
border-radius: pxToRem(12);
&-header {
position: relative;
display: flex;
align-items: center;
margin-bottom: 0;
padding: $spacer * 2 $spacer * 4 $spacer * 2 $spacer * 2;
color: $neutral-94;
font-size: $font-size-l;
line-height: $line-height-lg;
font-weight: 500;
cursor: pointer;
&:after {
content: '';
display: block;
position: absolute;
right: $spacer * 2;
top: calc(50% - pxToRem(9));
height: pxToRem(18);
width: pxToRem(16);
background-image: url("data:image/svg+xml,%3Csvg width='17' height='19' viewBox='0 0 17 19' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_10609_1497)'%3E%3Cpath d='M1.81787 6.50513L8.63605 13.3233L15.4542 6.50513' stroke='%23E1E5F0' stroke-width='1.36364' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_10609_1497'%3E%3Crect width='16.3636' height='16.3636' fill='white' transform='translate(0.63623 1.91431)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
}
&-body {
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
&-content {
padding: 0 $spacer * 2 $spacer * 2 $spacer * 2;
color: $neutral-70;
ul {
li:not(:last-of-type) {
margin-bottom: pxToRem(10);
}
}
}
}
&.active {
.accordion__item-header:after {
background-image: url("data:image/svg+xml,%3Csvg width='17' height='19' viewBox='0 0 17 19' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_10609_1581)'%3E%3Cpath d='M15.4546 13.3232L8.63641 6.50506L1.81823 13.3232' stroke='%23E1E5F0' stroke-width='1.36364' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_10609_1581'%3E%3Crect width='16.3636' height='16.3636' fill='white' transform='translate(0.63623 1.91418)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
}
}
}
}
@@ -0,0 +1,50 @@
@use '../helpers/functions' as *;
@use 'sass:math';
.cards-list {
display: flex;
flex-wrap: wrap;
gap: $spacer * 1.5 $spacer * 2;
&__item {
display: flex;
align-items: flex-start;
gap: $spacer;
width: 100%;
padding: $spacer;
border: pxToRem(1) solid $neutral-20;
background: linear-gradient($neutral-20, #0e1424);
border-radius: pxToRem(12);
&-content {
margin-bottom: 0;
font-size: $font-size-s;
line-height: $line-height-sm;
color: $neutral-70;
}
&-title {
margin-bottom: math.div($spacer, 4);
font-size: $font-size-l;
line-height: $line-height-lg;
color: $neutral-98;
}
img.cards-list__item-image {
flex-shrink: 0;
width: $spacer * 3;
height: auto;
margin: 0;
}
}
@include media-breakpoint-up(lg) {
&__item {
width: calc(50% - $spacer);
padding: $spacer;
border: pxToRem(1) solid $neutral-20;
background: linear-gradient($neutral-20, #0e1424);
border-radius: pxToRem(12);
}
}
}
@@ -0,0 +1,55 @@
@use '../helpers/functions' as *;
@use "sass:math";
.course-card {
width: 100%;
margin: $spacer * 2.5 0 $spacer;
padding: $spacer * 2;
border: pxToRem(1) solid $neutral-20;
background: linear-gradient($neutral-20, #0e1424);
border-radius: pxToRem(12);
&__title {
display: flex;
justify-content: flex-start;
align-items: center;
gap: $spacer;
margin-bottom: $spacer * 1.5;
font-size: $font-size-xl;
line-height: pxToRem(30);
font-weight: 500;
color: $neutral-98;
}
.course-card__title img {
display: block;
margin: 0;
height: pxToRem(20);
width: pxToRem(20);
}
&__content {
color: $neutral-70;
&.wide {
ul {
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
column-gap: $spacer * 6;
margin-bottom: -$spacer * 1.5;
li {
margin-bottom: $spacer * 1.5;
}
}
}
}
&__button {
margin-top: $spacer * 1.5;
font-size: $font-size-s;
line-height: $line-height-sm;
font-weight: 500;
}
}
@@ -0,0 +1,17 @@
@use '../helpers/functions' as *;
@use "sass:math";
.date {
display: flex;
justify-content: flex-start;
align-items: center;
gap: math.div($spacer, 2);
margin-bottom: math.div($spacer, 2);
color: $secondary-blue-50;
&-icon {
width: $spacer !important;
height: $spacer !important;
margin: 0 !important;
}
}
@@ -0,0 +1,33 @@
@use '../helpers/functions' as *;
@use "sass:math";
.list {
color: $neutral-70;
ul {
list-style: none;
margin-bottom: 0;
padding-left: 0;
li {
position: relative;
padding-left: pxToRem(22);
&:not(:last-of-type) {
margin-bottom: pxToRem(12);
}
&:before {
content: "";
position: absolute;
left: 0;
top: pxToRem(5);
width: pxToRem(14);
height: pxToRem(14);
background-image: url("data:image/svg+xml,%3Csvg width='14' height='15' viewBox='0 0 14 15' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_10609_1587)'%3E%3Cpath d='M12.6875 4.56921V10.9862L7 14.1942L1.3125 10.9862V4.56921L7 1.36121L12.6875 4.56921ZM9.53223 5.87976L6.05371 8.92371L4.08301 6.953L3.25781 7.77722L6.00098 10.5204L6.41113 10.161L10.3008 6.75867L10.7393 6.3739L9.97168 5.49597L9.53223 5.87976Z' fill='%238F98B3'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_10609_1587'%3E%3Crect width='14' height='14' fill='white' transform='translate(0 0.777832)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
background-size: contain;
background-repeat: no-repeat;
}
}
}
}
@@ -107,6 +107,13 @@
}
}
&__button {
width: 100%;
font-size: $font-size-s;
line-height: $line-height-sm;
color: $neutral-100;
}
@include media-breakpoint-up(xl) {
max-height: calc(100vh - 80px);
width: pxToRem(232);
@@ -134,7 +141,7 @@
color: $neutral-98;
}
a {
a:not(.table-of-contents__button) {
color: $neutral-70;
transition: all 0.3s;
&:hover {
@@ -8,8 +8,7 @@
justify-content: center;
align-items: center;
padding: $spacer * 2.5 0;
border-top: 1px solid $neutral-20;
border-bottom: 1px solid $neutral-20;
border-top: pxToRem(1) solid $neutral-20;
color: $neutral-98;
h4 {
@@ -22,6 +21,7 @@
}
&__bottom {
border-top: pxToRem(1) solid $neutral-20;
@extend .footer__bottom;
}
@@ -101,7 +101,7 @@
}
&.active {
.docs-menu__links-group-heading>a {
&>.docs-menu__links-group-heading>a {
font-weight: 600;
background-color: $neutral-30;
color: $neutral-90;
@@ -177,6 +177,34 @@
}
}
&__progress {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 math.div($spacer, 2);
&-container {
width: pxToRem(168);
height: pxToRem(10);
background-color: $neutral-20;
border-radius: $spacer;
overflow: hidden;
}
&-bar {
height: 100%;
border-radius: $spacer;
background-color: $primary-50;
}
&-text {
margin-bottom: 0;
font-size: $font-size-xs;
line-height: $font-size-l;
color: $neutral-70;
}
}
@include media-breakpoint-up(xl) {
display: block;
height: calc(100vh - 80px);
@@ -220,7 +248,7 @@
&__links-group {
&.active {
.docs-menu__links-group-heading>a {
&>.docs-menu__links-group-heading>a {
background-color: $neutral-20;
}
@@ -345,7 +373,7 @@
&__links-group {
&.active {
.docs-menu__links-group-heading>a {
&>.docs-menu__links-group-heading>a {
color: $neutral-30;
}
}
@@ -128,4 +128,25 @@ document.addEventListener('DOMContentLoaded', function () {
window.location.href = url;
});
});
function toggleAccordion() {
this.parentElement.classList.toggle('active');
const panel = this.nextElementSibling;
if (panel.style.maxHeight) {
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + 'px';
}
}
const accordionButtons = Array.from(document.getElementsByClassName('accordion__item-header'));
accordionButtons.forEach((el) => {
el.addEventListener('click', toggleAccordion);
});
const accordionDarkButtons = Array.from(document.getElementsByClassName('accordion-dark__item-header'));
accordionDarkButtons.forEach((el) => {
el.addEventListener('click', toggleAccordion);
});
});
@@ -19,4 +19,8 @@ import 'qdrant-page-search/dist/js/search.min.js';
if (/blog/.test(window.location?.pathname)) {
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'blog', partition: partition });
}
if (/course/.test(window.location?.pathname)) {
window.initQdrantSearch({ searchApiUrl: 'https://search.qdrant.tech/api/search', section: 'course', partition: partition });
}
})();
@@ -2,6 +2,15 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
{{ range .Data.Pages }}
<!-- TODO: remove this once we release the course -->
{{ if eq .Section "course" }}
{{ continue }}
{{ end }}
<!-- TODO: remove this once we release the course -->
{{- if and (or (eq (isset .Params "sitemapexclude") false) (ne .Params.sitemapExclude true)) (ne .Permalink "") }}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<main>
{{ partial "documentation/header" . }}
{{ partial "course/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
{{- partial "head.html" . -}}
<body>
<main>
{{ partial "documentation/header" . }}
{{ partial "course/content-layout" . }}
</main>
</body>
{{ partial "js.html" . }}
</html>
@@ -0,0 +1,74 @@
<!--course content layout, dedicated layout for course pages-->
<section class="docs documentation">
<div class="documentation__container">
<div class="d-flex flex-column flex-xl-row">
{{ partial "course/sidebar-menu.html" (dict "context" .) }}
<div class="documentation__content">
<div class="documentation__content-wrapper">
<div class="documentation__article-wrapper">
{{ if not (eq .RelPermalink "/course/") }}
{{ partial "documentation/breadcrumbs" . }}
{{ end }}
<article class="documentation-article">
{{ partial "article-content.html" . }}
{{ $parent := .Parent }}
{{ if or (eq .Params.isLesson true) (eq $parent.Params.isLesson true) }}
<div class="d-flex justify-content-lg-end pb-3 pt-4">
{{ $currentWeight := .Params.weight }}
{{ $targetWeight := add $currentWeight 1 }}
{{ $subject := site.GetPage "course" }}
{{ $allLessons := where $subject.Pages ".Params.isLesson" true }}
{{ $allVideos := slice }}
{{ range $lesson := $allLessons }}
{{ $allVideos = $allVideos | append $lesson.RegularPages }}
{{ end }}
{{ $allPages := $allLessons }}
{{ range $p := $allVideos }}
{{ $allPages = $allPages | append $p }}
{{ end }}
{{ $nextLesson := where $allPages ".Params.weight" $targetWeight }}
{{ if gt (len $nextLesson) 0 }}
{{ $currentPage := . }}
{{ $siblings := $currentPage.Parent.RegularPages }}
{{ $maxWeight := 0 }}
{{ range $p := $siblings }}
{{ if gt (int $p.Params.weight) $maxWeight }}
{{ $maxWeight = (int $p.Params.weight) }}
{{ end }}
{{ end }}
{{ $next := index $nextLesson 0 }}
<a
href="{{ $next.RelPermalink }}"
class="button button_contained button_sm"
>
{{ if eq (int $currentPage.Params.weight) $maxWeight }}
{{ $subject.Params.content.nextDay }} {{ .Parent.Title }}
{{ else }}
{{ $subject.Params.content.nextButton }}
{{ end }}
</a>
{{ end }}
</div>
{{ end }}
</article>
</div>
{{ partial "table-of-contents" . }}
{{ partial "documentation/footer.html" . }}
</div>
</div>
</div>
</div>
</section>
@@ -0,0 +1,142 @@
{{ $currentNode := .context }}
<div class="docs-menu">
<div id="sidebar" class="docs-menu__content">
<nav>
<div class="docs-menu__links-group">
<!--
If page is top-level, like /course we want to show sidebar with sub-pages of /course
If page is not top-level, like /course/essentials we want to show sidebar with sub-pages of /course/essentials
If page is any deeper that that, we want to show sidebar to one level higher than the current page
-->
{{ $pathSegments := split (trim $currentNode.RelPermalink "/") "/" }}
{{ $numLevels := len $pathSegments }}
{{ $subject := $currentNode }}
{{ if eq $numLevels 1 }}
{{ $subject = $currentNode }} <!-- top-level, `/course` -->
{{ else if eq $numLevels 2 }}
{{ $subject = $currentNode }} <!-- not top-level, `/course/essentials` -->
{{ else if eq $numLevels 3 }}
{{ $subject = $currentNode.Parent }} <!-- not top-level, `/course/essentials/day-0` -->
{{ else if eq $numLevels 4 }}
{{ $subject = $currentNode.Parent.Parent }} <!-- not top-level, `/course/essentials/day-0/introduction` -->
{{ else }}
{{ $subject = $currentNode.Parent.Parent.Parent }} <!-- not top-level, `/course/essentials/day-0/introduction/overview` -->
{{ end }}
{{ if and $subject $subject.Params $subject.Params.content $subject.Params.content.sidebarTitle }}
<p class="docs-menu__links-title">
{{ $subject.Params.content.sidebarTitle }}
</p>
{{ end }}
{{ if or (eq $currentNode.Params.isLesson true) (eq $currentNode.Parent.Params.isLesson true) }}
{{ $allLessons := where $subject.Pages ".Params.isLesson" true }}
{{ $total := len $allLessons }}
{{ if $total }}
{{ $currentIndex := 0 }}
{{ range $i, $p := $allLessons }}
{{ if eq $currentNode.Params.isLesson true }}
{{ if eq $p.Permalink $currentNode.Permalink }}
{{ $currentIndex = add $i 1 }}
{{ end }}
{{ else }}
{{ if eq $p.Permalink $currentNode.Parent.Permalink }}
{{ $currentIndex = add $i 1 }}
{{ end }}
{{ end }}
{{ end }}
{{ $percent := mul (div (float $currentIndex) (float $total)) 100 }}
{{ $percentStr := printf "%.0f" $percent }}
<div class="docs-menu__progress">
<div class="docs-menu__progress-container">
<div class="docs-menu__progress-bar" style="width: {{ $percentStr }}%;"></div>
</div>
<p class="docs-menu__progress-text">{{ $percentStr }}%</p>
</div>
{{ end }}
{{ end }}
{{ if and $subject $subject.Params $subject.Params.content $subject.Params.content.menuTitle }}
<div
class="
mt-3
docs-menu__articles-link
docs-menu__links-group-heading{{ if eq $currentNode.RelPermalink $subject.Params.content.menuTitle.url }} active{{ end }}
"
>
<a href="{{ $subject.Params.content.menuTitle.url }}">
{{ $subject.Params.content.menuTitle.text }}
</a>
</div>
{{ end }}
{{ range $subject.Pages }}
{{ if .IsSection }}
{{ $isActive := false }}
{{ $fileExistsAndMatchUniqueID := and .File $currentNode.File (eq .File.UniqueID $currentNode.File.UniqueID) }}
{{ range .RegularPages }}
{{ $fileExistsAndMatchUniqueIDSub := and .File $currentNode.File (eq .File.UniqueID $currentNode.File.UniqueID) }}
{{ if $fileExistsAndMatchUniqueIDSub }}
{{ $isActive = true }}
{{ end }}
{{ end }}
{{ if $fileExistsAndMatchUniqueID }}
{{ $isActive = true }}
{{ end }}
{{ $sectionLink := .Permalink }}
{{ if .Params.is_empty }}
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
{{ end }}
<details
class="docs-menu__links-group link-group {{ if $fileExistsAndMatchUniqueID }}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 .Pages }}
{{ $fileExistsAndMatchUniqueIDSub := and .File $currentNode.File (eq .File.UniqueID $currentNode.File.UniqueID) }}
<div
class="docs-menu__links-group {{ if $fileExistsAndMatchUniqueIDSub }}active{{ end }}"
>
<div class="docs-menu__links-group-heading">
<a href="{{ .Permalink }}">{{ .Title }}</a>
</div>
</div>
{{ end }}
</ul>
</nav>
</details>
{{ else }}
{{ $fileExistsAndMatchUniqueID := and .File $currentNode.File (eq .File.UniqueID $currentNode.File.UniqueID) }}
<div
class="docs-menu__links-group {{ if $fileExistsAndMatchUniqueID }}active{{ end }}"
>
<div class="docs-menu__links-group-heading">
<a href="{{ .Params.url }}">{{ .Title }}</a>
</div>
</div>
{{ end }}
{{ end }}
</div>
</nav>
</div>
</div>
@@ -6,7 +6,7 @@
<link href="{{ $splideCss.RelPermalink }}" rel="stylesheet" integrity="{{ $splideCss.Data.Integrity }}" />
{{ end }}
{{ if in (slice "blog" "docs" "documentation" "articles") .Section }}
{{ if in (slice "blog" "docs" "documentation" "articles" "course") .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" "articles") .Section }}
{{ if in (slice "docs" "documentation" "articles" "course") .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" "docs" "documentation" "benchmarks") .Section) }}
{{ if not (in (slice "hybrid-cloud" "docs" "documentation" "course" "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,11 +1,16 @@
{{ $currentPage := . }}
{{ with (.Site.GetPage "/headless/footer") }}
<footer class="docs-footer w-100 py-0 pt-0 pb-4 pb-xl-0">
{{ if not (eq $currentPage.Section "course") }}
<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>
{{ end }}
<div class="docs-footer__bottom">
<div class="docs-footer__bottom-content">
@@ -9,7 +9,7 @@
<script src="{{ $filterChartJs.RelPermalink }}"></script>
{{ end }}
{{ if in (slice "docs" "documentation" "articles") .Section }}
{{ if in (slice "docs" "documentation" "articles" "course") .Section }}
{{ $documentationJs := resources.Get "/js/documentation.js" | js.Build | minify | resources.Fingerprint "sha512" }}
<script src="{{ $documentationJs.RelPermalink }}"></script>
{{ end }}
@@ -78,17 +78,17 @@
</script>
{{ end }}
{{ if or (in (slice "docs" "documentation" "articles") .Section) (and (not .IsPage) (eq .Section "blog")) }}
{{ if or (in (slice "docs" "documentation" "articles" "course") .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 }}
{{ if and .IsPage (in (slice "blog" "articles" "benchmarks" "docs" "documentation") .Section) }}
{{ if and .IsPage (in (slice "blog" "articles" "course" "benchmarks" "docs" "documentation") .Section) }}
{{ $pageSearchScrollJs := resources.Get "/js/search/scroll.js" | js.Build | minify | resources.Fingerprint "sha512" }}
<script src="{{ $pageSearchScrollJs.RelPermalink }}"></script>
{{ end }}
{{ if in (slice "blog" "articles" "benchmarks" "docs" "documentation") .Section }}
{{ if in (slice "blog" "articles" "course" "benchmarks" "docs" "documentation") .Section }}
<!--popper.js for bootstrap-->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js"></script>
@@ -130,7 +130,7 @@
<script src="{{ $anchorJs.RelPermalink }}"></script>
{{ end }}
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") (eq .Section "articles") }}
{{ if or (eq .Section "blog") (eq .Section "docs") (eq .Section "documentation") (eq .Section "articles") (eq .Section "course") }}
<script>
document.addEventListener('keydown', function (event) {
if ((event.metaKey || event.ctrlKey) && event.key === 'k') {
@@ -144,24 +144,6 @@
</script>
{{ end }}
{{ if or (eq .Section "qdrant-for-startups") (eq .Section "cloud-inference") (eq .Section "edge-beta") }}
<script>
const accordionButtons = Array.from(document.getElementsByClassName('accordion__item-header'));
accordionButtons.forEach((el) => {
el.addEventListener('click', function () {
this.parentElement.classList.toggle('active');
const panel = this.nextElementSibling;
if (panel.style.maxHeight) {
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + 'px';
}
});
});
</script>
{{ end }}
{{ if and (eq .Section "blog") (.IsPage) }}
<script>
document.addEventListener("scroll", () => {
@@ -11,6 +11,18 @@
{{ .Fragments.ToHTML $tocStartLevel $tocEndLevel $tocOrdered | safeHTML }}
{{ if eq .Section "course" }}
{{ $subject := . }}
{{ if and $subject.Params $subject.Params.content $subject.Params.content.getStarted }}
<a
href="{{ $subject.Params.content.getStarted.url }}"
class="table-of-contents__button button button_contained button_sm"
>
{{ $subject.Params.content.getStarted.text }}
</a>
{{ end }}
{{ else }}
<ul class="table-of-contents__external-links">
{{ if or (eq .Section "documentation") (eq .Section "articles") }}
<li class="table-of-contents__link">
@@ -44,6 +56,7 @@
{{ end }}
</ul>
{{ end }}
</div>
{{ end }}
{{ end }}
@@ -0,0 +1,13 @@
{{ $data := .Inner | transform.Unmarshal }}
<div class="accordion-dark">
{{ range $data }}
<div class="accordion-dark__item">
<h6 class="accordion-dark__item-header">{{ .title }}</h6>
<div class="accordion-dark__item-body">
<div class="accordion-dark__item-body-content list">
{{ .content | markdownify }}
</div>
</div>
</div>
{{ end }}
</div>
@@ -0,0 +1,12 @@
{{ $data := .Inner | transform.Unmarshal }}
<div class="cards-list">
{{ range $data }}
<div class="cards-list__item">
<img class="cards-list__item-image" src="{{ .icon }}" alt="Icon">
<div class="cards-list__item-content">
<h6 class="cards-list__item-title">{{ .title }}</h6>
{{ .content | markdownify }}
</div>
</div>
{{ end }}
</div>
@@ -0,0 +1,16 @@
{{ $title := .Get "title" }}
{{ $type := .Get "type" }}
{{ $image := default "/icons/outline/training-white.svg" (.Get "image") }}
{{ $link := .Get "link" }}
<div class="course-card">
<h6 class="course-card__title">
<img src="{{ $image }}" alt="Icon">
{{ $title }}
</h6>
<div class="course-card__content list{{ if eq $type "wide-list" }} wide{{ end }}">
{{ .Inner | markdownify }}
</div>
{{ with $link }}
<a href="{{ $link }}" class="course-card__button button button_contained button_sm">Get Started</a>
{{ end }}
</div>
@@ -0,0 +1,4 @@
{{ $image := default "/icons/outline/date-blue.svg" (.Get "image") }}
<div class="date">
<img class="date-icon" src="{{ $image }}" alt="Calendar" /> {{ .Inner }}
</div>
@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10232_51857)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 0.666667C12 0.298477 11.7015 0 11.3333 0C10.9651 0 10.6667 0.298477 10.6667 0.666667V2H5.33333V0.666667C5.33333 0.298477 5.03486 0 4.66667 0C4.29848 0 4 0.298477 4 0.666667V2H0.666667C0.298477 2 0 2.29848 0 2.66667V5.33333V14.6667C0 15.0349 0.298477 15.3333 0.666667 15.3333H15.3333C15.7015 15.3333 16 15.0349 16 14.6667V5.33333V2.66667C16 2.29848 15.7015 2 15.3333 2H12V0.666667ZM14.6667 4.66667V3.33333H11.3333H4.66667H1.33333V4.66667H14.6667ZM1.33333 6H14.6667V14H1.33333V6ZM3.33333 7.33333C2.96514 7.33333 2.66667 7.63181 2.66667 8V8.66667C2.66667 9.03486 2.96514 9.33333 3.33333 9.33333H4.66667C5.03486 9.33333 5.33333 9.03486 5.33333 8.66667V8C5.33333 7.63181 5.03486 7.33333 4.66667 7.33333H3.33333ZM7.33333 7.33333C6.96514 7.33333 6.66667 7.63181 6.66667 8V8.66667C6.66667 9.03486 6.96514 9.33333 7.33333 9.33333H8.66667C9.03486 9.33333 9.33333 9.03486 9.33333 8.66667V8C9.33333 7.63181 9.03486 7.33333 8.66667 7.33333H7.33333ZM2.66667 11.3333C2.66667 10.9651 2.96514 10.6667 3.33333 10.6667H4.66667C5.03486 10.6667 5.33333 10.9651 5.33333 11.3333V12C5.33333 12.3682 5.03486 12.6667 4.66667 12.6667H3.33333C2.96514 12.6667 2.66667 12.3682 2.66667 12V11.3333ZM7.33333 10.6667C6.96514 10.6667 6.66667 10.9651 6.66667 11.3333V12C6.66667 12.3682 6.96514 12.6667 7.33333 12.6667H8.66667C9.03486 12.6667 9.33333 12.3682 9.33333 12V11.3333C9.33333 10.9651 9.03486 10.6667 8.66667 10.6667H7.33333ZM10.6667 8C10.6667 7.63181 10.9651 7.33333 11.3333 7.33333H12.6667C13.0349 7.33333 13.3333 7.63181 13.3333 8V8.66667C13.3333 9.03486 13.0349 9.33333 12.6667 9.33333H11.3333C10.9651 9.33333 10.6667 9.03486 10.6667 8.66667V8Z" fill="#2F6FF0"/>
</g>
<defs>
<clipPath id="clip0_10232_51857">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,8 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.4038 3.51709L17.4442 8.55709" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.3462 4.71716C7.91208 3.66883 4.79167 4.31508 2.5 7.23174L5.30583 10.0384" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M16.2646 10.6353C17.3129 13.0694 16.6667 16.1898 13.75 18.4815L10.9434 15.6757" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.74984 16.8149L4.1665 12.2316C4.1665 12.2316 7.87234 2.40411 19.1665 1.81494C18.5282 13.0599 8.74984 16.8149 8.74984 16.8149Z" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M11.2502 11.3983C12.1706 11.3983 12.9168 10.6521 12.9168 9.73161C12.9168 8.81113 12.1706 8.06494 11.2502 8.06494C10.3297 8.06494 9.5835 8.81113 9.5835 9.73161C9.5835 10.6521 10.3297 11.3983 11.2502 11.3983Z" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.86016 16.1747C2.25092 15.784 2.78089 15.5645 3.3335 15.5645C3.8861 15.5645 4.41608 15.784 4.80683 16.1747C5.19758 16.5655 5.4171 17.0955 5.4171 17.6481C5.4171 18.2007 5.19758 18.7306 4.80683 19.1214C3.99308 19.9347 0.833496 20.1481 0.833496 20.1481C0.833496 20.1481 1.04683 16.9885 1.86016 16.1747Z" stroke="#F0F3FA" stroke-width="1.66667" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,10 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_10387_4708)">
<path d="M19.166 14.1115C19.6263 14.1115 20 14.4842 20 14.9445C20 16.0495 19.5607 17.1094 18.7793 17.8907C17.9979 18.672 16.938 19.1115 15.833 19.1115H4.16602C3.06118 19.1113 2.00097 18.672 1.21973 17.8907C0.438522 17.1094 2.19432e-05 16.0494 0 14.9445C0 14.7235 0.0879879 14.5119 0.244141 14.3556C0.400344 14.1994 0.612112 14.1115 0.833008 14.1115H19.166ZM1.8125 15.7775C1.93561 16.1253 2.13259 16.4461 2.39844 16.712C2.86713 17.1807 3.50321 17.4443 4.16602 17.4445H15.833C16.496 17.4445 17.1318 17.1807 17.6006 16.712C17.8665 16.4461 18.0634 16.1253 18.1865 15.7775H1.8125ZM15.833 2.44446C16.496 2.44446 17.1327 2.70714 17.6016 3.1759C18.0703 3.64469 18.3329 4.2815 18.333 4.94446V11.6105C18.333 12.0707 17.9602 12.4445 17.5 12.4445C17.0398 12.4445 16.667 12.0707 16.667 11.6105V4.94446C16.6669 4.72353 16.5791 4.51084 16.4229 4.35461C16.2666 4.19841 16.054 4.11047 15.833 4.11047H4.16699C3.94604 4.11047 3.73342 4.19841 3.57715 4.35461C3.42093 4.51084 3.33307 4.72353 3.33301 4.94446V11.6105C3.33301 12.0707 2.96024 12.4445 2.5 12.4445C2.03976 12.4445 1.66699 12.0707 1.66699 11.6105V4.94446C1.66706 4.2815 1.92965 3.64469 2.39844 3.1759C2.86727 2.70714 3.50401 2.44446 4.16699 2.44446H15.833ZM12.5 9.11145L8.33301 11.6115V6.61145L12.5 9.11145Z" fill="#F0F3FA"/>
</g>
<defs>
<clipPath id="clip0_10387_4708">
<rect width="20" height="20" fill="white" transform="translate(0 0.777832)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB