@tokenoftrust/storefront-runner 2.0.41 → 2.0.42
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/apps/storefront/integrations/lifecycle-host-asset.mjs +20 -6
- package/apps/storefront/package.json +1 -0
- package/apps/storefront/platform-reconcile-tenants.json +3 -0
- package/apps/storefront/public/favicon.ico +0 -0
- package/apps/storefront/public/shared/commerce-chrome.css +147 -16
- package/apps/storefront/src/components/AsyncStylesheet.astro +26 -0
- package/apps/storefront/src/components/Breadcrumbs.astro +8 -1
- package/apps/storefront/src/components/Img.astro +6 -5
- package/apps/storefront/src/components/ProductCard.astro +6 -4
- package/apps/storefront/src/components/Seo.astro +2 -1
- package/apps/storefront/src/components/chrome/SiteFooter.astro +45 -11
- package/apps/storefront/src/components/chrome/SiteHeader.astro +83 -13
- package/apps/storefront/src/components/commerce/RatingStars.astro +1 -1
- package/apps/storefront/src/components/compliance/ComplianceNotice.astro +2 -2
- package/apps/storefront/src/components/content/PromoTiles.astro +107 -0
- package/apps/storefront/src/components/content/TrustStrip.astro +30 -14
- package/apps/storefront/src/components/home/Hero.astro +156 -4
- package/apps/storefront/src/components/islands/AgeGate.tsx +135 -26
- package/apps/storefront/src/components/islands/ImageGallery.tsx +6 -9
- package/apps/storefront/src/components/islands/IsolatedAgeGate.tsx +194 -46
- package/apps/storefront/src/components/islands/SearchTypeahead.tsx +10 -4
- package/apps/storefront/src/components/marketing/Faq.astro +9 -2
- package/apps/storefront/src/config/devTenantSeed.ts +1 -1
- package/apps/storefront/src/config/kvTenantResolver.ts +7 -1
- package/apps/storefront/src/config/publicationSpaceConfig.ts +12 -1
- package/apps/storefront/src/config/publicationSpaceRegistry.ts +5 -0
- package/apps/storefront/src/config/tenants.ts +22 -0
- package/apps/storefront/src/layouts/Layout.astro +69 -44
- package/apps/storefront/src/lib/activity/changeActorAttribution.ts +24 -8
- package/apps/storefront/src/lib/activity/recordActivity.ts +15 -0
- package/apps/storefront/src/lib/asyncCss.ts +23 -0
- package/apps/storefront/src/lib/auth/loginGate.ts +22 -11
- package/apps/storefront/src/lib/basePath.ts +70 -9
- package/apps/storefront/src/lib/chrome/managedCart.ts +50 -0
- package/apps/storefront/src/lib/chrome/model.ts +4 -0
- package/apps/storefront/src/lib/chrome/newsletterAgeAttestation.ts +9 -0
- package/apps/storefront/src/lib/content/trustStrip.ts +38 -3
- package/apps/storefront/src/lib/cspStaticHashes.ts +4 -1
- package/apps/storefront/src/lib/diag/capture.ts +161 -0
- package/apps/storefront/src/lib/diag/consoleLine.ts +76 -0
- package/apps/storefront/src/lib/diag/debugConsole.ts +118 -0
- package/apps/storefront/src/lib/diag/debugMode.ts +163 -0
- package/apps/storefront/src/lib/diag/debugWindow.ts +111 -0
- package/apps/storefront/src/lib/diag/reference.ts +148 -0
- package/apps/storefront/src/lib/diag/referenceStore.ts +113 -0
- package/apps/storefront/src/lib/diag/report.ts +109 -0
- package/apps/storefront/src/lib/diag/session.ts +93 -0
- package/apps/storefront/src/lib/featuredProductsPresentation.ts +5 -0
- package/apps/storefront/src/lib/heroSlideshow.ts +41 -0
- package/apps/storefront/src/lib/homeVisualParity.ts +107 -0
- package/apps/storefront/src/lib/imageAttrs.ts +9 -6
- package/apps/storefront/src/lib/integration/nonceStamp.ts +23 -1
- package/apps/storefront/src/lib/integration/renderIntegrationState.ts +36 -0
- package/apps/storefront/src/lib/integration/tenantAnalyticsDeclarations.ts +17 -12
- package/apps/storefront/src/lib/jsonScript.ts +13 -0
- package/apps/storefront/src/lib/pinnedRouteRewriteBoundary.ts +31 -0
- package/apps/storefront/src/lib/previewReload.ts +53 -9
- package/apps/storefront/src/lib/rawChrome.ts +148 -19
- package/apps/storefront/src/lib/rawMarketingHtml.ts +120 -7
- package/apps/storefront/src/lib/storyblok/content-model.ts +46 -3
- package/apps/storefront/src/lib/styleGuideThemes.ts +107 -0
- package/apps/storefront/src/lib/tenantRouting.ts +15 -4
- package/apps/storefront/src/lib/tot/syncState.ts +21 -0
- package/apps/storefront/src/lib/tracking/publishSafetyNet.ts +29 -3
- package/apps/storefront/src/middleware/controlPlane.ts +9 -5
- package/apps/storefront/src/middleware/index.ts +13 -1
- package/apps/storefront/src/middleware/renderChain.ts +54 -11
- package/apps/storefront/src/middleware/routeBranch.ts +58 -12
- package/apps/storefront/src/middleware/staticBundle.ts +37 -3
- package/apps/storefront/src/pages/[...slug].astro +6 -2
- package/apps/storefront/src/pages/api/request-access.ts +5 -4
- package/apps/storefront/src/pages/blog/[slug].astro +11 -1
- package/apps/storefront/src/pages/cart.ts +23 -0
- package/apps/storefront/src/pages/index.astro +64 -85
- package/apps/storefront/src/pages/products/[handle].astro +8 -6
- package/apps/storefront/src/pages/sitemap.xml.ts +8 -2
- package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +14 -25
- package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +10 -17
- package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +9 -16
- package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +9 -15
- package/apps/storefront/src/pages/the-build/[slug].astro +7 -1
- package/apps/storefront/src/styles/fonts.css +7 -0
- package/apps/storefront/src/styles/global.css +397 -3
- package/package.json +4 -1
- package/packages/cli/src/visual-parity.mjs +321 -0
- package/packages/public-runtime/package.json +2 -0
- package/packages/public-runtime/schemas/publication-space/v1/manifest.schema.json +1 -1
- package/packages/public-runtime/schemas/publication-space/v1/normalized-mount.schema.json +1 -1
- package/packages/public-runtime/src/chrome.ts +44 -7
- package/packages/public-runtime/src/csp.ts +12 -1
- package/packages/public-runtime/src/extension-contract-values.d.mts +19 -0
- package/packages/public-runtime/src/extension-contract-values.mjs +62 -0
- package/packages/public-runtime/src/extension-contract.ts +20 -6
- package/packages/public-runtime/src/index.ts +8 -0
- package/packages/public-runtime/src/integration/consent-broker.ts +10 -7
- package/packages/public-runtime/src/integration/consent-config.ts +9 -0
- package/packages/public-runtime/src/integration/contact-sales-action-source.ts +56 -10
- package/packages/public-runtime/src/integration/governed-event-properties.ts +62 -0
- package/packages/public-runtime/src/integration/index.ts +1 -0
- package/packages/public-runtime/src/integration/lifecycle-boot.ts +30 -2
- package/packages/public-runtime/src/integration/lifecycle-host-asset.d.mts +2 -0
- package/packages/public-runtime/src/integration/lifecycle-host-asset.mjs +17 -3
- package/packages/public-runtime/src/integration/native-amplitude.ts +12 -3
- package/packages/public-runtime/src/integration/native-ga4-sandbox-asset.mjs +9 -0
- package/packages/public-runtime/src/integration/native-ga4-sandbox-entry.ts +27 -3
- package/packages/public-runtime/src/integration/native-ga4-sandbox.ts +13 -0
- package/packages/public-runtime/src/integration/native-ga4.ts +11 -0
- package/packages/public-runtime/src/integration/platform-adapters.ts +5 -1
- package/packages/public-runtime/src/integration/render-phases.ts +28 -2
- package/packages/public-runtime/src/publication-redirects.d.mts +45 -0
- package/packages/public-runtime/src/publication-redirects.mjs +379 -0
- package/packages/public-runtime/src/publication-space.ts +24 -3
- package/packages/public-runtime/src/static-bundle.ts +145 -26
- package/packages/public-runtime/src/tenant-embed-defaults.d.mts +3 -0
- package/packages/public-runtime/src/tenant-embed-defaults.mjs +40 -0
- package/packages/public-runtime/src/tenant.ts +59 -1
- package/pnpm-lock.runner.yaml +12 -0
- package/pnpm-workspace.yaml +4 -0
- package/scripts/dev/git-status.mjs +1 -1
- package/scripts/dev/publish.mjs +6 -0
- package/scripts/lib/tenant-asset-copy.mjs +4 -2
- package/scripts/tenant/materialize-tenant-content.mjs +1 -0
- package/scripts/tenant/validate.mjs +171 -8
- package/apps/storefront/src/lib/cfImage.ts +0 -55
- package/apps/storefront/src/workers/pruneRollupWorker.ts +0 -120
- package/tenants/home/public/fonts/inter-latin-400-normal.woff2 +0 -0
- package/tenants/home/public/fonts/inter-latin-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/inter-latin-600-normal.woff2 +0 -0
- package/tenants/home/public/fonts/inter-latin-ext-400-normal.woff2 +0 -0
- package/tenants/home/public/fonts/inter-latin-ext-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/inter-latin-ext-600-normal.woff2 +0 -0
- package/tenants/home/public/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/tenants/home/public/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/jetbrains-mono-latin-ext-400-normal.woff2 +0 -0
- package/tenants/home/public/fonts/jetbrains-mono-latin-ext-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-600-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-700-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-800-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-500-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-600-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-700-normal.woff2 +0 -0
- package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-800-normal.woff2 +0 -0
- package/tenants/home/public/js/storefront.js +0 -129
- package/tenants/home/public/logo-wordmark.png +0 -0
- package/tenants/home/public/pages/storefront.css +0 -235
- package/tenants/home/theme.json +0 -6
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
/* Self-hosted web fonts (audit finding 6) — replaces the render-blocking
|
|
2
|
-
third-party Google Fonts stylesheet formerly linked in content/home.html.
|
|
3
|
-
woff2 vendored under /tenants/home/fonts/ (from @fontsource, latin +
|
|
4
|
-
latin-ext subsets); font-display: swap preserved. Same-origin => CSP 'self'. */
|
|
5
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-ext-500-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
6
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
7
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:600;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-ext-600-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
8
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:600;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-600-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
9
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:700;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-ext-700-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
10
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:700;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-700-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
11
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:800;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-ext-800-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
12
|
-
@font-face{font-family:'Plus Jakarta Sans';font-style:normal;font-display:swap;font-weight:800;src:url(/tenants/home/fonts/plus-jakarta-sans-latin-800-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
13
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:400;src:url(/tenants/home/fonts/inter-latin-ext-400-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
14
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:400;src:url(/tenants/home/fonts/inter-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
15
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/inter-latin-ext-500-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
16
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/inter-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
17
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:600;src:url(/tenants/home/fonts/inter-latin-ext-600-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
18
|
-
@font-face{font-family:'Inter';font-style:normal;font-display:swap;font-weight:600;src:url(/tenants/home/fonts/inter-latin-600-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
19
|
-
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:400;src:url(/tenants/home/fonts/jetbrains-mono-latin-ext-400-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
20
|
-
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:400;src:url(/tenants/home/fonts/jetbrains-mono-latin-400-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
21
|
-
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/jetbrains-mono-latin-ext-500-normal.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;}
|
|
22
|
-
@font-face{font-family:'JetBrains Mono';font-style:normal;font-display:swap;font-weight:500;src:url(/tenants/home/fonts/jetbrains-mono-latin-500-normal.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
|
|
23
|
-
|
|
24
|
-
/* Storefront by Token of Trust — early-access landing page.
|
|
25
|
-
* Ported from the approved prototype; served at /tenants/home/pages/storefront.css
|
|
26
|
-
* (mirrored from tenants/home/public/ by scripts/build/copy-tenant-assets.mjs).
|
|
27
|
-
* Sub-brand: Storefront lockup + teal→blue gradient on the tokenoftrust.com light theme. */
|
|
28
|
-
:root{
|
|
29
|
-
--navy:#10294b; --navy-2:#173763; --ink:#1b2a40; --muted:#4d5a70;
|
|
30
|
-
--cream:#faf8f4; --card:#fff; --line:#e6e2d9; --line-cool:#dfe6ee;
|
|
31
|
-
--teal:#0d9391; --teal-ink:#0b6360; --coral:#bf3d2c; --green:#1d9e5f; --gold:#8a6012;
|
|
32
|
-
--grad:linear-gradient(115deg,#0d9391,#3b82c4);
|
|
33
|
-
--r:20px; --r-sm:13px; --shadow:0 18px 50px rgba(16,41,75,.13); --shadow-soft:0 8px 24px rgba(27,42,64,.07);
|
|
34
|
-
--sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
|
|
35
|
-
--display:"Plus Jakarta Sans",var(--sans); --mono:"JetBrains Mono",ui-monospace,Menlo,monospace;
|
|
36
|
-
}
|
|
37
|
-
*{box-sizing:border-box;margin:0;padding:0}
|
|
38
|
-
body{font-family:var(--sans);background:var(--cream);color:var(--ink);line-height:1.6;-webkit-font-smoothing:antialiased}
|
|
39
|
-
.wrap{max-width:1200px;margin:0 auto;padding:0 40px}
|
|
40
|
-
a{color:inherit;text-decoration:none}
|
|
41
|
-
h1,h2,h3{font-family:var(--display);letter-spacing:-.02em;color:var(--navy)}
|
|
42
|
-
.grad{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
|
43
|
-
.btn{display:inline-flex;align-items:center;gap:9px;font-family:var(--display);font-weight:700;font-size:.94rem;
|
|
44
|
-
padding:12px 22px;border-radius:12px;border:0;cursor:pointer;transition:transform .15s,box-shadow .15s;color:inherit}
|
|
45
|
-
.btn:hover{transform:translateY(-2px)}
|
|
46
|
-
.btn-grad{background:var(--grad);color:#fff;box-shadow:0 10px 24px rgba(13,147,145,.32)}
|
|
47
|
-
.btn-grad:hover{box-shadow:0 14px 30px rgba(13,147,145,.4)}
|
|
48
|
-
.btn-line{background:#fff;color:var(--navy);border:1.5px solid var(--line-cool)}
|
|
49
|
-
.btn-line:hover{border-color:var(--navy)}
|
|
50
|
-
.arrow{transition:transform .2s}
|
|
51
|
-
.btn:hover .arrow{transform:translateX(3px)}
|
|
52
|
-
.kicker{font-size:.8rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--teal-ink)}
|
|
53
|
-
|
|
54
|
-
/* header */
|
|
55
|
-
header{position:sticky;top:0;z-index:50;border-bottom:1px solid var(--line);background:rgba(250,248,244,.85);backdrop-filter:blur(12px)}
|
|
56
|
-
.nav{display:flex;align-items:center;justify-content:space-between;height:76px}
|
|
57
|
-
.lockup{display:flex;align-items:center;gap:12px}
|
|
58
|
-
.lockup img{height:30px;display:block}
|
|
59
|
-
.lockup .div{width:1px;height:22px;background:var(--line-cool)}
|
|
60
|
-
.lockup .prod{font-family:var(--display);font-weight:600;font-size:.95rem;letter-spacing:-.01em}
|
|
61
|
-
.nav-links{display:flex;gap:28px}
|
|
62
|
-
.nav-links a{font-size:.92rem;font-weight:500;color:var(--muted)}
|
|
63
|
-
.nav-links a:hover{color:var(--navy)}
|
|
64
|
-
.nav-right{display:flex;align-items:center;gap:20px}
|
|
65
|
-
.login{font-size:.92rem;font-weight:600;color:var(--muted)}
|
|
66
|
-
.login:hover{color:var(--navy)}
|
|
67
|
-
|
|
68
|
-
/* hero */
|
|
69
|
-
.hero{position:relative;overflow:hidden}
|
|
70
|
-
.blob{position:absolute;border-radius:50%;filter:blur(70px);opacity:.5;z-index:0;pointer-events:none}
|
|
71
|
-
.b1{width:520px;height:520px;background:radial-gradient(circle,#9fe4dd,transparent 70%);top:-160px;right:-120px}
|
|
72
|
-
.b2{width:440px;height:440px;background:radial-gradient(circle,#bcd6f5,transparent 70%);top:120px;right:220px;opacity:.4}
|
|
73
|
-
.hero-grid{position:relative;z-index:1;display:grid;grid-template-columns:1.02fr .98fr;gap:56px;align-items:center;padding:70px 0 84px}
|
|
74
|
-
.eyebrow{display:inline-flex;align-items:center;gap:10px;background:#fff;border:1px solid var(--line);
|
|
75
|
-
border-radius:999px;padding:8px 16px;font-size:.82rem;font-weight:700;color:var(--navy);box-shadow:var(--shadow-soft)}
|
|
76
|
-
.eyebrow .dot{position:relative;width:8px;height:8px;border-radius:50%;background:var(--green)}
|
|
77
|
-
.eyebrow .dot::after{content:"";position:absolute;inset:0;border-radius:50%;background:var(--green);animation:pulse 2.2s infinite}
|
|
78
|
-
@keyframes pulse{0%{transform:scale(1);opacity:.6}100%{transform:scale(2.8);opacity:0}}
|
|
79
|
-
h1{font-weight:800;font-size:3.35rem;line-height:1.07;margin:22px 0 20px}
|
|
80
|
-
.lede{font-size:1.17rem;color:var(--muted);max-width:40ch;margin-bottom:14px}
|
|
81
|
-
.lede b{color:var(--ink);font-weight:600}
|
|
82
|
-
.hero-ctas{display:flex;gap:13px;margin:28px 0 26px}
|
|
83
|
-
.cues{display:flex;flex-direction:column;gap:9px}
|
|
84
|
-
.cues span{display:flex;align-items:center;gap:10px;font-size:.95rem;font-weight:500;color:var(--ink)}
|
|
85
|
-
.cues .tk{width:20px;height:20px;border-radius:50%;background:rgba(13,147,145,.12);display:inline-flex;align-items:center;justify-content:center;flex:none}
|
|
86
|
-
.cues .tk svg{width:12px;height:12px;color:var(--teal)}
|
|
87
|
-
|
|
88
|
-
/* console (from A) */
|
|
89
|
-
.console{background:var(--card);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);overflow:hidden}
|
|
90
|
-
.c-head{display:flex;align-items:center;justify-content:space-between;padding:15px 20px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#fbfcfe,#fff)}
|
|
91
|
-
.c-head .url{font-family:var(--mono);font-size:.82rem;color:var(--navy);display:flex;align-items:center;gap:9px}
|
|
92
|
-
.c-live{display:inline-flex;align-items:center;gap:7px;font-size:.76rem;font-weight:700;color:var(--green);background:rgba(29,158,95,.1);padding:5px 11px;border-radius:999px}
|
|
93
|
-
.c-live i{width:7px;height:7px;border-radius:50%;background:var(--green);animation:blip 1.8s infinite}
|
|
94
|
-
@keyframes blip{0%{box-shadow:0 0 0 0 rgba(29,158,95,.5)}70%{box-shadow:0 0 0 7px rgba(29,158,95,0)}100%{box-shadow:0 0 0 0 rgba(29,158,95,0)}}
|
|
95
|
-
.c-body{padding:8px 8px 12px}
|
|
96
|
-
.crow{display:flex;align-items:center;gap:13px;padding:13px 14px;border-radius:11px}
|
|
97
|
-
.crow .ic{width:26px;height:26px;border-radius:8px;background:rgba(13,147,145,.12);display:inline-flex;align-items:center;justify-content:center;flex:none}
|
|
98
|
-
.crow .ic svg{width:15px;height:15px;color:var(--teal)}
|
|
99
|
-
.crow .lab{font-weight:600;font-size:.95rem;color:var(--ink)}
|
|
100
|
-
.crow .val{margin-left:auto;font-family:var(--mono);font-size:.82rem;color:var(--muted)}
|
|
101
|
-
.crow .val b{color:var(--green);font-weight:500}
|
|
102
|
-
.crow.killed{opacity:.5}
|
|
103
|
-
.crow.killed .ic{background:rgba(191,61,44,.1)}.crow.killed .ic svg{color:var(--coral)}
|
|
104
|
-
.crow.killed .lab{text-decoration:line-through;text-decoration-color:rgba(191,61,44,.55);color:var(--muted)}
|
|
105
|
-
.crow.killed .val{color:var(--coral)}
|
|
106
|
-
.c-foot{margin:6px 10px 4px;padding:12px 14px;border-top:1px dashed var(--line-cool);display:flex;align-items:center;gap:10px;font-size:.86rem;color:var(--muted)}
|
|
107
|
-
.c-foot b{color:var(--navy);font-weight:700}
|
|
108
|
-
.migbadge{margin-left:auto;font-family:var(--mono);font-size:.74rem;color:var(--teal-ink);background:rgba(13,147,145,.1);padding:4px 9px;border-radius:7px}
|
|
109
|
-
|
|
110
|
-
/* fear band */
|
|
111
|
-
.fear{background:var(--navy);color:#e7eef8}
|
|
112
|
-
.fear .wrap{display:grid;grid-template-columns:auto 1fr;gap:36px;align-items:center;padding:44px 40px}
|
|
113
|
-
.fear .big{font-family:var(--display);font-weight:800;font-size:3.6rem;line-height:1;color:#fff;letter-spacing:-.03em}
|
|
114
|
-
.fear .big .u{color:#ff9d8e}
|
|
115
|
-
.fear h2{color:#fff;font-size:1.5rem;margin-bottom:8px}
|
|
116
|
-
.fear p{color:#aebfd6;max-width:62ch;font-size:1rem}
|
|
117
|
-
.fear .src{font-family:var(--mono);font-size:.74rem;color:#7d92b3;margin-top:10px}
|
|
118
|
-
|
|
119
|
-
/* generic section */
|
|
120
|
-
section.blk{padding:78px 0}
|
|
121
|
-
.center{text-align:center}
|
|
122
|
-
.center .section-lede{margin-inline:auto}
|
|
123
|
-
h2.big2{font-size:2.15rem;line-height:1.12;margin:12px 0 12px}
|
|
124
|
-
.section-lede{color:var(--muted);max-width:60ch;font-size:1.06rem}
|
|
125
|
-
|
|
126
|
-
/* pillars */
|
|
127
|
-
.pillars{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:40px}
|
|
128
|
-
.pillar{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:24px;box-shadow:var(--shadow-soft)}
|
|
129
|
-
.pillar .pic{width:44px;height:44px;border-radius:12px;background:rgba(13,147,145,.1);display:inline-flex;align-items:center;justify-content:center;margin-bottom:16px}
|
|
130
|
-
.pillar .pic svg{width:23px;height:23px;color:var(--teal)}
|
|
131
|
-
.pillar h3{font-size:1.18rem;margin-bottom:8px}
|
|
132
|
-
.pillar p{color:var(--muted);font-size:.96rem}
|
|
133
|
-
.pillar .tag{display:inline-block;margin-top:14px;font-family:var(--mono);font-size:.74rem;color:var(--teal-ink);background:rgba(13,147,145,.09);padding:5px 10px;border-radius:7px}
|
|
134
|
-
|
|
135
|
-
/* comparison */
|
|
136
|
-
.cmp-wrap{background:#fff}
|
|
137
|
-
.cmp-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:36px}
|
|
138
|
-
.cmp{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#fff;transition:box-shadow .2s}
|
|
139
|
-
.cmp:hover{box-shadow:var(--shadow-soft)}
|
|
140
|
-
.cmp .top{width:100%;text-align:left;background:none;border:0;cursor:pointer;padding:20px 22px;display:flex;align-items:center;gap:14px;font:inherit}
|
|
141
|
-
.cmp .logo{width:38px;height:38px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;font-family:var(--display);font-weight:800;color:#fff;font-size:1.05rem;flex:none}
|
|
142
|
-
.cmp .tt{flex:1}
|
|
143
|
-
.cmp .tt .nm{display:block;font-family:var(--display);font-weight:700;font-size:1.06rem;color:var(--navy)}
|
|
144
|
-
.cmp .tt .sub{display:block;font-size:.86rem;color:var(--muted);margin-top:2px}
|
|
145
|
-
.cmp .chev{width:20px;height:20px;color:var(--muted);transition:transform .25s;flex:none}
|
|
146
|
-
.cmp[aria-expanded="true"] .chev{transform:rotate(180deg)}
|
|
147
|
-
.cmp .panel{display:none;padding:0 22px 22px;border-top:1px solid var(--line)}
|
|
148
|
-
.cmp[aria-expanded="true"] .panel{display:block;animation:fade .3s ease}
|
|
149
|
-
@keyframes fade{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
|
|
150
|
-
.cmp .row2{padding-top:16px}
|
|
151
|
-
.cmp .row2 .h{display:flex;align-items:center;gap:8px;font-family:var(--display);font-weight:700;font-size:.82rem;text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px}
|
|
152
|
-
.cmp .them .h{color:var(--coral)}
|
|
153
|
-
.cmp .us .h{color:var(--teal-ink)}
|
|
154
|
-
.cmp .row2 p{font-size:.92rem;color:var(--muted);line-height:1.55}
|
|
155
|
-
.cmp .row2 p b{color:var(--ink);font-weight:600}
|
|
156
|
-
.cmp .us{margin-top:16px;padding-top:16px;border-top:1px dashed var(--line-cool)}
|
|
157
|
-
|
|
158
|
-
/* persona */
|
|
159
|
-
.persona-wrap{background:linear-gradient(180deg,#f4f1ea,#faf8f4)}
|
|
160
|
-
.seg{display:inline-flex;background:#fff;border:1px solid var(--line);border-radius:14px;padding:5px;gap:4px;margin:28px 0 8px;box-shadow:var(--shadow-soft)}
|
|
161
|
-
.seg button{font-family:var(--display);font-weight:700;font-size:.95rem;color:var(--muted);background:none;border:0;padding:11px 20px;border-radius:10px;cursor:pointer;transition:.18s}
|
|
162
|
-
.seg button[aria-selected="true"]{background:var(--grad);color:#fff;box-shadow:0 6px 16px rgba(13,147,145,.28)}
|
|
163
|
-
.ppanel{display:none;margin-top:26px;background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow);overflow:hidden}
|
|
164
|
-
.ppanel.on{display:grid;grid-template-columns:.9fr 1.1fr}
|
|
165
|
-
.ppanel .lft{padding:34px;border-right:1px solid var(--line);background:linear-gradient(180deg,#fbfcfe,#fff)}
|
|
166
|
-
.ppanel .lft .who{font-family:var(--mono);font-size:.76rem;letter-spacing:.1em;text-transform:uppercase;color:var(--teal-ink);font-weight:600}
|
|
167
|
-
.ppanel .lft h3{font-size:1.7rem;line-height:1.12;margin:12px 0 12px}
|
|
168
|
-
.ppanel .lft p{color:var(--muted);font-size:1rem;margin-bottom:20px}
|
|
169
|
-
.ppanel .deck{display:inline-flex;align-items:center;gap:8px;font-family:var(--display);font-weight:700;font-size:.9rem;color:var(--teal-ink)}
|
|
170
|
-
.ppanel .deck:hover{color:var(--navy)}
|
|
171
|
-
.ppanel .rgt{padding:30px 34px;display:flex;flex-direction:column;gap:16px}
|
|
172
|
-
.ben{display:flex;gap:13px}
|
|
173
|
-
.ben .bic{width:28px;height:28px;border-radius:8px;background:rgba(13,147,145,.12);display:inline-flex;align-items:center;justify-content:center;flex:none}
|
|
174
|
-
.ben .bic svg{width:15px;height:15px;color:var(--teal)}
|
|
175
|
-
.ben .bt{font-family:var(--display);font-weight:700;font-size:.98rem;color:var(--navy)}
|
|
176
|
-
.ben .bd{font-size:.9rem;color:var(--muted)}
|
|
177
|
-
|
|
178
|
-
/* final cta */
|
|
179
|
-
.final{padding:20px 0 88px}
|
|
180
|
-
.cta-band{background:var(--navy);border-radius:26px;padding:56px 40px;text-align:center;position:relative;overflow:hidden}
|
|
181
|
-
.cta-band .cb{position:absolute;width:360px;height:360px;border-radius:50%;filter:blur(80px);opacity:.35}
|
|
182
|
-
.cta-band .cb1{background:#0d9391;top:-120px;left:-60px}.cta-band .cb2{background:#3b82c4;bottom:-140px;right:-40px}
|
|
183
|
-
.cta-band .kicker{color:#7fe3d6;position:relative}
|
|
184
|
-
.cta-band h2{color:#fff;font-size:2.2rem;margin:12px 0 12px;position:relative}
|
|
185
|
-
.cta-band p{color:#aebfd6;max-width:56ch;margin:0 auto 26px;position:relative}
|
|
186
|
-
.cta-band .hero-ctas{justify-content:center;position:relative}
|
|
187
|
-
.btn-white{background:#fff;color:var(--navy)}
|
|
188
|
-
|
|
189
|
-
/* built strip / footer */
|
|
190
|
-
.strip{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:#fff}
|
|
191
|
-
.strip .wrap{display:flex;align-items:center;justify-content:space-between;padding:20px 40px;gap:24px;flex-wrap:wrap}
|
|
192
|
-
.strip .built{display:flex;align-items:center;gap:14px;font-size:.88rem;color:var(--muted);flex-wrap:wrap}
|
|
193
|
-
.strip .built .k{font-weight:700;color:var(--navy);font-size:.78rem;letter-spacing:.08em;text-transform:uppercase}
|
|
194
|
-
.strip .built .tag{font-weight:600;color:var(--ink)}
|
|
195
|
-
.strip .built .sep{color:var(--line-cool)}
|
|
196
|
-
.strip .repl{font-size:.85rem;color:var(--muted)}.strip .repl b{color:var(--navy);font-weight:700}
|
|
197
|
-
footer.foot{padding:40px 0;color:var(--muted);font-size:.85rem;text-align:center;background:#f4f1ea}
|
|
198
|
-
|
|
199
|
-
/* request-access modal */
|
|
200
|
-
.modal{position:fixed;inset:0;z-index:100;display:none;align-items:center;justify-content:center;padding:24px}
|
|
201
|
-
.modal.on{display:flex}
|
|
202
|
-
.modal .ov{position:absolute;inset:0;background:rgba(16,41,75,.5);backdrop-filter:blur(3px)}
|
|
203
|
-
.modal .dlg{position:relative;z-index:1;background:#fff;border-radius:var(--r);box-shadow:var(--shadow);width:100%;max-width:520px;max-height:92vh;overflow:auto;animation:fade .25s ease}
|
|
204
|
-
.modal .dlg-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:28px 30px 6px}
|
|
205
|
-
.modal .dlg-head h3{font-size:1.5rem;line-height:1.15}
|
|
206
|
-
.modal .dlg-head p{color:var(--muted);font-size:.95rem;margin-top:6px}
|
|
207
|
-
.modal .x{background:none;border:0;cursor:pointer;color:var(--muted);width:34px;height:34px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;flex:none}
|
|
208
|
-
.modal .x:hover{background:var(--cream);color:var(--navy)}
|
|
209
|
-
.modal .x svg{width:20px;height:20px}
|
|
210
|
-
form.ra{padding:14px 30px 30px;display:flex;flex-direction:column;gap:14px}
|
|
211
|
-
form.ra .fld{display:flex;flex-direction:column;gap:6px}
|
|
212
|
-
form.ra .row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
|
|
213
|
-
form.ra label{font-family:var(--display);font-weight:700;font-size:.82rem;color:var(--navy)}
|
|
214
|
-
form.ra label .opt{font-family:var(--sans);font-weight:500;color:var(--muted);text-transform:none;letter-spacing:0}
|
|
215
|
-
form.ra input,form.ra textarea{font:inherit;font-size:.95rem;color:var(--ink);background:#fff;border:1.5px solid var(--line-cool);
|
|
216
|
-
border-radius:10px;padding:11px 13px;transition:border-color .15s}
|
|
217
|
-
form.ra input:focus,form.ra textarea:focus{outline:none;border-color:var(--teal)}
|
|
218
|
-
form.ra textarea{resize:vertical;min-height:78px}
|
|
219
|
-
form.ra .btn-grad{justify-content:center;margin-top:4px}
|
|
220
|
-
form.ra .err{display:none;color:var(--coral);font-size:.9rem;font-weight:600}
|
|
221
|
-
form.ra.has-error .err{display:block}
|
|
222
|
-
.ra-done{display:none;padding:34px 30px 40px;text-align:center}
|
|
223
|
-
.modal.done form.ra{display:none}
|
|
224
|
-
.modal.done .ra-done{display:block}
|
|
225
|
-
.ra-done .tick{width:56px;height:56px;border-radius:50%;background:rgba(29,158,95,.12);display:inline-flex;align-items:center;justify-content:center;margin-bottom:16px}
|
|
226
|
-
.ra-done .tick svg{width:30px;height:30px;color:var(--green)}
|
|
227
|
-
.ra-done h3{font-size:1.5rem;margin-bottom:8px}
|
|
228
|
-
.ra-done p{color:var(--muted);font-size:1rem;max-width:34ch;margin:0 auto 18px}
|
|
229
|
-
|
|
230
|
-
@media (max-width:900px){
|
|
231
|
-
.hero-grid{grid-template-columns:1fr;gap:40px}.pillars,.cmp-cards{grid-template-columns:1fr}
|
|
232
|
-
.ppanel.on{grid-template-columns:1fr}.ppanel .lft{border-right:0;border-bottom:1px solid var(--line)}
|
|
233
|
-
.fear .wrap{grid-template-columns:1fr;gap:16px}h1{font-size:2.5rem}
|
|
234
|
-
form.ra .row{grid-template-columns:1fr}
|
|
235
|
-
}
|