@crewlethq/ui 0.12.0 → 0.13.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 (157) hide show
  1. package/README.md +66 -5
  2. package/dist/AppShell/index.js +2 -1
  3. package/dist/Avatar/index.js +1 -1
  4. package/dist/{Avatar-QHYOFID3.css → Avatar-BPJ36QZR.css} +1 -1
  5. package/dist/AvatarPicker/index.js +6 -6
  6. package/dist/Breadcrumb/Breadcrumb.d.ts +68 -0
  7. package/dist/Breadcrumb/index.d.ts +3 -0
  8. package/dist/Breadcrumb/index.js +3 -0
  9. package/dist/Breadcrumb-YMWVM3SV.css +193 -0
  10. package/dist/ChoiceButtons/ChoiceButtons.d.ts +43 -0
  11. package/dist/ChoiceButtons/index.d.ts +3 -0
  12. package/dist/ChoiceButtons/index.js +3 -0
  13. package/dist/ChoiceButtons-DJ5EOGUA.css +127 -0
  14. package/dist/Combobox/index.js +2 -2
  15. package/dist/CommandPalette/CommandPalette.d.ts +48 -1
  16. package/dist/CommandPalette/index.js +3 -3
  17. package/dist/{CommandPalette-C5AMKGN2.css → CommandPalette-HBTNKHZQ.css} +55 -2
  18. package/dist/DataTable/index.js +4 -4
  19. package/dist/DataView/index.js +11 -11
  20. package/dist/DateTimePicker/index.js +2 -2
  21. package/dist/Document/Document.d.ts +56 -0
  22. package/dist/Document/index.d.ts +3 -0
  23. package/dist/Document/index.js +2 -0
  24. package/dist/Document-PQGXJHB7.css +288 -0
  25. package/dist/EntityChip/index.js +1 -1
  26. package/dist/Highlight/Highlight.d.ts +45 -0
  27. package/dist/Highlight/index.d.ts +3 -0
  28. package/dist/Highlight/index.js +2 -0
  29. package/dist/Highlight-DXLV2R6L.css +29 -0
  30. package/dist/HuePicker/index.js +3 -3
  31. package/dist/ImageUpload/index.js +2 -2
  32. package/dist/{ImageUpload-L2GE4JUM.css → ImageUpload-NVGMN7DP.css} +9 -6
  33. package/dist/InboxList/InboxList.d.ts +116 -0
  34. package/dist/InboxList/index.d.ts +3 -0
  35. package/dist/InboxList/index.js +5 -0
  36. package/dist/InboxList-YMFWKGGS.css +252 -0
  37. package/dist/KeyChip/KeyChip.d.ts +21 -0
  38. package/dist/KeyChip/index.d.ts +3 -0
  39. package/dist/KeyChip/index.js +2 -0
  40. package/dist/KeyChip-4XJU4BBE.css +30 -0
  41. package/dist/Link/Link.d.ts +17 -2
  42. package/dist/Link/index.js +1 -1
  43. package/dist/{Link-6BEFNMN2.css → Link-WPMVLKLY.css} +36 -1
  44. package/dist/ListInput/index.js +2 -2
  45. package/dist/Listbox/index.d.ts +2 -0
  46. package/dist/Listbox/index.js +1 -1
  47. package/dist/Listbox/useHighlightRest.d.ts +35 -0
  48. package/dist/MarkdownEditor/MarkdownEditor.d.ts +93 -0
  49. package/dist/MarkdownEditor/format.d.ts +34 -0
  50. package/dist/MarkdownEditor/index.d.ts +5 -0
  51. package/dist/MarkdownEditor/index.js +12 -0
  52. package/dist/MarkdownEditor-ZLSHTOIZ.css +146 -0
  53. package/dist/Modal/Modal.d.ts +5 -1
  54. package/dist/Modal/index.js +1 -1
  55. package/dist/{Modal-BNT3TDV2.css → Modal-3YJ2GG2T.css} +33 -0
  56. package/dist/OrgLabel/index.js +1 -1
  57. package/dist/OrgNode/index.js +1 -1
  58. package/dist/OrgTable/index.js +5 -5
  59. package/dist/Outline/Outline.d.ts +72 -0
  60. package/dist/Outline/index.d.ts +3 -0
  61. package/dist/Outline/index.js +2 -0
  62. package/dist/Outline-VCXKKU3E.css +78 -0
  63. package/dist/Popover/Popover.d.ts +21 -1
  64. package/dist/Popover/index.js +1 -1
  65. package/dist/ReadingPane/ReadingPane.d.ts +95 -0
  66. package/dist/ReadingPane/index.d.ts +3 -0
  67. package/dist/ReadingPane/index.js +4 -0
  68. package/dist/ReadingPane-5UOLPWY5.css +194 -0
  69. package/dist/SegmentedControl/SegmentedControl.d.ts +9 -1
  70. package/dist/SegmentedControl/index.js +3 -3
  71. package/dist/{SegmentedControl-76HODRBT.css → SegmentedControl-PKBLJVSA.css} +18 -0
  72. package/dist/Select/Select.d.ts +22 -0
  73. package/dist/Select/index.js +2 -2
  74. package/dist/{Select-4ANVLHUY.css → Select-XMZ44RWY.css} +24 -0
  75. package/dist/SidebarNav/index.js +2 -1
  76. package/dist/{SidebarNav-X5NLZNWA.css → SidebarNav-KF66MLOM.css} +4 -19
  77. package/dist/Switcher/Switcher.d.ts +151 -0
  78. package/dist/Switcher/index.d.ts +3 -0
  79. package/dist/Switcher/index.js +16 -0
  80. package/dist/Switcher-B44Q4WF4.css +346 -0
  81. package/dist/Tabs/Tabs.d.ts +7 -1
  82. package/dist/Tabs/index.js +1 -1
  83. package/dist/{Tabs-5I5Q5KKM.css → Tabs-ITJYJFMU.css} +49 -0
  84. package/dist/TagsInput/index.js +3 -3
  85. package/dist/ThemeGallery/ThemeGallery.d.ts +65 -0
  86. package/dist/ThemeGallery/index.d.ts +3 -0
  87. package/dist/ThemeGallery/index.js +6 -0
  88. package/dist/ThemeGallery-NITASULQ.css +93 -0
  89. package/dist/ThemeSwatch/ThemeSwatch.d.ts +71 -0
  90. package/dist/ThemeSwatch/index.d.ts +3 -0
  91. package/dist/ThemeSwatch/index.js +2 -0
  92. package/dist/ThemeSwatch-4DL457ZB.css +256 -0
  93. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +5 -1
  94. package/dist/ThemeSwitcher/index.js +4 -4
  95. package/dist/ThemeToggle/ThemeToggle.d.ts +1 -1
  96. package/dist/ThemeToggle/index.js +1 -1
  97. package/dist/TimeWindowPicker/index.js +4 -4
  98. package/dist/Toaster/index.js +1 -1
  99. package/dist/{Toaster-NVDCEIP5.css → Toaster-KZ7YE2HA.css} +1 -0
  100. package/dist/Tree/index.d.ts +1 -1
  101. package/dist/Tree/index.js +1 -1
  102. package/dist/Tree/useTreeState.d.ts +37 -7
  103. package/dist/TreeCanvas/index.js +2 -2
  104. package/dist/TreeGrid/TreeGrid.d.ts +22 -2
  105. package/dist/TreeGrid/index.js +2 -2
  106. package/dist/{TreeGrid-NSW7VMOX.css → TreeGrid-FBX3MSJA.css} +19 -0
  107. package/dist/{chunk-EBBAAQDY.js → chunk-26PEPONN.js} +3 -1
  108. package/dist/{chunk-HV6IZFBK.js → chunk-4FFHJBEN.js} +2 -2
  109. package/dist/{chunk-JHQUT4WJ.js → chunk-4LDTQWS7.js} +1 -1
  110. package/dist/{chunk-GXYNEDNA.js → chunk-4Y7WKXAW.js} +1 -1
  111. package/dist/{chunk-MCPKHYMC.js → chunk-6LXMLQUM.js} +17 -4
  112. package/dist/{chunk-3UK4VFSK.js → chunk-6NIZCQUM.js} +1 -1
  113. package/dist/{chunk-ORNOOMVY.js → chunk-6TSZCBID.js} +2 -2
  114. package/dist/{chunk-ZMJHK7DR.js → chunk-75WOCYGC.js} +2 -2
  115. package/dist/chunk-77IEHFY4.js +299 -0
  116. package/dist/chunk-A5YKNRG6.js +94 -0
  117. package/dist/{chunk-HLBRPES3.js → chunk-B2CITO6R.js} +2 -2
  118. package/dist/{chunk-TEEJSTFG.js → chunk-CF6DTETT.js} +1 -1
  119. package/dist/{chunk-LAQK4V3Z.js → chunk-DJMLHCLD.js} +1 -1
  120. package/dist/{chunk-6MU7HNB4.js → chunk-F73MC7EZ.js} +47 -2
  121. package/dist/{chunk-ZPSOF6VL.js → chunk-FBSEJO2C.js} +1 -1
  122. package/dist/chunk-FYTIJM2T.js +40 -0
  123. package/dist/{chunk-ZHOM65MI.js → chunk-GG2QEZO2.js} +2 -2
  124. package/dist/chunk-H6VKCIWV.js +41 -0
  125. package/dist/{chunk-XV65NTIT.js → chunk-HKGS67VG.js} +94 -41
  126. package/dist/chunk-IG75YMUN.js +22 -0
  127. package/dist/{chunk-JCNUQ3US.js → chunk-JDPAA2JU.js} +1 -1
  128. package/dist/chunk-KLIEPFEZ.js +95 -0
  129. package/dist/{chunk-7LD6P32I.js → chunk-L3CTFFLZ.js} +2 -18
  130. package/dist/{chunk-UG5ZMAXW.js → chunk-LELD5KPA.js} +1 -1
  131. package/dist/chunk-MNFU2RNT.js +74 -0
  132. package/dist/{chunk-S3BCVWTU.js → chunk-MY374UUD.js} +49 -31
  133. package/dist/{chunk-K5Q2DK3P.js → chunk-NXDEPUVG.js} +1 -1
  134. package/dist/{chunk-PDUZO35I.js → chunk-O2ZDZZS7.js} +15 -6
  135. package/dist/{chunk-5WEVLIB6.js → chunk-RZ7RGECB.js} +1 -1
  136. package/dist/chunk-S3IENQ3E.js +336 -0
  137. package/dist/{chunk-WEIINZPA.js → chunk-SBRE7IML.js} +6 -2
  138. package/dist/{chunk-IVFJD7WY.js → chunk-UCCC7YVZ.js} +3 -2
  139. package/dist/{chunk-IINFVK3W.js → chunk-UZPHPW3Z.js} +6 -6
  140. package/dist/chunk-VWNC2L6W.js +110 -0
  141. package/dist/chunk-VYY56AMX.js +2 -0
  142. package/dist/chunk-WI6K5M5X.js +24 -0
  143. package/dist/{chunk-GOUKOXJK.js → chunk-WY2NLRZN.js} +3 -3
  144. package/dist/{chunk-SEFMO2EV.js → chunk-XFE5W2I4.js} +44 -5
  145. package/dist/chunk-XYCADWZN.js +100 -0
  146. package/dist/chunk-YSJC7AZC.js +62 -0
  147. package/dist/chunk-ZAJHGDAW.js +93 -0
  148. package/dist/generated/index.d.ts +12 -0
  149. package/dist/generated/index.js +65 -52
  150. package/dist/index.js +65 -52
  151. package/dist/styles.css +2449 -161
  152. package/dist/utils/highlight.d.ts +17 -0
  153. package/dist/utils/useMediaMatch.d.ts +12 -0
  154. package/package.json +3 -3
  155. package/dist/chunk-UAQIUSSK.js +0 -2
  156. package/dist/{chunk-74OVQWA5.js → chunk-6AR2T5Y4.js} +0 -0
  157. package/dist/{chunk-GARACZAH.js → chunk-LZP7FGT7.js} +1 -1
package/dist/styles.css CHANGED
@@ -1088,7 +1088,7 @@
1088
1088
  }
1089
1089
 
1090
1090
 
1091
- /* Avatar-QHYOFID3.css */
1091
+ /* Avatar-BPJ36QZR.css */
1092
1092
  /*
1093
1093
  * The identity badge.
1094
1094
  *
@@ -1233,7 +1233,7 @@
1233
1233
  }
1234
1234
 
1235
1235
  .crewlet-avatar--seeded {
1236
- color: var(--color-text-on-accent);
1236
+ color: var(--color-text-on-scrim);
1237
1237
  }
1238
1238
 
1239
1239
  .crewlet-avatar--tint-0 { background: var(--color-avatar-tint-0); }
@@ -1662,6 +1662,202 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
1662
1662
  }
1663
1663
 
1664
1664
 
1665
+ /* Breadcrumb-YMWVM3SV.css */
1666
+ /*
1667
+ * The trail in a top bar.
1668
+ *
1669
+ * IT IS WHAT GIVES WAY, AND WHAT TAKES THE SLACK. `flex-grow: 1` is the spacer
1670
+ * a bar would otherwise need: the trail absorbs the free space, so the
1671
+ * controls after it stay in the bar's far corner. Its BASIS is 0, which is
1672
+ * what lets a wrapping bar break by what it holds rather than at a width, and
1673
+ * `flex-shrink: 100` puts it ahead of anything else on the bar that can give.
1674
+ *
1675
+ * ITS FLOOR IS THE WAY BACK OUT, measured by the component
1676
+ * (`--crewlet-breadcrumb-floor`): the ancestors at their width and the last
1677
+ * crumb's stub, at least 20ch, and never more than the whole bar. A fixed 20ch
1678
+ * alone let a seat's trail share a phone's line with its one button and cut
1679
+ * "Engineering · Co" mid-letter under it; measured, a trail that cannot show
1680
+ * its ancestry beside the controls makes the bar break a line instead.
1681
+ *
1682
+ * Past the whole bar the trail SCROLLS rather than clipping as a box: the
1683
+ * ancestors never shrink, so once they alone are wider than the bar there is
1684
+ * nothing left to ellipsise, and a clip lands wherever the pixels ran out.
1685
+ */
1686
+ .crewlet-breadcrumb {
1687
+ display: flex;
1688
+ align-items: center;
1689
+ gap: 2px;
1690
+ flex: 1 100 0;
1691
+ min-width: min(100%, max(20ch, var(--crewlet-breadcrumb-floor, 0px)));
1692
+ overflow-x: auto;
1693
+ overflow-y: hidden;
1694
+ overscroll-behavior-x: contain;
1695
+ scrollbar-width: none;
1696
+ font-size: var(--font-size-sm);
1697
+ }
1698
+
1699
+ .crewlet-breadcrumb::-webkit-scrollbar {
1700
+ display: none;
1701
+ }
1702
+
1703
+ /* A trail that overflows is a tab stop (see Breadcrumb.tsx), and shows it. */
1704
+ .crewlet-breadcrumb:focus-visible {
1705
+ outline: 2px solid var(--color-focus);
1706
+ outline-offset: var(--size-focus-ring-inset-offset);
1707
+ }
1708
+
1709
+ .crewlet-breadcrumb__part {
1710
+ display: inline-flex;
1711
+ align-items: center;
1712
+ gap: 2px;
1713
+ min-width: 0;
1714
+ }
1715
+
1716
+ /*
1717
+ * THE OBJECT'S OWN NAME TAKES THE CUT, never the way back out. The reader
1718
+ * knows which object they are on, because the page below says so; what they
1719
+ * cannot reconstruct is the links out of it. So the ancestors keep their width
1720
+ * and the last part is the one that ellipsises.
1721
+ */
1722
+ .crewlet-breadcrumb__part:not(:last-child) {
1723
+ flex: 0 0 auto;
1724
+ }
1725
+
1726
+ svg.crewlet-breadcrumb__separator {
1727
+ flex: none;
1728
+ margin: 0 var(--spacing-1);
1729
+ color: var(--color-text-muted);
1730
+ }
1731
+
1732
+ .crewlet-breadcrumb__crumb,
1733
+ .crewlet-breadcrumb__here {
1734
+ display: inline-flex;
1735
+ align-items: center;
1736
+ gap: calc(var(--spacing-1) * 1.5);
1737
+ min-width: 0;
1738
+ white-space: nowrap;
1739
+ overflow: hidden;
1740
+ text-overflow: ellipsis;
1741
+ }
1742
+
1743
+ /*
1744
+ * The ancestors in the quiet ink: a link lifts to the primary ink under the
1745
+ * pointer, and one with nothing to press stays where it is. NO UNDERLINE: a
1746
+ * crumb is a piece of chrome, not a word in a sentence, and the step between
1747
+ * two measured text rungs is its hover in both themes.
1748
+ */
1749
+ .crewlet-breadcrumb__crumb {
1750
+ border-radius: var(--radius-xs);
1751
+ color: var(--color-text-tertiary);
1752
+ text-decoration: none;
1753
+ transition: color var(--motion-duration-fast) var(--motion-easing-default);
1754
+ }
1755
+
1756
+ a.crewlet-breadcrumb__crumb:hover {
1757
+ color: var(--color-text-primary);
1758
+ text-decoration: none;
1759
+ }
1760
+
1761
+ a.crewlet-breadcrumb__crumb:focus-visible {
1762
+ outline: 2px solid var(--color-focus);
1763
+ outline-offset: var(--size-focus-ring-inset-offset);
1764
+ }
1765
+
1766
+ /* FORCED COLOURS paints a link LinkText hovered or not, so the ink step cannot
1767
+ be seen there: the rule under the words is the hover in that mode. */
1768
+ @media (forced-colors: active) {
1769
+ a.crewlet-breadcrumb__crumb:hover {
1770
+ text-decoration: underline;
1771
+ }
1772
+ }
1773
+
1774
+ /* A glyph sits a step further from its word than a chip does from its name. */
1775
+ .crewlet-breadcrumb__icon {
1776
+ display: inline-flex;
1777
+ flex: none;
1778
+ margin-right: calc(var(--spacing-1) / 2);
1779
+ }
1780
+
1781
+ .crewlet-breadcrumb__badge,
1782
+ .crewlet-breadcrumb__key {
1783
+ flex: none;
1784
+ }
1785
+
1786
+ /*
1787
+ * THE LABEL IS THE BOX THAT ELLIPSISES. The crumb around it is a flex
1788
+ * container, and `text-overflow` never reaches the anonymous item text inside
1789
+ * one makes; a span is a real flex item, and its `min-width: 0` is what lets
1790
+ * it shrink below its text at all.
1791
+ */
1792
+ .crewlet-breadcrumb__text {
1793
+ min-width: 0;
1794
+ overflow: hidden;
1795
+ white-space: nowrap;
1796
+ text-overflow: ellipsis;
1797
+ }
1798
+
1799
+ /* THE LAST CRUMB IS THE PAGE'S `h1`, so the heading's own margins and size are
1800
+ the bar's, not the document's. */
1801
+ .crewlet-breadcrumb__here {
1802
+ margin: 0;
1803
+ color: var(--color-text-primary);
1804
+ font-size: inherit;
1805
+ font-weight: var(--font-weight-medium);
1806
+ line-height: inherit;
1807
+ }
1808
+
1809
+ /*
1810
+ * AND IT NEVER COLLAPSES TO NOTHING: a floor of a few characters keeps an
1811
+ * ellipsised stub, which is what tells a reader the trail has a last part at
1812
+ * all. The floor is the last part's alone; an ancestor never shrinks.
1813
+ */
1814
+ .crewlet-breadcrumb__part:last-child > .crewlet-breadcrumb__here {
1815
+ min-width: 5ch;
1816
+ }
1817
+
1818
+ /*
1819
+ * A CONTROL AS THE HEADING'S WORDS draws its own edges: its hover fill and its
1820
+ * focus ring run to its own box, so the heading around it clips nothing.
1821
+ */
1822
+ .crewlet-breadcrumb__here--control {
1823
+ overflow: visible;
1824
+ }
1825
+
1826
+ /* An identifier still waiting for its name, in the mono face a step down. */
1827
+ .crewlet-breadcrumb__crumb.is-mono,
1828
+ .crewlet-breadcrumb__here.is-mono {
1829
+ font-family: var(--font-family-mono);
1830
+ font-size: var(--font-size-compact);
1831
+ }
1832
+
1833
+ /*
1834
+ * ON A PHONE AN ANCESTOR WITH A GLYPH IS ITS GLYPH. The workspace's mark is
1835
+ * the one sign of where the reader is that survives a sidebar folded into a
1836
+ * drawer, and the line it shares with the drawer toggle and the page's primary
1837
+ * action has no room for its word as well. The word stays, out of sight, so
1838
+ * the crumb is still named.
1839
+ */
1840
+ @media (width < 640px) {
1841
+ .crewlet-breadcrumb__part:not(:last-child) > .crewlet-breadcrumb__crumb:has(> .crewlet-breadcrumb__icon) > .crewlet-breadcrumb__text {
1842
+ position: absolute;
1843
+ width: 1px;
1844
+ height: 1px;
1845
+ margin: -1px;
1846
+ padding: 0;
1847
+ border: 0;
1848
+ overflow: hidden;
1849
+ clip-path: inset(50%);
1850
+ white-space: nowrap;
1851
+ }
1852
+ }
1853
+
1854
+ @media (prefers-reduced-motion: reduce) {
1855
+ .crewlet-breadcrumb__crumb {
1856
+ transition: none;
1857
+ }
1858
+ }
1859
+
1860
+
1665
1861
  /* Button-UWKBTKYD.css */
1666
1862
  /*
1667
1863
  * The button, and the link drawn as one.
@@ -4053,6 +4249,136 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4053
4249
  }
4054
4250
 
4055
4251
 
4252
+ /* ChoiceButtons-DJ5EOGUA.css */
4253
+ /*
4254
+ * One answer, sent with one press: a column of buttons as tall as a touch
4255
+ * target, the recommended one first and filled with the accent.
4256
+ *
4257
+ * The plain option is the secondary button's recipe (the card's own ground
4258
+ * inside the strong hairline), and the recommended one the primary's, so the
4259
+ * pair reads as the screen's one primary action and its alternatives.
4260
+ */
4261
+
4262
+ .crewlet-choice-buttons {
4263
+ display: grid;
4264
+ grid-template-columns: minmax(0, 1fr);
4265
+ gap: var(--spacing-2);
4266
+ }
4267
+
4268
+ .crewlet-choice-buttons__option {
4269
+ display: flex;
4270
+ align-items: center;
4271
+ justify-content: space-between;
4272
+ gap: var(--spacing-3);
4273
+ min-width: 0;
4274
+ min-height: var(--size-control-lg);
4275
+ padding: calc(var(--spacing-2) + var(--spacing-1) / 2) calc(var(--spacing-3) + var(--spacing-1) / 2);
4276
+ border: 1px solid var(--color-border-strong);
4277
+ border-radius: var(--radius-md);
4278
+ background: var(--color-surface-subtle);
4279
+ color: var(--color-text-primary);
4280
+ font: inherit;
4281
+ font-size: var(--font-size-sm);
4282
+ font-weight: var(--font-weight-medium);
4283
+ line-height: var(--font-line-height-snug);
4284
+ text-align: left;
4285
+ cursor: pointer;
4286
+ transition:
4287
+ background var(--motion-duration-fast) var(--motion-easing-default),
4288
+ border-color var(--motion-duration-fast) var(--motion-easing-default);
4289
+ }
4290
+
4291
+ .crewlet-choice-buttons__option:hover:not([aria-disabled='true']) {
4292
+ background: var(--color-surface-elevated);
4293
+ border-color: var(--color-border-strong-hover);
4294
+ }
4295
+
4296
+ .crewlet-choice-buttons__option:active:not([aria-disabled='true']) {
4297
+ background: var(--color-surface-pressed);
4298
+ }
4299
+
4300
+ /*
4301
+ * The plain option draws the strong hairline, so its ring is drawn over that
4302
+ * edge rather than a gap away from it, which would read as a second outline.
4303
+ */
4304
+ .crewlet-choice-buttons__option:focus-visible {
4305
+ outline: 2px solid var(--color-focus);
4306
+ outline-offset: var(--size-focus-ring-inset-offset);
4307
+ }
4308
+
4309
+ .crewlet-choice-buttons__option[aria-disabled='true'] {
4310
+ cursor: not-allowed;
4311
+ }
4312
+
4313
+ /* The option on its way: still this option, mid-action. */
4314
+ .crewlet-choice-buttons__option[aria-busy='true'] {
4315
+ cursor: progress;
4316
+ }
4317
+
4318
+ .crewlet-choice-buttons__option--recommended {
4319
+ background: var(--color-brand-accent);
4320
+ border-color: transparent;
4321
+ color: var(--color-text-on-accent);
4322
+ }
4323
+
4324
+ .crewlet-choice-buttons__option--recommended:hover:not([aria-disabled='true']) {
4325
+ background: var(--color-brand-accent-hover);
4326
+ border-color: transparent;
4327
+ }
4328
+
4329
+ .crewlet-choice-buttons__option--recommended:active:not([aria-disabled='true']) {
4330
+ background: var(--color-brand-accent-active);
4331
+ }
4332
+
4333
+ /*
4334
+ * The accent fill draws no edge, and an inset ring on it would be drawn in
4335
+ * nearly the fill's own colour, so its ring stands off it as a primary
4336
+ * button's does.
4337
+ */
4338
+ .crewlet-choice-buttons__option--recommended:focus-visible {
4339
+ outline-offset: 2px;
4340
+ }
4341
+
4342
+ .crewlet-choice-buttons__text {
4343
+ display: grid;
4344
+ gap: 2px;
4345
+ min-width: 0;
4346
+ overflow-wrap: anywhere;
4347
+ }
4348
+
4349
+ .crewlet-choice-buttons__detail {
4350
+ font-size: var(--font-size-xs);
4351
+ font-weight: var(--font-weight-regular);
4352
+ color: var(--color-text-tertiary);
4353
+ }
4354
+
4355
+ /*
4356
+ * On the accent fill the detail takes the label's own ink. The tertiary step
4357
+ * is measured on the surfaces, not on the accent, where it does not clear.
4358
+ */
4359
+ .crewlet-choice-buttons__option--recommended .crewlet-choice-buttons__detail {
4360
+ color: var(--color-text-on-accent);
4361
+ }
4362
+
4363
+ /*
4364
+ * The mark, in the micro-label register. Full ink rather than a faded one:
4365
+ * eleven pixels of white on the accent clears 4.5:1 only at full strength.
4366
+ */
4367
+ .crewlet-choice-buttons__note {
4368
+ flex: none;
4369
+ font-size: var(--font-size-2xs);
4370
+ font-weight: var(--font-weight-medium);
4371
+ letter-spacing: var(--font-letter-spacing-wide);
4372
+ text-transform: uppercase;
4373
+ }
4374
+
4375
+ @media (prefers-reduced-motion: reduce) {
4376
+ .crewlet-choice-buttons__option {
4377
+ transition: none;
4378
+ }
4379
+ }
4380
+
4381
+
4056
4382
  /* ChoiceList-2PQJS4DX.css */
4057
4383
  /*
4058
4384
  * A short list of answers in one bordered box: a radio, the label with a line
@@ -4439,7 +4765,7 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4439
4765
  }
4440
4766
 
4441
4767
 
4442
- /* CommandPalette-C5AMKGN2.css */
4768
+ /* CommandPalette-HBTNKHZQ.css */
4443
4769
  /*
4444
4770
  * The command palette: a field, an optional row of scopes, one scroller
4445
4771
  * holding the lead and the list, and a key legend.
@@ -4498,17 +4824,70 @@ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
4498
4824
  * glyph stood 24px in and the keycap 28px from the edge; at 12px they stand
4499
4825
  * 20px and 16px in, where the approved palette draws them, and the query still
4500
4826
  * starts on the line the design's does.
4827
+ *
4828
+ * The band is the BAR around the field, so a step's chip shares it: the field
4829
+ * itself draws no box and fills what the chip leaves.
4501
4830
  */
4502
- .crewlet-input.crewlet-palette__field {
4831
+ .crewlet-palette__bar {
4832
+ display: flex;
4833
+ align-items: center;
4834
+ gap: var(--spacing-2);
4503
4835
  flex-shrink: 0;
4504
4836
  min-height: var(--size-row-lg);
4505
4837
  padding-inline: var(--spacing-3);
4506
- border: none;
4507
4838
  border-bottom: 1px solid var(--color-border-default);
4839
+ }
4840
+
4841
+ .crewlet-input.crewlet-palette__field {
4842
+ flex: 1;
4843
+ min-width: 0;
4844
+ align-self: stretch;
4845
+ padding-inline: 0;
4846
+ border: none;
4508
4847
  border-radius: 0;
4509
4848
  background: transparent;
4510
4849
  }
4511
4850
 
4851
+ /*
4852
+ * THE STEP'S CHIP: where the reader is, and the way back. It wears the
4853
+ * accent's soft tint and ink, the kit's mark for "this is on", because a step
4854
+ * is a narrowing the reader chose, as a filter that is on is; it is a control,
4855
+ * so it takes the pointer and draws its own ring.
4856
+ */
4857
+ .crewlet-palette__step {
4858
+ display: inline-flex;
4859
+ align-items: center;
4860
+ gap: var(--spacing-1);
4861
+ flex: none;
4862
+ min-height: var(--size-target-min);
4863
+ padding: 0 var(--spacing-2) 0 var(--spacing-1);
4864
+ border: none;
4865
+ border-radius: var(--radius-sm);
4866
+ background: var(--color-brand-accent-soft);
4867
+ color: var(--color-brand-accent-ink);
4868
+ font: inherit;
4869
+ font-size: var(--font-size-xs);
4870
+ font-weight: var(--font-weight-medium);
4871
+ white-space: nowrap;
4872
+ cursor: pointer;
4873
+ }
4874
+
4875
+ /* Under the pointer it draws the line the soft tint is paired with, rather
4876
+ than a stronger fill its ink was never measured on. */
4877
+ .crewlet-palette__step:hover {
4878
+ box-shadow: inset 0 0 0 1px var(--color-brand-accent-soft-strong);
4879
+ }
4880
+
4881
+ .crewlet-palette__step:focus-visible {
4882
+ outline: 2px solid var(--color-focus);
4883
+ outline-offset: 1px;
4884
+ }
4885
+
4886
+ /* In a step the query starts a gap after the chip, not a text inset after it. */
4887
+ .crewlet-palette__bar.is-step .crewlet-input__control {
4888
+ padding-left: 0;
4889
+ }
4890
+
4512
4891
  .crewlet-input.crewlet-palette__field .crewlet-input__control {
4513
4892
  font-size: var(--font-size-md);
4514
4893
  }
@@ -8023,14 +8402,305 @@ svg.crewlet-datetime__chevron {
8023
8402
  }
8024
8403
 
8025
8404
 
8026
- /* EmptyState-C6HRBGT7.css */
8405
+ /* Document-PQGXJHB7.css */
8027
8406
  /*
8028
- * The empty state.
8407
+ * Rendered markdown, set as a document (Document.tsx).
8029
8408
  *
8030
- * ITS MARK IS DECORATION and takes the decoration ink, which is the one place
8031
- * that step is allowed: a 32px glyph a reader does not have to make out. Every
8032
- * word in the box is on a step that clears 4.5:1, because the sentence is the
8033
- * whole point of the component.
8409
+ * Every size here is a step on the type ramp and every gap a spacing step,
8410
+ * because a reading column set in sizes of its own (32, 20, 18, 15 and 14.5px
8411
+ * were measured on one) is a column that drifts from every other surface.
8412
+ */
8413
+
8414
+ .crewlet-document {
8415
+ /* The two rhythms a size sets: between blocks, and above a section. */
8416
+ --crewlet-document-gap: var(--spacing-4);
8417
+ --crewlet-document-section-gap: var(--spacing-6);
8418
+ margin: 0;
8419
+ min-width: 0;
8420
+ font-family: var(--font-family-sans);
8421
+ font-size: var(--font-size-sm);
8422
+ line-height: var(--font-line-height-relaxed);
8423
+ color: var(--color-text-secondary);
8424
+ /* The renderer decides what a break is, so the whitespace rule is normal. */
8425
+ white-space: normal;
8426
+ overflow-wrap: break-word;
8427
+ }
8428
+
8429
+ .crewlet-document--sm {
8430
+ --crewlet-document-gap: var(--spacing-3);
8431
+ --crewlet-document-section-gap: var(--spacing-5);
8432
+ font-size: var(--font-size-compact);
8433
+ line-height: var(--font-line-height-normal);
8434
+ }
8435
+
8436
+ .crewlet-document--measure {
8437
+ max-width: var(--size-measure);
8438
+ }
8439
+
8440
+ /*
8441
+ * EVERY BLOCK'S OWN MARGIN IS ZEROED FIRST, and the rhythm is one rule over
8442
+ * siblings. The other way round, a margin reset per element after the sibling
8443
+ * rule, is how a rhythm dies: the shorthand resets the top margin too, at the
8444
+ * same specificity and later in the file, and every block runs into the next.
8445
+ */
8446
+ .crewlet-document :where(p, h1, h2, h3, h4, h5, h6, ul, ol, pre, blockquote, table, figure) {
8447
+ margin: 0;
8448
+ }
8449
+
8450
+ .crewlet-document > * + * {
8451
+ margin-block-start: var(--crewlet-document-gap);
8452
+ }
8453
+
8454
+ .crewlet-document :where(h1, h2, h3, h4, h5, h6) {
8455
+ font-weight: var(--font-weight-semibold);
8456
+ line-height: var(--font-line-height-tight);
8457
+ letter-spacing: var(--font-letter-spacing-snug);
8458
+ color: var(--color-text-primary);
8459
+ /* An outline that scrolls a heading into view leaves it a little air. */
8460
+ scroll-margin-block-start: var(--spacing-6);
8461
+ }
8462
+
8463
+ /* A heading opens a section, so it gets more air above it than a paragraph. */
8464
+ .crewlet-document > * + :where(h1, h2, h3, h4, h5, h6) {
8465
+ margin-block-start: var(--crewlet-document-section-gap);
8466
+ }
8467
+
8468
+ .crewlet-document h1 {
8469
+ font-size: var(--font-size-2xl);
8470
+ }
8471
+
8472
+ .crewlet-document h2 {
8473
+ font-size: var(--font-size-xl);
8474
+ }
8475
+
8476
+ .crewlet-document h3 {
8477
+ font-size: var(--font-size-lg);
8478
+ }
8479
+
8480
+ .crewlet-document :where(h4, h5, h6) {
8481
+ font-size: var(--font-size-md);
8482
+ }
8483
+
8484
+ .crewlet-document--sm h1 {
8485
+ font-size: var(--font-size-lg);
8486
+ }
8487
+
8488
+ .crewlet-document--sm h2 {
8489
+ font-size: var(--font-size-md);
8490
+ }
8491
+
8492
+ .crewlet-document--sm h3 {
8493
+ font-size: var(--font-size-sm);
8494
+ }
8495
+
8496
+ .crewlet-document--sm :where(h4, h5, h6) {
8497
+ font-size: var(--font-size-compact);
8498
+ color: var(--color-text-secondary);
8499
+ }
8500
+
8501
+ /*
8502
+ * A HEADING AN OUTLINE MOVED TO takes focus, so a keyboard carries on from it.
8503
+ * A press draws no ring (`:focus-visible` does not match one); a keyboard's is
8504
+ * drawn off the text, because the heading is not a control.
8505
+ */
8506
+ .crewlet-document :where(h1, h2, h3, h4, h5, h6):focus-visible {
8507
+ outline: 2px solid var(--color-focus);
8508
+ outline-offset: var(--spacing-1);
8509
+ border-radius: var(--radius-xs);
8510
+ }
8511
+
8512
+ .crewlet-document :where(strong, b) {
8513
+ font-weight: var(--font-weight-semibold);
8514
+ color: var(--color-text-primary);
8515
+ }
8516
+
8517
+ .crewlet-document :where(ul, ol) {
8518
+ padding-inline-start: var(--spacing-5);
8519
+ }
8520
+
8521
+ .crewlet-document li + li,
8522
+ .crewlet-document li > :where(ul, ol) {
8523
+ margin-block-start: var(--spacing-1);
8524
+ }
8525
+
8526
+ .crewlet-document li::marker {
8527
+ color: var(--color-text-tertiary);
8528
+ }
8529
+
8530
+ /*
8531
+ * A TASK LIST keeps its box on the line rather than in the marker's place: the
8532
+ * marker is what says "list", and the box is what says "done". The item's
8533
+ * content is ONE column beside the box, never a second cell of the row, so a
8534
+ * sublist hangs under the line it belongs to.
8535
+ */
8536
+ .crewlet-document ul:has(> li > input[type='checkbox']) {
8537
+ list-style: none;
8538
+ padding-inline-start: 0;
8539
+ }
8540
+
8541
+ .crewlet-document li:has(> input[type='checkbox']) {
8542
+ display: flex;
8543
+ align-items: flex-start;
8544
+ gap: var(--spacing-2);
8545
+ }
8546
+
8547
+ .crewlet-document li:has(> input[type='checkbox']) > :not(input) {
8548
+ flex: 1;
8549
+ min-width: 0;
8550
+ }
8551
+
8552
+ .crewlet-document li > input[type='checkbox'] {
8553
+ flex: none;
8554
+ margin: 0;
8555
+ /* On the first line's centre rather than on the top of its box. */
8556
+ margin-block-start: 0.35em;
8557
+ accent-color: var(--color-brand-accent);
8558
+ }
8559
+
8560
+ /*
8561
+ * A FENCED BLOCK WRAPS RATHER THAN SCROLLING. One long line of JSON in a body
8562
+ * otherwise pushes the whole page sideways, and a block that scrolled instead
8563
+ * would owe a tab stop, since a scroller no keyboard reaches is content no
8564
+ * keyboard reads. `anywhere` because these lines have no spaces to break at.
8565
+ */
8566
+ .crewlet-document pre {
8567
+ padding: var(--spacing-2) var(--spacing-3);
8568
+ border-radius: var(--radius-sm);
8569
+ background: var(--color-surface-inset);
8570
+ font-family: var(--font-family-mono);
8571
+ font-size: var(--font-size-xs);
8572
+ line-height: var(--font-line-height-normal);
8573
+ color: var(--color-text-primary);
8574
+ white-space: pre-wrap;
8575
+ overflow-wrap: anywhere;
8576
+ }
8577
+
8578
+ .crewlet-document pre code {
8579
+ padding: 0;
8580
+ background: none;
8581
+ font: inherit;
8582
+ }
8583
+
8584
+ .crewlet-document :not(pre) > code {
8585
+ padding: 0 var(--spacing-1);
8586
+ border-radius: var(--radius-xs);
8587
+ background: var(--color-surface-inset);
8588
+ font-family: var(--font-family-mono);
8589
+ font-size: var(--font-size-xs);
8590
+ color: var(--color-text-primary);
8591
+ overflow-wrap: anywhere;
8592
+ }
8593
+
8594
+ .crewlet-document blockquote {
8595
+ padding-inline-start: var(--spacing-3);
8596
+ border-inline-start: 2px solid var(--color-border-strong);
8597
+ color: var(--color-text-secondary);
8598
+ }
8599
+
8600
+ .crewlet-document hr {
8601
+ margin-block: var(--crewlet-document-section-gap);
8602
+ border: 0;
8603
+ border-block-start: 1px solid var(--color-border-default);
8604
+ }
8605
+
8606
+ /*
8607
+ * A link in running prose keeps a permanent underline, through hover too:
8608
+ * colour alone is not what says "link" (WCAG 1.4.1). The pointer is answered
8609
+ * by the ink moving to the primary step.
8610
+ */
8611
+ .crewlet-document a,
8612
+ .crewlet-document a:hover {
8613
+ text-decoration: underline;
8614
+ text-underline-offset: 2px;
8615
+ }
8616
+
8617
+ .crewlet-document a {
8618
+ color: var(--color-brand-accent-ink);
8619
+ }
8620
+
8621
+ .crewlet-document a:hover {
8622
+ color: var(--color-text-primary);
8623
+ }
8624
+
8625
+ .crewlet-document a:focus-visible {
8626
+ outline: 2px solid var(--color-focus);
8627
+ outline-offset: 2px;
8628
+ border-radius: var(--radius-xs);
8629
+ }
8630
+
8631
+ .crewlet-document img {
8632
+ max-width: 100%;
8633
+ height: auto;
8634
+ border-radius: var(--radius-sm);
8635
+ }
8636
+
8637
+ /*
8638
+ * A TABLE WRITTEN FOR A DOCUMENT can be wider than the column it lands in, so
8639
+ * the element a renderer wraps it in scrolls rather than the page. The table
8640
+ * itself keeps its display, because a table set `display: block` loses its
8641
+ * table semantics to more than one screen reader.
8642
+ */
8643
+ .crewlet-document :where(div):has(> table) {
8644
+ overflow-x: auto;
8645
+ }
8646
+
8647
+ /* The scroller is a tab stop (see Document.tsx), so it draws the ring inside
8648
+ its own box, where the table's edge would otherwise clip an outset one. */
8649
+ .crewlet-document :where(div):has(> table):focus-visible {
8650
+ outline: 2px solid var(--color-focus);
8651
+ outline-offset: var(--size-focus-ring-inset-offset);
8652
+ border-radius: var(--radius-xs);
8653
+ }
8654
+
8655
+ .crewlet-document table {
8656
+ width: 100%;
8657
+ border-collapse: collapse;
8658
+ font-size: var(--font-size-compact);
8659
+ line-height: var(--font-line-height-snug);
8660
+ }
8661
+
8662
+ .crewlet-document--sm table {
8663
+ font-size: var(--font-size-xs);
8664
+ }
8665
+
8666
+ .crewlet-document :where(th, td) {
8667
+ padding: var(--spacing-1) var(--spacing-2);
8668
+ border-block-end: 1px solid var(--color-border-default);
8669
+ text-align: start;
8670
+ vertical-align: top;
8671
+ }
8672
+
8673
+ .crewlet-document th {
8674
+ font-weight: var(--font-weight-semibold);
8675
+ color: var(--color-text-primary);
8676
+ white-space: nowrap;
8677
+ }
8678
+
8679
+ /*
8680
+ * The title above a body. The largest step a reading screen spends, at the
8681
+ * tight tracking every title on the ramp takes, and it wraps anywhere because
8682
+ * a title is an address somebody typed and may hold no space at all.
8683
+ */
8684
+ .crewlet-document-title {
8685
+ margin: 0;
8686
+ font-family: var(--font-family-sans);
8687
+ font-size: var(--font-size-3xl);
8688
+ font-weight: var(--font-weight-semibold);
8689
+ line-height: var(--font-line-height-tight);
8690
+ letter-spacing: var(--font-letter-spacing-tight);
8691
+ color: var(--color-text-primary);
8692
+ overflow-wrap: anywhere;
8693
+ }
8694
+
8695
+
8696
+ /* EmptyState-C6HRBGT7.css */
8697
+ /*
8698
+ * The empty state.
8699
+ *
8700
+ * ITS MARK IS DECORATION and takes the decoration ink, which is the one place
8701
+ * that step is allowed: a 32px glyph a reader does not have to make out. Every
8702
+ * word in the box is on a step that clears 4.5:1, because the sentence is the
8703
+ * whole point of the component.
8034
8704
  */
8035
8705
 
8036
8706
  .crewlet-empty-state {
@@ -8465,6 +9135,38 @@ svg.crewlet-datetime__chevron {
8465
9135
  }
8466
9136
 
8467
9137
 
9138
+ /* Highlight-DXLV2R6L.css */
9139
+ /*
9140
+ * Words a search matched (Highlight.tsx).
9141
+ */
9142
+
9143
+ /*
9144
+ * A GROUND, NEVER AN INK. The marked word keeps the ink of the text around it,
9145
+ * so it reads at the contrast that text was measured at, and the accent's soft
9146
+ * step behind it says "this is what you searched for" without making the word
9147
+ * louder than its sentence. The accent is the one colour that means "where the
9148
+ * reader is", and a match is exactly that: the reader's own question, found.
9149
+ */
9150
+ .crewlet-highlight__match {
9151
+ border-radius: var(--radius-xs);
9152
+ background: var(--color-brand-accent-soft-strong);
9153
+ color: inherit;
9154
+ }
9155
+
9156
+ /*
9157
+ * Forced colours replaces every author ground with the canvas, which would
9158
+ * leave a match drawn exactly like the words beside it. The system's own pair
9159
+ * for a mark is what that mode reserves for this job.
9160
+ */
9161
+ @media (forced-colors: active) {
9162
+ .crewlet-highlight__match {
9163
+ forced-color-adjust: none;
9164
+ background: Mark;
9165
+ color: MarkText;
9166
+ }
9167
+ }
9168
+
9169
+
8468
9170
  /* HuePicker-5QIUR6L7.css */
8469
9171
  /*
8470
9172
  * A hue's swatch: the hue itself, as a dot beside its name. The name carries
@@ -8662,14 +9364,17 @@ svg.crewlet-datetime__chevron {
8662
9364
  }
8663
9365
 
8664
9366
 
8665
- /* ImageUpload-L2GE4JUM.css */
9367
+ /* ImageUpload-NVGMN7DP.css */
8666
9368
  /*
8667
9369
  * ImageUpload, the click-to-upload affordance built on Avatar.
8668
9370
  *
8669
- * WHITE ON THE SCRIM, from tokens, in both palettes. The overlay used to spell
9371
+ * WHITE ON THE SCRIM, from tokens, in every theme. The overlay used to spell
8670
9372
  * its own rgba(0, 0, 0, 0.5) and three shades of white; the scrim and the
8671
- * on-accent step are the two values the palette already measures for exactly
8672
- * this, which is a label drawn on something dark whatever is behind it.
9373
+ * on-scrim step are the two values the palette measures for exactly this,
9374
+ * which is a label drawn on something dark whatever is behind it. The
9375
+ * on-accent step is not: a theme whose accent is light labels it dark. The
9376
+ * remove button is the danger fill, and takes the on-danger step for the
9377
+ * same reason.
8673
9378
  *
8674
9379
  * NO LITERAL FALLBACKS INSIDE var(). A fallback is what renders whenever the
8675
9380
  * token name is misspelt, so it hides the very failure it looks like
@@ -8756,7 +9461,7 @@ svg.crewlet-datetime__chevron {
8756
9461
  justify-content: center;
8757
9462
  gap: 2px;
8758
9463
  background: var(--color-surface-scrim);
8759
- color: var(--color-text-on-accent);
9464
+ color: var(--color-text-on-scrim);
8760
9465
  opacity: 0;
8761
9466
  transition: opacity var(--motion-duration-base) var(--motion-easing-default);
8762
9467
  pointer-events: none;
@@ -8801,7 +9506,7 @@ svg.crewlet-datetime__chevron {
8801
9506
  height: calc(var(--crewlet-image-upload-size) * 0.3);
8802
9507
  border-radius: var(--radius-circle);
8803
9508
  border: 2px solid var(--color-surface-scrim);
8804
- border-top-color: var(--color-text-on-accent);
9509
+ border-top-color: var(--color-text-on-scrim);
8805
9510
  animation: crewlet-image-upload-spin calc(var(--motion-duration-slow) * 2.5) linear infinite;
8806
9511
  }
8807
9512
 
@@ -8831,7 +9536,7 @@ svg.crewlet-datetime__chevron {
8831
9536
  border-radius: var(--radius-circle);
8832
9537
  background: var(--color-feedback-danger);
8833
9538
  border: 2px solid var(--color-surface-background);
8834
- color: var(--color-text-on-accent);
9539
+ color: var(--color-text-on-danger);
8835
9540
  cursor: pointer;
8836
9541
  opacity: 0;
8837
9542
  transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
@@ -8876,44 +9581,299 @@ svg.crewlet-datetime__chevron {
8876
9581
  }
8877
9582
 
8878
9583
 
8879
- /* InlineCode-6WSR5COL.css */
9584
+ /* InboxList-YMFWKGGS.css */
8880
9585
  /*
8881
- * One identifier inside a sentence: a mono chip on the inset surface.
9586
+ * The inbox's column: groups of rows, each row a control with the task it is
9587
+ * about under it, and the quiet toggles at the end.
8882
9588
  *
8883
- * The size is relative (0.92em) rather than a step off the scale, because the
8884
- * chip has to sit inside whatever register its sentence is set in. A fixed
8885
- * size makes it either a shout inside a caption or a whisper inside a lead.
9589
+ * EVERY TRACK IS minmax(0, 1fr). An `auto` track grows to its widest content,
9590
+ * and a row holding a long unbroken word pushed the whole column past its
9591
+ * edge, cutting every row off at the right.
8886
9592
  */
8887
9593
 
8888
- .crewlet-inline-code {
8889
- /*
8890
- * RELATIVE, so it is deliberately not a step off the type scale: the chip
8891
- * sits inside whatever register its sentence is set in, and an absolute size
8892
- * makes it a shout inside a caption or a whisper inside a lead. The mono
8893
- * face also runs larger than the sans at the same nominal size, which is
8894
- * what the reduction corrects.
8895
- */
8896
- --crewlet-inline-code-size: 0.92em;
8897
- font-family: var(--font-family-mono);
8898
- /* An identifier is read character by character; a ligature joins two of them
8899
- into a drawing of something nobody typed. */
8900
- font-variant-ligatures: none;
8901
- font-size: var(--crewlet-inline-code-size);
8902
- background: var(--color-surface-inset);
8903
- border-radius: var(--radius-xs);
8904
- padding: 1px var(--spacing-1);
8905
- color: var(--color-text-secondary);
8906
- /* A URL IS ONE UNBREAKABLE WORD to a line breaker. Without this the chip is
8907
- pushed whole onto its own line and the sentence around it is torn up. */
8908
- overflow-wrap: anywhere;
9594
+ .crewlet-inbox-list {
9595
+ display: grid;
9596
+ grid-template-columns: minmax(0, 1fr);
9597
+ align-content: start;
9598
+ gap: 2px;
9599
+ min-width: 0;
9600
+ font-size: var(--font-size-compact);
9601
+ line-height: var(--font-line-height-body);
8909
9602
  }
8910
9603
 
8911
- /*
8912
- * A `${NAME}` pointer. It is one token a reader copies, so it keeps its braces
8913
- * together. THE SAME INK AS ANY OTHER CHIP: a pointer is the name of a sealed
8914
- * entry, and drawn a step quieter than the identifiers around it, it read as
8915
- * decoration rather than as the thing an operator has to type back.
8916
- */
9604
+ .crewlet-inbox-list__group {
9605
+ display: grid;
9606
+ grid-template-columns: minmax(0, 1fr);
9607
+ gap: 2px;
9608
+ min-width: 0;
9609
+ }
9610
+
9611
+ /* The heading's own line box is the label's, so the label sits where it is drawn. */
9612
+ .crewlet-inbox-list__label {
9613
+ margin: 0;
9614
+ padding: var(--spacing-3) var(--spacing-2) var(--spacing-1);
9615
+ font: inherit;
9616
+ font-size: var(--font-size-2xs);
9617
+ line-height: var(--font-line-height-snug);
9618
+ }
9619
+
9620
+ .crewlet-inbox-list__rows {
9621
+ display: grid;
9622
+ grid-template-columns: minmax(0, 1fr);
9623
+ gap: 2px;
9624
+ margin: 0;
9625
+ padding: 0;
9626
+ list-style: none;
9627
+ }
9628
+
9629
+ /* ---- The row ------------------------------------------------------------ */
9630
+
9631
+ /*
9632
+ * The ITEM takes the hover and the selected fill, so the control and the task
9633
+ * under it read as one row. The selected fill is the neutral pressed step, and
9634
+ * a selected row takes no hover on top of it: both are a background on the
9635
+ * same element, and a composite of the two is a colour nothing has measured.
9636
+ */
9637
+ .crewlet-inbox-row {
9638
+ min-width: 0;
9639
+ border-radius: var(--radius-md);
9640
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
9641
+ }
9642
+
9643
+ .crewlet-inbox-row:hover {
9644
+ background: var(--color-surface-hover);
9645
+ }
9646
+
9647
+ .crewlet-inbox-row--selected,
9648
+ .crewlet-inbox-row--selected:hover {
9649
+ background: var(--color-surface-pressed);
9650
+ }
9651
+
9652
+ /*
9653
+ * FORCED COLORS repaints every author background to Canvas, which takes the
9654
+ * open row's fill with it, so the row the pane is showing would look like
9655
+ * every other. An outline is the one mark the mode keeps, drawn inside the row
9656
+ * so the scroller does not clip it, in the system's colour for exactly this.
9657
+ */
9658
+ @media (forced-colors: active) {
9659
+ .crewlet-inbox-row--selected {
9660
+ outline: 2px solid Highlight;
9661
+ outline-offset: -2px;
9662
+ }
9663
+ }
9664
+
9665
+ .crewlet-inbox-row__control {
9666
+ display: flex;
9667
+ align-items: flex-start;
9668
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
9669
+ width: 100%;
9670
+ min-width: 0;
9671
+ padding: calc(var(--spacing-2) + var(--spacing-1) / 2) var(--spacing-2) var(--spacing-1);
9672
+ border: 0;
9673
+ border-radius: var(--radius-md);
9674
+ background: none;
9675
+ color: inherit;
9676
+ font: inherit;
9677
+ text-align: left;
9678
+ text-decoration: none;
9679
+ cursor: pointer;
9680
+ }
9681
+
9682
+ /* With no task under it, the control closes the row at the same padding it opened with. */
9683
+ .crewlet-inbox-row__control:only-child {
9684
+ padding-bottom: calc(var(--spacing-2) + var(--spacing-1) / 2);
9685
+ }
9686
+
9687
+ /*
9688
+ * The ring is drawn INSIDE: the list sits in a clipping scroller, where an
9689
+ * outset ring is cut off on the first and last rows and painted over by the
9690
+ * row below.
9691
+ */
9692
+ .crewlet-inbox-row__control:focus-visible {
9693
+ outline: 2px solid var(--color-focus);
9694
+ outline-offset: var(--size-focus-ring-inset-offset);
9695
+ }
9696
+
9697
+ .crewlet-inbox-row__leading {
9698
+ display: inline-flex;
9699
+ flex: none;
9700
+ justify-content: center;
9701
+ width: var(--size-target-min);
9702
+ margin-top: 1px;
9703
+ }
9704
+
9705
+ .crewlet-inbox-row__main {
9706
+ display: grid;
9707
+ flex: 1;
9708
+ gap: 2px;
9709
+ min-width: 0;
9710
+ }
9711
+
9712
+ .crewlet-inbox-row__head {
9713
+ display: flex;
9714
+ align-items: baseline;
9715
+ gap: var(--spacing-1);
9716
+ min-width: 0;
9717
+ }
9718
+
9719
+ .crewlet-inbox-row__title {
9720
+ min-width: 0;
9721
+ overflow: hidden;
9722
+ text-overflow: ellipsis;
9723
+ white-space: nowrap;
9724
+ font-weight: var(--font-weight-medium);
9725
+ color: var(--color-text-primary);
9726
+ }
9727
+
9728
+ .crewlet-inbox-row__qualifier {
9729
+ flex: none;
9730
+ font-size: var(--font-size-xs);
9731
+ color: var(--color-text-tertiary);
9732
+ }
9733
+
9734
+ .crewlet-inbox-row__qualifier--danger {
9735
+ color: var(--color-feedback-danger-ink);
9736
+ }
9737
+
9738
+ .crewlet-inbox-row__meta {
9739
+ flex: none;
9740
+ margin-inline-start: auto;
9741
+ font-size: var(--font-size-xs);
9742
+ font-variant-numeric: tabular-nums;
9743
+ white-space: nowrap;
9744
+ color: var(--color-text-tertiary);
9745
+ }
9746
+
9747
+ .crewlet-inbox-row__text {
9748
+ display: -webkit-box;
9749
+ -webkit-box-orient: vertical;
9750
+ -webkit-line-clamp: 3;
9751
+ line-clamp: 3;
9752
+ overflow: hidden;
9753
+ overflow-wrap: anywhere;
9754
+ line-height: var(--font-line-height-snug);
9755
+ color: var(--color-text-secondary);
9756
+ }
9757
+
9758
+ .crewlet-inbox-row__excerpt {
9759
+ color: var(--color-text-tertiary);
9760
+ }
9761
+
9762
+ /* Unread: a heavier name, and the words in the primary ink. */
9763
+ .crewlet-inbox-row__control--unread .crewlet-inbox-row__title {
9764
+ font-weight: var(--font-weight-semibold);
9765
+ }
9766
+
9767
+ .crewlet-inbox-row__control--unread .crewlet-inbox-row__text,
9768
+ .crewlet-inbox-row__control--actionable .crewlet-inbox-row__text {
9769
+ color: var(--color-text-primary);
9770
+ }
9771
+
9772
+ /*
9773
+ * Settled. The strike is drawn in the strong hairline rather than the text's
9774
+ * own ink, so the words under it stay legible; the state is also read out,
9775
+ * because a line through a word says nothing to somebody listening.
9776
+ */
9777
+ .crewlet-inbox-row__control--done .crewlet-inbox-row__text {
9778
+ text-decoration: line-through;
9779
+ text-decoration-color: var(--color-border-strong);
9780
+ color: var(--color-text-tertiary);
9781
+ }
9782
+
9783
+ /*
9784
+ * The task, under the words and lined up with them: the control's start pad,
9785
+ * the leading slot and the gap after it.
9786
+ */
9787
+ .crewlet-inbox-row__aside {
9788
+ min-width: 0;
9789
+ padding:
9790
+ 0 var(--spacing-2) calc(var(--spacing-2) + var(--spacing-1) / 2)
9791
+ calc(var(--spacing-2) + var(--size-target-min) + var(--spacing-2) + var(--spacing-1) / 2);
9792
+ overflow-wrap: anywhere;
9793
+ font-size: var(--font-size-xs);
9794
+ line-height: var(--font-line-height-snug);
9795
+ }
9796
+
9797
+ /* ---- The end of the list ---------------------------------------------- */
9798
+
9799
+ .crewlet-inbox-list__more {
9800
+ display: flex;
9801
+ flex-wrap: wrap;
9802
+ gap: calc(var(--spacing-4) + var(--spacing-1) / 2);
9803
+ padding: calc(var(--spacing-3) + var(--spacing-1) / 2) var(--spacing-2) 0;
9804
+ }
9805
+
9806
+ .crewlet-inbox-list__toggle {
9807
+ padding: 0;
9808
+ border: 0;
9809
+ border-radius: var(--radius-xs);
9810
+ background: none;
9811
+ font: inherit;
9812
+ font-size: var(--font-size-xs);
9813
+ color: var(--color-text-tertiary);
9814
+ cursor: pointer;
9815
+ transition: color var(--motion-duration-fast) var(--motion-easing-default);
9816
+ }
9817
+
9818
+ .crewlet-inbox-list__toggle:hover,
9819
+ .crewlet-inbox-list__toggle[aria-expanded='true'] {
9820
+ color: var(--color-text-primary);
9821
+ }
9822
+
9823
+ .crewlet-inbox-list__toggle:focus-visible {
9824
+ outline: 2px solid var(--color-focus);
9825
+ outline-offset: 2px;
9826
+ }
9827
+
9828
+ @media (prefers-reduced-motion: reduce) {
9829
+ .crewlet-inbox-row {
9830
+ transition: none;
9831
+ }
9832
+
9833
+ .crewlet-inbox-list__toggle {
9834
+ transition: none;
9835
+ }
9836
+ }
9837
+
9838
+
9839
+ /* InlineCode-6WSR5COL.css */
9840
+ /*
9841
+ * One identifier inside a sentence: a mono chip on the inset surface.
9842
+ *
9843
+ * The size is relative (0.92em) rather than a step off the scale, because the
9844
+ * chip has to sit inside whatever register its sentence is set in. A fixed
9845
+ * size makes it either a shout inside a caption or a whisper inside a lead.
9846
+ */
9847
+
9848
+ .crewlet-inline-code {
9849
+ /*
9850
+ * RELATIVE, so it is deliberately not a step off the type scale: the chip
9851
+ * sits inside whatever register its sentence is set in, and an absolute size
9852
+ * makes it a shout inside a caption or a whisper inside a lead. The mono
9853
+ * face also runs larger than the sans at the same nominal size, which is
9854
+ * what the reduction corrects.
9855
+ */
9856
+ --crewlet-inline-code-size: 0.92em;
9857
+ font-family: var(--font-family-mono);
9858
+ /* An identifier is read character by character; a ligature joins two of them
9859
+ into a drawing of something nobody typed. */
9860
+ font-variant-ligatures: none;
9861
+ font-size: var(--crewlet-inline-code-size);
9862
+ background: var(--color-surface-inset);
9863
+ border-radius: var(--radius-xs);
9864
+ padding: 1px var(--spacing-1);
9865
+ color: var(--color-text-secondary);
9866
+ /* A URL IS ONE UNBREAKABLE WORD to a line breaker. Without this the chip is
9867
+ pushed whole onto its own line and the sentence around it is torn up. */
9868
+ overflow-wrap: anywhere;
9869
+ }
9870
+
9871
+ /*
9872
+ * A `${NAME}` pointer. It is one token a reader copies, so it keeps its braces
9873
+ * together. THE SAME INK AS ANY OTHER CHIP: a pointer is the name of a sealed
9874
+ * entry, and drawn a step quieter than the identifiers around it, it read as
9875
+ * decoration rather than as the thing an operator has to type back.
9876
+ */
8917
9877
  .crewlet-inline-code--reference {
8918
9878
  overflow-wrap: normal;
8919
9879
  white-space: nowrap;
@@ -9685,6 +10645,39 @@ svg.crewlet-datetime__chevron {
9685
10645
  }
9686
10646
 
9687
10647
 
10648
+ /* KeyChip-4XJU4BBE.css */
10649
+ /*
10650
+ * A project's key as a chip: the raised rung inside the plain hairline, in the
10651
+ * mono face at the micro step and the secondary ink.
10652
+ *
10653
+ * The rail's suite measures this ink on this fill against every ground a rail
10654
+ * row can have (SidebarNav.test.tsx), because the rail is where the chip sits
10655
+ * on the most grounds: the frame, a pointed row and the current row.
10656
+ */
10657
+ .crewlet-key-chip {
10658
+ display: inline-flex;
10659
+ align-items: center;
10660
+ flex: none;
10661
+ padding: 0 calc(var(--spacing-1) + 1px);
10662
+ border: 1px solid var(--color-border-default);
10663
+ border-radius: var(--radius-xs);
10664
+ background: var(--color-surface-elevated);
10665
+ color: var(--color-text-secondary);
10666
+ font-family: var(--font-family-mono);
10667
+ font-size: var(--font-size-2xs);
10668
+ font-weight: var(--font-weight-medium);
10669
+ letter-spacing: var(--font-letter-spacing-normal);
10670
+ line-height: var(--font-line-height-body);
10671
+ white-space: nowrap;
10672
+ }
10673
+
10674
+ /* The letters a search matched: the weight carries it, in the primary ink. */
10675
+ .crewlet-key-chip__match {
10676
+ font-weight: var(--font-weight-bold);
10677
+ color: var(--color-text-primary);
10678
+ }
10679
+
10680
+
9688
10681
  /* Layer-NAFSGCFA.css */
9689
10682
  /*
9690
10683
  * The portal target a LayerHost provides.
@@ -9885,9 +10878,10 @@ svg.crewlet-datetime__chevron {
9885
10878
 
9886
10879
 
9887
10880
 
9888
- /* Link-6BEFNMN2.css */
10881
+ /* Link-WPMVLKLY.css */
9889
10882
  /*
9890
- * A link, in the two registers a console needs: a navigation and an identity.
10883
+ * A link, in the three registers a console needs: a navigation, an identity
10884
+ * and a quiet reference.
9891
10885
  *
9892
10886
  * The ink is the accent's INK step, not the accent fill. The fill is a mark
9893
10887
  * and clears 3:1; text has to clear 4.5:1, and at caption size it is exactly
@@ -9920,10 +10914,44 @@ svg.crewlet-datetime__chevron {
9920
10914
  color: var(--color-brand-accent-ink);
9921
10915
  }
9922
10916
 
10917
+ /*
10918
+ * A reference among other words. Its own ink sits between the accent ink and
10919
+ * the secondary text, so a column of rows that each name a task does not read
10920
+ * as a column of links, and the hover steps it up to the full accent ink with
10921
+ * no underline. The ink is a token rather than a mix of two, because a mix is
10922
+ * a colour nobody measured; this one clears 4.5:1 on every surface and on a
10923
+ * pressed row.
10924
+ */
10925
+ .crewlet-link--quiet {
10926
+ color: var(--color-text-link-quiet);
10927
+ }
10928
+
10929
+ .crewlet-link--quiet:hover {
10930
+ color: var(--color-brand-accent-ink);
10931
+ text-decoration: none;
10932
+ }
10933
+
10934
+ /*
10935
+ * FORCED COLORS paints every link in LinkText whatever its state, so the step
10936
+ * up to the accent ink cannot be seen there, and a hover with no underline is
10937
+ * no hover at all. The rule under the words is the one mark the mode leaves to
10938
+ * the author, so it is where the quiet variant's hover goes in that mode.
10939
+ */
10940
+ @media (forced-colors: active) {
10941
+ .crewlet-link--quiet:hover {
10942
+ text-decoration: underline;
10943
+ }
10944
+ }
10945
+
9923
10946
  .crewlet-link--body {
9924
10947
  font-size: var(--font-size-sm);
9925
10948
  }
9926
10949
 
10950
+ /* Set inside a sentence: the sentence's own size, whatever it is. */
10951
+ .crewlet-link--inherit {
10952
+ font-size: inherit;
10953
+ }
10954
+
9927
10955
  /*
9928
10956
  * A caption-sized link takes the caption's SIZE and keeps the link's ink. It
9929
10957
  * is medium weight and does not wrap, because the thing it names (an event id,
@@ -10458,13 +11486,162 @@ svg.crewlet-datetime__chevron {
10458
11486
  }
10459
11487
 
10460
11488
 
10461
- /* Menu-BT5PMFJI.css */
11489
+ /* MarkdownEditor-ZLSHTOIZ.css */
10462
11490
  /*
10463
- * The menu button's panel.
11491
+ * Writing markdown (MarkdownEditor.tsx): the bar, the source or its preview,
11492
+ * and the footer, in ONE box.
10464
11493
  *
10465
- * It shares the popover's surface deliberately: a menu and a popover are the
10466
- * same object to a reader, and two surfaces that differ by a shadow step are
10467
- * how a design system starts to look assembled rather than designed. What is
11494
+ * THE BOX TAKES THE RING, and only for the field. It is the package's one ring
11495
+ * for a field: the box's own hairline drawn in the focus colour, laid on the
11496
+ * boundary (see Input.css). It is asked of the FIELD rather than of
11497
+ * :focus-within, so a reader walking the bar's controls sees each control's
11498
+ * own ring and not a second one round the whole editor.
11499
+ */
11500
+
11501
+ .crewlet-markdown-editor {
11502
+ /* The height the field and the preview stand at, so switching between them
11503
+ does not move what is under the editor. */
11504
+ --crewlet-markdown-editor-height: calc(
11505
+ var(--crewlet-markdown-editor-rows, 14) * var(--font-size-compact) * var(--font-line-height-relaxed) +
11506
+ var(--spacing-3) * 2
11507
+ );
11508
+ display: flex;
11509
+ flex-direction: column;
11510
+ min-width: 0;
11511
+ border: 1px solid var(--color-border-control);
11512
+ border-radius: var(--radius-md);
11513
+ background: var(--color-surface-subtle);
11514
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
11515
+ }
11516
+
11517
+ .crewlet-markdown-editor:hover {
11518
+ border-color: var(--color-border-hover);
11519
+ }
11520
+
11521
+ .crewlet-markdown-editor:has(.crewlet-markdown-editor__field:focus-visible) {
11522
+ outline: 1px solid var(--color-focus);
11523
+ outline-offset: -1px;
11524
+ }
11525
+
11526
+ /* A refused body keeps its colour while the writer is in it: the ring takes
11527
+ the danger step, so "here" and "refused" stay one edge. */
11528
+ .crewlet-markdown-editor--invalid {
11529
+ border-color: var(--color-feedback-danger);
11530
+ }
11531
+
11532
+ .crewlet-markdown-editor--invalid:has(.crewlet-markdown-editor__field:focus-visible) {
11533
+ outline-color: var(--color-feedback-danger);
11534
+ }
11535
+
11536
+ .crewlet-markdown-editor--disabled {
11537
+ opacity: 0.6;
11538
+ }
11539
+
11540
+ /* The bar sits on the box's top edge, a hairline under it. Two classes, so it
11541
+ outranks the toolbar's own padding whichever stylesheet loads first. */
11542
+ .crewlet-markdown-editor .crewlet-markdown-editor__bar {
11543
+ gap: var(--spacing-1);
11544
+ padding: var(--spacing-1) var(--spacing-2);
11545
+ border-block-end: 1px solid var(--color-border-default);
11546
+ }
11547
+
11548
+ .crewlet-markdown-editor__group {
11549
+ display: inline-flex;
11550
+ align-items: center;
11551
+ gap: calc(var(--spacing-1) / 2);
11552
+ }
11553
+
11554
+ /* A hairline between groups, so nine controls read as three ideas. */
11555
+ .crewlet-markdown-editor__group + .crewlet-markdown-editor__group {
11556
+ padding-inline-start: var(--spacing-1);
11557
+ border-inline-start: 1px solid var(--color-border-default);
11558
+ }
11559
+
11560
+ .crewlet-markdown-editor__spacer {
11561
+ flex: 1;
11562
+ }
11563
+
11564
+ .crewlet-markdown-editor__panel {
11565
+ display: flex;
11566
+ flex-direction: column;
11567
+ min-width: 0;
11568
+ }
11569
+
11570
+ /*
11571
+ * THE SOURCE IS SET IN THE MONOSPACE FACE: a writer counts the hashes of a
11572
+ * heading and lines up the bars of a table, and a proportional face makes
11573
+ * both a guess.
11574
+ */
11575
+ .crewlet-markdown-editor__field {
11576
+ display: block;
11577
+ box-sizing: border-box;
11578
+ width: 100%;
11579
+ min-height: var(--crewlet-markdown-editor-height);
11580
+ margin: 0;
11581
+ padding: var(--spacing-3) var(--spacing-4);
11582
+ border: 0;
11583
+ border-radius: 0;
11584
+ background: transparent;
11585
+ font-family: var(--font-family-mono);
11586
+ font-size: var(--font-size-compact);
11587
+ line-height: var(--font-line-height-relaxed);
11588
+ color: var(--color-text-primary);
11589
+ resize: vertical;
11590
+ }
11591
+
11592
+ .crewlet-markdown-editor__field::placeholder {
11593
+ color: var(--color-text-tertiary);
11594
+ }
11595
+
11596
+ /* The ring is the box's. A transparent outline stays, because forced colours
11597
+ paints an outline where this would otherwise draw none. */
11598
+ .crewlet-markdown-editor__field:focus-visible {
11599
+ outline: 2px solid transparent;
11600
+ outline-offset: -2px;
11601
+ }
11602
+
11603
+ .crewlet-markdown-editor__field:disabled {
11604
+ cursor: not-allowed;
11605
+ }
11606
+
11607
+ .crewlet-markdown-editor__preview {
11608
+ min-height: var(--crewlet-markdown-editor-height);
11609
+ padding: var(--spacing-3) var(--spacing-4);
11610
+ min-width: 0;
11611
+ }
11612
+
11613
+ .crewlet-markdown-editor__empty {
11614
+ margin: 0;
11615
+ font-size: var(--font-size-compact);
11616
+ color: var(--color-text-tertiary);
11617
+ }
11618
+
11619
+ .crewlet-markdown-editor__footer {
11620
+ display: flex;
11621
+ flex-wrap: wrap;
11622
+ align-items: center;
11623
+ gap: var(--spacing-1) var(--spacing-3);
11624
+ padding: var(--spacing-1) var(--spacing-3);
11625
+ border-block-start: 1px solid var(--color-border-default);
11626
+ font-size: var(--font-size-xs);
11627
+ font-variant-numeric: tabular-nums;
11628
+ color: var(--color-text-tertiary);
11629
+ }
11630
+
11631
+ @media (prefers-reduced-motion: reduce) {
11632
+ .crewlet-markdown-editor {
11633
+ transition: none;
11634
+ }
11635
+ }
11636
+
11637
+
11638
+ /* Menu-BT5PMFJI.css */
11639
+ /*
11640
+ * The menu button's panel.
11641
+ *
11642
+ * It shares the popover's surface deliberately: a menu and a popover are the
11643
+ * same object to a reader, and two surfaces that differ by a shadow step are
11644
+ * how a design system starts to look assembled rather than designed. What is
10468
11645
  * its own is the row: a check column, a danger ink, and a hover that is
10469
11646
  * neutral because focus, not the pointer, is what moves through a menu.
10470
11647
  *
@@ -10827,7 +12004,7 @@ svg.crewlet-datetime__chevron {
10827
12004
  }
10828
12005
 
10829
12006
 
10830
- /* Modal-BNT3TDV2.css */
12007
+ /* Modal-3YJ2GG2T.css */
10831
12008
  /*
10832
12009
  * The modal surface: the veil, the frame, and the three bands inside it.
10833
12010
  *
@@ -10914,6 +12091,28 @@ svg.crewlet-datetime__chevron {
10914
12091
  padding-top: var(--spacing-10);
10915
12092
  }
10916
12093
 
12094
+ /*
12095
+ * THE BOTTOM SHEET: pinned to the bottom edge with no inset, so it rises from
12096
+ * where a thumb already is. Its frame takes the window's width and keeps a
12097
+ * corner on its top edge only, and its foot stays clear of a phone's home
12098
+ * indicator.
12099
+ */
12100
+ .crewlet-modal-overlay--dialog.crewlet-modal-overlay--bottom {
12101
+ align-items: flex-end;
12102
+ padding: 0;
12103
+ }
12104
+
12105
+ .crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
12106
+ width: 100%;
12107
+ max-height: calc(100dvh - var(--spacing-10));
12108
+ border-bottom: none;
12109
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
12110
+ padding-bottom: env(safe-area-inset-bottom, 0px);
12111
+ /* It rises further and sooner than a dialog drops in: a sheet arrives from
12112
+ the edge it is pinned to, and a thumb is waiting on it. */
12113
+ animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
12114
+ }
12115
+
10917
12116
  /*
10918
12117
  * The sheet's veil fades over the same span the sheet itself travels, so the
10919
12118
  * two are one movement rather than a ground that lands and a panel that
@@ -11309,6 +12508,13 @@ svg.crewlet-datetime__chevron {
11309
12508
  }
11310
12509
  }
11311
12510
 
12511
+ @keyframes crewlet-modal-lift {
12512
+ from {
12513
+ opacity: 0;
12514
+ transform: translateY(var(--spacing-6));
12515
+ }
12516
+ }
12517
+
11312
12518
  /*
11313
12519
  * A SHEET TRAVELS ITS OWN WIDTH, which is what makes the motion read as a
11314
12520
  * sheet rather than as a box appearing beside the page: the frame starts
@@ -11332,6 +12538,10 @@ svg.crewlet-datetime__chevron {
11332
12538
  .crewlet-modal--sheet {
11333
12539
  animation: none;
11334
12540
  }
12541
+
12542
+ .crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
12543
+ animation: none;
12544
+ }
11335
12545
  }
11336
12546
 
11337
12547
 
@@ -12373,6 +13583,87 @@ svg.crewlet-datetime__chevron {
12373
13583
  }
12374
13584
 
12375
13585
 
13586
+ /* Outline-VCXKKU3E.css */
13587
+ /*
13588
+ * A document's outline, "On this page" (Outline.tsx).
13589
+ *
13590
+ * QUIET UNTIL IT IS CURRENT. The entries are the tertiary ink at the caption
13591
+ * step, so the column beside a page reads as a map rather than as a second
13592
+ * page, and the entry the reader is in takes the primary ink and the accent
13593
+ * edge every current row in the system takes.
13594
+ */
13595
+
13596
+ .crewlet-outline {
13597
+ display: flex;
13598
+ flex-direction: column;
13599
+ gap: var(--spacing-2);
13600
+ min-width: 0;
13601
+ }
13602
+
13603
+ /* The outline's name in the register of a group label: sentence case at the
13604
+ caption step, the 4.5:1 ink. */
13605
+ .crewlet-outline__title {
13606
+ margin: 0;
13607
+ font-family: var(--font-family-sans);
13608
+ font-size: var(--font-size-xs);
13609
+ font-weight: var(--font-weight-medium);
13610
+ line-height: var(--font-line-height-tight);
13611
+ color: var(--color-text-tertiary);
13612
+ }
13613
+
13614
+ .crewlet-outline__list {
13615
+ display: flex;
13616
+ flex-direction: column;
13617
+ margin: 0;
13618
+ padding: 0;
13619
+ list-style: none;
13620
+ }
13621
+
13622
+ /*
13623
+ * One entry: the heading's text, wrapped rather than cut, because a heading
13624
+ * cut to fit is a section the reader cannot tell from its neighbour. The edge
13625
+ * the current entry draws is held on every entry in its resting colour, so
13626
+ * nothing moves when the current entry changes.
13627
+ */
13628
+ .crewlet-outline__item {
13629
+ display: block;
13630
+ width: 100%;
13631
+ min-height: var(--size-target-min);
13632
+ margin: 0;
13633
+ padding: calc(var(--spacing-1) / 2) var(--spacing-2);
13634
+ padding-inline-start: calc(var(--spacing-3) + var(--spacing-3) * var(--crewlet-outline-depth, 0));
13635
+ border: 0;
13636
+ border-inline-start: 2px solid var(--color-border-default);
13637
+ border-radius: 0;
13638
+ background: none;
13639
+ font-family: var(--font-family-sans);
13640
+ font-size: var(--font-size-xs);
13641
+ font-weight: var(--font-weight-regular);
13642
+ line-height: var(--font-line-height-snug);
13643
+ text-align: start;
13644
+ color: var(--color-text-tertiary);
13645
+ overflow-wrap: anywhere;
13646
+ cursor: pointer;
13647
+ }
13648
+
13649
+ .crewlet-outline__item:hover {
13650
+ color: var(--color-text-primary);
13651
+ }
13652
+
13653
+ /* The ring lies on the entry's own edge, never a second line beside it. */
13654
+ .crewlet-outline__item:focus-visible {
13655
+ outline: 2px solid var(--color-focus);
13656
+ outline-offset: var(--size-focus-ring-inset-offset);
13657
+ }
13658
+
13659
+ /* The weight stays the resting one: a bolder entry is a wider one, and a
13660
+ wider entry can wrap onto a second line as the reader scrolls past it. */
13661
+ .crewlet-outline__item--current {
13662
+ border-inline-start-color: var(--color-brand-accent);
13663
+ color: var(--color-text-primary);
13664
+ }
13665
+
13666
+
12376
13667
  /* PageHeader-6EYWQXRE.css */
12377
13668
  /*
12378
13669
  * The head of a screen.
@@ -13041,81 +14332,278 @@ svg.crewlet-datetime__chevron {
13041
14332
  }
13042
14333
 
13043
14334
 
13044
- /* RelativeTime-EBAQPGO2.css */
14335
+ /* ReadingPane-5UOLPWY5.css */
13045
14336
  /*
13046
- * A relative time is text, so it takes the register around it. Its one rule is
13047
- * tabular figures: the words change once a second, and proportional digits
13048
- * would move whatever sits beside them on every tick.
14337
+ * One item read in full, in one column.
14338
+ *
14339
+ * The pane is its own container, so the column narrows its margins when the
14340
+ * PANE is narrow (beside a list on a small laptop, or alone on a phone)
14341
+ * rather than when the window is.
13049
14342
  */
13050
14343
 
13051
- .crewlet-relative-time {
13052
- font-variant-numeric: tabular-nums;
13053
- white-space: nowrap;
14344
+ .crewlet-reading-pane {
14345
+ container: crewlet-reading-pane / inline-size;
14346
+ min-width: 0;
13054
14347
  }
13055
14348
 
14349
+ .crewlet-reading-pane__column {
14350
+ /* A question and its answers read best at about seventy characters a line. */
14351
+ --crewlet-reading-pane-measure: 640px;
13056
14352
 
13057
- /* SearchTrigger-KIZLWBEH.css */
13058
- /*
13059
- * A button drawn as the field it stands in for.
13060
- *
13061
- * TWO PLACES, TWO GROUNDS. The approved design draws it in the rail, the
13062
- * whole width of the sidebar on the frame, and in a screen's own bar on the
13063
- * sheet. In each it is one rung up from what it stands on, the sheet on the
13064
- * frame and the card on the sheet, inside the default hairline, so it reads
13065
- * as a field sunk into neither and lifted off both.
13066
- */
13067
-
13068
- .crewlet-search-trigger {
13069
- display: inline-flex;
13070
- align-items: center;
13071
- gap: var(--spacing-2);
13072
- /* The design's 10px inside each end: two steps and a half. */
13073
- padding: 0 calc(var(--spacing-2) + var(--spacing-1) / 2);
13074
- border: 1px solid var(--color-border-default);
13075
- border-radius: var(--radius-md);
13076
- color: var(--color-text-tertiary);
13077
- font-family: var(--font-family-sans);
14353
+ display: grid;
14354
+ grid-template-columns: minmax(0, 1fr);
14355
+ gap: calc(var(--spacing-4) + var(--spacing-1) / 2);
14356
+ max-width: var(--crewlet-reading-pane-measure);
14357
+ margin: 0 auto;
14358
+ padding: calc(var(--spacing-6) + var(--spacing-1)) calc(var(--spacing-6) + var(--spacing-1)) var(--spacing-8);
13078
14359
  font-size: var(--font-size-compact);
13079
- text-align: start;
13080
- cursor: pointer;
13081
- transition:
13082
- border-color var(--motion-duration-fast) var(--motion-easing-default),
13083
- color var(--motion-duration-fast) var(--motion-easing-default);
14360
+ line-height: var(--font-line-height-body);
14361
+ color: var(--color-text-primary);
13084
14362
  }
13085
14363
 
13086
- /*
13087
- * THE RAIL'S FIELD: the full width of the sidebar, on the SHEET's ground, and
13088
- * a step taller than a control. It is the rail's one field and the first
13089
- * thing in it under the company's name, and the design stands it at 34px,
13090
- * the medium control and one scale step, so it reads as the way in rather
13091
- * than as one more button.
13092
- */
13093
- .crewlet-search-trigger--rail {
13094
- display: flex;
13095
- width: 100%;
13096
- height: calc(var(--size-control-md) + var(--spacing-1));
13097
- background: var(--color-surface-background);
14364
+ @container crewlet-reading-pane (width < 640px) {
14365
+ .crewlet-reading-pane__column {
14366
+ padding-inline: var(--spacing-4);
14367
+ }
13098
14368
  }
13099
14369
 
13100
- /*
13101
- * A SCREEN'S OWN SEARCH, in a bar on the sheet: the CARD's ground, the
13102
- * control height of the buttons beside it, and a resting width of its own.
13103
- */
13104
- .crewlet-search-trigger--toolbar {
13105
- /* The resting width of the box, the design's. A bar with less room sets it. */
13106
- --crewlet-search-trigger-width: 200px;
14370
+ /* ---- The byline -------------------------------------------------------- */
13107
14371
 
13108
- min-width: var(--crewlet-search-trigger-width);
13109
- height: var(--size-control-md);
13110
- background: var(--color-surface-subtle);
14372
+ .crewlet-reading-pane__byline {
14373
+ display: flex;
14374
+ align-items: center;
14375
+ gap: var(--spacing-2);
14376
+ min-width: 0;
14377
+ margin: 0;
14378
+ color: var(--color-text-tertiary);
13111
14379
  }
13112
14380
 
13113
- .crewlet-search-trigger:hover {
13114
- border-color: var(--color-border-hover);
13115
- color: var(--color-text-primary);
14381
+ .crewlet-reading-pane__start,
14382
+ .crewlet-reading-pane__leading {
14383
+ display: inline-flex;
14384
+ flex: none;
14385
+ align-items: center;
13116
14386
  }
13117
14387
 
13118
- /* One ring, over the trigger's own boundary rather than 2px off it, which is
14388
+ .crewlet-reading-pane__by {
14389
+ min-width: 0;
14390
+ overflow-wrap: anywhere;
14391
+ color: var(--color-text-secondary);
14392
+ }
14393
+
14394
+ .crewlet-reading-pane__by strong {
14395
+ font-weight: var(--font-weight-medium);
14396
+ color: var(--color-text-primary);
14397
+ }
14398
+
14399
+ .crewlet-reading-pane__note {
14400
+ color: var(--color-text-tertiary);
14401
+ }
14402
+
14403
+ /* ---- The title and what it needs -------------------------------------- */
14404
+
14405
+ .crewlet-reading-pane__title {
14406
+ margin: 0;
14407
+ font-size: var(--font-size-2xl);
14408
+ font-weight: var(--font-weight-semibold);
14409
+ line-height: var(--font-line-height-tight);
14410
+ letter-spacing: var(--font-letter-spacing-snug);
14411
+ text-wrap: balance;
14412
+ overflow-wrap: anywhere;
14413
+ color: var(--color-text-primary);
14414
+ }
14415
+
14416
+ .crewlet-reading-pane__lead {
14417
+ display: grid;
14418
+ gap: var(--spacing-2);
14419
+ min-width: 0;
14420
+ font-size: var(--font-size-sm);
14421
+ line-height: var(--font-line-height-normal);
14422
+ overflow-wrap: anywhere;
14423
+ color: var(--color-text-secondary);
14424
+ }
14425
+
14426
+ .crewlet-reading-pane__lead > * {
14427
+ margin: 0;
14428
+ }
14429
+
14430
+ .crewlet-reading-pane__quote {
14431
+ display: grid;
14432
+ gap: var(--spacing-2);
14433
+ min-width: 0;
14434
+ margin: 0;
14435
+ font-size: var(--font-size-md);
14436
+ line-height: var(--font-line-height-normal);
14437
+ overflow-wrap: anywhere;
14438
+ color: var(--color-text-primary);
14439
+ }
14440
+
14441
+ .crewlet-reading-pane__quote > * {
14442
+ margin: 0;
14443
+ }
14444
+
14445
+ .crewlet-reading-pane__quote--verbatim {
14446
+ padding: var(--spacing-2) var(--spacing-3);
14447
+ border-left: 2px solid var(--color-border-strong);
14448
+ font-family: var(--font-family-mono);
14449
+ font-size: var(--font-size-xs);
14450
+ white-space: pre-wrap;
14451
+ }
14452
+
14453
+ /* ---- The reasoning ----------------------------------------------------- */
14454
+
14455
+ .crewlet-reading-pane__reasoning {
14456
+ display: grid;
14457
+ gap: var(--spacing-1);
14458
+ min-width: 0;
14459
+ padding: var(--spacing-3) calc(var(--spacing-3) + var(--spacing-1) / 2);
14460
+ border-radius: var(--radius-md);
14461
+ background: var(--color-surface-inset);
14462
+ }
14463
+
14464
+ .crewlet-reading-pane__reasoning-title {
14465
+ margin: 0;
14466
+ font-size: var(--font-size-xs);
14467
+ color: var(--color-text-tertiary);
14468
+ }
14469
+
14470
+ .crewlet-reading-pane__reasoning-title strong {
14471
+ font-weight: var(--font-weight-semibold);
14472
+ color: var(--color-text-primary);
14473
+ }
14474
+
14475
+ .crewlet-reading-pane__reasoning-body {
14476
+ display: grid;
14477
+ gap: var(--spacing-2);
14478
+ min-width: 0;
14479
+ overflow-wrap: anywhere;
14480
+ color: var(--color-text-secondary);
14481
+ }
14482
+
14483
+ .crewlet-reading-pane__reasoning-body > * {
14484
+ margin: 0;
14485
+ }
14486
+
14487
+ .crewlet-reading-pane__reasoning-footer {
14488
+ margin-top: calc(var(--spacing-1) / 2);
14489
+ }
14490
+
14491
+ /* ---- What the reader did ----------------------------------------------- */
14492
+
14493
+ .crewlet-reading-pane__outcome {
14494
+ display: flex;
14495
+ align-items: center;
14496
+ gap: var(--spacing-2);
14497
+ min-width: 0;
14498
+ margin: 0;
14499
+ font-size: var(--font-size-xs);
14500
+ overflow-wrap: anywhere;
14501
+ color: var(--color-feedback-success-ink);
14502
+ }
14503
+
14504
+ .crewlet-reading-pane__outcome-mark {
14505
+ flex: none;
14506
+ }
14507
+
14508
+ .crewlet-reading-pane__outcome strong {
14509
+ font-weight: var(--font-weight-medium);
14510
+ color: var(--color-text-primary);
14511
+ }
14512
+
14513
+ /* ---- A section after the answer ---------------------------------------- */
14514
+
14515
+ .crewlet-reading-pane__section {
14516
+ display: grid;
14517
+ grid-template-columns: minmax(0, 1fr);
14518
+ gap: var(--spacing-3);
14519
+ padding-top: calc(var(--spacing-4) + var(--spacing-1) / 2);
14520
+ border-top: 1px solid var(--color-border-default);
14521
+ }
14522
+
14523
+ /* The heading's own line box is the label's, so the label sits where it is drawn. */
14524
+ .crewlet-reading-pane__section-label {
14525
+ margin: 0;
14526
+ font: inherit;
14527
+ font-size: var(--font-size-2xs);
14528
+ line-height: var(--font-line-height-snug);
14529
+ }
14530
+
14531
+
14532
+ /* RelativeTime-EBAQPGO2.css */
14533
+ /*
14534
+ * A relative time is text, so it takes the register around it. Its one rule is
14535
+ * tabular figures: the words change once a second, and proportional digits
14536
+ * would move whatever sits beside them on every tick.
14537
+ */
14538
+
14539
+ .crewlet-relative-time {
14540
+ font-variant-numeric: tabular-nums;
14541
+ white-space: nowrap;
14542
+ }
14543
+
14544
+
14545
+ /* SearchTrigger-KIZLWBEH.css */
14546
+ /*
14547
+ * A button drawn as the field it stands in for.
14548
+ *
14549
+ * TWO PLACES, TWO GROUNDS. The approved design draws it in the rail, the
14550
+ * whole width of the sidebar on the frame, and in a screen's own bar on the
14551
+ * sheet. In each it is one rung up from what it stands on, the sheet on the
14552
+ * frame and the card on the sheet, inside the default hairline, so it reads
14553
+ * as a field sunk into neither and lifted off both.
14554
+ */
14555
+
14556
+ .crewlet-search-trigger {
14557
+ display: inline-flex;
14558
+ align-items: center;
14559
+ gap: var(--spacing-2);
14560
+ /* The design's 10px inside each end: two steps and a half. */
14561
+ padding: 0 calc(var(--spacing-2) + var(--spacing-1) / 2);
14562
+ border: 1px solid var(--color-border-default);
14563
+ border-radius: var(--radius-md);
14564
+ color: var(--color-text-tertiary);
14565
+ font-family: var(--font-family-sans);
14566
+ font-size: var(--font-size-compact);
14567
+ text-align: start;
14568
+ cursor: pointer;
14569
+ transition:
14570
+ border-color var(--motion-duration-fast) var(--motion-easing-default),
14571
+ color var(--motion-duration-fast) var(--motion-easing-default);
14572
+ }
14573
+
14574
+ /*
14575
+ * THE RAIL'S FIELD: the full width of the sidebar, on the SHEET's ground, and
14576
+ * a step taller than a control. It is the rail's one field and the first
14577
+ * thing in it under the company's name, and the design stands it at 34px,
14578
+ * the medium control and one scale step, so it reads as the way in rather
14579
+ * than as one more button.
14580
+ */
14581
+ .crewlet-search-trigger--rail {
14582
+ display: flex;
14583
+ width: 100%;
14584
+ height: calc(var(--size-control-md) + var(--spacing-1));
14585
+ background: var(--color-surface-background);
14586
+ }
14587
+
14588
+ /*
14589
+ * A SCREEN'S OWN SEARCH, in a bar on the sheet: the CARD's ground, the
14590
+ * control height of the buttons beside it, and a resting width of its own.
14591
+ */
14592
+ .crewlet-search-trigger--toolbar {
14593
+ /* The resting width of the box, the design's. A bar with less room sets it. */
14594
+ --crewlet-search-trigger-width: 200px;
14595
+
14596
+ min-width: var(--crewlet-search-trigger-width);
14597
+ height: var(--size-control-md);
14598
+ background: var(--color-surface-subtle);
14599
+ }
14600
+
14601
+ .crewlet-search-trigger:hover {
14602
+ border-color: var(--color-border-hover);
14603
+ color: var(--color-text-primary);
14604
+ }
14605
+
14606
+ /* One ring, over the trigger's own boundary rather than 2px off it, which is
13119
14607
  two edges with a gap between them: the rule every field keeps (see
13120
14608
  Input.css). */
13121
14609
  .crewlet-search-trigger:focus-visible {
@@ -13302,7 +14790,7 @@ svg.crewlet-datetime__chevron {
13302
14790
  }
13303
14791
 
13304
14792
 
13305
- /* SegmentedControl-76HODRBT.css */
14793
+ /* SegmentedControl-PKBLJVSA.css */
13306
14794
  /*
13307
14795
  * SegmentedControl: the pill row, drawn with the Tabs classes.
13308
14796
  *
@@ -13464,6 +14952,24 @@ svg.crewlet-datetime__chevron {
13464
14952
  color: var(--color-brand-accent-ink);
13465
14953
  }
13466
14954
 
14955
+ /*
14956
+ * EQUAL SHARES. The row fills the width it is given and every option takes
14957
+ * an equal column of it, so two settings stacked in one panel draw one box.
14958
+ * Two classes, for the reason the card row gives: the pill's own rules size
14959
+ * the row to its content.
14960
+ */
14961
+ .crewlet-tabs.crewlet-segmented--fill {
14962
+ display: grid;
14963
+ grid-auto-flow: column;
14964
+ grid-auto-columns: minmax(0, 1fr);
14965
+ width: 100%;
14966
+ }
14967
+
14968
+ .crewlet-segmented--fill .crewlet-segmented__option {
14969
+ justify-content: center;
14970
+ min-width: 0;
14971
+ }
14972
+
13467
14973
 
13468
14974
  /* SegmentedMeter-KQNML2TW.css */
13469
14975
  /*
@@ -13577,7 +15083,7 @@ svg.crewlet-datetime__chevron {
13577
15083
  }
13578
15084
 
13579
15085
 
13580
- /* Select-4ANVLHUY.css */
15086
+ /* Select-XMZ44RWY.css */
13581
15087
  /*
13582
15088
  * Select: one chrome over two controls, and the product's only dropdown.
13583
15089
  *
@@ -13877,6 +15383,30 @@ svg.crewlet-select__chevron {
13877
15383
  min-width: 0;
13878
15384
  }
13879
15385
 
15386
+ /*
15387
+ * WHAT AN OPTION DRAWS BEFORE ITS LABEL (a swatch, an avatar, a glyph),
15388
+ * centred on the label's first line rather than on the row, so a row with a
15389
+ * second line keeps its mark beside the words it belongs to. The same slot on
15390
+ * the trigger, while that option is the one chosen, sits on the value's line.
15391
+ */
15392
+ .crewlet-select__option-leading,
15393
+ .crewlet-select__leading {
15394
+ display: inline-flex;
15395
+ align-items: center;
15396
+ flex: none;
15397
+ }
15398
+
15399
+ .crewlet-select__option-leading {
15400
+ min-height: calc(var(--font-line-height-normal) * 1em);
15401
+ }
15402
+
15403
+ /* A hint ends the row's FIRST line, on the label's baseline, rather than
15404
+ sitting on the row's top edge at its own smaller size. */
15405
+ .crewlet-select__option:has(> .crewlet-listbox__hint) .crewlet-select__option-body,
15406
+ .crewlet-select__option > .crewlet-listbox__hint {
15407
+ align-self: baseline;
15408
+ }
15409
+
13880
15410
  /*
13881
15411
  * ONE LINE, WHICH IS WHAT THE ELLIPSIS BELOW WAS ALWAYS FOR. `overflow:
13882
15412
  * hidden` clips what leaves the box and `text-overflow` replaces what a LINE
@@ -13964,7 +15494,7 @@ svg.crewlet-select__chevron {
13964
15494
  }
13965
15495
 
13966
15496
 
13967
- /* SidebarNav-X5NLZNWA.css */
15497
+ /* SidebarNav-KF66MLOM.css */
13968
15498
  /*
13969
15499
  * The rail's navigation.
13970
15500
  *
@@ -14230,26 +15760,11 @@ svg.crewlet-select__chevron {
14230
15760
 
14231
15761
  /*
14232
15762
  * A PROJECT'S KEY, as a chip in the glyph's place: the prefix every item in
14233
- * the project is filed under, in mono so ENG and PROD line up by letter. It
14234
- * is the raised rung inside the plain hairline, in the secondary ink, which
14235
- * the palette suite measures on every ground a row can have; on the reader's
14236
- * own row, which is raised too, the hairline is what draws it.
15763
+ * the project is filed under, in mono so ENG and PROD line up by letter. The
15764
+ * chip is the kit's `KeyChip` (KeyChip.css); the suite below measures its ink
15765
+ * on every ground a row can have, and on the reader's own row, which is raised
15766
+ * too, its hairline is what draws it.
14237
15767
  */
14238
- .crewlet-nav-item__lead {
14239
- display: inline-flex;
14240
- align-items: center;
14241
- flex: none;
14242
- padding: 0 calc(var(--spacing-1) + 1px);
14243
- border: 1px solid var(--color-border-default);
14244
- border-radius: var(--radius-xs);
14245
- background: var(--color-surface-elevated);
14246
- color: var(--color-text-secondary);
14247
- font-family: var(--font-family-mono);
14248
- font-size: var(--font-size-2xs);
14249
- font-weight: var(--font-weight-medium);
14250
- letter-spacing: var(--font-letter-spacing-normal);
14251
- line-height: var(--font-line-height-body);
14252
- }
14253
15768
 
14254
15769
  /*
14255
15770
  * THE COUNT: how many of something the destination holds, as a quiet figure
@@ -15647,6 +17162,355 @@ svg.crewlet-select__chevron {
15647
17162
  }
15648
17163
 
15649
17164
 
17165
+ /* Switcher-B44Q4WF4.css */
17166
+ /*
17167
+ * The switcher: a button that is the page's name, and a banded panel under it
17168
+ * (a search band, a list that scrolls, and a footer that does not).
17169
+ *
17170
+ * The rows are the listbox register (`Listbox.css`), because a project in this
17171
+ * list and a result in the command palette are read the same way, and the
17172
+ * raised row that marks where the arrows are must mean the same in both. What
17173
+ * this adds is the switcher's own: a lead column every row's key lines up in,
17174
+ * the current subject outlined in the accent, and a held row that keeps its
17175
+ * reason without a hover.
17176
+ */
17177
+
17178
+ .crewlet-switcher {
17179
+ /* The panel's own measures: a width that holds a key, a long name and a
17180
+ count, and a height that holds eight projects with Recent above them
17181
+ without scrolling. */
17182
+ --crewlet-switcher-width: 360px;
17183
+ --crewlet-switcher-max-height: 520px;
17184
+ --crewlet-switcher-lead: 52px;
17185
+ }
17186
+
17187
+ /* ── The button ─────────────────────────────────────────────────────────── */
17188
+
17189
+ /*
17190
+ * THE PAGE'S NAME, WITH NO BOX AT REST. It is the heading of the page as much
17191
+ * as it is a control, so it reads as text in the trail until the pointer
17192
+ * reaches it; the fill appears under the pointer and stays while the panel is
17193
+ * open, and the chevron turns. The name takes the cut, never the key or the
17194
+ * chevron.
17195
+ */
17196
+ .crewlet-switcher-trigger {
17197
+ display: inline-flex;
17198
+ align-items: center;
17199
+ gap: calc(var(--spacing-1) * 1.5);
17200
+ min-width: 0;
17201
+ max-width: 100%;
17202
+ height: var(--size-row-sm);
17203
+ padding: 0 var(--spacing-1) 0 calc(var(--spacing-1) * 1.5);
17204
+ border: none;
17205
+ border-radius: var(--radius-md);
17206
+ background: transparent;
17207
+ color: var(--color-text-primary);
17208
+ font: inherit;
17209
+ font-weight: var(--font-weight-medium);
17210
+ cursor: pointer;
17211
+ transition: background-color var(--motion-duration-fast) var(--motion-easing-default);
17212
+ }
17213
+
17214
+ .crewlet-switcher-trigger:hover,
17215
+ .crewlet-switcher-trigger[aria-expanded='true'] {
17216
+ background: var(--color-surface-hover);
17217
+ }
17218
+
17219
+ .crewlet-switcher-trigger:active {
17220
+ background: var(--color-surface-pressed);
17221
+ }
17222
+
17223
+ /* Inside the button's own edge, so the trail's scrollport never clips it. */
17224
+ .crewlet-switcher-trigger:focus-visible {
17225
+ outline: 2px solid var(--color-focus);
17226
+ outline-offset: var(--size-focus-ring-inset-offset);
17227
+ }
17228
+
17229
+ .crewlet-switcher-trigger__label {
17230
+ min-width: 0;
17231
+ overflow: hidden;
17232
+ text-overflow: ellipsis;
17233
+ white-space: nowrap;
17234
+ }
17235
+
17236
+ .crewlet-switcher-trigger.is-mono .crewlet-switcher-trigger__label {
17237
+ font-family: var(--font-family-mono);
17238
+ font-size: var(--font-size-compact);
17239
+ }
17240
+
17241
+ .crewlet-switcher-trigger .crewlet-key-chip,
17242
+ .crewlet-switcher-trigger__tag {
17243
+ display: inline-flex;
17244
+ flex: none;
17245
+ }
17246
+
17247
+ svg.crewlet-switcher-trigger__chevron {
17248
+ flex: none;
17249
+ color: var(--color-text-tertiary);
17250
+ transition:
17251
+ transform var(--motion-duration-fast) var(--motion-easing-default),
17252
+ color var(--motion-duration-fast) var(--motion-easing-default);
17253
+ }
17254
+
17255
+ .crewlet-switcher-trigger:hover svg.crewlet-switcher-trigger__chevron {
17256
+ color: var(--color-text-secondary);
17257
+ }
17258
+
17259
+ .crewlet-switcher-trigger[aria-expanded='true'] svg.crewlet-switcher-trigger__chevron {
17260
+ color: var(--color-text-secondary);
17261
+ transform: rotate(180deg);
17262
+ }
17263
+
17264
+ /* ── The three surfaces ─────────────────────────────────────────────────── */
17265
+
17266
+ /*
17267
+ * ANCHORED: the popover's own surface (the subtle rung, the default hairline,
17268
+ * the large corner and the deepest shadow) at the switcher's size. The bands
17269
+ * lay themselves out inside it, so the panel itself does not scroll.
17270
+ */
17271
+ .crewlet-popover.crewlet-switcher {
17272
+ display: flex;
17273
+ flex-direction: column;
17274
+ width: var(--crewlet-switcher-width);
17275
+ min-width: 0;
17276
+ max-width: calc(100vw - var(--spacing-4));
17277
+ max-height: min(var(--crewlet-switcher-max-height), calc(100dvh - var(--spacing-10) - var(--spacing-4)));
17278
+ overflow: hidden;
17279
+ }
17280
+
17281
+ /*
17282
+ * CENTRED: the same panel as a dialog, a step lower than a dialog stands so
17283
+ * it clears the page's bar, arriving at the popover's pace rather than a
17284
+ * dialog's, because it is the same panel opened from somewhere else.
17285
+ */
17286
+ .crewlet-modal.crewlet-switcher--centered {
17287
+ --crewlet-modal-width: var(--crewlet-switcher-width);
17288
+
17289
+ max-height: min(var(--crewlet-switcher-max-height), calc(100dvh - var(--spacing-10) - var(--spacing-6)));
17290
+ margin-top: var(--spacing-2);
17291
+ animation-duration: var(--motion-duration-base);
17292
+ }
17293
+
17294
+ /* A SHEET carries a grab handle over its title, which says it came from the
17295
+ edge it is pinned to. Decoration: the close control is what closes it. */
17296
+ .crewlet-modal.crewlet-switcher--sheet::before {
17297
+ content: '';
17298
+ flex: none;
17299
+ width: calc(var(--spacing-7) + var(--spacing-1));
17300
+ height: var(--spacing-1);
17301
+ margin: var(--spacing-2) auto 0;
17302
+ border-radius: var(--radius-pill);
17303
+ background: var(--color-border-strong);
17304
+ }
17305
+
17306
+ .crewlet-switcher--sheet .crewlet-modal__header {
17307
+ min-height: var(--size-control-lg);
17308
+ padding: 0 var(--spacing-2) 0 var(--spacing-4);
17309
+ }
17310
+
17311
+ /* A dialog's body scrolls its whole content; here the list alone scrolls. */
17312
+ .crewlet-switcher .crewlet-modal__body {
17313
+ display: flex;
17314
+ flex-direction: column;
17315
+ overflow: hidden;
17316
+ }
17317
+
17318
+ .crewlet-switcher__panel {
17319
+ display: flex;
17320
+ flex: 1 1 auto;
17321
+ flex-direction: column;
17322
+ min-height: 0;
17323
+ }
17324
+
17325
+ /* ── The search band ────────────────────────────────────────────────────── */
17326
+
17327
+ /*
17328
+ * The field with no box of its own, as the command palette draws it: the band
17329
+ * is the field. It is set at the trail's size rather than the palette's
17330
+ * headline size, because the panel is a list read at a glance, and at the
17331
+ * reading size on a phone, where a smaller field zooms the page when tapped.
17332
+ */
17333
+ .crewlet-input.crewlet-switcher__search {
17334
+ flex-shrink: 0;
17335
+ min-height: var(--size-control-lg);
17336
+ padding-inline: var(--spacing-3) var(--spacing-2);
17337
+ border: none;
17338
+ border-bottom: 1px solid var(--color-border-default);
17339
+ border-radius: 0;
17340
+ background: transparent;
17341
+ }
17342
+
17343
+ .crewlet-input.crewlet-switcher__search .crewlet-input__control {
17344
+ font-size: var(--font-size-sm);
17345
+ }
17346
+
17347
+ .crewlet-switcher--sheet .crewlet-input.crewlet-switcher__search .crewlet-input__control {
17348
+ font-size: var(--font-size-md);
17349
+ }
17350
+
17351
+ /* ── The list ───────────────────────────────────────────────────────────── */
17352
+
17353
+ .crewlet-switcher__scroller {
17354
+ flex: 1 1 auto;
17355
+ min-height: 0;
17356
+ overflow-y: auto;
17357
+ overscroll-behavior: contain;
17358
+ padding: var(--spacing-1);
17359
+ scrollbar-width: thin;
17360
+ }
17361
+
17362
+ .crewlet-switcher__list {
17363
+ display: flex;
17364
+ flex-direction: column;
17365
+ }
17366
+
17367
+ /*
17368
+ * A ROW: a lead column, the name, and a figure at the end. Both classes are
17369
+ * named so this ties with nothing in `Listbox.css`, whose rows are a step
17370
+ * shorter and padded on every side.
17371
+ */
17372
+ .crewlet-listbox__option.crewlet-switcher__option {
17373
+ gap: 0;
17374
+ min-height: var(--size-row-md);
17375
+ padding-block: 0;
17376
+ font-weight: var(--font-weight-medium);
17377
+ text-decoration: none;
17378
+ }
17379
+
17380
+ .crewlet-switcher--sheet .crewlet-listbox__option.crewlet-switcher__option {
17381
+ min-height: var(--size-control-lg);
17382
+ font-size: var(--font-size-sm);
17383
+ }
17384
+
17385
+ /*
17386
+ * THE CURRENT SUBJECT, outlined by its own accent hairline inside the row: an
17387
+ * outline rather than a shadow, so forced-colours mode keeps it. The row the
17388
+ * arrows are on takes the raised fill as every listbox row does; both can land
17389
+ * on one row, and it never gains a second border.
17390
+ */
17391
+ .crewlet-listbox__option.crewlet-switcher__option.is-current {
17392
+ color: var(--color-text-primary);
17393
+ outline: 1px solid var(--color-brand-accent);
17394
+ outline-offset: -1px;
17395
+ }
17396
+
17397
+ /* A HELD ROW answers no pointer: no fill under it, and the reason in the quiet
17398
+ ink at its end says why. */
17399
+ .crewlet-listbox__option.crewlet-switcher__option[aria-disabled='true'] {
17400
+ background: transparent;
17401
+ color: var(--color-text-tertiary);
17402
+ }
17403
+
17404
+ /* Every row's key starts on one line, whatever the key's length. */
17405
+ .crewlet-switcher__lead {
17406
+ display: flex;
17407
+ flex: none;
17408
+ align-items: center;
17409
+ width: var(--crewlet-switcher-lead);
17410
+ color: var(--color-text-tertiary);
17411
+ }
17412
+
17413
+ .crewlet-switcher__label {
17414
+ flex: 1 1 auto;
17415
+ min-width: 0;
17416
+ overflow: hidden;
17417
+ text-overflow: ellipsis;
17418
+ white-space: nowrap;
17419
+ }
17420
+
17421
+ /* The letters a search matched: the weight carries it, in the primary ink. */
17422
+ b.crewlet-switcher__match {
17423
+ font-weight: var(--font-weight-bold);
17424
+ color: var(--color-text-primary);
17425
+ }
17426
+
17427
+ .crewlet-switcher__meta {
17428
+ display: inline-flex;
17429
+ flex: none;
17430
+ align-items: center;
17431
+ gap: calc(var(--spacing-1) * 1.5);
17432
+ margin-left: var(--spacing-3);
17433
+ color: var(--color-text-tertiary);
17434
+ font-size: var(--font-size-xs);
17435
+ font-weight: var(--font-weight-regular);
17436
+ font-variant-numeric: tabular-nums;
17437
+ white-space: nowrap;
17438
+ }
17439
+
17440
+ /* A group's heading carries its count at its end. */
17441
+ .crewlet-switcher__heading {
17442
+ display: flex;
17443
+ align-items: baseline;
17444
+ justify-content: space-between;
17445
+ }
17446
+
17447
+ .crewlet-switcher__count {
17448
+ font-variant-numeric: tabular-nums;
17449
+ letter-spacing: normal;
17450
+ }
17451
+
17452
+ /* A line about the list itself, on the inset rung: not a row, so not a row's
17453
+ shape. */
17454
+ .crewlet-switcher__note {
17455
+ margin: calc(var(--spacing-1) * 1.5) var(--spacing-2) var(--spacing-1);
17456
+ padding: var(--spacing-2) calc(var(--spacing-2) + var(--spacing-1) / 2);
17457
+ border-radius: var(--radius-md);
17458
+ background: var(--color-surface-inset);
17459
+ color: var(--color-text-secondary);
17460
+ font-size: var(--font-size-xs);
17461
+ }
17462
+
17463
+ /* A state of the list, said in two lines, with its actions as rows under it. */
17464
+ .crewlet-switcher__message {
17465
+ display: grid;
17466
+ gap: var(--spacing-1);
17467
+ padding: var(--spacing-3) var(--spacing-3) var(--spacing-2);
17468
+ }
17469
+
17470
+ .crewlet-switcher__message-title {
17471
+ color: var(--color-text-primary);
17472
+ font-size: var(--font-size-compact);
17473
+ font-weight: var(--font-weight-semibold);
17474
+ }
17475
+
17476
+ .crewlet-switcher__message-body {
17477
+ color: var(--color-text-secondary);
17478
+ font-size: var(--font-size-xs);
17479
+ }
17480
+
17481
+ /* Placeholder rows the shape of the rows on their way. */
17482
+ .crewlet-switcher__skeleton-row {
17483
+ display: flex;
17484
+ align-items: center;
17485
+ height: var(--size-row-md);
17486
+ padding: 0 var(--spacing-3);
17487
+ }
17488
+
17489
+ .crewlet-switcher__skeleton-row > .crewlet-switcher__meta {
17490
+ margin-left: auto;
17491
+ }
17492
+
17493
+ /* ── The footer ─────────────────────────────────────────────────────────── */
17494
+
17495
+ .crewlet-switcher__footer {
17496
+ display: flex;
17497
+ flex: none;
17498
+ flex-direction: column;
17499
+ padding: var(--spacing-1);
17500
+ border-top: 1px solid var(--color-border-default);
17501
+ }
17502
+
17503
+ @media (prefers-reduced-motion: reduce) {
17504
+ .crewlet-switcher-trigger {
17505
+ transition: none;
17506
+ }
17507
+
17508
+ svg.crewlet-switcher-trigger__chevron {
17509
+ transition: none;
17510
+ }
17511
+ }
17512
+
17513
+
15650
17514
  /* Table-TGCS4C3F.css */
15651
17515
  /*
15652
17516
  * Table: the operator's table, on the elements a table is made of.
@@ -15819,7 +17683,7 @@ svg.crewlet-select__chevron {
15819
17683
  }
15820
17684
 
15821
17685
 
15822
- /* Tabs-5I5Q5KKM.css */
17686
+ /* Tabs-ITJYJFMU.css */
15823
17687
  /*
15824
17688
  * The pill register: Tabs and SegmentedControl.
15825
17689
  *
@@ -16100,26 +17964,75 @@ svg.crewlet-select__chevron {
16100
17964
  box-shadow: var(--shadow-xs), 0 0 0 1px var(--color-border-default);
16101
17965
  }
16102
17966
 
16103
- /*
16104
- * THE RING IS AN OUTLINE. Forced-colors mode drops every box-shadow and keeps
16105
- * outlines, so a ring drawn as a shadow disappears for exactly the readers who
16106
- * need one most.
16107
- */
16108
- .crewlet-tabs__tab:focus-visible {
17967
+ /*
17968
+ * THE RING IS AN OUTLINE. Forced-colors mode drops every box-shadow and keeps
17969
+ * outlines, so a ring drawn as a shadow disappears for exactly the readers who
17970
+ * need one most.
17971
+ */
17972
+ .crewlet-tabs__tab:focus-visible {
17973
+ outline: 2px solid var(--color-focus);
17974
+ outline-offset: 2px;
17975
+ }
17976
+
17977
+ /*
17978
+ * A CHIP RINGS ON ITS OWN EDGE, flush rather than 2px off it. The chip that
17979
+ * is on draws a hairline round itself, and a ring standing off that hairline
17980
+ * was two edges with a gap between them, which reads as a second outline
17981
+ * rather than as focus. Flush, the ring covers the hairline, and it stays
17982
+ * inside the well's 2px inset: two pixels wide, it meets the well's own
17983
+ * boundary rather than leaving a sliver of the well between the two.
17984
+ */
17985
+ .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible {
17986
+ outline-offset: 0;
17987
+ }
17988
+
17989
+ /* ─── Chip (a lens row) ───────────────────────────────────────── */
17990
+ /*
17991
+ * QUIET CHIPS WITH NO WELL: the lenses of an object or a scope, set beside its
17992
+ * name in a page's bar. A well round them was a second box beside the name the
17993
+ * lenses are about, and a raised chip inside it a second highlight. Here the
17994
+ * chip that is on is drawn by its own border in the accent and nothing else,
17995
+ * which is the kit's one way of saying "this one is chosen".
17996
+ */
17997
+ .crewlet-tabs--chip {
17998
+ display: inline-flex;
17999
+ align-items: center;
18000
+ gap: calc(var(--spacing-1) / 2);
18001
+ }
18002
+
18003
+ .crewlet-tabs--chip .crewlet-tabs__tab {
18004
+ min-height: var(--size-control-sm);
18005
+ padding: 0 calc(var(--spacing-2) + var(--spacing-1) / 2);
18006
+ border-radius: var(--radius-md);
18007
+ color: var(--color-text-secondary);
18008
+ font-size: var(--font-size-xs);
18009
+ }
18010
+
18011
+ .crewlet-tabs--chip .crewlet-tabs__tab:hover:not(.is-disabled):not(.is-active) {
18012
+ background: var(--color-surface-hover);
18013
+ }
18014
+
18015
+ /* A COUNT IS A QUIET FIGURE here, not a pill: a pill inside a chip is a box
18016
+ inside a box, beside a name that already has its own. */
18017
+ .crewlet-tabs--chip .crewlet-count {
18018
+ min-width: 0;
18019
+ padding: 0;
18020
+ background: none;
18021
+ }
18022
+
18023
+ /* An outline rather than a border, so a chip turning on does not move its
18024
+ neighbours by a pixel, and forced-colors mode keeps it. */
18025
+ .crewlet-tabs--chip .crewlet-tabs__tab.is-active {
18026
+ color: var(--color-text-primary);
18027
+ outline: 1px solid var(--color-brand-accent);
18028
+ outline-offset: -1px;
18029
+ }
18030
+
18031
+ /* THE RING TAKES THE BORDER'S PLACE: declared after it and of the same
18032
+ weight, so a focused chip that is on draws one edge, the ring. */
18033
+ .crewlet-tabs--chip .crewlet-tabs__tab:focus-visible {
16109
18034
  outline: 2px solid var(--color-focus);
16110
- outline-offset: 2px;
16111
- }
16112
-
16113
- /*
16114
- * A CHIP RINGS ON ITS OWN EDGE, flush rather than 2px off it. The chip that
16115
- * is on draws a hairline round itself, and a ring standing off that hairline
16116
- * was two edges with a gap between them, which reads as a second outline
16117
- * rather than as focus. Flush, the ring covers the hairline, and it stays
16118
- * inside the well's 2px inset: two pixels wide, it meets the well's own
16119
- * boundary rather than leaving a sliver of the well between the two.
16120
- */
16121
- .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible {
16122
- outline-offset: 0;
18035
+ outline-offset: -2px;
16123
18036
  }
16124
18037
 
16125
18038
  .crewlet-tabs__tab.is-disabled,
@@ -17037,6 +18950,361 @@ svg.crewlet-select__chevron {
17037
18950
  }
17038
18951
 
17039
18952
 
18953
+ /* ThemeGallery-NITASULQ.css */
18954
+ /*
18955
+ * The gallery of themes: each group's heading over a grid of cards.
18956
+ *
18957
+ * A ROW HOLDS THE SAME NUMBER OF CARDS IN EVERY GROUP (`columns`, three by
18958
+ * default), so a group of one draws a card the size of every other card
18959
+ * rather than one stretched across the row, and the swatches line up from
18960
+ * group to group.
18961
+ */
18962
+
18963
+ .crewlet-theme-gallery__groups {
18964
+ display: flex;
18965
+ flex-direction: column;
18966
+ gap: var(--spacing-3);
18967
+ }
18968
+
18969
+ .crewlet-theme-gallery__group {
18970
+ display: flex;
18971
+ flex-direction: column;
18972
+ gap: var(--spacing-1);
18973
+ }
18974
+
18975
+ .crewlet-theme-gallery__heading {
18976
+ color: var(--color-text-tertiary);
18977
+ font-size: var(--font-size-2xs);
18978
+ line-height: var(--font-line-height-normal);
18979
+ }
18980
+
18981
+ .crewlet-theme-gallery__cards {
18982
+ display: grid;
18983
+ grid-template-columns: repeat(var(--crewlet-theme-gallery-columns), minmax(0, 1fr));
18984
+ gap: var(--spacing-2);
18985
+ }
18986
+
18987
+ /*
18988
+ * A CARD IS ITS BORDER. Resting, the plain hairline; under the pointer, the
18989
+ * strong one; chosen, the accent. One line round the card in every state, so
18990
+ * the chosen card is never a card inside a frame.
18991
+ */
18992
+ .crewlet-theme-gallery__card {
18993
+ display: flex;
18994
+ flex-direction: column;
18995
+ gap: var(--spacing-1);
18996
+ min-width: 0;
18997
+ padding: var(--spacing-2);
18998
+ border: 1px solid var(--color-border-default);
18999
+ border-radius: var(--radius-md);
19000
+ background: var(--color-surface-subtle);
19001
+ color: var(--color-text-primary);
19002
+ font: inherit;
19003
+ text-align: left;
19004
+ cursor: pointer;
19005
+ }
19006
+
19007
+ /* Not on the chosen card: under the pointer it keeps the accent, or the one
19008
+ card that says "this one" would stop saying it while it is being pointed at. */
19009
+ .crewlet-theme-gallery__card:hover:not(:disabled):not(.is-chosen) {
19010
+ border-color: var(--color-border-strong);
19011
+ }
19012
+
19013
+ .crewlet-theme-gallery__card.is-chosen {
19014
+ border-color: var(--color-brand-accent);
19015
+ }
19016
+
19017
+ /* The ring is drawn OVER the border, inset by its width, never a second line outside it. */
19018
+ .crewlet-theme-gallery__card:focus-visible {
19019
+ outline: 2px solid var(--color-focus);
19020
+ outline-offset: -1px;
19021
+ }
19022
+
19023
+ .crewlet-theme-gallery__card:disabled {
19024
+ cursor: not-allowed;
19025
+ opacity: 0.5;
19026
+ }
19027
+
19028
+ .crewlet-theme-gallery__name {
19029
+ overflow: hidden;
19030
+ font-size: var(--font-size-xs);
19031
+ font-weight: var(--font-weight-medium);
19032
+ line-height: var(--font-line-height-tight);
19033
+ text-overflow: ellipsis;
19034
+ white-space: nowrap;
19035
+ }
19036
+
19037
+ /*
19038
+ * FORCED COLORS keeps the border and drops the accent, so the chosen card
19039
+ * would look like every other; the system's own selected colour says it.
19040
+ */
19041
+ @media (forced-colors: active) {
19042
+ .crewlet-theme-gallery__card.is-chosen {
19043
+ border-color: Highlight;
19044
+ border-width: 2px;
19045
+ }
19046
+ }
19047
+
19048
+
19049
+ /* ThemeSwatch-4DL457ZB.css */
19050
+ /*
19051
+ * A theme's thumbnail.
19052
+ *
19053
+ * EVERY COLOUR IS THE THEME'S OWN, from the custom properties ThemeSwatch sets
19054
+ * on each half (--crewlet-swatch-*), and none is the page's except the
19055
+ * outline, which is the page's hairline because the page is where the
19056
+ * thumbnail sits. Two halves share the box equally: dark, then light.
19057
+ *
19058
+ * IT IS A PICTURE, so forced-colors mode leaves it alone: repainted to the
19059
+ * system's two colours, every theme would draw the same blank box.
19060
+ */
19061
+
19062
+ .crewlet-theme-swatch {
19063
+ display: grid;
19064
+ grid-auto-flow: column;
19065
+ grid-auto-columns: minmax(0, 1fr);
19066
+ flex: none;
19067
+ overflow: hidden;
19068
+ border: 1px solid var(--color-border-default);
19069
+ forced-color-adjust: none;
19070
+ }
19071
+
19072
+ .crewlet-theme-swatch--chip {
19073
+ width: 26px;
19074
+ height: 16px;
19075
+ border-radius: var(--radius-xs);
19076
+ }
19077
+
19078
+ .crewlet-theme-swatch--card {
19079
+ width: 100%;
19080
+ height: 38px;
19081
+ border-radius: var(--radius-sm);
19082
+ }
19083
+
19084
+ .crewlet-theme-swatch--pane {
19085
+ width: 100%;
19086
+ aspect-ratio: 4 / 3;
19087
+ border-radius: var(--radius-md);
19088
+ }
19089
+
19090
+ .crewlet-theme-swatch__half {
19091
+ display: grid;
19092
+ grid-template-columns: 26% minmax(0, 1fr);
19093
+ min-width: 0;
19094
+ background: var(--crewlet-swatch-frame);
19095
+ }
19096
+
19097
+ /* ── The chip: each palette's frame, with its accent on it ────────────── */
19098
+
19099
+ .crewlet-theme-swatch--chip .crewlet-theme-swatch__half {
19100
+ grid-template-columns: none;
19101
+ place-items: center;
19102
+ }
19103
+
19104
+ .crewlet-theme-swatch__dot {
19105
+ width: 6px;
19106
+ height: 6px;
19107
+ border-radius: var(--radius-circle);
19108
+ background: var(--crewlet-swatch-accent);
19109
+ }
19110
+
19111
+ /* ── The card: a rail, a sheet, a card on it ──────────────────────────── */
19112
+
19113
+ .crewlet-theme-swatch__rail {
19114
+ display: flex;
19115
+ flex-direction: column;
19116
+ gap: 3px;
19117
+ padding: 6px 4px;
19118
+ min-width: 0;
19119
+ }
19120
+
19121
+ .crewlet-theme-swatch__rail-row {
19122
+ display: block;
19123
+ width: 80%;
19124
+ height: 3px;
19125
+ border-radius: var(--radius-pill);
19126
+ background: var(--crewlet-swatch-muted);
19127
+ }
19128
+
19129
+ /* The row the reader is on stands on the raised rung, as the rail draws it. */
19130
+ .crewlet-theme-swatch__rail-row.is-current {
19131
+ width: 100%;
19132
+ height: 6px;
19133
+ background: var(--crewlet-swatch-raised);
19134
+ }
19135
+
19136
+ .crewlet-theme-swatch__sheet {
19137
+ display: flex;
19138
+ flex-direction: column;
19139
+ min-width: 0;
19140
+ margin: 3px 3px 3px 0;
19141
+ padding: 3px;
19142
+ border-radius: var(--radius-xs);
19143
+ background: var(--crewlet-swatch-sheet);
19144
+ }
19145
+
19146
+ .crewlet-theme-swatch__card {
19147
+ display: flex;
19148
+ flex: 1;
19149
+ flex-direction: column;
19150
+ justify-content: space-between;
19151
+ min-width: 0;
19152
+ padding: 4px;
19153
+ border: 1px solid var(--crewlet-swatch-hairline);
19154
+ border-radius: var(--radius-xs);
19155
+ background: var(--crewlet-swatch-card);
19156
+ }
19157
+
19158
+ .crewlet-theme-swatch__line {
19159
+ display: block;
19160
+ width: 60%;
19161
+ height: 3px;
19162
+ border-radius: var(--radius-pill);
19163
+ background: var(--crewlet-swatch-text);
19164
+ }
19165
+
19166
+ /*
19167
+ * THE ACTION GIVES WAY BEFORE IT DISAPPEARS. A narrow thumbnail has less room
19168
+ * than the action and the four states take, so the action narrows to a floor
19169
+ * and the row clips its last states, rather than the action, which is what a
19170
+ * theme is chosen for, shrinking to nothing.
19171
+ */
19172
+ .crewlet-theme-swatch__row {
19173
+ display: flex;
19174
+ align-items: center;
19175
+ gap: 2px;
19176
+ overflow: hidden;
19177
+ }
19178
+
19179
+ /* The primary action: the accent's fill. */
19180
+ .crewlet-theme-swatch__action {
19181
+ display: block;
19182
+ flex: 0 1 14px;
19183
+ min-width: 6px;
19184
+ height: 6px;
19185
+ margin-right: auto;
19186
+ border-radius: var(--radius-pill);
19187
+ background: var(--crewlet-swatch-accent);
19188
+ }
19189
+
19190
+ /* The four states, in the order the kit names them. */
19191
+ .crewlet-theme-swatch__state {
19192
+ display: block;
19193
+ flex: none;
19194
+ width: 4px;
19195
+ height: 4px;
19196
+ border-radius: var(--radius-circle);
19197
+ }
19198
+
19199
+ .crewlet-theme-swatch__state--info { background: var(--crewlet-swatch-info); }
19200
+ .crewlet-theme-swatch__state--warning { background: var(--crewlet-swatch-warning); }
19201
+ .crewlet-theme-swatch__state--danger { background: var(--crewlet-swatch-danger); }
19202
+ .crewlet-theme-swatch__state--success { background: var(--crewlet-swatch-success); }
19203
+
19204
+ /* ── The pane: the same sketch, large enough to read as a screen ───────── */
19205
+
19206
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__half {
19207
+ grid-template-columns: 26% minmax(0, 1fr);
19208
+ }
19209
+
19210
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail {
19211
+ gap: 7px;
19212
+ padding: 12px 8px;
19213
+ }
19214
+
19215
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail-row {
19216
+ height: 5px;
19217
+ }
19218
+
19219
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail-row.is-current {
19220
+ height: 12px;
19221
+ border: 1px solid var(--crewlet-swatch-hairline);
19222
+ border-radius: var(--radius-xs);
19223
+ }
19224
+
19225
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__sheet {
19226
+ gap: 8px;
19227
+ margin: 6px 6px 6px 0;
19228
+ padding: 10px;
19229
+ border-radius: var(--radius-sm);
19230
+ }
19231
+
19232
+ .crewlet-theme-swatch__title {
19233
+ display: block;
19234
+ flex: none;
19235
+ width: 40%;
19236
+ height: 6px;
19237
+ border-radius: var(--radius-pill);
19238
+ background: var(--crewlet-swatch-text);
19239
+ }
19240
+
19241
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__card {
19242
+ flex: none;
19243
+ gap: 7px;
19244
+ justify-content: flex-start;
19245
+ padding: 8px;
19246
+ }
19247
+
19248
+ .crewlet-theme-swatch__item {
19249
+ display: flex;
19250
+ align-items: center;
19251
+ gap: 6px;
19252
+ }
19253
+
19254
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__state {
19255
+ width: 6px;
19256
+ height: 6px;
19257
+ }
19258
+
19259
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__line {
19260
+ width: 45%;
19261
+ height: 4px;
19262
+ }
19263
+
19264
+ .crewlet-theme-swatch__muted {
19265
+ display: block;
19266
+ width: 18%;
19267
+ height: 4px;
19268
+ margin-left: auto;
19269
+ border-radius: var(--radius-pill);
19270
+ background: var(--crewlet-swatch-muted);
19271
+ }
19272
+
19273
+ .crewlet-theme-swatch__actions {
19274
+ display: flex;
19275
+ gap: 6px;
19276
+ margin-top: auto;
19277
+ }
19278
+
19279
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__action {
19280
+ display: grid;
19281
+ flex: none;
19282
+ place-items: center;
19283
+ width: 40%;
19284
+ height: 16px;
19285
+ margin-right: 0;
19286
+ border-radius: var(--radius-xs);
19287
+ }
19288
+
19289
+ /* The primary action's label, in the colour the theme labels its accent with. */
19290
+ .crewlet-theme-swatch__label {
19291
+ display: block;
19292
+ width: 50%;
19293
+ height: 4px;
19294
+ border-radius: var(--radius-pill);
19295
+ background: var(--crewlet-swatch-on-accent);
19296
+ }
19297
+
19298
+ .crewlet-theme-swatch__secondary {
19299
+ display: block;
19300
+ width: 26%;
19301
+ height: 16px;
19302
+ border: 1px solid var(--crewlet-swatch-hairline);
19303
+ border-radius: var(--radius-xs);
19304
+ background: var(--crewlet-swatch-card);
19305
+ }
19306
+
19307
+
17040
19308
  /* TimeWindowPicker-GBF4JDFI.css */
17041
19309
  /*
17042
19310
  * TimeWindowPicker: one trigger over one panel.
@@ -17603,7 +19871,7 @@ svg.crewlet-time-window__tick {
17603
19871
  }
17604
19872
 
17605
19873
 
17606
- /* Toaster-NVDCEIP5.css */
19874
+ /* Toaster-KZ7YE2HA.css */
17607
19875
  /*
17608
19876
  * The toast stack.
17609
19877
  *
@@ -17796,6 +20064,7 @@ svg.crewlet-time-window__tick {
17796
20064
  .crewlet-toast--danger .crewlet-toast__action-link {
17797
20065
  background: var(--color-feedback-danger);
17798
20066
  border-color: var(--color-feedback-danger);
20067
+ color: var(--color-text-on-danger);
17799
20068
  }
17800
20069
 
17801
20070
  .crewlet-toast--danger .crewlet-toast__action-btn:hover,
@@ -19270,7 +21539,7 @@ svg.crewlet-time-window__tick {
19270
21539
  }
19271
21540
 
19272
21541
 
19273
- /* TreeGrid-NSW7VMOX.css */
21542
+ /* TreeGrid-FBX3MSJA.css */
19274
21543
  /*
19275
21544
  * A hierarchy as rows and columns (TreeGrid.tsx).
19276
21545
  *
@@ -19399,6 +21668,25 @@ svg.crewlet-time-window__tick {
19399
21668
  outline-offset: var(--size-focus-ring-inset-offset);
19400
21669
  }
19401
21670
 
21671
+ /*
21672
+ * A HEADLESS GRID keeps its header row for a screen reader and draws no band:
21673
+ * the row is taken out of the layout the way VisuallyHidden takes text out,
21674
+ * and the first row of the body loses the hairline that would otherwise sit
21675
+ * under the frame's own edge as a second line.
21676
+ */
21677
+ .crewlet-tree-grid--headless .crewlet-tree-grid__head {
21678
+ position: absolute;
21679
+ width: 1px;
21680
+ height: 1px;
21681
+ overflow: hidden;
21682
+ clip-path: inset(50%);
21683
+ white-space: nowrap;
21684
+ }
21685
+
21686
+ .crewlet-tree-grid--headless .crewlet-tree-grid__head + [role='rowgroup'] > .crewlet-tree-grid__row:first-child {
21687
+ border-top: 0;
21688
+ }
21689
+
19402
21690
  /* The selection is where the reader is, so it takes the accent. */
19403
21691
  .crewlet-tree-grid__row[aria-selected='true'] {
19404
21692
  box-shadow: inset 2px 0 0 var(--color-brand-accent);