@hanzo/design 0.5.1 → 0.5.2
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/dist/tokens.gen.d.ts +14 -0
- package/dist/tokens.gen.d.ts.map +1 -1
- package/dist/tokens.gen.js +14 -0
- package/guidelines/brand-paper.card.html +22 -0
- package/package.json +1 -1
- package/prompts/rules.md +3 -1
- package/prompts/system.md +8 -2
- package/scripts/check-tokens.mjs +26 -0
- package/skills/design-system/SKILL.md +3 -1
- package/src/tokens.gen.ts +14 -0
- package/styles.css +35 -0
- package/tailwind.css +35 -0
- package/tokens/elevation.css +35 -0
package/dist/tokens.gen.d.ts
CHANGED
|
@@ -239,6 +239,13 @@ export declare const elevation: {
|
|
|
239
239
|
readonly 'shadow-lg': "0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)";
|
|
240
240
|
readonly 'shadow-xl': "0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)";
|
|
241
241
|
readonly 'shadow-2xl': "var(--shadow-floating)";
|
|
242
|
+
readonly 'sheet-0': "var(--surface-page)";
|
|
243
|
+
readonly 'sheet-1': "var(--surface-card)";
|
|
244
|
+
readonly 'sheet-2': "var(--surface-card-emphasis)";
|
|
245
|
+
readonly 'shadow-sheet-1': "var(--edge-highlight),var(--shadow-md)";
|
|
246
|
+
readonly 'shadow-sheet-2': "var(--edge-highlight),var(--shadow-lg)";
|
|
247
|
+
readonly fold: "12px";
|
|
248
|
+
readonly 'fold-face': "linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))";
|
|
242
249
|
readonly 'glow-hero': "radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)";
|
|
243
250
|
readonly 'glow-hero-blur': "120px";
|
|
244
251
|
readonly 'sheen-card': "radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)";
|
|
@@ -512,6 +519,13 @@ export declare const cssVars: {
|
|
|
512
519
|
readonly '--shadow-lg': "0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)";
|
|
513
520
|
readonly '--shadow-xl': "0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)";
|
|
514
521
|
readonly '--shadow-2xl': "var(--shadow-floating)";
|
|
522
|
+
readonly '--sheet-0': "var(--surface-page)";
|
|
523
|
+
readonly '--sheet-1': "var(--surface-card)";
|
|
524
|
+
readonly '--sheet-2': "var(--surface-card-emphasis)";
|
|
525
|
+
readonly '--shadow-sheet-1': "var(--edge-highlight),var(--shadow-md)";
|
|
526
|
+
readonly '--shadow-sheet-2': "var(--edge-highlight),var(--shadow-lg)";
|
|
527
|
+
readonly '--fold': "12px";
|
|
528
|
+
readonly '--fold-face': "linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))";
|
|
515
529
|
readonly '--glow-hero': "radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)";
|
|
516
530
|
readonly '--glow-hero-blur': "120px";
|
|
517
531
|
readonly '--sheen-card': "radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)";
|
package/dist/tokens.gen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.gen.d.ts","sourceRoot":"","sources":["../src/tokens.gen.ts"],"names":[],"mappings":"AAIA,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFT,CAAA;AAEV,0EAA0E;AAC1E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEb,CAAA;AAEV,oEAAoE;AACpE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CV,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;;;;;;;;;;;CAYP,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"tokens.gen.d.ts","sourceRoot":"","sources":["../src/tokens.gen.ts"],"names":[],"mappings":"AAIA,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFT,CAAA;AAEV,0EAA0E;AAC1E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEb,CAAA;AAEV,oEAAoE;AACpE,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CV,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI;;;;;;;;;;;;CAYP,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BZ,CAAA;AAEV,kEAAkE;AAClE,eAAO,MAAM,MAAM;;;;;;;;;;;;;CAaT,CAAA;AAEV,6DAA6D;AAC7D,eAAO,MAAM,MAAM;;;;;;;;;;;;CAYT,CAAA;AAEV,gEAAgE;AAChE,eAAO,MAAM,KAAK;;;;;;CAMR,CAAA;AAEV,8DAA8D;AAC9D,eAAO,MAAM,IAAI,IAEP,CAAA;AAEV,sFAAsF;AACtF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2QV,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAA"}
|
package/dist/tokens.gen.js
CHANGED
|
@@ -242,6 +242,13 @@ export const elevation = {
|
|
|
242
242
|
'shadow-lg': '0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)',
|
|
243
243
|
'shadow-xl': '0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)',
|
|
244
244
|
'shadow-2xl': 'var(--shadow-floating)',
|
|
245
|
+
'sheet-0': 'var(--surface-page)',
|
|
246
|
+
'sheet-1': 'var(--surface-card)',
|
|
247
|
+
'sheet-2': 'var(--surface-card-emphasis)',
|
|
248
|
+
'shadow-sheet-1': 'var(--edge-highlight),var(--shadow-md)',
|
|
249
|
+
'shadow-sheet-2': 'var(--edge-highlight),var(--shadow-lg)',
|
|
250
|
+
'fold': '12px',
|
|
251
|
+
'fold-face': 'linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))',
|
|
245
252
|
'glow-hero': 'radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)',
|
|
246
253
|
'glow-hero-blur': '120px',
|
|
247
254
|
'sheen-card': 'radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)',
|
|
@@ -515,6 +522,13 @@ export const cssVars = {
|
|
|
515
522
|
'--shadow-lg': '0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)',
|
|
516
523
|
'--shadow-xl': '0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)',
|
|
517
524
|
'--shadow-2xl': 'var(--shadow-floating)',
|
|
525
|
+
'--sheet-0': 'var(--surface-page)',
|
|
526
|
+
'--sheet-1': 'var(--surface-card)',
|
|
527
|
+
'--sheet-2': 'var(--surface-card-emphasis)',
|
|
528
|
+
'--shadow-sheet-1': 'var(--edge-highlight),var(--shadow-md)',
|
|
529
|
+
'--shadow-sheet-2': 'var(--edge-highlight),var(--shadow-lg)',
|
|
530
|
+
'--fold': '12px',
|
|
531
|
+
'--fold-face': 'linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))',
|
|
518
532
|
'--glow-hero': 'radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)',
|
|
519
533
|
'--glow-hero-blur': '120px',
|
|
520
534
|
'--sheen-card': 'radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)',
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!-- @dsCard group="Brand" viewport="700x240" name="Paper" subtitle="Three sheets, one light, and a fold that means this opens" -->
|
|
2
|
+
<!doctype html><html class="dark"><head><meta charset="utf-8"><title>Paper</title><link rel="stylesheet" href="../styles.css">
|
|
3
|
+
<style>body{margin:0;padding:20px;background:var(--sheet-0);font-family:var(--font-sans);color:var(--foreground)}
|
|
4
|
+
.n{font-size:10px;font-weight:600;letter-spacing:.06em;color:var(--neutral-300);font-family:var(--font-mono)}
|
|
5
|
+
.v{font-size:9px;color:var(--neutral-600);font-family:var(--font-mono);margin-top:3px}
|
|
6
|
+
.sheet{padding:14px;border-radius:var(--radius-lg);font-size:12px;color:var(--neutral-400)}
|
|
7
|
+
.s1{background:var(--sheet-1);box-shadow:var(--shadow-sheet-1)}
|
|
8
|
+
.s2{background:var(--sheet-2);box-shadow:var(--shadow-sheet-2)}
|
|
9
|
+
.fold{background-image:var(--fold-face);border-bottom-right-radius:0}
|
|
10
|
+
</style></head><body>
|
|
11
|
+
<div style="display:flex;gap:16px;align-items:stretch">
|
|
12
|
+
<div class="sheet" style="flex:1">the workspace — no lift, no box<div class="n" style="margin-top:10px">--sheet-0</div><div class="v">the ground</div></div>
|
|
13
|
+
<div class="sheet s1" style="flex:1">an active tool<div class="n" style="margin-top:10px">--sheet-1</div><div class="v">+ --shadow-sheet-1</div></div>
|
|
14
|
+
<div class="sheet s2" style="flex:1">what opened<div class="n" style="margin-top:10px">--sheet-2</div><div class="v">+ --shadow-sheet-2</div></div>
|
|
15
|
+
<div class="sheet s1 fold" style="flex:1">this one expands<div class="n" style="margin-top:10px">--fold-face</div><div class="v">the only mark</div></div>
|
|
16
|
+
</div>
|
|
17
|
+
<div style="margin-top:18px;display:flex;gap:16px">
|
|
18
|
+
<div class="sheet s1" style="flex:1">a sheet on a sheet lands a step lighter
|
|
19
|
+
<div class="sheet s1" style="margin-top:10px">nested<div class="sheet s1" style="margin-top:10px">nested again</div></div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</body></html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzo/design",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"packageManager": "pnpm@11.17.0",
|
|
5
5
|
"description": "Hanzo Design System \u2014 monochrome, dark-default tokens + components + brand assets, the single source of truth for every Hanzo surface. CSS + typed programmatic tokens.",
|
|
6
6
|
"license": "MIT OR Apache-2.0",
|
package/prompts/rules.md
CHANGED
|
@@ -33,7 +33,9 @@ token or pattern that makes the "do" trivial.
|
|
|
33
33
|
|----|-------|
|
|
34
34
|
| One primary (white) action per view; everything else outline or ghost. | Two competing primary buttons. |
|
|
35
35
|
| Plain `<a>` / `<Link>` with className, or the shipped `<Button>`. | `<Button asChild>` — it breaks the build under React 18 strict children. |
|
|
36
|
-
|
|
|
36
|
+
| Separate two surfaces by RAISING one — `--sheet-1` + `--shadow-sheet-1`. | Outlining both, then raising one anyway. |
|
|
37
|
+
| A level because the surface means something: workspace, tool, opened. | A drop shadow for looks, or a second lamp — every shadow drops straight down. |
|
|
38
|
+
| A fold (`--fold-face`) only where the item expands. | A fold as ornament. |
|
|
37
39
|
|
|
38
40
|
## Motion
|
|
39
41
|
|
package/prompts/system.md
CHANGED
|
@@ -73,8 +73,14 @@ That is not Hanzo. Make it white-on-black and let the content carry it.
|
|
|
73
73
|
|
|
74
74
|
- `--radius-sm` on buttons/inputs, `--radius-lg` on cards, `--radius-full` on
|
|
75
75
|
pills and avatars. `--radius-composer` (28px) only for the chat composer.
|
|
76
|
-
-
|
|
77
|
-
|
|
76
|
+
- Depth is the hierarchy. Three levels of paper: `--sheet-0` is the workspace,
|
|
77
|
+
`--sheet-1` an active tool, `--sheet-2` what opened — each with the matching
|
|
78
|
+
`--shadow-sheet-*`, which carries the top edge-light and the drop together.
|
|
79
|
+
Raise a surface before you outline it, and never do both.
|
|
80
|
+
- One light, above: every shadow in the system is `0 <y> …`. A sideways offset
|
|
81
|
+
is a second lamp, and the screen stops reading as one space.
|
|
82
|
+
- `--fold-face` marks an item that expands, and nothing else. `--shadow-floating`
|
|
83
|
+
is for what actually floats — menus, dialogs. Heroes get one ambient
|
|
78
84
|
`--glow-hero` radial, nothing more.
|
|
79
85
|
|
|
80
86
|
## Motion
|
package/scripts/check-tokens.mjs
CHANGED
|
@@ -302,5 +302,31 @@ const pass = (msg) => console.log(` ok ${msg}`)
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
+
// ── 5. one light, from one direction ─────────────────────────────────────
|
|
306
|
+
// The paper ramp reads as one space only while every edge and every drop in
|
|
307
|
+
// the system agrees where the light is. A single `2px 4px` — the spelling
|
|
308
|
+
// every other library ships — puts a second lamp in the room, and the failure
|
|
309
|
+
// is not visible on any one component: the panel with the offset shadow looks
|
|
310
|
+
// fine, and it is the SCREEN that stops making sense. So the rule is checked
|
|
311
|
+
// on the values instead of trusted to whoever writes the next one: the light
|
|
312
|
+
// is directly above, so a shadow moves down and never sideways.
|
|
313
|
+
//
|
|
314
|
+
// Structural, not by name — a layer counts as a shadow when its first two
|
|
315
|
+
// lengths are lengths, which is what a shadow is and what a size is not.
|
|
316
|
+
{
|
|
317
|
+
const css = strip(read(join(tokensDir, 'elevation.css')))
|
|
318
|
+
const LEN = /^-?[\d.]+(px|rem|em)?$/
|
|
319
|
+
const offenders = []
|
|
320
|
+
for (const [, name, value] of css.matchAll(/--([A-Za-z0-9-]+)\s*:\s*([^;]+);/g))
|
|
321
|
+
for (const layer of value.split(',')) {
|
|
322
|
+
const t = layer.trim().replace(/^inset\s+/, '').split(/\s+/)
|
|
323
|
+
if (LEN.test(t[0]) && LEN.test(t[1] ?? '') && parseFloat(t[0]) !== 0)
|
|
324
|
+
offenders.push(`--${name} (${layer.trim()})`)
|
|
325
|
+
}
|
|
326
|
+
offenders.length
|
|
327
|
+
? offenders.forEach((o) => fail(`${o} is offset sideways — the light is above, so every shadow is \`0 <y> …\``))
|
|
328
|
+
: pass('one light direction — every shadow in elevation.css drops straight down')
|
|
329
|
+
}
|
|
330
|
+
|
|
305
331
|
console.log(failures ? `\n${failures} check(s) failed` : '\nall token checks passed')
|
|
306
332
|
process.exit(failures ? 1 : 0)
|
|
@@ -43,7 +43,9 @@ Then reach for a **name**, never a value:
|
|
|
43
43
|
| You want | Use | Never |
|
|
44
44
|
|---|---|---|
|
|
45
45
|
| a page / text | `--background`, `--foreground`, `--text-secondary` | `#000`, `#fff`, `rgb(…)` |
|
|
46
|
-
| a card, a panel | `--surface-card`, `--border
|
|
46
|
+
| a card, a panel | `--surface-card`, `--border` | a hand-mixed grey |
|
|
47
|
+
| depth — a tool over the workspace | `--sheet-1` + `--shadow-sheet-1` | a box round both, or your own `box-shadow` |
|
|
48
|
+
| "this expands" | `--fold-face` | a fold as ornament |
|
|
47
49
|
| rank / emphasis | the ladder `--white-05 … --white-80` | an off-ladder 12% or 37% |
|
|
48
50
|
| a size | `--type-body`, `--type-h2`, `--text-sm` | `font-size: 13px` |
|
|
49
51
|
| space | `--space-*`, `--gutter*`, `--container-max` | `padding: 13px` |
|
package/src/tokens.gen.ts
CHANGED
|
@@ -248,6 +248,13 @@ export const elevation = {
|
|
|
248
248
|
'shadow-lg': '0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)',
|
|
249
249
|
'shadow-xl': '0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)',
|
|
250
250
|
'shadow-2xl': 'var(--shadow-floating)',
|
|
251
|
+
'sheet-0': 'var(--surface-page)',
|
|
252
|
+
'sheet-1': 'var(--surface-card)',
|
|
253
|
+
'sheet-2': 'var(--surface-card-emphasis)',
|
|
254
|
+
'shadow-sheet-1': 'var(--edge-highlight),var(--shadow-md)',
|
|
255
|
+
'shadow-sheet-2': 'var(--edge-highlight),var(--shadow-lg)',
|
|
256
|
+
'fold': '12px',
|
|
257
|
+
'fold-face': 'linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))',
|
|
251
258
|
'glow-hero': 'radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)',
|
|
252
259
|
'glow-hero-blur': '120px',
|
|
253
260
|
'sheen-card': 'radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)',
|
|
@@ -528,6 +535,13 @@ export const cssVars = {
|
|
|
528
535
|
'--shadow-lg': '0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55)',
|
|
529
536
|
'--shadow-xl': '0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60)',
|
|
530
537
|
'--shadow-2xl': 'var(--shadow-floating)',
|
|
538
|
+
'--sheet-0': 'var(--surface-page)',
|
|
539
|
+
'--sheet-1': 'var(--surface-card)',
|
|
540
|
+
'--sheet-2': 'var(--surface-card-emphasis)',
|
|
541
|
+
'--shadow-sheet-1': 'var(--edge-highlight),var(--shadow-md)',
|
|
542
|
+
'--shadow-sheet-2': 'var(--edge-highlight),var(--shadow-lg)',
|
|
543
|
+
'--fold': '12px',
|
|
544
|
+
'--fold-face': 'linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold))',
|
|
531
545
|
'--glow-hero': 'radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%)',
|
|
532
546
|
'--glow-hero-blur': '120px',
|
|
533
547
|
'--sheen-card': 'radial-gradient(120% 120% at 80% 0%,rgb(255 255 255 / .08) 0%,transparent 55%)',
|
package/styles.css
CHANGED
|
@@ -588,6 +588,41 @@
|
|
|
588
588
|
--shadow-lg:0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55);
|
|
589
589
|
--shadow-xl:0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60);
|
|
590
590
|
--shadow-2xl:var(--shadow-floating);
|
|
591
|
+
|
|
592
|
+
/* ——— the paper ——— */
|
|
593
|
+
/* Depth carries STATE, not decoration: which sheet is the workspace, which is
|
|
594
|
+
the tool in use, which one opened. Reach for a level before a border — if
|
|
595
|
+
two surfaces need separating, RAISE one rather than outline both, and a
|
|
596
|
+
surface that is already raised does not also need a box drawn round it.
|
|
597
|
+
|
|
598
|
+
A level is a tint AND the light on it, published as a pair, because the
|
|
599
|
+
alternative — every component composing its own `--edge-highlight,
|
|
600
|
+
--shadow-*` — is how two panels on one screen end up lit from two
|
|
601
|
+
directions. Every rung here is pure vertical: a 1px inset line along the
|
|
602
|
+
top edge, a drop straight down. One origin, above and slightly in front.
|
|
603
|
+
|
|
604
|
+
The tints are the surface recipes rather than new values, so sheets stack
|
|
605
|
+
the way paper does: each is an alpha-white wash, one laid on another lands
|
|
606
|
+
a step lighter, and the stack converges on #262626 instead of blowing out.
|
|
607
|
+
|
|
608
|
+
Nothing here is restated in `.light`, deliberately: every part defers to a
|
|
609
|
+
token that already flips, so the ramp inverts with the theme for free. */
|
|
610
|
+
--sheet-0:var(--surface-page); /* the workspace ground */
|
|
611
|
+
--sheet-1:var(--surface-card); /* an active tool */
|
|
612
|
+
--sheet-2:var(--surface-card-emphasis); /* what opened, or what is inside */
|
|
613
|
+
--shadow-sheet-1:var(--edge-highlight),var(--shadow-md);
|
|
614
|
+
--shadow-sheet-2:var(--edge-highlight),var(--shadow-lg);
|
|
615
|
+
|
|
616
|
+
/* The fold — a corner turned back, and the one mark that means THIS OPENS.
|
|
617
|
+
Ornament nowhere: a sheet that does not expand does not wear one.
|
|
618
|
+
It is a background-image, so it costs no element and no pseudo-element —
|
|
619
|
+
paint it on the sheet itself and square that corner
|
|
620
|
+
(`border-bottom-right-radius:0`), because a folded corner is not round.
|
|
621
|
+
The flap catches the light like every other surface; the crease is the
|
|
622
|
+
hairline; both defer, so both invert. */
|
|
623
|
+
--fold:12px;
|
|
624
|
+
--fold-face:linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold)); /* @kind color */
|
|
625
|
+
|
|
591
626
|
/* Ambient hero glow — a single white radial, blurred 120px, low opacity. */
|
|
592
627
|
--glow-hero:radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%); /* @kind color */
|
|
593
628
|
--glow-hero-blur:120px;
|
package/tailwind.css
CHANGED
|
@@ -611,6 +611,41 @@
|
|
|
611
611
|
--shadow-lg:0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55);
|
|
612
612
|
--shadow-xl:0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60);
|
|
613
613
|
--shadow-2xl:var(--shadow-floating);
|
|
614
|
+
|
|
615
|
+
/* ——— the paper ——— */
|
|
616
|
+
/* Depth carries STATE, not decoration: which sheet is the workspace, which is
|
|
617
|
+
the tool in use, which one opened. Reach for a level before a border — if
|
|
618
|
+
two surfaces need separating, RAISE one rather than outline both, and a
|
|
619
|
+
surface that is already raised does not also need a box drawn round it.
|
|
620
|
+
|
|
621
|
+
A level is a tint AND the light on it, published as a pair, because the
|
|
622
|
+
alternative — every component composing its own `--edge-highlight,
|
|
623
|
+
--shadow-*` — is how two panels on one screen end up lit from two
|
|
624
|
+
directions. Every rung here is pure vertical: a 1px inset line along the
|
|
625
|
+
top edge, a drop straight down. One origin, above and slightly in front.
|
|
626
|
+
|
|
627
|
+
The tints are the surface recipes rather than new values, so sheets stack
|
|
628
|
+
the way paper does: each is an alpha-white wash, one laid on another lands
|
|
629
|
+
a step lighter, and the stack converges on #262626 instead of blowing out.
|
|
630
|
+
|
|
631
|
+
Nothing here is restated in `.light`, deliberately: every part defers to a
|
|
632
|
+
token that already flips, so the ramp inverts with the theme for free. */
|
|
633
|
+
--sheet-0:var(--surface-page); /* the workspace ground */
|
|
634
|
+
--sheet-1:var(--surface-card); /* an active tool */
|
|
635
|
+
--sheet-2:var(--surface-card-emphasis); /* what opened, or what is inside */
|
|
636
|
+
--shadow-sheet-1:var(--edge-highlight),var(--shadow-md);
|
|
637
|
+
--shadow-sheet-2:var(--edge-highlight),var(--shadow-lg);
|
|
638
|
+
|
|
639
|
+
/* The fold — a corner turned back, and the one mark that means THIS OPENS.
|
|
640
|
+
Ornament nowhere: a sheet that does not expand does not wear one.
|
|
641
|
+
It is a background-image, so it costs no element and no pseudo-element —
|
|
642
|
+
paint it on the sheet itself and square that corner
|
|
643
|
+
(`border-bottom-right-radius:0`), because a folded corner is not round.
|
|
644
|
+
The flap catches the light like every other surface; the crease is the
|
|
645
|
+
hairline; both defer, so both invert. */
|
|
646
|
+
--fold:12px;
|
|
647
|
+
--fold-face:linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold)); /* @kind color */
|
|
648
|
+
|
|
614
649
|
/* Ambient hero glow — a single white radial, blurred 120px, low opacity. */
|
|
615
650
|
--glow-hero:radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%); /* @kind color */
|
|
616
651
|
--glow-hero-blur:120px;
|
package/tokens/elevation.css
CHANGED
|
@@ -53,6 +53,41 @@
|
|
|
53
53
|
--shadow-lg:0 10px 15px -3px rgb(0 0 0 / .55), 0 4px 6px -4px rgb(0 0 0 / .55);
|
|
54
54
|
--shadow-xl:0 20px 25px -5px rgb(0 0 0 / .60), 0 8px 10px -6px rgb(0 0 0 / .60);
|
|
55
55
|
--shadow-2xl:var(--shadow-floating);
|
|
56
|
+
|
|
57
|
+
/* ——— the paper ——— */
|
|
58
|
+
/* Depth carries STATE, not decoration: which sheet is the workspace, which is
|
|
59
|
+
the tool in use, which one opened. Reach for a level before a border — if
|
|
60
|
+
two surfaces need separating, RAISE one rather than outline both, and a
|
|
61
|
+
surface that is already raised does not also need a box drawn round it.
|
|
62
|
+
|
|
63
|
+
A level is a tint AND the light on it, published as a pair, because the
|
|
64
|
+
alternative — every component composing its own `--edge-highlight,
|
|
65
|
+
--shadow-*` — is how two panels on one screen end up lit from two
|
|
66
|
+
directions. Every rung here is pure vertical: a 1px inset line along the
|
|
67
|
+
top edge, a drop straight down. One origin, above and slightly in front.
|
|
68
|
+
|
|
69
|
+
The tints are the surface recipes rather than new values, so sheets stack
|
|
70
|
+
the way paper does: each is an alpha-white wash, one laid on another lands
|
|
71
|
+
a step lighter, and the stack converges on #262626 instead of blowing out.
|
|
72
|
+
|
|
73
|
+
Nothing here is restated in `.light`, deliberately: every part defers to a
|
|
74
|
+
token that already flips, so the ramp inverts with the theme for free. */
|
|
75
|
+
--sheet-0:var(--surface-page); /* the workspace ground */
|
|
76
|
+
--sheet-1:var(--surface-card); /* an active tool */
|
|
77
|
+
--sheet-2:var(--surface-card-emphasis); /* what opened, or what is inside */
|
|
78
|
+
--shadow-sheet-1:var(--edge-highlight),var(--shadow-md);
|
|
79
|
+
--shadow-sheet-2:var(--edge-highlight),var(--shadow-lg);
|
|
80
|
+
|
|
81
|
+
/* The fold — a corner turned back, and the one mark that means THIS OPENS.
|
|
82
|
+
Ornament nowhere: a sheet that does not expand does not wear one.
|
|
83
|
+
It is a background-image, so it costs no element and no pseudo-element —
|
|
84
|
+
paint it on the sheet itself and square that corner
|
|
85
|
+
(`border-bottom-right-radius:0`), because a folded corner is not round.
|
|
86
|
+
The flap catches the light like every other surface; the crease is the
|
|
87
|
+
hairline; both defer, so both invert. */
|
|
88
|
+
--fold:12px;
|
|
89
|
+
--fold-face:linear-gradient(315deg,var(--glass-strong) 0,var(--glass-strong) calc(var(--fold) - 1px),var(--border-strong) calc(var(--fold) - 1px),var(--border-strong) var(--fold),transparent var(--fold)); /* @kind color */
|
|
90
|
+
|
|
56
91
|
/* Ambient hero glow — a single white radial, blurred 120px, low opacity. */
|
|
57
92
|
--glow-hero:radial-gradient(circle,rgb(255 255 255 / .12) 0%,transparent 68%); /* @kind color */
|
|
58
93
|
--glow-hero-blur:120px;
|