@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.
- package/LICENSE +58 -0
- package/README.md +40 -0
- package/apps/storefront/.dev.vars.example +41 -0
- package/apps/storefront/.env.example +24 -0
- package/apps/storefront/astro.config.mjs +245 -0
- package/apps/storefront/env.d.ts +155 -0
- package/apps/storefront/lib/ensure-preview-reconcile-secret.sh +31 -0
- package/apps/storefront/lib/resolve-cf-token.sh +48 -0
- package/apps/storefront/lib/resolve-tot-credentials.sh +69 -0
- package/apps/storefront/migrations/0000_baseline.sql +54 -0
- package/apps/storefront/migrations/0001_products_fts.sql +9 -0
- package/apps/storefront/migrations/README.md +54 -0
- package/apps/storefront/migrations/meta/0000_snapshot.json +347 -0
- package/apps/storefront/migrations/meta/0001_snapshot.json +347 -0
- package/apps/storefront/migrations/meta/_journal.json +20 -0
- package/apps/storefront/package.json +41 -0
- package/apps/storefront/public/brand/northwind-logo-dark.svg +4 -0
- package/apps/storefront/public/brand/northwind-logo-light.svg +4 -0
- package/apps/storefront/public/brand/northwind-og.svg +13 -0
- package/apps/storefront/public/favicon.svg +5 -0
- package/apps/storefront/public/js/dashboard-team.js +147 -0
- package/apps/storefront/public/js/dashboard-vendor-search.js +115 -0
- package/apps/storefront/src/components/Badge.astro +34 -0
- package/apps/storefront/src/components/Breadcrumbs.astro +45 -0
- package/apps/storefront/src/components/CollectionCard.astro +56 -0
- package/apps/storefront/src/components/EmptyState.astro +35 -0
- package/apps/storefront/src/components/Img.astro +68 -0
- package/apps/storefront/src/components/ProductCard.astro +228 -0
- package/apps/storefront/src/components/Section.astro +39 -0
- package/apps/storefront/src/components/Seo.astro +70 -0
- package/apps/storefront/src/components/WidgetFrame.astro +34 -0
- package/apps/storefront/src/components/auth/AuthBadge.astro +44 -0
- package/apps/storefront/src/components/chrome/AnnouncementBar.astro +108 -0
- package/apps/storefront/src/components/chrome/MegaMenu.astro +26 -0
- package/apps/storefront/src/components/chrome/NavDropdown.astro +116 -0
- package/apps/storefront/src/components/chrome/SiteFooter.astro +181 -0
- package/apps/storefront/src/components/chrome/SiteHeader.astro +181 -0
- package/apps/storefront/src/components/chrome/UtilityNav.astro +79 -0
- package/apps/storefront/src/components/commerce/FoxyLoader.astro +23 -0
- package/apps/storefront/src/components/commerce/PriceDisplay.astro +91 -0
- package/apps/storefront/src/components/commerce/ProductCarousel.astro +197 -0
- package/apps/storefront/src/components/commerce/ProductGrid.astro +75 -0
- package/apps/storefront/src/components/commerce/RatingStars.astro +58 -0
- package/apps/storefront/src/components/compliance/NicotineWarning.astro +33 -0
- package/apps/storefront/src/components/home/Hero.astro +164 -0
- package/apps/storefront/src/components/islands/AgeGate.tsx +105 -0
- package/apps/storefront/src/components/islands/ImageGallery.tsx +237 -0
- package/apps/storefront/src/components/islands/IsolatedAgeGate.tsx +73 -0
- package/apps/storefront/src/components/islands/MobileNav.tsx +239 -0
- package/apps/storefront/src/components/islands/QuickView.tsx +138 -0
- package/apps/storefront/src/components/islands/RecentlyViewed.tsx +122 -0
- package/apps/storefront/src/components/islands/SavedList.tsx +99 -0
- package/apps/storefront/src/components/islands/SearchTypeahead.tsx +248 -0
- package/apps/storefront/src/components/islands/VariantSelector.tsx +378 -0
- package/apps/storefront/src/components/marketing/CardGrid.astro +72 -0
- package/apps/storefront/src/components/marketing/CodeSample.astro +20 -0
- package/apps/storefront/src/components/marketing/CtaBand.astro +24 -0
- package/apps/storefront/src/components/marketing/Faq.astro +37 -0
- package/apps/storefront/src/components/marketing/Integrations.astro +63 -0
- package/apps/storefront/src/components/marketing/MarketingBlocks.astro +53 -0
- package/apps/storefront/src/components/marketing/MarketingCtas.astro +48 -0
- package/apps/storefront/src/components/marketing/MarketingHero.astro +72 -0
- package/apps/storefront/src/components/marketing/ProofStrip.astro +37 -0
- package/apps/storefront/src/components/marketing/SplitCompare.astro +53 -0
- package/apps/storefront/src/components/marketing/Steps.astro +36 -0
- package/apps/storefront/src/components/marketing/Testimonials.astro +38 -0
- package/apps/storefront/src/components/marketing/TrustBar.astro +22 -0
- package/apps/storefront/src/components/nav/Footer.astro +148 -0
- package/apps/storefront/src/components/nav/Header.astro +190 -0
- package/apps/storefront/src/components/plp/ActiveFilters.astro +79 -0
- package/apps/storefront/src/components/plp/FacetSidebar.astro +146 -0
- package/apps/storefront/src/components/plp/Pagination.astro +99 -0
- package/apps/storefront/src/components/plp/SortSelect.astro +64 -0
- package/apps/storefront/src/config/devTenants.ts +16 -0
- package/apps/storefront/src/config/kvTenantResolver.ts +87 -0
- package/apps/storefront/src/config/resolver.ts +46 -0
- package/apps/storefront/src/config/tenants.ts +193 -0
- package/apps/storefront/src/layouts/Layout.astro +303 -0
- package/apps/storefront/src/lib/analytics/index.ts +47 -0
- package/apps/storefront/src/lib/auth/brokerAssertion.ts +136 -0
- package/apps/storefront/src/lib/auth/devAuth.ts +90 -0
- package/apps/storefront/src/lib/auth/gatePage.ts +81 -0
- package/apps/storefront/src/lib/auth/identityToken.ts +341 -0
- package/apps/storefront/src/lib/auth/loginGate.ts +107 -0
- package/apps/storefront/src/lib/auth/route.ts +146 -0
- package/apps/storefront/src/lib/auth/session.ts +203 -0
- package/apps/storefront/src/lib/auth/totAccessClient.ts +503 -0
- package/apps/storefront/src/lib/basePath.ts +41 -0
- package/apps/storefront/src/lib/cfImage.ts +55 -0
- package/apps/storefront/src/lib/chrome/model.ts +65 -0
- package/apps/storefront/src/lib/colors.ts +97 -0
- package/apps/storefront/src/lib/content-edit/client.ts +230 -0
- package/apps/storefront/src/lib/content-edit/index.ts +14 -0
- package/apps/storefront/src/lib/content-edit/route.ts +25 -0
- package/apps/storefront/src/lib/content-edit/types.ts +19 -0
- package/apps/storefront/src/lib/cspStaticHashes.ts +24 -0
- package/apps/storefront/src/lib/d1/catalog.ts +289 -0
- package/apps/storefront/src/lib/dashboard/staffAdmission.ts +43 -0
- package/apps/storefront/src/lib/dashboard/staffVendorAccess.ts +449 -0
- package/apps/storefront/src/lib/dashboard/tenantSelection.ts +136 -0
- package/apps/storefront/src/lib/dashboard/vendorQuery.ts +61 -0
- package/apps/storefront/src/lib/demoGate.ts +113 -0
- package/apps/storefront/src/lib/dev/ai-widget-client.js +127 -0
- package/apps/storefront/src/lib/dev/cliSignInCode.ts +132 -0
- package/apps/storefront/src/lib/diag/redact.ts +20 -0
- package/apps/storefront/src/lib/edgeCache.ts +128 -0
- package/apps/storefront/src/lib/email/magicLinkInviteEmail.ts +62 -0
- package/apps/storefront/src/lib/env.ts +60 -0
- package/apps/storefront/src/lib/fixtures/sampleProducts.ts +130 -0
- package/apps/storefront/src/lib/format.ts +29 -0
- package/apps/storefront/src/lib/foxyCommerce.ts +49 -0
- package/apps/storefront/src/lib/imageAttrs.ts +55 -0
- package/apps/storefront/src/lib/jsonld.ts +136 -0
- package/apps/storefront/src/lib/maintenance.ts +71 -0
- package/apps/storefront/src/lib/memoryKv.ts +32 -0
- package/apps/storefront/src/lib/messaging/messagesClient.ts +143 -0
- package/apps/storefront/src/lib/placeholder.ts +99 -0
- package/apps/storefront/src/lib/previewReload.ts +125 -0
- package/apps/storefront/src/lib/rawMarketingHtml.ts +133 -0
- package/apps/storefront/src/lib/search/index.ts +74 -0
- package/apps/storefront/src/lib/sections.ts +129 -0
- package/apps/storefront/src/lib/securityHeaders.ts +31 -0
- package/apps/storefront/src/lib/storyblok/content-model.ts +289 -0
- package/apps/storefront/src/lib/storyblok/provider.ts +524 -0
- package/apps/storefront/src/lib/tenantRouting.ts +91 -0
- package/apps/storefront/src/lib/tot/ToTClient.ts +177 -0
- package/apps/storefront/src/lib/tot/d1Client.ts +62 -0
- package/apps/storefront/src/lib/tot/query.ts +187 -0
- package/apps/storefront/src/lib/tot/totClientInterface.ts +30 -0
- package/apps/storefront/src/lib/url.ts +119 -0
- package/apps/storefront/src/lib/wishlist.ts +63 -0
- package/apps/storefront/src/middleware/index.ts +413 -0
- package/apps/storefront/src/pages/404.astro +61 -0
- package/apps/storefront/src/pages/[...slug].astro +90 -0
- package/apps/storefront/src/pages/api/auth/logout.ts +21 -0
- package/apps/storefront/src/pages/api/auth/magic-exchange.ts +107 -0
- package/apps/storefront/src/pages/api/auth/send.ts +85 -0
- package/apps/storefront/src/pages/api/auth/verify.ts +135 -0
- package/apps/storefront/src/pages/api/cache-purge.ts +44 -0
- package/apps/storefront/src/pages/api/content-edit/ai-edit.ts +64 -0
- package/apps/storefront/src/pages/api/csp-report.ts +25 -0
- package/apps/storefront/src/pages/api/dashboard/enter-vendor.ts +124 -0
- package/apps/storefront/src/pages/api/dashboard/vendor-search.ts +120 -0
- package/apps/storefront/src/pages/api/dev/cli-signin-code.ts +44 -0
- package/apps/storefront/src/pages/api/newsletter.ts +104 -0
- package/apps/storefront/src/pages/api/request-access.ts +172 -0
- package/apps/storefront/src/pages/auth/login.astro +149 -0
- package/apps/storefront/src/pages/auth/magic.astro +105 -0
- package/apps/storefront/src/pages/capabilities.astro +292 -0
- package/apps/storefront/src/pages/collections/[handle].astro +154 -0
- package/apps/storefront/src/pages/collections/index.astro +59 -0
- package/apps/storefront/src/pages/dashboard/[appDomain]/index.astro +100 -0
- package/apps/storefront/src/pages/dashboard/[appDomain]/team.astro +154 -0
- package/apps/storefront/src/pages/dashboard/index.astro +160 -0
- package/apps/storefront/src/pages/dev.astro +653 -0
- package/apps/storefront/src/pages/index.astro +290 -0
- package/apps/storefront/src/pages/llms.txt.ts +92 -0
- package/apps/storefront/src/pages/products/[handle].astro +443 -0
- package/apps/storefront/src/pages/robots.txt.ts +24 -0
- package/apps/storefront/src/pages/saved.astro +35 -0
- package/apps/storefront/src/pages/search.astro +150 -0
- package/apps/storefront/src/pages/sitemap.xml.ts +78 -0
- package/apps/storefront/src/pages/style-guide/[tenant]/[theme].astro +646 -0
- package/apps/storefront/src/pages/style-guide/[tenant]/index.astro +85 -0
- package/apps/storefront/src/pages/style-guide/index.astro +94 -0
- package/apps/storefront/src/pages/tenants/[id]/[...path].ts +57 -0
- package/apps/storefront/src/styles/global.css +277 -0
- package/apps/storefront/src/themes/reference.ts +61 -0
- package/apps/storefront/src/themes/schema.ts +111 -0
- package/apps/storefront/src/themes/tenants/index.ts +51 -0
- package/apps/storefront/tsconfig.json +16 -0
- package/apps/storefront/vitest.config.ts +22 -0
- package/apps/storefront/wrangler.toml +175 -0
- package/package.json +23 -0
- package/packages/public-runtime/LICENSE +58 -0
- package/packages/public-runtime/package.json +22 -0
- package/packages/public-runtime/src/binary-path.ts +68 -0
- package/packages/public-runtime/src/capabilities.ts +89 -0
- package/packages/public-runtime/src/catalog-api.ts +81 -0
- package/packages/public-runtime/src/catalog-d1.ts +192 -0
- package/packages/public-runtime/src/csp.ts +109 -0
- package/packages/public-runtime/src/customization-preview.ts +197 -0
- package/packages/public-runtime/src/customization-reconcile.ts +63 -0
- package/packages/public-runtime/src/customization-runtime.ts +157 -0
- package/packages/public-runtime/src/customization-scripts.ts +64 -0
- package/packages/public-runtime/src/customization-versioning.ts +95 -0
- package/packages/public-runtime/src/foxy.ts +184 -0
- package/packages/public-runtime/src/index.ts +30 -0
- package/packages/public-runtime/src/product.ts +159 -0
- package/packages/public-runtime/src/search.ts +45 -0
- package/packages/public-runtime/src/tenant-assets.ts +444 -0
- package/packages/public-runtime/src/tenant.ts +243 -0
- package/packages/public-runtime/tsconfig.json +8 -0
- package/packages/public-runtime/vitest.config.ts +8 -0
- package/pnpm-workspace.yaml +7 -0
- package/scripts/build/copy-tenant-assets.mjs +69 -0
- package/scripts/tot-dev.mjs +439 -0
- package/tenants/bigdvapor/content/blog.json +52 -0
- package/tenants/bigdvapor/content/chrome.html +149 -0
- package/tenants/bigdvapor/content/chrome.json +47 -0
- package/tenants/bigdvapor/content/home.html +463 -0
- package/tenants/bigdvapor/content/home.json +73 -0
- package/tenants/bigdvapor/content/pages/about.json +5 -0
- package/tenants/bigdvapor/content/pages/privacy.json +6 -0
- package/tenants/bigdvapor/content/pages/shipping-returns.json +6 -0
- package/tenants/bigdvapor/content/pages-html/blogs/news.html +86 -0
- package/tenants/bigdvapor/content/pages-html/pages/about-us.html +106 -0
- package/tenants/bigdvapor/content/pages-html/pages/contact-us.html +61 -0
- package/tenants/bigdvapor/content/pages-html/pages/privacy-policy.html +72 -0
- package/tenants/bigdvapor/content/pages-html/pages/shipping-returns.html +172 -0
- package/tenants/bigdvapor/content/themes/bigd-navy.json +109 -0
- package/tenants/bigdvapor/public/img/brands/adjust-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/again-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/al-fakher-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/arro-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/cookies-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/core-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/cyclone-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/dinner-lady-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/extre-bar-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/fifty-bar-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/firerose-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/flavor-beast-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/foger-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/kk-energy-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/kumi-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/lost-vape-dispoable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/melo-labs-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/brands/mixo-vape-disposable.webp +0 -0
- package/tenants/bigdvapor/public/img/brands/one-tank-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/oxbar-vape-disposable.webp +0 -0
- package/tenants/bigdvapor/public/img/brands/pillow-talk-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/pod-king-vape-disposable.jpg +0 -0
- package/tenants/bigdvapor/public/img/brands/raz-vape-disposable.png +0 -0
- package/tenants/bigdvapor/public/img/hero-texas.jpg +0 -0
- package/tenants/bigdvapor/public/img/og.jpg +0 -0
- package/tenants/bigdvapor/public/img/pages/AdobeStock_202106312_web.jpg +0 -0
- package/tenants/bigdvapor/public/img/pages/CREW_web.jpg +0 -0
- package/tenants/bigdvapor/public/img/pages/Hero-Image.jpg +0 -0
- package/tenants/bigdvapor/public/img/tiles/adjust.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/again.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/al-fakher.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/arro.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/cookies.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/core.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/cyclone.png +0 -0
- package/tenants/bigdvapor/public/img/tiles/disposables.svg +23 -0
- package/tenants/bigdvapor/public/logo-wordmark.png +0 -0
- package/tenants/bigdvapor/public/pages/home.css +118 -0
- package/tenants/bigdvapor/public/pages/mkt.css +185 -0
- package/tenants/bigdvapor/public/pages/page.css +148 -0
- package/tenants/bigdvapor/public/themes/bigd-navy.css +73 -0
- package/tenants/bigdvapor/theme.json +12 -0
- package/tenants/giantvapes/content/chrome.html +152 -0
- package/tenants/giantvapes/content/chrome.json +94 -0
- package/tenants/giantvapes/content/home.html +194 -0
- package/tenants/giantvapes/content/home.json +50 -0
- package/tenants/giantvapes/content/pages/about.json +10 -0
- package/tenants/giantvapes/content/pages/privacy.json +6 -0
- package/tenants/giantvapes/content/pages/shipping-returns.json +6 -0
- package/tenants/giantvapes/content/pages-html/blogs/news.html +68 -0
- package/tenants/giantvapes/content/pages-html/pages/about-us.html +95 -0
- package/tenants/giantvapes/content/pages-html/pages/contact-us.html +68 -0
- package/tenants/giantvapes/content/pages-html/pages/privacy-policy.html +65 -0
- package/tenants/giantvapes/content/pages-html/pages/shipping-returns.html +77 -0
- package/tenants/giantvapes/content/themes/giant-navy.json +73 -0
- package/tenants/giantvapes/public/img/hero-suicide-bunny.jpg +0 -0
- package/tenants/giantvapes/public/img/hero.webp +0 -0
- package/tenants/giantvapes/public/img/og.jpg +0 -0
- package/tenants/giantvapes/public/logo-wordmark.png +0 -0
- package/tenants/giantvapes/public/pages/home.css +120 -0
- package/tenants/giantvapes/public/pages/mkt.css +185 -0
- package/tenants/giantvapes/public/pages/page.css +155 -0
- package/tenants/giantvapes/public/themes/giant-navy.css +76 -0
- package/tenants/giantvapes/theme.json +39 -0
- package/tenants/home/content/chrome.json +11 -0
- package/tenants/home/content/home.html +304 -0
- package/tenants/home/content/home.json +13 -0
- package/tenants/home/public/js/storefront.js +210 -0
- package/tenants/home/public/logo-wordmark.png +0 -0
- package/tenants/home/public/pages/storefront.css +212 -0
- package/tenants/home/theme.json +6 -0
- package/tenants/tokenoftrust/.tot/config.json +9 -0
- package/tenants/tokenoftrust/content/chrome.json +55 -0
- package/tenants/tokenoftrust/content/home.html +723 -0
- package/tenants/tokenoftrust/content/home.json +233 -0
- package/tenants/tokenoftrust/content/pages-html/careers.html +231 -0
- package/tenants/tokenoftrust/content/pages-html/company.html +275 -0
- package/tenants/tokenoftrust/content/pages-html/contact/contact-sales.html +188 -0
- package/tenants/tokenoftrust/content/pages-html/contact/startup-apply.html +206 -0
- package/tenants/tokenoftrust/content/pages-html/contact.html +178 -0
- package/tenants/tokenoftrust/content/pages-html/industries/adult-content-age-verification.html +286 -0
- package/tenants/tokenoftrust/content/pages-html/industries/cannabis.html +277 -0
- package/tenants/tokenoftrust/content/pages-html/pact-act-pricing.html +289 -0
- package/tenants/tokenoftrust/content/pages-html/pricing.html +483 -0
- package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-estimation.html +278 -0
- package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-gate.html +279 -0
- package/tenants/tokenoftrust/content/pages-html/product/age-assurance/age-verification.html +265 -0
- package/tenants/tokenoftrust/content/pages-html/product/age-assurance.html +173 -0
- package/tenants/tokenoftrust/content/pages-html/product/compliance/aml.html +214 -0
- package/tenants/tokenoftrust/content/pages-html/product/compliance/pact-act.html +226 -0
- package/tenants/tokenoftrust/content/pages-html/product/fraud-prevention.html +254 -0
- package/tenants/tokenoftrust/content/pages-html/product/social-profile-verification.html +212 -0
- package/tenants/tokenoftrust/content/pages-html/product/tax/excise-tax.html +213 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/aml.html +259 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/biometric-selfie.html +305 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/coverage.html +254 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/document-verification.html +306 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/electronic-identity-verification.html +304 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification/government-id-verification.html +308 -0
- package/tenants/tokenoftrust/content/pages-html/product/verification.html +183 -0
- package/tenants/tokenoftrust/content/pages-html/product.html +228 -0
- package/tenants/tokenoftrust/content/pages-html/resources/integrations/bigcommerce-integration.html +220 -0
- package/tenants/tokenoftrust/content/pages-html/resources/integrations/shopify-integration.html +221 -0
- package/tenants/tokenoftrust/content/pages-html/resources/integrations/wordpress.html +220 -0
- package/tenants/tokenoftrust/content/pages-html/resources/integrations.html +172 -0
- package/tenants/tokenoftrust/content/pages-html/resources/refer-a-friend-program.html +317 -0
- package/tenants/tokenoftrust/content/pages-html/resources.html +177 -0
- package/tenants/tokenoftrust/content/pages-html/reviews.html +273 -0
- package/tenants/tokenoftrust/content/pages-html/solutions.html +292 -0
- package/tenants/tokenoftrust/content/pages-html/vlp-alcohol.html +289 -0
- package/tenants/tokenoftrust/content/pages-html/vlp-cigars-and-tobacco.html +286 -0
- package/tenants/tokenoftrust/content/pages-html/vlp-firearm-accessories.html +267 -0
- package/tenants/tokenoftrust/content/pages-html/vlp-peptides.html +273 -0
- package/tenants/tokenoftrust/content/themes/tot-navy.json +88 -0
- package/tenants/tokenoftrust/public/favicon.png +0 -0
- package/tenants/tokenoftrust/public/logo-icon.png +0 -0
- package/tenants/tokenoftrust/public/logo-wordmark.png +0 -0
- package/tenants/tokenoftrust/public/pages/company.css +108 -0
- package/tenants/tokenoftrust/public/pages/home.css +457 -0
- package/tenants/tokenoftrust/public/pages/mkt.css +482 -0
- package/tenants/tokenoftrust/public/pages/pricing.css +214 -0
- package/tenants/tokenoftrust/public/pages/solutions.css +66 -0
- package/tenants/tokenoftrust/public/themes/tot-navy-1.0.0.css +136 -0
- package/tenants/tokenoftrust/public/themes/tot-navy.css +358 -0
- package/tenants/tokenoftrust/theme.json +31 -0
- package/tsconfig.base.json +20 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Giant Vapes — shared marketing subpage styles (page.css)
|
|
3
|
+
Page hero + prose + contact cards. Used by pages-html/**. Depends on tokens
|
|
4
|
+
from themes/giant-navy.css and components from pages/mkt.css.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
/* --- Page hero ------------------------------------------------------------ */
|
|
8
|
+
.page-hero { background: linear-gradient(135deg, var(--navy), var(--navy-ink)); color: #fff; }
|
|
9
|
+
.page-hero .container { padding-block: clamp(2.5rem, 6vw, 4.5rem); }
|
|
10
|
+
.page-hero .eyebrow { display: inline-block; font-family: var(--font-display); font-weight: 700; font-size: .78rem; letter-spacing: .14em; text-transform: uppercase; color: #afc2ff; margin-bottom: .7rem; }
|
|
11
|
+
.page-hero h1 { color: #fff; max-width: 22ch; }
|
|
12
|
+
.page-hero p { color: #dce5ff; font-size: 1.08rem; margin-top: .9rem; max-width: 60ch; }
|
|
13
|
+
.crumbs { font-size: .82rem; color: #a9b8e6; margin-bottom: 1rem; }
|
|
14
|
+
.crumbs a:hover { color: #fff; text-decoration: underline; }
|
|
15
|
+
|
|
16
|
+
/* --- Prose ---------------------------------------------------------------- */
|
|
17
|
+
.prose { max-width: 70ch; margin-inline: auto; }
|
|
18
|
+
.prose h2 { margin-top: 2.2rem; margin-bottom: .6rem; }
|
|
19
|
+
.prose h3 { margin-top: 1.6rem; margin-bottom: .4rem; }
|
|
20
|
+
.prose p { margin-bottom: 1rem; color: var(--ink); }
|
|
21
|
+
.prose p.lead { font-size: 1.15rem; color: var(--muted); }
|
|
22
|
+
.prose ul.bullets { margin: 0 0 1rem; padding-left: 1.1rem; list-style: disc; }
|
|
23
|
+
.prose ul.bullets li { margin-bottom: .4rem; color: var(--ink); }
|
|
24
|
+
.prose a { color: var(--navy); font-weight: 600; }
|
|
25
|
+
.prose a:hover { text-decoration: underline; }
|
|
26
|
+
|
|
27
|
+
/* --- Value cards (about-page "what we're about" grid) --------------------- */
|
|
28
|
+
.value-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 22px); margin-top: 1.6rem; }
|
|
29
|
+
.value-card { border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; background: #fff; }
|
|
30
|
+
.value-card h3 { color: var(--navy); font-size: 1.05rem; margin-bottom: .55rem; }
|
|
31
|
+
.value-card p { color: var(--ink); font-size: .96rem; }
|
|
32
|
+
@media (max-width: 860px) { .value-grid { grid-template-columns: 1fr; } }
|
|
33
|
+
|
|
34
|
+
/* --- Contact cards -------------------------------------------------------- */
|
|
35
|
+
.contact-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 22px); margin-top: 1.5rem; }
|
|
36
|
+
.contact-card { border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; background: #fff; }
|
|
37
|
+
.contact-card h3 { color: var(--navy); font-size: 1.05rem; margin-bottom: .5rem; }
|
|
38
|
+
.contact-card a { color: var(--ink); font-weight: 600; }
|
|
39
|
+
.contact-card a:hover { color: var(--navy); }
|
|
40
|
+
.contact-card p { font-size: .92rem; }
|
|
41
|
+
|
|
42
|
+
/* --- Brand chips ---------------------------------------------------------- */
|
|
43
|
+
.brand-chips { display: flex; flex-wrap: wrap; gap: 10px; margin: 1rem 0 1.5rem; }
|
|
44
|
+
.brand-chips a { border: 1px solid var(--border); border-radius: 999px; padding: 8px 16px; font-size: .88rem; font-weight: 600; color: var(--navy); background: var(--surface); }
|
|
45
|
+
.brand-chips a:hover { background: var(--surface-2); }
|
|
46
|
+
|
|
47
|
+
@media (max-width: 720px) {
|
|
48
|
+
.contact-grid { grid-template-columns: 1fr; }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* ============================================================================
|
|
52
|
+
About page — hero overlay + alternating media/copy splits + pickers
|
|
53
|
+
(clones bigdvapor.com/pages/about-us section-for-section)
|
|
54
|
+
========================================================================== */
|
|
55
|
+
|
|
56
|
+
/* --- Full-bleed hero with image + left-aligned overlay copy --------------- */
|
|
57
|
+
.hero-overlay { position: relative; overflow: hidden; background: var(--navy-ink); }
|
|
58
|
+
.hero-overlay > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
|
|
59
|
+
.hero-overlay::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(0,10,40,.62) 0%, rgba(0,10,40,.34) 45%, rgba(0,10,40,.08) 100%); }
|
|
60
|
+
.hero-overlay__inner { position: relative; z-index: 1; padding-block: clamp(3rem, 9vw, 7rem); }
|
|
61
|
+
.hero-overlay .crumbs { color: #cdd8f5; }
|
|
62
|
+
.hero-overlay .crumbs a { color: #eaf0ff; }
|
|
63
|
+
.hero-overlay h1 { color: #fff; max-width: 16ch; text-shadow: 0 2px 18px rgba(0,10,40,.4); }
|
|
64
|
+
.hero-overlay p { color: #eaf0ff; font-size: clamp(1rem, 1.6vw, 1.2rem); margin-top: 1rem; max-width: 46ch; }
|
|
65
|
+
|
|
66
|
+
/* --- Media / copy split (Our Story, Our Mission, Service) ------------------ */
|
|
67
|
+
.split .container { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.75rem, 5vw, 4.5rem); align-items: center; }
|
|
68
|
+
.split--rev .container { direction: rtl; }
|
|
69
|
+
.split--rev .split__copy, .split--rev .split__media { direction: ltr; }
|
|
70
|
+
.split__copy h2 { margin-bottom: 1rem; }
|
|
71
|
+
.split__copy p { color: var(--ink); margin-bottom: 1rem; max-width: 52ch; }
|
|
72
|
+
.split__copy .btn { margin-top: .4rem; }
|
|
73
|
+
.split__media img { width: 100%; border-radius: var(--radius-lg); box-shadow: var(--shadow-md); object-fit: cover; }
|
|
74
|
+
.split--center .split__copy { text-align: center; }
|
|
75
|
+
.split--center .split__copy p { margin-inline: auto; }
|
|
76
|
+
.split--center .split__copy .btn { display: inline-flex; }
|
|
77
|
+
|
|
78
|
+
/* --- Trusted Brands band (centered) --------------------------------------- */
|
|
79
|
+
.brands-band .brand-chips { justify-content: center; max-width: 780px; margin-inline: auto; }
|
|
80
|
+
|
|
81
|
+
/* --- Centered CTA band (Service — decorative image absent from source) ----- */
|
|
82
|
+
.cta-band { text-align: center; }
|
|
83
|
+
.cta-band .container { max-width: 60ch; }
|
|
84
|
+
.cta-band p { color: var(--ink); margin-top: 1rem; }
|
|
85
|
+
.cta-band .btn { margin-top: 1.5rem; }
|
|
86
|
+
|
|
87
|
+
/* --- Category picker (Find Your Fav) -------------------------------------- */
|
|
88
|
+
.pick-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(12px, 1.6vw, 20px); }
|
|
89
|
+
.pick-card {
|
|
90
|
+
display: flex; flex-direction: column; justify-content: space-between; gap: 12px;
|
|
91
|
+
min-height: 132px; padding: 22px 20px; background: #fff;
|
|
92
|
+
border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
93
|
+
transition: transform .14s, box-shadow .14s, border-color .14s;
|
|
94
|
+
}
|
|
95
|
+
.pick-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
|
|
96
|
+
.pick-card h3 { color: var(--navy); font-size: 1.15rem; }
|
|
97
|
+
.pick-card span { font-family: var(--font-display); font-weight: 600; font-size: .9rem; color: var(--navy); }
|
|
98
|
+
.pick-card span::after { content: " →"; }
|
|
99
|
+
|
|
100
|
+
/* ============================================================================
|
|
101
|
+
Contact page — icon info band + form (clones /pages/contact-us)
|
|
102
|
+
========================================================================== */
|
|
103
|
+
.page-hero--center { text-align: center; background: none; color: inherit; }
|
|
104
|
+
.page-hero--center h1 { color: var(--ink); max-width: none; margin-inline: auto; }
|
|
105
|
+
.page-hero--center p { color: var(--muted); margin-inline: auto; }
|
|
106
|
+
|
|
107
|
+
.contact-band { background: var(--navy); border-radius: var(--radius-lg); color: #fff; }
|
|
108
|
+
.contact-band .contact-band__inner { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(16px, 3vw, 32px); padding: clamp(28px, 5vw, 48px); text-align: center; }
|
|
109
|
+
.contact-band__item svg { width: 40px; height: 40px; margin: 0 auto 16px; stroke: #fff; fill: none; stroke-width: 1.6; }
|
|
110
|
+
.contact-band__item a, .contact-band__item span { color: #fff; font-size: 1.02rem; font-weight: 500; }
|
|
111
|
+
.contact-band__item a:hover { text-decoration: underline; }
|
|
112
|
+
|
|
113
|
+
.contact-form { margin-top: clamp(1.75rem, 4vw, 2.75rem); display: grid; gap: 16px; }
|
|
114
|
+
.contact-form .row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
|
|
115
|
+
.contact-form input, .contact-form textarea {
|
|
116
|
+
width: 100%; font: inherit; color: var(--ink); background: var(--surface);
|
|
117
|
+
border: 1px solid var(--border); border-radius: var(--radius); padding: 15px 18px;
|
|
118
|
+
}
|
|
119
|
+
.contact-form textarea { min-height: 180px; resize: vertical; }
|
|
120
|
+
.contact-form input::placeholder, .contact-form textarea::placeholder { color: var(--muted); }
|
|
121
|
+
.contact-form input:focus, .contact-form textarea:focus { outline: none; border-color: var(--navy); box-shadow: 0 0 0 3px rgba(0,48,160,.14); }
|
|
122
|
+
.contact-form .btn-primary { width: 100%; padding-block: 1em; font-size: 1rem; }
|
|
123
|
+
|
|
124
|
+
/* ============================================================================
|
|
125
|
+
Blog index — post-card grid (clones /blogs/news "Latest News")
|
|
126
|
+
========================================================================== */
|
|
127
|
+
.blog-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(16px, 2.4vw, 28px); }
|
|
128
|
+
.blog-card {
|
|
129
|
+
display: flex; flex-direction: column; gap: 10px; padding: 24px;
|
|
130
|
+
background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
131
|
+
transition: transform .14s, box-shadow .14s, border-color .14s;
|
|
132
|
+
}
|
|
133
|
+
.blog-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
|
|
134
|
+
.blog-card__date { font-size: .8rem; color: var(--muted); font-weight: 600; letter-spacing: .02em; }
|
|
135
|
+
.blog-card h2 { font-size: 1.18rem; line-height: 1.25; color: var(--ink); }
|
|
136
|
+
.blog-card h2 a:hover { color: var(--navy); }
|
|
137
|
+
.blog-card__more { margin-top: auto; font-family: var(--font-display); font-weight: 600; color: var(--navy); font-size: .9rem; }
|
|
138
|
+
.blog-card__more:hover { text-decoration: underline; }
|
|
139
|
+
.blog-card__more::after { content: " →"; }
|
|
140
|
+
|
|
141
|
+
/* --- Responsive ----------------------------------------------------------- */
|
|
142
|
+
@media (max-width: 900px) {
|
|
143
|
+
.pick-grid { grid-template-columns: repeat(2, 1fr); }
|
|
144
|
+
.blog-grid { grid-template-columns: repeat(2, 1fr); }
|
|
145
|
+
}
|
|
146
|
+
@media (max-width: 760px) {
|
|
147
|
+
.split .container, .split--rev .container { grid-template-columns: 1fr; direction: ltr; }
|
|
148
|
+
.split--rev .split__media { order: -1; }
|
|
149
|
+
.contact-band .contact-band__inner { grid-template-columns: 1fr; }
|
|
150
|
+
.contact-form .row2 { grid-template-columns: 1fr; }
|
|
151
|
+
}
|
|
152
|
+
@media (max-width: 560px) {
|
|
153
|
+
.pick-grid { grid-template-columns: 1fr 1fr; }
|
|
154
|
+
.blog-grid { grid-template-columns: 1fr; }
|
|
155
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Giant Vapes — "giant-navy" theme (swappable token + base layer)
|
|
3
|
+
Brand: deep navy #1b3b64 on white, warm gold accent #e0a83a. Mirrors
|
|
4
|
+
giantvapes.com. This file is the reskinnable layer: design tokens, reset, and
|
|
5
|
+
base element styles. Shared components live in pages/mkt.css; home-only in
|
|
6
|
+
pages/home.css. Token values mirror tenants/giantvapes/theme.json.
|
|
7
|
+
========================================================================== */
|
|
8
|
+
|
|
9
|
+
/* --- Design tokens -------------------------------------------------------- */
|
|
10
|
+
:root {
|
|
11
|
+
--navy: #1b3b64;
|
|
12
|
+
--navy-dark: #142d4d;
|
|
13
|
+
--navy-ink: #0f2138;
|
|
14
|
+
--ink: #16243d;
|
|
15
|
+
--muted: #5b6a82;
|
|
16
|
+
--bg: #ffffff;
|
|
17
|
+
--surface: #f5f7fa;
|
|
18
|
+
--surface-2: #eaeef4;
|
|
19
|
+
--border: #e3e8ef;
|
|
20
|
+
--gold: #e0a83a;
|
|
21
|
+
--gold-dark: #c8901f;
|
|
22
|
+
--sale: #8a5d10;
|
|
23
|
+
--ok: #2f8a5b;
|
|
24
|
+
|
|
25
|
+
--radius-sm: 6px;
|
|
26
|
+
--radius: 10px;
|
|
27
|
+
--radius-lg: 16px;
|
|
28
|
+
--shadow-sm: 0 1px 2px rgba(15, 33, 56, .06), 0 1px 3px rgba(15, 33, 56, .08);
|
|
29
|
+
--shadow-md: 0 6px 18px rgba(15, 33, 56, .10);
|
|
30
|
+
--shadow-lg: 0 18px 48px rgba(15, 33, 56, .16);
|
|
31
|
+
|
|
32
|
+
--container: 1240px;
|
|
33
|
+
--font-body: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
34
|
+
--font-display: "Montserrat", var(--font-body);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* --- Reset ---------------------------------------------------------------- */
|
|
38
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
39
|
+
* { margin: 0; }
|
|
40
|
+
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
|
|
41
|
+
body {
|
|
42
|
+
font-family: var(--font-body);
|
|
43
|
+
color: var(--ink);
|
|
44
|
+
background: var(--bg);
|
|
45
|
+
line-height: 1.55;
|
|
46
|
+
-webkit-font-smoothing: antialiased;
|
|
47
|
+
text-rendering: optimizeLegibility;
|
|
48
|
+
}
|
|
49
|
+
img, svg, video { display: block; max-width: 100%; height: auto; }
|
|
50
|
+
a { color: inherit; text-decoration: none; }
|
|
51
|
+
button { font: inherit; cursor: pointer; }
|
|
52
|
+
ul { list-style: none; padding: 0; }
|
|
53
|
+
|
|
54
|
+
/* --- Base typography ------------------------------------------------------ */
|
|
55
|
+
h1, h2, h3, h4 { font-family: var(--font-display); font-weight: 700; line-height: 1.12; color: var(--ink); letter-spacing: -.01em; }
|
|
56
|
+
h1 { font-size: clamp(2rem, 4.6vw, 3.15rem); }
|
|
57
|
+
h2 { font-size: clamp(1.6rem, 3.2vw, 2.35rem); }
|
|
58
|
+
h3 { font-size: 1.2rem; }
|
|
59
|
+
p { color: var(--muted); }
|
|
60
|
+
|
|
61
|
+
/* --- Accessibility -------------------------------------------------------- */
|
|
62
|
+
:focus-visible { outline: 3px solid var(--navy); outline-offset: 2px; border-radius: 4px; }
|
|
63
|
+
.skip-link {
|
|
64
|
+
position: absolute; left: 8px; top: -48px; z-index: 200;
|
|
65
|
+
background: var(--navy); color: #fff; padding: 10px 16px; border-radius: 0 0 8px 8px;
|
|
66
|
+
transition: top .15s ease;
|
|
67
|
+
}
|
|
68
|
+
.skip-link:focus { top: 0; }
|
|
69
|
+
.sr-only {
|
|
70
|
+
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
|
|
71
|
+
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
|
|
72
|
+
}
|
|
73
|
+
@media (prefers-reduced-motion: reduce) {
|
|
74
|
+
html { scroll-behavior: auto; }
|
|
75
|
+
*, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
|
|
76
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_vendor": "Giant Vapes",
|
|
3
|
+
"_note": "Per-vendor theme override (DeepPartial<ThemeTokens>). Matched from giantvapes.com; the brand adopter can regenerate this file. Keyed by tenant_id (giantvapes). Recovered from the old 'pilot' fixture (git 4ed56c3^) when giantvapes was reconstituted as its own colocated tenant.",
|
|
4
|
+
"color": {
|
|
5
|
+
"bg": "#ffffff",
|
|
6
|
+
"surface": "#f5f7fa",
|
|
7
|
+
"text": "#16243d",
|
|
8
|
+
"muted": "#5b6a82",
|
|
9
|
+
"primary": "#1b3b64",
|
|
10
|
+
"primary-contrast": "#ffffff",
|
|
11
|
+
"accent": "#e0a83a",
|
|
12
|
+
"border": "#e3e8ef",
|
|
13
|
+
"success": "#2f8a5b",
|
|
14
|
+
"sale": "#8a5d10"
|
|
15
|
+
},
|
|
16
|
+
"type": {
|
|
17
|
+
"display": {
|
|
18
|
+
"family": "Montserrat",
|
|
19
|
+
"weights": [
|
|
20
|
+
600,
|
|
21
|
+
700,
|
|
22
|
+
800
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"body": {
|
|
26
|
+
"family": "Inter",
|
|
27
|
+
"weights": [
|
|
28
|
+
400,
|
|
29
|
+
500,
|
|
30
|
+
600
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"brand": {
|
|
35
|
+
"logoLight": "https://giantvapes.com/cdn/shop/files/GiantLogo_white_200x.png?v=1738709402",
|
|
36
|
+
"ogImage": "https://giantvapes.com/cdn/shop/files/Giant_Logo_Black-01_56304d21-10fc-4a79-822e-dce1097f5c70.png?v=1738699970",
|
|
37
|
+
"headerVariant": "dark"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,304 @@
|
|
|
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
|
+
<title>Regulated Storefront by Token of Trust© — commerce that can’t be shut off</title>
|
|
7
|
+
<meta name="description" content="The commerce platform built for what you sell — so you’re never one policy decision away from being shut down. Designed so no one can deplatform you.">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
|
11
|
+
<link rel="stylesheet" href="/tenants/home/pages/storefront.css">
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<header>
|
|
15
|
+
<div class="wrap nav">
|
|
16
|
+
<div class="lockup">
|
|
17
|
+
<img src="/tenants/home/logo-wordmark.png" alt="Token of Trust">
|
|
18
|
+
<span class="div"></span>
|
|
19
|
+
<span class="prod grad">Regulated Storefront</span>
|
|
20
|
+
</div>
|
|
21
|
+
<nav class="nav-links">
|
|
22
|
+
<a href="#cant-shut-off" data-ev="nav_why">Why it can’t be shut off</a>
|
|
23
|
+
<a href="#compare" data-ev="nav_compare">Compare</a>
|
|
24
|
+
<a href="#who" data-ev="nav_who">Who it’s for</a>
|
|
25
|
+
</nav>
|
|
26
|
+
<div class="nav-right">
|
|
27
|
+
<a class="login" href="/auth/login?next=%2Fdashboard" data-ev="login">Log in</a>
|
|
28
|
+
<a class="btn btn-grad" href="#request" data-ev="request_access_header">Request early access <svg class="arrow" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</header>
|
|
32
|
+
|
|
33
|
+
<section class="hero" data-section="hero">
|
|
34
|
+
<span class="blob b1"></span><span class="blob b2"></span>
|
|
35
|
+
<div class="wrap hero-grid">
|
|
36
|
+
<div>
|
|
37
|
+
<span class="eyebrow"><span class="dot"></span> Early access · by invitation</span>
|
|
38
|
+
<h1>Built for what you sell — so no one can <span class="grad">shut you off.</span></h1>
|
|
39
|
+
<p class="lede">The commerce platform for regulated brands: vape, nicotine, hemp, alcohol. Compliance is native and <b>can’t be turned off</b>, so you’re never one policy decision away from a shutdown like Shopify or BigCommerce. <b>Sleep at night.</b></p>
|
|
40
|
+
<div class="hero-ctas">
|
|
41
|
+
<a class="btn btn-grad" href="#request" data-ev="request_access_hero">Request early access <svg class="arrow" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
42
|
+
<a class="btn btn-line" href="#cant-shut-off" data-ev="why_cant_shut_off">Why it can’t be shut off</a>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="cues">
|
|
45
|
+
<span><span class="tk"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span> No surprise suspensions for what you legally sell</span>
|
|
46
|
+
<span><span class="tk"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span> Payments that don’t freeze mid-season</span>
|
|
47
|
+
<span><span class="tk"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span> Own Your Exit — your store, code, and SEO come with you</span>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="stage">
|
|
51
|
+
<div class="console">
|
|
52
|
+
<div class="c-head"><span class="url">🔒 highproofspirits.com</span><span class="c-live"><i></i> Live</span></div>
|
|
53
|
+
<div class="c-body">
|
|
54
|
+
<div class="crow"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><span class="lab">Storefront</span><span class="val"><b>Live</b> · 99.99% uptime</span></div>
|
|
55
|
+
<div class="crow"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><span class="lab">Payments</span><span class="val"><b>Clearing</b> · $48,210 today</span></div>
|
|
56
|
+
<div class="crow"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><span class="lab">Age & ID checks</span><span class="val"><b>Passing</b> · can’t be turned off</span></div>
|
|
57
|
+
<div class="crow"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><span class="lab">Compliance</span><span class="val"><b>Filed</b> · PACT + excise</span></div>
|
|
58
|
+
<div class="crow"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><span class="lab">SEO</span><span class="val"><b>12,480</b> pages · yours to keep</span></div>
|
|
59
|
+
<div class="crow killed"><span class="ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg></span><span class="lab">Shopify · account under review — restricted goods</span><span class="val">left behind</span></div>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="c-foot"><b>One platform</b> — store, payments, verification & compliance<span class="migbadge">migrated in 6 days</span></div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</section>
|
|
66
|
+
|
|
67
|
+
<section class="fear" data-section="fear">
|
|
68
|
+
<div class="wrap">
|
|
69
|
+
<div class="big"><span class="u">$0</span></div>
|
|
70
|
+
<div>
|
|
71
|
+
<span class="kicker" style="color:#7fe3d6">The risk is real</span>
|
|
72
|
+
<h2>What’s left of your revenue the day the platform decides your category is a liability.</h2>
|
|
73
|
+
<p>Regulated merchants run their whole business on someone else’s platform. One policy change, one flagged category, and the store is shut off — no appeal, no warning. In June 2026, a wave of mass deplatforming hit the vape & nicotine category on a major cart platform.</p>
|
|
74
|
+
<p class="src">source: TOT Ecommerce direction — “a platform nobody can kick you off of”</p>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</section>
|
|
78
|
+
|
|
79
|
+
<section class="blk" id="cant-shut-off" data-section="cant-shut-off">
|
|
80
|
+
<div class="wrap">
|
|
81
|
+
<div class="center">
|
|
82
|
+
<span class="kicker">Why it can’t be shut off</span>
|
|
83
|
+
<h2 class="big2">Three reasons no one can pull the plug on your store</h2>
|
|
84
|
+
<p class="section-lede center">Not a promise in a terms-of-service page — it’s how the platform is built.</p>
|
|
85
|
+
</div>
|
|
86
|
+
<div class="pillars">
|
|
87
|
+
<article class="pillar">
|
|
88
|
+
<span class="pic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3v11m0-11L8 7m4-4l4 4"/><path d="M5 14v4a2 2 0 002 2h10a2 2 0 002-2v-4"/></svg></span>
|
|
89
|
+
<h3>One vendor, and Own Your Exit</h3>
|
|
90
|
+
<p>The thing you actually worry about when you pick a platform: getting stuck, or getting cut off. So one platform, one relationship — not five services that can each drop you — and we <b>back it with a guarantee</b>: we deliver the experience we promised, or we help you <b>eject your storefront</b> — a clean, runnable copy of everything (code, brand, content, catalog) — to take anywhere you want. <b>Shopify will never do that. We will.</b> <span style="display:block;margin-top:8px;font-size:.78rem;color:var(--muted)">Some terms & conditions apply.</span></p>
|
|
91
|
+
<span class="tag">guaranteed — or you take it and go</span>
|
|
92
|
+
</article>
|
|
93
|
+
<article class="pillar">
|
|
94
|
+
<span class="pic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z"/><path d="M9 12l2.2 2.2L15.5 9.5"/></svg></span>
|
|
95
|
+
<h3>Built for what you sell</h3>
|
|
96
|
+
<p>Regulated categories aren’t a liability we tolerate until a policy update — they’re the whole reason we exist. Our line is the law, not taste: <b>if it’s legal, you’re welcome.</b> Age, ID, excise and state rules are native, so we handle the compliance instead of policing your catalog.</p>
|
|
97
|
+
<span class="tag">as long as it’s legal</span>
|
|
98
|
+
</article>
|
|
99
|
+
<article class="pillar">
|
|
100
|
+
<span class="pic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 10V8a6 6 0 1112 0v2M5 10h14v10H5z"/></svg></span>
|
|
101
|
+
<h3>Compliance you can’t turn off</h3>
|
|
102
|
+
<p>The age gate and legal warnings live where no edit — yours or an AI’s — can reach them, and a store that hides them simply won’t publish. In a world where you’re moving fast and AI can hallucinate, that hard floor is the assurance that lets you ship quickly without ever shipping a violation.</p>
|
|
103
|
+
<span class="tag">won’t ship if the gate is missing</span>
|
|
104
|
+
</article>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
|
|
109
|
+
<section class="cmp-wrap blk" id="compare" data-section="compare">
|
|
110
|
+
<div class="wrap">
|
|
111
|
+
<div class="center">
|
|
112
|
+
<span class="kicker">Coming from somewhere else?</span>
|
|
113
|
+
<h2 class="big2">Better than the platform you’re on now</h2>
|
|
114
|
+
<p class="section-lede center">Honest, code-backed head-to-heads. Click any platform to see where it gets regulated merchants — and how we’re different.</p>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="cmp-cards">
|
|
117
|
+
|
|
118
|
+
<div class="cmp" data-cmp="shopify">
|
|
119
|
+
<button class="top" aria-expanded="false" data-ev="compare_shopify">
|
|
120
|
+
<span class="logo" style="background:#95bf47">S</span>
|
|
121
|
+
<span class="tt"><span class="nm">Shopify</span><span class="sub">The deplatformer</span></span>
|
|
122
|
+
<svg class="chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
|
|
123
|
+
</button>
|
|
124
|
+
<div class="panel">
|
|
125
|
+
<div class="row2 them"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M12 8v5M12 16.5v.5"/><circle cx="12" cy="12" r="9"/></svg> Where it gets you</div>
|
|
126
|
+
<p>Regulated categories are a policy liability. Shopify can flag your category and <b>shut you off with no appeal</b> — the June 2026 vape/nicotine deplatforming wave hit stores that did nothing wrong. And you can’t take your store with you.</p></div>
|
|
127
|
+
<div class="row2 us"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg> How we’re different</div>
|
|
128
|
+
<p>Built for regulated goods on purpose. <b>Own Your Exit</b>: ask once, get a clean runnable copy of everything — code, brand, content, catalog. The relationship outlives the hosting.</p></div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="cmp" data-cmp="bigcommerce">
|
|
133
|
+
<button class="top" aria-expanded="false" data-ev="compare_bigcommerce">
|
|
134
|
+
<span class="logo" style="background:#121118">B</span>
|
|
135
|
+
<span class="tt"><span class="nm">BigCommerce</span><span class="sub">Tolerant, not compliant</span></span>
|
|
136
|
+
<svg class="chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
|
|
137
|
+
</button>
|
|
138
|
+
<div class="panel">
|
|
139
|
+
<div class="row2 them"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M12 8v5M12 16.5v.5"/><circle cx="12" cy="12" r="9"/></svg> Where it gets you</div>
|
|
140
|
+
<p>Credit where due: real commerce maturity, headless, a deep ecosystem. But <b>open isn’t governed, and tolerant isn’t compliant</b> — tolerance can change with a policy update, and there’s no native age/ID, excise, or compliance-gated publish. That’s the 2026 “tolerance tax.”</p></div>
|
|
141
|
+
<div class="row2 us"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg> How we’re different</div>
|
|
142
|
+
<p>Native compliance that can’t be turned off, an <b>agent-governed ship</b> (green evidence or it doesn’t publish), multi-tenant delegation for agencies, and Own Your Exit.</p></div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div class="cmp" data-cmp="woocommerce">
|
|
147
|
+
<button class="top" aria-expanded="false" data-ev="compare_woocommerce">
|
|
148
|
+
<span class="logo" style="background:#7f54b3">W</span>
|
|
149
|
+
<span class="tt"><span class="nm">WooCommerce</span><span class="sub">Sovereignty + the whole burden</span></span>
|
|
150
|
+
<svg class="chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6 6-6"/></svg>
|
|
151
|
+
</button>
|
|
152
|
+
<div class="panel">
|
|
153
|
+
<div class="row2 them"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M12 8v5M12 16.5v.5"/><circle cx="12" cy="12" r="9"/></svg> Where it gets you</div>
|
|
154
|
+
<p>Total sovereignty — and the <b>entire burden</b>. You own the payment-underwriting fight, a 4-vendor compliance stack, the plugin patch treadmill (<b>96% of WordPress vulnerabilities</b> come from plugins), ~40–50% Core Web Vitals, and no governed agent. Honest credit: Woo wins on ecosystem, cost, maturity, and portability.</p></div>
|
|
155
|
+
<div class="row2 us"><div class="h"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg> How we’re different</div>
|
|
156
|
+
<p>Sovereignty <b>without</b> the burden: managed edge (~100 Lighthouse), built-in age/ID + excise + compliance-gated ship, an agent-native MCP build loop, and Own Your Exit.</p></div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
</section>
|
|
163
|
+
|
|
164
|
+
<section class="persona-wrap blk" id="who" data-section="who">
|
|
165
|
+
<div class="wrap center">
|
|
166
|
+
<span class="kicker">Why you should care</span>
|
|
167
|
+
<h2 class="big2">Pick your seat</h2>
|
|
168
|
+
<p class="section-lede center">The same platform answers a different concern depending on who you are. Choose one — then read the full story.</p>
|
|
169
|
+
<div class="seg" role="tablist">
|
|
170
|
+
<button role="tab" aria-selected="true" data-persona="owner" data-ev="persona_owner">Merchant owner</button>
|
|
171
|
+
<button role="tab" aria-selected="false" data-persona="developer" data-ev="persona_developer">Developer</button>
|
|
172
|
+
<button role="tab" aria-selected="false" data-persona="agency" data-ev="persona_agency">Agency</button>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
<div class="wrap">
|
|
176
|
+
|
|
177
|
+
<div class="ppanel on" data-panel="owner">
|
|
178
|
+
<div class="lft">
|
|
179
|
+
<span class="who">Merchant owner</span>
|
|
180
|
+
<h3>Your store. Your rules. Nobody’s to shut down.</h3>
|
|
181
|
+
<p>For vape, nicotine, hemp, and alcohol brands who are done living one policy change away from losing everything.</p>
|
|
182
|
+
<a class="deck" href="https://mcp.tokenoftrust.com/decks/mcp-storefront/view" target="_blank" rel="noopener" data-ev="deck_owner">See the full owner story <svg class="arrow" viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="rgt">
|
|
185
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z"/></svg></span><div><div class="bt">Never deplatformed overnight</div><div class="bd">The store is yours to keep — outgrow us and walk away with the whole thing.</div></div></div>
|
|
186
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12h8M8 8h8M8 16h5"/></svg></span><div><div class="bt">Build it in a conversation</div><div class="bd">Describe changes in plain language to a copilot that speaks Token of Trust. Live in a day, not a quarter.</div></div></div>
|
|
187
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><div><div class="bt">Compliance you can’t turn off</div><div class="bd">Age gate and warnings live where no edit reaches. A store that breaks the rules won’t publish — not even for you.</div></div></div>
|
|
188
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg></span><div><div class="bt">You hold the go-live gate</div><div class="bd">Every change previews first, ships on one informed click, and rolls back in one step.</div></div></div>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div class="ppanel" data-panel="developer">
|
|
193
|
+
<div class="lft">
|
|
194
|
+
<span class="who">Developer</span>
|
|
195
|
+
<h3>Develop fast. Publish live. Never ship a violation.</h3>
|
|
196
|
+
<p>Point your AI agent at Token of Trust and build against your real, running store — fast and safe to develop, and easy to publish and go live. The running site is the screen.</p>
|
|
197
|
+
<a class="deck" href="https://mcp.tokenoftrust.com/decks/mcp-developer/view" target="_blank" rel="noopener" data-ev="deck_developer">See the full developer story <svg class="arrow" viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="rgt">
|
|
200
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H5a2 2 0 00-2 2v3M16 3h3a2 2 0 012 2v3M8 21H5a2 2 0 01-2-2v-3M16 21h3a2 2 0 002-2v-3"/></svg></span><div><div class="bt">Live recipes & specs</div><div class="bd">Pulled from the real endpoint at request time — never a stale PDF. Your agent turns them into working code.</div></div></div>
|
|
201
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z"/></svg></span><div><div class="bt">Easy to develop, easy to publish</div><div class="bd">Build against your real running store, preview every change safely, then publish live in one step. The running site is the screen — no staging guesswork.</div></div></div>
|
|
202
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span><div><div class="bt">Green means ship</div><div class="bd">A compliance coach rides beside your agent and names the one thing to fix — it never invents legal copy.</div></div></div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<div class="ppanel" data-panel="agency">
|
|
207
|
+
<div class="lft">
|
|
208
|
+
<span class="who">Agency</span>
|
|
209
|
+
<h3>One login. Every client store.</h3>
|
|
210
|
+
<p>Ship approved changes to your clients’ live stores — without ever holding their keys.</p>
|
|
211
|
+
<a class="deck" href="https://mcp.tokenoftrust.com/decks/mcp-agency/view" target="_blank" rel="noopener" data-ev="deck_agency">See the full agency story <svg class="arrow" viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
212
|
+
</div>
|
|
213
|
+
<div class="rgt">
|
|
214
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M15 12H3M11 8l4 4-4 4M21 4v16"/></svg></span><div><div class="bt">Ship without holding keys</div><div class="bd">Roll a green, approved change to a client’s live store on the authority they grant — not a shared admin login.</div></div></div>
|
|
215
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z"/></svg></span><div><div class="bt">Granted, scoped, revocable</div><div class="bd">The owner authorizes you from their dashboard and can pull it back in one click. Each client walled off from every other.</div></div></div>
|
|
216
|
+
<div class="ben"><span class="bic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4M21 12v7a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h11"/></svg></span><div><div class="bt">A receipt for every ship</div><div class="bd">Every grant, ship, and rollback is logged with who and what — tiered from preview-only to ship-approved.</div></div></div>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
</div>
|
|
221
|
+
</section>
|
|
222
|
+
|
|
223
|
+
<section class="final" id="request" data-section="request">
|
|
224
|
+
<div class="wrap">
|
|
225
|
+
<div class="cta-band">
|
|
226
|
+
<span class="cb cb1"></span><span class="cb cb2"></span>
|
|
227
|
+
<span class="kicker">Get early access</span>
|
|
228
|
+
<h2>A store nobody can take from you.</h2>
|
|
229
|
+
<p>We’re in early access, onboarding regulated brands by invitation. Tell us what you sell and we’ll get you a store you can sleep behind.</p>
|
|
230
|
+
<div class="hero-ctas">
|
|
231
|
+
<a class="btn btn-white" href="#request" data-ev="request_access_footer">Request early access <svg class="arrow" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
|
|
232
|
+
<a class="btn btn-line" href="/auth/login?next=%2Fdashboard" data-ev="login_footer" style="background:transparent;color:#fff;border-color:rgba(255,255,255,.3)">Log in</a>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</section>
|
|
237
|
+
|
|
238
|
+
<div class="strip">
|
|
239
|
+
<div class="wrap">
|
|
240
|
+
<div class="built">
|
|
241
|
+
<span class="k">Built for</span>
|
|
242
|
+
<span class="tag">Alcohol</span><span class="sep">·</span><span class="tag">Vape & tobacco</span><span class="sep">·</span>
|
|
243
|
+
<span class="tag">Nicotine</span><span class="sep">·</span><span class="tag">Hemp & CBD</span><span class="sep">·</span>
|
|
244
|
+
<span class="tag">Firearms</span><span class="sep">·</span><span class="tag">High-risk DTC</span>
|
|
245
|
+
</div>
|
|
246
|
+
<div class="repl">Replaces <b>Shopify</b> · <b>BigCommerce</b> · <b>WooCommerce</b> + your host</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
<footer class="foot">
|
|
251
|
+
<div class="wrap">© 2026 Token of Trust®. Regulated Storefront is in early access. Own Your Look · Own Your Exit · We will never sell your data.</div>
|
|
252
|
+
</footer>
|
|
253
|
+
|
|
254
|
+
<!-- Request early access — modal opened by any [href="#request"] CTA (see storefront.js) -->
|
|
255
|
+
<div class="modal" id="ra-modal" role="dialog" aria-modal="true" aria-labelledby="ra-title">
|
|
256
|
+
<div class="ov" data-close></div>
|
|
257
|
+
<div class="dlg">
|
|
258
|
+
<div class="dlg-head">
|
|
259
|
+
<div>
|
|
260
|
+
<h3 id="ra-title">Request early access</h3>
|
|
261
|
+
<p>Tell us what you sell and we’ll be in touch about a store you can sleep behind.</p>
|
|
262
|
+
</div>
|
|
263
|
+
<button class="x" type="button" data-close aria-label="Close">
|
|
264
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
|
|
265
|
+
</button>
|
|
266
|
+
</div>
|
|
267
|
+
<form class="ra" novalidate>
|
|
268
|
+
<div class="fld">
|
|
269
|
+
<label for="ra-email">Work email</label>
|
|
270
|
+
<input id="ra-email" name="email" type="email" required autocomplete="email" placeholder="you@yourbrand.com">
|
|
271
|
+
</div>
|
|
272
|
+
<div class="row">
|
|
273
|
+
<div class="fld">
|
|
274
|
+
<label for="ra-first">First name</label>
|
|
275
|
+
<input id="ra-first" name="firstName" type="text" required autocomplete="given-name">
|
|
276
|
+
</div>
|
|
277
|
+
<div class="fld">
|
|
278
|
+
<label for="ra-last">Last name</label>
|
|
279
|
+
<input id="ra-last" name="lastName" type="text" required autocomplete="family-name">
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
<div class="fld">
|
|
283
|
+
<label for="ra-phone">Phone <span class="opt">(optional)</span></label>
|
|
284
|
+
<input id="ra-phone" name="phone" type="tel" autocomplete="tel">
|
|
285
|
+
</div>
|
|
286
|
+
<div class="fld">
|
|
287
|
+
<label for="ra-details">What do you sell? <span class="opt">(optional)</span></label>
|
|
288
|
+
<textarea id="ra-details" name="details" placeholder="Category, current platform, monthly volume — whatever helps us help you."></textarea>
|
|
289
|
+
</div>
|
|
290
|
+
<div class="err" role="alert"></div>
|
|
291
|
+
<button class="btn btn-grad" type="submit">Request early access <svg class="arrow" viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></button>
|
|
292
|
+
</form>
|
|
293
|
+
<div class="ra-done">
|
|
294
|
+
<span class="tick"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 7"/></svg></span>
|
|
295
|
+
<h3>Thanks — we’ll be in touch.</h3>
|
|
296
|
+
<p>We review every request personally and onboard regulated brands by invitation. Watch your inbox.</p>
|
|
297
|
+
<button class="btn btn-line" type="button" data-close>Close</button>
|
|
298
|
+
</div>
|
|
299
|
+
</div>
|
|
300
|
+
</div>
|
|
301
|
+
|
|
302
|
+
<script src="/tenants/home/js/storefront.js" defer></script>
|
|
303
|
+
</body>
|
|
304
|
+
</html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"seoTitle": "Home",
|
|
3
|
+
"seoDescription": "Storefront home — coming soon.",
|
|
4
|
+
"blocks": [
|
|
5
|
+
{
|
|
6
|
+
"component": "hero",
|
|
7
|
+
"headline": "Storefront",
|
|
8
|
+
"subhead": "This is the default home. A real homepage is coming soon.",
|
|
9
|
+
"ctaLabel": "Browse the catalog",
|
|
10
|
+
"ctaHref": "/collections"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|