@hyvnt/hyvui 0.2.0 → 0.3.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 +264 -253
- package/dist/components/ambient/CornerBrackets.svelte +83 -87
- package/dist/components/ambient/DataStream.svelte +111 -94
- package/dist/components/ambient/GlyphMark.svelte +69 -69
- package/dist/components/ambient/GridOverlay.svelte +26 -28
- package/dist/components/ambient/ParallaxLayer.svelte +37 -41
- package/dist/components/ambient/ScanBand.svelte +95 -91
- package/dist/components/ambient/SignalRing.svelte +100 -100
- package/dist/components/ambient/ThreadLine.svelte +71 -78
- package/dist/components/ambient/Vignette.svelte +24 -26
- package/dist/components/depth/DepthLayer.svelte +22 -27
- package/dist/components/depth/DepthStage.svelte +63 -62
- package/dist/components/depth/FloatCard.svelte +113 -104
- package/dist/components/depth/HorizonGrid.svelte +216 -160
- package/dist/components/depth/Plinth.svelte +52 -57
- package/dist/components/display/Avatar.svelte +64 -69
- package/dist/components/display/Badge.svelte +59 -63
- package/dist/components/display/Blockquote.svelte +31 -34
- package/dist/components/display/CodeBlock.svelte +71 -76
- package/dist/components/display/MetricCard.svelte +77 -83
- package/dist/components/display/Table.svelte +99 -104
- package/dist/components/feedback/Alert.svelte +71 -76
- package/dist/components/feedback/EmptyState.svelte +68 -68
- package/dist/components/feedback/ErrorState.svelte +73 -73
- package/dist/components/feedback/Skeleton.svelte +52 -52
- package/dist/components/feedback/StatusDot.svelte +49 -54
- package/dist/components/feedback/StatusLine.svelte +122 -122
- package/dist/components/feedback/Toast.svelte +130 -136
- package/dist/components/inputs/Button.svelte +240 -237
- package/dist/components/inputs/Checkbox.svelte +104 -105
- package/dist/components/inputs/FileUpload.svelte +165 -163
- package/dist/components/inputs/Input.svelte +145 -147
- package/dist/components/inputs/Select.svelte +156 -150
- package/dist/components/inputs/Textarea.svelte +153 -154
- package/dist/components/inputs/Toggle.svelte +120 -120
- package/dist/components/layout/Card.svelte +70 -76
- package/dist/components/layout/Drawer.svelte +133 -109
- package/dist/components/layout/Grid.svelte +118 -43
- package/dist/components/layout/Grid.svelte.d.ts +8 -2
- package/dist/components/layout/Modal.svelte +176 -159
- package/dist/components/layout/Panel.svelte +49 -54
- package/dist/components/layout/Popover.svelte +178 -67
- package/dist/components/layout/Popover.svelte.d.ts +10 -1
- package/dist/components/layout/Stack.svelte +53 -53
- package/dist/components/navigation/Breadcrumb.svelte +70 -73
- package/dist/components/navigation/DropdownMenu.svelte +167 -124
- package/dist/components/navigation/DropdownMenu.svelte.d.ts +12 -2
- package/dist/components/navigation/SidebarNav.svelte +86 -90
- package/dist/components/navigation/Tabs.svelte +81 -86
- package/dist/components/navigation/Topbar.svelte +85 -85
- package/dist/components/patterns/ActionBar.svelte +71 -76
- package/dist/components/patterns/ConfirmDialog.svelte +63 -64
- package/dist/components/patterns/PageHeader.svelte +109 -114
- package/dist/components/patterns/SearchBar.svelte +54 -59
- package/dist/components/patterns/TerminalBoot.svelte +104 -104
- package/dist/components/primitives/Divider.svelte +26 -29
- package/dist/components/primitives/Icon.svelte +44 -49
- package/dist/components/primitives/Label.svelte +39 -44
- package/dist/components/primitives/Surface.svelte +89 -87
- package/dist/components/primitives/Text.svelte +98 -98
- package/dist/components/scenes/ArchiveScene.svelte +92 -95
- package/dist/components/scenes/ArchiveScene.svelte.d.ts +7 -1
- package/dist/components/scenes/LogScene.svelte +72 -77
- package/dist/components/scenes/NarrativeScene.svelte +91 -92
- package/dist/components/scenes/ReadoutScene.svelte +120 -107
- package/dist/components/scenes/ReadoutScene.svelte.d.ts +3 -1
- package/dist/components/scenes/StageScene.svelte +97 -104
- package/dist/examples/FieldReport.svelte +226 -223
- package/dist/examples/ObservationDeck.svelte +333 -317
- package/dist/examples/SignalLost.svelte +191 -191
- package/dist/styles.css +113 -0
- package/dist/system/actions/echo.js +9 -9
- package/dist/system/actions/resolve.js +9 -9
- package/dist/system/actions/reveal.js +1 -1
- package/dist/system/actions/surface.js +13 -1
- package/dist/system/depth/depth.css +49 -49
- package/dist/system/depth/depth.js +1 -1
- package/dist/system/expressions.css +80 -80
- package/dist/system/override-template.css +72 -72
- package/dist/system/register.css +74 -74
- package/dist/system/scroll-lock.d.ts +6 -0
- package/dist/system/scroll-lock.js +23 -0
- package/dist/tokens/tokens.css +100 -86
- package/dist/tokens/tokens.js +4 -4
- package/dist/utils/motion.js +1 -1
- package/package.json +67 -60
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
/* ── perspective tokens ──────────────────────────────────────────────── */
|
|
2
|
-
:root {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/* ── perspective container ───────────────────────────────────────────── */
|
|
18
|
-
.depth-stage {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/* ── depth level utilities ───────────────────────────────────────────── */
|
|
25
|
-
.depth-ground {
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.depth-raised {
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.depth-foreground {
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* ── reduced motion override ─────────────────────────────────────────── */
|
|
38
|
-
@media (prefers-reduced-motion: reduce) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
1
|
+
/* ── perspective tokens ──────────────────────────────────────────────── */
|
|
2
|
+
:root {
|
|
3
|
+
--perspective-near: 600px;
|
|
4
|
+
--perspective-mid: 1000px;
|
|
5
|
+
--perspective-far: 1800px;
|
|
6
|
+
|
|
7
|
+
--depth-ground: 0px;
|
|
8
|
+
--depth-raised: 60px;
|
|
9
|
+
--depth-foreground: 140px;
|
|
10
|
+
|
|
11
|
+
--depth-tilt-max: 8deg;
|
|
12
|
+
--depth-tilt-subtle: 3deg;
|
|
13
|
+
|
|
14
|
+
--depth-transition: 0.4s cubic-bezier(0.22, 1, 0.36, 1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* ── perspective container ───────────────────────────────────────────── */
|
|
18
|
+
.depth-stage {
|
|
19
|
+
perspective: var(--perspective-mid);
|
|
20
|
+
perspective-origin: 50% 40%;
|
|
21
|
+
transform-style: preserve-3d;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* ── depth level utilities ───────────────────────────────────────────── */
|
|
25
|
+
.depth-ground {
|
|
26
|
+
transform: translateZ(var(--depth-ground));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.depth-raised {
|
|
30
|
+
transform: translateZ(var(--depth-raised));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.depth-foreground {
|
|
34
|
+
transform: translateZ(var(--depth-foreground));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* ── reduced motion override ─────────────────────────────────────────── */
|
|
38
|
+
@media (prefers-reduced-motion: reduce) {
|
|
39
|
+
.depth-ground,
|
|
40
|
+
.depth-raised,
|
|
41
|
+
.depth-foreground {
|
|
42
|
+
transform: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.depth-stage {
|
|
46
|
+
perspective: none;
|
|
47
|
+
transform-style: flat;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/* ── typographic expressions ──────────────────────────────────────────── */
|
|
2
|
-
/* expressions describe compositional intent — what the text is doing in */
|
|
3
|
-
/* the design. they are orthogonal to variants (structural role). */
|
|
4
|
-
/* apply via the Text component's expression prop or manually via class. */
|
|
5
|
-
|
|
6
|
-
/* ── expression: title-card ──────────────────────────────────────────── */
|
|
7
|
-
/* scene-opening headers. very large, line-height below 1, max-width tight */
|
|
8
|
-
.expr-title-card {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/* ── expression: manifesto ───────────────────────────────────────────── */
|
|
18
|
-
/* philosophical statements, pull-quotes, oblique voice */
|
|
19
|
-
.expr-manifesto {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* ── expression: readout ─────────────────────────────────────────────── */
|
|
29
|
-
/* data labels, system output, status-like content */
|
|
30
|
-
.expr-readout {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* ── expression: whisper ─────────────────────────────────────────────── */
|
|
39
|
-
/* supporting notes, parenthetical content, secondary metadata */
|
|
40
|
-
.expr-whisper {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* ── expression: command ─────────────────────────────────────────────── */
|
|
49
|
-
/* CTAs, active instructions, call-to-action labels */
|
|
50
|
-
.expr-command {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/* ── expression: chapter ─────────────────────────────────────────────── */
|
|
60
|
-
/* section openers, scene numbers, narrative markers */
|
|
61
|
-
.expr-chapter {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/* adds a line after the label */
|
|
73
|
-
.expr-chapter::after {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
1
|
+
/* ── typographic expressions ──────────────────────────────────────────── */
|
|
2
|
+
/* expressions describe compositional intent — what the text is doing in */
|
|
3
|
+
/* the design. they are orthogonal to variants (structural role). */
|
|
4
|
+
/* apply via the Text component's expression prop or manually via class. */
|
|
5
|
+
|
|
6
|
+
/* ── expression: title-card ──────────────────────────────────────────── */
|
|
7
|
+
/* scene-opening headers. very large, line-height below 1, max-width tight */
|
|
8
|
+
.expr-title-card {
|
|
9
|
+
font-family: var(--font-body);
|
|
10
|
+
font-size: clamp(3.4rem, 10vw, 8rem);
|
|
11
|
+
font-weight: 400;
|
|
12
|
+
line-height: 0.91;
|
|
13
|
+
letter-spacing: -0.05em;
|
|
14
|
+
max-width: 10ch;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* ── expression: manifesto ───────────────────────────────────────────── */
|
|
18
|
+
/* philosophical statements, pull-quotes, oblique voice */
|
|
19
|
+
.expr-manifesto {
|
|
20
|
+
font-family: var(--font-body);
|
|
21
|
+
font-style: italic;
|
|
22
|
+
font-size: clamp(1.1rem, 2.5vw, 1.6rem);
|
|
23
|
+
line-height: 1.45;
|
|
24
|
+
color: var(--text-soft);
|
|
25
|
+
max-width: 30rem;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* ── expression: readout ─────────────────────────────────────────────── */
|
|
29
|
+
/* data labels, system output, status-like content */
|
|
30
|
+
.expr-readout {
|
|
31
|
+
font-family: var(--font-mono);
|
|
32
|
+
font-size: 0.82rem;
|
|
33
|
+
letter-spacing: 0.06em;
|
|
34
|
+
color: var(--muted);
|
|
35
|
+
line-height: 1.6;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ── expression: whisper ─────────────────────────────────────────────── */
|
|
39
|
+
/* supporting notes, parenthetical content, secondary metadata */
|
|
40
|
+
.expr-whisper {
|
|
41
|
+
font-family: var(--font-body);
|
|
42
|
+
font-size: 0.88rem;
|
|
43
|
+
color: var(--muted-strong);
|
|
44
|
+
line-height: 1.5;
|
|
45
|
+
font-style: italic;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ── expression: command ─────────────────────────────────────────────── */
|
|
49
|
+
/* CTAs, active instructions, call-to-action labels */
|
|
50
|
+
.expr-command {
|
|
51
|
+
font-family: var(--font-mono);
|
|
52
|
+
font-size: 0.75rem;
|
|
53
|
+
letter-spacing: 0.12em;
|
|
54
|
+
text-transform: uppercase;
|
|
55
|
+
color: var(--accent);
|
|
56
|
+
font-weight: 500;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ── expression: chapter ─────────────────────────────────────────────── */
|
|
60
|
+
/* section openers, scene numbers, narrative markers */
|
|
61
|
+
.expr-chapter {
|
|
62
|
+
font-family: var(--font-mono);
|
|
63
|
+
font-size: 0.62rem;
|
|
64
|
+
letter-spacing: 0.22em;
|
|
65
|
+
text-transform: uppercase;
|
|
66
|
+
color: var(--muted-strong);
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 0.75rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* adds a line after the label */
|
|
73
|
+
.expr-chapter::after {
|
|
74
|
+
content: '';
|
|
75
|
+
display: block;
|
|
76
|
+
flex: 1;
|
|
77
|
+
height: 1px;
|
|
78
|
+
background: var(--line);
|
|
79
|
+
max-width: 4rem;
|
|
80
|
+
}
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hyvui project override layer
|
|
3
|
-
* ─────────────────────────────────────────────────────────────────────────
|
|
4
|
-
* Copy this file into your project as `theme.css` and import it after
|
|
5
|
-
* `app.css`. Uncomment and adjust properties to tune the library's
|
|
6
|
-
* presentation for this specific project.
|
|
7
|
-
*
|
|
8
|
-
* DO NOT modify tokens.css. This file is the only sanctioned override surface.
|
|
9
|
-
* DO NOT change color values here. Color lives in tokens.css.
|
|
10
|
-
* This file controls presence, weight, and scale — not palette.
|
|
11
|
-
*
|
|
12
|
-
* Apply a register for broader personality shifts:
|
|
13
|
-
* document.body.dataset.register = 'field-notebook' | 'mission-control' | 'archive'
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
:root {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/*
|
|
49
|
-
* EXAMPLE: Portfolio / narrative project
|
|
50
|
-
* ──────────────────────────────────────
|
|
51
|
-
* :root {
|
|
52
|
-
* --reg-heading-tracking: -0.055em;
|
|
53
|
-
* --reg-body-size: 1.15rem;
|
|
54
|
-
* --reg-surface-opacity: 0.65;
|
|
55
|
-
* --reg-ornament-opacity: 0.2;
|
|
56
|
-
* --reg-accent-weight: 1;
|
|
57
|
-
* --reg-signal-weight: 0.5;
|
|
58
|
-
* --reg-spacing-scale: 1.2;
|
|
59
|
-
* }
|
|
60
|
-
*
|
|
61
|
-
* EXAMPLE: Dashboard / tool project
|
|
62
|
-
* ───────────────────────────────────
|
|
63
|
-
* :root {
|
|
64
|
-
* --reg-heading-tracking: -0.02em;
|
|
65
|
-
* --reg-body-size: 0.9rem;
|
|
66
|
-
* --reg-surface-opacity: 0.95;
|
|
67
|
-
* --reg-ornament-opacity: 0.06;
|
|
68
|
-
* --reg-accent-weight: 0.6;
|
|
69
|
-
* --reg-signal-weight: 1;
|
|
70
|
-
* --reg-spacing-scale: 0.88;
|
|
71
|
-
* }
|
|
72
|
-
*/
|
|
1
|
+
/**
|
|
2
|
+
* hyvui project override layer
|
|
3
|
+
* ─────────────────────────────────────────────────────────────────────────
|
|
4
|
+
* Copy this file into your project as `theme.css` and import it after
|
|
5
|
+
* `app.css`. Uncomment and adjust properties to tune the library's
|
|
6
|
+
* presentation for this specific project.
|
|
7
|
+
*
|
|
8
|
+
* DO NOT modify tokens.css. This file is the only sanctioned override surface.
|
|
9
|
+
* DO NOT change color values here. Color lives in tokens.css.
|
|
10
|
+
* This file controls presence, weight, and scale — not palette.
|
|
11
|
+
*
|
|
12
|
+
* Apply a register for broader personality shifts:
|
|
13
|
+
* document.body.dataset.register = 'field-notebook' | 'mission-control' | 'archive'
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
:root {
|
|
17
|
+
/* ── type presence ──────────────────────────────────────────────────── */
|
|
18
|
+
/* Adjust heading compression. More negative = more compressed. */
|
|
19
|
+
/* --reg-heading-tracking: -0.05em; */
|
|
20
|
+
|
|
21
|
+
/* Adjust body text size. Range: 0.9rem (dense) to 1.25rem (editorial) */
|
|
22
|
+
/* --reg-body-size: 1.1rem; */
|
|
23
|
+
|
|
24
|
+
/* ── surface presence ───────────────────────────────────────────────── */
|
|
25
|
+
/* Lower opacity = cards feel lighter, more atmospheric. */
|
|
26
|
+
/* Higher opacity = cards feel heavier, more structured. */
|
|
27
|
+
/* Range: 0.4 (ghostly) to 1.0 (fully opaque) */
|
|
28
|
+
/* --reg-surface-opacity: 0.8; */
|
|
29
|
+
|
|
30
|
+
/* ── ornament presence ──────────────────────────────────────────────── */
|
|
31
|
+
/* Controls ambient component visibility globally. */
|
|
32
|
+
/* 0 = invisible, 1 = full AESTHETICS.md opacity */
|
|
33
|
+
/* --reg-ornament-opacity: 0.14; */
|
|
34
|
+
|
|
35
|
+
/* ── accent balance ─────────────────────────────────────────────────── */
|
|
36
|
+
/* Gold weight. 1 = full presence, 0.4 = almost invisible. */
|
|
37
|
+
/* --reg-accent-weight: 1; */
|
|
38
|
+
|
|
39
|
+
/* Teal weight. Same scale. */
|
|
40
|
+
/* --reg-signal-weight: 0.8; */
|
|
41
|
+
|
|
42
|
+
/* ── spacing scale ──────────────────────────────────────────────────── */
|
|
43
|
+
/* Multiplier on spacing. > 1 = more breathing room. < 1 = tighter. */
|
|
44
|
+
/* Range: 0.85 (compact) to 1.4 (spacious) */
|
|
45
|
+
/* --reg-spacing-scale: 1; */
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* EXAMPLE: Portfolio / narrative project
|
|
50
|
+
* ──────────────────────────────────────
|
|
51
|
+
* :root {
|
|
52
|
+
* --reg-heading-tracking: -0.055em;
|
|
53
|
+
* --reg-body-size: 1.15rem;
|
|
54
|
+
* --reg-surface-opacity: 0.65;
|
|
55
|
+
* --reg-ornament-opacity: 0.2;
|
|
56
|
+
* --reg-accent-weight: 1;
|
|
57
|
+
* --reg-signal-weight: 0.5;
|
|
58
|
+
* --reg-spacing-scale: 1.2;
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* EXAMPLE: Dashboard / tool project
|
|
62
|
+
* ───────────────────────────────────
|
|
63
|
+
* :root {
|
|
64
|
+
* --reg-heading-tracking: -0.02em;
|
|
65
|
+
* --reg-body-size: 0.9rem;
|
|
66
|
+
* --reg-surface-opacity: 0.95;
|
|
67
|
+
* --reg-ornament-opacity: 0.06;
|
|
68
|
+
* --reg-accent-weight: 0.6;
|
|
69
|
+
* --reg-signal-weight: 1;
|
|
70
|
+
* --reg-spacing-scale: 0.88;
|
|
71
|
+
* }
|
|
72
|
+
*/
|
package/dist/system/register.css
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
/* ── register system ──────────────────────────────────────────────────── */
|
|
2
|
-
/* registers shift the weight distribution of the design. no new colors */
|
|
3
|
-
/* or fonts — the same gold, teal, ET Book, and IBM Plex Mono, but their */
|
|
4
|
-
/* relative presence changes. */
|
|
5
|
-
/* */
|
|
6
|
-
/* apply: <body data-register="field-notebook"> */
|
|
7
|
-
/* or: applyRegister('field-notebook') */
|
|
8
|
-
|
|
9
|
-
/* ── base fallbacks (no register declared) ───────────────────────────── */
|
|
10
|
-
:root {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/* ── register: field-notebook ────────────────────────────────────────── */
|
|
26
|
-
/* editorial, warm, serif-forward. for portfolios, narrative pages, about */
|
|
27
|
-
[data-register='field-notebook'] {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/* ── register: mission-control ───────────────────────────────────────── */
|
|
43
|
-
/* dense, precise, mono-forward. for dashboards, tools, data interfaces */
|
|
44
|
-
[data-register='mission-control'] {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/* ── register: archive ───────────────────────────────────────────────── */
|
|
60
|
-
/* cool, ordered, muted. for galleries, indexes, reference collections */
|
|
61
|
-
[data-register='archive'] {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
1
|
+
/* ── register system ──────────────────────────────────────────────────── */
|
|
2
|
+
/* registers shift the weight distribution of the design. no new colors */
|
|
3
|
+
/* or fonts — the same gold, teal, ET Book, and IBM Plex Mono, but their */
|
|
4
|
+
/* relative presence changes. */
|
|
5
|
+
/* */
|
|
6
|
+
/* apply: <body data-register="field-notebook"> */
|
|
7
|
+
/* or: applyRegister('field-notebook') */
|
|
8
|
+
|
|
9
|
+
/* ── base fallbacks (no register declared) ───────────────────────────── */
|
|
10
|
+
:root {
|
|
11
|
+
--reg-font-primary: var(--font-body);
|
|
12
|
+
--reg-font-ui: var(--font-mono);
|
|
13
|
+
--reg-heading-tracking: -0.04em;
|
|
14
|
+
--reg-heading-lh: 0.94;
|
|
15
|
+
--reg-body-size: 1rem;
|
|
16
|
+
--reg-label-size: 0.68rem;
|
|
17
|
+
--reg-label-tracking: 0.14em;
|
|
18
|
+
--reg-surface-opacity: 0.8;
|
|
19
|
+
--reg-ornament-opacity: 0.14;
|
|
20
|
+
--reg-accent-weight: 1;
|
|
21
|
+
--reg-signal-weight: 1;
|
|
22
|
+
--reg-spacing-scale: 1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* ── register: field-notebook ────────────────────────────────────────── */
|
|
26
|
+
/* editorial, warm, serif-forward. for portfolios, narrative pages, about */
|
|
27
|
+
[data-register='field-notebook'] {
|
|
28
|
+
--reg-font-primary: var(--font-body);
|
|
29
|
+
--reg-font-ui: var(--font-mono);
|
|
30
|
+
--reg-heading-tracking: -0.05em;
|
|
31
|
+
--reg-heading-lh: 0.92;
|
|
32
|
+
--reg-body-size: 1.18rem;
|
|
33
|
+
--reg-label-size: 0.7rem;
|
|
34
|
+
--reg-label-tracking: 0.14em;
|
|
35
|
+
--reg-surface-opacity: 0.72;
|
|
36
|
+
--reg-ornament-opacity: 0.18;
|
|
37
|
+
--reg-accent-weight: 1;
|
|
38
|
+
--reg-signal-weight: 0.6;
|
|
39
|
+
--reg-spacing-scale: 1.15;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* ── register: mission-control ───────────────────────────────────────── */
|
|
43
|
+
/* dense, precise, mono-forward. for dashboards, tools, data interfaces */
|
|
44
|
+
[data-register='mission-control'] {
|
|
45
|
+
--reg-font-primary: var(--font-mono);
|
|
46
|
+
--reg-font-ui: var(--font-mono);
|
|
47
|
+
--reg-heading-tracking: -0.02em;
|
|
48
|
+
--reg-heading-lh: 1;
|
|
49
|
+
--reg-body-size: 0.9rem;
|
|
50
|
+
--reg-label-size: 0.65rem;
|
|
51
|
+
--reg-label-tracking: 0.18em;
|
|
52
|
+
--reg-surface-opacity: 0.92;
|
|
53
|
+
--reg-ornament-opacity: 0.08;
|
|
54
|
+
--reg-accent-weight: 0.7;
|
|
55
|
+
--reg-signal-weight: 1;
|
|
56
|
+
--reg-spacing-scale: 0.9;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* ── register: archive ───────────────────────────────────────────────── */
|
|
60
|
+
/* cool, ordered, muted. for galleries, indexes, reference collections */
|
|
61
|
+
[data-register='archive'] {
|
|
62
|
+
--reg-font-primary: var(--font-body);
|
|
63
|
+
--reg-font-ui: var(--font-mono);
|
|
64
|
+
--reg-heading-tracking: -0.03em;
|
|
65
|
+
--reg-heading-lh: 0.96;
|
|
66
|
+
--reg-body-size: 1rem;
|
|
67
|
+
--reg-label-size: 0.66rem;
|
|
68
|
+
--reg-label-tracking: 0.16em;
|
|
69
|
+
--reg-surface-opacity: 0.55;
|
|
70
|
+
--reg-ornament-opacity: 0.04;
|
|
71
|
+
--reg-accent-weight: 0.4;
|
|
72
|
+
--reg-signal-weight: 0.4;
|
|
73
|
+
--reg-spacing-scale: 1.3;
|
|
74
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
let lockCount = 0;
|
|
2
|
+
let prevOverflow = null;
|
|
3
|
+
/**
|
|
4
|
+
* Locks document scrolling (ref-counted).
|
|
5
|
+
*
|
|
6
|
+
* Returns an unlock function. Safe to call in SSR (no-op).
|
|
7
|
+
*/
|
|
8
|
+
export function lockScroll() {
|
|
9
|
+
if (typeof document === 'undefined')
|
|
10
|
+
return () => { };
|
|
11
|
+
lockCount += 1;
|
|
12
|
+
if (lockCount === 1) {
|
|
13
|
+
prevOverflow = document.documentElement.style.overflow;
|
|
14
|
+
document.documentElement.style.overflow = 'hidden';
|
|
15
|
+
}
|
|
16
|
+
return () => {
|
|
17
|
+
lockCount = Math.max(0, lockCount - 1);
|
|
18
|
+
if (lockCount !== 0)
|
|
19
|
+
return;
|
|
20
|
+
document.documentElement.style.overflow = prevOverflow ?? '';
|
|
21
|
+
prevOverflow = null;
|
|
22
|
+
};
|
|
23
|
+
}
|