aiplang 2.11.7 → 2.11.9
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 +844 -163
- 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.9'
|
|
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.9'`)
|
|
690
690
|
lines.push(``)
|
|
691
691
|
return lines.join('\n')
|
|
692
692
|
}
|
|
@@ -1427,7 +1427,7 @@ function rHero(b) {
|
|
|
1427
1427
|
const bgStyle = b.bg ? ` style="background:${b.bg}"` : b.style ? ` style="${b.style.replace(/,/g,';')}"` : ''
|
|
1428
1428
|
const inlineStyle = b.style && !b.bg ? ` style="${b.style.replace(/,/g,';')}"` : ''
|
|
1429
1429
|
if (v === 'landing') {
|
|
1430
|
-
return `<section class="fx-hero fx-hero-landing"${bgStyle}><div class="fx-hero-inner">${h1}${sub}${ctas}</div></section>
|
|
1430
|
+
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>
|
|
1431
1431
|
`
|
|
1432
1432
|
}
|
|
1433
1433
|
if (h1) h1 = heroBadge + h1
|
|
@@ -1801,172 +1801,853 @@ function genCustomThemeVars(ct) {
|
|
|
1801
1801
|
|
|
1802
1802
|
function genThemeVarCSS(t) {
|
|
1803
1803
|
const r=[]
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
if(t.
|
|
1807
|
-
if(t.
|
|
1808
|
-
if(t.
|
|
1809
|
-
if(t.
|
|
1810
|
-
if(
|
|
1811
|
-
if(t.
|
|
1812
|
-
if(t.
|
|
1813
|
-
if(t.
|
|
1804
|
+
const rv=[]
|
|
1805
|
+
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'}
|
|
1806
|
+
if(t.accent){rv.push('--aip-accent:'+t.accent);rv.push('--aip-accent-rgb:'+h2r(t.accent))}
|
|
1807
|
+
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)}
|
|
1808
|
+
if(t.text){rv.push('--ds-gray-1000:'+t.text)}
|
|
1809
|
+
if(t.radius){rv.push('--radius-sm:'+t.radius);rv.push('--radius-md:'+t.radius)}
|
|
1810
|
+
if(rv.length) r.push(':root{'+rv.join(';')+'}')
|
|
1811
|
+
if(t.font) r.push("body{font-family:'"+t.font+"',var(--geist-font)!important}")
|
|
1812
|
+
if(t.accent) r.push('.fx-cta,.fx-btn,.fx-pricing-cta,.fx-nav-cta{background:'+t.accent+'!important;color:#fff!important}')
|
|
1813
|
+
if(t.bg) r.push('body,html{background:'+t.bg+'!important}')
|
|
1814
|
+
if(t.text) r.push('body{color:'+t.text+'!important}')
|
|
1814
1815
|
return r.join('')
|
|
1815
1816
|
}
|
|
1816
1817
|
|
|
1818
|
+
|
|
1817
1819
|
function css(theme) {
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
/*
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1820
|
+
// ════════════════════════════════════════════════════════════════
|
|
1821
|
+
// GEIST DESIGN SYSTEM — Vercel's design language for aiplang
|
|
1822
|
+
// Principles: precision, minimalism, Swiss typography, semantic tokens
|
|
1823
|
+
// Fonts: Geist Sans + Geist Mono (Google Fonts)
|
|
1824
|
+
// ════════════════════════════════════════════════════════════════
|
|
1825
|
+
const base = `
|
|
1826
|
+
@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');
|
|
1827
|
+
|
|
1828
|
+
:root {
|
|
1829
|
+
--geist-font:'Geist','Geist Sans',-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
|
|
1830
|
+
--geist-mono:'Geist Mono','Geist_Mono',ui-monospace,'Cascadia Code','Source Code Pro',Menlo,Consolas,'DejaVu Sans Mono',monospace;
|
|
1831
|
+
/* Spacing scale (4px base) */
|
|
1832
|
+
--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;
|
|
1833
|
+
--space-5:20px;--space-6:24px;--space-8:32px;--space-10:40px;--space-12:48px;
|
|
1834
|
+
/* Radius */
|
|
1835
|
+
--radius-sm:4px;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-full:9999px;
|
|
1836
|
+
/* Easing - Vercel guidelines */
|
|
1837
|
+
--ease-out:cubic-bezier(.16,1,.3,1);
|
|
1838
|
+
--ease-in-out:cubic-bezier(.4,0,.2,1);
|
|
1839
|
+
--ease-spring:cubic-bezier(.34,1.56,.64,1);
|
|
1840
|
+
/* Transitions - only opacity + transform per guidelines */
|
|
1841
|
+
--duration-fast:100ms;--duration-normal:150ms;--duration-slow:250ms;
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
/* ── Reset ── */
|
|
1845
|
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
|
1846
|
+
html{
|
|
1847
|
+
font-size:16px;
|
|
1848
|
+
scroll-behavior:smooth;
|
|
1849
|
+
text-size-adjust:100%;
|
|
1850
|
+
-webkit-text-size-adjust:100%;
|
|
1851
|
+
/* Vercel: tabular nums by default for consistency */
|
|
1852
|
+
font-feature-settings:'ss01','ss02','cv01','cv02';
|
|
1853
|
+
}
|
|
1854
|
+
body{
|
|
1855
|
+
font-family:var(--geist-font);
|
|
1856
|
+
background:var(--ds-background-100);
|
|
1857
|
+
color:var(--ds-gray-1000);
|
|
1858
|
+
line-height:1.5;
|
|
1859
|
+
-webkit-font-smoothing:antialiased;
|
|
1860
|
+
-moz-osx-font-smoothing:grayscale;
|
|
1861
|
+
min-height:100vh;
|
|
1862
|
+
overflow-x:hidden;
|
|
1863
|
+
/* Reduce banding from gradients */
|
|
1864
|
+
text-rendering:optimizeLegibility;
|
|
1865
|
+
}
|
|
1866
|
+
a{text-decoration:none;color:inherit}
|
|
1867
|
+
img{max-width:100%;height:auto;display:block}
|
|
1868
|
+
input,button,select,textarea{font-family:var(--geist-font);font-size:inherit}
|
|
1869
|
+
button{cursor:pointer;border:none;background:none}
|
|
1870
|
+
code,pre,kbd{font-family:var(--geist-mono)}
|
|
1871
|
+
/* Vercel guideline: touch-action on interactive elements */
|
|
1872
|
+
button,a,[role=button]{touch-action:manipulation}
|
|
1873
|
+
/* Vercel: visible focus ring */
|
|
1874
|
+
:focus-visible{
|
|
1875
|
+
outline:2px solid var(--ds-blue-700);
|
|
1876
|
+
outline-offset:2px;
|
|
1877
|
+
border-radius:var(--radius-sm);
|
|
1878
|
+
}
|
|
1879
|
+
/* Vercel: honor prefers-reduced-motion */
|
|
1880
|
+
@media(prefers-reduced-motion:reduce){
|
|
1881
|
+
*,*::before,*::after{
|
|
1882
|
+
animation-duration:.01ms!important;
|
|
1883
|
+
animation-iteration-count:1!important;
|
|
1884
|
+
transition-duration:.01ms!important;
|
|
1885
|
+
}
|
|
1886
|
+
}
|
|
1887
|
+
|
|
1888
|
+
/* ═══════════════════════════════════════════
|
|
1889
|
+
NAV — Geist nav style
|
|
1890
|
+
═══════════════════════════════════════════ */
|
|
1891
|
+
.fx-nav{
|
|
1892
|
+
position:sticky;top:0;z-index:200;
|
|
1893
|
+
display:flex;align-items:center;justify-content:space-between;
|
|
1894
|
+
padding:0 var(--space-6);height:54px;
|
|
1895
|
+
background:var(--ds-background-100);
|
|
1896
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
1897
|
+
/* Vercel: backdrop-blur for glass effect */
|
|
1898
|
+
backdrop-filter:blur(16px) saturate(200%);
|
|
1899
|
+
-webkit-backdrop-filter:blur(16px) saturate(200%);
|
|
1900
|
+
background:rgba(var(--ds-background-100-rgb),.92);
|
|
1901
|
+
flex-wrap:wrap;gap:var(--space-2);
|
|
1902
|
+
transition:border-color var(--duration-slow) var(--ease-in-out);
|
|
1903
|
+
}
|
|
1904
|
+
.fx-nav.scrolled{border-bottom-color:var(--ds-gray-alpha-400)}
|
|
1905
|
+
.fx-brand{
|
|
1906
|
+
font-size:14px;font-weight:600;letter-spacing:-.02em;
|
|
1907
|
+
color:var(--ds-gray-1000);
|
|
1908
|
+
}
|
|
1909
|
+
.fx-nav-links{display:flex;align-items:center;gap:2px}
|
|
1910
|
+
.fx-nav-link{
|
|
1911
|
+
display:inline-flex;align-items:center;
|
|
1912
|
+
font-size:13px;font-weight:400;
|
|
1913
|
+
color:var(--ds-gray-900);
|
|
1914
|
+
padding:5px 10px;border-radius:var(--radius-md);
|
|
1915
|
+
/* Only transition opacity + transform per Vercel guidelines */
|
|
1916
|
+
transition:color var(--duration-normal) var(--ease-in-out),background var(--duration-normal) var(--ease-in-out);
|
|
1917
|
+
}
|
|
1918
|
+
.fx-nav-link:hover{
|
|
1919
|
+
color:var(--ds-gray-1000);
|
|
1920
|
+
background:var(--ds-gray-alpha-200);
|
|
1921
|
+
}
|
|
1922
|
+
/* Vercel CTA button style */
|
|
1923
|
+
.fx-nav-cta{
|
|
1924
|
+
display:inline-flex;align-items:center;gap:6px;
|
|
1925
|
+
height:32px;padding:0 12px;
|
|
1926
|
+
background:var(--ds-gray-1000);
|
|
1927
|
+
color:var(--ds-background-100);
|
|
1928
|
+
font-size:13px;font-weight:500;
|
|
1929
|
+
border-radius:var(--radius-md);
|
|
1930
|
+
transition:opacity var(--duration-normal) var(--ease-in-out);
|
|
1931
|
+
white-space:nowrap;
|
|
1932
|
+
}
|
|
1933
|
+
.fx-nav-cta:hover{opacity:.85}
|
|
1934
|
+
.fx-hamburger{display:none;flex-direction:column;gap:5px;padding:6px;border-radius:var(--radius-md)}
|
|
1935
|
+
.fx-hamburger span{display:block;width:18px;height:1px;background:var(--ds-gray-900);transition:all var(--duration-normal) var(--ease-in-out)}
|
|
1936
|
+
.fx-hamburger.open span:nth-child(1){transform:rotate(45deg) translate(4px,4px)}
|
|
1937
|
+
.fx-hamburger.open span:nth-child(2){opacity:0}
|
|
1938
|
+
.fx-hamburger.open span:nth-child(3){transform:rotate(-45deg) translate(4px,-4px)}
|
|
1939
|
+
@media(max-width:640px){
|
|
1940
|
+
.fx-hamburger{display:flex}
|
|
1941
|
+
.fx-nav-links{
|
|
1942
|
+
display:none;width:100%;
|
|
1943
|
+
flex-direction:column;align-items:stretch;
|
|
1944
|
+
padding:8px 0;gap:1px;
|
|
1945
|
+
border-top:1px solid var(--ds-gray-alpha-400);margin-top:8px;
|
|
1946
|
+
}
|
|
1947
|
+
.fx-nav-links.open{display:flex}
|
|
1948
|
+
.fx-nav-link{padding:8px 10px}
|
|
1949
|
+
}
|
|
1950
|
+
|
|
1951
|
+
/* ═══════════════════════════════════════════
|
|
1952
|
+
HERO
|
|
1953
|
+
═══════════════════════════════════════════ */
|
|
1954
|
+
.fx-hero{
|
|
1955
|
+
display:flex;align-items:center;justify-content:center;
|
|
1956
|
+
min-height:calc(100svh - 54px);
|
|
1957
|
+
padding:80px 24px 64px;
|
|
1958
|
+
position:relative;overflow:hidden;
|
|
1959
|
+
}
|
|
1960
|
+
.fx-hero-inner{
|
|
1961
|
+
max-width:960px;width:100%;
|
|
1962
|
+
text-align:center;
|
|
1963
|
+
display:flex;flex-direction:column;align-items:center;
|
|
1964
|
+
gap:24px;
|
|
1965
|
+
position:relative;z-index:1;
|
|
1966
|
+
}
|
|
1967
|
+
.fx-hero-minimal{min-height:50vh!important}
|
|
1968
|
+
.fx-hero-tall{min-height:100svh!important}
|
|
1969
|
+
/* Landing: Vercel-style grid + radial */
|
|
1970
|
+
.fx-hero-landing{overflow:hidden}
|
|
1971
|
+
.fx-hero-grid{
|
|
1972
|
+
position:absolute;inset:0;pointer-events:none;
|
|
1973
|
+
background-image:
|
|
1974
|
+
linear-gradient(var(--ds-gray-alpha-200) 1px,transparent 1px),
|
|
1975
|
+
linear-gradient(90deg,var(--ds-gray-alpha-200) 1px,transparent 1px);
|
|
1976
|
+
background-size:48px 48px;
|
|
1977
|
+
mask-image:radial-gradient(ellipse 80% 70% at 50% 0%,black 40%,transparent 100%);
|
|
1978
|
+
-webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 0%,black 40%,transparent 100%);
|
|
1979
|
+
}
|
|
1980
|
+
/* Vercel-style ambient glow */
|
|
1981
|
+
.fx-hero-landing::after{
|
|
1982
|
+
content:'';position:absolute;
|
|
1983
|
+
width:80vw;height:40vh;max-width:900px;
|
|
1984
|
+
border-radius:50%;
|
|
1985
|
+
background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.08) 0%,transparent 60%);
|
|
1986
|
+
left:50%;top:0;transform:translate(-50%,-20%);
|
|
1987
|
+
pointer-events:none;
|
|
1988
|
+
animation:fx-glow 8s ease-in-out infinite;
|
|
1989
|
+
}
|
|
1990
|
+
@keyframes fx-glow{0%,100%{opacity:.6}50%{opacity:1}}
|
|
1991
|
+
/* Vercel hero typography */
|
|
1992
|
+
.fx-title{
|
|
1993
|
+
font-size:clamp(40px,6vw,80px);
|
|
1994
|
+
font-weight:700;
|
|
1995
|
+
letter-spacing:-.04em;
|
|
1996
|
+
line-height:1.05;
|
|
1997
|
+
color:var(--ds-gray-1000);
|
|
1998
|
+
}
|
|
1999
|
+
.fx-gradient-text{
|
|
2000
|
+
background:linear-gradient(90deg,var(--ds-gray-1000) 0%,var(--ds-gray-700) 100%);
|
|
2001
|
+
-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
|
|
2002
|
+
}
|
|
2003
|
+
/* Override with accent when set */
|
|
2004
|
+
.fx-gradient-text-accent{
|
|
2005
|
+
background:linear-gradient(135deg,var(--ds-gray-1000) 30%,rgba(var(--aip-accent-rgb),1) 100%);
|
|
2006
|
+
-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
|
|
2007
|
+
}
|
|
2008
|
+
.fx-sub{
|
|
2009
|
+
font-size:clamp(15px,2vw,18px);
|
|
2010
|
+
line-height:1.65;
|
|
2011
|
+
color:var(--ds-gray-900);
|
|
2012
|
+
max-width:540px;font-weight:400;
|
|
2013
|
+
}
|
|
2014
|
+
/* Vercel hero badge */
|
|
2015
|
+
.fx-hero-badge{
|
|
2016
|
+
display:inline-flex;align-items:center;gap:6px;
|
|
2017
|
+
height:28px;padding:0 10px;
|
|
2018
|
+
background:var(--ds-gray-alpha-100);
|
|
2019
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2020
|
+
border-radius:var(--radius-full);
|
|
2021
|
+
font-size:12px;font-weight:500;color:var(--ds-gray-900);
|
|
2022
|
+
letter-spacing:.01em;
|
|
2023
|
+
}
|
|
2024
|
+
.fx-hero-badge-dot{
|
|
2025
|
+
width:5px;height:5px;border-radius:50%;
|
|
2026
|
+
background:var(--ds-green-700);
|
|
2027
|
+
animation:fx-pulse 3s ease infinite;flex-shrink:0;
|
|
2028
|
+
}
|
|
2029
|
+
@keyframes fx-pulse{0%,100%{opacity:1}50%{opacity:.4}}
|
|
2030
|
+
/* Vercel CTA button */
|
|
2031
|
+
.fx-cta{
|
|
2032
|
+
display:inline-flex;align-items:center;gap:6px;
|
|
2033
|
+
height:40px;padding:0 20px;
|
|
2034
|
+
background:var(--ds-gray-1000);
|
|
2035
|
+
color:var(--ds-background-100);
|
|
2036
|
+
font-size:14px;font-weight:500;letter-spacing:-.01em;
|
|
2037
|
+
border-radius:var(--radius-md);
|
|
2038
|
+
/* Only transform per Vercel guidelines */
|
|
2039
|
+
transition:opacity var(--duration-normal) var(--ease-in-out),transform var(--duration-normal) var(--ease-out);
|
|
2040
|
+
}
|
|
2041
|
+
.fx-cta:hover{opacity:.88;transform:translateY(-1px)}
|
|
2042
|
+
.fx-cta:active{transform:translateY(0)}
|
|
2043
|
+
.fx-cta-outline{
|
|
2044
|
+
background:transparent!important;
|
|
2045
|
+
border:1px solid var(--ds-gray-alpha-400)!important;
|
|
2046
|
+
color:var(--ds-gray-900)!important;
|
|
2047
|
+
}
|
|
2048
|
+
.fx-cta-outline:hover{background:var(--ds-gray-alpha-100)!important}
|
|
2049
|
+
/* Vercel hero split */
|
|
2050
|
+
.fx-hero-split{
|
|
2051
|
+
display:grid;grid-template-columns:1fr 1fr;gap:64px;
|
|
2052
|
+
align-items:center;padding:80px 40px;min-height:80vh;
|
|
2053
|
+
}
|
|
2054
|
+
@media(max-width:768px){.fx-hero-split{grid-template-columns:1fr;padding:48px 24px;min-height:auto}}
|
|
2055
|
+
.fx-hero-split .fx-hero-inner{text-align:left;align-items:flex-start;max-width:none}
|
|
2056
|
+
.fx-hero-img{width:100%;border-radius:var(--radius-lg);border:1px solid var(--ds-gray-alpha-400)}
|
|
2057
|
+
|
|
2058
|
+
/* ═══════════════════════════════════════════
|
|
2059
|
+
STATS BAR — Geist big number style
|
|
2060
|
+
═══════════════════════════════════════════ */
|
|
2061
|
+
.fx-stats{
|
|
2062
|
+
display:grid;
|
|
2063
|
+
grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
|
|
2064
|
+
border-top:1px solid var(--ds-gray-alpha-400);
|
|
2065
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
2066
|
+
}
|
|
2067
|
+
.fx-stat{
|
|
2068
|
+
padding:40px 24px;text-align:center;
|
|
2069
|
+
border-right:1px solid var(--ds-gray-alpha-400);
|
|
2070
|
+
transition:background var(--duration-normal) var(--ease-in-out);
|
|
2071
|
+
}
|
|
2072
|
+
.fx-stat:last-child{border-right:none}
|
|
2073
|
+
.fx-stat:hover{background:var(--ds-gray-alpha-100)}
|
|
2074
|
+
.fx-stat-val{
|
|
2075
|
+
font-size:clamp(28px,4vw,40px);
|
|
2076
|
+
font-weight:700;letter-spacing:-.04em;line-height:1;
|
|
2077
|
+
color:var(--ds-gray-1000);
|
|
2078
|
+
font-variant-numeric:tabular-nums;
|
|
2079
|
+
}
|
|
2080
|
+
.fx-stat-lbl{
|
|
2081
|
+
font-size:12px;font-weight:500;
|
|
2082
|
+
text-transform:uppercase;letter-spacing:.08em;
|
|
2083
|
+
color:var(--ds-gray-700);
|
|
2084
|
+
margin-top:8px;
|
|
2085
|
+
}
|
|
2086
|
+
.fx-stat-vs{font-size:11px;color:var(--ds-gray-600);margin-top:4px;letter-spacing:.01em}
|
|
2087
|
+
@media(max-width:640px){
|
|
2088
|
+
.fx-stats{grid-template-columns:repeat(2,1fr)}
|
|
2089
|
+
.fx-stat{border-right:none;border-bottom:1px solid var(--ds-gray-alpha-400)}
|
|
2090
|
+
.fx-stat:nth-child(odd){border-right:1px solid var(--ds-gray-alpha-400)}
|
|
2091
|
+
.fx-stat:last-child,:nth-last-child(-n+2):nth-child(even){border-bottom:none}
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
/* ═══════════════════════════════════════════
|
|
2095
|
+
SECTIONS
|
|
2096
|
+
═══════════════════════════════════════════ */
|
|
2097
|
+
.fx-sect{padding:80px 40px;position:relative}
|
|
2098
|
+
@media(max-width:768px){.fx-sect{padding:64px 24px}}
|
|
2099
|
+
.fx-sect-title{
|
|
2100
|
+
font-size:clamp(24px,3.5vw,40px);
|
|
2101
|
+
font-weight:700;letter-spacing:-.03em;line-height:1.15;
|
|
2102
|
+
margin-bottom:12px;text-align:center;color:var(--ds-gray-1000);
|
|
2103
|
+
}
|
|
2104
|
+
.fx-sect-body{
|
|
2105
|
+
font-size:15px;line-height:1.7;text-align:center;
|
|
2106
|
+
color:var(--ds-gray-900);max-width:480px;margin:0 auto;
|
|
2107
|
+
}
|
|
2108
|
+
.fx-sect-link{font-size:13px;font-weight:500;color:var(--ds-blue-700);display:inline-block;margin-top:12px}
|
|
2109
|
+
|
|
2110
|
+
/* ═══════════════════════════════════════════
|
|
2111
|
+
CARDS / GRID — Geist card style
|
|
2112
|
+
═══════════════════════════════════════════ */
|
|
2113
|
+
.fx-grid{display:grid;gap:12px;padding:0 40px 80px}
|
|
2114
|
+
.fx-grid-2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
|
|
2115
|
+
.fx-grid-3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
|
|
2116
|
+
.fx-grid-4{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
|
|
2117
|
+
@media(max-width:640px){.fx-grid{padding:0 24px 48px}.fx-grid-2,.fx-grid-3,.fx-grid-4{grid-template-columns:1fr}}
|
|
2118
|
+
.fx-card{
|
|
2119
|
+
border-radius:var(--radius-lg);
|
|
2120
|
+
padding:24px;
|
|
2121
|
+
background:var(--ds-background-200);
|
|
2122
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2123
|
+
transition:border-color var(--duration-normal) var(--ease-in-out),transform var(--duration-slow) var(--ease-out);
|
|
2124
|
+
position:relative;overflow:hidden;
|
|
2125
|
+
}
|
|
2126
|
+
.fx-card:hover{
|
|
2127
|
+
border-color:var(--ds-gray-alpha-700);
|
|
2128
|
+
transform:translateY(-1px);
|
|
2129
|
+
}
|
|
2130
|
+
.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)}
|
|
2131
|
+
.fx-icon{
|
|
2132
|
+
font-size:20px;
|
|
2133
|
+
margin-bottom:16px;
|
|
2134
|
+
width:40px;height:40px;
|
|
2135
|
+
display:flex;align-items:center;justify-content:center;
|
|
2136
|
+
border-radius:var(--radius-md);
|
|
2137
|
+
background:var(--ds-gray-alpha-200);
|
|
2138
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2139
|
+
}
|
|
2140
|
+
.fx-card-title{
|
|
2141
|
+
font-size:14px;font-weight:600;letter-spacing:-.015em;
|
|
2142
|
+
margin-bottom:6px;color:var(--ds-gray-1000);line-height:1.4;
|
|
2143
|
+
}
|
|
2144
|
+
.fx-card-body{font-size:13px;line-height:1.65;color:var(--ds-gray-900)}
|
|
2145
|
+
.fx-card-link{font-size:13px;font-weight:500;color:var(--ds-blue-700);display:inline-block;margin-top:12px}
|
|
2146
|
+
.fx-grid-feature .fx-card:hover{border-color:rgba(var(--aip-accent-rgb),.4)}
|
|
2147
|
+
.fx-grid-feature .fx-icon{background:rgba(var(--aip-accent-rgb),.06);border-color:rgba(var(--aip-accent-rgb),.15)}
|
|
2148
|
+
|
|
2149
|
+
/* ═══════════════════════════════════════════
|
|
2150
|
+
FORMS — Geist input style
|
|
2151
|
+
═══════════════════════════════════════════ */
|
|
2152
|
+
.fx-form-wrap{padding:48px 40px;display:flex;justify-content:center}
|
|
2153
|
+
.fx-form{
|
|
2154
|
+
width:100%;max-width:400px;
|
|
2155
|
+
background:var(--ds-background-200);
|
|
2156
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2157
|
+
border-radius:var(--radius-xl);padding:32px;
|
|
2158
|
+
}
|
|
2159
|
+
.fx-field{margin-bottom:16px}
|
|
2160
|
+
.fx-label{
|
|
2161
|
+
display:block;font-size:13px;font-weight:500;
|
|
2162
|
+
color:var(--ds-gray-1000);margin-bottom:6px;letter-spacing:-.01em;
|
|
2163
|
+
}
|
|
2164
|
+
.fx-input{
|
|
2165
|
+
width:100%;height:40px;padding:0 12px;
|
|
2166
|
+
background:var(--ds-background-100);
|
|
2167
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2168
|
+
border-radius:var(--radius-md);
|
|
2169
|
+
color:var(--ds-gray-1000);font-size:14px;
|
|
2170
|
+
outline:none;-webkit-appearance:none;
|
|
2171
|
+
transition:border-color var(--duration-normal) var(--ease-in-out),box-shadow var(--duration-normal) var(--ease-in-out);
|
|
2172
|
+
}
|
|
2173
|
+
.fx-input:hover{border-color:var(--ds-gray-alpha-700)}
|
|
2174
|
+
.fx-input:focus{
|
|
2175
|
+
border-color:var(--ds-blue-700);
|
|
2176
|
+
box-shadow:0 0 0 3px rgba(var(--ds-blue-rgb),.15);
|
|
2177
|
+
}
|
|
2178
|
+
.fx-input::placeholder{color:var(--ds-gray-600)}
|
|
2179
|
+
textarea.fx-input{height:auto;padding:10px 12px;resize:vertical;min-height:80px;line-height:1.5}
|
|
2180
|
+
.fx-btn{
|
|
2181
|
+
width:100%;height:40px;padding:0 16px;
|
|
2182
|
+
background:var(--ds-gray-1000);color:var(--ds-background-100);
|
|
2183
|
+
font-size:14px;font-weight:500;letter-spacing:-.01em;
|
|
2184
|
+
border-radius:var(--radius-md);
|
|
2185
|
+
margin-top:4px;
|
|
2186
|
+
transition:opacity var(--duration-normal) var(--ease-in-out),transform var(--duration-normal) var(--ease-out);
|
|
2187
|
+
}
|
|
2188
|
+
.fx-btn:hover{opacity:.88;transform:translateY(-1px)}
|
|
2189
|
+
.fx-btn:active{transform:translateY(0)}
|
|
2190
|
+
.fx-btn:disabled{opacity:.4;cursor:not-allowed;transform:none}
|
|
2191
|
+
.fx-btn-wrap{padding:0 40px 24px}
|
|
2192
|
+
.fx-standalone-btn{width:auto;padding:0 20px;margin-top:0}
|
|
2193
|
+
.fx-form-msg{font-size:13px;padding:6px 0;min-height:24px;text-align:center;font-weight:500}
|
|
2194
|
+
.fx-form-err{color:var(--ds-red-700)}.fx-form-ok{color:var(--ds-green-700)}
|
|
2195
|
+
|
|
2196
|
+
/* ═══════════════════════════════════════════
|
|
2197
|
+
TABLE — Geist table style
|
|
2198
|
+
═══════════════════════════════════════════ */
|
|
2199
|
+
.fx-table-wrap{overflow-x:auto;padding:0 40px 64px}
|
|
2200
|
+
.fx-table{width:100%;border-collapse:collapse;font-size:13px}
|
|
2201
|
+
.fx-th{
|
|
2202
|
+
text-align:left;padding:0 12px 10px;
|
|
2203
|
+
font-size:11px;font-weight:600;text-transform:uppercase;
|
|
2204
|
+
letter-spacing:.06em;color:var(--ds-gray-700);
|
|
2205
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);white-space:nowrap;
|
|
2206
|
+
}
|
|
2207
|
+
.fx-th-actions{opacity:.5}
|
|
2208
|
+
.fx-tr{border-bottom:1px solid var(--ds-gray-alpha-200);transition:background var(--duration-fast) var(--ease-in-out)}
|
|
2209
|
+
.fx-tr:last-child{border-bottom:none}
|
|
2210
|
+
.fx-tr:hover{background:var(--ds-gray-alpha-100)}
|
|
2211
|
+
.fx-td{padding:12px;color:var(--ds-gray-900);vertical-align:middle}
|
|
2212
|
+
.fx-td:first-child{color:var(--ds-gray-1000);font-weight:500}
|
|
2213
|
+
.fx-td-empty{padding:48px 12px;text-align:center;color:var(--ds-gray-600);font-size:13px}
|
|
2214
|
+
.fx-td-actions{white-space:nowrap;padding:6px 12px!important}
|
|
2215
|
+
.fx-action-btn{
|
|
2216
|
+
height:28px;padding:0 10px;border-radius:var(--radius-md);
|
|
2217
|
+
font-size:12px;font-weight:500;margin-right:4px;
|
|
2218
|
+
transition:background var(--duration-normal) var(--ease-in-out);
|
|
2219
|
+
}
|
|
2220
|
+
.fx-edit-btn{background:var(--ds-blue-100);color:var(--ds-blue-700)}
|
|
2221
|
+
.fx-edit-btn:hover{background:var(--ds-blue-200)}
|
|
2222
|
+
.fx-delete-btn{background:var(--ds-red-100);color:var(--ds-red-700)}
|
|
2223
|
+
.fx-delete-btn:hover{background:var(--ds-red-200)}
|
|
2224
|
+
|
|
2225
|
+
/* ═══════════════════════════════════════════
|
|
2226
|
+
PRICING — Geist pricing style
|
|
2227
|
+
═══════════════════════════════════════════ */
|
|
2228
|
+
.fx-pricing{
|
|
2229
|
+
display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
|
|
2230
|
+
gap:16px;padding:24px 40px 80px;align-items:start;
|
|
2231
|
+
}
|
|
2232
|
+
.fx-pricing-card{
|
|
2233
|
+
border-radius:var(--radius-xl);padding:32px;
|
|
2234
|
+
background:var(--ds-background-200);
|
|
2235
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2236
|
+
position:relative;
|
|
2237
|
+
transition:border-color var(--duration-normal) var(--ease-in-out);
|
|
2238
|
+
}
|
|
2239
|
+
.fx-pricing-featured{border-color:var(--ds-gray-alpha-700)!important}
|
|
2240
|
+
.fx-pricing-badge{
|
|
2241
|
+
position:absolute;top:-12px;left:50%;transform:translateX(-50%);
|
|
2242
|
+
background:var(--ds-gray-1000);color:var(--ds-background-100);
|
|
2243
|
+
font-size:11px;font-weight:600;padding:3px 10px;
|
|
2244
|
+
border-radius:var(--radius-full);white-space:nowrap;letter-spacing:.04em;
|
|
2245
|
+
}
|
|
2246
|
+
.fx-pricing-name{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--ds-gray-700);margin-bottom:12px}
|
|
2247
|
+
.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}
|
|
2248
|
+
.fx-pricing-price-sm{font-size:28px}
|
|
2249
|
+
.fx-pricing-desc{font-size:13px;line-height:1.6;margin-bottom:24px;color:var(--ds-gray-900)}
|
|
2250
|
+
.fx-pricing-cta{
|
|
2251
|
+
display:block;text-align:center;height:36px;line-height:36px;
|
|
2252
|
+
border-radius:var(--radius-md);font-size:13px;font-weight:500;
|
|
2253
|
+
background:var(--ds-gray-1000);color:var(--ds-background-100);
|
|
2254
|
+
transition:opacity var(--duration-normal) var(--ease-in-out);
|
|
2255
|
+
}
|
|
2256
|
+
.fx-pricing-cta:hover{opacity:.85}
|
|
2257
|
+
|
|
2258
|
+
/* ═══════════════════════════════════════════
|
|
2259
|
+
FAQ — Geist collapse style
|
|
2260
|
+
═══════════════════════════════════════════ */
|
|
2261
|
+
.fx-faq-wrap{padding:0 40px 64px}
|
|
2262
|
+
.fx-faq{max-width:640px;margin:0 auto}
|
|
2263
|
+
.fx-faq-item{
|
|
2264
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
2265
|
+
cursor:pointer;
|
|
2266
|
+
}
|
|
2267
|
+
.fx-faq-item:first-child{border-top:1px solid var(--ds-gray-alpha-400)}
|
|
2268
|
+
.fx-faq-q{
|
|
2269
|
+
display:flex;justify-content:space-between;align-items:center;
|
|
2270
|
+
padding:16px 0;
|
|
2271
|
+
font-size:14px;font-weight:500;color:var(--ds-gray-1000);
|
|
2272
|
+
user-select:none;
|
|
2273
|
+
}
|
|
2274
|
+
.fx-faq-arrow{
|
|
2275
|
+
width:16px;height:16px;color:var(--ds-gray-700);flex-shrink:0;
|
|
2276
|
+
transition:transform var(--duration-normal) var(--ease-in-out);
|
|
2277
|
+
}
|
|
2278
|
+
.fx-faq-arrow::after{
|
|
2279
|
+
content:'↓';font-size:12px;display:block;text-align:center;line-height:16px;
|
|
2280
|
+
}
|
|
2281
|
+
.fx-faq-item.open .fx-faq-arrow{transform:rotate(180deg)}
|
|
2282
|
+
.fx-faq-a{
|
|
2283
|
+
max-height:0;overflow:hidden;
|
|
2284
|
+
font-size:14px;line-height:1.65;color:var(--ds-gray-900);
|
|
2285
|
+
transition:max-height var(--duration-slow) var(--ease-out),padding var(--duration-slow) var(--ease-out);
|
|
2286
|
+
padding:0;
|
|
2287
|
+
}
|
|
2288
|
+
.fx-faq-item.open .fx-faq-a{max-height:300px;padding:0 0 16px}
|
|
2289
|
+
|
|
2290
|
+
/* ═══════════════════════════════════════════
|
|
2291
|
+
CODE WINDOW — Geist snippet style
|
|
2292
|
+
═══════════════════════════════════════════ */
|
|
2293
|
+
.fx-code-window{
|
|
2294
|
+
border-radius:var(--radius-lg);overflow:hidden;
|
|
2295
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2296
|
+
background:var(--ds-background-200);
|
|
2297
|
+
margin:0 40px 24px;
|
|
2298
|
+
}
|
|
2299
|
+
.fx-code-bar{
|
|
2300
|
+
display:flex;align-items:center;gap:8px;
|
|
2301
|
+
padding:10px 16px;
|
|
2302
|
+
background:var(--ds-background-200);
|
|
2303
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
2304
|
+
}
|
|
2305
|
+
.fx-dots{display:flex;gap:5px}
|
|
2306
|
+
.fx-dots span{width:10px;height:10px;border-radius:50%}
|
|
2307
|
+
.fx-dots span:nth-child(1){background:#ff5f57}
|
|
2308
|
+
.fx-dots span:nth-child(2){background:#febc2e}
|
|
2309
|
+
.fx-dots span:nth-child(3){background:#28c840}
|
|
2310
|
+
.fx-code-lang{
|
|
2311
|
+
font-size:11px;letter-spacing:.06em;text-transform:uppercase;
|
|
2312
|
+
color:var(--ds-gray-700);margin-left:4px;font-family:var(--geist-mono);font-weight:500;
|
|
2313
|
+
}
|
|
2314
|
+
.fx-code-copy{
|
|
2315
|
+
margin-left:auto;height:24px;padding:0 8px;
|
|
2316
|
+
font-family:var(--geist-mono);font-size:11px;letter-spacing:.04em;
|
|
2317
|
+
background:var(--ds-gray-alpha-200);
|
|
2318
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2319
|
+
color:var(--ds-gray-900);border-radius:var(--radius-sm);cursor:pointer;
|
|
2320
|
+
transition:background var(--duration-normal),color var(--duration-normal);
|
|
2321
|
+
}
|
|
2322
|
+
.fx-code-copy:hover{background:var(--ds-gray-alpha-400);color:var(--ds-gray-1000)}
|
|
2323
|
+
.fx-code-body{padding:20px 24px;overflow-x:auto}
|
|
2324
|
+
.fx-code-line{font-family:var(--geist-mono);font-size:13px;line-height:1.75;color:var(--ds-gray-800);white-space:pre}
|
|
2325
|
+
.fx-kw{color:#c792ea}.fx-st{color:#a6e3a1}.fx-fn{color:#89b4fa}
|
|
2326
|
+
.fx-nb{color:#fab387}.fx-op{color:rgba(var(--aip-accent-rgb),1)}.fx-comment{color:var(--ds-gray-600);font-style:italic}
|
|
2327
|
+
|
|
2328
|
+
/* ═══════════════════════════════════════════
|
|
2329
|
+
INSTALL BLOCK
|
|
2330
|
+
═══════════════════════════════════════════ */
|
|
2331
|
+
.fx-install-wrap{
|
|
2332
|
+
border-radius:var(--radius-lg);overflow:hidden;
|
|
2333
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2334
|
+
background:var(--ds-background-200);
|
|
2335
|
+
margin:0 40px 24px;max-width:480px;
|
|
2336
|
+
}
|
|
2337
|
+
.fx-install-body{padding:20px 24px}
|
|
2338
|
+
.fx-install-line{display:flex;gap:10px;padding:3px 0;font-family:var(--geist-mono);font-size:13px;line-height:1.6}
|
|
2339
|
+
.fx-install-prompt{color:rgba(var(--aip-accent-rgb),1);flex-shrink:0;font-weight:700}
|
|
2340
|
+
.fx-install-cmd{color:var(--ds-gray-1000)}
|
|
2341
|
+
.fx-install-comment{font-family:var(--geist-mono);font-size:12px;color:var(--ds-gray-700);padding:3px 0;font-style:italic}
|
|
2342
|
+
|
|
2343
|
+
/* ═══════════════════════════════════════════
|
|
2344
|
+
BENCHMARK CARDS
|
|
2345
|
+
═══════════════════════════════════════════ */
|
|
2346
|
+
.fx-benchmark{
|
|
2347
|
+
display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
|
|
2348
|
+
gap:12px;padding:0 40px 64px;
|
|
2349
|
+
}
|
|
2350
|
+
.fx-bench-card{
|
|
2351
|
+
border-radius:var(--radius-lg);padding:24px;
|
|
2352
|
+
background:var(--ds-background-200);
|
|
2353
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2354
|
+
position:relative;overflow:hidden;
|
|
2355
|
+
transition:border-color var(--duration-normal) var(--ease-in-out);
|
|
2356
|
+
}
|
|
2357
|
+
.fx-bench-card:hover{border-color:var(--ds-gray-alpha-700)}
|
|
2358
|
+
/* Subtle top accent line */
|
|
2359
|
+
.fx-bench-card::after{
|
|
2360
|
+
content:'';position:absolute;top:0;left:0;right:0;height:1px;
|
|
2361
|
+
background:linear-gradient(90deg,transparent,rgba(var(--aip-accent-rgb),.6),transparent);
|
|
2362
|
+
}
|
|
2363
|
+
.fx-bench-label{
|
|
2364
|
+
font-size:11px;letter-spacing:.06em;text-transform:uppercase;
|
|
2365
|
+
color:var(--ds-gray-700);margin-bottom:10px;font-weight:600;
|
|
2366
|
+
}
|
|
2367
|
+
.fx-bench-num{
|
|
2368
|
+
font-size:clamp(24px,4vw,36px);font-weight:700;
|
|
2369
|
+
letter-spacing:-.04em;line-height:1;
|
|
2370
|
+
color:var(--ds-gray-1000);font-variant-numeric:tabular-nums;
|
|
2371
|
+
}
|
|
2372
|
+
.fx-bench-vs{font-size:12px;color:var(--ds-gray-700);margin-top:6px;font-family:var(--geist-mono)}
|
|
2373
|
+
.fx-bench-bar{margin-top:16px;height:3px;background:var(--ds-gray-alpha-200);border-radius:999px;overflow:hidden}
|
|
2374
|
+
.fx-bench-fill{height:100%;border-radius:999px;background:rgba(var(--aip-accent-rgb),1);transition:width 1.2s var(--ease-out)}
|
|
2375
|
+
|
|
2376
|
+
/* ═══════════════════════════════════════════
|
|
2377
|
+
MARQUEE — smooth infinite scroll
|
|
2378
|
+
═══════════════════════════════════════════ */
|
|
2379
|
+
.fx-marquee{
|
|
2380
|
+
overflow:hidden;padding:20px 0;
|
|
2381
|
+
border-top:1px solid var(--ds-gray-alpha-400);
|
|
2382
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
2383
|
+
-webkit-mask:linear-gradient(90deg,transparent,black 10%,black 90%,transparent);
|
|
2384
|
+
mask:linear-gradient(90deg,transparent,black 10%,black 90%,transparent);
|
|
2385
|
+
}
|
|
2386
|
+
.fx-marquee-track{display:flex;width:max-content;animation:fx-marquee 30s linear infinite}
|
|
1867
2387
|
.fx-marquee:hover .fx-marquee-track{animation-play-state:paused}
|
|
1868
2388
|
@keyframes fx-marquee{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
|
|
1869
|
-
.fx-marquee-item{
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
.fx-
|
|
1876
|
-
.fx-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
.fx-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
.fx-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
.fx-
|
|
1897
|
-
.fx-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
.fx-
|
|
1903
|
-
|
|
2389
|
+
.fx-marquee-item{
|
|
2390
|
+
font-size:13px;font-weight:500;
|
|
2391
|
+
color:var(--ds-gray-700);
|
|
2392
|
+
white-space:nowrap;padding:0 24px;
|
|
2393
|
+
transition:color var(--duration-normal);
|
|
2394
|
+
}
|
|
2395
|
+
.fx-marquee-item:hover{color:var(--ds-gray-1000)}
|
|
2396
|
+
.fx-marquee-sep{color:var(--ds-gray-alpha-400)}
|
|
2397
|
+
|
|
2398
|
+
/* ═══════════════════════════════════════════
|
|
2399
|
+
CTA SECTION
|
|
2400
|
+
═══════════════════════════════════════════ */
|
|
2401
|
+
.fx-cta-section{
|
|
2402
|
+
position:relative;padding:120px 40px;text-align:center;overflow:hidden;
|
|
2403
|
+
border-top:1px solid var(--ds-gray-alpha-400);
|
|
2404
|
+
}
|
|
2405
|
+
.fx-cta-glow{
|
|
2406
|
+
position:absolute;
|
|
2407
|
+
width:700px;height:350px;border-radius:50%;
|
|
2408
|
+
background:radial-gradient(ellipse,rgba(var(--aip-accent-rgb),.06),transparent 60%);
|
|
2409
|
+
left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;
|
|
2410
|
+
}
|
|
2411
|
+
.fx-cta-inner{position:relative;z-index:1;max-width:560px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:24px}
|
|
2412
|
+
.fx-cta-title{
|
|
2413
|
+
font-size:clamp(28px,4vw,48px);font-weight:700;
|
|
2414
|
+
letter-spacing:-.04em;line-height:1.1;color:var(--ds-gray-1000);
|
|
2415
|
+
}
|
|
2416
|
+
.fx-cta-sub{font-size:15px;line-height:1.65;color:var(--ds-gray-900);max-width:440px}
|
|
2417
|
+
.fx-cta-actions{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
|
|
2418
|
+
|
|
2419
|
+
/* ═══════════════════════════════════════════
|
|
2420
|
+
STEPS — numbered with connector
|
|
2421
|
+
═══════════════════════════════════════════ */
|
|
2422
|
+
.fx-steps{
|
|
2423
|
+
display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
|
|
2424
|
+
gap:40px;padding:16px 40px 80px;position:relative;
|
|
2425
|
+
}
|
|
2426
|
+
.fx-steps::before{
|
|
2427
|
+
content:'';position:absolute;top:36px;
|
|
2428
|
+
left:calc(40px + 20px);right:calc(40px + 20px);
|
|
2429
|
+
height:1px;background:var(--ds-gray-alpha-400);pointer-events:none;
|
|
2430
|
+
}
|
|
2431
|
+
@media(max-width:640px){.fx-steps::before{display:none}.fx-steps{gap:32px;padding:0 24px 48px}}
|
|
2432
|
+
.fx-step{display:flex;flex-direction:column;align-items:flex-start;gap:16px}
|
|
2433
|
+
.fx-step-num{
|
|
2434
|
+
width:36px;height:36px;border-radius:50%;
|
|
2435
|
+
background:var(--ds-gray-alpha-200);
|
|
2436
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2437
|
+
color:var(--ds-gray-1000);
|
|
2438
|
+
font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;
|
|
2439
|
+
display:flex;align-items:center;justify-content:center;
|
|
2440
|
+
flex-shrink:0;position:relative;z-index:1;
|
|
2441
|
+
}
|
|
2442
|
+
.fx-step-title{font-size:14px;font-weight:600;letter-spacing:-.015em;color:var(--ds-gray-1000)}
|
|
2443
|
+
.fx-step-desc{font-size:13px;line-height:1.6;color:var(--ds-gray-900)}
|
|
2444
|
+
|
|
2445
|
+
/* ═══════════════════════════════════════════
|
|
2446
|
+
COMPARE — visual feature table
|
|
2447
|
+
═══════════════════════════════════════════ */
|
|
2448
|
+
.fx-compare{
|
|
2449
|
+
max-width:560px;margin:0 auto 64px;padding:0 40px;
|
|
2450
|
+
border-radius:var(--radius-xl);overflow:hidden;
|
|
2451
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2452
|
+
}
|
|
2453
|
+
.fx-compare-header{
|
|
2454
|
+
display:grid;grid-template-columns:1fr 1fr 1fr;
|
|
2455
|
+
padding:12px 16px;
|
|
2456
|
+
background:var(--ds-background-200);
|
|
2457
|
+
font-size:11px;font-weight:700;text-transform:uppercase;
|
|
2458
|
+
letter-spacing:.08em;color:var(--ds-gray-700);
|
|
2459
|
+
border-bottom:1px solid var(--ds-gray-alpha-400);
|
|
2460
|
+
}
|
|
2461
|
+
.fx-compare-row{
|
|
2462
|
+
display:grid;grid-template-columns:1fr 1fr 1fr;
|
|
2463
|
+
padding:12px 16px;border-bottom:1px solid var(--ds-gray-alpha-200);
|
|
2464
|
+
transition:background var(--duration-fast);
|
|
2465
|
+
}
|
|
2466
|
+
.fx-compare-row:last-child{border-bottom:none}
|
|
2467
|
+
.fx-compare-row:hover{background:var(--ds-gray-alpha-100)}
|
|
2468
|
+
.fx-compare-feature{font-size:13px;color:var(--ds-gray-900)}
|
|
2469
|
+
.fx-compare-col-a{text-align:center;font-size:14px;font-weight:600;color:var(--ds-green-700)}
|
|
2470
|
+
.fx-compare-col-b{text-align:center;font-size:14px;color:var(--ds-gray-600)}
|
|
2471
|
+
|
|
2472
|
+
/* ═══════════════════════════════════════════
|
|
2473
|
+
VIDEO
|
|
2474
|
+
═══════════════════════════════════════════ */
|
|
2475
|
+
.fx-video-wrap{padding:0 40px 48px}
|
|
2476
|
+
.fx-video-yt{
|
|
2477
|
+
position:relative;padding-bottom:56.25%;height:0;overflow:hidden;
|
|
2478
|
+
border-radius:var(--radius-xl);border:1px solid var(--ds-gray-alpha-400);
|
|
2479
|
+
background:var(--ds-background-200);
|
|
2480
|
+
}
|
|
1904
2481
|
.fx-video-yt iframe{position:absolute;top:0;left:0;width:100%;height:100%}
|
|
1905
|
-
.fx-video{width:100%;border-radius:
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
.fx-
|
|
1911
|
-
.fx-
|
|
1912
|
-
.fx-
|
|
1913
|
-
.fx-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
.fx-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
/*
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
.fx-
|
|
1928
|
-
.fx-
|
|
1929
|
-
.fx-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
.fx-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
.fx-
|
|
1939
|
-
.fx-
|
|
1940
|
-
.fx-badge-
|
|
1941
|
-
.fx-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
2482
|
+
.fx-video{width:100%;border-radius:var(--radius-xl);border:1px solid var(--ds-gray-alpha-400)}
|
|
2483
|
+
|
|
2484
|
+
/* ═══════════════════════════════════════════
|
|
2485
|
+
TESTIMONIAL
|
|
2486
|
+
═══════════════════════════════════════════ */
|
|
2487
|
+
.fx-testi-wrap{padding:80px 40px;display:flex;justify-content:center}
|
|
2488
|
+
.fx-testi{max-width:560px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:20px}
|
|
2489
|
+
.fx-testi-img,.fx-testi-avatar{width:48px;height:48px;border-radius:50%;object-fit:cover}
|
|
2490
|
+
.fx-testi-avatar{
|
|
2491
|
+
display:flex;align-items:center;justify-content:center;
|
|
2492
|
+
font-size:18px;font-weight:700;
|
|
2493
|
+
background:var(--ds-background-200);
|
|
2494
|
+
border:1px solid var(--ds-gray-alpha-400);
|
|
2495
|
+
color:var(--ds-gray-1000);
|
|
2496
|
+
}
|
|
2497
|
+
.fx-testi-quote{font-size:18px;line-height:1.65;color:var(--ds-gray-900);letter-spacing:-.01em}
|
|
2498
|
+
.fx-testi-author{font-size:13px;font-weight:500;color:var(--ds-gray-700)}
|
|
2499
|
+
|
|
2500
|
+
/* ═══════════════════════════════════════════
|
|
2501
|
+
GALLERY
|
|
2502
|
+
═══════════════════════════════════════════ */
|
|
2503
|
+
.fx-gallery{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;padding:16px 40px 64px}
|
|
2504
|
+
.fx-gallery-item{border-radius:var(--radius-lg);overflow:hidden;aspect-ratio:4/3;border:1px solid var(--ds-gray-alpha-400)}
|
|
2505
|
+
.fx-gallery-item img{width:100%;height:100%;object-fit:cover;transition:transform var(--duration-slow) var(--ease-out)}
|
|
2506
|
+
.fx-gallery-item:hover img{transform:scale(1.03)}
|
|
2507
|
+
|
|
2508
|
+
/* ═══════════════════════════════════════════
|
|
2509
|
+
MISC COMPONENTS
|
|
2510
|
+
═══════════════════════════════════════════ */
|
|
2511
|
+
.fx-divider{
|
|
2512
|
+
display:flex;align-items:center;gap:12px;
|
|
2513
|
+
padding:12px 40px;color:var(--ds-gray-700);font-size:12px;font-weight:500;
|
|
2514
|
+
}
|
|
2515
|
+
.fx-divider::before,.fx-divider::after{content:'';flex:1;height:1px;background:var(--ds-gray-alpha-400)}
|
|
2516
|
+
.fx-hr{border:none;height:1px;background:var(--ds-gray-alpha-400);margin:0 40px}
|
|
2517
|
+
.fx-badge-row{padding:6px 40px}
|
|
2518
|
+
.fx-badge-tag{
|
|
2519
|
+
font-size:11px;font-weight:600;padding:3px 8px;border-radius:var(--radius-full);
|
|
2520
|
+
background:rgba(var(--aip-accent-rgb),.08);color:rgba(var(--aip-accent-rgb),1);
|
|
2521
|
+
border:1px solid rgba(var(--aip-accent-rgb),.2);letter-spacing:.03em;
|
|
2522
|
+
}
|
|
2523
|
+
.fx-spacer{flex-shrink:0}
|
|
2524
|
+
.fx-html{padding:0 40px}
|
|
2525
|
+
.fx-cols{display:grid;gap:24px;padding:16px 40px 48px}
|
|
1946
2526
|
.fx-col{min-width:0}
|
|
1947
|
-
.fx-
|
|
1948
|
-
.fx-
|
|
1949
|
-
.fx-
|
|
1950
|
-
.fx-
|
|
1951
|
-
.fx-
|
|
1952
|
-
.fx-
|
|
1953
|
-
.fx-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
.fx-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
.fx-
|
|
1963
|
-
.fx-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
2527
|
+
.fx-chart-container{padding:0 40px 48px}
|
|
2528
|
+
.fx-select-wrap{padding:6px 40px}
|
|
2529
|
+
.fx-select-block{width:auto;min-width:180px;height:36px;margin-top:0}
|
|
2530
|
+
.fx-each{padding:0 40px 24px}
|
|
2531
|
+
.fx-each-empty{padding:48px;text-align:center;color:var(--ds-gray-700);font-size:13px}
|
|
2532
|
+
.fx-if-wrap{display:contents}
|
|
2533
|
+
.fx-editor-wrap{padding:0 40px 24px}
|
|
2534
|
+
|
|
2535
|
+
/* ═══════════════════════════════════════════
|
|
2536
|
+
SCROLL ANIMATIONS — GPU only per Vercel guidelines
|
|
2537
|
+
═══════════════════════════════════════════ */
|
|
2538
|
+
.fx-animate{
|
|
2539
|
+
opacity:0;transform:translateY(12px);
|
|
2540
|
+
transition:opacity .5s var(--ease-out),transform .5s var(--ease-out);
|
|
2541
|
+
}
|
|
2542
|
+
.fx-animate.fx-visible{opacity:1;transform:none}
|
|
2543
|
+
.fx-animate-stagger>*{
|
|
2544
|
+
opacity:0;transform:translateY(8px);
|
|
2545
|
+
transition:opacity .45s var(--ease-out),transform .45s var(--ease-out);
|
|
2546
|
+
}
|
|
2547
|
+
.fx-animate-stagger.fx-visible>*:nth-child(1){opacity:1;transform:none;transition-delay:.04s}
|
|
2548
|
+
.fx-animate-stagger.fx-visible>*:nth-child(2){opacity:1;transform:none;transition-delay:.1s}
|
|
2549
|
+
.fx-animate-stagger.fx-visible>*:nth-child(3){opacity:1;transform:none;transition-delay:.16s}
|
|
2550
|
+
.fx-animate-stagger.fx-visible>*:nth-child(4){opacity:1;transform:none;transition-delay:.22s}
|
|
2551
|
+
.fx-animate-stagger.fx-visible>*:nth-child(5){opacity:1;transform:none;transition-delay:.28s}
|
|
2552
|
+
.fx-animate-stagger.fx-visible>*:nth-child(6){opacity:1;transform:none;transition-delay:.34s}
|
|
2553
|
+
|
|
2554
|
+
/* Counter + year */
|
|
2555
|
+
.fx-count,.fx-year{font-variant-numeric:tabular-nums;display:inline-block}
|
|
2556
|
+
|
|
2557
|
+
/* ═══════════════════════════════════════════
|
|
2558
|
+
FOOTER — Geist footer style
|
|
2559
|
+
═══════════════════════════════════════════ */
|
|
2560
|
+
.fx-footer{padding:32px 40px;border-top:1px solid var(--ds-gray-alpha-400)}
|
|
2561
|
+
.fx-footer-inner{
|
|
2562
|
+
max-width:1200px;margin:0 auto;
|
|
2563
|
+
display:flex;justify-content:space-between;align-items:center;
|
|
2564
|
+
flex-wrap:wrap;gap:16px;
|
|
2565
|
+
}
|
|
2566
|
+
.fx-footer-brand{font-size:13px;font-weight:600;letter-spacing:-.02em;color:var(--ds-gray-1000)}
|
|
2567
|
+
.fx-footer-links{display:flex;gap:24px;flex-wrap:wrap}
|
|
2568
|
+
.fx-footer-link{font-size:13px;color:var(--ds-gray-700);transition:color var(--duration-normal)}
|
|
2569
|
+
.fx-footer-link:hover{color:var(--ds-gray-1000)}
|
|
2570
|
+
.fx-footer-note{font-size:12px;color:var(--ds-gray-600);font-family:var(--geist-mono)}
|
|
2571
|
+
.fx-footer-text{font-size:13px;color:var(--ds-gray-700)}
|
|
2572
|
+
@media(max-width:640px){.fx-footer{padding:24px}.fx-footer-inner{flex-direction:column;align-items:flex-start;gap:12px}}
|
|
2573
|
+
`
|
|
2574
|
+
|
|
2575
|
+
// ════════════════════════════════════════════════════════════════
|
|
2576
|
+
// GEIST COLOR TOKENS — Semantic scale, light + dark
|
|
2577
|
+
// Based on vercel.com/geist/colors
|
|
2578
|
+
// Backgrounds → Surfaces → Borders → Text
|
|
2579
|
+
// ════════════════════════════════════════════════════════════════
|
|
2580
|
+
const T = {
|
|
2581
|
+
dark: `
|
|
2582
|
+
:root {
|
|
2583
|
+
/* Backgrounds */
|
|
2584
|
+
--ds-background-100:#000000;
|
|
2585
|
+
--ds-background-100-rgb:0,0,0;
|
|
2586
|
+
--ds-background-200:#0a0a0a;
|
|
2587
|
+
|
|
2588
|
+
/* Gray scale (Geist) */
|
|
2589
|
+
--ds-gray-100:#0a0a0a;
|
|
2590
|
+
--ds-gray-200:#111111;
|
|
2591
|
+
--ds-gray-300:#1a1a1a;
|
|
2592
|
+
--ds-gray-400:#222222;
|
|
2593
|
+
--ds-gray-500:#2a2a2a;
|
|
2594
|
+
--ds-gray-600:#666666;
|
|
2595
|
+
--ds-gray-700:#888888;
|
|
2596
|
+
--ds-gray-800:#999999;
|
|
2597
|
+
--ds-gray-900:#aaaaaa;
|
|
2598
|
+
--ds-gray-1000:#ededed;
|
|
2599
|
+
|
|
2600
|
+
/* Gray alpha */
|
|
2601
|
+
--ds-gray-alpha-100:rgba(255,255,255,.04);
|
|
2602
|
+
--ds-gray-alpha-200:rgba(255,255,255,.07);
|
|
2603
|
+
--ds-gray-alpha-400:rgba(255,255,255,.12);
|
|
2604
|
+
--ds-gray-alpha-700:rgba(255,255,255,.24);
|
|
2605
|
+
|
|
2606
|
+
/* Accent colors */
|
|
2607
|
+
--ds-blue-100:rgba(0,112,243,.08);
|
|
2608
|
+
--ds-blue-200:rgba(0,112,243,.15);
|
|
2609
|
+
--ds-blue-700:#0070f3;
|
|
2610
|
+
--ds-blue-rgb:0,112,243;
|
|
2611
|
+
--ds-red-100:rgba(255,0,0,.08);
|
|
2612
|
+
--ds-red-200:rgba(255,0,0,.15);
|
|
2613
|
+
--ds-red-700:#ff0000;
|
|
2614
|
+
--ds-green-100:rgba(0,188,112,.08);
|
|
2615
|
+
--ds-green-700:#00bc70;
|
|
2616
|
+
}`,
|
|
2617
|
+
light: `
|
|
2618
|
+
:root {
|
|
2619
|
+
--ds-background-100:#ffffff;
|
|
2620
|
+
--ds-background-100-rgb:255,255,255;
|
|
2621
|
+
--ds-background-200:#fafafa;
|
|
2622
|
+
|
|
2623
|
+
--ds-gray-100:#fafafa;
|
|
2624
|
+
--ds-gray-200:#f5f5f5;
|
|
2625
|
+
--ds-gray-300:#ebebeb;
|
|
2626
|
+
--ds-gray-400:#e6e6e6;
|
|
2627
|
+
--ds-gray-500:#e0e0e0;
|
|
2628
|
+
--ds-gray-600:#888888;
|
|
2629
|
+
--ds-gray-700:#666666;
|
|
2630
|
+
--ds-gray-800:#444444;
|
|
2631
|
+
--ds-gray-900:#333333;
|
|
2632
|
+
--ds-gray-1000:#111111;
|
|
2633
|
+
|
|
2634
|
+
--ds-gray-alpha-100:rgba(0,0,0,.04);
|
|
2635
|
+
--ds-gray-alpha-200:rgba(0,0,0,.07);
|
|
2636
|
+
--ds-gray-alpha-400:rgba(0,0,0,.12);
|
|
2637
|
+
--ds-gray-alpha-700:rgba(0,0,0,.24);
|
|
2638
|
+
|
|
2639
|
+
--ds-blue-100:rgba(0,112,243,.06);
|
|
2640
|
+
--ds-blue-200:rgba(0,112,243,.12);
|
|
2641
|
+
--ds-blue-700:#0070f3;
|
|
2642
|
+
--ds-blue-rgb:0,112,243;
|
|
2643
|
+
--ds-red-100:rgba(255,0,0,.06);
|
|
2644
|
+
--ds-red-200:rgba(255,0,0,.12);
|
|
2645
|
+
--ds-red-700:#c00;
|
|
2646
|
+
--ds-green-100:rgba(0,188,112,.06);
|
|
2647
|
+
--ds-green-700:#007a45;
|
|
2648
|
+
}`,
|
|
2649
|
+
}
|
|
2650
|
+
return base + (T[theme] || T.dark)
|
|
1972
2651
|
}
|
|
2652
|
+
|
|
2653
|
+
|
package/package.json
CHANGED
package/server/server.js
CHANGED
|
@@ -2432,7 +2432,7 @@ async function startServer(aipFile, port = 3000) {
|
|
|
2432
2432
|
})
|
|
2433
2433
|
|
|
2434
2434
|
srv.addRoute('GET', '/health', (req, res) => res.json(200, {
|
|
2435
|
-
status:'ok', version:'2.11.
|
|
2435
|
+
status:'ok', version:'2.11.9',
|
|
2436
2436
|
models: app.models.map(m=>m.name),
|
|
2437
2437
|
routes: app.apis.length, pages: app.pages.length,
|
|
2438
2438
|
admin: app.admin?.prefix || null,
|