@apliteni/apliteni-ui 0.91.0 → 0.93.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 (55) hide show
  1. package/README.md +5 -7
  2. package/package.json +1 -1
  3. package/react/README.md +2 -2
  4. package/react/dist/index.d.ts +3 -3
  5. package/react/dist/index.js +79 -111
  6. package/src/assets/icons.js +1 -1
  7. package/src/components/account-nav.js +2 -2
  8. package/src/components/back.js +2 -2
  9. package/src/components/command-palette.js +2 -2
  10. package/src/components/drawer.js +1 -1
  11. package/src/components/dropdown.js +12 -12
  12. package/src/components/filter-bar.js +2 -2
  13. package/src/components/footer.js +1 -1
  14. package/src/components/index.js +1 -1
  15. package/src/components/loading.js +1 -1
  16. package/src/components/shell.js +19 -19
  17. package/src/components/stat.js +3 -3
  18. package/src/components/success.js +3 -3
  19. package/src/components/tooltip.js +1 -1
  20. package/src/components/topbar.js +1 -1
  21. package/src/html.js +1 -1
  22. package/src/index.css +1 -1
  23. package/src/index.d.ts +1 -1
  24. package/src/logic/accents.js +1 -1
  25. package/src/logic/filter-bar.js +4 -4
  26. package/src/styles/back.css +3 -3
  27. package/src/styles/base.css +3 -3
  28. package/src/styles/button.css +3 -3
  29. package/src/styles/callout.css +2 -2
  30. package/src/styles/card.css +8 -8
  31. package/src/styles/command-palette.css +14 -14
  32. package/src/styles/confirm.css +7 -7
  33. package/src/styles/drawer.css +8 -8
  34. package/src/styles/dropdown.css +21 -21
  35. package/src/styles/feedback.css +2 -2
  36. package/src/styles/field-zoom.css +1 -1
  37. package/src/styles/file-drop.css +1 -1
  38. package/src/styles/filter-bar.css +6 -6
  39. package/src/styles/footer.css +1 -1
  40. package/src/styles/input.css +6 -6
  41. package/src/styles/layout.css +32 -32
  42. package/src/styles/loading.css +1 -1
  43. package/src/styles/motion.css +1 -1
  44. package/src/styles/nav.css +4 -4
  45. package/src/styles/pagination.css +2 -2
  46. package/src/styles/reduced-motion.css +2 -2
  47. package/src/styles/segmented.css +3 -3
  48. package/src/styles/stat.css +3 -3
  49. package/src/styles/success.css +1 -1
  50. package/src/styles/table.css +6 -6
  51. package/src/styles/tap-zone.css +1 -1
  52. package/src/styles/tooltip.css +3 -3
  53. package/src/styles/topbar.css +8 -8
  54. package/src/tokens/accents.css +1 -1
  55. package/src/tokens/tokens.css +25 -25
@@ -12,10 +12,10 @@
12
12
  * Two densities, one markup: the default packs a row onto one line, and
13
13
  * `.ui-cmdk--roomy` gives the description a line of its own.
14
14
  *
15
- * why: docs/specification.md#the-command-palette */
15
+ * why: docs/components.md#the-command-palette */
16
16
 
17
17
  .ui-cmdk {
18
- /* The floating step; nothing casts. why: docs/specification.md#elevation */
18
+ /* The floating step; nothing casts. why: docs/foundations.md#elevation */
19
19
  --cmdk-surface: var(--bg-elevated);
20
20
  --cmdk-scrim: var(--scrim);
21
21
  --cmdk-w: 560px;
@@ -72,7 +72,7 @@
72
72
  /* The two-step edge and the drop, through the level's own names: in DARK that is
73
73
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
74
74
  both lines are transparent and the drop carries the whole separation.
75
- why: docs/specification.md#elevation */
75
+ why: docs/foundations.md#elevation */
76
76
  border: 1px solid var(--float-edge);
77
77
  box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
78
78
  border-radius: var(--radius-lg);
@@ -87,7 +87,7 @@
87
87
  /* The ring is COMPOSED with the floating treatment, not written over it: a
88
88
  box-shadow list replaces the whole list, so `box-shadow: var(--ring)` alone
89
89
  took the panel's edge and its drop off for as long as it held focus.
90
- why: docs/specification.md#elevation */
90
+ why: docs/foundations.md#elevation */
91
91
  .ui-cmdk__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); }
92
92
 
93
93
  /* -- The text box --------------------------------------------------------- */
@@ -105,7 +105,7 @@
105
105
  flex: none;
106
106
  }
107
107
  /* 2.2 of a 24 box drawn at 17px = 1.56 CSS px, which is what keeps the mark a
108
- graphic rather than a smudge. why: docs/specification.md#icons-and-glyphs */
108
+ graphic rather than a smudge. why: docs/foundations.md#icons-and-glyphs */
109
109
  .ui-cmdk__search-ic svg { width: 17px; height: 17px; stroke: currentColor; fill: none; stroke-width: 2.2; }
110
110
 
111
111
  /* Not .ui-input: this one has no box of its own — the panel is the box — and a
@@ -149,7 +149,7 @@
149
149
  arrive at the native outline. The band is drawn INWARD, on the list: the panel clips
150
150
  with `overflow: hidden`, so an outset one is cut off, and the panel is not the box
151
151
  that scrolls. The list's own 8px of padding is where it lands.
152
- why: docs/specification.md#the-focus-ring */
152
+ why: docs/foundations.md#the-focus-ring */
153
153
  .ui-cmdk__list:focus-visible { outline: var(--ring-scroll); outline-offset: var(--ring-scroll-offset); }
154
154
  .ui-cmdk__group + .ui-cmdk__group { margin-top: var(--space-2); }
155
155
 
@@ -169,7 +169,7 @@
169
169
  13.3333px Arial`, centred text and a shrink-to-fit width, and a consumer who
170
170
  needs the row operable from the keyboard should get the row this sheet
171
171
  describes rather than that. `font: inherit` comes before the line-height it
172
- keeps. why: docs/specification.md#a-dropdown-row-is-a-div-a-link-or-a-button */
172
+ keeps. why: docs/components.md#a-dropdown-row-is-a-div-a-link-or-a-button */
173
173
  .ui-cmdk__item {
174
174
  display: flex;
175
175
  border: 0;
@@ -197,7 +197,7 @@
197
197
  flex: none;
198
198
  }
199
199
  /* 2.3 of a 24 box drawn at 16px = 1.53 CSS px. Same arithmetic as the dropdown's
200
- row icon next door. why: docs/specification.md#icons-and-glyphs */
200
+ row icon next door. why: docs/foundations.md#icons-and-glyphs */
201
201
  .ui-cmdk__ic svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.3; }
202
202
  .ui-cmdk__item.is-active .ui-cmdk__ic { color: var(--accent); }
203
203
 
@@ -220,7 +220,7 @@
220
220
  font-size: var(--text-sm);
221
221
  /* Body ink: a row's note is how two rows called INV-4812 and
222
222
  INV-4809 are told apart, which is not something a reader may skip.
223
- why: docs/specification.md#text-ink */
223
+ why: docs/foundations.md#text-ink */
224
224
  color: var(--text);
225
225
  white-space: nowrap;
226
226
  overflow: hidden;
@@ -242,7 +242,7 @@
242
242
  writes with :hover. A palette row is reached with an arrow key far more often
243
243
  than with a pointer, so `.is-active` carries the signal beside :hover: it is
244
244
  the same moment, and it is the row Enter would run.
245
- why: docs/specification.md#text-ink */
245
+ why: docs/foundations.md#text-ink */
246
246
  .ui-cmdk__item.is-danger .ui-cmdk__label { color: var(--text); }
247
247
  .ui-cmdk__item.is-danger:hover .ui-cmdk__label,
248
248
  .ui-cmdk__item.is-danger.is-active .ui-cmdk__label { color: var(--pink); }
@@ -252,7 +252,7 @@
252
252
  for a control with no box of its own. Disabled rows keep the panel's
253
253
  surface and their labels remain readable on that ground without
254
254
  adding a grey box behind the text.
255
- why: docs/specification.md#text-ink */
255
+ why: docs/foundations.md#text-ink */
256
256
  .ui-cmdk__item.is-disabled { cursor: default; /* muted-ink: state — unavailable control */ color: var(--disabled-ink-bare); }
257
257
  .ui-cmdk__item.is-disabled .ui-cmdk__label,
258
258
  .ui-cmdk__item.is-disabled .ui-cmdk__desc,
@@ -267,7 +267,7 @@
267
267
  border: 1px solid var(--border);
268
268
  border-radius: var(--radius-xs);
269
269
  /* Key caps use an edge on the card surface, keeping the shortcut readable.
270
- why: docs/specification.md#elevation */
270
+ why: docs/foundations.md#elevation */
271
271
  background: var(--surface); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
272
272
  font-family: var(--font-sans);
273
273
  font-size: var(--text-xs);
@@ -319,7 +319,7 @@
319
319
  /* -- Narrow --------------------------------------------------------------- */
320
320
  /* At the kit's narrowest step the palette is the page: full width, off the top
321
321
  edge, and the key legend goes — there is no keyboard to legend.
322
- why: docs/specification.md#breakpoints */
322
+ why: docs/foundations.md#breakpoints */
323
323
  @media (max-width: 560px) {
324
324
  .ui-cmdk { --cmdk-top: var(--space-4); --cmdk-list-h: 60vh; }
325
325
  .ui-cmdk__panel { width: calc(100vw - var(--space-4)); }
@@ -333,7 +333,7 @@
333
333
  carries no transition inside it at all — for as long as it is open, not only
334
334
  in the frame it opens — which is what reduced motion asked for anyway: under
335
335
  the net nothing inside had longer than 0.01ms to run.
336
- why: docs/specification.md#reduced-motion-travels-with-the-stylesheet */
336
+ why: docs/foundations.md#reduced-motion-travels-with-the-stylesheet */
337
337
  @media (prefers-reduced-motion: reduce) {
338
338
  .ui-cmdk.is-open * { transition: none !important; }
339
339
  }
@@ -1,10 +1,10 @@
1
1
  /* Confirm — the kit's confirmation dialog: a centred panel over a scrim, for the
2
2
  * question a destructive action has to ask. Shares its scrim and focus trap with
3
3
  * the drawer (see overlay.js). Local tokens: --confirm-surface, --confirm-scrim.
4
- * why: docs/specification.md#motion */
4
+ * why: docs/foundations.md#motion */
5
5
 
6
6
  .ui-confirm {
7
- /* The floating step; nothing casts. why: docs/specification.md#elevation */
7
+ /* The floating step; nothing casts. why: docs/foundations.md#elevation */
8
8
  --confirm-surface: var(--bg-elevated);
9
9
  --confirm-scrim: var(--scrim);
10
10
  --confirm-w: var(--panel-md);
@@ -65,7 +65,7 @@
65
65
  /* The two-step edge and the drop, through the level's own names: in DARK that is
66
66
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
67
67
  both lines are transparent and the drop carries the whole separation.
68
- why: docs/specification.md#elevation */
68
+ why: docs/foundations.md#elevation */
69
69
  border: 1px solid var(--float-edge);
70
70
  box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
71
71
  border-radius: var(--radius-lg);
@@ -79,7 +79,7 @@
79
79
  /* The ring is COMPOSED with the floating treatment, not written over it: a
80
80
  box-shadow list replaces the whole list, so `box-shadow: var(--ring)` alone
81
81
  took the panel's edge and its drop off for as long as it held focus.
82
- why: docs/specification.md#elevation */
82
+ why: docs/foundations.md#elevation */
83
83
  .ui-confirm__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); }
84
84
 
85
85
  /* -- Slots ----------------------------------------------------------------- */
@@ -88,7 +88,7 @@
88
88
  footer makes. The title is an h2 and opts out of the display face base.css
89
89
  gives a heading, for the same reason .ui-drawer__title does: at --text-md it
90
90
  is the question on a dialog, set at the size the answer beneath it is set at.
91
- why: docs/specification.md#typefaces */
91
+ why: docs/foundations.md#typefaces */
92
92
  .ui-confirm__title {
93
93
  margin: 0;
94
94
  flex: none;
@@ -118,7 +118,7 @@
118
118
  follow it; the markup the kit publishes as a string, rendered open without the
119
119
  wiring, has no trap and makes it the first stop. The band is drawn INWARD, inside
120
120
  the --space-1 above, which is what keeps it off the glyphs.
121
- why: docs/specification.md#the-focus-ring */
121
+ why: docs/foundations.md#the-focus-ring */
122
122
  .ui-confirm__body:focus-visible { outline: var(--ring-scroll); outline-offset: var(--ring-scroll-offset); }
123
123
  .ui-confirm__acts {
124
124
  display: flex;
@@ -135,7 +135,7 @@
135
135
  root, so the answer openConfirm() focuses is still hidden and focus falls to
136
136
  <body>. So an open confirm carries no transition inside it at all — for as
137
137
  long as it is open, not only in the frame it opens.
138
- why: docs/specification.md#reduced-motion-travels-with-the-stylesheet */
138
+ why: docs/foundations.md#reduced-motion-travels-with-the-stylesheet */
139
139
  @media (prefers-reduced-motion: reduce) {
140
140
  .ui-confirm.is-open * { transition: none !important; }
141
141
  }
@@ -12,7 +12,7 @@
12
12
 
13
13
  .ui-drawer {
14
14
  /* The floating step; the edge is the hairline each --drawer--<edge> rule below draws.
15
- why: docs/specification.md#elevation */
15
+ why: docs/foundations.md#elevation */
16
16
  --drawer-surface: var(--bg-elevated);
17
17
  --drawer-scrim: var(--scrim);
18
18
  --drawer-w: var(--panel-md); /* left|right panels: width */
@@ -66,7 +66,7 @@
66
66
  line with the drops instead. The line is a variable so the focus rule can
67
67
  compose all three layers without knowing which edge it is on; its default is a
68
68
  no-op layer rather than `none`, which is valid only alone and would invalidate
69
- the list. why: docs/specification.md#elevation */
69
+ the list. why: docs/foundations.md#elevation */
70
70
  --drawer-line: 0 0 0 0 transparent;
71
71
  box-shadow: var(--drawer-line), var(--elev-drop);
72
72
  transition: transform var(--dur-med) var(--ease);
@@ -114,7 +114,7 @@
114
114
  /* The ring is COMPOSED with the floating treatment rather than written over it — a
115
115
  box-shadow list replaces the whole list, so a bare `box-shadow: var(--ring)` would
116
116
  take the drawer's edge and its drop off for as long as it held focus.
117
- why: docs/specification.md#elevation */
117
+ why: docs/foundations.md#elevation */
118
118
  .ui-drawer__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), var(--drawer-line), var(--elev-drop); }
119
119
 
120
120
  /* -- Sizes ----------------------------------------------------------------- */
@@ -140,7 +140,7 @@
140
140
  /* An h2, and base.css would give it the display face. It opts out: at 15px in a
141
141
  panel header it is a label on a piece of UI rather than a heading anybody
142
142
  reads, and the display face at that size is exactly what #253 was about.
143
- why: docs/specification.md#typefaces */
143
+ why: docs/foundations.md#typefaces */
144
144
  .ui-drawer__title {
145
145
  margin: 0;
146
146
  font-family: var(--font-sans);
@@ -184,7 +184,7 @@
184
184
  with the native outline. The band is drawn INWARD, inside the 20px padding: the body
185
185
  is flush with a panel that is itself flush with a screen edge, so an outset ring — on
186
186
  either box — is painted off-screen. Measured at 390, where an outset one left no
187
- indicator at all. why: docs/specification.md#the-focus-ring */
187
+ indicator at all. why: docs/foundations.md#the-focus-ring */
188
188
  .ui-drawer__body:focus-visible { outline: var(--ring-scroll); outline-offset: var(--ring-scroll-offset); }
189
189
 
190
190
  .ui-drawer__footer {
@@ -202,14 +202,14 @@
202
202
  panel, and rows are held apart by space alone. Group from group is the one
203
203
  division inside the body worth a line; the body's padding insets it, so it
204
204
  parts the groups without cutting the panel in two.
205
- why: docs/specification.md#the-drawer */
205
+ why: docs/components.md#the-drawer */
206
206
  .ui-drawer__section + .ui-drawer__section {
207
207
  margin-top: var(--space-6);
208
208
  padding-top: var(--space-6);
209
209
  border-top: 1px solid var(--border);
210
210
  }
211
211
  /* An h3, and it opts out of the display face for the reason .ui-drawer__title does.
212
- why: docs/specification.md#typefaces */
212
+ why: docs/foundations.md#typefaces */
213
213
  .ui-drawer__section-title {
214
214
  margin: 0 0 var(--space-2);
215
215
  font-family: var(--font-sans);
@@ -244,7 +244,7 @@
244
244
  open drawer carries no transition inside it at all — for as long as it is
245
245
  open, not only in the frame it opens — which is what reduced motion asked
246
246
  for anyway: under the net nothing inside had longer than 0.01ms to run.
247
- why: docs/specification.md#reduced-motion-travels-with-the-stylesheet */
247
+ why: docs/foundations.md#reduced-motion-travels-with-the-stylesheet */
248
248
  @media (prefers-reduced-motion: reduce) {
249
249
  .ui-drawer.is-open * { transition: none !important; }
250
250
  }
@@ -31,7 +31,7 @@
31
31
  /* Chevron — border caret that flips when the container is .open. Its ink is an L
32
32
  on a rotated square, so centring the BOX leaves the mark off centre; --caret-off
33
33
  is that gap, derived rather than typed.
34
- why: docs/specification.md#the-dropdown-panel */
34
+ why: docs/components.md#the-dropdown-panel */
35
35
  .ui-dropdown__chevron {
36
36
  --caret: 8px;
37
37
  --caret-ink: 1.6px;
@@ -50,11 +50,11 @@
50
50
  .ui-dropdown__panel {
51
51
  /* One number for the trigger-to-panel offset, read by both edges here and by
52
52
  the portal's JS, so an upward panel cannot drift from a downward one.
53
- why: docs/specification.md#the-dropdown-panel */
53
+ why: docs/components.md#the-dropdown-panel */
54
54
  --ui-dropdown-gap: 9px;
55
55
  /* Named for the same reason the offset is: a block pinned to an edge has to
56
56
  bleed back through it, and #306 is a page copying the number by hand.
57
- why: docs/specification.md#the-dropdown-panel */
57
+ why: docs/components.md#the-dropdown-panel */
58
58
  --ui-dropdown-pad: 6px;
59
59
  /* The panel states its own role rather than inheriting one, because `portal:
60
60
  true` moves it onto <body> and an inherited face is then decided by where
@@ -62,19 +62,19 @@
62
62
  inside a display-face subtree resolved to var(--font-display) in place and
63
63
  var(--font-sans) once portalled — a positioning flag changing the typeface.
64
64
  A list of item rows is text, so it is the text face in both placements.
65
- why: docs/specification.md#typefaces */
65
+ why: docs/foundations.md#typefaces */
66
66
  font-family: var(--font-sans);
67
67
  position: absolute;
68
68
  top: calc(100% + var(--ui-dropdown-gap));
69
69
  left: 0;
70
70
  min-width: 240px;
71
71
  /* The floating step, not the sunken one — a panel held open over a card cannot be
72
- painted the colour of an inset. why: docs/specification.md#elevation */
72
+ painted the colour of an inset. why: docs/foundations.md#elevation */
73
73
  background: var(--bg-elevated); --ring-gap: var(--bg-elevated);
74
74
  /* The two-step edge and the drop, through the level's own names: in DARK that is
75
75
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
76
76
  both lines are transparent and the drop carries the whole separation.
77
- why: docs/specification.md#elevation */
77
+ why: docs/foundations.md#elevation */
78
78
  border: 1px solid var(--float-edge);
79
79
  box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
80
80
  border-radius: var(--radius-lg);
@@ -83,7 +83,7 @@
83
83
  visibility: hidden;
84
84
  /* Drawn for the whole of the fade out, so the rows do not vanish mid-fade — and a
85
85
  box that is drawn is a box that is hit. The open rules take this back.
86
- why: docs/specification.md#the-dropdown-panel */
86
+ why: docs/components.md#the-dropdown-panel */
87
87
  pointer-events: none;
88
88
  transform: translateY(-6px);
89
89
  transition:
@@ -103,7 +103,7 @@
103
103
  rather than the scrolling one, as the palette and the drawer write it, because
104
104
  a panel that takes focus any other way has the same claim on the ring. The
105
105
  ring is COMPOSED with the floating treatment rather than over it: a box-shadow
106
- list replaces the whole list. why: docs/specification.md#elevation */
106
+ list replaces the whole list. why: docs/foundations.md#elevation */
107
107
  .ui-dropdown__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); }
108
108
 
109
109
  /* Opening upward. The kit releases its own `top` here so that nothing outside
@@ -111,7 +111,7 @@
111
111
  them, and a consumer who set `bottom` and left our `top` standing got a
112
112
  fourteen-pixel panel. The entry travel is mirrored too, so the panel arrives
113
113
  from the trigger whichever way it opens.
114
- why: docs/specification.md#the-dropdown-panel */
114
+ why: docs/components.md#the-dropdown-panel */
115
115
  .ui-dropdown__panel.is-up {
116
116
  top: auto;
117
117
  bottom: calc(100% + var(--ui-dropdown-gap));
@@ -122,7 +122,7 @@
122
122
  /* Open, the panel is visible AT ONCE: `visibility` is off the list, so it is not
123
123
  held at `hidden` for the frame a key opens the panel in — the frame the focus
124
124
  call happens in. Closing still fades on every property it always did.
125
- why: docs/specification.md#the-dropdown-panel */
125
+ why: docs/components.md#the-dropdown-panel */
126
126
  .ui-dropdown.open .ui-dropdown__panel,
127
127
  .ui-dropdown__panel--portal.is-open { transition-property: opacity, transform; }
128
128
 
@@ -130,7 +130,7 @@
130
130
  property of its own still transitions the inherited `visibility`, so it is hidden in
131
131
  the frame openDropdown() focuses into it — #519. Keyed on the data hook, because the
132
132
  topbar's two menus open on the same wiring and keep their own CSS.
133
- why: docs/specification.md#the-dropdown-panel */
133
+ why: docs/components.md#the-dropdown-panel */
134
134
  @media (prefers-reduced-motion: reduce) {
135
135
  .open > [data-dropdown-panel] *,
136
136
  [data-dropdown-panel].is-open * { transition: none !important; }
@@ -141,7 +141,7 @@
141
141
  selector above stops matching the moment it leaves the trigger's subtree, so
142
142
  its open state is a class of its own; the wiring writes the viewport
143
143
  coordinates inline, and these `auto`s are what it writes over.
144
- why: docs/specification.md#the-dropdown-panel */
144
+ why: docs/components.md#the-dropdown-panel */
145
145
  .ui-dropdown__panel--portal {
146
146
  position: fixed;
147
147
  top: auto; right: auto; bottom: auto; left: auto;
@@ -152,7 +152,7 @@
152
152
  <a href> or a <button>: `is-selected` and __tick below mean a row gets
153
153
  chosen, and choosing is a button's job. So the tag's own styling is reset
154
154
  here, the way .ui-nav__item resets it, and the three render identically.
155
- why: docs/specification.md#a-dropdown-row-is-a-div-a-link-or-a-button */
155
+ why: docs/components.md#a-dropdown-row-is-a-div-a-link-or-a-button */
156
156
  .ui-dropdown__item {
157
157
  display: flex;
158
158
  gap: 11px;
@@ -172,7 +172,7 @@
172
172
  color: var(--text);
173
173
  transition: background var(--dur-fast) var(--ease);
174
174
  }
175
- /* Rows keep a reading surface; hover adds an edge. why: docs/specification.md#elevation */
175
+ /* Rows keep a reading surface; hover adds an edge. why: docs/foundations.md#elevation */
176
176
  .ui-dropdown__item:hover { outline: 1px solid var(--control-edge); outline-offset: -1px; background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
177
177
  .ui-dropdown__item:focus-visible { outline: 2px solid transparent; background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ box-shadow: var(--ring); }
178
178
  .ui-dropdown__main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
@@ -213,7 +213,7 @@
213
213
  .ui-dropdown__item.is-disabled .ui-dropdown__desc { color: inherit; }
214
214
  /* Body ink at rest, --pink on the way to being pressed. Both states, not hover alone:
215
215
  the ring says where the reader is, not that this row ends something.
216
- why: docs/specification.md#a-dropdown-row-is-a-div-a-link-or-a-button */
216
+ why: docs/components.md#a-dropdown-row-is-a-div-a-link-or-a-button */
217
217
  .ui-dropdown__item.is-danger .ui-dropdown__label { color: var(--text); }
218
218
  .ui-dropdown__item.is-danger:hover .ui-dropdown__label,
219
219
  .ui-dropdown__item.is-danger:focus-visible .ui-dropdown__label { color: var(--pink); }
@@ -234,7 +234,7 @@
234
234
 
235
235
  /* Optional pinned head/foot blocks — symmetrical: one inner padding, and each
236
236
  bleeding to the edge it sits on, lining the edge it faces.
237
- why: docs/specification.md#the-dropdown-panel */
237
+ why: docs/components.md#the-dropdown-panel */
238
238
  .ui-dropdown__panel > .ui-dropdown__head,
239
239
  .ui-dropdown__panel > .ui-dropdown__foot {
240
240
  padding: 11px 13px;
@@ -254,7 +254,7 @@
254
254
  reader types. The rows move into a list of their own, so the field stays put
255
255
  while the list scrolls. Every rule below keys on a class only the search
256
256
  variant emits, so the plain dropdown renders as it did.
257
- why: docs/specification.md#a-dropdown-with-a-search-field */
257
+ why: docs/components.md#a-dropdown-with-a-search-field */
258
258
  .ui-dropdown__panel--search { min-width: 280px; }
259
259
 
260
260
  .ui-dropdown__search { position: relative; display: flex; align-items: center; margin-bottom: 6px; }
@@ -269,13 +269,13 @@
269
269
  .ui-dropdown__search-ic svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.4; }
270
270
  /* 12.5px with a mouse only. On a touch screen the touch-zoom net in
271
271
  src/styles/field-zoom.css takes this field, and every other field the kit
272
- ships, to 16px. why: docs/specification.md#a-field-is-16px-on-a-touch-screen */
272
+ ships, to 16px. why: docs/foundations.md#a-field-is-16px-on-a-touch-screen */
273
273
  .ui-dropdown__search-input {
274
274
  width: 100%;
275
275
  font: inherit;
276
276
  font-size: calc(var(--text-sm) - 0.5px);
277
277
  color: var(--strong);
278
- /* The ground and line .ui-input takes. why: docs/specification.md#elevation */
278
+ /* The ground and line .ui-input takes. why: docs/foundations.md#elevation */
279
279
  background: var(--field-bg); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
280
280
  border: 1px solid var(--field-edge);
281
281
  border-radius: var(--radius-sm);
@@ -287,7 +287,7 @@
287
287
  }
288
288
  /* The light-only `background: var(--bg)` override this field used to carry is gone:
289
289
  --field-bg says the same thing for every field. Gated by
290
- stories/dropdown-field-ground.test.js. why: docs/specification.md#elevation */
290
+ stories/dropdown-field-ground.test.js. why: docs/foundations.md#elevation */
291
291
 
292
292
  .ui-dropdown__search-input::placeholder { /* muted-ink: placeholder — empty search field */ color: var(--muted); }
293
293
  .ui-dropdown__search-input:hover { border-color: var(--field-edge-hover); }
@@ -298,7 +298,7 @@
298
298
  answered with the native outline. The band is drawn INWARD, on the list: an outset
299
299
  one 6px inside a --radius-lg corner leaves the panel, and the panel is not the box
300
300
  that scrolls. It lands in the rows' own 9px of padding, never on a label.
301
- why: docs/specification.md#the-focus-ring */
301
+ why: docs/foundations.md#the-focus-ring */
302
302
  .ui-dropdown__list:focus-visible { outline: var(--ring-scroll); outline-offset: var(--ring-scroll-offset); }
303
303
  /* A row is `display: flex`, which outranks the UA's [hidden], so a row the
304
304
  query hides is put away here. */
@@ -38,7 +38,7 @@
38
38
  fill strength on the page, found the way the solid toast is found. What is left is an
39
39
  inset sheen — gloss on the surface, not a shadow under it — so the hover is the travel
40
40
  alone and the box-shadow it transitioned went with it.
41
- why: docs/specification.md#elevation */
41
+ why: docs/foundations.md#elevation */
42
42
  box-shadow: inset 0 1px 0 color-mix(in srgb, var(--sheen) 28%, transparent);
43
43
  transition:
44
44
  transform var(--dur-fast) var(--ease-spring),
@@ -69,7 +69,7 @@
69
69
  width: min(520px, calc(100vw - 32px)); background: var(--bg-elevated); --ring-gap: var(--bg-elevated); border-radius: 18px;
70
70
  /* The shadow was its only edge until #295, which replaced it with the hairline; since
71
71
  #490 light is back on the drop and dark keeps the line.
72
- why: docs/specification.md#elevation */
72
+ why: docs/foundations.md#elevation */
73
73
  border: 1px solid var(--float-edge);
74
74
  box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
75
75
  opacity: 0; pointer-events: none;
@@ -8,7 +8,7 @@
8
8
  * transform still zooms, and this is a flat size rather than a floor, so a host
9
9
  * field designed ABOVE 16px is shrunk here. The override recipe is there too.
10
10
  *
11
- * why: docs/specification.md#a-field-is-16px-on-a-touch-screen */
11
+ * why: docs/foundations.md#a-field-is-16px-on-a-touch-screen */
12
12
 
13
13
  @media (pointer: coarse) {
14
14
  input:not(:where(
@@ -1,5 +1,5 @@
1
1
  /* File drop — .ui-drop. One row at rest; the field-sized box stays with .ui-file.
2
- * why: docs/specification.md#react-file-drop */
2
+ * why: docs/components.md#react-file-drop */
3
3
  .ui-drop { position: relative; }
4
4
 
5
5
  /* What the region accepts the file for, above the control. */
@@ -14,13 +14,13 @@
14
14
 
15
15
  /* Shut, a panel is the trigger's width, never the 240px floor a standalone
16
16
  dropdown gets: it is laid out while hidden, so a wider one widened the page
17
- (#467). why: docs/specification.md#a-filter-row-holds-its-panels */
17
+ (#467). why: docs/components.md#a-filter-row-holds-its-panels */
18
18
  .ui-filter-bar .ui-dropdown__panel { min-width: 100%; max-width: 100%; overflow-wrap: anywhere; }
19
19
  /* The clear action takes the kit's bordered skin minus its fill: words belong on
20
20
  the page, not on a grey block, in any state — Artur, round r28. Rest stays at
21
21
  (0,1,1) so `.ui-btn:hover`'s accent wash still outranks it; the rules under it
22
22
  answer each state that paints a NEUTRAL fill, one step above the kit rule
23
- writing it. Held by filter-bar.test.js. why: docs/specification.md#a-filter-row-holds-its-panels */
23
+ writing it. Held by filter-bar.test.js. why: docs/components.md#a-filter-row-holds-its-panels */
24
24
  [data-filter-clear] button { background: transparent; }
25
25
  .ui-filter-bar [data-filter-clear] button:disabled,
26
26
  .ui-filter-bar [data-filter-clear] button[aria-disabled="true"],
@@ -35,7 +35,7 @@
35
35
 
36
36
  /* Open, a chip's menu takes the kit's menu floor, measured and slid by
37
37
  filterPanelFit(); `is-closing` holds that geometry through the fade. #549
38
- why: docs/specification.md#a-filter-row-holds-its-panels */
38
+ why: docs/components.md#a-filter-row-holds-its-panels */
39
39
  .ui-filter-bar__chip .ui-dropdown.open .ui-dropdown__panel,
40
40
  .ui-filter-bar__chip .ui-dropdown__panel.is-closing {
41
41
  min-width: min(var(--ui-filter-panel-floor, 240px), var(--ui-filter-panel-room, 100%));
@@ -57,7 +57,7 @@
57
57
  open menu too and left 9.8px of the check in a 240px menu — a chevron, not a
58
58
  tick. Open the menu is at the floor with room for the mark, and `is-closing`
59
59
  holds the open geometry through the fade, so it is open for this as well. #550
60
- why: docs/specification.md#a-filter-row-holds-its-panels */
60
+ why: docs/components.md#a-filter-row-holds-its-panels */
61
61
  .ui-filter-bar__chip .ui-dropdown:not(.open) .ui-dropdown__panel:not(.is-closing) .ui-dropdown__tick {
62
62
  flex-shrink: 1;
63
63
  min-width: 0;
@@ -68,7 +68,7 @@
68
68
  tab you are on, and keeps the kit's 16px check. The wash is a 1.2:1 tint, so the
69
69
  check is what identifies the state under WCAG 1.4.1; Apple, Material, Carbon,
70
70
  Primer and Radix all tick a chosen menu row. #549
71
- why: docs/specification.md#a-filter-row-holds-its-panels */
71
+ why: docs/components.md#a-filter-row-holds-its-panels */
72
72
  .ui-filter-bar .ui-dropdown__item.is-selected { background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
73
73
  /* Kit-wide a chosen label steps down to --text, which left the row in force the
74
74
  faintest in the panel. Under the wash it holds --strong. */
@@ -82,5 +82,5 @@
82
82
  /* Hover's other paint is a 1px edge, 1.06:1 on the wash, which left the row in force
83
83
  the one row a pointer got no answer from. Selection is a background highlight, so
84
84
  hover deepens it: 9% more accent, the step .ui-table--zebra gives a hovered row.
85
- why: docs/specification.md#a-filter-row-holds-its-panels */
85
+ why: docs/components.md#a-filter-row-holds-its-panels */
86
86
  .ui-filter-bar .ui-dropdown__item.is-selected:hover { background: color-mix(in srgb, var(--glow-purple), var(--accent) 9%); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
@@ -121,7 +121,7 @@
121
121
 
122
122
  /* Responsive — columns collapse to a stacked layout on narrow screens. Two of
123
123
  the kit's three steps, and the second one is the phone step rather than a
124
- fourth value of the footer's own: docs/specification.md#breakpoints. */
124
+ fourth value of the footer's own: docs/foundations.md#breakpoints. */
125
125
  @media (max-width: 720px) {
126
126
  .ui-footer__top { flex-direction: column; gap: 30px; }
127
127
  .ui-footer__nav { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 26px 30px; }
@@ -24,7 +24,7 @@
24
24
  font-size: var(--text-base);
25
25
  color: var(--strong);
26
26
  /* Fields use the card surface and an edge in both themes.
27
- why: docs/specification.md#elevation */
27
+ why: docs/foundations.md#elevation */
28
28
  background: var(--field-bg); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
29
29
  border: 1px solid var(--field-edge);
30
30
  border-radius: var(--radius-md);
@@ -57,8 +57,8 @@
57
57
  longhands the chevron is drawn with (#511). Held by stories/select-chevron.test.js.
58
58
  `opacity` is the other half of that grey-out, and no colour here outranks it, so
59
59
  the fade is reset below — it took the edge and the words down together. #564,
60
- argued at docs/specification.md#colour-and-contrast.
61
- why: docs/specification.md#icons-and-glyphs */
60
+ argued at docs/foundations.md#colour-and-contrast.
61
+ why: docs/foundations.md#icons-and-glyphs */
62
62
  .ui-input:disabled,
63
63
  .ui-select:disabled,
64
64
  .ui-textarea:disabled {
@@ -81,7 +81,7 @@
81
81
  `search` glyph and no clear button, so a field without one is what the
82
82
  design already says. Measured in Chromium; Firefox draws nothing here and
83
83
  Edge is untested.
84
- why: docs/specification.md#colour-and-contrast */
84
+ why: docs/foundations.md#colour-and-contrast */
85
85
  .ui-input[type="search"]::-webkit-search-cancel-button {
86
86
  appearance: none;
87
87
  display: none;
@@ -106,7 +106,7 @@
106
106
  which is the colour every other quiet glyph on a field takes. It was one frozen
107
107
  hex until #295, dark --muted's old value, which the ladder's re-pick left behind
108
108
  at 2.49:1 on the light field. Held by stories/colour-tokens.test.js.
109
- why: docs/specification.md#colour-and-contrast */
109
+ why: docs/foundations.md#colour-and-contrast */
110
110
  .ui-select {
111
111
  appearance: none;
112
112
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a29db6' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
@@ -233,7 +233,7 @@
233
233
  /* --shadow-sm was the knob's only edge until #295, and a white knob on a light
234
234
  off-track has 1.20:1 to spare. --border-strong and not --border, which measures
235
235
  1.03:1 against that track and draws nothing — the checkbox above edges itself
236
- the same way. why: docs/specification.md#elevation */
236
+ the same way. why: docs/foundations.md#elevation */
237
237
  border: 1px solid var(--border-strong);
238
238
  box-sizing: border-box;
239
239
  border-radius: 50%;