@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,66 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Token of Trust — industries (solutions) page-local styles
|
|
3
|
+
----------------------------------------------------------------------------
|
|
4
|
+
Tokens, reset, layout, typography, header/nav, footer, buttons, .kicker,
|
|
5
|
+
.reassurance and the reveal animation live in the shared theme
|
|
6
|
+
(tot-navy.css, v1.1). This file holds ONLY industries-page compositions: the
|
|
7
|
+
centred hero, the industry card grid, the CTA band and the nav active pill.
|
|
8
|
+
Consumes the shared token layer (no :root re-declare); primary CTAs route
|
|
9
|
+
through --color-cta. Do not minify — one rule per line, keep the headers.
|
|
10
|
+
========================================================================== */
|
|
11
|
+
|
|
12
|
+
/* Hero (centred) --------------------------------------------------- */
|
|
13
|
+
.hero { text-align: center; padding: 72px 0 0; }
|
|
14
|
+
.hero h1 { margin: 16px auto; max-width: 20ch; }
|
|
15
|
+
.hero .lede { max-width: 58ch; margin: 0 auto; }
|
|
16
|
+
.hero .cta-row { justify-content: center; margin-top: 28px; }
|
|
17
|
+
|
|
18
|
+
/* CTA variants over the shared .btn base -------------------------- */
|
|
19
|
+
.btn-ent { background: var(--color-cta); color: #fff; box-shadow: 0 7px 20px rgba(21, 122, 74, .28); }
|
|
20
|
+
.btn-ent:hover { background: var(--color-cta-hover); }
|
|
21
|
+
|
|
22
|
+
/* Industry card grid ---------------------------------------------- */
|
|
23
|
+
.ind-section { padding-top: var(--s5); }
|
|
24
|
+
.ind-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; margin-top: 44px; }
|
|
25
|
+
.ind-card {
|
|
26
|
+
padding: 28px; background: #fff; border: 1px solid var(--line); border-radius: var(--r); border-top: 3px solid var(--teal);
|
|
27
|
+
transition: transform .2s, box-shadow .2s;
|
|
28
|
+
}
|
|
29
|
+
.ind-card:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
|
|
30
|
+
.ind-card h3 { font-size: 1.12rem; letter-spacing: -.01em; color: var(--navy); margin-bottom: 10px; }
|
|
31
|
+
.ind-card p { font-size: .92rem; color: var(--muted); }
|
|
32
|
+
|
|
33
|
+
/* CTA band (over shared alt-bg + .ent-band) ----------------------- */
|
|
34
|
+
.alt-bg { background: #fff; border-block: 1px solid var(--line); }
|
|
35
|
+
.ent-band { padding: 64px 40px; text-align: center; background: linear-gradient(135deg, var(--navy), var(--navy-2)); border-radius: 26px; color: #fff; }
|
|
36
|
+
.ent-band .kicker { color: #7fe3b8; }
|
|
37
|
+
.ent-band h2 { color: #fff; }
|
|
38
|
+
.ent-band p { max-width: 52ch; margin: 0 auto; color: #b8c8de; }
|
|
39
|
+
.cta-center { justify-content: center; margin-top: 24px; }
|
|
40
|
+
.ent-band .btn-line { background: transparent; color: #fff; border-color: rgba(255, 255, 255, .5); }
|
|
41
|
+
.ent-band .btn-line:hover { border-color: #fff; }
|
|
42
|
+
|
|
43
|
+
/* Nav active pill + footer note ----------------------------------- */
|
|
44
|
+
nav.primary a.active { color: var(--teal-ink); background: #eaf5f2; padding: 6px 16px; border-radius: 999px; font-weight: 700; }
|
|
45
|
+
.foot-note { font-size: .88rem; margin-top: 12px; max-width: 34ch; color: var(--muted); }
|
|
46
|
+
|
|
47
|
+
/* Responsive ------------------------------------------------------ */
|
|
48
|
+
@media (max-width: 920px) {
|
|
49
|
+
.ind-grid { grid-template-columns: 1fr 1fr; }
|
|
50
|
+
}
|
|
51
|
+
@media (max-width: 560px) {
|
|
52
|
+
.ind-grid { grid-template-columns: 1fr; max-width: 440px; margin-inline: auto; }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Dark theme — literal light surfaces + decorative tints */
|
|
56
|
+
@media (prefers-color-scheme: dark) {
|
|
57
|
+
:root:not([data-theme="light"]) {
|
|
58
|
+
.ind-card, .alt-bg { background: var(--card); }
|
|
59
|
+
nav.primary a.active { background: rgba(43, 179, 166, .16); color: var(--teal-ink); }
|
|
60
|
+
.ind-card h3 { color: var(--ink); }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
:root[data-theme="dark"] .ind-card,
|
|
64
|
+
:root[data-theme="dark"] .alt-bg { background: var(--card); }
|
|
65
|
+
:root[data-theme="dark"] nav.primary a.active { background: rgba(43, 179, 166, .16); color: var(--teal-ink); }
|
|
66
|
+
:root[data-theme="dark"] .ind-card h3 { color: var(--ink); }
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Token of Trust — "tot-navy" theme (role: current · style concept v1.0.0)
|
|
3
|
+
----------------------------------------------------------------------------
|
|
4
|
+
The reusable design-system foundation extracted verbatim (values unchanged)
|
|
5
|
+
from the design-11 marketing prototype that home.html + pricing.html were
|
|
6
|
+
ported from. This is the SHARED vocabulary only — tokens, base, typography,
|
|
7
|
+
buttons, chrome (header/nav/footer), the proof strip, and interaction/reveal
|
|
8
|
+
+ responsive rules. Page-specific compositions (the animated hero console,
|
|
9
|
+
before/after, journey, plan cards, FAQ, industry grids) are NOT here — they
|
|
10
|
+
stay page-local.
|
|
11
|
+
|
|
12
|
+
Source of truth for the style guide at /_style-guide/tokenoftrust/tot-navy/.
|
|
13
|
+
Do not minify. Keep one rule per line and the section headers below.
|
|
14
|
+
========================================================================== */
|
|
15
|
+
|
|
16
|
+
/* --- 1. Design tokens ---------------------------------------------------- */
|
|
17
|
+
:root {
|
|
18
|
+
/* Enterprise anchor */
|
|
19
|
+
--navy: #10294b;
|
|
20
|
+
--navy-2: #173763;
|
|
21
|
+
--navy-soft: #1e4275;
|
|
22
|
+
/* Soft neutrals */
|
|
23
|
+
--cream: #faf8f4;
|
|
24
|
+
--card: #ffffff;
|
|
25
|
+
--line: #e6e2d9;
|
|
26
|
+
--line-cool: #dfe6ee;
|
|
27
|
+
--ink: #1b2a40;
|
|
28
|
+
--muted: #5d6b80;
|
|
29
|
+
/* Warm + trust accents */
|
|
30
|
+
--teal: #0ea5a3;
|
|
31
|
+
--coral: #f97362;
|
|
32
|
+
--green: #1d9e5f;
|
|
33
|
+
--green-d: #17854f;
|
|
34
|
+
--gold: #d9a93f;
|
|
35
|
+
--grad: linear-gradient(115deg, var(--teal), #3b82c4);
|
|
36
|
+
/* Shape */
|
|
37
|
+
--r: 20px;
|
|
38
|
+
--r-sm: 13px;
|
|
39
|
+
--shadow: 0 12px 36px rgba(16, 41, 75, .10);
|
|
40
|
+
--shadow-soft: 0 8px 24px rgba(27, 42, 64, .07);
|
|
41
|
+
/* Spacing scale */
|
|
42
|
+
--s1: 8px;
|
|
43
|
+
--s2: 16px;
|
|
44
|
+
--s3: 24px;
|
|
45
|
+
--s4: 44px;
|
|
46
|
+
--s5: 72px;
|
|
47
|
+
--s6: 104px;
|
|
48
|
+
/* Type families */
|
|
49
|
+
--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
50
|
+
--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* --- 2. Reset & base ----------------------------------------------------- */
|
|
54
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
55
|
+
html { scroll-behavior: smooth; }
|
|
56
|
+
body { font-family: var(--sans); background: var(--cream); color: var(--ink); line-height: 1.65; }
|
|
57
|
+
img, svg { max-width: 100%; }
|
|
58
|
+
a { color: inherit; }
|
|
59
|
+
|
|
60
|
+
/* --- 3. Layout ----------------------------------------------------------- */
|
|
61
|
+
.container { max-width: 1150px; margin: 0 auto; padding: 0 var(--s3); }
|
|
62
|
+
.skip-link { position: absolute; left: -9999px; top: 0; background: var(--navy); color: #fff; padding: 10px 16px; z-index: 100; border-radius: 0 0 10px 0; }
|
|
63
|
+
.skip-link:focus { left: 0; }
|
|
64
|
+
.center { text-align: center; }
|
|
65
|
+
.center .section-lede { margin: 0 auto; }
|
|
66
|
+
section { padding: var(--s5) 0; }
|
|
67
|
+
|
|
68
|
+
/* --- 4. Typography ------------------------------------------------------- */
|
|
69
|
+
h1 { font-size: clamp(2.1rem, 4.6vw, 3.25rem); line-height: 1.12; letter-spacing: -.025em; margin: var(--s2) 0; font-weight: 800; color: var(--navy); }
|
|
70
|
+
h1 .grad { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
|
|
71
|
+
h2 { font-size: clamp(1.65rem, 3.3vw, 2.35rem); letter-spacing: -.02em; line-height: 1.16; margin: 10px 0 14px; font-weight: 800; color: var(--navy); }
|
|
72
|
+
.kicker { font-size: .78rem; font-weight: 800; letter-spacing: .15em; text-transform: uppercase; color: var(--teal); }
|
|
73
|
+
.lede { font-size: 1.13rem; color: var(--muted); max-width: 52ch; }
|
|
74
|
+
.section-lede { color: var(--muted); max-width: 62ch; font-size: 1.05rem; }
|
|
75
|
+
.support-line { font-size: .98rem; font-weight: 700; color: var(--coral); margin-top: 10px; }
|
|
76
|
+
.eyebrow { display: inline-flex; align-items: center; gap: 9px; background: #fff; border: 1px solid var(--line); border-radius: 999px; padding: 7px 16px; font-size: .82rem; font-weight: 700; color: var(--navy); }
|
|
77
|
+
.eyebrow .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); animation: pulse 2.2s infinite; }
|
|
78
|
+
|
|
79
|
+
/* --- 5. Buttons ---------------------------------------------------------- */
|
|
80
|
+
.btn { display: inline-block; padding: 12px 24px; border-radius: 12px; font-weight: 700; font-size: .94rem; text-decoration: none; border: 0; cursor: pointer; transition: transform .15s, box-shadow .15s, filter .15s, background .15s; }
|
|
81
|
+
.btn:hover { transform: translateY(-2px); }
|
|
82
|
+
.btn-green { background: var(--green); color: #fff; box-shadow: 0 7px 20px rgba(29, 158, 95, .3); }
|
|
83
|
+
.btn-green:hover { background: var(--green-d); }
|
|
84
|
+
.btn-navy { background: var(--navy); color: #fff; }
|
|
85
|
+
.btn-navy:hover { background: var(--navy-2); }
|
|
86
|
+
.btn-line { background: #fff; color: var(--navy); border: 1.5px solid var(--line-cool); }
|
|
87
|
+
.btn-line:hover { border-color: var(--navy); }
|
|
88
|
+
|
|
89
|
+
/* --- 6. Header / primary nav -------------------------------------------- */
|
|
90
|
+
header.site { position: sticky; top: 0; z-index: 50; background: rgba(250, 248, 244, .92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }
|
|
91
|
+
.nav-row { display: flex; align-items: center; justify-content: space-between; height: 70px; }
|
|
92
|
+
.brand { display: flex; align-items: center; text-decoration: none; }
|
|
93
|
+
.brand img { height: 34px; width: auto; display: block; }
|
|
94
|
+
nav.primary ul { display: flex; gap: 28px; list-style: none; align-items: center; }
|
|
95
|
+
nav.primary a { text-decoration: none; font-weight: 600; font-size: .94rem; color: var(--muted); }
|
|
96
|
+
nav.primary a:hover { color: var(--navy); }
|
|
97
|
+
.nav-cta { display: flex; gap: 12px; align-items: center; }
|
|
98
|
+
.hamburger { display: none; background: none; border: 0; cursor: pointer; padding: 8px; }
|
|
99
|
+
.hamburger span { display: block; width: 24px; height: 2.5px; background: var(--ink); margin: 5px 0; border-radius: 2px; }
|
|
100
|
+
|
|
101
|
+
/* --- 7. Proof strip ------------------------------------------------------ */
|
|
102
|
+
.proof { background: var(--navy); color: #cfdced; padding: 18px 0; }
|
|
103
|
+
.proof .container { display: flex; flex-wrap: wrap; gap: 14px 34px; align-items: center; justify-content: center; }
|
|
104
|
+
.proof span { font-size: .82rem; font-weight: 600; display: flex; align-items: center; gap: 8px; white-space: nowrap; }
|
|
105
|
+
.proof b { color: #fff; }
|
|
106
|
+
.proof .sep { opacity: .35; }
|
|
107
|
+
|
|
108
|
+
/* --- 8. Footer ----------------------------------------------------------- */
|
|
109
|
+
footer.site { border-top: 1px solid var(--line); padding: var(--s5) 0; background: #f4f1ea; }
|
|
110
|
+
.foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--s4); }
|
|
111
|
+
.foot-grid h3 { font-size: .76rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; font-weight: 800; }
|
|
112
|
+
.foot-grid ul { list-style: none; }
|
|
113
|
+
.foot-grid li { margin-bottom: 9px; }
|
|
114
|
+
.foot-grid a { text-decoration: none; font-size: .92rem; font-weight: 600; }
|
|
115
|
+
.foot-grid a:hover { color: var(--teal); }
|
|
116
|
+
.copyright { margin-top: var(--s4); color: var(--muted); font-size: .85rem; }
|
|
117
|
+
|
|
118
|
+
/* --- 9. Interaction / reveal -------------------------------------------- */
|
|
119
|
+
.reveal { opacity: 0; transform: translateY(24px); transition: opacity .65s ease, transform .65s ease; }
|
|
120
|
+
.reveal.in { opacity: 1; transform: none; }
|
|
121
|
+
@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(29, 158, 95, .5); } 50% { box-shadow: 0 0 0 6px rgba(29, 158, 95, 0); } }
|
|
122
|
+
|
|
123
|
+
/* --- 10. Responsive foundation ------------------------------------------ */
|
|
124
|
+
@media (max-width: 980px) {
|
|
125
|
+
.foot-grid { grid-template-columns: 1fr 1fr; }
|
|
126
|
+
nav.primary { display: none; position: absolute; top: 70px; left: 0; right: 0; background: var(--cream); border-bottom: 1px solid var(--line); padding: 18px 24px; }
|
|
127
|
+
nav.primary.open { display: block; }
|
|
128
|
+
nav.primary ul { flex-direction: column; align-items: flex-start; gap: 18px; }
|
|
129
|
+
.hamburger { display: block; }
|
|
130
|
+
.nav-cta .btn-line { display: none; }
|
|
131
|
+
}
|
|
132
|
+
@media (prefers-reduced-motion: reduce) {
|
|
133
|
+
*, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
|
|
134
|
+
.reveal { opacity: 1; transform: none; }
|
|
135
|
+
html { scroll-behavior: auto; }
|
|
136
|
+
}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Token of Trust — "tot-navy" theme · concept v1.1 (ecommerce-hardened)
|
|
3
|
+
----------------------------------------------------------------------------
|
|
4
|
+
v1.0.0 (baseline, faithful design-11 extraction) is retained at
|
|
5
|
+
tot-navy-1.0.0.css. v1.1 hardens it to the ecommerce style-guide quality bar:
|
|
6
|
+
WCAG 2.2 AA contrast + visible focus-visible rings, >=44px tap targets, a
|
|
7
|
+
semantic token layer, full interactive states, accessible form styles,
|
|
8
|
+
trust/social-proof component slots (placeholder — never fabricate claims),
|
|
9
|
+
an explicit CTA hierarchy, color-scheme, and perf-conscious motion.
|
|
10
|
+
Do not minify. One rule per line; keep the section headers.
|
|
11
|
+
========================================================================== */
|
|
12
|
+
|
|
13
|
+
/* --- 1. Design tokens ---------------------------------------------------- */
|
|
14
|
+
:root {
|
|
15
|
+
color-scheme: light;
|
|
16
|
+
|
|
17
|
+
/* Enterprise anchor */
|
|
18
|
+
--navy: #10294b;
|
|
19
|
+
--navy-2: #173763;
|
|
20
|
+
--navy-soft: #1e4275;
|
|
21
|
+
/* Soft neutrals */
|
|
22
|
+
--cream: #faf8f4;
|
|
23
|
+
--card: #ffffff;
|
|
24
|
+
--line: #e6e2d9;
|
|
25
|
+
--line-cool: #dfe6ee;
|
|
26
|
+
--ink: #1b2a40;
|
|
27
|
+
--muted: #4d5a70; /* darkened from v1.0 (#5d6b80) for AA on cream + white */
|
|
28
|
+
/* Warm + trust accents (decorative) */
|
|
29
|
+
--teal: #0d9391; /* deepened for >=3:1 on cream (decorative/large use) */
|
|
30
|
+
--teal-ink: #0b6360; /* AA-safe teal for small text (kickers/links) */
|
|
31
|
+
--coral: #bf3d2c; /* AA on cream (~5.1:1) — safe as normal text (.support-line) */
|
|
32
|
+
--green: #1d9e5f;
|
|
33
|
+
--green-d: #17854f;
|
|
34
|
+
--gold: #8a6012; /* deep amber, AA on cream (~5.2:1) — safe for text + rating icons */
|
|
35
|
+
--grad: linear-gradient(115deg, var(--teal), #3b82c4);
|
|
36
|
+
|
|
37
|
+
/* Semantic tokens (v1.1) — the layer components should consume */
|
|
38
|
+
--color-cta: #16794a; /* primary action bg; white text = AA (~5.4:1) */
|
|
39
|
+
--color-cta-hover: #115f3a;
|
|
40
|
+
--color-trust: var(--teal-ink);
|
|
41
|
+
--color-error: #b3261e;
|
|
42
|
+
--color-success: #157a4a;
|
|
43
|
+
--color-warning: #8a5a10;
|
|
44
|
+
--surface-card: var(--card);
|
|
45
|
+
--surface-raised: var(--card);
|
|
46
|
+
--text-muted: var(--muted);
|
|
47
|
+
--focus-ring: #4f7fff; /* >=3:1 focus outline on BOTH cream (~3.4:1) and navy (~3.6:1) */
|
|
48
|
+
|
|
49
|
+
/* Shape */
|
|
50
|
+
--r: 20px;
|
|
51
|
+
--r-sm: 13px;
|
|
52
|
+
--shadow: 0 12px 36px rgba(16, 41, 75, .10);
|
|
53
|
+
--shadow-soft: 0 8px 24px rgba(27, 42, 64, .07);
|
|
54
|
+
/* Spacing scale */
|
|
55
|
+
--s1: 8px;
|
|
56
|
+
--s2: 16px;
|
|
57
|
+
--s3: 24px;
|
|
58
|
+
--s4: 44px;
|
|
59
|
+
--s5: 72px;
|
|
60
|
+
--s6: 104px;
|
|
61
|
+
/* Type families */
|
|
62
|
+
--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
63
|
+
--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
64
|
+
--tap: 44px; /* minimum interactive target */
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* --- 1b. Dark theme -------------------------------------------------------
|
|
68
|
+
Applies automatically for OS/browser dark mode, and is togglable ahead of
|
|
69
|
+
any future manual switch via [data-theme="dark"] / [data-theme="light"]
|
|
70
|
+
on <html> (the attribute always wins over the media query). Same token
|
|
71
|
+
names, dark values only — components below never re-branch on theme. */
|
|
72
|
+
@media (prefers-color-scheme: dark) {
|
|
73
|
+
:root { color-scheme: dark; }
|
|
74
|
+
}
|
|
75
|
+
:root[data-theme="dark"] { color-scheme: dark; }
|
|
76
|
+
@media (prefers-color-scheme: dark) {
|
|
77
|
+
:root:not([data-theme="light"]) {
|
|
78
|
+
--navy: #17335a;
|
|
79
|
+
--navy-2: #1f4272;
|
|
80
|
+
--navy-soft: #2c527f;
|
|
81
|
+
--cream: #0b1220;
|
|
82
|
+
--card: #131c2c;
|
|
83
|
+
--line: #263349;
|
|
84
|
+
--line-cool: #2b3c58;
|
|
85
|
+
--ink: #e7ecf5;
|
|
86
|
+
--muted: #9aa9c2;
|
|
87
|
+
--teal: #2bb3a6;
|
|
88
|
+
--teal-ink: #5eead4;
|
|
89
|
+
--coral: #ff9478;
|
|
90
|
+
--green: #34d399;
|
|
91
|
+
--green-d: #22c55e;
|
|
92
|
+
--gold: #f2c14e;
|
|
93
|
+
--grad: linear-gradient(115deg, var(--teal), #60a5fa);
|
|
94
|
+
|
|
95
|
+
--color-cta: #1c9c5e;
|
|
96
|
+
--color-cta-hover: #22b56c;
|
|
97
|
+
--color-trust: var(--teal-ink);
|
|
98
|
+
--color-error: #ff6b6b;
|
|
99
|
+
--color-success: #34d399;
|
|
100
|
+
--color-warning: #f2b84b;
|
|
101
|
+
--surface-card: var(--card);
|
|
102
|
+
--surface-raised: var(--card);
|
|
103
|
+
--text-muted: var(--muted);
|
|
104
|
+
--focus-ring: #7f9fff;
|
|
105
|
+
|
|
106
|
+
--shadow: 0 12px 36px rgba(0, 0, 0, .45);
|
|
107
|
+
--shadow-soft: 0 8px 24px rgba(0, 0, 0, .35);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
:root[data-theme="dark"] {
|
|
111
|
+
--navy: #17335a;
|
|
112
|
+
--navy-2: #1f4272;
|
|
113
|
+
--navy-soft: #2c527f;
|
|
114
|
+
--cream: #0b1220;
|
|
115
|
+
--card: #131c2c;
|
|
116
|
+
--line: #263349;
|
|
117
|
+
--line-cool: #2b3c58;
|
|
118
|
+
--ink: #e7ecf5;
|
|
119
|
+
--muted: #9aa9c2;
|
|
120
|
+
--teal: #2bb3a6;
|
|
121
|
+
--teal-ink: #5eead4;
|
|
122
|
+
--coral: #ff9478;
|
|
123
|
+
--green: #34d399;
|
|
124
|
+
--green-d: #22c55e;
|
|
125
|
+
--gold: #f2c14e;
|
|
126
|
+
--grad: linear-gradient(115deg, var(--teal), #60a5fa);
|
|
127
|
+
|
|
128
|
+
--color-cta: #1c9c5e;
|
|
129
|
+
--color-cta-hover: #22b56c;
|
|
130
|
+
--color-trust: var(--teal-ink);
|
|
131
|
+
--color-error: #ff6b6b;
|
|
132
|
+
--color-success: #34d399;
|
|
133
|
+
--color-warning: #f2b84b;
|
|
134
|
+
--surface-card: var(--card);
|
|
135
|
+
--surface-raised: var(--card);
|
|
136
|
+
--text-muted: var(--muted);
|
|
137
|
+
--focus-ring: #7f9fff;
|
|
138
|
+
|
|
139
|
+
--shadow: 0 12px 36px rgba(0, 0, 0, .45);
|
|
140
|
+
--shadow-soft: 0 8px 24px rgba(0, 0, 0, .35);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* --- 2. Reset & base ----------------------------------------------------- */
|
|
144
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
145
|
+
html { scroll-behavior: smooth; }
|
|
146
|
+
body { font-family: var(--sans); background: var(--cream); color: var(--ink); line-height: 1.65; font-size: 16px; }
|
|
147
|
+
img, svg { max-width: 100%; }
|
|
148
|
+
a { color: inherit; }
|
|
149
|
+
|
|
150
|
+
/* Global visible focus — never remove the outline, only replace it (v1.1). */
|
|
151
|
+
:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; border-radius: 4px; }
|
|
152
|
+
|
|
153
|
+
/* --- 3. Layout ----------------------------------------------------------- */
|
|
154
|
+
.container { max-width: 1150px; margin: 0 auto; padding: 0 var(--s3); }
|
|
155
|
+
.skip-link { position: absolute; left: -9999px; top: 0; background: var(--navy); color: #fff; padding: 12px 18px; z-index: 100; border-radius: 0 0 10px 0; }
|
|
156
|
+
.skip-link:focus { left: 0; }
|
|
157
|
+
.center { text-align: center; }
|
|
158
|
+
.center .section-lede { margin: 0 auto; }
|
|
159
|
+
section { padding: var(--s5) 0; }
|
|
160
|
+
|
|
161
|
+
/* --- 4. Typography ------------------------------------------------------- */
|
|
162
|
+
h1 { font-size: clamp(2.1rem, 4.6vw, 3.25rem); line-height: 1.12; letter-spacing: -.025em; margin: var(--s2) 0; font-weight: 800; color: var(--navy); }
|
|
163
|
+
h1 .grad { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
|
|
164
|
+
h2 { font-size: clamp(1.65rem, 3.3vw, 2.35rem); letter-spacing: -.02em; line-height: 1.16; margin: 10px 0 14px; font-weight: 800; color: var(--navy); }
|
|
165
|
+
.kicker { font-size: .875rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; color: var(--teal-ink); }
|
|
166
|
+
.lede { font-size: 1.13rem; color: var(--muted); max-width: 52ch; }
|
|
167
|
+
.section-lede { color: var(--muted); max-width: 62ch; font-size: 1.05rem; }
|
|
168
|
+
.support-line { font-size: 1rem; font-weight: 700; color: var(--coral); margin-top: 10px; }
|
|
169
|
+
.eyebrow {
|
|
170
|
+
display: inline-flex; align-items: center; gap: 9px; background: #fff; border: 1px solid var(--line); border-radius: 999px; padding: 8px 16px;
|
|
171
|
+
font-size: .875rem; font-weight: 700; color: var(--navy);
|
|
172
|
+
}
|
|
173
|
+
.eyebrow .dot { position: relative; width: 8px; height: 8px; border-radius: 50%; background: var(--green); }
|
|
174
|
+
.eyebrow .dot::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: var(--green); animation: pulse 2.2s infinite; }
|
|
175
|
+
|
|
176
|
+
/* --- 5. Buttons — CTA hierarchy + full states (v1.1) --------------------- */
|
|
177
|
+
/* primary = green/cta · secondary = navy · tertiary = line/outline */
|
|
178
|
+
.btn {
|
|
179
|
+
display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: var(--tap); padding: 12px 24px; border-radius: 12px;
|
|
180
|
+
font-weight: 700; font-size: .95rem; text-decoration: none; border: 0; cursor: pointer;
|
|
181
|
+
transition: transform .15s, box-shadow .15s, filter .15s, background .15s;
|
|
182
|
+
}
|
|
183
|
+
.btn:hover { transform: translateY(-2px); }
|
|
184
|
+
.btn:active { transform: translateY(0); filter: brightness(.96); }
|
|
185
|
+
.btn:disabled, .btn[aria-disabled="true"], .btn.is-disabled { opacity: .55; cursor: not-allowed; transform: none; box-shadow: none; filter: grayscale(.2); }
|
|
186
|
+
.btn.is-loading, .btn[aria-busy="true"] { position: relative; color: transparent; pointer-events: none; }
|
|
187
|
+
.btn.is-loading::after {
|
|
188
|
+
content: ""; position: absolute; width: 16px; height: 16px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; color: #fff;
|
|
189
|
+
animation: btnspin .7s linear infinite;
|
|
190
|
+
}
|
|
191
|
+
@keyframes btnspin { to { transform: rotate(360deg); } }
|
|
192
|
+
.btn-green, .btn-primary { background: var(--color-cta); color: #fff; box-shadow: 0 7px 20px rgba(21, 122, 74, .28); }
|
|
193
|
+
.btn-green:hover, .btn-primary:hover { background: var(--color-cta-hover); }
|
|
194
|
+
.btn-navy, .btn-secondary { background: var(--navy); color: #fff; }
|
|
195
|
+
.btn-navy:hover, .btn-secondary:hover { background: var(--navy-2); }
|
|
196
|
+
.btn-line, .btn-tertiary, .btn-outline { background: #fff; color: var(--navy); border: 1.5px solid var(--line-cool); }
|
|
197
|
+
.btn-line:hover, .btn-tertiary:hover, .btn-outline:hover { border-color: var(--navy); }
|
|
198
|
+
|
|
199
|
+
/* --- 6. Header / primary nav (>=44px targets) --------------------------- */
|
|
200
|
+
header.site { position: sticky; top: 0; z-index: 50; background: rgba(250, 248, 244, .92); backdrop-filter: blur(12px); border-bottom: 1px solid var(--line); }
|
|
201
|
+
.nav-row { display: flex; align-items: center; justify-content: space-between; height: 70px; }
|
|
202
|
+
.brand { display: flex; align-items: center; text-decoration: none; min-height: var(--tap); }
|
|
203
|
+
.brand img { height: 34px; width: auto; display: block; }
|
|
204
|
+
nav.primary ul { display: flex; gap: 20px; list-style: none; align-items: center; }
|
|
205
|
+
nav.primary a {
|
|
206
|
+
display: inline-flex; align-items: center; min-height: var(--tap); text-decoration: none; font-weight: 600; font-size: .95rem; color: var(--muted);
|
|
207
|
+
}
|
|
208
|
+
nav.primary a:hover { color: var(--navy); }
|
|
209
|
+
.nav-cta { display: flex; gap: 12px; align-items: center; }
|
|
210
|
+
.hamburger { display: none; background: none; border: 0; cursor: pointer; min-width: var(--tap); min-height: var(--tap); }
|
|
211
|
+
.hamburger span { display: block; width: 24px; height: 2.5px; background: var(--ink); margin: 5px auto; border-radius: 2px; }
|
|
212
|
+
|
|
213
|
+
/* --- 7. Proof strip ------------------------------------------------------ */
|
|
214
|
+
.proof { background: var(--navy); color: #e2ebf6; padding: 18px 0; }
|
|
215
|
+
.proof .container { display: flex; flex-wrap: wrap; gap: 14px 34px; align-items: center; justify-content: center; }
|
|
216
|
+
.proof span { font-size: .9rem; font-weight: 600; display: flex; align-items: center; gap: 8px; white-space: nowrap; }
|
|
217
|
+
.proof b { color: #fff; }
|
|
218
|
+
.proof .sep { opacity: .45; }
|
|
219
|
+
|
|
220
|
+
/* --- 8. Footer ----------------------------------------------------------- */
|
|
221
|
+
footer.site { border-top: 1px solid var(--line); padding: var(--s5) 0; background: #f4f1ea; }
|
|
222
|
+
.foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--s4); }
|
|
223
|
+
.foot-grid h3 { font-size: .875rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; font-weight: 800; }
|
|
224
|
+
.foot-grid ul { list-style: none; }
|
|
225
|
+
.foot-grid li { margin-bottom: 4px; }
|
|
226
|
+
.foot-grid a { display: inline-flex; align-items: center; min-height: var(--tap); text-decoration: none; font-size: .95rem; font-weight: 600; }
|
|
227
|
+
.foot-grid a:hover { color: var(--teal-ink); }
|
|
228
|
+
.copyright { margin-top: var(--s4); color: var(--muted); font-size: .9rem; }
|
|
229
|
+
|
|
230
|
+
/* --- 9. Interaction / reveal -------------------------------------------- */
|
|
231
|
+
.reveal { opacity: 0; transform: translateY(24px); transition: opacity .65s ease, transform .65s ease; }
|
|
232
|
+
.reveal.in { opacity: 1; transform: none; }
|
|
233
|
+
/* Composited pulse (transform + opacity) — avoids non-composited box-shadow animation. */
|
|
234
|
+
@keyframes pulse { 0% { transform: scale(1); opacity: .5; } 100% { transform: scale(2.6); opacity: 0; } }
|
|
235
|
+
|
|
236
|
+
/* --- 10. Accessible forms (v1.1) ---------------------------------------- */
|
|
237
|
+
/* Field group: label + control + help/validation. required/optional marked. */
|
|
238
|
+
.form-field { display: grid; gap: 6px; margin-bottom: var(--s2); }
|
|
239
|
+
.form-label { font-weight: 700; font-size: .95rem; color: var(--ink); }
|
|
240
|
+
.form-label .req { color: var(--color-error); } /* required marker */
|
|
241
|
+
.form-label .opt { color: var(--muted); font-weight: 400; } /* optional marker */
|
|
242
|
+
.form-help { font-size: .9rem; color: var(--muted); } /* aria-describedby hint */
|
|
243
|
+
.form-control {
|
|
244
|
+
width: 100%; min-height: var(--tap); padding: 11px 14px; border: 1.5px solid var(--line-cool); border-radius: 10px; font: inherit; font-size: 1rem;
|
|
245
|
+
background: #fff; color: var(--ink);
|
|
246
|
+
}
|
|
247
|
+
.form-control::placeholder { color: #7a869a; }
|
|
248
|
+
.form-control:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; border-color: var(--navy); }
|
|
249
|
+
.form-control[aria-invalid="true"], .form-control.is-error { border-color: var(--color-error); }
|
|
250
|
+
.form-control.is-success { border-color: var(--color-success); }
|
|
251
|
+
.field-error { color: var(--color-error); font-size: .9rem; font-weight: 600; } /* invalid state */
|
|
252
|
+
.field-success { color: var(--color-success); font-size: .9rem; font-weight: 600; } /* success state */
|
|
253
|
+
|
|
254
|
+
/* --- 11. Trust / social-proof component slots (v1.1) -------------------- */
|
|
255
|
+
/* IMPORTANT: content is placeholder / needs-review. Never ship fabricated
|
|
256
|
+
ratings, testimonials, badges, guarantees, or customer/partner logos —
|
|
257
|
+
source-copy real claims or mark them needs-review. */
|
|
258
|
+
/* Reviews & ratings (e.g. star rating, "G2" / "Capterra" review card) */
|
|
259
|
+
.rating { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; color: var(--ink); }
|
|
260
|
+
.stars { color: var(--gold); letter-spacing: 2px; font-size: 1.05rem; }
|
|
261
|
+
.review-card { background: var(--surface-card); border: 1px solid var(--line); border-radius: var(--r-sm); padding: 16px 18px; }
|
|
262
|
+
/* Testimonial / customer quote */
|
|
263
|
+
.testimonial {
|
|
264
|
+
background: var(--surface-card); border: 1px solid var(--line); border-left: 4px solid var(--teal); border-radius: var(--r-sm); padding: 18px 20px;
|
|
265
|
+
}
|
|
266
|
+
.testimonial blockquote, .testimonial .quote { font-size: 1.02rem; color: var(--ink); }
|
|
267
|
+
.testimonial .cite { margin-top: 10px; font-size: .9rem; color: var(--muted); font-style: normal; }
|
|
268
|
+
/* Trust badge (security / compliance / certification) */
|
|
269
|
+
.trust-badge {
|
|
270
|
+
display: inline-flex; align-items: center; gap: 8px; background: #eef4ff; border: 1px solid var(--line-cool); color: var(--navy); border-radius: 999px;
|
|
271
|
+
padding: 8px 14px; font-size: .9rem; font-weight: 700;
|
|
272
|
+
}
|
|
273
|
+
/* Reassurance callout (guarantee / returns / refund / risk-free) */
|
|
274
|
+
.reassurance {
|
|
275
|
+
display: flex; align-items: center; gap: 10px; background: #f0f8f3; border: 1px solid #d3e9db; border-radius: var(--r-sm); padding: 12px 16px;
|
|
276
|
+
font-weight: 600; color: var(--ink);
|
|
277
|
+
}
|
|
278
|
+
/* Logo strip ("as seen in" / press / customer / partner logos) */
|
|
279
|
+
.logo-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 20px 32px; opacity: .85; }
|
|
280
|
+
.logo-strip .logo { height: 26px; display: inline-flex; align-items: center; color: var(--muted); font-weight: 800; letter-spacing: .04em; }
|
|
281
|
+
|
|
282
|
+
/* --- 12. CTA hierarchy helpers + mobile CTA (v1.1) ---------------------- */
|
|
283
|
+
.cta-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
|
|
284
|
+
.mobile-cta { display: none; } /* sticky primary CTA on small screens (below) */
|
|
285
|
+
|
|
286
|
+
/* --- 13. Responsive foundation ------------------------------------------ */
|
|
287
|
+
@media (max-width: 980px) {
|
|
288
|
+
.foot-grid { grid-template-columns: 1fr 1fr; }
|
|
289
|
+
nav.primary {
|
|
290
|
+
display: none; position: absolute; top: 70px; left: 0; right: 0; background: var(--cream); border-bottom: 1px solid var(--line); padding: 12px 24px;
|
|
291
|
+
}
|
|
292
|
+
nav.primary.open { display: block; }
|
|
293
|
+
nav.primary ul { flex-direction: column; align-items: stretch; gap: 0; }
|
|
294
|
+
nav.primary a { min-height: var(--tap); }
|
|
295
|
+
.hamburger { display: inline-flex; align-items: center; justify-content: center; }
|
|
296
|
+
.nav-cta .btn-line { display: none; }
|
|
297
|
+
/* thumb-reachable primary CTA */
|
|
298
|
+
.mobile-cta {
|
|
299
|
+
display: flex; position: sticky; bottom: 0; z-index: 60; gap: 10px; padding: 10px 16px calc(10px + env(safe-area-inset-bottom));
|
|
300
|
+
background: rgba(250, 248, 244, .96); border-top: 1px solid var(--line); backdrop-filter: blur(10px);
|
|
301
|
+
}
|
|
302
|
+
.mobile-cta .btn { flex: 1; }
|
|
303
|
+
}
|
|
304
|
+
@media (prefers-reduced-motion: reduce) {
|
|
305
|
+
*, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
|
|
306
|
+
.reveal { opacity: 1; transform: none; }
|
|
307
|
+
.btn.is-loading::after { animation: none; }
|
|
308
|
+
html { scroll-behavior: auto; }
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* --- 14. Mobile legibility floor (a11y) --------------------------------- */
|
|
312
|
+
/* On phone/tablet widths, no actionable or body text renders below the 14px
|
|
313
|
+
WCAG legibility minimum. max(0.875rem, 1em) only ever RAISES a size (never
|
|
314
|
+
shrinks below 14px), and !important lets it override page-local type scales
|
|
315
|
+
so no tenant page can opt an element under the floor. Desktop (>768px) keeps
|
|
316
|
+
its tighter editorial scale. Applies to every tenant page via the theme;
|
|
317
|
+
pairs with the >=44px tap targets on .brand / nav / .btn. */
|
|
318
|
+
@media (max-width: 768px) {
|
|
319
|
+
p, li, a, button, input, textarea, select, summary, small {
|
|
320
|
+
font-size: max(0.875rem, 1em) !important;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/* --- 15. Dark theme — component overrides (literals not on the token layer) */
|
|
325
|
+
@media (prefers-color-scheme: dark) {
|
|
326
|
+
:root:not([data-theme="light"]) {
|
|
327
|
+
header.site { background: rgba(11, 18, 32, .86); }
|
|
328
|
+
footer.site { background: #0e1728; }
|
|
329
|
+
.eyebrow { background: var(--card); }
|
|
330
|
+
.form-control { background: var(--card); color: var(--ink); }
|
|
331
|
+
.form-control::placeholder { color: #6b7a94; }
|
|
332
|
+
.trust-badge { background: #12233f; color: #d7e6ff; }
|
|
333
|
+
.reassurance { background: #0f2a1e; border-color: #1c4230; }
|
|
334
|
+
.brand img { background: #fff; padding: 4px 10px; border-radius: 8px; }
|
|
335
|
+
@media (max-width: 980px) { nav.primary { background: var(--cream); } }
|
|
336
|
+
/* --navy is a dark ANCHOR (panel bg / heading ink on light surfaces); on a
|
|
337
|
+
dark page it stays dark, so anything using it as heading/link-hover text
|
|
338
|
+
on the page or a card must repoint to --ink (near-white) to stay AA. Its
|
|
339
|
+
use as a background (console, ind-section, btn-navy, cta bands…) is
|
|
340
|
+
untouched — those already pair it with an explicit light text color. */
|
|
341
|
+
h1, h2, .eyebrow, nav.primary a:hover { color: var(--ink); }
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
:root[data-theme="dark"] header.site { background: rgba(11, 18, 32, .86); }
|
|
345
|
+
:root[data-theme="dark"] footer.site { background: #0e1728; }
|
|
346
|
+
:root[data-theme="dark"] .eyebrow { background: var(--card); }
|
|
347
|
+
:root[data-theme="dark"] .form-control { background: var(--card); color: var(--ink); }
|
|
348
|
+
:root[data-theme="dark"] .form-control::placeholder { color: #6b7a94; }
|
|
349
|
+
:root[data-theme="dark"] .trust-badge { background: #12233f; color: #d7e6ff; }
|
|
350
|
+
:root[data-theme="dark"] .reassurance { background: #0f2a1e; border-color: #1c4230; }
|
|
351
|
+
:root[data-theme="dark"] .brand img { background: #fff; padding: 4px 10px; border-radius: 8px; }
|
|
352
|
+
:root[data-theme="dark"] h1,
|
|
353
|
+
:root[data-theme="dark"] h2,
|
|
354
|
+
:root[data-theme="dark"] .eyebrow,
|
|
355
|
+
:root[data-theme="dark"] nav.primary a:hover { color: var(--ink); }
|
|
356
|
+
@media (max-width: 980px) {
|
|
357
|
+
:root[data-theme="dark"] nav.primary { background: var(--cream); }
|
|
358
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_vendor": "Token of Trust — corporate/marketing tenant",
|
|
3
|
+
"_note": "PROVISIONAL brand tokens for the non-commerce tenant. Palette + type are a professional B2B/SaaS interpretation (deep navy ink + trust teal accent) since the design reference did not expose CSS. Exact brand hex, fonts, and logo/wordmark asset are NEEDS-REVIEW — see docs/epics/tokenoftrust-site-inventory.md (brand provenance). Wordmark falls back to a text treatment until a licensed logo asset is cleared.",
|
|
4
|
+
"brand": {
|
|
5
|
+
"headerVariant": "light",
|
|
6
|
+
"heroVariant": "light",
|
|
7
|
+
"motion": "full"
|
|
8
|
+
},
|
|
9
|
+
"color": {
|
|
10
|
+
"bg": "#F7F9FC",
|
|
11
|
+
"surface": "#FFFFFF",
|
|
12
|
+
"text": "#0A2540",
|
|
13
|
+
"muted": "#55637A",
|
|
14
|
+
"primary": "#0A2540",
|
|
15
|
+
"primary-contrast": "#FFFFFF",
|
|
16
|
+
"accent": "#0E9F8E",
|
|
17
|
+
"border": "#E3E8EF",
|
|
18
|
+
"success": "#0E9F8E",
|
|
19
|
+
"sale": "#D64545"
|
|
20
|
+
},
|
|
21
|
+
"type": {
|
|
22
|
+
"display": { "family": "Plus Jakarta Sans", "weights": [500, 600, 700, 800] },
|
|
23
|
+
"body": { "family": "Inter", "weights": [400, 500, 600] },
|
|
24
|
+
"mono": { "family": "JetBrains Mono", "weights": [400, 500] },
|
|
25
|
+
"scale": 1.2,
|
|
26
|
+
"tracking": "-0.018em"
|
|
27
|
+
},
|
|
28
|
+
"shape": {
|
|
29
|
+
"radius": { "sm": "4px", "md": "8px", "lg": "16px", "full": "999px" }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noUncheckedIndexedAccess": true,
|
|
9
|
+
"noImplicitOverride": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"forceConsistentCasingInFileNames": true,
|
|
14
|
+
"verbatimModuleSyntax": true,
|
|
15
|
+
"isolatedModules": true,
|
|
16
|
+
"declaration": true,
|
|
17
|
+
"declarationMap": true,
|
|
18
|
+
"sourceMap": true
|
|
19
|
+
}
|
|
20
|
+
}
|