@domainkit/react 0.9.1 → 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
@@ -26,7 +26,40 @@
26
26
  --domainkit-shadow: 0 16px 40px rgb(15 23 42 / 0.12);
27
27
  --domainkit-success: #059669;
28
28
  --domainkit-text: #18181b;
29
+ --domainkit-warning: #b45309;
29
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;
30
63
  --domainkit-button-raised-glint: rgb(255 255 255 / 0.95);
31
64
  --domainkit-button-raised-shade: color-mix(in srgb, var(--domainkit-text) 10%, transparent);
32
65
  --domainkit-button-raised-shadow: 0 1px 2px
@@ -43,6 +76,7 @@
43
76
  --domainkit-muted: #a1a1aa;
44
77
  --domainkit-shadow: 0 16px 40px rgb(0 0 0 / 0.4);
45
78
  --domainkit-success: #34d399;
79
+ --domainkit-warning: #fbbf24;
46
80
  --domainkit-text: #fafafa;
47
81
  --domainkit-button-raised-glint: rgb(255 255 255 / 0.14);
48
82
  --domainkit-button-raised-shade: rgb(0 0 0 / 0.42);
@@ -58,6 +92,7 @@
58
92
  --domainkit-muted: #a1a1aa;
59
93
  --domainkit-shadow: 0 16px 40px rgb(0 0 0 / 0.4);
60
94
  --domainkit-success: #34d399;
95
+ --domainkit-warning: #fbbf24;
61
96
  --domainkit-text: #fafafa;
62
97
  --domainkit-button-raised-glint: rgb(255 255 255 / 0.14);
63
98
  --domainkit-button-raised-shade: rgb(0 0 0 / 0.42);
@@ -102,6 +137,11 @@
102
137
  [data-domainkit-part="cleanup-apply"],
103
138
  [data-domainkit-part="cleanup-retry"],
104
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"],
105
145
  [data-domainkit-part="disconnect-trigger"],
106
146
  [data-domainkit-part="actions-trigger"],
107
147
  [data-domainkit-part="token-connect"] button,
@@ -234,7 +274,7 @@
234
274
  background: color-mix(in srgb, var(--domainkit-danger) 8%, transparent);
235
275
  }
236
276
 
237
- :where([data-domainkit-part="cleanup-apply"]) {
277
+ :where([data-domainkit-part="cleanup-apply"], [data-domainkit-part="disconnect-confirm"]) {
238
278
  --domainkit-button-face: color-mix(in oklch, var(--domainkit-danger), white 22%);
239
279
  --domainkit-button-glint: color-mix(in oklch, var(--domainkit-danger), white 42%);
240
280
  --domainkit-button-edge: color-mix(in oklch, var(--domainkit-danger), black 18%);
@@ -251,11 +291,17 @@
251
291
  color: var(--domainkit-danger-contrast);
252
292
  }
253
293
 
254
- :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
+ ) {
255
298
  --domainkit-button-face: color-mix(in oklch, var(--domainkit-danger), white 28%);
256
299
  }
257
300
 
258
- :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
+ ) {
259
305
  background-image: linear-gradient(
260
306
  to bottom,
261
307
  var(--domainkit-danger),
@@ -264,6 +310,158 @@
264
310
  box-shadow: inset 0 1px 2px color-mix(in srgb, var(--domainkit-text) 28%, transparent);
265
311
  }
266
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
+
267
465
  :where([data-domainkit-part="dialog-cancel"], [data-domainkit-part="dialog-close"]) {
268
466
  background: transparent;
269
467
  border-color: transparent;
@@ -356,6 +554,7 @@
356
554
  :where([data-domainkit-part="dialog-backdrop"]) {
357
555
  background: var(--domainkit-backdrop);
358
556
  inset: 0;
557
+ opacity: 1;
359
558
  position: fixed;
360
559
  transition: opacity 150ms ease;
361
560
  z-index: 1000;
@@ -386,12 +585,42 @@
386
585
  transition:
387
586
  opacity 150ms ease,
388
587
  transform 150ms ease;
389
- width: 24rem;
588
+ width: var(--domainkit-dialog-width);
390
589
  z-index: 1001;
391
590
  }
392
591
 
393
- :where([data-domainkit-part="plan-dialog"], [data-domainkit-part="cleanup-dialog"]) {
394
- 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;
395
624
  }
396
625
 
397
626
  :where(
@@ -416,6 +645,14 @@
416
645
  padding: 1rem 1rem 0.85rem;
417
646
  }
418
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
+
419
656
  :where([data-domainkit-part="dialog-heading"]) {
420
657
  display: grid;
421
658
  flex: 1;
@@ -518,6 +755,91 @@
518
755
  margin: 0;
519
756
  }
520
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
+
521
843
  :where([data-domainkit-part="dialog-footer"]) {
522
844
  border-top: 1px solid var(--domainkit-border);
523
845
  display: flex;
@@ -526,6 +848,8 @@
526
848
  padding: 0.75rem 1rem;
527
849
  }
528
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. */
529
853
  :where([data-domainkit-part="provider-mark"]) {
530
854
  align-items: center;
531
855
  background: var(--domainkit-fill);
@@ -534,12 +858,12 @@
534
858
  box-sizing: border-box;
535
859
  display: inline-flex;
536
860
  flex: none;
537
- font-size: 0.75rem;
861
+ font-size: 0.8125rem;
538
862
  font-weight: 600;
539
- height: 2rem;
863
+ height: var(--domainkit-mark-size);
540
864
  justify-content: center;
541
865
  overflow: hidden;
542
- width: 2rem;
866
+ width: var(--domainkit-mark-size);
543
867
  }
544
868
 
545
869
  :where([data-domainkit-part="provider-mark"] img),
@@ -550,18 +874,6 @@
550
874
  width: 100%;
551
875
  }
552
876
 
553
- :where([data-domainkit-recipe="connect"]) {
554
- gap: 0.45rem;
555
- }
556
-
557
- :where([data-domainkit-recipe="connect"] [data-domainkit-part="provider-mark"]) {
558
- background: var(--domainkit-accent-contrast);
559
- border-color: color-mix(in oklch, var(--domainkit-accent) 18%, transparent);
560
- font-size: 0.625rem;
561
- height: 1.25rem;
562
- width: 1.25rem;
563
- }
564
-
565
877
  :where([data-domainkit-part="provider-mark"][data-domainkit-provider="vercel"]) {
566
878
  border-color: transparent;
567
879
  }
@@ -572,10 +884,10 @@
572
884
  border-radius: var(--domainkit-control-radius);
573
885
  display: grid;
574
886
  gap: 0.65rem;
575
- padding: 0.75rem;
887
+ padding: var(--domainkit-panel-pad);
576
888
  }
577
889
 
578
- :where([data-domainkit-part="token-connect"] label) {
890
+ :where([data-domainkit-part="token-connect"] [data-domainkit-part="field-label"]) {
579
891
  color: var(--domainkit-muted);
580
892
  display: grid;
581
893
  font-size: 0.8125rem;
@@ -607,27 +919,27 @@
607
919
  width: 100%;
608
920
  }
609
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
+
610
934
  :where([data-domainkit-part="connected-card"]) {
611
935
  align-items: center;
612
- background: var(--domainkit-background);
613
- border: 1px solid var(--domainkit-border);
614
- border-radius: var(--domainkit-radius);
936
+ column-gap: 1rem;
615
937
  display: grid;
616
- gap: 0.75rem 1rem;
617
938
  grid-template-columns: minmax(0, 1fr) auto;
618
939
  justify-content: space-between;
619
- min-height: 4.25rem;
620
- padding: 1rem;
621
940
  width: 100%;
622
941
  }
623
942
 
624
- :where([data-domainkit-part="connected-identity"]) {
625
- align-items: center;
626
- display: flex;
627
- gap: 0.75rem;
628
- min-width: 0;
629
- }
630
-
631
943
  :where([data-domainkit-part="connected-actions"]) {
632
944
  align-items: center;
633
945
  display: flex;
@@ -748,8 +1060,8 @@
748
1060
  }
749
1061
 
750
1062
  :where([data-domainkit-part="provisioning-flow"] > [data-domainkit-part="records-panel"]),
751
- :where([data-domainkit-part="provisioning-flow"] > [data-domainkit-part="flow-outcome"]),
752
- :where([data-domainkit-part="cleanup-flow"] > [data-domainkit-part="flow-outcome"]) {
1063
+ :where([data-domainkit-part="provisioning-flow"] > [data-domainkit-part="outcome"]),
1064
+ :where([data-domainkit-part="cleanup-flow"] > [data-domainkit-part="outcome"]) {
753
1065
  flex: 1 1 100%;
754
1066
  }
755
1067
 
@@ -902,10 +1214,13 @@
902
1214
  min-height: 1.5rem;
903
1215
  }
904
1216
 
1217
+ /* A record name longer than the popover wraps inside its own cell; the status keeps the row. */
905
1218
  :where([data-domainkit-part="observation-record"]) {
906
1219
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
907
1220
  font-size: 0.75rem;
908
1221
  font-weight: 600;
1222
+ min-width: 0;
1223
+ overflow-wrap: anywhere;
909
1224
  }
910
1225
 
911
1226
  :where([data-domainkit-part="observation-note"]) {
@@ -1054,12 +1369,23 @@
1054
1369
  font-size: 0.6875rem;
1055
1370
  }
1056
1371
 
1372
+ /* Glyph and word are one badge: a narrow status column breaks the line, not the badge. */
1057
1373
  :where([data-domainkit-part="record-status"]) {
1374
+ align-items: center;
1058
1375
  border-radius: 999px;
1376
+ display: inline-flex;
1059
1377
  font-size: 0.6875rem;
1060
1378
  font-weight: 600;
1379
+ gap: 0.25rem;
1061
1380
  letter-spacing: 0.02em;
1062
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;
1063
1389
  }
1064
1390
 
1065
1391
  :where([data-domainkit-part="record-status"][data-status="Found"]) {
@@ -1141,6 +1467,7 @@
1141
1467
  color: var(--domainkit-muted);
1142
1468
  }
1143
1469
 
1470
+ /* A record name is longer than a dialog is wide; it wraps rather than running off the row. */
1144
1471
  :where([data-domainkit-part="operation-record"]) {
1145
1472
  color: var(--domainkit-muted);
1146
1473
  display: grid;
@@ -1148,6 +1475,7 @@
1148
1475
  font-size: 0.75rem;
1149
1476
  gap: 0.2rem;
1150
1477
  min-width: 0;
1478
+ overflow-wrap: anywhere;
1151
1479
  }
1152
1480
 
1153
1481
  :where([data-domainkit-part="operation-value"]) {
@@ -1175,18 +1503,138 @@
1175
1503
  gap: 0.5rem;
1176
1504
  }
1177
1505
 
1178
- :where([data-domainkit-part="flow-outcome"]) {
1506
+ /* -------------------------------------------------------------------------------------------
1507
+ * Outcome: media, title, description, and the action, in a card or on one line
1508
+ * ----------------------------------------------------------------------------------------- */
1509
+
1510
+ :where([data-domainkit-part="outcome"]) {
1511
+ --domainkit-outcome-tone: var(--domainkit-danger);
1512
+ color: var(--domainkit-text);
1179
1513
  font-size: 0.875rem;
1180
- margin: 0;
1181
1514
  width: 100%;
1182
1515
  }
1183
1516
 
1184
- :where([data-domainkit-part="flow-outcome"][data-tone="success"]) {
1185
- color: var(--domainkit-success);
1517
+ :where([data-domainkit-part="outcome"][data-tone="success"]) {
1518
+ --domainkit-outcome-tone: var(--domainkit-success);
1186
1519
  }
1187
1520
 
1188
- :where([data-domainkit-part="flow-outcome"][data-tone="danger"]) {
1189
- color: var(--domainkit-danger);
1521
+ :where([data-domainkit-part="outcome"][data-tone="warning"]) {
1522
+ --domainkit-outcome-tone: var(--domainkit-warning);
1523
+ }
1524
+
1525
+ :where([data-domainkit-part="outcome"][data-layout="card"]) {
1526
+ border: 1px dashed color-mix(in srgb, var(--domainkit-outcome-tone) 45%, transparent);
1527
+ border-radius: var(--domainkit-radius);
1528
+ display: grid;
1529
+ gap: 0.75rem;
1530
+ justify-items: center;
1531
+ padding: 1.25rem 1rem;
1532
+ text-align: center;
1533
+ }
1534
+
1535
+ /* Glyph and title on one row, the description under the title, the action beside both. */
1536
+ :where([data-domainkit-part="outcome"][data-layout="inline"]) {
1537
+ align-items: start;
1538
+ column-gap: 0.5rem;
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;
1579
+ }
1580
+
1581
+ :where([data-domainkit-part="outcome-header"]) {
1582
+ display: grid;
1583
+ gap: 0.25rem;
1584
+ justify-items: inherit;
1585
+ }
1586
+
1587
+ :where(
1588
+ [data-domainkit-part="outcome"][data-layout="card"] [data-domainkit-part="outcome-header"]
1589
+ ) {
1590
+ gap: 0.35rem;
1591
+ max-width: 26rem;
1592
+ }
1593
+
1594
+ :where([data-domainkit-part="outcome-media"]) {
1595
+ align-items: center;
1596
+ color: var(--domainkit-outcome-tone);
1597
+ display: inline-flex;
1598
+ justify-content: center;
1599
+ }
1600
+
1601
+ :where([data-domainkit-part="outcome-media"] svg) {
1602
+ height: 1.25rem;
1603
+ width: 1.25rem;
1604
+ }
1605
+
1606
+ :where([data-domainkit-part="outcome-media"][data-variant="icon"]) {
1607
+ background: color-mix(in srgb, var(--domainkit-outcome-tone) 12%, transparent);
1608
+ border-radius: var(--domainkit-control-radius);
1609
+ height: 2.25rem;
1610
+ width: 2.25rem;
1611
+ }
1612
+
1613
+ :where(
1614
+ [data-domainkit-part="outcome"][data-layout="inline"]
1615
+ [data-domainkit-part="outcome-media"][data-variant="icon"]
1616
+ ) {
1617
+ background: none;
1618
+ height: 1.25rem;
1619
+ width: 1.25rem;
1620
+ }
1621
+
1622
+ :where([data-domainkit-part="outcome-title"]) {
1623
+ color: var(--domainkit-text);
1624
+ font-size: 0.875rem;
1625
+ font-weight: 600;
1626
+ }
1627
+
1628
+ :where([data-domainkit-part="outcome-description"]) {
1629
+ color: var(--domainkit-muted);
1630
+ font-size: 0.8125rem;
1631
+ margin: 0;
1632
+ }
1633
+
1634
+ :where([data-domainkit-part="outcome-content"]) {
1635
+ display: flex;
1636
+ flex-wrap: wrap;
1637
+ gap: 0.5rem;
1190
1638
  }
1191
1639
 
1192
1640
  :where([data-domainkit-part]:focus-visible) {
@@ -1235,12 +1683,17 @@
1235
1683
  gap: 0.5rem;
1236
1684
  }
1237
1685
 
1238
- [data-domainkit-part="token-field"] {
1686
+ [data-domainkit-part="field"] {
1239
1687
  display: grid;
1240
1688
  gap: 0.25rem;
1241
1689
  }
1242
1690
 
1243
- [data-domainkit-part="token-field-label"] {
1691
+ [data-domainkit-part="field"][data-orientation="horizontal"] {
1692
+ align-items: center;
1693
+ grid-template-columns: auto minmax(0, 1fr);
1694
+ }
1695
+
1696
+ [data-domainkit-part="field-label"] {
1244
1697
  align-items: baseline;
1245
1698
  color: var(--domainkit-muted);
1246
1699
  display: flex;
@@ -1248,12 +1701,12 @@
1248
1701
  gap: 0.375rem;
1249
1702
  }
1250
1703
 
1251
- [data-domainkit-part="token-field-optional"] {
1704
+ [data-domainkit-part="field-optional"] {
1252
1705
  font-size: 0.75rem;
1253
1706
  opacity: 0.8;
1254
1707
  }
1255
1708
 
1256
- [data-domainkit-part="token-field-input"] {
1709
+ [data-domainkit-part="field-input"] {
1257
1710
  background-color: var(--domainkit-background);
1258
1711
  border: 1px solid var(--domainkit-border);
1259
1712
  border-radius: var(--domainkit-control-radius);
@@ -1264,21 +1717,96 @@
1264
1717
  width: 100%;
1265
1718
  }
1266
1719
 
1267
- [data-domainkit-part="token-field-input"]:focus-visible {
1720
+ [data-domainkit-part="field-input"]:focus-visible {
1268
1721
  border-color: var(--domainkit-accent);
1269
1722
  outline: none;
1270
1723
  }
1271
1724
 
1272
- [data-domainkit-part="token-docs"] {
1725
+ [data-domainkit-part="field-input"][aria-invalid="true"] {
1726
+ border-color: var(--domainkit-danger);
1727
+ }
1728
+
1729
+ [data-domainkit-part="field-error"] {
1730
+ display: grid;
1731
+ gap: 0.25rem;
1732
+ }
1733
+
1734
+ [data-domainkit-part="field-description"] {
1273
1735
  align-items: center;
1736
+ border-radius: var(--domainkit-control-radius);
1274
1737
  color: var(--domainkit-muted);
1275
1738
  display: inline-flex;
1276
1739
  font-size: 0.8125rem;
1277
1740
  gap: 0.25rem;
1278
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);
1279
1745
  text-decoration: none;
1280
1746
  }
1281
1747
 
1748
+ [data-domainkit-part="field-description"]:hover {
1749
+ background: var(--domainkit-fill);
1750
+ color: var(--domainkit-text);
1751
+ }
1752
+
1753
+ /* ---------------------------------------------------------------------------------------------
1754
+ * The disconnected prompt, and the disclosures that keep the dialog to one decision
1755
+ * ------------------------------------------------------------------------------------------- */
1756
+
1757
+ [data-domainkit-part="connect-prompt"] {
1758
+ align-items: center;
1759
+ display: flex;
1760
+ flex-wrap: wrap;
1761
+ gap: 0.75rem;
1762
+ justify-content: space-between;
1763
+ width: 100%;
1764
+ }
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"],
1772
+ [data-domainkit-part="host-identity"] {
1773
+ column-gap: 0.5rem;
1774
+ display: grid;
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;
1785
+ }
1786
+
1787
+ [data-domainkit-part="host-name"] {
1788
+ font-size: var(--domainkit-identity-name);
1789
+ font-weight: 600;
1790
+ grid-column: 2;
1791
+ line-height: var(--domainkit-identity-leading);
1792
+ }
1793
+
1794
+ [data-domainkit-part="host-statement"] {
1795
+ color: var(--domainkit-muted);
1796
+ font-size: var(--domainkit-identity-line);
1797
+ grid-column: 2;
1798
+ line-height: var(--domainkit-identity-leading);
1799
+ }
1800
+
1801
+ button[data-domainkit-part="provider-heading"] {
1802
+ background: none;
1803
+ border: 0;
1804
+ cursor: pointer;
1805
+ padding: 0;
1806
+ text-align: start;
1807
+ width: 100%;
1808
+ }
1809
+
1282
1810
  [data-domainkit-part="discovery-resolved"],
1283
1811
  [data-domainkit-part="discovery-candidates"] {
1284
1812
  display: grid;
@@ -1319,10 +1847,12 @@
1319
1847
  gap: 0.375rem;
1320
1848
  }
1321
1849
 
1850
+ /* A DKIM key is one word wider than the popover; it breaks rather than widening the whole list. */
1322
1851
  [data-domainkit-part="observation-expected"] {
1323
1852
  color: var(--domainkit-muted);
1324
1853
  font-size: 0.8125rem;
1325
1854
  margin: 0;
1855
+ overflow-wrap: anywhere;
1326
1856
  }
1327
1857
 
1328
1858
  /* The source line above these is a small uppercase label; the values under it are data. */