@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,233 @@
1
+ {
2
+ "seoTitle": "Token of Trust — Customer verification & compliance for regulated ecommerce",
3
+ "seoDescription": "Verify real customers, block risky transactions, and keep audit-ready evidence — identity, age assurance, fraud prevention, and compliance in one checkout-ready platform.",
4
+ "blocks": [
5
+ {
6
+ "component": "marketing_hero",
7
+ "eyebrow": "Welcome real customers. Wave goodbye to fraud.",
8
+ "headline": "Built for regulated ecommerce",
9
+ "subhead": "Customer verification and compliance for regulated ecommerce",
10
+ "body": "Verify real customers, block risky transactions, and keep audit-ready evidence — without adding unnecessary friction to checkout.",
11
+ "trust": ["200+ countries", "Privacy-first verification", "Audit-ready logs"],
12
+ "ctas": [
13
+ { "label": "Start For Free", "href": "https://app.tokenoftrust.com", "variant": "primary" },
14
+ { "label": "Book Demo", "href": "https://tokenoftrust.com/contact/", "variant": "secondary" }
15
+ ],
16
+ "panel": {
17
+ "title": "Compliance console · evidence logging",
18
+ "lines": [
19
+ "Order #1042 — checkout continues",
20
+ "Identity verified — gov ID + selfie (1.9s)",
21
+ "Age 21+ confirmed (0.6s)",
22
+ "Order #1044 flagged — manual review (risk 0.91)",
23
+ "Evidence logged — decision record saved"
24
+ ]
25
+ }
26
+ },
27
+ {
28
+ "component": "trust_bar",
29
+ "items": [
30
+ "200+ countries",
31
+ "GDPR · CCPA · PIPEDA",
32
+ "256-bit SSL",
33
+ "4.9/5 on G2",
34
+ "4.5/5 on Capterra",
35
+ "Shopify · WooCommerce · BigCommerce · Magento",
36
+ "REST API"
37
+ ]
38
+ },
39
+ {
40
+ "component": "split_compare",
41
+ "eyebrow": "The problem",
42
+ "title": "Approving one customer shouldn't take five tools and a spreadsheet",
43
+ "subhead": "Compliance for regulated ecommerce is fragmented across vendors, plugins, and manual queues. Token of Trust brings it into one checkout-ready platform.",
44
+ "before": {
45
+ "title": "Today's patchwork",
46
+ "items": [
47
+ "ID verification vendor",
48
+ "Age gate plugin",
49
+ "Fraud tool",
50
+ "Manual review queue",
51
+ "Compliance spreadsheet",
52
+ "Tax workflow",
53
+ "PACT Act process",
54
+ "Audit evidence folder"
55
+ ]
56
+ },
57
+ "after": {
58
+ "title": "One checkout-ready platform",
59
+ "items": [
60
+ "Identity & age verification",
61
+ "Fraud & risk checks",
62
+ "AML, PACT Act & tax workflows",
63
+ "Manual review in one queue",
64
+ "Audit evidence logged automatically"
65
+ ]
66
+ }
67
+ },
68
+ {
69
+ "component": "steps",
70
+ "eyebrow": "Customer experience",
71
+ "title": "Verification that feels like a welcome, not a checkpoint",
72
+ "subhead": "Most customers never see a check. Risk is assessed quietly, and only flagged orders slow down.",
73
+ "steps": [
74
+ { "icon": "🛒", "label": "Checkout starts" },
75
+ { "icon": "🤫", "label": "Risk assessed quietly" },
76
+ { "icon": "🪪", "label": "Verify only if needed" },
77
+ { "icon": "✅", "label": "Good customers approved" },
78
+ { "icon": "🚩", "label": "Risk flagged" },
79
+ { "icon": "🗂️", "label": "Evidence logged" },
80
+ { "icon": "🎉", "label": "Purchase continues" }
81
+ ]
82
+ },
83
+ {
84
+ "component": "card_grid",
85
+ "anchor": "platform",
86
+ "eyebrow": "Platform",
87
+ "title": "Everything you need to approve a customer, in one place",
88
+ "subhead": "Four core capabilities, working from one set of records.",
89
+ "variant": "capability",
90
+ "cards": [
91
+ {
92
+ "icon": "🪪",
93
+ "title": "Identity Verification",
94
+ "body": "Confirm who's buying with government ID, selfie match, and data checks.",
95
+ "meta": "Account opening · high-value orders · regulated purchases"
96
+ },
97
+ {
98
+ "icon": "🔞",
99
+ "title": "Age Assurance",
100
+ "body": "Verify age-restricted buyers without a heavy-handed flow.",
101
+ "meta": "Alcohol · tobacco & vape · age-restricted goods"
102
+ },
103
+ {
104
+ "icon": "🛡️",
105
+ "title": "Fraud Prevention",
106
+ "body": "Spot risky behavior before chargebacks, abuse, or regulatory exposure.",
107
+ "meta": "Checkout risk scoring · fake accounts · chargeback defense"
108
+ },
109
+ {
110
+ "icon": "🗂️",
111
+ "title": "Compliance Evidence & Audit Logs",
112
+ "body": "Keep decision records, verification events, and review history ready.",
113
+ "meta": "Regulator requests · internal audits · dispute evidence"
114
+ }
115
+ ],
116
+ "footnote": "Plus AML screening · PACT Act compliance · sales / VAT / excise tax · a single manual review queue."
117
+ },
118
+ {
119
+ "component": "card_grid",
120
+ "anchor": "industries",
121
+ "eyebrow": "Industries",
122
+ "title": "Built for ecommerce businesses where every transaction carries compliance risk",
123
+ "subhead": "If a regulator, card network, or state law cares about who your customer is, Token of Trust fits.",
124
+ "variant": "industry",
125
+ "cards": [
126
+ { "icon": "🍷", "title": "Alcohol", "body": "Confirm legal drinking age with state-compliant records." },
127
+ { "icon": "💨", "title": "Tobacco & Vape", "body": "Age verification plus PACT Act registration, reporting, and excise tax." },
128
+ { "icon": "🔞", "title": "Age-Restricted Goods", "body": "Knives, CBD, lottery, gaming, and other 18+/21+ products." },
129
+ { "icon": "🏪", "title": "Marketplaces", "body": "Verify regulated sellers and buyers per account." },
130
+ { "icon": "🏦", "title": "Financial Services-Adjacent", "body": "KYC-grade identity checks and AML screening." },
131
+ { "icon": "⚠️", "title": "High-Risk Ecommerce", "body": "High-value or fraud-targeted catalogs." }
132
+ ]
133
+ },
134
+ {
135
+ "component": "integrations",
136
+ "eyebrow": "Implementation",
137
+ "title": "Fits the store you already run",
138
+ "subhead": "Drop Token of Trust into your existing platform, or call the API directly at the moments that matter.",
139
+ "platforms": [
140
+ { "label": "Shopify" },
141
+ { "label": "WooCommerce" },
142
+ { "label": "BigCommerce" },
143
+ { "label": "Magento" },
144
+ { "label": "WordPress" },
145
+ { "label": "NetSuite" },
146
+ { "label": "REST API", "href": "https://help.tokenoftrust.com" }
147
+ ],
148
+ "points": ["Checkout", "Account creation", "Manual review", "Post-purchase"],
149
+ "code": {
150
+ "language": "javascript",
151
+ "caption": "Create a verification (server-side)",
152
+ "code": "const v = await tot.verifications.create({\n type: \"checkout\",\n checks: [\"government_id\", \"age_21_plus\", \"aml_screen\"]\n});\n// => { status: \"approved\", evidence_id: \"ev_8841\" }"
153
+ }
154
+ },
155
+ {
156
+ "component": "proof_strip",
157
+ "eyebrow": "Data privacy",
158
+ "title": "We will never sell your data. Ever.",
159
+ "body": "We treat customer identity as something to protect, not monetize. We minimize what we collect and encrypt what we keep.",
160
+ "items": [
161
+ "Data minimization",
162
+ "256-bit SSL encryption",
163
+ "Compliance-ready storage",
164
+ "Customer consent & respect",
165
+ "GDPR · CCPA · PIPEDA",
166
+ "Audit-ready evidence"
167
+ ]
168
+ },
169
+ {
170
+ "component": "testimonials",
171
+ "eyebrow": "Outcomes",
172
+ "title": "What regulated merchants actually get",
173
+ "quotes": [
174
+ {
175
+ "stat": "−80%",
176
+ "quote": "Manual reviews dropped from hours a day to a short queue. One platform replaced three vendors and our compliance spreadsheet.",
177
+ "attribution": "Compliance lead, multi-state vape retailer"
178
+ },
179
+ {
180
+ "stat": "Conversion held",
181
+ "quote": "We were terrified age checks would tank checkout. Most customers never see one — flagged orders go to review, everyone else sails through.",
182
+ "attribution": "Ecommerce director, online alcohol marketplace"
183
+ },
184
+ {
185
+ "stat": "Audit in minutes",
186
+ "quote": "When the regulator asked for records, we exported the evidence log and were done. It used to take a week of digging across systems.",
187
+ "attribution": "COO, regulated goods brand"
188
+ }
189
+ ],
190
+ "ratings": ["4.9/5 on G2", "4.5/5 on Capterra"]
191
+ },
192
+ {
193
+ "component": "faq",
194
+ "eyebrow": "FAQ",
195
+ "title": "Questions regulated merchants ask us",
196
+ "items": [
197
+ {
198
+ "q": "How does Token of Trust reduce checkout friction?",
199
+ "a": "Risk is assessed quietly in the background. Most customers are approved without ever seeing a check — only flagged orders are routed to manual review, so good customers keep moving."
200
+ },
201
+ {
202
+ "q": "Can it support age-restricted products?",
203
+ "a": "Yes. Age assurance verifies age-restricted buyers — alcohol, tobacco and vape, and other 18+/21+ goods — with state-compliant records, plus PACT Act workflows where they apply."
204
+ },
205
+ {
206
+ "q": "What ecommerce platforms does it integrate with?",
207
+ "a": "Shopify, WooCommerce, BigCommerce, Magento, WordPress, and NetSuite, plus a REST API you can call directly at checkout, account creation, manual review, and post-purchase."
208
+ },
209
+ {
210
+ "q": "Can it support custom compliance workflows?",
211
+ "a": "Yes. Identity, age, fraud, AML, PACT Act, and tax workflows run from one set of records, and manual review lives in a single queue you can tailor to your process."
212
+ },
213
+ {
214
+ "q": "What evidence is stored for audits?",
215
+ "a": "Decision records, verification events, and review history are logged automatically, so you can export audit-ready evidence for regulator requests, internal audits, and disputes."
216
+ },
217
+ {
218
+ "q": "How does Token of Trust protect customer data?",
219
+ "a": "We minimize what we collect, encrypt what we keep with 256-bit SSL, store it in a compliance-ready way, and never sell it. Handling is aligned to GDPR, CCPA, and PIPEDA."
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "component": "cta_band",
225
+ "title": "Verify customers. Reduce risk. Keep checkout moving.",
226
+ "subhead": "Start free in minutes — no credit card required. Or book a demo to see it on your store.",
227
+ "ctas": [
228
+ { "label": "Start For Free", "href": "https://app.tokenoftrust.com", "variant": "primary" },
229
+ { "label": "Book Demo", "href": "https://tokenoftrust.com/contact/", "variant": "secondary" }
230
+ ]
231
+ }
232
+ ]
233
+ }
@@ -0,0 +1,231 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <link rel="icon" type="image/png" href="/tenants/tokenoftrust/favicon.png">
7
+ <title>Careers — Token of Trust | Build with us</title>
8
+ <meta name="description" content="Join Token of Trust and shape the future of identity verification. We're designers, engineers, and business minds building trust in an online world.">
9
+ <link rel="canonical" href="https://tokenoftrust.com/careers/">
10
+ <meta name="robots" content="index,follow,max-image-preview:large">
11
+ <meta property="og:type" content="website">
12
+ <meta property="og:site_name" content="Token of Trust">
13
+ <meta property="og:title" content="Careers — Token of Trust">
14
+ <meta property="og:description" content="Join Token of Trust and shape the future of identity verification. We're designers, engineers, and business minds building trust in an online world.">
15
+ <meta property="og:url" content="https://tokenoftrust.com/careers/">
16
+ <meta name="twitter:card" content="summary_large_image">
17
+ <meta name="twitter:title" content="Careers — Token of Trust">
18
+ <meta name="twitter:description" content="Build the platform changing how people share identity and establish trust online.">
19
+ <script type="application/ld+json">
20
+ {
21
+ "@context": "https://schema.org",
22
+ "@graph": [
23
+ {
24
+ "@type": "Organization",
25
+ "@id": "https://tokenoftrust.com/#org",
26
+ "name": "Token of Trust",
27
+ "url": "https://tokenoftrust.com/",
28
+ "logo": "/tenants/tokenoftrust/logo-icon.png",
29
+ "slogan": "Real Customers. Less Fraud. More Trust."
30
+ },
31
+ {
32
+ "@type": "WebPage",
33
+ "name": "Careers — Token of Trust",
34
+ "url": "https://tokenoftrust.com/careers/"
35
+ }
36
+ ]
37
+ }
38
+ </script>
39
+ <link rel="stylesheet" href="/tenants/tokenoftrust/themes/tot-navy.css">
40
+ <link rel="stylesheet" href="/tenants/tokenoftrust/pages/mkt.css">
41
+ </head>
42
+ <body>
43
+ <a class="skip-link" href="#main">Skip to main content</a>
44
+
45
+ <header class="site">
46
+ <div class="container nav-row">
47
+ <a class="brand" href="/" aria-label="Token of Trust home"><img src="/tenants/tokenoftrust/logo-wordmark.png" alt="Token of Trust" width="156" height="34" style="height:34px;width:auto;display:block"></a>
48
+ <nav class="primary" id="primaryNav" aria-label="Primary">
49
+ <ul>
50
+ <li><a href="/product/">Platform</a></li>
51
+ <li><a href="/solutions/">Industries</a></li>
52
+ <li><a class="active" href="/company/" aria-current="page">Company</a></li>
53
+ <li><a href="/resources/">Resources</a></li>
54
+ <li><a href="/pricing/">Pricing</a></li>
55
+ <li><a href="https://app.tokenoftrust.com">Login</a></li>
56
+ </ul>
57
+ </nav>
58
+ <div class="nav-cta">
59
+ <a class="btn btn-line" href="/contact/">Book Demo</a>
60
+ <a class="btn btn-green" href="https://app.tokenoftrust.com">Start For Free</a>
61
+ <button class="hamburger" id="hamburger" aria-label="Toggle navigation menu" aria-expanded="false" aria-controls="primaryNav"><span></span><span></span><span></span></button>
62
+ </div>
63
+ </div>
64
+ </header>
65
+
66
+ <main id="main">
67
+ <div class="container">
68
+ <nav class="crumbs" aria-label="Breadcrumb">
69
+ <a href="/">Home</a><span class="sep" aria-hidden="true">›</span>
70
+ <a href="/company/">Company</a><span class="sep" aria-hidden="true">›</span>
71
+ Careers
72
+ </nav>
73
+ </div>
74
+
75
+ <section class="hero" aria-labelledby="hero-heading">
76
+ <div class="container">
77
+ <span class="eyebrow"><span class="dot"></span>Careers</span>
78
+ <h1 id="hero-heading">We're looking for <span class="grad">all kinds of people</span>.</h1>
79
+ <p class="lede">We're a team of designers, engineers, and business minds building the platform to change
80
+ the way people share their identities and establish trust in an online world.</p>
81
+ <div class="cta-row">
82
+ <a class="btn btn-green" href="/careers/">View open roles</a>
83
+ <a class="btn btn-line" href="/contact/">Get in touch</a>
84
+ </div>
85
+ </div>
86
+ </section>
87
+
88
+ <section aria-labelledby="build-heading">
89
+ <div class="container">
90
+ <div class="center reveal">
91
+ <span class="kicker">Build with us</span>
92
+ <h2 id="build-heading">Why we do this work</h2>
93
+ <p class="section-lede">We obsess about protecting the people we serve, we enjoy building products that
94
+ aid in making safer decisions, and we value focused execution. Our team gets into details, asks why, and
95
+ loves solving tough problems together.</p>
96
+ </div>
97
+ </div>
98
+ </section>
99
+
100
+ <section class="alt-bg" aria-labelledby="values-heading">
101
+ <div class="container">
102
+ <div class="center reveal">
103
+ <span class="kicker">Core Values</span>
104
+ <h2 id="values-heading">What we stand for</h2>
105
+ <p class="section-lede">The principles that guide how we build, decide, and treat each other.</p>
106
+ </div>
107
+ <div class="feature-grid reveal">
108
+ <article class="feat-card accent">
109
+ <h3>Delight customers</h3>
110
+ <p>Every employee is willing to collaborate with and delight our customers and consumers, no matter what
111
+ role they're in. We go above and beyond to listen to their needs and leave them with a smile.</p>
112
+ </article>
113
+ <article class="feat-card accent">
114
+ <h3>Act with purpose &amp; integrity</h3>
115
+ <p>We make every action and decision with a grounded purpose that is understood and aligned with our
116
+ strategic goals and values.</p>
117
+ </article>
118
+ <article class="feat-card accent">
119
+ <h3>Deep focus</h3>
120
+ <p>We're deliberate and focused about where we invest our energy. Initiatives are seen through the finish
121
+ line, even if it means saying "no" to avoid distractions.</p>
122
+ </article>
123
+ <article class="feat-card accent">
124
+ <h3>Respectfully direct &amp; commit</h3>
125
+ <p>We are respectful, humble, and direct in our communication, even when it's uncomfortable. When we
126
+ make decisions to move forward, the team is all-in.</p>
127
+ </article>
128
+ <article class="feat-card accent">
129
+ <h3>We take care of each other</h3>
130
+ <p>We foster an environment where everyone can feel safe and be their best self. We are grateful for
131
+ each other and we always have each other's backs.</p>
132
+ </article>
133
+ </div>
134
+ </div>
135
+ </section>
136
+
137
+ <section aria-labelledby="benefits-heading">
138
+ <div class="container">
139
+ <div class="center reveal">
140
+ <span class="kicker">Benefits</span>
141
+ <h2 id="benefits-heading">How we take care of the team</h2>
142
+ </div>
143
+ <div class="feature-grid three reveal">
144
+ <article class="feat-card">
145
+ <h3>Comprehensive health plans</h3>
146
+ <p>Medical coverage to keep you and your family well.</p>
147
+ </article>
148
+ <article class="feat-card">
149
+ <h3>Dental &amp; vision plans</h3>
150
+ <p>Rounded-out coverage beyond the basics.</p>
151
+ </article>
152
+ <article class="feat-card">
153
+ <h3>Occasional work from home</h3>
154
+ <p>Flexibility to do focused work where you do it best.</p>
155
+ </article>
156
+ </div>
157
+ </div>
158
+ </section>
159
+
160
+ <section class="alt-bg" aria-labelledby="openings-heading">
161
+ <div class="container">
162
+ <div class="center reveal">
163
+ <span class="kicker">Job Openings</span>
164
+ <h2 id="openings-heading">Open roles</h2>
165
+ <p class="section-lede">Current openings are listed on our main careers site. Take a look and reach out
166
+ — we'd love to hear from you.</p>
167
+ <div class="cta-row cta-center">
168
+ <a class="btn btn-navy" href="/careers/">See open roles</a>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </section>
173
+
174
+ <section aria-labelledby="cta-heading">
175
+ <div class="container">
176
+ <div class="cta-band reveal">
177
+ <span class="kicker">Join us</span>
178
+ <h2 id="cta-heading">Help build trust online</h2>
179
+ <p>Don't see the perfect role? We're always interested in meeting people who care about protecting customers
180
+ and building great products.</p>
181
+ <div class="cta-row">
182
+ <a class="btn btn-green" href="/careers/">Explore careers</a>
183
+ <a class="btn btn-line" href="/contact/">Contact us</a>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ </section>
188
+ </main>
189
+
190
+ <footer class="site">
191
+ <div class="container">
192
+ <div class="foot-grid">
193
+ <div>
194
+ <a class="brand" href="/" aria-label="Token of Trust home"><img src="/tenants/tokenoftrust/logo-wordmark.png" alt="Token of Trust" width="156" height="34" style="height:34px;width:auto;display:block"></a>
195
+ <p class="foot-note">Customer verification and compliance for regulated ecommerce. 256-bit SSL. We will
196
+ NEVER sell your data. GDPR · CCPA · PIPEDA.</p>
197
+ </div>
198
+ <nav aria-label="Platform footer"><h3>Platform</h3><ul>
199
+ <li><a href="/product/verification/">Identity Verification</a></li>
200
+ <li><a href="/product/age-assurance/">Age Assurance</a></li>
201
+ <li><a href="/product/fraud-prevention/">Fraud Prevention</a></li>
202
+ <li><a href="/product/">All products</a></li>
203
+ </ul></nav>
204
+ <nav aria-label="Industries footer"><h3>Industries</h3><ul>
205
+ <li><a href="/solutions/">All industries</a></li>
206
+ <li><a href="/vlp-cigars-and-tobacco/">Tobacco &amp; Vape</a></li>
207
+ <li><a href="/vlp-alcohol/">Wine &amp; Spirits</a></li>
208
+ <li><a href="/industries/cannabis/">Cannabis</a></li>
209
+ </ul></nav>
210
+ <nav aria-label="Company footer"><h3>Company</h3><ul>
211
+ <li><a href="/company/">Company</a></li>
212
+ <li><a href="/careers/">Careers</a></li>
213
+ <li><a href="/pricing/">Pricing</a></li>
214
+ <li><a href="/contact/">Contact Sales</a></li>
215
+ </ul></nav>
216
+ </div>
217
+ <p class="copyright">© 2026 Token of Trust®. All rights reserved.</p>
218
+ </div>
219
+ </footer>
220
+
221
+ <script>
222
+ (function(){
223
+ var burger = document.getElementById('hamburger');
224
+ var nav = document.getElementById('primaryNav');
225
+ burger.addEventListener('click', function(){ var open = nav.classList.toggle('open'); burger.setAttribute('aria-expanded', open ? 'true' : 'false'); });
226
+ var io = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); } }); }, {threshold:.12});
227
+ document.querySelectorAll('.reveal').forEach(function(el){ io.observe(el); });
228
+ })();
229
+ </script>
230
+ </body>
231
+ </html>