From 7d3348c3fd00ac01b1344f2eb472ebe5aba0e402 Mon Sep 17 00:00:00 2001 From: Allison Date: Wed, 29 Apr 2026 10:49:47 -0400 Subject: [PATCH] =?UTF-8?q?polish(marketing):=20refonte=20HYPER=20PRO=20'C?= =?UTF-8?q?omment=20=C3=A7a=20marche'=20=E2=80=94=20purge=20non-brand=20he?= =?UTF-8?q?x=20+=20uniformization=20typo/spacing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor mécanique strict : - Purge 100% des hex non-brand (#0891b2, #a21caf, #e879f9, #1d4ed8, #9333ea, #f5d0fe, #67e8f9, #1e40af, #93c5fd, #9CA3AF, #0e7490, #EF4444 capital) → mapping vers brand-b1/b2/b3 - Standardisation tailles : 0 inline font-size, text-[9px/10px/11px] uniquement (purge 5.5/6/6.5/7/7.5/8/8.5 arbitraires) - 0 font-family inline (utilise font-sans/font-mono Tailwind) Polish device : - Inner screen seam (effet "écran encastré dans bezel") - Notch : intègre speaker grille 3 dots + camera dot dans la dynamic island - Status bar : vraie batterie 80% fill, vrai WiFi 3 arcs concentriques + dot, signal 4 bars croissantes - Logo DictIA 92×28 plus grand (opacité 85%) Polish modes : - Mode 1 : header compact mic+filename+REC, waveform 16 bars symétriques, file card MP3 redesign avec corner fold - Mode 2 : avatars empilés 18×18 avec bordure white/15, bubbles max-width 80%, timestamps text-[9px] - Mode 3 : grille langues text-[10px] line-height 18px, padding 8px, palette stricte b1/b2/b3 - Mode 4 : grid 4×2 cards 42×50, drop staggered 90ms, palette stricte b1/b2/b3 + dc2626 PDF + 374151 TXT - Mode 5 : header counter Inter font-black text-base, connecting lines opacité 0.18 - Mode 6 : breadcrumb compact, toolbar 4 icons, hover row highlight, palette b1/b2/b3 - Mode 0 : chat bubbles uniformisés text-[10px], footer shield emerald (sécurité) Polish right panel IA : - Brain 40×40 cercle gradient brand-b3 (déjà OK) - Badges Mistral 7B (b3 bg) + LOCAL (emerald bg) - 3 metrics : 0ms grad-text · 100% emerald · 24/7 grad-text font-black text-lg - Sovereignty bullets : icon dans cercle 20×20 rounded-full bg-brand-b3/[0.15] - Padding p-5 généreux Polish feature info card sous phone : - Background uniforme bg-white/[0.06] + border-white/[0.10] - Border-left 3px accent activeColor (style tab indicator) - Icon container 32×32 rounded-md - Badge top-right text-[10px] tracking-wider Polish bottom tab bar : - Buttons 34×42, gap-1 serré - Active : bottom border 2px + scale icon 1.15 + drop-shadow color - Labels text-[9px] uppercase tracking-wider - AUTO pill : px-2.5 py-0.5 rounded-full bg-emerald/12 Tests : - +6 assertions polish (forbidden hex purge, screen seam, white/0.06, brand-b3/[0.15], grad-text) - 9/9 fonctionnalites tests pass - 29/29 marketing tests pass (2 conformite failures pré-existantes baseline) Build : npm run build:css → static/css/marketing.css régénéré pour les nouvelles classes arbitraires Co-Authored-By: Claude Opus 4.7 (1M context) --- static/css/marketing.css | 133 +++++- templates/marketing/fonctionnalites.html | 570 ++++++++++++----------- tests/test_marketing_secondary_pages.py | 19 + 3 files changed, 426 insertions(+), 296 deletions(-) diff --git a/static/css/marketing.css b/static/css/marketing.css index 5d7c00c..f4fe078 100644 --- a/static/css/marketing.css +++ b/static/css/marketing.css @@ -363,6 +363,12 @@ .-inset-1 { inset: calc(var(--spacing) * -1); } + .-inset-2 { + inset: calc(var(--spacing) * -2); + } + .-inset-3 { + inset: calc(var(--spacing) * -3); + } .inset-0 { inset: calc(var(--spacing) * 0); } @@ -525,6 +531,9 @@ .left-0\.5 { left: calc(var(--spacing) * 0.5); } + .left-1\.5 { + left: calc(var(--spacing) * 1.5); + } .left-1\/2 { left: calc(1 / 2 * 100%); } @@ -771,6 +780,9 @@ .ml-auto { margin-left: auto; } + .ml-px { + margin-left: 1px; + } .block { display: block; } @@ -984,9 +996,6 @@ .min-h-\[110px\] { min-height: 110px; } - .min-h-\[480px\] { - min-height: 480px; - } .min-h-\[calc\(100vh-62px\)\] { min-height: calc(100vh - 62px); } @@ -1143,9 +1152,6 @@ .max-w-\[300px\] { max-width: 300px; } - .max-w-\[320px\] { - max-width: 320px; - } .max-w-\[820px\] { max-width: 820px; } @@ -1248,10 +1254,6 @@ --tw-translate-y: calc(var(--spacing) * 0); translate: var(--tw-translate-x) var(--tw-translate-y); } - .translate-y-1 { - --tw-translate-y: calc(var(--spacing) * 1); - translate: var(--tw-translate-x) var(--tw-translate-y); - } .translate-y-2 { --tw-translate-y: calc(var(--spacing) * 2); translate: var(--tw-translate-x) var(--tw-translate-y); @@ -1376,6 +1378,12 @@ .flex-wrap { flex-wrap: wrap; } + .content-center { + align-content: center; + } + .content-start { + align-content: flex-start; + } .items-baseline { align-items: baseline; } @@ -1403,6 +1411,12 @@ .justify-start { justify-content: flex-start; } + .justify-items-center { + justify-items: center; + } + .gap-0 { + gap: calc(var(--spacing) * 0); + } .gap-0\.5 { gap: calc(var(--spacing) * 0.5); } @@ -1514,6 +1528,10 @@ -moz-column-gap: calc(var(--spacing) * 6); column-gap: calc(var(--spacing) * 6); } + .gap-x-8 { + -moz-column-gap: calc(var(--spacing) * 8); + column-gap: calc(var(--spacing) * 8); + } .space-x-1 { :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; @@ -1555,6 +1573,9 @@ .gap-y-2 { row-gap: calc(var(--spacing) * 2); } + .gap-y-3 { + row-gap: calc(var(--spacing) * 3); + } .divide-y { :where(& > :not(:last-child)) { --tw-divide-y-reverse: 0; @@ -1655,6 +1676,10 @@ border-style: var(--tw-border-style); border-width: 2px; } + .border-\[1\.5px\] { + border-style: var(--tw-border-style); + border-width: 1.5px; + } .border-\[3px\] { border-style: var(--tw-border-style); border-width: 3px; @@ -1797,6 +1822,9 @@ .border-brand-b3\/20 { border-color: color-mix(in oklab, #c026d3 20%, transparent); } + .border-brand-b3\/30 { + border-color: color-mix(in oklab, #c026d3 30%, transparent); + } .border-brand-b3\/60 { border-color: color-mix(in oklab, #c026d3 60%, transparent); } @@ -2127,6 +2155,9 @@ .bg-brand-b3\/\[0\.08\] { background-color: color-mix(in oklab, #c026d3 8%, transparent); } + .bg-brand-b3\/\[0\.15\] { + background-color: color-mix(in oklab, #c026d3 15%, transparent); + } .bg-brand-bg { background-color: #f7f9fc; } @@ -2753,6 +2784,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); } @@ -2859,12 +2893,21 @@ font-size: var(--text-xs); line-height: var(--tw-leading, var(--text-xs--line-height)); } + .text-\[6\.5px\] { + font-size: 6.5px; + } .text-\[6px\] { font-size: 6px; } + .text-\[7\.5px\] { + font-size: 7.5px; + } .text-\[7px\] { font-size: 7px; } + .text-\[8\.5px\] { + font-size: 8.5px; + } .text-\[8px\] { font-size: 8px; } @@ -2966,10 +3009,6 @@ --tw-tracking: 0.10em; letter-spacing: 0.10em; } - .tracking-\[0\.14em\] { - --tw-tracking: 0.14em; - letter-spacing: 0.14em; - } .tracking-\[0\.16em\] { --tw-tracking: 0.16em; letter-spacing: 0.16em; @@ -3019,6 +3058,9 @@ .whitespace-nowrap { white-space: nowrap; } + .whitespace-pre-line { + white-space: pre-line; + } .whitespace-pre-wrap { white-space: pre-wrap; } @@ -3118,6 +3160,9 @@ .text-brand-b1 { color: #2563eb; } + .text-brand-b1\/60 { + color: color-mix(in oklab, #2563eb 60%, transparent); + } .text-brand-b1\/65 { color: color-mix(in oklab, #2563eb 65%, transparent); } @@ -3373,6 +3418,12 @@ color: color-mix(in oklab, var(--color-white) 85%, 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); } @@ -3641,6 +3692,10 @@ --tw-ease: var(--ease-out); transition-timing-function: var(--ease-out); } + .outline-none { + --tw-outline-style: none; + outline-style: none; + } .select-all { -webkit-user-select: all; -moz-user-select: all; @@ -4696,6 +4751,25 @@ outline-style: none; } } + .focus-visible\:ring-2 { + &:focus-visible { + --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); + } + } + .focus-visible\:ring-brand-b1 { + &:focus-visible { + --tw-ring-color: #2563eb; + } + } + .focus-visible\:ring-white\/40 { + &:focus-visible { + --tw-ring-color: color-mix(in srgb, #fff 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + --tw-ring-color: color-mix(in oklab, var(--color-white) 40%, transparent); + } + } + } .focus-visible\:outline { &:focus-visible { outline-style: var(--tw-outline-style); @@ -5084,12 +5158,6 @@ text-align: right; } } - .sm\:text-6xl { - @media (width >= 40rem) { - font-size: var(--text-6xl); - line-height: var(--tw-leading, var(--text-6xl--line-height)); - } - } .sm\:text-base { @media (width >= 40rem) { font-size: var(--text-base); @@ -5442,6 +5510,16 @@ width: calc(2 / 3 * 100%); } } + .lg\:w-\[280px\] { + @media (width >= 64rem) { + width: 280px; + } + } + .lg\:w-\[320px\] { + @media (width >= 64rem) { + width: 320px; + } + } .lg\:w-auto { @media (width >= 64rem) { width: auto; @@ -5483,11 +5561,6 @@ grid-template-columns: 1fr 240px; } } - .lg\:grid-cols-\[1fr_minmax\(0\,360px\)\] { - @media (width >= 64rem) { - grid-template-columns: 1fr minmax(0,360px); - } - } .lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,420px\)\] { @media (width >= 64rem) { grid-template-columns: minmax(0,1fr) minmax(0,420px); @@ -5498,6 +5571,16 @@ flex-direction: row; } } + .lg\:items-start { + @media (width >= 64rem) { + align-items: flex-start; + } + } + .lg\:justify-center { + @media (width >= 64rem) { + justify-content: center; + } + } .lg\:gap-10 { @media (width >= 64rem) { gap: calc(var(--spacing) * 10); diff --git a/templates/marketing/fonctionnalites.html b/templates/marketing/fonctionnalites.html index 8ae0f6f..b02ff4e 100644 --- a/templates/marketing/fonctionnalites.html +++ b/templates/marketing/fonctionnalites.html @@ -260,11 +260,11 @@ /* ============ DECORATIVE BACKGROUND ============ */ .dictia-section-grid { background-image: - linear-gradient(to right, rgba(15,23,42,0.04) 1px, transparent 1px), - linear-gradient(to bottom, rgba(15,23,42,0.04) 1px, transparent 1px); - background-size: 60px 60px; - mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 0%, transparent 70%); - -webkit-mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 0%, transparent 70%); + linear-gradient(to right, rgba(15,23,42,0.05) 1px, transparent 1px), + linear-gradient(to bottom, rgba(15,23,42,0.05) 1px, transparent 1px); + background-size: 56px 56px; + mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 0%, transparent 75%); + -webkit-mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 0%, transparent 75%); } .dictia-orb-float-1 { animation: dictia-orb-1 14s ease-in-out infinite; will-change: transform; } .dictia-orb-float-2 { animation: dictia-orb-2 18s ease-in-out infinite; will-change: transform; } @@ -277,16 +277,26 @@ position: relative; will-change: box-shadow, border-color; } + /* Inner screen border : effet "écran encastré" subtle entre bezel et écran */ .dictia-phone-shell::before { content: ''; position: absolute; inset: 2px; border-radius: 42px; - border: 1px solid rgba(255,255,255,0.04); + border: 1px solid rgba(255,255,255,0.05); pointer-events: none; - background: linear-gradient(180deg, rgba(255,255,255,0.05) 0%, rgba(255,255,255,0) 30%); + background: linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0) 28%); z-index: 0; } + /* Inner screen seam : ligne 1px entre bezel + écran (look device authentique) */ + .dictia-phone-screen-seam { + position: absolute; + inset: 6px; + border-radius: 38px; + pointer-events: none; + box-shadow: inset 0 0 0 1px rgba(255,255,255,0.04), inset 0 1px 0 0 rgba(255,255,255,0.06); + z-index: 1; + } .dictia-phone-glow-ring { animation: dictia-glow-ring 3.6s ease-in-out infinite; will-change: opacity; } @keyframes dictia-glow-ring { 0%, 100% { opacity: 0.35; } 50% { opacity: 0.7; } } @@ -442,21 +452,19 @@ } - {# Decorative background : grid + floating orbs (desktop only) #} + {# Decorative background : grid + floating orbs (desktop only) — brand-b1/b3 only #}
-

- + {# Eyebrow : grad-text uppercase tracking-widest text-xs avec dot pulse brand-b3 #} +

+ COMMENT ÇA MARCHE

@@ -520,57 +528,60 @@
+ {# Inner screen seam — effet "écran encastré dans le bezel" #} + + {# Ambient overlay — STATIC subtle (pas de tint par mode) #} - {# Notch / Dynamic Island (desktop only via mobile media) #} - - - {# Status bar mobile-style (9:41 + signals) #} -