@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.
Files changed (147) hide show
  1. package/apps/storefront/integrations/lifecycle-host-asset.mjs +20 -6
  2. package/apps/storefront/package.json +1 -0
  3. package/apps/storefront/platform-reconcile-tenants.json +3 -0
  4. package/apps/storefront/public/favicon.ico +0 -0
  5. package/apps/storefront/public/shared/commerce-chrome.css +147 -16
  6. package/apps/storefront/src/components/AsyncStylesheet.astro +26 -0
  7. package/apps/storefront/src/components/Breadcrumbs.astro +8 -1
  8. package/apps/storefront/src/components/Img.astro +6 -5
  9. package/apps/storefront/src/components/ProductCard.astro +6 -4
  10. package/apps/storefront/src/components/Seo.astro +2 -1
  11. package/apps/storefront/src/components/chrome/SiteFooter.astro +45 -11
  12. package/apps/storefront/src/components/chrome/SiteHeader.astro +83 -13
  13. package/apps/storefront/src/components/commerce/RatingStars.astro +1 -1
  14. package/apps/storefront/src/components/compliance/ComplianceNotice.astro +2 -2
  15. package/apps/storefront/src/components/content/PromoTiles.astro +107 -0
  16. package/apps/storefront/src/components/content/TrustStrip.astro +30 -14
  17. package/apps/storefront/src/components/home/Hero.astro +156 -4
  18. package/apps/storefront/src/components/islands/AgeGate.tsx +135 -26
  19. package/apps/storefront/src/components/islands/ImageGallery.tsx +6 -9
  20. package/apps/storefront/src/components/islands/IsolatedAgeGate.tsx +194 -46
  21. package/apps/storefront/src/components/islands/SearchTypeahead.tsx +10 -4
  22. package/apps/storefront/src/components/marketing/Faq.astro +9 -2
  23. package/apps/storefront/src/config/devTenantSeed.ts +1 -1
  24. package/apps/storefront/src/config/kvTenantResolver.ts +7 -1
  25. package/apps/storefront/src/config/publicationSpaceConfig.ts +12 -1
  26. package/apps/storefront/src/config/publicationSpaceRegistry.ts +5 -0
  27. package/apps/storefront/src/config/tenants.ts +22 -0
  28. package/apps/storefront/src/layouts/Layout.astro +69 -44
  29. package/apps/storefront/src/lib/activity/changeActorAttribution.ts +24 -8
  30. package/apps/storefront/src/lib/activity/recordActivity.ts +15 -0
  31. package/apps/storefront/src/lib/asyncCss.ts +23 -0
  32. package/apps/storefront/src/lib/auth/loginGate.ts +22 -11
  33. package/apps/storefront/src/lib/basePath.ts +70 -9
  34. package/apps/storefront/src/lib/chrome/managedCart.ts +50 -0
  35. package/apps/storefront/src/lib/chrome/model.ts +4 -0
  36. package/apps/storefront/src/lib/chrome/newsletterAgeAttestation.ts +9 -0
  37. package/apps/storefront/src/lib/content/trustStrip.ts +38 -3
  38. package/apps/storefront/src/lib/cspStaticHashes.ts +4 -1
  39. package/apps/storefront/src/lib/diag/capture.ts +161 -0
  40. package/apps/storefront/src/lib/diag/consoleLine.ts +76 -0
  41. package/apps/storefront/src/lib/diag/debugConsole.ts +118 -0
  42. package/apps/storefront/src/lib/diag/debugMode.ts +163 -0
  43. package/apps/storefront/src/lib/diag/debugWindow.ts +111 -0
  44. package/apps/storefront/src/lib/diag/reference.ts +148 -0
  45. package/apps/storefront/src/lib/diag/referenceStore.ts +113 -0
  46. package/apps/storefront/src/lib/diag/report.ts +109 -0
  47. package/apps/storefront/src/lib/diag/session.ts +93 -0
  48. package/apps/storefront/src/lib/featuredProductsPresentation.ts +5 -0
  49. package/apps/storefront/src/lib/heroSlideshow.ts +41 -0
  50. package/apps/storefront/src/lib/homeVisualParity.ts +107 -0
  51. package/apps/storefront/src/lib/imageAttrs.ts +9 -6
  52. package/apps/storefront/src/lib/integration/nonceStamp.ts +23 -1
  53. package/apps/storefront/src/lib/integration/renderIntegrationState.ts +36 -0
  54. package/apps/storefront/src/lib/integration/tenantAnalyticsDeclarations.ts +17 -12
  55. package/apps/storefront/src/lib/jsonScript.ts +13 -0
  56. package/apps/storefront/src/lib/pinnedRouteRewriteBoundary.ts +31 -0
  57. package/apps/storefront/src/lib/previewReload.ts +53 -9
  58. package/apps/storefront/src/lib/rawChrome.ts +148 -19
  59. package/apps/storefront/src/lib/rawMarketingHtml.ts +120 -7
  60. package/apps/storefront/src/lib/storyblok/content-model.ts +46 -3
  61. package/apps/storefront/src/lib/styleGuideThemes.ts +107 -0
  62. package/apps/storefront/src/lib/tenantRouting.ts +15 -4
  63. package/apps/storefront/src/lib/tot/syncState.ts +21 -0
  64. package/apps/storefront/src/lib/tracking/publishSafetyNet.ts +29 -3
  65. package/apps/storefront/src/middleware/controlPlane.ts +9 -5
  66. package/apps/storefront/src/middleware/index.ts +13 -1
  67. package/apps/storefront/src/middleware/renderChain.ts +54 -11
  68. package/apps/storefront/src/middleware/routeBranch.ts +58 -12
  69. package/apps/storefront/src/middleware/staticBundle.ts +37 -3
  70. package/apps/storefront/src/pages/[...slug].astro +6 -2
  71. package/apps/storefront/src/pages/api/request-access.ts +5 -4
  72. package/apps/storefront/src/pages/blog/[slug].astro +11 -1
  73. package/apps/storefront/src/pages/cart.ts +23 -0
  74. package/apps/storefront/src/pages/index.astro +64 -85
  75. package/apps/storefront/src/pages/products/[handle].astro +8 -6
  76. package/apps/storefront/src/pages/sitemap.xml.ts +8 -2
  77. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +14 -25
  78. package/apps/storefront/src/pages/style-guide/[tenant]/chrome/[theme].astro +10 -17
  79. package/apps/storefront/src/pages/style-guide/[tenant]/guide/[theme].astro +9 -16
  80. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +9 -15
  81. package/apps/storefront/src/pages/the-build/[slug].astro +7 -1
  82. package/apps/storefront/src/styles/fonts.css +7 -0
  83. package/apps/storefront/src/styles/global.css +397 -3
  84. package/package.json +4 -1
  85. package/packages/cli/src/visual-parity.mjs +321 -0
  86. package/packages/public-runtime/package.json +2 -0
  87. package/packages/public-runtime/schemas/publication-space/v1/manifest.schema.json +1 -1
  88. package/packages/public-runtime/schemas/publication-space/v1/normalized-mount.schema.json +1 -1
  89. package/packages/public-runtime/src/chrome.ts +44 -7
  90. package/packages/public-runtime/src/csp.ts +12 -1
  91. package/packages/public-runtime/src/extension-contract-values.d.mts +19 -0
  92. package/packages/public-runtime/src/extension-contract-values.mjs +62 -0
  93. package/packages/public-runtime/src/extension-contract.ts +20 -6
  94. package/packages/public-runtime/src/index.ts +8 -0
  95. package/packages/public-runtime/src/integration/consent-broker.ts +10 -7
  96. package/packages/public-runtime/src/integration/consent-config.ts +9 -0
  97. package/packages/public-runtime/src/integration/contact-sales-action-source.ts +56 -10
  98. package/packages/public-runtime/src/integration/governed-event-properties.ts +62 -0
  99. package/packages/public-runtime/src/integration/index.ts +1 -0
  100. package/packages/public-runtime/src/integration/lifecycle-boot.ts +30 -2
  101. package/packages/public-runtime/src/integration/lifecycle-host-asset.d.mts +2 -0
  102. package/packages/public-runtime/src/integration/lifecycle-host-asset.mjs +17 -3
  103. package/packages/public-runtime/src/integration/native-amplitude.ts +12 -3
  104. package/packages/public-runtime/src/integration/native-ga4-sandbox-asset.mjs +9 -0
  105. package/packages/public-runtime/src/integration/native-ga4-sandbox-entry.ts +27 -3
  106. package/packages/public-runtime/src/integration/native-ga4-sandbox.ts +13 -0
  107. package/packages/public-runtime/src/integration/native-ga4.ts +11 -0
  108. package/packages/public-runtime/src/integration/platform-adapters.ts +5 -1
  109. package/packages/public-runtime/src/integration/render-phases.ts +28 -2
  110. package/packages/public-runtime/src/publication-redirects.d.mts +45 -0
  111. package/packages/public-runtime/src/publication-redirects.mjs +379 -0
  112. package/packages/public-runtime/src/publication-space.ts +24 -3
  113. package/packages/public-runtime/src/static-bundle.ts +145 -26
  114. package/packages/public-runtime/src/tenant-embed-defaults.d.mts +3 -0
  115. package/packages/public-runtime/src/tenant-embed-defaults.mjs +40 -0
  116. package/packages/public-runtime/src/tenant.ts +59 -1
  117. package/pnpm-lock.runner.yaml +12 -0
  118. package/pnpm-workspace.yaml +4 -0
  119. package/scripts/dev/git-status.mjs +1 -1
  120. package/scripts/dev/publish.mjs +6 -0
  121. package/scripts/lib/tenant-asset-copy.mjs +4 -2
  122. package/scripts/tenant/materialize-tenant-content.mjs +1 -0
  123. package/scripts/tenant/validate.mjs +171 -8
  124. package/apps/storefront/src/lib/cfImage.ts +0 -55
  125. package/apps/storefront/src/workers/pruneRollupWorker.ts +0 -120
  126. package/tenants/home/public/fonts/inter-latin-400-normal.woff2 +0 -0
  127. package/tenants/home/public/fonts/inter-latin-500-normal.woff2 +0 -0
  128. package/tenants/home/public/fonts/inter-latin-600-normal.woff2 +0 -0
  129. package/tenants/home/public/fonts/inter-latin-ext-400-normal.woff2 +0 -0
  130. package/tenants/home/public/fonts/inter-latin-ext-500-normal.woff2 +0 -0
  131. package/tenants/home/public/fonts/inter-latin-ext-600-normal.woff2 +0 -0
  132. package/tenants/home/public/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  133. package/tenants/home/public/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  134. package/tenants/home/public/fonts/jetbrains-mono-latin-ext-400-normal.woff2 +0 -0
  135. package/tenants/home/public/fonts/jetbrains-mono-latin-ext-500-normal.woff2 +0 -0
  136. package/tenants/home/public/fonts/plus-jakarta-sans-latin-500-normal.woff2 +0 -0
  137. package/tenants/home/public/fonts/plus-jakarta-sans-latin-600-normal.woff2 +0 -0
  138. package/tenants/home/public/fonts/plus-jakarta-sans-latin-700-normal.woff2 +0 -0
  139. package/tenants/home/public/fonts/plus-jakarta-sans-latin-800-normal.woff2 +0 -0
  140. package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-500-normal.woff2 +0 -0
  141. package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-600-normal.woff2 +0 -0
  142. package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-700-normal.woff2 +0 -0
  143. package/tenants/home/public/fonts/plus-jakarta-sans-latin-ext-800-normal.woff2 +0 -0
  144. package/tenants/home/public/js/storefront.js +0 -129
  145. package/tenants/home/public/logo-wordmark.png +0 -0
  146. package/tenants/home/public/pages/storefront.css +0 -235
  147. 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
- }
@@ -1,6 +0,0 @@
1
- {
2
- "color": {
3
- "primary": "#0030a0",
4
- "primary-contrast": "#ffffff"
5
- }
6
- }