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 +769 -626
- package/package.json +1 -1
- package/server/server.js +1 -1
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
|
+
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.
|
|
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)
|
|
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
|
-
|
|
1805
|
-
|
|
1806
|
-
if(t.accent)
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
}
|
|
1814
|
-
if(t.
|
|
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 —
|
|
1838
|
-
//
|
|
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
|
-
:
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
--
|
|
1845
|
-
--
|
|
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{
|
|
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(--
|
|
1851
|
-
background:var(--
|
|
1852
|
-
color:var(--
|
|
1853
|
-
line-height:1.
|
|
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:
|
|
1862
|
-
button{cursor:pointer}
|
|
1863
|
-
code,pre{font-family:var(--
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
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
|
-
|
|
1882
|
-
align-items:center;
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
background:rgba(var(--
|
|
1890
|
-
|
|
1891
|
-
-
|
|
1892
|
-
|
|
1893
|
-
|
|
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:
|
|
1900
|
-
|
|
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
|
|
1955
|
+
.fx-nav-links{display:flex;align-items:center;gap:2px}
|
|
1905
1956
|
.fx-nav-link{
|
|
1906
|
-
|
|
1907
|
-
font-weight:
|
|
1908
|
-
color:var(--
|
|
1909
|
-
padding
|
|
1910
|
-
|
|
1911
|
-
transition:
|
|
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-
|
|
1915
|
-
.fx-
|
|
1916
|
-
|
|
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
|
|
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{
|
|
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
|
|
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
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
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:
|
|
2007
|
+
max-width:960px;width:100%;
|
|
1951
2008
|
text-align:center;
|
|
1952
|
-
display:flex;
|
|
1953
|
-
|
|
1954
|
-
|
|
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
|
-
|
|
1968
|
-
.fx-hero-
|
|
1969
|
-
|
|
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
|
-
|
|
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),.
|
|
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
|
-
/*
|
|
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(
|
|
2019
|
-
font-weight:
|
|
2020
|
-
letter-spacing:-.
|
|
2021
|
-
line-height
|
|
2022
|
-
color:var(--
|
|
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(
|
|
2026
|
-
-webkit-background-clip:text;
|
|
2027
|
-
|
|
2028
|
-
|
|
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(
|
|
2032
|
-
line-height:1.
|
|
2033
|
-
color:var(--
|
|
2034
|
-
max-width:
|
|
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
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
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
|
-
|
|
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(--
|
|
2052
|
-
color:var(--
|
|
2053
|
-
|
|
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-
|
|
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(
|
|
2063
|
-
border-top:1px solid var(--
|
|
2064
|
-
border-bottom:1px solid var(--
|
|
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:
|
|
2068
|
-
|
|
2069
|
-
|
|
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
|
|
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(
|
|
2082
|
-
font-weight:
|
|
2083
|
-
|
|
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
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
.fx-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
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
|
-
|
|
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(
|
|
2113
|
-
font-weight:
|
|
2114
|
-
|
|
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.
|
|
2121
|
-
|
|
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
|
|
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
|
|
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
|
|
2147
|
-
padding:
|
|
2148
|
-
background:var(--
|
|
2149
|
-
border:1px solid var(--
|
|
2150
|
-
transition:border-color
|
|
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(--
|
|
2164
|
-
transform:translateY(-
|
|
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
|
|
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:
|
|
2171
|
-
margin-bottom:
|
|
2172
|
-
width:
|
|
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
|
|
2175
|
-
background:
|
|
2176
|
-
border:1px solid
|
|
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:
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
}
|
|
2185
|
-
.fx-
|
|
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:
|
|
2198
|
+
.fx-form-wrap{padding:48px 40px;display:flex;justify-content:center}
|
|
2206
2199
|
.fx-form{
|
|
2207
|
-
width:100%;max-width:
|
|
2208
|
-
background:var(--
|
|
2209
|
-
border:1px solid var(--
|
|
2210
|
-
border-radius:
|
|
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:
|
|
2205
|
+
.fx-field{margin-bottom:16px}
|
|
2214
2206
|
.fx-label{
|
|
2215
|
-
display:block;
|
|
2216
|
-
|
|
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
|
-
|
|
2225
|
-
|
|
2226
|
-
border:
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
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(--
|
|
2236
|
-
box-shadow:0 0 0 3px rgba(var(--
|
|
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(--
|
|
2239
|
-
|
|
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
|
-
|
|
2243
|
-
|
|
2244
|
-
border-radius
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
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:.
|
|
2257
|
-
.fx-btn-wrap{padding:0
|
|
2258
|
-
.fx-standalone-btn{width:auto;padding
|
|
2259
|
-
.fx-form-msg{font-size
|
|
2260
|
-
.fx-form-err{color
|
|
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
|
|
2266
|
-
.fx-table{width:100%;border-collapse:collapse;font-size
|
|
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
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
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(--
|
|
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(--
|
|
2283
|
-
.fx-td{padding
|
|
2284
|
-
.fx-td:first-child{color:var(--
|
|
2285
|
-
.fx-td-empty{padding:
|
|
2286
|
-
.fx-td-actions{white-space:nowrap;padding
|
|
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
|
-
|
|
2289
|
-
font-size
|
|
2290
|
-
|
|
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-
|
|
2295
|
-
.fx-edit-btn{background:
|
|
2296
|
-
.fx-delete-btn{background:
|
|
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
|
-
|
|
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:
|
|
2310
|
-
|
|
2311
|
-
|
|
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
|
|
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:-
|
|
2323
|
-
background:var(--
|
|
2324
|
-
font-size
|
|
2325
|
-
|
|
2326
|
-
}
|
|
2327
|
-
.fx-pricing-name{font-size
|
|
2328
|
-
.fx-pricing-price{font-size:
|
|
2329
|
-
.fx-pricing-price-sm{font-size:
|
|
2330
|
-
.fx-pricing-desc{font-size
|
|
2331
|
-
.fx-pricing-cta{
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
background:var(--
|
|
2335
|
-
|
|
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
|
|
2342
|
-
.fx-faq{max-width:
|
|
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(--
|
|
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:
|
|
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:
|
|
2356
|
-
font-size
|
|
2357
|
-
|
|
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
|
|
2364
|
-
|
|
2365
|
-
|
|
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
|
|
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
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
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
|
|
2383
|
-
padding
|
|
2384
|
-
background:var(--
|
|
2385
|
-
border-bottom:1px solid var(--
|
|
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
|
|
2388
|
-
.fx-dots span{width:
|
|
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{
|
|
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(--
|
|
2396
|
-
background:
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
transition:
|
|
2400
|
-
}
|
|
2401
|
-
.fx-code-copy:hover{
|
|
2402
|
-
.fx-code-body{padding:
|
|
2403
|
-
.fx-code-line{font-family:var(--
|
|
2404
|
-
.fx-kw{color:#c792ea}.fx-st{color:#
|
|
2405
|
-
.fx-op{color:var(--aip-accent)}.fx-comment{color:var(--
|
|
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
|
|
2412
|
-
border:1px solid var(--
|
|
2413
|
-
background:var(--
|
|
2414
|
-
margin:0
|
|
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:
|
|
2417
|
-
.fx-install-line{display:flex;gap
|
|
2418
|
-
.fx-install-prompt{color:var(--aip-accent);flex-shrink:0;font-weight:700}
|
|
2419
|
-
.fx-install-cmd{color:var(--
|
|
2420
|
-
.fx-install-comment{font-family:var(--
|
|
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
|
-
|
|
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:
|
|
2432
|
-
background:var(--
|
|
2433
|
-
border:1px solid var(--
|
|
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
|
|
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:
|
|
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-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
.fx-bench-
|
|
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
|
-
|
|
2454
|
-
border-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
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{
|
|
2463
|
-
|
|
2464
|
-
|
|
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:
|
|
2471
|
-
border-top:1px solid var(--
|
|
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;
|
|
2475
|
-
|
|
2476
|
-
|
|
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-
|
|
2480
|
-
.fx-cta-
|
|
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
|
-
|
|
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:
|
|
2496
|
-
left:calc(
|
|
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:
|
|
2502
|
-
.fx-step{display:flex;flex-direction:column;align-items:flex-start;gap
|
|
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:
|
|
2505
|
-
background:var(--
|
|
2506
|
-
|
|
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
|
|
2512
|
-
.fx-step-desc{font-size
|
|
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{
|
|
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
|
|
2521
|
-
background:var(--
|
|
2522
|
-
font-size
|
|
2523
|
-
|
|
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
|
|
2528
|
-
|
|
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(--
|
|
2533
|
-
.fx-compare-feature{font-size
|
|
2534
|
-
.fx-compare-col-a{text-align:center;font-size
|
|
2535
|
-
.fx-compare-col-b{text-align:center;font-size
|
|
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
|
|
2541
|
-
.fx-video-yt{
|
|
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:
|
|
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:
|
|
2549
|
-
.fx-testi{max-width:
|
|
2550
|
-
.fx-testi-img,.fx-testi-avatar{width:
|
|
2551
|
-
.fx-testi-avatar{
|
|
2552
|
-
|
|
2553
|
-
|
|
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
|
|
2559
|
-
.fx-gallery-item{border-radius
|
|
2560
|
-
.fx-gallery-item img{width:100%;height:100%;object-fit:cover;transition:transform
|
|
2561
|
-
.fx-gallery-item:hover img{transform:scale(1.
|
|
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{
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
.fx-
|
|
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
|
|
2573
|
-
.fx-cols{display:grid;gap:
|
|
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
|
|
2576
|
-
.fx-select-wrap{padding
|
|
2577
|
-
.fx-select-block{width:auto;min-width:
|
|
2578
|
-
.fx-each{padding:0
|
|
2579
|
-
.fx-each-empty{padding:
|
|
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
|
|
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
|
-
|
|
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(
|
|
2594
|
-
transition:opacity .
|
|
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:.
|
|
2598
|
-
.fx-animate-stagger.fx-visible>*:nth-child(3){opacity:1;transform:none;transition-delay:.
|
|
2599
|
-
.fx-animate-stagger.fx-visible>*:nth-child(4){opacity:1;transform:none;transition-delay:.
|
|
2600
|
-
.fx-animate-stagger.fx-visible>*:nth-child(5){opacity:1;transform:none;transition-delay:.
|
|
2601
|
-
.fx-animate-stagger.fx-visible>*:nth-child(6){opacity:1;transform:none;transition-delay:.
|
|
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
|
-
/*
|
|
2604
|
-
.fx-count{
|
|
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
|
-
/*
|
|
2608
|
-
|
|
2609
|
-
|
|
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:
|
|
2618
|
-
display:flex;justify-content:space-between;align-items:center;
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
.fx-footer-
|
|
2622
|
-
.fx-footer-
|
|
2623
|
-
.fx-footer-link:
|
|
2624
|
-
.fx-footer-
|
|
2625
|
-
.fx-footer-
|
|
2626
|
-
|
|
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
|
-
//
|
|
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
|
-
--
|
|
2636
|
-
--
|
|
2637
|
-
--
|
|
2638
|
-
--
|
|
2639
|
-
--
|
|
2640
|
-
--
|
|
2641
|
-
--
|
|
2642
|
-
--aip-
|
|
2643
|
-
--
|
|
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
|
-
|
|
2739
|
+
ocean: `
|
|
2650
2740
|
:root{
|
|
2651
|
-
--
|
|
2652
|
-
--
|
|
2653
|
-
--
|
|
2654
|
-
--
|
|
2655
|
-
--
|
|
2656
|
-
--
|
|
2657
|
-
--
|
|
2658
|
-
--aip-
|
|
2659
|
-
--
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
--
|
|
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
|
+
|