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