@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.
@@ -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 -- `.muted` for a quiet empty state, `--accent` for the
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
- .field-stack-layout { /* the default: label, description, control, error */ }
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
- .tour-target {
4023
- opacity: 1 !important;
4024
- color: var(--text) !important;
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);