From d02aa5f288e0860d8450920874775e84b12d2c62 Mon Sep 17 00:00:00 2001 From: trean Date: Thu, 5 Mar 2026 20:27:48 +0100 Subject: [PATCH] fixes --- .../pricing/qdrant-pricing-features.md | 84 +++++ .../assets/css/partials/_link.scss | 3 +- .../assets/css/partials/pricing/_index.scss | 1 + .../css/partials/pricing/_pricing-table.scss | 303 ++++++++++++++++++ .../pricing/_qdrant-pricing-calculator.scss | 50 ++- .../pricing/_qdrant-pricing-comparison.scss | 259 +-------------- .../pricing/_qdrant-pricing-doors-b.scss | 52 ++- .../pricing/_qdrant-pricing-features.scss | 257 +-------------- .../pricing/_qdrant-pricing-hero.scss | 14 +- .../themes/qdrant-2024/assets/js/index.js | 75 +++-- .../pricing/qdrant-pricing-calculator.html | 68 +--- .../pricing/qdrant-pricing-comparison.html | 265 +-------------- .../pricing/qdrant-pricing-doors.html | 19 +- .../qdrant-pricing-features-table.html | 255 +++++++++++++++ .../pricing/qdrant-pricing-features.html | 266 ++------------- .../partials/pricing/qdrant-pricing-hero.html | 11 +- .../qdrant-2024/static/img/calculator.png | Bin 0 -> 14395 bytes 17 files changed, 817 insertions(+), 1165 deletions(-) create mode 100644 qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_pricing-table.scss create mode 100644 qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features-table.html create mode 100644 qdrant-landing/themes/qdrant-2024/static/img/calculator.png diff --git a/qdrant-landing/content/pricing/qdrant-pricing-features.md b/qdrant-landing/content/pricing/qdrant-pricing-features.md index f60cc8f60..20d88e263 100644 --- a/qdrant-landing/content/pricing/qdrant-pricing-features.md +++ b/qdrant-landing/content/pricing/qdrant-pricing-features.md @@ -68,6 +68,90 @@ sections: paid: 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: paid + text: Deploy on Cloud + url: https://cloud.qdrant.io + contained: true +- tier: premium + text: Deploy on Cloud + url: /contact-us/ + contained: false +onPremiseTiers: +- name: OSS + highlight: false +- name: Free Tier + highlight: false +- name: Paid Tier + highlight: true +- name: Premium Tier + highlight: false +onPremiseSections: +- name: Features + features: + - name: Cloud Inference (on-premise) + oss: false + free: Only external models + paid: true + premium: true + - name: Cloud providers + oss: Depends on customer infra + free: AWS, Azure, GCP + paid: AWS, Azure, GCP + premium: AWS, Azure, GCP + - name: Uptime SLA + oss: false + free: false + paid: "99.5" + premium: "99.9" + - name: Automation + oss: false + free: API, Terraform, Pulumi + paid: API, Terraform, Pulumi + premium: API, Terraform, Pulumi + - name: Vertical Up-Scaling + oss: true + free: false + paid: true + premium: true + - name: Vertical Down-Scaling + oss: No resource usage safe guards + free: false + paid: true + premium: true + - name: Vertical Disk Up-Scaling + oss: Complex, manual process + free: false + paid: true + premium: true + - name: Support Level + oss: Community + free: Community + paid: Standard + premium: Premium + - name: Support Response times + oss: false + free: Best effort + paid: 10x5 + premium: 24x7 + - name: Disk Encryption with custom key + oss: Depends on customer infra + free: false + paid: false + premium: (AWS only) + - name: Enterprise authentication (SSO in Cloud) + oss: false + free: false + paid: false + premium: true +onPremiseCtas: - tier: oss text: Start Free url: https://cloud.qdrant.io diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/_link.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/_link.scss index caa12e73f..2c69f344a 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/_link.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/_link.scss @@ -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; } diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_index.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_index.scss index 3d5c13161..bce55b396 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_index.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_index.scss @@ -4,6 +4,7 @@ @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'; diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_pricing-table.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_pricing-table.scss new file mode 100644 index 000000000..00af8dacd --- /dev/null +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_pricing-table.scss @@ -0,0 +1,303 @@ +@use '../../helpers/functions' as *; + +/* Shared pricing table styles – used by qdrant-pricing-features and qdrant-pricing-comparison */ + +.pricing-table { + &__table { + // border: 0.5px solid $neutral-80; + // border-radius: pxToRem(8); + 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 { + overflow: hidden; + 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-left: 0.5px solid $neutral-80; + border-right: 0.5px solid $neutral-80; + } + } + + &--cta { + padding: $spacer * 2; + 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; + + // .pricing-table__table-cell--feature { + // border-right: 0.5px solid $neutral-80; + // } + .pricing-table__table-cell { + &:first-child { + 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); + } + } + } + + @include media-breakpoint-down(lg) { + &__tier-tabs { + display: flex; + gap: 0; + padding: pxToRem(4); + margin-bottom: $spacer * 1.5; + background-color: $neutral-98; + border: 1px solid $neutral-90; + border-radius: pxToRem(8); + 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); + } + } + + &--feature { + flex: 1; + min-width: 0; + } + } + + &__table-footer { + .pricing-table__table-cell--feature { + display: none; + } + + .pricing-table__table-cell--cta { + width: 100%; + + &[data-tier-col].pricing-table__table-cell--mobile-active { + display: flex; + width: 100%; + justify-content: center; + } + } + } + } +} diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-calculator.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-calculator.scss index e495ebbbb..d07e853ae 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-calculator.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-calculator.scss @@ -44,18 +44,18 @@ align-items: center; justify-content: center; gap: $spacer * 1.5; - padding: $spacer * 1.5 $spacer * 3.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); - max-width: pxToRem(600); margin: 0 auto; + width: fit-content; } &__icon { flex-shrink: 0; - width: 76px; - height: 64px; + height: pxToRem(100); + margin-bottom: -$spacer * 1.5; img { display: block; @@ -68,7 +68,6 @@ &__content { display: flex; flex-direction: column; - gap: $spacer * 0.5; } &__title { @@ -78,6 +77,7 @@ letter-spacing: -0.5px; margin: 0; color: $neutral-20; + white-space: nowrap; } &__link-wrapper { @@ -95,25 +95,7 @@ } &__link { - display: inline-flex; - align-items: center; - gap: 2px; - font-weight: 500; - color: $primary-50; - text-decoration: none; - transition: color 0.2s ease; - - svg { - transition: transform 0.2s ease; - } - - &:hover { - color: $primary-60; - - svg { - transform: translateX(2px); - } - } + font-size: inherit; } @include media-breakpoint-down(md) { @@ -121,23 +103,37 @@ &__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: 76px; - height: 64px; - margin: 0 auto; + 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(20); + font-weight: 600; + line-height: 1.3; + letter-spacing: -0.5px; text-align: center; + white-space: normal; } &__link-wrapper { diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-comparison.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-comparison.scss index 833e834bb..3ca59d92a 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-comparison.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-comparison.scss @@ -109,8 +109,13 @@ color: $primary-50; text-decoration: none; + &::before, + &::after { + height: calc(1ex + 3px); + } + &:hover { - text-decoration: underline; + color: $primary-50; } svg { @@ -151,259 +156,7 @@ padding: 0 0 $spacer * 5; background-color: $neutral-94; - &__table { - border-radius: pxToRem(8); - overflow: hidden; - } - - &__table-header { - display: flex; - } - - &__table-section { - &-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: $spacer * 1.5 $spacer * 2; - background-color: #f5f8ff; - border-top: 0.5px solid $neutral-80; - border-bottom: 0.5px solid $neutral-80; - border-right: 0.5px solid $neutral-80; - cursor: pointer; - user-select: none; - } - - &-title { - font-size: pxToRem(16); - font-weight: 500; - color: $neutral-20; - } - - &-rows { - overflow: hidden; - transition: max-height 0.35s ease; - } - - &--collapsed { - .qdrant-pricing-comparison__chevron { - transform: rotate(180deg); - } - } - } - - &__chevron { - color: $neutral-20; - transition: transform 0.2s ease; - } - - &__table-body { - border-left: 0.5px solid $neutral-80; - } - - &__table-row { - display: flex; - background-color: $neutral-98; - border-bottom: 0.5px solid $neutral-80; - - &:last-child { - border-bottom: none; - } - } - - &__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; - - &--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-top: 0.5px solid $neutral-80; - border-left: 0.5px solid $neutral-80; - - &:first-of-type { - border-top-left-radius: pxToRem(8); - } - - &:last-child { - border-top-right-radius: pxToRem(8); - } - } - - &--highlight { - background-color: #f5f8ff; - } - - &--cta { - padding: $spacer * 1.5 $spacer * 2 $spacer * 1.25; - background-color: $neutral-98; - border-bottom: 0.5px solid $neutral-80; - - &:last-child { - border-bottom-right-radius: pxToRem(8); - } - - .button { - width: pxToRem(160); - padding: $spacer * 0.5 $spacer * 1.375; - font-size: pxToRem(16); - } - } - } - - &__table-footer { - display: flex; - } - - &__check { - color: $secondary-blue-50; - } - - &__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); - } - } - } - @include media-breakpoint-down(lg) { padding: 0 0 $spacer * 4; - - &__tier-tabs { - display: flex; - gap: 0; - padding: pxToRem(4); - margin-bottom: $spacer * 1.5; - background-color: $neutral-98; - border: 1px solid $neutral-90; - border-radius: pxToRem(8); - 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; - - &.qdrant-pricing-comparison__table-cell--mobile-active { - display: flex; - flex: 0 0 auto; - width: pxToRem(144); - } - } - - &--feature { - flex: 1; - min-width: 0; - } - } - - &__table-section-header { - border-top-left-radius: pxToRem(8); - border-top-right-radius: pxToRem(8); - } - - &__table-footer { - .qdrant-pricing-comparison__table-cell--feature { - display: none; - } - - .qdrant-pricing-comparison__table-cell--cta { - width: 100%; - - &[data-tier-col].qdrant-pricing-comparison__table-cell--mobile-active { - display: flex; - width: 100%; - justify-content: center; - } - } - } } } diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-doors-b.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-doors-b.scss index cd2093196..8f2921c2b 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-doors-b.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-doors-b.scss @@ -43,8 +43,16 @@ } } - &__doors { + &__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; @@ -52,13 +60,26 @@ &--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 { - flex: 1; - display: flex; - flex-direction: column; + 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: 1px solid $neutral-90; border-right: none; @@ -163,6 +184,10 @@ 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 { @@ -199,7 +224,7 @@ &__check-icon { flex-shrink: 0; margin-top: 3px; - color: $neutral-30; + color: $primary-50; } &__marketplace { @@ -304,12 +329,27 @@ @include media-breakpoint-down(lg) { padding: 0 0 $spacer * 2; + &__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: 1px solid $neutral-90; border-right: 1px solid $neutral-90; @@ -332,7 +372,7 @@ padding: 0 $spacer * 1.25 $spacer * 2; &__tabs { - width: 100%; + width: fit-content; } } } diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-features.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-features.scss index 002cc5ee7..441e85f19 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-features.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-features.scss @@ -29,6 +29,12 @@ border-radius: pxToRem(8); } + &__table-wrapper { + &--hidden { + display: none; + } + } + &__tab { padding: $spacer * 0.5 $spacer * 1.5; font-size: pxToRem(16); @@ -52,150 +58,6 @@ } } - &__table { - border-radius: pxToRem(8); - overflow: hidden; - } - - &__table-header { - display: flex; - } - - &__table-section { - &-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: $spacer * 1.5 $spacer * 2; - background-color: #f5f8ff; - border-top: 0.5px solid $neutral-80; - border-bottom: 0.5px solid $neutral-80; - border-right: 0.5px solid $neutral-80; - border-top-left-radius: pxToRem(8); - cursor: pointer; - user-select: none; - } - - &-title { - font-size: pxToRem(16); - font-weight: 500; - color: $neutral-20; - } - - &-rows { - overflow: hidden; - transition: max-height 0.35s ease; - } - - &--collapsed { - .qdrant-pricing-features__chevron { - transform: rotate(180deg); - } - } - } - - &__chevron { - color: $neutral-20; - transition: transform 0.2s ease; - } - - &__table-body { - border-left: 0.5px solid $neutral-80; - } - - &__table-row { - display: flex; - background-color: $neutral-98; - border-bottom: 0.5px solid $neutral-80; - - &:last-child { - border-bottom: none; - } - } - - &__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; - - &--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-top: 0.5px solid $neutral-80; - border-left: 0.5px solid $neutral-80; - - &:first-of-type { - border-top-left-radius: pxToRem(8); - } - - &:last-child { - border-top-right-radius: pxToRem(8); - } - } - - &--highlight { - background-color: #f5f8ff; - } - - &--cta { - padding: $spacer * 1.5 $spacer * 2 $spacer * 1.25; - background-color: $neutral-98; - border-bottom: 0.5px solid $neutral-80; - - &:last-child { - border-bottom-right-radius: pxToRem(8); - } - - .button { - width: pxToRem(160); - padding: $spacer * 0.5 $spacer * 1.375; - font-size: pxToRem(16); - } - } - } - - &__table-footer { - display: flex; - } - - &__check { - color: $secondary-blue-50; - } - - &__x { - color: $neutral-60; - } - - &__text { - font-size: pxToRem(14); - color: $neutral-30; - - &--bold { - font-weight: 600; - } - } - - &__tier-tabs { - display: none; - } - &__compare { display: flex; justify-content: center; @@ -212,24 +74,6 @@ align-items: flex-start; gap: $spacer * 2; } - - &__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); - } - } } @include media-breakpoint-down(lg) { @@ -244,94 +88,5 @@ &__title { font-size: pxToRem(32); } - - &__tier-tabs { - display: flex; - gap: 0; - padding: pxToRem(4); - margin-bottom: $spacer * 1.5; - background-color: $neutral-98; - border: 1px solid $neutral-90; - border-radius: pxToRem(8); - 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; - - &.qdrant-pricing-features__table-cell--mobile-active { - display: flex; - flex: 0 0 auto; - width: pxToRem(144); - } - } - - &--feature { - flex: 1; - min-width: 0; - } - } - - &__table-section-header { - border-top-left-radius: pxToRem(8); - border-top-right-radius: pxToRem(8); - } - - &__table-footer { - .qdrant-pricing-features__table-cell--feature { - display: none; - } - - .qdrant-pricing-features__table-cell--cta { - width: 100%; - - &[data-tier-col].qdrant-pricing-features__table-cell--mobile-active { - display: flex; - width: 100%; - justify-content: center; - } - } - } } } diff --git a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-hero.scss b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-hero.scss index 2edb501da..ce50fe7fb 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-hero.scss +++ b/qdrant-landing/themes/qdrant-2024/assets/css/partials/pricing/_qdrant-pricing-hero.scss @@ -96,18 +96,10 @@ font-weight: 500; color: $primary-50; text-decoration: none; - transition: color 0.2s ease; - svg { - transition: transform 0.2s ease; - } - - &:hover { - color: $primary-60; - - svg { - transform: translateX(2px); - } + &::before, + &::after { + height: calc(1ex + 3px); } } diff --git a/qdrant-landing/themes/qdrant-2024/assets/js/index.js b/qdrant-landing/themes/qdrant-2024/assets/js/index.js index 06a3f338e..d114c1a75 100644 --- a/qdrant-landing/themes/qdrant-2024/assets/js/index.js +++ b/qdrant-landing/themes/qdrant-2024/assets/js/index.js @@ -169,11 +169,34 @@ document.addEventListener('DOMContentLoaded', function () { }); // Pricing features tabs (Managed / On-Premise) + function expandFeaturesTableSections(wrapper) { + if (!wrapper || wrapper.classList.contains('qdrant-pricing-features__table-wrapper--hidden')) return; + wrapper.querySelectorAll('.pricing-table__table-section').forEach((section) => { + const rows = section.querySelector('.pricing-table__table-section-rows'); + if (!rows) return; + section.classList.remove('qdrant-pricing-features__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 + ); + }); + // Expand sections in the newly visible table (they get maxHeight:0 when hidden) + const visibleWrapper = document.querySelector(`[data-features-tab="${targetTab}"]`); + requestAnimationFrame(() => { + expandFeaturesTableSections(visibleWrapper); + }); }); }); @@ -181,51 +204,55 @@ document.addEventListener('DOMContentLoaded', function () { function updateMobileTierColumns(activeTier) { const allTierCols = document.querySelectorAll('[data-tier-col]'); allTierCols.forEach((col) => { - col.classList.remove('qdrant-pricing-features__table-cell--mobile-active'); + col.classList.remove('pricing-table__table-cell--mobile-active'); }); const activeCols = document.querySelectorAll(`[data-tier-col="${activeTier}"]`); activeCols.forEach((col) => { - col.classList.add('qdrant-pricing-features__table-cell--mobile-active'); + col.classList.add('pricing-table__table-cell--mobile-active'); }); } - const tierTabs = document.querySelectorAll('.qdrant-pricing-features__tier-tab'); + const tierTabs = document.querySelectorAll('.pricing-table__tier-tab'); if (tierTabs.length) { updateMobileTierColumns(tierTabs[0].dataset.tier); tierTabs.forEach((tab) => { tab.addEventListener('click', () => { - tierTabs.forEach((t) => t.classList.remove('qdrant-pricing-features__tier-tab--active')); - tab.classList.add('qdrant-pricing-features__tier-tab--active'); + tierTabs.forEach((t) => t.classList.remove('pricing-table__tier-tab--active')); + tab.classList.add('pricing-table__tier-tab--active'); updateMobileTierColumns(tab.dataset.tier); }); }); } // Pricing features section collapse/expand - document.querySelectorAll('.qdrant-pricing-features__table-section').forEach((section) => { - const header = section.querySelector('.qdrant-pricing-features__table-section-header'); + document.querySelectorAll('.pricing-table__table-section').forEach((section) => { + const header = section.querySelector('.pricing-table__table-section-header'); const rows = section.querySelector('.qdrant-pricing-features__table-section-rows'); if (!header || !rows) return; - rows.style.maxHeight = rows.scrollHeight + 'px'; + // Only set maxHeight for visible sections (hidden table has scrollHeight 0) + const wrapper = section.closest('[data-features-tab]'); + if (!wrapper?.classList.contains('qdrant-pricing-features__table-wrapper--hidden')) { + rows.style.maxHeight = rows.scrollHeight + 'px'; + } header.addEventListener('click', () => { - const isCollapsed = section.classList.contains('qdrant-pricing-features__table-section--collapsed'); + const isCollapsed = section.classList.contains('pricing-table__table-section--collapsed'); if (isCollapsed) { rows.style.maxHeight = rows.scrollHeight + 'px'; - section.classList.remove('qdrant-pricing-features__table-section--collapsed'); + section.classList.remove('pricing-table__table-section--collapsed'); } else { rows.style.maxHeight = rows.scrollHeight + 'px'; requestAnimationFrame(() => { rows.style.maxHeight = '0px'; - section.classList.add('qdrant-pricing-features__table-section--collapsed'); + section.classList.add('pricing-table__table-section--collapsed'); }); } }); rows.addEventListener('transitionend', () => { - if (!section.classList.contains('qdrant-pricing-features__table-section--collapsed')) { + if (!section.classList.contains('pricing-table__table-section--collapsed')) { rows.style.maxHeight = 'none'; } }); @@ -249,51 +276,51 @@ document.addEventListener('DOMContentLoaded', function () { function updateComparisonMobileTierColumns(activeTier) { const allTierCols = document.querySelectorAll('.qdrant-pricing-comparison [data-tier-col]'); allTierCols.forEach((col) => { - col.classList.remove('qdrant-pricing-comparison__table-cell--mobile-active'); + col.classList.remove('pricing-table__table-cell--mobile-active'); }); const activeCols = document.querySelectorAll(`.qdrant-pricing-comparison [data-tier-col="${activeTier}"]`); activeCols.forEach((col) => { - col.classList.add('qdrant-pricing-comparison__table-cell--mobile-active'); + col.classList.add('pricing-table__table-cell--mobile-active'); }); } - const comparisonTierTabs = document.querySelectorAll('.qdrant-pricing-comparison__tier-tab'); + const comparisonTierTabs = document.querySelectorAll('.qdrant-pricing-comparison .pricing-table__tier-tab'); if (comparisonTierTabs.length) { updateComparisonMobileTierColumns(comparisonTierTabs[0].dataset.tier); comparisonTierTabs.forEach((tab) => { tab.addEventListener('click', () => { - comparisonTierTabs.forEach((t) => t.classList.remove('qdrant-pricing-comparison__tier-tab--active')); - tab.classList.add('qdrant-pricing-comparison__tier-tab--active'); + comparisonTierTabs.forEach((t) => t.classList.remove('pricing-table__tier-tab--active')); + tab.classList.add('pricing-table__tier-tab--active'); updateComparisonMobileTierColumns(tab.dataset.tier); }); }); } // Pricing comparison section collapse/expand - document.querySelectorAll('.qdrant-pricing-comparison__table-section').forEach((section) => { - const header = section.querySelector('.qdrant-pricing-comparison__table-section-header'); - const rows = section.querySelector('.qdrant-pricing-comparison__table-section-rows'); + document.querySelectorAll('.qdrant-pricing-comparison .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; rows.style.maxHeight = rows.scrollHeight + 'px'; header.addEventListener('click', () => { - const isCollapsed = section.classList.contains('qdrant-pricing-comparison__table-section--collapsed'); + const isCollapsed = section.classList.contains('pricing-table__table-section--collapsed'); if (isCollapsed) { rows.style.maxHeight = rows.scrollHeight + 'px'; - section.classList.remove('qdrant-pricing-comparison__table-section--collapsed'); + section.classList.remove('pricing-table__table-section--collapsed'); } else { rows.style.maxHeight = rows.scrollHeight + 'px'; requestAnimationFrame(() => { rows.style.maxHeight = '0px'; - section.classList.add('qdrant-pricing-comparison__table-section--collapsed'); + section.classList.add('pricing-table__table-section--collapsed'); }); } }); rows.addEventListener('transitionend', () => { - if (!section.classList.contains('qdrant-pricing-comparison__table-section--collapsed')) { + if (!section.classList.contains('pricing-table__table-section--collapsed')) { rows.style.maxHeight = 'none'; } }); diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-calculator.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-calculator.html index 8ba139cae..3ac8d2520 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-calculator.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-calculator.html @@ -6,78 +6,14 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

{{ .Params.title }}

diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-comparison.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-comparison.html index fdd1b3c74..cb72d96a3 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-comparison.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-comparison.html @@ -51,17 +51,8 @@ {{ .text }} {{ end }} {{ with .Params.link }} - + {{ .text }} - - - {{ end }}
@@ -71,254 +62,10 @@
-
- {{ range $index, $tier := .Params.tiers }} - - {{ end }} -
- -
-
-
- {{ range .Params.tiers }} -
- {{ .name }} -
- {{ end }} -
- -
- {{ range .Params.sections }} -
-
- {{ .name }} - - - -
-
- {{ range .features }} -
-
- {{ .name }} -
-
- {{ if eq .oss true }} - - - - {{ else if eq .oss false }} - - - - {{ else }} - {{ .oss }} - {{ end }} -
-
- {{ if eq .free true }} - - - - {{ else if eq .free false }} - - - - {{ else }} - {{ .free }} - {{ end }} -
-
- {{ if eq .paid true }} - - - - {{ else if eq .paid false }} - - - - {{ else }} - {{ .paid }} - {{ end }} -
-
- {{ if eq .premium true }} - - - - {{ else if eq .premium false }} - - - - {{ else }} - {{ .premium }} - {{ end }} -
-
- {{ end }} -
-
- {{ end }} -
- - -
+ {{ partial "pricing/qdrant-pricing-features-table" (dict + "tiers" .Params.tiers + "sections" .Params.sections + "ctas" .Params.ctas + ) }}
diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html index 5040bf0c2..18557c83b 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-doors.html @@ -11,12 +11,14 @@
{{/* Per-tab pricing tiers */}} +
{{ range .context.Params.tabs }}
{{ range .tiers }} + {{ $tier := . }}
{{/* Heading */}}
@@ -24,15 +26,9 @@ {{ if .badge }}
Runs on - - - + + +
{{ end }} @@ -79,7 +75,7 @@ {{/* Marketplace logos */}} - {{ with $.marketplace }} + {{ with $tier.marketplace }}

{{ .label }}

@@ -171,7 +167,7 @@ {{ end }} {{/* Contact link for premium tier */}} - {{ with $.contactLink }} + {{ with $tier.contactLink }} {{ .text }} @@ -228,5 +224,6 @@ {{ end }}
{{ end }} +
diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features-table.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features-table.html new file mode 100644 index 000000000..09de80367 --- /dev/null +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features-table.html @@ -0,0 +1,255 @@ +{{ $tiers := .tiers }} +{{ $sections := .sections }} +{{ $ctas := .ctas }} +{{ $tierCols := slice "oss" "free-tier" "paid-tier" "premium-tier" }} + + diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features.html index 9a0b66786..669bae067 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-features.html @@ -10,253 +10,29 @@
- {{/* Mobile tier tabs */}} -
- {{ range $index, $tier := .Params.tiers }} - - {{ end }} + {{/* Managed table */}} +
+ {{ partial "pricing/qdrant-pricing-features-table" (dict + "tiers" .Params.tiers + "sections" .Params.sections + "ctas" .Params.ctas + ) }}
-
-
-
- {{ range .Params.tiers }} -
- {{ .name }} -
- {{ end }} -
- -
- {{ range .Params.sections }} -
-
- {{ .name }} - - - -
-
- {{ range .features }} -
-
- {{ .name }} -
-
- {{ if eq .oss true }} - - - - {{ else if eq .oss false }} - - - - {{ else }} - {{ .oss }} - {{ end }} -
-
- {{ if eq .free true }} - - - - {{ else if eq .free false }} - - - - {{ else }} - {{ .free }} - {{ end }} -
-
- {{ if eq .paid true }} - - - - {{ else if eq .paid false }} - - - - {{ else }} - {{ .paid }} - {{ end }} -
-
- {{ if eq .premium true }} - - - - {{ else if eq .premium false }} - - - - {{ else }} - {{ .premium }} - {{ end }} -
-
- {{ end }} -
-
- {{ end }} -
- - + {{/* On-Premise table */}} +
+ {{ partial "pricing/qdrant-pricing-features-table" (dict + "tiers" .Params.onPremiseTiers + "sections" .Params.onPremiseSections + "ctas" .Params.onPremiseCtas + "classPrefix" "qdrant-pricing-features" + ) }}
{{ with .Params.compareButton }} diff --git a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-hero.html b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-hero.html index 2c2482920..694a51acb 100644 --- a/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-hero.html +++ b/qdrant-landing/themes/qdrant-2024/layouts/partials/pricing/qdrant-pricing-hero.html @@ -14,17 +14,8 @@ {{ end }} {{ with .Params.link }} - + {{ .text }} - - - {{ end }}
diff --git a/qdrant-landing/themes/qdrant-2024/static/img/calculator.png b/qdrant-landing/themes/qdrant-2024/static/img/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..be7b09f773f1a5622da1c28b60584d23fbe2311f GIT binary patch literal 14395 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

(mj#xF=(P-gnLJ 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 jSy!Ri5O_1Ve1oe?)^9L##;W<}2RIoCMe!<8