aiplang 2.11.8 → 2.11.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/aiplang.js CHANGED
@@ -5,7 +5,7 @@ const fs = require('fs')
5
5
  const path = require('path')
6
6
  const http = require('http')
7
7
 
8
- const VERSION = '2.11.8'
8
+ const VERSION = '2.11.10'
9
9
  const RUNTIME_DIR = path.join(__dirname, '..', 'runtime')
10
10
  const cmd = process.argv[2]
11
11
  const args = process.argv.slice(3)
@@ -686,7 +686,7 @@ function generateTypes(app, srcFile) {
686
686
  }
687
687
 
688
688
  lines.push(`// ── aiplang version ──────────────────────────────────────────`)
689
- lines.push(`export const AIPLANG_VERSION = '2.11.8'`)
689
+ lines.push(`export const AIPLANG_VERSION = '2.11.10'`)
690
690
  lines.push(``)
691
691
  return lines.join('\n')
692
692
  }
@@ -1049,6 +1049,12 @@ function parseBlock(line) {
1049
1049
  if(line.startsWith('steps{')) { const m=line.match(/^steps\{([^}]*)\}/);if(m){const vm=line.match(/variant:(\S+)/);return{kind:'steps',items:m[1].split('|').map(it=>{const p=it.trim().split('>');return{num:p[0]?.trim(),title:p[1]?.trim(),desc:p[2]?.trim()}}),variant:vm?.[1]}} }
1050
1050
  if(line.startsWith('compare{')) { const m=line.match(/^compare\{([^}]*)\}/);if(m){const vm=line.match(/variant:(\S+)/);return{kind:'compare',rows:m[1].split('|').map(r=>r.trim().split(':').map(c=>c.trim())),variant:vm?.[1]}} }
1051
1051
  if(line.startsWith('video{')) { const m=line.match(/^video\{([^}]*)\}/);if(m){const pts=m[1].split('|');return{kind:'video',url:pts[0]?.trim(),poster:pts[1]?.trim()}} }
1052
+ if(line.startsWith('bento{')) {
1053
+ const m=line.match(/^bento\{([^}]*)\}/)
1054
+ if(m){const vm=line.match(/variant:(\S+)/);const am=line.match(/animate:(\S+)/)
1055
+ const items=m[1].split('|').map(function(it){const p=it.trim().split('>');return{title:p[0]&&p[0].trim(),desc:p[1]&&p[1].trim(),icon:p[2]&&p[2].trim(),link:p[3]&&p[3].trim()}})
1056
+ return{kind:'bento',items:items,variant:vm&&vm[1],animate:am&&am[1]}}
1057
+ }
1052
1058
  if(line.startsWith('faq{')) {
1053
1059
  const body=line.slice(4,line.lastIndexOf('}')).trim()
1054
1060
  const items=body.split('|').map(i=>{const idx=i.indexOf('>');return{q:i.slice(0,idx).trim(),a:i.slice(idx+1).trim()}}).filter(i=>i.q&&i.a)
@@ -1288,6 +1294,7 @@ function renderBlock(b, page) {
1288
1294
  case 'compare': return rCompare(b)
1289
1295
  case 'video': return rVideo(b)
1290
1296
  case 'gallery': return rGallery(b)
1297
+ case 'bento': return rBento(b)
1291
1298
  case 'raw': return (b.html||'')+'\n'
1292
1299
  case 'html': return `<div class="fx-html">${b.content||''}</div>\n`
1293
1300
  case 'spacer': return `<div class="fx-spacer" style="height:${esc(b.height||'2rem')}"></div>\n`
@@ -1417,8 +1424,11 @@ function rHero(b) {
1417
1424
  else if(f.isLink) ctas+=`<a href="${esc(f.path)}" class="fx-cta">${esc(f.label)}</a>`
1418
1425
  else if(!h1) {
1419
1426
  // *texto* entre asteriscos = gradient text
1420
- const gt = f.text.match(/^\*(.*?)\*$/)
1421
- if(gt) h1=`<h1 class="fx-title"><span class="fx-gradient-text">${esc(gt[1])}</span></h1>`
1427
+ const gt = f.text.match(/^\*(.*?)\*(:warm|:ocean|:purple)?$/)
1428
+ if(gt) {
1429
+ const gradClass = gt[2]=== ':warm' ? 'fx-gradient-text-warm' : gt[2]===':ocean' ? 'fx-gradient-text-ocean' : gt[2]===':purple' ? 'fx-gradient-text-purple' : 'fx-gradient-text'
1430
+ h1=`<h1 class="fx-title"><span class="${gradClass}">${esc(gt[1])}</span></h1>`
1431
+ }
1422
1432
  else h1=`<h1 class="fx-title">${esc(f.text)}</h1>`
1423
1433
  }
1424
1434
  else sub+=`<p class="fx-sub">${esc(f.text)}</p>`
@@ -1428,6 +1438,17 @@ function rHero(b) {
1428
1438
  const inlineStyle = b.style && !b.bg ? ` style="${b.style.replace(/,/g,';')}"` : ''
1429
1439
  if (v === 'landing') {
1430
1440
  return `<section class="fx-hero fx-hero-landing"${bgStyle}><div class="fx-hero-grid"></div><div class="fx-hero-inner">${h1}${sub}${ctas}</div></section>
1441
+ `
1442
+ }
1443
+ if (v === 'mesh') {
1444
+ // Lovable-style warm gradient blobs
1445
+ const meshStyle = b.style ? ` style="${b.style.replace(/,/g,';')}"` : ''
1446
+ return `<section class="fx-hero fx-hero-mesh"${bgStyle}${meshStyle}>
1447
+ <div class="fx-mesh-blob"></div>
1448
+ <div class="fx-mesh-blob"></div>
1449
+ <div class="fx-mesh-blob"></div>
1450
+ <div class="fx-hero-inner">${h1}${sub}${ctas}</div>
1451
+ </section>
1431
1452
  `
1432
1453
  }
1433
1454
  if (h1) h1 = heroBadge + h1
@@ -1481,8 +1502,11 @@ function rRow(b) {
1481
1502
  if(fi===1) return`<h3 class="fx-card-title">${esc(f.text)}</h3>`
1482
1503
  return`<p class="fx-card-body">${esc(f.text)}</p>`
1483
1504
  }).join('')
1505
+ let extraClass=''
1506
+ if(b.variant==='glass'||b.variant==='glassmorphism') extraClass=' fx-card-glass'
1507
+ if(b.variant==='shine') extraClass=' fx-card-shine'
1484
1508
  const bgStyle=b.bg?` style="background:${b.bg}"`:(b.variant==='bordered'?` style="border:1px solid var(--accent,#2563eb)22"`:colorStyle)
1485
- return`<div class="fx-card"${bgStyle}>${inner}</div>`
1509
+ return`<div class="fx-card${extraClass}"${bgStyle}>${inner}</div>`
1486
1510
  }).join('')
1487
1511
  const v=b.variant||''
1488
1512
  const wrapStyle=b.style?` style="${b.style.replace(/,/g,';')}"`:''
@@ -1585,6 +1609,28 @@ function rStatsUpgraded(b) {
1585
1609
 
1586
1610
 
1587
1611
 
1612
+
1613
+ // ── rBento: Lovable-style bento grid ─────────────────────────────
1614
+ function rBento(b) {
1615
+ const v = b.variant||'default'
1616
+ const glassClass = v==='glass' ? ' fx-bento-glass' : ''
1617
+ const cards = (b.items||[]).map(function(item, i) {
1618
+ const large = i===0 && (b.items||[]).length>=4
1619
+ const icon = item.icon ? '<div class="fx-bento-icon">'+esc(item.icon)+'</div>' : ''
1620
+ const title = item.title ? '<div class="fx-bento-title">'+esc(item.title)+'</div>' : ''
1621
+ const desc = item.desc ? '<div class="fx-bento-desc">'+esc(item.desc)+'</div>' : ''
1622
+ let link = ''
1623
+ if(item.link) {
1624
+ const lparts = item.link.split(':'); const lhref=lparts[0]; const llabel=lparts.slice(1).join(':')||item.link
1625
+ link = '<a href="'+esc(lhref)+'" class="fx-bento-link">'+esc(llabel)+' →</a>'
1626
+ }
1627
+ const largeClass = large ? ' fx-bento-large' : ''
1628
+ const shineClass = v==='shine' ? ' fx-card-shine' : ''
1629
+ return '<div class="fx-bento-card'+glassClass+largeClass+shineClass+'">'+icon+'<div class="fx-bento-body">'+title+desc+link+'</div></div>'
1630
+ }).join('')
1631
+ const animC = b.animate==='stagger'?' fx-animate-stagger':b.animate?' fx-animate':''
1632
+ return '<div class="fx-bento'+animC+'">'+cards+'</div>\n'
1633
+ }
1588
1634
  // ── rMarquee: faixa de logos/texto em loop infinito ───────────────
1589
1635
  function rMarquee(b) {
1590
1636
  const speed = b.variant === 'fast' ? '15s' : b.variant === 'slow' ? '40s' : '25s'
@@ -1801,868 +1847,965 @@ function genCustomThemeVars(ct) {
1801
1847
 
1802
1848
  function genThemeVarCSS(t) {
1803
1849
  const r=[]
1804
- // Override CSS custom properties com valores do ~theme
1805
- const rootVars = []
1806
- if(t.accent) {
1807
- // Converter hex para rgb para --aip-accent-rgb
1808
- const hex = t.accent.replace('#','')
1809
- const rgb = hex.length===6 ? `${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)}` : '255,87,34'
1810
- rootVars.push(`--aip-accent:${t.accent}`)
1811
- rootVars.push(`--aip-accent-rgb:${rgb}`)
1812
- rootVars.push(`--aip-accent-light:${t.accent}cc`)
1813
- }
1814
- if(t.bg) {
1815
- const hex = t.bg.replace('#','')
1816
- const rgb = hex.length===6 ? `${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)}` : '3,7,18'
1817
- rootVars.push(`--aip-bg:${t.bg}`)
1818
- rootVars.push(`--aip-bg-rgb:${rgb}`)
1819
- }
1820
- if(t.text) rootVars.push(`--aip-text:${t.text}`)
1821
- if(rootVars.length) r.push(`:root{${rootVars.join(';')}}`)
1822
- if(t.accent) r.push(`.fx-cta,.fx-btn,.fx-pricing-cta{background:${t.accent}!important;color:#fff!important}`)
1823
- if(t.bg) r.push(`body{background:${t.bg}!important}`)
1824
- if(t.text) r.push(`body{color:${t.text}!important}`)
1825
- if(t.font) r.push(`@import url('https://fonts.googleapis.com/css2?family=${t.font.replace(/ /g,'+')}:wght@400;700;900&display=swap');body{font-family:'${t.font}',system-ui,sans-serif!important}`)
1826
- if(t.radius) r.push(`.fx-card,.fx-form,.fx-btn,.fx-input,.fx-cta,.fx-pricing-card{border-radius:${t.radius}!important}`)
1827
- if(t.surface) r.push(`.fx-card,.fx-form{background:${t.surface}!important}`)
1828
- if(t.border) r.push(`.fx-card,.fx-form,.fx-input{border-color:${t.border}!important}`)
1829
- if(t.shadow) r.push(`.fx-card:hover{box-shadow:${t.shadow}!important}`)
1830
- if(t.navbg) r.push(`.fx-nav{background:${t.navbg}!important}`)
1831
- if(t.spacing) r.push(`.fx-sect,.fx-hero{padding-top:${t.spacing};padding-bottom:${t.spacing}}`)
1850
+ const rv=[]
1851
+ function h2r(h){h=h.replace('#','');return h.length===6?parseInt(h.slice(0,2),16)+','+parseInt(h.slice(2,4),16)+','+parseInt(h.slice(4,6),16):'255,255,255'}
1852
+ if(t.accent){rv.push('--aip-accent:'+t.accent);rv.push('--aip-accent-rgb:'+h2r(t.accent))}
1853
+ if(t.bg){var rgb=h2r(t.bg);rv.push('--ds-background-100:'+t.bg);rv.push('--ds-background-100-rgb:'+rgb);rv.push('--ds-background-200:'+t.bg)}
1854
+ if(t.text){rv.push('--ds-gray-1000:'+t.text)}
1855
+ if(t.radius){rv.push('--radius-sm:'+t.radius);rv.push('--radius-md:'+t.radius)}
1856
+ if(rv.length) r.push(':root{'+rv.join(';')+'}')
1857
+ if(t.font) r.push("body{font-family:'"+t.font+"',var(--geist-font)!important}")
1858
+ if(t.accent) r.push('.fx-cta,.fx-btn,.fx-pricing-cta,.fx-nav-cta{background:'+t.accent+'!important;color:#fff!important}')
1859
+ if(t.bg) r.push('body,html{background:'+t.bg+'!important}')
1860
+ if(t.text) r.push('body{color:'+t.text+'!important}')
1832
1861
  return r.join('')
1833
1862
  }
1834
1863
 
1864
+
1835
1865
  function css(theme) {
1836
1866
  // ════════════════════════════════════════════════════════════════
1837
- // DESIGN SYSTEM — CSS custom properties como fundação
1838
- // Cada tema define suas variáveis; todos os componentes usam vars
1867
+ // GEIST DESIGN SYSTEM — Vercel's design language for aiplang
1868
+ // Principles: precision, minimalism, Swiss typography, semantic tokens
1869
+ // Fonts: Geist Sans + Geist Mono (Google Fonts)
1839
1870
  // ════════════════════════════════════════════════════════════════
1840
1871
  const base = `
1841
- :root{
1842
- --aip-font-display:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
1843
- --aip-font-mono:'JetBrains Mono','Fira Code','Cascadia Code','Courier New',monospace;
1844
- --aip-ease-out:cubic-bezier(.16,1,.3,1);
1845
- --aip-ease-spring:cubic-bezier(.34,1.56,.64,1);
1846
- }
1872
+ @import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800;900&family=Geist+Mono:wght@400;500;700&display=swap');
1873
+
1874
+ :root {
1875
+ --geist-font:'Geist','Geist Sans',-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
1876
+ --geist-mono:'Geist Mono','Geist_Mono',ui-monospace,'Cascadia Code','Source Code Pro',Menlo,Consolas,'DejaVu Sans Mono',monospace;
1877
+ /* Spacing scale (4px base) */
1878
+ --space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;
1879
+ --space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;
1880
+ /* Radius */
1881
+ --radius-sm:4px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-full:9999px;
1882
+ /* Easing - Vercel guidelines */
1883
+ --ease-out:cubic-bezier(.16,1,.3,1);
1884
+ --ease-in-out:cubic-bezier(.4,0,.2,1);
1885
+ --ease-spring:cubic-bezier(.34,1.56,.64,1);
1886
+ /* Transitions - only opacity + transform per guidelines */
1887
+ --duration-fast:100ms;--duration-normal:150ms;--duration-slow:250ms;
1888
+ }
1889
+
1890
+ /* ── Reset ── */
1847
1891
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
1848
- html{scroll-behavior:smooth;text-size-adjust:100%;-webkit-text-size-adjust:100%}
1892
+ html{
1893
+ font-size:16px;
1894
+ scroll-behavior:smooth;
1895
+ text-size-adjust:100%;
1896
+ -webkit-text-size-adjust:100%;
1897
+ /* Vercel: tabular nums by default for consistency */
1898
+ font-feature-settings:'ss01','ss02','cv01','cv02';
1899
+ }
1849
1900
  body{
1850
- font-family:var(--aip-font-display);
1851
- background:var(--aip-bg);
1852
- color:var(--aip-text);
1853
- line-height:1.6;
1901
+ font-family:var(--geist-font);
1902
+ background:var(--ds-background-100);
1903
+ color:var(--ds-gray-1000);
1904
+ line-height:1.5;
1854
1905
  -webkit-font-smoothing:antialiased;
1855
1906
  -moz-osx-font-smoothing:grayscale;
1856
1907
  min-height:100vh;
1857
1908
  overflow-x:hidden;
1909
+ /* Reduce banding from gradients */
1910
+ text-rendering:optimizeLegibility;
1858
1911
  }
1859
1912
  a{text-decoration:none;color:inherit}
1860
1913
  img{max-width:100%;height:auto;display:block}
1861
- input,button,select,textarea{font-family:inherit;font-size:inherit}
1862
- button{cursor:pointer}
1863
- code,pre{font-family:var(--aip-font-mono)}
1864
-
1865
- /* ── NOISE OVERLAY ── */
1866
- body::before{
1867
- content:'';
1868
- position:fixed;
1869
- inset:0;
1870
- background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)' opacity='.04'/%3E%3C/svg%3E");
1871
- pointer-events:none;
1872
- z-index:9999;
1873
- opacity:.6;
1874
- mix-blend-mode:overlay;
1914
+ input,button,select,textarea{font-family:var(--geist-font);font-size:inherit}
1915
+ button{cursor:pointer;border:none;background:none}
1916
+ code,pre,kbd{font-family:var(--geist-mono)}
1917
+ /* Vercel guideline: touch-action on interactive elements */
1918
+ button,a,[role=button]{touch-action:manipulation}
1919
+ /* Vercel: visible focus ring */
1920
+ :focus-visible{
1921
+ outline:2px solid var(--ds-blue-700);
1922
+ outline-offset:2px;
1923
+ border-radius:var(--radius-sm);
1924
+ }
1925
+ /* Vercel: honor prefers-reduced-motion */
1926
+ @media(prefers-reduced-motion:reduce){
1927
+ *,*::before,*::after{
1928
+ animation-duration:.01ms!important;
1929
+ animation-iteration-count:1!important;
1930
+ transition-duration:.01ms!important;
1931
+ }
1875
1932
  }
1876
1933
 
1877
1934
  /* ═══════════════════════════════════════════
1878
- NAV
1935
+ NAV — Geist nav style
1879
1936
  ═══════════════════════════════════════════ */
1880
1937
  .fx-nav{
1881
- display:flex;
1882
- align-items:center;
1883
- justify-content:space-between;
1884
- padding:0 2rem;
1885
- height:60px;
1886
- position:sticky;
1887
- top:0;
1888
- z-index:100;
1889
- background:rgba(var(--aip-bg-rgb),.75);
1890
- backdrop-filter:blur(20px) saturate(180%);
1891
- -webkit-backdrop-filter:blur(20px) saturate(180%);
1892
- border-bottom:1px solid var(--aip-border);
1893
- transition:border-color .3s;
1894
- flex-wrap:wrap;
1895
- gap:.5rem;
1896
- }
1897
- .fx-nav.scrolled{border-bottom-color:var(--aip-border-strong)}
1938
+ position:sticky;top:0;z-index:200;
1939
+ display:flex;align-items:center;justify-content:space-between;
1940
+ padding:0 var(--space-6);height:54px;
1941
+ background:var(--ds-background-100);
1942
+ border-bottom:1px solid var(--ds-gray-alpha-400);
1943
+ /* Vercel: backdrop-blur for glass effect */
1944
+ backdrop-filter:blur(16px) saturate(200%);
1945
+ -webkit-backdrop-filter:blur(16px) saturate(200%);
1946
+ background:rgba(var(--ds-background-100-rgb),.92);
1947
+ flex-wrap:wrap;gap:var(--space-2);
1948
+ transition:border-color var(--duration-slow) var(--ease-in-out);
1949
+ }
1950
+ .fx-nav.scrolled{border-bottom-color:var(--ds-gray-alpha-400)}
1898
1951
  .fx-brand{
1899
- font-size:1.125rem;
1900
- font-weight:800;
1901
- letter-spacing:-.04em;
1902
- color:var(--aip-text);
1952
+ font-size:14px;font-weight:600;letter-spacing:-.02em;
1953
+ color:var(--ds-gray-1000);
1903
1954
  }
1904
- .fx-nav-links{display:flex;align-items:center;gap:.25rem}
1955
+ .fx-nav-links{display:flex;align-items:center;gap:2px}
1905
1956
  .fx-nav-link{
1906
- font-size:.8125rem;
1907
- font-weight:500;
1908
- color:var(--aip-text-muted);
1909
- padding:.375rem .75rem;
1910
- border-radius:.5rem;
1911
- transition:background .15s,color .15s;
1957
+ display:inline-flex;align-items:center;
1958
+ font-size:13px;font-weight:400;
1959
+ color:var(--ds-gray-900);
1960
+ padding:5px 10px;border-radius:var(--radius-md);
1961
+ /* Only transition opacity + transform per Vercel guidelines */
1962
+ transition:color var(--duration-normal) var(--ease-in-out),background var(--duration-normal) var(--ease-in-out);
1963
+ }
1964
+ .fx-nav-link:hover{
1965
+ color:var(--ds-gray-1000);
1966
+ background:var(--ds-gray-alpha-200);
1967
+ }
1968
+ /* Vercel CTA button style */
1969
+ .fx-nav-cta{
1970
+ display:inline-flex;align-items:center;gap:6px;
1971
+ height:32px;padding:0 12px;
1972
+ background:var(--ds-gray-1000);
1973
+ color:var(--ds-background-100);
1974
+ font-size:13px;font-weight:500;
1975
+ border-radius:var(--radius-md);
1976
+ transition:opacity var(--duration-normal) var(--ease-in-out);
1912
1977
  white-space:nowrap;
1913
1978
  }
1914
- .fx-nav-link:hover{background:var(--aip-surface-hover);color:var(--aip-text)}
1915
- .fx-nav-cta{
1916
- font-size:.8125rem;
1917
- font-weight:700;
1918
- padding:.4375rem 1rem;
1919
- background:var(--aip-accent);
1920
- color:#fff;
1921
- border-radius:.5rem;
1922
- transition:opacity .15s,transform .1s;
1923
- letter-spacing:-.01em;
1924
- }
1925
- .fx-nav-cta:hover{opacity:.88;transform:translateY(-1px)}
1926
- .fx-hamburger{display:none;flex-direction:column;gap:4px;background:none;border:none;padding:.375rem}
1927
- .fx-hamburger span{display:block;width:20px;height:1.5px;background:var(--aip-text-muted);border-radius:1px;transition:all .2s}
1979
+ .fx-nav-cta:hover{opacity:.85}
1980
+ .fx-hamburger{display:none;flex-direction:column;gap:5px;padding:6px;border-radius:var(--radius-md)}
1981
+ .fx-hamburger span{display:block;width:18px;height:1px;background:var(--ds-gray-900);transition:all var(--duration-normal) var(--ease-in-out)}
1928
1982
  .fx-hamburger.open span:nth-child(1){transform:rotate(45deg) translate(4px,4px)}
1929
- .fx-hamburger.open span:nth-child(2){opacity:0;transform:translateX(-4px)}
1983
+ .fx-hamburger.open span:nth-child(2){opacity:0}
1930
1984
  .fx-hamburger.open span:nth-child(3){transform:rotate(-45deg) translate(4px,-4px)}
1931
1985
  @media(max-width:640px){
1932
1986
  .fx-hamburger{display:flex}
1933
- .fx-nav-links{display:none;width:100%;flex-direction:column;align-items:stretch;padding:.75rem 0;gap:.125rem;border-top:1px solid var(--aip-border);margin-top:.5rem}
1987
+ .fx-nav-links{
1988
+ display:none;width:100%;
1989
+ flex-direction:column;align-items:stretch;
1990
+ padding:8px 0;gap:1px;
1991
+ border-top:1px solid var(--ds-gray-alpha-400);margin-top:8px;
1992
+ }
1934
1993
  .fx-nav-links.open{display:flex}
1935
- .fx-nav-link{padding:.625rem .75rem}
1994
+ .fx-nav-link{padding:8px 10px}
1936
1995
  }
1937
1996
 
1938
1997
  /* ═══════════════════════════════════════════
1939
1998
  HERO
1940
1999
  ═══════════════════════════════════════════ */
1941
2000
  .fx-hero{
1942
- display:flex;
1943
- align-items:center;
1944
- justify-content:center;
1945
- min-height:calc(100vh - 60px);
1946
- padding:5rem 1.5rem 4rem;
1947
- position:relative;
2001
+ display:flex;align-items:center;justify-content:center;
2002
+ min-height:calc(100svh - 54px);
2003
+ padding:80px 24px 64px;
2004
+ position:relative;overflow:hidden;
1948
2005
  }
1949
2006
  .fx-hero-inner{
1950
- max-width:60rem;
2007
+ max-width:960px;width:100%;
1951
2008
  text-align:center;
1952
- display:flex;
1953
- flex-direction:column;
1954
- align-items:center;
1955
- gap:1.75rem;
1956
- position:relative;
1957
- z-index:1;
1958
- }
1959
- .fx-hero-split{
1960
- display:grid;
1961
- grid-template-columns:1fr 1fr;
1962
- gap:4rem;
1963
- align-items:center;
1964
- padding:4rem 2.5rem;
1965
- min-height:80vh;
2009
+ display:flex;flex-direction:column;align-items:center;
2010
+ gap:24px;
2011
+ position:relative;z-index:1;
1966
2012
  }
1967
- @media(max-width:768px){.fx-hero-split{grid-template-columns:1fr;padding:3rem 1.5rem;min-height:auto}}
1968
- .fx-hero-split .fx-hero-inner{text-align:left;align-items:flex-start;max-width:none}
1969
- .fx-hero-img{width:100%;border-radius:1.25rem;border:1px solid var(--aip-border)}
1970
- .fx-hero-minimal{min-height:52vh!important}
1971
- .fx-hero-tall{min-height:100vh!important}
1972
-
1973
- /* Landing variant — grid + glow */
2013
+ .fx-hero-minimal{min-height:50vh!important}
2014
+ .fx-hero-tall{min-height:100svh!important}
2015
+ /* Landing: Vercel-style grid + radial */
1974
2016
  .fx-hero-landing{overflow:hidden}
2017
+ .fx-hero-grid{
2018
+ position:absolute;inset:0;pointer-events:none;
2019
+ background-image:
2020
+ linear-gradient(var(--ds-gray-alpha-200) 1px,transparent 1px),
2021
+ linear-gradient(90deg,var(--ds-gray-alpha-200) 1px,transparent 1px);
2022
+ background-size:48px 48px;
2023
+ mask-image:radial-gradient(ellipse 80% 70% at 50% 0%,black 40%,transparent 100%);
2024
+ -webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 0%,black 40%,transparent 100%);
2025
+ }
2026
+ /* Vercel-style ambient glow */
1975
2027
  .fx-hero-landing::after{
1976
- content:'';
1977
- position:absolute;
1978
- width:900px;height:600px;
2028
+ content:'';position:absolute;
2029
+ width:80vw;height:40vh;max-width:900px;
1979
2030
  border-radius:50%;
1980
- background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.14) 0%,transparent 65%);
1981
- left:50%;top:50%;
1982
- transform:translate(-50%,-55%);
1983
- pointer-events:none;
1984
- animation:fx-breathe 8s ease-in-out infinite;
1985
- }
1986
- @keyframes fx-breathe{0%,100%{transform:translate(-50%,-55%) scale(1)}50%{transform:translate(-50%,-55%) scale(1.12)}}
1987
- .fx-hero-grid{
1988
- position:absolute;inset:0;
1989
- background:
1990
- linear-gradient(var(--aip-grid-line) 1px,transparent 1px),
1991
- linear-gradient(90deg,var(--aip-grid-line) 1px,transparent 1px);
1992
- background-size:64px 64px;
1993
- mask-image:radial-gradient(ellipse 75% 65% at 50% 50%,black 20%,transparent);
1994
- -webkit-mask-image:radial-gradient(ellipse 75% 65% at 50% 50%,black 20%,transparent);
2031
+ background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.08) 0%,transparent 60%);
2032
+ left:50%;top:0;transform:translate(-50%,-20%);
1995
2033
  pointer-events:none;
2034
+ animation:fx-glow 8s ease-in-out infinite;
1996
2035
  }
1997
-
1998
- /* Badge */
1999
- .fx-hero-badge{
2000
- display:inline-flex;align-items:center;gap:.5rem;
2001
- font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;
2002
- padding:.3125rem .875rem;
2003
- border-radius:999px;
2004
- border:1px solid var(--aip-border-strong);
2005
- background:var(--aip-surface);
2006
- color:var(--aip-text-muted);
2007
- }
2008
- .fx-hero-badge-dot{
2009
- width:6px;height:6px;border-radius:50%;
2010
- background:var(--aip-accent);
2011
- animation:fx-pulse 2.5s ease infinite;
2012
- flex-shrink:0;
2013
- }
2014
- @keyframes fx-pulse{0%,100%{opacity:1;box-shadow:0 0 0 0 rgba(var(--aip-accent-rgb),.5)}60%{opacity:.4;box-shadow:0 0 0 6px rgba(var(--aip-accent-rgb),0)}}
2015
-
2016
- /* Typography */
2036
+ @keyframes fx-glow{0%,100%{opacity:.6}50%{opacity:1}}
2037
+ /* Vercel hero typography */
2017
2038
  .fx-title{
2018
- font-size:clamp(2.75rem,7.5vw,6.5rem);
2019
- font-weight:900;
2020
- letter-spacing:-.05em;
2021
- line-height:.92;
2022
- color:var(--aip-text);
2039
+ font-size:clamp(40px,6vw,80px);
2040
+ font-weight:700;
2041
+ letter-spacing:-.04em;
2042
+ line-height:1.05;
2043
+ color:var(--ds-gray-1000);
2023
2044
  }
2024
2045
  .fx-gradient-text{
2025
- background:linear-gradient(135deg,var(--aip-accent) 0%,var(--aip-accent-light) 50%,var(--aip-text) 100%);
2026
- -webkit-background-clip:text;
2027
- -webkit-text-fill-color:transparent;
2028
- background-clip:text;
2046
+ background:linear-gradient(90deg,var(--ds-gray-1000) 0%,var(--ds-gray-700) 100%);
2047
+ -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
2048
+ }
2049
+ /* Override with accent when set */
2050
+ .fx-gradient-text-accent{
2051
+ background:linear-gradient(135deg,var(--ds-gray-1000) 30%,rgba(var(--aip-accent-rgb),1) 100%);
2052
+ -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
2029
2053
  }
2030
2054
  .fx-sub{
2031
- font-size:clamp(1rem,2vw,1.1875rem);
2032
- line-height:1.75;
2033
- color:var(--aip-text-muted);
2034
- max-width:38rem;
2055
+ font-size:clamp(15px,2vw,18px);
2056
+ line-height:1.65;
2057
+ color:var(--ds-gray-900);
2058
+ max-width:540px;font-weight:400;
2035
2059
  }
2036
- .fx-cta{
2037
- display:inline-flex;align-items:center;gap:.5rem;
2038
- padding:.75rem 1.75rem;
2039
- border-radius:.625rem;
2040
- font-weight:700;
2041
- font-size:.9375rem;
2042
- letter-spacing:-.015em;
2043
- transition:transform .15s var(--aip-ease-out),box-shadow .15s,opacity .15s;
2044
- background:var(--aip-accent);
2045
- color:#fff;
2060
+ /* Vercel hero badge */
2061
+ .fx-hero-badge{
2062
+ display:inline-flex;align-items:center;gap:6px;
2063
+ height:28px;padding:0 10px;
2064
+ background:var(--ds-gray-alpha-100);
2065
+ border:1px solid var(--ds-gray-alpha-400);
2066
+ border-radius:var(--radius-full);
2067
+ font-size:12px;font-weight:500;color:var(--ds-gray-900);
2068
+ letter-spacing:.01em;
2069
+ }
2070
+ .fx-hero-badge-dot{
2071
+ width:5px;height:5px;border-radius:50%;
2072
+ background:var(--ds-green-700);
2073
+ animation:fx-pulse 3s ease infinite;flex-shrink:0;
2046
2074
  }
2047
- .fx-cta:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--aip-accent-rgb),.35)}
2075
+ @keyframes fx-pulse{0%,100%{opacity:1}50%{opacity:.4}}
2076
+ /* Vercel CTA button */
2077
+ .fx-cta{
2078
+ display:inline-flex;align-items:center;gap:6px;
2079
+ height:40px;padding:0 20px;
2080
+ background:var(--ds-gray-1000);
2081
+ color:var(--ds-background-100);
2082
+ font-size:14px;font-weight:500;letter-spacing:-.01em;
2083
+ border-radius:var(--radius-md);
2084
+ /* Only transform per Vercel guidelines */
2085
+ transition:opacity var(--duration-normal) var(--ease-in-out),transform var(--duration-normal) var(--ease-out);
2086
+ }
2087
+ .fx-cta:hover{opacity:.88;transform:translateY(-1px)}
2048
2088
  .fx-cta:active{transform:translateY(0)}
2049
2089
  .fx-cta-outline{
2050
2090
  background:transparent!important;
2051
- border:1px solid var(--aip-border-strong)!important;
2052
- color:var(--aip-text)!important;
2053
- box-shadow:none!important;
2091
+ border:1px solid var(--ds-gray-alpha-400)!important;
2092
+ color:var(--ds-gray-900)!important;
2093
+ }
2094
+ .fx-cta-outline:hover{background:var(--ds-gray-alpha-100)!important}
2095
+ /* Vercel hero split */
2096
+ .fx-hero-split{
2097
+ display:grid;grid-template-columns:1fr 1fr;gap:64px;
2098
+ align-items:center;padding:80px 40px;min-height:80vh;
2054
2099
  }
2055
- .fx-cta-outline:hover{background:var(--aip-surface)!important;transform:translateY(-1px)!important}
2100
+ @media(max-width:768px){.fx-hero-split{grid-template-columns:1fr;padding:48px 24px;min-height:auto}}
2101
+ .fx-hero-split .fx-hero-inner{text-align:left;align-items:flex-start;max-width:none}
2102
+ .fx-hero-img{width:100%;border-radius:var(--radius-lg);border:1px solid var(--ds-gray-alpha-400)}
2056
2103
 
2057
2104
  /* ═══════════════════════════════════════════
2058
- STATS BAR
2105
+ STATS BAR — Geist big number style
2059
2106
  ═══════════════════════════════════════════ */
2060
2107
  .fx-stats{
2061
2108
  display:grid;
2062
- grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
2063
- border-top:1px solid var(--aip-border);
2064
- border-bottom:1px solid var(--aip-border);
2109
+ grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
2110
+ border-top:1px solid var(--ds-gray-alpha-400);
2111
+ border-bottom:1px solid var(--ds-gray-alpha-400);
2065
2112
  }
2066
2113
  .fx-stat{
2067
- padding:2.25rem 1.5rem;
2068
- text-align:center;
2069
- border-right:1px solid var(--aip-border);
2070
- position:relative;
2071
- overflow:hidden;
2114
+ padding:40px 24px;text-align:center;
2115
+ border-right:1px solid var(--ds-gray-alpha-400);
2116
+ transition:background var(--duration-normal) var(--ease-in-out);
2072
2117
  }
2073
2118
  .fx-stat:last-child{border-right:none}
2074
- .fx-stat::before{
2075
- content:'';position:absolute;top:0;left:0;right:0;height:2px;
2076
- background:linear-gradient(90deg,transparent,var(--aip-accent),transparent);
2077
- opacity:0;transition:opacity .3s;
2078
- }
2079
- .fx-stat:hover::before{opacity:1}
2119
+ .fx-stat:hover{background:var(--ds-gray-alpha-100)}
2080
2120
  .fx-stat-val{
2081
- font-size:clamp(2rem,4vw,3rem);
2082
- font-weight:900;
2083
- letter-spacing:-.05em;
2084
- line-height:1;
2085
- color:var(--aip-accent);
2121
+ font-size:clamp(28px,4vw,40px);
2122
+ font-weight:700;letter-spacing:-.04em;line-height:1;
2123
+ color:var(--ds-gray-1000);
2086
2124
  font-variant-numeric:tabular-nums;
2087
2125
  }
2088
2126
  .fx-stat-lbl{
2089
- font-size:.7rem;
2090
- font-weight:700;
2091
- text-transform:uppercase;
2092
- letter-spacing:.1em;
2093
- color:var(--aip-text-muted);
2094
- margin-top:.5rem;
2095
- }
2096
- .fx-stat-vs{
2097
- font-size:.68rem;
2098
- color:var(--aip-text-dim);
2099
- margin-top:.3rem;
2100
- letter-spacing:.01em;
2127
+ font-size:12px;font-weight:500;
2128
+ text-transform:uppercase;letter-spacing:.08em;
2129
+ color:var(--ds-gray-700);
2130
+ margin-top:8px;
2131
+ }
2132
+ .fx-stat-vs{font-size:11px;color:var(--ds-gray-600);margin-top:4px;letter-spacing:.01em}
2133
+ @media(max-width:640px){
2134
+ .fx-stats{grid-template-columns:repeat(2,1fr)}
2135
+ .fx-stat{border-right:none;border-bottom:1px solid var(--ds-gray-alpha-400)}
2136
+ .fx-stat:nth-child(odd){border-right:1px solid var(--ds-gray-alpha-400)}
2137
+ .fx-stat:last-child,:nth-last-child(-n+2):nth-child(even){border-bottom:none}
2101
2138
  }
2102
- @media(max-width:640px){.fx-stats{grid-template-columns:repeat(2,1fr)}.fx-stat{border-right:none;border-bottom:1px solid var(--aip-border)}.fx-stat:last-child{border-bottom:none}}
2103
2139
 
2104
2140
  /* ═══════════════════════════════════════════
2105
2141
  SECTIONS
2106
2142
  ═══════════════════════════════════════════ */
2107
- .fx-sect{
2108
- padding:5rem 2.5rem;
2109
- position:relative;
2110
- }
2143
+ .fx-sect{padding:80px 40px;position:relative}
2144
+ @media(max-width:768px){.fx-sect{padding:64px 24px}}
2111
2145
  .fx-sect-title{
2112
- font-size:clamp(1.75rem,4vw,3.25rem);
2113
- font-weight:800;
2114
- letter-spacing:-.04em;
2115
- line-height:1.1;
2116
- margin-bottom:1rem;
2117
- text-align:center;
2146
+ font-size:clamp(24px,3.5vw,40px);
2147
+ font-weight:700;letter-spacing:-.03em;line-height:1.15;
2148
+ margin-bottom:12px;text-align:center;color:var(--ds-gray-1000);
2118
2149
  }
2119
2150
  .fx-sect-body{
2120
- font-size:1.0625rem;
2121
- line-height:1.75;
2122
- text-align:center;
2123
- color:var(--aip-text-muted);
2124
- max-width:44rem;
2125
- margin:0 auto;
2151
+ font-size:15px;line-height:1.7;text-align:center;
2152
+ color:var(--ds-gray-900);max-width:480px;margin:0 auto;
2126
2153
  }
2127
- .fx-sect-link{
2128
- font-size:.875rem;
2129
- font-weight:600;
2130
- color:var(--aip-accent);
2131
- display:inline-block;
2132
- margin-top:.75rem;
2133
- }
2134
- @media(max-width:768px){.fx-sect{padding:4rem 1.5rem}}
2154
+ .fx-sect-link{font-size:13px;font-weight:500;color:var(--ds-blue-700);display:inline-block;margin-top:12px}
2135
2155
 
2136
2156
  /* ═══════════════════════════════════════════
2137
- CARDS / GRID
2157
+ CARDS / GRID — Geist card style
2138
2158
  ═══════════════════════════════════════════ */
2139
- .fx-grid{display:grid;gap:.875rem;padding:0 2.5rem 5rem}
2159
+ .fx-grid{display:grid;gap:12px;padding:0 40px 80px}
2140
2160
  .fx-grid-2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
2141
2161
  .fx-grid-3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
2142
2162
  .fx-grid-4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
2143
- @media(max-width:640px){.fx-grid{padding:0 1.25rem 3rem}.fx-grid-2,.fx-grid-3,.fx-grid-4{grid-template-columns:1fr}}
2144
-
2163
+ @media(max-width:640px){.fx-grid{padding:0 24px 48px}.fx-grid-2,.fx-grid-3,.fx-grid-4{grid-template-columns:1fr}}
2145
2164
  .fx-card{
2146
- border-radius:.875rem;
2147
- padding:1.625rem;
2148
- background:var(--aip-surface);
2149
- border:1px solid var(--aip-border);
2150
- transition:border-color .2s,transform .2s var(--aip-ease-out),box-shadow .2s;
2151
- position:relative;
2152
- overflow:hidden;
2153
- }
2154
- .fx-card::before{
2155
- content:'';
2156
- position:absolute;
2157
- inset:0;
2158
- background:linear-gradient(135deg,rgba(var(--aip-accent-rgb),.04),transparent 60%);
2159
- opacity:0;
2160
- transition:opacity .3s;
2165
+ border-radius:var(--radius-lg);
2166
+ padding:24px;
2167
+ background:var(--ds-background-200);
2168
+ border:1px solid var(--ds-gray-alpha-400);
2169
+ transition:border-color var(--duration-normal) var(--ease-in-out),transform var(--duration-slow) var(--ease-out);
2170
+ position:relative;overflow:hidden;
2161
2171
  }
2162
2172
  .fx-card:hover{
2163
- border-color:var(--aip-border-strong);
2164
- transform:translateY(-2px);
2165
- box-shadow:0 16px 48px rgba(0,0,0,.25);
2173
+ border-color:var(--ds-gray-alpha-700);
2174
+ transform:translateY(-1px);
2166
2175
  }
2167
- .fx-card:hover::before{opacity:1}
2168
- .fx-card-img{width:100%;border-radius:.625rem;height:180px;object-fit:cover;margin-bottom:1rem}
2176
+ .fx-card-img{width:100%;border-radius:var(--radius-md);height:180px;object-fit:cover;margin-bottom:16px;border:1px solid var(--ds-gray-alpha-400)}
2169
2177
  .fx-icon{
2170
- font-size:1.5rem;
2171
- margin-bottom:1rem;
2172
- width:48px;height:48px;
2178
+ font-size:20px;
2179
+ margin-bottom:16px;
2180
+ width:40px;height:40px;
2173
2181
  display:flex;align-items:center;justify-content:center;
2174
- border-radius:.75rem;
2175
- background:rgba(var(--aip-accent-rgb),.08);
2176
- border:1px solid rgba(var(--aip-accent-rgb),.15);
2182
+ border-radius:var(--radius-md);
2183
+ background:var(--ds-gray-alpha-200);
2184
+ border:1px solid var(--ds-gray-alpha-400);
2177
2185
  }
2178
2186
  .fx-card-title{
2179
- font-size:1rem;
2180
- font-weight:700;
2181
- letter-spacing:-.025em;
2182
- margin-bottom:.5rem;
2183
- color:var(--aip-text);
2184
- }
2185
- .fx-card-body{
2186
- font-size:.8375rem;
2187
- line-height:1.7;
2188
- color:var(--aip-text-muted);
2189
- }
2190
- .fx-card-link{
2191
- font-size:.8125rem;
2192
- font-weight:600;
2193
- color:var(--aip-accent);
2194
- display:inline-block;
2195
- margin-top:1rem;
2196
- opacity:.8;
2197
- transition:opacity .15s;
2198
- }
2199
- .fx-card-link:hover{opacity:1}
2200
- .fx-grid-feature .fx-card:hover{border-color:rgba(var(--aip-accent-rgb),.3)}
2187
+ font-size:14px;font-weight:600;letter-spacing:-.015em;
2188
+ margin-bottom:6px;color:var(--ds-gray-1000);line-height:1.4;
2189
+ }
2190
+ .fx-card-body{font-size:13px;line-height:1.65;color:var(--ds-gray-900)}
2191
+ .fx-card-link{font-size:13px;font-weight:500;color:var(--ds-blue-700);display:inline-block;margin-top:12px}
2192
+ .fx-grid-feature .fx-card:hover{border-color:rgba(var(--aip-accent-rgb),.4)}
2193
+ .fx-grid-feature .fx-icon{background:rgba(var(--aip-accent-rgb),.06);border-color:rgba(var(--aip-accent-rgb),.15)}
2201
2194
 
2202
2195
  /* ═══════════════════════════════════════════
2203
- FORMS
2196
+ FORMS — Geist input style
2204
2197
  ═══════════════════════════════════════════ */
2205
- .fx-form-wrap{padding:3rem 2.5rem;display:flex;justify-content:center}
2198
+ .fx-form-wrap{padding:48px 40px;display:flex;justify-content:center}
2206
2199
  .fx-form{
2207
- width:100%;max-width:28rem;
2208
- background:var(--aip-surface);
2209
- border:1px solid var(--aip-border);
2210
- border-radius:1rem;
2211
- padding:2.25rem;
2200
+ width:100%;max-width:400px;
2201
+ background:var(--ds-background-200);
2202
+ border:1px solid var(--ds-gray-alpha-400);
2203
+ border-radius:var(--radius-xl);padding:32px;
2212
2204
  }
2213
- .fx-field{margin-bottom:1.125rem}
2205
+ .fx-field{margin-bottom:16px}
2214
2206
  .fx-label{
2215
- display:block;
2216
- font-size:.8rem;
2217
- font-weight:600;
2218
- color:var(--aip-text-muted);
2219
- margin-bottom:.4375rem;
2220
- letter-spacing:.02em;
2207
+ display:block;font-size:13px;font-weight:500;
2208
+ color:var(--ds-gray-1000);margin-bottom:6px;letter-spacing:-.01em;
2221
2209
  }
2222
2210
  .fx-input{
2223
- width:100%;
2224
- padding:.6875rem 1rem;
2225
- background:var(--aip-bg);
2226
- border:1px solid var(--aip-border);
2227
- border-radius:.5rem;
2228
- color:var(--aip-text);
2229
- font-size:.9375rem;
2230
- outline:none;
2231
- transition:border-color .15s,box-shadow .15s;
2232
- -webkit-appearance:none;
2233
- }
2211
+ width:100%;height:40px;padding:0 12px;
2212
+ background:var(--ds-background-100);
2213
+ border:1px solid var(--ds-gray-alpha-400);
2214
+ border-radius:var(--radius-md);
2215
+ color:var(--ds-gray-1000);font-size:14px;
2216
+ outline:none;-webkit-appearance:none;
2217
+ transition:border-color var(--duration-normal) var(--ease-in-out),box-shadow var(--duration-normal) var(--ease-in-out);
2218
+ }
2219
+ .fx-input:hover{border-color:var(--ds-gray-alpha-700)}
2234
2220
  .fx-input:focus{
2235
- border-color:var(--aip-accent);
2236
- box-shadow:0 0 0 3px rgba(var(--aip-accent-rgb),.15);
2221
+ border-color:var(--ds-blue-700);
2222
+ box-shadow:0 0 0 3px rgba(var(--ds-blue-rgb),.15);
2237
2223
  }
2238
- .fx-input::placeholder{color:var(--aip-text-dim)}
2239
- select.fx-input{cursor:pointer}
2224
+ .fx-input::placeholder{color:var(--ds-gray-600)}
2225
+ textarea.fx-input{height:auto;padding:10px 12px;resize:vertical;min-height:80px;line-height:1.5}
2240
2226
  .fx-btn{
2241
- width:100%;
2242
- padding:.75rem 1.5rem;
2243
- border:none;
2244
- border-radius:.5rem;
2245
- background:var(--aip-accent);
2246
- color:#fff;
2247
- font-size:.9375rem;
2248
- font-weight:700;
2249
- cursor:pointer;
2250
- margin-top:.375rem;
2251
- transition:transform .15s var(--aip-ease-out),opacity .15s,box-shadow .15s;
2252
- letter-spacing:-.015em;
2253
- }
2254
- .fx-btn:hover{transform:translateY(-1px);box-shadow:0 6px 20px rgba(var(--aip-accent-rgb),.3)}
2227
+ width:100%;height:40px;padding:0 16px;
2228
+ background:var(--ds-gray-1000);color:var(--ds-background-100);
2229
+ font-size:14px;font-weight:500;letter-spacing:-.01em;
2230
+ border-radius:var(--radius-md);
2231
+ margin-top:4px;
2232
+ transition:opacity var(--duration-normal) var(--ease-in-out),transform var(--duration-normal) var(--ease-out);
2233
+ }
2234
+ .fx-btn:hover{opacity:.88;transform:translateY(-1px)}
2255
2235
  .fx-btn:active{transform:translateY(0)}
2256
- .fx-btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none}
2257
- .fx-btn-wrap{padding:0 2.5rem 1.5rem}
2258
- .fx-standalone-btn{width:auto;padding:.625rem 1.5rem;margin-top:0}
2259
- .fx-form-msg{font-size:.8125rem;padding:.5rem 0;min-height:1.5rem;text-align:center;font-weight:500}
2260
- .fx-form-err{color:#f87171}.fx-form-ok{color:#4ade80}
2236
+ .fx-btn:disabled{opacity:.4;cursor:not-allowed;transform:none}
2237
+ .fx-btn-wrap{padding:0 40px 24px}
2238
+ .fx-standalone-btn{width:auto;padding:0 20px;margin-top:0}
2239
+ .fx-form-msg{font-size:13px;padding:6px 0;min-height:24px;text-align:center;font-weight:500}
2240
+ .fx-form-err{color:var(--ds-red-700)}.fx-form-ok{color:var(--ds-green-700)}
2261
2241
 
2262
2242
  /* ═══════════════════════════════════════════
2263
- TABLE
2243
+ TABLE — Geist table style
2264
2244
  ═══════════════════════════════════════════ */
2265
- .fx-table-wrap{overflow-x:auto;padding:0 2.5rem 4rem}
2266
- .fx-table{width:100%;border-collapse:collapse;font-size:.875rem}
2245
+ .fx-table-wrap{overflow-x:auto;padding:0 40px 64px}
2246
+ .fx-table{width:100%;border-collapse:collapse;font-size:13px}
2267
2247
  .fx-th{
2268
- text-align:left;
2269
- padding:.75rem 1rem;
2270
- font-size:.7rem;
2271
- font-weight:700;
2272
- text-transform:uppercase;
2273
- letter-spacing:.08em;
2274
- color:var(--aip-text-dim);
2275
- border-bottom:1px solid var(--aip-border);
2276
- background:var(--aip-surface);
2277
- white-space:nowrap;
2248
+ text-align:left;padding:0 12px 10px;
2249
+ font-size:11px;font-weight:600;text-transform:uppercase;
2250
+ letter-spacing:.06em;color:var(--ds-gray-700);
2251
+ border-bottom:1px solid var(--ds-gray-alpha-400);white-space:nowrap;
2278
2252
  }
2279
2253
  .fx-th-actions{opacity:.5}
2280
- .fx-tr{border-bottom:1px solid var(--aip-border);transition:background .1s}
2254
+ .fx-tr{border-bottom:1px solid var(--ds-gray-alpha-200);transition:background var(--duration-fast) var(--ease-in-out)}
2281
2255
  .fx-tr:last-child{border-bottom:none}
2282
- .fx-tr:hover{background:var(--aip-surface-hover)}
2283
- .fx-td{padding:.75rem 1rem;color:var(--aip-text-muted);vertical-align:middle}
2284
- .fx-td:first-child{color:var(--aip-text);font-weight:500}
2285
- .fx-td-empty{padding:3rem 1rem;text-align:center;color:var(--aip-text-dim);font-size:.875rem}
2286
- .fx-td-actions{white-space:nowrap;padding:.5rem .75rem!important}
2256
+ .fx-tr:hover{background:var(--ds-gray-alpha-100)}
2257
+ .fx-td{padding:12px;color:var(--ds-gray-900);vertical-align:middle}
2258
+ .fx-td:first-child{color:var(--ds-gray-1000);font-weight:500}
2259
+ .fx-td-empty{padding:48px 12px;text-align:center;color:var(--ds-gray-600);font-size:13px}
2260
+ .fx-td-actions{white-space:nowrap;padding:6px 12px!important}
2287
2261
  .fx-action-btn{
2288
- border:none;cursor:pointer;
2289
- font-size:.75rem;font-weight:600;
2290
- padding:.3rem .75rem;border-radius:.375rem;
2291
- margin-right:.375rem;font-family:inherit;
2292
- transition:opacity .15s,transform .1s;
2262
+ height:28px;padding:0 10px;border-radius:var(--radius-md);
2263
+ font-size:12px;font-weight:500;margin-right:4px;
2264
+ transition:background var(--duration-normal) var(--ease-in-out);
2293
2265
  }
2294
- .fx-action-btn:hover{opacity:.85;transform:translateY(-1px)}
2295
- .fx-edit-btn{background:rgba(59,130,246,.15);color:#60a5fa;border:1px solid rgba(59,130,246,.2)}
2296
- .fx-delete-btn{background:rgba(239,68,68,.12);color:#f87171;border:1px solid rgba(239,68,68,.2)}
2266
+ .fx-edit-btn{background:var(--ds-blue-100);color:var(--ds-blue-700)}
2267
+ .fx-edit-btn:hover{background:var(--ds-blue-200)}
2268
+ .fx-delete-btn{background:var(--ds-red-100);color:var(--ds-red-700)}
2269
+ .fx-delete-btn:hover{background:var(--ds-red-200)}
2297
2270
 
2298
2271
  /* ═══════════════════════════════════════════
2299
- PRICING
2272
+ PRICING — Geist pricing style
2300
2273
  ═══════════════════════════════════════════ */
2301
2274
  .fx-pricing{
2302
- display:grid;
2303
- grid-template-columns:repeat(auto-fit,minmax(260px,1fr));
2304
- gap:1.25rem;
2305
- padding:2rem 2.5rem 5rem;
2306
- align-items:start;
2275
+ display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
2276
+ gap:16px;padding:24px 40px 80px;align-items:start;
2307
2277
  }
2308
2278
  .fx-pricing-card{
2309
- border-radius:1rem;
2310
- padding:2rem;
2311
- background:var(--aip-surface);
2312
- border:1px solid var(--aip-border);
2279
+ border-radius:var(--radius-xl);padding:32px;
2280
+ background:var(--ds-background-200);
2281
+ border:1px solid var(--ds-gray-alpha-400);
2313
2282
  position:relative;
2314
- transition:border-color .2s,transform .2s var(--aip-ease-out);
2315
- }
2316
- .fx-pricing-featured{
2317
- border-color:var(--aip-accent)!important;
2318
- transform:scale(1.02);
2319
- box-shadow:0 0 0 1px var(--aip-accent),0 24px 48px rgba(var(--aip-accent-rgb),.15);
2283
+ transition:border-color var(--duration-normal) var(--ease-in-out);
2320
2284
  }
2285
+ .fx-pricing-featured{border-color:var(--ds-gray-alpha-700)!important}
2321
2286
  .fx-pricing-badge{
2322
- position:absolute;top:-13px;left:50%;transform:translateX(-50%);
2323
- background:var(--aip-accent);color:#fff;
2324
- font-size:.65rem;font-weight:700;
2325
- padding:.25rem .875rem;border-radius:999px;white-space:nowrap;letter-spacing:.06em;
2326
- }
2327
- .fx-pricing-name{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--aip-text-muted);margin-bottom:.75rem}
2328
- .fx-pricing-price{font-size:3.25rem;font-weight:900;letter-spacing:-.06em;line-height:1;margin-bottom:.75rem;color:var(--aip-text)}
2329
- .fx-pricing-price-sm{font-size:2rem}
2330
- .fx-pricing-desc{font-size:.875rem;line-height:1.65;margin-bottom:1.75rem;color:var(--aip-text-muted)}
2331
- .fx-pricing-cta{display:block;text-align:center;padding:.75rem;border-radius:.625rem;font-weight:700;font-size:.9rem;transition:opacity .15s,transform .1s;background:var(--aip-accent);color:#fff}
2332
- .fx-pricing-cta:hover{opacity:.88;transform:translateY(-1px)}
2333
- .fx-pricing-compact{
2334
- background:var(--aip-surface);border:1px solid var(--aip-border);
2335
- border-radius:.875rem;padding:1.5rem;
2336
- }
2287
+ position:absolute;top:-12px;left:50%;transform:translateX(-50%);
2288
+ background:var(--ds-gray-1000);color:var(--ds-background-100);
2289
+ font-size:11px;font-weight:600;padding:3px 10px;
2290
+ border-radius:var(--radius-full);white-space:nowrap;letter-spacing:.04em;
2291
+ }
2292
+ .fx-pricing-name{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--ds-gray-700);margin-bottom:12px}
2293
+ .fx-pricing-price{font-size:40px;font-weight:700;letter-spacing:-.05em;line-height:1;margin-bottom:8px;color:var(--ds-gray-1000);font-variant-numeric:tabular-nums}
2294
+ .fx-pricing-price-sm{font-size:28px}
2295
+ .fx-pricing-desc{font-size:13px;line-height:1.6;margin-bottom:24px;color:var(--ds-gray-900)}
2296
+ .fx-pricing-cta{
2297
+ display:block;text-align:center;height:36px;line-height:36px;
2298
+ border-radius:var(--radius-md);font-size:13px;font-weight:500;
2299
+ background:var(--ds-gray-1000);color:var(--ds-background-100);
2300
+ transition:opacity var(--duration-normal) var(--ease-in-out);
2301
+ }
2302
+ .fx-pricing-cta:hover{opacity:.85}
2337
2303
 
2338
2304
  /* ═══════════════════════════════════════════
2339
- FAQ
2305
+ FAQ — Geist collapse style
2340
2306
  ═══════════════════════════════════════════ */
2341
- .fx-faq-wrap{padding:0 2.5rem 4rem}
2342
- .fx-faq{max-width:48rem;margin:0 auto}
2307
+ .fx-faq-wrap{padding:0 40px 64px}
2308
+ .fx-faq{max-width:640px;margin:0 auto}
2343
2309
  .fx-faq-item{
2344
- border:1px solid var(--aip-border);
2345
- background:var(--aip-surface);
2346
- border-radius:.75rem;
2347
- margin-bottom:.5rem;
2310
+ border-bottom:1px solid var(--ds-gray-alpha-400);
2348
2311
  cursor:pointer;
2349
- overflow:hidden;
2350
- transition:border-color .2s;
2351
2312
  }
2352
- .fx-faq-item:hover{border-color:var(--aip-border-strong)}
2313
+ .fx-faq-item:first-child{border-top:1px solid var(--ds-gray-alpha-400)}
2353
2314
  .fx-faq-q{
2354
2315
  display:flex;justify-content:space-between;align-items:center;
2355
- padding:1rem 1.25rem;
2356
- font-size:.9375rem;font-weight:600;
2357
- color:var(--aip-text);
2316
+ padding:16px 0;
2317
+ font-size:14px;font-weight:500;color:var(--ds-gray-1000);
2318
+ user-select:none;
2319
+ }
2320
+ .fx-faq-arrow{
2321
+ width:16px;height:16px;color:var(--ds-gray-700);flex-shrink:0;
2322
+ transition:transform var(--duration-normal) var(--ease-in-out);
2323
+ }
2324
+ .fx-faq-arrow::after{
2325
+ content:'↓';font-size:12px;display:block;text-align:center;line-height:16px;
2358
2326
  }
2359
- .fx-faq-arrow{transition:transform .25s var(--aip-ease-out);color:var(--aip-text-dim);font-size:.75rem}
2360
2327
  .fx-faq-item.open .fx-faq-arrow{transform:rotate(180deg)}
2361
2328
  .fx-faq-a{
2362
2329
  max-height:0;overflow:hidden;
2363
- font-size:.875rem;line-height:1.7;
2364
- color:var(--aip-text-muted);
2365
- transition:max-height .3s var(--aip-ease-out),padding .3s;
2366
- padding:0 1.25rem;
2330
+ font-size:14px;line-height:1.65;color:var(--ds-gray-900);
2331
+ transition:max-height var(--duration-slow) var(--ease-out),padding var(--duration-slow) var(--ease-out);
2332
+ padding:0;
2367
2333
  }
2368
- .fx-faq-item.open .fx-faq-a{max-height:300px;padding:.75rem 1.25rem 1.25rem}
2334
+ .fx-faq-item.open .fx-faq-a{max-height:300px;padding:0 0 16px}
2369
2335
 
2370
2336
  /* ═══════════════════════════════════════════
2371
- CODE WINDOW
2337
+ CODE WINDOW — Geist snippet style
2372
2338
  ═══════════════════════════════════════════ */
2373
2339
  .fx-code-window{
2374
- border-radius:.875rem;
2375
- overflow:hidden;
2376
- border:1px solid var(--aip-border);
2377
- background:var(--aip-surface);
2378
- margin:0 2.5rem 2rem;
2379
- position:relative;
2340
+ border-radius:var(--radius-lg);overflow:hidden;
2341
+ border:1px solid var(--ds-gray-alpha-400);
2342
+ background:var(--ds-background-200);
2343
+ margin:0 40px 24px;
2380
2344
  }
2381
2345
  .fx-code-bar{
2382
- display:flex;align-items:center;gap:.75rem;
2383
- padding:.6875rem 1rem;
2384
- background:var(--aip-surface-hover);
2385
- border-bottom:1px solid var(--aip-border);
2346
+ display:flex;align-items:center;gap:8px;
2347
+ padding:10px 16px;
2348
+ background:var(--ds-background-200);
2349
+ border-bottom:1px solid var(--ds-gray-alpha-400);
2386
2350
  }
2387
- .fx-dots{display:flex;gap:.375rem}
2388
- .fx-dots span{width:11px;height:11px;border-radius:50%}
2351
+ .fx-dots{display:flex;gap:5px}
2352
+ .fx-dots span{width:10px;height:10px;border-radius:50%}
2389
2353
  .fx-dots span:nth-child(1){background:#ff5f57}
2390
2354
  .fx-dots span:nth-child(2){background:#febc2e}
2391
2355
  .fx-dots span:nth-child(3){background:#28c840}
2392
- .fx-code-lang{font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;color:var(--aip-text-dim);margin-left:.25rem;font-family:var(--aip-font-mono)}
2356
+ .fx-code-lang{
2357
+ font-size:11px;letter-spacing:.06em;text-transform:uppercase;
2358
+ color:var(--ds-gray-700);margin-left:4px;font-family:var(--geist-mono);font-weight:500;
2359
+ }
2393
2360
  .fx-code-copy{
2394
- margin-left:auto;
2395
- font-family:var(--aip-font-mono);font-size:.62rem;letter-spacing:.08em;text-transform:uppercase;
2396
- background:none;border:1px solid var(--aip-border-strong);
2397
- color:var(--aip-text-dim);
2398
- padding:.2rem .625rem;border-radius:.3rem;cursor:pointer;
2399
- transition:all .15s;
2400
- }
2401
- .fx-code-copy:hover{border-color:var(--aip-accent);color:var(--aip-accent)}
2402
- .fx-code-body{padding:1.375rem 1.5rem;overflow-x:auto}
2403
- .fx-code-line{font-family:var(--aip-font-mono);font-size:.8rem;line-height:1.8;color:var(--aip-text-muted);white-space:pre}
2404
- .fx-kw{color:#c792ea}.fx-st{color:#c3e88d}.fx-fn{color:#82aaff}.fx-nb{color:#f78c6c}
2405
- .fx-op{color:var(--aip-accent)}.fx-comment{color:var(--aip-text-dim);font-style:italic}
2361
+ margin-left:auto;height:24px;padding:0 8px;
2362
+ font-family:var(--geist-mono);font-size:11px;letter-spacing:.04em;
2363
+ background:var(--ds-gray-alpha-200);
2364
+ border:1px solid var(--ds-gray-alpha-400);
2365
+ color:var(--ds-gray-900);border-radius:var(--radius-sm);cursor:pointer;
2366
+ transition:background var(--duration-normal),color var(--duration-normal);
2367
+ }
2368
+ .fx-code-copy:hover{background:var(--ds-gray-alpha-400);color:var(--ds-gray-1000)}
2369
+ .fx-code-body{padding:20px 24px;overflow-x:auto}
2370
+ .fx-code-line{font-family:var(--geist-mono);font-size:13px;line-height:1.75;color:var(--ds-gray-800);white-space:pre}
2371
+ .fx-kw{color:#c792ea}.fx-st{color:#a6e3a1}.fx-fn{color:#89b4fa}
2372
+ .fx-nb{color:#fab387}.fx-op{color:rgba(var(--aip-accent-rgb),1)}.fx-comment{color:var(--ds-gray-600);font-style:italic}
2406
2373
 
2407
2374
  /* ═══════════════════════════════════════════
2408
2375
  INSTALL BLOCK
2409
2376
  ═══════════════════════════════════════════ */
2410
2377
  .fx-install-wrap{
2411
- border-radius:.875rem;overflow:hidden;
2412
- border:1px solid var(--aip-border);
2413
- background:var(--aip-surface);
2414
- margin:0 2.5rem 2rem;max-width:540px;
2378
+ border-radius:var(--radius-lg);overflow:hidden;
2379
+ border:1px solid var(--ds-gray-alpha-400);
2380
+ background:var(--ds-background-200);
2381
+ margin:0 40px 24px;max-width:480px;
2415
2382
  }
2416
- .fx-install-body{padding:1.375rem 1.5rem}
2417
- .fx-install-line{display:flex;gap:.875rem;padding:.25rem 0;font-family:var(--aip-font-mono);font-size:.8rem;line-height:1.75}
2418
- .fx-install-prompt{color:var(--aip-accent);flex-shrink:0;font-weight:700}
2419
- .fx-install-cmd{color:var(--aip-text)}
2420
- .fx-install-comment{font-family:var(--aip-font-mono);font-size:.72rem;color:var(--aip-text-dim);padding:.25rem 0;font-style:italic}
2383
+ .fx-install-body{padding:20px 24px}
2384
+ .fx-install-line{display:flex;gap:10px;padding:3px 0;font-family:var(--geist-mono);font-size:13px;line-height:1.6}
2385
+ .fx-install-prompt{color:rgba(var(--aip-accent-rgb),1);flex-shrink:0;font-weight:700}
2386
+ .fx-install-cmd{color:var(--ds-gray-1000)}
2387
+ .fx-install-comment{font-family:var(--geist-mono);font-size:12px;color:var(--ds-gray-700);padding:3px 0;font-style:italic}
2421
2388
 
2422
2389
  /* ═══════════════════════════════════════════
2423
2390
  BENCHMARK CARDS
2424
2391
  ═══════════════════════════════════════════ */
2425
2392
  .fx-benchmark{
2426
- display:grid;
2427
- grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
2428
- gap:1rem;padding:0 2.5rem 4rem;
2393
+ display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
2394
+ gap:12px;padding:0 40px 64px;
2429
2395
  }
2430
2396
  .fx-bench-card{
2431
- border-radius:1rem;padding:1.5rem;
2432
- background:var(--aip-surface);
2433
- border:1px solid var(--aip-border);
2397
+ border-radius:var(--radius-lg);padding:24px;
2398
+ background:var(--ds-background-200);
2399
+ border:1px solid var(--ds-gray-alpha-400);
2434
2400
  position:relative;overflow:hidden;
2435
- transition:border-color .2s,transform .15s;
2401
+ transition:border-color var(--duration-normal) var(--ease-in-out);
2436
2402
  }
2403
+ .fx-bench-card:hover{border-color:var(--ds-gray-alpha-700)}
2404
+ /* Subtle top accent line */
2437
2405
  .fx-bench-card::after{
2438
- content:'';position:absolute;top:0;left:0;right:0;height:2px;
2439
- background:linear-gradient(90deg,transparent,var(--aip-accent),transparent);
2406
+ content:'';position:absolute;top:0;left:0;right:0;height:1px;
2407
+ background:linear-gradient(90deg,transparent,rgba(var(--aip-accent-rgb),.6),transparent);
2408
+ }
2409
+ .fx-bench-label{
2410
+ font-size:11px;letter-spacing:.06em;text-transform:uppercase;
2411
+ color:var(--ds-gray-700);margin-bottom:10px;font-weight:600;
2440
2412
  }
2441
- .fx-bench-card:hover{border-color:var(--aip-border-strong);transform:translateY(-2px)}
2442
- .fx-bench-label{font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:var(--aip-text-dim);margin-bottom:.625rem;font-weight:600}
2443
- .fx-bench-num{font-size:clamp(2rem,5vw,3rem);font-weight:900;letter-spacing:-.05em;line-height:1;color:var(--aip-accent)}
2444
- .fx-bench-vs{font-size:.7rem;color:var(--aip-text-dim);margin-top:.375rem;font-family:var(--aip-font-mono)}
2445
- .fx-bench-bar{margin-top:1.125rem;height:4px;background:rgba(var(--aip-accent-rgb),.1);border-radius:2px;overflow:hidden}
2446
- .fx-bench-fill{height:100%;border-radius:2px;background:var(--aip-accent);transition:width 1.5s cubic-bezier(.4,0,.2,1)}
2413
+ .fx-bench-num{
2414
+ font-size:clamp(24px,4vw,36px);font-weight:700;
2415
+ letter-spacing:-.04em;line-height:1;
2416
+ color:var(--ds-gray-1000);font-variant-numeric:tabular-nums;
2417
+ }
2418
+ .fx-bench-vs{font-size:12px;color:var(--ds-gray-700);margin-top:6px;font-family:var(--geist-mono)}
2419
+ .fx-bench-bar{margin-top:16px;height:3px;background:var(--ds-gray-alpha-200);border-radius:999px;overflow:hidden}
2420
+ .fx-bench-fill{height:100%;border-radius:999px;background:rgba(var(--aip-accent-rgb),1);transition:width 1.2s var(--ease-out)}
2447
2421
 
2448
2422
  /* ═══════════════════════════════════════════
2449
- MARQUEE
2423
+ MARQUEE — smooth infinite scroll
2450
2424
  ═══════════════════════════════════════════ */
2451
2425
  .fx-marquee{
2452
- overflow:hidden;
2453
- padding:1.375rem 0;
2454
- border-top:1px solid var(--aip-border);
2455
- border-bottom:1px solid var(--aip-border);
2456
- -webkit-mask:linear-gradient(90deg,transparent,black 8%,black 92%,transparent);
2457
- mask:linear-gradient(90deg,transparent,black 8%,black 92%,transparent);
2458
- }
2459
- .fx-marquee-track{display:flex;width:max-content;animation:fx-marquee 28s linear infinite}
2426
+ overflow:hidden;padding:20px 0;
2427
+ border-top:1px solid var(--ds-gray-alpha-400);
2428
+ border-bottom:1px solid var(--ds-gray-alpha-400);
2429
+ -webkit-mask:linear-gradient(90deg,transparent,black 10%,black 90%,transparent);
2430
+ mask:linear-gradient(90deg,transparent,black 10%,black 90%,transparent);
2431
+ }
2432
+ .fx-marquee-track{display:flex;width:max-content;animation:fx-marquee 30s linear infinite}
2460
2433
  .fx-marquee:hover .fx-marquee-track{animation-play-state:paused}
2461
2434
  @keyframes fx-marquee{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
2462
- .fx-marquee-item{font-size:.875rem;font-weight:600;color:var(--aip-text-dim);white-space:nowrap;padding:0 1.75rem;transition:color .2s}
2463
- .fx-marquee-item:hover{color:var(--aip-text-muted)}
2464
- .fx-marquee-sep{color:var(--aip-border-strong);padding:0 .25rem}
2435
+ .fx-marquee-item{
2436
+ font-size:13px;font-weight:500;
2437
+ color:var(--ds-gray-700);
2438
+ white-space:nowrap;padding:0 24px;
2439
+ transition:color var(--duration-normal);
2440
+ }
2441
+ .fx-marquee-item:hover{color:var(--ds-gray-1000)}
2442
+ .fx-marquee-sep{color:var(--ds-gray-alpha-400)}
2465
2443
 
2466
2444
  /* ═══════════════════════════════════════════
2467
2445
  CTA SECTION
2468
2446
  ═══════════════════════════════════════════ */
2469
2447
  .fx-cta-section{
2470
- position:relative;padding:7rem 2.5rem;text-align:center;overflow:hidden;
2471
- border-top:1px solid var(--aip-border);
2448
+ position:relative;padding:120px 40px;text-align:center;overflow:hidden;
2449
+ border-top:1px solid var(--ds-gray-alpha-400);
2472
2450
  }
2473
2451
  .fx-cta-glow{
2474
- position:absolute;width:700px;height:400px;border-radius:50%;
2475
- background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.12),transparent 65%);
2476
- left:50%;top:50%;transform:translate(-50%,-50%);
2477
- pointer-events:none;
2452
+ position:absolute;
2453
+ width:700px;height:350px;border-radius:50%;
2454
+ background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.06),transparent 60%);
2455
+ left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;
2456
+ }
2457
+ .fx-cta-inner{position:relative;z-index:1;max-width:560px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:24px}
2458
+ .fx-cta-title{
2459
+ font-size:clamp(28px,4vw,48px);font-weight:700;
2460
+ letter-spacing:-.04em;line-height:1.1;color:var(--ds-gray-1000);
2478
2461
  }
2479
- .fx-cta-inner{position:relative;z-index:1;max-width:44rem;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:1.75rem}
2480
- .fx-cta-title{font-size:clamp(2rem,5vw,4rem);font-weight:900;letter-spacing:-.05em;line-height:1.05}
2481
- .fx-cta-sub{font-size:1.0625rem;line-height:1.7;color:var(--aip-text-muted);max-width:36rem}
2482
- .fx-cta-actions{display:flex;gap:1rem;flex-wrap:wrap;justify-content:center}
2462
+ .fx-cta-sub{font-size:15px;line-height:1.65;color:var(--ds-gray-900);max-width:440px}
2463
+ .fx-cta-actions{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
2483
2464
 
2484
2465
  /* ═══════════════════════════════════════════
2485
- STEPS
2466
+ STEPS — numbered with connector
2486
2467
  ═══════════════════════════════════════════ */
2487
2468
  .fx-steps{
2488
- display:grid;
2489
- grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
2490
- gap:2.5rem;
2491
- padding:1.5rem 2.5rem 5rem;
2492
- position:relative;
2469
+ display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
2470
+ gap:40px;padding:16px 40px 80px;position:relative;
2493
2471
  }
2494
2472
  .fx-steps::before{
2495
- content:'';position:absolute;top:2.75rem;
2496
- left:calc(2.5rem + 2rem);right:calc(2.5rem + 2rem);
2497
- height:1px;
2498
- background:linear-gradient(90deg,transparent,var(--aip-border-strong),transparent);
2499
- pointer-events:none;
2473
+ content:'';position:absolute;top:36px;
2474
+ left:calc(40px + 20px);right:calc(40px + 20px);
2475
+ height:1px;background:var(--ds-gray-alpha-400);pointer-events:none;
2500
2476
  }
2501
- @media(max-width:640px){.fx-steps::before{display:none}.fx-steps{gap:2rem;padding:1rem 1.5rem 3rem}}
2502
- .fx-step{display:flex;flex-direction:column;align-items:flex-start;gap:.875rem}
2477
+ @media(max-width:640px){.fx-steps::before{display:none}.fx-steps{gap:32px;padding:0 24px 48px}}
2478
+ .fx-step{display:flex;flex-direction:column;align-items:flex-start;gap:16px}
2503
2479
  .fx-step-num{
2504
- width:44px;height:44px;border-radius:50%;
2505
- background:var(--aip-accent);color:#fff;
2506
- font-weight:900;font-size:1rem;
2480
+ width:36px;height:36px;border-radius:50%;
2481
+ background:var(--ds-gray-alpha-200);
2482
+ border:1px solid var(--ds-gray-alpha-400);
2483
+ color:var(--ds-gray-1000);
2484
+ font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;
2507
2485
  display:flex;align-items:center;justify-content:center;
2508
2486
  flex-shrink:0;position:relative;z-index:1;
2509
- box-shadow:0 0 0 4px rgba(var(--aip-accent-rgb),.15),0 0 0 8px rgba(var(--aip-accent-rgb),.05);
2510
2487
  }
2511
- .fx-step-title{font-size:.9375rem;font-weight:700;letter-spacing:-.02em;color:var(--aip-text)}
2512
- .fx-step-desc{font-size:.8375rem;line-height:1.65;color:var(--aip-text-muted)}
2488
+ .fx-step-title{font-size:14px;font-weight:600;letter-spacing:-.015em;color:var(--ds-gray-1000)}
2489
+ .fx-step-desc{font-size:13px;line-height:1.6;color:var(--ds-gray-900)}
2513
2490
 
2514
2491
  /* ═══════════════════════════════════════════
2515
- COMPARE
2492
+ COMPARE — visual feature table
2516
2493
  ═══════════════════════════════════════════ */
2517
- .fx-compare{max-width:600px;margin:0 auto 4rem;padding:0 2.5rem;border-radius:1rem;overflow:hidden;border:1px solid var(--aip-border)}
2494
+ .fx-compare{
2495
+ max-width:560px;margin:0 auto 64px;padding:0 40px;
2496
+ border-radius:var(--radius-xl);overflow:hidden;
2497
+ border:1px solid var(--ds-gray-alpha-400);
2498
+ }
2518
2499
  .fx-compare-header{
2519
2500
  display:grid;grid-template-columns:1fr 1fr 1fr;
2520
- padding:.75rem 1.125rem;
2521
- background:var(--aip-surface-hover);
2522
- font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--aip-text-dim);
2523
- border-bottom:1px solid var(--aip-border);
2501
+ padding:12px 16px;
2502
+ background:var(--ds-background-200);
2503
+ font-size:11px;font-weight:700;text-transform:uppercase;
2504
+ letter-spacing:.08em;color:var(--ds-gray-700);
2505
+ border-bottom:1px solid var(--ds-gray-alpha-400);
2524
2506
  }
2525
2507
  .fx-compare-row{
2526
2508
  display:grid;grid-template-columns:1fr 1fr 1fr;
2527
- padding:.75rem 1.125rem;
2528
- border-bottom:1px solid var(--aip-border);
2529
- transition:background .1s;
2509
+ padding:12px 16px;border-bottom:1px solid var(--ds-gray-alpha-200);
2510
+ transition:background var(--duration-fast);
2530
2511
  }
2531
2512
  .fx-compare-row:last-child{border-bottom:none}
2532
- .fx-compare-row:hover{background:var(--aip-surface-hover)}
2533
- .fx-compare-feature{font-size:.875rem;color:var(--aip-text-muted)}
2534
- .fx-compare-col-a{text-align:center;font-size:.875rem;font-weight:600;color:#4ade80}
2535
- .fx-compare-col-b{text-align:center;font-size:.875rem;color:var(--aip-text-dim)}
2513
+ .fx-compare-row:hover{background:var(--ds-gray-alpha-100)}
2514
+ .fx-compare-feature{font-size:13px;color:var(--ds-gray-900)}
2515
+ .fx-compare-col-a{text-align:center;font-size:14px;font-weight:600;color:var(--ds-green-700)}
2516
+ .fx-compare-col-b{text-align:center;font-size:14px;color:var(--ds-gray-600)}
2536
2517
 
2537
2518
  /* ═══════════════════════════════════════════
2538
2519
  VIDEO
2539
2520
  ═══════════════════════════════════════════ */
2540
- .fx-video-wrap{padding:0 2.5rem 3rem}
2541
- .fx-video-yt{position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:1rem;border:1px solid var(--aip-border);background:var(--aip-surface)}
2521
+ .fx-video-wrap{padding:0 40px 48px}
2522
+ .fx-video-yt{
2523
+ position:relative;padding-bottom:56.25%;height:0;overflow:hidden;
2524
+ border-radius:var(--radius-xl);border:1px solid var(--ds-gray-alpha-400);
2525
+ background:var(--ds-background-200);
2526
+ }
2542
2527
  .fx-video-yt iframe{position:absolute;top:0;left:0;width:100%;height:100%}
2543
- .fx-video{width:100%;border-radius:1rem;border:1px solid var(--aip-border)}
2528
+ .fx-video{width:100%;border-radius:var(--radius-xl);border:1px solid var(--ds-gray-alpha-400)}
2544
2529
 
2545
2530
  /* ═══════════════════════════════════════════
2546
2531
  TESTIMONIAL
2547
2532
  ═══════════════════════════════════════════ */
2548
- .fx-testi-wrap{padding:5rem 2.5rem;display:flex;justify-content:center}
2549
- .fx-testi{max-width:44rem;text-align:center;display:flex;flex-direction:column;align-items:center;gap:1.5rem}
2550
- .fx-testi-img,.fx-testi-avatar{width:56px;height:56px;border-radius:50%;object-fit:cover}
2551
- .fx-testi-avatar{display:flex;align-items:center;justify-content:center;font-size:1.25rem;font-weight:800;background:var(--aip-surface);border:1px solid var(--aip-border);color:var(--aip-text)}
2552
- .fx-testi-quote{font-size:1.1875rem;line-height:1.7;font-style:italic;color:var(--aip-text-muted)}
2553
- .fx-testi-author{font-size:.8125rem;font-weight:600;color:var(--aip-text-dim)}
2533
+ .fx-testi-wrap{padding:80px 40px;display:flex;justify-content:center}
2534
+ .fx-testi{max-width:560px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:20px}
2535
+ .fx-testi-img,.fx-testi-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover}
2536
+ .fx-testi-avatar{
2537
+ display:flex;align-items:center;justify-content:center;
2538
+ font-size:18px;font-weight:700;
2539
+ background:var(--ds-background-200);
2540
+ border:1px solid var(--ds-gray-alpha-400);
2541
+ color:var(--ds-gray-1000);
2542
+ }
2543
+ .fx-testi-quote{font-size:18px;line-height:1.65;color:var(--ds-gray-900);letter-spacing:-.01em}
2544
+ .fx-testi-author{font-size:13px;font-weight:500;color:var(--ds-gray-700)}
2554
2545
 
2555
2546
  /* ═══════════════════════════════════════════
2556
2547
  GALLERY
2557
2548
  ═══════════════════════════════════════════ */
2558
- .fx-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.75rem;padding:1rem 2.5rem 4rem}
2559
- .fx-gallery-item{border-radius:.75rem;overflow:hidden;aspect-ratio:4/3;border:1px solid var(--aip-border)}
2560
- .fx-gallery-item img{width:100%;height:100%;object-fit:cover;transition:transform .35s var(--aip-ease-out)}
2561
- .fx-gallery-item:hover img{transform:scale(1.04)}
2549
+ .fx-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;padding:16px 40px 64px}
2550
+ .fx-gallery-item{border-radius:var(--radius-lg);overflow:hidden;aspect-ratio:4/3;border:1px solid var(--ds-gray-alpha-400)}
2551
+ .fx-gallery-item img{width:100%;height:100%;object-fit:cover;transition:transform var(--duration-slow) var(--ease-out)}
2552
+ .fx-gallery-item:hover img{transform:scale(1.03)}
2562
2553
 
2563
2554
  /* ═══════════════════════════════════════════
2564
- MISC
2555
+ MISC COMPONENTS
2565
2556
  ═══════════════════════════════════════════ */
2566
- .fx-divider{display:flex;align-items:center;gap:1rem;padding:.875rem 2.5rem;color:var(--aip-text-dim);font-size:.8125rem}
2567
- .fx-divider::before,.fx-divider::after{content:'';flex:1;height:1px;background:var(--aip-border)}
2568
- .fx-hr{border:none;height:1px;background:var(--aip-border);margin:0 2.5rem}
2569
- .fx-badge-row{padding:.5rem 2.5rem}
2570
- .fx-badge-tag{font-size:.75rem;font-weight:700;padding:.25rem .75rem;border-radius:999px;background:rgba(var(--aip-accent-rgb),.12);color:var(--aip-accent);border:1px solid rgba(var(--aip-accent-rgb),.25);letter-spacing:.04em}
2557
+ .fx-divider{
2558
+ display:flex;align-items:center;gap:12px;
2559
+ padding:12px 40px;color:var(--ds-gray-700);font-size:12px;font-weight:500;
2560
+ }
2561
+ .fx-divider::before,.fx-divider::after{content:'';flex:1;height:1px;background:var(--ds-gray-alpha-400)}
2562
+ .fx-hr{border:none;height:1px;background:var(--ds-gray-alpha-400);margin:0 40px}
2563
+ .fx-badge-row{padding:6px 40px}
2564
+ .fx-badge-tag{
2565
+ font-size:11px;font-weight:600;padding:3px 8px;border-radius:var(--radius-full);
2566
+ background:rgba(var(--aip-accent-rgb),.08);color:rgba(var(--aip-accent-rgb),1);
2567
+ border:1px solid rgba(var(--aip-accent-rgb),.2);letter-spacing:.03em;
2568
+ }
2571
2569
  .fx-spacer{flex-shrink:0}
2572
- .fx-html{padding:0 2.5rem}
2573
- .fx-cols{display:grid;gap:1.5rem;padding:1rem 2.5rem 3rem}
2570
+ .fx-html{padding:0 40px}
2571
+ .fx-cols{display:grid;gap:24px;padding:16px 40px 48px}
2574
2572
  .fx-col{min-width:0}
2575
- .fx-chart-container{padding:0 2.5rem 3rem}
2576
- .fx-select-wrap{padding:.5rem 2.5rem}
2577
- .fx-select-block{width:auto;min-width:200px;margin-top:0}
2578
- .fx-each{padding:0 2.5rem 2rem}
2579
- .fx-each-empty{padding:2rem;text-align:center;color:var(--aip-text-dim);font-size:.875rem}
2573
+ .fx-chart-container{padding:0 40px 48px}
2574
+ .fx-select-wrap{padding:6px 40px}
2575
+ .fx-select-block{width:auto;min-width:180px;height:36px;margin-top:0}
2576
+ .fx-each{padding:0 40px 24px}
2577
+ .fx-each-empty{padding:48px;text-align:center;color:var(--ds-gray-700);font-size:13px}
2580
2578
  .fx-if-wrap{display:contents}
2581
- .fx-editor-wrap{padding:0 2.5rem 2rem}
2579
+ .fx-editor-wrap{padding:0 40px 24px}
2582
2580
 
2583
2581
  /* ═══════════════════════════════════════════
2584
- SCROLL ANIMATIONS
2582
+ SCROLL ANIMATIONS — GPU only per Vercel guidelines
2585
2583
  ═══════════════════════════════════════════ */
2586
2584
  .fx-animate{
2587
- opacity:0;
2588
- transform:translateY(18px);
2589
- transition:opacity .65s var(--aip-ease-out),transform .65s var(--aip-ease-out);
2585
+ opacity:0;transform:translateY(12px);
2586
+ transition:opacity .5s var(--ease-out),transform .5s var(--ease-out);
2590
2587
  }
2591
2588
  .fx-animate.fx-visible{opacity:1;transform:none}
2592
2589
  .fx-animate-stagger>*{
2593
- opacity:0;transform:translateY(14px);
2594
- transition:opacity .55s var(--aip-ease-out),transform .55s var(--aip-ease-out);
2590
+ opacity:0;transform:translateY(8px);
2591
+ transition:opacity .45s var(--ease-out),transform .45s var(--ease-out);
2595
2592
  }
2596
2593
  .fx-animate-stagger.fx-visible>*:nth-child(1){opacity:1;transform:none;transition-delay:.04s}
2597
- .fx-animate-stagger.fx-visible>*:nth-child(2){opacity:1;transform:none;transition-delay:.12s}
2598
- .fx-animate-stagger.fx-visible>*:nth-child(3){opacity:1;transform:none;transition-delay:.2s}
2599
- .fx-animate-stagger.fx-visible>*:nth-child(4){opacity:1;transform:none;transition-delay:.28s}
2600
- .fx-animate-stagger.fx-visible>*:nth-child(5){opacity:1;transform:none;transition-delay:.36s}
2601
- .fx-animate-stagger.fx-visible>*:nth-child(6){opacity:1;transform:none;transition-delay:.44s}
2594
+ .fx-animate-stagger.fx-visible>*:nth-child(2){opacity:1;transform:none;transition-delay:.1s}
2595
+ .fx-animate-stagger.fx-visible>*:nth-child(3){opacity:1;transform:none;transition-delay:.16s}
2596
+ .fx-animate-stagger.fx-visible>*:nth-child(4){opacity:1;transform:none;transition-delay:.22s}
2597
+ .fx-animate-stagger.fx-visible>*:nth-child(5){opacity:1;transform:none;transition-delay:.28s}
2598
+ .fx-animate-stagger.fx-visible>*:nth-child(6){opacity:1;transform:none;transition-delay:.34s}
2602
2599
 
2603
- /* Number counter */
2604
- .fx-count{display:inline-block;font-variant-numeric:tabular-nums}
2605
- .fx-year{font-variant-numeric:tabular-nums}
2600
+ /* Counter + year */
2601
+ .fx-count,.fx-year{font-variant-numeric:tabular-nums;display:inline-block}
2606
2602
 
2607
- /* Hero badge */
2608
- .fx-hero-badge{display:inline-flex;align-items:center;gap:.5rem;font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;font-weight:600;padding:.3125rem .875rem;border-radius:999px;border:1px solid var(--aip-border-strong);background:var(--aip-surface);color:var(--aip-text-muted)}
2609
- .fx-hero-badge-dot{width:6px;height:6px;border-radius:50%;background:var(--aip-accent);animation:fx-pulse 2.5s ease infinite;flex-shrink:0}
2610
-
2611
- /* Footer */
2612
- .fx-footer{
2613
- padding:2.5rem;
2614
- border-top:1px solid var(--aip-border);
2615
- }
2603
+ /* ═══════════════════════════════════════════
2604
+ FOOTER Geist footer style
2605
+ ═══════════════════════════════════════════ */
2606
+ .fx-footer{padding:32px 40px;border-top:1px solid var(--ds-gray-alpha-400)}
2616
2607
  .fx-footer-inner{
2617
- max-width:1100px;margin:0 auto;
2618
- display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1.5rem;
2619
- }
2620
- .fx-footer-brand{font-size:.9375rem;font-weight:800;letter-spacing:-.03em;color:var(--aip-text)}
2621
- .fx-footer-links{display:flex;gap:1.75rem;flex-wrap:wrap}
2622
- .fx-footer-link{font-size:.8125rem;color:var(--aip-text-dim);transition:color .15s}
2623
- .fx-footer-link:hover{color:var(--aip-text-muted)}
2624
- .fx-footer-note{font-size:.75rem;color:var(--aip-text-dim);font-family:var(--aip-font-mono)}
2625
- .fx-footer-text{font-size:.8125rem;color:var(--aip-text-dim)}
2626
- @media(max-width:640px){.fx-footer{padding:2rem 1.5rem}.fx-footer-inner{flex-direction:column;align-items:flex-start;gap:1rem}}
2608
+ max-width:1200px;margin:0 auto;
2609
+ display:flex;justify-content:space-between;align-items:center;
2610
+ flex-wrap:wrap;gap:16px;
2611
+ }
2612
+ .fx-footer-brand{font-size:13px;font-weight:600;letter-spacing:-.02em;color:var(--ds-gray-1000)}
2613
+ .fx-footer-links{display:flex;gap:24px;flex-wrap:wrap}
2614
+ .fx-footer-link{font-size:13px;color:var(--ds-gray-700);transition:color var(--duration-normal)}
2615
+ .fx-footer-link:hover{color:var(--ds-gray-1000)}
2616
+ .fx-footer-note{font-size:12px;color:var(--ds-gray-600);font-family:var(--geist-mono)}
2617
+ .fx-footer-text{font-size:13px;color:var(--ds-gray-700)}
2618
+ @media(max-width:640px){.fx-footer{padding:24px}.fx-footer-inner{flex-direction:column;align-items:flex-start;gap:12px}}
2619
+
2620
+ /* ══════════════════════════════════════════
2621
+ BENTO GRID — Lovable-style irregular grid
2622
+ ══════════════════════════════════════════ */
2623
+ .fx-bento{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:min-content;gap:12px;padding:0 40px 80px}
2624
+ @media(max-width:900px){.fx-bento{grid-template-columns:repeat(2,1fr)}}
2625
+ @media(max-width:600px){.fx-bento{grid-template-columns:1fr;padding:0 24px 48px}}
2626
+ .fx-bento-card{border-radius:var(--radius-lg);padding:28px;background:var(--ds-background-200);border:1px solid var(--ds-gray-alpha-400);display:flex;flex-direction:column;gap:12px;transition:border-color var(--duration-normal) var(--ease-in-out),transform var(--duration-slow) var(--ease-out);position:relative;overflow:hidden;min-height:160px}
2627
+ .fx-bento-card:hover{border-color:var(--ds-gray-alpha-700);transform:translateY(-2px)}
2628
+ .fx-bento-card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(var(--aip-accent-rgb),.4),transparent);opacity:0;transition:opacity .3s}
2629
+ .fx-bento-card:hover::before{opacity:1}
2630
+ .fx-bento-large{grid-column:span 2;min-height:220px}
2631
+ @media(max-width:600px){.fx-bento-large{grid-column:span 1}}
2632
+ .fx-bento-glass{background:rgba(255,255,255,.04)!important;backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid rgba(255,255,255,.1)!important;box-shadow:0 4px 24px rgba(0,0,0,.2)}
2633
+ .fx-bento-glass:hover{background:rgba(255,255,255,.07)!important;border-color:rgba(255,255,255,.2)!important}
2634
+ .fx-bento-icon{font-size:28px;line-height:1;margin-bottom:4px}
2635
+ .fx-bento-body{display:flex;flex-direction:column;gap:8px;flex:1}
2636
+ .fx-bento-title{font-size:15px;font-weight:700;letter-spacing:-.025em;color:var(--ds-gray-1000);line-height:1.3}
2637
+ .fx-bento-desc{font-size:13px;line-height:1.6;color:var(--ds-gray-900)}
2638
+ .fx-bento-link{font-size:12px;font-weight:600;color:var(--ds-blue-700);margin-top:auto;padding-top:8px}
2639
+
2640
+ /* ══════════════════════════════════════════
2641
+ GLASSMORPHISM — cards e hero
2642
+ ══════════════════════════════════════════ */
2643
+ .fx-card-glass{background:rgba(255,255,255,.04)!important;backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border:1px solid rgba(255,255,255,.1)!important;box-shadow:0 8px 32px rgba(0,0,0,.25)}
2644
+ .fx-card-glass:hover{background:rgba(255,255,255,.07)!important;transform:translateY(-3px);box-shadow:0 12px 48px rgba(0,0,0,.35)}
2645
+
2646
+ /* ══════════════════════════════════════════
2647
+ MESH GRADIENT — Lovable-style blobs animados
2648
+ ══════════════════════════════════════════ */
2649
+ .fx-hero-mesh{overflow:hidden}
2650
+ .fx-mesh-blob{position:absolute;pointer-events:none;border-radius:50%;filter:blur(80px);animation:fx-blob-float 12s ease-in-out infinite}
2651
+ .fx-mesh-blob:nth-child(1){width:600px;height:500px;left:-100px;top:-100px;animation-delay:0s;background:radial-gradient(circle,rgba(var(--mesh-c1,99,102,241),.35),transparent 70%)}
2652
+ .fx-mesh-blob:nth-child(2){width:500px;height:400px;right:-100px;top:100px;animation-delay:-4s;background:radial-gradient(circle,rgba(var(--mesh-c2,236,72,153),.25),transparent 70%)}
2653
+ .fx-mesh-blob:nth-child(3){width:400px;height:400px;left:30%;bottom:-100px;animation-delay:-8s;background:radial-gradient(circle,rgba(var(--mesh-c3,251,146,60),.2),transparent 70%)}
2654
+ @keyframes fx-blob-float{0%,100%{transform:translate(0,0) scale(1)}33%{transform:translate(30px,-30px) scale(1.05)}66%{transform:translate(-20px,20px) scale(.97)}}
2655
+
2656
+ /* ══════════════════════════════════════════
2657
+ ANIMATED GRADIENT BUTTON — Vercel style
2658
+ ══════════════════════════════════════════ */
2659
+ .fx-cta-glow-btn{position:relative;border-radius:var(--radius-md);padding:2px;background:linear-gradient(-90deg,#007cf0,#00dfd8,rgba(var(--aip-accent-rgb),1),#007cf0);background-size:400% 100%;animation:fx-grad-btn 8s ease-in-out infinite;display:inline-block}
2660
+ @keyframes fx-grad-btn{50%{background-position:140% 50%}}
2661
+ .fx-cta-glow-btn-inner{display:block;height:38px;padding:0 20px;line-height:38px;background:var(--ds-background-100);border-radius:calc(var(--radius-md) - 2px);font-size:14px;font-weight:600;color:var(--ds-gray-1000);transition:background var(--duration-normal);white-space:nowrap}
2662
+ .fx-cta-glow-btn:hover .fx-cta-glow-btn-inner{background:var(--ds-background-200)}
2663
+
2664
+ /* ══════════════════════════════════════════
2665
+ GRADIENT TEXT VARIANTS — Lovable paletas
2666
+ ══════════════════════════════════════════ */
2667
+ .fx-gradient-text-warm{background:linear-gradient(135deg,#6366f1,#ec4899,#f97316);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
2668
+ .fx-gradient-text-ocean{background:linear-gradient(135deg,#06b6d4,#3b82f6,#8b5cf6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
2669
+ .fx-gradient-text-purple{background:linear-gradient(135deg,#a855f7,#ec4899);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
2670
+
2671
+ /* ══════════════════════════════════════════
2672
+ FLOATING ANIMATION — micro-interaction
2673
+ ══════════════════════════════════════════ */
2674
+ .fx-float{animation:fx-floating 4s ease-in-out infinite}
2675
+ .fx-float-2{animation:fx-floating 5s ease-in-out infinite;animation-delay:-1.5s}
2676
+ .fx-float-3{animation:fx-floating 6s ease-in-out infinite;animation-delay:-3s}
2677
+ @keyframes fx-floating{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
2678
+
2679
+ /* Shine sweep nos cards */
2680
+ .fx-card-shine{overflow:hidden}
2681
+ .fx-card-shine::after{content:'';position:absolute;inset:0;background:linear-gradient(135deg,transparent 30%,rgba(255,255,255,.04) 50%,transparent 70%);transform:translateX(-100%);transition:transform .6s var(--ease-out);pointer-events:none}
2682
+ .fx-card-shine:hover::after{transform:translateX(100%)}
2627
2683
  `
2628
2684
 
2629
2685
  // ════════════════════════════════════════════════════════════════
2630
- // TEMASCSS custom properties por tema
2686
+ // GEIST COLOR TOKENS Semantic scale, light + dark
2687
+ // Based on vercel.com/geist/colors
2688
+ // Backgrounds → Surfaces → Borders → Text
2631
2689
  // ════════════════════════════════════════════════════════════════
2632
2690
  const T = {
2633
2691
  dark: `
2692
+ :root {
2693
+ /* Backgrounds */
2694
+ --ds-background-100:#000000;
2695
+ --ds-background-100-rgb:0,0,0;
2696
+ --ds-background-200:#0a0a0a;
2697
+
2698
+ /* Gray scale (Geist) */
2699
+ --ds-gray-100:#0a0a0a;
2700
+ --ds-gray-200:#111111;
2701
+ --ds-gray-300:#1a1a1a;
2702
+ --ds-gray-400:#222222;
2703
+ --ds-gray-500:#2a2a2a;
2704
+ --ds-gray-600:#666666;
2705
+ --ds-gray-700:#888888;
2706
+ --ds-gray-800:#999999;
2707
+ --ds-gray-900:#aaaaaa;
2708
+ --ds-gray-1000:#ededed;
2709
+
2710
+ /* Gray alpha */
2711
+ --ds-gray-alpha-100:rgba(255,255,255,.04);
2712
+ --ds-gray-alpha-200:rgba(255,255,255,.07);
2713
+ --ds-gray-alpha-400:rgba(255,255,255,.12);
2714
+ --ds-gray-alpha-700:rgba(255,255,255,.24);
2715
+
2716
+ /* Accent colors */
2717
+ --ds-blue-100:rgba(0,112,243,.08);
2718
+ --ds-blue-200:rgba(0,112,243,.15);
2719
+ --ds-blue-700:#0070f3;
2720
+ --ds-blue-rgb:0,112,243;
2721
+ --ds-red-100:rgba(255,0,0,.08);
2722
+ --ds-red-200:rgba(255,0,0,.15);
2723
+ --ds-red-700:#ff0000;
2724
+ --ds-green-100:rgba(0,188,112,.08);
2725
+ --ds-green-700:#00bc70;
2726
+ }`,
2727
+ warm: `
2634
2728
  :root{
2635
- --aip-bg:#030712;
2636
- --aip-bg-rgb:3,7,18;
2637
- --aip-surface:#0d1117;
2638
- --aip-surface-hover:#111827;
2639
- --aip-border:rgba(255,255,255,.07);
2640
- --aip-border-strong:rgba(255,255,255,.12);
2641
- --aip-text:#f0f4ff;
2642
- --aip-text-muted:#8b9ab5;
2643
- --aip-text-dim:#3d4f68;
2644
- --aip-accent:#ff5722;
2645
- --aip-accent-rgb:255,87,34;
2646
- --aip-accent-light:#ff8a50;
2647
- --aip-grid-line:rgba(255,255,255,.03);
2729
+ --ds-background-100:#0a0010;--ds-background-100-rgb:10,0,16;--ds-background-200:#110018;
2730
+ --ds-gray-100:#110018;--ds-gray-200:#1a0025;--ds-gray-300:#250032;--ds-gray-400:#2e0040;
2731
+ --ds-gray-600:#9d6cb5;--ds-gray-700:#b87fd4;--ds-gray-800:#c896e8;--ds-gray-900:#d4aef0;--ds-gray-1000:#f0e0ff;
2732
+ --ds-gray-alpha-100:rgba(200,100,255,.04);--ds-gray-alpha-200:rgba(200,100,255,.07);
2733
+ --ds-gray-alpha-400:rgba(200,100,255,.12);--ds-gray-alpha-700:rgba(200,100,255,.22);
2734
+ --ds-blue-700:#a78bfa;--ds-blue-rgb:167,139,250;
2735
+ --ds-green-700:#4ade80;--ds-red-700:#f87171;
2736
+ --aip-accent:#ec4899;--aip-accent-rgb:236,72,153;
2737
+ --mesh-c1:99,102,241;--mesh-c2:236,72,153;--mesh-c3:251,146,60;
2648
2738
  }`,
2649
- light: `
2739
+ ocean: `
2650
2740
  :root{
2651
- --aip-bg:#ffffff;
2652
- --aip-bg-rgb:255,255,255;
2653
- --aip-surface:#f8fafc;
2654
- --aip-surface-hover:#f1f5f9;
2655
- --aip-border:rgba(0,0,0,.07);
2656
- --aip-border-strong:rgba(0,0,0,.12);
2657
- --aip-text:#0f172a;
2658
- --aip-text-muted:#475569;
2659
- --aip-text-dim:#94a3b8;
2660
- --aip-accent:#ff5722;
2661
- --aip-accent-rgb:255,87,34;
2662
- --aip-accent-light:#ff8a50;
2663
- --aip-grid-line:rgba(0,0,0,.04);
2741
+ --ds-background-100:#00080f;--ds-background-100-rgb:0,8,15;--ds-background-200:#000d18;
2742
+ --ds-gray-100:#000d18;--ds-gray-200:#001524;--ds-gray-300:#001d30;--ds-gray-400:#00253e;
2743
+ --ds-gray-600:#4a8fab;--ds-gray-700:#5ba8c8;--ds-gray-800:#70bfe0;--ds-gray-900:#8dd0f0;--ds-gray-1000:#d0efff;
2744
+ --ds-gray-alpha-100:rgba(100,200,255,.04);--ds-gray-alpha-200:rgba(100,200,255,.07);
2745
+ --ds-gray-alpha-400:rgba(100,200,255,.12);--ds-gray-alpha-700:rgba(100,200,255,.22);
2746
+ --ds-blue-700:#38bdf8;--ds-blue-rgb:56,189,248;
2747
+ --ds-green-700:#34d399;--ds-red-700:#f87171;
2748
+ --aip-accent:#0ea5e9;--aip-accent-rgb:14,165,233;
2749
+ --mesh-c1:6,182,212;--mesh-c2:59,130,246;--mesh-c3:139,92,246;
2750
+ }`,
2751
+ purple: `
2752
+ :root{
2753
+ --ds-background-100:#05000f;--ds-background-100-rgb:5,0,15;--ds-background-200:#0a0018;
2754
+ --ds-gray-100:#0a0018;--ds-gray-200:#120022;--ds-gray-300:#1a002e;--ds-gray-400:#22003c;
2755
+ --ds-gray-600:#7c5caf;--ds-gray-700:#9b72d8;--ds-gray-800:#b38ef5;--ds-gray-900:#c9a8ff;--ds-gray-1000:#eddeff;
2756
+ --ds-gray-alpha-100:rgba(180,130,255,.04);--ds-gray-alpha-200:rgba(180,130,255,.07);
2757
+ --ds-gray-alpha-400:rgba(180,130,255,.12);--ds-gray-alpha-700:rgba(180,130,255,.22);
2758
+ --ds-blue-700:#a78bfa;--ds-blue-rgb:167,139,250;
2759
+ --ds-green-700:#4ade80;--ds-red-700:#f87171;
2760
+ --aip-accent:#8b5cf6;--aip-accent-rgb:139,92,246;
2761
+ --mesh-c1:139,92,246;--mesh-c2:236,72,153;--mesh-c3:99,102,241;
2762
+ }`,
2763
+ midnight: `
2764
+ :root{
2765
+ --ds-background-100:#010309;--ds-background-100-rgb:1,3,9;--ds-background-200:#030610;
2766
+ --ds-gray-100:#060c1a;--ds-gray-200:#0d1629;--ds-gray-300:#152033;--ds-gray-400:#1c2a3e;
2767
+ --ds-gray-600:#4c6480;--ds-gray-700:#6580a0;--ds-gray-800:#7d98bc;--ds-gray-900:#a0b4d0;--ds-gray-1000:#d8e8f8;
2768
+ --ds-gray-alpha-100:rgba(100,160,220,.04);--ds-gray-alpha-200:rgba(100,160,220,.07);
2769
+ --ds-gray-alpha-400:rgba(100,160,220,.12);--ds-gray-alpha-700:rgba(100,160,220,.22);
2770
+ --ds-blue-700:#60a5fa;--ds-blue-rgb:96,165,250;
2771
+ --ds-green-700:#4ade80;--ds-red-700:#f87171;
2772
+ --aip-accent:#3b82f6;--aip-accent-rgb:59,130,246;
2773
+ --mesh-c1:59,130,246;--mesh-c2:99,102,241;--mesh-c3:14,165,233;
2774
+ }`,
2775
+ light: `
2776
+ :root {
2777
+ --ds-background-100:#ffffff;
2778
+ --ds-background-100-rgb:255,255,255;
2779
+ --ds-background-200:#fafafa;
2780
+
2781
+ --ds-gray-100:#fafafa;
2782
+ --ds-gray-200:#f5f5f5;
2783
+ --ds-gray-300:#ebebeb;
2784
+ --ds-gray-400:#e6e6e6;
2785
+ --ds-gray-500:#e0e0e0;
2786
+ --ds-gray-600:#888888;
2787
+ --ds-gray-700:#666666;
2788
+ --ds-gray-800:#444444;
2789
+ --ds-gray-900:#333333;
2790
+ --ds-gray-1000:#111111;
2791
+
2792
+ --ds-gray-alpha-100:rgba(0,0,0,.04);
2793
+ --ds-gray-alpha-200:rgba(0,0,0,.07);
2794
+ --ds-gray-alpha-400:rgba(0,0,0,.12);
2795
+ --ds-gray-alpha-700:rgba(0,0,0,.24);
2796
+
2797
+ --ds-blue-100:rgba(0,112,243,.06);
2798
+ --ds-blue-200:rgba(0,112,243,.12);
2799
+ --ds-blue-700:#0070f3;
2800
+ --ds-blue-rgb:0,112,243;
2801
+ --ds-red-100:rgba(255,0,0,.06);
2802
+ --ds-red-200:rgba(255,0,0,.12);
2803
+ --ds-red-700:#c00;
2804
+ --ds-green-100:rgba(0,188,112,.06);
2805
+ --ds-green-700:#007a45;
2664
2806
  }`,
2665
2807
  }
2666
2808
  return base + (T[theme] || T.dark)
2667
2809
  }
2668
2810
 
2811
+