@domainkit/react 0.10.0 → 0.11.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/dist/styles.css CHANGED
@@ -28,6 +28,38 @@
28
28
  --domainkit-text: #18181b;
29
29
  --domainkit-warning: #b45309;
30
30
  --domainkit-control-radius: calc(var(--domainkit-radius) * 0.5);
31
+ /*
32
+ * The quiet controls in a dialog — a docs link, a disclosure trigger, a secondary action, the
33
+ * way back, the provider menu — share one rhythm: what sits above them, what sits below, and
34
+ * the room their hover and focus states need around the text.
35
+ */
36
+ --domainkit-quiet-lead: 0.5rem;
37
+ --domainkit-quiet-trail: 0.75rem;
38
+ --domainkit-quiet-inset: 0.5rem;
39
+ --domainkit-quiet-pad: 0.25rem;
40
+ /* The inner room a panel gives its contents: the dialog's form, and the two cards. */
41
+ --domainkit-panel-pad: 0.75rem;
42
+ /* A dialog that asks one question, and the width a dialog listing records takes instead. */
43
+ --domainkit-dialog-width: 24rem;
44
+ --domainkit-dialog-wide: 36rem;
45
+ /* The switch track, the thumb inside it, and the room it keeps at each end of the track. */
46
+ --domainkit-switch-width: 2.25rem;
47
+ --domainkit-switch-height: 1.25rem;
48
+ --domainkit-switch-thumb: 1rem;
49
+ --domainkit-switch-inset: 0.125rem;
50
+ /*
51
+ * A provider's identity is a name over one line about it, and the mark stands against both.
52
+ * The mark's size is the two lines added up, so it spans the block instead of guessing at it.
53
+ */
54
+ --domainkit-identity-name: 0.875rem;
55
+ --domainkit-identity-line: 0.8125rem;
56
+ --domainkit-identity-leading: 1.4;
57
+ --domainkit-mark-size: calc(
58
+ (var(--domainkit-identity-name) + var(--domainkit-identity-line)) *
59
+ var(--domainkit-identity-leading)
60
+ );
61
+ /* Cards draw no border of their own. A host that wants one sets this on the part. */
62
+ --domainkit-card-border: transparent;
31
63
  --domainkit-button-raised-glint: rgb(255 255 255 / 0.95);
32
64
  --domainkit-button-raised-shade: color-mix(in srgb, var(--domainkit-text) 10%, transparent);
33
65
  --domainkit-button-raised-shadow: 0 1px 2px
@@ -105,6 +137,11 @@
105
137
  [data-domainkit-part="cleanup-apply"],
106
138
  [data-domainkit-part="cleanup-retry"],
107
139
  [data-domainkit-part="disconnect-action"],
140
+ [data-domainkit-part="disconnect-confirm"],
141
+ [data-domainkit-part="method-alternate"],
142
+ [data-domainkit-part="dialog-back"],
143
+ [data-domainkit-part="dialog-provider-menu"],
144
+ [data-domainkit-part="more-options-trigger"],
108
145
  [data-domainkit-part="disconnect-trigger"],
109
146
  [data-domainkit-part="actions-trigger"],
110
147
  [data-domainkit-part="token-connect"] button,
@@ -237,7 +274,7 @@
237
274
  background: color-mix(in srgb, var(--domainkit-danger) 8%, transparent);
238
275
  }
239
276
 
240
- :where([data-domainkit-part="cleanup-apply"]) {
277
+ :where([data-domainkit-part="cleanup-apply"], [data-domainkit-part="disconnect-confirm"]) {
241
278
  --domainkit-button-face: color-mix(in oklch, var(--domainkit-danger), white 22%);
242
279
  --domainkit-button-glint: color-mix(in oklch, var(--domainkit-danger), white 42%);
243
280
  --domainkit-button-edge: color-mix(in oklch, var(--domainkit-danger), black 18%);
@@ -254,11 +291,17 @@
254
291
  color: var(--domainkit-danger-contrast);
255
292
  }
256
293
 
257
- :where([data-domainkit-part="cleanup-apply"]:hover:not(:disabled)) {
294
+ :where(
295
+ [data-domainkit-part="cleanup-apply"]:hover:not(:disabled),
296
+ [data-domainkit-part="disconnect-confirm"]:hover:not(:disabled)
297
+ ) {
258
298
  --domainkit-button-face: color-mix(in oklch, var(--domainkit-danger), white 28%);
259
299
  }
260
300
 
261
- :where([data-domainkit-part="cleanup-apply"]:active:not(:disabled)) {
301
+ :where(
302
+ [data-domainkit-part="cleanup-apply"]:active:not(:disabled),
303
+ [data-domainkit-part="disconnect-confirm"]:active:not(:disabled)
304
+ ) {
262
305
  background-image: linear-gradient(
263
306
  to bottom,
264
307
  var(--domainkit-danger),
@@ -267,6 +310,158 @@
267
310
  box-shadow: inset 0 1px 2px color-mix(in srgb, var(--domainkit-text) 28%, transparent);
268
311
  }
269
312
 
313
+ /* Every quiet control in the dialog keeps the same rhythm above and below it. */
314
+ :where(
315
+ [data-domainkit-part="method-alternate"],
316
+ [data-domainkit-part="dialog-back"],
317
+ [data-domainkit-part="more-options-trigger"]
318
+ ) {
319
+ margin-block: var(--domainkit-quiet-lead) var(--domainkit-quiet-trail);
320
+ }
321
+
322
+ :where([data-domainkit-part="method-alternate"]) {
323
+ background: transparent;
324
+ border-color: var(--domainkit-border);
325
+ box-shadow: none;
326
+ color: var(--domainkit-text);
327
+ width: 100%;
328
+ }
329
+
330
+ :where(
331
+ [data-domainkit-part="method-alternate"]:hover:not(:disabled),
332
+ [data-domainkit-part="more-options-trigger"]:hover:not(:disabled)
333
+ ) {
334
+ background: var(--domainkit-fill);
335
+ }
336
+
337
+ :where([data-domainkit-part="more-options-trigger"]) {
338
+ background: transparent;
339
+ border-color: var(--domainkit-border);
340
+ box-shadow: none;
341
+ color: var(--domainkit-muted);
342
+ font-size: 0.8125rem;
343
+ gap: var(--domainkit-quiet-pad);
344
+ justify-self: start;
345
+ }
346
+
347
+ :where([data-domainkit-part="more-options-trigger"] svg),
348
+ :where([data-domainkit-part="dialog-provider-menu"] svg) {
349
+ height: 1rem;
350
+ transition: transform 150ms ease;
351
+ width: 1rem;
352
+ }
353
+
354
+ :where([data-domainkit-part="more-options"][data-state="open"])
355
+ :where([data-domainkit-part="more-options-trigger"] svg) {
356
+ transform: rotate(180deg);
357
+ }
358
+
359
+ :where([data-domainkit-part="more-options-panel"]) {
360
+ display: grid;
361
+ gap: var(--domainkit-quiet-lead);
362
+ padding-block-end: var(--domainkit-quiet-lead);
363
+ }
364
+
365
+ :where([data-domainkit-part="dialog-back"]) {
366
+ background: transparent;
367
+ border-color: transparent;
368
+ box-shadow: none;
369
+ color: var(--domainkit-muted);
370
+ justify-self: start;
371
+ margin-inline-start: calc(-1 * var(--domainkit-quiet-inset));
372
+ padding-inline: var(--domainkit-quiet-inset);
373
+ }
374
+
375
+ :where([data-domainkit-part="dialog-back"]:hover:not(:disabled)) {
376
+ background: var(--domainkit-fill);
377
+ color: var(--domainkit-text);
378
+ }
379
+
380
+ :where([data-domainkit-part="dialog-back"])::before {
381
+ content: "\2190";
382
+ margin-inline-end: 0.35rem;
383
+ }
384
+
385
+ :where([data-domainkit-part="dialog-provider-menu"]) {
386
+ background: transparent;
387
+ border-color: transparent;
388
+ box-shadow: none;
389
+ color: inherit;
390
+ font: inherit;
391
+ gap: var(--domainkit-quiet-pad);
392
+ margin-inline-start: calc(-1 * var(--domainkit-quiet-inset));
393
+ padding: var(--domainkit-quiet-pad) var(--domainkit-quiet-inset);
394
+ }
395
+
396
+ :where([data-domainkit-part="dialog-provider-menu"]:hover:not(:disabled)) {
397
+ background: var(--domainkit-fill);
398
+ color: var(--domainkit-accent);
399
+ }
400
+
401
+ :where([data-domainkit-part="dialog-provider-menu"][data-popup-open] svg) {
402
+ transform: rotate(180deg);
403
+ }
404
+
405
+ /* Above the dialog that opened it: the trigger sits inside the dialog's own stacking context. */
406
+ :where([data-domainkit-part="provider-menu-positioner"]) {
407
+ z-index: 1002;
408
+ }
409
+
410
+ :where([data-domainkit-part="provider-menu"]) {
411
+ background: var(--domainkit-background);
412
+ border: 1px solid var(--domainkit-border);
413
+ border-radius: var(--domainkit-radius);
414
+ box-shadow: var(--domainkit-shadow);
415
+ display: grid;
416
+ gap: 0.15rem;
417
+ min-width: 12rem;
418
+ padding: 0.3rem;
419
+ }
420
+
421
+ :where([data-domainkit-part="provider-menu-item"]) {
422
+ align-items: center;
423
+ border-radius: var(--domainkit-control-radius);
424
+ color: var(--domainkit-text);
425
+ cursor: pointer;
426
+ display: flex;
427
+ font-size: 0.875rem;
428
+ gap: 0.5rem;
429
+ padding: 0.35rem 0.5rem;
430
+ }
431
+
432
+ :where([data-domainkit-part="provider-menu-item"][data-highlighted]) {
433
+ background: var(--domainkit-fill);
434
+ }
435
+
436
+ :where([data-domainkit-part="disconnect-scope"]) {
437
+ border: 1px solid var(--domainkit-border);
438
+ border-radius: var(--domainkit-control-radius);
439
+ display: grid;
440
+ gap: 0.4rem;
441
+ margin: 0;
442
+ padding: 0.6rem 0.75rem;
443
+ }
444
+
445
+ :where([data-domainkit-part="disconnect-scope"] legend) {
446
+ color: var(--domainkit-muted);
447
+ font-size: 0.8125rem;
448
+ padding-inline: 0.25rem;
449
+ }
450
+
451
+ :where([data-domainkit-part="disconnect-scope"] label) {
452
+ align-items: center;
453
+ color: var(--domainkit-text);
454
+ cursor: pointer;
455
+ display: flex;
456
+ font-size: 0.875rem;
457
+ gap: 0.5rem;
458
+ }
459
+
460
+ :where([data-domainkit-part="disconnect-scope"] input) {
461
+ accent-color: var(--domainkit-accent);
462
+ margin: 0;
463
+ }
464
+
270
465
  :where([data-domainkit-part="dialog-cancel"], [data-domainkit-part="dialog-close"]) {
271
466
  background: transparent;
272
467
  border-color: transparent;
@@ -359,6 +554,7 @@
359
554
  :where([data-domainkit-part="dialog-backdrop"]) {
360
555
  background: var(--domainkit-backdrop);
361
556
  inset: 0;
557
+ opacity: 1;
362
558
  position: fixed;
363
559
  transition: opacity 150ms ease;
364
560
  z-index: 1000;
@@ -389,12 +585,42 @@
389
585
  transition:
390
586
  opacity 150ms ease,
391
587
  transform 150ms ease;
392
- width: 24rem;
588
+ width: var(--domainkit-dialog-width);
393
589
  z-index: 1001;
394
590
  }
395
591
 
396
- :where([data-domainkit-part="plan-dialog"], [data-domainkit-part="cleanup-dialog"]) {
397
- width: 36rem;
592
+ /*
593
+ * A dialog that lists records takes the wider width: the plan and the cleanup always do, and the
594
+ * disconnect dialog does whenever it carries removals to decide over.
595
+ */
596
+ :where(
597
+ [data-domainkit-part="plan-dialog"],
598
+ [data-domainkit-part="cleanup-dialog"],
599
+ [data-domainkit-part="disconnect-dialog"][data-cleanup="offered"]
600
+ ) {
601
+ --domainkit-dialog-width: var(--domainkit-dialog-wide);
602
+ }
603
+
604
+ /* The backdrop fades with the dialog it belongs to rather than appearing whole. */
605
+ :where(
606
+ [data-domainkit-part="dialog-backdrop"][data-starting-style],
607
+ [data-domainkit-part="dialog-backdrop"][data-ending-style]
608
+ ) {
609
+ opacity: 0;
610
+ }
611
+
612
+ /*
613
+ * A closed dialog is out of the customer's way even while it is still in the tree: it may linger
614
+ * for its exit, and a transparent sheet that still takes a press would swallow the next click.
615
+ */
616
+ :where(
617
+ [data-domainkit-part="dialog-backdrop"][data-closed],
618
+ [data-domainkit-part="connection-dialog"][data-closed],
619
+ [data-domainkit-part="plan-dialog"][data-closed],
620
+ [data-domainkit-part="cleanup-dialog"][data-closed],
621
+ [data-domainkit-part="disconnect-dialog"][data-closed]
622
+ ) {
623
+ pointer-events: none;
398
624
  }
399
625
 
400
626
  :where(
@@ -419,6 +645,14 @@
419
645
  padding: 1rem 1rem 0.85rem;
420
646
  }
421
647
 
648
+ /* The mark stands against the title and the line under it, the way it does on the two cards. */
649
+ :where([data-domainkit-part="dialog-media"]) {
650
+ align-items: center;
651
+ align-self: center;
652
+ display: inline-flex;
653
+ flex: none;
654
+ }
655
+
422
656
  :where([data-domainkit-part="dialog-heading"]) {
423
657
  display: grid;
424
658
  flex: 1;
@@ -521,6 +755,91 @@
521
755
  margin: 0;
522
756
  }
523
757
 
758
+ :where([data-domainkit-part="disconnect-cleanup"]) {
759
+ display: grid;
760
+ gap: var(--domainkit-quiet-lead);
761
+ }
762
+
763
+ :where([data-domainkit-part="disconnect-cleanup-label"]) {
764
+ align-items: center;
765
+ color: var(--domainkit-text);
766
+ cursor: pointer;
767
+ display: flex;
768
+ font-size: 0.875rem;
769
+ gap: 0.6rem;
770
+ }
771
+
772
+ /*
773
+ * Base UI's own Switch anatomy: the root is the track and the thumb is a box laid out inside it.
774
+ * `border-box` and `inline-flex` make the declared width and height the track a customer sees,
775
+ * whatever the host's reset does with padding, and centre the thumb between the track's edges.
776
+ */
777
+ :where([data-domainkit-part="disconnect-cleanup-switch"]) {
778
+ align-items: center;
779
+ background: var(--domainkit-border);
780
+ border: 0;
781
+ border-radius: 999px;
782
+ box-sizing: border-box;
783
+ cursor: pointer;
784
+ display: inline-flex;
785
+ flex: none;
786
+ height: var(--domainkit-switch-height);
787
+ padding: var(--domainkit-switch-inset);
788
+ transition: background-color 150ms ease;
789
+ width: var(--domainkit-switch-width);
790
+ }
791
+
792
+ :where([data-domainkit-part="disconnect-cleanup-switch"][data-checked]) {
793
+ background: var(--domainkit-accent);
794
+ }
795
+
796
+ :where([data-domainkit-part="disconnect-cleanup-switch"]:disabled) {
797
+ cursor: default;
798
+ opacity: 0.6;
799
+ }
800
+
801
+ :where([data-domainkit-part="disconnect-cleanup-thumb"]) {
802
+ background: var(--domainkit-background);
803
+ border-radius: 999px;
804
+ display: block;
805
+ flex: none;
806
+ height: var(--domainkit-switch-thumb);
807
+ transition: translate 150ms ease;
808
+ width: var(--domainkit-switch-thumb);
809
+ }
810
+
811
+ /* The travel is the track less the thumb and the room the track keeps at both ends. */
812
+ :where([data-domainkit-part="disconnect-cleanup-thumb"][data-checked]) {
813
+ translate: calc(
814
+ var(--domainkit-switch-width) - var(--domainkit-switch-thumb) -
815
+ var(--domainkit-switch-inset) * 2
816
+ );
817
+ }
818
+
819
+ :where([data-domainkit-part="disconnect-cleanup-panel"]) {
820
+ display: grid;
821
+ gap: 0.35rem;
822
+ transition: opacity 150ms ease;
823
+ }
824
+
825
+ /* Off, the records are still what the decision is about, so they stay legible and step back. */
826
+ :where([data-domainkit-part="disconnect-cleanup"][data-state="off"])
827
+ :where([data-domainkit-part="disconnect-cleanup-panel"]) {
828
+ opacity: 0.55;
829
+ }
830
+
831
+ :where([data-domainkit-part="disconnect-cleanup-note"]) {
832
+ color: var(--domainkit-muted);
833
+ font-size: 0.8125rem;
834
+ margin: 0;
835
+ }
836
+
837
+ :where([data-domainkit-part="disconnect-status"]) {
838
+ color: var(--domainkit-muted);
839
+ font-size: 0.875rem;
840
+ margin: 0;
841
+ }
842
+
524
843
  :where([data-domainkit-part="dialog-footer"]) {
525
844
  border-top: 1px solid var(--domainkit-border);
526
845
  display: flex;
@@ -529,6 +848,8 @@
529
848
  padding: 0.75rem 1rem;
530
849
  }
531
850
 
851
+ /* A squircle: a rounded square on the radius token, filled edge to edge. Nothing here rounds it
852
+ * into a circle, so a mark that reads as one is a circular asset the host passed in. */
532
853
  :where([data-domainkit-part="provider-mark"]) {
533
854
  align-items: center;
534
855
  background: var(--domainkit-fill);
@@ -537,12 +858,12 @@
537
858
  box-sizing: border-box;
538
859
  display: inline-flex;
539
860
  flex: none;
540
- font-size: 0.75rem;
861
+ font-size: 0.8125rem;
541
862
  font-weight: 600;
542
- height: 2rem;
863
+ height: var(--domainkit-mark-size);
543
864
  justify-content: center;
544
865
  overflow: hidden;
545
- width: 2rem;
866
+ width: var(--domainkit-mark-size);
546
867
  }
547
868
 
548
869
  :where([data-domainkit-part="provider-mark"] img),
@@ -553,18 +874,6 @@
553
874
  width: 100%;
554
875
  }
555
876
 
556
- :where([data-domainkit-recipe="connect"]) {
557
- gap: 0.45rem;
558
- }
559
-
560
- :where([data-domainkit-recipe="connect"] [data-domainkit-part="provider-mark"]) {
561
- background: var(--domainkit-accent-contrast);
562
- border-color: color-mix(in oklch, var(--domainkit-accent) 18%, transparent);
563
- font-size: 0.625rem;
564
- height: 1.25rem;
565
- width: 1.25rem;
566
- }
567
-
568
877
  :where([data-domainkit-part="provider-mark"][data-domainkit-provider="vercel"]) {
569
878
  border-color: transparent;
570
879
  }
@@ -575,7 +884,7 @@
575
884
  border-radius: var(--domainkit-control-radius);
576
885
  display: grid;
577
886
  gap: 0.65rem;
578
- padding: 0.75rem;
887
+ padding: var(--domainkit-panel-pad);
579
888
  }
580
889
 
581
890
  :where([data-domainkit-part="token-connect"] [data-domainkit-part="field-label"]) {
@@ -610,27 +919,27 @@
610
919
  width: 100%;
611
920
  }
612
921
 
922
+ /*
923
+ * Both cards sit on the host's inset surface rather than floating on the page ground, so a
924
+ * domain page reads as one section. The border is off unless a host sets `--domainkit-card-border`
925
+ * on the part.
926
+ */
927
+ :where([data-domainkit-part="connected-card"], [data-domainkit-part="connect-prompt"]) {
928
+ background: var(--domainkit-fill);
929
+ border: 1px solid var(--domainkit-card-border);
930
+ border-radius: var(--domainkit-radius);
931
+ padding: var(--domainkit-panel-pad);
932
+ }
933
+
613
934
  :where([data-domainkit-part="connected-card"]) {
614
935
  align-items: center;
615
- background: var(--domainkit-background);
616
- border: 1px solid var(--domainkit-border);
617
- border-radius: var(--domainkit-radius);
936
+ column-gap: 1rem;
618
937
  display: grid;
619
- gap: 0.75rem 1rem;
620
938
  grid-template-columns: minmax(0, 1fr) auto;
621
939
  justify-content: space-between;
622
- min-height: 4.25rem;
623
- padding: 1rem;
624
940
  width: 100%;
625
941
  }
626
942
 
627
- :where([data-domainkit-part="connected-identity"]) {
628
- align-items: center;
629
- display: flex;
630
- gap: 0.75rem;
631
- min-width: 0;
632
- }
633
-
634
943
  :where([data-domainkit-part="connected-actions"]) {
635
944
  align-items: center;
636
945
  display: flex;
@@ -905,10 +1214,13 @@
905
1214
  min-height: 1.5rem;
906
1215
  }
907
1216
 
1217
+ /* A record name longer than the popover wraps inside its own cell; the status keeps the row. */
908
1218
  :where([data-domainkit-part="observation-record"]) {
909
1219
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
910
1220
  font-size: 0.75rem;
911
1221
  font-weight: 600;
1222
+ min-width: 0;
1223
+ overflow-wrap: anywhere;
912
1224
  }
913
1225
 
914
1226
  :where([data-domainkit-part="observation-note"]) {
@@ -1057,12 +1369,23 @@
1057
1369
  font-size: 0.6875rem;
1058
1370
  }
1059
1371
 
1372
+ /* Glyph and word are one badge: a narrow status column breaks the line, not the badge. */
1060
1373
  :where([data-domainkit-part="record-status"]) {
1374
+ align-items: center;
1061
1375
  border-radius: 999px;
1376
+ display: inline-flex;
1062
1377
  font-size: 0.6875rem;
1063
1378
  font-weight: 600;
1379
+ gap: 0.25rem;
1064
1380
  letter-spacing: 0.02em;
1065
1381
  padding: 0.15rem 0.45rem;
1382
+ white-space: nowrap;
1383
+ }
1384
+
1385
+ /* The glyph reads at the size of the word beside it rather than a size above it. */
1386
+ :where([data-domainkit-part="record-status"] [data-icon] svg) {
1387
+ height: 1em;
1388
+ width: 1em;
1066
1389
  }
1067
1390
 
1068
1391
  :where([data-domainkit-part="record-status"][data-status="Found"]) {
@@ -1144,6 +1467,7 @@
1144
1467
  color: var(--domainkit-muted);
1145
1468
  }
1146
1469
 
1470
+ /* A record name is longer than a dialog is wide; it wraps rather than running off the row. */
1147
1471
  :where([data-domainkit-part="operation-record"]) {
1148
1472
  color: var(--domainkit-muted);
1149
1473
  display: grid;
@@ -1151,6 +1475,7 @@
1151
1475
  font-size: 0.75rem;
1152
1476
  gap: 0.2rem;
1153
1477
  min-width: 0;
1478
+ overflow-wrap: anywhere;
1154
1479
  }
1155
1480
 
1156
1481
  :where([data-domainkit-part="operation-value"]) {
@@ -1207,12 +1532,50 @@
1207
1532
  text-align: center;
1208
1533
  }
1209
1534
 
1535
+ /* Glyph and title on one row, the description under the title, the action beside both. */
1210
1536
  :where([data-domainkit-part="outcome"][data-layout="inline"]) {
1211
- align-items: center;
1537
+ align-items: start;
1212
1538
  column-gap: 0.5rem;
1213
- display: flex;
1214
- flex-wrap: wrap;
1215
- row-gap: 0.35rem;
1539
+ display: grid;
1540
+ grid-template-columns: auto minmax(0, 1fr) auto;
1541
+ row-gap: 0.15rem;
1542
+ }
1543
+
1544
+ /* The header groups the words for a card; inline puts its parts on the outcome's own grid. */
1545
+ :where(
1546
+ [data-domainkit-part="outcome"][data-layout="inline"] [data-domainkit-part="outcome-header"]
1547
+ ) {
1548
+ display: contents;
1549
+ }
1550
+
1551
+ :where(
1552
+ [data-domainkit-part="outcome"][data-layout="inline"] [data-domainkit-part="outcome-media"]
1553
+ ) {
1554
+ grid-area: 1 / 1;
1555
+ }
1556
+
1557
+ :where(
1558
+ [data-domainkit-part="outcome"][data-layout="inline"] [data-domainkit-part="outcome-title"]
1559
+ ) {
1560
+ grid-area: 1 / 2;
1561
+ }
1562
+
1563
+ :where(
1564
+ [data-domainkit-part="outcome"][data-layout="inline"]
1565
+ [data-domainkit-part="outcome-description"]
1566
+ ) {
1567
+ grid-area: 2 / 2;
1568
+ }
1569
+
1570
+ /*
1571
+ * The action sits on the title's row. Spanning the description's row too would hold that row
1572
+ * open where an outcome has no description, and leave the row's gap under a single line.
1573
+ */
1574
+ :where(
1575
+ [data-domainkit-part="outcome"][data-layout="inline"] [data-domainkit-part="outcome-content"]
1576
+ ) {
1577
+ align-self: start;
1578
+ grid-area: 1 / 3;
1216
1579
  }
1217
1580
 
1218
1581
  :where([data-domainkit-part="outcome-header"]) {
@@ -1274,17 +1637,6 @@
1274
1637
  gap: 0.5rem;
1275
1638
  }
1276
1639
 
1277
- :where(
1278
- [data-domainkit-part="outcome"][data-layout="inline"] [data-domainkit-part="outcome-header"]
1279
- ) {
1280
- align-items: center;
1281
- column-gap: 0.5rem;
1282
- display: flex;
1283
- flex: 1 1 12rem;
1284
- flex-wrap: wrap;
1285
- row-gap: 0.15rem;
1286
- }
1287
-
1288
1640
  :where([data-domainkit-part]:focus-visible) {
1289
1641
  outline: 2px solid var(--domainkit-accent);
1290
1642
  outline-offset: 2px;
@@ -1381,14 +1733,23 @@
1381
1733
 
1382
1734
  [data-domainkit-part="field-description"] {
1383
1735
  align-items: center;
1736
+ border-radius: var(--domainkit-control-radius);
1384
1737
  color: var(--domainkit-muted);
1385
1738
  display: inline-flex;
1386
1739
  font-size: 0.8125rem;
1387
1740
  gap: 0.25rem;
1388
1741
  justify-self: start;
1742
+ margin-block: var(--domainkit-quiet-lead) var(--domainkit-quiet-trail);
1743
+ margin-inline-start: calc(-1 * var(--domainkit-quiet-inset));
1744
+ padding: var(--domainkit-quiet-pad) var(--domainkit-quiet-inset);
1389
1745
  text-decoration: none;
1390
1746
  }
1391
1747
 
1748
+ [data-domainkit-part="field-description"]:hover {
1749
+ background: var(--domainkit-fill);
1750
+ color: var(--domainkit-text);
1751
+ }
1752
+
1392
1753
  /* ---------------------------------------------------------------------------------------------
1393
1754
  * The disconnected prompt, and the disclosures that keep the dialog to one decision
1394
1755
  * ------------------------------------------------------------------------------------------- */
@@ -1402,57 +1763,39 @@
1402
1763
  width: 100%;
1403
1764
  }
1404
1765
 
1766
+ /*
1767
+ * The mark beside a name, with the line about it directly under: both cards read the same. Two
1768
+ * explicit rows carry the name and the line, and the mark spans them, so it stands against the
1769
+ * whole identity rather than hanging off the name.
1770
+ */
1771
+ [data-domainkit-part="connected-identity"],
1405
1772
  [data-domainkit-part="host-identity"] {
1406
- align-items: center;
1407
1773
  column-gap: 0.5rem;
1408
1774
  display: grid;
1409
1775
  grid-template-columns: auto minmax(0, 1fr);
1776
+ grid-template-rows: auto auto;
1777
+ min-width: 0;
1778
+ row-gap: 0;
1779
+ }
1780
+
1781
+ [data-domainkit-part="connected-identity"] > [data-domainkit-part="provider-mark"],
1782
+ [data-domainkit-part="host-identity"] > [data-domainkit-part="provider-mark"] {
1783
+ align-self: center;
1784
+ grid-row: 1 / -1;
1410
1785
  }
1411
1786
 
1412
1787
  [data-domainkit-part="host-name"] {
1413
- font-size: 0.875rem;
1788
+ font-size: var(--domainkit-identity-name);
1414
1789
  font-weight: 600;
1415
1790
  grid-column: 2;
1791
+ line-height: var(--domainkit-identity-leading);
1416
1792
  }
1417
1793
 
1418
1794
  [data-domainkit-part="host-statement"] {
1419
1795
  color: var(--domainkit-muted);
1420
- font-size: 0.8125rem;
1796
+ font-size: var(--domainkit-identity-line);
1421
1797
  grid-column: 2;
1422
- }
1423
-
1424
- [data-domainkit-part="other-providers"],
1425
- [data-domainkit-part="more-options"] {
1426
- display: grid;
1427
- gap: 0.5rem;
1428
- }
1429
-
1430
- [data-domainkit-part="other-providers-trigger"],
1431
- [data-domainkit-part="more-options-trigger"] {
1432
- color: var(--domainkit-muted);
1433
- cursor: pointer;
1434
- font-size: 0.8125rem;
1435
- list-style: none;
1436
- width: fit-content;
1437
- }
1438
-
1439
- [data-domainkit-part="other-providers-trigger"]::before,
1440
- [data-domainkit-part="more-options-trigger"]::before {
1441
- content: "\25b8";
1442
- display: inline-block;
1443
- margin-inline-end: 0.35rem;
1444
- }
1445
-
1446
- [data-domainkit-part="other-providers"][open]
1447
- > [data-domainkit-part="other-providers-trigger"]::before,
1448
- [data-domainkit-part="more-options"][open]
1449
- > [data-domainkit-part="more-options-trigger"]::before {
1450
- transform: rotate(90deg);
1451
- }
1452
-
1453
- [data-domainkit-part="other-providers"] {
1454
- border-top: 1px solid var(--domainkit-border);
1455
- padding-top: 0.75rem;
1798
+ line-height: var(--domainkit-identity-leading);
1456
1799
  }
1457
1800
 
1458
1801
  button[data-domainkit-part="provider-heading"] {
@@ -1504,10 +1847,12 @@
1504
1847
  gap: 0.375rem;
1505
1848
  }
1506
1849
 
1850
+ /* A DKIM key is one word wider than the popover; it breaks rather than widening the whole list. */
1507
1851
  [data-domainkit-part="observation-expected"] {
1508
1852
  color: var(--domainkit-muted);
1509
1853
  font-size: 0.8125rem;
1510
1854
  margin: 0;
1855
+ overflow-wrap: anywhere;
1511
1856
  }
1512
1857
 
1513
1858
  /* The source line above these is a small uppercase label; the values under it are data. */