@crewlethq/ui 0.35.1 → 0.37.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.
Files changed (176) hide show
  1. package/README.md +90 -1
  2. package/dist/AgentHandoffPanel/AgentHandoffPanel.d.ts +99 -0
  3. package/dist/AgentHandoffPanel/index.d.ts +3 -0
  4. package/dist/AgentHandoffPanel/index.js +16 -0
  5. package/dist/AgentHandoffPanel-JWSW62GU.css +151 -0
  6. package/dist/ArrangeFrame/index.js +1 -1
  7. package/dist/{ArrangeFrame-3PLZAG22.css → ArrangeFrame-QXOQTFAH.css} +22 -5
  8. package/dist/ArrangeList/index.js +4 -3
  9. package/dist/ArtifactAccess/ArtifactAccess.d.ts +40 -0
  10. package/dist/ArtifactAccess/index.d.ts +3 -0
  11. package/dist/ArtifactAccess/index.js +2 -0
  12. package/dist/ArtifactAccess-Y53ZTRFS.css +31 -0
  13. package/dist/ArtifactBar/ArtifactBar.d.ts +2 -1
  14. package/dist/ArtifactBar/index.js +2 -2
  15. package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
  16. package/dist/ArtifactCard/ArtifactCard.d.ts +1 -6
  17. package/dist/ArtifactCard/index.d.ts +2 -1
  18. package/dist/ArtifactCard/index.js +4 -3
  19. package/dist/ArtifactCover/index.js +3 -2
  20. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
  21. package/dist/ArtifactKindIllustration/index.js +1 -1
  22. package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-KLFL7KBG.css} +37 -1
  23. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
  24. package/dist/ArtifactMakeRow/index.d.ts +4 -0
  25. package/dist/ArtifactMakeRow/index.js +4 -0
  26. package/dist/ArtifactMakeRow-XBA2MPSY.css +167 -0
  27. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +37 -0
  28. package/dist/ArtifactNameCell/index.d.ts +4 -0
  29. package/dist/ArtifactNameCell/index.js +4 -0
  30. package/dist/ArtifactNameCell-RTVP4LO4.css +104 -0
  31. package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
  32. package/dist/ArtifactPanel/index.js +1 -1
  33. package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
  34. package/dist/AuthLayout/index.js +2 -2
  35. package/dist/AvatarPicker/index.js +2 -2
  36. package/dist/Canvas/index.js +2 -2
  37. package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
  38. package/dist/CanvasBoard/index.d.ts +1 -1
  39. package/dist/CanvasBoard/index.js +4 -4
  40. package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
  41. package/dist/CanvasToolbar/index.js +3 -3
  42. package/dist/Card/index.js +1 -1
  43. package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
  44. package/dist/Checkbox/index.js +3 -2
  45. package/dist/ChoiceButtons/index.js +1 -1
  46. package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
  47. package/dist/ChoiceList/index.js +1 -1
  48. package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
  49. package/dist/Combobox/index.js +3 -2
  50. package/dist/CommandPalette/index.js +3 -2
  51. package/dist/CommentThread/index.js +6 -5
  52. package/dist/Composer/Composer.d.ts +4 -0
  53. package/dist/Composer/index.js +3 -2
  54. package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
  55. package/dist/ConfirmField/index.js +3 -2
  56. package/dist/DataTable/index.js +4 -3
  57. package/dist/DataView/index.js +7 -6
  58. package/dist/DatasetSource/DatasetSource.d.ts +4 -0
  59. package/dist/DatasetSource/index.js +1 -1
  60. package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
  61. package/dist/DateTimePicker/index.js +2 -1
  62. package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
  63. package/dist/DocTabsEditor/index.js +3 -2
  64. package/dist/Document/Document.d.ts +15 -3
  65. package/dist/Document/index.js +2 -1
  66. package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
  67. package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
  68. package/dist/FilterChip/index.js +1 -1
  69. package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
  70. package/dist/Input/index.js +2 -1
  71. package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
  72. package/dist/LayersList/index.js +1 -1
  73. package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
  74. package/dist/LinkInterstitial/index.js +2 -2
  75. package/dist/ListInput/index.js +3 -2
  76. package/dist/LivePreview/LivePreview.d.ts +120 -28
  77. package/dist/LivePreview/budget.d.ts +64 -20
  78. package/dist/LivePreview/index.d.ts +6 -4
  79. package/dist/LivePreview/index.js +1 -1
  80. package/dist/LivePreview/stills.d.ts +57 -0
  81. package/dist/LivePreview-BROGKR4N.css +113 -0
  82. package/dist/PresenterView/index.js +2 -2
  83. package/dist/PrincipalPicker/index.js +4 -3
  84. package/dist/RichEditor/index.js +1 -1
  85. package/dist/Select/index.js +2 -1
  86. package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
  87. package/dist/ShareDialog/index.js +3 -2
  88. package/dist/SheetColumnEditor/index.js +6 -5
  89. package/dist/SheetGrid/index.js +3 -3
  90. package/dist/SlideCompare/index.js +2 -2
  91. package/dist/SlideFilmstrip/index.js +2 -2
  92. package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
  93. package/dist/SlideGrid/index.js +2 -2
  94. package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
  95. package/dist/SlideStage/index.js +1 -1
  96. package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
  97. package/dist/SourceEditor/index.js +2 -1
  98. package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
  99. package/dist/Switcher/index.js +4 -3
  100. package/dist/TagsInput/index.js +2 -1
  101. package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
  102. package/dist/ThemeGallery/index.js +1 -1
  103. package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
  104. package/dist/TimeWindowPicker/index.js +4 -3
  105. package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
  106. package/dist/TreeCanvas/index.js +3 -3
  107. package/dist/VersionTimeline/index.js +2 -2
  108. package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
  109. package/dist/{chunk-6JVRY5DQ.js → chunk-44WJLPQS.js} +2 -2
  110. package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
  111. package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
  112. package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
  113. package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
  114. package/dist/{chunk-GMU6SQ6B.js → chunk-66NGUD5S.js} +2 -2
  115. package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
  116. package/dist/{chunk-2CQLNML5.js → chunk-AOLCZDZ6.js} +3 -1
  117. package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
  118. package/dist/chunk-BGLKLXL3.js +29 -0
  119. package/dist/{chunk-Z6VW6CXX.js → chunk-BIQDJOJZ.js} +1 -1
  120. package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
  121. package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
  122. package/dist/chunk-EAKC24BW.js +51 -0
  123. package/dist/{chunk-CCLNGVCM.js → chunk-EARDAJQY.js} +1 -1
  124. package/dist/chunk-EOQFPZEE.js +138 -0
  125. package/dist/{chunk-THROPJZC.js → chunk-F23N4MVU.js} +1 -1
  126. package/dist/{chunk-J6YZ4IYV.js → chunk-FG4O64DV.js} +3 -3
  127. package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
  128. package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
  129. package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
  130. package/dist/{chunk-QFNWMWWY.js → chunk-GS7ZTHPF.js} +4 -4
  131. package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
  132. package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
  133. package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
  134. package/dist/{chunk-22CQQDFW.js → chunk-JML75PGJ.js} +1 -1
  135. package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
  136. package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
  137. package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
  138. package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
  139. package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
  140. package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
  141. package/dist/{chunk-7UYONN6K.js → chunk-OHA6WSAG.js} +6 -11
  142. package/dist/chunk-P5VGSVWG.js +39 -0
  143. package/dist/chunk-P6WFZDKS.js +111 -0
  144. package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
  145. package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
  146. package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
  147. package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
  148. package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
  149. package/dist/{chunk-W7QBBKUE.js → chunk-UBZDYOCA.js} +7 -3
  150. package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
  151. package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
  152. package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
  153. package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
  154. package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
  155. package/dist/chunk-WYKWXRJ4.js +456 -0
  156. package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
  157. package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
  158. package/dist/chunk-YSGLEHND.js +56 -0
  159. package/dist/generated/index.d.ts +4 -0
  160. package/dist/generated/index.js +105 -100
  161. package/dist/index.js +105 -100
  162. package/dist/styles.css +1036 -163
  163. package/dist/utils/focusModality.d.ts +41 -0
  164. package/dist/utils/index.d.ts +2 -0
  165. package/dist/utils/index.js +2 -1
  166. package/package.json +3 -3
  167. package/dist/LivePreview-SRO7KHO4.css +0 -65
  168. package/dist/chunk-KF6YGL4B.js +0 -160
  169. package/dist/chunk-TYKQ33CL.js +0 -35
  170. package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
  171. package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
  172. package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
  173. package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
  174. package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
  175. package/dist/{chunk-3WCNHYXE.js → chunk-PNNYVN52.js} +0 -0
  176. package/dist/{chunk-FF5OZV77.js → chunk-W3HYWD63.js} +2 -2
package/dist/styles.css CHANGED
@@ -548,6 +548,160 @@
548
548
  }
549
549
 
550
550
 
551
+ /* AgentHandoffPanel-JWSW62GU.css */
552
+ /*
553
+ * Handing work to an agent, at the side of what is being made. The panel is
554
+ * an ArtifactPanel; this is its inside: the brief, its starters, the agent,
555
+ * what goes with it and the steps after, on one rhythm, and the commit in the
556
+ * panel's foot.
557
+ *
558
+ * ONE STEP BETWEEN SECTIONS (spacing-6) and one inside them (spacing-2): the
559
+ * brief and its helper read as one block, the next question as the next.
560
+ */
561
+
562
+ .crewlet-agent-handoff__body {
563
+ display: flex;
564
+ flex-direction: column;
565
+ gap: var(--spacing-6);
566
+ min-width: 0;
567
+ }
568
+
569
+ .crewlet-agent-handoff__intro {
570
+ margin: 0;
571
+ color: var(--color-text-secondary);
572
+ font-size: var(--font-size-sm);
573
+ line-height: var(--font-line-height-normal);
574
+ }
575
+
576
+ .crewlet-agent-handoff__brief {
577
+ display: flex;
578
+ flex-direction: column;
579
+ gap: var(--spacing-2);
580
+ min-width: 0;
581
+ }
582
+
583
+ /* THE BRIEF'S NAME is a section's name, at a section heading's size, since
584
+ it heads the panel's first question. */
585
+ .crewlet-agent-handoff__label {
586
+ color: var(--color-text-primary);
587
+ font-size: var(--font-size-sm);
588
+ font-weight: var(--font-weight-semibold);
589
+ line-height: var(--font-line-height-snug);
590
+ }
591
+
592
+ .crewlet-agent-handoff__helper {
593
+ margin: 0;
594
+ color: var(--color-text-tertiary);
595
+ font-size: var(--font-size-xs);
596
+ line-height: var(--font-line-height-normal);
597
+ }
598
+
599
+ .crewlet-agent-handoff__starters {
600
+ display: flex;
601
+ flex-wrap: wrap;
602
+ gap: var(--spacing-2);
603
+ }
604
+
605
+ .crewlet-agent-handoff__section {
606
+ min-width: 0;
607
+ }
608
+
609
+ .crewlet-agent-handoff__carried {
610
+ display: flex;
611
+ flex-direction: column;
612
+ gap: var(--spacing-1);
613
+ margin: 0 0 var(--spacing-2);
614
+ padding: 0;
615
+ list-style: none;
616
+ }
617
+
618
+ .crewlet-agent-handoff__item {
619
+ display: flex;
620
+ align-items: flex-start;
621
+ gap: var(--spacing-2);
622
+ padding: var(--spacing-2) var(--spacing-3);
623
+ border-radius: var(--radius-md);
624
+ background: var(--color-surface-subtle);
625
+ }
626
+
627
+ .crewlet-agent-handoff__item-icon {
628
+ display: inline-flex;
629
+ flex: none;
630
+ /* On the first line's centre, whatever the glyph's own box. */
631
+ margin-top: 1px;
632
+ color: var(--color-text-tertiary);
633
+ }
634
+
635
+ .crewlet-agent-handoff__item-words {
636
+ display: flex;
637
+ flex-direction: column;
638
+ gap: 2px;
639
+ min-width: 0;
640
+ }
641
+
642
+ .crewlet-agent-handoff__item-label {
643
+ overflow-wrap: anywhere;
644
+ color: var(--color-text-primary);
645
+ font-size: var(--font-size-sm);
646
+ line-height: var(--font-line-height-snug);
647
+ }
648
+
649
+ .crewlet-agent-handoff__item-detail {
650
+ overflow-wrap: anywhere;
651
+ color: var(--color-text-tertiary);
652
+ font-size: var(--font-size-xs);
653
+ line-height: var(--font-line-height-normal);
654
+ }
655
+
656
+ .crewlet-agent-handoff__task {
657
+ display: flex;
658
+ flex-direction: column;
659
+ gap: var(--spacing-2);
660
+ padding-top: var(--spacing-2);
661
+ }
662
+
663
+ .crewlet-agent-handoff__task-title {
664
+ margin: 0;
665
+ color: var(--color-text-primary);
666
+ font-size: var(--font-size-sm);
667
+ font-weight: var(--font-weight-medium);
668
+ }
669
+
670
+ /* THE BODY AS SENT, wrapped rather than scrolled sideways: a reader checks it
671
+ line by line, and a panel's width is narrower than its longest line. */
672
+ .crewlet-agent-handoff__task-body {
673
+ max-height: 16rem;
674
+ margin: 0;
675
+ overflow: auto;
676
+ padding: var(--spacing-2) var(--spacing-3);
677
+ border-radius: var(--radius-md);
678
+ background: var(--color-surface-inset);
679
+ color: var(--color-text-secondary);
680
+ font-family: var(--font-family-mono);
681
+ font-size: var(--font-size-xs);
682
+ line-height: var(--font-line-height-normal);
683
+ white-space: pre-wrap;
684
+ overflow-wrap: anywhere;
685
+ }
686
+
687
+ .crewlet-agent-handoff__foot {
688
+ display: flex;
689
+ flex-direction: column;
690
+ gap: var(--spacing-2);
691
+ }
692
+
693
+ .crewlet-agent-handoff__media {
694
+ display: inline-flex;
695
+ }
696
+
697
+ .crewlet-agent-handoff__reason {
698
+ margin: 0;
699
+ color: var(--color-text-tertiary);
700
+ font-size: var(--font-size-xs);
701
+ line-height: var(--font-line-height-normal);
702
+ }
703
+
704
+
551
705
  /* AppShell-JTSEOA57.css */
552
706
  /*
553
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
@@ -1377,7 +1531,7 @@ button.crewlet-account-row__who:focus-visible {
1377
1531
  }
1378
1532
 
1379
1533
 
1380
- /* ArrangeFrame-3PLZAG22.css */
1534
+ /* ArrangeFrame-QXOQTFAH.css */
1381
1535
  /*
1382
1536
  * ArrangeFrame: a block of a page being arranged.
1383
1537
  *
@@ -1439,9 +1593,8 @@ button.crewlet-account-row__who:focus-visible {
1439
1593
 
1440
1594
  /*
1441
1595
  * THE ONE RING, over the block's own edge, on the innermost block the
1442
- * pointer or the focus is in. A hairline drawn exactly over the block's own
1443
- * 1px border, so the border turns to the accent rather than a second, heavier
1444
- * line appearing around it.
1596
+ * pointer or the focus is in. Drawn exactly over the block's own 1px border,
1597
+ * so the border changes colour rather than a second line appearing around it.
1445
1598
  *
1446
1599
  * IT IS A LAYER OF ITS OWN, above the content. An outline is painted with the
1447
1600
  * block, under any content that is positioned or scrolls (a card with a fixed
@@ -1458,14 +1611,32 @@ button.crewlet-account-row__who:focus-visible {
1458
1611
  border-radius: inherit;
1459
1612
  pointer-events: none;
1460
1613
  }
1461
- .crewlet-arrange-frame.is-editing:is(:hover, :focus-visible, :has(:focus-visible)):not(
1614
+ /*
1615
+ * THREE STRENGTHS ON THE ONE LAYER. The innermost block under the pointer, or
1616
+ * holding the focus in one of its fields, takes the selected edge, the accent
1617
+ * mixed toward the page: it says where the reader is working, and in the full
1618
+ * accent a caret in a cell's field drew a frame in the focus ring's own hue
1619
+ * round the whole block. The block ITSELF in keyboard focus takes the focus
1620
+ * ring, two pixels in the focus colour, the area a keyboard indicator needs.
1621
+ * A picked or resizing block takes one crisp pixel of the full accent, as a
1622
+ * picked board on a canvas does, its handles saying the rest.
1623
+ */
1624
+ .crewlet-arrange-frame.is-editing:is(:hover, :has(:focus-visible)):not(:focus-visible, .is-selected, .is-resizing):not(
1462
1625
  :has(.crewlet-arrange-frame:is(:hover, :focus-visible, :has(:focus-visible)))
1463
- )::after,
1626
+ )::after {
1627
+ border-color: var(--color-border-selected);
1628
+ }
1629
+
1464
1630
  .crewlet-arrange-frame.is-selected::after,
1465
1631
  .crewlet-arrange-frame.is-resizing::after {
1466
1632
  border-color: var(--color-brand-accent);
1467
1633
  }
1468
1634
 
1635
+ .crewlet-arrange-frame.is-editing:focus-visible::after {
1636
+ border-width: 2px;
1637
+ border-color: var(--color-focus);
1638
+ }
1639
+
1469
1640
  /* A block with no surface of its own takes its ring a step outside it. */
1470
1641
  .crewlet-arrange-frame.is-bare {
1471
1642
  --crewlet-arrange-frame-radius: var(--radius-md);
@@ -2041,7 +2212,41 @@ button.crewlet-account-row__who:focus-visible {
2041
2212
  }
2042
2213
 
2043
2214
 
2044
- /* ArtifactBar-HV5AT4RG.css */
2215
+ /* ArtifactAccess-Y53ZTRFS.css */
2216
+ /*
2217
+ * An artifact's access as a glyph and its word. No colour of its own: the
2218
+ * glyph is the tertiary step and the word the secondary, one step stronger
2219
+ * where others can open it.
2220
+ */
2221
+
2222
+ .crewlet-artifact-access {
2223
+ display: inline-flex;
2224
+ align-items: center;
2225
+ gap: calc(var(--spacing-1) * 1.5);
2226
+ min-width: 0;
2227
+ max-width: 100%;
2228
+ color: var(--color-text-tertiary);
2229
+ }
2230
+
2231
+ .crewlet-artifact-access__glyph {
2232
+ display: inline-flex;
2233
+ flex: none;
2234
+ }
2235
+
2236
+ .crewlet-artifact-access__word {
2237
+ min-width: 0;
2238
+ overflow: hidden;
2239
+ text-overflow: ellipsis;
2240
+ white-space: nowrap;
2241
+ }
2242
+
2243
+ .crewlet-artifact-access--shared,
2244
+ .crewlet-artifact-access--company {
2245
+ color: var(--color-text-secondary);
2246
+ }
2247
+
2248
+
2249
+ /* ArtifactBar-FWPBBKQ5.css */
2045
2250
  /*
2046
2251
  * One row, one hairline under it, the height of a large row. The lead (the
2047
2252
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2242,11 +2447,19 @@ button.crewlet-account-row__who:focus-visible {
2242
2447
  margin-inline-start: var(--spacing-1);
2243
2448
  }
2244
2449
 
2450
+ /* THE STATUS IS QUIET by default, in the bar's small step and the secondary
2451
+ ink that `EditingStatus` takes, so a host that hands it words ("Creating…",
2452
+ "25 words") draws them as the open artifact draws its own, never at the
2453
+ title's weight. Its figures are tabular, so a count does not jitter. */
2245
2454
  .crewlet-artifact-bar__status {
2246
2455
  display: inline-flex;
2247
2456
  align-items: center;
2248
2457
  min-width: 0;
2249
2458
  margin-inline-end: var(--spacing-2);
2459
+ color: var(--color-text-secondary);
2460
+ font-size: var(--font-size-compact);
2461
+ font-variant-numeric: tabular-nums;
2462
+ white-space: nowrap;
2250
2463
  }
2251
2464
 
2252
2465
  .crewlet-artifact-bar__presence {
@@ -2812,9 +3025,9 @@ button.crewlet-account-row__who:focus-visible {
2812
3025
  }
2813
3026
 
2814
3027
 
2815
- /* ArtifactKindIllustration-5FPRJQ3P.css */
3028
+ /* ArtifactKindIllustration-KLFL7KBG.css */
2816
3029
  /*
2817
- * A kind's drawing, its tinted ground and the Make something new tile.
3030
+ * A kind's drawing, its tinted ground and the "Start a new artifact" tile.
2818
3031
  *
2819
3032
  * Every colour is the kind's token, `--color-artifact-kind-<kind>` and its
2820
3033
  * Fill and Line steps, set once per kind on `--crewlet-kind-*`
@@ -3004,53 +3217,366 @@ button.crewlet-account-row__who:focus-visible {
3004
3217
  white-space: nowrap;
3005
3218
  }
3006
3219
 
3007
- /* HOVER IS THE FRAME'S STEP ALONE: the drawing inside stays still, as a
3008
- card's preview does, so a row of tiles never ripples under the pointer. */
3009
- a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3010
- .crewlet-kind-tile--button:hover .crewlet-kind-tile__frame {
3011
- border-color: var(--color-border-hover);
3220
+ /* HOVER IS THE FRAME'S STEP ALONE: the drawing inside stays still, as a
3221
+ card's preview does, so a row of tiles never ripples under the pointer. */
3222
+ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3223
+ .crewlet-kind-tile--button:hover .crewlet-kind-tile__frame {
3224
+ border-color: var(--color-border-hover);
3225
+ }
3226
+
3227
+ .crewlet-kind-tile:focus-visible .crewlet-kind-tile__frame {
3228
+ outline: 2px solid var(--color-focus);
3229
+ outline-offset: var(--size-focus-ring-inset-offset);
3230
+ }
3231
+
3232
+ /*
3233
+ * A TILE THAT STARTS SOMETHING IN PLACE (a create page's starting layouts)
3234
+ * DRAWS ONE EDGE. Its face is a picture of the layout, with boards of its
3235
+ * own, so the ground's tinted inner line was a second outline a few pixels
3236
+ * inside the frame's, and with the focus ring over the frame the tile read as
3237
+ * three nested rings. The frame is the tile's one edge; the ground keeps its
3238
+ * tint.
3239
+ */
3240
+ .crewlet-kind-tile--button .crewlet-kind-tile__ground {
3241
+ box-shadow: none;
3242
+ }
3243
+
3244
+ /*
3245
+ * CHOSEN, as every chosen option is drawn: the selected edge (the accent
3246
+ * mixed toward the page) on the frame, over the selected fill, and a check
3247
+ * beside the name, the mark that clears 3:1. Under the pointer it keeps its
3248
+ * edge, and the focus ring is drawn over it for the keyboard alone.
3249
+ */
3250
+ .crewlet-kind-tile--button.is-selected .crewlet-kind-tile__frame,
3251
+ .crewlet-kind-tile--button.is-selected:hover .crewlet-kind-tile__frame {
3252
+ border-color: var(--color-border-selected);
3253
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
3254
+ }
3255
+
3256
+ .crewlet-kind-tile__check {
3257
+ flex: none;
3258
+ margin-inline-start: auto;
3259
+ color: var(--color-brand-accent-ink);
3260
+ }
3261
+
3262
+ @media (forced-colors: active) {
3263
+ .crewlet-kind-tile--button.is-selected .crewlet-kind-tile__frame {
3264
+ border-color: Highlight;
3265
+ }
3266
+ }
3267
+
3268
+ .crewlet-kind-tile--disabled {
3269
+ cursor: not-allowed;
3270
+ }
3271
+
3272
+ .crewlet-kind-tile--disabled .crewlet-kind-tile__ground,
3273
+ .crewlet-kind-tile--disabled .crewlet-kind-tile__name {
3274
+ opacity: 0.55;
3275
+ }
3276
+
3277
+ @media (prefers-reduced-motion: reduce) {
3278
+ .crewlet-kind-tile__frame {
3279
+ transition: none;
3280
+ }
3281
+ }
3282
+
3283
+
3284
+ /* ArtifactKinds-CVD3FCYO.css */
3285
+ /*
3286
+ * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
3287
+ * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
3288
+ * glyph is drawn in. Every surface that tints by kind reads these, so a kind
3289
+ * glyph in a bar, a card's badge and a Make row's tile repaint together with
3290
+ * the theme, and no surface spells a kind's colour of its own. A sheet of
3291
+ * its own, imported by each surface that tints, because the glyph's module
3292
+ * carries no stylesheet (a frame that draws one glyph takes nothing else).
3293
+ */
3294
+ .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); }
3295
+ .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); }
3296
+ .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
3297
+ .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
3298
+ .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
3299
+ .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3300
+
3301
+
3302
+ /* ArtifactMakeRow-XBA2MPSY.css */
3303
+ /*
3304
+ * The "Start a new artifact" tray.
3305
+ *
3306
+ * Every colour is a token: the tray's ground, its dots and its hairlines are
3307
+ * the surface and border steps, and each kind's mark reads the kind's own
3308
+ * Fill, Line and Ink (`ArtifactKinds.css`), so the tray repaints with the
3309
+ * theme and holds no colour of its own.
3310
+ *
3311
+ * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
3312
+ * page column a sidebar narrows, so three steps are container queries on the
3313
+ * tray. Under 560px three across in two lines; from 560px the six in one
3314
+ * line, each its mark over its name, so a long name is never cut; from 920px
3315
+ * the mark beside the name and what the kind is for under it.
3316
+ */
3317
+
3318
+ .crewlet-make-row {
3319
+ container-type: inline-size;
3320
+ /* A WORKBENCH: the canvas's dotted field on the sheet itself, one step
3321
+ quieter than a canvas that pans, inside a hairline ring. */
3322
+ border: 1px solid var(--color-border-default);
3323
+ border-radius: var(--radius-lg);
3324
+ background-color: var(--color-surface-background);
3325
+ background-image: radial-gradient(var(--color-border-default) 1px, transparent 1.2px);
3326
+ background-size: var(--spacing-4) var(--spacing-4);
3327
+ background-position: calc(var(--spacing-4) / 2) calc(var(--spacing-4) / 2);
3328
+ }
3329
+
3330
+ .crewlet-make-row__list {
3331
+ display: grid;
3332
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3333
+ gap: var(--spacing-1);
3334
+ margin: 0;
3335
+ padding: var(--spacing-1);
3336
+ list-style: none;
3337
+ }
3338
+
3339
+ .crewlet-make-row__cell {
3340
+ display: flex;
3341
+ min-width: 0;
3342
+ }
3343
+
3344
+ .crewlet-make-row__item {
3345
+ display: flex;
3346
+ flex: 1;
3347
+ flex-direction: column;
3348
+ align-items: center;
3349
+ gap: var(--spacing-2);
3350
+ min-width: 0;
3351
+ box-sizing: border-box;
3352
+ padding: var(--spacing-3) var(--spacing-2);
3353
+ border: 1px solid transparent;
3354
+ border-radius: var(--radius-md);
3355
+ color: var(--color-text-primary);
3356
+ text-decoration: none;
3357
+ outline: none;
3358
+ transition:
3359
+ background-color var(--motion-duration-fast) var(--motion-easing-out),
3360
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
3361
+ box-shadow var(--motion-duration-fast) var(--motion-easing-out);
3362
+ }
3363
+
3364
+ /* THE GLYPH ON ITS KIND'S TINT, the one coloured thing in the item. */
3365
+ .crewlet-make-row__mark {
3366
+ display: inline-flex;
3367
+ flex: none;
3368
+ align-items: center;
3369
+ justify-content: center;
3370
+ width: 32px;
3371
+ height: 32px;
3372
+ border-radius: var(--radius-md);
3373
+ background: var(--crewlet-kind-fill);
3374
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
3375
+ color: var(--crewlet-kind-ink);
3376
+ }
3377
+
3378
+ .crewlet-make-row__words {
3379
+ display: flex;
3380
+ flex-direction: column;
3381
+ align-items: center;
3382
+ min-width: 0;
3383
+ max-width: 100%;
3384
+ }
3385
+
3386
+ .crewlet-make-row__name,
3387
+ .crewlet-make-row__detail {
3388
+ max-width: 100%;
3389
+ overflow: hidden;
3390
+ text-overflow: ellipsis;
3391
+ white-space: nowrap;
3392
+ }
3393
+
3394
+ .crewlet-make-row__name {
3395
+ font-size: var(--font-size-sm);
3396
+ font-weight: var(--font-weight-medium);
3397
+ line-height: 1.3;
3398
+ }
3399
+
3400
+ /* WHAT IT IS FOR is the widest step's: on a narrower tray the name alone
3401
+ says it, and the details are kept as the item's description. */
3402
+ .crewlet-make-row__detail {
3403
+ display: none;
3404
+ color: var(--color-text-tertiary);
3405
+ font-size: var(--font-size-xs);
3406
+ line-height: 1.35;
3407
+ }
3408
+
3409
+ @container (width >= 560px) {
3410
+ .crewlet-make-row__list {
3411
+ grid-template-columns: repeat(6, minmax(0, 1fr));
3412
+ }
3413
+
3414
+ .crewlet-make-row__item {
3415
+ padding: var(--spacing-2) var(--spacing-1);
3416
+ }
3417
+ }
3418
+
3419
+ @container (width >= 920px) {
3420
+ .crewlet-make-row__item {
3421
+ flex-direction: row;
3422
+ gap: var(--spacing-3);
3423
+ padding: var(--spacing-2);
3424
+ }
3425
+
3426
+ .crewlet-make-row__words {
3427
+ align-items: flex-start;
3428
+ }
3429
+
3430
+ .crewlet-make-row__detail {
3431
+ display: block;
3432
+ }
3433
+ }
3434
+
3435
+ /* AN ITEM LIFTS OFF THE BENCH under the pointer as a card: the card's
3436
+ ground, the hairline a card is found by and the lightest shadow, and
3437
+ nothing inside it moves. */
3438
+ a.crewlet-make-row__item:hover {
3439
+ border-color: var(--color-border-default);
3440
+ background-color: var(--color-surface-subtle);
3441
+ box-shadow: var(--shadow-xs);
3442
+ }
3443
+
3444
+ a.crewlet-make-row__item:active {
3445
+ background-color: var(--color-surface-pressed);
3446
+ box-shadow: none;
3447
+ }
3448
+
3449
+ /* ON ITS OWN EDGE: an item draws a hairline once lifted, so the ring sits on
3450
+ it rather than standing off it with a gap between two edges. */
3451
+ .crewlet-make-row__item:focus-visible {
3452
+ outline: 2px solid var(--color-focus);
3453
+ outline-offset: var(--size-focus-ring-inset-offset);
3454
+ }
3455
+
3456
+ .crewlet-make-row__item--disabled {
3457
+ cursor: not-allowed;
3458
+ }
3459
+
3460
+ .crewlet-make-row__item--disabled .crewlet-make-row__mark,
3461
+ .crewlet-make-row__item--disabled .crewlet-make-row__words {
3462
+ opacity: 0.55;
3463
+ }
3464
+
3465
+ @media (prefers-reduced-motion: reduce) {
3466
+ .crewlet-make-row__item {
3467
+ transition: none;
3468
+ }
3469
+ }
3470
+
3471
+
3472
+ /* ArtifactNameCell-RTVP4LO4.css */
3473
+ /*
3474
+ * An artifact's name in a list: the kind's mark on its tint, the title over
3475
+ * one quiet line. Every colour is a token: the mark reads the kind's own Fill,
3476
+ * Line and Ink (`ArtifactKinds.css`), the words the text steps.
3477
+ */
3478
+
3479
+ .crewlet-artifact-name {
3480
+ display: flex;
3481
+ align-items: center;
3482
+ gap: var(--spacing-3);
3483
+ min-width: 0;
3484
+ max-width: 100%;
3485
+ padding-block: var(--spacing-1);
3486
+ }
3487
+
3488
+ /* THE MARK, the Make row's tile at a list's size: the kind's glyph on its
3489
+ tint inside the kind's hairline. */
3490
+ .crewlet-artifact-name__mark {
3491
+ display: inline-flex;
3492
+ flex: none;
3493
+ align-items: center;
3494
+ justify-content: center;
3495
+ width: 32px;
3496
+ height: 32px;
3497
+ box-sizing: border-box;
3498
+ border-radius: var(--radius-md);
3499
+ background: var(--crewlet-kind-fill);
3500
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
3501
+ color: var(--crewlet-kind-ink);
3502
+ transition: box-shadow var(--motion-duration-fast) var(--motion-easing-out);
3503
+ }
3504
+
3505
+ /* UNDER THE POINTER the row's ground moves (the row's own hover), and the
3506
+ mark's hairline takes the kind's hue, so the one coloured thing on the row
3507
+ answers too. No lift and no movement: a list is read down, not played. */
3508
+ :is(tr, [role='row']):hover .crewlet-artifact-name__mark {
3509
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
3510
+ }
3511
+
3512
+ .crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
3513
+ background: var(--color-surface-inset);
3514
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
3515
+ color: var(--color-text-tertiary);
3516
+ }
3517
+
3518
+ .crewlet-artifact-name__words {
3519
+ display: flex;
3520
+ flex-direction: column;
3521
+ gap: 2px;
3522
+ min-width: 0;
3523
+ }
3524
+
3525
+ .crewlet-artifact-name__title-row {
3526
+ display: flex;
3527
+ align-items: center;
3528
+ gap: var(--spacing-1);
3529
+ min-width: 0;
3530
+ }
3531
+
3532
+ .crewlet-artifact-name__title {
3533
+ min-width: 0;
3534
+ overflow: hidden;
3535
+ text-overflow: ellipsis;
3536
+ white-space: nowrap;
3537
+ color: var(--color-text-primary);
3538
+ font-size: var(--font-size-sm);
3539
+ font-weight: var(--font-weight-medium);
3540
+ line-height: 1.35;
3541
+ }
3542
+
3543
+ .crewlet-artifact-name__pin {
3544
+ display: inline-flex;
3545
+ flex: none;
3546
+ color: var(--color-text-tertiary);
3012
3547
  }
3013
3548
 
3014
- .crewlet-kind-tile:focus-visible .crewlet-kind-tile__frame {
3015
- outline: 2px solid var(--color-focus);
3016
- outline-offset: var(--size-focus-ring-inset-offset);
3549
+ .crewlet-artifact-name__detail {
3550
+ display: flex;
3551
+ align-items: baseline;
3552
+ gap: var(--spacing-1);
3553
+ min-width: 0;
3554
+ overflow: hidden;
3555
+ white-space: nowrap;
3556
+ color: var(--color-text-tertiary);
3557
+ font-size: var(--font-size-xs);
3558
+ line-height: 1.35;
3017
3559
  }
3018
3560
 
3019
- .crewlet-kind-tile--disabled {
3020
- cursor: not-allowed;
3561
+ .crewlet-artifact-name__kind,
3562
+ .crewlet-artifact-name__dot {
3563
+ flex: none;
3021
3564
  }
3022
3565
 
3023
- .crewlet-kind-tile--disabled .crewlet-kind-tile__ground,
3024
- .crewlet-kind-tile--disabled .crewlet-kind-tile__name {
3025
- opacity: 0.55;
3566
+ .crewlet-artifact-name__about {
3567
+ min-width: 0;
3568
+ overflow: hidden;
3569
+ text-overflow: ellipsis;
3026
3570
  }
3027
3571
 
3028
3572
  @media (prefers-reduced-motion: reduce) {
3029
- .crewlet-kind-tile__frame {
3573
+ .crewlet-artifact-name__mark {
3030
3574
  transition: none;
3031
3575
  }
3032
3576
  }
3033
3577
 
3034
3578
 
3035
- /* ArtifactKinds-CVD3FCYO.css */
3036
- /*
3037
- * A kind's colours, set once per kind on `--crewlet-kind-*` by its class
3038
- * (`crewlet-kind--<kind>`): the hue, its Fill and Line steps and the ink a
3039
- * glyph is drawn in. Every surface that tints by kind reads these, so a kind
3040
- * glyph in a bar, a card's badge and a Make row's tile repaint together with
3041
- * the theme, and no surface spells a kind's colour of its own. A sheet of
3042
- * its own, imported by each surface that tints, because the glyph's module
3043
- * carries no stylesheet (a frame that draws one glyph takes nothing else).
3044
- */
3045
- .crewlet-kind--doc { --crewlet-kind-hue: var(--color-artifact-kind-doc); --crewlet-kind-fill: var(--color-artifact-kind-doc-fill); --crewlet-kind-line: var(--color-artifact-kind-doc-line); --crewlet-kind-ink: var(--color-artifact-kind-doc-ink); }
3046
- .crewlet-kind--slides { --crewlet-kind-hue: var(--color-artifact-kind-slides); --crewlet-kind-fill: var(--color-artifact-kind-slides-fill); --crewlet-kind-line: var(--color-artifact-kind-slides-line); --crewlet-kind-ink: var(--color-artifact-kind-slides-ink); }
3047
- .crewlet-kind--design { --crewlet-kind-hue: var(--color-artifact-kind-design); --crewlet-kind-fill: var(--color-artifact-kind-design-fill); --crewlet-kind-line: var(--color-artifact-kind-design-line); --crewlet-kind-ink: var(--color-artifact-kind-design-ink); }
3048
- .crewlet-kind--dashboard { --crewlet-kind-hue: var(--color-artifact-kind-dashboard); --crewlet-kind-fill: var(--color-artifact-kind-dashboard-fill); --crewlet-kind-line: var(--color-artifact-kind-dashboard-line); --crewlet-kind-ink: var(--color-artifact-kind-dashboard-ink); }
3049
- .crewlet-kind--html { --crewlet-kind-hue: var(--color-artifact-kind-html); --crewlet-kind-fill: var(--color-artifact-kind-html-fill); --crewlet-kind-line: var(--color-artifact-kind-html-line); --crewlet-kind-ink: var(--color-artifact-kind-html-ink); }
3050
- .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3051
-
3052
-
3053
- /* ArtifactPanel-HW3SU7CP.css */
3579
+ /* ArtifactPanel-KKUUIPEU.css */
3054
3580
  /*
3055
3581
  * The workspace is a row: the artifact's body, then at most one panel. The
3056
3582
  * body scrolls itself, so a panel beside it stays in view however far the
@@ -3170,6 +3696,15 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3170
3696
  overscroll-behavior: contain;
3171
3697
  }
3172
3698
 
3699
+ /* THE FOOT holds the panel's own commit, outside the scrolling body, so it
3700
+ stays in reach at every scroll. Its inset is the body's. */
3701
+ .crewlet-artifact-panel__foot {
3702
+ flex: none;
3703
+ padding: var(--spacing-3) var(--spacing-4);
3704
+ border-top: 1px solid var(--color-border-default);
3705
+ background: var(--color-surface-background);
3706
+ }
3707
+
3173
3708
  /* NOT ROOM FOR TWO COLUMNS: the panel slides over the artifact's end edge,
3174
3709
  raised off it, rather than squeezing the artifact under a useful width. */
3175
3710
  @container crewlet-artifact-workspace (width < 960px) {
@@ -5095,7 +5630,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5095
5630
  }
5096
5631
 
5097
5632
 
5098
- /* CanvasBoard-5NNSKY6A.css */
5633
+ /* CanvasBoard-TS4P356F.css */
5099
5634
  /*
5100
5635
  * A canvas of artboards and notes (CanvasBoard.tsx). Boards and notes are laid
5101
5636
  * out in canvas pixels inside the canvas's world and scale with it; their
@@ -5180,19 +5715,26 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5180
5715
  }
5181
5716
 
5182
5717
  /*
5183
- * HOVER, then SELECTION, in the accent: one screen pixel and then two, over
5184
- * the hairline. Hovering a board's name is hovering its board, which is how a
5185
- * reader finds the board a name belongs to on a crowded canvas.
5718
+ * HOVER, then SELECTION: one screen pixel each, over the hairline. Hover is
5719
+ * the selected edge, the accent mixed toward the canvas, so pointing at a
5720
+ * board previews the pick without claiming it; selection is the full accent,
5721
+ * crisp, with its four corners drawn, which are what say "this one" on a
5722
+ * canvas where a board's own content can be any colour. It was two pixels,
5723
+ * the focus ring's weight in the focus ring's hue, so a picked board and the
5724
+ * board the keyboard was on read alike; the 2px ring is the live board's now
5725
+ * alone ([data-active], below), which takes the pointer like a focused frame.
5726
+ * Hovering a board's name is hovering its board, which is how a reader finds
5727
+ * the board a name belongs to on a crowded canvas.
5186
5728
  */
5187
5729
  .crewlet-canvas-board__board:hover .crewlet-canvas-board__body,
5188
5730
  .crewlet-canvas-board__note:hover {
5189
- outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5731
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-border-selected);
5190
5732
  outline-offset: 0;
5191
5733
  }
5192
5734
 
5193
5735
  .crewlet-canvas-board__board[data-selected] .crewlet-canvas-board__body,
5194
5736
  .crewlet-canvas-board__note[data-selected] {
5195
- outline: calc(2px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5737
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5196
5738
  outline-offset: 0;
5197
5739
  }
5198
5740
 
@@ -5300,7 +5842,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5300
5842
  transform-origin: bottom left;
5301
5843
  }
5302
5844
 
5303
- /* A board drawn too narrow to name goes unnamed (`boardRoom`). */
5845
+ /* A board drawn too narrow for even its number goes unnamed (`boardName`). */
5304
5846
  .crewlet-canvas-board__board[data-untitled] > .crewlet-canvas-board__chrome {
5305
5847
  display: none;
5306
5848
  }
@@ -5636,7 +6178,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5636
6178
  }
5637
6179
 
5638
6180
 
5639
- /* Card-KJOYHDTJ.css */
6181
+ /* Card-QOVASQNU.css */
5640
6182
  /*
5641
6183
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
5642
6184
  * control.
@@ -5681,7 +6223,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5681
6223
  * `box-shadow: <shadow>, none` is invalid at computed-value time, so the
5682
6224
  * declaration is dropped and the light card loses the elevation the list was
5683
6225
  * built around. Alone on a pseudo element the same token is valid in both
5684
- * themes, and it composes with the selection ring rather than replacing
6226
+ * themes, and it composes with a chosen card's edge rather than replacing
5685
6227
  * whichever was declared last, exactly as the rail does.
5686
6228
  */
5687
6229
  .crewlet-card--elevated::after {
@@ -5755,8 +6297,8 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5755
6297
  /*
5756
6298
  * THE FLUSH RECIPE. The slots reach the card's edges, and the clip is what
5757
6299
  * makes the header's hairline and a table's own corners follow the radius
5758
- * instead of crossing it. The selection ring survives the clip because it is
5759
- * an INSET shadow; an outset one would be cut off here.
6300
+ * instead of crossing it. A chosen card's edge and fill survive the clip
6301
+ * because they are its own border and background.
5760
6302
  */
5761
6303
  .crewlet-card--flush {
5762
6304
  overflow: hidden;
@@ -5839,29 +6381,34 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5839
6381
 
5840
6382
  /* One ring, over the card's own boundary rather than 2px off it, which is two
5841
6383
  edges with a gap between them: the rule every field keeps (see Input.css).
5842
- A chosen card keeps an accent line inside the ring, since the selection
5843
- ring below is two pixels deep and the focus ring covers one of them. */
6384
+ On a chosen card it covers the selected edge, and the selected fill inside
6385
+ it still says the card is chosen. */
5844
6386
  .crewlet-card.is-interactive:focus-visible {
5845
6387
  outline: 2px solid var(--color-focus);
5846
6388
  outline-offset: var(--size-focus-ring-inset-offset);
5847
6389
  }
5848
6390
 
5849
6391
  /*
5850
- * Chosen. A ring rather than a tint, because a card carries its own surface
5851
- * and a tint under it would change the ground every value on it was measured
5852
- * against.
6392
+ * Chosen, as every chosen option in the package is drawn: the selected edge
6393
+ * (the accent mixed toward the card) over the selected fill. It was the full
6394
+ * accent border under --shadow-selection, a second accent ring two pixels
6395
+ * deep, which is the focus ring's weight in the focus ring's hue, so a grid
6396
+ * of cards showed the pick and the keyboard's place alike. The fill is laid
6397
+ * as an IMAGE over the card's own surface rather than in place of it, so the
6398
+ * card keeps its ground and the tint composites over it, as it does over a
6399
+ * row.
5853
6400
  */
5854
6401
  .crewlet-card.is-selected {
5855
- box-shadow: var(--shadow-selection);
5856
- border-color: var(--color-brand-accent);
6402
+ border-color: var(--color-border-selected);
6403
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
5857
6404
  }
5858
6405
 
5859
6406
  /* ---- Rails ------------------------------------------------------------- */
5860
6407
 
5861
6408
  /*
5862
6409
  * A state down the leading edge. Drawn as a pseudo element rather than a
5863
- * border or an inset shadow, so it composes with the elevated shadow and the
5864
- * selection ring instead of replacing whichever one was declared last.
6410
+ * border or an inset shadow, so it composes with the elevated shadow and a
6411
+ * chosen card's edge instead of replacing whichever one was declared last.
5865
6412
  */
5866
6413
  .crewlet-card--rail-info::before,
5867
6414
  .crewlet-card--rail-warning::before,
@@ -7318,7 +7865,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7318
7865
  }
7319
7866
 
7320
7867
 
7321
- /* ChoiceButtons-DJ5EOGUA.css */
7868
+ /* ChoiceButtons-FLIFXFFS.css */
7322
7869
  /*
7323
7870
  * One answer, sent with one press: a column of buttons as tall as a touch
7324
7871
  * target, the recommended one first and filled with the accent.
@@ -7357,6 +7904,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7357
7904
  border-color var(--motion-duration-fast) var(--motion-easing-default);
7358
7905
  }
7359
7906
 
7907
+ /*
7908
+ * AN OPTION WITH A DETAIL STARTS AT ITS TOP. Laid out as tiles (a host's grid
7909
+ * of columns), the options in one row stretch to the tallest, and centred
7910
+ * text put a one-line detail's label lower than its neighbour's two-line
7911
+ * one. A column of options is unchanged: each is as tall as its own text.
7912
+ */
7913
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) {
7914
+ align-items: flex-start;
7915
+ }
7916
+
7360
7917
  .crewlet-choice-buttons__option:hover:not([aria-disabled='true']) {
7361
7918
  background: var(--color-surface-elevated);
7362
7919
  border-color: var(--color-border-strong-hover);
@@ -7448,11 +8005,13 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7448
8005
  }
7449
8006
 
7450
8007
 
7451
- /* ChoiceList-RBL7FNQL.css */
8008
+ /* ChoiceList-EA2W6MOS.css */
7452
8009
  /*
7453
8010
  * A short list of answers in one bordered box: a radio, the label with a line
7454
8011
  * of detail under it, and a tag at the row's end. The selected row takes the
7455
- * accent's soft fill, so the answer reads at a glance without the radio.
8012
+ * selected fill (the accent's soft tint), so the answer reads at a glance; the
8013
+ * radio is the mark that clears 3:1, and no row is ever ringed in the accent,
8014
+ * which is the focus ring's colour.
7456
8015
  */
7457
8016
  .crewlet-choice-list {
7458
8017
  /* The platform's radio, sized here so a panel can line up with the text beside it. */
@@ -7517,21 +8076,47 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7517
8076
  }
7518
8077
 
7519
8078
  .crewlet-choice-list__row.is-checked {
7520
- background: var(--color-brand-accent-soft);
8079
+ background: var(--color-surface-selected);
7521
8080
  }
7522
8081
 
7523
8082
  .crewlet-choice-list.is-disabled .crewlet-choice-list__row {
7524
8083
  cursor: not-allowed;
7525
8084
  }
7526
8085
 
8086
+ /*
8087
+ * THE RADIO IS DRAWN, not the platform's. In a dark palette the platform's
8088
+ * own radio fills an unchosen answer with a grey disc, which beside the one
8089
+ * chosen read as a second, muted choice. Drawn here, an unchosen answer is an
8090
+ * empty ring on the control boundary (3:1 on every ground) and the chosen one
8091
+ * the accent ring round an accent dot. Forced colours hand it back to the
8092
+ * platform, which draws it in the system's own colours.
8093
+ */
7527
8094
  .crewlet-choice-list__radio {
8095
+ appearance: none;
8096
+ display: inline-grid;
8097
+ place-content: center;
8098
+ flex: none;
8099
+ box-sizing: border-box;
7528
8100
  width: var(--crewlet-choice-list-radio-size);
7529
8101
  height: var(--crewlet-choice-list-radio-size);
7530
8102
  margin: 3px 0 0;
7531
- accent-color: var(--color-brand-accent);
8103
+ border: 1px solid var(--color-border-control);
8104
+ border-radius: 50%;
8105
+ background: transparent;
7532
8106
  cursor: inherit;
7533
8107
  }
7534
8108
 
8109
+ .crewlet-choice-list__radio:checked {
8110
+ border-color: var(--color-brand-accent);
8111
+ background: radial-gradient(circle, var(--color-brand-accent) 0 3px, transparent 3.5px);
8112
+ }
8113
+
8114
+ @media (forced-colors: active) {
8115
+ .crewlet-choice-list__radio {
8116
+ appearance: auto;
8117
+ }
8118
+ }
8119
+
7535
8120
  /* A radio draws its own edge, so the ring sits on it, as a checkbox's does. */
7536
8121
  .crewlet-choice-list__radio:focus-visible {
7537
8122
  outline: 2px solid var(--color-focus);
@@ -7556,13 +8141,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7556
8141
  overflow-wrap: anywhere;
7557
8142
  }
7558
8143
 
8144
+ /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
8145
+ tertiary ink: in the accent ink it was a second accent mark on the chosen
8146
+ row, beside the radio and the fill that already say which one is chosen. */
7559
8147
  .crewlet-choice-list__tag {
7560
8148
  padding-top: 2px;
7561
8149
  font-size: var(--font-size-2xs);
7562
8150
  font-weight: 500;
7563
8151
  letter-spacing: 0.05em;
7564
8152
  text-transform: uppercase;
7565
- color: var(--color-brand-accent-ink);
8153
+ color: var(--color-text-tertiary);
7566
8154
  white-space: nowrap;
7567
8155
  }
7568
8156
 
@@ -7582,7 +8170,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7582
8170
  padding: var(--spacing-1) var(--spacing-2) var(--spacing-3) calc(var(--spacing-2) + var(--crewlet-choice-list-radio-size) + var(--spacing-3));
7583
8171
  border-end-start-radius: var(--radius-sm);
7584
8172
  border-end-end-radius: var(--radius-sm);
7585
- background: var(--color-brand-accent-soft);
8173
+ background: var(--color-surface-selected);
7586
8174
  }
7587
8175
 
7588
8176
  .crewlet-choice-list__footer {
@@ -8285,12 +8873,15 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8285
8873
  }
8286
8874
 
8287
8875
 
8288
- /* Composer-ABGJIAIR.css */
8876
+ /* Composer-PXITWNEK.css */
8289
8877
  /*
8290
8878
  * A message written in place: the field and its footer strip in one box. The
8291
- * BOX takes the focus ring, an accent border and a 2px soft halo, so the
8292
- * field inside draws no border or outline of its own and the footer reads as
8293
- * part of what is being written.
8879
+ * BOX takes the focus ring every field in the package draws (see Input.css):
8880
+ * an outline over its boundary, 2px for the keyboard and the hairline for a
8881
+ * pointer, so the field inside draws no border or outline of its own and the
8882
+ * footer reads as part of what is being written. It used to recolour the
8883
+ * border to the accent AND lay a 2px soft halo outside it: two highlights for
8884
+ * one state, and the loudest edge on a page whose field was focused on load.
8294
8885
  */
8295
8886
  .crewlet-composer {
8296
8887
  display: grid;
@@ -8298,18 +8889,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8298
8889
  border: 1px solid var(--color-border-strong);
8299
8890
  border-radius: var(--radius-md);
8300
8891
  background: var(--color-surface-background);
8301
- transition:
8302
- border-color var(--motion-duration-fast) var(--motion-easing-default),
8303
- box-shadow var(--motion-duration-fast) var(--motion-easing-default);
8892
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
8304
8893
  }
8305
8894
 
8306
8895
  .crewlet-composer:hover {
8307
8896
  border-color: var(--color-border-strong-hover);
8308
8897
  }
8309
8898
 
8310
- .crewlet-composer:focus-within {
8311
- border-color: var(--color-brand-accent);
8312
- box-shadow: 0 0 0 2px var(--color-brand-accent-soft);
8899
+ /* Keyed on the FIELD, not :focus-within: the footer holds the send action,
8900
+ and a reader tabbing onto it is shown that button's ring, not the box's. */
8901
+ .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8902
+ outline: 2px solid var(--color-focus);
8903
+ outline-offset: -1px;
8904
+ }
8905
+
8906
+ :root[data-crewlet-focus='pointer'] .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8907
+ outline-width: 1px;
8908
+ outline-color: var(--color-border-selected);
8313
8909
  }
8314
8910
 
8315
8911
  .crewlet-composer .crewlet-composer__field {
@@ -8322,11 +8918,12 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8322
8918
  resize: none;
8323
8919
  }
8324
8920
 
8325
- /* The ring is the box's, above. A transparent outline stays, because forced
8326
- colors drops the box's shadow and paints an outline in its place. */
8327
- .crewlet-composer .crewlet-composer__field:focus-visible {
8328
- outline: 2px solid transparent;
8329
- outline-offset: -2px;
8921
+ /* The ring is the box's, above, so the field inside never draws one: left to
8922
+ the textarea's own rule it would be a second ring inside the box's, and in
8923
+ forced colours the box's outline is the one the system repaints. Stated on
8924
+ the field at rest, at a weight the textarea's focus rule cannot outrank. */
8925
+ .crewlet-composer .crewlet-composer__field.crewlet-textarea {
8926
+ outline: none;
8330
8927
  }
8331
8928
 
8332
8929
  /* Past its cap the field scrolls rather than pushing the page. */
@@ -8363,8 +8960,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8363
8960
  flex: 1;
8364
8961
  }
8365
8962
 
8963
+ /* On a phone the hint goes, and a footer that held only the hint goes with it. */
8366
8964
  @media (width < 640px) {
8367
- .crewlet-composer__hint {
8965
+ .crewlet-composer__hint,
8966
+ .crewlet-composer__footer[data-hint-only] {
8368
8967
  display: none;
8369
8968
  }
8370
8969
  }
@@ -11340,7 +11939,7 @@ body.crewlet-data-table-resizing {
11340
11939
  }
11341
11940
 
11342
11941
 
11343
- /* DatasetSource-XFPZBRXL.css */
11942
+ /* DatasetSource-SMGX4PS5.css */
11344
11943
  /*
11345
11944
  * DatasetSource: one entry of a dashboard's Sources rail. The title and its
11346
11945
  * source kind, the definition, then where the rows stand, how many there are
@@ -11352,6 +11951,8 @@ body.crewlet-data-table-resizing {
11352
11951
  display: flex;
11353
11952
  flex-direction: column;
11354
11953
  min-width: 0;
11954
+ /* Held transparent at rest so nothing moves when an entry opens. */
11955
+ border: 1px solid transparent;
11355
11956
  border-radius: var(--radius-md);
11356
11957
  }
11357
11958
 
@@ -11385,12 +11986,23 @@ button.crewlet-dataset-source__summary:focus-visible {
11385
11986
  outline-offset: var(--size-focus-ring-inset-offset);
11386
11987
  }
11387
11988
 
11388
- /* The accent boundary, as a selected card takes it, and the soft accent fill. */
11989
+ /*
11990
+ * The selected edge round the WHOLE ENTRY, over the selected fill on its
11991
+ * summary, as every chosen option is drawn: a tint of the accent, never the
11992
+ * full accent the focus ring is drawn in. The edge used to ring the summary
11993
+ * alone, so the settings and figures an open source shows under it hung
11994
+ * below the ring with nothing saying they belonged to it; inside one edge they
11995
+ * read as the entry's own. The rows it opens are what say which entry is open.
11996
+ */
11997
+ .crewlet-dataset-source--selected {
11998
+ border-color: var(--color-border-selected);
11999
+ }
12000
+
11389
12001
  .crewlet-dataset-source--selected .crewlet-dataset-source__summary {
11390
- border-color: var(--color-brand-accent);
11391
- background: var(--color-brand-accent-soft);
12002
+ background: var(--color-surface-selected);
11392
12003
  }
11393
12004
 
12005
+
11394
12006
  .crewlet-dataset-source__head {
11395
12007
  display: flex;
11396
12008
  align-items: center;
@@ -11461,9 +12073,30 @@ button.crewlet-dataset-source__summary:focus-visible {
11461
12073
  color: var(--color-feedback-warning-ink);
11462
12074
  }
11463
12075
 
12076
+ /*
12077
+ * AN OPEN ENTRY IS ONE CARD: the selected edge above frames the summary and
12078
+ * the preview together, the summary its head on the selected fill and the
12079
+ * preview a well under it, inset on the summary's padding, so the figures in
12080
+ * it (cards of their own) stand on a ground that is plainly the source's
12081
+ * rather than the rail's. One line separates head from well, in the same
12082
+ * selected edge, and the head sits INSIDE the frame rather than over it: its
12083
+ * fill laid over the frame's edge would paint that edge out.
12084
+ */
12085
+ .crewlet-dataset-source--open {
12086
+ background: var(--color-surface-inset);
12087
+ }
12088
+
12089
+ .crewlet-dataset-source--open > .crewlet-dataset-source__summary {
12090
+ border-block-end-color: var(--color-border-selected);
12091
+ border-start-start-radius: calc(var(--radius-md) - 1px);
12092
+ border-start-end-radius: calc(var(--radius-md) - 1px);
12093
+ border-end-start-radius: 0;
12094
+ border-end-end-radius: 0;
12095
+ }
12096
+
11464
12097
  .crewlet-dataset-source__preview {
11465
12098
  min-width: 0;
11466
- padding: var(--spacing-2) var(--spacing-3) var(--spacing-3);
12099
+ padding: var(--spacing-3);
11467
12100
  }
11468
12101
 
11469
12102
  .crewlet-dataset-source-list {
@@ -11480,7 +12113,7 @@ button.crewlet-dataset-source__summary:focus-visible {
11480
12113
  }
11481
12114
 
11482
12115
 
11483
- /* DateTimePicker-HG2KQXQ6.css */
12116
+ /* DateTimePicker-2IVTKFV2.css */
11484
12117
  /*
11485
12118
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
11486
12119
  *
@@ -11534,10 +12167,17 @@ button.crewlet-dataset-source__summary:focus-visible {
11534
12167
  */
11535
12168
  .crewlet-datetime:focus-visible,
11536
12169
  .crewlet-datetime.is-open {
11537
- outline: 1px solid var(--color-focus);
12170
+ outline: 2px solid var(--color-focus);
11538
12171
  outline-offset: -1px;
11539
12172
  }
11540
12173
 
12174
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12175
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime:focus-visible,
12176
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime.is-open {
12177
+ outline-width: 1px;
12178
+ outline-color: var(--color-border-selected);
12179
+ }
12180
+
11541
12181
  .crewlet-datetime.is-disabled,
11542
12182
  .crewlet-datetime:disabled {
11543
12183
  opacity: 0.55;
@@ -11660,10 +12300,16 @@ svg.crewlet-datetime__chevron {
11660
12300
 
11661
12301
  /* The same one ring the trigger draws, over the box's own boundary. */
11662
12302
  .crewlet-datetime__time-input:focus-visible {
11663
- outline: 1px solid var(--color-focus);
12303
+ outline: 2px solid var(--color-focus);
11664
12304
  outline-offset: -1px;
11665
12305
  }
11666
12306
 
12307
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12308
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime__time-input:focus-visible {
12309
+ outline-width: 1px;
12310
+ outline-color: var(--color-border-selected);
12311
+ }
12312
+
11667
12313
  .crewlet-datetime__footer {
11668
12314
  display: flex;
11669
12315
  align-items: center;
@@ -12376,7 +13022,7 @@ svg.crewlet-datetime__chevron {
12376
13022
  }
12377
13023
 
12378
13024
 
12379
- /* Document-JUGCSQ4L.css */
13025
+ /* Document-YFWTWXJP.css */
12380
13026
  /*
12381
13027
  * Rendered markdown, set as a document (Document.tsx).
12382
13028
  *
@@ -12706,17 +13352,34 @@ svg.crewlet-datetime__chevron {
12706
13352
  * on no surface of its own, with a line along its foot that answers the
12707
13353
  * pointer, the focus and a refusal. The line is a border rather than a
12708
13354
  * shadow, because forced colours keep a border and drop a shadow.
13355
+ *
13356
+ * ONE PIXEL, AND A TINT, WHERE A POINTER PUT THE CARET. The line is the
13357
+ * hairline under the pointer and the selected edge (the accent mixed toward
13358
+ * the page) once a click has put the caret in it: the reader is already
13359
+ * looking at the title, and a page that focuses its title on load drew a 2px
13360
+ * accent bar under it before anybody had touched anything.
13361
+ *
13362
+ * TWO PIXELS IN THE FOCUS COLOUR FOR THE KEYBOARD, the area WCAG 2.2's focus
13363
+ * appearance asks of an indicator: the border takes the focus colour and a
13364
+ * shadow lays the second pixel under it, with a transparent outline that
13365
+ * forced colours paints in its place. The padding takes the pixel the border
13366
+ * no longer reserves, so the title sits where it always did.
12709
13367
  */
12710
13368
  .crewlet-document-title-field {
12711
13369
  display: block;
12712
13370
  width: 100%;
12713
13371
  min-width: 0;
12714
- padding: 0 0 var(--spacing-1);
13372
+ padding: 0 0 calc(var(--spacing-1) + 1px);
12715
13373
  border: 0;
12716
- border-block-end: 2px solid transparent;
13374
+ border-block-end: 1px solid transparent;
12717
13375
  border-radius: 0;
12718
13376
  background: none;
12719
13377
  outline: none;
13378
+ /* A textarea of one row that grows with the title (DocumentTitleField sets
13379
+ its height): no handle, no scrollbar, and the title's own wrapping. */
13380
+ resize: none;
13381
+ overflow: hidden;
13382
+ white-space: pre-wrap;
12720
13383
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
12721
13384
  }
12722
13385
 
@@ -12731,12 +13394,27 @@ svg.crewlet-datetime__chevron {
12731
13394
 
12732
13395
  .crewlet-document-title-field:focus-visible {
12733
13396
  border-block-end-color: var(--color-focus);
13397
+ box-shadow: 0 1px 0 var(--color-focus);
13398
+ outline: 2px solid transparent;
13399
+ }
13400
+
13401
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field:focus-visible {
13402
+ border-block-end-color: var(--color-border-selected);
13403
+ box-shadow: none;
12734
13404
  }
12735
13405
 
12736
13406
  .crewlet-document-title-field[aria-invalid='true'] {
12737
13407
  border-block-end-color: var(--color-feedback-danger);
12738
13408
  }
12739
13409
 
13410
+ .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13411
+ box-shadow: 0 1px 0 var(--color-feedback-danger);
13412
+ }
13413
+
13414
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13415
+ border-block-end-color: var(--color-feedback-danger);
13416
+ }
13417
+
12740
13418
  @media (prefers-reduced-motion: reduce) {
12741
13419
  .crewlet-document-title-field {
12742
13420
  transition: none;
@@ -13313,7 +13991,7 @@ svg.crewlet-datetime__chevron {
13313
13991
  }
13314
13992
 
13315
13993
 
13316
- /* FilterChip-EZ4QMW4E.css */
13994
+ /* FilterChip-VL33P3JL.css */
13317
13995
  /*
13318
13996
  * The filter chip: neutral until it is on, and then the accent.
13319
13997
  *
@@ -13397,9 +14075,13 @@ svg.crewlet-datetime__chevron {
13397
14075
  cursor: not-allowed;
13398
14076
  }
13399
14077
 
14078
+ /* The selected fill, and the accent's lighter line rather than the selected
14079
+ edge: on a pill this small the 0.6 edge, the fill and the accent ink were
14080
+ three accent marks on one word. The ink is the mark that clears 4.5:1, and
14081
+ the keyboard's 2px focus ring stays the only full-weight line. */
13400
14082
  .crewlet-filter-chip[aria-pressed='true'],
13401
14083
  .crewlet-filter-chip[aria-checked='true'] {
13402
- background: var(--color-brand-accent-soft);
14084
+ background: var(--color-surface-selected);
13403
14085
  border-color: var(--color-brand-accent-soft-strong);
13404
14086
  color: var(--color-brand-accent-ink);
13405
14087
  }
@@ -14317,7 +14999,7 @@ button.crewlet-finding-list__row:focus-visible {
14317
14999
  }
14318
15000
 
14319
15001
 
14320
- /* Input-GBZSFXLU.css */
15002
+ /* Input-ABGOFENS.css */
14321
15003
  /*
14322
15004
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
14323
15005
  * ReadOnlyField.
@@ -14401,14 +15083,18 @@ button.crewlet-finding-list__row:focus-visible {
14401
15083
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
14402
15084
  * as a shadow disappears for exactly the readers who most need one.
14403
15085
  *
14404
- * It is ONE PIXEL, LAID EXACTLY ON THE BOUNDARY: the field's own hairline,
14405
- * drawn in the focus colour, which is how the console's fields say focus. At
14406
- * two pixels it was a heavy band round every box a caret landed in, and on a
14407
- * form of them the field being typed in read as the loudest thing on the page.
14408
- * Drawn on the boundary rather than outside it, a scroller cannot clip it and
14409
- * the field does not grow a halo the moment a caret lands in it, which is what
14410
- * a filter box in a toolbar of them did to the row it sits in. Every boxed
14411
- * field in the package rings this way (`Input.test.tsx` holds them to it).
15086
+ * It is TWO PIXELS FOR THE KEYBOARD AND ONE FOR A POINTER, laid over the
15087
+ * boundary. Two pixels is the area WCAG 2.2's focus appearance asks of an
15088
+ * indicator, and one pixel (the field's own hairline in the focus colour) was
15089
+ * half of it for every reader tabbing through a form. But at two pixels round
15090
+ * every box a caret landed in, a click into a title or a filter box drew a
15091
+ * heavy band round the one thing the reader was already looking at, so the
15092
+ * rule after this one narrows the ring where the document says the last move
15093
+ * was a pointer. Drawn over the boundary rather than outside it, a scroller
15094
+ * cannot clip it and the field does not grow a halo the moment a caret lands
15095
+ * in it, which is what a filter box in a toolbar of them did to the row it
15096
+ * sits in. Every boxed field in the package rings this way (`Input.test.tsx`
15097
+ * holds them to it).
14412
15098
  *
14413
15099
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
14414
15100
  * ring has not already said, and it is what cost the error state its own
@@ -14424,10 +15110,28 @@ button.crewlet-finding-list__row:focus-visible {
14424
15110
  * on a pointer press as well as on a tab.
14425
15111
  */
14426
15112
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
14427
- outline: 1px solid var(--color-focus);
15113
+ outline: 2px solid var(--color-focus);
14428
15114
  outline-offset: -1px;
14429
15115
  }
14430
15116
 
15117
+ /*
15118
+ * NARROWED FOR A POINTER. The ring above is the keyboard's: 2px, the area
15119
+ * WCAG 2.2's focus appearance asks of an indicator, drawn over the boundary
15120
+ * and one pixel into the box. A field matches :focus-visible on a click as
15121
+ * well, and a reader who put the caret there with a pointer is already looking
15122
+ * at it, so where the document says the last move was a pointer
15123
+ * (`data-crewlet-focus`, kept by `trackFocusModality`, which every field
15124
+ * starts) the ring is one pixel in the selected edge, the accent mixed toward
15125
+ * the page: a page that focuses its first field on load drew the focus colour
15126
+ * round it before anybody had touched a key. A refused field keeps its own
15127
+ * colour under a pointer too (below). A document that tracks nothing keeps
15128
+ * the keyboard's ring.
15129
+ */
15130
+ :root[data-crewlet-focus='pointer'] .crewlet-input:has(.crewlet-input__control:focus-visible) {
15131
+ outline-width: 1px;
15132
+ outline-color: var(--color-border-selected);
15133
+ }
15134
+
14431
15135
  .crewlet-input.is-error {
14432
15136
  border-color: var(--color-feedback-danger);
14433
15137
  }
@@ -14448,6 +15152,10 @@ button.crewlet-finding-list__row:focus-visible {
14448
15152
  outline-color: var(--color-feedback-danger);
14449
15153
  }
14450
15154
 
15155
+ :root[data-crewlet-focus='pointer'] .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15156
+ outline-color: var(--color-feedback-danger);
15157
+ }
15158
+
14451
15159
  .crewlet-input.is-disabled {
14452
15160
  opacity: 0.6;
14453
15161
  cursor: not-allowed;
@@ -14684,10 +15392,16 @@ button.crewlet-finding-list__row:focus-visible {
14684
15392
  on the control itself: a textarea is the field, with nothing wrapped round
14685
15393
  it and nothing focusable inside it. */
14686
15394
  .crewlet-textarea:focus-visible {
14687
- outline: 1px solid var(--color-focus);
15395
+ outline: 2px solid var(--color-focus);
14688
15396
  outline-offset: -1px;
14689
15397
  }
14690
15398
 
15399
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
15400
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea:focus-visible {
15401
+ outline-width: 1px;
15402
+ outline-color: var(--color-border-selected);
15403
+ }
15404
+
14691
15405
  .crewlet-textarea.is-error {
14692
15406
  border-color: var(--color-feedback-danger);
14693
15407
  }
@@ -14696,6 +15410,10 @@ button.crewlet-finding-list__row:focus-visible {
14696
15410
  outline-color: var(--color-feedback-danger);
14697
15411
  }
14698
15412
 
15413
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea.is-error:focus-visible {
15414
+ outline-color: var(--color-feedback-danger);
15415
+ }
15416
+
14699
15417
  .crewlet-textarea.is-disabled {
14700
15418
  opacity: 0.6;
14701
15419
  cursor: not-allowed;
@@ -15145,7 +15863,7 @@ button.crewlet-finding-list__row:focus-visible {
15145
15863
  }
15146
15864
 
15147
15865
 
15148
- /* LayersList-NQZEIPZB.css */
15866
+ /* LayersList-TBNF4XGL.css */
15149
15867
  /*
15150
15868
  * A canvas's list of layers (LayersList.tsx): a heading that stays, over one
15151
15869
  * line per entry that scrolls on its own.
@@ -15216,13 +15934,26 @@ button.crewlet-finding-list__row:focus-visible {
15216
15934
  color: var(--color-text-primary);
15217
15935
  }
15218
15936
 
15219
- /* The accent edge every current row in the system takes, in the primary ink.
15220
- A border, so forced colours keep it. */
15937
+ /*
15938
+ * THE PICKED ENTRY IS A SELECTION, drawn as the package draws a chosen
15939
+ * option: the selected fill under the primary ink, as a canvas's layers panel
15940
+ * marks the board picked on it. It used to take the accent rail a CURRENT row
15941
+ * takes (the outline's heading, the page in the rail), which says "you are
15942
+ * here" and beside a canvas read as a second selection ring. The rail's room
15943
+ * is still held, so nothing moves, and forced colours draw it in the system's
15944
+ * own selected colour, since they drop the fill.
15945
+ */
15221
15946
  .crewlet-layers-list__item[aria-current='true'] {
15222
- border-inline-start-color: var(--color-brand-accent);
15947
+ background: var(--color-surface-selected);
15223
15948
  color: var(--color-text-primary);
15224
15949
  }
15225
15950
 
15951
+ @media (forced-colors: active) {
15952
+ .crewlet-layers-list__item[aria-current='true'] {
15953
+ border-inline-start-color: Highlight;
15954
+ }
15955
+ }
15956
+
15226
15957
  /* The ring lies inside the entry, where the scroller beside it cannot cut it. */
15227
15958
  .crewlet-layers-list__item:focus-visible {
15228
15959
  outline: 2px solid var(--color-focus);
@@ -16117,9 +16848,10 @@ button.crewlet-finding-list__row:focus-visible {
16117
16848
  }
16118
16849
 
16119
16850
 
16120
- /* LivePreview-SRO7KHO4.css */
16851
+ /* LivePreview-BROGKR4N.css */
16121
16852
  /*
16122
- * A live preview: the stand-in and the live layer stacked in one box. The box
16853
+ * A live preview: the stand-in, the still copy of what the content drew and
16854
+ * the live layer it is drawn in, stacked in that order in one box. The box
16123
16855
  * takes its size from its parent (a card's preview area), so it fills it and
16124
16856
  * clips whatever the content lays out past its edge.
16125
16857
  */
@@ -16137,9 +16869,43 @@ button.crewlet-finding-list__row:focus-visible {
16137
16869
  position: absolute;
16138
16870
  inset: 0;
16139
16871
  display: flex;
16140
- transition: opacity var(--motion-duration-base) var(--motion-easing-out);
16141
16872
  }
16142
16873
 
16874
+ /* THE STILL COPY: static DOM over the stand-in, which it hides. A copy just
16875
+ taken fades in; one the preview was given back from its store is simply
16876
+ there, so a card scrolled or filtered back to is as it was. */
16877
+ .crewlet-live-preview__still {
16878
+ position: absolute;
16879
+ inset: 0;
16880
+ display: block;
16881
+ overflow: hidden;
16882
+ pointer-events: none;
16883
+ user-select: none;
16884
+ }
16885
+
16886
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still {
16887
+ animation: crewlet-live-preview-arrive var(--motion-duration-base) var(--motion-easing-out);
16888
+ }
16889
+
16890
+ @keyframes crewlet-live-preview-arrive {
16891
+ from {
16892
+ opacity: 0;
16893
+ }
16894
+ }
16895
+
16896
+ /* A COPY IS FROZEN: what it drew never moves, so nothing in it animates or
16897
+ transitions, whatever the content's own styles ask of the elements it
16898
+ copied (a skeleton's shimmer, a chart's entrance). */
16899
+ .crewlet-live-preview__still *,
16900
+ .crewlet-live-preview__still *::before,
16901
+ .crewlet-live-preview__still *::after {
16902
+ animation: none !important;
16903
+ transition: none !important;
16904
+ }
16905
+
16906
+ /* THE LIVE LAYER renders out of sight: content that is copied is never seen
16907
+ live, only its copy is. A frame's page is kept rather than copied, so a
16908
+ framed preview's live layer is what fades in once it has drawn. */
16143
16909
  .crewlet-live-preview__live {
16144
16910
  position: absolute;
16145
16911
  inset: 0;
@@ -16148,9 +16914,16 @@ button.crewlet-finding-list__row:focus-visible {
16148
16914
  opacity: 0;
16149
16915
  pointer-events: none;
16150
16916
  user-select: none;
16917
+ }
16918
+
16919
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live {
16151
16920
  transition: opacity var(--motion-duration-base) var(--motion-easing-out);
16152
16921
  }
16153
16922
 
16923
+ .crewlet-live-preview[data-frame][data-state='ready'] > .crewlet-live-preview__live {
16924
+ opacity: 1;
16925
+ }
16926
+
16154
16927
  /* LAID OUT AT ITS OWN SIZE from the top left corner, and scaled from there:
16155
16928
  to the box's width, its top left the box's, or whole and centred. */
16156
16929
  .crewlet-preview-scale {
@@ -16169,17 +16942,23 @@ button.crewlet-finding-list__row:focus-visible {
16169
16942
  transform-origin: 0 0;
16170
16943
  }
16171
16944
 
16172
- .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__live {
16173
- opacity: 1;
16174
- }
16175
-
16945
+ /* WHAT IS UNDER A DRAWING is hidden only once it has faded in. Fading the
16946
+ stand-in out at the same time showed both at half strength halfway
16947
+ through: a double exposure. */
16176
16948
  .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
16177
- opacity: 0;
16949
+ visibility: hidden;
16950
+ /* Visibility is discrete and stays visible for the whole of a transition
16951
+ to hidden, so this holds it exactly as long as the fade above. A copy
16952
+ given back from the store is ready from its first style, which runs no
16953
+ transition, so its stand-in is never shown at all. */
16954
+ transition: visibility var(--motion-duration-base) linear;
16178
16955
  }
16179
16956
 
16180
16957
  @media (prefers-reduced-motion: reduce) {
16181
- .crewlet-live-preview__fallback,
16182
- .crewlet-live-preview__live {
16958
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still,
16959
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live,
16960
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
16961
+ animation: none;
16183
16962
  transition: none;
16184
16963
  }
16185
16964
  }
@@ -21359,7 +22138,7 @@ button.crewlet-presence-stack__member:focus-visible {
21359
22138
  }
21360
22139
 
21361
22140
 
21362
- /* Select-A54YS5EP.css */
22141
+ /* Select-W3CHTZXP.css */
21363
22142
  /*
21364
22143
  * Select: one chrome over two controls, and the product's only dropdown.
21365
22144
  *
@@ -21433,10 +22212,16 @@ button.crewlet-presence-stack__member:focus-visible {
21433
22212
  * leave the other bare.
21434
22213
  */
21435
22214
  .crewlet-select:focus-within {
21436
- outline: 1px solid var(--color-focus);
22215
+ outline: 2px solid var(--color-focus);
21437
22216
  outline-offset: -1px;
21438
22217
  }
21439
22218
 
22219
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22220
+ :root[data-crewlet-focus='pointer'] .crewlet-select:focus-within {
22221
+ outline-width: 1px;
22222
+ outline-color: var(--color-border-selected);
22223
+ }
22224
+
21440
22225
  /*
21441
22226
  * A FILTER THAT IS ON. The accent border says where the reader is and the
21442
22227
  * accent INK says what it is set to. It used to be the accent FILL with the
@@ -21495,6 +22280,10 @@ button.crewlet-presence-stack__member:focus-visible {
21495
22280
  outline-color: var(--color-feedback-danger);
21496
22281
  }
21497
22282
 
22283
+ :root[data-crewlet-focus='pointer'] .crewlet-select.is-error:focus-within {
22284
+ outline-color: var(--color-feedback-danger);
22285
+ }
22286
+
21498
22287
  .crewlet-select.is-disabled {
21499
22288
  opacity: 0.6;
21500
22289
  cursor: not-allowed;
@@ -21788,10 +22577,16 @@ svg.crewlet-select__chevron {
21788
22577
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
21789
22578
  */
21790
22579
  .crewlet-select__search:focus-within {
21791
- outline: 1px solid var(--color-focus);
22580
+ outline: 2px solid var(--color-focus);
21792
22581
  outline-offset: -1px;
21793
22582
  }
21794
22583
 
22584
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22585
+ :root[data-crewlet-focus='pointer'] .crewlet-select__search:focus-within {
22586
+ outline-width: 1px;
22587
+ outline-color: var(--color-border-selected);
22588
+ }
22589
+
21795
22590
  .crewlet-select__search {
21796
22591
  display: flex;
21797
22592
  align-items: center;
@@ -23870,13 +24665,18 @@ svg.crewlet-select__chevron {
23870
24665
  }
23871
24666
 
23872
24667
 
23873
- /* SlideFilmstrip-4ITZLMO4.css */
24668
+ /* SlideFilmstrip-PAT7P4OG.css */
23874
24669
  /*
23875
24670
  * SlideFilmstrip: the column of slide thumbnails beside a deck's stage, or
23876
24671
  * the row under it on a phone.
23877
24672
  *
23878
- * The selected slide is ringed in the brand accent rather than filled, so its
23879
- * thumbnail still shows the slide's own colours.
24673
+ * The selected slide is ringed rather than filled, so its thumbnail still
24674
+ * shows the slide's own colours: the selected edge (a tint of the accent) on
24675
+ * the thumbnail's own line, the selected fill as a soft band outside it, and
24676
+ * its number in the accent ink. It was a 2px ring in the full accent, the
24677
+ * same weight and colour as the focus ring beside it, so the slide being
24678
+ * edited and the slide the keyboard was on could not be told apart. The
24679
+ * number is the mark that clears 3:1, so the state never rests on the tint.
23880
24680
  *
23881
24681
  * THE STRIP IS ITS OWN SCROLLER: a host bounds it (a column's max-height, a
23882
24682
  * row's width) and the strip scrolls inside that, keeping the selected slide
@@ -23921,24 +24721,38 @@ svg.crewlet-select__chevron {
23921
24721
  border: 0;
23922
24722
  background: transparent;
23923
24723
  border-radius: var(--radius-sm);
23924
- outline: 1px solid var(--color-border-default);
24724
+ /* THE STRONG LINE AT REST: a deck's slides are mostly dark, and on the dark
24725
+ page the plain hairline sat within a few steps of both the page and the
24726
+ slide, so a strip of them had no edges at all. Under the pointer it takes
24727
+ the strong line's own hover step, so pointing still moves the edge. */
24728
+ outline: 1px solid var(--color-border-strong);
23925
24729
  cursor: pointer;
23926
24730
  overflow: hidden;
23927
24731
  }
23928
24732
 
23929
24733
  .crewlet-slide-filmstrip__thumb:hover {
23930
- outline-color: var(--color-border-hover);
24734
+ outline-color: var(--color-border-strong-hover);
23931
24735
  }
23932
24736
 
23933
24737
  .crewlet-slide-filmstrip__item[data-selected='true'] .crewlet-slide-filmstrip__thumb {
23934
- outline: 2px solid var(--color-brand-accent);
24738
+ outline-color: var(--color-border-selected);
24739
+ box-shadow: 0 0 0 3px var(--color-surface-selected);
24740
+ }
24741
+
24742
+ .crewlet-slide-filmstrip__item[data-selected='true'] .crewlet-slide-filmstrip__number {
24743
+ color: var(--color-brand-accent-ink);
24744
+ font-weight: var(--font-weight-semibold);
23935
24745
  }
23936
24746
 
23937
24747
  /* ONE RING, OVER THE THUMBNAIL'S OWN EDGE: the focus outline takes the place
23938
- of the edge rather than standing off it as a second one. */
24748
+ of the edge rather than standing off it as a second one, and grows OUTWARD
24749
+ from it onto the strip's ground. It used to sit on the inset offset, inside
24750
+ the thumbnail, where a dark slide (most of a deck's themes) swallowed it:
24751
+ the focus colour measured close to the slide's own ground, and tabbing
24752
+ through the strip showed nothing at all. The list's own padding holds it. */
23939
24753
  .crewlet-slide-filmstrip__thumb:focus-visible {
23940
24754
  outline: 2px solid var(--color-focus);
23941
- outline-offset: var(--size-focus-ring-inset-offset);
24755
+ outline-offset: 0;
23942
24756
  }
23943
24757
 
23944
24758
  .crewlet-slide-filmstrip__item[data-hidden='true'] .crewlet-slide-stage {
@@ -24091,7 +24905,7 @@ svg.crewlet-select__chevron {
24091
24905
  }
24092
24906
 
24093
24907
 
24094
- /* SlideGrid-S4LTJ4UU.css */
24908
+ /* SlideGrid-FJA33DV4.css */
24095
24909
  /*
24096
24910
  * SlideGrid: every slide of a deck at once, by its outline's sections.
24097
24911
  */
@@ -24136,8 +24950,18 @@ svg.crewlet-select__chevron {
24136
24950
  outline-color: var(--color-border-hover);
24137
24951
  }
24138
24952
 
24953
+ /* THE CURRENT SLIDE, drawn as the filmstrip draws it: the selected edge on
24954
+ the slide's own line, the selected fill as a soft band outside it, and its
24955
+ number in the accent ink, the mark that clears 3:1. Never the full accent
24956
+ at 2px, which is the focus ring's weight and colour. */
24139
24957
  .crewlet-slide-grid__card[aria-current='true'] .crewlet-slide-stage {
24140
- outline: 2px solid var(--color-brand-accent);
24958
+ outline-color: var(--color-border-selected);
24959
+ box-shadow: 0 0 0 3px var(--color-surface-selected);
24960
+ }
24961
+
24962
+ .crewlet-slide-grid__card[aria-current='true'] .crewlet-slide-grid__number {
24963
+ color: var(--color-brand-accent-ink);
24964
+ font-weight: var(--font-weight-semibold);
24141
24965
  }
24142
24966
 
24143
24967
  /* ONE RING, round the whole card (its slide and its caption), on the inset
@@ -24236,7 +25060,7 @@ svg.crewlet-select__chevron {
24236
25060
  }
24237
25061
 
24238
25062
 
24239
- /* SlideStage-S2FISF4C.css */
25063
+ /* SlideStage-ZTTEQSS2.css */
24240
25064
  /*
24241
25065
  * SlideStage: a slide laid out at its authored size and scaled to its box.
24242
25066
  *
@@ -24258,10 +25082,12 @@ svg.crewlet-select__chevron {
24258
25082
  /* THE SLIDE'S OWN EDGE: the box is the slide (or, for a show in the page,
24259
25083
  the room it was measured into), so its outline is the slide's edge, drawn over the slide's corners rather than outside them. A host that
24260
25084
  marks a stage (selected, current) recolours this outline rather than adding
24261
- a second line. */
25085
+ a second line. It takes the STRONG border, not the default one: most decks
25086
+ are dark, and in the dark theme the default border is a step off the page,
25087
+ so a dark slide on a dark page had no edge at all. */
24262
25088
  .crewlet-slide-stage--framed {
24263
25089
  border-radius: var(--radius-sm);
24264
- outline: 1px solid var(--color-border-default);
25090
+ outline: 1px solid var(--color-border-strong);
24265
25091
  }
24266
25092
 
24267
25093
  :fullscreen .crewlet-slide-stage--framed,
@@ -24310,7 +25136,7 @@ svg.crewlet-select__chevron {
24310
25136
  }
24311
25137
 
24312
25138
 
24313
- /* SourceEditor-G2C3STPX.css */
25139
+ /* SourceEditor-QAYE2JS6.css */
24314
25140
  /*
24315
25141
  * Source text written in place: a gutter of line numbers beside a real
24316
25142
  * textarea, and the marks a checker placed drawn behind the text. The gutter,
@@ -24318,7 +25144,11 @@ svg.crewlet-select__chevron {
24318
25144
  * so a number and a mark always sit on the line they name; the layers follow
24319
25145
  * the field's scroll by a transform.
24320
25146
  *
24321
- * The BOX takes the focus ring, as the Composer's does.
25147
+ * The BOX takes the focus ring every field draws (see Input.css): 2px in the
25148
+ * focus colour for the keyboard, one pixel of the selected edge where a
25149
+ * pointer put the caret. It used to recolour its border to the accent and lay
25150
+ * a 2px soft halo outside it, two highlights for one state, as the Composer's
25151
+ * did.
24322
25152
  */
24323
25153
  .crewlet-source-editor {
24324
25154
  --crewlet-source-inset: var(--spacing-2);
@@ -24334,18 +25164,21 @@ svg.crewlet-select__chevron {
24334
25164
  font-family: var(--font-family-mono);
24335
25165
  font-size: var(--font-size-xs);
24336
25166
  line-height: var(--font-line-height-normal);
24337
- transition:
24338
- border-color var(--motion-duration-fast) var(--motion-easing-default),
24339
- box-shadow var(--motion-duration-fast) var(--motion-easing-default);
25167
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
24340
25168
  }
24341
25169
 
24342
25170
  .crewlet-source-editor:hover {
24343
25171
  border-color: var(--color-border-strong-hover);
24344
25172
  }
24345
25173
 
24346
- .crewlet-source-editor:focus-within {
24347
- border-color: var(--color-brand-accent);
24348
- box-shadow: 0 0 0 2px var(--color-brand-accent-soft);
25174
+ .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25175
+ outline: 2px solid var(--color-focus);
25176
+ outline-offset: -1px;
25177
+ }
25178
+
25179
+ :root[data-crewlet-focus='pointer'] .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25180
+ outline-width: 1px;
25181
+ outline-color: var(--color-border-selected);
24349
25182
  }
24350
25183
 
24351
25184
  .crewlet-source-editor.is-fill {
@@ -24448,11 +25281,11 @@ svg.crewlet-select__chevron {
24448
25281
  color: var(--color-text-tertiary);
24449
25282
  }
24450
25283
 
24451
- /* The ring is the box's, above. A transparent outline stays, because forced
24452
- colors drops the box's shadow and paints an outline in its place. */
24453
- .crewlet-source-editor .crewlet-source-editor__field:focus-visible {
24454
- outline: 2px solid transparent;
24455
- outline-offset: -2px;
25284
+ /* The ring is the box's, above, an outline that forced colours repaint, so
25285
+ the field inside draws none of its own. Stated at rest, as the Composer's
25286
+ field is. */
25287
+ .crewlet-source-editor .crewlet-source-editor__field {
25288
+ outline: none;
24456
25289
  }
24457
25290
 
24458
25291
  .crewlet-source-editor .crewlet-source-editor__field[readonly] {
@@ -26984,7 +27817,7 @@ b.crewlet-switcher__match {
26984
27817
  }
26985
27818
 
26986
27819
 
26987
- /* TagsInput-XMXTI5Q4.css */
27820
+ /* TagsInput-7EGBBXHS.css */
26988
27821
  /*
26989
27822
  * TagsInput: several values in one field.
26990
27823
  *
@@ -27059,10 +27892,16 @@ b.crewlet-switcher__match {
27059
27892
  * the whole reason they sit above the field instead of inside it.
27060
27893
  */
27061
27894
  .crewlet-tags-input__box:focus-visible {
27062
- outline: 1px solid var(--color-focus);
27895
+ outline: 2px solid var(--color-focus);
27063
27896
  outline-offset: -1px;
27064
27897
  }
27065
27898
 
27899
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
27900
+ :root[data-crewlet-focus='pointer'] .crewlet-tags-input__box:focus-visible {
27901
+ outline-width: 1px;
27902
+ outline-color: var(--color-border-selected);
27903
+ }
27904
+
27066
27905
  .crewlet-tags-input.is-disabled {
27067
27906
  opacity: 0.6;
27068
27907
  }
@@ -27323,7 +28162,7 @@ b.crewlet-switcher__match {
27323
28162
  }
27324
28163
 
27325
28164
 
27326
- /* ThemeGallery-HSUKBDWY.css */
28165
+ /* ThemeGallery-X35Y25EX.css */
27327
28166
  /*
27328
28167
  * The gallery of themes: each group's heading over a grid of cards.
27329
28168
  *
@@ -27359,8 +28198,15 @@ b.crewlet-switcher__match {
27359
28198
 
27360
28199
  /*
27361
28200
  * A CARD IS ITS BORDER. Resting, the plain hairline; under the pointer, the
27362
- * strong one; chosen, the accent. One line round the card in every state, so
27363
- * the chosen card is never a card inside a frame.
28201
+ * strong one; chosen, the selected edge (the accent mixed toward the card)
28202
+ * over the selected fill, with a check beside the name. One line round the
28203
+ * card in every state, so the chosen card is never a card inside a frame.
28204
+ *
28205
+ * THE CHOSEN CARD IS CALM ON PURPOSE. It was the full accent, which on a grid
28206
+ * of six read as the loudest edge on the page and as a second focus ring. The
28207
+ * tint and the fill say which card is on at a glance; the check says it at
28208
+ * the 3:1 a state mark clears, so the state never rests on the tint alone;
28209
+ * and the focus ring stays the one 2px accent line, for the keyboard only.
27364
28210
  */
27365
28211
  .crewlet-theme-gallery__card {
27366
28212
  display: flex;
@@ -27377,14 +28223,15 @@ b.crewlet-switcher__match {
27377
28223
  cursor: pointer;
27378
28224
  }
27379
28225
 
27380
- /* Not on the chosen card: under the pointer it keeps the accent, or the one
27381
- card that says "this one" would stop saying it while it is being pointed at. */
28226
+ /* Not on the chosen card: under the pointer it keeps its selected edge, or the
28227
+ one card that says "this one" would stop saying it while it is pointed at. */
27382
28228
  .crewlet-theme-gallery__card:hover:not(:disabled):not(.is-chosen) {
27383
28229
  border-color: var(--color-border-strong);
27384
28230
  }
27385
28231
 
27386
28232
  .crewlet-theme-gallery__card.is-chosen {
27387
- border-color: var(--color-brand-accent);
28233
+ border-color: var(--color-border-selected);
28234
+ background: var(--color-surface-selected);
27388
28235
  }
27389
28236
 
27390
28237
  /* The ring is drawn OVER the border, inset by its width, never a second line outside it. */
@@ -27398,6 +28245,19 @@ b.crewlet-switcher__match {
27398
28245
  opacity: 0.5;
27399
28246
  }
27400
28247
 
28248
+ .crewlet-theme-gallery__label {
28249
+ display: flex;
28250
+ align-items: center;
28251
+ gap: var(--spacing-1);
28252
+ min-width: 0;
28253
+ }
28254
+
28255
+ .crewlet-theme-gallery__check {
28256
+ flex: none;
28257
+ margin-inline-start: auto;
28258
+ color: var(--color-brand-accent-ink);
28259
+ }
28260
+
27401
28261
  .crewlet-theme-gallery__name {
27402
28262
  overflow: hidden;
27403
28263
  font-size: var(--font-size-xs);
@@ -27687,7 +28547,7 @@ b.crewlet-switcher__match {
27687
28547
  }
27688
28548
 
27689
28549
 
27690
- /* TimeWindowPicker-T763GLXH.css */
28550
+ /* TimeWindowPicker-DEFDV77Z.css */
27691
28551
  /*
27692
28552
  * TimeWindowPicker: one trigger over one panel.
27693
28553
  *
@@ -27737,10 +28597,17 @@ b.crewlet-switcher__match {
27737
28597
  */
27738
28598
  .crewlet-time-window:focus-visible,
27739
28599
  .crewlet-time-window.is-open {
27740
- outline: 1px solid var(--color-focus);
28600
+ outline: 2px solid var(--color-focus);
27741
28601
  outline-offset: -1px;
27742
28602
  }
27743
28603
 
28604
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28605
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window:focus-visible,
28606
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window.is-open {
28607
+ outline-width: 1px;
28608
+ outline-color: var(--color-border-selected);
28609
+ }
28610
+
27744
28611
  .crewlet-time-window.is-disabled,
27745
28612
  .crewlet-time-window:disabled {
27746
28613
  opacity: 0.55;
@@ -28008,10 +28875,16 @@ svg.crewlet-time-window__tick {
28008
28875
  * own boundary (see Input.css), keyed on the box's own input.
28009
28876
  */
28010
28877
  .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28011
- outline: 1px solid var(--color-focus);
28878
+ outline: 2px solid var(--color-focus);
28012
28879
  outline-offset: -1px;
28013
28880
  }
28014
28881
 
28882
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28883
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28884
+ outline-width: 1px;
28885
+ outline-color: var(--color-border-selected);
28886
+ }
28887
+
28015
28888
  .crewlet-time-window__masked-input {
28016
28889
  min-width: 0;
28017
28890
  /* The `size` attribute the component sets is what holds the width open in