@wtfalch/design 0.9.1 → 0.10.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 +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/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/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/valet.css
CHANGED
|
@@ -319,6 +319,9 @@
|
|
|
319
319
|
}
|
|
320
320
|
}
|
|
321
321
|
@layer utilities {
|
|
322
|
+
.pointer-events-none {
|
|
323
|
+
pointer-events: none;
|
|
324
|
+
}
|
|
322
325
|
.collapse {
|
|
323
326
|
visibility: collapse;
|
|
324
327
|
}
|
|
@@ -351,6 +354,9 @@
|
|
|
351
354
|
.sticky {
|
|
352
355
|
position: sticky;
|
|
353
356
|
}
|
|
357
|
+
.inset-0 {
|
|
358
|
+
inset: 0px;
|
|
359
|
+
}
|
|
354
360
|
.z-\[60\] {
|
|
355
361
|
z-index: 60;
|
|
356
362
|
}
|
|
@@ -384,12 +390,21 @@
|
|
|
384
390
|
.mt-1 {
|
|
385
391
|
margin-top: var(--spacing-1);
|
|
386
392
|
}
|
|
393
|
+
.mt-2 {
|
|
394
|
+
margin-top: var(--spacing-2);
|
|
395
|
+
}
|
|
396
|
+
.mt-px {
|
|
397
|
+
margin-top: 1px;
|
|
398
|
+
}
|
|
387
399
|
.mb-3 {
|
|
388
400
|
margin-bottom: var(--spacing-3);
|
|
389
401
|
}
|
|
390
402
|
.ml-2 {
|
|
391
403
|
margin-left: var(--spacing-2);
|
|
392
404
|
}
|
|
405
|
+
.ml-auto {
|
|
406
|
+
margin-left: auto;
|
|
407
|
+
}
|
|
393
408
|
.block {
|
|
394
409
|
display: block;
|
|
395
410
|
}
|
|
@@ -414,6 +429,9 @@
|
|
|
414
429
|
.table {
|
|
415
430
|
display: table;
|
|
416
431
|
}
|
|
432
|
+
.h-4 {
|
|
433
|
+
height: var(--spacing-4);
|
|
434
|
+
}
|
|
417
435
|
.h-\[14px\] {
|
|
418
436
|
height: 14px;
|
|
419
437
|
}
|
|
@@ -432,6 +450,9 @@
|
|
|
432
450
|
.min-h-screen {
|
|
433
451
|
min-height: 100vh;
|
|
434
452
|
}
|
|
453
|
+
.w-4 {
|
|
454
|
+
width: var(--spacing-4);
|
|
455
|
+
}
|
|
435
456
|
.w-\[18px\] {
|
|
436
457
|
width: 18px;
|
|
437
458
|
}
|
|
@@ -459,6 +480,18 @@
|
|
|
459
480
|
.flex-1 {
|
|
460
481
|
flex: 1;
|
|
461
482
|
}
|
|
483
|
+
.flex-\[0_0_var\(--split\)\] {
|
|
484
|
+
flex: 0 0 var(--split);
|
|
485
|
+
}
|
|
486
|
+
.flex-\[1_1_0\] {
|
|
487
|
+
flex: 1 1 0;
|
|
488
|
+
}
|
|
489
|
+
.flex-\[1_1_260px\] {
|
|
490
|
+
flex: 1 1 260px;
|
|
491
|
+
}
|
|
492
|
+
.flex-\[1_1_auto\] {
|
|
493
|
+
flex: 1 1 auto;
|
|
494
|
+
}
|
|
462
495
|
.flex-none {
|
|
463
496
|
flex: none;
|
|
464
497
|
}
|
|
@@ -489,6 +522,9 @@
|
|
|
489
522
|
.flex-wrap {
|
|
490
523
|
flex-wrap: wrap;
|
|
491
524
|
}
|
|
525
|
+
.place-items-center {
|
|
526
|
+
place-items: center;
|
|
527
|
+
}
|
|
492
528
|
.items-baseline {
|
|
493
529
|
align-items: baseline;
|
|
494
530
|
}
|
|
@@ -522,6 +558,9 @@
|
|
|
522
558
|
.gap-\[var\(--border-width\)\] {
|
|
523
559
|
gap: var(--border-width);
|
|
524
560
|
}
|
|
561
|
+
.gap-px {
|
|
562
|
+
gap: 1px;
|
|
563
|
+
}
|
|
525
564
|
.self-center {
|
|
526
565
|
align-self: center;
|
|
527
566
|
}
|
|
@@ -584,9 +623,15 @@
|
|
|
584
623
|
.p-2 {
|
|
585
624
|
padding: var(--spacing-2);
|
|
586
625
|
}
|
|
626
|
+
.p-3 {
|
|
627
|
+
padding: var(--spacing-3);
|
|
628
|
+
}
|
|
587
629
|
.p-4 {
|
|
588
630
|
padding: var(--spacing-4);
|
|
589
631
|
}
|
|
632
|
+
.px-2 {
|
|
633
|
+
padding-inline: var(--spacing-2);
|
|
634
|
+
}
|
|
590
635
|
.px-4 {
|
|
591
636
|
padding-inline: var(--spacing-4);
|
|
592
637
|
}
|
|
@@ -605,6 +650,12 @@
|
|
|
605
650
|
.py-10 {
|
|
606
651
|
padding-block: var(--spacing-10);
|
|
607
652
|
}
|
|
653
|
+
.pt-2 {
|
|
654
|
+
padding-top: var(--spacing-2);
|
|
655
|
+
}
|
|
656
|
+
.pb-1 {
|
|
657
|
+
padding-bottom: var(--spacing-1);
|
|
658
|
+
}
|
|
608
659
|
.pb-2 {
|
|
609
660
|
padding-bottom: var(--spacing-2);
|
|
610
661
|
}
|
|
@@ -620,6 +671,9 @@
|
|
|
620
671
|
.text-2xs {
|
|
621
672
|
font-size: var(--text-2xs);
|
|
622
673
|
}
|
|
674
|
+
.text-base {
|
|
675
|
+
font-size: var(--text-base);
|
|
676
|
+
}
|
|
623
677
|
.text-lg {
|
|
624
678
|
font-size: var(--text-lg);
|
|
625
679
|
}
|
|
@@ -641,6 +695,10 @@
|
|
|
641
695
|
--tw-leading: 1.25;
|
|
642
696
|
line-height: 1.25;
|
|
643
697
|
}
|
|
698
|
+
.leading-\[1\.35\] {
|
|
699
|
+
--tw-leading: 1.35;
|
|
700
|
+
line-height: 1.35;
|
|
701
|
+
}
|
|
644
702
|
.leading-\[16px\] {
|
|
645
703
|
--tw-leading: 16px;
|
|
646
704
|
line-height: 16px;
|
|
@@ -685,6 +743,9 @@
|
|
|
685
743
|
.opacity-60 {
|
|
686
744
|
opacity: 60%;
|
|
687
745
|
}
|
|
746
|
+
.opacity-90 {
|
|
747
|
+
opacity: 90%;
|
|
748
|
+
}
|
|
688
749
|
.opacity-\[0\.55\] {
|
|
689
750
|
opacity: 0.55;
|
|
690
751
|
}
|
|
@@ -1723,23 +1784,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1723
1784
|
template are allowed to diverge, and this is only saying that they have. */
|
|
1724
1785
|
.set-hint.drifted { color: var(--warn); }
|
|
1725
1786
|
|
|
1726
|
-
/* What an applet drew, read back. A tree rather than prose, so it is left as
|
|
1727
|
-
preformatted text and given a ceiling -- a busy applet is a hundred lines and
|
|
1728
|
-
this sits inside a settings pane. */
|
|
1729
|
-
.drawn {
|
|
1730
|
-
margin: var(--space-2) 0 0;
|
|
1731
|
-
padding: var(--space-2) var(--space-2);
|
|
1732
|
-
max-height: 220px;
|
|
1733
|
-
overflow: auto;
|
|
1734
|
-
font-size: var(--text-xs);
|
|
1735
|
-
line-height: 1.45;
|
|
1736
|
-
white-space: pre-wrap;
|
|
1737
|
-
overflow-wrap: anywhere;
|
|
1738
|
-
border: 1px solid var(--border);
|
|
1739
|
-
border-radius: var(--radius);
|
|
1740
|
-
background: var(--panel-2);
|
|
1741
|
-
}
|
|
1742
|
-
|
|
1743
1787
|
/* One applet, alone on the page, at `/applet/<id>`. Fills the window: there is
|
|
1744
1788
|
no grid here to decide a height, and a screenshot of an applet letterboxed
|
|
1745
1789
|
inside a page is mostly not the applet. */
|
|
@@ -1786,11 +1830,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1786
1830
|
that belongs to a conversation lives here any more, so it can breathe. */
|
|
1787
1831
|
.topbar .ctl-grow { flex: 1; min-width: 0; }
|
|
1788
1832
|
|
|
1789
|
-
/* Back on the left, Next on the right, with the gap between them doing the
|
|
1790
|
-
separating -- so the button that goes forward is in the same place on both
|
|
1791
|
-
pages instead of sliding when Back appears. */
|
|
1792
|
-
.first-run-actions { align-items: center; }
|
|
1793
|
-
|
|
1794
1833
|
@keyframes listening-pulse { 0%, 100% { opacity: 1 } 50% { opacity: .35 } }
|
|
1795
1834
|
|
|
1796
1835
|
/* table ---------------------------------------------------------------- */
|
|
@@ -2131,8 +2170,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2131
2170
|
border-radius: 4px;
|
|
2132
2171
|
}
|
|
2133
2172
|
|
|
2134
|
-
.danger-unavailable { margin-top: var(--space-2); opacity: 0.85; }
|
|
2135
|
-
|
|
2136
2173
|
/* Label beside the control, for a settings pane: a column of names on the left
|
|
2137
2174
|
and their controls on the right reads as a list of what is set, where the
|
|
2138
2175
|
same rows stacked read as a form waiting to be filled in. The description
|
|
@@ -2210,8 +2247,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2210
2247
|
/* A callout that leaves on its own.
|
|
2211
2248
|
Room at the bottom for the bar, and `position: relative` so the bar can sit
|
|
2212
2249
|
on the border rather than inside the text. */
|
|
2213
|
-
.callout-timed { position: relative; padding-bottom: var(--space-5); overflow: hidden; }
|
|
2214
|
-
|
|
2215
2250
|
/* The countdown. Drawn as a shrinking bar rather than a number: nobody wants to
|
|
2216
2251
|
read a clock, they want to know whether they have time. Animated width rather
|
|
2217
2252
|
than a transition, so it starts the moment it is painted. */
|
|
@@ -2272,14 +2307,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2272
2307
|
is the operating system's font drawing a glyph beside an app that has an icon
|
|
2273
2308
|
set for exactly this. The ring went with it: a circle around a warning
|
|
2274
2309
|
triangle is two shapes saying one thing. */
|
|
2275
|
-
.callout-mark {
|
|
2276
|
-
flex: none;
|
|
2277
|
-
display: grid;
|
|
2278
|
-
place-items: center;
|
|
2279
|
-
margin-top: 1px;
|
|
2280
|
-
opacity: 0.9;
|
|
2281
|
-
}
|
|
2282
|
-
|
|
2283
2310
|
/* Held-back history when a local conversation would cross to a hosted model.
|
|
2284
2311
|
Deliberately loud: the cost of missing it is uploading work that was kept
|
|
2285
2312
|
local on purpose. */
|
|
@@ -2295,6 +2322,19 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2295
2322
|
}
|
|
2296
2323
|
|
|
2297
2324
|
.callout button { flex: none; }
|
|
2325
|
+
/* A state, so it stays a class.
|
|
2326
|
+
*
|
|
2327
|
+
* `Callout` applies this as `running ? ' callout-timed' : ''` inside a
|
|
2328
|
+
* template literal -- which is not a class list a rewrite can read, and the
|
|
2329
|
+
* first pass at converting it deleted the rule while leaving the usage. The
|
|
2330
|
+
* box lost five spacing steps of padding and the countdown bar had nothing
|
|
2331
|
+
* to sit in. A class that appears only inside a conditional is a state; the
|
|
2332
|
+
* sheet is where those belong. */
|
|
2333
|
+
.callout-timed {
|
|
2334
|
+
position: relative;
|
|
2335
|
+
padding-bottom: var(--space-5);
|
|
2336
|
+
overflow: hidden;
|
|
2337
|
+
}
|
|
2298
2338
|
}
|
|
2299
2339
|
|
|
2300
2340
|
/* ---- ./card.css ---- */
|
|
@@ -2353,16 +2393,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2353
2393
|
which reads as a different column of content. */
|
|
2354
2394
|
.card:has(.card-icon) .card-inline { padding-left: calc(var(--card-icon) + var(--space-3)); }
|
|
2355
2395
|
|
|
2356
|
-
/* Its own line, above the sentence it introduces. */
|
|
2357
|
-
.card-inline-label {
|
|
2358
|
-
display: block;
|
|
2359
|
-
font-size: var(--text-xs);
|
|
2360
|
-
text-transform: uppercase;
|
|
2361
|
-
letter-spacing: 0.04em;
|
|
2362
|
-
color: var(--muted);
|
|
2363
|
-
margin-bottom: 2px;
|
|
2364
|
-
}
|
|
2365
|
-
|
|
2366
2396
|
.card-title { display: block; font-size: var(--text-base); }
|
|
2367
2397
|
|
|
2368
2398
|
.card-desc { margin-top: var(--space-1); color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
@@ -2500,12 +2530,8 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2500
2530
|
tooltip ended up orphaned under it. */
|
|
2501
2531
|
.set-row > .switch-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
2502
2532
|
|
|
2503
|
-
.switch-label { color: var(--text); }
|
|
2504
|
-
|
|
2505
2533
|
.switch-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
2506
2534
|
|
|
2507
|
-
.switch-said { flex: none; font-size: var(--text-xs); color: var(--muted); }
|
|
2508
|
-
|
|
2509
2535
|
/* Three sizes, the same names every other control uses. The switch scales with
|
|
2510
2536
|
the row: a 30x18 track beside 12px text is a different control from the same
|
|
2511
2537
|
track beside 16px text. */
|
|
@@ -2678,17 +2704,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2678
2704
|
|
|
2679
2705
|
/* ---- ./skeleton.css ---- */
|
|
2680
2706
|
@layer components {
|
|
2681
|
-
.muted { color: var(--muted); }
|
|
2682
|
-
|
|
2683
|
-
.pulse-block {
|
|
2684
|
-
display: inline-block;
|
|
2685
|
-
height: 8px;
|
|
2686
|
-
border-radius: var(--radius-sm);
|
|
2687
|
-
background: var(--muted);
|
|
2688
|
-
animation: ds-pulse 1.4s ease-in-out infinite;
|
|
2689
|
-
vertical-align: middle;
|
|
2690
|
-
}
|
|
2691
|
-
|
|
2692
2707
|
/* skeletons ------------------------------------------------------------ */
|
|
2693
2708
|
|
|
2694
2709
|
/* Ink at low alpha, not a named surface.
|
|
@@ -2947,8 +2962,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2947
2962
|
|
|
2948
2963
|
.rows-split:first-of-type { margin-top: var(--space-2); }
|
|
2949
2964
|
|
|
2950
|
-
.rows-empty { padding: var(--space-3) 0; }
|
|
2951
|
-
|
|
2952
2965
|
/* The name, the pills and the line underneath. `min-width: 0` is the whole
|
|
2953
2966
|
reason this is a class: a flex item will not shrink below its content, so
|
|
2954
2967
|
without it the name pushes the pills off the end -- and the pills are the
|
|
@@ -2965,8 +2978,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2965
2978
|
|
|
2966
2979
|
/* The aligned column. `margin-left: auto` rather than a grid, because the rows
|
|
2967
2980
|
are flex and a size that varies by two characters does not need a track. */
|
|
2968
|
-
.row-trail { flex: none; margin-left: auto; white-space: nowrap; }
|
|
2969
|
-
|
|
2970
2981
|
.rows-row.rows-top { align-items: flex-start; }
|
|
2971
2982
|
|
|
2972
2983
|
.rows-row.rows-bad .truncate { color: var(--bad); }
|
|
@@ -3112,14 +3123,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3112
3123
|
|
|
3113
3124
|
.tabs-vertical .tab.on .tab-label { color: var(--accent); }
|
|
3114
3125
|
|
|
3115
|
-
.tab-hint {
|
|
3116
|
-
display: block;
|
|
3117
|
-
margin-top: 1px;
|
|
3118
|
-
font-size: var(--text-xs);
|
|
3119
|
-
color: var(--muted);
|
|
3120
|
-
line-height: 1.35;
|
|
3121
|
-
}
|
|
3122
|
-
|
|
3123
3126
|
/* A heading above a run of tabs. Set apart from the run above by space, not
|
|
3124
3127
|
a rule -- the rail already has one edge -- and the tabs under it step in
|
|
3125
3128
|
by the label's own padding so the label reads as theirs. */
|
|
@@ -3130,8 +3133,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3130
3133
|
|
|
3131
3134
|
.tabs-vertical .tab-group:first-child { padding-top: var(--space-2); }
|
|
3132
3135
|
|
|
3133
|
-
.tab-group-label { display: block; font-size: var(--text-sm); font-weight: 600; color: var(--text); }
|
|
3134
|
-
|
|
3135
3136
|
.tabs-vertical .tab.in-group { padding-left: var(--space-5); }
|
|
3136
3137
|
|
|
3137
3138
|
/* No line under a vertical strip -- its edge is the border on the right. */
|
|
@@ -3341,8 +3342,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3341
3342
|
`<strong>` rule above is the one that sets the size. */
|
|
3342
3343
|
/* Under the title, on the header's padding rather than the body's, so it reads
|
|
3343
3344
|
as part of the heading rather than as the first line of content. */
|
|
3344
|
-
.modal-desc { line-height: 1.5; }
|
|
3345
|
-
|
|
3346
3345
|
.modal-body { padding: var(--space-2) var(--space-4) var(--space-3); overflow-y: auto; }
|
|
3347
3346
|
|
|
3348
3347
|
/* The close cross. Its rule stayed behind in tf's stylesheet when the split
|
|
@@ -3510,12 +3509,8 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3510
3509
|
|
|
3511
3510
|
.slider-row.is-disabled { opacity: 0.55; }
|
|
3512
3511
|
|
|
3513
|
-
.slider-body { flex: 1 1 260px; min-width: 0; display: grid; gap: 1px; }
|
|
3514
|
-
|
|
3515
3512
|
.set-row > .slider-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
3516
3513
|
|
|
3517
|
-
.slider-label { color: var(--text); }
|
|
3518
|
-
|
|
3519
3514
|
.slider-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
3520
3515
|
|
|
3521
3516
|
/* The box, with the value printed inside it at the right where a select
|
|
@@ -3741,8 +3736,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3741
3736
|
/* A run of checkboxes is one choice, not several settings that happen to be
|
|
3742
3737
|
adjacent. Tight enough that the group reads as a block -- at the spacing a
|
|
3743
3738
|
form field wants, four tools look like four unrelated questions. */
|
|
3744
|
-
.choice-group { display: grid; gap: var(--space-1); }
|
|
3745
|
-
|
|
3746
3739
|
/* The same choice, laid out as tiles instead of a column.
|
|
3747
3740
|
|
|
3748
3741
|
Four short names down the full width of a card is four wide bands for four
|
|
@@ -3866,8 +3859,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3866
3859
|
second line is what the first line is actually asking for. */
|
|
3867
3860
|
.choice-why { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 1px; }
|
|
3868
3861
|
|
|
3869
|
-
.choice-meta { color: var(--muted); font-size: var(--text-xs); font-family: var(--font-mono); }
|
|
3870
|
-
|
|
3871
3862
|
.choice[data-disabled] {
|
|
3872
3863
|
cursor: not-allowed;
|
|
3873
3864
|
border-color: var(--border);
|
|
@@ -4064,8 +4055,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4064
4055
|
reason they can live in an app with four palettes: `ink` becomes the current
|
|
4065
4056
|
text colour and `paper` becomes the surface behind it, so one file covers
|
|
4066
4057
|
Night, Paper and both halves of System. Give the wrapper a `color` and
|
|
4067
|
-
the figure follows it
|
|
4068
|
-
one thing on screen worth looking at.
|
|
4058
|
+
the figure follows it: `--muted` for a quiet empty state, `--accent` for the
|
|
4059
|
+
one thing on screen worth looking at. Set that colour on the wrapper --
|
|
4060
|
+
`Empty` reaches for `text-muted`, and any token works. */
|
|
4069
4061
|
.illo {
|
|
4070
4062
|
display: inline-block;
|
|
4071
4063
|
/* Height is the given dimension and the width comes from the drawing, so a
|
|
@@ -4082,18 +4074,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4082
4074
|
caller says otherwise. Not `transparent`: these have overlapping shapes, and
|
|
4083
4075
|
a shirt that lets the arm behind it show through reads as a hole. */
|
|
4084
4076
|
.illo .paper { fill: var(--illo-paper); }
|
|
4085
|
-
|
|
4086
|
-
/* The figure in a whole-surface `Empty`, drawn in the muted grey of the
|
|
4087
|
-
sentence under it.
|
|
4088
|
-
*
|
|
4089
|
-
* A utility cannot do this, and the reason is worth keeping: `.illo` sets
|
|
4090
|
-
* `color: inherit` and is unlayered, while every Tailwind utility lives in
|
|
4091
|
-
* `@layer utilities` -- and an unlayered declaration beats a layered one
|
|
4092
|
-
* whatever the specificity. So `text-muted` on the figure lost, silently,
|
|
4093
|
-
* and the shirt came out full text black beside a muted sentence. The
|
|
4094
|
-
* original rule already carried a note about needing two classes to beat
|
|
4095
|
-
* `.illo`; layers make that impossible rather than merely fiddly. */
|
|
4096
|
-
.nothing-figure { color: var(--muted); }
|
|
4097
4077
|
}
|
|
4098
4078
|
|
|
4099
4079
|
/* ---- ./field.css ---- */
|
|
@@ -4105,7 +4085,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4105
4085
|
to what was typed, so it goes after. */
|
|
4106
4086
|
.field { display: grid; gap: var(--space-1); }
|
|
4107
4087
|
|
|
4108
|
-
|
|
4088
|
+
/* `.field-stack-layout` carries no rules: stacking is what `.field` already
|
|
4089
|
+
does, and the class is emitted only so that both layouts name themselves
|
|
4090
|
+
the same way (`field-${layout}-layout`). Only the row layout overrides. */
|
|
4109
4091
|
|
|
4110
4092
|
.field-row-layout > .field-label { grid-column: 1; }
|
|
4111
4093
|
|
|
@@ -4126,8 +4108,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4126
4108
|
|
|
4127
4109
|
/* Not red. The asterisk marks which fields are required; colouring it the same
|
|
4128
4110
|
as a failure says something has already gone wrong with every one of them. */
|
|
4129
|
-
.field-required { color: var(--muted); }
|
|
4130
|
-
|
|
4131
4111
|
.field-hint,
|
|
4132
4112
|
.field-error { margin: 0; font-size: var(--text-sm); line-height: 1.45; }
|
|
4133
4113
|
|
|
@@ -4149,8 +4129,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4149
4129
|
/* Fields stacked down a form. Wider than the gap inside one field, so the
|
|
4150
4130
|
label of the next belongs to the input under it rather than to the error
|
|
4151
4131
|
above it. */
|
|
4152
|
-
.field-stack { display: grid; gap: var(--space-4); }
|
|
4153
|
-
|
|
4154
4132
|
.field-row > .field { flex: 1; min-width: 0; }
|
|
4155
4133
|
|
|
4156
4134
|
/* A password with an eye -- `Input type="password"`.
|
|
@@ -4278,10 +4256,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4278
4256
|
@layer components {
|
|
4279
4257
|
/* tour ----------------------------------------------------------------- */
|
|
4280
4258
|
|
|
4281
|
-
/* The layer sits over everything and catches nothing: the scrim is painted by
|
|
4282
|
-
the hole's shadow, so there is no full-screen element to swallow a click. */
|
|
4283
|
-
.tour { position: fixed; inset: 0; z-index: 60; pointer-events: none; }
|
|
4284
|
-
|
|
4285
4259
|
/* The control the tour is currently pointing at.
|
|
4286
4260
|
|
|
4287
4261
|
Much of this chrome is invisible until you touch it -- `.view-add` lives at
|
|
@@ -4292,11 +4266,14 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4292
4266
|
what every control does at rest, and the alternative is naming each one here
|
|
4293
4267
|
and watching that list drift from the rules that hide them. One declaration
|
|
4294
4268
|
that outranks whatever the resting state is beats an enumeration that goes
|
|
4295
|
-
stale. It is scoped to a class only ever present on one element at a time.
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4269
|
+
stale. It is scoped to a class only ever present on one element at a time.
|
|
4270
|
+
|
|
4271
|
+
Opacity and nothing else. This forced `color: var(--text)` too, from the
|
|
4272
|
+
original port, with no case on record that needed it -- and it broke the
|
|
4273
|
+
first target that painted its own background, turning a primary button's
|
|
4274
|
+
label dark on accent at 2.2:1. The spotlight makes a control visible; what
|
|
4275
|
+
colour it is at rest is the control's business. */
|
|
4276
|
+
.tour-target { opacity: 1 !important; }
|
|
4300
4277
|
|
|
4301
4278
|
/* The spotlight. An enormous spread shadow dims the whole window except the
|
|
4302
4279
|
rectangle it is drawn on, which needs no clip path and no arithmetic. */
|
|
@@ -4330,8 +4307,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4330
4307
|
|
|
4331
4308
|
.tour-card:focus { outline: none; }
|
|
4332
4309
|
|
|
4333
|
-
.tour-title { font-size: var(--text-base); }
|
|
4334
|
-
|
|
4335
4310
|
.tour-body { margin: 0; color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
4336
4311
|
|
|
4337
4312
|
.tour-actions { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-2); }
|
|
@@ -4503,17 +4478,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4503
4478
|
the intrinsic width of a mail list is the longest unbroken subject line in
|
|
4504
4479
|
it. Without this the handle stops partway across and nothing on screen says
|
|
4505
4480
|
why -- it just refuses, differently for every mailbox. */
|
|
4506
|
-
.split-pane {
|
|
4507
|
-
min-width: 0;
|
|
4508
|
-
min-height: 0;
|
|
4509
|
-
overflow: hidden;
|
|
4510
|
-
display: flex;
|
|
4511
|
-
flex-direction: column;
|
|
4512
|
-
}
|
|
4513
|
-
|
|
4514
|
-
.split-first { flex: 0 0 var(--split); }
|
|
4515
|
-
.split-second { flex: 1 1 0; }
|
|
4516
|
-
|
|
4517
4481
|
/* The handle is wider than it looks: a hairline is a correct-looking divider
|
|
4518
4482
|
and an impossible pointer target. The grip is the line, drawn at
|
|
4519
4483
|
`--border-width` down the middle of a `--space-3` strip, and the strip is
|
|
@@ -4610,13 +4574,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4610
4574
|
z-index: 60;
|
|
4611
4575
|
}
|
|
4612
4576
|
|
|
4613
|
-
.pop-body {
|
|
4614
|
-
padding: var(--space-3);
|
|
4615
|
-
outline: none;
|
|
4616
|
-
color: var(--text);
|
|
4617
|
-
font-size: var(--text-sm);
|
|
4618
|
-
}
|
|
4619
|
-
|
|
4620
4577
|
/* Entry, and the direction it comes from. `data-placement` is React Aria's,
|
|
4621
4578
|
set to where the surface actually went rather than where it was asked to go,
|
|
4622
4579
|
so the movement agrees with the flip. */
|
|
@@ -4677,8 +4634,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4677
4634
|
.menu-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4678
4635
|
.menu-item[data-focused] .menu-icon { color: var(--text); }
|
|
4679
4636
|
|
|
4680
|
-
.menu-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4681
|
-
.menu-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4682
4637
|
.menu-desc {
|
|
4683
4638
|
font-size: var(--text-xs);
|
|
4684
4639
|
color: var(--muted);
|
|
@@ -4757,18 +4712,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4757
4712
|
flex-direction: column;
|
|
4758
4713
|
}
|
|
4759
4714
|
|
|
4760
|
-
.cmd-body { outline: none; display: flex; flex-direction: column; min-height: 0; }
|
|
4761
|
-
|
|
4762
|
-
.cmd-field {
|
|
4763
|
-
display: flex;
|
|
4764
|
-
align-items: center;
|
|
4765
|
-
gap: var(--space-2);
|
|
4766
|
-
padding: var(--space-3) var(--space-4);
|
|
4767
|
-
border-bottom: var(--border-width) solid var(--border);
|
|
4768
|
-
}
|
|
4769
|
-
|
|
4770
|
-
.cmd-mark { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4771
|
-
|
|
4772
4715
|
/* No border, no focus ring on the input itself: the whole surface is the
|
|
4773
4716
|
field, focus is already in it when it opens, and a ring around a box that
|
|
4774
4717
|
fills the top of the palette is a ring around the palette. */
|
|
@@ -4785,22 +4728,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4785
4728
|
|
|
4786
4729
|
.cmd-input::placeholder { color: var(--muted); }
|
|
4787
4730
|
|
|
4788
|
-
.cmd-list {
|
|
4789
|
-
padding: var(--space-2);
|
|
4790
|
-
overflow: auto;
|
|
4791
|
-
overscroll-behavior: contain;
|
|
4792
|
-
outline: none;
|
|
4793
|
-
min-height: 0;
|
|
4794
|
-
}
|
|
4795
|
-
|
|
4796
|
-
.cmd-group-title {
|
|
4797
|
-
padding: var(--space-2) var(--space-2) var(--space-1);
|
|
4798
|
-
font-size: var(--text-2xs);
|
|
4799
|
-
text-transform: uppercase;
|
|
4800
|
-
letter-spacing: var(--tracking);
|
|
4801
|
-
color: var(--muted);
|
|
4802
|
-
}
|
|
4803
|
-
|
|
4804
4731
|
.cmd-item {
|
|
4805
4732
|
display: flex;
|
|
4806
4733
|
align-items: center;
|
|
@@ -4836,8 +4763,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4836
4763
|
.cmd-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4837
4764
|
.cmd-item[data-focused] .cmd-icon { color: var(--text); }
|
|
4838
4765
|
|
|
4839
|
-
.cmd-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4840
|
-
.cmd-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4841
4766
|
.cmd-desc {
|
|
4842
4767
|
font-size: var(--text-xs);
|
|
4843
4768
|
color: var(--muted);
|
|
@@ -5039,25 +4964,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
5039
4964
|
font-size: var(--text-2xs);
|
|
5040
4965
|
}
|
|
5041
4966
|
|
|
5042
|
-
.ident-text { display: grid; min-width: 0; }
|
|
5043
|
-
|
|
5044
|
-
.ident-name {
|
|
5045
|
-
overflow: hidden;
|
|
5046
|
-
text-overflow: ellipsis;
|
|
5047
|
-
white-space: nowrap;
|
|
5048
|
-
font-weight: var(--weight);
|
|
5049
|
-
}
|
|
5050
|
-
|
|
5051
|
-
.ident-address {
|
|
5052
|
-
overflow: hidden;
|
|
5053
|
-
text-overflow: ellipsis;
|
|
5054
|
-
white-space: nowrap;
|
|
5055
|
-
font-size: var(--text-xs);
|
|
5056
|
-
color: var(--muted);
|
|
5057
|
-
}
|
|
5058
|
-
|
|
5059
|
-
.ident-aside { flex: none; color: var(--muted); font-size: var(--text-xs); }
|
|
5060
|
-
|
|
5061
4967
|
/* A chip in a composer's To field: boxed, tighter, removable. */
|
|
5062
4968
|
.ident.kind-chip {
|
|
5063
4969
|
gap: var(--space-1);
|