@apliteni/apliteni-ui 0.113.0 → 0.115.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.
@@ -0,0 +1,282 @@
1
+ /* ============================================================================
2
+ * Chart — .ui-chart, the shapes a money dashboard keeps redrawing.
3
+ * .ui-chart__legend one key per series, plus the unfinished-period key
4
+ * .ui-chart__frame the tab stop; the value axis beside the scroller
5
+ * .ui-chart__scroll the scroller, masked on whichever side hides columns
6
+ * .ui-chart__plot the drawing and its column labels
7
+ * .ui-chart__data the same numbers as a table
8
+ * The component sets --ui-chart-h, the plot's height, which the axis matches.
9
+ * why: docs/components.md#react-charts
10
+ * ========================================================================== */
11
+
12
+ .ui-chart {
13
+ --ui-chart-col: var(--space-12);
14
+ /* The ground the marks are drawn on, so an unfinished period and the rim the
15
+ line is carried on read as cut out of it. A chart outside a card names its
16
+ own. */
17
+ --ui-chart-ground: var(--surface);
18
+ /* The tick's own line box. The axis spans the band the gridlines are drawn
19
+ in — the plot less the room a stroke needs at each edge — and is half a
20
+ line box taller at each end, so every tick's middle lands on its gridline
21
+ without taking a single label out of flow. */
22
+ --ui-chart-tick: calc(var(--text-xs) * 1.45);
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: var(--space-3);
26
+ font-size: var(--text-xs);
27
+ color: var(--text);
28
+ }
29
+
30
+ .ui-chart--bridge { --ui-chart-col: calc(var(--space-16) + var(--space-6)); }
31
+ .ui-chart--spark {
32
+ --ui-chart-col: var(--space-6);
33
+ gap: 0;
34
+ min-width: 0;
35
+ }
36
+ /* No axis, so the scroller takes the whole frame rather than the auto column
37
+ the axis would have held. */
38
+ .ui-chart--spark .ui-chart__frame { grid-template-columns: minmax(0, 1fr); }
39
+ /* The box, not the drawing: a phone target does not fit in 32px. Written here
40
+ rather than left to the height attribute, which `.ui-stat__trend svg` beats.
41
+ why: docs/components.md#react-charts */
42
+ .ui-chart--spark .ui-chart__svg { height: var(--ui-chart-box); }
43
+
44
+ /* -- the legend ------------------------------------------------------------ */
45
+
46
+ .ui-chart__legend {
47
+ /* muted-ink: chrome — the key names the marks and is not the chart's words */
48
+ color: var(--muted);
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ align-items: center;
52
+ column-gap: var(--space-4);
53
+ row-gap: var(--space-1);
54
+ margin: 0;
55
+ padding: 0;
56
+ list-style: none;
57
+ }
58
+ .ui-chart__key {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: var(--space-2);
62
+ white-space: nowrap;
63
+ }
64
+ .ui-chart__key-mark { flex: none; }
65
+ .ui-chart__key-swatch { fill: var(--ui-chart-tone); }
66
+ .ui-chart__key-line { fill: none; stroke: var(--ui-chart-tone); stroke-width: 2; stroke-linecap: round; }
67
+ .ui-chart__key-estimated {
68
+ fill: var(--ui-chart-tone);
69
+ stroke: var(--ui-chart-ground);
70
+ stroke-width: 1;
71
+ stroke-dasharray: 2 2;
72
+ }
73
+
74
+ /* -- the frame ------------------------------------------------------------- */
75
+
76
+ .ui-chart__frame {
77
+ display: grid;
78
+ grid-template-columns: auto minmax(0, 1fr);
79
+ align-items: start;
80
+ column-gap: var(--space-2);
81
+ padding-block: calc(var(--ring-width, 2px) + var(--ring-offset, 1px));
82
+ border-radius: var(--radius-xs);
83
+ }
84
+ .ui-chart__frame:focus-visible {
85
+ outline-offset: var(--ring-offset, 1px);
86
+ }
87
+
88
+ .ui-chart__axis {
89
+ /* muted-ink: chrome — a tick names the scale; exact values are reachable through the readout */
90
+ color: var(--muted);
91
+ display: flex;
92
+ flex-direction: column;
93
+ justify-content: space-between;
94
+ height: calc(var(--ui-chart-h) - var(--ui-chart-pad) * 2 + var(--ui-chart-tick));
95
+ margin-block: calc(var(--ui-chart-pad) - var(--ui-chart-tick) / 2);
96
+ text-align: right;
97
+ font-variant-numeric: tabular-nums;
98
+ }
99
+ .ui-chart__tick { line-height: 1.45; }
100
+
101
+ /* The mask fades whichever side still hides periods. It paints no ground of its
102
+ own, so a chart on the card and one on the page both fade correctly — and it
103
+ sits on the scroller rather than the tab stop, which would mask its ring. */
104
+ .ui-chart__scroll {
105
+ overflow-x: auto;
106
+ overflow-y: hidden;
107
+ overscroll-behavior-x: contain;
108
+ }
109
+ .ui-chart__scroll.is-more-before {
110
+ mask-image: linear-gradient(to right, transparent 0, #000 var(--space-6));
111
+ }
112
+ .ui-chart__scroll.is-more-after {
113
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--space-6)), transparent 100%);
114
+ }
115
+ .ui-chart__scroll.is-more-before.is-more-after {
116
+ mask-image: linear-gradient(
117
+ to right, transparent 0, #000 var(--space-6),
118
+ #000 calc(100% - var(--space-6)), transparent 100%);
119
+ }
120
+
121
+ .ui-chart__plot { min-width: calc(var(--ui-chart-col) * var(--ui-chart-cols, 1)); }
122
+ .ui-chart__svg { display: block; }
123
+
124
+ .ui-chart__periods {
125
+ display: grid;
126
+ grid-auto-flow: column;
127
+ grid-auto-columns: 1fr;
128
+ /* The row stood 4px under the plot plus the 2px rule every label reserved for
129
+ the picked one. The rule is gone and the gap keeps that step on the scale
130
+ rather than between two of its steps. */
131
+ padding-top: var(--space-2);
132
+ }
133
+ .ui-chart__period {
134
+ /* muted-ink: chrome — a period label names a column; its values are reachable through the readout */
135
+ color: var(--muted);
136
+ padding-inline: var(--space-1);
137
+ text-align: center;
138
+ line-height: 1.45;
139
+ overflow-wrap: anywhere;
140
+ }
141
+ /* The picked column's label: the body ink the rest of the row gives up, at the
142
+ weight a reader who separates no colours still reads. Selection is otherwise
143
+ the band behind the column and the band alone — the outline the chart draws
144
+ belongs to focus. */
145
+ .ui-chart__period.is-selected {
146
+ color: var(--strong);
147
+ font-weight: 600;
148
+ }
149
+
150
+ /* -- the marks ------------------------------------------------------------- */
151
+
152
+ /* The rules. A hairline at each tick carries a bar's height across twelve columns
153
+ to the label that names it, which is the one job a grid has; it is the kit's
154
+ faintest edge, so it is found when a reader looks for it and not before. The
155
+ zero rule keeps --border-strong above it: the line a signed series is measured
156
+ from leads the ones it is measured against. Both sit under every mark. */
157
+ .ui-chart__grid { stroke: var(--border); stroke-width: 1; }
158
+ .ui-chart__zero { stroke: var(--border-strong); stroke-width: 1; }
159
+
160
+ /* The carry a bridge draws between two steps: the running total leaves one
161
+ column at the height it reached and meets the next where it starts from. It
162
+ takes --border-strong, the zero rule's weight rather than the grid's, because
163
+ it is read along rather than looked up. Solid, like every other rule here: a
164
+ dash would read as a forecast. */
165
+ .ui-chart__carry { stroke: var(--border-strong); stroke-width: 1; }
166
+
167
+ /* The picked column, behind every mark and every rule. A quiet fill rather than
168
+ the accent, which the chart spends on a series; it is wider than any bar, so
169
+ the column is found before the bar in it is read. */
170
+ .ui-chart__band { fill: var(--surface-3); }
171
+
172
+ .ui-chart__bar {
173
+ /* One flat tone, the whole bar. A ramp down the bar was the one thing in the
174
+ drawing that carried no number: it let the middle go while both edges held,
175
+ so a reader comparing two months compared two shaded cylinders. */
176
+ fill: var(--ui-chart-tone);
177
+ stroke: none;
178
+ }
179
+ /* Keep each series' fill weight. Ground-coloured dashes mark unfinished data
180
+ without joining the mirrored bars across the zero channel. */
181
+ .ui-chart__bar.is-estimated {
182
+ fill: var(--ui-chart-tone);
183
+ stroke: var(--ui-chart-ground);
184
+ stroke-width: 1;
185
+ stroke-dasharray: 3 2;
186
+ }
187
+
188
+ /* An isolated value has no segment to draw it. Connected points need no dot. */
189
+ .ui-chart__isolated { fill: var(--ui-chart-tone); stroke: var(--ui-chart-ground); stroke-width: 1; }
190
+
191
+ .ui-chart__line {
192
+ fill: none;
193
+ stroke: var(--ui-chart-tone);
194
+ stroke-width: 2;
195
+ stroke-linecap: round;
196
+ }
197
+ .ui-chart__line.is-estimated { stroke-dasharray: 5 3; }
198
+
199
+ /* The ground carried under the line. The line crosses bars of its own family,
200
+ where hue alone separates them and luminance does not: a stroke of the ground
201
+ each side gives the line the 3:1 it cannot get from the bar behind it. It is
202
+ not drawn where there is nothing to cross — a sparkline has no bars, and at
203
+ text size the casing would eat the line. The line carries no marker of its
204
+ own; a dot on every point drew nothing the line had not already drawn. */
205
+ .ui-chart__line-casing {
206
+ fill: none;
207
+ stroke: var(--ui-chart-ground);
208
+ stroke-width: 4;
209
+ stroke-linecap: round;
210
+ }
211
+ .ui-chart--spark .ui-chart__line-casing { display: none; }
212
+
213
+ .ui-chart--spark .ui-chart__line { stroke-width: 1.6; }
214
+
215
+ /* The edge the readout is placed against: the mark's top. Geometry only — it
216
+ paints nothing. The readout opens above that edge where the frame has the
217
+ room and flips below it where it has not, which near the top of the plot
218
+ means covering the mark and the first axis labels. The guideline asks for
219
+ that flip rather than for a readout outside the part.
220
+ why: guidelines/hover-readouts.md#prefer-above-the-mark */
221
+ .ui-chart__anchor { fill: none; pointer-events: none; }
222
+
223
+ /* The hit area a pointer lands on. It is the series' own band in the column, so
224
+ a pointer between two bars still has a bar to answer with. */
225
+ .ui-chart__hit { fill: transparent; }
226
+
227
+ /* A chart whose columns can be picked says so under the pointer. The key
228
+ compound names the element rather than a class, which is how the kit's
229
+ clickable-chrome gate reads `.ui-seg button` and `.ui-check input`: the mark
230
+ is this <g> and cannot be moved onto a <button>, so there is no button
231
+ chrome to measure. */
232
+ .ui-chart--pick [data-mark] { cursor: pointer; }
233
+
234
+ /* The tones. A series names one; the token behind it is the kit's, and the same
235
+ in both themes' terms. The neutral one is --muted, which is what
236
+ --signal-solid-neutral already is: a mid grey in both themes, where --dim
237
+ would paint a bridge's totals near-black in light and near-white in dark. */
238
+ .ui-chart__tone--accent { --ui-chart-tone: var(--accent); }
239
+ /* The accent's second weight: the same hue, let down towards the ground rather
240
+ than given an opacity, so a mark painted with it is opaque and a reader
241
+ measures one colour. The mix crosses 3:1 at 67% against the card AND against
242
+ the page, in both themes, under all four accents, so 70% ships with room over
243
+ the bar rather than sitting on it — the 40% the restyle's mock drew measures
244
+ 1.99:1 and 2.03:1 and does not ship. */
245
+ .ui-chart__tone--accent-soft {
246
+ --ui-chart-tone: color-mix(in srgb, var(--accent) 70%, var(--ui-chart-ground));
247
+ }
248
+ .ui-chart__tone--good { --ui-chart-tone: var(--green); }
249
+ .ui-chart__tone--bad { --ui-chart-tone: var(--pink); }
250
+ .ui-chart__tone--warn { --ui-chart-tone: var(--amber); }
251
+ .ui-chart__tone--info { --ui-chart-tone: var(--cyan); }
252
+ .ui-chart__tone--neutral { --ui-chart-tone: var(--muted); }
253
+
254
+ /* -- the table ------------------------------------------------------------- */
255
+
256
+ .ui-chart__data > summary {
257
+ width: max-content;
258
+ min-height: var(--tap-min, 44px);
259
+ display: inline-flex;
260
+ align-items: center;
261
+ box-sizing: border-box;
262
+ padding: var(--space-1) var(--space-2);
263
+ border-radius: var(--radius-xs);
264
+ cursor: pointer;
265
+ font-size: var(--text-sm);
266
+ }
267
+ .ui-chart__data[open] > summary { margin-bottom: var(--space-3); }
268
+ /* The table is the one place a phone reader gets exact values, and how wide it
269
+ is depends on the caller's series: it carries them sideways inside the kit's
270
+ own scroller, so the card and the page keep their width whatever it holds.
271
+ Sideways only — there are as many rows as the chart has columns, and capping
272
+ their height would hide the last period behind a second scrollbar. */
273
+ .ui-chart__data .ui-table-scroll { --ui-table-height: none; }
274
+ .ui-chart__data .ui-table { margin: 0; }
275
+ /* Why a period is not final is a sentence, not a label, so it wraps under the
276
+ period it qualifies instead of carrying the money columns another two hundred
277
+ pixels to the right of a 390px card. */
278
+ .ui-chart__data .ui-table tbody th { white-space: normal; }
279
+ .ui-chart__state {
280
+ /* muted-ink: state — the word that marks a period as not final */
281
+ color: var(--muted);
282
+ }
@@ -31,9 +31,9 @@
31
31
  accent band is the second band #578 round r34 took off the focus rules, and a
32
32
  pointer resting on a focused control would put it back. One indicator, which is
33
33
  what the kit's rows already chose. why: docs/foundations.md#the-focus-ring */
34
- .ui-dropdown__trigger:hover:not(:focus-visible) { border-color: var(--accent); }
34
+ .ui-dropdown__trigger:enabled:hover:not(:focus-visible) { border-color: var(--accent); }
35
35
  .ui-dropdown__trigger:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
36
- /* Off. The off hover-not-focus selectors are (0,4,0), above live hover's (0,3,0).
36
+ /* Off. The off hover-not-focus selectors are (0,4,0), tied with live hover and later.
37
37
  A pointer over a dead control changes nothing while an aria-disabled one keeps its stop and the ring.
38
38
  No fill: --disabled-surface IS this control's --surface, in both themes. The
39
39
  activation is refused in ddTriggerOff(), not with pointer-events, which would
@@ -13,15 +13,19 @@
13
13
  background: var(--surface);
14
14
  }
15
15
  .ui-filter-bar__chip .ui-dropdown__trigger { border: 0; background: transparent; padding: var(--space-1) var(--space-2); }
16
- .ui-filter-bar__remove { border: 0; background: transparent; color: var(--text); font: inherit; text-align: center; font-size: var(--text-lg); padding: 0; min-width: 24px; min-height: 24px; border-radius: var(--radius-xs); cursor: pointer; }
16
+ /* The chip is the edge the row's other boxes are measured against, so it fades with them:
17
+ off, the chips stayed at full strength and only their ink said so. Two carriers, because
18
+ a bar turned off disables the controls in a nested fieldset and not the fieldset. #518
19
+ why: guidelines/accessibility-floor.md#disabled-control-legibility */
20
+ .ui-filter-bar__chip:disabled,
21
+ .ui-filter-bar:disabled .ui-filter-bar__chip { border-color: var(--disabled-border); }
22
+ .ui-filter-bar__remove { border: 0; background: transparent; /* muted-ink: glyph — filter remove mark */ color: var(--muted); font: inherit; text-align: center; font-size: var(--text-lg); padding: 0; min-width: 24px; min-height: 24px; border-radius: var(--radius-xs); cursor: pointer; }
17
23
  .ui-filter-bar__remove:focus-visible,
18
24
  .ui-filter-bar:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
19
25
  .ui-filter-bar button:disabled { /* muted-ink: state — disabled filters */ color: var(--disabled-ink); cursor: not-allowed; }
26
+ .ui-filter-bar .ui-filter-bar__remove:disabled { /* muted-ink: state — unavailable remove mark on the page */ color: var(--disabled-ink-bare); }
20
27
 
21
- /* The chip's value takes its button's own ink, so a disabled chip keeps the
22
- disabled ink it inherits instead of the value ink the enabled rules set. */
23
- .ui-filter-bar .ui-dropdown__value { color: inherit; }
24
- .ui-filter-bar button:enabled .ui-dropdown__value { color: var(--strong); }
28
+ .ui-filter-bar .ui-dropdown__value { color: inherit; font-weight: inherit; letter-spacing: normal; }
25
29
  /* A chip with nothing chosen prints the field's name in the slot the value will
26
30
  take — in the page's reading ink, not --muted. --disabled-ink IS --muted, so a
27
31
  muted name on an offered filter said "switched off" in the one ink the kit
@@ -34,11 +38,8 @@
34
38
  dropdown gets: it is laid out while hidden, so a wider one widened the page
35
39
  (#467). why: docs/components.md#a-filter-row-holds-its-panels */
36
40
  .ui-filter-bar .ui-dropdown__panel { min-width: 100%; max-width: 100%; overflow-wrap: anywhere; }
37
- /* The clear action takes the kit's bordered skin minus its fill: words belong on
38
- the page, not on a grey block, in any state — Artur, round r28. Rest stays at
39
- (0,1,1) so `.ui-btn:hover`'s accent wash still outranks it; the rules under it
40
- answer each state that paints a NEUTRAL fill, one step above the kit rule
41
- writing it. Held by filter-bar.test.js. why: docs/components.md#a-filter-row-holds-its-panels */
41
+ /* Clear is a quiet text button: no edge in any state, and no fill but the pointer's wash below.
42
+ why: docs/components.md#a-filter-row-holds-its-panels */
42
43
  [data-filter-clear] button { background: transparent; }
43
44
  .ui-filter-bar [data-filter-clear] button:disabled,
44
45
  .ui-filter-bar [data-filter-clear] button[aria-disabled="true"],
@@ -46,23 +47,40 @@
46
47
  .ui-filter-bar [data-filter-clear] button[aria-busy="true"]:hover,
47
48
  .ui-filter-bar [data-filter-clear] button[aria-busy="true"]:active,
48
49
  .ui-filter-bar [data-filter-clear] button[aria-busy="true"][data-btn-disabled] { background: transparent; }
49
- /* No fill, so the label is read on the page: the ink button-disabled.test.js
50
- measures on every ground. The edge stays the kit's --disabled-border. */
50
+ /* The ink button-disabled.test.js measures on every ground, since there is no fill. */
51
51
  .ui-filter-bar [data-filter-clear] button:disabled,
52
52
  .ui-filter-bar [data-filter-clear] button[aria-disabled="true"] { /* muted-ink: state — the clear action is off and its words sit on the page */ color: var(--disabled-ink-bare); }
53
+ .ui-filter-bar [data-filter-clear] button { border-color: transparent; }
54
+ .ui-filter-bar [data-filter-clear] button[aria-busy="true"],
55
+ .ui-filter-bar [data-filter-clear] button[aria-busy="true"]:hover,
56
+ .ui-filter-bar [data-filter-clear] button[aria-busy="true"]:active { border-color: transparent; }
57
+ /* The kit's own pointer answer, `.ui-btn:hover`: --accent at 14% and --strong ink, over the page
58
+ ground rather than --surface, which would be a grey block under words. Busy restated after. */
59
+ .ui-filter-bar [data-filter-clear] button:enabled:hover { border-color: transparent; background: color-mix(in srgb, var(--accent) 14%, transparent); /* code-bg: inherit — a translucent wash moves the ground, not the chip on it. */ }
60
+ .ui-filter-bar [data-filter-clear] button[aria-busy="true"]:hover { background: transparent; }
61
+ .ui-filter-bar [data-filter-clear] button:disabled,
62
+ .ui-filter-bar [data-filter-clear] button[aria-disabled="true"],
63
+ .ui-filter-bar [data-filter-clear] button[aria-busy="true"][data-btn-disabled] { border-color: transparent; }
53
64
 
54
- /* Open, a chip's menu takes the kit's menu floor, measured and slid by
55
- filterPanelFit(); `is-closing` holds that geometry through the fade. #549
65
+ /* Open, a filter menu anchored at its own trigger takes a floor measured and slid by
66
+ filterPanelFit(); `is-closing` holds that geometry through the fade. A chip's menu
67
+ reaches for the kit's menu floor; the add control's catalogue asks for a panel's
68
+ width instead, because a search field over it reads "Searc" at 240. #549, #496
56
69
  why: docs/components.md#a-filter-row-holds-its-panels */
70
+ .ui-filter-bar [data-filter-add] .ui-dropdown__panel { --ui-filter-panel-ask: var(--panel-sm); }
57
71
  .ui-filter-bar__chip .ui-dropdown.open .ui-dropdown__panel,
58
- .ui-filter-bar__chip .ui-dropdown__panel.is-closing {
72
+ .ui-filter-bar__chip .ui-dropdown__panel.is-closing,
73
+ .ui-filter-bar [data-filter-add] .ui-dropdown.open .ui-dropdown__panel,
74
+ .ui-filter-bar [data-filter-add] .ui-dropdown__panel.is-closing {
59
75
  min-width: min(var(--ui-filter-panel-floor, 240px), var(--ui-filter-panel-room, 100%));
60
76
  max-width: var(--ui-filter-panel-room, 100%);
61
77
  margin-inline-start: calc(-1 * var(--ui-filter-panel-shift, 0px));
62
78
  }
63
79
  /* An end-aligned panel is pinned by its right edge, so the slide pushes it. */
64
80
  .ui-filter-bar__chip .ui-dropdown.open .ui-dropdown__panel.is-end,
65
- .ui-filter-bar__chip .ui-dropdown__panel.is-end.is-closing {
81
+ .ui-filter-bar__chip .ui-dropdown__panel.is-end.is-closing,
82
+ .ui-filter-bar [data-filter-add] .ui-dropdown.open .ui-dropdown__panel.is-end,
83
+ .ui-filter-bar [data-filter-add] .ui-dropdown__panel.is-end.is-closing {
66
84
  margin-inline-start: 0;
67
85
  margin-inline-end: calc(-1 * var(--ui-filter-panel-shift, 0px));
68
86
  }
@@ -104,3 +122,24 @@
104
122
  field and filterBar() builds none, so an arrow key moves real focus instead. #578
105
123
  why: docs/components.md#a-filter-row-holds-its-panels */
106
124
  .ui-filter-bar .ui-dropdown__item.is-selected:hover { background: color-mix(in srgb, var(--glow-purple), var(--accent) 9%); /* code-bg: inherit — a translucent wash moves the ground, not the chip on it. */ }
125
+
126
+ /* A chip's height — its remove mark's line box, padding and border — named so the control
127
+ stands as tall on a line of its own, where there is no chip to stretch to. */
128
+ .ui-filter-bar { --ui-filter-row-h: calc(2px + 2 * var(--space-1) + var(--leading-normal) * var(--text-lg)); }
129
+
130
+ /* A chip's neighbour takes the chip's corner, that height and edge, but not its painted fill:
131
+ the trigger's own edge can differ from the row's, while its --surface made the
132
+ row's least consequential action its loudest box — and off, with its edge down, the one thing
133
+ still looking pressable. The states are
134
+ spelled out because this depth outranks the base rules; the fill needs one rule, because the
135
+ kit paints it at rest only. Under a pointer it takes the kit's trigger edge, --accent, which
136
+ steps aside under the band; held at its resting edge, hover and rest were one paint. #496, #518
137
+ why: guidelines/colour-and-theming.md#keep-text-off-grey-fills */
138
+ .ui-filter-bar [data-filter-add] { display: flex; align-self: stretch; }
139
+ .ui-filter-bar [data-filter-add] .ui-dropdown { display: flex; }
140
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger { border-radius: var(--radius-sm); min-height: var(--ui-filter-row-h); border-color: var(--control-edge); background: transparent; }
141
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger svg { width: 16px; height: 16px; flex: none; stroke-width: 2.4; }
142
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger:enabled:hover:not(:focus-visible) { border-color: var(--accent); }
143
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger:disabled { border-color: var(--disabled-border); }
144
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger[aria-disabled="true"],
145
+ .ui-filter-bar [data-filter-add] .ui-dropdown__trigger[aria-disabled="true"]:hover:not(:focus-visible) { border-color: var(--disabled-border); }
@@ -209,7 +209,7 @@
209
209
  src/styles/dropdown.css:271 `.ui-dropdown__item:hover`.
210
210
  why: docs/foundations.md#elevation */
211
211
  .vopt:hover { outline: 1px solid var(--control-edge); outline-offset: -1px; background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
212
- /* The row is a keyboard stop: src/components/dropdown.js:1107
212
+ /* The row is a keyboard stop: src/components/dropdown.js:1141
213
213
  `items[next < 0 ? 0 : next]?.focus()` moves focus onto a `[data-dd-item]` with
214
214
  the arrow keys, and this is one. It takes the ring on its own 10px radius, the
215
215
  same way `.amenu a` above does. #482 */