@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.
- package/guidelines/labels-and-titles.md +18 -6
- package/package.json +1 -1
- package/react/README.md +69 -1
- package/react/dist/index.d.ts +92 -2
- package/react/dist/index.js +789 -49
- package/src/components/dropdown.js +53 -19
- package/src/components/filter-bar.js +6 -3
- package/src/index.css +1 -0
- package/src/index.d.ts +30 -6
- package/src/index.js +1 -0
- package/src/inline.js +2 -0
- package/src/logic/chart.js +143 -0
- package/src/logic/filter-bar.js +34 -16
- package/src/styles/chart.css +282 -0
- package/src/styles/dropdown.css +2 -2
- package/src/styles/filter-bar.css +55 -16
- package/src/styles/topbar.css +1 -1
|
@@ -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
|
+
}
|
package/src/styles/dropdown.css
CHANGED
|
@@ -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),
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/*
|
|
38
|
-
|
|
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
|
-
/*
|
|
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
|
|
55
|
-
filterPanelFit(); `is-closing` holds that geometry through the fade.
|
|
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); }
|
package/src/styles/topbar.css
CHANGED
|
@@ -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:
|
|
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 */
|