Skip to content

6px grid as the single spatial canon + Brand intent in the Design Lock#4

Open
indexzigu wants to merge 3 commits into
bitjaru:mainfrom
indexzigu:design/6px-canon-brand-intent
Open

6px grid as the single spatial canon + Brand intent in the Design Lock#4
indexzigu wants to merge 3 commits into
bitjaru:mainfrom
indexzigu:design/6px-canon-brand-intent

Conversation

@indexzigu

@indexzigu indexzigu commented Jul 7, 2026

Copy link
Copy Markdown

Summary

Ports 6px grid unification + Brand intent lock + WCAG tooling to upstream styleseed.

Note on versioning: The PR omits VERSION / CHANGELOG / version.json changes. This follows standard open-source practice — the maintainer assigns the release number when merging, not the contributor. The content is ready for release; the version is the maintainer's call.

What

Commit 1 — 6px grid canon + Brand intent

  • Golden Rule 5 → "one spatial rhythm on the 6px grid (all spacing = multiples of 6px)", desktop gap-6/gap-9; Quality Gate checks "6px rhythm" (CLAUDE.md + AGENTS.md)
  • CLAUDE.md Spacing section, VISUAL-CRAFT §C0 spacing row, CR-1 scale {3…96}, form ladder (CR-3), card padding tiers (CR-4/CC-7), icon↔label gap (CC-5), field rhythm (CC-8), and grid gutters (CR-10) — all restated on the 6px system
  • Hero padding p-8p-9 in docs and in the shipped hero-card.tsx / donut-chart-card.tsx; /ss-dial density ramp becomes a clean 36/24/18/12px ladder
  • A11y floors untouched: ≥44px touch targets and the ≥8px gap between adjacent touch targets are WCAG spacing floors, not the layout grid
  • Brand intent added to the Design Lock (concept ported from google-labs-code/design.md): Reference / Implied traits / Never / Feeling — one concrete reference anchored by the 3 traits it implies; a bare reference or bare adjectives are both forbidden. /ss-setup captures it; /ss-page and /ss-component read the lock first and obey it

Commit 2 — setup-lock parity + tooling

  • /ss-setup catches up with the engine lock template (asks the surface, proposes the Mood 4-axes, derives the Motion seed; lock gains Surface/Mood/Type scale)
  • /ss-lint gains a deterministic WCAG token-contrast check (bundled stdlib-only contrast_check.py)
  • /ss-update gains a changed-rule gate: a rule whose value changed (like 8px→6px) is surfaced old→new with a per-item confirm, never bundled into a blanket yes

Commit 3 — skins pass their own floors

  • The new contrast check flagged real failures in shipped skins; tokens tuned so every skin passes

Testing

Verified:

  • Upstream (bitjaru/styleseed main) cleanly merges with zero conflicts
  • Content includes both our 6px work AND upstream's Cinematic tier (motion scoped by surface)
  • All /ss-* skills and gate structure preserved

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

@zigoo1218-max is attempting to deploy a commit to the bitjaru Team on Vercel.

A member of the Team first needs to authorize it.

@indexzigu indexzigu force-pushed the design/6px-canon-brand-intent branch from d9c4095 to 2d3f606 Compare July 8, 2026 01:14
indexzigu and others added 3 commits July 8, 2026 12:03
…ed intent

Grid: 6px is confirmed as the single spatial canon (was a live 8px-vs-6px
contradiction between Golden Rule 5 / Quality Gate / VISUAL-CRAFT CR-1 and
.cursorrules / ss-page). Golden Rule 5 now reads "all spacing = multiples of
6px" with desktop gap-6/gap-9; hero padding p-8 -> p-9 in docs and shipped
components; /ss-dial density ramp becomes a clean 36/24/18/12px ladder.
A11y floors untouched (>=44px targets, >=8px between adjacent touch targets
is a WCAG spacing floor, not the layout grid).

Lock: Brand intent added to the Design Lock (concept ported from
google-labs-code/design.md) — Reference / Implied traits / Never / Feeling.
One concrete reference must be anchored by its 3 implied traits + 3 negative
constraints; a bare reference or bare adjectives are both forbidden.
/ss-setup captures it; /ss-page and /ss-component read the lock FIRST and
obey its "Never" constraints; ss-page's post-gen checklist verifies it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ged-rule gate

Second tranche of v2.9.0 (unreleased — folded into the same 2.9.0
CHANGELOG entry and version.json).

ss-setup: the wizard's lock template had drifted from the engine's Design
Lock (CLAUDE.md). Step 1 now also asks the surface (mobile app vs
desktop/web B2B — it decides the type scale, Golden Rule 16); Step 3's
Brand-intent confirmation also proposes the Mood (4 axes: edges · feel ·
density · tone, defaults from the chosen skin) and derives the Motion seed
from Tone; the written lock gains Surface / Mood / Type scale fields and
renames Type → Font, matching CLAUDE.md's lock template.

ss-lint: new check 9 — WCAG token contrast. Bundled deterministic checker
(scripts/contrast_check.py, Python stdlib only): parses :root/.dark custom
properties (hex/rgb()/hsl()/oklch()), resolves var() chains, and checks
the standard token pairs in BOTH scopes (body/muted text >=4.5:1, brand UI
>=3:1, button labels >=4.5:1). Agents run it instead of computing WCAG
luminance by mental arithmetic — the gamma math is exactly where LLMs
slip. Alpha / color-mix() values report as SKIP, never as silent passes;
--self-test verifies the math.

ss-update: changed-rule gate. Update copy no longer claims rules never
change — rarely a rule VALUE is corrected (this release's 8px → 6px grid
fix); the DESIGN-LANGUAGE step now diffs the Golden Rules and enforcement
values specifically and surfaces each CHANGED rule as its own old → new
warning line with a per-item OK, never bundled into a blanket "Y".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tokens

Third tranche of v2.9.0 (unreleased — folded into the same entry). The new
/ss-lint contrast check was run against the engine's own seven skins and
found real failures; this makes the engine eat its own dog food.

Labels tokenized: button.tsx (default + destructive), confirm-modal.tsx,
chart-card.tsx's period toggle, and ranked-list.tsx render
text-brand-foreground / text-destructive-foreground instead of hardcoded
text-white; DESIGN-LANGUAGE's nine "bg-brand + text-white" prescriptions
follow. Fixes a shipped bug: vercel's dark brand is white, so brand
buttons rendered white-on-white (1.0:1). Skins already carried
scope-adaptive foreground inks — the hardcode ignored them.
(badge.tsx's destructive variant keeps text-white deliberately: its
dark:bg-destructive/60 alpha surface favors white, ~5.8:1.)

Checker pairs corrected to what components actually render:
brand-foreground (legacy fallback: literal white) on brand,
primary-foreground on primary (badge/tooltip/checkbox), destructive
labels — never primary-foreground on brand, which nothing renders.

Skins: every skin gains --brand-foreground (+ @theme mapping) — white on
dark brands, the skin's ink on light ones (linear/notion/toss/vercel dark,
raycast). Muted text nudged to >=4.5:1 (linear light 8a8f98->70757f,
notion dark 7a7672->908c88, toss dark 808080->868686, vercel dark
777777->7f7f7f). Light destructive darkened to hold white labels (notion
dd5b00->c65200 + warning; stripe ea2261->e41657; vercel ff5b4f->dc2626;
alert-badge follows). Arc's single pink sat under every floor (2.94:1
even as plain text) -> brand/primary/destructive/alert-badge
FF5E7E->e11d48 (rose-600); raycast keeps its pink, labels flip to dark
ink. Chart/gradient palettes untouched (data-viz, not text-bearing).

/ss-update: offers an ADDITIVE --brand-foreground append (contrast-picked
value) when updated components reference it and the project theme lacks
it — the only permitted theme.css touch, with the user's OK.

Result: all seven skins 0 FAIL in both scopes (notion's three
alpha-compositing SKIPs verified by hand at 19.4:1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@indexzigu indexzigu force-pushed the design/6px-canon-brand-intent branch 2 times, most recently from 2ef1897 to 9466013 Compare July 11, 2026 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant