@codenhub/styles 0.4.0 → 0.6.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.
Files changed (61) hide show
  1. package/README.md +7 -7
  2. package/dist/aesthetics/chunky-tile.css +1 -1
  3. package/dist/aesthetics/cyber.css +1 -1
  4. package/dist/aesthetics/glass.css +1 -1
  5. package/dist/aesthetics/index.css +1 -1
  6. package/dist/aesthetics/neobrutalism.css +1 -1
  7. package/dist/aesthetics/pixel.css +1 -1
  8. package/dist/aesthetics/sketch.css +1 -0
  9. package/dist/components.css +1 -1
  10. package/dist/index.css +1 -1
  11. package/dist/native.css +1 -1
  12. package/dist/palette.css +1 -1
  13. package/dist/theme.css +1 -1
  14. package/dist/tw/aesthetics/chunky-tile.css +144 -128
  15. package/dist/tw/aesthetics/cyber.css +138 -96
  16. package/dist/tw/aesthetics/glass.css +332 -66
  17. package/dist/tw/aesthetics/index.css +3 -1
  18. package/dist/tw/aesthetics/neobrutalism.css +113 -54
  19. package/dist/tw/aesthetics/pixel.css +137 -87
  20. package/dist/tw/aesthetics/sketch.css +333 -0
  21. package/dist/tw/box.css +139 -52
  22. package/dist/tw/components/button.css +67 -28
  23. package/dist/tw/components/feedback.css +85 -67
  24. package/dist/tw/components/form.css +300 -230
  25. package/dist/tw/components/index.css +17 -9
  26. package/dist/tw/components/loader.css +38 -30
  27. package/dist/tw/components/surface.css +89 -129
  28. package/dist/tw/components/tooltip.css +91 -47
  29. package/dist/tw/corner.css +26 -0
  30. package/dist/tw/elevation.css +19 -28
  31. package/dist/tw/index.css +15 -19
  32. package/dist/tw/intent.css +47 -32
  33. package/dist/tw/native.css +58 -42
  34. package/dist/tw/palette.css +455 -446
  35. package/dist/tw/presentation.css +20 -29
  36. package/dist/tw/reset.css +21 -28
  37. package/dist/tw/surface.css +61 -0
  38. package/dist/tw/theme.css +156 -153
  39. package/dist/tw/utilities/content.css +283 -205
  40. package/dist/tw/utilities/layout.css +17 -27
  41. package/docs/accessibility.md +63 -46
  42. package/docs/changelog/0.5.0.md +38 -0
  43. package/docs/changelog/0.6.0.md +52 -0
  44. package/docs/changelog/index.md +2 -0
  45. package/docs/concepts.md +6 -6
  46. package/docs/index.md +12 -3
  47. package/docs/integrating/nextjs.md +1 -1
  48. package/docs/integrating/tailwind.md +14 -6
  49. package/docs/setup.md +28 -8
  50. package/docs/usage/aesthetics.md +88 -18
  51. package/docs/usage/buttons.md +14 -14
  52. package/docs/usage/composing.md +12 -12
  53. package/docs/usage/content-and-layout.md +25 -24
  54. package/docs/usage/customizing.md +92 -55
  55. package/docs/usage/feedback.md +5 -3
  56. package/docs/usage/forms.md +61 -45
  57. package/docs/usage/theming.md +41 -42
  58. package/docs/usage/tooltips.md +37 -17
  59. package/llms-full.txt +590 -304
  60. package/llms.txt +6 -0
  61. package/package.json +15 -5
@@ -2,9 +2,11 @@
2
2
  for only the one in use: a cascading class has no static call site, so nothing
3
3
  here can be tree-shaken.
4
4
 
5
- Import after the base stylesheet in either form. */
5
+ Import before or after the base stylesheet, in either form: every entrypoint
6
+ states the layer order first, so load order decides nothing. */
6
7
  @import "./neobrutalism.css";
7
8
  @import "./glass.css";
8
9
  @import "./pixel.css";
9
10
  @import "./chunky-tile.css";
10
11
  @import "./cyber.css";
12
+ @import "./sketch.css";
@@ -1,61 +1,114 @@
1
1
  /* Neobrutalism: thick ink outline, a hard unblurred offset shadow, and a press
2
2
  that moves the element into its own shadow. Material tokens only, no component
3
3
  named -- the ink reaches everything through the intent reset, the shadow is
4
- colourless geometry each component colours against its own intent. Load after
5
- the base stylesheet; source order decides against the zero-specificity reset. */
6
- .neobrutalism {
7
- /* Read with a fallback, not declared, so an ancestor (`:root`, where an app
8
- themes) can set `--neo-offset`; the private carries the resolved value to
9
- the six places below. See model.md#rules-for-aesthetics (R8). */
10
- --_neo-offset: var(--neo-offset, 4px);
4
+ colourless geometry each component colours against its own intent. */
5
+
6
+ /* The layer map, stated before anything uses a layer -- see `theme.css`. The
7
+ aesthetic's token class sits in `components`, below every utility, so a
8
+ consumer's own utility or unlayered CSS beats it; the solo class stays
9
+ unlayered, because it has to beat a foreign component's unlayered CSS. See
10
+ docs/internal/model.md#cascade-layers. */
11
+ @layer theme, base, components, utilities;
12
+
13
+ @layer components {
14
+ .neobrutalism {
15
+ /* Read with a fallback, not declared, so an ancestor (`:root`, where an app
16
+ themes) can set `--neo-offset`; the private carries the resolved value to
17
+ the six places below. See model.md#rules-for-aesthetics (R8). */
18
+ --_neo-offset: var(--neo-offset, 4px);
19
+
20
+ /* Pure black reads as ink on a light page and disappears on a dark one, so the
21
+ ink follows the theme rather than the palette. A thick border in the neutral
22
+ border grey is a thick grey box, not a brutalist one. */
23
+ --ui-ink: light-dark(var(--color-neutral-950), var(--color-neutral-50));
11
24
 
12
- /* Pure black reads as ink on a light page and disappears on a dark one, so the
13
- ink follows the theme rather than the palette. A thick border in the neutral
14
- border grey is a thick grey box, not a brutalist one. */
15
- --ui-ink: light-dark(var(--color-neutral-950), var(--color-neutral-50));
25
+ --ui-corner: 0;
26
+ --ui-corner-surface: 0;
27
+ --ui-border-width: 2px;
28
+ --ui-border-max: 100px;
29
+ --ui-line-style: initial;
30
+ --ui-rule-style: initial;
16
31
 
17
- --ui-radius: 0;
18
- --ui-radius-surface: 0;
19
- --ui-border-width: 2px;
20
- --ui-border-max: 100px;
32
+ /* Hard, unblurred, and offset. Scaled by each component's own elevation, so
33
+ the registry decides which components sit on a slab and `.flat` takes one
34
+ off without this file knowing which component it landed on. */
35
+ /* The slab is ink, not shade: a hard offset of the element's own line colour
36
+ is the whole look, so this aesthetic asks for the intent instead of the
37
+ neutral depth colour every other shadow uses. */
38
+ --ui-shadow-ink: 100%;
39
+ /* The ink replaces the depth colour whole, so this one is inert here; it is
40
+ restated so a region nested inside chunky tile or cyber does not inherit
41
+ their black or transparent depth. */
42
+ --elevation-color: light-dark(rgb(15 23 42 / 0.08), rgb(0 0 0 / 0.55));
43
+ --ui-shadow-x: var(--_neo-offset);
44
+ --ui-shadow-y: var(--_neo-offset);
45
+ --ui-shadow-blur: 0px;
46
+ --ui-shadow-spread: 0px;
47
+ /* No halo, cleared so a region nested inside another
48
+ aesthetic does not inherit one. */
49
+ --ui-halo-blur: initial;
50
+ --ui-halo-spread: initial;
51
+ --ui-halo-ink: initial;
21
52
 
22
- /* Hard, unblurred, and offset. Scaled by each component's own elevation, so
23
- the registry decides which components sit on a slab and `.flat` takes one
24
- off without this file knowing which component it landed on. */
25
- /* The slab is ink, not shade: a hard offset of the element's own line colour
26
- is the whole look, so this aesthetic asks for the intent instead of the
27
- neutral depth colour every other shadow uses. */
28
- --ui-shadow-ink: 100%;
29
- --ui-shadow-x: var(--_neo-offset);
30
- --ui-shadow-y: var(--_neo-offset);
31
- --ui-shadow-blur: 0px;
32
- --ui-shadow-spread: 0px;
53
+ /* The press: travel the offset, shrink the shadow to nothing, so the
54
+ element lands flat where its slab was. A translation `box` scales with
55
+ the slab, so the two stay the same length at every size and elevation.
56
+ Hover keeps the slab still under the pointer; `box-hover`'s derived fill
57
+ tint is the whole hover response. One token pair, no `:hover` list, R3
58
+ intact. */
59
+ --ui-active-shadow-x: 0px;
60
+ --ui-active-shadow-y: 0px;
61
+ --ui-active-transform: none;
62
+ --ui-active-translate-x: var(--_neo-offset);
63
+ --ui-active-translate-y: var(--_neo-offset);
64
+ --ui-hover-transform: none;
33
65
 
34
- /* The press: travel the offset, shrink the shadow to nothing, so the element
35
- lands flat where its slab was. Hover keeps the slab still under the pointer;
36
- `box-hover`'s derived fill tint is the whole hover response. One token pair,
37
- no `:hover` list, R3 intact. */
38
- --ui-active-shadow-x: 0px;
39
- --ui-active-shadow-y: 0px;
40
- --ui-active-transform: translate(var(--_neo-offset), var(--_neo-offset));
66
+ /* Nothing here clips or blurs, and an aesthetic nested inside another has to
67
+ say so rather than inherit it. Nothing clips, so the global focus outline
68
+ shows and no inset focus layer is wanted: cleared so a region nested
69
+ inside pixel does not inherit pixel's. */
70
+ --ui-focus-inset: initial;
71
+ --ui-clip: none;
72
+ --ui-clip-tight: none;
73
+ /* Round corners, said explicitly, and the pill and chip corners cleared back
74
+ to `--ui-corner`: a region nested inside `.cyber` would otherwise inherit
75
+ its bevel, its diagonal, its diamond pills, and its square chips. */
76
+ --ui-corner-shape: round;
77
+ --ui-radius-pill: initial;
78
+ --ui-radius-tight: initial;
79
+ --ui-radius: initial;
80
+ --ui-radius-surface: initial;
81
+ --ui-corner-tl: initial;
82
+ --ui-corner-tr: initial;
83
+ --ui-corner-br: initial;
84
+ --ui-corner-bl: initial;
85
+ --ui-shadow-inset: ;
86
+ /* The slab is depth cast in ink, not this element's line, so an `.edgeless`
87
+ button keeps it. Cleared rather than omitted, because a neobrutalist region
88
+ nested inside a pixel one would otherwise inherit pixel's answer and lose the
89
+ slab on everything the edge axis rests at zero. */
90
+ --ui-shadow-edge: initial;
91
+ --ui-backdrop: none;
92
+ --ui-surface-ground: initial;
93
+ --ui-surface-shadow: initial;
94
+ --ui-bg-alpha: 1;
95
+ --ui-surface-image: initial;
41
96
 
42
- /* Nothing here clips or blurs, and an aesthetic nested inside another has to
43
- say so rather than inherit it. */
44
- --ui-clip: none;
45
- --ui-clip-tight: none;
46
- /* Round corners, said explicitly, and the pill and chip corners cleared back
47
- to `--ui-radius`: a region nested inside `.cyber` would otherwise inherit
48
- its bevel, its diamond pills, and its square chips. */
49
- --ui-corner-shape: round;
50
- --ui-radius-pill: initial;
51
- --ui-radius-tight: initial;
52
- --ui-shadow-inset: ;
53
- /* The slab is depth cast in ink, not this element's line, so an `.edgeless`
54
- button keeps it. Cleared rather than omitted, because a neobrutalist region
55
- nested inside a pixel one would otherwise inherit pixel's answer and lose the
56
- slab on everything the edge axis rests at zero. */
57
- --ui-shadow-edge: initial;
58
- --ui-backdrop: none;
97
+ /* A control's neutral line is the theme's control border, not this
98
+ aesthetic's ink: that ink is the primary colour in both themes, so every
99
+ unchecked toggle and resting field drew its boundary as loudly as a
100
+ primary one. Named rather than cleared, so a region nested inside glass
101
+ or chunky tile does not inherit theirs either. */
102
+ --ui-control-ink: var(--color-control-border);
103
+ --ui-rule-ink: initial;
104
+
105
+ /* Chunky tile's heavier label, cleared so a region nested inside it keeps
106
+ the button's and the badge's own label. */
107
+ --ui-label-weight: initial;
108
+ --ui-label-tracking: initial;
109
+ --ui-label-case: initial;
110
+ --ui-label-shadow: initial;
111
+ }
59
112
  }
60
113
 
61
114
  /* The one R3 exception, recorded in the registry as `selectors`. The slab here
@@ -63,13 +116,19 @@
63
116
  registry rests flat -- looks unfinished without it. It writes the component's
64
117
  resting default rather than the modifier, so `.flat`/`.raised`/`.floating`
65
118
  still win on the element; a token would name the component through a longer
66
- route. `--_d-elevation` inheriting is inert -- it equals `box`'s own fallback. */
67
- .neobrutalism .alert {
68
- --_d-elevation: 1;
119
+ route. `--_d-elevation` inheriting is inert -- it equals `box`'s own fallback.
120
+
121
+ In `utilities`, not with the token class: it has to beat `@utility alert`'s
122
+ own `--_d-elevation: 0`, which it does there at 0-2-0, and it writes only a
123
+ private nothing a consumer sets. */
124
+ @layer utilities {
125
+ .neobrutalism .alert {
126
+ --_d-elevation: 1;
127
+ }
69
128
  }
70
129
 
71
130
  /* Solo: the same look painted onto the one element carrying the class, for an
72
- element the package does not style. See docs/internal/solo-utilities.md and
131
+ element the package does not style. See docs/internal/model.md#solo-classes and
73
132
  the note on `.glass-solo`: own knobs and foundation tokens with literal
74
133
  fallbacks, never a shared `--ui-*`, `--intent-*`, or `--elevation-color`
75
134
  token, unlayered, and not for this package's own components. */
@@ -6,97 +6,147 @@
6
6
  which is exactly what `--ui-shadow-inset`, `--ui-shadow-spread` and
7
7
  `--ui-shadow-edge` are for. The ring is still coloured by each component's own
8
8
  intent, because the parts carry no colour. */
9
- .pixel {
10
- /* One pixel of the imaginary grid; the ring is one unit thick and the corner
11
- one unit square, so scaling it scales the whole look. Read with a fallback
12
- so an ancestor can set `--pixel-unit` -- declared here it outranks `:root`
13
- (R8; see model.md#rules-for-aesthetics). */
14
- --_pixel-unit: var(--pixel-unit, 4px);
15
9
 
16
- --ui-ink: light-dark(var(--color-neutral-950), var(--color-neutral-50));
17
- --ui-radius: 0;
18
- --ui-radius-surface: 0;
19
-
20
- /* A border would be clipped at the straight sides and paint a second line
21
- beside the ring, so the ceiling takes it out and the ring does the drawing.
22
-
23
- The width itself stays under the unit deliberately. Its one live reader is
24
- the toggle cap in `form.css`, which reads it as the thinnest line this
25
- aesthetic will accept where the full ring does not fit: a 16px checkbox
26
- spending four pixels a side leaves an eight-pixel hole and an unchecked box
27
- reads as a filled one. */
28
- --ui-border-width: 2px;
29
- --ui-border-max: 0px;
30
-
31
- /* The ring is one unit deep, which is exactly the corner cut, so the staircase
32
- is covered and the line does not read as broken at the corners. Spread is not
33
- scaled by elevation, so a chip resting at zero keeps its edge. */
34
- --ui-shadow-inset: inset;
35
- /* The ring is this element's border, not depth, drawn where `clip-path` cannot
36
- cut it. `--ui-shadow-edge` says so and `box` colours it from `--_edge`, so
37
- the edge axis still decides: an `.edgeless` badge or `.solid` button gets no
38
- ring, an `.edged` card does, a field keeps one whatever a container asks.
39
- Declared empty because it is read for presence -- the percentage form nests
40
- two `color-mix()` results that WebKit resolves as zero (see `box`). */
41
- --ui-shadow-edge: ;
42
- --ui-shadow-spread: var(--_pixel-unit);
43
- --ui-shadow-x: 0px;
44
- --ui-shadow-y: 0px;
45
- --ui-shadow-blur: 0px;
46
-
47
- /* The focus ring is a second inset layer, and shadows paint first-on-top, so it
48
- has to be wider than the edge to show at all. */
49
- --ui-focus-inset: calc(var(--_pixel-unit) + var(--focus-ring-width));
50
-
51
- /* One square unit off each corner, and nothing else. The staircase this
52
- replaces stepped twice at half the unit to approximate a curve, which is the
53
- one thing a low-resolution grid cannot do: at any size it read as a bevel
54
- that had not quite committed. A single cut of the grid's own unit is the
55
- shape the look is actually made of.
56
-
57
- The polygon resolves the unit here, on `.pixel`, and inherits down
58
- already-resolved -- so a component cannot rescale the corner by setting
59
- `--pixel-unit` on itself, and the knob belongs above rather than within. */
60
- --ui-clip: polygon(
61
- 0 var(--_pixel-unit),
62
- var(--_pixel-unit) var(--_pixel-unit),
63
- var(--_pixel-unit) 0,
64
- calc(100% - var(--_pixel-unit)) 0,
65
- calc(100% - var(--_pixel-unit)) var(--_pixel-unit),
66
- 100% var(--_pixel-unit),
67
- 100% calc(100% - var(--_pixel-unit)),
68
- calc(100% - var(--_pixel-unit)) calc(100% - var(--_pixel-unit)),
69
- calc(100% - var(--_pixel-unit)) 100%,
70
- var(--_pixel-unit) 100%,
71
- var(--_pixel-unit) calc(100% - var(--_pixel-unit)),
72
- 0 calc(100% - var(--_pixel-unit))
73
- );
74
- /* Chips take the other half of the vocabulary: no radius at all. The cut is one
75
- grid unit whatever the element is, and one unit off each corner of a 24px
76
- badge or a 16px checkbox is a bite rather than a corner. Squared is the
77
- honest small-scale answer, and it is still the pixel look -- the aesthetic is
78
- a grid, and a square is on it. */
79
- --ui-clip-tight: none;
80
-
81
- /* Square corners already, but a radius of zero draws no shape; it is
82
- restated, and the pill and chip corners cleared back to `--ui-radius`, so
83
- a region nested inside `.cyber` does not inherit its bevel onto anything
84
- that sets a radius of its own. */
85
- --ui-corner-shape: round;
86
- --ui-radius-pill: initial;
87
- --ui-radius-tight: initial;
88
-
89
- --ui-hover-transform: none;
90
- --ui-active-transform: none;
91
- --ui-backdrop: none;
92
-
93
- /* Consumer-supplied. The package ships no font binary, so the aesthetic has no
94
- font to fall back to but a monospace stack. */
95
- font-family: var(--font-pixel, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
10
+ /* The layer map, stated before anything uses a layer -- see `theme.css`. The
11
+ aesthetic's token class sits in `components`, below every utility, so a
12
+ consumer's own utility or unlayered CSS beats it; the solo class stays
13
+ unlayered, because it has to beat a foreign component's unlayered CSS. See
14
+ docs/internal/model.md#cascade-layers. */
15
+ @layer theme, base, components, utilities;
16
+
17
+ @layer components {
18
+ .pixel {
19
+ /* One pixel of the imaginary grid; the ring is one unit thick and the corner
20
+ one unit square, so scaling it scales the whole look. Read with a fallback
21
+ so an ancestor can set `--pixel-unit` -- declared here it outranks `:root`
22
+ (R8; see model.md#rules-for-aesthetics). */
23
+ --_pixel-unit: var(--pixel-unit, 4px);
24
+
25
+ --ui-ink: light-dark(var(--color-neutral-950), var(--color-neutral-50));
26
+ --ui-corner: 0;
27
+ --ui-corner-surface: 0;
28
+
29
+ /* A border would be clipped at the straight sides and paint a second line
30
+ beside the ring, so the ceiling takes it out and the ring does the drawing.
31
+
32
+ The width itself stays under the unit deliberately. Its one live reader is
33
+ the toggle cap in `form.css`, which reads it as the thinnest line this
34
+ aesthetic will accept where the full ring does not fit: a 16px checkbox
35
+ spending four pixels a side leaves an eight-pixel hole and an unchecked box
36
+ reads as a filled one. */
37
+ --ui-border-width: 2px;
38
+ --ui-border-max: 0px;
39
+ --ui-line-style: initial;
40
+ --ui-rule-style: initial;
41
+
42
+ /* The ring is one unit deep, which is exactly the corner cut, so the staircase
43
+ is covered and the line does not read as broken at the corners. Spread is not
44
+ scaled by elevation, so a chip resting at zero keeps its edge. */
45
+ --ui-shadow-inset: inset;
46
+ /* The ring is this element's border, not depth, drawn where `clip-path` cannot
47
+ cut it. `--ui-shadow-edge` says so and `box` colours it from `--_edge`, so
48
+ the edge axis still decides: an `.edgeless` badge or `.solid` button gets no
49
+ ring, an `.edged` card does, a field keeps one whatever a container asks.
50
+ Declared empty because it is read for presence -- the percentage form nests
51
+ two `color-mix()` results that WebKit resolves as zero (see `box`). */
52
+ --ui-shadow-edge: ;
53
+ --ui-shadow-spread: var(--_pixel-unit);
54
+ /* No halo, cleared so a region nested inside another
55
+ aesthetic does not inherit one. */
56
+ --ui-halo-blur: initial;
57
+ --ui-halo-spread: initial;
58
+ --ui-halo-ink: initial;
59
+ --ui-shadow-x: 0px;
60
+ --ui-shadow-y: 0px;
61
+ --ui-shadow-blur: 0px;
62
+
63
+ /* The focus ring is a second inset layer, and shadows paint first-on-top, so it
64
+ has to be wider than the edge to show at all. */
65
+ --ui-focus-inset: calc(var(--_pixel-unit) + var(--focus-ring-width));
66
+
67
+ /* One square unit off each corner, and nothing else. A staircase
68
+ approximates a curve, which is the one thing a low-resolution grid cannot
69
+ do: it reads as a bevel that has not quite committed. A single cut of the
70
+ grid's own unit is the shape the look is made of.
71
+
72
+ The polygon resolves the unit here, on `.pixel`, and inherits down
73
+ already-resolved -- so a component cannot rescale the corner by setting
74
+ `--pixel-unit` on itself, and the knob belongs above rather than within. */
75
+ --ui-clip: polygon(
76
+ 0 var(--_pixel-unit),
77
+ var(--_pixel-unit) var(--_pixel-unit),
78
+ var(--_pixel-unit) 0,
79
+ calc(100% - var(--_pixel-unit)) 0,
80
+ calc(100% - var(--_pixel-unit)) var(--_pixel-unit),
81
+ 100% var(--_pixel-unit),
82
+ 100% calc(100% - var(--_pixel-unit)),
83
+ calc(100% - var(--_pixel-unit)) calc(100% - var(--_pixel-unit)),
84
+ calc(100% - var(--_pixel-unit)) 100%,
85
+ var(--_pixel-unit) 100%,
86
+ var(--_pixel-unit) calc(100% - var(--_pixel-unit)),
87
+ 0 calc(100% - var(--_pixel-unit))
88
+ );
89
+ /* Chips take the other half of the vocabulary: no radius at all. The cut is one
90
+ grid unit whatever the element is, and one unit off each corner of a 24px
91
+ badge or a 16px checkbox is a bite rather than a corner. Squared is the
92
+ honest small-scale answer, and it is still the pixel look -- the aesthetic is
93
+ a grid, and a square is on it. */
94
+ --ui-clip-tight: none;
95
+
96
+ /* Square corners already, but a radius of zero draws no shape; it is
97
+ restated, and the pill and chip corners cleared back to `--ui-corner`, so
98
+ a region nested inside `.cyber` does not inherit its bevel onto anything
99
+ that sets a radius of its own. */
100
+ --ui-corner-shape: round;
101
+ --ui-radius-pill: initial;
102
+ --ui-radius-tight: initial;
103
+ --ui-radius: initial;
104
+ --ui-radius-surface: initial;
105
+ --ui-corner-tl: initial;
106
+ --ui-corner-tr: initial;
107
+ --ui-corner-br: initial;
108
+ --ui-corner-bl: initial;
109
+
110
+ /* The ring is the edge and nothing here is depth, so the shadow ink, the
111
+ press's shadow, and the depth colour are cleared or restated rather than
112
+ inherited from an aesthetic around this one. */
113
+ --ui-shadow-ink: initial;
114
+ --ui-active-shadow-x: initial;
115
+ --ui-active-shadow-y: initial;
116
+ --elevation-color: light-dark(rgb(15 23 42 / 0.08), rgb(0 0 0 / 0.55));
117
+ --ui-hover-transform: none;
118
+ --ui-active-transform: none;
119
+ --ui-active-translate-x: initial;
120
+ --ui-active-translate-y: initial;
121
+ --ui-backdrop: none;
122
+ --ui-surface-ground: initial;
123
+ --ui-surface-shadow: initial;
124
+ --ui-bg-alpha: 1;
125
+ --ui-surface-image: initial;
126
+
127
+ /* Consumer-supplied. The package ships no font binary, so the aesthetic has no
128
+ font to fall back to but a monospace stack. */
129
+ font-family: var(--font-pixel, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
130
+
131
+ /* A control's neutral line is the theme's control border, not this
132
+ aesthetic's ink: that ink is the primary colour in both themes, so every
133
+ unchecked toggle and resting field drew its boundary as loudly as a
134
+ primary one. Named rather than cleared, so a region nested inside glass
135
+ or chunky tile does not inherit theirs either. */
136
+ --ui-control-ink: var(--color-control-border);
137
+ --ui-rule-ink: initial;
138
+
139
+ /* Chunky tile's heavier label, cleared so a region nested inside it keeps
140
+ the button's and the badge's own label. */
141
+ --ui-label-weight: initial;
142
+ --ui-label-tracking: initial;
143
+ --ui-label-case: initial;
144
+ --ui-label-shadow: initial;
145
+ }
96
146
  }
97
147
 
98
148
  /* Solo: the same look painted onto the one element carrying the class, for an
99
- element the package does not style. See docs/internal/solo-utilities.md and
149
+ element the package does not style. See docs/internal/model.md#solo-classes and
100
150
  the note on `.glass-solo`: own knobs and foundation tokens with literal
101
151
  fallbacks, never a shared `--ui-*`, `--intent-*`, or `--elevation-color`
102
152
  token, unlayered, and not for this package's own components. */