@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/tf.css
CHANGED
|
@@ -315,6 +315,9 @@
|
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
@layer utilities {
|
|
318
|
+
.pointer-events-none {
|
|
319
|
+
pointer-events: none;
|
|
320
|
+
}
|
|
318
321
|
.collapse {
|
|
319
322
|
visibility: collapse;
|
|
320
323
|
}
|
|
@@ -347,6 +350,9 @@
|
|
|
347
350
|
.sticky {
|
|
348
351
|
position: sticky;
|
|
349
352
|
}
|
|
353
|
+
.inset-0 {
|
|
354
|
+
inset: 0px;
|
|
355
|
+
}
|
|
350
356
|
.z-\[60\] {
|
|
351
357
|
z-index: 60;
|
|
352
358
|
}
|
|
@@ -380,12 +386,21 @@
|
|
|
380
386
|
.mt-1 {
|
|
381
387
|
margin-top: var(--spacing-1);
|
|
382
388
|
}
|
|
389
|
+
.mt-2 {
|
|
390
|
+
margin-top: var(--spacing-2);
|
|
391
|
+
}
|
|
392
|
+
.mt-px {
|
|
393
|
+
margin-top: 1px;
|
|
394
|
+
}
|
|
383
395
|
.mb-3 {
|
|
384
396
|
margin-bottom: var(--spacing-3);
|
|
385
397
|
}
|
|
386
398
|
.ml-2 {
|
|
387
399
|
margin-left: var(--spacing-2);
|
|
388
400
|
}
|
|
401
|
+
.ml-auto {
|
|
402
|
+
margin-left: auto;
|
|
403
|
+
}
|
|
389
404
|
.block {
|
|
390
405
|
display: block;
|
|
391
406
|
}
|
|
@@ -410,6 +425,9 @@
|
|
|
410
425
|
.table {
|
|
411
426
|
display: table;
|
|
412
427
|
}
|
|
428
|
+
.h-4 {
|
|
429
|
+
height: var(--spacing-4);
|
|
430
|
+
}
|
|
413
431
|
.h-\[14px\] {
|
|
414
432
|
height: 14px;
|
|
415
433
|
}
|
|
@@ -428,6 +446,9 @@
|
|
|
428
446
|
.min-h-screen {
|
|
429
447
|
min-height: 100vh;
|
|
430
448
|
}
|
|
449
|
+
.w-4 {
|
|
450
|
+
width: var(--spacing-4);
|
|
451
|
+
}
|
|
431
452
|
.w-\[18px\] {
|
|
432
453
|
width: 18px;
|
|
433
454
|
}
|
|
@@ -455,6 +476,18 @@
|
|
|
455
476
|
.flex-1 {
|
|
456
477
|
flex: 1;
|
|
457
478
|
}
|
|
479
|
+
.flex-\[0_0_var\(--split\)\] {
|
|
480
|
+
flex: 0 0 var(--split);
|
|
481
|
+
}
|
|
482
|
+
.flex-\[1_1_0\] {
|
|
483
|
+
flex: 1 1 0;
|
|
484
|
+
}
|
|
485
|
+
.flex-\[1_1_260px\] {
|
|
486
|
+
flex: 1 1 260px;
|
|
487
|
+
}
|
|
488
|
+
.flex-\[1_1_auto\] {
|
|
489
|
+
flex: 1 1 auto;
|
|
490
|
+
}
|
|
458
491
|
.flex-none {
|
|
459
492
|
flex: none;
|
|
460
493
|
}
|
|
@@ -485,6 +518,9 @@
|
|
|
485
518
|
.flex-wrap {
|
|
486
519
|
flex-wrap: wrap;
|
|
487
520
|
}
|
|
521
|
+
.place-items-center {
|
|
522
|
+
place-items: center;
|
|
523
|
+
}
|
|
488
524
|
.items-baseline {
|
|
489
525
|
align-items: baseline;
|
|
490
526
|
}
|
|
@@ -518,6 +554,9 @@
|
|
|
518
554
|
.gap-\[var\(--border-width\)\] {
|
|
519
555
|
gap: var(--border-width);
|
|
520
556
|
}
|
|
557
|
+
.gap-px {
|
|
558
|
+
gap: 1px;
|
|
559
|
+
}
|
|
521
560
|
.self-center {
|
|
522
561
|
align-self: center;
|
|
523
562
|
}
|
|
@@ -580,9 +619,15 @@
|
|
|
580
619
|
.p-2 {
|
|
581
620
|
padding: var(--spacing-2);
|
|
582
621
|
}
|
|
622
|
+
.p-3 {
|
|
623
|
+
padding: var(--spacing-3);
|
|
624
|
+
}
|
|
583
625
|
.p-4 {
|
|
584
626
|
padding: var(--spacing-4);
|
|
585
627
|
}
|
|
628
|
+
.px-2 {
|
|
629
|
+
padding-inline: var(--spacing-2);
|
|
630
|
+
}
|
|
586
631
|
.px-4 {
|
|
587
632
|
padding-inline: var(--spacing-4);
|
|
588
633
|
}
|
|
@@ -601,6 +646,12 @@
|
|
|
601
646
|
.py-10 {
|
|
602
647
|
padding-block: var(--spacing-10);
|
|
603
648
|
}
|
|
649
|
+
.pt-2 {
|
|
650
|
+
padding-top: var(--spacing-2);
|
|
651
|
+
}
|
|
652
|
+
.pb-1 {
|
|
653
|
+
padding-bottom: var(--spacing-1);
|
|
654
|
+
}
|
|
604
655
|
.pb-2 {
|
|
605
656
|
padding-bottom: var(--spacing-2);
|
|
606
657
|
}
|
|
@@ -616,6 +667,9 @@
|
|
|
616
667
|
.text-2xs {
|
|
617
668
|
font-size: var(--text-2xs);
|
|
618
669
|
}
|
|
670
|
+
.text-base {
|
|
671
|
+
font-size: var(--text-base);
|
|
672
|
+
}
|
|
619
673
|
.text-lg {
|
|
620
674
|
font-size: var(--text-lg);
|
|
621
675
|
}
|
|
@@ -637,6 +691,10 @@
|
|
|
637
691
|
--tw-leading: 1.25;
|
|
638
692
|
line-height: 1.25;
|
|
639
693
|
}
|
|
694
|
+
.leading-\[1\.35\] {
|
|
695
|
+
--tw-leading: 1.35;
|
|
696
|
+
line-height: 1.35;
|
|
697
|
+
}
|
|
640
698
|
.leading-\[16px\] {
|
|
641
699
|
--tw-leading: 16px;
|
|
642
700
|
line-height: 16px;
|
|
@@ -681,6 +739,9 @@
|
|
|
681
739
|
.opacity-60 {
|
|
682
740
|
opacity: 60%;
|
|
683
741
|
}
|
|
742
|
+
.opacity-90 {
|
|
743
|
+
opacity: 90%;
|
|
744
|
+
}
|
|
684
745
|
.opacity-\[0\.55\] {
|
|
685
746
|
opacity: 0.55;
|
|
686
747
|
}
|
|
@@ -1719,23 +1780,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1719
1780
|
template are allowed to diverge, and this is only saying that they have. */
|
|
1720
1781
|
.set-hint.drifted { color: var(--warn); }
|
|
1721
1782
|
|
|
1722
|
-
/* What an applet drew, read back. A tree rather than prose, so it is left as
|
|
1723
|
-
preformatted text and given a ceiling -- a busy applet is a hundred lines and
|
|
1724
|
-
this sits inside a settings pane. */
|
|
1725
|
-
.drawn {
|
|
1726
|
-
margin: var(--space-2) 0 0;
|
|
1727
|
-
padding: var(--space-2) var(--space-2);
|
|
1728
|
-
max-height: 220px;
|
|
1729
|
-
overflow: auto;
|
|
1730
|
-
font-size: var(--text-xs);
|
|
1731
|
-
line-height: 1.45;
|
|
1732
|
-
white-space: pre-wrap;
|
|
1733
|
-
overflow-wrap: anywhere;
|
|
1734
|
-
border: 1px solid var(--border);
|
|
1735
|
-
border-radius: var(--radius);
|
|
1736
|
-
background: var(--panel-2);
|
|
1737
|
-
}
|
|
1738
|
-
|
|
1739
1783
|
/* One applet, alone on the page, at `/applet/<id>`. Fills the window: there is
|
|
1740
1784
|
no grid here to decide a height, and a screenshot of an applet letterboxed
|
|
1741
1785
|
inside a page is mostly not the applet. */
|
|
@@ -1782,11 +1826,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
1782
1826
|
that belongs to a conversation lives here any more, so it can breathe. */
|
|
1783
1827
|
.topbar .ctl-grow { flex: 1; min-width: 0; }
|
|
1784
1828
|
|
|
1785
|
-
/* Back on the left, Next on the right, with the gap between them doing the
|
|
1786
|
-
separating -- so the button that goes forward is in the same place on both
|
|
1787
|
-
pages instead of sliding when Back appears. */
|
|
1788
|
-
.first-run-actions { align-items: center; }
|
|
1789
|
-
|
|
1790
1829
|
@keyframes listening-pulse { 0%, 100% { opacity: 1 } 50% { opacity: .35 } }
|
|
1791
1830
|
|
|
1792
1831
|
/* table ---------------------------------------------------------------- */
|
|
@@ -2127,8 +2166,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2127
2166
|
border-radius: 4px;
|
|
2128
2167
|
}
|
|
2129
2168
|
|
|
2130
|
-
.danger-unavailable { margin-top: var(--space-2); opacity: 0.85; }
|
|
2131
|
-
|
|
2132
2169
|
/* Label beside the control, for a settings pane: a column of names on the left
|
|
2133
2170
|
and their controls on the right reads as a list of what is set, where the
|
|
2134
2171
|
same rows stacked read as a form waiting to be filled in. The description
|
|
@@ -2206,8 +2243,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2206
2243
|
/* A callout that leaves on its own.
|
|
2207
2244
|
Room at the bottom for the bar, and `position: relative` so the bar can sit
|
|
2208
2245
|
on the border rather than inside the text. */
|
|
2209
|
-
.callout-timed { position: relative; padding-bottom: var(--space-5); overflow: hidden; }
|
|
2210
|
-
|
|
2211
2246
|
/* The countdown. Drawn as a shrinking bar rather than a number: nobody wants to
|
|
2212
2247
|
read a clock, they want to know whether they have time. Animated width rather
|
|
2213
2248
|
than a transition, so it starts the moment it is painted. */
|
|
@@ -2268,14 +2303,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2268
2303
|
is the operating system's font drawing a glyph beside an app that has an icon
|
|
2269
2304
|
set for exactly this. The ring went with it: a circle around a warning
|
|
2270
2305
|
triangle is two shapes saying one thing. */
|
|
2271
|
-
.callout-mark {
|
|
2272
|
-
flex: none;
|
|
2273
|
-
display: grid;
|
|
2274
|
-
place-items: center;
|
|
2275
|
-
margin-top: 1px;
|
|
2276
|
-
opacity: 0.9;
|
|
2277
|
-
}
|
|
2278
|
-
|
|
2279
2306
|
/* Held-back history when a local conversation would cross to a hosted model.
|
|
2280
2307
|
Deliberately loud: the cost of missing it is uploading work that was kept
|
|
2281
2308
|
local on purpose. */
|
|
@@ -2291,6 +2318,19 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2291
2318
|
}
|
|
2292
2319
|
|
|
2293
2320
|
.callout button { flex: none; }
|
|
2321
|
+
/* A state, so it stays a class.
|
|
2322
|
+
*
|
|
2323
|
+
* `Callout` applies this as `running ? ' callout-timed' : ''` inside a
|
|
2324
|
+
* template literal -- which is not a class list a rewrite can read, and the
|
|
2325
|
+
* first pass at converting it deleted the rule while leaving the usage. The
|
|
2326
|
+
* box lost five spacing steps of padding and the countdown bar had nothing
|
|
2327
|
+
* to sit in. A class that appears only inside a conditional is a state; the
|
|
2328
|
+
* sheet is where those belong. */
|
|
2329
|
+
.callout-timed {
|
|
2330
|
+
position: relative;
|
|
2331
|
+
padding-bottom: var(--space-5);
|
|
2332
|
+
overflow: hidden;
|
|
2333
|
+
}
|
|
2294
2334
|
}
|
|
2295
2335
|
|
|
2296
2336
|
/* ---- ./card.css ---- */
|
|
@@ -2349,16 +2389,6 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2349
2389
|
which reads as a different column of content. */
|
|
2350
2390
|
.card:has(.card-icon) .card-inline { padding-left: calc(var(--card-icon) + var(--space-3)); }
|
|
2351
2391
|
|
|
2352
|
-
/* Its own line, above the sentence it introduces. */
|
|
2353
|
-
.card-inline-label {
|
|
2354
|
-
display: block;
|
|
2355
|
-
font-size: var(--text-xs);
|
|
2356
|
-
text-transform: uppercase;
|
|
2357
|
-
letter-spacing: 0.04em;
|
|
2358
|
-
color: var(--muted);
|
|
2359
|
-
margin-bottom: 2px;
|
|
2360
|
-
}
|
|
2361
|
-
|
|
2362
2392
|
.card-title { display: block; font-size: var(--text-base); }
|
|
2363
2393
|
|
|
2364
2394
|
.card-desc { margin-top: var(--space-1); color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
@@ -2496,12 +2526,8 @@ input:active, textarea:active, select:active { transform: none; }
|
|
|
2496
2526
|
tooltip ended up orphaned under it. */
|
|
2497
2527
|
.set-row > .switch-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
2498
2528
|
|
|
2499
|
-
.switch-label { color: var(--text); }
|
|
2500
|
-
|
|
2501
2529
|
.switch-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
2502
2530
|
|
|
2503
|
-
.switch-said { flex: none; font-size: var(--text-xs); color: var(--muted); }
|
|
2504
|
-
|
|
2505
2531
|
/* Three sizes, the same names every other control uses. The switch scales with
|
|
2506
2532
|
the row: a 30x18 track beside 12px text is a different control from the same
|
|
2507
2533
|
track beside 16px text. */
|
|
@@ -2674,17 +2700,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2674
2700
|
|
|
2675
2701
|
/* ---- ./skeleton.css ---- */
|
|
2676
2702
|
@layer components {
|
|
2677
|
-
.muted { color: var(--muted); }
|
|
2678
|
-
|
|
2679
|
-
.pulse-block {
|
|
2680
|
-
display: inline-block;
|
|
2681
|
-
height: 8px;
|
|
2682
|
-
border-radius: var(--radius-sm);
|
|
2683
|
-
background: var(--muted);
|
|
2684
|
-
animation: ds-pulse 1.4s ease-in-out infinite;
|
|
2685
|
-
vertical-align: middle;
|
|
2686
|
-
}
|
|
2687
|
-
|
|
2688
2703
|
/* skeletons ------------------------------------------------------------ */
|
|
2689
2704
|
|
|
2690
2705
|
/* Ink at low alpha, not a named surface.
|
|
@@ -2943,8 +2958,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2943
2958
|
|
|
2944
2959
|
.rows-split:first-of-type { margin-top: var(--space-2); }
|
|
2945
2960
|
|
|
2946
|
-
.rows-empty { padding: var(--space-3) 0; }
|
|
2947
|
-
|
|
2948
2961
|
/* The name, the pills and the line underneath. `min-width: 0` is the whole
|
|
2949
2962
|
reason this is a class: a flex item will not shrink below its content, so
|
|
2950
2963
|
without it the name pushes the pills off the end -- and the pills are the
|
|
@@ -2961,8 +2974,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
2961
2974
|
|
|
2962
2975
|
/* The aligned column. `margin-left: auto` rather than a grid, because the rows
|
|
2963
2976
|
are flex and a size that varies by two characters does not need a track. */
|
|
2964
|
-
.row-trail { flex: none; margin-left: auto; white-space: nowrap; }
|
|
2965
|
-
|
|
2966
2977
|
.rows-row.rows-top { align-items: flex-start; }
|
|
2967
2978
|
|
|
2968
2979
|
.rows-row.rows-bad .truncate { color: var(--bad); }
|
|
@@ -3108,14 +3119,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3108
3119
|
|
|
3109
3120
|
.tabs-vertical .tab.on .tab-label { color: var(--accent); }
|
|
3110
3121
|
|
|
3111
|
-
.tab-hint {
|
|
3112
|
-
display: block;
|
|
3113
|
-
margin-top: 1px;
|
|
3114
|
-
font-size: var(--text-xs);
|
|
3115
|
-
color: var(--muted);
|
|
3116
|
-
line-height: 1.35;
|
|
3117
|
-
}
|
|
3118
|
-
|
|
3119
3122
|
/* A heading above a run of tabs. Set apart from the run above by space, not
|
|
3120
3123
|
a rule -- the rail already has one edge -- and the tabs under it step in
|
|
3121
3124
|
by the label's own padding so the label reads as theirs. */
|
|
@@ -3126,8 +3129,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3126
3129
|
|
|
3127
3130
|
.tabs-vertical .tab-group:first-child { padding-top: var(--space-2); }
|
|
3128
3131
|
|
|
3129
|
-
.tab-group-label { display: block; font-size: var(--text-sm); font-weight: 600; color: var(--text); }
|
|
3130
|
-
|
|
3131
3132
|
.tabs-vertical .tab.in-group { padding-left: var(--space-5); }
|
|
3132
3133
|
|
|
3133
3134
|
/* No line under a vertical strip -- its edge is the border on the right. */
|
|
@@ -3337,8 +3338,6 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3337
3338
|
`<strong>` rule above is the one that sets the size. */
|
|
3338
3339
|
/* Under the title, on the header's padding rather than the body's, so it reads
|
|
3339
3340
|
as part of the heading rather than as the first line of content. */
|
|
3340
|
-
.modal-desc { line-height: 1.5; }
|
|
3341
|
-
|
|
3342
3341
|
.modal-body { padding: var(--space-2) var(--space-4) var(--space-3); overflow-y: auto; }
|
|
3343
3342
|
|
|
3344
3343
|
/* The close cross. Its rule stayed behind in tf's stylesheet when the split
|
|
@@ -3506,12 +3505,8 @@ input[type='radio']:active:not(:disabled) {
|
|
|
3506
3505
|
|
|
3507
3506
|
.slider-row.is-disabled { opacity: 0.55; }
|
|
3508
3507
|
|
|
3509
|
-
.slider-body { flex: 1 1 260px; min-width: 0; display: grid; gap: 1px; }
|
|
3510
|
-
|
|
3511
3508
|
.set-row > .slider-row { flex: 1; min-width: 0; padding-block: 0; }
|
|
3512
3509
|
|
|
3513
|
-
.slider-label { color: var(--text); }
|
|
3514
|
-
|
|
3515
3510
|
.slider-hint { font-size: var(--text-sm); color: var(--muted); }
|
|
3516
3511
|
|
|
3517
3512
|
/* The box, with the value printed inside it at the right where a select
|
|
@@ -3737,8 +3732,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3737
3732
|
/* A run of checkboxes is one choice, not several settings that happen to be
|
|
3738
3733
|
adjacent. Tight enough that the group reads as a block -- at the spacing a
|
|
3739
3734
|
form field wants, four tools look like four unrelated questions. */
|
|
3740
|
-
.choice-group { display: grid; gap: var(--space-1); }
|
|
3741
|
-
|
|
3742
3735
|
/* The same choice, laid out as tiles instead of a column.
|
|
3743
3736
|
|
|
3744
3737
|
Four short names down the full width of a card is four wide bands for four
|
|
@@ -3862,8 +3855,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
3862
3855
|
second line is what the first line is actually asking for. */
|
|
3863
3856
|
.choice-why { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 1px; }
|
|
3864
3857
|
|
|
3865
|
-
.choice-meta { color: var(--muted); font-size: var(--text-xs); font-family: var(--font-mono); }
|
|
3866
|
-
|
|
3867
3858
|
.choice[data-disabled] {
|
|
3868
3859
|
cursor: not-allowed;
|
|
3869
3860
|
border-color: var(--border);
|
|
@@ -4060,8 +4051,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4060
4051
|
reason they can live in an app with four palettes: `ink` becomes the current
|
|
4061
4052
|
text colour and `paper` becomes the surface behind it, so one file covers
|
|
4062
4053
|
Night, Paper and both halves of System. Give the wrapper a `color` and
|
|
4063
|
-
the figure follows it
|
|
4064
|
-
one thing on screen worth looking at.
|
|
4054
|
+
the figure follows it: `--muted` for a quiet empty state, `--accent` for the
|
|
4055
|
+
one thing on screen worth looking at. Set that colour on the wrapper --
|
|
4056
|
+
`Empty` reaches for `text-muted`, and any token works. */
|
|
4065
4057
|
.illo {
|
|
4066
4058
|
display: inline-block;
|
|
4067
4059
|
/* Height is the given dimension and the width comes from the drawing, so a
|
|
@@ -4078,18 +4070,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4078
4070
|
caller says otherwise. Not `transparent`: these have overlapping shapes, and
|
|
4079
4071
|
a shirt that lets the arm behind it show through reads as a hole. */
|
|
4080
4072
|
.illo .paper { fill: var(--illo-paper); }
|
|
4081
|
-
|
|
4082
|
-
/* The figure in a whole-surface `Empty`, drawn in the muted grey of the
|
|
4083
|
-
sentence under it.
|
|
4084
|
-
*
|
|
4085
|
-
* A utility cannot do this, and the reason is worth keeping: `.illo` sets
|
|
4086
|
-
* `color: inherit` and is unlayered, while every Tailwind utility lives in
|
|
4087
|
-
* `@layer utilities` -- and an unlayered declaration beats a layered one
|
|
4088
|
-
* whatever the specificity. So `text-muted` on the figure lost, silently,
|
|
4089
|
-
* and the shirt came out full text black beside a muted sentence. The
|
|
4090
|
-
* original rule already carried a note about needing two classes to beat
|
|
4091
|
-
* `.illo`; layers make that impossible rather than merely fiddly. */
|
|
4092
|
-
.nothing-figure { color: var(--muted); }
|
|
4093
4073
|
}
|
|
4094
4074
|
|
|
4095
4075
|
/* ---- ./field.css ---- */
|
|
@@ -4101,7 +4081,9 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4101
4081
|
to what was typed, so it goes after. */
|
|
4102
4082
|
.field { display: grid; gap: var(--space-1); }
|
|
4103
4083
|
|
|
4104
|
-
|
|
4084
|
+
/* `.field-stack-layout` carries no rules: stacking is what `.field` already
|
|
4085
|
+
does, and the class is emitted only so that both layouts name themselves
|
|
4086
|
+
the same way (`field-${layout}-layout`). Only the row layout overrides. */
|
|
4105
4087
|
|
|
4106
4088
|
.field-row-layout > .field-label { grid-column: 1; }
|
|
4107
4089
|
|
|
@@ -4122,8 +4104,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4122
4104
|
|
|
4123
4105
|
/* Not red. The asterisk marks which fields are required; colouring it the same
|
|
4124
4106
|
as a failure says something has already gone wrong with every one of them. */
|
|
4125
|
-
.field-required { color: var(--muted); }
|
|
4126
|
-
|
|
4127
4107
|
.field-hint,
|
|
4128
4108
|
.field-error { margin: 0; font-size: var(--text-sm); line-height: 1.45; }
|
|
4129
4109
|
|
|
@@ -4145,8 +4125,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4145
4125
|
/* Fields stacked down a form. Wider than the gap inside one field, so the
|
|
4146
4126
|
label of the next belongs to the input under it rather than to the error
|
|
4147
4127
|
above it. */
|
|
4148
|
-
.field-stack { display: grid; gap: var(--space-4); }
|
|
4149
|
-
|
|
4150
4128
|
.field-row > .field { flex: 1; min-width: 0; }
|
|
4151
4129
|
|
|
4152
4130
|
/* A password with an eye -- `Input type="password"`.
|
|
@@ -4274,10 +4252,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4274
4252
|
@layer components {
|
|
4275
4253
|
/* tour ----------------------------------------------------------------- */
|
|
4276
4254
|
|
|
4277
|
-
/* The layer sits over everything and catches nothing: the scrim is painted by
|
|
4278
|
-
the hole's shadow, so there is no full-screen element to swallow a click. */
|
|
4279
|
-
.tour { position: fixed; inset: 0; z-index: 60; pointer-events: none; }
|
|
4280
|
-
|
|
4281
4255
|
/* The control the tour is currently pointing at.
|
|
4282
4256
|
|
|
4283
4257
|
Much of this chrome is invisible until you touch it -- `.view-add` lives at
|
|
@@ -4288,11 +4262,14 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4288
4262
|
what every control does at rest, and the alternative is naming each one here
|
|
4289
4263
|
and watching that list drift from the rules that hide them. One declaration
|
|
4290
4264
|
that outranks whatever the resting state is beats an enumeration that goes
|
|
4291
|
-
stale. It is scoped to a class only ever present on one element at a time.
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4265
|
+
stale. It is scoped to a class only ever present on one element at a time.
|
|
4266
|
+
|
|
4267
|
+
Opacity and nothing else. This forced `color: var(--text)` too, from the
|
|
4268
|
+
original port, with no case on record that needed it -- and it broke the
|
|
4269
|
+
first target that painted its own background, turning a primary button's
|
|
4270
|
+
label dark on accent at 2.2:1. The spotlight makes a control visible; what
|
|
4271
|
+
colour it is at rest is the control's business. */
|
|
4272
|
+
.tour-target { opacity: 1 !important; }
|
|
4296
4273
|
|
|
4297
4274
|
/* The spotlight. An enormous spread shadow dims the whole window except the
|
|
4298
4275
|
rectangle it is drawn on, which needs no clip path and no arithmetic. */
|
|
@@ -4326,8 +4303,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4326
4303
|
|
|
4327
4304
|
.tour-card:focus { outline: none; }
|
|
4328
4305
|
|
|
4329
|
-
.tour-title { font-size: var(--text-base); }
|
|
4330
|
-
|
|
4331
4306
|
.tour-body { margin: 0; color: var(--muted); font-size: var(--text-sm); line-height: 1.5; }
|
|
4332
4307
|
|
|
4333
4308
|
.tour-actions { display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-2); }
|
|
@@ -4499,17 +4474,6 @@ input[type='range'].slider:disabled::-moz-range-thumb { opacity: 0; }
|
|
|
4499
4474
|
the intrinsic width of a mail list is the longest unbroken subject line in
|
|
4500
4475
|
it. Without this the handle stops partway across and nothing on screen says
|
|
4501
4476
|
why -- it just refuses, differently for every mailbox. */
|
|
4502
|
-
.split-pane {
|
|
4503
|
-
min-width: 0;
|
|
4504
|
-
min-height: 0;
|
|
4505
|
-
overflow: hidden;
|
|
4506
|
-
display: flex;
|
|
4507
|
-
flex-direction: column;
|
|
4508
|
-
}
|
|
4509
|
-
|
|
4510
|
-
.split-first { flex: 0 0 var(--split); }
|
|
4511
|
-
.split-second { flex: 1 1 0; }
|
|
4512
|
-
|
|
4513
4477
|
/* The handle is wider than it looks: a hairline is a correct-looking divider
|
|
4514
4478
|
and an impossible pointer target. The grip is the line, drawn at
|
|
4515
4479
|
`--border-width` down the middle of a `--space-3` strip, and the strip is
|
|
@@ -4606,13 +4570,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4606
4570
|
z-index: 60;
|
|
4607
4571
|
}
|
|
4608
4572
|
|
|
4609
|
-
.pop-body {
|
|
4610
|
-
padding: var(--space-3);
|
|
4611
|
-
outline: none;
|
|
4612
|
-
color: var(--text);
|
|
4613
|
-
font-size: var(--text-sm);
|
|
4614
|
-
}
|
|
4615
|
-
|
|
4616
4573
|
/* Entry, and the direction it comes from. `data-placement` is React Aria's,
|
|
4617
4574
|
set to where the surface actually went rather than where it was asked to go,
|
|
4618
4575
|
so the movement agrees with the flip. */
|
|
@@ -4673,8 +4630,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4673
4630
|
.menu-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4674
4631
|
.menu-item[data-focused] .menu-icon { color: var(--text); }
|
|
4675
4632
|
|
|
4676
|
-
.menu-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4677
|
-
.menu-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4678
4633
|
.menu-desc {
|
|
4679
4634
|
font-size: var(--text-xs);
|
|
4680
4635
|
color: var(--muted);
|
|
@@ -4753,18 +4708,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4753
4708
|
flex-direction: column;
|
|
4754
4709
|
}
|
|
4755
4710
|
|
|
4756
|
-
.cmd-body { outline: none; display: flex; flex-direction: column; min-height: 0; }
|
|
4757
|
-
|
|
4758
|
-
.cmd-field {
|
|
4759
|
-
display: flex;
|
|
4760
|
-
align-items: center;
|
|
4761
|
-
gap: var(--space-2);
|
|
4762
|
-
padding: var(--space-3) var(--space-4);
|
|
4763
|
-
border-bottom: var(--border-width) solid var(--border);
|
|
4764
|
-
}
|
|
4765
|
-
|
|
4766
|
-
.cmd-mark { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4767
|
-
|
|
4768
4711
|
/* No border, no focus ring on the input itself: the whole surface is the
|
|
4769
4712
|
field, focus is already in it when it opens, and a ring around a box that
|
|
4770
4713
|
fills the top of the palette is a ring around the palette. */
|
|
@@ -4781,22 +4724,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4781
4724
|
|
|
4782
4725
|
.cmd-input::placeholder { color: var(--muted); }
|
|
4783
4726
|
|
|
4784
|
-
.cmd-list {
|
|
4785
|
-
padding: var(--space-2);
|
|
4786
|
-
overflow: auto;
|
|
4787
|
-
overscroll-behavior: contain;
|
|
4788
|
-
outline: none;
|
|
4789
|
-
min-height: 0;
|
|
4790
|
-
}
|
|
4791
|
-
|
|
4792
|
-
.cmd-group-title {
|
|
4793
|
-
padding: var(--space-2) var(--space-2) var(--space-1);
|
|
4794
|
-
font-size: var(--text-2xs);
|
|
4795
|
-
text-transform: uppercase;
|
|
4796
|
-
letter-spacing: var(--tracking);
|
|
4797
|
-
color: var(--muted);
|
|
4798
|
-
}
|
|
4799
|
-
|
|
4800
4727
|
.cmd-item {
|
|
4801
4728
|
display: flex;
|
|
4802
4729
|
align-items: center;
|
|
@@ -4832,8 +4759,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
4832
4759
|
.cmd-icon { flex: none; width: var(--space-4); height: var(--space-4); color: var(--muted); }
|
|
4833
4760
|
.cmd-item[data-focused] .cmd-icon { color: var(--text); }
|
|
4834
4761
|
|
|
4835
|
-
.cmd-text { flex: 1 1 auto; min-width: 0; display: grid; }
|
|
4836
|
-
.cmd-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
4837
4762
|
.cmd-desc {
|
|
4838
4763
|
font-size: var(--text-xs);
|
|
4839
4764
|
color: var(--muted);
|
|
@@ -5035,25 +4960,6 @@ body.splitting * { cursor: inherit !important; }
|
|
|
5035
4960
|
font-size: var(--text-2xs);
|
|
5036
4961
|
}
|
|
5037
4962
|
|
|
5038
|
-
.ident-text { display: grid; min-width: 0; }
|
|
5039
|
-
|
|
5040
|
-
.ident-name {
|
|
5041
|
-
overflow: hidden;
|
|
5042
|
-
text-overflow: ellipsis;
|
|
5043
|
-
white-space: nowrap;
|
|
5044
|
-
font-weight: var(--weight);
|
|
5045
|
-
}
|
|
5046
|
-
|
|
5047
|
-
.ident-address {
|
|
5048
|
-
overflow: hidden;
|
|
5049
|
-
text-overflow: ellipsis;
|
|
5050
|
-
white-space: nowrap;
|
|
5051
|
-
font-size: var(--text-xs);
|
|
5052
|
-
color: var(--muted);
|
|
5053
|
-
}
|
|
5054
|
-
|
|
5055
|
-
.ident-aside { flex: none; color: var(--muted); font-size: var(--text-xs); }
|
|
5056
|
-
|
|
5057
4963
|
/* A chip in a composer's To field: boxed, tighter, removable. */
|
|
5058
4964
|
.ident.kind-chip {
|
|
5059
4965
|
gap: var(--space-1);
|