@crewlethq/ui 0.35.0 → 0.36.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 (170) hide show
  1. package/README.md +77 -0
  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/ArtifactBar/ArtifactBar.d.ts +2 -1
  10. package/dist/ArtifactBar/index.js +2 -2
  11. package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
  12. package/dist/ArtifactCard/index.js +3 -3
  13. package/dist/ArtifactCover/index.js +3 -2
  14. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
  15. package/dist/ArtifactKindIllustration/index.js +1 -1
  16. package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-5KTP43QS.css} +36 -0
  17. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
  18. package/dist/ArtifactMakeRow/index.d.ts +4 -0
  19. package/dist/ArtifactMakeRow/index.js +4 -0
  20. package/dist/ArtifactMakeRow-RWUTS5MC.css +167 -0
  21. package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
  22. package/dist/ArtifactPanel/index.js +1 -1
  23. package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
  24. package/dist/AuthLayout/index.js +2 -2
  25. package/dist/AvatarPicker/index.js +2 -2
  26. package/dist/Canvas/index.js +2 -2
  27. package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
  28. package/dist/CanvasBoard/index.d.ts +1 -1
  29. package/dist/CanvasBoard/index.js +4 -4
  30. package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
  31. package/dist/CanvasToolbar/index.js +3 -3
  32. package/dist/Card/index.js +1 -1
  33. package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
  34. package/dist/ChangeMark/index.js +2 -2
  35. package/dist/Checkbox/index.js +3 -2
  36. package/dist/ChoiceButtons/index.js +1 -1
  37. package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
  38. package/dist/ChoiceList/index.js +1 -1
  39. package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
  40. package/dist/Combobox/index.js +3 -2
  41. package/dist/CommandPalette/index.js +3 -2
  42. package/dist/CommentThread/index.js +6 -5
  43. package/dist/Composer/Composer.d.ts +4 -0
  44. package/dist/Composer/index.js +3 -2
  45. package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
  46. package/dist/ConfirmField/index.js +3 -2
  47. package/dist/DataTable/index.js +5 -4
  48. package/dist/DataView/index.js +9 -8
  49. package/dist/DatasetSource/DatasetSource.d.ts +4 -0
  50. package/dist/DatasetSource/index.js +1 -1
  51. package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
  52. package/dist/DateTimePicker/index.js +2 -1
  53. package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
  54. package/dist/DocTabsEditor/index.js +4 -3
  55. package/dist/Document/Document.d.ts +15 -3
  56. package/dist/Document/index.js +2 -1
  57. package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
  58. package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
  59. package/dist/FilterChip/index.js +1 -1
  60. package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
  61. package/dist/Input/index.js +2 -1
  62. package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
  63. package/dist/LayersList/index.js +1 -1
  64. package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
  65. package/dist/LinkInterstitial/index.js +2 -2
  66. package/dist/ListInput/index.js +4 -3
  67. package/dist/LivePreview/LivePreview.d.ts +105 -25
  68. package/dist/LivePreview/budget.d.ts +64 -20
  69. package/dist/LivePreview/index.d.ts +5 -3
  70. package/dist/LivePreview/index.js +1 -1
  71. package/dist/LivePreview/stills.d.ts +57 -0
  72. package/dist/LivePreview-BROGKR4N.css +113 -0
  73. package/dist/PresenterView/index.js +2 -2
  74. package/dist/PrincipalPicker/index.js +4 -3
  75. package/dist/RichEditor/index.js +1 -1
  76. package/dist/Select/index.js +2 -1
  77. package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
  78. package/dist/ShareDialog/index.js +5 -4
  79. package/dist/SheetColumnEditor/index.js +7 -6
  80. package/dist/SheetGrid/index.js +6 -6
  81. package/dist/SheetModel/columns.d.ts +19 -0
  82. package/dist/SheetModel/index.d.ts +1 -0
  83. package/dist/SheetModel/index.js +1 -1
  84. package/dist/SlideCompare/index.js +2 -2
  85. package/dist/SlideFilmstrip/index.js +3 -3
  86. package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
  87. package/dist/SlideGrid/index.js +2 -2
  88. package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
  89. package/dist/SlideStage/index.js +1 -1
  90. package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
  91. package/dist/SourceEditor/index.js +2 -1
  92. package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
  93. package/dist/Switcher/index.js +5 -4
  94. package/dist/TagsInput/index.js +3 -2
  95. package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
  96. package/dist/ThemeGallery/index.js +1 -1
  97. package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
  98. package/dist/TimeWindowPicker/index.js +4 -3
  99. package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
  100. package/dist/TreeCanvas/index.js +3 -3
  101. package/dist/VersionTimeline/index.js +2 -2
  102. package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
  103. package/dist/{chunk-CCLNGVCM.js → chunk-2DV4THNQ.js} +2 -2
  104. package/dist/{chunk-2CQLNML5.js → chunk-3PTUDKSR.js} +4 -2
  105. package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
  106. package/dist/{chunk-HAKTRTRP.js → chunk-47JQAGRV.js} +1 -1
  107. package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
  108. package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
  109. package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
  110. package/dist/chunk-66ADEPFB.js +51 -0
  111. package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
  112. package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
  113. package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
  114. package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
  115. package/dist/{chunk-THROPJZC.js → chunk-DEMALFHY.js} +1 -1
  116. package/dist/chunk-EOQFPZEE.js +138 -0
  117. package/dist/{chunk-QFNWMWWY.js → chunk-ES4RKQ7B.js} +4 -4
  118. package/dist/{chunk-MAD6WPER.js → chunk-FG4O64DV.js} +5 -6
  119. package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
  120. package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
  121. package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
  122. package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
  123. package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
  124. package/dist/{chunk-Z6VW6CXX.js → chunk-IQH3DDZ2.js} +2 -2
  125. package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
  126. package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
  127. package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
  128. package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
  129. package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
  130. package/dist/{chunk-OOMXLJ3S.js → chunk-LFSIKGRQ.js} +13 -1
  131. package/dist/{chunk-W7QBBKUE.js → chunk-MJW6SQYB.js} +7 -3
  132. package/dist/{chunk-GMU6SQ6B.js → chunk-MRMHZ437.js} +3 -3
  133. package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
  134. package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
  135. package/dist/{chunk-7UYONN6K.js → chunk-OSZDHN5Z.js} +2 -2
  136. package/dist/chunk-P6WFZDKS.js +111 -0
  137. package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
  138. package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
  139. package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
  140. package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
  141. package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
  142. package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
  143. package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
  144. package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
  145. package/dist/{chunk-5VCG26CV.js → chunk-W3HYWD63.js} +4 -4
  146. package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
  147. package/dist/{chunk-6JVRY5DQ.js → chunk-WNAYQQ6Y.js} +2 -2
  148. package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
  149. package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
  150. package/dist/chunk-XGBLRDSU.js +446 -0
  151. package/dist/{chunk-22CQQDFW.js → chunk-XMRTFPWX.js} +2 -2
  152. package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
  153. package/dist/chunk-YSGLEHND.js +56 -0
  154. package/dist/generated/index.d.ts +2 -0
  155. package/dist/generated/index.js +93 -90
  156. package/dist/index.js +93 -90
  157. package/dist/styles.css +862 -130
  158. package/dist/utils/focusModality.d.ts +41 -0
  159. package/dist/utils/index.d.ts +2 -0
  160. package/dist/utils/index.js +2 -1
  161. package/package.json +3 -3
  162. package/dist/LivePreview-SRO7KHO4.css +0 -65
  163. package/dist/chunk-KF6YGL4B.js +0 -160
  164. package/dist/chunk-TYKQ33CL.js +0 -35
  165. package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
  166. package/dist/{chunk-3WCNHYXE.js → chunk-5BP6IS3N.js} +0 -0
  167. package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
  168. package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
  169. package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
  170. package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
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,7 @@ button.crewlet-account-row__who:focus-visible {
2041
2212
  }
2042
2213
 
2043
2214
 
2044
- /* ArtifactBar-HV5AT4RG.css */
2215
+ /* ArtifactBar-FWPBBKQ5.css */
2045
2216
  /*
2046
2217
  * One row, one hairline under it, the height of a large row. The lead (the
2047
2218
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2242,11 +2413,19 @@ button.crewlet-account-row__who:focus-visible {
2242
2413
  margin-inline-start: var(--spacing-1);
2243
2414
  }
2244
2415
 
2416
+ /* THE STATUS IS QUIET by default, in the bar's small step and the secondary
2417
+ ink that `EditingStatus` takes, so a host that hands it words ("Creating…",
2418
+ "25 words") draws them as the open artifact draws its own, never at the
2419
+ title's weight. Its figures are tabular, so a count does not jitter. */
2245
2420
  .crewlet-artifact-bar__status {
2246
2421
  display: inline-flex;
2247
2422
  align-items: center;
2248
2423
  min-width: 0;
2249
2424
  margin-inline-end: var(--spacing-2);
2425
+ color: var(--color-text-secondary);
2426
+ font-size: var(--font-size-compact);
2427
+ font-variant-numeric: tabular-nums;
2428
+ white-space: nowrap;
2250
2429
  }
2251
2430
 
2252
2431
  .crewlet-artifact-bar__presence {
@@ -2812,7 +2991,7 @@ button.crewlet-account-row__who:focus-visible {
2812
2991
  }
2813
2992
 
2814
2993
 
2815
- /* ArtifactKindIllustration-5FPRJQ3P.css */
2994
+ /* ArtifactKindIllustration-5KTP43QS.css */
2816
2995
  /*
2817
2996
  * A kind's drawing, its tinted ground and the Make something new tile.
2818
2997
  *
@@ -3016,6 +3195,42 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3016
3195
  outline-offset: var(--size-focus-ring-inset-offset);
3017
3196
  }
3018
3197
 
3198
+ /*
3199
+ * A TILE THAT STARTS SOMETHING IN PLACE (a create page's starting layouts)
3200
+ * DRAWS ONE EDGE. Its face is a picture of the layout, with boards of its
3201
+ * own, so the ground's tinted inner line was a second outline a few pixels
3202
+ * inside the frame's, and with the focus ring over the frame the tile read as
3203
+ * three nested rings. The frame is the tile's one edge; the ground keeps its
3204
+ * tint.
3205
+ */
3206
+ .crewlet-kind-tile--button .crewlet-kind-tile__ground {
3207
+ box-shadow: none;
3208
+ }
3209
+
3210
+ /*
3211
+ * CHOSEN, as every chosen option is drawn: the selected edge (the accent
3212
+ * mixed toward the page) on the frame, over the selected fill, and a check
3213
+ * beside the name, the mark that clears 3:1. Under the pointer it keeps its
3214
+ * edge, and the focus ring is drawn over it for the keyboard alone.
3215
+ */
3216
+ .crewlet-kind-tile--button.is-selected .crewlet-kind-tile__frame,
3217
+ .crewlet-kind-tile--button.is-selected:hover .crewlet-kind-tile__frame {
3218
+ border-color: var(--color-border-selected);
3219
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
3220
+ }
3221
+
3222
+ .crewlet-kind-tile__check {
3223
+ flex: none;
3224
+ margin-inline-start: auto;
3225
+ color: var(--color-brand-accent-ink);
3226
+ }
3227
+
3228
+ @media (forced-colors: active) {
3229
+ .crewlet-kind-tile--button.is-selected .crewlet-kind-tile__frame {
3230
+ border-color: Highlight;
3231
+ }
3232
+ }
3233
+
3019
3234
  .crewlet-kind-tile--disabled {
3020
3235
  cursor: not-allowed;
3021
3236
  }
@@ -3050,7 +3265,177 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3050
3265
  .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
3266
 
3052
3267
 
3053
- /* ArtifactPanel-HW3SU7CP.css */
3268
+ /* ArtifactMakeRow-RWUTS5MC.css */
3269
+ /*
3270
+ * The Make something new tray.
3271
+ *
3272
+ * Every colour is a token: the tray's ground, its dots and its hairlines are
3273
+ * the surface and border steps, and each kind's mark reads the kind's own
3274
+ * Fill, Line and Ink (`ArtifactKinds.css`), so the tray repaints with the
3275
+ * theme and holds no colour of its own.
3276
+ *
3277
+ * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
3278
+ * page column a sidebar narrows, so three steps are container queries on the
3279
+ * tray. Under 560px three across in two lines; from 560px the six in one
3280
+ * line, each its mark over its name, so a long name is never cut; from 920px
3281
+ * the mark beside the name and what the kind is for under it.
3282
+ */
3283
+
3284
+ .crewlet-make-row {
3285
+ container-type: inline-size;
3286
+ /* A WORKBENCH: the canvas's dotted field on the sheet itself, one step
3287
+ quieter than a canvas that pans, inside a hairline ring. */
3288
+ border: 1px solid var(--color-border-default);
3289
+ border-radius: var(--radius-lg);
3290
+ background-color: var(--color-surface-background);
3291
+ background-image: radial-gradient(var(--color-border-default) 1px, transparent 1.2px);
3292
+ background-size: var(--spacing-4) var(--spacing-4);
3293
+ background-position: calc(var(--spacing-4) / 2) calc(var(--spacing-4) / 2);
3294
+ }
3295
+
3296
+ .crewlet-make-row__list {
3297
+ display: grid;
3298
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3299
+ gap: var(--spacing-1);
3300
+ margin: 0;
3301
+ padding: var(--spacing-1);
3302
+ list-style: none;
3303
+ }
3304
+
3305
+ .crewlet-make-row__cell {
3306
+ display: flex;
3307
+ min-width: 0;
3308
+ }
3309
+
3310
+ .crewlet-make-row__item {
3311
+ display: flex;
3312
+ flex: 1;
3313
+ flex-direction: column;
3314
+ align-items: center;
3315
+ gap: var(--spacing-2);
3316
+ min-width: 0;
3317
+ box-sizing: border-box;
3318
+ padding: var(--spacing-3) var(--spacing-2);
3319
+ border: 1px solid transparent;
3320
+ border-radius: var(--radius-md);
3321
+ color: var(--color-text-primary);
3322
+ text-decoration: none;
3323
+ outline: none;
3324
+ transition:
3325
+ background-color var(--motion-duration-fast) var(--motion-easing-out),
3326
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
3327
+ box-shadow var(--motion-duration-fast) var(--motion-easing-out);
3328
+ }
3329
+
3330
+ /* THE GLYPH ON ITS KIND'S TINT, the one coloured thing in the item. */
3331
+ .crewlet-make-row__mark {
3332
+ display: inline-flex;
3333
+ flex: none;
3334
+ align-items: center;
3335
+ justify-content: center;
3336
+ width: 32px;
3337
+ height: 32px;
3338
+ border-radius: var(--radius-md);
3339
+ background: var(--crewlet-kind-fill);
3340
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
3341
+ color: var(--crewlet-kind-ink);
3342
+ }
3343
+
3344
+ .crewlet-make-row__words {
3345
+ display: flex;
3346
+ flex-direction: column;
3347
+ align-items: center;
3348
+ min-width: 0;
3349
+ max-width: 100%;
3350
+ }
3351
+
3352
+ .crewlet-make-row__name,
3353
+ .crewlet-make-row__detail {
3354
+ max-width: 100%;
3355
+ overflow: hidden;
3356
+ text-overflow: ellipsis;
3357
+ white-space: nowrap;
3358
+ }
3359
+
3360
+ .crewlet-make-row__name {
3361
+ font-size: var(--font-size-sm);
3362
+ font-weight: var(--font-weight-medium);
3363
+ line-height: 1.3;
3364
+ }
3365
+
3366
+ /* WHAT IT IS FOR is the widest step's: on a narrower tray the name alone
3367
+ says it, and the details are kept as the item's description. */
3368
+ .crewlet-make-row__detail {
3369
+ display: none;
3370
+ color: var(--color-text-tertiary);
3371
+ font-size: var(--font-size-xs);
3372
+ line-height: 1.35;
3373
+ }
3374
+
3375
+ @container (width >= 560px) {
3376
+ .crewlet-make-row__list {
3377
+ grid-template-columns: repeat(6, minmax(0, 1fr));
3378
+ }
3379
+
3380
+ .crewlet-make-row__item {
3381
+ padding: var(--spacing-2) var(--spacing-1);
3382
+ }
3383
+ }
3384
+
3385
+ @container (width >= 920px) {
3386
+ .crewlet-make-row__item {
3387
+ flex-direction: row;
3388
+ gap: var(--spacing-3);
3389
+ padding: var(--spacing-2);
3390
+ }
3391
+
3392
+ .crewlet-make-row__words {
3393
+ align-items: flex-start;
3394
+ }
3395
+
3396
+ .crewlet-make-row__detail {
3397
+ display: block;
3398
+ }
3399
+ }
3400
+
3401
+ /* AN ITEM LIFTS OFF THE BENCH under the pointer as a card: the card's
3402
+ ground, the hairline a card is found by and the lightest shadow, and
3403
+ nothing inside it moves. */
3404
+ a.crewlet-make-row__item:hover {
3405
+ border-color: var(--color-border-default);
3406
+ background-color: var(--color-surface-subtle);
3407
+ box-shadow: var(--shadow-xs);
3408
+ }
3409
+
3410
+ a.crewlet-make-row__item:active {
3411
+ background-color: var(--color-surface-pressed);
3412
+ box-shadow: none;
3413
+ }
3414
+
3415
+ /* ON ITS OWN EDGE: an item draws a hairline once lifted, so the ring sits on
3416
+ it rather than standing off it with a gap between two edges. */
3417
+ .crewlet-make-row__item:focus-visible {
3418
+ outline: 2px solid var(--color-focus);
3419
+ outline-offset: var(--size-focus-ring-inset-offset);
3420
+ }
3421
+
3422
+ .crewlet-make-row__item--disabled {
3423
+ cursor: not-allowed;
3424
+ }
3425
+
3426
+ .crewlet-make-row__item--disabled .crewlet-make-row__mark,
3427
+ .crewlet-make-row__item--disabled .crewlet-make-row__words {
3428
+ opacity: 0.55;
3429
+ }
3430
+
3431
+ @media (prefers-reduced-motion: reduce) {
3432
+ .crewlet-make-row__item {
3433
+ transition: none;
3434
+ }
3435
+ }
3436
+
3437
+
3438
+ /* ArtifactPanel-KKUUIPEU.css */
3054
3439
  /*
3055
3440
  * The workspace is a row: the artifact's body, then at most one panel. The
3056
3441
  * body scrolls itself, so a panel beside it stays in view however far the
@@ -3170,6 +3555,15 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3170
3555
  overscroll-behavior: contain;
3171
3556
  }
3172
3557
 
3558
+ /* THE FOOT holds the panel's own commit, outside the scrolling body, so it
3559
+ stays in reach at every scroll. Its inset is the body's. */
3560
+ .crewlet-artifact-panel__foot {
3561
+ flex: none;
3562
+ padding: var(--spacing-3) var(--spacing-4);
3563
+ border-top: 1px solid var(--color-border-default);
3564
+ background: var(--color-surface-background);
3565
+ }
3566
+
3173
3567
  /* NOT ROOM FOR TWO COLUMNS: the panel slides over the artifact's end edge,
3174
3568
  raised off it, rather than squeezing the artifact under a useful width. */
3175
3569
  @container crewlet-artifact-workspace (width < 960px) {
@@ -5095,7 +5489,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5095
5489
  }
5096
5490
 
5097
5491
 
5098
- /* CanvasBoard-5NNSKY6A.css */
5492
+ /* CanvasBoard-TS4P356F.css */
5099
5493
  /*
5100
5494
  * A canvas of artboards and notes (CanvasBoard.tsx). Boards and notes are laid
5101
5495
  * out in canvas pixels inside the canvas's world and scale with it; their
@@ -5180,19 +5574,26 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5180
5574
  }
5181
5575
 
5182
5576
  /*
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.
5577
+ * HOVER, then SELECTION: one screen pixel each, over the hairline. Hover is
5578
+ * the selected edge, the accent mixed toward the canvas, so pointing at a
5579
+ * board previews the pick without claiming it; selection is the full accent,
5580
+ * crisp, with its four corners drawn, which are what say "this one" on a
5581
+ * canvas where a board's own content can be any colour. It was two pixels,
5582
+ * the focus ring's weight in the focus ring's hue, so a picked board and the
5583
+ * board the keyboard was on read alike; the 2px ring is the live board's now
5584
+ * alone ([data-active], below), which takes the pointer like a focused frame.
5585
+ * Hovering a board's name is hovering its board, which is how a reader finds
5586
+ * the board a name belongs to on a crowded canvas.
5186
5587
  */
5187
5588
  .crewlet-canvas-board__board:hover .crewlet-canvas-board__body,
5188
5589
  .crewlet-canvas-board__note:hover {
5189
- outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5590
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-border-selected);
5190
5591
  outline-offset: 0;
5191
5592
  }
5192
5593
 
5193
5594
  .crewlet-canvas-board__board[data-selected] .crewlet-canvas-board__body,
5194
5595
  .crewlet-canvas-board__note[data-selected] {
5195
- outline: calc(2px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5596
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
5196
5597
  outline-offset: 0;
5197
5598
  }
5198
5599
 
@@ -5300,7 +5701,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5300
5701
  transform-origin: bottom left;
5301
5702
  }
5302
5703
 
5303
- /* A board drawn too narrow to name goes unnamed (`boardRoom`). */
5704
+ /* A board drawn too narrow for even its number goes unnamed (`boardName`). */
5304
5705
  .crewlet-canvas-board__board[data-untitled] > .crewlet-canvas-board__chrome {
5305
5706
  display: none;
5306
5707
  }
@@ -5636,7 +6037,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5636
6037
  }
5637
6038
 
5638
6039
 
5639
- /* Card-KJOYHDTJ.css */
6040
+ /* Card-QOVASQNU.css */
5640
6041
  /*
5641
6042
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
5642
6043
  * control.
@@ -5681,7 +6082,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5681
6082
  * `box-shadow: <shadow>, none` is invalid at computed-value time, so the
5682
6083
  * declaration is dropped and the light card loses the elevation the list was
5683
6084
  * 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
6085
+ * themes, and it composes with a chosen card's edge rather than replacing
5685
6086
  * whichever was declared last, exactly as the rail does.
5686
6087
  */
5687
6088
  .crewlet-card--elevated::after {
@@ -5755,8 +6156,8 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5755
6156
  /*
5756
6157
  * THE FLUSH RECIPE. The slots reach the card's edges, and the clip is what
5757
6158
  * 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.
6159
+ * instead of crossing it. A chosen card's edge and fill survive the clip
6160
+ * because they are its own border and background.
5760
6161
  */
5761
6162
  .crewlet-card--flush {
5762
6163
  overflow: hidden;
@@ -5839,29 +6240,34 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5839
6240
 
5840
6241
  /* One ring, over the card's own boundary rather than 2px off it, which is two
5841
6242
  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. */
6243
+ On a chosen card it covers the selected edge, and the selected fill inside
6244
+ it still says the card is chosen. */
5844
6245
  .crewlet-card.is-interactive:focus-visible {
5845
6246
  outline: 2px solid var(--color-focus);
5846
6247
  outline-offset: var(--size-focus-ring-inset-offset);
5847
6248
  }
5848
6249
 
5849
6250
  /*
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.
6251
+ * Chosen, as every chosen option in the package is drawn: the selected edge
6252
+ * (the accent mixed toward the card) over the selected fill. It was the full
6253
+ * accent border under --shadow-selection, a second accent ring two pixels
6254
+ * deep, which is the focus ring's weight in the focus ring's hue, so a grid
6255
+ * of cards showed the pick and the keyboard's place alike. The fill is laid
6256
+ * as an IMAGE over the card's own surface rather than in place of it, so the
6257
+ * card keeps its ground and the tint composites over it, as it does over a
6258
+ * row.
5853
6259
  */
5854
6260
  .crewlet-card.is-selected {
5855
- box-shadow: var(--shadow-selection);
5856
- border-color: var(--color-brand-accent);
6261
+ border-color: var(--color-border-selected);
6262
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
5857
6263
  }
5858
6264
 
5859
6265
  /* ---- Rails ------------------------------------------------------------- */
5860
6266
 
5861
6267
  /*
5862
6268
  * 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.
6269
+ * border or an inset shadow, so it composes with the elevated shadow and a
6270
+ * chosen card's edge instead of replacing whichever one was declared last.
5865
6271
  */
5866
6272
  .crewlet-card--rail-info::before,
5867
6273
  .crewlet-card--rail-warning::before,
@@ -7318,7 +7724,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7318
7724
  }
7319
7725
 
7320
7726
 
7321
- /* ChoiceButtons-DJ5EOGUA.css */
7727
+ /* ChoiceButtons-FLIFXFFS.css */
7322
7728
  /*
7323
7729
  * One answer, sent with one press: a column of buttons as tall as a touch
7324
7730
  * target, the recommended one first and filled with the accent.
@@ -7357,6 +7763,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7357
7763
  border-color var(--motion-duration-fast) var(--motion-easing-default);
7358
7764
  }
7359
7765
 
7766
+ /*
7767
+ * AN OPTION WITH A DETAIL STARTS AT ITS TOP. Laid out as tiles (a host's grid
7768
+ * of columns), the options in one row stretch to the tallest, and centred
7769
+ * text put a one-line detail's label lower than its neighbour's two-line
7770
+ * one. A column of options is unchanged: each is as tall as its own text.
7771
+ */
7772
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) {
7773
+ align-items: flex-start;
7774
+ }
7775
+
7360
7776
  .crewlet-choice-buttons__option:hover:not([aria-disabled='true']) {
7361
7777
  background: var(--color-surface-elevated);
7362
7778
  border-color: var(--color-border-strong-hover);
@@ -7448,11 +7864,13 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7448
7864
  }
7449
7865
 
7450
7866
 
7451
- /* ChoiceList-RBL7FNQL.css */
7867
+ /* ChoiceList-EA2W6MOS.css */
7452
7868
  /*
7453
7869
  * A short list of answers in one bordered box: a radio, the label with a line
7454
7870
  * 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.
7871
+ * selected fill (the accent's soft tint), so the answer reads at a glance; the
7872
+ * radio is the mark that clears 3:1, and no row is ever ringed in the accent,
7873
+ * which is the focus ring's colour.
7456
7874
  */
7457
7875
  .crewlet-choice-list {
7458
7876
  /* The platform's radio, sized here so a panel can line up with the text beside it. */
@@ -7517,21 +7935,47 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7517
7935
  }
7518
7936
 
7519
7937
  .crewlet-choice-list__row.is-checked {
7520
- background: var(--color-brand-accent-soft);
7938
+ background: var(--color-surface-selected);
7521
7939
  }
7522
7940
 
7523
7941
  .crewlet-choice-list.is-disabled .crewlet-choice-list__row {
7524
7942
  cursor: not-allowed;
7525
7943
  }
7526
7944
 
7945
+ /*
7946
+ * THE RADIO IS DRAWN, not the platform's. In a dark palette the platform's
7947
+ * own radio fills an unchosen answer with a grey disc, which beside the one
7948
+ * chosen read as a second, muted choice. Drawn here, an unchosen answer is an
7949
+ * empty ring on the control boundary (3:1 on every ground) and the chosen one
7950
+ * the accent ring round an accent dot. Forced colours hand it back to the
7951
+ * platform, which draws it in the system's own colours.
7952
+ */
7527
7953
  .crewlet-choice-list__radio {
7954
+ appearance: none;
7955
+ display: inline-grid;
7956
+ place-content: center;
7957
+ flex: none;
7958
+ box-sizing: border-box;
7528
7959
  width: var(--crewlet-choice-list-radio-size);
7529
7960
  height: var(--crewlet-choice-list-radio-size);
7530
7961
  margin: 3px 0 0;
7531
- accent-color: var(--color-brand-accent);
7962
+ border: 1px solid var(--color-border-control);
7963
+ border-radius: 50%;
7964
+ background: transparent;
7532
7965
  cursor: inherit;
7533
7966
  }
7534
7967
 
7968
+ .crewlet-choice-list__radio:checked {
7969
+ border-color: var(--color-brand-accent);
7970
+ background: radial-gradient(circle, var(--color-brand-accent) 0 3px, transparent 3.5px);
7971
+ }
7972
+
7973
+ @media (forced-colors: active) {
7974
+ .crewlet-choice-list__radio {
7975
+ appearance: auto;
7976
+ }
7977
+ }
7978
+
7535
7979
  /* A radio draws its own edge, so the ring sits on it, as a checkbox's does. */
7536
7980
  .crewlet-choice-list__radio:focus-visible {
7537
7981
  outline: 2px solid var(--color-focus);
@@ -7556,13 +8000,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7556
8000
  overflow-wrap: anywhere;
7557
8001
  }
7558
8002
 
8003
+ /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
8004
+ tertiary ink: in the accent ink it was a second accent mark on the chosen
8005
+ row, beside the radio and the fill that already say which one is chosen. */
7559
8006
  .crewlet-choice-list__tag {
7560
8007
  padding-top: 2px;
7561
8008
  font-size: var(--font-size-2xs);
7562
8009
  font-weight: 500;
7563
8010
  letter-spacing: 0.05em;
7564
8011
  text-transform: uppercase;
7565
- color: var(--color-brand-accent-ink);
8012
+ color: var(--color-text-tertiary);
7566
8013
  white-space: nowrap;
7567
8014
  }
7568
8015
 
@@ -7582,7 +8029,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7582
8029
  padding: var(--spacing-1) var(--spacing-2) var(--spacing-3) calc(var(--spacing-2) + var(--crewlet-choice-list-radio-size) + var(--spacing-3));
7583
8030
  border-end-start-radius: var(--radius-sm);
7584
8031
  border-end-end-radius: var(--radius-sm);
7585
- background: var(--color-brand-accent-soft);
8032
+ background: var(--color-surface-selected);
7586
8033
  }
7587
8034
 
7588
8035
  .crewlet-choice-list__footer {
@@ -8285,12 +8732,15 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8285
8732
  }
8286
8733
 
8287
8734
 
8288
- /* Composer-ABGJIAIR.css */
8735
+ /* Composer-PXITWNEK.css */
8289
8736
  /*
8290
8737
  * 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.
8738
+ * BOX takes the focus ring every field in the package draws (see Input.css):
8739
+ * an outline over its boundary, 2px for the keyboard and the hairline for a
8740
+ * pointer, so the field inside draws no border or outline of its own and the
8741
+ * footer reads as part of what is being written. It used to recolour the
8742
+ * border to the accent AND lay a 2px soft halo outside it: two highlights for
8743
+ * one state, and the loudest edge on a page whose field was focused on load.
8294
8744
  */
8295
8745
  .crewlet-composer {
8296
8746
  display: grid;
@@ -8298,18 +8748,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8298
8748
  border: 1px solid var(--color-border-strong);
8299
8749
  border-radius: var(--radius-md);
8300
8750
  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);
8751
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
8304
8752
  }
8305
8753
 
8306
8754
  .crewlet-composer:hover {
8307
8755
  border-color: var(--color-border-strong-hover);
8308
8756
  }
8309
8757
 
8310
- .crewlet-composer:focus-within {
8311
- border-color: var(--color-brand-accent);
8312
- box-shadow: 0 0 0 2px var(--color-brand-accent-soft);
8758
+ /* Keyed on the FIELD, not :focus-within: the footer holds the send action,
8759
+ and a reader tabbing onto it is shown that button's ring, not the box's. */
8760
+ .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8761
+ outline: 2px solid var(--color-focus);
8762
+ outline-offset: -1px;
8763
+ }
8764
+
8765
+ :root[data-crewlet-focus='pointer'] .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8766
+ outline-width: 1px;
8767
+ outline-color: var(--color-border-selected);
8313
8768
  }
8314
8769
 
8315
8770
  .crewlet-composer .crewlet-composer__field {
@@ -8322,11 +8777,12 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8322
8777
  resize: none;
8323
8778
  }
8324
8779
 
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;
8780
+ /* The ring is the box's, above, so the field inside never draws one: left to
8781
+ the textarea's own rule it would be a second ring inside the box's, and in
8782
+ forced colours the box's outline is the one the system repaints. Stated on
8783
+ the field at rest, at a weight the textarea's focus rule cannot outrank. */
8784
+ .crewlet-composer .crewlet-composer__field.crewlet-textarea {
8785
+ outline: none;
8330
8786
  }
8331
8787
 
8332
8788
  /* Past its cap the field scrolls rather than pushing the page. */
@@ -8363,8 +8819,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8363
8819
  flex: 1;
8364
8820
  }
8365
8821
 
8822
+ /* On a phone the hint goes, and a footer that held only the hint goes with it. */
8366
8823
  @media (width < 640px) {
8367
- .crewlet-composer__hint {
8824
+ .crewlet-composer__hint,
8825
+ .crewlet-composer__footer[data-hint-only] {
8368
8826
  display: none;
8369
8827
  }
8370
8828
  }
@@ -11340,7 +11798,7 @@ body.crewlet-data-table-resizing {
11340
11798
  }
11341
11799
 
11342
11800
 
11343
- /* DatasetSource-XFPZBRXL.css */
11801
+ /* DatasetSource-SMGX4PS5.css */
11344
11802
  /*
11345
11803
  * DatasetSource: one entry of a dashboard's Sources rail. The title and its
11346
11804
  * source kind, the definition, then where the rows stand, how many there are
@@ -11352,6 +11810,8 @@ body.crewlet-data-table-resizing {
11352
11810
  display: flex;
11353
11811
  flex-direction: column;
11354
11812
  min-width: 0;
11813
+ /* Held transparent at rest so nothing moves when an entry opens. */
11814
+ border: 1px solid transparent;
11355
11815
  border-radius: var(--radius-md);
11356
11816
  }
11357
11817
 
@@ -11385,12 +11845,23 @@ button.crewlet-dataset-source__summary:focus-visible {
11385
11845
  outline-offset: var(--size-focus-ring-inset-offset);
11386
11846
  }
11387
11847
 
11388
- /* The accent boundary, as a selected card takes it, and the soft accent fill. */
11848
+ /*
11849
+ * The selected edge round the WHOLE ENTRY, over the selected fill on its
11850
+ * summary, as every chosen option is drawn: a tint of the accent, never the
11851
+ * full accent the focus ring is drawn in. The edge used to ring the summary
11852
+ * alone, so the settings and figures an open source shows under it hung
11853
+ * below the ring with nothing saying they belonged to it; inside one edge they
11854
+ * read as the entry's own. The rows it opens are what say which entry is open.
11855
+ */
11856
+ .crewlet-dataset-source--selected {
11857
+ border-color: var(--color-border-selected);
11858
+ }
11859
+
11389
11860
  .crewlet-dataset-source--selected .crewlet-dataset-source__summary {
11390
- border-color: var(--color-brand-accent);
11391
- background: var(--color-brand-accent-soft);
11861
+ background: var(--color-surface-selected);
11392
11862
  }
11393
11863
 
11864
+
11394
11865
  .crewlet-dataset-source__head {
11395
11866
  display: flex;
11396
11867
  align-items: center;
@@ -11461,9 +11932,30 @@ button.crewlet-dataset-source__summary:focus-visible {
11461
11932
  color: var(--color-feedback-warning-ink);
11462
11933
  }
11463
11934
 
11935
+ /*
11936
+ * AN OPEN ENTRY IS ONE CARD: the selected edge above frames the summary and
11937
+ * the preview together, the summary its head on the selected fill and the
11938
+ * preview a well under it, inset on the summary's padding, so the figures in
11939
+ * it (cards of their own) stand on a ground that is plainly the source's
11940
+ * rather than the rail's. One line separates head from well, in the same
11941
+ * selected edge, and the head sits INSIDE the frame rather than over it: its
11942
+ * fill laid over the frame's edge would paint that edge out.
11943
+ */
11944
+ .crewlet-dataset-source--open {
11945
+ background: var(--color-surface-inset);
11946
+ }
11947
+
11948
+ .crewlet-dataset-source--open > .crewlet-dataset-source__summary {
11949
+ border-block-end-color: var(--color-border-selected);
11950
+ border-start-start-radius: calc(var(--radius-md) - 1px);
11951
+ border-start-end-radius: calc(var(--radius-md) - 1px);
11952
+ border-end-start-radius: 0;
11953
+ border-end-end-radius: 0;
11954
+ }
11955
+
11464
11956
  .crewlet-dataset-source__preview {
11465
11957
  min-width: 0;
11466
- padding: var(--spacing-2) var(--spacing-3) var(--spacing-3);
11958
+ padding: var(--spacing-3);
11467
11959
  }
11468
11960
 
11469
11961
  .crewlet-dataset-source-list {
@@ -11480,7 +11972,7 @@ button.crewlet-dataset-source__summary:focus-visible {
11480
11972
  }
11481
11973
 
11482
11974
 
11483
- /* DateTimePicker-HG2KQXQ6.css */
11975
+ /* DateTimePicker-2IVTKFV2.css */
11484
11976
  /*
11485
11977
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
11486
11978
  *
@@ -11534,10 +12026,17 @@ button.crewlet-dataset-source__summary:focus-visible {
11534
12026
  */
11535
12027
  .crewlet-datetime:focus-visible,
11536
12028
  .crewlet-datetime.is-open {
11537
- outline: 1px solid var(--color-focus);
12029
+ outline: 2px solid var(--color-focus);
11538
12030
  outline-offset: -1px;
11539
12031
  }
11540
12032
 
12033
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12034
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime:focus-visible,
12035
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime.is-open {
12036
+ outline-width: 1px;
12037
+ outline-color: var(--color-border-selected);
12038
+ }
12039
+
11541
12040
  .crewlet-datetime.is-disabled,
11542
12041
  .crewlet-datetime:disabled {
11543
12042
  opacity: 0.55;
@@ -11660,10 +12159,16 @@ svg.crewlet-datetime__chevron {
11660
12159
 
11661
12160
  /* The same one ring the trigger draws, over the box's own boundary. */
11662
12161
  .crewlet-datetime__time-input:focus-visible {
11663
- outline: 1px solid var(--color-focus);
12162
+ outline: 2px solid var(--color-focus);
11664
12163
  outline-offset: -1px;
11665
12164
  }
11666
12165
 
12166
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12167
+ :root[data-crewlet-focus='pointer'] .crewlet-datetime__time-input:focus-visible {
12168
+ outline-width: 1px;
12169
+ outline-color: var(--color-border-selected);
12170
+ }
12171
+
11667
12172
  .crewlet-datetime__footer {
11668
12173
  display: flex;
11669
12174
  align-items: center;
@@ -12376,7 +12881,7 @@ svg.crewlet-datetime__chevron {
12376
12881
  }
12377
12882
 
12378
12883
 
12379
- /* Document-JUGCSQ4L.css */
12884
+ /* Document-YFWTWXJP.css */
12380
12885
  /*
12381
12886
  * Rendered markdown, set as a document (Document.tsx).
12382
12887
  *
@@ -12706,17 +13211,34 @@ svg.crewlet-datetime__chevron {
12706
13211
  * on no surface of its own, with a line along its foot that answers the
12707
13212
  * pointer, the focus and a refusal. The line is a border rather than a
12708
13213
  * shadow, because forced colours keep a border and drop a shadow.
13214
+ *
13215
+ * ONE PIXEL, AND A TINT, WHERE A POINTER PUT THE CARET. The line is the
13216
+ * hairline under the pointer and the selected edge (the accent mixed toward
13217
+ * the page) once a click has put the caret in it: the reader is already
13218
+ * looking at the title, and a page that focuses its title on load drew a 2px
13219
+ * accent bar under it before anybody had touched anything.
13220
+ *
13221
+ * TWO PIXELS IN THE FOCUS COLOUR FOR THE KEYBOARD, the area WCAG 2.2's focus
13222
+ * appearance asks of an indicator: the border takes the focus colour and a
13223
+ * shadow lays the second pixel under it, with a transparent outline that
13224
+ * forced colours paints in its place. The padding takes the pixel the border
13225
+ * no longer reserves, so the title sits where it always did.
12709
13226
  */
12710
13227
  .crewlet-document-title-field {
12711
13228
  display: block;
12712
13229
  width: 100%;
12713
13230
  min-width: 0;
12714
- padding: 0 0 var(--spacing-1);
13231
+ padding: 0 0 calc(var(--spacing-1) + 1px);
12715
13232
  border: 0;
12716
- border-block-end: 2px solid transparent;
13233
+ border-block-end: 1px solid transparent;
12717
13234
  border-radius: 0;
12718
13235
  background: none;
12719
13236
  outline: none;
13237
+ /* A textarea of one row that grows with the title (DocumentTitleField sets
13238
+ its height): no handle, no scrollbar, and the title's own wrapping. */
13239
+ resize: none;
13240
+ overflow: hidden;
13241
+ white-space: pre-wrap;
12720
13242
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
12721
13243
  }
12722
13244
 
@@ -12731,12 +13253,27 @@ svg.crewlet-datetime__chevron {
12731
13253
 
12732
13254
  .crewlet-document-title-field:focus-visible {
12733
13255
  border-block-end-color: var(--color-focus);
13256
+ box-shadow: 0 1px 0 var(--color-focus);
13257
+ outline: 2px solid transparent;
13258
+ }
13259
+
13260
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field:focus-visible {
13261
+ border-block-end-color: var(--color-border-selected);
13262
+ box-shadow: none;
12734
13263
  }
12735
13264
 
12736
13265
  .crewlet-document-title-field[aria-invalid='true'] {
12737
13266
  border-block-end-color: var(--color-feedback-danger);
12738
13267
  }
12739
13268
 
13269
+ .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13270
+ box-shadow: 0 1px 0 var(--color-feedback-danger);
13271
+ }
13272
+
13273
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13274
+ border-block-end-color: var(--color-feedback-danger);
13275
+ }
13276
+
12740
13277
  @media (prefers-reduced-motion: reduce) {
12741
13278
  .crewlet-document-title-field {
12742
13279
  transition: none;
@@ -13313,7 +13850,7 @@ svg.crewlet-datetime__chevron {
13313
13850
  }
13314
13851
 
13315
13852
 
13316
- /* FilterChip-EZ4QMW4E.css */
13853
+ /* FilterChip-VL33P3JL.css */
13317
13854
  /*
13318
13855
  * The filter chip: neutral until it is on, and then the accent.
13319
13856
  *
@@ -13397,9 +13934,13 @@ svg.crewlet-datetime__chevron {
13397
13934
  cursor: not-allowed;
13398
13935
  }
13399
13936
 
13937
+ /* The selected fill, and the accent's lighter line rather than the selected
13938
+ edge: on a pill this small the 0.6 edge, the fill and the accent ink were
13939
+ three accent marks on one word. The ink is the mark that clears 4.5:1, and
13940
+ the keyboard's 2px focus ring stays the only full-weight line. */
13400
13941
  .crewlet-filter-chip[aria-pressed='true'],
13401
13942
  .crewlet-filter-chip[aria-checked='true'] {
13402
- background: var(--color-brand-accent-soft);
13943
+ background: var(--color-surface-selected);
13403
13944
  border-color: var(--color-brand-accent-soft-strong);
13404
13945
  color: var(--color-brand-accent-ink);
13405
13946
  }
@@ -14317,7 +14858,7 @@ button.crewlet-finding-list__row:focus-visible {
14317
14858
  }
14318
14859
 
14319
14860
 
14320
- /* Input-GBZSFXLU.css */
14861
+ /* Input-ABGOFENS.css */
14321
14862
  /*
14322
14863
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
14323
14864
  * ReadOnlyField.
@@ -14401,14 +14942,18 @@ button.crewlet-finding-list__row:focus-visible {
14401
14942
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
14402
14943
  * as a shadow disappears for exactly the readers who most need one.
14403
14944
  *
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).
14945
+ * It is TWO PIXELS FOR THE KEYBOARD AND ONE FOR A POINTER, laid over the
14946
+ * boundary. Two pixels is the area WCAG 2.2's focus appearance asks of an
14947
+ * indicator, and one pixel (the field's own hairline in the focus colour) was
14948
+ * half of it for every reader tabbing through a form. But at two pixels round
14949
+ * every box a caret landed in, a click into a title or a filter box drew a
14950
+ * heavy band round the one thing the reader was already looking at, so the
14951
+ * rule after this one narrows the ring where the document says the last move
14952
+ * was a pointer. Drawn over the boundary rather than outside it, a scroller
14953
+ * cannot clip it and the field does not grow a halo the moment a caret lands
14954
+ * in it, which is what a filter box in a toolbar of them did to the row it
14955
+ * sits in. Every boxed field in the package rings this way (`Input.test.tsx`
14956
+ * holds them to it).
14412
14957
  *
14413
14958
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
14414
14959
  * ring has not already said, and it is what cost the error state its own
@@ -14424,10 +14969,28 @@ button.crewlet-finding-list__row:focus-visible {
14424
14969
  * on a pointer press as well as on a tab.
14425
14970
  */
14426
14971
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
14427
- outline: 1px solid var(--color-focus);
14972
+ outline: 2px solid var(--color-focus);
14428
14973
  outline-offset: -1px;
14429
14974
  }
14430
14975
 
14976
+ /*
14977
+ * NARROWED FOR A POINTER. The ring above is the keyboard's: 2px, the area
14978
+ * WCAG 2.2's focus appearance asks of an indicator, drawn over the boundary
14979
+ * and one pixel into the box. A field matches :focus-visible on a click as
14980
+ * well, and a reader who put the caret there with a pointer is already looking
14981
+ * at it, so where the document says the last move was a pointer
14982
+ * (`data-crewlet-focus`, kept by `trackFocusModality`, which every field
14983
+ * starts) the ring is one pixel in the selected edge, the accent mixed toward
14984
+ * the page: a page that focuses its first field on load drew the focus colour
14985
+ * round it before anybody had touched a key. A refused field keeps its own
14986
+ * colour under a pointer too (below). A document that tracks nothing keeps
14987
+ * the keyboard's ring.
14988
+ */
14989
+ :root[data-crewlet-focus='pointer'] .crewlet-input:has(.crewlet-input__control:focus-visible) {
14990
+ outline-width: 1px;
14991
+ outline-color: var(--color-border-selected);
14992
+ }
14993
+
14431
14994
  .crewlet-input.is-error {
14432
14995
  border-color: var(--color-feedback-danger);
14433
14996
  }
@@ -14448,6 +15011,10 @@ button.crewlet-finding-list__row:focus-visible {
14448
15011
  outline-color: var(--color-feedback-danger);
14449
15012
  }
14450
15013
 
15014
+ :root[data-crewlet-focus='pointer'] .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15015
+ outline-color: var(--color-feedback-danger);
15016
+ }
15017
+
14451
15018
  .crewlet-input.is-disabled {
14452
15019
  opacity: 0.6;
14453
15020
  cursor: not-allowed;
@@ -14684,10 +15251,16 @@ button.crewlet-finding-list__row:focus-visible {
14684
15251
  on the control itself: a textarea is the field, with nothing wrapped round
14685
15252
  it and nothing focusable inside it. */
14686
15253
  .crewlet-textarea:focus-visible {
14687
- outline: 1px solid var(--color-focus);
15254
+ outline: 2px solid var(--color-focus);
14688
15255
  outline-offset: -1px;
14689
15256
  }
14690
15257
 
15258
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
15259
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea:focus-visible {
15260
+ outline-width: 1px;
15261
+ outline-color: var(--color-border-selected);
15262
+ }
15263
+
14691
15264
  .crewlet-textarea.is-error {
14692
15265
  border-color: var(--color-feedback-danger);
14693
15266
  }
@@ -14696,6 +15269,10 @@ button.crewlet-finding-list__row:focus-visible {
14696
15269
  outline-color: var(--color-feedback-danger);
14697
15270
  }
14698
15271
 
15272
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea.is-error:focus-visible {
15273
+ outline-color: var(--color-feedback-danger);
15274
+ }
15275
+
14699
15276
  .crewlet-textarea.is-disabled {
14700
15277
  opacity: 0.6;
14701
15278
  cursor: not-allowed;
@@ -15145,7 +15722,7 @@ button.crewlet-finding-list__row:focus-visible {
15145
15722
  }
15146
15723
 
15147
15724
 
15148
- /* LayersList-NQZEIPZB.css */
15725
+ /* LayersList-TBNF4XGL.css */
15149
15726
  /*
15150
15727
  * A canvas's list of layers (LayersList.tsx): a heading that stays, over one
15151
15728
  * line per entry that scrolls on its own.
@@ -15216,13 +15793,26 @@ button.crewlet-finding-list__row:focus-visible {
15216
15793
  color: var(--color-text-primary);
15217
15794
  }
15218
15795
 
15219
- /* The accent edge every current row in the system takes, in the primary ink.
15220
- A border, so forced colours keep it. */
15796
+ /*
15797
+ * THE PICKED ENTRY IS A SELECTION, drawn as the package draws a chosen
15798
+ * option: the selected fill under the primary ink, as a canvas's layers panel
15799
+ * marks the board picked on it. It used to take the accent rail a CURRENT row
15800
+ * takes (the outline's heading, the page in the rail), which says "you are
15801
+ * here" and beside a canvas read as a second selection ring. The rail's room
15802
+ * is still held, so nothing moves, and forced colours draw it in the system's
15803
+ * own selected colour, since they drop the fill.
15804
+ */
15221
15805
  .crewlet-layers-list__item[aria-current='true'] {
15222
- border-inline-start-color: var(--color-brand-accent);
15806
+ background: var(--color-surface-selected);
15223
15807
  color: var(--color-text-primary);
15224
15808
  }
15225
15809
 
15810
+ @media (forced-colors: active) {
15811
+ .crewlet-layers-list__item[aria-current='true'] {
15812
+ border-inline-start-color: Highlight;
15813
+ }
15814
+ }
15815
+
15226
15816
  /* The ring lies inside the entry, where the scroller beside it cannot cut it. */
15227
15817
  .crewlet-layers-list__item:focus-visible {
15228
15818
  outline: 2px solid var(--color-focus);
@@ -16117,9 +16707,10 @@ button.crewlet-finding-list__row:focus-visible {
16117
16707
  }
16118
16708
 
16119
16709
 
16120
- /* LivePreview-SRO7KHO4.css */
16710
+ /* LivePreview-BROGKR4N.css */
16121
16711
  /*
16122
- * A live preview: the stand-in and the live layer stacked in one box. The box
16712
+ * A live preview: the stand-in, the still copy of what the content drew and
16713
+ * the live layer it is drawn in, stacked in that order in one box. The box
16123
16714
  * takes its size from its parent (a card's preview area), so it fills it and
16124
16715
  * clips whatever the content lays out past its edge.
16125
16716
  */
@@ -16137,9 +16728,43 @@ button.crewlet-finding-list__row:focus-visible {
16137
16728
  position: absolute;
16138
16729
  inset: 0;
16139
16730
  display: flex;
16140
- transition: opacity var(--motion-duration-base) var(--motion-easing-out);
16141
16731
  }
16142
16732
 
16733
+ /* THE STILL COPY: static DOM over the stand-in, which it hides. A copy just
16734
+ taken fades in; one the preview was given back from its store is simply
16735
+ there, so a card scrolled or filtered back to is as it was. */
16736
+ .crewlet-live-preview__still {
16737
+ position: absolute;
16738
+ inset: 0;
16739
+ display: block;
16740
+ overflow: hidden;
16741
+ pointer-events: none;
16742
+ user-select: none;
16743
+ }
16744
+
16745
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still {
16746
+ animation: crewlet-live-preview-arrive var(--motion-duration-base) var(--motion-easing-out);
16747
+ }
16748
+
16749
+ @keyframes crewlet-live-preview-arrive {
16750
+ from {
16751
+ opacity: 0;
16752
+ }
16753
+ }
16754
+
16755
+ /* A COPY IS FROZEN: what it drew never moves, so nothing in it animates or
16756
+ transitions, whatever the content's own styles ask of the elements it
16757
+ copied (a skeleton's shimmer, a chart's entrance). */
16758
+ .crewlet-live-preview__still *,
16759
+ .crewlet-live-preview__still *::before,
16760
+ .crewlet-live-preview__still *::after {
16761
+ animation: none !important;
16762
+ transition: none !important;
16763
+ }
16764
+
16765
+ /* THE LIVE LAYER renders out of sight: content that is copied is never seen
16766
+ live, only its copy is. A frame's page is kept rather than copied, so a
16767
+ framed preview's live layer is what fades in once it has drawn. */
16143
16768
  .crewlet-live-preview__live {
16144
16769
  position: absolute;
16145
16770
  inset: 0;
@@ -16148,9 +16773,16 @@ button.crewlet-finding-list__row:focus-visible {
16148
16773
  opacity: 0;
16149
16774
  pointer-events: none;
16150
16775
  user-select: none;
16776
+ }
16777
+
16778
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live {
16151
16779
  transition: opacity var(--motion-duration-base) var(--motion-easing-out);
16152
16780
  }
16153
16781
 
16782
+ .crewlet-live-preview[data-frame][data-state='ready'] > .crewlet-live-preview__live {
16783
+ opacity: 1;
16784
+ }
16785
+
16154
16786
  /* LAID OUT AT ITS OWN SIZE from the top left corner, and scaled from there:
16155
16787
  to the box's width, its top left the box's, or whole and centred. */
16156
16788
  .crewlet-preview-scale {
@@ -16169,17 +16801,23 @@ button.crewlet-finding-list__row:focus-visible {
16169
16801
  transform-origin: 0 0;
16170
16802
  }
16171
16803
 
16172
- .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__live {
16173
- opacity: 1;
16174
- }
16175
-
16804
+ /* WHAT IS UNDER A DRAWING is hidden only once it has faded in. Fading the
16805
+ stand-in out at the same time showed both at half strength halfway
16806
+ through: a double exposure. */
16176
16807
  .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
16177
- opacity: 0;
16808
+ visibility: hidden;
16809
+ /* Visibility is discrete and stays visible for the whole of a transition
16810
+ to hidden, so this holds it exactly as long as the fade above. A copy
16811
+ given back from the store is ready from its first style, which runs no
16812
+ transition, so its stand-in is never shown at all. */
16813
+ transition: visibility var(--motion-duration-base) linear;
16178
16814
  }
16179
16815
 
16180
16816
  @media (prefers-reduced-motion: reduce) {
16181
- .crewlet-live-preview__fallback,
16182
- .crewlet-live-preview__live {
16817
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still,
16818
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live,
16819
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
16820
+ animation: none;
16183
16821
  transition: none;
16184
16822
  }
16185
16823
  }
@@ -21359,7 +21997,7 @@ button.crewlet-presence-stack__member:focus-visible {
21359
21997
  }
21360
21998
 
21361
21999
 
21362
- /* Select-A54YS5EP.css */
22000
+ /* Select-W3CHTZXP.css */
21363
22001
  /*
21364
22002
  * Select: one chrome over two controls, and the product's only dropdown.
21365
22003
  *
@@ -21433,10 +22071,16 @@ button.crewlet-presence-stack__member:focus-visible {
21433
22071
  * leave the other bare.
21434
22072
  */
21435
22073
  .crewlet-select:focus-within {
21436
- outline: 1px solid var(--color-focus);
22074
+ outline: 2px solid var(--color-focus);
21437
22075
  outline-offset: -1px;
21438
22076
  }
21439
22077
 
22078
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22079
+ :root[data-crewlet-focus='pointer'] .crewlet-select:focus-within {
22080
+ outline-width: 1px;
22081
+ outline-color: var(--color-border-selected);
22082
+ }
22083
+
21440
22084
  /*
21441
22085
  * A FILTER THAT IS ON. The accent border says where the reader is and the
21442
22086
  * accent INK says what it is set to. It used to be the accent FILL with the
@@ -21495,6 +22139,10 @@ button.crewlet-presence-stack__member:focus-visible {
21495
22139
  outline-color: var(--color-feedback-danger);
21496
22140
  }
21497
22141
 
22142
+ :root[data-crewlet-focus='pointer'] .crewlet-select.is-error:focus-within {
22143
+ outline-color: var(--color-feedback-danger);
22144
+ }
22145
+
21498
22146
  .crewlet-select.is-disabled {
21499
22147
  opacity: 0.6;
21500
22148
  cursor: not-allowed;
@@ -21788,10 +22436,16 @@ svg.crewlet-select__chevron {
21788
22436
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
21789
22437
  */
21790
22438
  .crewlet-select__search:focus-within {
21791
- outline: 1px solid var(--color-focus);
22439
+ outline: 2px solid var(--color-focus);
21792
22440
  outline-offset: -1px;
21793
22441
  }
21794
22442
 
22443
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22444
+ :root[data-crewlet-focus='pointer'] .crewlet-select__search:focus-within {
22445
+ outline-width: 1px;
22446
+ outline-color: var(--color-border-selected);
22447
+ }
22448
+
21795
22449
  .crewlet-select__search {
21796
22450
  display: flex;
21797
22451
  align-items: center;
@@ -23870,13 +24524,18 @@ svg.crewlet-select__chevron {
23870
24524
  }
23871
24525
 
23872
24526
 
23873
- /* SlideFilmstrip-4ITZLMO4.css */
24527
+ /* SlideFilmstrip-PAT7P4OG.css */
23874
24528
  /*
23875
24529
  * SlideFilmstrip: the column of slide thumbnails beside a deck's stage, or
23876
24530
  * the row under it on a phone.
23877
24531
  *
23878
- * The selected slide is ringed in the brand accent rather than filled, so its
23879
- * thumbnail still shows the slide's own colours.
24532
+ * The selected slide is ringed rather than filled, so its thumbnail still
24533
+ * shows the slide's own colours: the selected edge (a tint of the accent) on
24534
+ * the thumbnail's own line, the selected fill as a soft band outside it, and
24535
+ * its number in the accent ink. It was a 2px ring in the full accent, the
24536
+ * same weight and colour as the focus ring beside it, so the slide being
24537
+ * edited and the slide the keyboard was on could not be told apart. The
24538
+ * number is the mark that clears 3:1, so the state never rests on the tint.
23880
24539
  *
23881
24540
  * THE STRIP IS ITS OWN SCROLLER: a host bounds it (a column's max-height, a
23882
24541
  * row's width) and the strip scrolls inside that, keeping the selected slide
@@ -23921,24 +24580,38 @@ svg.crewlet-select__chevron {
23921
24580
  border: 0;
23922
24581
  background: transparent;
23923
24582
  border-radius: var(--radius-sm);
23924
- outline: 1px solid var(--color-border-default);
24583
+ /* THE STRONG LINE AT REST: a deck's slides are mostly dark, and on the dark
24584
+ page the plain hairline sat within a few steps of both the page and the
24585
+ slide, so a strip of them had no edges at all. Under the pointer it takes
24586
+ the strong line's own hover step, so pointing still moves the edge. */
24587
+ outline: 1px solid var(--color-border-strong);
23925
24588
  cursor: pointer;
23926
24589
  overflow: hidden;
23927
24590
  }
23928
24591
 
23929
24592
  .crewlet-slide-filmstrip__thumb:hover {
23930
- outline-color: var(--color-border-hover);
24593
+ outline-color: var(--color-border-strong-hover);
23931
24594
  }
23932
24595
 
23933
24596
  .crewlet-slide-filmstrip__item[data-selected='true'] .crewlet-slide-filmstrip__thumb {
23934
- outline: 2px solid var(--color-brand-accent);
24597
+ outline-color: var(--color-border-selected);
24598
+ box-shadow: 0 0 0 3px var(--color-surface-selected);
24599
+ }
24600
+
24601
+ .crewlet-slide-filmstrip__item[data-selected='true'] .crewlet-slide-filmstrip__number {
24602
+ color: var(--color-brand-accent-ink);
24603
+ font-weight: var(--font-weight-semibold);
23935
24604
  }
23936
24605
 
23937
24606
  /* 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. */
24607
+ of the edge rather than standing off it as a second one, and grows OUTWARD
24608
+ from it onto the strip's ground. It used to sit on the inset offset, inside
24609
+ the thumbnail, where a dark slide (most of a deck's themes) swallowed it:
24610
+ the focus colour measured close to the slide's own ground, and tabbing
24611
+ through the strip showed nothing at all. The list's own padding holds it. */
23939
24612
  .crewlet-slide-filmstrip__thumb:focus-visible {
23940
24613
  outline: 2px solid var(--color-focus);
23941
- outline-offset: var(--size-focus-ring-inset-offset);
24614
+ outline-offset: 0;
23942
24615
  }
23943
24616
 
23944
24617
  .crewlet-slide-filmstrip__item[data-hidden='true'] .crewlet-slide-stage {
@@ -24091,7 +24764,7 @@ svg.crewlet-select__chevron {
24091
24764
  }
24092
24765
 
24093
24766
 
24094
- /* SlideGrid-S4LTJ4UU.css */
24767
+ /* SlideGrid-FJA33DV4.css */
24095
24768
  /*
24096
24769
  * SlideGrid: every slide of a deck at once, by its outline's sections.
24097
24770
  */
@@ -24136,8 +24809,18 @@ svg.crewlet-select__chevron {
24136
24809
  outline-color: var(--color-border-hover);
24137
24810
  }
24138
24811
 
24812
+ /* THE CURRENT SLIDE, drawn as the filmstrip draws it: the selected edge on
24813
+ the slide's own line, the selected fill as a soft band outside it, and its
24814
+ number in the accent ink, the mark that clears 3:1. Never the full accent
24815
+ at 2px, which is the focus ring's weight and colour. */
24139
24816
  .crewlet-slide-grid__card[aria-current='true'] .crewlet-slide-stage {
24140
- outline: 2px solid var(--color-brand-accent);
24817
+ outline-color: var(--color-border-selected);
24818
+ box-shadow: 0 0 0 3px var(--color-surface-selected);
24819
+ }
24820
+
24821
+ .crewlet-slide-grid__card[aria-current='true'] .crewlet-slide-grid__number {
24822
+ color: var(--color-brand-accent-ink);
24823
+ font-weight: var(--font-weight-semibold);
24141
24824
  }
24142
24825
 
24143
24826
  /* ONE RING, round the whole card (its slide and its caption), on the inset
@@ -24236,7 +24919,7 @@ svg.crewlet-select__chevron {
24236
24919
  }
24237
24920
 
24238
24921
 
24239
- /* SlideStage-S2FISF4C.css */
24922
+ /* SlideStage-ZTTEQSS2.css */
24240
24923
  /*
24241
24924
  * SlideStage: a slide laid out at its authored size and scaled to its box.
24242
24925
  *
@@ -24258,10 +24941,12 @@ svg.crewlet-select__chevron {
24258
24941
  /* THE SLIDE'S OWN EDGE: the box is the slide (or, for a show in the page,
24259
24942
  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
24943
  marks a stage (selected, current) recolours this outline rather than adding
24261
- a second line. */
24944
+ a second line. It takes the STRONG border, not the default one: most decks
24945
+ are dark, and in the dark theme the default border is a step off the page,
24946
+ so a dark slide on a dark page had no edge at all. */
24262
24947
  .crewlet-slide-stage--framed {
24263
24948
  border-radius: var(--radius-sm);
24264
- outline: 1px solid var(--color-border-default);
24949
+ outline: 1px solid var(--color-border-strong);
24265
24950
  }
24266
24951
 
24267
24952
  :fullscreen .crewlet-slide-stage--framed,
@@ -24310,7 +24995,7 @@ svg.crewlet-select__chevron {
24310
24995
  }
24311
24996
 
24312
24997
 
24313
- /* SourceEditor-G2C3STPX.css */
24998
+ /* SourceEditor-QAYE2JS6.css */
24314
24999
  /*
24315
25000
  * Source text written in place: a gutter of line numbers beside a real
24316
25001
  * textarea, and the marks a checker placed drawn behind the text. The gutter,
@@ -24318,7 +25003,11 @@ svg.crewlet-select__chevron {
24318
25003
  * so a number and a mark always sit on the line they name; the layers follow
24319
25004
  * the field's scroll by a transform.
24320
25005
  *
24321
- * The BOX takes the focus ring, as the Composer's does.
25006
+ * The BOX takes the focus ring every field draws (see Input.css): 2px in the
25007
+ * focus colour for the keyboard, one pixel of the selected edge where a
25008
+ * pointer put the caret. It used to recolour its border to the accent and lay
25009
+ * a 2px soft halo outside it, two highlights for one state, as the Composer's
25010
+ * did.
24322
25011
  */
24323
25012
  .crewlet-source-editor {
24324
25013
  --crewlet-source-inset: var(--spacing-2);
@@ -24334,18 +25023,21 @@ svg.crewlet-select__chevron {
24334
25023
  font-family: var(--font-family-mono);
24335
25024
  font-size: var(--font-size-xs);
24336
25025
  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);
25026
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
24340
25027
  }
24341
25028
 
24342
25029
  .crewlet-source-editor:hover {
24343
25030
  border-color: var(--color-border-strong-hover);
24344
25031
  }
24345
25032
 
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);
25033
+ .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25034
+ outline: 2px solid var(--color-focus);
25035
+ outline-offset: -1px;
25036
+ }
25037
+
25038
+ :root[data-crewlet-focus='pointer'] .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25039
+ outline-width: 1px;
25040
+ outline-color: var(--color-border-selected);
24349
25041
  }
24350
25042
 
24351
25043
  .crewlet-source-editor.is-fill {
@@ -24448,11 +25140,11 @@ svg.crewlet-select__chevron {
24448
25140
  color: var(--color-text-tertiary);
24449
25141
  }
24450
25142
 
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;
25143
+ /* The ring is the box's, above, an outline that forced colours repaint, so
25144
+ the field inside draws none of its own. Stated at rest, as the Composer's
25145
+ field is. */
25146
+ .crewlet-source-editor .crewlet-source-editor__field {
25147
+ outline: none;
24456
25148
  }
24457
25149
 
24458
25150
  .crewlet-source-editor .crewlet-source-editor__field[readonly] {
@@ -26984,7 +27676,7 @@ b.crewlet-switcher__match {
26984
27676
  }
26985
27677
 
26986
27678
 
26987
- /* TagsInput-XMXTI5Q4.css */
27679
+ /* TagsInput-7EGBBXHS.css */
26988
27680
  /*
26989
27681
  * TagsInput: several values in one field.
26990
27682
  *
@@ -27059,10 +27751,16 @@ b.crewlet-switcher__match {
27059
27751
  * the whole reason they sit above the field instead of inside it.
27060
27752
  */
27061
27753
  .crewlet-tags-input__box:focus-visible {
27062
- outline: 1px solid var(--color-focus);
27754
+ outline: 2px solid var(--color-focus);
27063
27755
  outline-offset: -1px;
27064
27756
  }
27065
27757
 
27758
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
27759
+ :root[data-crewlet-focus='pointer'] .crewlet-tags-input__box:focus-visible {
27760
+ outline-width: 1px;
27761
+ outline-color: var(--color-border-selected);
27762
+ }
27763
+
27066
27764
  .crewlet-tags-input.is-disabled {
27067
27765
  opacity: 0.6;
27068
27766
  }
@@ -27323,7 +28021,7 @@ b.crewlet-switcher__match {
27323
28021
  }
27324
28022
 
27325
28023
 
27326
- /* ThemeGallery-HSUKBDWY.css */
28024
+ /* ThemeGallery-X35Y25EX.css */
27327
28025
  /*
27328
28026
  * The gallery of themes: each group's heading over a grid of cards.
27329
28027
  *
@@ -27359,8 +28057,15 @@ b.crewlet-switcher__match {
27359
28057
 
27360
28058
  /*
27361
28059
  * 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.
28060
+ * strong one; chosen, the selected edge (the accent mixed toward the card)
28061
+ * over the selected fill, with a check beside the name. One line round the
28062
+ * card in every state, so the chosen card is never a card inside a frame.
28063
+ *
28064
+ * THE CHOSEN CARD IS CALM ON PURPOSE. It was the full accent, which on a grid
28065
+ * of six read as the loudest edge on the page and as a second focus ring. The
28066
+ * tint and the fill say which card is on at a glance; the check says it at
28067
+ * the 3:1 a state mark clears, so the state never rests on the tint alone;
28068
+ * and the focus ring stays the one 2px accent line, for the keyboard only.
27364
28069
  */
27365
28070
  .crewlet-theme-gallery__card {
27366
28071
  display: flex;
@@ -27377,14 +28082,15 @@ b.crewlet-switcher__match {
27377
28082
  cursor: pointer;
27378
28083
  }
27379
28084
 
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. */
28085
+ /* Not on the chosen card: under the pointer it keeps its selected edge, or the
28086
+ one card that says "this one" would stop saying it while it is pointed at. */
27382
28087
  .crewlet-theme-gallery__card:hover:not(:disabled):not(.is-chosen) {
27383
28088
  border-color: var(--color-border-strong);
27384
28089
  }
27385
28090
 
27386
28091
  .crewlet-theme-gallery__card.is-chosen {
27387
- border-color: var(--color-brand-accent);
28092
+ border-color: var(--color-border-selected);
28093
+ background: var(--color-surface-selected);
27388
28094
  }
27389
28095
 
27390
28096
  /* The ring is drawn OVER the border, inset by its width, never a second line outside it. */
@@ -27398,6 +28104,19 @@ b.crewlet-switcher__match {
27398
28104
  opacity: 0.5;
27399
28105
  }
27400
28106
 
28107
+ .crewlet-theme-gallery__label {
28108
+ display: flex;
28109
+ align-items: center;
28110
+ gap: var(--spacing-1);
28111
+ min-width: 0;
28112
+ }
28113
+
28114
+ .crewlet-theme-gallery__check {
28115
+ flex: none;
28116
+ margin-inline-start: auto;
28117
+ color: var(--color-brand-accent-ink);
28118
+ }
28119
+
27401
28120
  .crewlet-theme-gallery__name {
27402
28121
  overflow: hidden;
27403
28122
  font-size: var(--font-size-xs);
@@ -27687,7 +28406,7 @@ b.crewlet-switcher__match {
27687
28406
  }
27688
28407
 
27689
28408
 
27690
- /* TimeWindowPicker-T763GLXH.css */
28409
+ /* TimeWindowPicker-DEFDV77Z.css */
27691
28410
  /*
27692
28411
  * TimeWindowPicker: one trigger over one panel.
27693
28412
  *
@@ -27737,10 +28456,17 @@ b.crewlet-switcher__match {
27737
28456
  */
27738
28457
  .crewlet-time-window:focus-visible,
27739
28458
  .crewlet-time-window.is-open {
27740
- outline: 1px solid var(--color-focus);
28459
+ outline: 2px solid var(--color-focus);
27741
28460
  outline-offset: -1px;
27742
28461
  }
27743
28462
 
28463
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28464
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window:focus-visible,
28465
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window.is-open {
28466
+ outline-width: 1px;
28467
+ outline-color: var(--color-border-selected);
28468
+ }
28469
+
27744
28470
  .crewlet-time-window.is-disabled,
27745
28471
  .crewlet-time-window:disabled {
27746
28472
  opacity: 0.55;
@@ -28008,10 +28734,16 @@ svg.crewlet-time-window__tick {
28008
28734
  * own boundary (see Input.css), keyed on the box's own input.
28009
28735
  */
28010
28736
  .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28011
- outline: 1px solid var(--color-focus);
28737
+ outline: 2px solid var(--color-focus);
28012
28738
  outline-offset: -1px;
28013
28739
  }
28014
28740
 
28741
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28742
+ :root[data-crewlet-focus='pointer'] .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28743
+ outline-width: 1px;
28744
+ outline-color: var(--color-border-selected);
28745
+ }
28746
+
28015
28747
  .crewlet-time-window__masked-input {
28016
28748
  min-width: 0;
28017
28749
  /* The `size` attribute the component sets is what holds the width open in