@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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
32
|
+
/* Space Mono — reference mono */
|
|
34
33
|
@import "@fontsource/space-mono/400.css";
|
|
35
34
|
|
|
36
|
-
/* Montserrat —
|
|
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 —
|
|
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.
|
|
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();
|