@tokenoftrust/storefront-runner 0.1.0

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 (337) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +40 -0
  3. package/apps/storefront/.dev.vars.example +41 -0
  4. package/apps/storefront/.env.example +24 -0
  5. package/apps/storefront/astro.config.mjs +245 -0
  6. package/apps/storefront/env.d.ts +155 -0
  7. package/apps/storefront/lib/ensure-preview-reconcile-secret.sh +31 -0
  8. package/apps/storefront/lib/resolve-cf-token.sh +48 -0
  9. package/apps/storefront/lib/resolve-tot-credentials.sh +69 -0
  10. package/apps/storefront/migrations/0000_baseline.sql +54 -0
  11. package/apps/storefront/migrations/0001_products_fts.sql +9 -0
  12. package/apps/storefront/migrations/README.md +54 -0
  13. package/apps/storefront/migrations/meta/0000_snapshot.json +347 -0
  14. package/apps/storefront/migrations/meta/0001_snapshot.json +347 -0
  15. package/apps/storefront/migrations/meta/_journal.json +20 -0
  16. package/apps/storefront/package.json +41 -0
  17. package/apps/storefront/public/brand/northwind-logo-dark.svg +4 -0
  18. package/apps/storefront/public/brand/northwind-logo-light.svg +4 -0
  19. package/apps/storefront/public/brand/northwind-og.svg +13 -0
  20. package/apps/storefront/public/favicon.svg +5 -0
  21. package/apps/storefront/public/js/dashboard-team.js +147 -0
  22. package/apps/storefront/public/js/dashboard-vendor-search.js +115 -0
  23. package/apps/storefront/src/components/Badge.astro +34 -0
  24. package/apps/storefront/src/components/Breadcrumbs.astro +45 -0
  25. package/apps/storefront/src/components/CollectionCard.astro +56 -0
  26. package/apps/storefront/src/components/EmptyState.astro +35 -0
  27. package/apps/storefront/src/components/Img.astro +68 -0
  28. package/apps/storefront/src/components/ProductCard.astro +228 -0
  29. package/apps/storefront/src/components/Section.astro +39 -0
  30. package/apps/storefront/src/components/Seo.astro +70 -0
  31. package/apps/storefront/src/components/WidgetFrame.astro +34 -0
  32. package/apps/storefront/src/components/auth/AuthBadge.astro +44 -0
  33. package/apps/storefront/src/components/chrome/AnnouncementBar.astro +108 -0
  34. package/apps/storefront/src/components/chrome/MegaMenu.astro +26 -0
  35. package/apps/storefront/src/components/chrome/NavDropdown.astro +116 -0
  36. package/apps/storefront/src/components/chrome/SiteFooter.astro +181 -0
  37. package/apps/storefront/src/components/chrome/SiteHeader.astro +181 -0
  38. package/apps/storefront/src/components/chrome/UtilityNav.astro +79 -0
  39. package/apps/storefront/src/components/commerce/FoxyLoader.astro +23 -0
  40. package/apps/storefront/src/components/commerce/PriceDisplay.astro +91 -0
  41. package/apps/storefront/src/components/commerce/ProductCarousel.astro +197 -0
  42. package/apps/storefront/src/components/commerce/ProductGrid.astro +75 -0
  43. package/apps/storefront/src/components/commerce/RatingStars.astro +58 -0
  44. package/apps/storefront/src/components/compliance/NicotineWarning.astro +33 -0
  45. package/apps/storefront/src/components/home/Hero.astro +164 -0
  46. package/apps/storefront/src/components/islands/AgeGate.tsx +105 -0
  47. package/apps/storefront/src/components/islands/ImageGallery.tsx +237 -0
  48. package/apps/storefront/src/components/islands/IsolatedAgeGate.tsx +73 -0
  49. package/apps/storefront/src/components/islands/MobileNav.tsx +239 -0
  50. package/apps/storefront/src/components/islands/QuickView.tsx +138 -0
  51. package/apps/storefront/src/components/islands/RecentlyViewed.tsx +122 -0
  52. package/apps/storefront/src/components/islands/SavedList.tsx +99 -0
  53. package/apps/storefront/src/components/islands/SearchTypeahead.tsx +248 -0
  54. package/apps/storefront/src/components/islands/VariantSelector.tsx +378 -0
  55. package/apps/storefront/src/components/marketing/CardGrid.astro +72 -0
  56. package/apps/storefront/src/components/marketing/CodeSample.astro +20 -0
  57. package/apps/storefront/src/components/marketing/CtaBand.astro +24 -0
  58. package/apps/storefront/src/components/marketing/Faq.astro +37 -0
  59. package/apps/storefront/src/components/marketing/Integrations.astro +63 -0
  60. package/apps/storefront/src/components/marketing/MarketingBlocks.astro +53 -0
  61. package/apps/storefront/src/components/marketing/MarketingCtas.astro +48 -0
  62. package/apps/storefront/src/components/marketing/MarketingHero.astro +72 -0
  63. package/apps/storefront/src/components/marketing/ProofStrip.astro +37 -0
  64. package/apps/storefront/src/components/marketing/SplitCompare.astro +53 -0
  65. package/apps/storefront/src/components/marketing/Steps.astro +36 -0
  66. package/apps/storefront/src/components/marketing/Testimonials.astro +38 -0
  67. package/apps/storefront/src/components/marketing/TrustBar.astro +22 -0
  68. package/apps/storefront/src/components/nav/Footer.astro +148 -0
  69. package/apps/storefront/src/components/nav/Header.astro +190 -0
  70. package/apps/storefront/src/components/plp/ActiveFilters.astro +79 -0
  71. package/apps/storefront/src/components/plp/FacetSidebar.astro +146 -0
  72. package/apps/storefront/src/components/plp/Pagination.astro +99 -0
  73. package/apps/storefront/src/components/plp/SortSelect.astro +64 -0
  74. package/apps/storefront/src/config/devTenants.ts +16 -0
  75. package/apps/storefront/src/config/kvTenantResolver.ts +87 -0
  76. package/apps/storefront/src/config/resolver.ts +46 -0
  77. package/apps/storefront/src/config/tenants.ts +193 -0
  78. package/apps/storefront/src/layouts/Layout.astro +303 -0
  79. package/apps/storefront/src/lib/analytics/index.ts +47 -0
  80. package/apps/storefront/src/lib/auth/brokerAssertion.ts +136 -0
  81. package/apps/storefront/src/lib/auth/devAuth.ts +90 -0
  82. package/apps/storefront/src/lib/auth/gatePage.ts +81 -0
  83. package/apps/storefront/src/lib/auth/identityToken.ts +341 -0
  84. package/apps/storefront/src/lib/auth/loginGate.ts +107 -0
  85. package/apps/storefront/src/lib/auth/route.ts +146 -0
  86. package/apps/storefront/src/lib/auth/session.ts +203 -0
  87. package/apps/storefront/src/lib/auth/totAccessClient.ts +503 -0
  88. package/apps/storefront/src/lib/basePath.ts +41 -0
  89. package/apps/storefront/src/lib/cfImage.ts +55 -0
  90. package/apps/storefront/src/lib/chrome/model.ts +65 -0
  91. package/apps/storefront/src/lib/colors.ts +97 -0
  92. package/apps/storefront/src/lib/content-edit/client.ts +230 -0
  93. package/apps/storefront/src/lib/content-edit/index.ts +14 -0
  94. package/apps/storefront/src/lib/content-edit/route.ts +25 -0
  95. package/apps/storefront/src/lib/content-edit/types.ts +19 -0
  96. package/apps/storefront/src/lib/cspStaticHashes.ts +24 -0
  97. package/apps/storefront/src/lib/d1/catalog.ts +289 -0
  98. package/apps/storefront/src/lib/dashboard/staffAdmission.ts +43 -0
  99. package/apps/storefront/src/lib/dashboard/staffVendorAccess.ts +449 -0
  100. package/apps/storefront/src/lib/dashboard/tenantSelection.ts +136 -0
  101. package/apps/storefront/src/lib/dashboard/vendorQuery.ts +61 -0
  102. package/apps/storefront/src/lib/demoGate.ts +113 -0
  103. package/apps/storefront/src/lib/dev/ai-widget-client.js +127 -0
  104. package/apps/storefront/src/lib/dev/cliSignInCode.ts +132 -0
  105. package/apps/storefront/src/lib/diag/redact.ts +20 -0
  106. package/apps/storefront/src/lib/edgeCache.ts +128 -0
  107. package/apps/storefront/src/lib/email/magicLinkInviteEmail.ts +62 -0
  108. package/apps/storefront/src/lib/env.ts +60 -0
  109. package/apps/storefront/src/lib/fixtures/sampleProducts.ts +130 -0
  110. package/apps/storefront/src/lib/format.ts +29 -0
  111. package/apps/storefront/src/lib/foxyCommerce.ts +49 -0
  112. package/apps/storefront/src/lib/imageAttrs.ts +55 -0
  113. package/apps/storefront/src/lib/jsonld.ts +136 -0
  114. package/apps/storefront/src/lib/maintenance.ts +71 -0
  115. package/apps/storefront/src/lib/memoryKv.ts +32 -0
  116. package/apps/storefront/src/lib/messaging/messagesClient.ts +143 -0
  117. package/apps/storefront/src/lib/placeholder.ts +99 -0
  118. package/apps/storefront/src/lib/previewReload.ts +125 -0
  119. package/apps/storefront/src/lib/rawMarketingHtml.ts +133 -0
  120. package/apps/storefront/src/lib/search/index.ts +74 -0
  121. package/apps/storefront/src/lib/sections.ts +129 -0
  122. package/apps/storefront/src/lib/securityHeaders.ts +31 -0
  123. package/apps/storefront/src/lib/storyblok/content-model.ts +289 -0
  124. package/apps/storefront/src/lib/storyblok/provider.ts +524 -0
  125. package/apps/storefront/src/lib/tenantRouting.ts +91 -0
  126. package/apps/storefront/src/lib/tot/ToTClient.ts +177 -0
  127. package/apps/storefront/src/lib/tot/d1Client.ts +62 -0
  128. package/apps/storefront/src/lib/tot/query.ts +187 -0
  129. package/apps/storefront/src/lib/tot/totClientInterface.ts +30 -0
  130. package/apps/storefront/src/lib/url.ts +119 -0
  131. package/apps/storefront/src/lib/wishlist.ts +63 -0
  132. package/apps/storefront/src/middleware/index.ts +413 -0
  133. package/apps/storefront/src/pages/404.astro +61 -0
  134. package/apps/storefront/src/pages/[...slug].astro +90 -0
  135. package/apps/storefront/src/pages/api/auth/logout.ts +21 -0
  136. package/apps/storefront/src/pages/api/auth/magic-exchange.ts +107 -0
  137. package/apps/storefront/src/pages/api/auth/send.ts +85 -0
  138. package/apps/storefront/src/pages/api/auth/verify.ts +135 -0
  139. package/apps/storefront/src/pages/api/cache-purge.ts +44 -0
  140. package/apps/storefront/src/pages/api/content-edit/ai-edit.ts +64 -0
  141. package/apps/storefront/src/pages/api/csp-report.ts +25 -0
  142. package/apps/storefront/src/pages/api/dashboard/enter-vendor.ts +124 -0
  143. package/apps/storefront/src/pages/api/dashboard/vendor-search.ts +120 -0
  144. package/apps/storefront/src/pages/api/dev/cli-signin-code.ts +44 -0
  145. package/apps/storefront/src/pages/api/newsletter.ts +104 -0
  146. package/apps/storefront/src/pages/api/request-access.ts +172 -0
  147. package/apps/storefront/src/pages/auth/login.astro +149 -0
  148. package/apps/storefront/src/pages/auth/magic.astro +105 -0
  149. package/apps/storefront/src/pages/capabilities.astro +292 -0
  150. package/apps/storefront/src/pages/collections/[handle].astro +154 -0
  151. package/apps/storefront/src/pages/collections/index.astro +59 -0
  152. package/apps/storefront/src/pages/dashboard/[appDomain]/index.astro +100 -0
  153. package/apps/storefront/src/pages/dashboard/[appDomain]/team.astro +154 -0
  154. package/apps/storefront/src/pages/dashboard/index.astro +160 -0
  155. package/apps/storefront/src/pages/dev.astro +653 -0
  156. package/apps/storefront/src/pages/index.astro +290 -0
  157. package/apps/storefront/src/pages/llms.txt.ts +92 -0
  158. package/apps/storefront/src/pages/products/[handle].astro +443 -0
  159. package/apps/storefront/src/pages/robots.txt.ts +24 -0
  160. package/apps/storefront/src/pages/saved.astro +35 -0
  161. package/apps/storefront/src/pages/search.astro +150 -0
  162. package/apps/storefront/src/pages/sitemap.xml.ts +78 -0
  163. package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +646 -0
  164. package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +85 -0
  165. package/apps/storefront/src/pages/style-guide/index.astro +94 -0
  166. package/apps/storefront/src/pages/tenants/[id]/[...path].ts +57 -0
  167. package/apps/storefront/src/styles/global.css +277 -0
  168. package/apps/storefront/src/themes/reference.ts +61 -0
  169. package/apps/storefront/src/themes/schema.ts +111 -0
  170. package/apps/storefront/src/themes/tenants/index.ts +51 -0
  171. package/apps/storefront/tsconfig.json +16 -0
  172. package/apps/storefront/vitest.config.ts +22 -0
  173. package/apps/storefront/wrangler.toml +175 -0
  174. package/package.json +23 -0
  175. package/packages/public-runtime/LICENSE +58 -0
  176. package/packages/public-runtime/package.json +22 -0
  177. package/packages/public-runtime/src/binary-path.ts +68 -0
  178. package/packages/public-runtime/src/capabilities.ts +89 -0
  179. package/packages/public-runtime/src/catalog-api.ts +81 -0
  180. package/packages/public-runtime/src/catalog-d1.ts +192 -0
  181. package/packages/public-runtime/src/csp.ts +109 -0
  182. package/packages/public-runtime/src/customization-preview.ts +197 -0
  183. package/packages/public-runtime/src/customization-reconcile.ts +63 -0
  184. package/packages/public-runtime/src/customization-runtime.ts +157 -0
  185. package/packages/public-runtime/src/customization-scripts.ts +64 -0
  186. package/packages/public-runtime/src/customization-versioning.ts +95 -0
  187. package/packages/public-runtime/src/foxy.ts +184 -0
  188. package/packages/public-runtime/src/index.ts +30 -0
  189. package/packages/public-runtime/src/product.ts +159 -0
  190. package/packages/public-runtime/src/search.ts +45 -0
  191. package/packages/public-runtime/src/tenant-assets.ts +444 -0
  192. package/packages/public-runtime/src/tenant.ts +243 -0
  193. package/packages/public-runtime/tsconfig.json +8 -0
  194. package/packages/public-runtime/vitest.config.ts +8 -0
  195. package/pnpm-workspace.yaml +7 -0
  196. package/scripts/build/copy-tenant-assets.mjs +69 -0
  197. package/scripts/tot-dev.mjs +439 -0
  198. package/tenants/bigdvapor/content/blog.json +52 -0
  199. package/tenants/bigdvapor/content/chrome.html +149 -0
  200. package/tenants/bigdvapor/content/chrome.json +47 -0
  201. package/tenants/bigdvapor/content/home.html +463 -0
  202. package/tenants/bigdvapor/content/home.json +73 -0
  203. package/tenants/bigdvapor/content/pages/about.json +5 -0
  204. package/tenants/bigdvapor/content/pages/privacy.json +6 -0
  205. package/tenants/bigdvapor/content/pages/shipping-returns.json +6 -0
  206. package/tenants/bigdvapor/content/pages-html/blogs/news.html +86 -0
  207. package/tenants/bigdvapor/content/pages-html/pages/about-us.html +106 -0
  208. package/tenants/bigdvapor/content/pages-html/pages/contact-us.html +61 -0
  209. package/tenants/bigdvapor/content/pages-html/pages/privacy-policy.html +72 -0
  210. package/tenants/bigdvapor/content/pages-html/pages/shipping-returns.html +172 -0
  211. package/tenants/bigdvapor/content/themes/bigd-navy.json +109 -0
  212. package/tenants/bigdvapor/public/img/brands/adjust-vape-disposable.png +0 -0
  213. package/tenants/bigdvapor/public/img/brands/again-vape-disposable.png +0 -0
  214. package/tenants/bigdvapor/public/img/brands/al-fakher-vape-disposable.png +0 -0
  215. package/tenants/bigdvapor/public/img/brands/arro-vape-disposable.png +0 -0
  216. package/tenants/bigdvapor/public/img/brands/cookies-vape-disposable.png +0 -0
  217. package/tenants/bigdvapor/public/img/brands/core-vape-disposable.png +0 -0
  218. package/tenants/bigdvapor/public/img/brands/cyclone-vape-disposable.png +0 -0
  219. package/tenants/bigdvapor/public/img/brands/dinner-lady-vape-disposable.png +0 -0
  220. package/tenants/bigdvapor/public/img/brands/extre-bar-vape-disposable.png +0 -0
  221. package/tenants/bigdvapor/public/img/brands/fifty-bar-vape-disposable.jpg +0 -0
  222. package/tenants/bigdvapor/public/img/brands/firerose-vape-disposable.jpg +0 -0
  223. package/tenants/bigdvapor/public/img/brands/flavor-beast-vape-disposable.jpg +0 -0
  224. package/tenants/bigdvapor/public/img/brands/foger-vape-disposable.png +0 -0
  225. package/tenants/bigdvapor/public/img/brands/kk-energy-vape-disposable.png +0 -0
  226. package/tenants/bigdvapor/public/img/brands/kumi-vape-disposable.png +0 -0
  227. package/tenants/bigdvapor/public/img/brands/lost-vape-dispoable.png +0 -0
  228. package/tenants/bigdvapor/public/img/brands/melo-labs-vape-disposable.png +0 -0
  229. package/tenants/bigdvapor/public/img/brands/mixo-vape-disposable.webp +0 -0
  230. package/tenants/bigdvapor/public/img/brands/one-tank-vape-disposable.jpg +0 -0
  231. package/tenants/bigdvapor/public/img/brands/oxbar-vape-disposable.webp +0 -0
  232. package/tenants/bigdvapor/public/img/brands/pillow-talk-vape-disposable.jpg +0 -0
  233. package/tenants/bigdvapor/public/img/brands/pod-king-vape-disposable.jpg +0 -0
  234. package/tenants/bigdvapor/public/img/brands/raz-vape-disposable.png +0 -0
  235. package/tenants/bigdvapor/public/img/hero-texas.jpg +0 -0
  236. package/tenants/bigdvapor/public/img/og.jpg +0 -0
  237. package/tenants/bigdvapor/public/img/pages/AdobeStock_202106312_web.jpg +0 -0
  238. package/tenants/bigdvapor/public/img/pages/CREW_web.jpg +0 -0
  239. package/tenants/bigdvapor/public/img/pages/Hero-Image.jpg +0 -0
  240. package/tenants/bigdvapor/public/img/tiles/adjust.png +0 -0
  241. package/tenants/bigdvapor/public/img/tiles/again.png +0 -0
  242. package/tenants/bigdvapor/public/img/tiles/al-fakher.png +0 -0
  243. package/tenants/bigdvapor/public/img/tiles/arro.png +0 -0
  244. package/tenants/bigdvapor/public/img/tiles/cookies.png +0 -0
  245. package/tenants/bigdvapor/public/img/tiles/core.png +0 -0
  246. package/tenants/bigdvapor/public/img/tiles/cyclone.png +0 -0
  247. package/tenants/bigdvapor/public/img/tiles/disposables.svg +23 -0
  248. package/tenants/bigdvapor/public/logo-wordmark.png +0 -0
  249. package/tenants/bigdvapor/public/pages/home.css +118 -0
  250. package/tenants/bigdvapor/public/pages/mkt.css +185 -0
  251. package/tenants/bigdvapor/public/pages/page.css +148 -0
  252. package/tenants/bigdvapor/public/themes/bigd-navy.css +73 -0
  253. package/tenants/bigdvapor/theme.json +12 -0
  254. package/tenants/giantvapes/content/chrome.html +152 -0
  255. package/tenants/giantvapes/content/chrome.json +94 -0
  256. package/tenants/giantvapes/content/home.html +194 -0
  257. package/tenants/giantvapes/content/home.json +50 -0
  258. package/tenants/giantvapes/content/pages/about.json +10 -0
  259. package/tenants/giantvapes/content/pages/privacy.json +6 -0
  260. package/tenants/giantvapes/content/pages/shipping-returns.json +6 -0
  261. package/tenants/giantvapes/content/pages-html/blogs/news.html +68 -0
  262. package/tenants/giantvapes/content/pages-html/pages/about-us.html +95 -0
  263. package/tenants/giantvapes/content/pages-html/pages/contact-us.html +68 -0
  264. package/tenants/giantvapes/content/pages-html/pages/privacy-policy.html +65 -0
  265. package/tenants/giantvapes/content/pages-html/pages/shipping-returns.html +77 -0
  266. package/tenants/giantvapes/content/themes/giant-navy.json +73 -0
  267. package/tenants/giantvapes/public/img/hero-suicide-bunny.jpg +0 -0
  268. package/tenants/giantvapes/public/img/hero.webp +0 -0
  269. package/tenants/giantvapes/public/img/og.jpg +0 -0
  270. package/tenants/giantvapes/public/logo-wordmark.png +0 -0
  271. package/tenants/giantvapes/public/pages/home.css +120 -0
  272. package/tenants/giantvapes/public/pages/mkt.css +185 -0
  273. package/tenants/giantvapes/public/pages/page.css +155 -0
  274. package/tenants/giantvapes/public/themes/giant-navy.css +76 -0
  275. package/tenants/giantvapes/theme.json +39 -0
  276. package/tenants/home/content/chrome.json +11 -0
  277. package/tenants/home/content/home.html +304 -0
  278. package/tenants/home/content/home.json +13 -0
  279. package/tenants/home/public/js/storefront.js +210 -0
  280. package/tenants/home/public/logo-wordmark.png +0 -0
  281. package/tenants/home/public/pages/storefront.css +212 -0
  282. package/tenants/home/theme.json +6 -0
  283. package/tenants/tokenoftrust/.tot/config.json +9 -0
  284. package/tenants/tokenoftrust/content/chrome.json +55 -0
  285. package/tenants/tokenoftrust/content/home.html +723 -0
  286. package/tenants/tokenoftrust/content/home.json +233 -0
  287. package/tenants/tokenoftrust/content/pages-html/careers.html +231 -0
  288. package/tenants/tokenoftrust/content/pages-html/company.html +275 -0
  289. package/tenants/tokenoftrust/content/pages-html/contact/contact-sales.html +188 -0
  290. package/tenants/tokenoftrust/content/pages-html/contact/startup-apply.html +206 -0
  291. package/tenants/tokenoftrust/content/pages-html/contact.html +178 -0
  292. package/tenants/tokenoftrust/content/pages-html/industries/adult-content-age-verification.html +286 -0
  293. package/tenants/tokenoftrust/content/pages-html/industries/cannabis.html +277 -0
  294. package/tenants/tokenoftrust/content/pages-html/pact-act-pricing.html +289 -0
  295. package/tenants/tokenoftrust/content/pages-html/pricing.html +483 -0
  296. package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-estimation.html +278 -0
  297. package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-gate.html +279 -0
  298. package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-verification.html +265 -0
  299. package/tenants/tokenoftrust/content/pages-html/product/age-assurance.html +173 -0
  300. package/tenants/tokenoftrust/content/pages-html/product/compliance/aml.html +214 -0
  301. package/tenants/tokenoftrust/content/pages-html/product/compliance/pact-act.html +226 -0
  302. package/tenants/tokenoftrust/content/pages-html/product/fraud-prevention.html +254 -0
  303. package/tenants/tokenoftrust/content/pages-html/product/social-profile-verification.html +212 -0
  304. package/tenants/tokenoftrust/content/pages-html/product/tax/excise-tax.html +213 -0
  305. package/tenants/tokenoftrust/content/pages-html/product/verification/aml.html +259 -0
  306. package/tenants/tokenoftrust/content/pages-html/product/verification/biometric-selfie.html +305 -0
  307. package/tenants/tokenoftrust/content/pages-html/product/verification/coverage.html +254 -0
  308. package/tenants/tokenoftrust/content/pages-html/product/verification/document-verification.html +306 -0
  309. package/tenants/tokenoftrust/content/pages-html/product/verification/electronic-identity-verification.html +304 -0
  310. package/tenants/tokenoftrust/content/pages-html/product/verification/government-id-verification.html +308 -0
  311. package/tenants/tokenoftrust/content/pages-html/product/verification.html +183 -0
  312. package/tenants/tokenoftrust/content/pages-html/product.html +228 -0
  313. package/tenants/tokenoftrust/content/pages-html/resources/integrations/bigcommerce-integration.html +220 -0
  314. package/tenants/tokenoftrust/content/pages-html/resources/integrations/shopify-integration.html +221 -0
  315. package/tenants/tokenoftrust/content/pages-html/resources/integrations/wordpress.html +220 -0
  316. package/tenants/tokenoftrust/content/pages-html/resources/integrations.html +172 -0
  317. package/tenants/tokenoftrust/content/pages-html/resources/refer-a-friend-program.html +317 -0
  318. package/tenants/tokenoftrust/content/pages-html/resources.html +177 -0
  319. package/tenants/tokenoftrust/content/pages-html/reviews.html +273 -0
  320. package/tenants/tokenoftrust/content/pages-html/solutions.html +292 -0
  321. package/tenants/tokenoftrust/content/pages-html/vlp-alcohol.html +289 -0
  322. package/tenants/tokenoftrust/content/pages-html/vlp-cigars-and-tobacco.html +286 -0
  323. package/tenants/tokenoftrust/content/pages-html/vlp-firearm-accessories.html +267 -0
  324. package/tenants/tokenoftrust/content/pages-html/vlp-peptides.html +273 -0
  325. package/tenants/tokenoftrust/content/themes/tot-navy.json +88 -0
  326. package/tenants/tokenoftrust/public/favicon.png +0 -0
  327. package/tenants/tokenoftrust/public/logo-icon.png +0 -0
  328. package/tenants/tokenoftrust/public/logo-wordmark.png +0 -0
  329. package/tenants/tokenoftrust/public/pages/company.css +108 -0
  330. package/tenants/tokenoftrust/public/pages/home.css +457 -0
  331. package/tenants/tokenoftrust/public/pages/mkt.css +482 -0
  332. package/tenants/tokenoftrust/public/pages/pricing.css +214 -0
  333. package/tenants/tokenoftrust/public/pages/solutions.css +66 -0
  334. package/tenants/tokenoftrust/public/themes/tot-navy-1.0.0.css +136 -0
  335. package/tenants/tokenoftrust/public/themes/tot-navy.css +358 -0
  336. package/tenants/tokenoftrust/theme.json +31 -0
  337. package/tsconfig.base.json +20 -0
@@ -0,0 +1,66 @@
1
+ /* ============================================================================
2
+ Token of Trust — industries (solutions) page-local styles
3
+ ----------------------------------------------------------------------------
4
+ Tokens, reset, layout, typography, header/nav, footer, buttons, .kicker,
5
+ .reassurance and the reveal animation live in the shared theme
6
+ (tot-navy.css, v1.1). This file holds ONLY industries-page compositions: the
7
+ centred hero, the industry card grid, the CTA band and the nav active pill.
8
+ Consumes the shared token layer (no :root re-declare); primary CTAs route
9
+ through --color-cta. Do not minify — one rule per line, keep the headers.
10
+ ========================================================================== */
11
+
12
+ /* Hero (centred) --------------------------------------------------- */
13
+ .hero { text-align: center; padding: 72px 0 0; }
14
+ .hero h1 { margin: 16px auto; max-width: 20ch; }
15
+ .hero .lede { max-width: 58ch; margin: 0 auto; }
16
+ .hero .cta-row { justify-content: center; margin-top: 28px; }
17
+
18
+ /* CTA variants over the shared .btn base -------------------------- */
19
+ .btn-ent { background: var(--color-cta); color: #fff; box-shadow: 0 7px 20px rgba(21, 122, 74, .28); }
20
+ .btn-ent:hover { background: var(--color-cta-hover); }
21
+
22
+ /* Industry card grid ---------------------------------------------- */
23
+ .ind-section { padding-top: var(--s5); }
24
+ .ind-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; margin-top: 44px; }
25
+ .ind-card {
26
+ padding: 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r); border-top: 3px solid var(--teal);
27
+ transition: transform .2s, box-shadow .2s;
28
+ }
29
+ .ind-card:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
30
+ .ind-card h3 { font-size: 1.12rem; letter-spacing: -.01em; color: var(--navy); margin-bottom: 10px; }
31
+ .ind-card p { font-size: .92rem; color: var(--muted); }
32
+
33
+ /* CTA band (over shared alt-bg + .ent-band) ----------------------- */
34
+ .alt-bg { background: #fff; border-block: 1px solid var(--line); }
35
+ .ent-band { padding: 64px 40px; text-align: center; background: linear-gradient(135deg, var(--navy), var(--navy-2)); border-radius: 26px; color: #fff; }
36
+ .ent-band .kicker { color: #7fe3b8; }
37
+ .ent-band h2 { color: #fff; }
38
+ .ent-band p { max-width: 52ch; margin: 0 auto; color: #b8c8de; }
39
+ .cta-center { justify-content: center; margin-top: 24px; }
40
+ .ent-band .btn-line { background: transparent; color: #fff; border-color: rgba(255, 255, 255, .5); }
41
+ .ent-band .btn-line:hover { border-color: #fff; }
42
+
43
+ /* Nav active pill + footer note ----------------------------------- */
44
+ nav.primary a.active { color: var(--teal-ink); background: #eaf5f2; padding: 6px 16px; border-radius: 999px; font-weight: 700; }
45
+ .foot-note { font-size: .88rem; margin-top: 12px; max-width: 34ch; color: var(--muted); }
46
+
47
+ /* Responsive ------------------------------------------------------ */
48
+ @media (max-width: 920px) {
49
+ .ind-grid { grid-template-columns: 1fr 1fr; }
50
+ }
51
+ @media (max-width: 560px) {
52
+ .ind-grid { grid-template-columns: 1fr; max-width: 440px; margin-inline: auto; }
53
+ }
54
+
55
+ /* Dark theme — literal light surfaces + decorative tints */
56
+ @media (prefers-color-scheme: dark) {
57
+ :root:not([data-theme="light"]) {
58
+ .ind-card, .alt-bg { background: var(--card); }
59
+ nav.primary a.active { background: rgba(43, 179, 166, .16); color: var(--teal-ink); }
60
+ .ind-card h3 { color: var(--ink); }
61
+ }
62
+ }
63
+ :root[data-theme="dark"] .ind-card,
64
+ :root[data-theme="dark"] .alt-bg { background: var(--card); }
65
+ :root[data-theme="dark"] nav.primary a.active { background: rgba(43, 179, 166, .16); color: var(--teal-ink); }
66
+ :root[data-theme="dark"] .ind-card h3 { color: var(--ink); }
@@ -0,0 +1,136 @@
1
+ /* ============================================================================
2
+ Token of Trust — "tot-navy" theme (role: current · style concept v1.0.0)
3
+ ----------------------------------------------------------------------------
4
+ The reusable design-system foundation extracted verbatim (values unchanged)
5
+ from the design-11 marketing prototype that home.html + pricing.html were
6
+ ported from. This is the SHARED vocabulary only — tokens, base, typography,
7
+ buttons, chrome (header/nav/footer), the proof strip, and interaction/reveal
8
+ + responsive rules. Page-specific compositions (the animated hero console,
9
+ before/after, journey, plan cards, FAQ, industry grids) are NOT here — they
10
+ stay page-local.
11
+
12
+ Source of truth for the style guide at /_style-guide/tokenoftrust/tot-navy/.
13
+ Do not minify. Keep one rule per line and the section headers below.
14
+ ========================================================================== */
15
+
16
+ /* --- 1. Design tokens ---------------------------------------------------- */
17
+ :root {
18
+ /* Enterprise anchor */
19
+ --navy: #10294b;
20
+ --navy-2: #173763;
21
+ --navy-soft: #1e4275;
22
+ /* Soft neutrals */
23
+ --cream: #faf8f4;
24
+ --card: #ffffff;
25
+ --line: #e6e2d9;
26
+ --line-cool: #dfe6ee;
27
+ --ink: #1b2a40;
28
+ --muted: #5d6b80;
29
+ /* Warm + trust accents */
30
+ --teal: #0ea5a3;
31
+ --coral: #f97362;
32
+ --green: #1d9e5f;
33
+ --green-d: #17854f;
34
+ --gold: #d9a93f;
35
+ --grad: linear-gradient(115deg, var(--teal), #3b82c4);
36
+ /* Shape */
37
+ --r: 20px;
38
+ --r-sm: 13px;
39
+ --shadow: 0 12px 36px rgba(16, 41, 75, .10);
40
+ --shadow-soft: 0 8px 24px rgba(27, 42, 64, .07);
41
+ /* Spacing scale */
42
+ --s1: 8px;
43
+ --s2: 16px;
44
+ --s3: 24px;
45
+ --s4: 44px;
46
+ --s5: 72px;
47
+ --s6: 104px;
48
+ /* Type families */
49
+ --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
50
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
51
+ }
52
+
53
+ /* --- 2. Reset & base ----------------------------------------------------- */
54
+ * { box-sizing: border-box; margin: 0; padding: 0; }
55
+ html { scroll-behavior: smooth; }
56
+ body { font-family: var(--sans); background: var(--cream); color: var(--ink); line-height: 1.65; }
57
+ img, svg { max-width: 100%; }
58
+ a { color: inherit; }
59
+
60
+ /* --- 3. Layout ----------------------------------------------------------- */
61
+ .container { max-width: 1150px; margin: 0 auto; padding: 0 var(--s3); }
62
+ .skip-link { position: absolute; left: -9999px; top: 0; background: var(--navy); color: #fff; padding: 10px 16px; z-index: 100; border-radius: 0 0 10px 0; }
63
+ .skip-link:focus { left: 0; }
64
+ .center { text-align: center; }
65
+ .center .section-lede { margin: 0 auto; }
66
+ section { padding: var(--s5) 0; }
67
+
68
+ /* --- 4. Typography ------------------------------------------------------- */
69
+ h1 { font-size: clamp(2.1rem, 4.6vw, 3.25rem); line-height: 1.12; letter-spacing: -.025em; margin: var(--s2) 0; font-weight: 800; color: var(--navy); }
70
+ h1 .grad { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
71
+ h2 { font-size: clamp(1.65rem, 3.3vw, 2.35rem); letter-spacing: -.02em; line-height: 1.16; margin: 10px 0 14px; font-weight: 800; color: var(--navy); }
72
+ .kicker { font-size: .78rem; font-weight: 800; letter-spacing: .15em; text-transform: uppercase; color: var(--teal); }
73
+ .lede { font-size: 1.13rem; color: var(--muted); max-width: 52ch; }
74
+ .section-lede { color: var(--muted); max-width: 62ch; font-size: 1.05rem; }
75
+ .support-line { font-size: .98rem; font-weight: 700; color: var(--coral); margin-top: 10px; }
76
+ .eyebrow { display: inline-flex; align-items: center; gap: 9px; background: #fff; border: 1px solid var(--line); border-radius: 999px; padding: 7px 16px; font-size: .82rem; font-weight: 700; color: var(--navy); }
77
+ .eyebrow .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); animation: pulse 2.2s infinite; }
78
+
79
+ /* --- 5. Buttons ---------------------------------------------------------- */
80
+ .btn { display: inline-block; padding: 12px 24px; border-radius: 12px; font-weight: 700; font-size: .94rem; text-decoration: none; border: 0; cursor: pointer; transition: transform .15s, box-shadow .15s, filter .15s, background .15s; }
81
+ .btn:hover { transform: translateY(-2px); }
82
+ .btn-green { background: var(--green); color: #fff; box-shadow: 0 7px 20px rgba(29, 158, 95, .3); }
83
+ .btn-green:hover { background: var(--green-d); }
84
+ .btn-navy { background: var(--navy); color: #fff; }
85
+ .btn-navy:hover { background: var(--navy-2); }
86
+ .btn-line { background: #fff; color: var(--navy); border: 1.5px solid var(--line-cool); }
87
+ .btn-line:hover { border-color: var(--navy); }
88
+
89
+ /* --- 6. Header / primary nav -------------------------------------------- */
90
+ header.site { position: sticky; top: 0; z-index: 50; background: rgba(250, 248, 244, .92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }
91
+ .nav-row { display: flex; align-items: center; justify-content: space-between; height: 70px; }
92
+ .brand { display: flex; align-items: center; text-decoration: none; }
93
+ .brand img { height: 34px; width: auto; display: block; }
94
+ nav.primary ul { display: flex; gap: 28px; list-style: none; align-items: center; }
95
+ nav.primary a { text-decoration: none; font-weight: 600; font-size: .94rem; color: var(--muted); }
96
+ nav.primary a:hover { color: var(--navy); }
97
+ .nav-cta { display: flex; gap: 12px; align-items: center; }
98
+ .hamburger { display: none; background: none; border: 0; cursor: pointer; padding: 8px; }
99
+ .hamburger span { display: block; width: 24px; height: 2.5px; background: var(--ink); margin: 5px 0; border-radius: 2px; }
100
+
101
+ /* --- 7. Proof strip ------------------------------------------------------ */
102
+ .proof { background: var(--navy); color: #cfdced; padding: 18px 0; }
103
+ .proof .container { display: flex; flex-wrap: wrap; gap: 14px 34px; align-items: center; justify-content: center; }
104
+ .proof span { font-size: .82rem; font-weight: 600; display: flex; align-items: center; gap: 8px; white-space: nowrap; }
105
+ .proof b { color: #fff; }
106
+ .proof .sep { opacity: .35; }
107
+
108
+ /* --- 8. Footer ----------------------------------------------------------- */
109
+ footer.site { border-top: 1px solid var(--line); padding: var(--s5) 0; background: #f4f1ea; }
110
+ .foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--s4); }
111
+ .foot-grid h3 { font-size: .76rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; font-weight: 800; }
112
+ .foot-grid ul { list-style: none; }
113
+ .foot-grid li { margin-bottom: 9px; }
114
+ .foot-grid a { text-decoration: none; font-size: .92rem; font-weight: 600; }
115
+ .foot-grid a:hover { color: var(--teal); }
116
+ .copyright { margin-top: var(--s4); color: var(--muted); font-size: .85rem; }
117
+
118
+ /* --- 9. Interaction / reveal -------------------------------------------- */
119
+ .reveal { opacity: 0; transform: translateY(24px); transition: opacity .65s ease, transform .65s ease; }
120
+ .reveal.in { opacity: 1; transform: none; }
121
+ @keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(29, 158, 95, .5); } 50% { box-shadow: 0 0 0 6px rgba(29, 158, 95, 0); } }
122
+
123
+ /* --- 10. Responsive foundation ------------------------------------------ */
124
+ @media (max-width: 980px) {
125
+ .foot-grid { grid-template-columns: 1fr 1fr; }
126
+ nav.primary { display: none; position: absolute; top: 70px; left: 0; right: 0; background: var(--cream); border-bottom: 1px solid var(--line); padding: 18px 24px; }
127
+ nav.primary.open { display: block; }
128
+ nav.primary ul { flex-direction: column; align-items: flex-start; gap: 18px; }
129
+ .hamburger { display: block; }
130
+ .nav-cta .btn-line { display: none; }
131
+ }
132
+ @media (prefers-reduced-motion: reduce) {
133
+ *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
134
+ .reveal { opacity: 1; transform: none; }
135
+ html { scroll-behavior: auto; }
136
+ }
@@ -0,0 +1,358 @@
1
+ /* ============================================================================
2
+ Token of Trust — "tot-navy" theme · concept v1.1 (ecommerce-hardened)
3
+ ----------------------------------------------------------------------------
4
+ v1.0.0 (baseline, faithful design-11 extraction) is retained at
5
+ tot-navy-1.0.0.css. v1.1 hardens it to the ecommerce style-guide quality bar:
6
+ WCAG 2.2 AA contrast + visible focus-visible rings, >=44px tap targets, a
7
+ semantic token layer, full interactive states, accessible form styles,
8
+ trust/social-proof component slots (placeholder — never fabricate claims),
9
+ an explicit CTA hierarchy, color-scheme, and perf-conscious motion.
10
+ Do not minify. One rule per line; keep the section headers.
11
+ ========================================================================== */
12
+
13
+ /* --- 1. Design tokens ---------------------------------------------------- */
14
+ :root {
15
+ color-scheme: light;
16
+
17
+ /* Enterprise anchor */
18
+ --navy: #10294b;
19
+ --navy-2: #173763;
20
+ --navy-soft: #1e4275;
21
+ /* Soft neutrals */
22
+ --cream: #faf8f4;
23
+ --card: #ffffff;
24
+ --line: #e6e2d9;
25
+ --line-cool: #dfe6ee;
26
+ --ink: #1b2a40;
27
+ --muted: #4d5a70; /* darkened from v1.0 (#5d6b80) for AA on cream + white */
28
+ /* Warm + trust accents (decorative) */
29
+ --teal: #0d9391; /* deepened for >=3:1 on cream (decorative/large use) */
30
+ --teal-ink: #0b6360; /* AA-safe teal for small text (kickers/links) */
31
+ --coral: #bf3d2c; /* AA on cream (~5.1:1) — safe as normal text (.support-line) */
32
+ --green: #1d9e5f;
33
+ --green-d: #17854f;
34
+ --gold: #8a6012; /* deep amber, AA on cream (~5.2:1) — safe for text + rating icons */
35
+ --grad: linear-gradient(115deg, var(--teal), #3b82c4);
36
+
37
+ /* Semantic tokens (v1.1) — the layer components should consume */
38
+ --color-cta: #16794a; /* primary action bg; white text = AA (~5.4:1) */
39
+ --color-cta-hover: #115f3a;
40
+ --color-trust: var(--teal-ink);
41
+ --color-error: #b3261e;
42
+ --color-success: #157a4a;
43
+ --color-warning: #8a5a10;
44
+ --surface-card: var(--card);
45
+ --surface-raised: var(--card);
46
+ --text-muted: var(--muted);
47
+ --focus-ring: #4f7fff; /* >=3:1 focus outline on BOTH cream (~3.4:1) and navy (~3.6:1) */
48
+
49
+ /* Shape */
50
+ --r: 20px;
51
+ --r-sm: 13px;
52
+ --shadow: 0 12px 36px rgba(16, 41, 75, .10);
53
+ --shadow-soft: 0 8px 24px rgba(27, 42, 64, .07);
54
+ /* Spacing scale */
55
+ --s1: 8px;
56
+ --s2: 16px;
57
+ --s3: 24px;
58
+ --s4: 44px;
59
+ --s5: 72px;
60
+ --s6: 104px;
61
+ /* Type families */
62
+ --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
63
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
64
+ --tap: 44px; /* minimum interactive target */
65
+ }
66
+
67
+ /* --- 1b. Dark theme -------------------------------------------------------
68
+ Applies automatically for OS/browser dark mode, and is togglable ahead of
69
+ any future manual switch via [data-theme="dark"] / [data-theme="light"]
70
+ on <html> (the attribute always wins over the media query). Same token
71
+ names, dark values only — components below never re-branch on theme. */
72
+ @media (prefers-color-scheme: dark) {
73
+ :root { color-scheme: dark; }
74
+ }
75
+ :root[data-theme="dark"] { color-scheme: dark; }
76
+ @media (prefers-color-scheme: dark) {
77
+ :root:not([data-theme="light"]) {
78
+ --navy: #17335a;
79
+ --navy-2: #1f4272;
80
+ --navy-soft: #2c527f;
81
+ --cream: #0b1220;
82
+ --card: #131c2c;
83
+ --line: #263349;
84
+ --line-cool: #2b3c58;
85
+ --ink: #e7ecf5;
86
+ --muted: #9aa9c2;
87
+ --teal: #2bb3a6;
88
+ --teal-ink: #5eead4;
89
+ --coral: #ff9478;
90
+ --green: #34d399;
91
+ --green-d: #22c55e;
92
+ --gold: #f2c14e;
93
+ --grad: linear-gradient(115deg, var(--teal), #60a5fa);
94
+
95
+ --color-cta: #1c9c5e;
96
+ --color-cta-hover: #22b56c;
97
+ --color-trust: var(--teal-ink);
98
+ --color-error: #ff6b6b;
99
+ --color-success: #34d399;
100
+ --color-warning: #f2b84b;
101
+ --surface-card: var(--card);
102
+ --surface-raised: var(--card);
103
+ --text-muted: var(--muted);
104
+ --focus-ring: #7f9fff;
105
+
106
+ --shadow: 0 12px 36px rgba(0, 0, 0, .45);
107
+ --shadow-soft: 0 8px 24px rgba(0, 0, 0, .35);
108
+ }
109
+ }
110
+ :root[data-theme="dark"] {
111
+ --navy: #17335a;
112
+ --navy-2: #1f4272;
113
+ --navy-soft: #2c527f;
114
+ --cream: #0b1220;
115
+ --card: #131c2c;
116
+ --line: #263349;
117
+ --line-cool: #2b3c58;
118
+ --ink: #e7ecf5;
119
+ --muted: #9aa9c2;
120
+ --teal: #2bb3a6;
121
+ --teal-ink: #5eead4;
122
+ --coral: #ff9478;
123
+ --green: #34d399;
124
+ --green-d: #22c55e;
125
+ --gold: #f2c14e;
126
+ --grad: linear-gradient(115deg, var(--teal), #60a5fa);
127
+
128
+ --color-cta: #1c9c5e;
129
+ --color-cta-hover: #22b56c;
130
+ --color-trust: var(--teal-ink);
131
+ --color-error: #ff6b6b;
132
+ --color-success: #34d399;
133
+ --color-warning: #f2b84b;
134
+ --surface-card: var(--card);
135
+ --surface-raised: var(--card);
136
+ --text-muted: var(--muted);
137
+ --focus-ring: #7f9fff;
138
+
139
+ --shadow: 0 12px 36px rgba(0, 0, 0, .45);
140
+ --shadow-soft: 0 8px 24px rgba(0, 0, 0, .35);
141
+ }
142
+
143
+ /* --- 2. Reset & base ----------------------------------------------------- */
144
+ * { box-sizing: border-box; margin: 0; padding: 0; }
145
+ html { scroll-behavior: smooth; }
146
+ body { font-family: var(--sans); background: var(--cream); color: var(--ink); line-height: 1.65; font-size: 16px; }
147
+ img, svg { max-width: 100%; }
148
+ a { color: inherit; }
149
+
150
+ /* Global visible focus — never remove the outline, only replace it (v1.1). */
151
+ :focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; border-radius: 4px; }
152
+
153
+ /* --- 3. Layout ----------------------------------------------------------- */
154
+ .container { max-width: 1150px; margin: 0 auto; padding: 0 var(--s3); }
155
+ .skip-link { position: absolute; left: -9999px; top: 0; background: var(--navy); color: #fff; padding: 12px 18px; z-index: 100; border-radius: 0 0 10px 0; }
156
+ .skip-link:focus { left: 0; }
157
+ .center { text-align: center; }
158
+ .center .section-lede { margin: 0 auto; }
159
+ section { padding: var(--s5) 0; }
160
+
161
+ /* --- 4. Typography ------------------------------------------------------- */
162
+ h1 { font-size: clamp(2.1rem, 4.6vw, 3.25rem); line-height: 1.12; letter-spacing: -.025em; margin: var(--s2) 0; font-weight: 800; color: var(--navy); }
163
+ h1 .grad { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
164
+ h2 { font-size: clamp(1.65rem, 3.3vw, 2.35rem); letter-spacing: -.02em; line-height: 1.16; margin: 10px 0 14px; font-weight: 800; color: var(--navy); }
165
+ .kicker { font-size: .875rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; color: var(--teal-ink); }
166
+ .lede { font-size: 1.13rem; color: var(--muted); max-width: 52ch; }
167
+ .section-lede { color: var(--muted); max-width: 62ch; font-size: 1.05rem; }
168
+ .support-line { font-size: 1rem; font-weight: 700; color: var(--coral); margin-top: 10px; }
169
+ .eyebrow {
170
+ display: inline-flex; align-items: center; gap: 9px; background: #fff; border: 1px solid var(--line); border-radius: 999px; padding: 8px 16px;
171
+ font-size: .875rem; font-weight: 700; color: var(--navy);
172
+ }
173
+ .eyebrow .dot { position: relative; width: 8px; height: 8px; border-radius: 50%; background: var(--green); }
174
+ .eyebrow .dot::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: var(--green); animation: pulse 2.2s infinite; }
175
+
176
+ /* --- 5. Buttons — CTA hierarchy + full states (v1.1) --------------------- */
177
+ /* primary = green/cta · secondary = navy · tertiary = line/outline */
178
+ .btn {
179
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: var(--tap); padding: 12px 24px; border-radius: 12px;
180
+ font-weight: 700; font-size: .95rem; text-decoration: none; border: 0; cursor: pointer;
181
+ transition: transform .15s, box-shadow .15s, filter .15s, background .15s;
182
+ }
183
+ .btn:hover { transform: translateY(-2px); }
184
+ .btn:active { transform: translateY(0); filter: brightness(.96); }
185
+ .btn:disabled, .btn[aria-disabled="true"], .btn.is-disabled { opacity: .55; cursor: not-allowed; transform: none; box-shadow: none; filter: grayscale(.2); }
186
+ .btn.is-loading, .btn[aria-busy="true"] { position: relative; color: transparent; pointer-events: none; }
187
+ .btn.is-loading::after {
188
+ content: ""; position: absolute; width: 16px; height: 16px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; color: #fff;
189
+ animation: btnspin .7s linear infinite;
190
+ }
191
+ @keyframes btnspin { to { transform: rotate(360deg); } }
192
+ .btn-green, .btn-primary { background: var(--color-cta); color: #fff; box-shadow: 0 7px 20px rgba(21, 122, 74, .28); }
193
+ .btn-green:hover, .btn-primary:hover { background: var(--color-cta-hover); }
194
+ .btn-navy, .btn-secondary { background: var(--navy); color: #fff; }
195
+ .btn-navy:hover, .btn-secondary:hover { background: var(--navy-2); }
196
+ .btn-line, .btn-tertiary, .btn-outline { background: #fff; color: var(--navy); border: 1.5px solid var(--line-cool); }
197
+ .btn-line:hover, .btn-tertiary:hover, .btn-outline:hover { border-color: var(--navy); }
198
+
199
+ /* --- 6. Header / primary nav (>=44px targets) --------------------------- */
200
+ header.site { position: sticky; top: 0; z-index: 50; background: rgba(250, 248, 244, .92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }
201
+ .nav-row { display: flex; align-items: center; justify-content: space-between; height: 70px; }
202
+ .brand { display: flex; align-items: center; text-decoration: none; min-height: var(--tap); }
203
+ .brand img { height: 34px; width: auto; display: block; }
204
+ nav.primary ul { display: flex; gap: 20px; list-style: none; align-items: center; }
205
+ nav.primary a {
206
+ display: inline-flex; align-items: center; min-height: var(--tap); text-decoration: none; font-weight: 600; font-size: .95rem; color: var(--muted);
207
+ }
208
+ nav.primary a:hover { color: var(--navy); }
209
+ .nav-cta { display: flex; gap: 12px; align-items: center; }
210
+ .hamburger { display: none; background: none; border: 0; cursor: pointer; min-width: var(--tap); min-height: var(--tap); }
211
+ .hamburger span { display: block; width: 24px; height: 2.5px; background: var(--ink); margin: 5px auto; border-radius: 2px; }
212
+
213
+ /* --- 7. Proof strip ------------------------------------------------------ */
214
+ .proof { background: var(--navy); color: #e2ebf6; padding: 18px 0; }
215
+ .proof .container { display: flex; flex-wrap: wrap; gap: 14px 34px; align-items: center; justify-content: center; }
216
+ .proof span { font-size: .9rem; font-weight: 600; display: flex; align-items: center; gap: 8px; white-space: nowrap; }
217
+ .proof b { color: #fff; }
218
+ .proof .sep { opacity: .45; }
219
+
220
+ /* --- 8. Footer ----------------------------------------------------------- */
221
+ footer.site { border-top: 1px solid var(--line); padding: var(--s5) 0; background: #f4f1ea; }
222
+ .foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--s4); }
223
+ .foot-grid h3 { font-size: .875rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; font-weight: 800; }
224
+ .foot-grid ul { list-style: none; }
225
+ .foot-grid li { margin-bottom: 4px; }
226
+ .foot-grid a { display: inline-flex; align-items: center; min-height: var(--tap); text-decoration: none; font-size: .95rem; font-weight: 600; }
227
+ .foot-grid a:hover { color: var(--teal-ink); }
228
+ .copyright { margin-top: var(--s4); color: var(--muted); font-size: .9rem; }
229
+
230
+ /* --- 9. Interaction / reveal -------------------------------------------- */
231
+ .reveal { opacity: 0; transform: translateY(24px); transition: opacity .65s ease, transform .65s ease; }
232
+ .reveal.in { opacity: 1; transform: none; }
233
+ /* Composited pulse (transform + opacity) — avoids non-composited box-shadow animation. */
234
+ @keyframes pulse { 0% { transform: scale(1); opacity: .5; } 100% { transform: scale(2.6); opacity: 0; } }
235
+
236
+ /* --- 10. Accessible forms (v1.1) ---------------------------------------- */
237
+ /* Field group: label + control + help/validation. required/optional marked. */
238
+ .form-field { display: grid; gap: 6px; margin-bottom: var(--s2); }
239
+ .form-label { font-weight: 700; font-size: .95rem; color: var(--ink); }
240
+ .form-label .req { color: var(--color-error); } /* required marker */
241
+ .form-label .opt { color: var(--muted); font-weight: 400; } /* optional marker */
242
+ .form-help { font-size: .9rem; color: var(--muted); } /* aria-describedby hint */
243
+ .form-control {
244
+ width: 100%; min-height: var(--tap); padding: 11px 14px; border: 1.5px solid var(--line-cool); border-radius: 10px; font: inherit; font-size: 1rem;
245
+ background: #fff; color: var(--ink);
246
+ }
247
+ .form-control::placeholder { color: #7a869a; }
248
+ .form-control:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; border-color: var(--navy); }
249
+ .form-control[aria-invalid="true"], .form-control.is-error { border-color: var(--color-error); }
250
+ .form-control.is-success { border-color: var(--color-success); }
251
+ .field-error { color: var(--color-error); font-size: .9rem; font-weight: 600; } /* invalid state */
252
+ .field-success { color: var(--color-success); font-size: .9rem; font-weight: 600; } /* success state */
253
+
254
+ /* --- 11. Trust / social-proof component slots (v1.1) -------------------- */
255
+ /* IMPORTANT: content is placeholder / needs-review. Never ship fabricated
256
+ ratings, testimonials, badges, guarantees, or customer/partner logos —
257
+ source-copy real claims or mark them needs-review. */
258
+ /* Reviews & ratings (e.g. star rating, "G2" / "Capterra" review card) */
259
+ .rating { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; color: var(--ink); }
260
+ .stars { color: var(--gold); letter-spacing: 2px; font-size: 1.05rem; }
261
+ .review-card { background: var(--surface-card); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 16px 18px; }
262
+ /* Testimonial / customer quote */
263
+ .testimonial {
264
+ background: var(--surface-card); border: 1px solid var(--line); border-left: 4px solid var(--teal); border-radius: var(--r-sm); padding: 18px 20px;
265
+ }
266
+ .testimonial blockquote, .testimonial .quote { font-size: 1.02rem; color: var(--ink); }
267
+ .testimonial .cite { margin-top: 10px; font-size: .9rem; color: var(--muted); font-style: normal; }
268
+ /* Trust badge (security / compliance / certification) */
269
+ .trust-badge {
270
+ display: inline-flex; align-items: center; gap: 8px; background: #eef4ff; border: 1px solid var(--line-cool); color: var(--navy); border-radius: 999px;
271
+ padding: 8px 14px; font-size: .9rem; font-weight: 700;
272
+ }
273
+ /* Reassurance callout (guarantee / returns / refund / risk-free) */
274
+ .reassurance {
275
+ display: flex; align-items: center; gap: 10px; background: #f0f8f3; border: 1px solid #d3e9db; border-radius: var(--r-sm); padding: 12px 16px;
276
+ font-weight: 600; color: var(--ink);
277
+ }
278
+ /* Logo strip ("as seen in" / press / customer / partner logos) */
279
+ .logo-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 20px 32px; opacity: .85; }
280
+ .logo-strip .logo { height: 26px; display: inline-flex; align-items: center; color: var(--muted); font-weight: 800; letter-spacing: .04em; }
281
+
282
+ /* --- 12. CTA hierarchy helpers + mobile CTA (v1.1) ---------------------- */
283
+ .cta-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
284
+ .mobile-cta { display: none; } /* sticky primary CTA on small screens (below) */
285
+
286
+ /* --- 13. Responsive foundation ------------------------------------------ */
287
+ @media (max-width: 980px) {
288
+ .foot-grid { grid-template-columns: 1fr 1fr; }
289
+ nav.primary {
290
+ display: none; position: absolute; top: 70px; left: 0; right: 0; background: var(--cream); border-bottom: 1px solid var(--line); padding: 12px 24px;
291
+ }
292
+ nav.primary.open { display: block; }
293
+ nav.primary ul { flex-direction: column; align-items: stretch; gap: 0; }
294
+ nav.primary a { min-height: var(--tap); }
295
+ .hamburger { display: inline-flex; align-items: center; justify-content: center; }
296
+ .nav-cta .btn-line { display: none; }
297
+ /* thumb-reachable primary CTA */
298
+ .mobile-cta {
299
+ display: flex; position: sticky; bottom: 0; z-index: 60; gap: 10px; padding: 10px 16px calc(10px + env(safe-area-inset-bottom));
300
+ background: rgba(250, 248, 244, .96); border-top: 1px solid var(--line); backdrop-filter: blur(10px);
301
+ }
302
+ .mobile-cta .btn { flex: 1; }
303
+ }
304
+ @media (prefers-reduced-motion: reduce) {
305
+ *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
306
+ .reveal { opacity: 1; transform: none; }
307
+ .btn.is-loading::after { animation: none; }
308
+ html { scroll-behavior: auto; }
309
+ }
310
+
311
+ /* --- 14. Mobile legibility floor (a11y) --------------------------------- */
312
+ /* On phone/tablet widths, no actionable or body text renders below the 14px
313
+ WCAG legibility minimum. max(0.875rem, 1em) only ever RAISES a size (never
314
+ shrinks below 14px), and !important lets it override page-local type scales
315
+ so no tenant page can opt an element under the floor. Desktop (>768px) keeps
316
+ its tighter editorial scale. Applies to every tenant page via the theme;
317
+ pairs with the >=44px tap targets on .brand / nav / .btn. */
318
+ @media (max-width: 768px) {
319
+ p, li, a, button, input, textarea, select, summary, small {
320
+ font-size: max(0.875rem, 1em) !important;
321
+ }
322
+ }
323
+
324
+ /* --- 15. Dark theme — component overrides (literals not on the token layer) */
325
+ @media (prefers-color-scheme: dark) {
326
+ :root:not([data-theme="light"]) {
327
+ header.site { background: rgba(11, 18, 32, .86); }
328
+ footer.site { background: #0e1728; }
329
+ .eyebrow { background: var(--card); }
330
+ .form-control { background: var(--card); color: var(--ink); }
331
+ .form-control::placeholder { color: #6b7a94; }
332
+ .trust-badge { background: #12233f; color: #d7e6ff; }
333
+ .reassurance { background: #0f2a1e; border-color: #1c4230; }
334
+ .brand img { background: #fff; padding: 4px 10px; border-radius: 8px; }
335
+ @media (max-width: 980px) { nav.primary { background: var(--cream); } }
336
+ /* --navy is a dark ANCHOR (panel bg / heading ink on light surfaces); on a
337
+ dark page it stays dark, so anything using it as heading/link-hover text
338
+ on the page or a card must repoint to --ink (near-white) to stay AA. Its
339
+ use as a background (console, ind-section, btn-navy, cta bands…) is
340
+ untouched — those already pair it with an explicit light text color. */
341
+ h1, h2, .eyebrow, nav.primary a:hover { color: var(--ink); }
342
+ }
343
+ }
344
+ :root[data-theme="dark"] header.site { background: rgba(11, 18, 32, .86); }
345
+ :root[data-theme="dark"] footer.site { background: #0e1728; }
346
+ :root[data-theme="dark"] .eyebrow { background: var(--card); }
347
+ :root[data-theme="dark"] .form-control { background: var(--card); color: var(--ink); }
348
+ :root[data-theme="dark"] .form-control::placeholder { color: #6b7a94; }
349
+ :root[data-theme="dark"] .trust-badge { background: #12233f; color: #d7e6ff; }
350
+ :root[data-theme="dark"] .reassurance { background: #0f2a1e; border-color: #1c4230; }
351
+ :root[data-theme="dark"] .brand img { background: #fff; padding: 4px 10px; border-radius: 8px; }
352
+ :root[data-theme="dark"] h1,
353
+ :root[data-theme="dark"] h2,
354
+ :root[data-theme="dark"] .eyebrow,
355
+ :root[data-theme="dark"] nav.primary a:hover { color: var(--ink); }
356
+ @media (max-width: 980px) {
357
+ :root[data-theme="dark"] nav.primary { background: var(--cream); }
358
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "_vendor": "Token of Trust — corporate/marketing tenant",
3
+ "_note": "PROVISIONAL brand tokens for the non-commerce tenant. Palette + type are a professional B2B/SaaS interpretation (deep navy ink + trust teal accent) since the design reference did not expose CSS. Exact brand hex, fonts, and logo/wordmark asset are NEEDS-REVIEW — see docs/epics/tokenoftrust-site-inventory.md (brand provenance). Wordmark falls back to a text treatment until a licensed logo asset is cleared.",
4
+ "brand": {
5
+ "headerVariant": "light",
6
+ "heroVariant": "light",
7
+ "motion": "full"
8
+ },
9
+ "color": {
10
+ "bg": "#F7F9FC",
11
+ "surface": "#FFFFFF",
12
+ "text": "#0A2540",
13
+ "muted": "#55637A",
14
+ "primary": "#0A2540",
15
+ "primary-contrast": "#FFFFFF",
16
+ "accent": "#0E9F8E",
17
+ "border": "#E3E8EF",
18
+ "success": "#0E9F8E",
19
+ "sale": "#D64545"
20
+ },
21
+ "type": {
22
+ "display": { "family": "Plus Jakarta Sans", "weights": [500, 600, 700, 800] },
23
+ "body": { "family": "Inter", "weights": [400, 500, 600] },
24
+ "mono": { "family": "JetBrains Mono", "weights": [400, 500] },
25
+ "scale": 1.2,
26
+ "tracking": "-0.018em"
27
+ },
28
+ "shape": {
29
+ "radius": { "sm": "4px", "md": "8px", "lg": "16px", "full": "999px" }
30
+ }
31
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "strict": true,
8
+ "noUncheckedIndexedAccess": true,
9
+ "noImplicitOverride": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true,
13
+ "forceConsistentCasingInFileNames": true,
14
+ "verbatimModuleSyntax": true,
15
+ "isolatedModules": true,
16
+ "declaration": true,
17
+ "declarationMap": true,
18
+ "sourceMap": true
19
+ }
20
+ }