basalt-ui 1.5.0 → 1.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ # [1.6.0](https://github.com/jkrumm/basalt-ui/compare/v1.5.0...v1.6.0) (2026-07-31)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **dev:** move marketing off the playground's port, allow the tailnet doors ([488f9e8](https://github.com/jkrumm/basalt-ui/commit/488f9e8d0824ff785c2eee1b2f43e7e456f9beca))
7
+
8
+
9
+ ### Features
10
+
11
+ * quiet the active nav row into a selection ([767aed2](https://github.com/jkrumm/basalt-ui/commit/767aed2ec72ca92bfdbf5d0c30162b0f64d74e84))
12
+ * unify every interactive control on one raised depth ([7e6adc6](https://github.com/jkrumm/basalt-ui/commit/7e6adc6ef936f312f24112d4e15cd88e5d5d95b3))
13
+
1
14
  # [1.5.0](https://github.com/jkrumm/basalt-ui/compare/v1.4.1...v1.5.0) (2026-07-28)
2
15
 
3
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"stick-to-bottom.d.ts","sourceRoot":"","sources":["../../src/agent/stick-to-bottom.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAuF1D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAC/B,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,CAcxC"}
1
+ {"version":3,"file":"stick-to-bottom.d.ts","sourceRoot":"","sources":["../../src/agent/stick-to-bottom.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAwF1D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAC/B,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE,wBAAwB,GAAG,GAAG,CAAC,OAAO,CAcxC"}
@@ -37,7 +37,8 @@ const LazyStickToBottom = lazy(
37
37
  border: "none",
38
38
  cursor: "pointer",
39
39
  backgroundColor: "var(--vx-surface-panel)",
40
- boxShadow: "var(--vx-shadow-card)",
40
+ // Control depth, not panel depth — this is a real <button> (DESIGN-SPEC §2).
41
+ boxShadow: "var(--vx-shadow-raised)",
41
42
  color: "var(--vx-faint)",
42
43
  fontFamily: "var(--basalt-font-mono)",
43
44
  fontSize: VX.text.md
@@ -1 +1 @@
1
- {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/agent-chat/composer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAkB,GAAG,EAAiB,MAAM,OAAO,CAAA;AAoB/D,MAAM,MAAM,aAAa,GAAG;IAC1B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAgB,EAChB,WAAW,EACX,SAAS,GACV,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CA6E7B"}
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/agent-chat/composer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAkB,GAAG,EAAiB,MAAM,OAAO,CAAA;AAoB/D,MAAM,MAAM,aAAa,GAAG;IAC1B,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAgB,EAChB,WAAW,EACX,SAAS,GACV,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CA8E7B"}
@@ -41,13 +41,14 @@ function Composer({
41
41
  disabled,
42
42
  onChange: (event) => setValue(event.currentTarget.value),
43
43
  onKeyDown: handleKeyDown,
44
- // Composer input surface (docs/DESIGN-SPEC.md §5): panel + shadow-card, control radius (6px,
45
- // VX.radiusCtrl) — the ring
46
- // lives in the shadow, so the input carries no separate border.
44
+ // Composer input surface (docs/DESIGN-SPEC.md §5): panel + control radius (6px, VX.radiusCtrl);
45
+ // the ring lives in the shadow, so the input carries no separate border. Depth is deliberately
46
+ // NOT set here — it arrives from the themed `.input` class (theme/controls.module.css), which
47
+ // also grounds it when disabled. A `boxShadow` in this `styles` object renders as an INLINE
48
+ // style and would beat that class unconditionally, leaving a disabled composer raised.
47
49
  styles: {
48
50
  input: {
49
51
  backgroundColor: "var(--vx-surface-panel)",
50
- boxShadow: "var(--vx-shadow-card)",
51
52
  borderRadius: VX.radiusCtrl,
52
53
  border: "none"
53
54
  }
@@ -6,7 +6,7 @@
6
6
  * line is the child-list left guide (`--vx-divider`). Never reintroduce brand/section/footer
7
7
  * borders.
8
8
  *
9
- * The active fill, shadow-card depth and icon-accent color live in the Mantine theme
9
+ * The active tint and icon-accent color live in the Mantine theme
10
10
  * (`NavLink.extend` + `theme/nav-link.module.css`) so they apply to EVERY render path, including a
11
11
  * consumer's router `<Link>` via `renderNavLink` (which never sees this CSS module). This module
12
12
  * owns the shell-local layout (docs/DESIGN-SPEC.md §5) and the INACTIVE state (muted text, faint
@@ -50,7 +50,7 @@
50
50
  }
51
51
 
52
52
  /* Hover — ink-6% tint + ink text, for inactive rows only (an active row already carries the
53
- * theme's panel/shadow-card treatment and keeps its own hover via `--nl-hover`). */
53
+ * theme's stronger ink-9% tint and keeps its own hover via `--nl-hover`). */
54
54
  @media (hover: hover) {
55
55
  .link:not([data-active]):not([aria-current='page']):hover {
56
56
  background-color: color-mix(in srgb, var(--vx-ink) 6%, transparent) !important;
@@ -316,16 +316,14 @@
316
316
 
317
317
  /*
318
318
  * Active child = accent text, weight 600, NO fill (docs/DESIGN-SPEC.md §5) — unlike a top-level
319
- * active row (panel + shadow-card). Overrides the `--nl-*` custom properties the theme sets
320
- * inline on the SAME NavLink root, so `!important` is required; `box-shadow` cancels the theme
321
- * module's active shadow-card.
319
+ * active row (ink-9% tint). Overrides the `--nl-*` custom properties the theme sets inline on the
320
+ * SAME NavLink root, so `!important` is required.
322
321
  */
323
322
  .childList :global(.mantine-NavLink-root[data-active]),
324
323
  .childList :global(.mantine-NavLink-root[aria-current='page']) {
325
324
  --nl-color: var(--vx-accent) !important;
326
325
  --nl-bg: transparent !important;
327
326
  --nl-hover: color-mix(in srgb, var(--vx-ink) 5%, transparent) !important;
328
- box-shadow: none !important;
329
327
  }
330
328
 
331
329
  /* Child hover (inactive) — ink-5% + ink, one step quieter than the parent rows' 6%. Outranks the
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  * Sidebar search trigger — replicates the former header search trigger (panel surface +
3
- * shadow-card, control radius, faint icon/label, mono Kbd) at full width inside the sidebar.
3
+ * shadow-raised, control radius, faint icon/label, mono Kbd) at full width inside the sidebar.
4
+ * `shadow-raised` is the shared CONTROL depth — §5 specifies this trigger and the header icon
5
+ * button as a matched pair, so the two must never drift onto different depth tokens.
4
6
  */
5
7
 
6
8
  .trigger {
@@ -12,7 +14,7 @@
12
14
  padding: 0 var(--vx-space-row-inset-x);
13
15
  border-radius: var(--vx-radius-ctrl);
14
16
  background-color: var(--vx-surface-panel);
15
- box-shadow: var(--vx-shadow-card);
17
+ box-shadow: var(--vx-shadow-raised);
16
18
  color: var(--vx-faint);
17
19
  }
18
20
 
@@ -6,10 +6,19 @@
6
6
 
7
7
  /*
8
8
  * Field idiom (docs/DESIGN-SPEC.md §5): inputs read slightly inset on the panel — field surface
9
- * (white on light, a page-bg step below panel on dark), depth via `shadow-card` (a whisper shadow
10
- * + ring baked into the one value — DESIGN-SPEC doctrine inversion #1: depth is `shadow-card`, not
11
- * a hairline; borders-as-borders stay reserved for layout dividers), faint placeholder, and an
9
+ * (white on light, a page-bg step below panel on dark), depth via `shadow-raised` (a whisper shadow
10
+ * + ring baked into the one value — DESIGN-SPEC doctrine inversion #1: depth is a shadow, not a
11
+ * hairline; borders-as-borders stay reserved for layout dividers), faint placeholder, and an
12
12
  * accent border on focus (Mantine's own `:focus` rule swaps `--input-bd` to `--input-bd-focus`).
13
+ *
14
+ * `shadow-raised` — the SAME token Button/ActionIcon take below, and that sharing is deliberate.
15
+ * A `size="md"` Input and a `size="md"` Button are pinned to identical heights by
16
+ * `--vx-space-control-height`, so they are read as one row of controls; when the buttons moved onto
17
+ * `shadow-raised` and the fields stayed on `shadow-card`, that row visibly split in two. Panels
18
+ * (Card/Paper/Notification/ChartCard/SettingsSection) keep `shadow-card` — the line is
19
+ * control-vs-panel, not component-by-component. Its inset ring also suits a field better than
20
+ * `card`'s outset one ever did: an outset ring draws a boundary AROUND the box, while an inset edge
21
+ * darkens the field's own rim, which is what "recessed into the panel" actually looks like.
13
22
  * The `--input-bd` box itself stays a TRANSPARENT 1px border (not `border: none`) so focus can
14
23
  * recolor the same box with no layout shift, and `[data-error]` still wins a real red border.
15
24
  *
@@ -30,13 +39,15 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
30
39
  }
31
40
 
32
41
  /*
33
- * Depth lands on the INPUT ELEMENT, never on the wrapper above — `--vx-shadow-card` bakes a 1px
42
+ * Depth lands on the INPUT ELEMENT, never on the wrapper above — `--vx-shadow-raised` bakes a 1px
34
43
  * ring into the shadow, and the ring follows the shadowed box's OWN `border-radius`, not any other
35
44
  * element's. Mantine's input wrapper (`.m_6c018570`) is a bare `position: relative` box with
36
45
  * `border-radius: 0`; the ring drawn there squares off around the rounded input inside it and leaks
37
46
  * visible corner nubs. The input element itself carries `border-radius: var(--input-radius)`
38
- * (Input.css), so the ring follows the rounded edge exactly. This is the general rule for the token
39
- * — see shadow-surfaces.test.ts.
47
+ * (Input.css), so the ring follows the rounded edge exactly. `raised`'s ring being INSET rather than
48
+ * outset does not soften this: an inset ring is drawn by the same box and follows the same corners,
49
+ * so a mismatch leaks nubs on the inside of the corner instead of the outside. This is the general
50
+ * rule for every depth token — see shadow-surfaces.test.ts.
40
51
  *
41
52
  * Mantine never declares a `box-shadow` on the input at any specificity, so a plain `.input` class
42
53
  * (0,1,0) wins uncontested. `--field-depth` carries the resting shadow so the `:focus` rule below
@@ -51,27 +62,155 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
51
62
  }
52
63
 
53
64
  .input[data-variant='default'] {
54
- --field-depth: var(--vx-shadow-card);
65
+ --field-depth: var(--vx-shadow-raised);
66
+ }
67
+
68
+ /*
69
+ * Button / ActionIcon depth (docs/DESIGN-SPEC.md §5's Button idiom; the header's search trigger and
70
+ * icon button are specified there as a matched pair and both land on `shadow-raised`, same as the
71
+ * field above).
72
+ *
73
+ * THE LAW: depth says "this is a control surface"; it is NOT the emphasis axis. Emphasis lives
74
+ * entirely in fill weight (`filled` > `light`/`outline` > `subtle`), exactly as every surveyed
75
+ * system resolves it — Material 3's filled button, Radix's `solid`, and Primer's primary all rank
76
+ * by fill and saturation, never by z-height. So every variant that OWNS A BOX gets the same
77
+ * resting depth, and only the tier that owns no box stays flat.
78
+ *
79
+ * This replaces a `default`-only rule that inverted the hierarchy in practice: `default` was the
80
+ * one variant carrying depth, so the SECONDARY button read as a physical object while the primary
81
+ * (`filled`) read as paint on the page. Raising the rest is what removes the inversion — flattening
82
+ * `default` instead would fix it too, but it is not open to us: DESIGN-SPEC doctrine inversion #1
83
+ * ("depth is a shadow, not a hairline") already raised Card/Paper/Input/Chip/CheckboxCard, so a flat
84
+ * Button would be the only flat control in a row of raised ones — most visibly beside a
85
+ * `size="md"` TextInput, which the `--vx-space-control-height` coupling in theme/index.ts pins to
86
+ * the exact same height.
87
+ *
88
+ * ONE depth value for the raised family, and it is `shadow-raised` — a drop plus a 1px INSET edge:
89
+ * - `default`/`filled`/`light` all take it, unmodified. The shared value is the point. An earlier
90
+ * revision split them (`default` on `shadow-card`, the rest on ring-free `shadow-ctrl`) and
91
+ * `default` visibly read a step more three-dimensional than the other two: it was the only one
92
+ * with a DEFINED EDGE, and on dark it also carried a wider blur. A soft drop alone reads as
93
+ * "something is under this"; a crisp boundary is what actually reads as an object. Landing them
94
+ * on one value is what closed that gap — `default` came down (no more 3px/0.4 dark blur, no
95
+ * outset ring), `filled`/`light` came up (they gained an edge at all).
96
+ * - The edge is INSET, which is exactly why one value can cover all three — see `SHADOW.raised`
97
+ * in tokens/palette.ts for the full reasoning. Short version: an outset ring paints in the color
98
+ * of what it is drawn over, so `card`'s pale hairline ring would read as a grey outline around a
99
+ * saturated `filled` button on light scheme; an inset edge is drawn over the control's OWN
100
+ * background and works on a fill, a 13% tint and a neutral panel alike. It also keeps `default`
101
+ * legible inside a Card, where button and card share `--vx-surface-panel` and the inset edge is
102
+ * the only thing separating them (its border is pinned `transparent` by
103
+ * `cssVariablesResolver`, which kills the stock hairline `defaultVariantColorsResolver` draws
104
+ * for EVERY default-variant control — so this edge really is its only one).
105
+ * - `outline` is the one raised variant NOT on it: it already carries a real 1px accent border,
106
+ * and an inset edge tucked just inside a border is muddy. It takes ring-free `shadow-ctrl`
107
+ * instead — the same token, for the same reason, that SegmentedControl's active segment uses to
108
+ * say "this is the lifted one". Its border is its edge, so it is not missing one.
109
+ *
110
+ * `subtle` is the one tier that owns no box — it is a text affordance, not an object, and every
111
+ * system surveyed keeps that tier flat. It stays flat in BOTH states here: its hover is Mantine's
112
+ * own background tint and nothing else, which is exactly how the spec's "ghost icon button" (§5:
113
+ * transparent, faint icon, hover ink-6% + ink icon) already behaved. Button's `subtle` and
114
+ * ActionIcon's therefore need no asymmetry between them. See the note below the variant rules for
115
+ * why an earlier hover-depth attempt was reverted.
116
+ *
117
+ * Mantine never declares a `box-shadow` on either component at ANY specificity, so a plain
118
+ * module-class + attribute selector wins uncontested — no `html[...]` prefix fight, unlike the
119
+ * input-variable overrides above. Depth rides `--ctrl-depth` rather than landing on `box-shadow`
120
+ * directly (the same indirection `.input` uses for `--field-depth`) so the disabled rule below
121
+ * moves ONE variable instead of restating a value per variant.
122
+ */
123
+ .buttonRoot,
124
+ .actionIconRoot {
125
+ --ctrl-depth: 0 0 transparent;
126
+
127
+ box-shadow: var(--ctrl-depth);
128
+ transition: box-shadow 120ms ease;
129
+ }
130
+
131
+ .buttonRoot[data-variant='default'],
132
+ .buttonRoot[data-variant='filled'],
133
+ .buttonRoot[data-variant='light'] {
134
+ --ctrl-depth: var(--vx-shadow-raised);
135
+ }
136
+
137
+ .actionIconRoot[data-variant='default'],
138
+ .actionIconRoot[data-variant='filled'],
139
+ .actionIconRoot[data-variant='light'] {
140
+ --ctrl-depth: var(--vx-shadow-raised);
141
+ }
142
+
143
+ .buttonRoot[data-variant='outline'] {
144
+ --ctrl-depth: var(--vx-shadow-ctrl);
145
+ }
146
+
147
+ .actionIconRoot[data-variant='outline'] {
148
+ --ctrl-depth: var(--vx-shadow-ctrl);
149
+ }
150
+
151
+ /*
152
+ * DEPTH HERE IS STATIC. No variant changes depth or position on hover or press — the raised variants
153
+ * already get hover feedback from Mantine's own background change, so anything layered on top just
154
+ * restates a signal that is already there. Two attempts at adding one were made and both reverted,
155
+ * for reasons worth keeping:
156
+ *
157
+ * - A 1px `translateY` lift on hover, reversed on press. It restated the background change AND
158
+ * cost something real: Floating UI measures a transformed rect, so a Tooltip or Popover anchored
159
+ * to the button visibly shifts with it.
160
+ * - `subtle` materializing into `shadow-raised` on hover. The theory was that `subtle` owns no box
161
+ * at rest, so gaining one under the cursor is the affordance rather than decoration. In practice
162
+ * `shadow-raised`'s INSET edge is a hard rim, and a rim appearing around a ghost button makes it
163
+ * read as an `outline` button rather than as a text affordance that lit up — the tint alone
164
+ * already says "pressable", and the rim says something else entirely. `subtle` is now flat in
165
+ * BOTH states, which also collapses an asymmetry that had to be documented twice: Button's
166
+ * `subtle` and ActionIcon's ghost icon button finally behave identically.
167
+ *
168
+ * DON'T REINTRODUCE EITHER. If a future pass wants `subtle` to gain depth on hover, the token to
169
+ * reach for is ring-free `shadow-ctrl`, not `shadow-raised` — the drop is the part that reads as
170
+ * lift, the rim is the part that read as wrong.
171
+ */
172
+
173
+ /*
174
+ * Disabled is flat and grounded — a raised control reads as pressable, which is the one thing a
175
+ * disabled control must not do. Mantine's own disabled rule (Button.css/ActionIcon.css) recolors
176
+ * background and text but never touches the shadow, so nothing here fights it; the `[data-loading]`
177
+ * exclusion mirrors that same rule, keeping a loading button's chrome intact while it works.
178
+ * Written as real (0,3,0) selectors rather than a `:where()` group so this outranks the (0,2,0)
179
+ * variant rules above on specificity alone, independent of source order.
180
+ */
181
+ .buttonRoot:disabled:not([data-loading]),
182
+ .buttonRoot[data-disabled]:not([data-loading]),
183
+ .actionIconRoot:disabled:not([data-loading]),
184
+ .actionIconRoot[data-disabled]:not([data-loading]) {
185
+ --ctrl-depth: 0 0 transparent;
55
186
  }
56
187
 
57
188
  /*
58
- * Button / ActionIcon (`default` variant): the SAME shadow-card depth as the field above and as
59
- * Card/Paper (docs/DESIGN-SPEC.md §5: "search trigger … panel + shadow-card", "icon button …
60
- * panel + shadow-card"). Background and border already resolve centrally, through
61
- * `--mantine-color-default`/`-border` (theme/index.ts's `cssVariablesResolver`) — the
62
- * `default-border` var is pinned to `transparent` there, which is what kills the stock 1px
63
- * hairline `defaultVariantColorsResolver`'s `variant === 'default'` branch draws for EVERY
64
- * default-variant control (Button, ActionIcon, Chip, CheckboxCard, RadioCard, …), not just these
65
- * two. Only the shadow is a fresh declaration (Mantine never sets one for `default`), so no
66
- * `html[...]` specificity fight is needed to win it — a plain module-class + attribute selector is
67
- * deterministic. `filled`/`subtle`/`light` variants are untouched by the attribute scope.
189
+ * Fields ground when disabled for the same reason, and this rule is why the field/button split had
190
+ * to close on BOTH sides: buttons got the treatment above when they moved onto `shadow-raised`,
191
+ * while inputs — which sat on `shadow-card` at the time — never had one at all, so a disabled
192
+ * TextInput stayed raised. Once fields joined the same depth family that gap became a visible
193
+ * inconsistency inside one form rather than a quiet oversight.
194
+ *
195
+ * `:disabled` covers the real `<input>`/`<textarea>`; `[data-disabled]` covers the composite fields
196
+ * (Select, MultiSelect, DatePicker) where Mantine disables a readonly input via the attribute
197
+ * instead. No `[data-loading]` exclusion here — inputs have no loading state, unlike Button.
68
198
  */
69
- .buttonRoot[data-variant='default'] {
70
- box-shadow: var(--vx-shadow-card);
199
+ .input:disabled,
200
+ .input[data-disabled] {
201
+ --field-depth: 0 0 transparent;
71
202
  }
72
203
 
73
- .actionIconRoot[data-variant='default'] {
74
- box-shadow: var(--vx-shadow-card);
204
+ /*
205
+ * Reduced motion drops the fade, never the shadow: a static shadow is not motion, and removing it
206
+ * would strip the very hierarchy this pass exists to establish from the users who asked for less
207
+ * animation. `subtle`'s hover depth still lands — it just lands instantly.
208
+ */
209
+ @media (prefers-reduced-motion: reduce) {
210
+ .buttonRoot,
211
+ .actionIconRoot {
212
+ transition: none;
213
+ }
75
214
  }
76
215
 
77
216
  /*
@@ -84,7 +223,7 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
84
223
  .radioCardRoot[data-with-border] {
85
224
  background-color: var(--vx-surface-panel);
86
225
  border-color: transparent;
87
- box-shadow: var(--vx-shadow-card);
226
+ box-shadow: var(--vx-shadow-raised);
88
227
  }
89
228
 
90
229
  /*
@@ -96,7 +235,7 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
96
235
  */
97
236
  .chipLabel:not([data-checked]):not([data-disabled]) {
98
237
  background-color: var(--vx-surface-panel);
99
- box-shadow: var(--vx-shadow-card);
238
+ box-shadow: var(--vx-shadow-raised);
100
239
  }
101
240
 
102
241
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AA+DA,OAAO,KAAK,EACV,oBAAoB,EAGpB,oBAAoB,EAErB,MAAM,eAAe,CAAA;AAStB,OAAO,KAAK,EAAe,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAOlD;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAIlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AASvD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAA;QAC/B,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,aAAa,CAAC,EAAE,WAAW,CAAA;KAC5B;CACF;AAm3BD;+EAC+E;AAC/E,eAAO,MAAM,SAAS,EAAE,oBAAuD,CAAA;AAmJ/E;;8FAE8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,oBACc,CAAA;AAEjD,kEAAkE;AAClE,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAE9B;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAA;IAEzB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,oBAAoB,EAChC,OAAO,CAAC,EAAE,wBAAwB,GACjC,oBAAoB,CA+BtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AA+DA,OAAO,KAAK,EACV,oBAAoB,EAGpB,oBAAoB,EAErB,MAAM,eAAe,CAAA;AAStB,OAAO,KAAK,EAAe,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAOlD;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAIlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AASvD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAA;QAC/B,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,aAAa,CAAC,EAAE,WAAW,CAAA;KAC5B;CACF;AAk5BD;+EAC+E;AAC/E,eAAO,MAAM,SAAS,EAAE,oBAAuD,CAAA;AAmJ/E;;8FAE8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,oBACc,CAAA;AAEjD,kEAAkE;AAClE,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAE9B;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAA;IAEzB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,oBAAoB,EAChC,OAAO,CAAC,EAAE,wBAAwB,GACjC,oBAAoB,CA+BtB"}
@@ -147,6 +147,10 @@ const basaltVariantColorResolver = (input) => {
147
147
  const autoContrast = input.autoContrast ?? input.theme.autoContrast;
148
148
  return autoContrast ? { ...resolved, color: on } : resolved;
149
149
  }
150
+ if (input.variant === "subtle") {
151
+ const isDefaultColor = input.color === void 0 || input.color === input.theme.primaryColor;
152
+ return isDefaultColor ? { ...resolved, hover: `color-mix(in srgb, var(--vx-ink) 6%, transparent)` } : resolved;
153
+ }
150
154
  if (input.variant !== "light") return resolved;
151
155
  const ink = `var(--mantine-color-${colorName}-light-color)`;
152
156
  return {
@@ -295,17 +299,26 @@ function buildTheme(data, options = {}) {
295
299
  }
296
300
  }),
297
301
  // "Ink earns its color" — a nav selection is UI state, not the identity accent on the LABEL.
298
- // The active item is panel bg + `shadow-card` (forced here at the THEME level via NavLink's
299
- // `--nl-*` vars, so it holds for every render path — including a consumer's router `<Link>`
300
- // via `renderNavLink`, which never sees the shell CSS module); the active ICON is
301
- // accent-colored via `nav-link.module.css` (targets the `[data-position='left']` leftSection,
302
- // which the flat `vars`/`styles` API can't express conditionally on `[data-active]`).
302
+ // The active item is a SELECTED ROW, not a raised control: the same ink-tint idiom as the
303
+ // hover state (one step stronger, ink-9%), no panel fill and no `shadow-card` — a raised,
304
+ // panel-filled row read as a button sitting in the nav rather than as the current location.
305
+ // Selection is carried by the tint + ink text + weight 600 + the accent icon instead. Forced
306
+ // here at the THEME level via NavLink's `--nl-*` vars so it holds for every render path —
307
+ // including a consumer's router `<Link>` via `renderNavLink`, which never sees the shell CSS
308
+ // module; the active ICON is accent-colored via `nav-link.module.css` (targets the
309
+ // `[data-position='left']` leftSection, which the flat `vars`/`styles` API can't express
310
+ // conditionally on `[data-active]`).
311
+ //
312
+ // `--nl-hover` (ink-13%) only ever reaches an ACTIVE row in practice — the inactive hover is
313
+ // set at ink-6% by higher-specificity `:not([data-active])` rules in `nav-link.module.css` /
314
+ // `app-sidebar.module.css` — so it exists to keep the active row responding to the pointer
315
+ // now that its rest state sits in the same tint family as an inactive hover.
303
316
  NavLink: NavLink.extend({
304
317
  vars: () => ({
305
318
  root: {
306
- "--nl-bg": "var(--vx-surface-panel)",
319
+ "--nl-bg": "color-mix(in srgb, var(--vx-ink) 9%, transparent)",
307
320
  "--nl-color": "var(--vx-ink)",
308
- "--nl-hover": "color-mix(in srgb, var(--vx-ink) 6%, transparent)"
321
+ "--nl-hover": "color-mix(in srgb, var(--vx-ink) 13%, transparent)"
309
322
  },
310
323
  children: {}
311
324
  }),
@@ -339,7 +352,7 @@ function buildTheme(data, options = {}) {
339
352
  label: { fontSize: VX.text.md, lineHeight: "var(--vx-space-row-line-height)" }
340
353
  }
341
354
  }),
342
- // Field idiom (docs/DESIGN-SPEC.md §5): field surface + `shadow-card` depth + faint placeholder,
355
+ // Field idiom (docs/DESIGN-SPEC.md §5): field surface + `shadow-raised` depth + faint placeholder,
343
356
  // accent border + subtle accent ring on focus — see controls.module.css. The two slots carry
344
357
  // different halves of it: the `wrapper` is where Mantine declares the `--input-*` vars, the
345
358
  // `input` is the box that actually paints the surface (bg + radius) and therefore the only
@@ -391,16 +404,19 @@ function buildTheme(data, options = {}) {
391
404
  PillsInput: PillsInput.extend({
392
405
  classNames: { wrapper: controlsClasses.inputWrapper, input: controlsClasses.input }
393
406
  }),
394
- // Button / ActionIcon (`default` variant): same `shadow-card` depth as every other control
395
- // surface (docs/DESIGN-SPEC.md §5: "search trigger … panel + shadow-card", "icon button …
396
- // panel + shadow-card"; doctrine inversion #1). Background already resolves through the shared
407
+ // Button / ActionIcon: depth for EVERY variant that owns a box (docs/DESIGN-SPEC.md §5's
408
+ // Button idiom; doctrine inversion #1) — `default`/`filled`/`light` on the shared
409
+ // `shadow-raised`, `outline` on ring-free `shadow-ctrl`, `subtle` flat at rest. Emphasis stays
410
+ // in fill weight,
411
+ // never in z-height. Background for `default` already resolves through the shared
397
412
  // `--mantine-color-default` var (→ `--vx-surface-panel`, see cssVariablesResolver below) and
398
- // the border through `--mantine-color-default-border` (→ transparent, same resolver) — neither
413
+ // its border through `--mantine-color-default-border` (→ transparent, same resolver) — neither
399
414
  // component had a `.extend()` block at all before this, which is why they never picked up
400
- // either. Only the shadow needs adding here, in controls.module.css: Mantine's own
401
- // `[data-variant='default']` rule never declares a `box-shadow`, so no specificity fight is
402
- // needed to win one. `filled`/`subtle`/`light` variants are untouched — scoped by attribute
403
- // selector in the CSS, not here.
415
+ // either. Everything else — the per-variant depth and the disabled/reduced-motion grounding —
416
+ // lives in controls.module.css, where the variant scoping
417
+ // is an attribute selector: Mantine declares no `box-shadow` on either component at any
418
+ // specificity, so none of it needs a specificity fight. Nothing about depth is expressible in
419
+ // the flat `styles` objects here, which is the whole reason that file exists.
404
420
  //
405
421
  // Density coupling: mirrors Input's `--input-height` override above — Mantine's OWN
406
422
  // `--button-height-md`/`--ai-size` (via `--ai-size-md`) are global, non-retunable statics
@@ -439,7 +455,8 @@ function buildTheme(data, options = {}) {
439
455
  // real attribute selectors ((0,2,0)) — Mantine's own rule wraps the same attribute in `:where()`
440
456
  // (0 specificity, landing at (0,1,0) total), so no `html[…]` prefix fight is needed here either.
441
457
  // Neither component sets a background of its own, so panel bg is added alongside the shadow —
442
- // the same panel-bg + shadow-card + no-border triad as Card/Paper.
458
+ // the same panel-bg + depth + no-border triad as Card/Paper — on `shadow-raised`, the shared
459
+ // CONTROL depth, not Card/Paper's `shadow-card`: a selection card is something you click.
443
460
  CheckboxCard: CheckboxCard.extend({
444
461
  classNames: { card: controlsClasses.checkboxCardRoot }
445
462
  }),
@@ -780,8 +797,8 @@ function buildCssVariablesResolver(data) {
780
797
  "--mantine-color-default": `var(--vx-surface-panel, ${SURFACE.panel.light})`,
781
798
  // cards / default controls
782
799
  "--mantine-color-default-hover": `var(--vx-surface-elevated, ${SURFACE.elevated.light})`,
783
- // THE central lever for doctrine inversion #1 on CONTROLS (docs/DESIGN-SPEC.md §8): depth is
784
- // `shadow-card`, never a hairline, for every `variant="default"` control — not just Card/Paper.
800
+ // THE central lever for doctrine inversion #1 on CONTROLS (docs/DESIGN-SPEC.md §8): depth is a
801
+ // shadow, never a hairline, for every `variant="default"` control — not just Card/Paper.
785
802
  // `defaultVariantColorsResolver`'s `variant === 'default'` branch reads this ONE var for every
786
803
  // component that uses it (Button, ActionIcon, Chip, CheckboxCard, RadioCard, …), so pointing it
787
804
  // at `transparent` kills the stock 1px hairline everywhere at once. `transparent`, not `border:
@@ -1,19 +1,19 @@
1
1
  /*
2
- * Active nav row = heavier weight + card depth, applied at the THEME level via `classNames` so it
3
- * reaches EVERY NavLink render path — including a consumer's router `<Link>` mounted through
4
- * `renderNavLink`, which a shell-scoped CSS module never sees. Mantine's `styles` prop only takes
5
- * flat inline properties (a nested `&[data-active]` there throws a React warning), so the state
6
- * selectors live here. React Router's NavLink marks the active item via `aria-current` rather than
7
- * the `active` prop's `data-active`, so both states are matched.
2
+ * Active nav row = heavier weight over the ink tint `--nl-bg` carries (set in theme/index.ts,
3
+ * applied unconditionally by Mantine's own `[data-active]` CSS). NO depth: an active row is a
4
+ * SELECTED ROW, not a raised control — it deliberately reads as a stronger version of the hover
5
+ * tint rather than as a button, so the row never competes with the real filled controls around it.
8
6
  *
9
- * The row's background comes from `--nl-bg` (set in theme/index.ts, applies unconditionally via
10
- * Mantine's own `[data-active]` CSS) — `shadow-card` is added here because there's no `--nl-*` var
11
- * for depth.
7
+ * Applied at the THEME level via `classNames` so it reaches EVERY NavLink render path — including a
8
+ * consumer's router `<Link>` mounted through `renderNavLink`, which a shell-scoped CSS module never
9
+ * sees. Mantine's `styles` prop only takes flat inline properties (a nested `&[data-active]` there
10
+ * throws a React warning), so the state selectors live here. React Router's NavLink marks the
11
+ * active item via `aria-current` rather than the `active` prop's `data-active`, so both states are
12
+ * matched.
12
13
  */
13
14
  .root[data-active],
14
15
  .root[aria-current='page'] {
15
16
  font-weight: 600;
16
- box-shadow: var(--vx-shadow-card);
17
17
  }
18
18
 
19
19
  /*
@@ -86,6 +86,7 @@ export declare const VX: {
86
86
  readonly divider: "var(--vx-divider)";
87
87
  readonly shadowCard: "var(--vx-shadow-card)";
88
88
  readonly shadowCtrl: "var(--vx-shadow-ctrl)";
89
+ readonly shadowRaised: "var(--vx-shadow-raised)";
89
90
  readonly shadowOverlay: "var(--vx-shadow-overlay)";
90
91
  readonly surface: {
91
92
  readonly bg: "var(--vx-surface-bg)";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"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"}
@@ -119,6 +119,9 @@ const VX = {
119
119
  // Depth shadows — a whisper shadow + a 1px ring baked into the value (never a `border` prop).
120
120
  shadowCard: "var(--vx-shadow-card)",
121
121
  shadowCtrl: "var(--vx-shadow-ctrl)",
122
+ // Raised interactive controls — drop + a 1px INSET edge, the one depth every raised Button/
123
+ // ActionIcon variant shares (works over a fill, a tint or a panel alike; see SHADOW.raised).
124
+ shadowRaised: "var(--vx-shadow-raised)",
122
125
  // Floating-layer elevation (menus, popovers, tooltips, modals, drawers) — a real drop shadow.
123
126
  shadowOverlay: "var(--vx-shadow-overlay)",
124
127
  // App surfaces (cards, borders) — shared with the Mantine chrome
@@ -218,6 +221,7 @@ function frameworkPrimitives(side, data, legacyAliases) {
218
221
  decl("divider", su.divider[side]),
219
222
  decl("shadow-card", SHADOW.card[side]),
220
223
  decl("shadow-ctrl", SHADOW.ctrl[side]),
224
+ decl("shadow-raised", SHADOW.raised[side]),
221
225
  decl("shadow-overlay", SHADOW.overlay[side]),
222
226
  decl("surface-bg", su.bg[side]),
223
227
  decl("surface-panel", su.panel[side]),
@@ -84,6 +84,37 @@ export declare const SHADOW: {
84
84
  readonly light: "0 1px 2px rgba(28,25,23,0.12)";
85
85
  readonly dark: "0 1px 2px rgba(0,0,0,0.35)";
86
86
  };
87
+ /**
88
+ * Interactive-control depth — the ONE value every raised Button/ActionIcon/Input variant shares
89
+ * (`docs/DESIGN-SPEC.md` §5's Button idiom). Exists rather than reusing `card` because `card`'s
90
+ * ring is OUTSET, and an outset ring paints in the color of whatever it is drawn over: fine
91
+ * between neutral panels, but on light scheme it resolves to `--vx-surface-hairline` and draws a
92
+ * pale grey outline around a saturated `filled` button, which reads as a rendering defect.
93
+ *
94
+ * THE TWO SCHEMES ARE SHAPED DIFFERENTLY, and the asymmetry is the whole design — do NOT "tidy"
95
+ * them into one shape. Both were arrived at by elimination, on screen:
96
+ *
97
+ * - DARK = drop + a full inset rim. Its edge is a LIGHTENING, so it cannot collide with the
98
+ * dark drop below the box; a uniform lightening on a dark surface reads as rim light wrapping
99
+ * a raised object, which is exactly right.
100
+ *
101
+ * - LIGHT = drop ONLY, no edge at all. A light-mode edge would have to be a DARKENING (there is
102
+ * nothing lighter than a near-white control to lighten with), and every position for one
103
+ * fails: a uniform dark ring does not read as depth, it reads as a BORDER — it made `default`
104
+ * and `light` look like outlined buttons and every form field look boxed. Moving it to the
105
+ * bottom edge alone then put a dark inner line directly above the dark drop, i.e. a visible
106
+ * DOUBLE BOTTOM BORDER. There is no third position, because a light-mode raised object's only
107
+ * honest cue is the shadow it casts. So light casts one and draws nothing.
108
+ *
109
+ * Consequence to know, on light only: a `default` control nested in a Card shares
110
+ * `--vx-surface-panel` with it and has no boundary but the drop. That is accepted — a wrong-
111
+ * looking border on every control in the app is worse than a soft edge in one nesting case. If it
112
+ * ever needs more, raise the DROP. Do not reintroduce an edge; both shapes have been tried.
113
+ */
114
+ readonly raised: {
115
+ readonly light: "0 1px 2px rgba(28,25,23,0.10)";
116
+ readonly dark: "0 1px 2px rgba(0,0,0,0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent)";
117
+ };
87
118
  readonly overlay: {
88
119
  readonly light: "0 8px 24px rgba(28,25,23,0.10)";
89
120
  readonly dark: "0 8px 24px rgba(0,0,0,0.5)";
@@ -1 +1 @@
1
- {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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"}