@apliteni/apliteni-ui 0.92.0 → 0.94.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/README.md +5 -7
- package/guidelines/colour-and-theming.md +2 -0
- package/package.json +1 -1
- package/react/README.md +2 -2
- package/react/dist/index.d.ts +3 -3
- package/src/assets/icons.js +1 -1
- package/src/components/account-nav.js +2 -2
- package/src/components/back.js +2 -2
- package/src/components/command-palette.js +2 -2
- package/src/components/drawer.js +1 -1
- package/src/components/dropdown.js +12 -12
- package/src/components/filter-bar.js +2 -2
- package/src/components/footer.js +1 -1
- package/src/components/index.js +1 -1
- package/src/components/loading.js +1 -1
- package/src/components/shell.js +19 -19
- package/src/components/stat.js +3 -3
- package/src/components/success.js +3 -3
- package/src/components/tooltip.js +1 -1
- package/src/components/topbar.js +1 -1
- package/src/html.js +1 -1
- package/src/index.css +1 -1
- package/src/index.d.ts +1 -1
- package/src/logic/accents.js +1 -1
- package/src/logic/filter-bar.js +4 -4
- package/src/styles/back.css +3 -3
- package/src/styles/base.css +3 -3
- package/src/styles/button.css +3 -3
- package/src/styles/callout.css +2 -2
- package/src/styles/card.css +8 -8
- package/src/styles/command-palette.css +14 -14
- package/src/styles/confirm.css +7 -7
- package/src/styles/drawer.css +8 -8
- package/src/styles/dropdown.css +21 -21
- package/src/styles/feedback.css +2 -2
- package/src/styles/field-zoom.css +1 -1
- package/src/styles/file-drop.css +1 -1
- package/src/styles/filter-bar.css +6 -6
- package/src/styles/footer.css +1 -1
- package/src/styles/input.css +6 -6
- package/src/styles/layout.css +54 -57
- package/src/styles/loading.css +1 -1
- package/src/styles/motion.css +1 -1
- package/src/styles/nav.css +39 -50
- package/src/styles/pagination.css +2 -2
- package/src/styles/reduced-motion.css +2 -2
- package/src/styles/segmented.css +3 -3
- package/src/styles/stat.css +3 -3
- package/src/styles/success.css +1 -1
- package/src/styles/table.css +6 -6
- package/src/styles/tap-zone.css +1 -1
- package/src/styles/tooltip.css +3 -3
- package/src/styles/topbar.css +8 -8
- package/src/tokens/accents.css +1 -1
- package/src/tokens/tokens.css +25 -25
package/src/logic/filter-bar.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* `value` is display text: it is the chip's only visible line, so a consumer
|
|
8
8
|
* answers a change with text a reader can read, not a raw code.
|
|
9
|
-
* why: docs/
|
|
9
|
+
* why: docs/components.md#dense-financial-tables
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
const text = (v) => (v == null ? '' : String(v));
|
|
@@ -71,7 +71,7 @@ function stopsAround(host) {
|
|
|
71
71
|
* order, else the nearest one behind it. A filter bar that has just dropped its
|
|
72
72
|
* last control keeps no box the focus ring can sit on, so the focus has to
|
|
73
73
|
* leave the bar rather than land on a line with no height.
|
|
74
|
-
* why: docs/
|
|
74
|
+
* why: docs/components.md#a-filter-row-holds-its-panels */
|
|
75
75
|
export function nextFocusStop(host) {
|
|
76
76
|
return stopsAround(host)[0] || null;
|
|
77
77
|
}
|
|
@@ -88,7 +88,7 @@ export function nextFocusStop(host) {
|
|
|
88
88
|
* Being reachable is not the same as taking the focus: a control can be visible
|
|
89
89
|
* and enabled and still refuse, so each candidate is asked and then checked, and
|
|
90
90
|
* the next one tried.
|
|
91
|
-
* why: docs/
|
|
91
|
+
* why: docs/components.md#a-filter-row-holds-its-panels */
|
|
92
92
|
export function focusNextStop(host) {
|
|
93
93
|
const doc = host && host.ownerDocument;
|
|
94
94
|
if (!doc) return null;
|
|
@@ -114,7 +114,7 @@ export function focusNextStop(host) {
|
|
|
114
114
|
* consumer wrote them left whatever they had marked standing — a menu checking
|
|
115
115
|
* `All`, `aria-selected="true"` on it, under a chip printing `Asia`. The
|
|
116
116
|
* consumer's own array and objects are not written to. #550
|
|
117
|
-
* why: docs/
|
|
117
|
+
* why: docs/components.md#a-filter-row-holds-its-panels */
|
|
118
118
|
export function filterChipItems(filter = {}) {
|
|
119
119
|
const items = filter.items || [];
|
|
120
120
|
const chosen = text(filter.value);
|
package/src/styles/back.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* The way up from a page to the page it sits under. It stands above the page
|
|
4
4
|
* title, in the slot a breadcrumb trail would take, and it is quiet at rest: it
|
|
5
5
|
* is on every page below a list, and it is never what the page is for.
|
|
6
|
-
* why: docs/
|
|
6
|
+
* why: docs/components.md#the-back-link
|
|
7
7
|
* ========================================================================== */
|
|
8
8
|
|
|
9
9
|
/* Its own line, and only as wide as its words, so the hover ground does not run
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|
|
37
37
|
/* 16px, with the stroke raised to match: the glyph set draws at 1.7 on a 24-unit
|
|
38
38
|
box, which is 1.13 CSS px at this size and under the kit's 1.5 for a stroked
|
|
39
|
-
mark. 2.4 paints 1.6. why: docs/
|
|
39
|
+
mark. 2.4 paints 1.6. why: docs/foundations.md#icons-and-glyphs */
|
|
40
40
|
.ui-back svg { width: 16px; height: 16px; flex: none; stroke-width: 2.4; }
|
|
41
41
|
|
|
42
42
|
/* In the page shell it takes the trail's place, and the trail's distance from
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
.ui-app__main > .ui-back { margin-bottom: var(--space-5); }
|
|
45
45
|
|
|
46
46
|
/* The one part that can run long. It clips rather than wrapping, as .ui-nav__label
|
|
47
|
-
does. why: docs/
|
|
47
|
+
does. why: docs/components.md#the-back-link */
|
|
48
48
|
.ui-back__label {
|
|
49
49
|
min-width: 0;
|
|
50
50
|
overflow: hidden;
|
package/src/styles/base.css
CHANGED
|
@@ -43,7 +43,7 @@ a {
|
|
|
43
43
|
* reader notices. A component that wants a heading tag set in the text face
|
|
44
44
|
* says so on its own rule, which outranks this one at (0,1,0); .ui-card__title,
|
|
45
45
|
* .ui-drawer__title and .ui-confirm__title are the three that do.
|
|
46
|
-
* why: docs/
|
|
46
|
+
* why: docs/foundations.md#typefaces */
|
|
47
47
|
h1, h2, h3, h4, h5, h6 {
|
|
48
48
|
font-family: var(--font-display);
|
|
49
49
|
}
|
|
@@ -52,7 +52,7 @@ h1, h2, h3, h4, h5, h6 {
|
|
|
52
52
|
* chat feeds run at, 700 stops reading as emphasis and starts reading as a
|
|
53
53
|
* filled-in shape. The semibold step is the emphasis; the bold step stays
|
|
54
54
|
* available to anything that asks for it by name.
|
|
55
|
-
* why: docs/
|
|
55
|
+
* why: docs/foundations.md#typefaces */
|
|
56
56
|
b,
|
|
57
57
|
strong {
|
|
58
58
|
font-weight: var(--weight-semibold);
|
|
@@ -115,7 +115,7 @@ strong {
|
|
|
115
115
|
.ui-stack > * + * { margin-top: var(--space-4); }
|
|
116
116
|
|
|
117
117
|
/* Eyebrow — the label above a title or a figure, in sentence case like every
|
|
118
|
-
label in the kit. why: docs/
|
|
118
|
+
label in the kit. why: docs/foundations.md#labels-and-titles */
|
|
119
119
|
.ui-eyebrow {
|
|
120
120
|
/* rank: label */
|
|
121
121
|
font-size: var(--text-sm);
|
package/src/styles/button.css
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
padding: var(--btn-pad-y) var(--btn-pad-x);
|
|
21
21
|
cursor: pointer;
|
|
22
22
|
/* Light needs a stronger line here: --border on this fill measures 1.047:1.
|
|
23
|
-
why: docs/
|
|
23
|
+
why: docs/foundations.md#elevation */
|
|
24
24
|
border: 1px solid var(--control-edge);
|
|
25
25
|
background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
26
26
|
color: var(--text);
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/* -- Sizes -------------------------------------------------------------- */
|
|
77
|
-
/* why: docs/
|
|
77
|
+
/* why: docs/components.md#extra-small-buttons */
|
|
78
78
|
.ui-btn--xs { --btn-pad-y: 4.5px; --btn-pad-x: 8px; --btn-font: var(--text-xs); min-width: 24px; min-height: 24px; }
|
|
79
79
|
.ui-btn--xs svg { width: 13px; height: 13px; stroke-width: 2.8; }
|
|
80
80
|
.ui-btn--sm { --btn-pad-y: 6px; --btn-pad-x: 12px; --btn-font: calc(var(--text-sm) - 0.5px); }
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
contrast table shows that. The box was reverted and this ink shipped.
|
|
124
124
|
Held by src/styles/button-disabled.test.js. */
|
|
125
125
|
|
|
126
|
-
/* why: docs/
|
|
126
|
+
/* why: docs/components.md#busy-button-labels */
|
|
127
127
|
.ui-btn { position: relative; }
|
|
128
128
|
.ui-btn[aria-busy="true"] { pointer-events: none; }
|
|
129
129
|
.ui-btn[aria-busy="true"][data-btn-wired] {
|
package/src/styles/callout.css
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
.ui-callout__body { min-width: 0; overflow-wrap: break-word; }
|
|
16
16
|
.ui-callout__actions { margin-top: 15px; }
|
|
17
17
|
.ui-callout__icon { width: 18px; height: 18px; flex: none; margin-top: 1px; /* muted-ink: glyph — nonverbal callout icon */ color: var(--muted); }
|
|
18
|
-
.ui-callout__icon svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 2.1; } /* 2.1 of a 24 box drawn at 18px = 1.58 CSS px, which is what buys the 3:1 graphic bar rather than the 4.5:1 text one. docs/
|
|
18
|
+
.ui-callout__icon svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 2.1; } /* 2.1 of a 24 box drawn at 18px = 1.58 CSS px, which is what buys the 3:1 graphic bar rather than the 4.5:1 text one. docs/foundations.md#icons-and-glyphs */
|
|
19
19
|
.ui-callout b { color: var(--text); font-weight: var(--weight-semibold); }
|
|
20
20
|
.ui-callout code { font-family: var(--font-mono); font-size: 0.92em; color: var(--text); }
|
|
21
21
|
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
the 20px success() draws it at, rather than stretching a status mark to fill the
|
|
134
134
|
line mark's box. The mark fills the box, so the box is what decides. The modifier
|
|
135
135
|
is written by successPanel(), as success() writes ui-sx--check-circled on its root.
|
|
136
|
-
why: docs/
|
|
136
|
+
why: docs/components.md#success-confirmations */
|
|
137
137
|
.ui-success__check--circled { width: 20px; height: 20px; }
|
|
138
138
|
.ui-success__title { color: var(--strong); font-size: var(--text-lg); font-weight: var(--weight-semibold); margin-bottom: 5px; }
|
|
139
139
|
.ui-success__sub { color: var(--text); font-size: var(--text-base); }
|
package/src/styles/card.css
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
/* The surface is the step; what makes it legible depends on the theme. Dark edges the
|
|
7
7
|
card with the hairline (--card-edge). Light draws no line at all and casts --elev-rest
|
|
8
8
|
instead — a 22px penumbra off a 10px offset, the width Artur's reference uses on a
|
|
9
|
-
card. Chosen by him on #490 round t3. why: docs/
|
|
9
|
+
card. Chosen by him on #490 round t3. why: docs/foundations.md#elevation */
|
|
10
10
|
.ui-card {
|
|
11
11
|
background: var(--surface); --ring-gap: var(--surface);
|
|
12
12
|
border: 1px solid var(--card-edge);
|
|
13
13
|
box-shadow: var(--elev-rest);
|
|
14
14
|
border-radius: var(--radius-xl);
|
|
15
15
|
/* Was `var(--space-6) 26px`; 26 is off the scale and broke the column's text edge.
|
|
16
|
-
why: docs/
|
|
16
|
+
why: docs/foundations.md#spacing-and-rhythm */
|
|
17
17
|
padding: var(--space-6);
|
|
18
18
|
position: relative;
|
|
19
19
|
}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
answered with the native outline. It is a scroll region, so it takes --ring-scroll:
|
|
27
27
|
the band drawn inward, inside the card's 24px padding and clear of the table.
|
|
28
28
|
--elev-rest is left alone: the band is an outline, not a layer of the shadow list.
|
|
29
|
-
why: docs/
|
|
29
|
+
why: docs/foundations.md#the-focus-ring */
|
|
30
30
|
.ui-card:has(> .ui-table):focus-visible { outline: var(--ring-scroll); outline-offset: var(--ring-scroll-offset); }
|
|
31
31
|
|
|
32
32
|
/* Vertical stacks space cards with the container's gap — see .ui-card-stack.
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
/* A padding modifier moves the vertical rhythm and keeps the text edge, so cards of
|
|
37
37
|
different padding line up in one column. --pad-lg is the centred landing card, never
|
|
38
38
|
stacked with plain ones, and keeps its own inset.
|
|
39
|
-
why: docs/
|
|
39
|
+
why: docs/foundations.md#spacing-and-rhythm */
|
|
40
40
|
.ui-card--pad-sm { padding: var(--space-5) var(--space-6); }
|
|
41
41
|
.ui-card--pad-lg { padding: var(--space-8) var(--space-10); }
|
|
42
42
|
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
the card's own hairline re-coloured: an inset ring over it would draw two. #295
|
|
45
45
|
The strength is --card-tint, per theme: light mixes down from white, so a tint that
|
|
46
46
|
works in dark sinks a light card below the page. Each variant edges itself in its own
|
|
47
|
-
colour. why: docs/
|
|
47
|
+
colour. why: docs/foundations.md#elevation */
|
|
48
48
|
.ui-card--accent {
|
|
49
49
|
background: color-mix(in srgb, var(--accent) var(--card-tint), var(--surface)); --ring-gap: color-mix(in srgb, var(--accent) var(--card-tint), var(--surface));
|
|
50
50
|
border-color: color-mix(in srgb, var(--accent) 22%, transparent);
|
|
@@ -66,12 +66,12 @@
|
|
|
66
66
|
transition: transform var(--dur-fast) var(--ease);
|
|
67
67
|
}
|
|
68
68
|
/* The lift alone: the card's own rung is what says it is raised, and hover is not a
|
|
69
|
-
change of level. why: docs/
|
|
69
|
+
change of level. why: docs/foundations.md#elevation */
|
|
70
70
|
.ui-card--interactive:hover { transform: translateY(-2px); }
|
|
71
71
|
.ui-card--interactive:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
72
72
|
|
|
73
73
|
/* card() emits the title as an h2, so the text face is named here rather than
|
|
74
|
-
left to the element. why: docs/
|
|
74
|
+
left to the element. why: docs/foundations.md#labels-and-titles */
|
|
75
75
|
.ui-card__title {
|
|
76
76
|
color: var(--strong);
|
|
77
77
|
font-family: var(--font-sans);
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
display: flex;
|
|
83
83
|
align-items: center;
|
|
84
84
|
gap: 10px;
|
|
85
|
-
/* Title to description: the step, not the 5px it was. why: docs/
|
|
85
|
+
/* Title to description: the step, not the 5px it was. why: docs/foundations.md#spacing-and-rhythm */
|
|
86
86
|
margin: 0 0 var(--space-2);
|
|
87
87
|
}
|
|
88
88
|
.ui-card__sub {
|
|
@@ -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/
|
|
15
|
+
* why: docs/components.md#the-command-palette */
|
|
16
16
|
|
|
17
17
|
.ui-cmdk {
|
|
18
|
-
/* The floating step; nothing casts. why: docs/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
}
|
package/src/styles/confirm.css
CHANGED
|
@@ -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/
|
|
4
|
+
* why: docs/foundations.md#motion */
|
|
5
5
|
|
|
6
6
|
.ui-confirm {
|
|
7
|
-
/* The floating step; nothing casts. why: docs/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
}
|
package/src/styles/drawer.css
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
}
|
package/src/styles/dropdown.css
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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. */
|
package/src/styles/feedback.css
CHANGED
|
@@ -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/
|
|
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/
|
|
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/
|
|
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(
|