Merge pull request #2188 from qdrant/new-prices-page

New prices page
This commit is contained in:
Bastian Hofmann
2026-03-12 11:00:44 +01:00
committed by GitHub
136 changed files with 3637 additions and 897 deletions
@@ -423,7 +423,7 @@ For ease of use, as one shouldn't need a machine learning degree to use a new fe
What you need is a Qdrant collection, an idea of which feedback model you'd like to use to guide your retriever, and, optionally, a small set of use case-specific queries (50–300).
We provide `QdrantRetriever` (using our [Free and Paid Tier Cloud Inference](https://qdrant.tech/documentation/cloud/inference/) or [FastEmbed](https://qdrant.tech/documentation/fastembed/) locally) and `FastembedFeedback` with bi-encoders, late interaction models, and cross-encoders as feedback model options.
We provide `QdrantRetriever` (using our [Cloud Inference](https://qdrant.tech/documentation/cloud/inference/) or [FastEmbed](https://qdrant.tech/documentation/fastembed/) locally) and `FastembedFeedback` with bi-encoders, late interaction models, and cross-encoders as feedback model options.
That said, you can define your own retrievers and feedback models, whatever works best for your data modality and use case.
@@ -0,0 +1,266 @@
---
title: Compare all Qdrant Cloud capabilities
description: A complete overview of the features available in each tier. See what's included in every plan and choose the setup that fits your use case and growth stage.
build:
render: always
badge:
text: For Hybrid/Private cloud
linkText: Speak to Our Engineers
url: /contact-us/
button:
text: Talk to our Team
url: /contact-us/
link:
text: Try our Pricing Calculator
url: /pricing/#calculator
tiers:
- id: oss
name: OSS
highlight: false
bold: false
- id: free
name: Free Tier
highlight: false
bold: false
- id: standard
name: Standard Tier
highlight: true
bold: true
- id: premium
name: Premium Tier
highlight: false
bold: true
sections:
- name: Core Vector Search Capabilities
features:
- name: Vector Similarity Search
oss: true
free: true
standard: true
premium: true
- name: Recommendations & Discovery
oss: true
free: true
standard: true
premium: true
- name: Quantization
oss: true
free: true
standard: true
premium: true
- name: Hybrid Search
oss: true
free: true
standard: true
premium: true
- name: Multi Vector Support
oss: true
free: true
standard: true
premium: true
- name: Sparse Vector Support
oss: true
free: true
standard: true
premium: true
- name: GPU Indexing
oss: true
free: false
standard: false
premium: false
- name: Cloud Inference
oss: false
free: Only free models
standard: true
premium: true
- name: Data Modeling & Storage
features:
- name: Multi-Tenancy
oss: true
free: true
standard: true
premium: true
- name: Deployment & Enterprise
features:
- name: Cloud Providers
oss: Depends on chosen infrastructure
free: AWS, Azure, GCP
standard: AWS, Azure, GCP
premium: AWS, Azure, GCP
- name: Uptime SLA
oss: false
free: false
standard: "99.5"
premium: "99.9"
- name: Developer Experience
features:
- name: Database Web UI
oss: true
free: true
standard: true
premium: true
- name: Multi-Cluster Management UI
oss: false
free: true
standard: true
premium: true
- name: Automation
oss: false
free: API, Terraform, Pulumi
standard: API, Terraform, Pulumi
premium: API, Terraform, Pulumi
- name: Querying / Ranking
features:
- name: Advanced Payload Filtering (Incl. Geo and Full-Text)
oss: true
free: true
standard: true
premium: true
- name: Complex Payload Support
oss: true
free: true
standard: true
premium: true
- name: Multi-Staged Queries
oss: true
free: true
standard: true
premium: true
- name: Score Boosting
oss: true
free: true
standard: true
premium: true
- name: Scalability & Operations
features:
- name: Vertical Up & Downscaling
oss: No resource usage safe guards
free: false
standard: true
premium: true
- name: Horizontal Up & Downscaling
oss: No automated shard rebalancing
free: false
standard: true
premium: true
- name: Highly Availabe Setup
oss: true
free: false
standard: true
premium: true
- name: Disk Performance Tiers
oss: Depends on chosen infrastructure
free: false
standard: (AWS only)
premium: (AWS only)
- name: Shard Splitting
oss: false
free: false
standard: true
premium: true
- name: Zero Downtime Upgrades
oss: Custom automation
free: false
standard: true
premium: true
- name: Optimized Cluster Restarts
oss: false
free: false
standard: true
premium: true
- name: Monitoring & Alerting
oss: Manual setup
free: true
standard: true
premium: true
- name: Backups & Disaster Recovery
oss: Custom automation
free: false
standard: true
premium: true
- name: Dedicated Engineering Support During Migration
oss: false
free: false
standard: false
premium: true
- name: Collection Snapshots
oss: true
free: true
standard: true
premium: true
- name: Security & Compliance
features:
- name: Create New Clusters from Backups
oss: Custom automation
free: false
standard: true
premium: true
- name: JWT Based RBAC
oss: true
free: true
standard: true
premium: true
- name: Built-in API Key Revocation
oss: false
free: true
standard: true
premium: true
- name: SOC2 Type 2
oss: false
free: true
standard: true
premium: true
- name: HIPAA
oss: false
free: false
standard: true
premium: true
- name: Encryption at Rest and in Transit
oss: Depends on chosen infrastructure
free: true
standard: true
premium: true
- name: Disk Encryption with Custom Key
oss: Depends on chosen infrastructure
free: false
standard: false
premium: (AWS only)
- name: Enterprise SSO Authentication
oss: false
free: false
standard: false
premium: true
- name: Private VPC Links
oss: false
free: false
standard: false
premium: true
- name: Support Level
oss: Community
free: Community
standard: Standard
premium: Premium
- name: Support Response Times
oss: false
free: Best effort
standard: 10x5
premium: 24x7
ctas:
- tier: oss
text: Start Free
url: https://cloud.qdrant.io
contained: false
- tier: free
text: Start Free
url: https://cloud.qdrant.io
contained: false
- tier: standard
text: Deploy on Cloud
url: https://cloud.qdrant.io
contained: true
- tier: premium
text: Deploy on Cloud
url: /contact-us/
contained: false
sitemapExclude: true
---
@@ -1,6 +1,6 @@
---
titleFirstPart: Not sure which plan is right for you?
titleSecondPart: Check out our pricing calculator.
title: Not sure how large your cluster needs to be?
linkPrefix: Try our
link:
url: https://cloud.qdrant.io/calculator
text: Pricing Calculator
@@ -0,0 +1,8 @@
---
title: Engines Ready. Awaiting Your Command.
description: Cloud Quickstart - spin up a cluster in seconds.
button:
text: Start Building for Free
url: https://cloud.qdrant.io
sitemapExclude: true
---
@@ -1,79 +1,100 @@
---
cards:
- id: 0
popular: true
title: Managed Cloud
price: Starting at $0
description: Starts with 1GB free cluster, no credit card required.
button:
text: Start Free
url: https://cloud.qdrant.io
contained: true
featureDescription: Scale your production solutions without deployment and upkeep.
featureLink:
text: Calculate your usage.
url: https://cloud.qdrant.io/calculator
features:
- id: 0
content: 1GB free forever cluster. No credit card required.
- id: 1
content: Fully managed with central cluster management
- id: 2
content: Multiple cloud providers and regions (AWS, GCP, Azure)
- id: 3
content: Horizontal & vertical scaling
- id: 4
content: Central monitoring, log management and alerting
- id: 5
content: High availability, auto-healing
- id: 6
content: Backup & disaster recovery
- id: 7
content: Zero-downtime upgrades
- id: 8
content: Unlimited users
- id: 9
content: Standard support and uptime SLAs, can be upgraded to Premium
# - id: 10
# content: Can be upgraded to premium support plan
- id: 1
popular: false
title: Hybrid Cloud
price: Custom
description: Price on request.
button:
text: Contact Us
url: /contact-us/
contained: false
featureDescription: Bring your own cluster from any cloud provider, on-premise infrastructure, or edge locations and connect them to the managed cloud.
features:
- id: 0
content: All the benefits of Qdrant Cloud
- id: 1
content: Security, data isolation, optimal latency
- id: 2
content: Use the Managed Cloud Central Cluster Management
- id: 3
content: Standard support and uptime SLAs, can be upgraded to Premium
# minPrice: <span>*</span>Min $99 / month
- id: 2
popular: false
title: Private Cloud
price: Custom
description: Price on request.
button:
text: Contact Us
url: /contact-us/
contained: false
featureDescription: Deploy Qdrant fully on premise for maximum control and data sovereignty.
features:
- id: 0
content: All the benefits of Hybrid Cloud
- id: 1
content: Security, data isolation, optimal latency
- id: 2
content: Manage Qdrant database clusters on your infrastructure, in the cloud, on-premise at the edge, even fully air-gapped without a connection to Qdrant Cloud
- id: 3
content: Premium Support Plan
tabs:
- id: managed
label: Managed
active: true
tiers:
- id: free
title: Free Tier
pricing: Free forever
pricingNote: (No credit card required)
target: For testing, and prototypes
features:
- Single Node Cluster
- 0.5 vCPU / 1GB RAM/ 4 GB Disk.
- Free Cloud Inference With Selected Models
cta:
text: Start Free
url: https://cloud.qdrant.io
style: outlined
- id: paid
title: Standard Tier
pricing: Usage-based pricing
target: For production workloads and scaling applications
features:
- Dedicated Resources
- Flexible Vertical and Horizontal Scaling
- Highly Available Setups
- Backup & Disaster Recovery
- Free Tokens for Paid Inference Models
- 99.5% Uptime SLA
marketplace:
label: Subscribe on Marketplace.
logos:
- name: AWS
icon: aws
- name: Google Cloud
icon: gcp
- name: Azure
icon: azure
cta:
text: Deploy on Cloud
url: https://cloud.qdrant.io
style: contained
- id: premium
title: Premium Tier
pricing: Minimum spend required
pricingNote: Committed Usage
target: For enterprises with additional security and compliance needs
features:
- SSO
- Private VPC Links
- 99.9% Uptime SLA
- Extra Support
cta:
text: Talk to Our Engineers
url: /contact-us/
style: outlined
- id: on-premise
label: On-Premise
active: false
tiers:
- id: hybrid-cloud
title: Hybrid Cloud
badge: true
target: Run managed Qdrant clusters on your own infrastructure using your compute, network and storage.
featureGroups:
- label: "Best for:"
items:
- Local Data Residency
- Regulated Workloads
- Easy Operations in Your Own Cloud
- label: "Benefits:"
items:
- Data Stays in Your Network
- Fully Managed Through Qdrant Cloud
- Production-Grade Uptime
cta:
text: Talk to Our Engineers
url: /contact-us/
style: contained
- id: private-cloud
title: Private Cloud
badge: true
target: "Dedicated, isolated deployment for strict security or compliance needs."
featureGroups:
- label: "Best for:"
items:
- Large Enterprises
- Sensitive Workloads
- Air-Gapped Setups
- label: "Benefits:"
items:
- Custom SLAs
- Full Isolation
cta:
text: Talk to Our Engineers
url: /contact-us/
style: contained
sitemapExclude: true
---
@@ -0,0 +1,17 @@
---
title: FAQs
questions:
- question: What Happens if I Exceed Free Tier Limits?
answer: If your data size growth exceeds the Free Tier limits (1GB RAM and 4GB disk), you can easily upgrade to a Standard Tier and scale up your cluster.
- question: How Does Qdrant Cloud Pricing Work
answer: Qdrant Cloud pricing is based on resource usage, if you have a bigger cluster, you pay for more. The free tier includes 1GB RAM and 4GB disk storage, upgrading will get you a dedicated cluster.
- question: Can I Migrate from OSS to Qdrant Cloud?
answer: Yes, you can easily migrate your existing Qdrant OSS deployment to Qdrant Cloud. We provide a migration tool and documentation to help you transition smoothly.
- question: How Do I Choose Between Free Tier and Standard Tier?
answer: The Free Tier is ideal for testing, and prototypes being limited to 1GB RAM and 4GB disk without high availability. Choose the Standard Tier for workloads that require dedicated clusters, higher availability, and advanced features.
- question: What's the Difference Between Managed, Hybrid, and Private Cloud?
answer: Managed Cloud is fully managed by Qdrant. Hybrid Cloud lets you bring your own infrastructure while using Qdrant's management plane. Private Cloud gives you complete control with on-premise deployment.
- question: How Is Billing Calculated Month-to-Month?
answer: Billing is calculated based on actual resource usage during the billing period. You're charged for compute (vCPU), memory (GB), storage (GB) consumed by your clusters, storage (GB) consumed by backups, and used inference tokens of paid models. Usage is billed hourly, and you can monitor it through the Qdrant Cloud dashboard.
sitemapExclude: true
---
@@ -0,0 +1,119 @@
---
title: Features by Tier
tables:
- id: managed
label: Managed
tiers:
- id: oss
name: OSS
highlight: false
bold: false
- id: free
name: Free Tier
highlight: false
bold: false
- id: standard
name: Standard Tier
highlight: true
bold: true
- id: premium
name: Premium Tier
highlight: false
bold: true
sections:
- name: Features
features:
- name: Cloud Inference
oss: false
free: Only free and external models
standard: true
premium: true
- name: Cloud Providers
oss: Depends on chosen infrastructure
free: AWS, Azure, GCP
standard: AWS, Azure, GCP
premium: AWS, Azure, GCP
- name: Uptime SLA
oss: false
free: false
standard: "99.5"
premium: "99.9"
- name: Automation
oss: false
free: API, Terraform, Pulumi
standard: API, Terraform, Pulumi
premium: API, Terraform, Pulumi
- name: Vertical Up & Downscaling
oss: No resource usage safe guards
free: false
standard: true
premium: true
- name: Horizontal Up & Downscaling
oss: No automated shard rebalancing
free: false
standard: true
premium: true
- name: Backup & Disaster Recovery
oss: Custom automation
free: false
standard: true
premium: true
- name: Shard Splitting
oss: false
free: false
standard: true
premium: true
- name: Support Level
oss: Community
free: Community
standard: Standard
premium: Premium
- name: Support Response Times
oss: false
free: Best effort
standard: 10x5
premium: 24x7
- name: Encryption at Rest and in Transit
oss: Depends on chosen infrastructure
free: true
standard: true
premium: true
- name: Disk Encryption with Custom Key
oss: Depends on chosen infrastructure
free: false
standard: false
premium: (AWS only)
- name: Private VPC Links
oss: N/A
free: false
standard: false
premium: true
- name: Enterprise SSO Authentication
oss: false
free: false
standard: false
premium: true
ctas:
- tier: oss
text: Start Free
url: https://cloud.qdrant.io
contained: false
- tier: free
text: Start Free
url: https://cloud.qdrant.io
contained: false
- tier: standard
text: Deploy on Cloud
url: https://cloud.qdrant.io
contained: true
- tier: premium
text: Deploy on Cloud
url: /contact-us/
contained: false
compareButton:
text: Compare All Features
url: /pricing/comparison/
sitemapExclude: true
---
@@ -1,6 +1,11 @@
---
title: Qdrant Pricing
subtitle: Cloud & Enterprise solutions
description: Choose the deployment option for your application and explore our transparent pricing plans.
title: Qdrant Cloud Pricing
description: Start free. Scale to production with fully managed vector search. Meet all enterprise security and compliance requirements.
button:
text: Talk to our Team
url: /contact-us/
link:
text: Try our Pricing Calculator
url: https://cloud.qdrant.io/calculator
sitemapExclude: true
---
@@ -137,15 +137,15 @@ $font-sizes-text: (
$font-size-sm: $font-size-s;
$font-size-lg: $font-size-l;
$font-weight-lighter: lighter !default;
$font-weight-light: 300 !default;
$font-weight-normal: 350 !default;
$font-weight-medium: 500 !default;
$font-weight-semibold: 600 !default;
$font-weight-bold: 700 !default;
$font-weight-bolder: bolder !default;
$font-weight-lighter: lighter !default;
$font-weight-light: 300 !default;
$font-weight-normal: 350 !default;
$font-weight-medium: 500 !default;
$font-weight-semibold: 600 !default;
$font-weight-bold: 700 !default;
$font-weight-bolder: bolder !default;
$font-weight-base: $font-weight-normal !default;
$font-weight-base: $font-weight-normal !default;
$line-height-sm: pxToRem(21);
$line-height-lg: pxToRem(27);
@@ -1,5 +1,5 @@
@use '../helpers/functions' as *;
@use "sass:math";
@use 'sass:math';
.course-card {
width: 100%;
@@ -1,5 +1,5 @@
@use '../helpers/functions' as *;
@use "sass:math";
@use 'sass:math';
.date {
display: flex;
@@ -1,5 +1,5 @@
@use '../helpers/functions' as *;
@use "sass:math";
@use 'sass:math';
.list {
color: $neutral-70;
@@ -18,7 +18,7 @@
}
&:before {
content: "";
content: '';
position: absolute;
left: 0;
top: pxToRem(5);
@@ -13,4 +13,4 @@
@import 'partials/feedback';
@import 'partials/documentation/docs-footer';
@import 'partials/video';
@import 'search/dark-theme';
@import 'search/dark-theme';
@@ -5,4 +5,3 @@
font-display: swap;
font-style: normal;
}
@@ -13,4 +13,3 @@
font-display: swap;
font-style: italic;
}
@@ -1,15 +1,15 @@
@font-face {
font-family: 'Overpass Mono';
font-style: normal;
font-weight: 300 700;
font-display: swap;
src: url('/fonts/overpass_mono/overpass-mono-variable-font_wght.ttf') format('truetype');
font-family: 'Overpass Mono';
font-style: normal;
font-weight: 300 700;
font-display: swap;
src: url('/fonts/overpass_mono/overpass-mono-variable-font_wght.ttf') format('truetype');
}
@font-face {
font-family: 'Overpass Mono';
font-style: italic;
font-weight: 300 700;
font-display: swap;
src: url('/fonts/overpass_mono/overpass-mono-variable-font_wght.ttf') format('truetype');
}
font-family: 'Overpass Mono';
font-style: italic;
font-weight: 300 700;
font-display: swap;
src: url('/fonts/overpass_mono/overpass-mono-variable-font_wght.ttf') format('truetype');
}
@@ -19,13 +19,7 @@
@import 'partials/testimonial';
@import 'partials/enterprise-solutions-challenges';
@import 'partials/top-and-bottom-overlay';
@import 'partials/qdrant-pricing-hero';
@import 'partials/qdrant-pricing-calculator';
@import 'partials/qdrant-pricing-docker-deploy';
@import 'partials/qdrant-pricing-doors-a';
@import 'partials/qdrant-pricing-doors-b';
@import 'partials/qdrant-pricing-marketplaces';
@import 'partials/pricing-door';
@import 'partials/pricing/index';
@import 'partials/get-contacted-with-question';
@import 'partials/private-cloud-hero';
@import 'partials/private-cloud-about';
@@ -33,7 +27,6 @@
@import 'partials/qdrant-cloud-hero';
@import 'partials/qdrant-cloud-bento-cards';
@import 'partials/qdrant-cloud-marketplaces';
@import 'partials/qdrant-pricing-get-contacted';
@import 'partials/qdrant-cloud-features-link';
@import 'partials/video';
@import 'partials/customer-list';
@@ -11,7 +11,7 @@
padding-bottom: $spacer * 4;
&:after {
content: "";
content: '';
display: block;
position: absolute;
width: 100%;
@@ -17,6 +17,8 @@
margin-bottom: 0;
padding: math.div($spacer, 4) $spacer * 3 math.div($spacer, 4) 0;
color: $neutral-20;
line-height: 1.3;
letter-spacing: -0.5px;
cursor: pointer;
&:after {
@@ -47,7 +49,7 @@
margin-bottom: $spacer * 2.5;
ul {
list-style-type: "- ";
list-style-type: '- ';
padding-left: pxToRem(14);
}
@@ -64,6 +66,19 @@
}
}
@include media-breakpoint-down(md) {
&__item {
&-header {
min-height: pxToRem(98);
padding: $spacer $spacer * 1.5 $spacer 0;
font-size: pxToRem(24);
font-weight: 600;
line-height: 1.3;
letter-spacing: -0.5px;
}
}
}
@include media-breakpoint-up(lg) {
&__item {
&-header {
@@ -20,10 +20,12 @@
bottom: 0;
width: 100%;
height: pxToRem(376);
background-image: url('/img/blurred/blurred-light-24.png'),
url('/img/blurred/blurred-light-25.png'),
url('/img/blurred/blurred-light-26.png');
background-position: top left, bottom left, bottom right;
background-image: url('/img/blurred/blurred-light-24.png'), url('/img/blurred/blurred-light-25.png'),
url('/img/blurred/blurred-light-26.png');
background-position:
top left,
bottom left,
bottom right;
background-size: contain, contain, contain;
background-repeat: no-repeat;
z-index: 1;
@@ -36,9 +38,12 @@
right: -20%;
bottom: -9px;
display: flex;
background-image: linear-gradient(270deg, rgba(11, 15, 25, 0.00) 26.48%, #0B0F19 87.55%), url('/img/square-grid-black.svg');
background-image: linear-gradient(270deg, rgba(11, 15, 25, 0) 26.48%, #0b0f19 87.55%),
url('/img/square-grid-black.svg');
background-size: cover, contain;
background-position: center right, center right;
background-position:
center right,
center right;
background-repeat: no-repeat, no-repeat;
z-index: 0;
}
@@ -59,7 +64,7 @@
}
@include media-breakpoint-up(xl) {
right: 0;
right: 0;
}
}
@@ -71,7 +76,7 @@
display: flex;
flex-direction: column;
gap: pxToRem(32);
@include media-breakpoint-up(lg) {
max-width: pxToRem(560);
}
@@ -30,6 +30,7 @@
&__content {
position: relative;
padding: $spacer * 2.5 $spacer * 3;
padding-bottom: pxToRem(450);
z-index: 1;
}
@@ -41,17 +42,59 @@
}
&__title {
margin: 0 0 0.75rem;
margin: 0 0 $spacer;
font-size: $spacer * 2;
line-height: pxToRem(38);
letter-spacing: -0.5px;
color: $neutral-98;
}
&__description {
margin: 0 0 1.5rem;
margin: 0 0 $spacer * 2;
font-size: pxToRem(18);
line-height: 1;
color: $neutral-70;
line-height: 1.5;
letter-spacing: -0.2px;
color: $neutral-90;
}
&__illustration {
display: block;
position: absolute;
left: auto;
right: -10%;
bottom: 0;
pointer-events: none;
img {
height: 100%;
width: auto;
}
}
@include media-breakpoint-down(md) {
padding-top: $spacer * 5;
padding-bottom: $spacer * 5;
&__content {
padding: $spacer * 5 $spacer * 1.25;
padding-bottom: pxToRem(400);
}
&__title {
margin: 0 0 $spacer;
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
}
&__description {
margin: 0 0 $spacer * 2;
font-size: pxToRem(20);
font-weight: 400;
line-height: 1.5;
letter-spacing: -0.2px;
}
}
&__button {
@@ -59,7 +102,18 @@
}
&__illustration {
display: none;
display: block;
right: 0;
&::before {
display: block;
content: '';
height: 50px;
background: linear-gradient(to bottom, #0c1220, 30%, transparent);
position: absolute;
left: 0;
right: 0;
z-index: 1;
}
}
@include media-breakpoint-up(lg) {
@@ -67,7 +121,7 @@
padding-bottom: $spacer * 7.5;
&__content {
padding: $spacer * 2.5 $spacer * 5;
padding: $spacer * 3 $spacer * 4;
}
&__text {
@@ -83,11 +137,13 @@
&__description {
font-size: pxToRem(20);
line-height: pxToRem(30);
line-height: 1.5;
}
&__illustration {
display: block;
&::before {
display: none;
}
position: absolute;
right: 0;
top: 0;
@@ -95,7 +151,6 @@
pointer-events: none;
img {
display: block;
height: 100%;
width: auto;
}
@@ -6,11 +6,12 @@
padding-top: $spacer * 4;
padding-bottom: $spacer * 4;
background: radial-gradient(
ellipse 120% 80% at 0% 0%,
rgba(231, 29, 95, 0.12) 0%,
rgba(133, 71, 255, 0.06) 40%,
transparent 70%
), $neutral-10;
ellipse 120% 80% at 0% 0%,
rgba(231, 29, 95, 0.12) 0%,
rgba(133, 71, 255, 0.06) 40%,
transparent 70%
),
$neutral-10;
&__lights-overlay {
position: absolute;
@@ -36,11 +36,13 @@
font-family: $font-family-base;
}
[data-hsfc-id=Renderer] .hsfc-Step .hsfc-Step__Content {
[data-hsfc-id='Renderer'] .hsfc-Step .hsfc-Step__Content {
padding: $spacer * 1.5;
}
.hsfc-RichText span, .hsfc-FieldLabel span, .hsfc-ProgressBar__Text {
.hsfc-RichText span,
.hsfc-FieldLabel span,
.hsfc-ProgressBar__Text {
font-size: $font-size-s !important;
line-height: $line-height-sm !important;
color: $neutral-98 !important;
@@ -50,7 +52,8 @@
margin-bottom: $spacer * 0.5 !important;
}
[data-hsfc-id=Renderer] .hsfc-TextInput, [data-hsfc-id=Renderer] .hsfc-TextareaInput {
[data-hsfc-id='Renderer'] .hsfc-TextInput,
[data-hsfc-id='Renderer'] .hsfc-TextareaInput {
display: block;
background-color: transparent;
border: pxToRem(1) solid $neutral-50;
@@ -61,7 +64,8 @@
color: $neutral-98;
border-radius: $spacer * 0.5;
&:focus, &:active {
&:focus,
&:active {
box-shadow: none !important;
}
@@ -70,13 +74,13 @@
}
}
[data-hsfc-id=Renderer] .hsfc-ErrorAlert {
[data-hsfc-id='Renderer'] .hsfc-ErrorAlert {
font-size: $font-size-xs;
line-height: $font-size-l;
color: $primary-40;
}
[data-hsfc-id=Renderer] .hsfc-Button {
[data-hsfc-id='Renderer'] .hsfc-Button {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -153,7 +157,7 @@
}
&__container {
[data-hsfc-id=Renderer] .hsfc-Step .hsfc-Step__Content {
[data-hsfc-id='Renderer'] .hsfc-Step .hsfc-Step__Content {
padding: $spacer * 4;
}
}
@@ -53,7 +53,8 @@
line-height: pxToRem(67);
}
&__subtitle, &__description {
&__subtitle,
&__description {
max-width: pxToRem(500);
}
}
@@ -56,7 +56,7 @@
&:nth-of-type(4) {
& > div {
&:before {
content: "";
content: '';
display: block;
height: 100%;
width: pxToRem(1);
@@ -72,7 +72,7 @@
&:nth-of-type(2) {
& > div {
&:after {
content: "";
content: '';
display: block;
width: 100%;
height: pxToRem(1);
@@ -22,10 +22,10 @@
grid-template-columns: 1fr;
gap: $spacer * 1.5;
grid-template-areas:
"compliance"
"management"
"api"
"observability";
'compliance'
'management'
'api'
'observability';
}
&__card {
@@ -101,8 +101,8 @@
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
grid-template-areas:
"compliance management management"
"compliance api observability";
'compliance management management'
'compliance api observability';
}
&__card {
@@ -60,7 +60,7 @@
margin-left: auto;
&:before {
content: "";
content: '';
display: block;
height: 100%;
width: pxToRem(1);
@@ -76,7 +76,7 @@
&:nth-of-type(2) {
& > div {
&:after {
content: "";
content: '';
display: block;
width: calc(100% - pxToRem(32));
height: pxToRem(1);
@@ -119,7 +119,8 @@
}
}
&-title, &-description {
&-title,
&-description {
margin-bottom: $spacer * 1.5;
}
}
@@ -132,7 +133,8 @@
padding: 0 $spacer * 4 0 $spacer * 3;
}
&-title, &-description {
&-title,
&-description {
margin-bottom: pxToRem(12);
}
@@ -47,7 +47,7 @@
}
&-section {
width: calc(50% - math.div($spacer, 2))
width: calc(50% - math.div($spacer, 2));
}
&-section-title {
@@ -1,19 +1,19 @@
.go-to-top-button {
position: fixed;
bottom: 20px;
right: 20px;
position: fixed;
bottom: 20px;
right: 20px;
color: $neutral-30;
background: $neutral-94;
z-index: 10;
transition: background-color 0.3s;
[data-theme='light'] & {
color: $neutral-30;
background: $neutral-94;
z-index: 10;
transition: background-color 0.3s;
}
[data-theme="light"] & {
color: $neutral-30;
background: $neutral-94;
}
[data-theme="dark"] & {
color: $neutral-94;
background: $neutral-30;
}
}
[data-theme='dark'] & {
color: $neutral-94;
background: $neutral-30;
}
}
@@ -17,7 +17,7 @@
transition:
all 0.3s ease-in-out,
color 0.1s linear;
padding-right: $icon-width;
padding-right: calc($icon-width + 6px);
&:before {
display: block;
@@ -52,7 +52,6 @@
}
&:hover {
padding-right: calc($icon-width + 6px);
&:after {
animation: dash 0.3s ease-in-out forwards;
}
@@ -205,7 +204,6 @@
}
}
// font-size
&_inherit {
font-size: inherit;
@@ -29,7 +29,7 @@
&:before,
&:after {
content: "";
content: '';
display: block;
position: absolute;
width: 100%;
@@ -41,7 +41,7 @@
margin-bottom: $spacer * 5;
}
&__extra-block{
&__extra-block {
display: flex;
flex-direction: column;
gap: $spacer * 2;
@@ -71,7 +71,7 @@
text-align: center;
&:before {
content: "";
content: '';
display: block;
position: absolute;
width: 100%;
@@ -116,7 +116,7 @@
margin-bottom: $spacer * 7.5;
}
&__extra-block{
&__extra-block {
flex-direction: row;
justify-content: space-between;
align-items: center;
@@ -36,7 +36,8 @@
line-height: pxToRem(27);
color: $neutral-40;
strong, b {
strong,
b {
font-weight: 600;
color: $neutral-20;
}
@@ -72,7 +72,7 @@
}
form {
&.hs-form>fieldset {
&.hs-form > fieldset {
margin-bottom: 0;
}
@@ -86,13 +86,13 @@
margin-top: pxToRem(12);
margin-bottom: $spacer * 2.5;
input[type=submit] {
input[type='submit'] {
width: 100%;
}
}
&.hs-form>fieldset.form-columns-2 {
gap: 0
&.hs-form > fieldset.form-columns-2 {
gap: 0;
}
fieldset:last-of-type {
@@ -1,45 +0,0 @@
@use '../helpers/functions' as *;
.qdrant-pricing-calculator {
padding-bottom: $spacer * 4;
background-color: $neutral-10;
color: $neutral-98;
text-align: center;
&__title {
font-size: pxToRem(20);
line-height: pxToRem(30);
margin-bottom: 0;
}
&__link {
margin-top: $spacer * 1.5;
}
@include media-breakpoint-up(xl) {
padding-bottom: $spacer * 7.5;
&__content {
position: relative;
&:before,
&:after {
content: ('');
display: block;
position: absolute;
top: pxToRem(29.5);
height: pxToRem(1);
width: calc((100% - 453px) / 2);
background-color: $neutral-30;
}
&:before {
left: 0;
}
&:after {
right: 0;
}
}
}
}
@@ -1,32 +0,0 @@
@use '../helpers/functions' as *;
.qdrant-pricing-doors-b {
padding-bottom: $spacer * 4;
padding-top: $spacer * 4;
background-color: $neutral-10;
&__doors {
display: flex;
flex-direction: column;
gap: pxToRem(30);
width: 100%;
}
@include media-breakpoint-up(xl) {
padding-bottom: $spacer * 5;
padding-top: $spacer * 5;
&__doors {
flex-direction: row;
justify-content: space-between;
}
&__door {
width: calc((100% / 3) - 20px);
.pricing-door__description {
height: pxToRem(42);
}
}
}
}
@@ -1,46 +0,0 @@
@use '../helpers/functions' as *;
.qdrant-pricing-hero {
padding-top: $spacer * 2.5;
background-color: $neutral-10;
color: $neutral-98;
text-align: center;
&__title {
font-size: $spacer * 2;
line-height: pxToRem(38);
margin-bottom: $spacer;
}
&__subtitle {
font-size: $spacer * 1.5;
line-height: pxToRem(34);
margin-bottom: $spacer;
}
&__description {
margin-bottom: 0;
color: $neutral-70;
}
@include media-breakpoint-up(xl) {
padding-top: $spacer * 5;
&__title {
font-size: $spacer * 3;
line-height: pxToRem(57);
margin-bottom: $spacer * 1.5;
}
&__subtitle {
font-size: $spacer * 2;
line-height: pxToRem(38);
margin-bottom: $spacer * 1.5;
}
&__description {
font-size: pxToRem(18);
line-height: pxToRem(27);
}
}
}
@@ -33,7 +33,7 @@
margin-bottom: 0;
}
form.hs-form>fieldset {
form.hs-form > fieldset {
margin-bottom: 0;
}
@@ -48,8 +48,8 @@
margin-bottom: $spacer * 0.5;
}
form.hs-form>fieldset.form-columns-2 {
gap: 0
form.hs-form > fieldset.form-columns-2 {
gap: 0;
}
fieldset:last-of-type {
@@ -30,7 +30,7 @@
margin-bottom: 0;
font-size: pxToRem(14);
line-height: pxToRem(21);
font-weight: $font-weight-base;
font-weight: $font-weight-base;
color: $neutral-90;
}
}
@@ -94,7 +94,7 @@
flex-direction: column;
.hs_email {
& > label {
& > label {
display: block;
margin-bottom: pxToRem(6);
font-size: pxToRem(14);
@@ -103,8 +103,8 @@
}
}
.button {
width: 100%;
margin-top: $spacer * 1.5;
width: 100%;
margin-top: $spacer * 1.5;
}
.hs_error_rollup {
top: 0;
@@ -114,7 +114,6 @@
.submitted-message {
text-align: center;
}
}
&-header {
@@ -73,7 +73,7 @@
line-height: pxToRem(21);
color: $neutral-50;
}
[data-theme="light"] & {
[data-theme='light'] & {
&-about {
color: $neutral-30;
}
@@ -82,7 +82,7 @@
}
&-description {
color: $neutral-50;
font-weight: $font-weight-base;
font-weight: $font-weight-base;
}
}
}
@@ -122,7 +122,7 @@
}
}
[data-theme="light"] & {
[data-theme='light'] & {
&__title {
color: $neutral-30;
}
@@ -11,7 +11,6 @@
}
.main-menu {
&__links {
margin-right: auto;
padding-left: 0;
@@ -70,7 +69,7 @@
padding: $spacer * 0.5;
border-radius: $spacer * 0.5;
z-index: 1;
background: linear-gradient($neutral-30, #141B2E);
background: linear-gradient($neutral-30, #141b2e);
}
&__items {
@@ -159,7 +158,7 @@
background: url('/img/qdrant-logo-red-black.svg') no-repeat left bottom;
background-size: 120px 32px;
img {
display: none;
display: none;
}
}
}
@@ -104,7 +104,7 @@
font-size: $spacer * 2;
line-height: $spacer * 2.5;
padding: 0;
margin-bottom: math.div($spacer, 2);
margin-bottom: math.div($spacer, 2);
}
h3 {
@@ -271,7 +271,8 @@
}
}
.docs-core__developing-block {
h1, h3 {
h1,
h3 {
color: $neutral-98;
}
p {
@@ -18,7 +18,7 @@
&:hover {
color: $neutral-90;
svg path {
stroke: $neutral-90;
stroke: $neutral-90;
}
}
}
@@ -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;
@@ -181,7 +181,7 @@
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 math.div($spacer, 2);
padding: 0 math.div($spacer, 2);
&-container {
width: pxToRem(168);
@@ -232,7 +232,7 @@
}
}
&> :last-child {
& > :last-child {
padding-bottom: $spacer;
border-bottom: pxToRem(1) solid $neutral-20;
}
@@ -245,10 +245,9 @@
}
}
&__links-group {
&.active {
&>.docs-menu__links-group-heading>a {
& > .docs-menu__links-group-heading > a {
background-color: $neutral-20;
}
@@ -327,7 +326,7 @@
}
&.active {
&>.docs-menu__links-group-heading>a {
& > .docs-menu__links-group-heading > a {
color: $primary-50;
background: $neutral-90;
}
@@ -363,7 +362,7 @@
}
}
&__links> :last-child,
&__links > :last-child,
&__links-title:not(:nth-of-type(1)) {
border-color: $neutral-80;
}
@@ -373,7 +372,7 @@
&__links-group {
&.active {
&>.docs-menu__links-group-heading>a {
& > .docs-menu__links-group-heading > a {
color: $neutral-30;
}
}
@@ -78,9 +78,15 @@
}
// Level Color-Coding
.text-green { color: $success-80; }
.text-yellow { color: $warning-80; }
.text-red { color: $error-50; }
.text-green {
color: $success-80;
}
.text-yellow {
color: $warning-80;
}
.text-red {
color: $error-50;
}
@include media-breakpoint-up(xl) {
&__container {
@@ -128,8 +134,14 @@
color: $neutral-100;
}
.text-green { color: color.adjust($success-50, $saturation: 5%, $lightness: 8%); }
.text-yellow { color: color.adjust($warning-50, $saturation: 5%, $lightness: 8%); }
.text-red { color: color.adjust($error-50, $lightness: 3%); }
.text-green {
color: color.adjust($success-50, $saturation: 5%, $lightness: 8%);
}
.text-yellow {
color: color.adjust($warning-50, $saturation: 5%, $lightness: 8%);
}
.text-red {
color: color.adjust($error-50, $lightness: 3%);
}
}
}
@@ -6,11 +6,12 @@
padding-top: $spacer * 4;
padding-bottom: $spacer * 4;
background: radial-gradient(
ellipse 120% 80% at 0% 0%,
rgba(231, 29, 95, 0.12) 0%,
rgba(133, 71, 255, 0.06) 40%,
transparent 70%
), $neutral-10;
ellipse 120% 80% at 0% 0%,
rgba(231, 29, 95, 0.12) 0%,
rgba(133, 71, 255, 0.06) 40%,
transparent 70%
),
$neutral-10;
&__lights-overlay {
position: absolute;
@@ -36,11 +36,13 @@
font-family: $font-family-base;
}
[data-hsfc-id=Renderer] .hsfc-Step .hsfc-Step__Content {
[data-hsfc-id='Renderer'] .hsfc-Step .hsfc-Step__Content {
padding: $spacer * 1.5;
}
.hsfc-RichText span, .hsfc-FieldLabel span, .hsfc-ProgressBar__Text {
.hsfc-RichText span,
.hsfc-FieldLabel span,
.hsfc-ProgressBar__Text {
font-size: $font-size-s !important;
line-height: $line-height-sm !important;
color: $neutral-98 !important;
@@ -50,7 +52,8 @@
margin-bottom: $spacer * 0.5 !important;
}
[data-hsfc-id=Renderer] .hsfc-TextInput, [data-hsfc-id=Renderer] .hsfc-TextareaInput {
[data-hsfc-id='Renderer'] .hsfc-TextInput,
[data-hsfc-id='Renderer'] .hsfc-TextareaInput {
display: block;
background-color: transparent;
border: pxToRem(1) solid $neutral-50;
@@ -61,7 +64,8 @@
color: $neutral-98;
border-radius: $spacer * 0.5;
&:focus, &:active {
&:focus,
&:active {
box-shadow: none !important;
}
@@ -70,13 +74,13 @@
}
}
[data-hsfc-id=Renderer] .hsfc-ErrorAlert {
[data-hsfc-id='Renderer'] .hsfc-ErrorAlert {
font-size: $font-size-xs;
line-height: $font-size-l;
color: $primary-40;
}
[data-hsfc-id=Renderer] .hsfc-Button {
[data-hsfc-id='Renderer'] .hsfc-Button {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -153,7 +157,7 @@
}
&__container {
[data-hsfc-id=Renderer] .hsfc-Step .hsfc-Step__Content {
[data-hsfc-id='Renderer'] .hsfc-Step .hsfc-Step__Content {
padding: $spacer * 4;
}
}
@@ -58,7 +58,8 @@
line-height: pxToRem(67);
}
&__subtitle, &__description {
&__subtitle,
&__description {
max-width: pxToRem(500);
}
}
@@ -56,7 +56,7 @@
&:nth-of-type(4) {
& > div {
&:before {
content: "";
content: '';
display: block;
height: 100%;
width: pxToRem(1);
@@ -72,7 +72,7 @@
&:nth-of-type(2) {
& > div {
&:after {
content: "";
content: '';
display: block;
width: 100%;
height: pxToRem(1);
@@ -4,4 +4,4 @@
@import 'edge-demo';
@import 'edge-form';
@import 'edge-faq';
@import 'edge-get-started';
@import 'edge-get-started';
@@ -98,7 +98,7 @@
&-list {
font-size: $font-size-s;
line-height: pxToRem(21);
font-weight: $font-weight-base;
font-weight: $font-weight-base;
color: $neutral-70;
p {
@@ -110,7 +110,7 @@
&--small {
font-size: pxToRem(14);
line-height: pxToRem(21);
font-weight: $font-weight-base;
font-weight: $font-weight-base;
}
}
@@ -50,7 +50,9 @@
border: none;
border-radius: pxToRem(8);
cursor: pointer;
transition: color 0.3s ease, background-color 0.3s ease;
transition:
color 0.3s ease,
background-color 0.3s ease;
white-space: nowrap;
text-align: center;
@@ -89,7 +91,9 @@
width: 100%;
opacity: 0;
visibility: hidden;
transition: opacity 0.4s ease, visibility 0.4s ease;
transition:
opacity 0.4s ease,
visibility 0.4s ease;
pointer-events: none;
&--active {
@@ -298,7 +302,9 @@
border-radius: pxToRem(8);
color: $neutral-40;
cursor: pointer;
transition: color 0.2s ease, border-color 0.2s ease;
transition:
color 0.2s ease,
border-color 0.2s ease;
&:hover {
color: $neutral-20;
@@ -334,7 +340,9 @@
height: pxToRem(6);
background-color: $neutral-80;
border-radius: 50%;
transition: background-color 0.2s ease, transform 0.2s ease;
transition:
background-color 0.2s ease,
transform 0.2s ease;
}
&:hover span {
@@ -0,0 +1,12 @@
@import 'qdrant-pricing-hero';
@import 'qdrant-pricing-calculator';
@import 'qdrant-pricing-docker-deploy';
@import 'qdrant-pricing-doors-a';
@import 'qdrant-pricing-doors-b';
@import 'qdrant-pricing-marketplaces';
@import 'pricing-table';
@import 'qdrant-pricing-features';
@import 'qdrant-pricing-faq';
@import 'qdrant-pricing-comparison';
@import 'qdrant-pricing-get-contacted';
@import 'pricing-door';
@@ -1,4 +1,4 @@
@use '../helpers/functions' as *;
@use '../../helpers/functions' as *;
.pricing-door {
position: relative;
@@ -0,0 +1,357 @@
@use '../../helpers/functions' as *;
/* Shared pricing table styles – used by qdrant-pricing-features and qdrant-pricing-comparison */
.pricing-table {
&__table {
overflow: hidden;
}
&__table-header {
display: flex;
& .pricing-table__table-cell {
border-bottom: 0;
&:first-child {
border-right: 0;
}
&:nth-child(2) {
border-left: 0.5px solid $neutral-80;
border-top-left-radius: pxToRem(8);
}
&:not(:first-of-type) {
border-top: 0.5px solid $neutral-80;
}
&:last-child {
border-right: 0.5px solid $neutral-80;
border-top-right-radius: pxToRem(8);
}
}
}
&__table-section {
&:first-of-type &-header {
border-top: 0.5px solid $neutral-80;
border-top-left-radius: pxToRem(8);
}
&:last-of-type.pricing-table__table-section--collapsed &-header {
border-bottom-left-radius: pxToRem(8);
}
&-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: $spacer * 1.5 $spacer * 2;
background-color: #f5f8ff;
border-bottom: 0.5px solid $neutral-80;
border-right: 0.5px solid $neutral-80;
border-left: 0.5px solid $neutral-80;
cursor: pointer;
user-select: none;
}
&-title {
font-size: pxToRem(16);
font-weight: 500;
color: $neutral-20;
}
&-rows {
transition: max-height 0.35s ease;
}
&--collapsed {
.pricing-table__chevron {
transform: rotate(180deg);
}
}
}
&__chevron {
color: $neutral-20;
transition: transform 0.2s ease;
}
&__table-row {
display: flex;
background-color: $neutral-98;
border-bottom: 0.5px solid $neutral-80;
border-right: 0.5px solid $neutral-80;
border-left: 0.5px solid $neutral-80;
}
&__table-body {
.pricing-table__table-section:last-of-type
.pricing-table__table-section-rows
.pricing-table__table-row:last-child {
border-bottom-left-radius: pxToRem(8);
}
}
&__table-cell {
display: flex;
align-items: center;
justify-content: center;
width: pxToRem(200);
padding: $spacer $spacer * 2;
font-size: pxToRem(14);
line-height: 1.5;
color: $neutral-30;
border-right: 0.5px solid $neutral-80;
text-align: center;
&:last-child {
border-right: none;
}
&--feature {
flex: 1;
justify-content: flex-start;
text-align: left;
}
&--tier {
padding: $spacer $spacer * 2;
font-size: pxToRem(20);
font-weight: 600;
letter-spacing: -0.2px;
color: $neutral-20;
background-color: $neutral-98;
border-bottom: 0.5px solid $neutral-80;
}
&--highlight {
background-color: #f5f8ff;
&.pricing-table__table-cell--tier {
border-right: 0.5px solid $neutral-80;
}
}
&--cta {
padding: $spacer * 2 $spacer;
background-color: $neutral-98;
.button {
white-space: nowrap;
padding: $spacer * 0.5 $spacer * 1.375;
font-size: pxToRem(16);
}
.button_outlined {
color: $neutral-20;
}
}
}
&__table-footer {
display: flex;
justify-content: end;
.pricing-table__table-cell {
flex: 1;
max-width: 12.53rem;
&:first-child {
max-width: 18.74rem;
border-right: 0;
}
&:not(:first-child) {
border-bottom: 0.5px solid $neutral-80;
}
&:nth-child(2) {
border-left: 0.5px solid $neutral-80;
border-bottom-left-radius: pxToRem(8);
}
&:last-child {
border-right: 0.5px solid $neutral-80;
border-bottom-right-radius: pxToRem(8);
}
}
}
&__check {
color: $neutral-30;
}
&__x {
color: $neutral-60;
}
&__text {
font-size: pxToRem(14);
color: $neutral-30;
&--bold {
font-weight: 600;
}
}
&__tier-tabs {
display: none;
}
@include media-breakpoint-down(xl) {
&__table {
overflow-x: auto;
}
&__table-header,
&__table-row,
&__table-footer {
min-width: pxToRem(900);
}
&__table-cell {
min-width: pxToRem(160);
&--feature {
min-width: pxToRem(260);
}
}
}
@media (min-width: 992px) and (max-width: 1999px) {
&__table-cell--cta .button {
white-space: normal;
text-align: center;
height: auto;
min-height: pxToRem(40);
}
}
@include media-breakpoint-down(lg) {
&__tier-tabs {
display: flex;
gap: 0;
padding: pxToRem(4);
margin-bottom: 0;
background-color: $neutral-98;
border: 0.5px solid $neutral-80;
border-bottom: none;
border-radius: pxToRem(8) pxToRem(8) 0 0;
width: 100%;
}
&__tier-tab {
flex: 1;
padding: $spacer * 0.5 $spacer;
font-size: pxToRem(14);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
background: transparent;
border: none;
border-radius: pxToRem(8);
cursor: pointer;
transition: all 0.2s ease;
&--active {
font-weight: 600;
color: $neutral-20;
background-color: $neutral-94;
}
}
&__table {
overflow-x: visible;
}
&__table-header {
display: none;
}
&__table-header,
&__table-row,
&__table-footer {
min-width: 0;
}
&__table-row {
display: flex;
}
&__table-cell {
min-width: 0;
&[data-tier-col] {
display: none;
&.pricing-table__table-cell--mobile-active {
display: flex;
flex: 0 0 auto;
width: pxToRem(144);
border-right: none;
}
}
&--feature {
flex: 1;
min-width: 0;
border-radius: 0;
}
}
&__table-body {
.pricing-table__table-section:last-of-type
.pricing-table__table-section-rows
.pricing-table__table-row:last-child {
border-bottom-left-radius: 0;
}
}
&__table-footer {
width: 100%;
.pricing-table__table-cell--feature {
display: none;
}
.pricing-table__table-cell--cta {
flex: 1 1 100%;
min-width: 100%;
&[data-tier-col].pricing-table__table-cell--mobile-active {
display: flex;
flex: 1 1 100%;
width: 100%;
min-width: 100%;
justify-content: center;
border-left: 0.5px solid $neutral-80;
border-right: 0.5px solid $neutral-80;
border-bottom-left-radius: pxToRem(8);
border-bottom-right-radius: pxToRem(8);
}
}
}
&__table-section {
&:first-of-type &-header {
border-radius: 0;
}
&:last-of-type.pricing-table__table-section--collapsed &-header {
border-bottom-left-radius: 0;
}
&-header {
border-radius: 0;
}
}
}
@include media-breakpoint-down(md) {
&__table-section-header {
padding: $spacer;
min-height: pxToRem(56);
}
&__table-section-title {
font-size: pxToRem(16);
font-weight: 500;
line-height: 1.5;
}
}
}
@@ -0,0 +1,143 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-calculator {
position: relative;
padding: 6rem 0;
background-color: $neutral-94;
overflow: hidden;
&__background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
}
&__grid {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: linear-gradient(to right, $neutral-90 1px, transparent 1px),
linear-gradient(to bottom, $neutral-90 1px, transparent 1px);
background-size: 80px 80px;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom, $neutral-94 0%, transparent 30%, transparent 70%, $neutral-94 100%),
linear-gradient(to right, $neutral-94 0%, transparent 15%, transparent 85%, $neutral-94 100%);
}
}
&__container {
position: relative;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
gap: $spacer * 1.5;
padding: $spacer * 1.5 $spacer * 3.5 $spacer * 1.5 $spacer * 3;
background-color: $neutral-98;
border: 1px solid $neutral-90;
border-radius: pxToRem(8);
margin: 0 auto;
width: fit-content;
}
&__icon {
flex-shrink: 0;
height: pxToRem(100);
margin-bottom: -$spacer * 1.5;
img {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
}
&__content {
display: flex;
flex-direction: column;
}
&__title {
font-size: pxToRem(24);
font-weight: 600;
line-height: 1.3;
letter-spacing: -0.5px;
margin: 0;
color: $neutral-20;
white-space: nowrap;
}
&__link-wrapper {
display: flex;
align-items: center;
gap: $spacer * 0.5;
margin: 0;
font-size: pxToRem(16);
line-height: 1.5;
}
&__link-prefix {
color: $neutral-30;
font-weight: 500;
}
&__link {
font-size: inherit;
}
@include media-breakpoint-down(md) {
padding: $spacer * 2.5 0;
&__container {
flex-direction: column;
align-items: center;
text-align: center;
width: 100%;
padding: $spacer * 1.5 $spacer * 1.25;
gap: $spacer * 1.5;
}
&__icon {
width: pxToRem(100);
height: pxToRem(84);
margin: 0;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
&__content {
align-items: center;
gap: $spacer * 0.5;
}
&__title {
font-size: pxToRem(24);
font-weight: 600;
line-height: 1.3;
letter-spacing: -0.5px;
text-align: center;
white-space: normal;
}
&__link-wrapper {
justify-content: center;
}
}
}
@@ -0,0 +1,197 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-comparison-hero {
position: relative;
padding: $spacer * 5 0 $spacer * 3.5;
background-color: $neutral-94;
overflow: hidden;
&__background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
background: url('/img/prices-background.svg') top center / 100% auto no-repeat;
}
&__grid {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 400px;
display: grid;
grid-template-columns: repeat(18, 80px);
grid-template-rows: repeat(5, 80px);
justify-content: center;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom, rgba($neutral-94, 0) 0%, $neutral-94 100%),
linear-gradient(to right, $neutral-94 0%, transparent 15%, transparent 85%, $neutral-94 100%);
}
}
&__content {
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
max-width: pxToRem(730);
margin: 0 auto;
padding: 0 $spacer;
background: linear-gradient(to right, rgba($neutral-94, 0) 8%, $neutral-94 50%, rgba($neutral-94, 0) 92%);
}
&__badge {
display: flex;
align-items: center;
gap: $spacer * 0.5;
padding: $spacer * 0.5 $spacer;
margin-bottom: $spacer * 1.5;
background-color: $neutral-98;
border: 1px solid $neutral-90;
border-radius: pxToRem(8);
svg {
flex-shrink: 0;
}
span {
font-size: pxToRem(16);
line-height: 1.5;
color: $neutral-30;
}
}
&__badge-link {
align-self: flex-start;
width: fit-content;
font-size: pxToRem(16);
&::before,
&::after {
height: calc(1ex + 3px);
}
}
&__title {
margin: 0 0 $spacer;
font-size: pxToRem(56);
font-weight: 600;
line-height: 1.1;
letter-spacing: -0.5px;
color: $neutral-20;
}
&__description {
margin: 0 0 $spacer;
font-size: pxToRem(18);
line-height: 1.5;
color: $neutral-30;
}
&__actions {
display: flex;
align-items: center;
gap: $spacer * 1.5;
}
&__link {
width: fit-content;
display: flex;
align-items: center;
gap: pxToRem(2);
font-size: pxToRem(16);
font-weight: 500;
line-height: 1.5;
color: $primary-50;
text-decoration: none;
&::before,
&::after {
height: calc(1ex + 3px);
}
&:hover {
color: $primary-50;
}
}
@include media-breakpoint-down(lg) {
padding: $spacer * 3 0 $spacer * 2;
&__title {
font-size: pxToRem(40);
}
&__description {
font-size: pxToRem(16);
}
&__actions {
flex-direction: column;
gap: $spacer;
}
}
@include media-breakpoint-down(md) {
padding: $spacer * 2.5 0 $spacer * 2;
&__background {
display: none;
}
&__grid {
display: none;
}
&__content {
background: none;
}
&__badge {
max-width: pxToRem(280);
flex-wrap: wrap;
justify-content: center;
margin-bottom: $spacer;
}
&__title {
margin: 0 0 $spacer;
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
}
&__description {
margin: 0 0 $spacer;
font-size: pxToRem(16);
line-height: 1.5;
}
&__actions {
flex-direction: column;
gap: $spacer * 1.5;
}
}
}
.qdrant-pricing-comparison {
padding: 0 0 $spacer * 5;
background-color: $neutral-94;
@include media-breakpoint-down(lg) {
padding: 0 0 $spacer * 4;
}
}
@@ -1,4 +1,4 @@
@use '../helpers/functions' as *;
@use '../../helpers/functions' as *;
.qdrant-pricing-doors-a {
padding-bottom: $spacer * 4;
@@ -0,0 +1,366 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-doors-b {
padding: 0 0 $spacer * 2;
background-color: $neutral-94;
&__tabs {
display: flex;
justify-content: center;
gap: $spacer * 0.5;
padding: 4px;
margin-bottom: $spacer * 2;
background-color: $neutral-98;
border: 0.5px solid $neutral-80;
border-radius: pxToRem(8);
width: fit-content;
margin-left: auto;
margin-right: auto;
}
&__tab {
padding: $spacer * 0.5 $spacer * 1.5;
min-width: pxToRem(160);
height: pxToRem(40);
font-size: pxToRem(16);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
background: transparent;
border: none;
border-radius: pxToRem(8);
cursor: pointer;
transition: all 0.2s ease;
&:hover {
background-color: rgba($neutral-94, 0.5);
}
&--active {
font-weight: 600;
color: $neutral-20;
background-color: $neutral-94;
}
}
&__doors-wrapper {
display: flex;
justify-content: center;
width: 100%;
}
&__doors {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto auto 1fr auto;
width: 100%;
max-width: pxToRem(1110);
margin: 0 auto;
&--hidden {
display: none;
}
&[data-doors-tab='on-premise'] {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: auto auto 1fr 1fr auto;
max-width: pxToRem(1300);
margin-left: auto;
margin-right: auto;
}
}
&__door {
display: grid;
grid-template-rows: subgrid;
grid-row: span 4;
background-color: $neutral-98;
[data-doors-tab='on-premise'] & {
grid-row: span 5;
grid-template-rows: subgrid;
}
border: 0.5px solid $neutral-80;
border-right: none;
&:first-child {
border-radius: pxToRem(8) 0 0 pxToRem(8);
}
&:last-child {
border-right: 0.5px solid $neutral-80;
border-radius: 0 pxToRem(8) pxToRem(8) 0;
}
&--paid {
/* Don't add full border - it doubles with neighbors; use background for emphasis */
background-color: #f5f8ff;
}
}
&__heading {
display: flex;
flex-direction: column;
gap: $spacer * 0.5;
padding: $spacer * 1.5 $spacer * 2;
border-bottom: 0.5px solid $neutral-80;
min-height: pxToRem(135);
&:has(.qdrant-pricing-doors-b__badge) {
flex-direction: row;
align-items: center;
justify-content: space-between;
min-height: auto;
}
}
&__title {
font-size: pxToRem(24);
font-weight: 600;
line-height: 1.3;
letter-spacing: -0.5px;
color: $neutral-20;
margin: 0;
}
&__badge {
display: flex;
align-items: center;
gap: pxToRem(6);
padding: pxToRem(4) $spacer * 0.5;
background-color: $neutral-94;
border: 0.5px solid $neutral-80;
border-radius: pxToRem(8);
flex-shrink: 0;
span {
font-size: pxToRem(14);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
}
svg {
display: block;
width: pxToRem(20);
height: pxToRem(20);
}
}
&__pricing {
display: flex;
flex-direction: column;
font-size: pxToRem(16);
font-weight: 500;
line-height: 1.5;
color: $neutral-30;
}
&__pricing-main {
display: block;
}
&__pricing-note {
display: block;
}
&__target {
padding: $spacer $spacer * 2;
border-bottom: 0.5px solid $neutral-80;
min-height: pxToRem(80);
p {
margin: 0;
font-size: pxToRem(16);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
}
}
&__features {
display: flex;
flex-direction: column;
gap: $spacer * 0.5;
padding: $spacer $spacer * 2;
border-bottom: 0.5px solid $neutral-80;
min-height: pxToRem(168);
[data-doors-tab='on-premise'] & {
min-height: auto;
}
}
&__feature-group-label {
margin: 0;
font-size: pxToRem(16);
font-weight: 500;
line-height: 1.5;
color: $neutral-20;
}
&__feature-list {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
gap: $spacer * 0.5;
}
&__feature-item {
display: flex;
align-items: flex-start;
gap: $spacer * 0.5;
font-size: pxToRem(14);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
span {
flex: 1;
}
}
&__check-icon {
flex-shrink: 0;
margin-top: 3px;
color: $neutral-30;
}
&__marketplace {
display: flex;
flex-direction: column;
gap: $spacer * 0.5;
}
&__marketplace-label {
font-size: pxToRem(14);
font-weight: 500;
line-height: 1.5;
color: $neutral-30;
margin: 0;
}
&__marketplace-logos {
display: flex;
gap: $spacer * 0.5;
}
&__marketplace-logo {
display: flex;
align-items: center;
justify-content: center;
width: pxToRem(32);
height: pxToRem(32);
border: 0.5px solid $neutral-80;
border-radius: pxToRem(3);
background-color: $neutral-100;
svg {
display: block;
}
}
&__contact-link {
align-self: flex-start;
width: fit-content;
font-size: pxToRem(16);
}
&__cta {
padding: $spacer * 1.5 $spacer * 2;
margin-top: auto;
}
&__cta-button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: pxToRem(40);
padding: $spacer * 0.5 $spacer * 1.375;
font-size: pxToRem(16);
font-weight: 600;
line-height: 1.5;
text-decoration: none;
border-radius: pxToRem(8);
transition: all 0.2s ease;
&--outlined {
color: $neutral-20;
background-color: transparent;
border: 1px solid $neutral-60;
&:hover {
background-color: rgba($neutral-90, 0.5);
}
}
&--contained {
color: $neutral-100;
background: linear-gradient(180deg, $primary-50 0%, #be003a 100%);
border: none;
box-shadow: inset 0px 2px 1px 0px #ff516b;
&:hover {
filter: brightness(1.05);
}
}
}
@include media-breakpoint-down(lg) {
padding: 0 0 $spacer * 2;
&__tabs {
width: 100%;
}
&__tab {
flex: 1;
min-width: 0;
}
&__doors-wrapper {
width: 100%;
}
&__doors {
display: flex;
flex-direction: column;
grid-template-columns: unset;
grid-template-rows: unset;
gap: $spacer * 1.5;
&--hidden {
display: none;
}
}
&__door {
display: flex;
flex-direction: column;
grid-row: unset;
grid-template-rows: unset;
border-radius: pxToRem(8);
border: 0.5px solid $neutral-80;
border-right: 0.5px solid $neutral-80;
&:first-child,
&:last-child {
border-radius: pxToRem(8);
border-right: 0.5px solid $neutral-80;
}
}
&__heading,
&__target,
&__features {
min-height: auto;
}
}
@include media-breakpoint-down(md) {
padding: 0 0 $spacer * 2;
}
}
@@ -0,0 +1,47 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-faq {
padding: $spacer * 5 0 $spacer * 2.5;
background-color: $neutral-94;
&__title {
margin-bottom: $spacer * 5;
font-size: pxToRem(56);
font-weight: 600;
line-height: 1.1;
letter-spacing: -0.5px;
color: $neutral-20;
text-align: center;
}
&__questions {
max-width: pxToRem(800);
margin: 0 auto;
}
@include media-breakpoint-down(lg) {
padding: $spacer * 4 0 $spacer * 2;
&__title {
margin-bottom: $spacer * 3;
font-size: pxToRem(40);
}
}
@include media-breakpoint-down(md) {
padding: $spacer * 2.5 0 $spacer * 2;
&__title {
margin-bottom: $spacer * 3;
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
text-align: center;
}
&__questions {
margin: 0 $spacer * 1.25;
}
}
}
@@ -0,0 +1,112 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-features {
padding: $spacer * 2.5 0 $spacer * 7.5;
background-color: $neutral-94;
&__header {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin-bottom: $spacer * 3.5;
}
&__title {
margin: 0;
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
color: $neutral-20;
}
&__tabs {
display: flex;
gap: $spacer * 0.5;
padding: pxToRem(4);
background-color: $neutral-98;
border: 1px solid $neutral-90;
border-radius: pxToRem(8);
}
&__table-wrapper {
&--hidden {
display: none;
}
}
&__tab {
padding: $spacer * 0.5 $spacer * 1.5;
font-size: pxToRem(16);
font-weight: 400;
line-height: 1.5;
color: $neutral-30;
background: transparent;
border: none;
border-radius: pxToRem(8);
cursor: pointer;
transition: all 0.2s ease;
&--active {
font-weight: 600;
color: $neutral-20;
background-color: $neutral-94;
}
&:hover:not(&--active) {
background-color: $neutral-94;
}
}
&__compare {
display: flex;
justify-content: center;
margin-top: $spacer * 2.5;
.button {
padding: $spacer * 0.5 $spacer * 1.375;
}
.button_outlined {
color: $neutral-20;
}
}
@include media-breakpoint-down(lg) {
padding: $spacer * 2.5 0 $spacer * 4;
&__tabs {
width: 100%;
}
&__tab {
flex: 1;
}
&__header {
flex-direction: column;
align-items: center;
gap: $spacer * 1.5;
}
&__title {
font-size: pxToRem(32);
}
}
@include media-breakpoint-down(md) {
padding: $spacer * 2.5 0 $spacer * 4;
&__header {
margin-bottom: $spacer * 2.5;
gap: $spacer;
}
&__title {
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
}
}
}
@@ -1,5 +1,5 @@
@use '../helpers/functions' as *;
@use '../mixins/get-contacted' as get-contacted;
@use '../../helpers/functions' as *;
@use '../../mixins/get-contacted' as get-contacted;
.qdrant-pricing-get-contacted {
@include get-contacted.base($spacer * 2.5, $spacer * 2.5, $spacer * 5, $spacer * 4, pxToRem(350));
@@ -0,0 +1,140 @@
@use '../../helpers/functions' as *;
.qdrant-pricing-hero {
position: relative;
padding: $spacer * 5 0 $spacer * 4;
background-color: $neutral-94;
text-align: center;
overflow: hidden;
&__background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
background: url('/img/prices-background.svg') top center / 100% auto no-repeat;
}
&__grid {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 400px;
display: grid;
grid-template-columns: repeat(18, 80px);
grid-template-rows: repeat(5, 80px);
justify-content: center;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom, rgba($neutral-94, 0) 0%, $neutral-94 100%),
linear-gradient(to right, $neutral-94 0%, transparent 15%, transparent 85%, $neutral-94 100%);
}
}
&__content {
position: relative;
z-index: 1;
max-width: pxToRem(730);
margin: 0 auto;
padding: 0 $spacer;
background: linear-gradient(to right, rgba($neutral-94, 0) 8%, $neutral-94 50%, rgba($neutral-94, 0) 92%);
}
&__title {
font-size: pxToRem(56);
font-weight: 600;
line-height: 1.1;
letter-spacing: -0.5px;
margin-bottom: $spacer;
color: $neutral-20;
}
&__description {
margin-bottom: $spacer;
font-size: pxToRem(18);
line-height: 1.5;
color: $neutral-30;
}
&__actions {
display: flex;
align-items: center;
justify-content: center;
gap: $spacer * 1.5;
flex-wrap: wrap;
}
&__button {
min-width: pxToRem(166);
}
&__link {
width: fit-content;
display: inline-flex;
align-items: center;
gap: $spacer * 0.25;
font-size: pxToRem(16);
font-weight: 500;
color: $primary-50;
text-decoration: none;
&::before,
&::after {
height: calc(1ex + 3px);
}
}
@include media-breakpoint-down(lg) {
padding: $spacer * 3 0 $spacer * 2.5;
&__title {
font-size: pxToRem(40);
}
&__description {
font-size: pxToRem(16);
}
&__actions {
flex-direction: column;
gap: $spacer;
}
}
@include media-breakpoint-down(md) {
padding: $spacer * 2.5 0 $spacer * 2;
&__background {
display: none;
}
&__grid {
display: none;
}
&__content {
background: none;
}
&__title {
font-size: pxToRem(40);
font-weight: 600;
line-height: 1.2;
letter-spacing: -0.5px;
}
&__description {
font-size: pxToRem(16);
line-height: 1.5;
}
}
}
@@ -1,5 +1,5 @@
@use '../helpers/functions' as *;
@use '../mixins/marketplaces' as marketplaces;
@use '../../helpers/functions' as *;
@use '../../mixins/marketplaces' as marketplaces;
.qdrant-pricing-marketplaces {
@include marketplaces.base(
@@ -1,4 +1,5 @@
import scrollHandler from './scroll-handler';
import { initTabSync } from './tab-sync';
import { XXL_BREAKPOINT } from './constants';
import { addUTMToLinks, initGoToTopButton, persistUTMParams } from './helpers';
import { handleSegmentReady } from './segment-helpers';
@@ -122,6 +123,7 @@ document.addEventListener('DOMContentLoaded', function () {
});
initGoToTopButton('#scrollToTopBtn');
initTabSync();
if (document.getElementById('TableOfContents') && document.querySelector('.qdrant-post__body')) {
new TableOfContents('#TableOfContents', '.qdrant-post__body');
@@ -157,6 +159,20 @@ document.addEventListener('DOMContentLoaded', function () {
el.addEventListener('click', toggleAccordion);
});
// Pricing doors tabs
const pricingDoorsTabs = document.querySelectorAll('.qdrant-pricing-doors-b__tab');
const pricingDoorsContainers = document.querySelectorAll('[data-doors-tab]');
pricingDoorsTabs.forEach((tab) => {
tab.addEventListener('click', () => {
pricingDoorsTabs.forEach((t) => t.classList.remove('qdrant-pricing-doors-b__tab--active'));
tab.classList.add('qdrant-pricing-doors-b__tab--active');
const targetTab = tab.dataset.tab;
pricingDoorsContainers.forEach((container) => {
container.classList.toggle('qdrant-pricing-doors-b__doors--hidden', container.dataset.doorsTab !== targetTab);
});
});
});
// scroll to anchors:
let offset = DOCS_HEADER_OFFSET;
@@ -0,0 +1,83 @@
document.addEventListener('DOMContentLoaded', function () {
// Pricing features tabs (Managed / On-Premise)
function expandPricingTableSections(table) {
if (!table) return;
table.querySelectorAll('.pricing-table__table-section').forEach((section) => {
const rows = section.querySelector('.pricing-table__table-section-rows');
if (!rows) return;
section.classList.remove('pricing-table__table-section--collapsed');
rows.style.maxHeight = rows.scrollHeight + 'px';
});
}
const featuresTabs = document.querySelectorAll('.qdrant-pricing-features__tab');
const featuresTableWrappers = document.querySelectorAll('[data-features-tab]');
featuresTabs.forEach((tab) => {
tab.addEventListener('click', () => {
featuresTabs.forEach((t) => t.classList.remove('qdrant-pricing-features__tab--active'));
tab.classList.add('qdrant-pricing-features__tab--active');
const targetTab = tab.dataset.tab;
featuresTableWrappers.forEach((wrapper) => {
wrapper.classList.toggle(
'qdrant-pricing-features__table-wrapper--hidden',
wrapper.dataset.featuresTab !== targetTab
);
});
const visibleWrapper = document.querySelector(`[data-features-tab="${targetTab}"]`);
const visibleTable = visibleWrapper?.querySelector('.pricing-table');
requestAnimationFrame(() => expandPricingTableSections(visibleTable));
});
});
// Universal pricing table: mobile tier tabs + section collapse/expand
document.querySelectorAll('.pricing-table').forEach((table) => {
const tierTabs = table.querySelectorAll('.pricing-table__tier-tab');
if (tierTabs.length) {
const updateMobileTierColumns = (activeTier) => {
table.querySelectorAll('[data-tier-col]').forEach((col) => {
col.classList.remove('pricing-table__table-cell--mobile-active');
});
table.querySelectorAll(`[data-tier-col="${activeTier}"]`).forEach((col) => {
col.classList.add('pricing-table__table-cell--mobile-active');
});
};
updateMobileTierColumns(tierTabs[0].dataset.tier);
tierTabs.forEach((tab) => {
tab.addEventListener('click', () => {
tierTabs.forEach((t) => t.classList.remove('pricing-table__tier-tab--active'));
tab.classList.add('pricing-table__tier-tab--active');
updateMobileTierColumns(tab.dataset.tier);
});
});
}
const isInHiddenWrapper = table.closest('[data-features-tab]')?.classList.contains('qdrant-pricing-features__table-wrapper--hidden');
table.querySelectorAll('.pricing-table__table-section').forEach((section) => {
const header = section.querySelector('.pricing-table__table-section-header');
const rows = section.querySelector('.pricing-table__table-section-rows');
if (!header || !rows) return;
header.addEventListener('click', () => {
const isCollapsed = section.classList.contains('pricing-table__table-section--collapsed');
if (isCollapsed) {
rows.style.overflow = 'hidden';
rows.style.maxHeight = rows.scrollHeight + 'px';
section.classList.remove('pricing-table__table-section--collapsed');
} else {
rows.style.overflow = 'hidden';
rows.style.maxHeight = rows.scrollHeight + 'px';
rows.offsetHeight;
rows.style.maxHeight = '0px';
section.classList.add('pricing-table__table-section--collapsed');
}
});
rows.addEventListener('transitionend', () => {
if (!section.classList.contains('pricing-table__table-section--collapsed')) {
rows.style.removeProperty('max-height');
rows.style.removeProperty('overflow');
}
});
});
});
});
@@ -0,0 +1,65 @@
/**
* Synchronizes tab switching across tab groups that share the same data-tab-sync value.
* Add data-tab-sync="group-id" to the tab container (parent of tab buttons).
* Tab buttons must have data-tab with matching values across synchronized groups.
* Programmatic clicks (isTrusted: false) are ignored to avoid sync loops.
*
* Optional data-tab-sync-direction:
* - "down-only": only sync to tab groups that appear later in the DOM (below the clicked one).
* E.g. with A, B, C: A syncs B and C; B syncs C; C syncs none.
*
* @example Basic usage (bidirectional sync)
* <div data-tab-sync="my-tabs">
* <button data-tab="cloud">Cloud</button>
* <button data-tab="on-prem">On-Premise</button>
* </div>
* <div data-tab-sync="my-tabs">
* <button data-tab="cloud">Cloud</button>
* <button data-tab="on-prem">On-Premise</button>
* </div>
*
* @example Down-only (sync flows downward only)
* <div data-tab-sync="pricing" data-tab-sync-direction="down-only">
* <button data-tab="cloud">Cloud</button>
* <button data-tab="on-prem">On-Premise</button>
* </div>
* <div data-tab-sync="pricing" data-tab-sync-direction="down-only">
* <button data-tab="cloud">Cloud</button>
* <button data-tab="on-prem">On-Premise</button>
* </div>
*/
export function initTabSync() {
document.addEventListener(
'click',
(e) => {
if (!e.isTrusted) return;
const tab = e.target.closest('[data-tab-sync] [data-tab]');
if (!tab) return;
const container = tab.closest('[data-tab-sync]');
const syncGroup = container?.getAttribute('data-tab-sync');
const tabId = tab.getAttribute('data-tab');
if (!syncGroup || !tabId) return;
const groups = [...document.querySelectorAll(`[data-tab-sync="${syncGroup}"]`)];
const hasDownOnly = groups.some((g) => g.getAttribute('data-tab-sync-direction') === 'down-only');
const shouldSyncTo = (group) => {
if (group === container) return false;
if (hasDownOnly) {
const groupIsBelow = !!(container.compareDocumentPosition(group) & Node.DOCUMENT_POSITION_FOLLOWING);
if (!groupIsBelow) return false;
}
return true;
};
groups.forEach((group) => {
if (!shouldSyncTo(group)) return;
const matchingTab = group.querySelector(`[data-tab="${tabId}"]`);
if (matchingTab) matchingTab.click();
});
},
true,
);
}
@@ -1,25 +1,33 @@
{{ with (.Site.GetPage "/about-us/about-us-values") }}
<section class="about-us-values">
<div class="container">
<div class="about-us-values__container">
<div class="row g-4 justify-content-center about-us-values__cards">
{{ range .Params.values }}
<div class="col-12 col-md-6 col-lg-4">
{{ if .link }}
<a href="{{ .link }}" target="{{ if .target }}_blank{{ else }}_self{{ end }}" class="card about-us-values__card">
<img class="about-us-values__card-logo" src="{{ .icon.src }}" alt="{{ .icon.alt }}">
<h6 class="about-us-values__card-title">{{ .title }}</h6>
</a>
{{ else }}
<div class="card about-us-values__card">
<img class="about-us-values__card-logo" src="{{ .icon.src }}" alt="{{ .icon.alt }}">
<h6 class="about-us-values__card-title">{{ .title }}</h6>
</div>
{{ end }}
</div>
{{ end }}
</div>
</div>
<div class="about-us-values__container">
<div class="row g-4 justify-content-center about-us-values__cards">
{{ range .Params.values }}
<div class="col-12 col-md-6 col-lg-4">
{{ if .link }}
<a
href="{{ .link }}"
target="{{ if .target }}
_blank
{{ else }}
_self
{{ end }}"
class="card about-us-values__card"
>
<img class="about-us-values__card-logo" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h6 class="about-us-values__card-title">{{ .title }}</h6>
</a>
{{ else }}
<div class="card about-us-values__card">
<img class="about-us-values__card-logo" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h6 class="about-us-values__card-title">{{ .title }}</h6>
</div>
{{ end }}
</div>
{{ end }}
</div>
</div>
</div>
</section>
{{ end }}
@@ -5,16 +5,13 @@
<div class="col-12 col-lg-5">
{{ partial "tag" . }}
<h3 class="ai-agents-webinar__title">{{ .Params.title }}</h3>
<p class="ai-agents-webinar__description">{{ .Params.description }}</p>
<a class="link link_md" href="{{ .Params.link.url }}" target="_blank">{{ .Params.link.text }}</a>
</div>
<div class="col-12 col-lg-7 d-flex justify-content-center justify-content-lg-end">
<img
class="ai-agents-webinar__image"
src="{{ .Params.image.src }}"
alt="{{ .Params.image.alt }}"
/>
<img class="ai-agents-webinar__image" src="{{ .Params.image.src }}" alt="{{ .Params.image.alt }}" />
</div>
</div>
</div>
@@ -8,19 +8,29 @@
{{ range .Params.logo.logoCards }}
<div class="col-12 col-lg-6">
<div class="card">
<div class="brand-resources-content__logos-logo{{ if .darkBackground }} brand-resources-content__logos-logo_dark-bg{{ end }}">
<div
class="brand-resources-content__logos-logo{{ if .darkBackground }}
brand-resources-content__logos-logo_dark-bg
{{ end }}"
>
<img src="{{ .logo.src }}" alt="{{ .logo.alt }}" />
</div>
<h6 class="brand-resources-content__logos-title">{{ .title }}</h6>
<div class="d-flex gap-3">
{{ $svgText := lower .link.svg.text }}
{{ $pngText := lower .link.png.text }}
<a class="brand-resources-content__logos-link link link_md" href="{{ .link.svg.url }}"
{{ if in $svgText "download" }}download{{ end }}
>{{ .link.svg.text }}</a>
<a class="brand-resources-content__logos-link link link_md" href="{{ .link.png.url }}"
{{ if in $pngText "download" }}download{{ end }}
>{{ .link.png.text }}</a>
<a
class="brand-resources-content__logos-link link link_md"
href="{{ .link.svg.url }}"
{{ if in $svgText "download" }}download{{ end }}
>{{ .link.svg.text }}</a
>
<a
class="brand-resources-content__logos-link link link_md"
href="{{ .link.png.url }}"
{{ if in $pngText "download" }}download{{ end }}
>{{ .link.png.text }}</a
>
</div>
</div>
</div>
@@ -31,19 +41,29 @@
{{ range .Params.logo.logomarkCards }}
<div class="col-12 col-lg-4">
<div class="card">
<div class="brand-resources-content__logos-logo{{ if .darkBackground }} brand-resources-content__logos-logo_dark-bg{{ end }}">
<div
class="brand-resources-content__logos-logo{{ if .darkBackground }}
brand-resources-content__logos-logo_dark-bg
{{ end }}"
>
<img src="{{ .logo.src }}" alt="{{ .logo.alt }}" />
</div>
<h6 class="brand-resources-content__logos-title">{{ .title }}</h6>
<div class="d-flex flex-column flex-xl-row gap-2 gap-xl-3">
{{ $svgText := lower .link.svg.text }}
{{ $pngText := lower .link.png.text }}
<a class="brand-resources-content__logos-link link link_md" href="{{ .link.svg.url }}"
{{ if in $svgText "download" }}download{{ end }}
>{{ .link.svg.text }}</a>
<a class="brand-resources-content__logos-link link link_md" href="{{ .link.png.url }}"
{{ if in $pngText "download" }}download{{ end }}
>{{ .link.png.text }}</a>
<a
class="brand-resources-content__logos-link link link_md"
href="{{ .link.svg.url }}"
{{ if in $svgText "download" }}download{{ end }}
>{{ .link.svg.text }}</a
>
<a
class="brand-resources-content__logos-link link link_md"
href="{{ .link.png.url }}"
{{ if in $pngText "download" }}download{{ end }}
>{{ .link.png.text }}</a
>
</div>
</div>
</div>
@@ -74,7 +94,9 @@
<p class="brand-resources-content__typography-example">{{ .Params.typography.example }}</p>
<div>
<p class="brand-resources-content__typography-specimen">{{ .Params.typography.specimen | safeHTML }}</p>
<a class="link link_md" href="{{ .Params.typography.link.url }}" target="_blank" rel="nofollow">{{ .Params.typography.link.text }}</a>
<a class="link link_md" href="{{ .Params.typography.link.url }}" target="_blank" rel="nofollow"
>{{ .Params.typography.link.text }}</a
>
</div>
</div>
</div>
@@ -1,7 +1,7 @@
<div class="callout">
<div class="callout__square-grid-overlay"></div>
<div class="callout__illustration" style="background-image: url('{{ .Params.image.src }}');"></div>
<div class="callout__lights-overlay"></div>
<div class="callout__square-grid-overlay"></div>
<div class="callout__illustration" style="background-image: url('{{ .Params.image.src }}');"></div>
<div class="callout__lights-overlay"></div>
<div class="callout__content">
<h5 class="callout__title">{{ .Params.title | safeHTML }}</h5>
<div class="callout__description">{{ .Params.description | safeHTML }}</div>
@@ -18,5 +18,3 @@
<div class="cloud-inference-cluster__overlay-right"></div>
</section>
{{ end }}
@@ -4,13 +4,13 @@
<h3 class="cloud-inference-features__title">{{ .Params.title }}</h3>
<div class="row g-4">
{{ range .Params.cards }}
<div class="col-12 col-lg-4">
<div class="card cloud-inference-features__card">
<img class="cloud-inference-features__card-icon" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h3 class="cloud-inference-features__card-title">{{ .title }}</h3>
<p class="cloud-inference-features__card-description">{{ .description }}</p>
<div class="col-12 col-lg-4">
<div class="card cloud-inference-features__card">
<img class="cloud-inference-features__card-icon" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h3 class="cloud-inference-features__card-title">{{ .title }}</h3>
<p class="cloud-inference-features__card-description">{{ .description }}</p>
</div>
</div>
</div>
{{ end }}
</div>
</div>
@@ -4,15 +4,16 @@
<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">
<article class="documentation-article">
{{ partial "article-content.html" . }}
{{ $parent := .Parent }}
@@ -71,12 +72,11 @@
{{ $currentWeight = int $currentPage.Params.weight }}
{{ end }}
<a
href="{{ $next.RelPermalink }}"
class="button button_contained button_sm"
>
<a href="{{ $next.RelPermalink }}" class="button button_contained button_sm">
{{ if eq $currentWeight $maxWeight }}
{{ $subject.Params.content.nextDay }} {{ .Parent.Title }}
{{ $subject.Params.content.nextDay }}
{{ .Parent.Title }}
{{ else }}
{{ $subject.Params.content.nextButton }}
{{ end }}
@@ -1,11 +1,10 @@
{{ $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
@@ -18,29 +17,32 @@
{{ $subject := $currentNode }}
{{ if eq $numLevels 1 }}
{{ $subject = $currentNode }} <!-- top-level, `/course` -->
{{ $subject = $currentNode }}
<!-- top-level, `/course` -->
{{ else if eq $numLevels 2 }}
{{ $subject = $currentNode }} <!-- not top-level, `/course/essentials` -->
{{ $subject = $currentNode }}
<!-- not top-level, `/course/essentials` -->
{{ else if eq $numLevels 3 }}
{{ $subject = $currentNode.Parent }} <!-- not top-level, `/course/essentials/day-0` -->
{{ $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` -->
{{ $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` -->
{{ $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>
<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 }}
@@ -58,6 +60,7 @@
{{ $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>
@@ -72,7 +75,9 @@
class="
mt-3
docs-menu__articles-link
docs-menu__links-group-heading{{ if eq $currentNode.RelPermalink $subject.Params.content.menuTitle.url }} active{{ end }}
docs-menu__links-group-heading{{ if eq $currentNode.RelPermalink $subject.Params.content.menuTitle.url }}
active
{{ end }}
"
>
<a href="{{ $subject.Params.content.menuTitle.url }}">
@@ -94,7 +99,7 @@
{{ end }}
{{ if $fileExistsAndMatchUniqueID }}
{{ $isActive = true }}
{{ $isActive = true }}
{{ end }}
{{ $sectionLink := .Permalink }}
@@ -103,6 +108,7 @@
{{ $sectionLink = (index (.RegularPages) 0).Permalink }}
{{ end }}
<details
class="docs-menu__links-group link-group {{ if $fileExistsAndMatchUniqueID }}active{{ end }}"
{{ if $isActive }}open{{ end }}
@@ -114,9 +120,7 @@
<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 {{ if $fileExistsAndMatchUniqueIDSub }}active{{ end }}">
<div class="docs-menu__links-group-heading">
<a href="{{ .Permalink }}">{{ .Title }}</a>
</div>
@@ -127,9 +131,7 @@
</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 {{ if $fileExistsAndMatchUniqueID }}active{{ end }}">
<div class="docs-menu__links-group-heading">
<a href="{{ .Params.url }}">{{ .Title }}</a>
</div>
@@ -3,10 +3,18 @@
<p class="docs-core__hero-description">{{ .description }}</p>
<p class="docs-core__hero-link">{{ .linkDescription | safeHTML }}</p>
<div class="docs-core__hero-buttons">
<a href="{{ .cloudButton.url }}" {{ if strings.HasPrefix .cloudButton.url "https://" }}target="_blank"{{ end }} class="button button_contained button_sm">
<a
href="{{ .cloudButton.url }}"
{{ if strings.HasPrefix .cloudButton.url "https://" }}target="_blank"{{ end }}
class="button button_contained button_sm"
>
{{ .cloudButton.text }}
</a>
<a href="{{ .localButton.url }}" {{ if strings.HasPrefix .localButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm">
<a
href="{{ .localButton.url }}"
{{ if strings.HasPrefix .localButton.url "https://" }}target="_blank"{{ end }}
class="button button_outlined button_sm"
>
{{ .localButton.text }}
</a>
</div>
@@ -1,7 +1,11 @@
<section class="docs-cloud__hero docs__hero">
<div class="docs__hero-content">
<h1 class="docs__hero-title">{{ .title }}</h1>
<a href="{{ .startedButton.url }}" {{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm docs__hero-button">
<a
href="{{ .startedButton.url }}"
{{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }}
class="button button_outlined button_sm docs__hero-button"
>
{{ .startedButton.text }}
</a>
</div>
@@ -1,7 +1,11 @@
<section class="docs-build__hero docs__hero">
<div class="docs__hero-content">
<h1 class="docs__hero-title">{{ .title }}</h1>
<a href="{{ .startedButton.url }}" {{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm docs__hero-button">
<a
href="{{ .startedButton.url }}"
{{ if strings.HasPrefix .startedButton.url "https://" }}target="_blank"{{ end }}
class="button button_outlined button_sm docs__hero-button"
>
{{ .startedButton.text }}
</a>
</div>
@@ -6,7 +6,12 @@
<div class="row align-items-center">
<div class="docs-core__developing-block-text col-12 col-lg-7">
<h3 class="docs-core__developing-bloc-title">{{ .developingBlock.title }}</h3>
<a href="{{ .developingBlock.button.url }}" {{ if strings.HasPrefix .developingBlock.url "https://" }}target="_blank"{{ end }} class="button button_outlined button_sm" target="_blank">
<a
href="{{ .developingBlock.button.url }}"
{{ if strings.HasPrefix .developingBlock.url "https://" }}target="_blank"{{ end }}
class="button button_outlined button_sm"
target="_blank"
>
{{ .developingBlock.button.text }}
</a>
</div>
@@ -30,15 +30,15 @@
<!-- Optional list, separated by a delimiter. Only rendered if the card has a list. -->
{{ if .card.list }}
<div class="divider mt-2"></div>
{{ if .card.list.title }}
<p class="docs-card__description docs-card__list-title">{{ .card.list.title }}</p>
<div class="divider mt-2"></div>
{{ if .card.list.title }}
<p class="docs-card__description docs-card__list-title">{{ .card.list.title }}</p>
{{ end }}
<ul class="docs-card__description docs-card__list-element mb-2">
{{ range .card.list.elements }}
<li>{{ . }}</li>
{{ end }}
<ul class="docs-card__description docs-card__list-element mb-2">
{{ range .card.list.elements }}
<li>{{ . }}</li>
{{ end }}
</ul>
</ul>
{{ end }}
{{ if .card.link.text }}
@@ -10,7 +10,6 @@
<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 eq .Section "articles" }}
{{ $subject := site.GetPage "articles" }}
{{ $currentNode := .Params }}
@@ -32,6 +31,7 @@
{{ $category := .Params.category }}
<div class="docs-articles__posts">
<div class="row gy-4">
{{ $list := first 0 site.Pages }}
@@ -68,11 +68,13 @@
<div class="docs-articles docs-articles__list">
{{ partial "documentation/breadcrumbs" . }}
<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 }}
@@ -115,17 +117,26 @@
<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"/>
<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 }}
Back to
{{ .Params.Title }}
{{ end }}
</a>
<h1 class="documentation-article__header-title">{{ .Params.title }}</h1>
@@ -140,9 +151,9 @@
<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>
<picture class="documentation-article__preview">
{{ partial "preview-image" (dict "context" . "default_file_name" "title.jpg" "preview_file" .Params.title_preview_image) }}
</picture>
{{ end }}
</div>
@@ -168,6 +179,7 @@
{{ partial "documentation/breadcrumbs" . }}
{{ end }}
<article class="documentation-article">
{{ partial "article-content.html" . }}
</article>
@@ -2,11 +2,19 @@
<section class="docs-feedback d-print-none">
<h5 class="docs-feedback__title">{{ .Params.title }}</h5>
<div class="docs-feedback__buttons">
<button class="button button_outlined button_sm docs-feedback__button" id="feedback__answer_yes" data-metric-loc="useful_prompt_yes">
<button
class="button button_outlined button_sm docs-feedback__button"
id="feedback__answer_yes"
data-metric-loc="useful_prompt_yes"
>
<img src="{{ .Params.positiveButton.icon.src }}" alt="{{ .Params.positiveButton.icon.alt }}" />
{{ .Params.positiveButton.text }}
</button>
<button class="button button_outlined button_sm docs-feedback__button" id="feedback__answer_no" data-metric-loc="useful_prompt_no">
<button
class="button button_outlined button_sm docs-feedback__button"
id="feedback__answer_no"
data-metric-loc="useful_prompt_no"
>
<img src="{{ .Params.negativeButton.icon.src }}" alt="{{ .Params.negativeButton.icon.alt }}" />
{{ .Params.negativeButton.text }}
</button>
@@ -2,16 +2,16 @@
{{ 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>
<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">
<span>{{ .Params.copyright }}</span>
@@ -1,97 +1,59 @@
<header class="docs-header">
{{ $partition := partial "get-partition.html" (dict "page" .) }}
<div class="main-menu z-5">
{{ with (.Site.GetPage "/headless/docs-header") }}
<a href="{{ .Params.logoLink }}">
{{ partial "logo.html" . }}
</a>
<div class="main-menu z-5">
{{ with (.Site.GetPage "/headless/docs-header") }}
<a href="{{ .Params.logoLink }}">
{{ partial "logo.html" . }}
</a>
<div class="d-flex d-xl-none justify-content-end align-items-center gap-4">
<div class="d-block d-xl-none">
{{ partial "theme-switch" . }}
</div>
<button type="button" class="main-menu__trigger">{{ partial "svg" "hamburger-menu-white.svg" }}</button>
</div>
<ul class="main-menu__links">
{{ range $index, $element := .Params.menuItems }}
<li class="main-menu__item">
{{ if .url }}
<a
class="menu-link {{- if eq (lower .name) $partition }}active{{- end -}}"
href="{{ .url }}"
{{ if (eq $index 4) }}target="_blank"{{ end }}
>
{{ .name }}
</a>
{{ else }}
<span>{{ .name }}</span>
{{ end }}
{{ if .subMenuItems }}
<ul class="main-menu__submenu">
{{ if .url }}
<li class="main-menu__section-link">
<a class="link link_neutral link_sm" href="{{ .url }}">
{{ .name }}
</a>
</li>
{{ end }}
{{ range .subMenuItems }}
<li class="main-menu__submenu-item">
<a
href="{{ .url }}"
{{ if strings.HasPrefix .url "http" }}target="_blank" rel="noopener noreferrer nofollow"{{ end }}
>
<img src="/img/menu/{{ .icon }}" draggable="false" />
<span>{{ .name }}</span>
</a>
</li>
{{ end }}
</ul>
{{ end }}
</li>
{{ end }}
</ul>
<div class="main-menu__buttons">
<div class="main-menu__buttons-input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
type="button"
name="search"
data-target="#searchModal"
>
Search
</button>
</div>
<div class="d-flex d-xl-none justify-content-end align-items-center gap-4">
<div class="d-block d-xl-none">
{{ partial "theme-switch" . }}
<a data-metric-loc="nav" href="{{ .Params.logIn.url }}" class="menu-link mx-3" target="_blank"
>{{ .Params.logIn.text }}</a
>
<a
data-metric-loc="nav"
href="{{ .Params.startFree.url }}"
class="button button_contained button_sm"
target="_blank"
>
{{ .Params.startFree.text }}
</a>
</div>
{{end}}
</div>
<button type="button" class="main-menu__trigger">{{ partial "svg" "hamburger-menu-white.svg" }}</button>
</div>
<div class="menu-mobile">
{{ with (.Site.GetPage "/headless/docs-header") }}
<div class="menu-mobile__header">
{{ partial "logo.html" . }}
<div class="d-flex d-xl-none justify-content-end align-items-center gap-4">
<div class="d-block d-xl-none">
{{ partial "theme-switch" . }}
</div>
<button type="button" class="menu-mobile__close">{{ partial "svg" "close-white.svg" }}</button>
</div>
</div>
<ul class="main-menu__links">
{{ range $index, $element := .Params.menuItems }}
<li class="main-menu__item">
{{ if .url }}
<a
class="menu-link {{- if eq (lower .name) $partition }}active{{- end -}}"
href="{{ .url }}"
{{ if (eq $index 4) }}target="_blank"{{ end }}
>
{{ .name }}
</a>
{{ else }}
<span>{{ .name }}</span>
{{ end }}
{{ if .subMenuItems }}
<ul class="main-menu__submenu">
{{ if .url }}
<li class="main-menu__section-link">
<a class="link link_neutral link_sm" href="{{ .url }}">
{{ .name }}
</a>
</li>
{{ end }}
{{ range .subMenuItems }}
<li class="main-menu__submenu-item">
<a
href="{{ .url }}"
{{ if strings.HasPrefix .url "http" }}target="_blank" rel="noopener noreferrer nofollow"{{ end }}
>
<img src="/img/menu/{{ .icon }}" draggable="false" />
<span>{{ .name }}</span>
</a>
</li>
{{ end }}
</ul>
{{ end }}
</li>
{{ end }}
</ul>
<div class="main-menu__buttons">
<div class="main-menu__buttons-input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
@@ -102,25 +64,63 @@
Search
</button>
</div>
{{ partial "theme-switch" . }}
<a data-metric-loc="nav" href="{{ .Params.logIn.url }}" class="menu-link mx-3" target="_blank"
>{{ .Params.logIn.text }}</a
>
<a
data-metric-loc="nav"
href="{{ .Params.startFree.url }}"
class="button button_contained button_sm"
target="_blank"
>
{{ .Params.startFree.text }}
</a>
</div>
{{ end }}
</div>
<ul class="menu-mobile__items">
{{ range $index, $element := .Params.menuItems }}
<li class="menu-mobile__item" data-path="{{ .id }}">
<div class="menu-mobile__item-content">
<a
class="{{ if eq (lower .name) $partition }} active{{ end }}"
href="{{ .url }}"
{{ if (eq $index 4) }}target="_blank"{{ end }}
>
{{ partial "svg" .icon }}
{{ .name }}
</a>
</div>
</li>
{{ end }}
</ul>
{{ end }}
<div class="menu-mobile">
{{ with (.Site.GetPage "/headless/docs-header") }}
<div class="menu-mobile__header">
{{ partial "logo.html" . }}
<div class="d-flex d-xl-none justify-content-end align-items-center gap-4">
<div class="d-block d-xl-none">
{{ partial "theme-switch" . }}
</div>
<button type="button" class="menu-mobile__close">{{ partial "svg" "close-white.svg" }}</button>
</div>
</div>
{{ partial "documentation/sidebar-menu" (dict "context" . "partition" $partition) }}
</div>
<div class="main-menu__buttons-input">
<button
class="qdr-search-input-btn q-input input_md input_light-bg"
type="button"
name="search"
data-target="#searchModal"
>
Search
</button>
</div>
<ul class="menu-mobile__items">
{{ range $index, $element := .Params.menuItems }}
<li class="menu-mobile__item" data-path="{{ .id }}">
<div class="menu-mobile__item-content">
<a
class="{{ if eq (lower .name) $partition }}active{{ end }}"
href="{{ .url }}"
{{ if (eq $index 4) }}target="_blank"{{ end }}
>
{{ partial "svg" .icon }}
{{ .name }}
</a>
</div>
</li>
{{ end }}
</ul>
{{ end }}
{{ partial "documentation/sidebar-menu" (dict "context" . "partition" $partition) }}
</div>
</header>
@@ -3,8 +3,6 @@
{{ $currentNode := .context }}
<div class="docs-menu">
<div id="sidebar" class="docs-menu__content">
{{ if eq $currentNode.Section "articles" }}
<h3 class="docs-menu__links-title">Articles</h3>
<nav>
@@ -15,7 +13,7 @@
{{ if .Params.isCategoryPage }}
<div
class="docs-menu__articles-link docs-menu__links-group-heading
{{ if eq .File.UniqueID $currentNode.File.UniqueID }} active{{ end }}"
{{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}"
>
<a href="{{ .Params.url }}">{{ .Params.title }}</a>
</div>
@@ -30,18 +28,24 @@
{{ $subject := $currentNode }}
{{ if eq $numLevels 1 }}
{{ $subject = $currentNode }} <!-- top-level, `/documentation` -->
{{ if eq $numLevels 1 }}
{{ $subject = $currentNode }}
<!-- top-level, `/documentation` -->
{{ else if eq $numLevels 2 }}
{{ $subject = $currentNode.Parent }} <!-- not top-level, `/documentation/essentials` -->
{{ $subject = $currentNode.Parent }}
<!-- not top-level, `/documentation/essentials` -->
{{ else if eq $numLevels 3 }}
{{ $subject = $currentNode.Parent.Parent }} <!-- not top-level, `/documentation/essentials/day-0` -->
{{ $subject = $currentNode.Parent.Parent }}
<!-- not top-level, `/documentation/essentials/day-0` -->
{{ else if eq $numLevels 4 }}
{{ $subject = $currentNode.Parent.Parent.Parent }} <!-- not top-level, `/documentation/essentials/day-0/introduction` -->
{{ $subject = $currentNode.Parent.Parent.Parent }}
<!-- not top-level, `/documentation/essentials/day-0/introduction` -->
{{ else }}
{{ $subject = $currentNode.Parent.Parent.Parent }} <!-- not top-level, `/documentation/essentials/day-0/introduction/overview` -->
{{ $subject = $currentNode.Parent.Parent.Parent }}
<!-- not top-level, `/documentation/essentials/day-0/introduction/overview` -->
{{ end }}
<nav class="docs-menu__links">
{{ range $subject.Pages }}
{{ if and (eq .Params.partition $partition) (not .Params.hideInSidebar) }}
@@ -50,6 +54,7 @@
{{ else if eq .Params.type "reference" }}
{{ $page := site.GetPage .Params.reference }}
<div
class="docs-menu__links-group {{ if eq $page.File.UniqueID $currentNode.File.UniqueID }}active{{ end }}
{{- if (eq $page.Params.type "external-link") }}external-link{{ end -}} "
@@ -67,10 +72,7 @@
</a>
</div>
</div>
{{ else }}
{{ if and (.IsPage) (not .Params.hideInSidebar) }}
<div
class="docs-menu__links-group {{ if eq .File.UniqueID $currentNode.File.UniqueID }}active{{ end }}
@@ -152,6 +154,5 @@
</nav>
{{ end }}
</div>
</div>
@@ -5,14 +5,19 @@
<div class="row align-items-lg-center g-5 g-lg-0">
<div class="col-12 col-lg-6 z-1">
<h2 class="edge-demo__title">
{{ .Params.label.title }}: {{ .Params.title }}
{{ .Params.label.title }}:
{{ .Params.title }}
</h2>
<p class="edge-demo__description">{{ .Params.description }}</p>
{{ with .Params.description2 }}
<p class="edge-demo__description edge-demo__description--secondary">{{ . }}</p>
{{ end }}
<div class="edge-demo__buttons">
<a href="{{ .Params.cta.url }}" class="button button_contained button_lg edge-demo__button" target="{{ .Params.cta.target }}">
<a
href="{{ .Params.cta.url }}"
class="button button_contained button_lg edge-demo__button"
target="{{ .Params.cta.target }}"
>
{{ .Params.cta.text }}
</a>
</div>
@@ -4,13 +4,13 @@
<h2 class="edge-features__title">{{ .Params.title }}</h2>
<div class="edge-features__cards row g-4">
{{ range $index, $element := .Params.features }}
<div class="col-12 {{ if eq $index 0 }}col-lg-8{{ else }}col-lg-4 {{ end }}">
<div class="card edge-features__card">
<h6 class="edge-features__card-title">{{ .title }}</h6>
<p class="edge-features__card-description">{{ .description }}</p>
<img class="edge-features__card-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
</div>
</div>
<div class="col-12 {{ if eq $index 0 }}col-lg-8{{ else }}col-lg-4{{ end }}">
<div class="card edge-features__card">
<h6 class="edge-features__card-title">{{ .title }}</h6>
<p class="edge-features__card-description">{{ .description }}</p>
<img class="edge-features__card-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
</div>
</div>
{{ end }}
</div>
</div>
@@ -37,7 +37,12 @@
});
</script>
<div class="hs-form-html" data-region="eu1" data-form-id="3adfb3a8-1c4b-4670-958f-325826039f7e" data-portal-id="139603372"></div>
<div
class="hs-form-html"
data-region="eu1"
data-form-id="3adfb3a8-1c4b-4670-958f-325826039f7e"
data-portal-id="139603372"
></div>
</div>
</div>
</section>
@@ -4,13 +4,13 @@
<h2 class="edge-vectors__title">{{ .Params.title }}</h2>
<div class="edge-vectors__cards row g-4 g-lg-0">
{{ range $index, $element := .Params.cards }}
<div class="edge-vectors__card col-12 col-lg-6">
<div class="edge-vectors__card-info">
<img class="edge-vectors__card-icon" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h5 class="edge-vectors__card-title">{{ .title }}</h5>
<p class="edge-vectors__card-description">{{ .description }}</p>
<div class="edge-vectors__card col-12 col-lg-6">
<div class="edge-vectors__card-info">
<img class="edge-vectors__card-icon" src="{{ .icon.src }}" alt="{{ .icon.alt }}" />
<h5 class="edge-vectors__card-title">{{ .title }}</h5>
<p class="edge-vectors__card-description">{{ .description }}</p>
</div>
</div>
</div>
{{ end }}
</div>
</div>
@@ -8,7 +8,9 @@
<div class="elastic-lucene-cta__description">
{{ .Params.content | safeHTML }}
</div>
<a href="{{ .Params.button.link }}" class="elastic-lucene-cta__button button button_contained button_lg">{{ .Params.button.text }}</a>
<a href="{{ .Params.button.link }}" class="elastic-lucene-cta__button button button_contained button_lg"
>{{ .Params.button.text }}</a
>
</div>
</div>
</div>
@@ -6,29 +6,35 @@
<h1 class="elastic-lucene-hero__title">{{ .Params.title | safeHTML }}</h1>
<p class="elastic-lucene-hero__description">{{ .Params.description }}</p>
{{ if and .Params.startFree .Params.learnMore }}
<div class="elastic-lucene-hero__buttons">
<a href="{{ .Params.startFree.url }}" class="button button_contained button_lg">{{ .Params.startFree.text }}</a>
<a href="{{ .Params.learnMore.url }}" class="button button_outlined button_lg elastic-lucene-hero__button-outlined">{{ .Params.learnMore.text }}</a>
</div>
<div class="elastic-lucene-hero__buttons">
<a href="{{ .Params.startFree.url }}" class="button button_contained button_lg"
>{{ .Params.startFree.text }}</a
>
<a
href="{{ .Params.learnMore.url }}"
class="button button_outlined button_lg elastic-lucene-hero__button-outlined"
>{{ .Params.learnMore.text }}</a
>
</div>
{{ end }}
{{ if .Params.quotes }}
<div class="elastic-lucene-hero__quotes">
<svg
xmlns="http://www.w3.org/2000/svg"
width="1"
height="85"
viewBox="0 0 1 85"
fill="none"
class="elastic-lucene-hero__quotes-line"
>
<path d="M0.5 0.5V84.5" stroke="#8F98B3" stroke-linecap="round" />
</svg>
<div class="elastic-lucene-hero__quotes-list">
{{ range .Params.quotes }}
<p>{{ . }}</p>
{{ end }}
<div class="elastic-lucene-hero__quotes">
<svg
xmlns="http://www.w3.org/2000/svg"
width="1"
height="85"
viewBox="0 0 1 85"
fill="none"
class="elastic-lucene-hero__quotes-line"
>
<path d="M0.5 0.5V84.5" stroke="#8F98B3" stroke-linecap="round" />
</svg>
<div class="elastic-lucene-hero__quotes-list">
{{ range .Params.quotes }}
<p>{{ . }}</p>
{{ end }}
</div>
</div>
</div>
{{ end }}
{{ if .Params.closingText }}
<p class="elastic-lucene-hero__closing">{{ .Params.closingText }}</p>
@@ -4,16 +4,16 @@
<h2 class="enterprise-solutions-capabilities__title">{{ .Params.title }}</h2>
<div class="enterprise-solutions-capabilities__cards">
{{ range .Params.cards }}
<div class="enterprise-solutions-capabilities__card">
<div class="enterprise-solutions-capabilities__card-info">
<h6 class="enterprise-solutions-capabilities__card-title">{{ .title }}</h6>
<p class="enterprise-solutions-capabilities__card-content">{{ .content | safeHTML }}</p>
<a class="enterprise-solutions-capabilities__card-link link link_md" href="{{ .link.url }}">
{{ .link.text }}
</a>
<div class="enterprise-solutions-capabilities__card">
<div class="enterprise-solutions-capabilities__card-info">
<h6 class="enterprise-solutions-capabilities__card-title">{{ .title }}</h6>
<p class="enterprise-solutions-capabilities__card-content">{{ .content | safeHTML }}</p>
<a class="enterprise-solutions-capabilities__card-link link link_md" href="{{ .link.url }}">
{{ .link.text }}
</a>
</div>
<img class="enterprise-solutions-capabilities__card-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
</div>
<img class="enterprise-solutions-capabilities__card-image" src="{{ .image.src }}" alt="{{ .image.alt }}" />
</div>
{{ end }}
</div>
</div>
@@ -5,15 +5,11 @@
<div class="enterprise-solutions-use-cases__cases row g-4">
{{ range $index, $element := .Params.items }}
<div class="{{ if eq $index 0 }}col-12{{ else }}col-12 col-lg-6{{ end }}">
<a
href="{{ .link.url }}"
class="card enterprise-solutions-use-cases__case">
<a href="{{ .link.url }}" class="card enterprise-solutions-use-cases__case">
<div class="enterprise-solutions-use-cases__case-text">
<h3 class="enterprise-solutions-use-cases__case-title">{{ .title }}</h3>
<p class="enterprise-solutions-use-cases__case-description">{{ .description }}</p>
<span
class="enterprise-solutions-use-cases__case-link link link_md align-self-start"
>
<span class="enterprise-solutions-use-cases__case-link link link_md align-self-start">
{{ .link.text }}
</span>
</div>
@@ -10,7 +10,11 @@
<a
href="{{ .context.Params.button.url }}"
class="button button_contained"
target="{{ if eq .context.Params.button.target "self" }}_self{{ else }}_blank{{ end }}"
target="{{ if eq .context.Params.button.target "self" }}
_self
{{ else }}
_blank
{{ end }}"
>
{{ .context.Params.button.text }}
</a>
@@ -29,7 +29,7 @@
{{ $partition := partial "get-partition.html" (dict "page" .) }}
{{ if $partition }}
<meta name="partition" content="{{ $partition | safeHTML }}">
<meta name="partition" content="{{ $partition | safeHTML }}" />
{{ end }}
{{ partial "css" . }}
@@ -17,7 +17,10 @@
</a>
{{ end }}
{{ with .Params.newsletter }}
<a href="{{ .url }}" class="button button_outlined button_lg healthcare-hero__button healthcare-hero__button--secondary">
<a
href="{{ .url }}"
class="button button_outlined button_lg healthcare-hero__button healthcare-hero__button--secondary"
>
{{ .text }}
</a>
{{ end }}

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