diff --git a/static/css/marketing.css b/static/css/marketing.css index 5384713..246c823 100644 --- a/static/css/marketing.css +++ b/static/css/marketing.css @@ -49,6 +49,7 @@ --color-green-700: oklch(52.7% 0.154 150.069); --color-green-800: oklch(44.8% 0.119 151.328); --color-green-900: oklch(39.3% 0.095 152.535); + --color-emerald-300: oklch(84.5% 0.143 164.978); --color-emerald-500: oklch(69.6% 0.17 162.48); --color-emerald-600: oklch(59.6% 0.145 163.225); --color-emerald-700: oklch(50.8% 0.118 165.612); @@ -75,6 +76,7 @@ --color-violet-600: oklch(54.1% 0.281 293.009); --color-violet-700: oklch(49.1% 0.27 292.581); --color-violet-900: oklch(38% 0.189 293.745); + --color-purple-300: oklch(82.7% 0.119 306.383); --color-purple-400: oklch(71.4% 0.203 305.504); --color-purple-500: oklch(62.7% 0.265 303.9); --color-purple-600: oklch(55.8% 0.288 302.321); @@ -141,6 +143,7 @@ --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; --blur-sm: 8px; --blur-xl: 24px; + --blur-3xl: 64px; --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } @@ -354,6 +357,9 @@ .sticky { position: sticky; } + .-inset-8 { + inset: calc(var(--spacing) * -8); + } .inset-0 { inset: calc(var(--spacing) * 0); } @@ -369,9 +375,15 @@ .end { inset-inline-end: var(--spacing); } + .-top-1 { + top: calc(var(--spacing) * -1); + } .-top-3 { top: calc(var(--spacing) * -3); } + .-top-10 { + top: calc(var(--spacing) * -10); + } .top-0 { top: calc(var(--spacing) * 0); } @@ -411,6 +423,9 @@ .top-full { top: 100%; } + .-right-6 { + right: calc(var(--spacing) * -6); + } .right-0 { right: calc(var(--spacing) * 0); } @@ -438,6 +453,9 @@ .right-4 { right: calc(var(--spacing) * 4); } + .-bottom-10 { + bottom: calc(var(--spacing) * -10); + } .bottom-0 { bottom: calc(var(--spacing) * 0); } @@ -450,6 +468,9 @@ .bottom-full { bottom: 100%; } + .-left-10 { + left: calc(var(--spacing) * -10); + } .left-0 { left: calc(var(--spacing) * 0); } @@ -540,8 +561,8 @@ .-mx-4 { margin-inline: calc(var(--spacing) * -4); } - .mx-2 { - margin-inline: calc(var(--spacing) * 2); + .mx-1 { + margin-inline: calc(var(--spacing) * 1); } .mx-3 { margin-inline: calc(var(--spacing) * 3); @@ -627,6 +648,9 @@ .mr-4 { margin-right: calc(var(--spacing) * 4); } + .-mb-\[0\.5rem\] { + margin-bottom: calc(0.5rem * -1); + } .-mb-px { margin-bottom: -1px; } @@ -783,6 +807,9 @@ .h-64 { height: calc(var(--spacing) * 64); } + .h-72 { + height: calc(var(--spacing) * 72); + } .h-\[62px\] { height: 62px; } @@ -795,6 +822,9 @@ .h-\[450px\] { height: 450px; } + .h-\[460px\] { + height: 460px; + } .h-\[500px\] { height: 500px; } @@ -924,6 +954,9 @@ .w-56 { width: calc(var(--spacing) * 56); } + .w-64 { + width: calc(var(--spacing) * 64); + } .w-72 { width: calc(var(--spacing) * 72); } @@ -1089,6 +1122,9 @@ .transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); } + .animate-plus-breathe { + animation: plus-breathe 2s ease-in-out infinite; + } .animate-pulse { animation: var(--animate-pulse); } @@ -1157,6 +1193,9 @@ .grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } + .grid-cols-\[180px_1fr_170px\] { + grid-template-columns: 180px 1fr 170px; + } .flex-col { flex-direction: column; } @@ -1220,6 +1259,9 @@ .gap-8 { gap: calc(var(--spacing) * 8); } + .gap-12 { + gap: calc(var(--spacing) * 12); + } .gap-\[1\.5px\] { gap: 1.5px; } @@ -1272,6 +1314,10 @@ margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); } } + .gap-x-2 { + -moz-column-gap: calc(var(--spacing) * 2); + column-gap: calc(var(--spacing) * 2); + } .gap-x-3 { -moz-column-gap: calc(var(--spacing) * 3); column-gap: calc(var(--spacing) * 3); @@ -1515,6 +1561,9 @@ border-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent); } } + .border-brand-b1 { + border-color: #0062ff; + } .border-brand-border { border-color: #e6ebf2; } @@ -1584,6 +1633,12 @@ border-color: color-mix(in oklab, var(--color-violet-400) 50%, transparent); } } + .border-white\/10 { + border-color: color-mix(in srgb, #fff 10%, transparent); + @supports (color: color-mix(in lab, red, red)) { + border-color: color-mix(in oklab, var(--color-white) 10%, transparent); + } + } .border-white\/20 { border-color: color-mix(in srgb, #fff 20%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1596,6 +1651,18 @@ border-color: color-mix(in oklab, var(--color-white) 30%, transparent); } } + .border-white\/\[0\.05\] { + border-color: color-mix(in srgb, #fff 5%, transparent); + @supports (color: color-mix(in lab, red, red)) { + border-color: color-mix(in oklab, var(--color-white) 5%, transparent); + } + } + .border-white\/\[0\.06\] { + border-color: color-mix(in srgb, #fff 6%, transparent); + @supports (color: color-mix(in lab, red, red)) { + border-color: color-mix(in oklab, var(--color-white) 6%, transparent); + } + } .border-white\/\[0\.08\] { border-color: color-mix(in srgb, #fff 8%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1764,6 +1831,12 @@ .bg-blue-600 { background-color: var(--color-blue-600); } + .bg-brand-b1\/10 { + background-color: color-mix(in oklab, #0062ff 10%, transparent); + } + .bg-brand-b1\/15 { + background-color: color-mix(in oklab, #0062ff 15%, transparent); + } .bg-brand-b3\/10 { background-color: color-mix(in oklab, #00c896 10%, transparent); } @@ -1788,6 +1861,12 @@ .bg-brand-navy2 { background-color: #0b1525; } + .bg-emerald-500\/20 { + background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 20%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-emerald-500) 20%, transparent); + } + } .bg-emerald-600 { background-color: var(--color-emerald-600); } @@ -1920,6 +1999,12 @@ .bg-white { background-color: var(--color-white); } + .bg-white\/10 { + background-color: color-mix(in srgb, #fff 10%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 10%, transparent); + } + } .bg-white\/20 { background-color: color-mix(in srgb, #fff 20%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1938,6 +2023,18 @@ background-color: color-mix(in oklab, var(--color-white) 95%, transparent); } } + .bg-white\/\[0\.03\] { + background-color: color-mix(in srgb, #fff 3%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 3%, transparent); + } + } + .bg-white\/\[0\.04\] { + background-color: color-mix(in srgb, #fff 4%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 4%, transparent); + } + } .bg-white\/\[0\.05\] { background-color: color-mix(in srgb, #fff 5%, transparent); @supports (color: color-mix(in lab, red, red)) { @@ -1950,6 +2047,12 @@ background-color: color-mix(in oklab, var(--color-white) 6%, transparent); } } + .bg-white\/\[0\.08\] { + background-color: color-mix(in srgb, #fff 8%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 8%, transparent); + } + } .bg-yellow-50 { background-color: var(--color-yellow-50); } @@ -2233,6 +2336,9 @@ .pb-0 { padding-bottom: calc(var(--spacing) * 0); } + .pb-1 { + padding-bottom: calc(var(--spacing) * 1); + } .pb-2 { padding-bottom: calc(var(--spacing) * 2); } @@ -2345,6 +2451,9 @@ .text-\[11px\] { font-size: 11px; } + .text-\[13px\] { + font-size: 13px; + } .text-\[15px\] { font-size: 15px; } @@ -2420,6 +2529,10 @@ --tw-tracking: 0.2em; letter-spacing: 0.2em; } + .tracking-\[0\.12em\] { + --tw-tracking: 0.12em; + letter-spacing: 0.12em; + } .tracking-tight { --tw-tracking: var(--tracking-tight); letter-spacing: var(--tracking-tight); @@ -2520,6 +2633,9 @@ color: color-mix(in oklab, var(--color-amber-900) 90%, transparent); } } + .text-blue-300 { + color: var(--color-blue-300); + } .text-blue-400 { color: var(--color-blue-400); } @@ -2565,6 +2681,9 @@ .text-brand-navy\/90 { color: color-mix(in oklab, #060d1a 90%, transparent); } + .text-emerald-300 { + color: var(--color-emerald-300); + } .text-emerald-500 { color: var(--color-emerald-500); } @@ -2607,6 +2726,9 @@ .text-orange-600 { color: var(--color-orange-600); } + .text-purple-300 { + color: var(--color-purple-300); + } .text-purple-500 { color: var(--color-purple-500); } @@ -2616,6 +2738,9 @@ .text-red-100 { color: var(--color-red-100); } + .text-red-300 { + color: var(--color-red-300); + } .text-red-400 { color: var(--color-red-400); } @@ -2688,6 +2813,12 @@ color: color-mix(in oklab, var(--color-white) 80%, transparent); } } + .text-white\/90 { + color: color-mix(in srgb, #fff 90%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-white) 90%, transparent); + } + } .text-yellow-400 { color: var(--color-yellow-400); } @@ -2741,6 +2872,20 @@ color: var(--text-muted); } } + .placeholder-white\/40 { + &::-moz-placeholder { + color: color-mix(in srgb, #fff 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-white) 40%, transparent); + } + } + &::placeholder { + color: color-mix(in srgb, #fff 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-white) 40%, transparent); + } + } + } .accent-brand-b1 { accent-color: #0062ff; } @@ -2810,6 +2955,12 @@ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); } + .shadow-black\/40 { + --tw-shadow-color: color-mix(in srgb, #000 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent); + } + } .ring-\[var\(--border-accent\)\] { --tw-ring-color: var(--border-accent); } @@ -2837,6 +2988,10 @@ --tw-blur: blur(8px); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } + .blur-3xl { + --tw-blur: blur(var(--blur-3xl)); + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } .filter { filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); } @@ -3481,6 +3636,16 @@ } } } + .hover\:bg-white\/\[0\.04\] { + &:hover { + @media (hover: hover) { + background-color: color-mix(in srgb, #fff 4%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 4%, transparent); + } + } + } + } .hover\:bg-white\/\[0\.05\] { &:hover { @media (hover: hover) { @@ -4520,6 +4685,11 @@ margin-inline: calc(var(--spacing) * -8); } } + .lg\:mx-0 { + @media (width >= 64rem) { + margin-inline: calc(var(--spacing) * 0); + } + } .lg\:block { @media (width >= 64rem) { display: block; @@ -4596,16 +4766,31 @@ grid-template-columns: 1fr 240px; } } + .lg\:grid-cols-\[1fr_minmax\(0\,560px\)\] { + @media (width >= 64rem) { + grid-template-columns: 1fr minmax(0,560px); + } + } .lg\:flex-row { @media (width >= 64rem) { flex-direction: row; } } + .lg\:justify-start { + @media (width >= 64rem) { + justify-content: flex-start; + } + } .lg\:gap-10 { @media (width >= 64rem) { gap: calc(var(--spacing) * 10); } } + .lg\:gap-16 { + @media (width >= 64rem) { + gap: calc(var(--spacing) * 16); + } + } .lg\:border-r { @media (width >= 64rem) { border-right-style: var(--tw-border-style); @@ -4637,6 +4822,11 @@ padding-bottom: calc(var(--spacing) * 8); } } + .lg\:text-left { + @media (width >= 64rem) { + text-align: left; + } + } .xl\:grid-cols-4 { @media (width >= 80rem) { grid-template-columns: repeat(4, minmax(0, 1fr)); @@ -5484,6 +5674,14 @@ transform: translateY(0); } } +@keyframes plus-breathe { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } +} @layer properties { @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { *, ::before, ::after, ::backdrop { diff --git a/templates/marketing/landing.html b/templates/marketing/landing.html index 93af585..dd75bfd 100644 --- a/templates/marketing/landing.html +++ b/templates/marketing/landing.html @@ -5,6 +5,33 @@ {% block content %} {# ===== HERO ===== #} +{# Local keyframes scoped to the hero — audio progress bar loops 50%→75%→50% over 15s #} +
{# Cosmic orbs background — 3 radial gradients (blue 16%, cyan 7%, green 11%) + subtle grid + horizontal accent line #}
-
- {# Eyebrow with gradient text and 0.18em tracking #} -

- TRANSCRIPTION IA · CONFORME LOI 25 · QUÉBEC -

+ {# 2-col grid on lg+: text left, app mockup right. On + {# ---------- COLUMN LEFT: hero copy ---------- #} +
+ {# Eyebrow with gradient text and 0.18em tracking #} +

+ TRANSCRIPTION IA · CONFORME LOI 25 · QUÉBEC +

- {# H1 — clamp typography + grad-text accent on key phrase #} -

- Transcrivez vos réunions - sans risquer votre permis. -

+ {# H1 — clamp typography + grad-text accent on key phrase #} +

+ Transcrivez vos réunions + sans risquer votre permis. +

- {# Sub-headline — ≤25 words, value prop #} -

- DictIA convertit vos audio en texte, résumé et points d'action — 100% au Québec, conforme Barreau, CPA Québec, ChAD et 6 autres ordres professionnels. -

+ {# Sub-headline — ≤25 words, value prop #} +

+ DictIA convertit vos audio en texte, résumé et points d'action — 100% au Québec, conforme Barreau, CPA Québec, ChAD et 6 autres ordres professionnels. +

- {# Dual CTA — primary (demo) + secondary ghost (pricing) #} -
- {% from 'macros/button.html' import button %} - {{ button('Réserver une démo', href='/contact', variant='primary', size='lg') }} - {{ button('Voir les tarifs', href='/tarifs', variant='ghost', size='lg', icon='') }} + {# Dual CTA — primary (demo) + secondary ghost (pricing) #} +
+ {% from 'macros/button.html' import button %} + {{ button('Réserver une démo', href='/contact', variant='primary', size='lg') }} + {{ button('Voir les tarifs', href='/tarifs', variant='ghost', size='lg', icon='') }} +
+ + {# Social proof microcopy — defensible: refers to pre-launch waitlist + factual ordres pros count #} +

+ + + Conçu avec 9 ordres professionnels québécois + + · + Pré-inscription ouverte + · + Lancement printemps 2026 +

- {# Social proof microcopy — defensible: refers to pre-launch waitlist + factual ordres pros count #} -

- - - Conçu avec 9 ordres professionnels québécois - - · - Pré-inscription ouverte - · - Lancement printemps 2026 -

-
+ {# ---------- COLUMN RIGHT: app mockup (lg+ only) ---------- #} + {# /column right #} +
{# /grid #}
-{# ===== TRUST BAR ===== #} +{# ===== TRUST BAR — 9 ordres pros ===== #}
-

- MAPPÉ AUX 9 ORDRES PROFESSIONNELS QUÉBÉCOIS -

- - {# 9 monogram placeholders — stylized, not official logos (licensing) #} -
- {% for ordre in [ - ('Barreau du Québec', 'BAR'), - ('Chambre des notaires du Québec', 'CNQ'), - ('CPA Québec', 'CPA'), - ('ChAD — Chambre de l\'assurance de dommages', 'ChAD'), - ('OACIQ — Courtage immobilier', 'OACIQ'), - ('CMQ — Médecins', 'CMQ'), - ('OIIQ — Infirmières', 'OIIQ'), - ('OPQ — Pharmaciens', 'OPQ'), - ('OEQ — Ergothérapeutes', 'OEQ') - ] %} -
-
- {{ ordre[1] }} -
-

{{ ordre[0] }}

-
- {% endfor %} +
+

+ Mappé aux 9 ordres professionnels québécois +

+

+ L'architecture DictIA est conçue pour répondre aux exigences de confidentialité et d'audit des principaux ordres professionnels du Québec. +

+ {# 9 ordres — uniform card grid, official names, profession labels (no repeated acronyms) #} +
    + {% for ordre in [ + {'acronym': 'Barreau', 'name': 'Barreau du Québec', 'profession': 'Avocats'}, + {'acronym': 'CNQ', 'name': 'Chambre des notaires du Québec', 'profession': 'Notaires'}, + {'acronym': 'CPA', 'name': 'Ordre des CPA du Québec', 'profession': 'Comptables'}, + {'acronym': 'ChAD', 'name': "Chambre de l'assurance de dommages", 'profession': 'Assurance'}, + {'acronym': 'OACIQ', 'name': "Organisme d'autoréglementation du courtage immobilier du Québec", 'profession': 'Courtage immobilier'}, + {'acronym': 'CMQ', 'name': 'Collège des médecins du Québec', 'profession': 'Médecins'}, + {'acronym': 'OIIQ', 'name': 'Ordre des infirmières et infirmiers du Québec', 'profession': 'Infirmières'}, + {'acronym': 'OPQ', 'name': 'Ordre des pharmaciens du Québec', 'profession': 'Pharmaciens'}, + {'acronym': 'OEQ', 'name': 'Ordre des ergothérapeutes du Québec', 'profession': 'Ergothérapeutes'} + ] %} +
  • + + + {{ ordre.name | safe }} + {{ ordre.profession }} + +
  • + {% endfor %} +
+ {# 4 KPI metrics — defensible numbers with footnote attribution #}
{% for kpi in [