@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,65 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<title>Privacy Policy | Giant Vapes</title>
|
|
3
|
+
<meta name="description" content="Giant Vapes' Privacy Notice describes how your privacy is protected when you access, interact with, and use our site.">
|
|
4
|
+
<link rel="canonical" href="https://giantvapes.com/pages/privacy-policy">
|
|
5
|
+
<meta name="robots" content="index,follow">
|
|
6
|
+
<meta property="og:type" content="website">
|
|
7
|
+
<meta property="og:site_name" content="Giant Vapes">
|
|
8
|
+
<meta property="og:title" content="Privacy Policy | Giant Vapes">
|
|
9
|
+
<meta property="og:description" content="How Giant Vapes protects your privacy when you use our site.">
|
|
10
|
+
<meta property="og:url" content="https://giantvapes.com/pages/privacy-policy">
|
|
11
|
+
<meta property="og:image" content="/tenants/giantvapes/img/og.jpg">
|
|
12
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
13
|
+
<script type="application/ld+json">
|
|
14
|
+
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://giantvapes.com/"},{"@type":"ListItem","position":2,"name":"Privacy Policy","item":"https://giantvapes.com/pages/privacy-policy"}]}
|
|
15
|
+
</script>
|
|
16
|
+
<link rel="stylesheet" href="/tenants/giantvapes/pages/page.css">
|
|
17
|
+
</head>
|
|
18
|
+
<main id="main">
|
|
19
|
+
|
|
20
|
+
<section class="page-hero">
|
|
21
|
+
<div class="container">
|
|
22
|
+
<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Home</a> / Privacy Policy</nav>
|
|
23
|
+
<span class="eyebrow">Policies</span>
|
|
24
|
+
<h1>Privacy Policy</h1>
|
|
25
|
+
<p>How your privacy is protected when you access, interact with, and use this site.</p>
|
|
26
|
+
</div>
|
|
27
|
+
</section>
|
|
28
|
+
|
|
29
|
+
<section class="section">
|
|
30
|
+
<div class="container prose">
|
|
31
|
+
|
|
32
|
+
<p>Welcome! We thank you for visiting our website ("Site"). This PRIVACY NOTICE ("Privacy Notice") describes the ways in which your privacy is protected when you access, interact with and use this Site.</p>
|
|
33
|
+
<p>By using this Site, you agree to all Giant Vapes policies made available to you within this Site including, but not limited to, our Terms and Conditions of Use and Sale (available on the Internet at https://www.giantvapes.com/terms-conditions/ ("Terms"), which are hereby incorporated by this reference. Capitalized terms not otherwise defined in this Privacy Notice shall have the meanings ascribed to them in the Terms.</p>
|
|
34
|
+
<p>With respect to the collection of your information, if you do not want your personal information collected, please do not submit it to us. If you have already submitted information and would like to review, correct, or remove it from our records, please contact us. Pursuant to tobacco product regulations, user information collected during order placement and age verification will be stored for a minimum of five years and will be shared with tobacco tax enforcement or jurisdictional law enforcement as required by federal, state or local law and upon a legal request for the aforementioned information. This information is not subject to removal or alteration by request.</p>
|
|
35
|
+
<p>By visiting and using the Site, you are deemed to have agreed to the provisions of this Privacy Notice, unless you are in the EEA or Switzerland in which case you are acknowledging that you have been provided this Privacy Notice.</p>
|
|
36
|
+
|
|
37
|
+
<h3>Legal Compliance</h3>
|
|
38
|
+
<p>Giant Vapes may disclose Users' Personal Information when such disclosure is:</p>
|
|
39
|
+
<ul class="bullets">
|
|
40
|
+
<li>necessary to conform to legal requirements or to respond to a subpoena, search warrant or other legal process received by Giant Vapes, whether or not a response is required by applicable law;</li>
|
|
41
|
+
<li>necessary to enforce or apply our Terms and other related agreements; or</li>
|
|
42
|
+
<li>to protect the rights, property, or safety of Giant Vapes, our employees, our Users or other members of the general public.</li>
|
|
43
|
+
</ul>
|
|
44
|
+
<p>Except in the limited circumstances set forth below, Giant Vapes will not sell, share or disclose Personal Information it collects to third parties without your prior consent.</p>
|
|
45
|
+
|
|
46
|
+
<h3>Rights for EEA Residents</h3>
|
|
47
|
+
<p>In addition, if you are a resident of the EEA, you have the right to:</p>
|
|
48
|
+
<ul class="bullets">
|
|
49
|
+
<li>Find out if we use your personal information, to access your personal information, and receive copies of your personal information.</li>
|
|
50
|
+
<li>Withdraw any express consent that you have provided to the processing of your personal information at any time without penalty.</li>
|
|
51
|
+
<li>Access your personal information and have it corrected or amended if it is inaccurate or incomplete.</li>
|
|
52
|
+
<li>Obtain a transferable copy of some of your personal information which can be transferred to another provider when the personal information was processed based on your consent.</li>
|
|
53
|
+
</ul>
|
|
54
|
+
<p>If you wish to exercise any of these rights, or raise a complaint on how we have handled your personal information, please <a href="/pages/contact-us">contact us</a>.</p>
|
|
55
|
+
|
|
56
|
+
<h3>Changes in Our Privacy Notice</h3>
|
|
57
|
+
<p>From time-to-time we may modify, change, update, add to, remove portions of or otherwise alter this Privacy Notice. If we make changes, we will post them on our Site to make Users aware of what the changes are so Users will always be aware of what information we collect, how we collect and use that information, and when we may disclose such information. If you object to any such changes, you must immediately cease using the Site. A User is bound by any changes to this Privacy Notice when he, she or it uses the Site after those changes have been posted.</p>
|
|
58
|
+
|
|
59
|
+
<h3>Contact, Questions or Feedback</h3>
|
|
60
|
+
<p>When we receive formal written complaints, it is our policy to contact the person regarding his or her concerns. We will cooperate with the appropriate regulatory authorities, including local data protection authorities, to resolve any complaints regarding the transfer of personal data that cannot be resolved between Giant Vapes and an individual.</p>
|
|
61
|
+
|
|
62
|
+
</div>
|
|
63
|
+
</section>
|
|
64
|
+
|
|
65
|
+
</main>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<title>Shipping & Returns | Giant Vapes</title>
|
|
3
|
+
<meta name="description" content="Giant Vapes shipping and returns policy: fast, reliable shipping, 30-day returns on new unopened hardware, and details on refunds, exchanges, and tracking.">
|
|
4
|
+
<link rel="canonical" href="https://giantvapes.com/pages/shipping-returns">
|
|
5
|
+
<meta name="robots" content="index,follow">
|
|
6
|
+
<meta property="og:type" content="website">
|
|
7
|
+
<meta property="og:site_name" content="Giant Vapes">
|
|
8
|
+
<meta property="og:title" content="Shipping & Returns | Giant Vapes">
|
|
9
|
+
<meta property="og:description" content="Fast, reliable shipping and a 30-day return policy on new unopened hardware.">
|
|
10
|
+
<meta property="og:url" content="https://giantvapes.com/pages/shipping-returns">
|
|
11
|
+
<meta property="og:image" content="/tenants/giantvapes/img/og.jpg">
|
|
12
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
13
|
+
<script type="application/ld+json">
|
|
14
|
+
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://giantvapes.com/"},{"@type":"ListItem","position":2,"name":"Shipping & Returns","item":"https://giantvapes.com/pages/shipping-returns"}]}
|
|
15
|
+
</script>
|
|
16
|
+
<link rel="stylesheet" href="/tenants/giantvapes/pages/page.css">
|
|
17
|
+
</head>
|
|
18
|
+
<main id="main">
|
|
19
|
+
|
|
20
|
+
<section class="page-hero">
|
|
21
|
+
<div class="container">
|
|
22
|
+
<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Home</a> / Shipping & Returns</nav>
|
|
23
|
+
<span class="eyebrow">Policies</span>
|
|
24
|
+
<h1>Shipping & Returns</h1>
|
|
25
|
+
<p>Fast, reliable shipping and a straightforward returns policy.</p>
|
|
26
|
+
</div>
|
|
27
|
+
</section>
|
|
28
|
+
|
|
29
|
+
<section class="section">
|
|
30
|
+
<div class="container prose">
|
|
31
|
+
|
|
32
|
+
<h2>Giant Vapes Shipping Policy</h2>
|
|
33
|
+
<p>At Giant Vapes, we take pride in our ability to provide fast and reliable shipping to our customers. To ensure this, all orders will be processed and shipped by an independent trusted third-party shipping company from one of our fulfillment centers.</p>
|
|
34
|
+
<p>We understand the importance of timely delivery, which is why we strive to get your order shipped out as soon as possible. All orders are typically shipped within 24 business hours, excluding weekends and holidays.</p>
|
|
35
|
+
<p>Please note that shipping times may vary depending on your location and the shipping method selected. Once your order has shipped, you will receive a tracking number via email so that you can easily track your package and stay up-to-date on its delivery status.</p>
|
|
36
|
+
<p>It is important to us that your order is delivered to you in a timely and secure manner. That is why we entrust an independent third-party shipping company to handle the entire shipping process.</p>
|
|
37
|
+
<p>If you have any questions or concerns about your order or its shipment, please don't hesitate to reach out to our <a href="/pages/contact-us">customer service team</a> for assistance. We're always here to help!</p>
|
|
38
|
+
|
|
39
|
+
<h2>Returns & refunds</h2>
|
|
40
|
+
<p>We offer a monetary refund for a 30-day period for any new unopened hardware product/s. This is only available for hardware purchased from giantvapes.com, <strong>consumable nicotine products are not eligible for return, refund or exchange</strong>. The refund amount will only be for the price of the item, shipping fees and shipping insurance costs will not be refunded. Please note: <em>Clearance items are All Sales Final. No exchanges or returns.</em></p>
|
|
41
|
+
<p>***Any Giant Vapes products purchased from 3rd party resellers are not eligible for refunds, and instead, fall under the specific refund policy for the store where the item(s) were purchased originally.</p>
|
|
42
|
+
<p>Our refund and returns policy lasts 30 days. If 30 days have passed since your purchase, we cannot offer you a refund or exchange.</p>
|
|
43
|
+
<p>To be eligible to return your item(s) must be unused and in the same condition that you received them, and still in their original packaging.</p>
|
|
44
|
+
<p>To complete your return, we require a receipt or proof of purchase.</p>
|
|
45
|
+
<p>If any item(s) are returned for a refund and are found to be or used in any way, no refund will be processed, and the item(s) in question will not be able to be returned to you as the customer.</p>
|
|
46
|
+
<p>Giant Vapes is a reseller, not a manufacturer, if any manufacturing defects are found you must contact the manufacturer directly and submit a warranty claim with them. All after sales support for hardware is handled by the respective manufacturers.</p>
|
|
47
|
+
<p>Giant Vapes utilizes a fulfillment center for shipping your order, we are not responsible for any mishandling, delay or error in the shipping process. If your order did not reach you please contact the shipper and use the provided tracking information to find your order. Shipping insurance is available at checkout, if you elect not to add shipping insurance Giant Vapes will NOT provide refunds or product replacements due to shipper negligence.</p>
|
|
48
|
+
|
|
49
|
+
<h3>Refunds</h3>
|
|
50
|
+
<p>To return your product, contact us for eligibility first. Once your return is received and inspected to verify it is unused and unopened, we will send you an email to notify you that we have received your returned item. We will also notify you of the approval or rejection of your refund.</p>
|
|
51
|
+
<p>If you are approved, then your refund will be processed, and a credit will automatically be applied to your credit card or original method of payment within 7-10 business days.</p>
|
|
52
|
+
|
|
53
|
+
<h3>Late or missing refunds</h3>
|
|
54
|
+
<p>If you haven't received a refund yet, first check your bank account again.</p>
|
|
55
|
+
<p>Then contact your credit card company, it may take some time before your refund is officially posted. Next contact your bank. There is often some processing time before a refund is posted.</p>
|
|
56
|
+
|
|
57
|
+
<h3>Sale items</h3>
|
|
58
|
+
<p>Only regular priced items may be refunded. Sale items cannot be refunded or exchanged.</p>
|
|
59
|
+
|
|
60
|
+
<h3>Exchanges</h3>
|
|
61
|
+
<p>We only replace items if they are defective or damaged. If this is the case and you need to exchange it for the same item, please contact us.</p>
|
|
62
|
+
|
|
63
|
+
<h3>Gifts</h3>
|
|
64
|
+
<p>If the item was marked as a gift when purchased and shipped directly to you, you'll receive a gift credit for the value of your return.</p>
|
|
65
|
+
<p>If the item wasn't marked as a gift when purchased, or the gift giver had the order shipped to themselves to give to you later, we will send a refund to the gift giver and they will find out about your return.</p>
|
|
66
|
+
|
|
67
|
+
<h3>Shipping returns</h3>
|
|
68
|
+
<p>To return your product, contact us for eligibility first.</p>
|
|
69
|
+
<p>You will be responsible for paying for your own shipping costs for returning your item. Shipping costs are non-refundable. If you receive a refund, the cost of return shipping will be deducted from your refund.</p>
|
|
70
|
+
<p>Depending on where you live, the time it may take for your returned product to reach us may vary.</p>
|
|
71
|
+
<p>If you are returning more expensive items, you may consider using a trackable shipping service or purchasing shipping insurance. We can't guarantee that we will receive your returned item.</p>
|
|
72
|
+
<p>ALL CUSTOMERS ARE REQUIRED TO UNDERSTAND THEIR LOCAL REGULATIONS AND WE WON'T BE ABLE TO OFFER REFUNDS OR REPLACEMENT IF ISSUES ARISE.</p>
|
|
73
|
+
|
|
74
|
+
</div>
|
|
75
|
+
</section>
|
|
76
|
+
|
|
77
|
+
</main>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "giant-navy",
|
|
3
|
+
"role": "current",
|
|
4
|
+
"name": "Giant Vapes — Navy",
|
|
5
|
+
"description": "Faithful T0 clone of giantvapes.com's Shopify theme: deep navy (#1b3b64) on white with a warm gold accent (#e0a83a). Montserrat display over Inter body. Token values mirror themes/giant-navy.css so this guide re-skins the standard commerce + chrome components in-brand.",
|
|
6
|
+
"source": "giantvapes.com (Shopify) reconstruction",
|
|
7
|
+
"stylesheet": "/tenants/giantvapes/themes/giant-navy.css",
|
|
8
|
+
"concept": { "id": "giant-navy", "version": "1.0.0", "baseline": "1.0.0" },
|
|
9
|
+
"status": "approved",
|
|
10
|
+
"claimsPolicy": "Ratings, testimonials, badges, and guarantees are PLACEHOLDER / needs-review — never ship fabricated proof for Giant Vapes. Product names, prices, and images on the home are source-copied verbatim from giantvapes.com.",
|
|
11
|
+
"storyboard": {
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"summary": "giant-navy: deep navy (#1b3b64) on white, warm gold accent (#e0a83a) — a faithful clone of giantvapes.com's Shopify theme. The home page defines the brand system + chrome; the subpages define editorial-split, contact-conversion, and legal-prose patterns. This is the contract every remaining giantvapes page follows.",
|
|
14
|
+
"inspirationPages": [
|
|
15
|
+
{
|
|
16
|
+
"slug": "/",
|
|
17
|
+
"role": "brand-system-and-chrome",
|
|
18
|
+
"captures": [
|
|
19
|
+
"brand arrival: white Giant Vapes wordmark on dark header",
|
|
20
|
+
"chrome: FDA warning bar + shipping marquee + utility nav",
|
|
21
|
+
"sticky header: logo + search + account + cart-count; mega-nav with SALE badge and carets",
|
|
22
|
+
"two-up hero, 3 promo cards, icon category tiles",
|
|
23
|
+
"brand e-liquid shelves + featured-hardware spotlight",
|
|
24
|
+
"footer: columns + newsletter + payment badges + compliance line"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"slug": "/pages/about-us",
|
|
29
|
+
"role": "editorial-split",
|
|
30
|
+
"captures": [
|
|
31
|
+
"page-hero + breadcrumb",
|
|
32
|
+
"story split section (copy + image)",
|
|
33
|
+
"values card grid + find-your-favorite category picker"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"slug": "/pages/contact-us",
|
|
38
|
+
"role": "contact-conversion",
|
|
39
|
+
"captures": [
|
|
40
|
+
"page hero + support hours",
|
|
41
|
+
"contact-info cards (hours / support / tracking)",
|
|
42
|
+
"shipping-detail prose + contact form"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"tokens": {
|
|
48
|
+
"color": [
|
|
49
|
+
{ "name": "navy", "var": "--navy", "value": "#1b3b64", "role": "Primary brand · buttons, header, focus outline" },
|
|
50
|
+
{ "name": "navy-dark", "var": "--navy-dark", "value": "#142d4d", "role": "Navy hover / pressed on primary" },
|
|
51
|
+
{ "name": "navy-ink", "var": "--navy-ink", "value": "#0f2138", "role": "Deep navy · footer & dark sections background" },
|
|
52
|
+
{ "name": "ink", "var": "--ink", "value": "#16243d", "role": "Body text · headings" },
|
|
53
|
+
{ "name": "muted", "var": "--muted", "value": "#5b6a82", "role": "Secondary text · muted" },
|
|
54
|
+
{ "name": "gold", "var": "--gold", "value": "#e0a83a", "role": "Warm accent · highlights" },
|
|
55
|
+
{ "name": "sale", "var": "--sale", "value": "#8a5d10", "role": "Sale / clearance price accent" },
|
|
56
|
+
{ "name": "ok", "var": "--ok", "value": "#2f8a5b", "role": "In-stock / availability accent (mkt.css)" },
|
|
57
|
+
{ "name": "bg", "var": "--bg", "value": "#ffffff", "role": "Page background (white)" },
|
|
58
|
+
{ "name": "surface", "var": "--surface", "value": "#f5f7fa", "role": "Raised surface / section tint" },
|
|
59
|
+
{ "name": "surface-2", "var": "--surface-2", "value": "#eaeef4", "role": "Deeper surface / hover fill" },
|
|
60
|
+
{ "name": "border", "var": "--border", "value": "#e3e8ef", "role": "Hairline border / dividers" }
|
|
61
|
+
],
|
|
62
|
+
"type": {
|
|
63
|
+
"sans": "\"Inter\", system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif",
|
|
64
|
+
"display": "\"Montserrat\", var(--font-body)",
|
|
65
|
+
"scale": [
|
|
66
|
+
{ "name": "h1", "value": "clamp(2rem, 4.6vw, 3.15rem)", "weight": 700 },
|
|
67
|
+
{ "name": "h2", "value": "clamp(1.6rem, 3.2vw, 2.35rem)", "weight": 700 },
|
|
68
|
+
{ "name": "h3", "value": "1.2rem", "weight": 700 },
|
|
69
|
+
{ "name": "body", "value": "1rem (16px min)", "weight": 400 }
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Giant Vapes — home page (pixel clone of giantvapes.com, above-the-fold).
|
|
3
|
+
Section order + chrome mirror the live Shopify theme. Shared base in
|
|
4
|
+
themes/giant-navy.css + pages/mkt.css. See playbook/site-migration/page-port.md §3.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
/* --- Hero: TWO-UP (banner + promo tile), no overlay text ------------------ */
|
|
8
|
+
.hero2 { padding-block: clamp(16px, 2vw, 24px); }
|
|
9
|
+
.hero2 .container { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; }
|
|
10
|
+
.hero2 a { display: block; border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); }
|
|
11
|
+
.hero2 img { width: 100%; height: clamp(260px, 34vw, 420px); object-fit: cover; }
|
|
12
|
+
.hero2 .promo-tile { background: linear-gradient(135deg, #0b1020, var(--navy-ink)); }
|
|
13
|
+
|
|
14
|
+
/* --- 3 promo cards -------------------------------------------------------- */
|
|
15
|
+
.promos { padding-block: clamp(12px, 2vw, 20px); }
|
|
16
|
+
.promos .container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
|
|
17
|
+
.promo-card {
|
|
18
|
+
position: relative; min-height: 240px; border-radius: var(--radius-lg); overflow: hidden;
|
|
19
|
+
display: flex; flex-direction: column; justify-content: flex-start; padding: 28px; color: #fff;
|
|
20
|
+
}
|
|
21
|
+
.promo-card--blue { background: linear-gradient(160deg, #1466ff, var(--navy)); }
|
|
22
|
+
.promo-card--red { background: linear-gradient(160deg, #ff3b46, var(--sale)); }
|
|
23
|
+
.promo-card--img { background: #10131c; padding: 0; }
|
|
24
|
+
.promo-card--img img { width: 100%; height: 100%; object-fit: cover; }
|
|
25
|
+
.promo-card h3 { color: #fff; font-size: 1.7rem; }
|
|
26
|
+
.promo-card p { color: rgba(255,255,255,.88); margin-top: 4px; font-weight: 500; }
|
|
27
|
+
.promo-card .link { margin-top: 14px; font-family: var(--font-display); font-weight: 700; color: #fff; }
|
|
28
|
+
.promo-card .link::after { content: " ›"; }
|
|
29
|
+
|
|
30
|
+
/* --- Categories (icon cards, light-blue) ---------------------------------- */
|
|
31
|
+
.cats { padding-block: clamp(2rem, 4vw, 3.5rem); }
|
|
32
|
+
.cats h2 { text-align: center; margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
|
|
33
|
+
.cats .grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: clamp(12px, 1.6vw, 20px); }
|
|
34
|
+
.cat-icon-card {
|
|
35
|
+
display: flex; flex-direction: column; align-items: center; gap: 16px;
|
|
36
|
+
background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
37
|
+
padding: 26px 16px; text-align: center; transition: transform .14s, box-shadow .14s;
|
|
38
|
+
}
|
|
39
|
+
.cat-icon-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
|
|
40
|
+
.cat-icon-card .ico {
|
|
41
|
+
width: 92px; height: 92px; border-radius: 18px; background: var(--surface-2);
|
|
42
|
+
display: grid; place-items: center;
|
|
43
|
+
}
|
|
44
|
+
.cat-icon-card .ico svg { width: 52px; height: 52px; stroke: var(--navy); fill: none; stroke-width: 1.6; }
|
|
45
|
+
.cat-icon-card span { font-family: var(--font-display); font-weight: 700; color: var(--ink); }
|
|
46
|
+
|
|
47
|
+
/* --- Responsive ----------------------------------------------------------- */
|
|
48
|
+
@media (max-width: 900px) {
|
|
49
|
+
.hero2 .container { grid-template-columns: 1fr; }
|
|
50
|
+
.hero2 .promo-tile { display: none; }
|
|
51
|
+
.promos .container { grid-template-columns: 1fr; }
|
|
52
|
+
.cats .grid { grid-template-columns: repeat(3, 1fr); }
|
|
53
|
+
}
|
|
54
|
+
@media (max-width: 560px) {
|
|
55
|
+
.cats .grid { grid-template-columns: repeat(2, 1fr); }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* --- Footer newsletter ---------------------------------------------------- */
|
|
59
|
+
.footer-news { display: flex; gap: 8px; margin-top: 12px; max-width: 320px; }
|
|
60
|
+
.footer-news input { flex: 1; border: 1px solid rgba(255,255,255,.3); background: transparent; color: #fff; border-radius: 999px; padding: 10px 16px; font-size: .9rem; }
|
|
61
|
+
.footer-news input::placeholder { color: #a9b8e6; }
|
|
62
|
+
.footer-news button { background: #fff; color: var(--navy-ink); border: 0; border-radius: 999px; width: 42px; font-size: 1.1rem; font-weight: 700; cursor: pointer; }
|
|
63
|
+
.footer-col > p { color: #a9b8e6; font-size: .88rem; margin-top: 4px; }
|
|
64
|
+
|
|
65
|
+
/* --- Payment badges ------------------------------------------------------- */
|
|
66
|
+
.pay-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
|
|
67
|
+
.pay-badges span { background: #fff; color: var(--navy-ink); font-size: .62rem; font-weight: 800; letter-spacing: .03em; padding: 6px 9px; border-radius: 5px; }
|
|
68
|
+
|
|
69
|
+
/* --- Product carousel (real catalog snapshot) ----------------------------- */
|
|
70
|
+
.shelf .sec-head { margin-bottom: 1.25rem; }
|
|
71
|
+
.pcarousel {
|
|
72
|
+
display: grid; grid-auto-flow: column; grid-auto-columns: minmax(200px, 1fr);
|
|
73
|
+
gap: clamp(12px, 1.6vw, 20px); overflow-x: auto; scroll-snap-type: x mandatory;
|
|
74
|
+
padding-bottom: 12px; scrollbar-width: thin;
|
|
75
|
+
}
|
|
76
|
+
.pcard { scroll-snap-align: start; }
|
|
77
|
+
.pcard a { display: block; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; transition: transform .14s, box-shadow .14s, border-color .14s; }
|
|
78
|
+
.pcard a:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
|
|
79
|
+
.pcard__media { aspect-ratio: 1/1; background: var(--surface); display: grid; place-items: center; }
|
|
80
|
+
.pcard__media img { width: 100%; height: 100%; object-fit: contain; padding: 10px; }
|
|
81
|
+
.pcard__vendor { font-family: var(--font-display); font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); padding: 12px 14px 0; }
|
|
82
|
+
.pcard__title { font-family: var(--font-body); font-size: .9rem; font-weight: 600; line-height: 1.3; color: var(--ink); padding: 2px 14px 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
83
|
+
.pcard__price { font-family: var(--font-display); font-weight: 700; color: var(--navy); padding: 6px 14px 14px; }
|
|
84
|
+
.pcard__was { color: var(--muted); font-weight: 500; text-decoration: line-through; margin-right: 4px; }
|
|
85
|
+
|
|
86
|
+
/* --- Staff's Pick spotlight ----------------------------------------------- */
|
|
87
|
+
.spotlight { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(20px, 4vw, 48px); align-items: center; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; }
|
|
88
|
+
.spotlight:hover { box-shadow: var(--shadow-md); }
|
|
89
|
+
.spotlight__media { aspect-ratio: 4/3; background: var(--surface); display: grid; place-items: center; }
|
|
90
|
+
.spotlight__media img { width: 100%; height: 100%; object-fit: contain; padding: 24px; }
|
|
91
|
+
.spotlight__body { padding: clamp(20px, 4vw, 40px) clamp(20px, 4vw, 40px) clamp(20px, 4vw, 40px) 0; }
|
|
92
|
+
.spotlight__body h3 { font-size: clamp(1.3rem, 2.6vw, 1.9rem); margin: 4px 0 10px; }
|
|
93
|
+
.spotlight__price { font-family: var(--font-display); font-weight: 700; font-size: 1.3rem; color: var(--navy); margin-bottom: 1.2rem; }
|
|
94
|
+
|
|
95
|
+
/* --- Shop by Brands grid -------------------------------------------------- */
|
|
96
|
+
.brandgrid { display: grid; grid-template-columns: repeat(6, 1fr); gap: clamp(10px, 1.4vw, 16px); }
|
|
97
|
+
.brandtile { display: grid; place-items: center; background: #fff; border: 1px solid var(--border); border-radius: var(--radius); min-height: 96px; padding: 14px; transition: transform .14s, box-shadow .14s, border-color .14s; }
|
|
98
|
+
.brandtile:hover { transform: translateY(-3px); box-shadow: var(--shadow-sm); border-color: var(--surface-2); }
|
|
99
|
+
.brandtile img { max-height: 56px; max-width: 100%; object-fit: contain; }
|
|
100
|
+
/* Text brand tile (used when a brand has no logo asset) — same tile chrome, name centered. */
|
|
101
|
+
.brandtile--text { font-family: var(--font-display); font-weight: 700; color: var(--navy); text-align: center; font-size: .95rem; letter-spacing: -.01em; }
|
|
102
|
+
|
|
103
|
+
/* --- Blog cards ----------------------------------------------------------- */
|
|
104
|
+
.bloggrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 24px); }
|
|
105
|
+
.blogcard { display: flex; flex-direction: column; background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; transition: transform .14s, box-shadow .14s; }
|
|
106
|
+
.blogcard:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
|
|
107
|
+
.blogcard__media { aspect-ratio: 16/9; background: linear-gradient(135deg, var(--surface-2), var(--surface)); }
|
|
108
|
+
.blogcard h3 { font-size: 1.02rem; line-height: 1.35; padding: 16px 18px 0; color: var(--ink); }
|
|
109
|
+
.blogcard .link-more { padding: 10px 18px 18px; }
|
|
110
|
+
|
|
111
|
+
.center { text-align: center; }
|
|
112
|
+
|
|
113
|
+
@media (max-width: 900px) {
|
|
114
|
+
.spotlight { grid-template-columns: 1fr; }
|
|
115
|
+
.spotlight__media { aspect-ratio: 16/10; }
|
|
116
|
+
.spotlight__body { padding: 0 24px 28px; }
|
|
117
|
+
.brandgrid { grid-template-columns: repeat(4, 1fr); }
|
|
118
|
+
.bloggrid { grid-template-columns: 1fr; }
|
|
119
|
+
}
|
|
120
|
+
@media (max-width: 560px) { .brandgrid { grid-template-columns: repeat(3, 1fr); } }
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
Giant Vapes — shared marketing component layer (mkt.css)
|
|
3
|
+
Reused across home + all marketing pages: layout, buttons, header/nav,
|
|
4
|
+
footer, section headers, tile + category grids, compliance strip.
|
|
5
|
+
Depends on tokens from themes/giant-navy.css.
|
|
6
|
+
========================================================================== */
|
|
7
|
+
|
|
8
|
+
/* --- Layout --------------------------------------------------------------- */
|
|
9
|
+
.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: clamp(16px, 4vw, 40px); }
|
|
10
|
+
.section { padding-block: clamp(2.5rem, 6vw, 4.5rem); }
|
|
11
|
+
.section--tight { padding-block: clamp(1.75rem, 4vw, 3rem); }
|
|
12
|
+
.section--surface { background: var(--surface); }
|
|
13
|
+
|
|
14
|
+
/* --- Buttons -------------------------------------------------------------- */
|
|
15
|
+
.btn {
|
|
16
|
+
display: inline-flex; align-items: center; justify-content: center; gap: .5em;
|
|
17
|
+
font-family: var(--font-display); font-weight: 600; font-size: .95rem;
|
|
18
|
+
padding: .8em 1.6em; border-radius: 999px; border: 2px solid transparent;
|
|
19
|
+
transition: transform .12s ease, background .15s ease, color .15s ease, box-shadow .15s ease;
|
|
20
|
+
}
|
|
21
|
+
.btn:hover { transform: translateY(-1px); }
|
|
22
|
+
.btn-primary { background: var(--navy); color: #fff; }
|
|
23
|
+
.btn-primary:hover { background: var(--navy-dark); box-shadow: var(--shadow-md); }
|
|
24
|
+
.btn-line { border-color: #fff; color: #fff; }
|
|
25
|
+
.btn-line:hover { background: #fff; color: var(--navy); }
|
|
26
|
+
.btn-ghost { border-color: var(--border); color: var(--navy); background: #fff; }
|
|
27
|
+
.btn-ghost:hover { border-color: var(--navy); }
|
|
28
|
+
|
|
29
|
+
/* --- Announcement bar ----------------------------------------------------- */
|
|
30
|
+
.announce {
|
|
31
|
+
background: var(--navy); color: #fff; text-align: center;
|
|
32
|
+
font-size: .85rem; font-weight: 600; letter-spacing: .01em; padding: 9px 16px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* --- Top utility bar (shared chrome: FDA warning + marquee + utility nav) -- */
|
|
36
|
+
.topbar-warning {
|
|
37
|
+
background: #fff; border-bottom: 1px solid var(--border);
|
|
38
|
+
text-align: center; padding: 10px 16px;
|
|
39
|
+
}
|
|
40
|
+
.topbar-warning p { color: var(--ink); font-weight: 700; font-size: .82rem; letter-spacing: .01em; }
|
|
41
|
+
|
|
42
|
+
.announce-marquee { background: var(--sale); color: #fff; overflow: hidden; }
|
|
43
|
+
.announce-marquee__track {
|
|
44
|
+
display: flex; gap: 3rem; white-space: nowrap; width: max-content;
|
|
45
|
+
padding: 8px 0; font-size: .82rem; font-weight: 600;
|
|
46
|
+
animation: bdv-marquee 22s linear infinite;
|
|
47
|
+
}
|
|
48
|
+
.announce-marquee__track span { padding-inline: 1.5rem; }
|
|
49
|
+
@keyframes bdv-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
|
|
50
|
+
@media (prefers-reduced-motion: reduce) {
|
|
51
|
+
.announce-marquee__track { animation: none; justify-content: center; width: 100%; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.utility-nav { border-bottom: 1px solid var(--border); background: #fff; }
|
|
55
|
+
.utility-nav .container { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-block: 8px; }
|
|
56
|
+
.utility-nav ul { display: flex; gap: 20px; }
|
|
57
|
+
.utility-nav a { font-size: .82rem; font-weight: 600; color: var(--ink); }
|
|
58
|
+
.utility-nav a:hover { color: var(--navy); }
|
|
59
|
+
.utility-nav__right { display: flex; align-items: center; gap: 16px; }
|
|
60
|
+
.utility-nav__right .sel { font-size: .8rem; color: var(--muted); }
|
|
61
|
+
.utility-nav__right .social { display: flex; gap: 12px; }
|
|
62
|
+
.utility-nav__right .social a svg { width: 16px; height: 16px; fill: var(--ink); }
|
|
63
|
+
|
|
64
|
+
/* --- Header / nav --------------------------------------------------------- */
|
|
65
|
+
.site-header { position: sticky; top: 0; z-index: 100; background: #fff; border-bottom: 1px solid var(--border); }
|
|
66
|
+
.header-row { display: flex; align-items: center; gap: clamp(12px, 2.5vw, 32px); padding-block: 14px; }
|
|
67
|
+
.brand img { height: 46px; width: auto; }
|
|
68
|
+
.primary-nav { flex: 1; }
|
|
69
|
+
.primary-nav > ul { display: flex; flex-wrap: wrap; align-items: center; gap: clamp(10px, 1.6vw, 22px); }
|
|
70
|
+
.primary-nav a { font-weight: 600; font-size: .92rem; color: var(--ink); padding: 6px 2px; border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; }
|
|
71
|
+
.primary-nav a:hover { color: var(--navy); border-color: var(--navy); }
|
|
72
|
+
.primary-nav a.is-flag { color: var(--sale); }
|
|
73
|
+
.header-actions { display: flex; align-items: center; gap: 16px; }
|
|
74
|
+
.header-actions a { display: inline-flex; color: var(--ink); }
|
|
75
|
+
.header-actions a:hover { color: var(--navy); }
|
|
76
|
+
.header-actions svg { width: 24px; height: 24px; stroke: currentColor; fill: none; stroke-width: 1.8; }
|
|
77
|
+
.hamburger { display: none; flex-direction: column; gap: 5px; background: none; border: 0; padding: 6px; }
|
|
78
|
+
.hamburger span { width: 26px; height: 2px; background: var(--ink); border-radius: 2px; }
|
|
79
|
+
|
|
80
|
+
/* header search pill + account/cart badge (shared chrome) */
|
|
81
|
+
.site-header .header-row { gap: clamp(12px, 3vw, 40px); }
|
|
82
|
+
.header-search { flex: 1; max-width: 560px; position: relative; }
|
|
83
|
+
.header-search input {
|
|
84
|
+
width: 100%; border: 1px solid var(--border); border-radius: 999px;
|
|
85
|
+
padding: 11px 46px 11px 18px; font-size: .9rem; background: #fff; color: var(--ink);
|
|
86
|
+
}
|
|
87
|
+
.header-search input::placeholder { color: var(--muted); }
|
|
88
|
+
.header-search button { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); background: none; border: 0; padding: 6px; }
|
|
89
|
+
.header-search svg { width: 20px; height: 20px; stroke: var(--navy); fill: none; stroke-width: 2; }
|
|
90
|
+
.header-actions .cart { position: relative; }
|
|
91
|
+
.header-actions .cart .count {
|
|
92
|
+
position: absolute; top: -6px; right: -8px; background: var(--navy); color: #fff;
|
|
93
|
+
font-size: .62rem; font-weight: 700; min-width: 16px; height: 16px; border-radius: 999px;
|
|
94
|
+
display: grid; place-items: center; padding: 0 4px;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* primary nav: NEW badge + dropdown carets + second-row nav bar (shared chrome) */
|
|
98
|
+
.primary-nav a .new-badge {
|
|
99
|
+
display: inline-block; background: var(--sale); color: #fff; font-size: .58rem; font-weight: 800;
|
|
100
|
+
letter-spacing: .06em; padding: 2px 5px; border-radius: 4px; margin-left: 6px; vertical-align: middle;
|
|
101
|
+
}
|
|
102
|
+
.primary-nav a .caret { font-size: .7em; margin-left: 4px; opacity: .7; }
|
|
103
|
+
.primary-nav-bar { border-top: 1px solid var(--border); background: #fff; }
|
|
104
|
+
.primary-nav-bar .container { padding-block: 4px; }
|
|
105
|
+
.primary-nav-bar .primary-nav > ul { gap: clamp(10px, 1.4vw, 20px); }
|
|
106
|
+
.primary-nav-bar .primary-nav a { padding-block: 10px; }
|
|
107
|
+
|
|
108
|
+
/* --- Section headers ------------------------------------------------------ */
|
|
109
|
+
.sec-head { text-align: center; max-width: 62ch; margin: 0 auto clamp(1.5rem, 3vw, 2.5rem); }
|
|
110
|
+
.sec-head .eyebrow { display: inline-block; font-family: var(--font-display); font-weight: 700; font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; color: var(--navy); margin-bottom: .55rem; }
|
|
111
|
+
.sec-head p { margin-top: .7rem; font-size: 1.02rem; }
|
|
112
|
+
.sec-head--between { display: flex; align-items: baseline; justify-content: space-between; text-align: left; max-width: none; gap: 16px; }
|
|
113
|
+
.link-more { font-family: var(--font-display); font-weight: 600; color: var(--navy); white-space: nowrap; }
|
|
114
|
+
.link-more:hover { text-decoration: underline; }
|
|
115
|
+
|
|
116
|
+
/* --- Brand / category tile grid ------------------------------------------- */
|
|
117
|
+
.tile-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(12px, 1.6vw, 20px); }
|
|
118
|
+
.tile {
|
|
119
|
+
display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
|
|
120
|
+
background: #fff; border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
121
|
+
padding: 26px 18px; min-height: 148px; text-align: center; transition: transform .14s, box-shadow .14s, border-color .14s;
|
|
122
|
+
}
|
|
123
|
+
.tile:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: var(--surface-2); }
|
|
124
|
+
.tile img { max-height: 66px; width: auto; object-fit: contain; }
|
|
125
|
+
.tile span { font-family: var(--font-display); font-weight: 600; font-size: .95rem; color: var(--ink); }
|
|
126
|
+
|
|
127
|
+
/* --- Category cards (shop by category) ------------------------------------ */
|
|
128
|
+
.cat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 2vw, 24px); }
|
|
129
|
+
.cat-card {
|
|
130
|
+
position: relative; display: flex; align-items: flex-end; overflow: hidden;
|
|
131
|
+
min-height: 190px; border-radius: var(--radius-lg); color: #fff;
|
|
132
|
+
background: linear-gradient(135deg, var(--navy), var(--navy-ink));
|
|
133
|
+
padding: 22px; transition: transform .14s, box-shadow .14s;
|
|
134
|
+
}
|
|
135
|
+
.cat-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
|
|
136
|
+
.cat-card::after { content: "→"; position: absolute; top: 20px; right: 22px; font-size: 1.3rem; opacity: .85; }
|
|
137
|
+
.cat-card h3 { color: #fff; font-size: 1.35rem; }
|
|
138
|
+
.cat-card p { color: rgba(255, 255, 255, .82); margin-top: 4px; font-size: .9rem; }
|
|
139
|
+
|
|
140
|
+
/* --- Compliance strip (source-copied legal text; not fabricated) ---------- */
|
|
141
|
+
.compliance-strip { background: var(--surface-2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
|
|
142
|
+
.compliance-strip .container { padding-block: 14px; }
|
|
143
|
+
.compliance-strip p { color: var(--navy-ink); font-size: .82rem; font-weight: 600; text-align: center; letter-spacing: .01em; }
|
|
144
|
+
|
|
145
|
+
/* --- Footer --------------------------------------------------------------- */
|
|
146
|
+
.site-footer { background: var(--navy-ink); color: #dbe4fb; padding-block: clamp(2.5rem, 5vw, 4rem) 1.5rem; }
|
|
147
|
+
.footer-grid { display: grid; grid-template-columns: 1.4fr repeat(3, 1fr); gap: clamp(24px, 4vw, 56px); }
|
|
148
|
+
.footer-brand img { height: 40px; filter: brightness(0) invert(1); opacity: .95; }
|
|
149
|
+
.footer-brand p { color: #a9b8e6; margin-top: 14px; font-size: .9rem; max-width: 34ch; }
|
|
150
|
+
.footer-col h4 { color: #fff; font-size: .82rem; letter-spacing: .1em; text-transform: uppercase; margin-bottom: 14px; }
|
|
151
|
+
.footer-col ul { display: flex; flex-direction: column; gap: 9px; }
|
|
152
|
+
.footer-col a { color: #c3cff0; font-size: .92rem; }
|
|
153
|
+
.footer-col a:hover { color: #fff; text-decoration: underline; }
|
|
154
|
+
.footer-warning { margin-top: 34px; padding: 16px 18px; border: 1px solid rgba(255, 255, 255, .22); border-radius: var(--radius); }
|
|
155
|
+
.footer-warning strong { color: #fff; }
|
|
156
|
+
.footer-warning p { color: #c3cff0; font-size: .82rem; }
|
|
157
|
+
.footer-bottom { margin-top: 28px; padding-top: 18px; border-top: 1px solid rgba(255, 255, 255, .16); display: flex; flex-wrap: wrap; gap: 10px 24px; justify-content: space-between; align-items: center; }
|
|
158
|
+
.footer-bottom p, .footer-bottom a { color: #93a4d6; font-size: .82rem; }
|
|
159
|
+
|
|
160
|
+
/* --- Reveal-on-scroll ----------------------------------------------------- */
|
|
161
|
+
.reveal { opacity: 0; transform: translateY(18px); transition: opacity .5s ease, transform .5s ease; }
|
|
162
|
+
.reveal.in { opacity: 1; transform: none; }
|
|
163
|
+
|
|
164
|
+
/* --- Responsive ----------------------------------------------------------- */
|
|
165
|
+
@media (max-width: 900px) {
|
|
166
|
+
.header-search { order: 3; flex-basis: 100%; max-width: none; }
|
|
167
|
+
.utility-nav ul { gap: 12px; }
|
|
168
|
+
}
|
|
169
|
+
@media (max-width: 1000px) {
|
|
170
|
+
.tile-grid { grid-template-columns: repeat(3, 1fr); }
|
|
171
|
+
}
|
|
172
|
+
@media (max-width: 860px) {
|
|
173
|
+
.primary-nav { position: fixed; inset: 0 0 0 auto; width: min(80vw, 320px); background: #fff; box-shadow: var(--shadow-lg); transform: translateX(100%); transition: transform .25s ease; padding: 80px 24px 24px; overflow-y: auto; }
|
|
174
|
+
.primary-nav.open { transform: none; }
|
|
175
|
+
.primary-nav > ul { flex-direction: column; align-items: stretch; gap: 4px; }
|
|
176
|
+
.primary-nav a { display: block; padding: 12px 4px; border-bottom: 1px solid var(--border); }
|
|
177
|
+
.hamburger { display: flex; }
|
|
178
|
+
.cat-grid { grid-template-columns: 1fr 1fr; }
|
|
179
|
+
.footer-grid { grid-template-columns: 1fr 1fr; }
|
|
180
|
+
}
|
|
181
|
+
@media (max-width: 560px) {
|
|
182
|
+
.tile-grid { grid-template-columns: repeat(2, 1fr); }
|
|
183
|
+
.cat-grid { grid-template-columns: 1fr; }
|
|
184
|
+
.footer-grid { grid-template-columns: 1fr; }
|
|
185
|
+
}
|