@boopdoopgoop/design-system 0.0.0-stage → 0.2.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/README.md +442 -2
- package/dist/components/index.cjs +233 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +63 -0
- package/dist/components/index.d.ts +63 -0
- package/dist/components/index.js +208 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.cjs +777 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +775 -0
- package/dist/index.d.ts +775 -0
- package/dist/index.js +745 -0
- package/dist/index.js.map +1 -0
- package/package.json +99 -4
- package/src/tokens/primitives.json +354 -0
- package/src/tokens/semantic.json +133 -0
- package/styles/components.css +290 -0
- package/styles/fonts.css +8 -0
- package/styles/theme.css +271 -0
package/README.md
CHANGED
|
@@ -1,3 +1,443 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Intangibility design system · 0.2.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
DTCG tokens, fixed typography, a Tailwind CSS v4 theme, and opt-in React 19
|
|
4
|
+
components. No global reset, application styles, font binaries, or npm
|
|
5
|
+
publication are included. The foundation-only root export remains independent
|
|
6
|
+
of React; components are available from a separate subpath.
|
|
7
|
+
|
|
8
|
+
## Use
|
|
9
|
+
|
|
10
|
+
In a consumer's CSS (Tailwind v4 must process the theme):
|
|
11
|
+
|
|
12
|
+
```css
|
|
13
|
+
@import 'tailwindcss';
|
|
14
|
+
@import '@boopdoopgoop/design-system/fonts.css'; /* optional */
|
|
15
|
+
@import '@boopdoopgoop/design-system/theme.css';
|
|
16
|
+
@import '@boopdoopgoop/design-system/components.css'; /* optional */
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<main data-intangibility-tier="app" class="bg-canvas text-ink font-body">
|
|
21
|
+
<h1 class="font-display font-black text-display leading-display">
|
|
22
|
+
Workspace
|
|
23
|
+
</h1>
|
|
24
|
+
<p class="text-body leading-body">Archivo body copy.</p>
|
|
25
|
+
<section data-intangibility-tier="riso" class="bg-canvas text-ink">
|
|
26
|
+
<article class="bg-riso-sheet">A risograph sheet.</article>
|
|
27
|
+
</section>
|
|
28
|
+
</main>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
App is the default. Named utilities such as `bg-app-canvas`, `text-app-ink`,
|
|
32
|
+
`bg-riso-paper`, and `text-riso-ink` never switch tiers. Generic roles (`canvas`,
|
|
33
|
+
`paper`, `sheet`, `ink`, `muted`, `line`, `control-line`, `placeholder`, `signal`,
|
|
34
|
+
`on-signal`, `focus`) switch through the opt-in attribute. App `sheet` maps to
|
|
35
|
+
white paper; riso `canvas` maps to cream paper. Riso `muted` maps to ink-2,
|
|
36
|
+
`line` to tint-18, `placeholder` to tint-35, and filled controls/focus to black.
|
|
37
|
+
Statuses and app tile colors stay explicitly `app-*`; there are no invented
|
|
38
|
+
risograph success/danger colors. Nested tiers can reset to `app`.
|
|
39
|
+
|
|
40
|
+
Without Tailwind, ordinary `--ds-*` properties remain usable:
|
|
41
|
+
|
|
42
|
+
```css
|
|
43
|
+
.document {
|
|
44
|
+
color: var(--ds-color-riso-ink);
|
|
45
|
+
background: var(--ds-color-riso-paper);
|
|
46
|
+
font-family: var(--ds-font-body);
|
|
47
|
+
font-size: var(--ds-text-body);
|
|
48
|
+
line-height: var(--ds-leading-body);
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The `@theme inline static` block maps semantic values to utilities. `inline`
|
|
53
|
+
ensures utilities resolve scoped variables on their consuming element; `static`
|
|
54
|
+
keeps named theme properties available even when no matching utility is used.
|
|
55
|
+
The package does not change Tailwind's unrelated defaults.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import {
|
|
59
|
+
tokens,
|
|
60
|
+
resolvedTokens,
|
|
61
|
+
tokenDocuments,
|
|
62
|
+
} from '@boopdoopgoop/design-system';
|
|
63
|
+
|
|
64
|
+
resolvedTokens['color.riso.paper']?.cssValue; // '#f2ede2'
|
|
65
|
+
tokens['color.riso.paper']?.$value; // '{primitive.color.paper}'
|
|
66
|
+
tokenDocuments.semantic; // original DTCG document
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
CommonJS `require('@boopdoopgoop/design-system')` exposes the same API. Both
|
|
70
|
+
formats have declarations. Raw JSON exports are `tokens/primitives.json` and
|
|
71
|
+
`tokens/semantic.json`. `flattenTokens`, `resolveTokens`, and `renderTheme` are
|
|
72
|
+
also exported. Their supported DTCG subset is color (sRGB), dimension (px/rem),
|
|
73
|
+
fontFamily, numeric fontWeight, number, inherited group types, and whole-token
|
|
74
|
+
aliases. This is not a general DTCG validator or an arbitrary CSS serializer.
|
|
75
|
+
|
|
76
|
+
### Typography
|
|
77
|
+
|
|
78
|
+
| Role | Family | Size | Weight | Leading |
|
|
79
|
+
| --------- | --------------------- | ---- | ------- | ----------------- |
|
|
80
|
+
| Display | Big Shoulders Display | 32px | 900 | 1 |
|
|
81
|
+
| Heading | Big Shoulders Display | 24px | 900 | 1 |
|
|
82
|
+
| Body | Archivo | 15px | 400 | 1.45 |
|
|
83
|
+
| UI copy | Archivo | 14px | 400–700 | 1.4 |
|
|
84
|
+
| Mono/data | Spline Sans Mono | 12px | 400/500 | consumer-selected |
|
|
85
|
+
| Label | Spline Sans Mono | 11px | 400 | 1.25 |
|
|
86
|
+
|
|
87
|
+
These are independent utilities, not automatic type styles. Display/heading,
|
|
88
|
+
body, and mono/label sizes come from `R:175–202,544–552`; UI copy is `U:105–107`
|
|
89
|
+
at a 16px root. The label leading is a release convention, not a source-wide
|
|
90
|
+
label declaration. Input-specific leading `U:198` is not the UI-copy token.
|
|
91
|
+
Fluid hero sizes, timer sizes, and per-screen layout stay with consumers.
|
|
92
|
+
Component label tracking is now tokenized. Fontsource loading is explicit: Big Shoulders 900; Archivo
|
|
93
|
+
400/500/600/700; Spline Sans Mono 400/500. Other weights/italics require separate
|
|
94
|
+
Fontsource imports. Static family names are used, not unavailable `Variable`
|
|
95
|
+
faces. No Newsreader, Space Mono, or alternative display family ships.
|
|
96
|
+
|
|
97
|
+
### Tier values
|
|
98
|
+
|
|
99
|
+
| Tier | Canvas / paper | Sheet | Ink | Secondary | Rule tint | Highlight |
|
|
100
|
+
| --------------- | -------------- | ------- | ------- | --------- | --------- | --------- |
|
|
101
|
+
| App chrome | #ffffff | #ffffff | #1a1a1a | #666666 | #d1d1d1 | — |
|
|
102
|
+
| Risograph paper | #f2ede2 | #f8f5ee | #000000 | #494744 | #c6c2b9 | #ffe800 |
|
|
103
|
+
|
|
104
|
+
Riso tint-35 is `#9d9a93`. Both palettes remain named tiers, never one blended
|
|
105
|
+
palette or dark/light modes. JSON literals live in primitives; semantic values
|
|
106
|
+
are aliases, including shared white and ink references. CSS preserves aliases.
|
|
107
|
+
Sharp control radius, app/riso border and focus widths, and riso grain opacity
|
|
108
|
+
are included. Product-specific grading/chart/syntax palettes, toast materials,
|
|
109
|
+
textures, shadows, animation recipes, and per-screen layout values are not exported;
|
|
110
|
+
their conflicts are still documented below. Nothing
|
|
111
|
+
in either source repository was migrated or edited.
|
|
112
|
+
|
|
113
|
+
### Components
|
|
114
|
+
|
|
115
|
+
Install the peers `react@^19` and `react-dom@^19`.
|
|
116
|
+
`react-aria-components@^1.21.1` is an optional peer required only for `Modal`.
|
|
117
|
+
React Aria is external in both builds, never bundled.
|
|
118
|
+
JavaScript imports load neither CSS nor fonts. Import `theme.css` before
|
|
119
|
+
`components.css`; recipes live in `@layer components` so Tailwind utilities can
|
|
120
|
+
override them. `cn` uses `clsx` and `tailwind-merge`, matching the product.
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import {
|
|
124
|
+
Button,
|
|
125
|
+
ButtonLink,
|
|
126
|
+
Field,
|
|
127
|
+
Input,
|
|
128
|
+
Modal,
|
|
129
|
+
} from '@boopdoopgoop/design-system/components';
|
|
130
|
+
|
|
131
|
+
<Field label="Email" hint="Use your work email." error={emailError}>
|
|
132
|
+
<Input type="email" name="email" />
|
|
133
|
+
</Field>;
|
|
134
|
+
<Button variant="primary" type="submit">
|
|
135
|
+
Save
|
|
136
|
+
</Button>;
|
|
137
|
+
<ButtonLink variant="secondary" href="/settings">
|
|
138
|
+
Settings
|
|
139
|
+
</ButtonLink>;
|
|
140
|
+
<Modal
|
|
141
|
+
open={open}
|
|
142
|
+
title="Edit profile"
|
|
143
|
+
busy={saving}
|
|
144
|
+
onClose={() => setOpen(false)}
|
|
145
|
+
footer={<Button onClick={save}>Save</Button>}
|
|
146
|
+
>
|
|
147
|
+
<Input aria-label="Name" />
|
|
148
|
+
</Modal>;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| Component | Product-compatible props/defaults |
|
|
152
|
+
| ------------------- | ---------------------------------------------------------------------------------------------------------------------- |
|
|
153
|
+
| `Button` | Native button props/ref; `variant`: primary (default), secondary, danger; `type="button"` by default |
|
|
154
|
+
| `ButtonLink` | Native anchor props; same variants; no invented disabled-link behavior |
|
|
155
|
+
| `Input`, `Textarea` | Native props/ref; no controlled-state or validation implementation |
|
|
156
|
+
| `Tag` | `children`, `className`, `tone`: neutral (default), success, warning, danger, info |
|
|
157
|
+
| `Panel` | `title`, `actions`, `children`, `className`, `headerClassName`, `bodyClassName`; header/actions require a truthy title |
|
|
158
|
+
| `Field` | `label`, `hint`, `error`, `children`, `className`, `interactiveLabel=true` |
|
|
159
|
+
| `Modal` | `open`, `title`, `busy=false`, `onClose`, `children`, `footer`, `className` (shell), `bodyClassName` |
|
|
160
|
+
|
|
161
|
+
Field wires a single direct control element to stable generated hint/error IDs,
|
|
162
|
+
preserving its existing ID/descriptions and marking errors `aria-invalid`.
|
|
163
|
+
With `interactiveLabel=false`, its label names that control via
|
|
164
|
+
`aria-labelledby`. Custom controls must forward those attributes to the actual
|
|
165
|
+
input. With fragments or multiple/wrapped children, implicit label behavior is
|
|
166
|
+
retained; callers must wire descriptions themselves. Error text retains
|
|
167
|
+
`role="alert"`.
|
|
168
|
+
|
|
169
|
+
Modal uses React Aria's `ModalOverlay`, `Modal`, `Dialog`, and title `Heading`.
|
|
170
|
+
React Aria owns focus containment/restoration, portals, and Escape. `busy`
|
|
171
|
+
blocks the close callback and outside dismissal and disables the close button;
|
|
172
|
+
it does not override parent changes to `open`. A truthy footer adds a bounded,
|
|
173
|
+
scrollable body and pinned actions, matching the product. React Aria portals
|
|
174
|
+
into the document body, so local ancestor tier attributes do not cross the
|
|
175
|
+
portal: use a document-level tier for modals. No focus trap is implemented here.
|
|
176
|
+
Router-specific `ButtonRouteLink` and the product's `Banner` are out of scope.
|
|
177
|
+
|
|
178
|
+
#### Release-two provenance and presentation decisions
|
|
179
|
+
|
|
180
|
+
Behavior and prop names come from product `apps/web/app/components/ui/`
|
|
181
|
+
`Button.tsx`, `Control.tsx`, `Tag.tsx`, `Panel.tsx`, `Field.tsx`, `Modal.tsx`,
|
|
182
|
+
and `apps/web/app/lib/cn.ts`. No `ui.css`, legacy `ui-*` classes, or copied color
|
|
183
|
+
literals are used. This release changes presentation, not the source recipes:
|
|
184
|
+
|
|
185
|
+
- Existing tier-aware paper/ink/signal roles drive surfaces/actions; statuses
|
|
186
|
+
stay explicit app colors, never invented riso status tokens. Recipes choose
|
|
187
|
+
app border/focus dimensions in both tiers; the thicker riso foundations are
|
|
188
|
+
not treated as a component recipe.
|
|
189
|
+
- Source 9/10px mono labels become the existing 11px label role. Panel headings
|
|
190
|
+
use the loaded mono regular weight rather than unshipped mono semibold.
|
|
191
|
+
- Source Field/Modal serif text becomes Archivo body/UI and Big Shoulders
|
|
192
|
+
headings, respectively, honoring package typography authority.
|
|
193
|
+
- Placeholder text uses the tier's muted role for readable contrast, rather
|
|
194
|
+
than the lighter riso placeholder tint. Neutral Tag border uses control-line.
|
|
195
|
+
Warning Tag uses explicit app paper behind app warning ink: that pair meets
|
|
196
|
+
small-text contrast, whereas warning ink directly on cream riso paper does not.
|
|
197
|
+
- New spacing/size/tracking/layer/opacity primitives and alias-only semantic
|
|
198
|
+
tokens capture source JSX geometry and disabled/backdrop states (44px control,
|
|
199
|
+
32px close, 480px modal). The 96px textarea minimum and 5% token-derived hover
|
|
200
|
+
mix are package conventions, not claims about unread product CSS.
|
|
201
|
+
- No product shadow, animation, or marketing extrusion is imported. Sharp
|
|
202
|
+
controls, focus-visible outlines, and consumer utility overrides stay explicit.
|
|
203
|
+
- Field's generated description/error wiring is an accessibility addition;
|
|
204
|
+
the product only supplied an implicit wrapping label and alert text.
|
|
205
|
+
|
|
206
|
+
## Develop
|
|
207
|
+
|
|
208
|
+
```sh
|
|
209
|
+
mise install
|
|
210
|
+
mise exec -- pnpm install --frozen-lockfile
|
|
211
|
+
mise exec -- pnpm generate # after changing JSON
|
|
212
|
+
mise exec -- pnpm format:write
|
|
213
|
+
mise exec -- pnpm format
|
|
214
|
+
mise exec -- pnpm lint
|
|
215
|
+
mise exec -- pnpm typecheck
|
|
216
|
+
mise exec -- pnpm test
|
|
217
|
+
mise exec -- pnpm build
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Node **22.23.2**, pnpm **10.15.1** are pinned in `mise.toml`, `package.json`, and
|
|
221
|
+
CI. `generate:check`, the build, and the CSS freshness test fail for stale
|
|
222
|
+
committed CSS; none auto-repairs it. Test builds first, then imports the built
|
|
223
|
+
ESM/CJS package under Vitest, verifies declarations and Fontsource paths,
|
|
224
|
+
validates aliases and both palettes, and compiles real Tailwind v4 utilities.
|
|
225
|
+
The original ten assertions-based tests remain in Node; component tests use
|
|
226
|
+
jsdom and Testing Library, including React Aria focus containment and Escape.
|
|
227
|
+
`dist/` and
|
|
228
|
+
`node_modules/` are uncommitted. Future-run conventions are in `AGENTS.md`.
|
|
229
|
+
|
|
230
|
+
## Source audit and every disagreement
|
|
231
|
+
|
|
232
|
+
Read-only sources inspected for this release:
|
|
233
|
+
|
|
234
|
+
- Product: `/Users/henrycen/Developer/archive/intangibility`, HEAD
|
|
235
|
+
`a67554f560d31021736c835fb2b4964c5effd36a` (working-tree CSS was read).
|
|
236
|
+
- Landing: `intangibility-ai/intangibility-web`, cloned to `/tmp/landing-read`,
|
|
237
|
+
HEAD `d9e26a60a815654278a9de354ed723625c1f5a55`.
|
|
238
|
+
|
|
239
|
+
Table references use these paths and original line numbers:
|
|
240
|
+
|
|
241
|
+
| Key | File |
|
|
242
|
+
| --- | -------------------------------------------------------------- |
|
|
243
|
+
| T | product `apps/web/app/styles/theme.css` |
|
|
244
|
+
| R | product `apps/web/app/styles/risograph.css` |
|
|
245
|
+
| U | product `apps/web/app/styles/ui.css` |
|
|
246
|
+
| L | landing `src/styles.css` |
|
|
247
|
+
| O | landing `src/components/concepts/directions/overprint.css` |
|
|
248
|
+
| OL | landing `src/components/concepts/landing/overprintLanding.css` |
|
|
249
|
+
| D | landing `src/components/concepts/directions/shared.css` |
|
|
250
|
+
| F | landing `src/components/concepts/flight/flight.css` |
|
|
251
|
+
| S | landing `src/components/concepts/landing/overprintSchemes.ts` |
|
|
252
|
+
| M | landing `src/components/concepts/landing/printMixerConfig.ts` |
|
|
253
|
+
| C | landing `src/components/concepts/landing/OverprintLanding.tsx` |
|
|
254
|
+
|
|
255
|
+
All four concept CSS files were read. S/M/C were also inspected to distinguish
|
|
256
|
+
active inline overrides from fallback CSS. Active landing uses greyscale and
|
|
257
|
+
Space Mono (`C:50–53,132`), not the base purple-black ink/pink shadows. **Product
|
|
258
|
+
wins for the same role**; the fixed font trio overrides both repositories'
|
|
259
|
+
historical choices. Rows about component recipes describe the future migration
|
|
260
|
+
decision, not extra components/CSS shipped by this release.
|
|
261
|
+
|
|
262
|
+
### Global landing versus app chrome
|
|
263
|
+
|
|
264
|
+
| Same role | Landing | Product winner |
|
|
265
|
+
| ---------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------- |
|
|
266
|
+
| Canvas | `oklch(.985 .003 90)` L:66; actual HTML/body `#f1e9d4` L:145,150 | `#ffffff` T:6 |
|
|
267
|
+
| Primary/card/popover text | `oklch(.12 0 0)` L:67,69,71 | `#1a1a1a` T:8 |
|
|
268
|
+
| Primary action fill | `oklch(.55 .24 27)` L:72 | `#454545` T:14, U:148 |
|
|
269
|
+
| Primary action text | `oklch(.985 .003 90)` L:73 | `#ffffff` T:15; textured control exception `#f7f7f5` U:154 |
|
|
270
|
+
| Secondary surface/text | `oklch(.94 .005 90)` / `oklch(.12 0 0)` L:74–75 | `#ffffff` / `#1a1a1a` T:7–8, U:142 |
|
|
271
|
+
| Muted surface/text | `oklch(.94 .005 90)` / `oklch(.45 0 0)` L:76–77 | `#f4f4f2` / `#666666` T:9–10 |
|
|
272
|
+
| Danger ink | `oklch(.55 .24 27)` L:80 | `#9b2c2c` T:19, U:92,99 |
|
|
273
|
+
| General border | `oklch(.12 0 0)` L:82,140–141 | `#d1d1d1` T:11 |
|
|
274
|
+
| Input border | `oklch(.12 0 0)` L:83 | `#949494` T:12, U:191 |
|
|
275
|
+
| Focus/ring | `oklch(.55 .24 27)` L:84 | `#1a1a1a` T:16, U:165 |
|
|
276
|
+
| Sidebar background/text | `oklch(.985 .003 90)` / `oklch(.12 0 0)` L:90–91 | `#ffffff` / `#1a1a1a` T:6,8,38 |
|
|
277
|
+
| Sidebar navigation fill/text | `oklch(.55 .24 27)` / `oklch(.985 .003 90)` L:92–93 | `#454545` / `#ffffff` T:14–15,48–49 |
|
|
278
|
+
| Sidebar subtle surface/text | `oklch(.94 .005 90)` / `oklch(.12 0 0)` L:94–95 | `#f4f4f2` / `#1a1a1a` T:8,10 (if subtle chrome) |
|
|
279
|
+
| Sidebar border/focus | `oklch(.12 0 0)` / `oklch(.55 .24 27)` L:96–97 | `#d1d1d1` / `#1a1a1a` T:11,16 |
|
|
280
|
+
|
|
281
|
+
### Active landing versus candidate risograph
|
|
282
|
+
|
|
283
|
+
| Same role | Landing | Product winner |
|
|
284
|
+
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
|
|
285
|
+
| Page stock | `#f1e9d4` OL:56–57, L:145,150 | paper `#f2ede2` R:12,35 |
|
|
286
|
+
| Preview sheet | stock `#f1e9d4` OL:1194–1195 | sheet `#f8f5ee` R:13,69 |
|
|
287
|
+
| Shared marker/highlight | effective warm red `#f24822`, multiply .85 OL:1623–1627, C:28–29,132, S:22 (CSS fallback yellow) | solid `#ffe800` R:18,206–209; hero art may stay separate |
|
|
288
|
+
| Grain strength | .62; dark concept .32 OL:1489–1497 | .1 R:20,55–60 |
|
|
289
|
+
| Body/UI size | 14px O:15, OL:1189 | 15px R:38 |
|
|
290
|
+
| Product wordmark size | 24px base / 22px landing / 20px preview O:82, OL:105,1205 | `clamp(20px,2.4vw,28px)` R:105 |
|
|
291
|
+
| Preview wordmark tracking | .03em OL:1205 | .02em R:108 |
|
|
292
|
+
| Kicker tracking | .06em O:54, OL:517,1689 | .08em R:122 |
|
|
293
|
+
| Section-label tracking | .05em preview / .06em claims OL:1261,1428,517 | .12em R:201 |
|
|
294
|
+
| Main action border | reset 0 O:39,98–118 | 2px black R:353 |
|
|
295
|
+
| Main action size/weight/tracking | 14px (small 12.5px), 800, .04em O:107,109,111,137 | 18px, 900, .06em R:358–360 (geometry only; package UI family is fixed Archivo) |
|
|
296
|
+
| Main action dimensions | padding 14px 22px; small 9px 15px; no minimum O:103,136 | minimum 56px; padding 0 28px R:351–352 |
|
|
297
|
+
| Main action shadow | grey 6px 6px OL:1858–1860 | none R:361 |
|
|
298
|
+
| Action hover/active | hover translate -2px/-2px, grey 8px shadow; active +3px/+3px, grey 2px O:124,130, OL:1862–1866 | flat action, no landing lift R:349–361 |
|
|
299
|
+
| Action rough-edge texture | SVG rough filter OL:1520 | flat fill, no background image/shadow R:349–361; no rough filter to import |
|
|
300
|
+
| Preview solid-action text | sheet `#f8f5ee` OL:1255 | paper `#f2ede2` R:356 |
|
|
301
|
+
| Preview action size/tracking | 17px / .04em OL:1249 | 18px / .06em R:358,360 |
|
|
302
|
+
| Preview action dimensions | padding 12px 18px; no minimum OL:1249 | minimum 56px; padding 0 28px R:351–352 |
|
|
303
|
+
| Preview primary-action shadow | grey 5px OL:1837–1839 | none R:361 |
|
|
304
|
+
| Comparable secondary action border | 3px black OL:1250 | confirm cancel 2px black R:702–706; confirmation sizing stays role-specific |
|
|
305
|
+
| Sheet elevation | final chalky black 4px + hatched grey 8px OL:2194–2202,2288–2310 | solid black 6px + tint-18 12px; mobile 4px/8px R:71–73,755–758 |
|
|
306
|
+
| Field elevation | final black plate 4px + grey 8px, grey outer plate `color-mix(p 55%,stock)` OL:2155–2157,2233–2238,2260–2275 | no landing extrusion on candidate input/command R:385–393,465–476 |
|
|
307
|
+
| Field hover motion | row -2px/-2px; plates 2px/6px OL:401–404,2269,2274–2275 | no field lift in product R:465–483 |
|
|
308
|
+
| Input placeholder | ink-2 `#494744` OL:417 | tint-35 `#9d9a93` R:478–479 |
|
|
309
|
+
| Input focus | outline none; wrapper lift/extrusion OL:402–404,415 | 3px black outline, 3px offset R:49–51 |
|
|
310
|
+
| Shared scroll-control focus offset | 2px OL:482 | 3px R:51 |
|
|
311
|
+
| Shared help typography | 13px body, no uppercase/tracking OL:436 | 11px mono, uppercase, .06em R:364–369 |
|
|
312
|
+
| Shared support footer typography | 14px, 700, .02em; mobile `clamp(5.5px,1.45vw,14px)`/.01em OL:559–566,702–705 | 11px mono, .06em R:491–503; marketing footer may stay separate |
|
|
313
|
+
|
|
314
|
+
Missing body leading in O:14–16 is not a contradictory value; product supplies
|
|
315
|
+
1.45. Landing email entry (15px Archivo, OL:414) is not the same role as the
|
|
316
|
+
product uppercase connection-code input (R:472–475). Shipped primary-action
|
|
317
|
+
knockout already matches product paper (OL:46, S:213).
|
|
318
|
+
|
|
319
|
+
### Base concept defaults, overridden on shipped landing
|
|
320
|
+
|
|
321
|
+
| Same role | Landing fallback | Product winner |
|
|
322
|
+
| -------------------- | --------------------------------------- | ------------------------------------------------------------ |
|
|
323
|
+
| Ink / secondary ink | `#1b1820` / `#57505d` O:4–5 | `#000000` / `#494744` R:14–15; active scheme already matches |
|
|
324
|
+
| Separator tint | `rgba(27,24,32,.18)` O:9,403,420,467 | opaque `#c6c2b9` R:17; active scheme matches |
|
|
325
|
+
| Shared marker yellow | `#ffd400` O:6,336 | `#ffe800` R:18 |
|
|
326
|
+
| Main action text | yellow O:105, OL:8,46 | paper R:356; active on-solid already matches |
|
|
327
|
+
| Action shadow | pink 4px + blue 8px O:112–114, OL:1521 | none R:361 |
|
|
328
|
+
| Action hover shadow | pink 6px + blue 11px O:125–127, OL:1522 | none R:361 |
|
|
329
|
+
| Action active shadow | pink 1px + blue 2px O:131–133 | none R:361 |
|
|
330
|
+
| Small action shadow | pink 3px + blue 6px O:138–140 | none R:361 |
|
|
331
|
+
| Grain opacity | .4 O:63, OL:15 | .1 R:20; active landing later uses .62 |
|
|
332
|
+
|
|
333
|
+
### Product preview versus recruiter grading roles
|
|
334
|
+
|
|
335
|
+
These are explicitly product-screen previews (OL:1825–1826), not unrestricted
|
|
336
|
+
decorative palette choices. Grading-specific tokens are deferred from v0.1.
|
|
337
|
+
|
|
338
|
+
| Same role | Landing preview | Product winner |
|
|
339
|
+
| ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------- |
|
|
340
|
+
| Review/code canvas | stock `#f1e9d4` OL:1195 | white T:6–7,38,105 |
|
|
341
|
+
| Review/code text | black OL:1188,1287, S:124,211 | `#1a1a1a` T:8,47,96,109 |
|
|
342
|
+
| Secondary body/answer | `#494744` OL:1426, S:112,125 | `#666666` T:9,44 |
|
|
343
|
+
| Grading labels/notes | `#494744` OL:1261,1324,1409,1428,1467 | `#767676` T:13,45–46 |
|
|
344
|
+
| Chrome/toolbar/code border | 3px black OL:1200,1204,1257,1259,1261,1350,1427,1439 | `#d1d1d1` T:11,51,81,106; product width unspecified |
|
|
345
|
+
| Navigation fill/knockout | black / sheet `#f8f5ee` OL:1255 | `#454545` / white T:14–15,48–49 |
|
|
346
|
+
| Editor/window header | tint-35 `#9d9a93` OL:1349,1833 | mist `#f4f4f2` for header/gutter; white code chrome T:80,105,107 |
|
|
347
|
+
| Tree/file selection | yellow `#ffe800` multiply .92 OL:1301–1303,1828 | sage `#dce8d4`, ink `#2f4a29` T:21–22,97–98 |
|
|
348
|
+
| Grading annotation/highlight | `#ffe800`, code highlight .75 OL:1385,1828 | yellow `#f0d96f`, soft `#fdf9e8`, ink `#655714` T:63–66 |
|
|
349
|
+
| Candidate collaboration/cursor | red `#e8382b`, sheet knockout; red selection 22% OL:1386,1388,1830 | slate `#dbe5ef`, ink `#324860` T:23–24,87–89 |
|
|
350
|
+
| Assistant identity/activity | green `#00a95c` OL:1045,1407,1456 | sage `#dce8d4`, ink `#2f4a29` T:21–22,90–92, when denoting assistant identity |
|
|
351
|
+
| Generic chart ink | black rules/labels OL:1402,1439,1453 | `#353638` T:43 |
|
|
352
|
+
|
|
353
|
+
Preview Read & run / AI assist / Calls colors (OL:1045–1046,1455–1458) and product
|
|
354
|
+
planning / execution / edit / steering / idle (T:68–72) have different category
|
|
355
|
+
ontologies. There is no safe index/name mapping. Visited-file blue (OL:1312,1329)
|
|
356
|
+
has no product counterpart. Global landing chart-1…5 (L:85–89,124–128) likewise
|
|
357
|
+
cannot be mapped by position to product models/statuses/activities.
|
|
358
|
+
|
|
359
|
+
### Earlier shared textured-control recipes
|
|
360
|
+
|
|
361
|
+
| Same role | Landing | Product winner |
|
|
362
|
+
| ---------------------- | ------------------------------------------------------ | ---------------------------------- |
|
|
363
|
+
| Ink-on-hover fill | `#4b4b4d` L:388 | `#454545` U:148, T:14 |
|
|
364
|
+
| Ink texture | two gradients: 113° white .09, 119° dark .24 L:389–391 | 116° white 4.5%, 1px/6px U:149–153 |
|
|
365
|
+
| Light control label | `#f5f7fa` L:394 | `#f7f7f5` U:154 |
|
|
366
|
+
| Nonflat CTA hover fill | black L:397 | `#eceef2` U:172 |
|
|
367
|
+
| CTA hover label | `rgba(248,250,253,.95)` L:401 | `#454545` U:184, T:14 |
|
|
368
|
+
| CTA hover texture | white .1 + black .3 gradients L:398–400 | dark 12% + white 50% U:173–183 |
|
|
369
|
+
|
|
370
|
+
Landing `.inq-row:hover` already matches product light-hover fill and both
|
|
371
|
+
gradients (L:407–410, U:172–183). Missing landing hover border/foreground is not
|
|
372
|
+
an explicit conflicting value.
|
|
373
|
+
|
|
374
|
+
### Fonts and stacks: fixed choices take precedence
|
|
375
|
+
|
|
376
|
+
| Role/location | Landing or historical product disagreement | Release decision |
|
|
377
|
+
| ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
378
|
+
| Global body/sans | Newsreader serif in `--font-sans` L:100; candidate Archivo R:25,37 | Archivo body/UI |
|
|
379
|
+
| Historical prose/serif | landing Newsreader L:99; product variable-first Newsreader T:2; toast uses it U:105 | Archivo; no legacy `font-serif` export |
|
|
380
|
+
| Global mono stack | Spline static, no Menlo L:101 vs product variable-first Spline + Menlo T:3–5, R:26–28 | static Spline Sans Mono + ui-monospace/Menlo/monospace, matching installed packages |
|
|
381
|
+
| Active landing mono | inline Space Mono C:132, M:86–90,157 | Spline Sans Mono |
|
|
382
|
+
| Token-based mono fallback/usages | Space Mono O:51,265,333,407,442; OL:514,1124,1282,1321,1686 | Spline Sans Mono |
|
|
383
|
+
| Preview avatar, headings, editor tab/code | hardcoded Space Mono OL:1231,1261,1351,1378 | Spline Sans Mono |
|
|
384
|
+
| Preview timestamps/verdict/chart values/legend | hardcoded Space Mono OL:1409,1428,1449,1467 | Spline Sans Mono |
|
|
385
|
+
| Main CTA family | landing Archivo O:106 vs candidate Big Shoulders R:357 | fixed UI Archivo; display headings Big Shoulders. Riso CTA family is a documented exception to product-wins under the fixed font policy |
|
|
386
|
+
| Shared help family | inherited Archivo OL:436, O:14 vs Spline R:364–369 | Spline mono label role |
|
|
387
|
+
| Shared support footer family | Archivo OL:559 vs Spline R:501 | Spline for shared support; marketing footer stays separate |
|
|
388
|
+
| Recruiter preview body | Archivo O:14, OL:1183–1190 vs known Newsreader toast-copy U:105 | Archivo; no universal recruiter body declaration exists in supplied files |
|
|
389
|
+
| Replay tooling | system mono/SF Mono/Menlo D:8 | Spline if promoted to shared UI; tooling excluded |
|
|
390
|
+
| Mixer text/select tooling | system mono OL:726–730,912–916 | Spline if promoted; tooling excluded |
|
|
391
|
+
| Experimental font alternatives | Oswald/Archivo Black; Newsreader/Libre Franklin; Space Mono/Courier Prime/IBM Plex Mono M:22–83,102–144 | not exported; fixed trio only |
|
|
392
|
+
| Font weight availability | product R:6–7 imports Archivo 400/Big Shoulders 900; landing Archivo 500–800 O:88,107,258,326,404,448,455,468; OL:111,327,355,414,435,529,561,1208,1210,1239–1240,1411,1426 | explicit release imports above; no claim of synthetic rendering or inferred imports elsewhere |
|
|
393
|
+
|
|
394
|
+
### Motion policy disagreements (recipes deferred)
|
|
395
|
+
|
|
396
|
+
| Same role/policy | Landing | Product winner |
|
|
397
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
|
|
398
|
+
| OS reduced motion | intro requires HTML `data-honor-reduced-motion` L:561–598; flight OL:241–245; drawn rules OL:1577–1580 | unconditional OS preference R:766–769, U:49–64 |
|
|
399
|
+
| Main action state motion | .15s ease transform/shadow, hover/active lift O:115–117,124,130; form OL:373 | flat action R:349–361; absent duration is not a numeric conflict |
|
|
400
|
+
| Form reduced-motion handling | plates disable transitions OL:2107–2109,2175–2176 but row lift remains OL:373,403 unless global attribute L:575–582 | no landing field lifts; direct OS policy R:766–769 |
|
|
401
|
+
| Preview hover movement | .28s overshoot; title -6px, button -3px, files +5px, code +4px, verdict -4px, dot 1.25 OL:1889–1903 | no corresponding product motion; do not import as a shared recipe |
|
|
402
|
+
|
|
403
|
+
Closing fade, scroll cue, preview transition, and hero-name transition already
|
|
404
|
+
honor reduced motion directly (OL:35–39,487–491,1904–1908,1957–1958). Butterfly
|
|
405
|
+
wingbeat .3s F:6, swoop .72s OL:158, print feed .55s O:194–200, and L:185–205
|
|
406
|
+
reveals do not share the toast/pulse roles and are not duration conflicts.
|
|
407
|
+
|
|
408
|
+
### Boundaries: not disagreements on the same role
|
|
409
|
+
|
|
410
|
+
- Active greyscale paper/sheet/ink/ink-2/tint-35/tint-18 match R:12–17. Landing
|
|
411
|
+
card/popover white L:68,70 matches T:7. Sharp radius L:65 matches T:33.
|
|
412
|
+
- Landing dark palette L:104–136 has no product dark-mode counterpart. It is
|
|
413
|
+
unsupported parity, not a conflict with product light tokens.
|
|
414
|
+
- Landing accent/destructive-foreground L:78–79,81 have no proven same-role
|
|
415
|
+
product equivalents. Do not turn accent red into warning yellow.
|
|
416
|
+
- Hero/poster scale O:219,540; OL:272–273,620,640,1713–1715,1873–1878,2040;
|
|
417
|
+
giant art score O:356–357,393; preview review title OL:1243 are different
|
|
418
|
+
screen/marketing roles, not product title/timer sizes.
|
|
419
|
+
- Butterfly passes O:171–211, OL:148–255,2313–2335, F:1–6; rough display art
|
|
420
|
+
OL:1593–1657,1817–1819,1848–1853; alternate drums/stocks S:17–42,216–360;
|
|
421
|
+
footer color art OL:1930–1933, S:133–136; registration geometry
|
|
422
|
+
OL:1134–1160,1660–1665; halftone bands OL:1262–1264,1667–1791,1805–1806,2338
|
|
423
|
+
remain concept-only. Warm-red hero ink C:28–29 may remain art, but cannot
|
|
424
|
+
replace the shared yellow highlight role.
|
|
425
|
+
- Replay pill D:7–13 (999px radius, blur 12px); mixer OL:720–730 (14px radius,
|
|
426
|
+
blur 14px); tooling buttons/selects OL:797–815,854–869,903–916,950–959
|
|
427
|
+
(7px/6px radii); tooling warning OL:943–948 (`#fff0b3`/`#5c4b00`) are not
|
|
428
|
+
product controls/dialogs/statuses. Preview avatar OL:1228 has no product
|
|
429
|
+
counterpart. Rounded registration circles are geometry, not controls.
|
|
430
|
+
- Historical flourishes L:155–266,300–380,413–461,474–559 and soft marketing
|
|
431
|
+
shadows L:302–310,463–469 are not toast or ink-control roles. Product toast
|
|
432
|
+
radius 10px U:37 does not imply rounded buttons; landing derived radii
|
|
433
|
+
L:22–28 do not have a matching product radius scale.
|
|
434
|
+
- Superseded frosted navigation OL:69–70 becomes opaque/no blur OL:1501–1503;
|
|
435
|
+
final form/sheet shadows are OL:2260–2275,2295–2310. Earlier overridden
|
|
436
|
+
recipes are not additional active conflicts.
|
|
437
|
+
- Product-only toast surfaces U:80–100, syntax colors U:220–258, most grading
|
|
438
|
+
status/model colors T:52–79, and change/deletion T:99–104 have no matching
|
|
439
|
+
landing roles. `--canvas-grid`/`--canvas-grid-size` are referenced U:3–4 but
|
|
440
|
+
not defined in these sources; no values were invented.
|
|
441
|
+
|
|
442
|
+
This audit is source-based, not a computed-style/browser audit. Absence of a
|
|
443
|
+
declaration is not a conflicting literal; conditional role matches are labeled.
|