@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,109 @@
1
+ {
2
+ "id": "bigd-navy",
3
+ "role": "current",
4
+ "name": "Big D Vapor — Navy",
5
+ "description": "Faithful T0 clone of bigdvapor.com's Shopify theme: royal navy (#0030a0) on white with a red sale accent. Poppins display over Inter body. Token values mirror themes/bigd-navy.css so this guide re-skins the standard commerce + chrome components in-brand.",
6
+ "source": "bigdvapor.com (Shopify) reconstruction",
7
+ "stylesheet": "/tenants/bigdvapor/themes/bigd-navy.css",
8
+ "concept": { "id": "bigd-navy", "version": "1.0.0", "baseline": "1.0.0" },
9
+ "status": "approved",
10
+ "claimsPolicy": "Ratings, testimonials, badges, and guarantees in this guide are PLACEHOLDER / needs-review — never ship fabricated proof for Big D Vapor.",
11
+ "storyboard": {
12
+ "status": "draft",
13
+ "summary": "bigd-navy: royal navy (#0030a0) on white, red sale accent — a faithful clone of bigdvapor.com's Shopify theme. The home page defines the brand system + chrome; the subpages define editorial-split and contact-conversion patterns. This is the contract every remaining bigdvapor page follows.",
14
+ "inspirationPages": [
15
+ {
16
+ "slug": "/",
17
+ "role": "brand-system-and-chrome",
18
+ "captures": [
19
+ "brand arrival: navy full-color wordmark on white",
20
+ "chrome: FDA warning bar + red scrolling shipping marquee + utility nav",
21
+ "sticky header: logo + search + account + cart-count; mega-nav with NEW badge and carets",
22
+ "two-up hero, 3 promo cards, icon category tiles",
23
+ "footer: columns + newsletter + payment badges + compliance line"
24
+ ]
25
+ },
26
+ {
27
+ "slug": "/pages/about-us",
28
+ "role": "editorial-split",
29
+ "captures": [
30
+ "page-hero image overlay heading",
31
+ "alternating story/mission/service split sections (copy + real photo)",
32
+ "trusted-brands + find-your-favorite category sections"
33
+ ]
34
+ },
35
+ {
36
+ "slug": "/pages/contact-us",
37
+ "role": "contact-conversion",
38
+ "captures": [
39
+ "page hero + intro",
40
+ "contact-info blocks (call / email / Dallas TX)",
41
+ "contact form (name / email / phone / comment)"
42
+ ]
43
+ }
44
+ ]
45
+ },
46
+ "preview": {
47
+ "componentVars": {
48
+ "--color-bg": "#ffffff",
49
+ "--color-surface": "#f4f7fc",
50
+ "--color-text": "#14181f",
51
+ "--color-muted": "#5a6472",
52
+ "--color-primary": "#0030a0",
53
+ "--color-primary-contrast": "#ffffff",
54
+ "--color-accent": "#0030a0",
55
+ "--color-border": "#e2e8f2",
56
+ "--color-success": "#1f8a4c",
57
+ "--color-sale": "#d81f2a",
58
+ "--radius-sm": "6px",
59
+ "--radius-md": "10px",
60
+ "--radius-lg": "16px",
61
+ "--radius-full": "999px",
62
+ "--shadow-sm": "0 1px 2px rgba(16,26,64,.06), 0 1px 3px rgba(16,26,64,.08)",
63
+ "--shadow-md": "0 6px 18px rgba(16,26,64,.10)",
64
+ "--shadow-lg": "0 18px 48px rgba(16,26,64,.16)",
65
+ "--container-max": "1240px",
66
+ "--font-display": "\"Poppins\", system-ui, -apple-system, Segoe UI, Roboto, sans-serif",
67
+ "--font-body": "\"Inter\", system-ui, -apple-system, Segoe UI, Roboto, sans-serif",
68
+ "--font-mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace"
69
+ }
70
+ },
71
+ "tokens": {
72
+ "color": [
73
+ { "name": "navy", "var": "--navy", "value": "#0030a0", "role": "Primary brand · buttons, sticky header, focus outline" },
74
+ { "name": "navy-dark", "var": "--navy-dark", "value": "#002478", "role": "Navy hover / pressed on primary" },
75
+ { "name": "navy-ink", "var": "--navy-ink", "value": "#001a5c", "role": "Deep navy · footer & dark sections background" },
76
+ { "name": "ink", "var": "--ink", "value": "#14181f", "role": "Body text · headings" },
77
+ { "name": "muted", "var": "--muted", "value": "#5a6472", "role": "Secondary text · muted" },
78
+ { "name": "sale", "var": "--sale", "value": "#d81f2a", "role": "Sale / clearance price accent" },
79
+ { "name": "ok", "var": "--ok", "value": "#1f8a4c", "role": "In-stock / availability accent (mkt.css)" },
80
+ { "name": "bg", "var": "--bg", "value": "#ffffff", "role": "Page background (white)" },
81
+ { "name": "surface", "var": "--surface", "value": "#f4f7fc", "role": "Raised surface / section tint" },
82
+ { "name": "surface-2", "var": "--surface-2", "value": "#eaf0fb", "role": "Deeper surface / hover fill" },
83
+ { "name": "border", "var": "--border", "value": "#e2e8f2", "role": "Hairline border / dividers" }
84
+ ],
85
+ "type": {
86
+ "sans": "\"Inter\", system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif",
87
+ "display": "\"Poppins\", var(--font-body)",
88
+ "mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
89
+ "scale": [
90
+ { "name": "h1", "value": "clamp(2rem, 4.6vw, 3.15rem)", "weight": 700 },
91
+ { "name": "h2", "value": "clamp(1.6rem, 3.2vw, 2.35rem)", "weight": 700 },
92
+ { "name": "h3", "value": "1.2rem", "weight": 700 },
93
+ { "name": "body", "value": "1rem (16px min)", "weight": 400 },
94
+ { "name": "small", "value": "0.875rem (14px floor)", "weight": 400 }
95
+ ]
96
+ },
97
+ "space": [
98
+ { "name": "s1", "value": "8px" }, { "name": "s2", "value": "16px" }, { "name": "s3", "value": "24px" },
99
+ { "name": "s4", "value": "40px" }, { "name": "s5", "value": "64px" }, { "name": "s6", "value": "96px" }
100
+ ],
101
+ "shape": [
102
+ { "name": "radius-sm", "var": "--radius-sm", "value": "6px" },
103
+ { "name": "radius", "var": "--radius", "value": "10px" },
104
+ { "name": "radius-lg", "var": "--radius-lg", "value": "16px" },
105
+ { "name": "shadow", "var": "--shadow-md", "value": "0 6px 18px rgba(16,26,64,.10)" },
106
+ { "name": "tap-target", "var": "--tap", "value": "44px" }
107
+ ]
108
+ }
109
+ }
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 294 294" height="294" width="294">
2
+ <mask height="294" width="294" y="0" x="0" maskUnits="userSpaceOnUse" style="mask-type:alpha" id="mask0_217_297">
3
+ <rect fill="#D9D9D9" height="294" width="294"></rect>
4
+ </mask>
5
+ <g mask="url(#mask0_217_297)">
6
+ </g>
7
+ <g clip-path="url(#clip0_217_297)">
8
+ <path fill="#E0E0E0" d="M175.684 90.332H106.789C98.1385 90.332 91.1316 97.376 91.1316 106.073V213.11C91.1316 221.807 98.1385 228.851 106.789 228.851H175.684C184.335 228.851 191.342 221.807 191.342 213.11V106.073C191.342 97.376 184.335 90.332 175.684 90.332Z"></path>
9
+ <path fill="#F5F5F5" d="M175.684 90.332C184.335 90.332 191.342 97.376 191.342 106.073V191.073H122.447C115.519 191.073 109.921 185.445 109.921 178.48V90.332H175.684Z"></path>
10
+ <path fill="#161AC4" d="M191.342 115.52H91.1316V203.668H191.342V115.52Z"></path>
11
+ <path fill="#367AFF" d="M109.921 178.482V115.52H191.342V191.075H122.447C115.519 191.075 109.921 185.448 109.921 178.482Z"></path>
12
+ <path fill="#E0E0E0" d="M175.684 65.1484H150.632L149.457 90.3336H175.684V65.1484Z"></path>
13
+ <path fill="#E0E0E0" d="M191.342 172.184H197.605C201.05 172.184 203.868 175.017 203.868 178.48V191.072C203.868 194.535 201.05 197.369 197.605 197.369H191.342V172.184Z"></path>
14
+ <path fill="#F41C35" d="M128.711 134.406L138.105 150.147H122.447L150.632 184.777L144.368 162.74H160.026L144.368 134.406H128.711Z"></path>
15
+ <path fill="black" d="M175.684 62C177.407 62 178.816 63.4167 178.816 65.1481V87.4606C187.858 88.9954 194.474 96.8657 194.474 106.074V169.037H197.605C202.812 169.037 207 173.248 207 178.481V191.074C207 196.308 202.812 200.519 197.605 200.519H194.474V213.111C194.474 223.539 186.058 232 175.684 232H106.789C96.4161 232 88 223.539 88 213.111V106.074C88 95.6458 96.4161 87.1852 106.789 87.1852H147.5V65.1481C147.5 63.4167 148.909 62 150.632 62M147.5 87.1852V68.2963H153.763V87.1852H147.5ZM153.763 68.2963V87.1852H160.026V68.2963H153.763ZM166.289 68.2963V87.1852H172.553V68.2963H166.289ZM175.684 93.4815H106.789C99.8609 93.4815 94.2632 99.1088 94.2632 106.074V112.37H188.211V106.074C188.211 99.1088 182.613 93.4815 175.684 93.4815ZM94.2632 118.667V200.519H188.211V118.667H94.2632ZM197.605 194.222C199.328 194.222 200.737 192.806 200.737 191.074V178.481C200.737 176.75 199.328 175.333 197.605 175.333H194.474V194.222H197.605ZM106.789 225.704H175.684C182.613 225.704 188.211 220.076 188.211 213.111V206.815H94.2632V213.111C94.2632 220.076 99.8609 225.704 106.789 225.704Z"></path>
16
+ <path fill="black" d="M162.727 164.353C162.179 165.297 161.122 165.887 160.026 165.887H148.518L153.646 183.911C154.115 185.563 153.137 187.334 151.493 187.806C150.279 188.161 148.988 187.728 148.205 186.783L120.02 152.154C118.924 150.816 119.12 148.809 120.451 147.707C120.999 147.235 121.704 146.999 122.447 146.999H132.586L126.049 136.019C125.148 134.524 125.657 132.596 127.106 131.691C127.575 131.415 128.163 131.258 128.711 131.258H144.368C145.504 131.258 146.561 131.887 147.109 132.871L162.766 161.205C163.315 162.188 163.275 163.369 162.727 164.353ZM142.529 137.554H134.23L140.767 148.533C141.667 150.029 141.159 151.957 139.71 152.862C139.24 153.137 138.653 153.295 138.105 153.295H129.063L143.468 171.003L141.354 163.605C140.885 161.952 141.824 160.181 143.507 159.709C143.781 159.631 144.055 159.591 144.368 159.591H154.703L142.529 137.554Z"></path>
17
+ </g>
18
+ <defs>
19
+ <clipPath id="clip0_217_297">
20
+ <rect transform="matrix(-1 0 0 1 207 62)" fill="white" height="170" width="119"></rect>
21
+ </clipPath>
22
+ </defs>
23
+ </svg>
@@ -0,0 +1,118 @@
1
+ /* ============================================================================
2
+ Big D Vapor — home page (pixel clone of www.bigdvapor.com, above-the-fold).
3
+ Section order + chrome mirror the live Shopify theme. Shared base in
4
+ themes/bigd-navy.css + pages/mkt.css. See playbook/site-migration/page-port.md §3.
5
+ ========================================================================== */
6
+
7
+ /* --- Hero: TWO-UP (banner + promo tile), no overlay text ------------------ */
8
+ .hero2 { padding-block: clamp(16px, 2vw, 24px); }
9
+ .hero2 .container { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; }
10
+ .hero2 a { display: block; border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); }
11
+ .hero2 img { width: 100%; height: clamp(260px, 34vw, 420px); object-fit: cover; }
12
+ .hero2 .promo-tile { background: linear-gradient(135deg, #0b1020, var(--navy-ink)); }
13
+
14
+ /* --- 3 promo cards -------------------------------------------------------- */
15
+ .promos { padding-block: clamp(12px, 2vw, 20px); }
16
+ .promos .container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
17
+ .promo-card {
18
+ position: relative; min-height: 240px; border-radius: var(--radius-lg); overflow: hidden;
19
+ display: flex; flex-direction: column; justify-content: flex-start; padding: 28px; color: #fff;
20
+ }
21
+ .promo-card--blue { background: linear-gradient(160deg, #1466ff, var(--navy)); }
22
+ .promo-card--red { background: linear-gradient(160deg, #ff3b46, var(--sale)); }
23
+ .promo-card--img { background: #10131c; padding: 0; }
24
+ .promo-card--img img { width: 100%; height: 100%; object-fit: cover; }
25
+ .promo-card h3 { color: #fff; font-size: 1.7rem; }
26
+ .promo-card p { color: rgba(255,255,255,.88); margin-top: 4px; font-weight: 500; }
27
+ .promo-card .link { margin-top: 14px; font-family: var(--font-display); font-weight: 700; color: #fff; }
28
+ .promo-card .link::after { content: " ›"; }
29
+
30
+ /* --- Categories (icon cards, light-blue) ---------------------------------- */
31
+ .cats { padding-block: clamp(2rem, 4vw, 3.5rem); }
32
+ .cats h2 { text-align: center; margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
33
+ .cats .grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: clamp(12px, 1.6vw, 20px); }
34
+ .cat-icon-card {
35
+ display: flex; flex-direction: column; align-items: center; gap: 16px;
36
+ background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
37
+ padding: 26px 16px; text-align: center; transition: transform .14s, box-shadow .14s;
38
+ }
39
+ .cat-icon-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
40
+ .cat-icon-card .ico {
41
+ width: 92px; height: 92px; border-radius: 18px; background: var(--surface-2);
42
+ display: grid; place-items: center;
43
+ }
44
+ .cat-icon-card .ico svg { width: 52px; height: 52px; stroke: var(--navy); fill: none; stroke-width: 1.6; }
45
+ .cat-icon-card span { font-family: var(--font-display); font-weight: 700; color: var(--ink); }
46
+
47
+ /* --- Responsive ----------------------------------------------------------- */
48
+ @media (max-width: 900px) {
49
+ .hero2 .container { grid-template-columns: 1fr; }
50
+ .hero2 .promo-tile { display: none; }
51
+ .promos .container { grid-template-columns: 1fr; }
52
+ .cats .grid { grid-template-columns: repeat(3, 1fr); }
53
+ }
54
+ @media (max-width: 560px) {
55
+ .cats .grid { grid-template-columns: repeat(2, 1fr); }
56
+ }
57
+
58
+ /* --- Footer newsletter ---------------------------------------------------- */
59
+ .footer-news { display: flex; gap: 8px; margin-top: 12px; max-width: 320px; }
60
+ .footer-news input { flex: 1; border: 1px solid rgba(255,255,255,.3); background: transparent; color: #fff; border-radius: 999px; padding: 10px 16px; font-size: .9rem; }
61
+ .footer-news input::placeholder { color: #a9b8e6; }
62
+ .footer-news button { background: #fff; color: var(--navy-ink); border: 0; border-radius: 999px; width: 42px; font-size: 1.1rem; font-weight: 700; cursor: pointer; }
63
+ .footer-col > p { color: #a9b8e6; font-size: .88rem; margin-top: 4px; }
64
+
65
+ /* --- Payment badges ------------------------------------------------------- */
66
+ .pay-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
67
+ .pay-badges span { background: #fff; color: var(--navy-ink); font-size: .62rem; font-weight: 800; letter-spacing: .03em; padding: 6px 9px; border-radius: 5px; }
68
+
69
+ /* --- Product carousel (real catalog snapshot) ----------------------------- */
70
+ .shelf .sec-head { margin-bottom: 1.25rem; }
71
+ .pcarousel {
72
+ display: grid; grid-auto-flow: column; grid-auto-columns: minmax(200px, 1fr);
73
+ gap: clamp(12px, 1.6vw, 20px); overflow-x: auto; scroll-snap-type: x mandatory;
74
+ padding-bottom: 12px; scrollbar-width: thin;
75
+ }
76
+ .pcard { scroll-snap-align: start; }
77
+ .pcard a { display: block; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; transition: transform .14s, box-shadow .14s, border-color .14s; }
78
+ .pcard a:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
79
+ .pcard__media { aspect-ratio: 1/1; background: var(--surface); display: grid; place-items: center; }
80
+ .pcard__media img { width: 100%; height: 100%; object-fit: contain; padding: 10px; }
81
+ .pcard__vendor { font-family: var(--font-display); font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); padding: 12px 14px 0; }
82
+ .pcard__title { font-family: var(--font-body); font-size: .9rem; font-weight: 600; line-height: 1.3; color: var(--ink); padding: 2px 14px 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
83
+ .pcard__price { font-family: var(--font-display); font-weight: 700; color: var(--navy); padding: 6px 14px 14px; }
84
+ .pcard__was { color: var(--muted); font-weight: 500; text-decoration: line-through; margin-right: 4px; }
85
+
86
+ /* --- Staff's Pick spotlight ----------------------------------------------- */
87
+ .spotlight { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(20px, 4vw, 48px); align-items: center; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; }
88
+ .spotlight:hover { box-shadow: var(--shadow-md); }
89
+ .spotlight__media { aspect-ratio: 4/3; background: var(--surface); display: grid; place-items: center; }
90
+ .spotlight__media img { width: 100%; height: 100%; object-fit: contain; padding: 24px; }
91
+ .spotlight__body { padding: clamp(20px, 4vw, 40px) clamp(20px, 4vw, 40px) clamp(20px, 4vw, 40px) 0; }
92
+ .spotlight__body h3 { font-size: clamp(1.3rem, 2.6vw, 1.9rem); margin: 4px 0 10px; }
93
+ .spotlight__price { font-family: var(--font-display); font-weight: 700; font-size: 1.3rem; color: var(--navy); margin-bottom: 1.2rem; }
94
+
95
+ /* --- Shop by Brands grid -------------------------------------------------- */
96
+ .brandgrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: clamp(10px, 1.4vw, 16px); }
97
+ .brandtile { display: grid; place-items: center; background: #fff; border: 1px solid var(--border); border-radius: var(--radius); min-height: 96px; padding: 14px; transition: transform .14s, box-shadow .14s, border-color .14s; }
98
+ .brandtile:hover { transform: translateY(-3px); box-shadow: var(--shadow-sm); border-color: var(--surface-2); }
99
+ .brandtile img { max-height: 56px; max-width: 100%; object-fit: contain; }
100
+
101
+ /* --- Blog cards ----------------------------------------------------------- */
102
+ .bloggrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 24px); }
103
+ .blogcard { display: flex; flex-direction: column; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; transition: transform .14s, box-shadow .14s; }
104
+ .blogcard:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
105
+ .blogcard__media { aspect-ratio: 16/9; background: linear-gradient(135deg, var(--surface-2), var(--surface)); }
106
+ .blogcard h3 { font-size: 1.02rem; line-height: 1.35; padding: 16px 18px 0; color: var(--ink); }
107
+ .blogcard .link-more { padding: 10px 18px 18px; }
108
+
109
+ .center { text-align: center; }
110
+
111
+ @media (max-width: 900px) {
112
+ .spotlight { grid-template-columns: 1fr; }
113
+ .spotlight__media { aspect-ratio: 16/10; }
114
+ .spotlight__body { padding: 0 24px 28px; }
115
+ .brandgrid { grid-template-columns: repeat(4, 1fr); }
116
+ .bloggrid { grid-template-columns: 1fr; }
117
+ }
118
+ @media (max-width: 560px) { .brandgrid { grid-template-columns: repeat(3, 1fr); } }
@@ -0,0 +1,185 @@
1
+ /* ============================================================================
2
+ Big D Vapor — shared marketing component layer (mkt.css)
3
+ Reused across home + all marketing pages: layout, buttons, header/nav,
4
+ footer, section headers, tile + category grids, compliance strip.
5
+ Depends on tokens from themes/bigd-navy.css.
6
+ ========================================================================== */
7
+
8
+ /* --- Layout --------------------------------------------------------------- */
9
+ .container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: clamp(16px, 4vw, 40px); }
10
+ .section { padding-block: clamp(2.5rem, 6vw, 4.5rem); }
11
+ .section--tight { padding-block: clamp(1.75rem, 4vw, 3rem); }
12
+ .section--surface { background: var(--surface); }
13
+
14
+ /* --- Buttons -------------------------------------------------------------- */
15
+ .btn {
16
+ display: inline-flex; align-items: center; justify-content: center; gap: .5em;
17
+ font-family: var(--font-display); font-weight: 600; font-size: .95rem;
18
+ padding: .8em 1.6em; border-radius: 999px; border: 2px solid transparent;
19
+ transition: transform .12s ease, background .15s ease, color .15s ease, box-shadow .15s ease;
20
+ }
21
+ .btn:hover { transform: translateY(-1px); }
22
+ .btn-primary { background: var(--navy); color: #fff; }
23
+ .btn-primary:hover { background: var(--navy-dark); box-shadow: var(--shadow-md); }
24
+ .btn-line { border-color: #fff; color: #fff; }
25
+ .btn-line:hover { background: #fff; color: var(--navy); }
26
+ .btn-ghost { border-color: var(--border); color: var(--navy); background: #fff; }
27
+ .btn-ghost:hover { border-color: var(--navy); }
28
+
29
+ /* --- Announcement bar ----------------------------------------------------- */
30
+ .announce {
31
+ background: var(--navy); color: #fff; text-align: center;
32
+ font-size: .85rem; font-weight: 600; letter-spacing: .01em; padding: 9px 16px;
33
+ }
34
+
35
+ /* --- Top utility bar (shared chrome: FDA warning + marquee + utility nav) -- */
36
+ .topbar-warning {
37
+ background: #fff; border-bottom: 1px solid var(--border);
38
+ text-align: center; padding: 10px 16px;
39
+ }
40
+ .topbar-warning p { color: var(--ink); font-weight: 700; font-size: .82rem; letter-spacing: .01em; }
41
+
42
+ .announce-marquee { background: var(--sale); color: #fff; overflow: hidden; }
43
+ .announce-marquee__track {
44
+ display: flex; gap: 3rem; white-space: nowrap; width: max-content;
45
+ padding: 8px 0; font-size: .82rem; font-weight: 600;
46
+ animation: bdv-marquee 22s linear infinite;
47
+ }
48
+ .announce-marquee__track span { padding-inline: 1.5rem; }
49
+ @keyframes bdv-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
50
+ @media (prefers-reduced-motion: reduce) {
51
+ .announce-marquee__track { animation: none; justify-content: center; width: 100%; }
52
+ }
53
+
54
+ .utility-nav { border-bottom: 1px solid var(--border); background: #fff; }
55
+ .utility-nav .container { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-block: 8px; }
56
+ .utility-nav ul { display: flex; gap: 20px; }
57
+ .utility-nav a { font-size: .82rem; font-weight: 600; color: var(--ink); }
58
+ .utility-nav a:hover { color: var(--navy); }
59
+ .utility-nav__right { display: flex; align-items: center; gap: 16px; }
60
+ .utility-nav__right .sel { font-size: .8rem; color: var(--muted); }
61
+ .utility-nav__right .social { display: flex; gap: 12px; }
62
+ .utility-nav__right .social a svg { width: 16px; height: 16px; fill: var(--ink); }
63
+
64
+ /* --- Header / nav --------------------------------------------------------- */
65
+ .site-header { position: sticky; top: 0; z-index: 100; background: #fff; border-bottom: 1px solid var(--border); }
66
+ .header-row { display: flex; align-items: center; gap: clamp(12px, 2.5vw, 32px); padding-block: 14px; }
67
+ .brand img { height: 46px; width: auto; }
68
+ .primary-nav { flex: 1; }
69
+ .primary-nav > ul { display: flex; flex-wrap: wrap; align-items: center; gap: clamp(10px, 1.6vw, 22px); }
70
+ .primary-nav a { font-weight: 600; font-size: .92rem; color: var(--ink); padding: 6px 2px; border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; }
71
+ .primary-nav a:hover { color: var(--navy); border-color: var(--navy); }
72
+ .primary-nav a.is-flag { color: var(--sale); }
73
+ .header-actions { display: flex; align-items: center; gap: 16px; }
74
+ .header-actions a { display: inline-flex; color: var(--ink); }
75
+ .header-actions a:hover { color: var(--navy); }
76
+ .header-actions svg { width: 24px; height: 24px; stroke: currentColor; fill: none; stroke-width: 1.8; }
77
+ .hamburger { display: none; flex-direction: column; gap: 5px; background: none; border: 0; padding: 6px; }
78
+ .hamburger span { width: 26px; height: 2px; background: var(--ink); border-radius: 2px; }
79
+
80
+ /* header search pill + account/cart badge (shared chrome) */
81
+ .site-header .header-row { gap: clamp(12px, 3vw, 40px); }
82
+ .header-search { flex: 1; max-width: 560px; position: relative; }
83
+ .header-search input {
84
+ width: 100%; border: 1px solid var(--border); border-radius: 999px;
85
+ padding: 11px 46px 11px 18px; font-size: .9rem; background: #fff; color: var(--ink);
86
+ }
87
+ .header-search input::placeholder { color: var(--muted); }
88
+ .header-search button { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); background: none; border: 0; padding: 6px; }
89
+ .header-search svg { width: 20px; height: 20px; stroke: var(--navy); fill: none; stroke-width: 2; }
90
+ .header-actions .cart { position: relative; }
91
+ .header-actions .cart .count {
92
+ position: absolute; top: -6px; right: -8px; background: var(--navy); color: #fff;
93
+ font-size: .62rem; font-weight: 700; min-width: 16px; height: 16px; border-radius: 999px;
94
+ display: grid; place-items: center; padding: 0 4px;
95
+ }
96
+
97
+ /* primary nav: NEW badge + dropdown carets + second-row nav bar (shared chrome) */
98
+ .primary-nav a .new-badge {
99
+ display: inline-block; background: var(--sale); color: #fff; font-size: .58rem; font-weight: 800;
100
+ letter-spacing: .06em; padding: 2px 5px; border-radius: 4px; margin-left: 6px; vertical-align: middle;
101
+ }
102
+ .primary-nav a .caret { font-size: .7em; margin-left: 4px; opacity: .7; }
103
+ .primary-nav-bar { border-top: 1px solid var(--border); background: #fff; }
104
+ .primary-nav-bar .container { padding-block: 4px; }
105
+ .primary-nav-bar .primary-nav > ul { gap: clamp(10px, 1.4vw, 20px); }
106
+ .primary-nav-bar .primary-nav a { padding-block: 10px; }
107
+
108
+ /* --- Section headers ------------------------------------------------------ */
109
+ .sec-head { text-align: center; max-width: 62ch; margin: 0 auto clamp(1.5rem, 3vw, 2.5rem); }
110
+ .sec-head .eyebrow { display: inline-block; font-family: var(--font-display); font-weight: 700; font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; color: var(--navy); margin-bottom: .55rem; }
111
+ .sec-head p { margin-top: .7rem; font-size: 1.02rem; }
112
+ .sec-head--between { display: flex; align-items: baseline; justify-content: space-between; text-align: left; max-width: none; gap: 16px; }
113
+ .link-more { font-family: var(--font-display); font-weight: 600; color: var(--navy); white-space: nowrap; }
114
+ .link-more:hover { text-decoration: underline; }
115
+
116
+ /* --- Brand / category tile grid ------------------------------------------- */
117
+ .tile-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(12px, 1.6vw, 20px); }
118
+ .tile {
119
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
120
+ background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
121
+ padding: 26px 18px; min-height: 148px; text-align: center; transition: transform .14s, box-shadow .14s, border-color .14s;
122
+ }
123
+ .tile:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
124
+ .tile img { max-height: 66px; width: auto; object-fit: contain; }
125
+ .tile span { font-family: var(--font-display); font-weight: 600; font-size: .95rem; color: var(--ink); }
126
+
127
+ /* --- Category cards (shop by category) ------------------------------------ */
128
+ .cat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 24px); }
129
+ .cat-card {
130
+ position: relative; display: flex; align-items: flex-end; overflow: hidden;
131
+ min-height: 190px; border-radius: var(--radius-lg); color: #fff;
132
+ background: linear-gradient(135deg, var(--navy), var(--navy-ink));
133
+ padding: 22px; transition: transform .14s, box-shadow .14s;
134
+ }
135
+ .cat-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
136
+ .cat-card::after { content: "→"; position: absolute; top: 20px; right: 22px; font-size: 1.3rem; opacity: .85; }
137
+ .cat-card h3 { color: #fff; font-size: 1.35rem; }
138
+ .cat-card p { color: rgba(255, 255, 255, .82); margin-top: 4px; font-size: .9rem; }
139
+
140
+ /* --- Compliance strip (source-copied legal text; not fabricated) ---------- */
141
+ .compliance-strip { background: var(--surface-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
142
+ .compliance-strip .container { padding-block: 14px; }
143
+ .compliance-strip p { color: var(--navy-ink); font-size: .82rem; font-weight: 600; text-align: center; letter-spacing: .01em; }
144
+
145
+ /* --- Footer --------------------------------------------------------------- */
146
+ .site-footer { background: var(--navy-ink); color: #dbe4fb; padding-block: clamp(2.5rem, 5vw, 4rem) 1.5rem; }
147
+ .footer-grid { display: grid; grid-template-columns: 1.4fr repeat(3, 1fr); gap: clamp(24px, 4vw, 56px); }
148
+ .footer-brand img { height: 40px; filter: brightness(0) invert(1); opacity: .95; }
149
+ .footer-brand p { color: #a9b8e6; margin-top: 14px; font-size: .9rem; max-width: 34ch; }
150
+ .footer-col h4 { color: #fff; font-size: .82rem; letter-spacing: .1em; text-transform: uppercase; margin-bottom: 14px; }
151
+ .footer-col ul { display: flex; flex-direction: column; gap: 9px; }
152
+ .footer-col a { color: #c3cff0; font-size: .92rem; }
153
+ .footer-col a:hover { color: #fff; text-decoration: underline; }
154
+ .footer-warning { margin-top: 34px; padding: 16px 18px; border: 1px solid rgba(255, 255, 255, .22); border-radius: var(--radius); }
155
+ .footer-warning strong { color: #fff; }
156
+ .footer-warning p { color: #c3cff0; font-size: .82rem; }
157
+ .footer-bottom { margin-top: 28px; padding-top: 18px; border-top: 1px solid rgba(255, 255, 255, .16); display: flex; flex-wrap: wrap; gap: 10px 24px; justify-content: space-between; align-items: center; }
158
+ .footer-bottom p, .footer-bottom a { color: #93a4d6; font-size: .82rem; }
159
+
160
+ /* --- Reveal-on-scroll ----------------------------------------------------- */
161
+ .reveal { opacity: 0; transform: translateY(18px); transition: opacity .5s ease, transform .5s ease; }
162
+ .reveal.in { opacity: 1; transform: none; }
163
+
164
+ /* --- Responsive ----------------------------------------------------------- */
165
+ @media (max-width: 900px) {
166
+ .header-search { order: 3; flex-basis: 100%; max-width: none; }
167
+ .utility-nav ul { gap: 12px; }
168
+ }
169
+ @media (max-width: 1000px) {
170
+ .tile-grid { grid-template-columns: repeat(3, 1fr); }
171
+ }
172
+ @media (max-width: 860px) {
173
+ .primary-nav { position: fixed; inset: 0 0 0 auto; width: min(80vw, 320px); background: #fff; box-shadow: var(--shadow-lg); transform: translateX(100%); transition: transform .25s ease; padding: 80px 24px 24px; overflow-y: auto; }
174
+ .primary-nav.open { transform: none; }
175
+ .primary-nav > ul { flex-direction: column; align-items: stretch; gap: 4px; }
176
+ .primary-nav a { display: block; padding: 12px 4px; border-bottom: 1px solid var(--border); }
177
+ .hamburger { display: flex; }
178
+ .cat-grid { grid-template-columns: 1fr 1fr; }
179
+ .footer-grid { grid-template-columns: 1fr 1fr; }
180
+ }
181
+ @media (max-width: 560px) {
182
+ .tile-grid { grid-template-columns: repeat(2, 1fr); }
183
+ .cat-grid { grid-template-columns: 1fr; }
184
+ .footer-grid { grid-template-columns: 1fr; }
185
+ }