@tokenoftrust/storefront-runner 2.0.53 → 2.0.55

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.
@@ -1,40 +1,10 @@
1
- /* ============================================================================
2
- Shared commerce-chrome stylesheet — ONE platform-shipped, token-driven layer
3
- (workstream shared-ecommerce-widgets, unit F2 `shared-chrome-css`).
1
+ /* Shared commerce chrome. Theme values come from the token contract in
2
+ docs/architecture/token-contract.md; tenant-private brand variables and
3
+ hard-coded brand colors do not belong here. Dark surfaces derive from
4
+ --color-text and --color-primary-contrast.
4
5
 
5
- Generalizes the divergent per-tenant `public/pages/mkt.css` files (some tenants
6
- shared a byte-identical base sheet; others carried a richer variant with .mega /
7
- .member-cue / .announce-bar / .age-gate / .trust-marks) into a SINGLE stylesheet
8
- every storefront links and themes via
9
- tokens only. Per decisions raw-chrome-single-stylesheet + materialization-compat.
10
-
11
- CONTRACT-TOKEN-ONLY (docs/architecture/token-contract.md, unit F1). Every value
12
- here reads the shared `--color-*` / `--font-*` / `--radius-*` / `--shadow-*` /
13
- `--container-max` vocabulary and NO tenant-private brand var (never `--navy`,
14
- `--brand-red`, unprefixed `--sale`/`--ink`/`--surface`), and no hard-coded brand
15
- hex. On-dark surfaces (footer, age-gate overlay, cat cards) derive from
16
- `--color-text` (the deep ink surface) + `--color-primary-contrast` via
17
- `color-mix`, so a tenant reskins the whole chrome by supplying tokens/aliases.
18
-
19
- Token mapping from the old per-tenant vars (applied by the integration units
20
- that alias each tenant's brand vocabulary onto the contract):
21
- --navy / --brand-red -> --color-primary (nav active, cart, CTA fill)
22
- --navy-dark -> --color-primary-hover
23
- --sale -> --color-sale (flag / NEW / marquee emphasis)
24
- --surface / --surface-2 / --border / --muted -> --color-{surface,surface-2,border,muted}
25
- --ink / --ink-2 -> --color-text
26
- --brand-blue -> --color-accent (member cue, promo/trust spark)
27
- --container -> --container-max
28
- footer / age-gate ink surfaces -> --color-text (+ --color-primary-contrast)
29
-
30
- DELIVERY: platform static asset, served at /shared/commerce-chrome.css (root,
31
- global — like /brand, /js). It is a LINKED sheet, not inline: commerce routes
32
- (/products, /collections) carry linked <link> sheets but strip inline <style>,
33
- which is exactly the PVC breakage this closes. The canonical chrome partial (F3)
34
- links it; per-tenant chrome retires its copied mkt.css at integration (I1/I2/I3).
35
- rawMarketingHtml.prefixTenantLinks exempts /shared/ so the link survives
36
- path-prefix tenant routing (as it already does for /tenants/).
37
- ========================================================================== */
6
+ This linked platform asset is served at /shared/commerce-chrome.css.
7
+ rawMarketingHtml.prefixTenantLinks leaves /shared/ paths unprefixed. */
38
8
 
39
9
  /* --- Layout --------------------------------------------------------------- */
40
10
  /* Clip (not hidden) so a closed off-canvas mobile drawer never creates a
@@ -132,7 +102,7 @@ body { overflow-x: clip; }
132
102
  .site-header { position: sticky; top: 0; z-index: 100; background: var(--color-surface); border-bottom: 1px solid var(--color-border); }
133
103
  .site-header .header-row { gap: clamp(12px, 3vw, 40px); }
134
104
  .header-row { display: flex; flex-wrap: wrap; align-items: center; gap: clamp(12px, 2.5vw, 32px); padding-block: 14px; }
135
- /* Logo: image mark (bigd/giant) or text wordmark (PVC) both supported. */
105
+ /* Logo: image mark and text wordmark are both supported. */
136
106
  /* object-fit is load-bearing, not polish: with height pinned and width auto, a logo whose
137
107
  box is capped by max-width is otherwise STRETCHED to fill it. Measured 2026-09-21 on a
138
108
  real tenant: a 500x196 logo (ratio 2.55) rendered at 154x34 (ratio 4.53) on mobile.
@@ -196,11 +166,11 @@ body { overflow-x: clip; }
196
166
  /* --- Primary nav + mega-menu ---------------------------------------------- */
197
167
  .primary-nav { flex: 1; }
198
168
  .primary-nav > ul { display: flex; flex-wrap: wrap; align-items: center; gap: clamp(10px, 1.6vw, 22px); }
199
- /* Flat links (bigd/giant) */
169
+ /* Flat primary links */
200
170
  .primary-nav a { font-weight: 600; font-size: .92rem; color: var(--color-text); padding: 6px 2px; border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; }
201
171
  .primary-nav a:hover { color: var(--color-primary); border-color: var(--color-primary); }
202
172
  .primary-nav a.is-flag { color: var(--color-sale); }
203
- /* Nav items with dropdowns (PVC mega) */
173
+ /* Nav items with dropdowns */
204
174
  .primary-nav .nav-item { position: relative; }
205
175
  .primary-nav .nav-item > a { display: inline-flex; align-items: center; gap: 5px; font-weight: 600; font-size: .92rem; color: var(--color-text); padding: 14px 2px; border-bottom: 2px solid transparent; transition: color .15s, border-color .15s; }
206
176
  .primary-nav .nav-item > a:hover, .primary-nav .nav-item:focus-within > a { color: var(--color-primary); border-color: var(--color-primary); }
@@ -211,7 +181,7 @@ body { overflow-x: clip; }
211
181
  display: inline-block; background: var(--color-sale); color: var(--color-primary-contrast); font-size: .58rem; font-weight: 800;
212
182
  letter-spacing: .06em; padding: 2px 5px; border-radius: var(--radius-sm); margin-left: 6px; vertical-align: middle;
213
183
  }
214
- /* Second-row nav bar (bigd) + nav-bar container (PVC) */
184
+ /* Second-row nav bar and its container */
215
185
  .primary-nav-bar { border-top: 1px solid var(--color-border); background: var(--color-surface); }
216
186
  .primary-nav-bar .container { padding-block: 4px; }
217
187
  .primary-nav-bar .primary-nav > ul { gap: clamp(10px, 1.4vw, 20px); }
@@ -352,7 +322,7 @@ a.article-card__tag:hover { text-decoration: underline; }
352
322
  .footer-col ul { display: flex; flex-direction: column; gap: 9px; }
353
323
  .footer-col a { color: color-mix(in srgb, var(--color-primary-contrast) 78%, transparent); font-size: .92rem; }
354
324
  .footer-col a:hover { color: var(--color-primary-contrast); text-decoration: underline; }
355
- /* Newsletter signup (PVC) */
325
+ /* Newsletter signup */
356
326
  .footer-news { margin-top: 14px; }
357
327
  .footer-news__row { display: flex; gap: 8px; }
358
328
  .footer-news input[type="email"] { flex: 1; min-width: 0; border: 1px solid color-mix(in srgb, var(--color-primary-contrast) 22%, transparent); border-radius: var(--radius-md); padding: 10px 12px; font-size: .88rem; background: color-mix(in srgb, var(--color-text) 88%, var(--color-primary-contrast)); color: var(--color-primary-contrast); }
@@ -391,7 +361,7 @@ a.article-card__tag:hover { text-decoration: underline; }
391
361
  }
392
362
  .pay-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
393
363
  .pay-badges span { font-size: .62rem; font-weight: 700; letter-spacing: .04em; color: color-mix(in srgb, var(--color-primary-contrast) 82%, transparent); border: 1px solid color-mix(in srgb, var(--color-primary-contrast) 22%, transparent); border-radius: var(--radius-sm); padding: 4px 7px; }
394
- /* Trust marks strip (PVC) */
364
+ /* Trust marks strip */
395
365
  .trust-marks { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 30px; padding-top: 20px; border-top: 1px solid color-mix(in srgb, var(--color-primary-contrast) 12%, transparent); }
396
366
  .trust-marks span { display: inline-flex; align-items: center; gap: 7px; font-size: .82rem; font-weight: 600; color: color-mix(in srgb, var(--color-primary-contrast) 82%, transparent); }
397
367
  .trust-marks svg { width: 17px; height: 17px; stroke: var(--color-accent); fill: none; stroke-width: 1.8; }
@@ -212,7 +212,7 @@ if (features.catalog) {
212
212
  }
213
213
 
214
214
  // Per-vendor header treatment from the theme file: a "dark" header renders the
215
- // bar in the primary color carrying the light logo (e.g. Giant Vapes' navy +
215
+ // bar in the primary color carrying the light logo (e.g. a merchant's navy +
216
216
  // white logo); a light header always shows the text wordmark (no logo image).
217
217
  const headerDark = theme.brand.headerVariant === "dark";
218
218
  const headerLogoSrc = headerDark ? theme.brand.logoLight : theme.brand.logoDark;
@@ -14,7 +14,6 @@
14
14
  * Families/weights (keep in sync with the themes in src/themes/*):
15
15
  * Reference (PVC, sample-store-2, home): Space Grotesk 500/600/700 (display),
16
16
  * Source Serif 4 400/500/600 (body), Space Mono 400 (mono)
17
- * sample-store-3.com: Montserrat 600/700/800 (display), Inter 400/500/600 (body)
18
17
  * tokenoftrust.com: Plus Jakarta Sans 500/600/700/800 (display),
19
18
  * Inter 400/500/600 (body), JetBrains Mono 400/500 (mono)
20
19
  * vapenicotinefree.com: Anuphan 400/500/600/700 (display + body)
@@ -30,15 +29,15 @@
30
29
  @import "@fontsource/source-serif-4/500.css";
31
30
  @import "@fontsource/source-serif-4/600.css";
32
31
 
33
- /* Space Mono — reference mono (also sample-store-3' inherited mono) */
32
+ /* Space Mono — reference mono */
34
33
  @import "@fontsource/space-mono/400.css";
35
34
 
36
- /* Montserrat — sample-store-3 display */
35
+ /* Montserrat — merchant display */
37
36
  @import "@fontsource/montserrat/600.css";
38
37
  @import "@fontsource/montserrat/700.css";
39
38
  @import "@fontsource/montserrat/800.css";
40
39
 
41
- /* Inter — sample-store-3 + tokenoftrust body */
40
+ /* Inter — merchant and platform body */
42
41
  @import "@fontsource/inter/400.css";
43
42
  @import "@fontsource/inter/500.css";
44
43
  @import "@fontsource/inter/600.css";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokenoftrust/storefront-runner",
3
- "version": "2.0.53",
3
+ "version": "2.0.55",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "description": "World-shareable storefront runner: multi-tenant renderer on Astro/Cloudflare. No control plane.",
6
6
  "packageManager": "pnpm@11.9.0",
@@ -211,7 +211,7 @@ export function materializeTenant({
211
211
  const cloneUrl = remote ?? buildCloneUrl({ base: gitBase, repo, user, token });
212
212
  const work = mkdtempSync(join(tmpdir(), `materialize-${tenant}-`));
213
213
  const git = (args, cwd = work) =>
214
- execFileSync("git", args, { cwd, stdio: ["ignore", "pipe", "pipe"] })
214
+ execFileSync("git", ["-c", "http.followRedirects=false", ...args], { cwd, stdio: ["ignore", "pipe", "pipe"] })
215
215
  .toString()
216
216
  .trim();
217
217
  try {
@@ -462,7 +462,7 @@ export function checkFresh(
462
462
  const cloneUrl = buildCloneUrl({ base: gitBase, repo, user, token });
463
463
  let liveSha = "";
464
464
  try {
465
- const out = execFileSync("git", ["ls-remote", cloneUrl, movableRef], {
465
+ const out = execFileSync("git", ["-c", "http.followRedirects=false", "ls-remote", cloneUrl, movableRef], {
466
466
  stdio: ["ignore", "pipe", "pipe"],
467
467
  }).toString();
468
468
  liveSha = (out.split(/\s+/)[0] || "").trim();