@wtfalch/design 0.9.1 → 0.10.1
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 +6 -3
- package/dist/components/Callout.js +1 -1
- package/dist/components/Checkbox.js +1 -1
- package/dist/components/Command.js +3 -3
- package/dist/components/DangerZone.js +1 -1
- package/dist/components/Empty.js +10 -3
- package/dist/components/Field.js +1 -1
- package/dist/components/Identity.js +1 -1
- package/dist/components/Input.d.ts +10 -0
- package/dist/components/Input.js +1 -1
- package/dist/components/Menu.js +1 -1
- package/dist/components/Pill.d.ts +1 -2
- package/dist/components/Pill.js +1 -2
- package/dist/components/Popover.js +1 -1
- package/dist/components/Rows.js +2 -2
- package/dist/components/Slider.js +1 -1
- package/dist/components/SplitPane.js +2 -2
- package/dist/components/Table.js +1 -1
- package/dist/components/Tabs.js +2 -2
- package/dist/components/Textarea.d.ts +10 -0
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Toggle.js +1 -1
- package/dist/components/Tour.js +6 -2
- package/dist/styles/index.css +88 -182
- package/dist/tf.css +88 -182
- package/dist/valet.css +88 -182
- package/package.json +1 -1
package/dist/styles/index.css
CHANGED
|
@@ -45,6 +45,9 @@
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
@layer utilities {
|
|
48
|
+
.pointer-events-none {
|
|
49
|
+
pointer-events: none;
|
|
50
|
+
}
|
|
48
51
|
.collapse {
|
|
49
52
|
visibility: collapse;
|
|
50
53
|
}
|
|
@@ -77,6 +80,9 @@
|
|
|
77
80
|
.sticky {
|
|
78
81
|
position: sticky;
|
|
79
82
|
}
|
|
83
|
+
.inset-0 {
|
|
84
|
+
inset: 0px;
|
|
85
|
+
}
|
|
80
86
|
.z-\[60\] {
|
|
81
87
|
z-index: 60;
|
|
82
88
|
}
|
|
@@ -110,12 +116,21 @@
|
|
|
110
116
|
.mt-1 {
|
|
111
117
|
margin-top: var(--spacing-1);
|
|
112
118
|
}
|
|
119
|
+
.mt-2 {
|
|
120
|
+
margin-top: var(--spacing-2);
|
|
121
|
+
}
|
|
122
|
+
.mt-px {
|
|
123
|
+
margin-top: 1px;
|
|
124
|
+
}
|
|
113
125
|
.mb-3 {
|
|
114
126
|
margin-bottom: var(--spacing-3);
|
|
115
127
|
}
|
|
116
128
|
.ml-2 {
|
|
117
129
|
margin-left: var(--spacing-2);
|
|
118
130
|
}
|
|
131
|
+
.ml-auto {
|
|
132
|
+
margin-left: auto;
|
|
133
|
+
}
|
|
119
134
|
.block {
|
|
120
135
|
display: block;
|
|
121
136
|
}
|
|
@@ -140,6 +155,9 @@
|
|
|
140
155
|
.table {
|
|
141
156
|
display: table;
|
|
142
157
|
}
|
|
158
|
+
.h-4 {
|
|
159
|
+
height: var(--spacing-4);
|
|
160
|
+
}
|
|
143
161
|
.h-\[14px\] {
|
|
144
162
|
height: 14px;
|
|
145
163
|
}
|
|
@@ -158,6 +176,9 @@
|
|
|
158
176
|
.min-h-screen {
|
|
159
177
|
min-height: 100vh;
|
|
160
178
|
}
|
|
179
|
+
.w-4 {
|
|
180
|
+
width: var(--spacing-4);
|
|
181
|
+
}
|
|
161
182
|
.w-\[18px\] {
|
|
162
183
|
width: 18px;
|
|
163
184
|
}
|
|
@@ -185,6 +206,18 @@
|
|
|
185
206
|
.flex-1 {
|
|
186
207
|
flex: 1;
|
|
187
208
|
}
|
|
209
|
+
.flex-\[0_0_var\(--split\)\] {
|
|
210
|
+
flex: 0 0 var(--split);
|
|
211
|
+
}
|
|
212
|
+
.flex-\[1_1_0\] {
|
|
213
|
+
flex: 1 1 0;
|
|
214
|
+
}
|
|
215
|
+
.flex-\[1_1_260px\] {
|
|
216
|
+
flex: 1 1 260px;
|
|
217
|
+
}
|
|
218
|
+
.flex-\[1_1_auto\] {
|
|
219
|
+
flex: 1 1 auto;
|
|
220
|
+
}
|
|
188
221
|
.flex-none {
|
|
189
222
|
flex: none;
|
|
190
223
|
}
|
|
@@ -215,6 +248,9 @@
|
|
|
215
248
|
.flex-wrap {
|
|
216
249
|
flex-wrap: wrap;
|
|
217
250
|
}
|
|
251
|
+
.place-items-center {
|
|
252
|
+
place-items: center;
|
|
253
|
+
}
|
|
218
254
|
.items-baseline {
|
|
219
255
|
align-items: baseline;
|
|
220
256
|
}
|
|
@@ -248,6 +284,9 @@
|
|
|
248
284
|
.gap-\[var\(--border-width\)\] {
|
|
249
285
|
gap: var(--border-width);
|
|
250
286
|
}
|
|
287
|
+
.gap-px {
|
|
288
|
+
gap: 1px;
|
|
289
|
+
}
|
|
251
290
|
.self-center {
|
|
252
291
|
align-self: center;
|
|
253
292
|
}
|
|
@@ -310,9 +349,15 @@
|
|
|
310
349
|
.p-2 {
|
|
311
350
|
padding: var(--spacing-2);
|
|
312
351
|
}
|
|
352
|
+
.p-3 {
|
|
353
|
+
padding: var(--spacing-3);
|
|
354
|
+
}
|
|
313
355
|
.p-4 {
|
|
314
356
|
padding: var(--spacing-4);
|
|
315
357
|
}
|
|
358
|
+
.px-2 {
|
|
359
|
+
padding-inline: var(--spacing-2);
|
|
360
|
+
}
|
|
316
361
|
.px-4 {
|
|
317
362
|
padding-inline: var(--spacing-4);
|
|
318
363
|
}
|
|
@@ -331,6 +376,12 @@
|
|
|
331
376
|
.py-10 {
|
|
332
377
|
padding-block: var(--spacing-10);
|
|
333
378
|
}
|
|
379
|
+
.pt-2 {
|
|
380
|
+
padding-top: var(--spacing-2);
|
|
381
|
+
}
|
|
382
|
+
.pb-1 {
|
|
383
|
+
padding-bottom: var(--spacing-1);
|
|
384
|
+
}
|
|
334
385
|
.pb-2 {
|
|
335
386
|
padding-bottom: var(--spacing-2);
|
|
336
387
|
}
|
|
@@ -346,6 +397,9 @@
|
|
|
346
397
|
.text-2xs {
|
|
347
398
|
font-size: var(--text-2xs);
|
|
348
399
|
}
|
|
400
|
+
.text-base {
|
|
401
|
+
font-size: var(--text-base);
|
|
402
|
+
}
|
|
349
403
|
.text-lg {
|
|
350
404
|
font-size: var(--text-lg);
|
|
351
405
|
}
|
|
@@ -367,6 +421,10 @@
|
|
|
367
421
|
--tw-leading: 1.25;
|
|
368
422
|
line-height: 1.25;
|
|
369
423
|
}
|
|
424
|
+
.leading-\[1\.35\] {
|
|
425
|
+
--tw-leading: 1.35;
|
|
426
|
+
line-height: 1.35;
|
|
427
|
+
}
|
|
370
428
|
.leading-\[16px\] {
|
|
371
429
|
--tw-leading: 16px;
|
|
372
430
|
line-height: 16px;
|
|
@@ -411,6 +469,9 @@
|
|
|
411
469
|
.opacity-60 {
|
|
412
470
|
opacity: 60%;
|
|
413
471
|
}
|
|
472
|
+
.opacity-90 {
|
|
473
|
+
opacity: 90%;
|
|
474
|
+
}
|
|
414
475
|
.opacity-\[0\.55\] {
|
|
415
476
|
opacity: 0.55;
|
|
416
477
|
}
|
|
@@ -1449,23 +1510,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1449
1510
|
template are allowed to diverge, and this is only saying that they have. */
|
|
1450
1511
|
.set-hint.drifted { color: var(--warn); }
|
|
1451
1512
|
|
|
1452
|
-
/* What an applet drew, read back. A tree rather than prose, so it is left as
|
|
1453
|
-
preformatted text and given a ceiling -- a busy applet is a hundred lines and
|
|
1454
|
-
this sits inside a settings pane. */
|
|
1455
|
-
.drawn {
|
|
1456
|
-
margin: var(--space-2) 0 0;
|
|
1457
|
-
padding: var(--space-2) var(--space-2);
|
|
1458
|
-
max-height: 220px;
|
|
1459
|
-
overflow: auto;
|
|
1460
|
-
font-size: var(--text-xs);
|
|
1461
|
-
line-height: 1.45;
|
|
1462
|
-
white-space: pre-wrap;
|
|
1463
|
-
overflow-wrap: anywhere;
|
|
1464
|
-
border: 1px solid var(--border);
|
|
1465
|
-
border-radius: var(--radius);
|
|
1466
|
-
background: var(--panel-2);
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
1513
|
/* One applet, alone on the page, at `/applet/<id>`. Fills the window: there is
|
|
1470
1514
|
no grid here to decide a height, and a screenshot of an applet letterboxed
|
|
1471
1515
|
inside a page is mostly not the applet. */
|
|
@@ -1512,11 +1556,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1512
1556
|
that belongs to a conversation lives here any more, so it can breathe. */
|
|
1513
1557
|
.topbar .ctl-grow { flex: 1; min-width: 0; }
|
|
1514
1558
|
|
|
1515
|
-
/* Back on the left, Next on the right, with the gap between them doing the
|
|
1516
|
-
separating -- so the button that goes forward is in the same place on both
|
|
1517
|
-
pages instead of sliding when Back appears. */
|
|
1518
|
-
.first-run-actions { align-items: center; }
|
|
1519
|
-
|
|
1520
1559
|
@keyframes listening-pulse { 0%, 100% { opacity: 1 } 50% { opacity: .35 } }
|
|
1521
1560
|
|
|
1522
1561
|
/* table ---------------------------------------------------------------- */
|
|
@@ -1857,8 +1896,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1857
1896
|
border-radius: 4px;
|
|
1858
1897
|
}
|
|
1859
1898
|
|
|
1860
|
-
.danger-unavailable { margin-top: var(--space-2); opacity: 0.85; }
|
|
1861
|
-
|
|
1862
1899
|
/* Label beside the control, for a settings pane: a column of names on the left
|
|
1863
1900
|
and their controls on the right reads as a list of what is set, where the
|
|
1864
1901
|
same rows stacked read as a form waiting to be filled in. The description
|
|
@@ -1936,8 +1973,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1936
1973
|
/* A callout that leaves on its own.
|
|
1937
1974
|
Room at the bottom for the bar, and `position: relative` so the bar can sit
|
|
1938
1975
|
on the border rather than inside the text. */
|
|
1939
|
-
.callout-timed { position: relative; padding-bottom: var(--space-5); overflow: hidden; }
|
|
1940
|
-
|
|
1941
1976
|
/* The countdown. Drawn as a shrinking bar rather than a number: nobody wants to
|
|
1942
1977
|
read a clock, they want to know whether they have time. Animated width rather
|
|
1943
1978
|
than a transition, so it starts the moment it is painted. */
|
|
@@ -1998,14 +2033,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1998
2033
|
is the operating system's font drawing a glyph beside an app that has an icon
|
|
1999
2034
|
set for exactly this. The ring went with it: a circle around a warning
|
|
2000
2035
|
triangle is two shapes saying one thing. */
|
|
2001
|
-
.callout-mark {
|
|
2002
|
-
flex: none;
|
|
2003
|
-
display: grid;
|
|
2004
|
-
place-items: center;
|
|
2005
|
-
margin-top: 1px;
|
|
2006
|
-
opacity: 0.9;
|
|
2007
|
-
}
|
|
2008
|
-
|
|
2009
2036
|
/* Held-back history when a local conversation would cross to a hosted model.
|
|
2010
2037
|
Deliberately loud: the cost of missing it is uploading work that was kept
|
|
2011
2038
|
local on purpose. */
|
|
@@ -2021,6 +2048,19 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2021
2048
|
}
|
|
2022
2049
|
|
|
2023
2050
|
.callout button { flex: none; }
|
|
2051
|
+
/* A state, so it stays a class.
|
|
2052
|
+
*
|
|
2053
|
+
* `Callout` applies this as `running ? ' callout-timed' : ''` inside a
|
|
2054
|
+
* template literal -- which is not a class list a rewrite can read, and the
|
|
2055
|
+
* first pass at converting it deleted the rule while leaving the usage. The
|
|
2056
|
+
* box lost five spacing steps of padding and the countdown bar had nothing
|
|
2057
|
+
* to sit in. A class that appears only inside a conditional is a state; the
|
|
2058
|
+
* sheet is where those belong. */
|
|
2059
|
+
.callout-timed {
|
|
2060
|
+
position: relative;
|
|
2061
|
+
padding-bottom: var(--space-5);
|
|
2062
|
+
overflow: hidden;
|
|
2063
|
+
}
|
|
2024
2064
|
}
|
|
2025
2065
|
|
|
2026
2066
|
/* ---- ./card.css ---- */
|
|
@@ -2079,16 +2119,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2079
2119
|
which reads as a different column of content. */
|
|
2080
2120
|
.card:has(.card-icon) .card-inline { padding-left: calc(var(--card-icon) + var(--space-3)); }
|
|
2081
2121
|
|
|
2082
|
-
/* Its own line, above the sentence it introduces. */
|
|
2083
|
-
.card-inline-label {
|
|
2084
|
-
display: block;
|
|
2085
|
-
font-size: var(--text-xs);
|
|
2086
|
-
text-transform: uppercase;
|
|
2087
|
-
letter-spacing: 0.04em;
|
|
2088
|
-
color: var(--muted);
|
|
2089
|
-
margin-bottom: 2px;
|
|
2090
|
-
}
|
|
2091
|
-
|
|
2092
2122
|
.card-title { display: block; font-size: var(--text-base); }
|
|
2093
2123
|
|
|
2094
2124
|
.card-desc { margin-top: var(--space-1); color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
@@ -2226,12 +2256,8 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2226
2256
|
tooltip ended up orphaned under it. */
|
|
2227
2257
|
.set-row > .switch-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
2228
2258
|
|
|
2229
|
-
.switch-label { color: var(--text); }
|
|
2230
|
-
|
|
2231
2259
|
.switch-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
2232
2260
|
|
|
2233
|
-
.switch-said { flex: none; font-size: var(--text-xs); color: var(--muted); }
|
|
2234
|
-
|
|
2235
2261
|
/* Three sizes, the same names every other control uses. The switch scales with
|
|
2236
2262
|
the row: a 30x18 track beside 12px text is a different control from the same
|
|
2237
2263
|
track beside 16px text. */
|
|
@@ -2404,17 +2430,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2404
2430
|
|
|
2405
2431
|
/* ---- ./skeleton.css ---- */
|
|
2406
2432
|
@layer components {
|
|
2407
|
-
.muted { color: var(--muted); }
|
|
2408
|
-
|
|
2409
|
-
.pulse-block {
|
|
2410
|
-
display: inline-block;
|
|
2411
|
-
height: 8px;
|
|
2412
|
-
border-radius: var(--radius-sm);
|
|
2413
|
-
background: var(--muted);
|
|
2414
|
-
animation: ds-pulse 1.4s ease-in-out infinite;
|
|
2415
|
-
vertical-align: middle;
|
|
2416
|
-
}
|
|
2417
|
-
|
|
2418
2433
|
/* skeletons ------------------------------------------------------------ */
|
|
2419
2434
|
|
|
2420
2435
|
/* Ink at low alpha, not a named surface.
|
|
@@ -2673,8 +2688,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2673
2688
|
|
|
2674
2689
|
.rows-split:first-of-type { margin-top: var(--space-2); }
|
|
2675
2690
|
|
|
2676
|
-
.rows-empty { padding: var(--space-3) 0; }
|
|
2677
|
-
|
|
2678
2691
|
/* The name, the pills and the line underneath. `min-width: 0` is the whole
|
|
2679
2692
|
reason this is a class: a flex item will not shrink below its content, so
|
|
2680
2693
|
without it the name pushes the pills off the end -- and the pills are the
|
|
@@ -2691,8 +2704,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2691
2704
|
|
|
2692
2705
|
/* The aligned column. `margin-left: auto` rather than a grid, because the rows
|
|
2693
2706
|
are flex and a size that varies by two characters does not need a track. */
|
|
2694
|
-
.row-trail { flex: none; margin-left: auto; white-space: nowrap; }
|
|
2695
|
-
|
|
2696
2707
|
.rows-row.rows-top { align-items: flex-start; }
|
|
2697
2708
|
|
|
2698
2709
|
.rows-row.rows-bad .truncate { color: var(--bad); }
|
|
@@ -2838,14 +2849,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2838
2849
|
|
|
2839
2850
|
.tabs-vertical .tab.on .tab-label { color: var(--accent); }
|
|
2840
2851
|
|
|
2841
|
-
.tab-hint {
|
|
2842
|
-
display: block;
|
|
2843
|
-
margin-top: 1px;
|
|
2844
|
-
font-size: var(--text-xs);
|
|
2845
|
-
color: var(--muted);
|
|
2846
|
-
line-height: 1.35;
|
|
2847
|
-
}
|
|
2848
|
-
|
|
2849
2852
|
/* A heading above a run of tabs. Set apart from the run above by space, not
|
|
2850
2853
|
a rule -- the rail already has one edge -- and the tabs under it step in
|
|
2851
2854
|
by the label's own padding so the label reads as theirs. */
|
|
@@ -2856,8 +2859,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2856
2859
|
|
|
2857
2860
|
.tabs-vertical .tab-group:first-child { padding-top: var(--space-2); }
|
|
2858
2861
|
|
|
2859
|
-
.tab-group-label { display: block; font-size: var(--text-sm); font-weight: 600; color: var(--text); }
|
|
2860
|
-
|
|
2861
2862
|
.tabs-vertical .tab.in-group { padding-left: var(--space-5); }
|
|
2862
2863
|
|
|
2863
2864
|
/* No line under a vertical strip -- its edge is the border on the right. */
|
|
@@ -3067,8 +3068,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3067
3068
|
`<strong>` rule above is the one that sets the size. */
|
|
3068
3069
|
/* Under the title, on the header's padding rather than the body's, so it reads
|
|
3069
3070
|
as part of the heading rather than as the first line of content. */
|
|
3070
|
-
.modal-desc { line-height: 1.5; }
|
|
3071
|
-
|
|
3072
3071
|
.modal-body { padding: var(--space-2) var(--space-4) var(--space-3); overflow-y: auto; }
|
|
3073
3072
|
|
|
3074
3073
|
/* The close cross. Its rule stayed behind in tf's stylesheet when the split
|
|
@@ -3236,12 +3235,8 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3236
3235
|
|
|
3237
3236
|
.slider-row.is-disabled { opacity: 0.55; }
|
|
3238
3237
|
|
|
3239
|
-
.slider-body { flex: 1 1 260px; min-width: 0; display: grid; gap: 1px; }
|
|
3240
|
-
|
|
3241
3238
|
.set-row > .slider-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
3242
3239
|
|
|
3243
|
-
.slider-label { color: var(--text); }
|
|
3244
|
-
|
|
3245
3240
|
.slider-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
3246
3241
|
|
|
3247
3242
|
/* The box, with the value printed inside it at the right where a select
|
|
@@ -3467,8 +3462,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3467
3462
|
/* A run of checkboxes is one choice, not several settings that happen to be
|
|
3468
3463
|
adjacent. Tight enough that the group reads as a block -- at the spacing a
|
|
3469
3464
|
form field wants, four tools look like four unrelated questions. */
|
|
3470
|
-
.choice-group { display: grid; gap: var(--space-1); }
|
|
3471
|
-
|
|
3472
3465
|
/* The same choice, laid out as tiles instead of a column.
|
|
3473
3466
|
|
|
3474
3467
|
Four short names down the full width of a card is four wide bands for four
|
|
@@ -3592,8 +3585,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3592
3585
|
second line is what the first line is actually asking for. */
|
|
3593
3586
|
.choice-why { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 1px; }
|
|
3594
3587
|
|
|
3595
|
-
.choice-meta { color: var(--muted); font-size: var(--text-xs); font-family: var(--font-mono); }
|
|
3596
|
-
|
|
3597
3588
|
.choice[data-disabled] {
|
|
3598
3589
|
cursor: not-allowed;
|
|
3599
3590
|
border-color: var(--border);
|
|
@@ -3790,8 +3781,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3790
3781
|
reason they can live in an app with four palettes: `ink` becomes the current
|
|
3791
3782
|
text colour and `paper` becomes the surface behind it, so one file covers
|
|
3792
3783
|
Night, Paper and both halves of System. Give the wrapper a `color` and
|
|
3793
|
-
the figure follows it
|
|
3794
|
-
one thing on screen worth looking at.
|
|
3784
|
+
the figure follows it: `--muted` for a quiet empty state, `--accent` for the
|
|
3785
|
+
one thing on screen worth looking at. Set that colour on the wrapper --
|
|
3786
|
+
`Empty` reaches for `text-muted`, and any token works. */
|
|
3795
3787
|
.illo {
|
|
3796
3788
|
display: inline-block;
|
|
3797
3789
|
/* Height is the given dimension and the width comes from the drawing, so a
|
|
@@ -3808,18 +3800,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3808
3800
|
caller says otherwise. Not `transparent`: these have overlapping shapes, and
|
|
3809
3801
|
a shirt that lets the arm behind it show through reads as a hole. */
|
|
3810
3802
|
.illo .paper { fill: var(--illo-paper); }
|
|
3811
|
-
|
|
3812
|
-
/* The figure in a whole-surface `Empty`, drawn in the muted grey of the
|
|
3813
|
-
sentence under it.
|
|
3814
|
-
*
|
|
3815
|
-
* A utility cannot do this, and the reason is worth keeping: `.illo` sets
|
|
3816
|
-
* `color: inherit` and is unlayered, while every Tailwind utility lives in
|
|
3817
|
-
* `@layer utilities` -- and an unlayered declaration beats a layered one
|
|
3818
|
-
* whatever the specificity. So `text-muted` on the figure lost, silently,
|
|
3819
|
-
* and the shirt came out full text black beside a muted sentence. The
|
|
3820
|
-
* original rule already carried a note about needing two classes to beat
|
|
3821
|
-
* `.illo`; layers make that impossible rather than merely fiddly. */
|
|
3822
|
-
.nothing-figure { color: var(--muted); }
|
|
3823
3803
|
}
|
|
3824
3804
|
|
|
3825
3805
|
/* ---- ./field.css ---- */
|
|
@@ -3831,7 +3811,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3831
3811
|
to what was typed, so it goes after. */
|
|
3832
3812
|
.field { display: grid; gap: var(--space-1); }
|
|
3833
3813
|
|
|
3834
|
-
|
|
3814
|
+
/* `.field-stack-layout` carries no rules: stacking is what `.field` already
|
|
3815
|
+
does, and the class is emitted only so that both layouts name themselves
|
|
3816
|
+
the same way (`field-${layout}-layout`). Only the row layout overrides. */
|
|
3835
3817
|
|
|
3836
3818
|
.field-row-layout > .field-label { grid-column: 1; }
|
|
3837
3819
|
|
|
@@ -3852,8 +3834,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3852
3834
|
|
|
3853
3835
|
/* Not red. The asterisk marks which fields are required; colouring it the same
|
|
3854
3836
|
as a failure says something has already gone wrong with every one of them. */
|
|
3855
|
-
.field-required { color: var(--muted); }
|
|
3856
|
-
|
|
3857
3837
|
.field-hint,
|
|
3858
3838
|
.field-error { margin: 0; font-size: var(--text-sm); line-height: 1.45; }
|
|
3859
3839
|
|
|
@@ -3875,8 +3855,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3875
3855
|
/* Fields stacked down a form. Wider than the gap inside one field, so the
|
|
3876
3856
|
label of the next belongs to the input under it rather than to the error
|
|
3877
3857
|
above it. */
|
|
3878
|
-
.field-stack { display: grid; gap: var(--space-4); }
|
|
3879
|
-
|
|
3880
3858
|
.field-row > .field { flex: 1; min-width: 0; }
|
|
3881
3859
|
|
|
3882
3860
|
/* A password with an eye -- `Input type="password"`.
|
|
@@ -4004,10 +3982,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4004
3982
|
@layer components {
|
|
4005
3983
|
/* tour ----------------------------------------------------------------- */
|
|
4006
3984
|
|
|
4007
|
-
/* The layer sits over everything and catches nothing: the scrim is painted by
|
|
4008
|
-
the hole's shadow, so there is no full-screen element to swallow a click. */
|
|
4009
|
-
.tour { position: fixed; inset: 0; z-index: 60; pointer-events: none; }
|
|
4010
|
-
|
|
4011
3985
|
/* The control the tour is currently pointing at.
|
|
4012
3986
|
|
|
4013
3987
|
Much of this chrome is invisible until you touch it -- `.view-add` lives at
|
|
@@ -4018,11 +3992,14 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4018
3992
|
what every control does at rest, and the alternative is naming each one here
|
|
4019
3993
|
and watching that list drift from the rules that hide them. One declaration
|
|
4020
3994
|
that outranks whatever the resting state is beats an enumeration that goes
|
|
4021
|
-
stale. It is scoped to a class only ever present on one element at a time.
|
|
4022
|
-
|
|
4023
|
-
|
|
4024
|
-
|
|
4025
|
-
|
|
3995
|
+
stale. It is scoped to a class only ever present on one element at a time.
|
|
3996
|
+
|
|
3997
|
+
Opacity and nothing else. This forced `color: var(--text)` too, from the
|
|
3998
|
+
original port, with no case on record that needed it -- and it broke the
|
|
3999
|
+
first target that painted its own background, turning a primary button's
|
|
4000
|
+
label dark on accent at 2.2:1. The spotlight makes a control visible; what
|
|
4001
|
+
colour it is at rest is the control's business. */
|
|
4002
|
+
.tour-target { opacity: 1 !important; }
|
|
4026
4003
|
|
|
4027
4004
|
/* The spotlight. An enormous spread shadow dims the whole window except the
|
|
4028
4005
|
rectangle it is drawn on, which needs no clip path and no arithmetic. */
|
|
@@ -4056,8 +4033,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4056
4033
|
|
|
4057
4034
|
.tour-card:focus { outline: none; }
|
|
4058
4035
|
|
|
4059
|
-
.tour-title { font-size: var(--text-base); }
|
|
4060
|
-
|
|
4061
4036
|
.tour-body { margin: 0; color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
4062
4037
|
|
|
4063
4038
|
.tour-actions { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-2); }
|
|
@@ -4229,17 +4204,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4229
4204
|
the intrinsic width of a mail list is the longest unbroken subject line in
|
|
4230
4205
|
it. Without this the handle stops partway across and nothing on screen says
|
|
4231
4206
|
why -- it just refuses, differently for every mailbox. */
|
|
4232
|
-
.split-pane {
|
|
4233
|
-
min-width: 0;
|
|
4234
|
-
min-height: 0;
|
|
4235
|
-
overflow: hidden;
|
|
4236
|
-
display: flex;
|
|
4237
|
-
flex-direction: column;
|
|
4238
|
-
}
|
|
4239
|
-
|
|
4240
|
-
.split-first { flex: 0 0 var(--split); }
|
|
4241
|
-
.split-second { flex: 1 1 0; }
|
|
4242
|
-
|
|
4243
4207
|
/* The handle is wider than it looks: a hairline is a correct-looking divider
|
|
4244
4208
|
and an impossible pointer target. The grip is the line, drawn at
|
|
4245
4209
|
`--border-width` down the middle of a `--space-3` strip, and the strip is
|
|
@@ -4336,13 +4300,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4336
4300
|
z-index: 60;
|
|
4337
4301
|
}
|
|
4338
4302
|
|
|
4339
|
-
.pop-body {
|
|
4340
|
-
padding: var(--space-3);
|
|
4341
|
-
outline: none;
|
|
4342
|
-
color: var(--text);
|
|
4343
|
-
font-size: var(--text-sm);
|
|
4344
|
-
}
|
|
4345
|
-
|
|
4346
4303
|
/* Entry, and the direction it comes from. `data-placement` is React Aria's,
|
|
4347
4304
|
set to where the surface actually went rather than where it was asked to go,
|
|
4348
4305
|
so the movement agrees with the flip. */
|
|
@@ -4403,8 +4360,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4403
4360
|
.menu-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4404
4361
|
.menu-item[data-focused] .menu-icon { color: var(--text); }
|
|
4405
4362
|
|
|
4406
|
-
.menu-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4407
|
-
.menu-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4408
4363
|
.menu-desc {
|
|
4409
4364
|
font-size: var(--text-xs);
|
|
4410
4365
|
color: var(--muted);
|
|
@@ -4483,18 +4438,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4483
4438
|
flex-direction: column;
|
|
4484
4439
|
}
|
|
4485
4440
|
|
|
4486
|
-
.cmd-body { outline: none; display: flex; flex-direction: column; min-height: 0; }
|
|
4487
|
-
|
|
4488
|
-
.cmd-field {
|
|
4489
|
-
display: flex;
|
|
4490
|
-
align-items: center;
|
|
4491
|
-
gap: var(--space-2);
|
|
4492
|
-
padding: var(--space-3) var(--space-4);
|
|
4493
|
-
border-bottom: var(--border-width) solid var(--border);
|
|
4494
|
-
}
|
|
4495
|
-
|
|
4496
|
-
.cmd-mark { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4497
|
-
|
|
4498
4441
|
/* No border, no focus ring on the input itself: the whole surface is the
|
|
4499
4442
|
field, focus is already in it when it opens, and a ring around a box that
|
|
4500
4443
|
fills the top of the palette is a ring around the palette. */
|
|
@@ -4511,22 +4454,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4511
4454
|
|
|
4512
4455
|
.cmd-input::placeholder { color: var(--muted); }
|
|
4513
4456
|
|
|
4514
|
-
.cmd-list {
|
|
4515
|
-
padding: var(--space-2);
|
|
4516
|
-
overflow: auto;
|
|
4517
|
-
overscroll-behavior: contain;
|
|
4518
|
-
outline: none;
|
|
4519
|
-
min-height: 0;
|
|
4520
|
-
}
|
|
4521
|
-
|
|
4522
|
-
.cmd-group-title {
|
|
4523
|
-
padding: var(--space-2) var(--space-2) var(--space-1);
|
|
4524
|
-
font-size: var(--text-2xs);
|
|
4525
|
-
text-transform: uppercase;
|
|
4526
|
-
letter-spacing: var(--tracking);
|
|
4527
|
-
color: var(--muted);
|
|
4528
|
-
}
|
|
4529
|
-
|
|
4530
4457
|
.cmd-item {
|
|
4531
4458
|
display: flex;
|
|
4532
4459
|
align-items: center;
|
|
@@ -4562,8 +4489,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4562
4489
|
.cmd-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4563
4490
|
.cmd-item[data-focused] .cmd-icon { color: var(--text); }
|
|
4564
4491
|
|
|
4565
|
-
.cmd-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4566
|
-
.cmd-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4567
4492
|
.cmd-desc {
|
|
4568
4493
|
font-size: var(--text-xs);
|
|
4569
4494
|
color: var(--muted);
|
|
@@ -4765,25 +4690,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4765
4690
|
font-size: var(--text-2xs);
|
|
4766
4691
|
}
|
|
4767
4692
|
|
|
4768
|
-
.ident-text { display: grid; min-width: 0; }
|
|
4769
|
-
|
|
4770
|
-
.ident-name {
|
|
4771
|
-
overflow: hidden;
|
|
4772
|
-
text-overflow: ellipsis;
|
|
4773
|
-
white-space: nowrap;
|
|
4774
|
-
font-weight: var(--weight);
|
|
4775
|
-
}
|
|
4776
|
-
|
|
4777
|
-
.ident-address {
|
|
4778
|
-
overflow: hidden;
|
|
4779
|
-
text-overflow: ellipsis;
|
|
4780
|
-
white-space: nowrap;
|
|
4781
|
-
font-size: var(--text-xs);
|
|
4782
|
-
color: var(--muted);
|
|
4783
|
-
}
|
|
4784
|
-
|
|
4785
|
-
.ident-aside { flex: none; color: var(--muted); font-size: var(--text-xs); }
|
|
4786
|
-
|
|
4787
4693
|
/* A chip in a composer's To field: boxed, tighter, removable. */
|
|
4788
4694
|
.ident.kind-chip {
|
|
4789
4695
|
gap: var(--space-1);
|