@crewlethq/ui 0.32.0 → 0.33.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 (273) hide show
  1. package/README.md +131 -5
  2. package/dist/AccessDeniedCard/AccessDeniedCard.d.ts +5 -0
  3. package/dist/AccessDeniedCard/index.js +1 -5
  4. package/dist/AccessDeniedCard-QVNDMT46.css +8 -0
  5. package/dist/AppShell/index.js +4 -4
  6. package/dist/{AppShell-GCM4TDVY.css → AppShell-JTSEOA57.css} +3 -1
  7. package/dist/ArrangeGroup/ArrangeGroup.d.ts +16 -1
  8. package/dist/ArrangeGroup/index.d.ts +1 -1
  9. package/dist/ArrangeGroup/index.js +1 -1
  10. package/dist/{ArrangeGroup-GY5YMP6E.css → ArrangeGroup-KRWWOJKR.css} +43 -0
  11. package/dist/ArrangeList/index.js +2 -2
  12. package/dist/ArtifactBar/index.js +12 -12
  13. package/dist/{ArtifactBar-MLMJHWY6.css → ArtifactBar-C462VD4C.css} +8 -3
  14. package/dist/ArtifactCard/ArtifactCard.d.ts +19 -1
  15. package/dist/ArtifactCard/index.d.ts +1 -1
  16. package/dist/ArtifactCard/index.js +4 -4
  17. package/dist/{ArtifactCard-EXVAEBV6.css → ArtifactCard-AS5Z4CVI.css} +17 -2
  18. package/dist/ArtifactCover/index.js +6 -6
  19. package/dist/ArtifactIcon/index.js +5 -5
  20. package/dist/ArtifactPanel/ArtifactPanel.d.ts +6 -2
  21. package/dist/ArtifactPanel/index.js +1 -1
  22. package/dist/{ArtifactPanel-YFXT5O77.css → ArtifactPanel-HW3SU7CP.css} +25 -7
  23. package/dist/Avatar/Avatar.d.ts +6 -4
  24. package/dist/Avatar/index.js +2 -2
  25. package/dist/AvatarPicker/index.js +8 -8
  26. package/dist/Callout/index.js +1 -1
  27. package/dist/{Callout-SXXK4B5R.css → Callout-ZAVG3P66.css} +46 -6
  28. package/dist/Canvas/Canvas.d.ts +33 -2
  29. package/dist/Canvas/index.d.ts +1 -1
  30. package/dist/Canvas/index.js +4 -4
  31. package/dist/{Canvas-LRVNW7XN.css → Canvas-VUG2HLZK.css} +23 -0
  32. package/dist/CanvasBoard/CanvasBoard.d.ts +38 -3
  33. package/dist/CanvasBoard/budget.d.ts +9 -3
  34. package/dist/CanvasBoard/index.d.ts +2 -2
  35. package/dist/CanvasBoard/index.js +7 -7
  36. package/dist/{CanvasBoard-MBZVBWDO.css → CanvasBoard-5NNSKY6A.css} +127 -6
  37. package/dist/CanvasToolbar/index.js +5 -5
  38. package/dist/{CanvasToolbar-AE5MXH7T.css → CanvasToolbar-EM5EVZED.css} +4 -2
  39. package/dist/ChangeMark/index.js +4 -4
  40. package/dist/CharacterPicker/index.js +2 -2
  41. package/dist/Charts/ActivityStrip.d.ts +16 -1
  42. package/dist/Charts/BarList.d.ts +6 -0
  43. package/dist/Charts/ChartEmpty.d.ts +33 -0
  44. package/dist/Charts/Legend.d.ts +6 -0
  45. package/dist/Charts/StackedBar.d.ts +4 -1
  46. package/dist/Charts/StackedColumns.d.ts +14 -3
  47. package/dist/Charts/TimeSeries.d.ts +11 -1
  48. package/dist/Charts/index.d.ts +2 -0
  49. package/dist/Charts/index.js +1 -1
  50. package/dist/{Charts-RY4JN5FC.css → Charts-MBJG72BS.css} +140 -16
  51. package/dist/Checkbox/index.js +1 -1
  52. package/dist/{Checkbox-5UORUG3F.css → Checkbox-ALWG3WV2.css} +11 -0
  53. package/dist/CommandPalette/index.js +3 -3
  54. package/dist/{CommandPalette-HBTNKHZQ.css → CommandPalette-7CFGVBND.css} +4 -0
  55. package/dist/CommentThread/index.js +5 -5
  56. package/dist/Container/index.js +1 -1
  57. package/dist/{Container-3TSKMGNI.css → Container-34BAKG7B.css} +3 -1
  58. package/dist/{DashboardCover-RMINBODB.css → DashboardCover-KYGYMRKW.css} +42 -9
  59. package/dist/DataTable/index.js +5 -5
  60. package/dist/{DataTable-WZK3V62B.css → DataTable-NL2YWAIA.css} +4 -1
  61. package/dist/DataView/index.js +8 -8
  62. package/dist/DateTimePicker/index.js +3 -3
  63. package/dist/DocTabsEditor/DocTabsEditor.d.ts +34 -21
  64. package/dist/DocTabsEditor/index.js +4 -1
  65. package/dist/DocTabsEditor-4M452LNS.css +189 -0
  66. package/dist/Document/Document.d.ts +18 -1
  67. package/dist/Document/index.d.ts +2 -2
  68. package/dist/Document/index.js +1 -1
  69. package/dist/{Document-G3YTZIUL.css → Document-JUGCSQ4L.css} +78 -5
  70. package/dist/EditingStatus/index.js +1 -1
  71. package/dist/{EditingStatus-L6THUAN7.css → EditingStatus-NNA2CKIL.css} +17 -4
  72. package/dist/{Editor-YWBUJAQU.js → Editor-UUZ7XKCU.js} +5 -5
  73. package/dist/EntityChip/index.js +3 -3
  74. package/dist/FactList/index.js +3 -3
  75. package/dist/FollowBanner/index.js +3 -3
  76. package/dist/Fullscreen/index.d.ts +1 -0
  77. package/dist/Fullscreen/index.js +1 -1
  78. package/dist/Fullscreen/useIdle.d.ts +16 -0
  79. package/dist/HuePicker/index.js +3 -3
  80. package/dist/ImageUpload/index.js +3 -3
  81. package/dist/Layer/index.d.ts +1 -1
  82. package/dist/Layer/index.js +1 -1
  83. package/dist/Layer/place.d.ts +18 -0
  84. package/dist/LayersList/LayersList.d.ts +57 -0
  85. package/dist/LayersList/index.d.ts +3 -0
  86. package/dist/LayersList/index.js +3 -0
  87. package/dist/LayersList-NQZEIPZB.css +82 -0
  88. package/dist/LinkInterstitial/index.js +4 -4
  89. package/dist/ListInput/index.js +1 -1
  90. package/dist/Markdown/index.js +1 -1
  91. package/dist/MarkdownEditor/index.js +5 -5
  92. package/dist/MediaMatch/index.d.ts +1 -0
  93. package/dist/MediaMatch/index.js +1 -0
  94. package/dist/MediaMatch/useMediaMatch.d.ts +19 -0
  95. package/dist/Menu/index.js +2 -2
  96. package/dist/MergeConflicts/index.js +4 -4
  97. package/dist/Modal/index.js +2 -2
  98. package/dist/{Modal-XOSV6FAH.css → Modal-7MWRCWAI.css} +30 -0
  99. package/dist/Note/index.js +1 -1
  100. package/dist/{Note-ONSKKTOA.css → Note-WI5MLZOO.css} +13 -0
  101. package/dist/OrgLabel/index.js +3 -3
  102. package/dist/OrgNode/index.js +4 -4
  103. package/dist/OrgTable/index.js +7 -7
  104. package/dist/PeopleRail/index.js +3 -3
  105. package/dist/Popover/index.js +2 -2
  106. package/dist/PresenceStack/index.js +3 -3
  107. package/dist/{PresenceStack-QSXQJND5.css → PresenceStack-FJJQVH74.css} +11 -3
  108. package/dist/PresenterView/PresenterView.d.ts +3 -0
  109. package/dist/PresenterView/index.js +5 -3
  110. package/dist/PresenterView-T3EXIQ5S.css +147 -0
  111. package/dist/Principal/index.js +3 -3
  112. package/dist/PrincipalPicker/index.js +4 -4
  113. package/dist/RichEditor/index.js +5 -5
  114. package/dist/RichEditor/schema.d.ts +1 -1
  115. package/dist/RichEditorMarkdown/index.js +3 -3
  116. package/dist/SandboxedFrame/SandboxedFrame.d.ts +44 -2
  117. package/dist/SandboxedFrame/index.d.ts +2 -2
  118. package/dist/SandboxedFrame/index.js +3 -3
  119. package/dist/SandboxedFrame-P5NASXB7.css +72 -0
  120. package/dist/Section/index.js +1 -1
  121. package/dist/{Section-QR3ILQVK.css → Section-O5AHGSOG.css} +28 -5
  122. package/dist/SegmentedControl/index.js +3 -3
  123. package/dist/Select/index.js +2 -2
  124. package/dist/ShareDialog/ShareDialog.d.ts +10 -0
  125. package/dist/ShareDialog/index.js +9 -9
  126. package/dist/{ShareDialog-YZ4F37MW.css → ShareDialog-4QDCBWMH.css} +12 -0
  127. package/dist/SheetGrid/SheetGrid.d.ts +3 -1
  128. package/dist/SheetGrid/index.js +8 -8
  129. package/dist/{SheetGrid-J3TKKXZL.css → SheetGrid-AKPUCK67.css} +106 -7
  130. package/dist/SheetModel/fit.d.ts +34 -0
  131. package/dist/SheetModel/index.d.ts +1 -0
  132. package/dist/SheetModel/index.js +1 -1
  133. package/dist/Shortcut/index.js +1 -1
  134. package/dist/Skeleton/Skeleton.d.ts +2 -1
  135. package/dist/Skeleton/index.js +1 -1
  136. package/dist/SlideCompare/SlideCompare.d.ts +6 -1
  137. package/dist/SlideCompare/index.js +3 -3
  138. package/dist/{SlideCompare-MGM3U2ME.css → SlideCompare-HTCMPQFY.css} +36 -3
  139. package/dist/SlideFilmstrip/SlideFilmstrip.d.ts +14 -3
  140. package/dist/SlideFilmstrip/index.js +3 -3
  141. package/dist/{SlideFilmstrip-BCLNAHFX.css → SlideFilmstrip-5U6Z55GS.css} +63 -2
  142. package/dist/SlideGrid/index.js +3 -3
  143. package/dist/{SlideGrid-RT6QEQEE.css → SlideGrid-S4LTJ4UU.css} +9 -5
  144. package/dist/SlideNav/SlideNav.d.ts +49 -0
  145. package/dist/SlideNav/index.d.ts +3 -0
  146. package/dist/SlideNav/index.js +4 -0
  147. package/dist/SlideNav-BLFJF6AH.css +53 -0
  148. package/dist/SlideStage/SlideStage.d.ts +9 -1
  149. package/dist/SlideStage/index.js +2 -2
  150. package/dist/{SlideStage-KGRRALXR.css → SlideStage-S2FISF4C.css} +23 -0
  151. package/dist/StatCard/StatCard.d.ts +16 -1
  152. package/dist/StatCard/index.js +1 -1
  153. package/dist/{StatCard-KPAFD4E2.css → StatCard-4T7TMWMN.css} +40 -13
  154. package/dist/Switcher/index.js +6 -6
  155. package/dist/TableCells/index.js +3 -3
  156. package/dist/Tabs/Tabs.d.ts +21 -4
  157. package/dist/Tabs/index.js +1 -1
  158. package/dist/{Tabs-CJGO35BH.css → Tabs-MMZXV5EF.css} +9 -8
  159. package/dist/TagsInput/index.js +1 -1
  160. package/dist/ThemeSwitcher/index.js +4 -4
  161. package/dist/TimeWindowPicker/index.js +4 -4
  162. package/dist/Toaster/index.js +2 -2
  163. package/dist/{Toaster-EOOOTSJT.css → Toaster-C6BQ7L6I.css} +10 -1
  164. package/dist/Toolbar/index.js +1 -1
  165. package/dist/Tooltip/index.js +2 -2
  166. package/dist/TreeCanvas/index.js +5 -5
  167. package/dist/TreeGrid/index.js +3 -3
  168. package/dist/VersionCompare/index.js +4 -4
  169. package/dist/VersionTimeline/index.js +4 -4
  170. package/dist/WidgetFrame/WidgetFrame.d.ts +8 -1
  171. package/dist/WidgetFrame/index.js +2 -2
  172. package/dist/{WidgetFrame-LRZIL62O.css → WidgetFrame-BTFW3CRK.css} +49 -5
  173. package/dist/{chunk-OTN35CI4.js → chunk-22UEIXZE.js} +18 -6
  174. package/dist/{chunk-UZ6MA2V6.js → chunk-2DHMVB5J.js} +2 -2
  175. package/dist/{chunk-WJDQ7XQA.js → chunk-2QEDJSJC.js} +1 -1
  176. package/dist/{chunk-2HIOJ4YZ.js → chunk-3EB2AV3H.js} +2 -3
  177. package/dist/{chunk-ODT5H4MN.js → chunk-3LYWD3BO.js} +2 -2
  178. package/dist/{chunk-FAQGGX2Z.js → chunk-3TFDQLW3.js} +1 -1
  179. package/dist/{chunk-VYDFB6PJ.js → chunk-3U7S6ZUN.js} +50 -17
  180. package/dist/{chunk-A4E5YLXO.js → chunk-4B6LSFDS.js} +1 -1
  181. package/dist/{chunk-WTNUVQVI.js → chunk-4IJS5CPF.js} +1 -1
  182. package/dist/{chunk-UAN5NE7M.js → chunk-5AQBPHZD.js} +1 -1
  183. package/dist/{chunk-QWOPX2MN.js → chunk-5FYPE5GL.js} +2 -3
  184. package/dist/{chunk-CJKMURZO.js → chunk-5SZGKSGL.js} +1 -1
  185. package/dist/chunk-6VOS2GMB.js +54 -0
  186. package/dist/{chunk-3ZAFJ4GK.js → chunk-7Q7WDXHG.js} +4 -4
  187. package/dist/{chunk-JI5AVQLA.js → chunk-7WHDPLVJ.js} +1 -1
  188. package/dist/{chunk-QH3AKP2N.js → chunk-AC22RZKC.js} +2 -2
  189. package/dist/{chunk-ZITJKF6Z.js → chunk-AYB6AYNH.js} +1 -1
  190. package/dist/{chunk-Y5NQ2LMS.js → chunk-BY4N65PM.js} +1 -1
  191. package/dist/{chunk-YFW4MTK4.js → chunk-C7DKX453.js} +1 -1
  192. package/dist/{chunk-RCQXUT5K.js → chunk-CCAXYHQS.js} +1 -1
  193. package/dist/{chunk-4KP4RC3O.js → chunk-CI3VPIJN.js} +1 -1
  194. package/dist/{chunk-7T42VQQT.js → chunk-CPEPST4S.js} +1 -1
  195. package/dist/{chunk-AAOH2P6Y.js → chunk-DFK5EQTU.js} +5 -3
  196. package/dist/{chunk-GOSQXEZU.js → chunk-DFZMYB5X.js} +16 -10
  197. package/dist/{chunk-TGYDROIB.js → chunk-EBCHVFCS.js} +4 -4
  198. package/dist/{chunk-YDBC4DNW.js → chunk-FWYHRU7M.js} +1 -1
  199. package/dist/{chunk-LWXRD6L6.js → chunk-G4ZW7A2W.js} +123 -31
  200. package/dist/{chunk-E6EWK5YY.js → chunk-GLSOD5Z4.js} +3 -3
  201. package/dist/{chunk-LIXSV5YI.js → chunk-GPHWCK7M.js} +1 -1
  202. package/dist/{chunk-UQHKFF2N.js → chunk-GPWJCP3U.js} +1 -1
  203. package/dist/{chunk-77DRMDXR.js → chunk-HG5VF3TZ.js} +192 -67
  204. package/dist/{chunk-4JUKWWUD.js → chunk-HH2GKAAE.js} +1 -1
  205. package/dist/{chunk-QVE4GJAT.js → chunk-HJO4WCH6.js} +1 -1
  206. package/dist/{chunk-I3BSQUKN.js → chunk-HUVG2FFT.js} +1 -1
  207. package/dist/{chunk-VS3KOOOL.js → chunk-ILAEBSLJ.js} +3 -3
  208. package/dist/{chunk-GR55WT4R.js → chunk-IYO2N5ZH.js} +2 -2
  209. package/dist/{chunk-RWA4H2TV.js → chunk-J6ON5SYE.js} +1 -1
  210. package/dist/{chunk-NHBP2XS5.js → chunk-J6ZSH3F5.js} +49 -1
  211. package/dist/{chunk-AMNN4WDX.js → chunk-JBUMD6DS.js} +2 -2
  212. package/dist/{chunk-BWRGFKJP.js → chunk-K3IJQNB7.js} +2 -3
  213. package/dist/{chunk-LFNUH4GY.js → chunk-K4VP6ZKE.js} +1 -1
  214. package/dist/{chunk-ZR5VN5IV.js → chunk-KD2IRYCT.js} +2 -2
  215. package/dist/{chunk-SKOYC2CF.js → chunk-KK5OYNAF.js} +2 -1
  216. package/dist/{chunk-UB7TJEKZ.js → chunk-KV3ODJXH.js} +6 -7
  217. package/dist/chunk-LL5AFXU7.js +96 -0
  218. package/dist/{chunk-VYOKRN2I.js → chunk-LM3ISVJA.js} +1 -1
  219. package/dist/{chunk-E6CR5PEV.js → chunk-LV4APO72.js} +8 -2
  220. package/dist/{chunk-B4EBHPK3.js → chunk-M5KZX5JE.js} +9 -2
  221. package/dist/{chunk-PJD2KFHX.js → chunk-MDNVHIB2.js} +38 -13
  222. package/dist/{chunk-V5IGUXMZ.js → chunk-MTMKIUWF.js} +4 -4
  223. package/dist/{chunk-HVNTQ36V.js → chunk-O37AQNLK.js} +4 -4
  224. package/dist/{chunk-HMPFGIWM.js → chunk-OMV5W53A.js} +10 -1
  225. package/dist/chunk-ONL54WMH.js +55 -0
  226. package/dist/{chunk-AKEZ3G5V.js → chunk-ONQKKHON.js} +1 -1
  227. package/dist/{chunk-LZHLSQYK.js → chunk-OOWPSBIS.js} +2 -2
  228. package/dist/{chunk-JQLTG4KH.js → chunk-ORT5IKHP.js} +62 -51
  229. package/dist/{chunk-4KWOKX2B.js → chunk-OSKJZNBT.js} +1 -1
  230. package/dist/{chunk-EHQTPVV4.js → chunk-PLTCDSTU.js} +1 -1
  231. package/dist/{chunk-5OM447RW.js → chunk-PZKHBB7D.js} +1 -1
  232. package/dist/{chunk-VEB5ERRE.js → chunk-QWNVSR6G.js} +2 -2
  233. package/dist/{chunk-IG75YMUN.js → chunk-RTPQDNW3.js} +1 -1
  234. package/dist/{chunk-SVSCLHHI.js → chunk-SZZRIHGT.js} +1 -1
  235. package/dist/{chunk-EBNI36UQ.js → chunk-T46NR3WP.js} +3 -3
  236. package/dist/{chunk-FPS3JIPQ.js → chunk-TC7DJTXI.js} +1 -1
  237. package/dist/{chunk-W5J7R5EB.js → chunk-TEUQWOWZ.js} +1 -1
  238. package/dist/chunk-THROPJZC.js +115 -0
  239. package/dist/{chunk-IDBHX5SR.js → chunk-TRQCHF2F.js} +1 -1
  240. package/dist/{chunk-M3LUNN7F.js → chunk-TYKQ33CL.js} +13 -2
  241. package/dist/{chunk-VVRL27HM.js → chunk-ULPL26BU.js} +2 -2
  242. package/dist/{chunk-6AH2XJ3Q.js → chunk-UNXLTJU7.js} +3 -3
  243. package/dist/{chunk-FC4YTTFJ.js → chunk-UQGFHNDI.js} +2 -3
  244. package/dist/{chunk-EBJREOKS.js → chunk-UXXJDIYE.js} +4 -4
  245. package/dist/{chunk-5LUI3WQP.js → chunk-V43UVX4H.js} +1 -1
  246. package/dist/{chunk-W4XYY73O.js → chunk-VHZ3AXJD.js} +1 -1
  247. package/dist/{chunk-HJEVSQN6.js → chunk-VL6CUNSX.js} +11 -5
  248. package/dist/{chunk-XDTYBF2F.js → chunk-W5XCNEZC.js} +39 -1
  249. package/dist/{chunk-LDJ3J4TQ.js → chunk-WGD2HX2A.js} +1 -1
  250. package/dist/{chunk-FQCLKD7U.js → chunk-WKEPORNM.js} +1 -1
  251. package/dist/{chunk-I3KKZ2O3.js → chunk-XEGZHHRH.js} +45 -36
  252. package/dist/{chunk-IKB6HFGK.js → chunk-XO7PUL4F.js} +6 -4
  253. package/dist/chunk-XV32RKQZ.js +142 -0
  254. package/dist/{chunk-TBMDMXEX.js → chunk-YA3AWELW.js} +1 -1
  255. package/dist/{chunk-HVIX5ECM.js → chunk-YEVG2X5R.js} +1 -1
  256. package/dist/chunk-YZFLH463.js +215 -0
  257. package/dist/{chunk-P4BOXB6E.js → chunk-Z6GFMI2Z.js} +6 -7
  258. package/dist/{chunk-YEKYVJQR.js → chunk-ZNBLFCQS.js} +2 -2
  259. package/dist/generated/index.d.ts +3 -0
  260. package/dist/generated/index.js +105 -103
  261. package/dist/index.js +105 -103
  262. package/dist/styles.css +1448 -211
  263. package/package.json +3 -3
  264. package/dist/AccessDeniedCard-WXM5DBDZ.css +0 -8
  265. package/dist/DocTabsEditor-RCOWHX5J.css +0 -78
  266. package/dist/PresenterView-T2C6ZZ3N.css +0 -103
  267. package/dist/SandboxedFrame-L6HBQZCD.css +0 -50
  268. package/dist/chunk-CRKFL423.js +0 -74
  269. package/dist/chunk-MBNFJSZS.js +0 -107
  270. package/dist/chunk-RV7SZAHR.js +0 -105
  271. package/dist/chunk-UZ7ZUSLH.js +0 -179
  272. package/dist/utils/useMediaMatch.d.ts +0 -12
  273. /package/dist/{chunk-TF2P3OPS.js → chunk-2JJIN6JN.js} +0 -0
package/dist/styles.css CHANGED
@@ -1,6 +1,6 @@
1
- /* AccessDeniedCard-WXM5DBDZ.css */
2
- /* The card holds one empty state and nothing else, at a reading width, so a
3
- refusal in a wide viewer body reads as one sentence rather than a banner. */
1
+ /* AccessDeniedCard-QVNDMT46.css */
2
+ /* One empty state and nothing else, at a reading width, so a refusal in a
3
+ wide viewer body reads as one sentence rather than a banner. */
4
4
 
5
5
  .crewlet-access-denied-card {
6
6
  width: 100%;
@@ -548,7 +548,7 @@
548
548
  }
549
549
 
550
550
 
551
- /* AppShell-GCM4TDVY.css */
551
+ /* AppShell-JTSEOA57.css */
552
552
  /*
553
553
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
554
554
  * floats beside it.
@@ -1161,8 +1161,10 @@
1161
1161
  display: inline-flex;
1162
1162
  }
1163
1163
 
1164
+ /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
1165
+ line 4px left of the title and the controls over it. */
1164
1166
  .crewlet-app-shell__content {
1165
- padding: var(--spacing-4) var(--spacing-3) var(--spacing-9);
1167
+ padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
1166
1168
  }
1167
1169
  }
1168
1170
 
@@ -1727,7 +1729,7 @@ button.crewlet-account-row__who:focus-visible {
1727
1729
  }
1728
1730
 
1729
1731
 
1730
- /* ArrangeGroup-GY5YMP6E.css */
1732
+ /* ArrangeGroup-KRWWOJKR.css */
1731
1733
  /*
1732
1734
  * ArrangeGroup: a titled band of blocks. The hue is the header's; the body
1733
1735
  * stays the page's ground, so the cards inside keep their own contrast.
@@ -1886,6 +1888,49 @@ button.crewlet-account-row__who:focus-visible {
1886
1888
  pointer-events: none;
1887
1889
  }
1888
1890
 
1891
+ /*
1892
+ * THE SECTION VARIANT: a quiet header on the page's ground, over a hairline
1893
+ * in the group's hue (the default border with none), and the blocks
1894
+ * on the page's grid with no inset of their own. The name is a card title's
1895
+ * step and ink, the chevron the quiet ink, and the count its chip.
1896
+ */
1897
+ .crewlet-arrange-group--section {
1898
+ border: 0;
1899
+ border-radius: 0;
1900
+ background: none;
1901
+ overflow: visible;
1902
+ }
1903
+
1904
+ .crewlet-arrange-group--section .crewlet-arrange-group__head {
1905
+ min-height: 0;
1906
+ padding: 0 0 var(--spacing-2);
1907
+ border-bottom: 1px solid var(--crewlet-arrange-group-line);
1908
+ background: none;
1909
+ }
1910
+
1911
+ .crewlet-arrange-group--section.is-collapsed .crewlet-arrange-group__head {
1912
+ border-bottom-color: var(--crewlet-arrange-group-line);
1913
+ }
1914
+
1915
+ /* The chevron stands on the page's edge, its hover reaching past it. */
1916
+ .crewlet-arrange-group--section .crewlet-arrange-group__toggle {
1917
+ min-height: var(--size-control-sm);
1918
+ margin-inline-start: calc(var(--spacing-1) * -1);
1919
+ padding: 0 var(--spacing-1);
1920
+ color: var(--color-text-tertiary);
1921
+ }
1922
+
1923
+ .crewlet-arrange-group--section .crewlet-arrange-group__title {
1924
+ font-size: var(--font-size-sm);
1925
+ letter-spacing: var(--font-letter-spacing-normal);
1926
+ color: var(--color-text-primary);
1927
+ }
1928
+
1929
+ .crewlet-arrange-group--section .crewlet-arrange-group__body {
1930
+ min-height: 0;
1931
+ padding: var(--spacing-3) 0 0;
1932
+ }
1933
+
1889
1934
  @media (prefers-reduced-motion: reduce) {
1890
1935
  .crewlet-arrange-group__chevron,
1891
1936
  .crewlet-arrange-group__title-field {
@@ -1996,7 +2041,7 @@ button.crewlet-account-row__who:focus-visible {
1996
2041
  }
1997
2042
 
1998
2043
 
1999
- /* ArtifactBar-MLMJHWY6.css */
2044
+ /* ArtifactBar-C462VD4C.css */
2000
2045
  /*
2001
2046
  * One row, one hairline under it, the height of a large row. The lead (the
2002
2047
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2024,7 +2069,10 @@ button.crewlet-account-row__who:focus-visible {
2024
2069
  display: flex;
2025
2070
  align-items: center;
2026
2071
  gap: var(--spacing-3);
2027
- height: var(--size-row-lg);
2072
+ /* THE SHELL'S TOP BAR'S HEIGHT, its hairline included: the bar stands in
2073
+ its place, and at a row's height of its own the line under it jumped by
2074
+ three pixels between the gallery and the artifact opened from it. */
2075
+ height: calc(var(--size-shell-topbar) - 1px);
2028
2076
  padding: 0 var(--spacing-3);
2029
2077
  min-width: 0;
2030
2078
  }
@@ -2288,9 +2336,10 @@ button.crewlet-account-row__who:focus-visible {
2288
2336
  }
2289
2337
 
2290
2338
  @container crewlet-artifact-bar (width < 640px) {
2339
+ /* THE ROW KEEPS THE SHELL'S PHONE INSET, so the first glyph stands over
2340
+ the page's own gutter rather than eight pixels from the edge. */
2291
2341
  .crewlet-artifact-bar__row {
2292
2342
  gap: var(--spacing-1);
2293
- padding: 0 var(--spacing-2);
2294
2343
  }
2295
2344
 
2296
2345
  /* The title has the row's room before the kind's glyph does: the glyph
@@ -2324,7 +2373,8 @@ button.crewlet-account-row__who:focus-visible {
2324
2373
  height: var(--size-target-min);
2325
2374
  padding: 0 var(--spacing-2);
2326
2375
  border: 0;
2327
- border-radius: var(--radius-pill);
2376
+ /* A CONTROL'S CORNER, the one every bar control of its height takes. */
2377
+ border-radius: var(--radius-md);
2328
2378
  background: var(--color-surface-subtle);
2329
2379
  color: var(--color-text-secondary);
2330
2380
  font-family: var(--font-family-sans);
@@ -2364,14 +2414,21 @@ button.crewlet-account-row__who:focus-visible {
2364
2414
  }
2365
2415
 
2366
2416
 
2367
- /* ArtifactCard-EXVAEBV6.css */
2417
+ /* ArtifactCard-AS5Z4CVI.css */
2368
2418
  /*
2369
2419
  * A card in a gallery: the preview on top at a fixed ratio, so a grid of them
2370
2420
  * lines up whatever each preview is, then the title and up to three lines of
2371
2421
  * facts. `compact` is a row with the kind's glyph in place of the preview.
2372
2422
  */
2373
2423
 
2374
- .crewlet-artifact-card {
2424
+ /*
2425
+ * ON TOP OF CARD, so every rule that changes Card's own layout carries Card's
2426
+ * class too. The two sheets meet at equal weight and the bundle orders them
2427
+ * by file name, which puts this one first: `.crewlet-card` and
2428
+ * `.crewlet-card--p-none` then won, and the compact row was drawn as a
2429
+ * padless column with its glyph on a line of its own.
2430
+ */
2431
+ .crewlet-card.crewlet-artifact-card {
2375
2432
  display: flex;
2376
2433
  flex-direction: column;
2377
2434
  min-width: 0;
@@ -2380,7 +2437,7 @@ button.crewlet-account-row__who:focus-visible {
2380
2437
  text-decoration: none;
2381
2438
  }
2382
2439
 
2383
- .crewlet-artifact-card--compact {
2440
+ .crewlet-card.crewlet-artifact-card--compact {
2384
2441
  flex-direction: row;
2385
2442
  align-items: flex-start;
2386
2443
  gap: var(--spacing-3);
@@ -2462,6 +2519,14 @@ button.crewlet-account-row__who:focus-visible {
2462
2519
  min-width: 0;
2463
2520
  }
2464
2521
 
2522
+ /* THE FACTS OF ONE LINE ARE A RUN, "Sheet · OPS · v12", each after the first
2523
+ opened by a quiet dot, so two short words never read as one phrase. */
2524
+ .crewlet-artifact-card__line > * + *::before {
2525
+ content: '·';
2526
+ margin-inline-end: var(--spacing-2);
2527
+ color: var(--color-text-tertiary);
2528
+ }
2529
+
2465
2530
  .crewlet-artifact-card__owner,
2466
2531
  .crewlet-artifact-card__presence {
2467
2532
  display: inline-flex;
@@ -2546,7 +2611,7 @@ button.crewlet-account-row__who:focus-visible {
2546
2611
  }
2547
2612
 
2548
2613
 
2549
- /* ArtifactPanel-YFXT5O77.css */
2614
+ /* ArtifactPanel-HW3SU7CP.css */
2550
2615
  /*
2551
2616
  * The workspace is a row: the artifact's body, then at most one panel. The
2552
2617
  * body scrolls itself, so a panel beside it stays in view however far the
@@ -2577,7 +2642,9 @@ button.crewlet-account-row__who:focus-visible {
2577
2642
  }
2578
2643
 
2579
2644
  .crewlet-artifact-panel {
2580
- --crewlet-artifact-panel-width: 25rem;
2645
+ /* THE TEXT WIDTH, every panel of facts, a list or a form: three widths for
2646
+ those moved the artifact's edge 80px between Details and History. */
2647
+ --crewlet-artifact-panel-width: 22.5rem;
2581
2648
  display: flex;
2582
2649
  flex: none;
2583
2650
  flex-direction: column;
@@ -2587,10 +2654,6 @@ button.crewlet-account-row__who:focus-visible {
2587
2654
  background: var(--color-surface-background);
2588
2655
  }
2589
2656
 
2590
- .crewlet-artifact-panel--sm {
2591
- --crewlet-artifact-panel-width: 20rem;
2592
- }
2593
-
2594
2657
  .crewlet-artifact-panel--lg {
2595
2658
  --crewlet-artifact-panel-width: 36rem;
2596
2659
  }
@@ -2643,10 +2706,27 @@ button.crewlet-account-row__who:focus-visible {
2643
2706
  gap: var(--spacing-1);
2644
2707
  }
2645
2708
 
2709
+ /* THE BODY'S INSET IS PUBLISHED (--crewlet-artifact-panel-inset) for content
2710
+ that sticks to its scrollport: a sticky edge stops at the padding, so a
2711
+ foot with `bottom: 0` left a band under it that the content scrolled
2712
+ through; such a foot offsets itself by the inset to sit on the edge. */
2646
2713
  .crewlet-artifact-panel__body {
2714
+ /* THE PANEL'S OWN MEASURE, so what it holds folds to the panel's width
2715
+ rather than the window's; and its sections head at the panel title's
2716
+ step, a level under it and never louder than it. */
2717
+ container: crewlet-artifact-panel / inline-size;
2718
+ --crewlet-section-title-size: var(--font-size-sm);
2719
+ --crewlet-artifact-panel-inset: var(--spacing-4);
2720
+
2721
+ /* A COLUMN, so content that should fit the panel rather than scroll it
2722
+ can: a child that sets `min-height: 0` shrinks to the room the body has
2723
+ (a sheet's rows, whose grid then scrolls itself), and every other child
2724
+ keeps its content's height and scrolls the body as before. */
2725
+ display: flex;
2726
+ flex-direction: column;
2647
2727
  flex: 1 1 auto;
2648
2728
  min-height: 0;
2649
- padding: var(--spacing-4);
2729
+ padding: var(--crewlet-artifact-panel-inset);
2650
2730
  overflow: auto;
2651
2731
  overscroll-behavior: contain;
2652
2732
  }
@@ -2660,7 +2740,10 @@ button.crewlet-account-row__who:focus-visible {
2660
2740
  inset-inline-end: 0;
2661
2741
  z-index: var(--z-index-overlay);
2662
2742
  width: min(var(--crewlet-artifact-panel-width), 100%);
2663
- box-shadow: var(--shadow-lg);
2743
+ /* THE DRAWER'S LIFT, the shell's own rail drawer's: the large step falls
2744
+ below a box and left the panel's start edge reading as a cut through
2745
+ the artifact rather than a sheet over it. */
2746
+ box-shadow: var(--shadow-xl);
2664
2747
  }
2665
2748
 
2666
2749
  .crewlet-artifact-panel[data-expanded] {
@@ -4027,7 +4110,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4027
4110
  }
4028
4111
 
4029
4112
 
4030
- /* Callout-SXXK4B5R.css */
4113
+ /* Callout-ZAVG3P66.css */
4031
4114
  /*
4032
4115
  * The callout: a status that stays in the content flow.
4033
4116
  *
@@ -4052,8 +4135,15 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4052
4135
  */
4053
4136
  --crewlet-callout-line: transparent;
4054
4137
 
4055
- display: flex;
4056
- align-items: flex-start;
4138
+ /* THE GLYPH, THE TEXT, AND AN ACTION'S COLUMN only where there is one: the
4139
+ third track is implicit, so a callout without an action keeps no gap
4140
+ for it at its end. A grid rather than a row, so a narrow callout can put
4141
+ its action under the text, in the text's own column, whatever the glyph
4142
+ is. */
4143
+ display: grid;
4144
+ grid-template-columns: auto minmax(0, 1fr);
4145
+ grid-auto-columns: auto;
4146
+ align-items: start;
4057
4147
  gap: var(--spacing-2);
4058
4148
  /* The engine's own: a tight strip rather than a padded card. This sits
4059
4149
  above a screen or between two sections and takes a line or two of text,
@@ -4068,17 +4158,29 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4068
4158
  line-height: var(--font-line-height-normal);
4069
4159
  }
4070
4160
 
4161
+ /*
4162
+ * WITH AN ACTION, ONE LINE OF TEXT CENTRES ON THE BUTTON. The row is the
4163
+ * button's height and the text sat at its top, three pixels above the
4164
+ * button's label. The content is padded by half of what the control is
4165
+ * taller than a line, and the icon moved down with it, so a one-line callout
4166
+ * reads as one line and a longer one keeps its icon on its first line.
4167
+ */
4168
+ .crewlet-callout:has(> .crewlet-callout__action) {
4169
+ --crewlet-callout-lead: max(0px, calc((var(--size-control-sm) - 1lh) / 2));
4170
+ /* Measured by its own width, so the action can move under the text. */
4171
+ container: crewlet-callout / inline-size;
4172
+ }
4173
+
4071
4174
  .crewlet-callout__icon {
4072
4175
  display: inline-flex;
4073
- flex: none;
4074
4176
  /* On the first line's optical centre rather than its box top, which a 16px
4075
4177
  glyph beside a 13px line sits two pixels above. */
4076
- margin-top: 2px;
4178
+ margin-top: calc(2px + var(--crewlet-callout-lead, 0px));
4077
4179
  }
4078
4180
 
4079
4181
  .crewlet-callout__content {
4080
4182
  min-width: 0;
4081
- flex: 1;
4183
+ padding-block: var(--crewlet-callout-lead, 0px);
4082
4184
  }
4083
4185
 
4084
4186
  .crewlet-callout__title {
@@ -4089,10 +4191,31 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4089
4191
  }
4090
4192
 
4091
4193
  .crewlet-callout__action {
4092
- flex: none;
4194
+ grid-column: 3;
4195
+ grid-row: 1;
4093
4196
  align-self: center;
4094
4197
  }
4095
4198
 
4199
+ /*
4200
+ * A NARROW CALLOUT PUTS ITS ACTION UNDER THE TEXT, at the start of the text's
4201
+ * column, so the sentence keeps the callout's whole measure. Beside it, a
4202
+ * phone's width left the message a column of a word or two a line. The text
4203
+ * no longer centres on a button beside it, so it sits at its own top.
4204
+ */
4205
+ @container crewlet-callout (width < 28rem) {
4206
+ .crewlet-callout__icon,
4207
+ .crewlet-callout__content {
4208
+ --crewlet-callout-lead: 0px;
4209
+ }
4210
+
4211
+ .crewlet-callout__action {
4212
+ grid-column: 2;
4213
+ grid-row: 2;
4214
+ justify-self: start;
4215
+ align-self: start;
4216
+ }
4217
+ }
4218
+
4096
4219
  /*
4097
4220
  * Inline code inside a callout takes the callout's ink. A mono chip that kept
4098
4221
  * its own neutral ink inside a danger banner read as the one part of the
@@ -4143,7 +4266,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4143
4266
  }
4144
4267
 
4145
4268
 
4146
- /* Canvas-LRVNW7XN.css */
4269
+ /* Canvas-VUG2HLZK.css */
4147
4270
  /*
4148
4271
  * A bounded viewport (Canvas.tsx). It fills the box it is given and clips; the
4149
4272
  * page's own scroller is never involved.
@@ -4179,6 +4302,19 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4179
4302
  background-size: var(--spacing-5) var(--spacing-5);
4180
4303
  }
4181
4304
 
4305
+ /*
4306
+ * A GRID ON THE CONTENT'S PLANE (`ground="grid"`): the same dots, but pitched
4307
+ * and placed by the view (`gridOf`), so they pan and zoom with the content.
4308
+ * The dots themselves stay one screen pixel, as a design tool's do.
4309
+ */
4310
+ .crewlet-canvas[data-ground='grid'] {
4311
+ background-image: radial-gradient(var(--color-border-strong) 1px, transparent 1.2px);
4312
+ background-size:
4313
+ calc(var(--spacing-5) * var(--crewlet-canvas-grid-scale, 1))
4314
+ calc(var(--spacing-5) * var(--crewlet-canvas-grid-scale, 1));
4315
+ background-position: var(--crewlet-canvas-grid-x, 0) var(--crewlet-canvas-grid-y, 0);
4316
+ }
4317
+
4182
4318
  .crewlet-canvas__viewport {
4183
4319
  position: absolute;
4184
4320
  inset: 0;
@@ -4385,6 +4521,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4385
4521
  display: none;
4386
4522
  }
4387
4523
 
4524
+ /*
4525
+ * THE NOTE GROWS AWAY FROM THE CORNER. It comes and goes as the canvas's state
4526
+ * does, and drawn on the corner's side of the zoom bar it would push the bar
4527
+ * out from under a pointer on its way to it; so in a bottom corner it is drawn
4528
+ * above the bar, and the bar never moves.
4529
+ */
4530
+ .crewlet-canvas__controls:not([data-placement='top-right']) .crewlet-canvas__hint {
4531
+ order: -1;
4532
+ }
4533
+
4388
4534
  /*
4389
4535
  * THE ZOOM READOUT, between the two steppers. It says where the view stands,
4390
4536
  * which two chevrons never do, and it is the way to a number without pressing a
@@ -4510,7 +4656,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4510
4656
  }
4511
4657
 
4512
4658
 
4513
- /* CanvasBoard-MBZVBWDO.css */
4659
+ /* CanvasBoard-5NNSKY6A.css */
4514
4660
  /*
4515
4661
  * A canvas of artboards and notes (CanvasBoard.tsx). Boards and notes are laid
4516
4662
  * out in canvas pixels inside the canvas's world and scale with it; their
@@ -4518,7 +4664,12 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4518
4664
  * writes on the layer, so it stays one size on screen.
4519
4665
  */
4520
4666
 
4667
+ /*
4668
+ * A SIZE CONTAINER BY ITS WIDTH, so the palette can tell a canvas too narrow
4669
+ * to hold it beside the zoom bar on one line (see below).
4670
+ */
4521
4671
  .crewlet-canvas-board {
4672
+ container: crewlet-canvas-board / inline-size;
4522
4673
  height: 100%;
4523
4674
  min-height: 0;
4524
4675
  }
@@ -4540,6 +4691,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4540
4691
 
4541
4692
  /* ---- the tool palette, floating at the foot of the field ----------------- */
4542
4693
 
4694
+ /*
4695
+ * CENTRED AT THE FOOT, on the zoom bar's line: the two bars are one control
4696
+ * step tall and stand the same inset from the field's edge.
4697
+ */
4543
4698
  .crewlet-canvas-board__tools {
4544
4699
  position: absolute;
4545
4700
  bottom: var(--spacing-3);
@@ -4548,6 +4703,20 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4548
4703
  transform: translateX(-50%);
4549
4704
  }
4550
4705
 
4706
+ /*
4707
+ * A NARROW CANVAS (a phone, a split pane) has no room at its foot for the
4708
+ * palette between the zoom bar and the edge, so the palette moves to the top
4709
+ * left corner, which the zoom bar never takes.
4710
+ */
4711
+ @container crewlet-canvas-board (width < 36rem) {
4712
+ .crewlet-canvas-board__tools {
4713
+ top: var(--spacing-3);
4714
+ bottom: auto;
4715
+ left: var(--spacing-3);
4716
+ transform: none;
4717
+ }
4718
+ }
4719
+
4551
4720
  /* ---- a board ------------------------------------------------------------ */
4552
4721
 
4553
4722
  .crewlet-canvas-board__board {
@@ -4610,7 +4779,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4610
4779
  cursor: var(--crewlet-canvas-cursor-pointer, default);
4611
4780
  }
4612
4781
 
4613
- /* A board that is not running draws its title and size at screen size. */
4782
+ /* A board that is not running draws its size, and why, at screen size. */
4614
4783
  .crewlet-canvas-board__placeholder {
4615
4784
  position: absolute;
4616
4785
  inset: 0;
@@ -4624,25 +4793,59 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4624
4793
  text-align: center;
4625
4794
  }
4626
4795
 
4627
- /* ONE BLOCK, SCALED ONCE: its lines keep their spacing at screen size rather
4628
- than each line shrinking back into the space the zoom left it. */
4796
+ /*
4797
+ * ONE BLOCK, SCALED ONCE: its lines keep their spacing at screen size rather
4798
+ * than each line shrinking back into the space the zoom left it. It is held to
4799
+ * the board's width ON SCREEN (the board's own width times the zoom, less a
4800
+ * margin each side), so a line the component judged to fit never runs past
4801
+ * the board's edges into the boards beside it.
4802
+ */
4629
4803
  .crewlet-canvas-board__placeholder-text {
4630
4804
  display: flex;
4631
4805
  flex-direction: column;
4632
4806
  align-items: center;
4633
4807
  gap: var(--spacing-1);
4634
4808
  flex: none;
4809
+ box-sizing: border-box;
4810
+ max-width: calc(100% * var(--crewlet-canvas-board-zoom));
4811
+ padding-inline: var(--spacing-2);
4635
4812
  transform: scale(var(--crewlet-canvas-board-unzoom));
4636
4813
  }
4637
4814
 
4638
- .crewlet-canvas-board__placeholder-title {
4815
+ .crewlet-canvas-board__placeholder-text > * {
4816
+ max-width: 100%;
4817
+ overflow: hidden;
4818
+ text-overflow: ellipsis;
4819
+ white-space: nowrap;
4820
+ }
4821
+
4822
+ .crewlet-canvas-board__placeholder-size {
4639
4823
  color: var(--color-text-secondary);
4640
- font-size: var(--font-size-sm);
4641
4824
  font-weight: var(--font-weight-medium);
4825
+ font-variant-numeric: tabular-nums;
4642
4826
  }
4643
4827
 
4644
4828
  /* ---- chrome, at screen size --------------------------------------------- */
4645
4829
 
4830
+ /*
4831
+ * THE CHROME IS DRAWN OVER THE CONTENT, every board's and note's over every
4832
+ * board and note, as a design tool draws its frame names. It is counter-scaled
4833
+ * to one size on screen while the content shrinks with the zoom, so far out a
4834
+ * name reaches over the note or board above it; drawn in document order it
4835
+ * went under a note laid out after its board, and that note took every press
4836
+ * meant for the name and the open control.
4837
+ */
4838
+ .crewlet-canvas-board__chrome,
4839
+ .crewlet-canvas-board__note-tools,
4840
+ .crewlet-canvas-board__resize {
4841
+ z-index: 1;
4842
+ }
4843
+
4844
+ /*
4845
+ * ONE LINE OF TYPE TALL, whatever sits in it: the open control is centred on
4846
+ * the line and allowed past it, so a row of boards zoomed far out loses only
4847
+ * a title's height to the names above it rather than a button's.
4848
+ */
4646
4849
  .crewlet-canvas-board__chrome {
4647
4850
  position: absolute;
4648
4851
  bottom: 100%;
@@ -4652,11 +4855,42 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4652
4855
  gap: var(--spacing-1);
4653
4856
  box-sizing: border-box;
4654
4857
  width: calc(100% * var(--crewlet-canvas-board-zoom));
4858
+ height: calc(var(--font-size-xs) * var(--font-line-height-normal) + var(--spacing-1));
4655
4859
  padding-bottom: var(--spacing-1);
4656
4860
  transform: scale(var(--crewlet-canvas-board-unzoom));
4657
4861
  transform-origin: bottom left;
4658
4862
  }
4659
4863
 
4864
+ /* A board drawn too narrow to name goes unnamed (`boardRoom`). */
4865
+ .crewlet-canvas-board__board[data-untitled] > .crewlet-canvas-board__chrome {
4866
+ display: none;
4867
+ }
4868
+
4869
+ .crewlet-canvas-board__open {
4870
+ flex: none;
4871
+ }
4872
+
4873
+ /*
4874
+ * THE OPEN CONTROL IS THE BOARD'S, NOT THE CANVAS'S: where a pointer can
4875
+ * hover, it is drawn on the board under it, the selected board and the
4876
+ * control that has focus, so a canvas at rest shows its names and nothing
4877
+ * else. A touch screen has no hover to find it by, so it is always drawn
4878
+ * there.
4879
+ */
4880
+ @media (hover: hover) {
4881
+ /*
4882
+ * HIDDEN, IT TAKES NO ROOM: out of the row rather than only transparent, so
4883
+ * a narrow board's name has the whole width to itself at rest instead of
4884
+ * being cut to its first letter beside an empty slot. It still takes focus,
4885
+ * and is put back in the row when it has it.
4886
+ */
4887
+ .crewlet-canvas-board__board:not(:hover, [data-selected]) .crewlet-canvas-board__open:not(:focus-visible) {
4888
+ position: absolute;
4889
+ opacity: 0;
4890
+ pointer-events: none;
4891
+ }
4892
+ }
4893
+
4660
4894
  /* The board's name: small, quiet, and the accent once its board is picked out. */
4661
4895
  .crewlet-canvas-board__title {
4662
4896
  min-width: 0;
@@ -4664,6 +4898,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4664
4898
  color: var(--color-text-tertiary);
4665
4899
  font-size: var(--font-size-xs);
4666
4900
  font-weight: var(--font-weight-medium);
4901
+ line-height: var(--font-line-height-normal);
4667
4902
  text-overflow: ellipsis;
4668
4903
  white-space: nowrap;
4669
4904
  cursor: var(--crewlet-canvas-cursor-pointer, default);
@@ -4679,7 +4914,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4679
4914
  margin: 0;
4680
4915
  padding: var(--spacing-1) var(--spacing-2);
4681
4916
  border: 1px solid transparent;
4682
- border-radius: var(--radius-sm);
4917
+ border-radius: var(--radius-md);
4683
4918
  background: transparent;
4684
4919
  font: inherit;
4685
4920
  cursor: var(--crewlet-canvas-cursor-pointer, default);
@@ -4691,6 +4926,21 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4691
4926
  border-color: var(--color-border-default);
4692
4927
  }
4693
4928
 
4929
+ /*
4930
+ * A NAME THAT IS ALSO A MOVE HANDLE keeps the name's type and its place: the
4931
+ * handle's padding and edge are taken back by a margin the same size, so the
4932
+ * letters stay on the board's left edge and the title's line, and only the
4933
+ * hover's box reaches past them.
4934
+ */
4935
+ .crewlet-canvas-board__title.crewlet-canvas-board__handle {
4936
+ flex: 0 1 auto;
4937
+ margin-block: calc(-1 * (var(--spacing-1) + 1px));
4938
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 1px));
4939
+ font-size: var(--font-size-xs);
4940
+ font-weight: var(--font-weight-medium);
4941
+ line-height: var(--font-line-height-normal);
4942
+ }
4943
+
4694
4944
  /* Both handles draw an edge of their own, so the ring sits over it. */
4695
4945
  .crewlet-canvas-board__handle:focus-visible,
4696
4946
  .crewlet-canvas-board__resize:focus-visible {
@@ -4846,6 +5096,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4846
5096
  transform-origin: bottom left;
4847
5097
  }
4848
5098
 
5099
+ /*
5100
+ * A NOTE'S TOOLS ARE THE NOTE'S, as a board's open control is the board's:
5101
+ * where a pointer can hover they are drawn on the note under it, the selected
5102
+ * note and the note holding focus, rather than over every note at once.
5103
+ */
5104
+ @media (hover: hover) {
5105
+ .crewlet-canvas-board__note-tools {
5106
+ opacity: 0;
5107
+ }
5108
+
5109
+ .crewlet-canvas-board__note:hover .crewlet-canvas-board__note-tools,
5110
+ .crewlet-canvas-board__note[data-selected] .crewlet-canvas-board__note-tools,
5111
+ .crewlet-canvas-board__note:focus-within .crewlet-canvas-board__note-tools {
5112
+ opacity: 1;
5113
+ }
5114
+ }
5115
+
4849
5116
  .crewlet-canvas-board__note-move {
4850
5117
  width: var(--spacing-6);
4851
5118
  height: var(--spacing-6);
@@ -4893,9 +5160,11 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4893
5160
  }
4894
5161
 
4895
5162
 
4896
- /* CanvasToolbar-AE5MXH7T.css */
5163
+ /* CanvasToolbar-EM5EVZED.css */
4897
5164
  /*
4898
- * A canvas's tool palette (CanvasToolbar.tsx): the zoom bar's glass surface,
5165
+ * A canvas's tool palette (CanvasToolbar.tsx): the zoom bar's glass surface
5166
+ * and its control step (the small one, which every toolbar and panel control
5167
+ * takes), so the two bars stand the same height on the field's foot,
4899
5168
  * with the tool in hand drawn SOLID in the accent rather than the soft tint a
4900
5169
  * toggle takes elsewhere, because it is the one fact about the palette a
4901
5170
  * reader checks from across the field before every press.
@@ -4910,7 +5179,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
4910
5179
  backdrop-filter: blur(var(--blur-sm));
4911
5180
  border: 1px solid var(--color-border-default);
4912
5181
  border-radius: var(--radius-md);
4913
- box-shadow: var(--shadow-sm);
5182
+ box-shadow: var(--shadow-xs);
4914
5183
  }
4915
5184
 
4916
5185
  .crewlet-canvas-toolbar .crewlet-icon-btn {
@@ -5462,7 +5731,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5462
5731
  }
5463
5732
 
5464
5733
 
5465
- /* Charts-RY4JN5FC.css */
5734
+ /* Charts-MBJG72BS.css */
5466
5735
  /* The chart kit: a legend, a ranked bar list, a stacked bar, stacked
5467
5736
  columns, an activity strip, a time series and the reading layer they share. Hand-drawn rather than a charting library, for one reason that
5468
5737
  decides it: every mark here reads tokens, in two themes, at the contrast
@@ -5504,6 +5773,12 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5504
5773
  background: var(--crewlet-legend-swatch-color, var(--color-data-other));
5505
5774
  }
5506
5775
 
5776
+ .crewlet-legend__swatch--line {
5777
+ width: 12px;
5778
+ height: 2px;
5779
+ border-radius: calc(var(--radius-xs) / 4);
5780
+ }
5781
+
5507
5782
  .crewlet-legend__label {
5508
5783
  overflow: hidden;
5509
5784
  text-overflow: ellipsis;
@@ -5622,7 +5897,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5622
5897
  */
5623
5898
  .crewlet-bar-list__sub,
5624
5899
  .crewlet-bar-list__more,
5625
- .crewlet-bar-list__empty {
5900
+ .crewlet-chart-empty {
5626
5901
  font-size: var(--font-size-xs);
5627
5902
  color: var(--color-text-tertiary);
5628
5903
  }
@@ -5639,9 +5914,22 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5639
5914
  * A card draws its own content in a body now, so a padding here is the panel's
5640
5915
  * inset a second time.
5641
5916
  */
5642
- .crewlet-bar-list__empty {
5917
+ .crewlet-chart-empty {
5918
+ box-sizing: border-box;
5919
+ display: flex;
5920
+ align-items: center;
5921
+ justify-content: center;
5922
+ height: 100%;
5643
5923
  margin: 0;
5644
5924
  padding: 0;
5925
+ line-height: var(--font-line-height-normal);
5926
+ text-align: center;
5927
+ }
5928
+
5929
+ .crewlet-chart-empty--start {
5930
+ display: block;
5931
+ height: auto;
5932
+ text-align: start;
5645
5933
  }
5646
5934
 
5647
5935
  .crewlet-bar-list__sub {
@@ -5868,6 +6156,8 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5868
6156
  row-gap: var(--spacing-1);
5869
6157
  margin: 0;
5870
6158
  min-width: 0;
6159
+ /* Measured by its own width, for the dates under the plot. */
6160
+ container: crewlet-stacked-columns / inline-size;
5871
6161
  }
5872
6162
 
5873
6163
  /*
@@ -5892,12 +6182,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5892
6182
  align-items: flex-end;
5893
6183
  }
5894
6184
 
6185
+ /*
6186
+ * The scale's words are set as the dates under the plot are, the sans at the
6187
+ * caption step with tabular figures, so the two axes of one chart read as one
6188
+ * scale. They were the mono at the step below, beside dates in the sans.
6189
+ */
5895
6190
  .crewlet-stacked-columns__tick {
5896
6191
  display: flex;
5897
6192
  align-items: center;
5898
6193
  height: 0;
5899
- font-family: var(--font-family-mono);
5900
- font-size: var(--font-size-2xs);
6194
+ font-size: var(--font-size-xs);
5901
6195
  line-height: var(--font-line-height-tight);
5902
6196
  color: var(--color-text-tertiary);
5903
6197
  font-variant-numeric: tabular-nums;
@@ -5912,7 +6206,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5912
6206
  * keeps that half line above the plot itself.
5913
6207
  */
5914
6208
  .crewlet-stacked-columns--headless {
5915
- padding-block-start: calc(var(--font-size-2xs) * var(--font-line-height-tight) / 2);
6209
+ padding-block-start: calc(var(--font-size-xs) * var(--font-line-height-tight) / 2);
5916
6210
  }
5917
6211
 
5918
6212
  .crewlet-stacked-columns__plot {
@@ -5962,14 +6256,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5962
6256
  /*
5963
6257
  * THE COLUMN IS ITS TOTAL'S HEIGHT (a style property), and its parts share it
5964
6258
  * by value, first series at the baseline. They stand 2px apart for the reason
5965
- * a stacked bar's do, and the gap comes out of the parts.
6259
+ * a stacked bar's do, and the gap comes out of the parts. It stands on the
6260
+ * zero line (a style property), centred in its slot; the column of a
6261
+ * bucket's negative parts hangs from the same line, first series nearest it.
5966
6262
  */
5967
6263
  .crewlet-stacked-columns__column {
6264
+ position: absolute;
6265
+ inset-inline-start: 50%;
5968
6266
  display: flex;
5969
6267
  flex-direction: column-reverse;
5970
6268
  gap: 2px;
5971
6269
  width: 63%;
5972
- max-width: var(--spacing-7);
6270
+ max-width: var(--spacing-6);
6271
+ transform: translateX(-50%);
6272
+ }
6273
+
6274
+ .crewlet-stacked-columns__column--below {
6275
+ flex-direction: column;
5973
6276
  }
5974
6277
 
5975
6278
  .crewlet-stacked-columns__segment {
@@ -5981,13 +6284,19 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5981
6284
  background: var(--crewlet-stacked-columns-segment-color, var(--color-data-other));
5982
6285
  }
5983
6286
 
5984
- /* The VALUE END: the top of the topmost part, rounded at the smallest step.
5985
- The foot stays square on the baseline every column shares. */
5986
- .crewlet-stacked-columns__segment:last-child {
6287
+ /* The VALUE END: the top of the topmost part, rounded at the smallest step
6288
+ (the foot of the lowest one, below zero). The end on the zero line stays
6289
+ square, where every column starts. */
6290
+ .crewlet-stacked-columns__column:not(.crewlet-stacked-columns__column--below) > .crewlet-stacked-columns__segment:last-child {
5987
6291
  border-top-left-radius: var(--radius-xs);
5988
6292
  border-top-right-radius: var(--radius-xs);
5989
6293
  }
5990
6294
 
6295
+ .crewlet-stacked-columns__column--below > .crewlet-stacked-columns__segment:last-child {
6296
+ border-bottom-left-radius: var(--radius-xs);
6297
+ border-bottom-right-radius: var(--radius-xs);
6298
+ }
6299
+
5991
6300
  .crewlet-stacked-columns__scale {
5992
6301
  position: relative;
5993
6302
  grid-column: 2;
@@ -6039,7 +6348,9 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6039
6348
  margin-top: var(--spacing-2);
6040
6349
  }
6041
6350
 
6042
- /* The middle label stands on the column it names (a style property). */
6351
+ /* The middle label stands on the column it names (a style property). On a
6352
+ chart too narrow for three dates it leaves the line to the two ends, which
6353
+ it ran into; the tooltip reads every column's date. */
6043
6354
  .crewlet-stacked-columns__middle {
6044
6355
  position: absolute;
6045
6356
  top: 0;
@@ -6047,6 +6358,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6047
6358
  white-space: nowrap;
6048
6359
  }
6049
6360
 
6361
+ .crewlet-stacked-columns__scale > span {
6362
+ white-space: nowrap;
6363
+ }
6364
+
6365
+ @container crewlet-stacked-columns (width < 22rem) {
6366
+ .crewlet-stacked-columns__middle {
6367
+ display: none;
6368
+ }
6369
+ }
6370
+
6050
6371
  /* ─── The reading layer: a focusable plot and its tooltip ─────── */
6051
6372
 
6052
6373
  /*
@@ -6146,13 +6467,18 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6146
6467
  background: var(--crewlet-chart-tooltip-swatch-color, var(--color-data-other));
6147
6468
  }
6148
6469
 
6470
+ /* A name too long for the box ends in an ellipsis before its value: it ran
6471
+ under the number ("lifec1,397 USD"). The value is never cut. */
6149
6472
  .crewlet-chart-tooltip__name {
6150
6473
  flex: 1;
6151
6474
  min-width: 0;
6475
+ overflow: hidden;
6476
+ text-overflow: ellipsis;
6152
6477
  color: var(--color-text-secondary);
6153
6478
  }
6154
6479
 
6155
6480
  .crewlet-chart-tooltip__value {
6481
+ flex: none;
6156
6482
  color: var(--color-text-primary);
6157
6483
  font-variant-numeric: tabular-nums;
6158
6484
  }
@@ -6175,9 +6501,14 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6175
6501
  width: 100%;
6176
6502
  }
6177
6503
 
6504
+ /*
6505
+ * A cell shares the strip's width with the others, up to a column's width,
6506
+ * so a strip of one day is one mark rather than a slab across the figure.
6507
+ */
6178
6508
  .crewlet-activity-strip__cell {
6179
6509
  flex: 1;
6180
6510
  min-width: var(--crewlet-activity-strip-cell-min-width, 2px);
6511
+ max-width: var(--crewlet-activity-strip-cell-max-width, var(--spacing-6));
6181
6512
  height: var(--crewlet-activity-strip-fill, 10%);
6182
6513
  /*
6183
6514
  * A quarter of the smallest step. A cell is two pixels wide, so at the step
@@ -6195,6 +6526,12 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6195
6526
  background: var(--color-data-1);
6196
6527
  }
6197
6528
 
6529
+ /* The cell being read lifts, as a column being read does, by the hover step
6530
+ behind it rather than by a second colour. */
6531
+ .crewlet-activity-strip__cell.is-read {
6532
+ box-shadow: 0 0 0 2px var(--color-surface-hover);
6533
+ }
6534
+
6198
6535
  /* ─── Time series, and the sparkline beside a number ──────────── */
6199
6536
 
6200
6537
  /*
@@ -6221,14 +6558,16 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6221
6558
  }
6222
6559
 
6223
6560
  /*
6224
- * The grid is DASHED, which is what keeps three horizontal lines from reading
6225
- * as three series. They carry no values of their own: the peak under the plot
6226
- * is the scale, and a chart this size cannot label four gridlines legibly.
6561
+ * The grid is a SOLID HAIRLINE in the default border, the ink the column
6562
+ * chart's grid is drawn in. It was dashed, so that three lines would
6563
+ * not read as three series, but a one pixel rule in a border ink beside a two
6564
+ * pixel line in a data hue reads as neither, and a dash is how a chart says
6565
+ * "projection" or "threshold". The lines carry no values of their own: the
6566
+ * peak under the plot is the scale.
6227
6567
  */
6228
6568
  .crewlet-chart__grid-line {
6229
6569
  stroke: var(--color-border-default);
6230
6570
  stroke-width: 1;
6231
- stroke-dasharray: 2 4;
6232
6571
  }
6233
6572
 
6234
6573
  /*
@@ -6253,7 +6592,34 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6253
6592
  pointer-events: none;
6254
6593
  }
6255
6594
 
6256
- /* The window's two ends and its peak, under the plot: the scale, as words. */
6595
+ /*
6596
+ * A POINT: a disc 8px across in its series' hue, cut out of the ground by a
6597
+ * 2px ring of the card (`--crewlet-spark-ground`, as a sparkline's point is),
6598
+ * centred on its value. It stands over the plot rather than in it, so it stays
6599
+ * round at every width, and is drawn for a series of one point and for every
6600
+ * series at the instant being read.
6601
+ */
6602
+ .crewlet-time-series__dot {
6603
+ position: absolute;
6604
+ width: 8px;
6605
+ height: 8px;
6606
+ border-radius: 50%;
6607
+ background: var(--crewlet-time-series-dot-color, var(--color-data-other));
6608
+ box-shadow: 0 0 0 2px var(--crewlet-spark-ground, var(--color-surface-subtle));
6609
+ transform: translate(-50%, -50%);
6610
+ pointer-events: none;
6611
+ }
6612
+
6613
+ /*
6614
+ * The window's two ends and its peak, under the plot: the scale, as words.
6615
+ * The ends hold their words whole and the range between them gives way, so a
6616
+ * narrow chart never runs one into another; under 18rem the range leaves the
6617
+ * line to the tooltip and the summary, which carry it too.
6618
+ */
6619
+ .crewlet-time-series {
6620
+ container: crewlet-time-series / inline-size;
6621
+ }
6622
+
6257
6623
  .crewlet-time-series__scale {
6258
6624
  display: flex;
6259
6625
  justify-content: space-between;
@@ -6264,6 +6630,33 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6264
6630
  font-variant-numeric: tabular-nums;
6265
6631
  }
6266
6632
 
6633
+ .crewlet-time-series__scale > span {
6634
+ flex: none;
6635
+ white-space: nowrap;
6636
+ }
6637
+
6638
+ /* A window of one instant is drawn at the plot's middle, and so is its date. */
6639
+ .crewlet-time-series__scale--instant {
6640
+ justify-content: center;
6641
+ }
6642
+
6643
+ .crewlet-time-series__scale > .crewlet-time-series__range {
6644
+ flex: 0 1 auto;
6645
+ min-width: 0;
6646
+ overflow: hidden;
6647
+ text-overflow: ellipsis;
6648
+ }
6649
+
6650
+ @container crewlet-time-series (width < 18rem) {
6651
+ .crewlet-time-series__range {
6652
+ display: none;
6653
+ }
6654
+ }
6655
+
6656
+ .crewlet-time-series__legend {
6657
+ margin-top: var(--spacing-2);
6658
+ }
6659
+
6267
6660
  /*
6268
6661
  * THE SPARKLINE: the plot stretched to the box, and, with `current`, one
6269
6662
  * accent point on the last value.
@@ -6321,7 +6714,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6321
6714
  }
6322
6715
 
6323
6716
 
6324
- /* Checkbox-5UORUG3F.css */
6717
+ /* Checkbox-ALWG3WV2.css */
6325
6718
  /*
6326
6719
  * Checkbox: a box, its label and its consequence as one target.
6327
6720
  *
@@ -6432,6 +6825,17 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6432
6825
  .crewlet-checkbox--sm {
6433
6826
  --crewlet-checkbox-size: 14px;
6434
6827
 
6828
+ /*
6829
+ * ITS LINE IS CENTRED IN THE ROW. The row's floor was a minimum height with
6830
+ * the label at its top, so in a form row of small inputs (whose text sits
6831
+ * on their middle) the box and its label stood 5px above the line every
6832
+ * other control's text was on. The floor is made of equal padding round
6833
+ * the first line instead: one line comes out exactly the row's height with
6834
+ * the text on its middle, and a longer label grows the row downwards with
6835
+ * the box still on its first line.
6836
+ */
6837
+ min-height: 0;
6838
+ padding-block: calc((var(--size-row-sm) - var(--font-line-height-snug) * 1em) / 2);
6435
6839
  font-size: var(--font-size-compact);
6436
6840
  }
6437
6841
 
@@ -6991,7 +7395,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6991
7395
  }
6992
7396
 
6993
7397
 
6994
- /* CommandPalette-HBTNKHZQ.css */
7398
+ /* CommandPalette-7CFGVBND.css */
6995
7399
  /*
6996
7400
  * The command palette: a field, an optional row of scopes, one scroller
6997
7401
  * holding the lead and the list, and a key legend.
@@ -7141,7 +7545,11 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7141
7545
  background: var(--color-surface-background);
7142
7546
  }
7143
7547
 
7548
+ /* THE LEGEND SPANS THE BAND: a palette's foot has no actions, so its start
7549
+ slot takes the whole width, and a consumer that ends the legend with what
7550
+ the search is doing can push that to the band's end. */
7144
7551
  .crewlet-palette .crewlet-modal__footer-start {
7552
+ flex: 1 1 auto;
7145
7553
  gap: var(--spacing-4);
7146
7554
  font-size: var(--font-size-xs);
7147
7555
  }
@@ -7520,7 +7928,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7520
7928
  }
7521
7929
 
7522
7930
 
7523
- /* Container-3TSKMGNI.css */
7931
+ /* Container-34BAKG7B.css */
7524
7932
  /*
7525
7933
  * Container, the centred content measure. One max-width scale shared by every
7526
7934
  * surface, so pages line up regardless of who composed them.
@@ -7568,9 +7976,11 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7568
7976
  max-width: none;
7569
7977
  }
7570
7978
 
7979
+ /* A PHONE'S GUTTER IS THE SHELL'S, 16px, the top bar's own inset: a narrower
7980
+ one stood a page's content left of the title over it. */
7571
7981
  @media (max-width: 480px) {
7572
7982
  .crewlet-container {
7573
- padding-inline: var(--spacing-3);
7983
+ padding-inline: var(--spacing-4);
7574
7984
  }
7575
7985
  }
7576
7986
 
@@ -7790,7 +8200,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7790
8200
  }
7791
8201
 
7792
8202
 
7793
- /* DashboardCover-RMINBODB.css */
8203
+ /* DashboardCover-KYGYMRKW.css */
7794
8204
  /*
7795
8205
  * DashboardCover: a dashboard's cover at a gallery card's preview size (16:9,
7796
8206
  * about 280 by 158 pixels at its smallest). Up to three headline figures, or a
@@ -7804,23 +8214,27 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7804
8214
  color: var(--color-text-tertiary);
7805
8215
  }
7806
8216
 
8217
+ /*
8218
+ * THE FIGURES ARE ROWS, the label at the start and the figure (or the dataset
8219
+ * it cites) at the end. Three tiles side by side gave each label a third of a
8220
+ * card's width, so every one was cut to its first word ("Open w…" over "Open
8221
+ * w…"); a row gives the label the card's width, which is what says what the
8222
+ * board measures.
8223
+ */
7807
8224
  .crewlet-dashboard-cover--stats {
7808
8225
  display: grid;
7809
- grid-auto-columns: minmax(0, 1fr);
7810
- grid-auto-flow: column;
7811
- align-items: center;
8226
+ grid-auto-rows: minmax(0, 1fr);
7812
8227
  gap: var(--spacing-2);
7813
8228
  }
7814
8229
 
7815
8230
  .crewlet-dashboard-cover__stat {
7816
8231
  display: flex;
7817
- flex-direction: column;
7818
- justify-content: center;
7819
- gap: var(--spacing-1);
8232
+ align-items: center;
8233
+ justify-content: space-between;
8234
+ gap: var(--spacing-3);
7820
8235
  min-width: 0;
7821
- height: 100%;
7822
- max-height: 100%;
7823
- padding: var(--spacing-2) var(--spacing-3);
8236
+ min-height: 0;
8237
+ padding: 0 var(--spacing-3);
7824
8238
  border: 1px solid var(--color-border-default);
7825
8239
  border-radius: var(--radius-md);
7826
8240
  background: var(--color-surface-elevated);
@@ -7835,6 +8249,33 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7835
8249
  white-space: nowrap;
7836
8250
  }
7837
8251
 
8252
+ .crewlet-dashboard-cover__label {
8253
+ flex: 1 1 auto;
8254
+ min-width: 0;
8255
+ color: var(--color-text-secondary);
8256
+ }
8257
+
8258
+ .crewlet-dashboard-cover__value {
8259
+ flex: none;
8260
+ max-width: 50%;
8261
+ overflow: hidden;
8262
+ color: var(--color-text-primary);
8263
+ font-size: var(--font-size-lg);
8264
+ font-variant-numeric: tabular-nums;
8265
+ font-weight: var(--font-weight-semibold);
8266
+ line-height: var(--font-line-height-tight);
8267
+ text-overflow: ellipsis;
8268
+ white-space: nowrap;
8269
+ }
8270
+
8271
+ .crewlet-dashboard-cover__source {
8272
+ overflow: hidden;
8273
+ font-size: var(--font-size-xs);
8274
+ line-height: var(--font-line-height-snug);
8275
+ text-overflow: ellipsis;
8276
+ white-space: nowrap;
8277
+ }
8278
+
7838
8279
  .crewlet-dashboard-cover__label {
7839
8280
  color: var(--color-text-secondary);
7840
8281
  }
@@ -7851,6 +8292,8 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7851
8292
  }
7852
8293
 
7853
8294
  .crewlet-dashboard-cover__source {
8295
+ flex: 0 1 auto;
8296
+ max-width: 50%;
7854
8297
  color: var(--color-text-tertiary);
7855
8298
  }
7856
8299
 
@@ -7936,7 +8379,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7936
8379
  }
7937
8380
 
7938
8381
 
7939
- /* DataTable-WZK3V62B.css */
8382
+ /* DataTable-NL2YWAIA.css */
7940
8383
  /* ─────────────────────────────────────────────────────────────────
7941
8384
  * Default variant.
7942
8385
  *
@@ -8486,6 +8929,9 @@ body.crewlet-data-table-resizing {
8486
8929
  */
8487
8930
  --crewlet-data-table-cell-pad-y: calc((var(--spacing-2) + var(--spacing-3)) / 2);
8488
8931
  --crewlet-data-table-cell-pad-x: var(--spacing-3);
8932
+ /* The row's height, the list row token unless a host's list keeps another
8933
+ rhythm (and rebinds the cell's vertical inset to fit inside it). */
8934
+ --crewlet-data-table-row-height: var(--size-row-md);
8489
8935
  /* The header's own vertical inset. It equals the cell's at this density and
8490
8936
  parts from it at comfortable, which is where 0.2.0 drew the two apart. */
8491
8937
  --crewlet-data-table-head-pad-y: var(--crewlet-data-table-cell-pad-y);
@@ -8903,7 +9349,7 @@ body.crewlet-data-table-resizing {
8903
9349
  .crewlet-data-table--compact .crewlet-data-table__table td {
8904
9350
  /* The row token, so a compact table lines up with every other list in a
8905
9351
  product and a cell holding one word is as tall as a cell holding a chip. */
8906
- height: var(--size-row-md);
9352
+ height: var(--crewlet-data-table-row-height);
8907
9353
  }
8908
9354
 
8909
9355
  /*
@@ -11260,88 +11706,199 @@ svg.crewlet-datetime__chevron {
11260
11706
  }
11261
11707
 
11262
11708
 
11263
- /* DocTabsEditor-RCOWHX5J.css */
11709
+ /* DocTabsEditor-4M452LNS.css */
11264
11710
  /*
11265
- * DocTabsEditor: a document's tabs as rows an editor titles, opens, moves and
11266
- * removes, with the row whose text is open marked, and a field to add one.
11267
- * The rows are quiet inset bands, as ArrangeList's are.
11711
+ * DocTabsEditor: a document's tabs as the rows of a list, set in the register
11712
+ * of the outline a reader sees in the same column. A row is its title, the
11713
+ * open one filled as an inbox's open row is; its handle and its menu wait at
11714
+ * its edges and show under the pointer or the keyboard, so six tabs read as
11715
+ * six titles.
11268
11716
  */
11269
11717
 
11270
11718
  .crewlet-doc-tabs-editor {
11271
11719
  display: flex;
11272
11720
  flex-direction: column;
11273
- gap: var(--spacing-2);
11721
+ gap: var(--spacing-1);
11274
11722
  min-width: 0;
11275
11723
  }
11276
11724
 
11277
- .crewlet-doc-tabs-editor__list {
11278
- display: flex;
11279
- flex-direction: column;
11280
- gap: var(--spacing-1);
11281
- margin: 0;
11282
- padding: 0;
11283
- list-style: none;
11725
+ /* The list's name in the outline's register, with Add at its end. */
11726
+ .crewlet-doc-tabs-editor__head {
11727
+ display: flex;
11728
+ align-items: center;
11729
+ justify-content: space-between;
11730
+ gap: var(--spacing-2);
11731
+ min-height: var(--size-control-sm);
11732
+ }
11733
+
11734
+ .crewlet-doc-tabs-editor__heading {
11735
+ margin: 0;
11736
+ font-family: var(--font-family-sans);
11737
+ font-size: var(--font-size-xs);
11738
+ font-weight: var(--font-weight-medium);
11739
+ line-height: var(--font-line-height-tight);
11740
+ color: var(--color-text-tertiary);
11741
+ }
11742
+
11743
+ .crewlet-doc-tabs-editor__list {
11744
+ display: flex;
11745
+ flex-direction: column;
11746
+ gap: calc(var(--spacing-1) / 2);
11747
+ margin: 0;
11748
+ padding: 0;
11749
+ list-style: none;
11750
+ }
11751
+
11752
+ /*
11753
+ * A ROW IS THREE TRACKS that every row shares: the handle, the title and the
11754
+ * menu. The title's column starts at one edge all the way down, and a title
11755
+ * wraps rather than being cut, since a tab cut to fit is one an editor
11756
+ * cannot tell from its neighbour.
11757
+ */
11758
+ .crewlet-doc-tabs-editor__item {
11759
+ display: grid;
11760
+ grid-template-columns: var(--size-control-sm) minmax(0, 1fr) var(--size-control-sm);
11761
+ align-items: start;
11762
+ gap: calc(var(--spacing-1) / 2);
11763
+ padding: calc(var(--spacing-1) / 2);
11764
+ border-radius: var(--radius-md);
11765
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
11766
+ }
11767
+
11768
+ .crewlet-doc-tabs-editor__item:hover {
11769
+ background: var(--color-surface-hover);
11770
+ }
11771
+
11772
+ .crewlet-doc-tabs-editor__item.is-open,
11773
+ .crewlet-doc-tabs-editor__item.is-open:hover {
11774
+ background: var(--color-surface-pressed);
11284
11775
  }
11285
11776
 
11286
- .crewlet-doc-tabs-editor__item {
11287
- display: flex;
11288
- align-items: flex-start;
11289
- gap: var(--spacing-1);
11290
- padding: var(--spacing-1);
11291
- border: 1px solid transparent;
11292
- border-radius: var(--radius-md);
11293
- background: var(--color-surface-subtle);
11777
+ /* A row being renamed is its field: the fill would sit around a second box. */
11778
+ .crewlet-doc-tabs-editor__item.is-renaming,
11779
+ .crewlet-doc-tabs-editor__item.is-renaming:hover {
11780
+ background: none;
11294
11781
  }
11295
11782
 
11296
- .crewlet-doc-tabs-editor__item.is-open {
11297
- border-color: var(--color-border-strong);
11783
+ /* The new tab's field stands where its title will, in the title's track. */
11784
+ .crewlet-doc-tabs-editor__item--new > .crewlet-doc-tabs-editor__field {
11785
+ grid-column: 2;
11298
11786
  }
11299
11787
 
11300
11788
  .crewlet-doc-tabs-editor__item[data-reorder='dragging'] {
11301
- border-style: dashed;
11302
- border-color: var(--color-border-strong);
11789
+ outline: 1px dashed var(--color-border-strong);
11790
+ outline-offset: -1px;
11303
11791
  background: transparent;
11304
11792
  }
11793
+
11305
11794
  .crewlet-doc-tabs-editor__item[data-reorder='dragging'] > * {
11306
11795
  opacity: 0.4;
11307
11796
  }
11308
11797
 
11309
11798
  .crewlet-doc-tabs-editor__handle {
11310
- flex-shrink: 0;
11311
11799
  cursor: grab;
11312
11800
  color: var(--color-text-tertiary);
11313
11801
  }
11802
+
11314
11803
  .crewlet-doc-tabs-editor__handle:active {
11315
11804
  cursor: grabbing;
11316
11805
  }
11317
11806
 
11318
11807
  .crewlet-doc-tabs-editor__field {
11319
11808
  display: flex;
11320
- flex: 1 1 12rem;
11321
11809
  flex-direction: column;
11322
- gap: var(--spacing-1);
11810
+ gap: calc(var(--spacing-1) / 2);
11323
11811
  min-width: 0;
11324
11812
  }
11325
11813
 
11814
+ /*
11815
+ * The title, which opens the tab: the row's own words, never a second box.
11816
+ * Its words start where the small field's do (its side padding and its 1px
11817
+ * border), so a title does not jump sideways when Rename turns it into one.
11818
+ */
11819
+ .crewlet-doc-tabs-editor__open {
11820
+ display: block;
11821
+ width: 100%;
11822
+ min-height: var(--size-control-sm);
11823
+ margin: 0;
11824
+ padding: calc((var(--size-control-sm) - var(--font-size-compact) * var(--font-line-height-snug)) / 2)
11825
+ calc(var(--spacing-2) + 1px);
11826
+ border: 0;
11827
+ border-radius: var(--radius-sm);
11828
+ background: none;
11829
+ font-family: var(--font-family-sans);
11830
+ font-size: var(--font-size-compact);
11831
+ font-weight: var(--font-weight-regular);
11832
+ line-height: var(--font-line-height-snug);
11833
+ text-align: start;
11834
+ color: var(--color-text-secondary);
11835
+ overflow-wrap: anywhere;
11836
+ cursor: pointer;
11837
+ }
11838
+
11839
+ .crewlet-doc-tabs-editor__item:hover .crewlet-doc-tabs-editor__open,
11840
+ .crewlet-doc-tabs-editor__open[aria-current='true'] {
11841
+ color: var(--color-text-primary);
11842
+ }
11843
+
11844
+ .crewlet-doc-tabs-editor__open:focus-visible {
11845
+ outline: 2px solid var(--color-focus);
11846
+ outline-offset: var(--size-focus-ring-inset-offset);
11847
+ }
11848
+
11849
+ .crewlet-doc-tabs-editor__open:disabled {
11850
+ cursor: not-allowed;
11851
+ }
11852
+
11326
11853
  .crewlet-doc-tabs-editor__problem {
11854
+ padding-inline: calc(var(--spacing-2) + 1px);
11327
11855
  color: var(--color-feedback-danger-ink);
11328
11856
  font-size: var(--font-size-xs);
11857
+ line-height: var(--font-line-height-snug);
11858
+ }
11859
+
11860
+ /*
11861
+ * THE EDGES WAIT FOR THE POINTER. The handle and the menu are drawn on the
11862
+ * row under the pointer, on the open row, on a row the keyboard is inside and
11863
+ * on a row whose menu is open; elsewhere they keep their place unseen, so
11864
+ * nothing moves when they appear. A device with no hover shows them always,
11865
+ * since there is no pointer to wait for.
11866
+ */
11867
+ @media (hover: hover) {
11868
+ .crewlet-doc-tabs-editor__handle,
11869
+ .crewlet-doc-tabs-editor__actions {
11870
+ opacity: 0;
11871
+ transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
11872
+ }
11873
+
11874
+ .crewlet-doc-tabs-editor__item:is(:hover, :focus-within, .is-open, :has([aria-expanded='true']))
11875
+ :is(.crewlet-doc-tabs-editor__handle, .crewlet-doc-tabs-editor__actions) {
11876
+ opacity: 1;
11877
+ }
11329
11878
  }
11330
11879
 
11331
- .crewlet-doc-tabs-editor__moves {
11880
+ .crewlet-doc-tabs-editor__actions {
11332
11881
  display: inline-flex;
11333
- flex-shrink: 0;
11334
11882
  }
11335
11883
 
11336
- .crewlet-doc-tabs-editor__add {
11337
- display: flex;
11338
- flex-wrap: wrap;
11339
- align-items: center;
11340
- gap: var(--spacing-2);
11884
+ @media (prefers-reduced-motion: reduce) {
11885
+ .crewlet-doc-tabs-editor__item,
11886
+ .crewlet-doc-tabs-editor__handle,
11887
+ .crewlet-doc-tabs-editor__actions {
11888
+ transition: none;
11889
+ }
11890
+ }
11891
+
11892
+ /* FORCED COLORS drop the open row's fill, so it is outlined instead. */
11893
+ @media (forced-colors: active) {
11894
+ .crewlet-doc-tabs-editor__item.is-open {
11895
+ outline: 1px solid Highlight;
11896
+ outline-offset: -1px;
11897
+ }
11341
11898
  }
11342
11899
 
11343
11900
 
11344
- /* Document-G3YTZIUL.css */
11901
+ /* Document-JUGCSQ4L.css */
11345
11902
  /*
11346
11903
  * Rendered markdown, set as a document (Document.tsx).
11347
11904
  *
@@ -11416,10 +11973,25 @@ svg.crewlet-datetime__chevron {
11416
11973
  font-size: var(--font-size-lg);
11417
11974
  }
11418
11975
 
11419
- .crewlet-document :where(h4, h5, h6) {
11976
+ /*
11977
+ * EVERY LEVEL A STEP OF ITS OWN. A renderer draws a body from `h2` down, so a
11978
+ * page's fourth and fifth levels land on `h5` and `h6`; set at one size with
11979
+ * `h4`, three levels of a document read as one. The two deepest take the
11980
+ * body's own step, and the last is told apart by its ink, as a run-in
11981
+ * heading is in print.
11982
+ */
11983
+ .crewlet-document h4 {
11420
11984
  font-size: var(--font-size-md);
11421
11985
  }
11422
11986
 
11987
+ .crewlet-document :where(h5, h6) {
11988
+ font-size: var(--font-size-sm);
11989
+ }
11990
+
11991
+ .crewlet-document h6 {
11992
+ color: var(--color-text-secondary);
11993
+ }
11994
+
11423
11995
  .crewlet-document--sm h1 {
11424
11996
  font-size: var(--font-size-lg);
11425
11997
  }
@@ -11462,6 +12034,26 @@ svg.crewlet-datetime__chevron {
11462
12034
  margin-block-start: var(--spacing-1);
11463
12035
  }
11464
12036
 
12037
+ /*
12038
+ * THE RHYTHM HOLDS INSIDE A BLOCK THAT HOLDS BLOCKS. The sibling rule above
12039
+ * reaches only the body's own children, so a quote's second paragraph and a
12040
+ * list item's second paragraph ran into the first with no gap at all. A quote
12041
+ * is prose and takes the body's gap; a list item is one point and takes the
12042
+ * smaller step, so its paragraphs still read as one item. A task item's
12043
+ * blocks sit in the column beside its box, which is the same item.
12044
+ */
12045
+ .crewlet-document :where(blockquote, [data-callout-body]) > * + * {
12046
+ margin-block-start: var(--crewlet-document-gap);
12047
+ }
12048
+
12049
+ .crewlet-document :where(li, li > input[type='checkbox'] + *) > :not(input, ul, ol) + :not(ul, ol) {
12050
+ margin-block-start: var(--spacing-2);
12051
+ }
12052
+
12053
+ .crewlet-document li > input[type='checkbox'] + * > :where(ul, ol) {
12054
+ margin-block-start: var(--spacing-1);
12055
+ }
12056
+
11465
12057
  .crewlet-document li::marker {
11466
12058
  color: var(--color-text-tertiary);
11467
12059
  }
@@ -11631,6 +12223,48 @@ svg.crewlet-datetime__chevron {
11631
12223
  overflow-wrap: anywhere;
11632
12224
  }
11633
12225
 
12226
+ /*
12227
+ * The title while it is written (`DocumentTitleField`): the title's own type
12228
+ * on no surface of its own, with a line along its foot that answers the
12229
+ * pointer, the focus and a refusal. The line is a border rather than a
12230
+ * shadow, because forced colours keep a border and drop a shadow.
12231
+ */
12232
+ .crewlet-document-title-field {
12233
+ display: block;
12234
+ width: 100%;
12235
+ min-width: 0;
12236
+ padding: 0 0 var(--spacing-1);
12237
+ border: 0;
12238
+ border-block-end: 2px solid transparent;
12239
+ border-radius: 0;
12240
+ background: none;
12241
+ outline: none;
12242
+ transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
12243
+ }
12244
+
12245
+ .crewlet-document-title-field::placeholder {
12246
+ color: var(--color-text-tertiary);
12247
+ opacity: 1;
12248
+ }
12249
+
12250
+ .crewlet-document-title-field:hover {
12251
+ border-block-end-color: var(--color-border-default);
12252
+ }
12253
+
12254
+ .crewlet-document-title-field:focus-visible {
12255
+ border-block-end-color: var(--color-focus);
12256
+ }
12257
+
12258
+ .crewlet-document-title-field[aria-invalid='true'] {
12259
+ border-block-end-color: var(--color-feedback-danger);
12260
+ }
12261
+
12262
+ @media (prefers-reduced-motion: reduce) {
12263
+ .crewlet-document-title-field {
12264
+ transition: none;
12265
+ }
12266
+ }
12267
+
11634
12268
  /*
11635
12269
  * A TABLE CELL'S ALIGNMENT, read off `data-align` as well as off a style: an
11636
12270
  * editor that may not write a style attribute under a strict policy marks a
@@ -11698,12 +12332,8 @@ svg.crewlet-datetime__chevron {
11698
12332
  color: var(--color-text-primary);
11699
12333
  }
11700
12334
 
11701
- .crewlet-document [data-callout-body] > * + * {
11702
- margin-block-start: var(--crewlet-document-gap);
11703
- }
11704
12335
 
11705
-
11706
- /* EditingStatus-L6THUAN7.css */
12336
+ /* EditingStatus-NNA2CKIL.css */
11707
12337
  /*
11708
12338
  * The editing status (EditingStatus.tsx): a word and a dot, in the bar's own
11709
12339
  * small step, quiet until something is unsaved.
@@ -11751,10 +12381,12 @@ svg.crewlet-datetime__chevron {
11751
12381
  /*
11752
12382
  * THE WORDS FOLD AND THE DOT STAYS where room is short, hidden from the eye
11753
12383
  * and still read by a screen reader, so the status says the same thing to
11754
- * everyone. On a phone the state folds. On an artifact bar's narrow
11755
- * arrangement (below 640px, as ArtifactBar.css draws it) "Editing" folds too:
11756
- * the title has the row's room first, and Cancel and Save beside the dot
11757
- * already say an edit is open.
12384
+ * everyone. On a phone the state folds. On an artifact bar the title has the
12385
+ * row's room first: below 900px (a small laptop's bar beside the rail) the
12386
+ * state folds, since the dot already turns the accent once anything is
12387
+ * unsaved, so a title is not cut to two words to make room for the sentence;
12388
+ * on the narrow arrangement (below 640px, as ArtifactBar.css draws it)
12389
+ * "Editing" folds too, and Cancel and Save beside the dot say an edit is open.
11758
12390
  */
11759
12391
  @media (width < 480px) {
11760
12392
  .crewlet-editing-status__state {
@@ -11767,6 +12399,17 @@ svg.crewlet-datetime__chevron {
11767
12399
  }
11768
12400
  }
11769
12401
 
12402
+ @container crewlet-artifact-bar (width < 900px) {
12403
+ .crewlet-editing-status__state {
12404
+ position: absolute;
12405
+ width: 1px;
12406
+ height: 1px;
12407
+ margin: -1px;
12408
+ overflow: hidden;
12409
+ clip-path: inset(50%);
12410
+ }
12411
+ }
12412
+
11770
12413
  @container crewlet-artifact-bar (width < 640px) {
11771
12414
  .crewlet-editing-status__label,
11772
12415
  .crewlet-editing-status__state {
@@ -13867,6 +14510,91 @@ svg.crewlet-datetime__chevron {
13867
14510
  }
13868
14511
 
13869
14512
 
14513
+ /* LayersList-NQZEIPZB.css */
14514
+ /*
14515
+ * A canvas's list of layers (LayersList.tsx): a heading that stays, over one
14516
+ * line per entry that scrolls on its own.
14517
+ */
14518
+
14519
+ .crewlet-layers-list {
14520
+ display: flex;
14521
+ flex-direction: column;
14522
+ gap: var(--spacing-2);
14523
+ min-width: 0;
14524
+ min-height: 0;
14525
+ }
14526
+
14527
+ .crewlet-layers-list__heading {
14528
+ flex: none;
14529
+ color: var(--color-text-tertiary);
14530
+ font-family: var(--font-family-sans);
14531
+ font-size: var(--font-size-compact);
14532
+ line-height: var(--font-line-height-normal);
14533
+ }
14534
+
14535
+ /*
14536
+ * THE ENTRIES HANG INTO THE GUTTER by their own padding and edge, so their
14537
+ * letters stand on the list's edge, in line with the heading above them.
14538
+ */
14539
+ .crewlet-layers-list__items {
14540
+ flex: 1 1 auto;
14541
+ min-height: 0;
14542
+ margin: 0;
14543
+ margin-inline-start: calc(-1 * (var(--spacing-2) + 2px));
14544
+ padding: 0;
14545
+ overflow-y: auto;
14546
+ list-style: none;
14547
+ }
14548
+
14549
+ /*
14550
+ * The current entry's mark is held on every entry in the resting ink, as the
14551
+ * document outline's is, so nothing moves when the pick does. The radius is
14552
+ * the control step's on the end the mark does not take.
14553
+ */
14554
+ .crewlet-layers-list__item {
14555
+ display: block;
14556
+ box-sizing: border-box;
14557
+ width: 100%;
14558
+ overflow: hidden;
14559
+ margin: 0;
14560
+ padding: var(--spacing-1) var(--spacing-2);
14561
+ border: none;
14562
+ border-inline-start: 2px solid transparent;
14563
+ border-start-start-radius: 0;
14564
+ border-end-start-radius: 0;
14565
+ border-start-end-radius: var(--radius-md);
14566
+ border-end-end-radius: var(--radius-md);
14567
+ background: transparent;
14568
+ color: var(--color-text-secondary);
14569
+ font-family: var(--font-family-sans);
14570
+ font-size: var(--font-size-compact);
14571
+ font-weight: var(--font-weight-regular);
14572
+ line-height: var(--font-line-height-normal);
14573
+ text-align: start;
14574
+ text-overflow: ellipsis;
14575
+ white-space: nowrap;
14576
+ cursor: pointer;
14577
+ }
14578
+
14579
+ .crewlet-layers-list__item:hover {
14580
+ background: var(--color-surface-hover);
14581
+ color: var(--color-text-primary);
14582
+ }
14583
+
14584
+ /* The accent edge every current row in the system takes, in the primary ink.
14585
+ A border, so forced colours keep it. */
14586
+ .crewlet-layers-list__item[aria-current='true'] {
14587
+ border-inline-start-color: var(--color-brand-accent);
14588
+ color: var(--color-text-primary);
14589
+ }
14590
+
14591
+ /* The ring lies inside the entry, where the scroller beside it cannot cut it. */
14592
+ .crewlet-layers-list__item:focus-visible {
14593
+ outline: 2px solid var(--color-focus);
14594
+ outline-offset: var(--size-focus-ring-inset-offset);
14595
+ }
14596
+
14597
+
13870
14598
  /* Layout-ZBEGLXAE.css */
13871
14599
  /*
13872
14600
  * Stack, Inline, Spacer and AutoGrid.
@@ -15401,7 +16129,7 @@ svg.crewlet-datetime__chevron {
15401
16129
  }
15402
16130
 
15403
16131
 
15404
- /* Modal-XOSV6FAH.css */
16132
+ /* Modal-7MWRCWAI.css */
15405
16133
  /*
15406
16134
  * The modal surface: the veil, the frame, and the three bands inside it.
15407
16135
  *
@@ -15688,6 +16416,36 @@ svg.crewlet-datetime__chevron {
15688
16416
  border-bottom: 1px solid var(--color-border-default);
15689
16417
  }
15690
16418
 
16419
+ /*
16420
+ * WITH A SUBTITLE, THE HEAD'S CONTROLS SIT ON THE TITLE'S LINE. Centred on
16421
+ * the whole head, the mark, the actions and the close control floated beside
16422
+ * the description, belonging to neither line; top-aligned, they hung from the
16423
+ * head's top edge, a few pixels above the title they belong to. So the row
16424
+ * aligns to the top and each control is centred on the title's first line:
16425
+ * the mark and the actions in a box one title line tall (what is taller
16426
+ * overflows it evenly, into the head's padding), and a lone control by the
16427
+ * margin that puts its centre there. A dialog with no subtitle keeps the
16428
+ * centring above, where the two are the same thing.
16429
+ *
16430
+ * DIALOGS ONLY. A sheet's head is a bar at the shell's top-bar height and
16431
+ * centres what it holds on the bar, as the bar behind it does.
16432
+ */
16433
+ .crewlet-modal__header--subtitled {
16434
+ --crewlet-modal-title-line: calc(var(--font-size-sm) * var(--font-line-height-tight));
16435
+ align-items: flex-start;
16436
+ }
16437
+
16438
+ .crewlet-modal__header--subtitled > .crewlet-modal__icon,
16439
+ .crewlet-modal__header--subtitled > .crewlet-modal__actions {
16440
+ align-items: center;
16441
+ height: var(--crewlet-modal-title-line);
16442
+ }
16443
+
16444
+ .crewlet-modal__header--subtitled > .crewlet-modal__close,
16445
+ .crewlet-modal__header--subtitled > .crewlet-modal__back {
16446
+ margin-block: calc((var(--crewlet-modal-title-line) - var(--size-control-md)) / 2);
16447
+ }
16448
+
15691
16449
  /*
15692
16450
  * A SHEET IS COMMITTED FROM ITS HEAD, so its head is the taller band, not the
15693
16451
  * tighter one. It stands at the shell's own top-bar height, which is what puts
@@ -16021,7 +16779,7 @@ svg.crewlet-datetime__chevron {
16021
16779
  }
16022
16780
 
16023
16781
 
16024
- /* Note-ONSKKTOA.css */
16782
+ /* Note-WI5MLZOO.css */
16025
16783
  /*
16026
16784
  * Note: words on a coloured paper. Each hue pairs its fill with its own ink.
16027
16785
  */
@@ -16084,6 +16842,19 @@ svg.crewlet-datetime__chevron {
16084
16842
  text-decoration: underline;
16085
16843
  text-underline-offset: 2px;
16086
16844
  }
16845
+ /*
16846
+ * PARAGRAPHS STAND APART, by the step a note's heading stands from its words.
16847
+ * A host that resets a paragraph's margins (as an application's base sheet
16848
+ * does) ran two paragraphs into what read as one that wrapped early.
16849
+ */
16850
+ .crewlet-note :is(p, ul, ol) {
16851
+ margin-block: 0;
16852
+ }
16853
+
16854
+ .crewlet-note :is(p, ul, ol) + :is(p, ul, ol) {
16855
+ margin-block-start: var(--spacing-2);
16856
+ }
16857
+
16087
16858
  .crewlet-note > :first-child {
16088
16859
  margin-top: 0;
16089
16860
  }
@@ -17926,13 +18697,21 @@ svg.crewlet-datetime__chevron {
17926
18697
  }
17927
18698
 
17928
18699
 
17929
- /* PresenceStack-QSXQJND5.css */
18700
+ /* PresenceStack-FJJQVH74.css */
17930
18701
  /*
17931
18702
  * Who is here (PresenceStack.tsx), on the avatar stack's own geometry: the
17932
18703
  * overlap and the counted chip are the stack's. What this adds is the ring in
17933
18704
  * each present collaborator's hue, outside the cut-out, and the idle fade.
17934
18705
  */
17935
18706
 
18707
+ /* HOW FAR THE RING REACHES past each badge: the cut-out, then the hue. The
18708
+ ring is drawn outside the stack's own box, so a container that places the
18709
+ stack flush to an edge (or clips) keeps this much clear round it. */
18710
+ .crewlet-presence-stack {
18711
+ --crewlet-presence-stack-cutout: 2px;
18712
+ --crewlet-presence-stack-reach: calc(var(--crewlet-presence-stack-cutout) * 2);
18713
+ }
18714
+
17936
18715
  /* The wrapper (a span, or a button when badges select) carries no edge of its
17937
18716
  own: the cut-out and the hue ring are drawn on the badge inside it, which
17938
18717
  has the badge's own outline to follow. */
@@ -17965,15 +18744,15 @@ button.crewlet-presence-stack__member:focus-visible {
17965
18744
  }
17966
18745
 
17967
18746
  .crewlet-presence-stack .crewlet-presence-stack__badge {
17968
- box-shadow: 0 0 0 2px var(--crewlet-avatar-stack-ground);
18747
+ box-shadow: 0 0 0 var(--crewlet-presence-stack-cutout) var(--crewlet-avatar-stack-ground);
17969
18748
  }
17970
18749
 
17971
18750
  /* The hue ring sits outside the cut-out, so it reads as a ring round the
17972
18751
  badge rather than a stroke on it. */
17973
18752
  .crewlet-presence-stack .crewlet-presence-stack__badge--present {
17974
18753
  box-shadow:
17975
- 0 0 0 2px var(--crewlet-avatar-stack-ground),
17976
- 0 0 0 4px var(--crewlet-presence-hue);
18754
+ 0 0 0 var(--crewlet-presence-stack-cutout) var(--crewlet-avatar-stack-ground),
18755
+ 0 0 0 var(--crewlet-presence-stack-reach) var(--crewlet-presence-hue);
17977
18756
  }
17978
18757
 
17979
18758
  .crewlet-presence-stack .crewlet-presence-stack__badge--idle {
@@ -17988,48 +18767,58 @@ button.crewlet-presence-stack__member:focus-visible {
17988
18767
  }
17989
18768
 
17990
18769
 
17991
- /* PresenterView-T2C6ZZ3N.css */
18770
+ /* PresenterView-T3EXIQ5S.css */
17992
18771
  /*
17993
18772
  * PresenterView: the presenter's own screen beside the room's.
17994
18773
  *
17995
- * The notes take the space a glance needs: a large, readable size and their
17996
- * own scroll, so a long note never pushes the next slide or the timer away.
18774
+ * The room's slide is as large as fits the column with its controls right
18775
+ * under it, drawn as the slide itself rather than letterboxed in a well. The
18776
+ * notes take the space a glance needs: a large, readable size and their own
18777
+ * scroll, so a long note never pushes the next slide or the timer away.
17997
18778
  */
17998
18779
 
17999
18780
  .crewlet-presenter {
18000
18781
  display: grid;
18001
18782
  grid-template-columns: minmax(0, 2fr) minmax(16rem, 1fr);
18002
- gap: var(--spacing-4);
18783
+ gap: var(--spacing-5);
18003
18784
  height: 100%;
18004
18785
  min-height: 0;
18005
18786
  padding: var(--spacing-4);
18787
+ box-sizing: border-box;
18006
18788
  background: var(--color-surface-background);
18007
18789
  color: var(--color-text-primary);
18008
18790
  }
18009
18791
 
18792
+ /* THE SLIDE AS LARGE AS FITS, measured against the room under its caption
18793
+ (a size container), less the controls under it: the largest box of the
18794
+ slide's shape that fits both ways, so nothing is letterboxed and the
18795
+ controls sit on the slide's foot wherever that is. */
18010
18796
  .crewlet-presenter__main {
18011
18797
  display: flex;
18012
18798
  flex-direction: column;
18013
- gap: var(--spacing-3);
18799
+ gap: var(--spacing-2);
18800
+ min-width: 0;
18014
18801
  min-height: 0;
18802
+ margin: 0;
18015
18803
  }
18016
18804
 
18017
- .crewlet-presenter__main .crewlet-slide-stage {
18805
+ .crewlet-presenter__screen {
18806
+ container-type: size;
18018
18807
  flex: 1;
18019
- min-height: 0;
18020
- border-radius: var(--radius-md);
18021
- }
18022
-
18023
- .crewlet-presenter__controls {
18024
18808
  display: flex;
18809
+ flex-direction: column;
18025
18810
  align-items: center;
18026
- justify-content: center;
18027
18811
  gap: var(--spacing-3);
18812
+ min-height: 0;
18028
18813
  }
18029
18814
 
18030
- .crewlet-presenter__position {
18031
- color: var(--color-text-secondary);
18032
- font-variant-numeric: tabular-nums;
18815
+ .crewlet-presenter__screen > .crewlet-slide-stage {
18816
+ flex: none;
18817
+ width: min(
18818
+ 100cqw,
18819
+ (100cqh - var(--size-control-sm) - var(--spacing-3)) * var(--crewlet-presenter-ratio, 1.7778)
18820
+ );
18821
+ border-radius: var(--radius-md);
18033
18822
  }
18034
18823
 
18035
18824
  .crewlet-presenter__side {
@@ -18039,17 +18828,31 @@ button.crewlet-presence-stack__member:focus-visible {
18039
18828
  min-height: 0;
18040
18829
  }
18041
18830
 
18042
- .crewlet-presenter__next .crewlet-slide-stage {
18043
- border-radius: var(--radius-sm);
18044
- outline: 1px solid var(--color-border-default);
18831
+ .crewlet-presenter__next,
18832
+ .crewlet-presenter__notes {
18833
+ display: flex;
18834
+ flex-direction: column;
18835
+ gap: var(--spacing-2);
18836
+ min-height: 0;
18837
+ margin: 0;
18838
+ }
18839
+
18840
+ .crewlet-presenter__caption {
18841
+ margin: 0;
18045
18842
  }
18046
18843
 
18844
+ /* THE END HOLDS THE NEXT SLIDE'S PLACE at its shape, so the timer and the
18845
+ notes under it stay where they were on the last slide. */
18047
18846
  .crewlet-presenter__end {
18847
+ display: flex;
18848
+ align-items: center;
18849
+ justify-content: center;
18850
+ aspect-ratio: var(--crewlet-presenter-ratio, 1.7778);
18048
18851
  margin: 0;
18049
- padding: var(--spacing-6) var(--spacing-3);
18050
- border: 1px dashed var(--color-border-default);
18852
+ border: 1px dashed var(--color-border-strong);
18051
18853
  border-radius: var(--radius-sm);
18052
18854
  color: var(--color-text-tertiary);
18855
+ font-size: var(--font-size-sm);
18053
18856
  text-align: center;
18054
18857
  }
18055
18858
 
@@ -18068,9 +18871,13 @@ button.crewlet-presence-stack__member:focus-visible {
18068
18871
 
18069
18872
  .crewlet-presenter__notes {
18070
18873
  flex: 1;
18874
+ }
18875
+
18876
+ .crewlet-presenter__notes-body {
18877
+ flex: 1;
18071
18878
  min-height: 0;
18072
18879
  overflow: auto;
18073
- padding: var(--spacing-3);
18880
+ padding: var(--spacing-3) var(--spacing-4);
18074
18881
  border-radius: var(--radius-md);
18075
18882
  background: var(--color-surface-subtle);
18076
18883
  font-size: var(--font-size-lg);
@@ -18078,7 +18885,7 @@ button.crewlet-presence-stack__member:focus-visible {
18078
18885
  white-space: pre-wrap;
18079
18886
  }
18080
18887
 
18081
- .crewlet-presenter__notes p {
18888
+ .crewlet-presenter__notes-body p {
18082
18889
  margin: 0;
18083
18890
  }
18084
18891
 
@@ -18086,11 +18893,27 @@ button.crewlet-presence-stack__member:focus-visible {
18086
18893
  color: var(--color-text-tertiary);
18087
18894
  }
18088
18895
 
18896
+ /* ONE COLUMN on a narrow screen: the page scrolls, so the slide is as wide as
18897
+ the column and the notes as tall as they are. */
18089
18898
  @media (max-width: 48rem) {
18090
18899
  .crewlet-presenter {
18091
18900
  grid-template-columns: minmax(0, 1fr);
18092
18901
  height: auto;
18093
18902
  }
18903
+
18904
+ .crewlet-presenter__screen {
18905
+ container-type: normal;
18906
+ flex: none;
18907
+ }
18908
+
18909
+ .crewlet-presenter__screen > .crewlet-slide-stage {
18910
+ width: 100%;
18911
+ }
18912
+
18913
+ .crewlet-presenter__notes-body {
18914
+ flex: none;
18915
+ overflow: visible;
18916
+ }
18094
18917
  }
18095
18918
 
18096
18919
 
@@ -19178,15 +20001,11 @@ button.crewlet-presence-stack__member:focus-visible {
19178
20001
  }
19179
20002
 
19180
20003
 
19181
- /* SandboxedFrame-L6HBQZCD.css */
20004
+ /* SandboxedFrame-P5NASXB7.css */
19182
20005
  /*
19183
20006
  * The frame fills the box it is given. The page around it does not scroll
19184
20007
  * round the artifact: the artifact scrolls inside its own document, which is
19185
20008
  * what a viewer body that holds one wants.
19186
- *
19187
- * The region takes focus when the frame hands it back, and keeps the
19188
- * document's own focus treatment then: a reader who just left a page by
19189
- * keyboard needs to see where they landed.
19190
20009
  */
19191
20010
 
19192
20011
  .crewlet-sandboxed-frame {
@@ -19210,6 +20029,10 @@ button.crewlet-presence-stack__member:focus-visible {
19210
20029
  background: transparent;
19211
20030
  }
19212
20031
 
20032
+ /* THE PLACEHOLDER AND THE END STATES SIT AT ONE INSET, the frame's margin,
20033
+ so a reader who watches a page load and then fail sees the callout take
20034
+ the placeholder's place rather than jump beside it. */
20035
+
19213
20036
  /* Kept out of sight while it starts, so a document that has not painted in
19214
20037
  the reader's palette yet is never what they see. It still loads. */
19215
20038
  .crewlet-sandboxed-frame[data-state='loading'] .crewlet-sandboxed-frame__frame {
@@ -19220,7 +20043,7 @@ button.crewlet-presence-stack__member:focus-visible {
19220
20043
  position: absolute;
19221
20044
  inset: 0;
19222
20045
  display: flex;
19223
- padding: var(--spacing-3);
20046
+ padding: var(--spacing-4);
19224
20047
  }
19225
20048
 
19226
20049
  .crewlet-sandboxed-frame__end {
@@ -19230,6 +20053,28 @@ button.crewlet-presence-stack__member:focus-visible {
19230
20053
  padding: var(--spacing-4);
19231
20054
  }
19232
20055
 
20056
+ /* THE REGION TAKES FOCUS WHEN THE FRAME HANDS IT BACK, and a reader who just
20057
+ left a page by keyboard needs to see where they landed. The document's own
20058
+ ring sits outside the box, where a frame filling a clipping card loses it,
20059
+ so the region draws its ring inside its edge, on a layer above the frame. */
20060
+ .crewlet-sandboxed-frame:focus-visible {
20061
+ /* Transparent rather than none: forced-colors mode paints a transparent
20062
+ outline in the system ink, so the region's edge is never left bare. */
20063
+ outline: 2px solid transparent;
20064
+ }
20065
+
20066
+ .crewlet-sandboxed-frame:focus-visible::after {
20067
+ content: '';
20068
+ position: absolute;
20069
+ inset: 0;
20070
+ z-index: 1;
20071
+ border-radius: inherit;
20072
+ /* An outline, never a shadow: forced-colors mode keeps only outlines. */
20073
+ outline: 2px solid var(--color-focus);
20074
+ outline-offset: var(--size-focus-ring-inset-offset);
20075
+ pointer-events: none;
20076
+ }
20077
+
19233
20078
 
19234
20079
  /* SearchTrigger-KIZLWBEH.css */
19235
20080
  /*
@@ -19349,7 +20194,7 @@ button.crewlet-presence-stack__member:focus-visible {
19349
20194
  }
19350
20195
 
19351
20196
 
19352
- /* Section-QR3ILQVK.css */
20197
+ /* Section-O5AHGSOG.css */
19353
20198
  /*
19354
20199
  * Section, the vertical rhythm band. One spacing scale keeps the cadence
19355
20200
  * between page sections consistent, and collapses on small viewports.
@@ -19408,7 +20253,11 @@ button.crewlet-presence-stack__member:focus-visible {
19408
20253
  .crewlet-section__title {
19409
20254
  margin: 0;
19410
20255
  font-family: var(--font-family-display);
19411
- font-size: var(--font-size-lg);
20256
+ /* THE REGISTER IS THE CONTAINER'S TO SET. A screen's band heads at the large
20257
+ step; a side panel, whose own title is the small step, sets
20258
+ `--crewlet-section-title-size` so the sections inside it never outrank the
20259
+ heading they sit under. */
20260
+ font-size: var(--crewlet-section-title-size, var(--font-size-lg));
19412
20261
  font-weight: var(--font-weight-semibold);
19413
20262
  line-height: var(--font-line-height-normal);
19414
20263
  letter-spacing: var(--font-letter-spacing-tight);
@@ -19467,15 +20316,34 @@ button.crewlet-presence-stack__member:focus-visible {
19467
20316
  padding-block: var(--spacing-10);
19468
20317
  }
19469
20318
 
19470
- /*
19471
- * Narrow: the sentence moves under the heading rather than competing with it
19472
- * for a line that has room for neither.
19473
- */
19474
20319
  .crewlet-section__header {
19475
20320
  flex-wrap: wrap;
20321
+ row-gap: var(--spacing-1);
20322
+ }
20323
+
20324
+ .crewlet-section__description {
20325
+ order: 1;
20326
+ white-space: normal;
20327
+ flex-basis: 100%;
20328
+ }
20329
+ }
20330
+
20331
+ /*
20332
+ * NARROW: the sentence moves under the heading rather than competing with it
20333
+ * for a line that has room for neither, and the actions stay on the heading's
20334
+ * line. Measured on the column the section sits in where it sits in a size
20335
+ * container (a side panel, a screen's content column), since a panel beside a
20336
+ * wide window is as narrow as a phone; the window's width above is the answer
20337
+ * where there is no container to ask.
20338
+ */
20339
+ @container (width < 36rem) {
20340
+ .crewlet-section__header {
20341
+ flex-wrap: wrap;
20342
+ row-gap: var(--spacing-1);
19476
20343
  }
19477
20344
 
19478
20345
  .crewlet-section__description {
20346
+ order: 1;
19479
20347
  white-space: normal;
19480
20348
  flex-basis: 100%;
19481
20349
  }
@@ -20225,7 +21093,7 @@ svg.crewlet-select__chevron {
20225
21093
  }
20226
21094
 
20227
21095
 
20228
- /* ShareDialog-YZ4F37MW.css */
21096
+ /* ShareDialog-4QDCBWMH.css */
20229
21097
  /*
20230
21098
  * Three blocks under the title: who to add and at what role, who has access,
20231
21099
  * and what the whole company may do. Each row of the audience is the badge,
@@ -20244,6 +21112,10 @@ svg.crewlet-select__chevron {
20244
21112
  display: flex;
20245
21113
  flex-direction: column;
20246
21114
  gap: var(--spacing-2);
21115
+ /* A BLOCK'S WORTH OF ROOM ABOVE EACH HEADING, over the body's own gap: at
21116
+ the gap alone "Who has access" sat as close under the add field as the
21117
+ role select beside it, and read as that field's label. */
21118
+ padding-block-start: var(--spacing-2);
20247
21119
  }
20248
21120
 
20249
21121
  .crewlet-share-dialog__heading {
@@ -20315,11 +21187,19 @@ svg.crewlet-select__chevron {
20315
21187
  }
20316
21188
 
20317
21189
  .crewlet-share-dialog__note,
21190
+ .crewlet-share-dialog__invalid,
20318
21191
  .crewlet-share-dialog__refusal {
20319
21192
  grid-column: 2 / -1;
20320
21193
  font-size: var(--font-size-xs);
20321
21194
  }
20322
21195
 
21196
+ /* A SHARE THAT REACHES NOBODY says why in the warning ink, the state a person
21197
+ is asked to act on, and its "No access" stands in the quiet ink a role
21198
+ would. */
21199
+ .crewlet-share-dialog__invalid {
21200
+ color: var(--color-feedback-warning-ink);
21201
+ }
21202
+
20323
21203
  .crewlet-share-dialog__note {
20324
21204
  color: var(--color-text-tertiary);
20325
21205
  }
@@ -20374,7 +21254,7 @@ svg.crewlet-select__chevron {
20374
21254
  }
20375
21255
 
20376
21256
 
20377
- /* SheetGrid-J3TKKXZL.css */
21257
+ /* SheetGrid-AKPUCK67.css */
20378
21258
  /*
20379
21259
  * The editable sheet (SheetGrid.tsx) and its cells (cells.tsx).
20380
21260
  *
@@ -20390,6 +21270,8 @@ svg.crewlet-select__chevron {
20390
21270
 
20391
21271
  .crewlet-sheet-grid {
20392
21272
  --crewlet-sheet-row-height: var(--size-sheet-row);
21273
+ /* The history control: a target-sized button, which its room in the cell is sized from. */
21274
+ --crewlet-sheet-history-size: var(--size-target-min);
20393
21275
  position: relative;
20394
21276
  display: flex;
20395
21277
  flex-direction: column;
@@ -20397,7 +21279,33 @@ svg.crewlet-select__chevron {
20397
21279
  min-height: 0;
20398
21280
  color: var(--color-text-primary);
20399
21281
  font-family: var(--font-family-sans);
20400
- font-size: var(--font-size-sm);
21282
+ /* Values at the compact step, a grid's own register: the headers stay a
21283
+ step under them, in sentence case. */
21284
+ font-size: var(--font-size-compact);
21285
+ }
21286
+
21287
+ /* THE MEASURING ROW: each sized column's header and sampled values, drawn by
21288
+ the real header and cell rules at their natural width, out of sight and out
21289
+ of reach. The grid reads each one's widest part as the column's width. */
21290
+ .crewlet-sheet-grid__measure {
21291
+ position: absolute;
21292
+ inset-block-start: 0;
21293
+ inset-inline-start: 0;
21294
+ width: 0;
21295
+ height: 0;
21296
+ overflow: hidden;
21297
+ visibility: hidden;
21298
+ pointer-events: none;
21299
+ }
21300
+
21301
+ .crewlet-sheet-grid__measure > div {
21302
+ display: flex;
21303
+ flex-direction: column;
21304
+ width: max-content;
21305
+ }
21306
+
21307
+ .crewlet-sheet-grid__measure :is(.crewlet-sheet-grid__header, .crewlet-sheet-grid__cell) {
21308
+ width: max-content;
20401
21309
  }
20402
21310
 
20403
21311
  /* Measured by the component: the resolved row height at the current density. */
@@ -20426,9 +21334,16 @@ svg.crewlet-select__chevron {
20426
21334
  }
20427
21335
 
20428
21336
  /* AS TALL AS ITS ROWS (fit="content"): the component writes the height, the
20429
- page may cap it, and the grid never grows past the height it was given. */
21337
+ page may cap it, and the grid never grows past the height it was given.
21338
+ IN A BOUNDED COLUMN IT GIVES WAY: the scroller shrinks to the room its
21339
+ container has left under whatever stands above it (a bar that wraps on a
21340
+ phone included), so the foot lands on the container's edge rather than
21341
+ on a guess of how tall the rest is. It never shrinks below the floor the
21342
+ page sets (--crewlet-sheet-min-height), and never below its own rows'
21343
+ height, so a short sheet is not stretched into an empty slab. */
20430
21344
  .crewlet-sheet-grid--fit-content > .crewlet-sheet-grid__scroller {
20431
- flex: none;
21345
+ flex: 0 1 auto;
21346
+ min-height: min(var(--crewlet-sheet-min-height, 0px), var(--crewlet-sheet-content-height, 0px));
20432
21347
  max-height: var(--crewlet-sheet-max-height, 70vh);
20433
21348
  }
20434
21349
 
@@ -20514,6 +21429,24 @@ svg.crewlet-select__chevron {
20514
21429
  margin-inline-start: auto;
20515
21430
  }
20516
21431
 
21432
+ /* A HEADER SITS ON ITS COLUMN'S EDGE: a number's and a rating's name end
21433
+ where their values end, the sort mark on the inner side, and a checkbox's
21434
+ name is centred over its boxes. A name on the leading edge over values on
21435
+ the trailing one read as belonging to the column before. */
21436
+ .crewlet-sheet-grid__header--number,
21437
+ .crewlet-sheet-grid__header--rating {
21438
+ flex-direction: row-reverse;
21439
+ }
21440
+
21441
+ .crewlet-sheet-grid__header--number > .crewlet-sheet-grid__header-presence,
21442
+ .crewlet-sheet-grid__header--rating > .crewlet-sheet-grid__header-presence {
21443
+ margin-inline: 0 auto;
21444
+ }
21445
+
21446
+ .crewlet-sheet-grid__header--checkbox {
21447
+ justify-content: center;
21448
+ }
21449
+
20517
21450
  .crewlet-sheet-grid .crewlet-sheet-grid__header-badge {
20518
21451
  box-shadow: 0 0 0 2px var(--crewlet-presence-hue);
20519
21452
  }
@@ -20534,6 +21467,13 @@ svg.crewlet-select__chevron {
20534
21467
  transform: translateY(-50%);
20535
21468
  }
20536
21469
 
21470
+ /* The active row's actions and the active cell's history are the reader's
21471
+ tools while they are in the grid, not marks on a sheet nobody has entered. */
21472
+ .crewlet-sheet-grid__grid:not(:focus-within) .crewlet-sheet-grid__row-actions--active-row,
21473
+ .crewlet-sheet-grid__grid:not(:focus-within) .crewlet-sheet-grid__cell--history:not(:hover) > .crewlet-sheet-grid__history {
21474
+ visibility: hidden;
21475
+ }
21476
+
20537
21477
  /* The bar at a row's leading edge while somebody has it selected. */
20538
21478
  .crewlet-sheet-grid__rownum--present::before {
20539
21479
  position: absolute;
@@ -20569,10 +21509,21 @@ svg.crewlet-select__chevron {
20569
21509
  justify-content: center;
20570
21510
  }
20571
21511
 
20572
- .crewlet-sheet-grid__cell--selected {
21512
+ /* THE SELECTION IS TINTED WHILE THE READER IS IN THE GRID, or while it
21513
+ spans more than one cell. A grid nobody has entered still holds its first
21514
+ cell as the active one (the keys start there), and tinting it drew a stray
21515
+ highlight on every sheet as it opened. */
21516
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
20573
21517
  background: var(--color-brand-accent-soft);
20574
21518
  }
20575
21519
 
21520
+ /* THE FROZEN EDGE once the grid is scrolled sideways: the columns that stay
21521
+ (or the row numbers, where none do) end on the strong hairline, so the
21522
+ values passing under them read as scrolled rather than cut. */
21523
+ .crewlet-sheet-grid__scroller--across .crewlet-sheet-grid__frozen-edge {
21524
+ border-inline-end-color: var(--color-border-strong);
21525
+ }
21526
+
20576
21527
  .crewlet-sheet-grid__cell:focus-visible,
20577
21528
  .crewlet-sheet-grid__header:focus-visible {
20578
21529
  outline: 2px solid var(--color-focus);
@@ -20640,6 +21591,31 @@ svg.crewlet-select__chevron {
20640
21591
  white-space: normal;
20641
21592
  }
20642
21593
 
21594
+ /* THE HISTORY CONTROL HAS ITS OWN ROOM while it shows, so a value ends, or
21595
+ ellipsises, before it rather than running under it. It sits at the edge
21596
+ the value does not start from: the trailing edge of a value drawn from the
21597
+ leading one, the leading edge of a number or a rating (drawn on the
21598
+ trailing one), so neither moves when its cell becomes active. A checkbox,
21599
+ centred in a column wider than it, needs no room made. */
21600
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--history,
21601
+ .crewlet-sheet-grid__cell--history:hover {
21602
+ padding-inline-end: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size));
21603
+ }
21604
+
21605
+ .crewlet-sheet-grid__grid:focus-within :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history,
21606
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history:hover {
21607
+ padding-inline: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size)) var(--spacing-2);
21608
+ }
21609
+
21610
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history,
21611
+ .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history:hover {
21612
+ padding-inline-end: var(--spacing-2);
21613
+ }
21614
+
21615
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating) > .crewlet-sheet-grid__history {
21616
+ inset-inline: var(--spacing-1) auto;
21617
+ }
21618
+
20643
21619
  .crewlet-sheet-grid__history {
20644
21620
  position: absolute;
20645
21621
  top: 50%;
@@ -20647,9 +21623,11 @@ svg.crewlet-select__chevron {
20647
21623
  display: inline-flex;
20648
21624
  align-items: center;
20649
21625
  justify-content: center;
20650
- padding: var(--spacing-1);
21626
+ width: var(--crewlet-sheet-history-size);
21627
+ height: var(--crewlet-sheet-history-size);
21628
+ padding: 0;
20651
21629
  border: 0;
20652
- border-radius: var(--radius-sm);
21630
+ border-radius: var(--radius-md);
20653
21631
  background: var(--color-surface-elevated);
20654
21632
  color: var(--color-text-secondary);
20655
21633
  transform: translateY(-50%);
@@ -20657,6 +21635,7 @@ svg.crewlet-select__chevron {
20657
21635
  }
20658
21636
 
20659
21637
  .crewlet-sheet-grid__history:hover {
21638
+ background: var(--color-surface-hover);
20660
21639
  color: var(--color-text-primary);
20661
21640
  }
20662
21641
 
@@ -21031,7 +22010,7 @@ svg.crewlet-select__chevron {
21031
22010
  }
21032
22011
 
21033
22012
  @media (forced-colors: active) {
21034
- .crewlet-sheet-grid__cell--selected {
22013
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
21035
22014
  background: Highlight;
21036
22015
  color: HighlightText;
21037
22016
  }
@@ -21878,7 +22857,7 @@ svg.crewlet-select__chevron {
21878
22857
  }
21879
22858
 
21880
22859
 
21881
- /* SlideCompare-MGM3U2ME.css */
22860
+ /* SlideCompare-HTCMPQFY.css */
21882
22861
  /*
21883
22862
  * SlideCompare: two versions of a deck, slide by slide.
21884
22863
  *
@@ -21937,9 +22916,34 @@ svg.crewlet-select__chevron {
21937
22916
  gap: var(--spacing-3);
21938
22917
  }
21939
22918
 
21940
- .crewlet-slide-compare__side .crewlet-slide-stage {
21941
- border-radius: var(--radius-sm);
21942
- outline: 1px solid var(--color-border-default);
22919
+ .crewlet-slide-compare__side {
22920
+ display: flex;
22921
+ flex-direction: column;
22922
+ gap: var(--spacing-1);
22923
+ min-width: 0;
22924
+ }
22925
+
22926
+ /* THE VERSIONS' NAMES over the two columns; over each side instead once the
22927
+ sides stack. */
22928
+ .crewlet-slide-compare__columns {
22929
+ display: grid;
22930
+ grid-template-columns: repeat(2, minmax(0, 1fr));
22931
+ gap: var(--spacing-3);
22932
+ padding-bottom: var(--spacing-2);
22933
+ border-bottom: 1px solid var(--color-border-default);
22934
+ color: var(--color-text-secondary);
22935
+ font-size: var(--font-size-xs);
22936
+ font-weight: var(--font-weight-semibold);
22937
+ }
22938
+
22939
+ .crewlet-slide-compare__side-label {
22940
+ display: none;
22941
+ color: var(--color-text-tertiary);
22942
+ font-size: var(--font-size-xs);
22943
+ }
22944
+
22945
+ .crewlet-slide-compare__toggle {
22946
+ align-self: flex-start;
21943
22947
  }
21944
22948
 
21945
22949
  .crewlet-slide-compare__missing {
@@ -21958,17 +22962,36 @@ svg.crewlet-select__chevron {
21958
22962
  .crewlet-slide-compare__sides {
21959
22963
  grid-template-columns: minmax(0, 1fr);
21960
22964
  }
22965
+
22966
+ .crewlet-slide-compare__columns {
22967
+ display: none;
22968
+ }
22969
+
22970
+ .crewlet-slide-compare__side-label {
22971
+ display: block;
22972
+ }
21961
22973
  }
21962
22974
 
21963
22975
 
21964
- /* SlideFilmstrip-BCLNAHFX.css */
22976
+ /* SlideFilmstrip-5U6Z55GS.css */
21965
22977
  /*
21966
- * SlideFilmstrip: the column of slide thumbnails beside a deck's stage.
22978
+ * SlideFilmstrip: the column of slide thumbnails beside a deck's stage, or
22979
+ * the row under it on a phone.
21967
22980
  *
21968
22981
  * The selected slide is ringed in the brand accent rather than filled, so its
21969
22982
  * thumbnail still shows the slide's own colours.
22983
+ *
22984
+ * THE STRIP IS ITS OWN SCROLLER: a host bounds it (a column's max-height, a
22985
+ * row's width) and the strip scrolls inside that, keeping the selected slide
22986
+ * in view, with its scroll chained to nothing so a flick at its end does not
22987
+ * scroll the page under the reader's thumb.
21970
22988
  */
21971
22989
 
22990
+ .crewlet-slide-filmstrip {
22991
+ overflow: auto;
22992
+ overscroll-behavior: contain;
22993
+ }
22994
+
21972
22995
  .crewlet-slide-filmstrip__list {
21973
22996
  display: flex;
21974
22997
  flex-direction: column;
@@ -22036,6 +23059,9 @@ svg.crewlet-select__chevron {
22036
23059
  color: var(--color-text-secondary);
22037
23060
  }
22038
23061
 
23062
+ /* A CONTROL'S CORNER: the handle is a 24px control like any toolbar button,
23063
+ so it takes --radius-md; the thumbnail beside it is a slide, and keeps the
23064
+ slide's own smaller corner. */
22039
23065
  .crewlet-slide-filmstrip__handle {
22040
23066
  display: inline-flex;
22041
23067
  align-items: center;
@@ -22044,7 +23070,7 @@ svg.crewlet-select__chevron {
22044
23070
  min-height: var(--size-target-min);
22045
23071
  padding: 0;
22046
23072
  border: 0;
22047
- border-radius: var(--radius-sm);
23073
+ border-radius: var(--radius-md);
22048
23074
  background: transparent;
22049
23075
  color: var(--color-text-tertiary);
22050
23076
  cursor: grab;
@@ -22071,8 +23097,55 @@ svg.crewlet-select__chevron {
22071
23097
  box-shadow: 0 var(--spacing-1) 0 var(--color-brand-accent);
22072
23098
  }
22073
23099
 
23100
+ /* A ROW UNDER THE STAGE: fixed-width thumbnails that scroll sideways, each
23101
+ with its number and its handle under it rather than beside it. */
23102
+ /* NO SCROLL SNAP: a snap point would pull the strip back to the start of an
23103
+ earlier thumbnail just after it scrolled the selected one into view. */
23104
+ .crewlet-slide-filmstrip--horizontal {
23105
+ overflow-y: hidden;
23106
+ }
23107
+
23108
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__list {
23109
+ flex-direction: row;
23110
+ gap: var(--spacing-3);
23111
+ width: max-content;
23112
+ }
23113
+
23114
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item {
23115
+ grid-template-columns: minmax(0, 1fr) auto;
23116
+ grid-template-areas:
23117
+ 'thumb thumb'
23118
+ 'number handle';
23119
+ align-items: center;
23120
+ width: 7.5rem;
23121
+ }
23122
+
23123
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__thumb {
23124
+ grid-area: thumb;
23125
+ }
23126
+
23127
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__number {
23128
+ grid-area: number;
23129
+ padding-top: 0;
23130
+ text-align: left;
23131
+ }
23132
+
23133
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__handle {
23134
+ grid-area: handle;
23135
+ min-height: var(--size-control-sm);
23136
+ cursor: grab;
23137
+ }
23138
+
23139
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item[data-reorder-target='before'] .crewlet-slide-filmstrip__thumb {
23140
+ box-shadow: calc(var(--spacing-1) * -1) 0 0 var(--color-brand-accent);
23141
+ }
22074
23142
 
22075
- /* SlideGrid-RT6QEQEE.css */
23143
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item[data-reorder-target='after'] .crewlet-slide-filmstrip__thumb {
23144
+ box-shadow: var(--spacing-1) 0 0 var(--color-brand-accent);
23145
+ }
23146
+
23147
+
23148
+ /* SlideGrid-S4LTJ4UU.css */
22076
23149
  /*
22077
23150
  * SlideGrid: every slide of a deck at once, by its outline's sections.
22078
23151
  */
@@ -22113,11 +23186,6 @@ svg.crewlet-select__chevron {
22113
23186
  cursor: pointer;
22114
23187
  }
22115
23188
 
22116
- .crewlet-slide-grid__card .crewlet-slide-stage {
22117
- border-radius: var(--radius-sm);
22118
- outline: 1px solid var(--color-border-default);
22119
- }
22120
-
22121
23189
  .crewlet-slide-grid__card:hover .crewlet-slide-stage {
22122
23190
  outline-color: var(--color-border-hover);
22123
23191
  }
@@ -22156,8 +23224,73 @@ svg.crewlet-select__chevron {
22156
23224
  white-space: nowrap;
22157
23225
  }
22158
23226
 
23227
+ /* TWO TO A ROW ON A PHONE: a grid of one is the filmstrip at full size, and
23228
+ the grid is for seeing the deck's run at a glance. */
23229
+ @media (width < 640px) {
23230
+ .crewlet-slide-grid__list {
23231
+ grid-template-columns: repeat(2, minmax(0, 1fr));
23232
+ gap: var(--spacing-3);
23233
+ }
23234
+ }
23235
+
23236
+
23237
+ /* SlideNav-BLFJF6AH.css */
23238
+ /*
23239
+ * SlideNav: Previous, the position and Next, and whatever follows them.
23240
+ */
23241
+
23242
+ .crewlet-slide-nav {
23243
+ display: inline-flex;
23244
+ align-items: center;
23245
+ gap: var(--spacing-1);
23246
+ }
23247
+
23248
+ .crewlet-slide-nav__position {
23249
+ min-width: 5em;
23250
+ color: var(--color-text-secondary);
23251
+ font-size: var(--font-size-sm);
23252
+ font-variant-numeric: tabular-nums;
23253
+ text-align: center;
23254
+ white-space: nowrap;
23255
+ }
23256
+
23257
+ .crewlet-slide-nav__more {
23258
+ display: inline-flex;
23259
+ align-items: center;
23260
+ gap: var(--spacing-1);
23261
+ margin-left: var(--spacing-2);
23262
+ padding-left: var(--spacing-3);
23263
+ border-left: 1px solid var(--color-border-default);
23264
+ }
23265
+
23266
+ /* OVER A PROJECTED SLIDE: a pill in the projection's own fixed colours, so it
23267
+ reads over black bars and over a slide of any colour, in every theme. */
23268
+ .crewlet-slide-nav--projection {
23269
+ padding: var(--spacing-1) var(--spacing-2);
23270
+ border-radius: var(--radius-pill);
23271
+ background: var(--color-projection-ground);
23272
+ color: var(--color-projection-ink);
23273
+ }
23274
+
23275
+ .crewlet-slide-nav--projection .crewlet-slide-nav__position {
23276
+ color: inherit;
23277
+ }
23278
+
23279
+ .crewlet-slide-nav--projection .crewlet-slide-nav__more {
23280
+ border-left-color: var(--color-projection-rule);
23281
+ }
23282
+
23283
+ .crewlet-slide-nav--projection .crewlet-icon-btn--ghost {
23284
+ color: inherit;
23285
+ }
23286
+
23287
+ .crewlet-slide-nav--projection .crewlet-icon-btn--ghost:hover:not(:disabled):not([aria-disabled='true']) {
23288
+ background: var(--color-projection-hover);
23289
+ color: inherit;
23290
+ }
22159
23291
 
22160
- /* SlideStage-KGRRALXR.css */
23292
+
23293
+ /* SlideStage-S2FISF4C.css */
22161
23294
  /*
22162
23295
  * SlideStage: a slide laid out at its authored size and scaled to its box.
22163
23296
  *
@@ -22176,6 +23309,29 @@ svg.crewlet-select__chevron {
22176
23309
  height: 100%;
22177
23310
  }
22178
23311
 
23312
+ /* THE SLIDE'S OWN EDGE: the box is the slide (or, for a show in the page,
23313
+ the room it was measured into), so its outline is the slide's edge, drawn over the slide's corners rather than outside them. A host that
23314
+ marks a stage (selected, current) recolours this outline rather than adding
23315
+ a second line. */
23316
+ .crewlet-slide-stage--framed {
23317
+ border-radius: var(--radius-sm);
23318
+ outline: 1px solid var(--color-border-default);
23319
+ }
23320
+
23321
+ :fullscreen .crewlet-slide-stage--framed,
23322
+ .crewlet-slide-stage--framed:fullscreen {
23323
+ border-radius: 0;
23324
+ outline: 0;
23325
+ }
23326
+
23327
+ /* FULL SCREEN IS A PROJECTOR: the bars round a slide whose shape is not the
23328
+ screen's are black, whatever the theme, so the room sees the slide alone. */
23329
+ :fullscreen .crewlet-slide-stage--contain,
23330
+ :fullscreen .crewlet-slide-stage--view,
23331
+ .crewlet-slide-stage:fullscreen {
23332
+ background: var(--color-projection-letterbox);
23333
+ }
23334
+
22179
23335
  /* Until it is measured, and wherever it is not (no layout), a view stage is
22180
23336
  its slide's shape at its width. In full screen it fills the box, sharing a
22181
23337
  flex column with the show's controls. */
@@ -22208,7 +23364,7 @@ svg.crewlet-select__chevron {
22208
23364
  }
22209
23365
 
22210
23366
 
22211
- /* StatCard-KPAFD4E2.css */
23367
+ /* StatCard-4T7TMWMN.css */
22212
23368
  /*
22213
23369
  * The stat tile.
22214
23370
  *
@@ -22283,12 +23439,18 @@ svg.crewlet-select__chevron {
22283
23439
  * The value's line: the number at its start, the figure at its end, both on
22284
23440
  * the line's FOOT, so a 28px number and a 28px sparkline share a baseline
22285
23441
  * rather than centring on each other.
23442
+ *
23443
+ * THE FIGURE GIVES WAY BEFORE THE NUMBER. Where a tile is too narrow for
23444
+ * both (a row of tiles on a phone, two to a line), the figure moves under the
23445
+ * number rather than the number being cut to its first digit: "2…" beside a
23446
+ * meter said nothing, and the meter alone says less than the number.
22286
23447
  */
22287
23448
  .crewlet-statcard__reading {
22288
23449
  display: flex;
23450
+ flex-wrap: wrap;
22289
23451
  align-items: flex-end;
22290
23452
  justify-content: space-between;
22291
- gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
23453
+ gap: var(--spacing-2) calc(var(--spacing-2) + var(--spacing-1) / 2);
22292
23454
  min-width: 0;
22293
23455
  }
22294
23456
 
@@ -22297,40 +23459,51 @@ svg.crewlet-select__chevron {
22297
23459
  * track, with tabular figures so a number that ticks up moves nothing beside
22298
23460
  * it.
22299
23461
  *
22300
- * ITS LINE IS THE GLYPH'S OWN HEIGHT (a leading of 1). The value is one line
23462
+ * ITS LINE IS THE GLYPH'S OWN HEIGHT (a leading of 1). The number is one line
22301
23463
  * that never wraps, and any leading over it is air under the digits that
22302
23464
  * opens between the number and the line below it and stands the number
22303
23465
  * higher than the figure it shares a foot with.
22304
23466
  *
22305
- * A BLOCK, NOT A FLEX ROW, because it is one line of text that has to END
22306
- * rather than stop: `text-overflow` acts on a block container only, and as a
22307
- * flex row the number and its unit were anonymous flex items no rule could
22308
- * reach, so a value too long for its tile was cut mid-digit with nothing to
22309
- * say a digit was lost. The unit sits on the same line as inline text, on
22310
- * the number's baseline.
23467
+ * THE NUMBER ENDS, THE UNIT MOVES. The number and its unit are a wrapping
23468
+ * row on one baseline: where the tile is too narrow for both, the unit moves
23469
+ * under the number whole ("of 10 GB"), rather than being cut to "of 1…"; and
23470
+ * the number, alone on its line and still too long, ends in an ellipsis
23471
+ * rather than stopping mid-digit with nothing to say a digit was lost. The
23472
+ * ellipsis is the number's own box's, since `text-overflow` acts on a block
23473
+ * container only.
22311
23474
  */
22312
23475
  .crewlet-statcard__value {
22313
- display: block;
22314
- flex: 1 1 auto;
23476
+ display: flex;
23477
+ flex-wrap: wrap;
23478
+ align-items: baseline;
23479
+ gap: var(--spacing-1);
23480
+ /* Never narrower than the number, so the figure wraps first; never wider
23481
+ than the tile, so a number too long for the tile alone still ends. */
23482
+ flex: 1 0 auto;
22315
23483
  min-width: 0;
23484
+ max-width: 100%;
22316
23485
  font-size: var(--font-size-display);
22317
23486
  font-weight: var(--font-weight-semibold);
22318
23487
  letter-spacing: var(--font-letter-spacing-tight);
22319
23488
  line-height: 1;
22320
23489
  font-variant-numeric: tabular-nums;
23490
+ }
23491
+
23492
+ .crewlet-statcard__number {
23493
+ min-width: 0;
22321
23494
  overflow: hidden;
22322
23495
  text-overflow: ellipsis;
22323
23496
  white-space: nowrap;
22324
23497
  }
22325
23498
 
22326
- /* The unit, "/ 7" after the 4: the quiet ink at a text step, medium, so it
22327
- reads as part of the figure rather than as a second one. */
23499
+ /* The unit, on the number's baseline at a quieter weight, kept whole. */
22328
23500
  .crewlet-statcard__unit {
22329
- margin-inline-start: var(--spacing-1);
23501
+ flex: none;
22330
23502
  font-size: var(--font-size-sm);
22331
23503
  font-weight: var(--font-weight-medium);
22332
23504
  letter-spacing: var(--font-letter-spacing-normal);
22333
23505
  color: var(--color-text-tertiary);
23506
+ white-space: nowrap;
22334
23507
  }
22335
23508
 
22336
23509
  /*
@@ -22348,6 +23521,16 @@ svg.crewlet-select__chevron {
22348
23521
  min-width: 0;
22349
23522
  }
22350
23523
 
23524
+ /* BELOW: the figure under the number, as wide as the tile. */
23525
+ .crewlet-statcard__reading--below {
23526
+ flex-direction: column;
23527
+ align-items: stretch;
23528
+ }
23529
+
23530
+ .crewlet-statcard__reading--below > .crewlet-statcard__trend {
23531
+ width: auto;
23532
+ }
23533
+
22351
23534
  .crewlet-statcard__trend > :where(button, a) {
22352
23535
  align-self: flex-end;
22353
23536
  }
@@ -23681,7 +24864,7 @@ b.crewlet-switcher__match {
23681
24864
  }
23682
24865
 
23683
24866
 
23684
- /* Tabs-CJGO35BH.css */
24867
+ /* Tabs-MMZXV5EF.css */
23685
24868
  /*
23686
24869
  * The pill register: Tabs and SegmentedControl.
23687
24870
  *
@@ -23779,13 +24962,14 @@ b.crewlet-switcher__match {
23779
24962
  * chips floated; the raised rung is held a visible step above the card by the
23780
24963
  * palette suite, and the hairline finds it on any other ground.
23781
24964
  *
23782
- * The inset is 2px, which is smaller than the scale's first step on purpose:
23783
- * it is the gap a chip needs to read as sitting IN the well. With the 1px
23784
- * boundary it is three pixels a side, and a 24px chip makes a 30px row: the
23785
- * medium control step, the height of the button beside it.
24965
+ * The inset is 1px, a hairline of the well's own ground round each chip:
24966
+ * with the 1px boundary it is two pixels a side, and a 24px chip makes a 28px
24967
+ * row, the tab step. Tabs sit between the 26px controls of a toolbar or a
24968
+ * panel and the 32px actions of a page, so a row of them reads as the place's
24969
+ * navigation rather than as one more button beside them.
23786
24970
  */
23787
24971
  .crewlet-tabs--pill {
23788
- --crewlet-tabs-pill-inset: 2px;
24972
+ --crewlet-tabs-pill-inset: 1px;
23789
24973
 
23790
24974
  gap: var(--crewlet-tabs-pill-inset);
23791
24975
  padding: var(--crewlet-tabs-pill-inset);
@@ -23889,8 +25073,8 @@ b.crewlet-switcher__match {
23889
25073
  * can hit. max() against --size-target-min holds every density at 24px or
23890
25074
  * more, and at density 1 the two agree.
23891
25075
  *
23892
- * The corner is the small radius, the design's: the well's 8px less its 1px
23893
- * boundary and 2px inset is 5px, and a chip a pixel rounder than that
25076
+ * The corner is the chip radius (--radius-chip): the well's 8px less its 1px
25077
+ * boundary and 1px inset is 6px, and a chip a pixel rounder than that
23894
25078
  * concentric curve is what reads as a chip sitting IN the well rather than a
23895
25079
  * second well inside it. The side pad is the design's 10px, two steps and a
23896
25080
  * half.
@@ -23908,7 +25092,7 @@ b.crewlet-switcher__match {
23908
25092
  .crewlet-tabs--pill .crewlet-tabs__tab {
23909
25093
  min-height: max(var(--size-target-min), calc(var(--size-control-md) - 6px));
23910
25094
  padding: 0 calc(var(--spacing-2) + var(--spacing-1) / 2);
23911
- border-radius: var(--radius-sm);
25095
+ border-radius: var(--radius-chip);
23912
25096
  color: var(--color-text-secondary);
23913
25097
  font-size: var(--font-size-xs);
23914
25098
  }
@@ -25952,7 +27136,7 @@ svg.crewlet-time-window__tick {
25952
27136
  }
25953
27137
 
25954
27138
 
25955
- /* Toaster-EOOOTSJT.css */
27139
+ /* Toaster-C6BQ7L6I.css */
25956
27140
  /*
25957
27141
  * The toast stack, drawn as the first release drew it (24a60c3): a dark strip
25958
27142
  * on the page's deepest ground with the large shadow and the rim light, a
@@ -26189,13 +27373,22 @@ svg.crewlet-time-window__tick {
26189
27373
  * THE COUNTDOWN IS A WASH BEHIND THE WORDS, the variant's soft step over the
26190
27374
  * whole strip, draining from the right as the time runs out. It sits under
26191
27375
  * every raised child, and it is the timer's picture, not the timer.
27376
+ *
27377
+ * ITS LEADING EDGE FADES OUT rather than stopping. Cut square, the wash read
27378
+ * as a strip painted in two tones whenever it stood still: in a still frame,
27379
+ * and under the pointer, which pauses it, which is when a reader is looking.
27380
+ * Feathered, a stopped wash still reads as a tint running out.
26192
27381
  */
26193
27382
  .crewlet-toast__progress {
26194
27383
  position: absolute;
26195
27384
  inset: 0;
26196
27385
  z-index: var(--z-index-base);
26197
27386
  transform-origin: left center;
26198
- background: var(--crewlet-toast-wash);
27387
+ background: linear-gradient(
27388
+ to right,
27389
+ var(--crewlet-toast-wash) calc(100% - var(--spacing-7)),
27390
+ transparent
27391
+ );
26199
27392
  pointer-events: none;
26200
27393
  animation-name: crewlet-toast-drain;
26201
27394
  animation-timing-function: linear;
@@ -27987,7 +29180,7 @@ svg.crewlet-time-window__tick {
27987
29180
  }
27988
29181
 
27989
29182
 
27990
- /* WidgetFrame-LRZIL62O.css */
29183
+ /* WidgetFrame-BTFW3CRK.css */
27991
29184
  /*
27992
29185
  * WidgetFrame: one figure on a dashboard. A title row, the figure filling the
27993
29186
  * height the host's frame gives it, and the citation line at the foot.
@@ -28050,6 +29243,11 @@ svg.crewlet-time-window__tick {
28050
29243
  line-clamp: 2;
28051
29244
  }
28052
29245
 
29246
+ /* A held title keeps its two lines empty or not (see `holdTitle`). */
29247
+ .crewlet-widget-frame--hold-title .crewlet-widget-frame__title {
29248
+ min-height: calc(2 * 1em * var(--font-line-height-snug));
29249
+ }
29250
+
28053
29251
  /* The controls stand on the title's first line: the box is one line of the
28054
29252
  title tall and the control is centred in it, whatever its own height. */
28055
29253
  .crewlet-widget-frame__actions {
@@ -28067,15 +29265,27 @@ svg.crewlet-time-window__tick {
28067
29265
  overflow: auto;
28068
29266
  }
28069
29267
 
28070
- /* A flush figure reaches the frame's sides, and a table's cells take the
28071
- frame's inset, so its first column starts under the title and its row
28072
- rules meet the border. */
29268
+ /*
29269
+ * A flush figure reaches the frame's sides, and a table's OUTER cells take the
29270
+ * frame's inset, so its first column starts under the title, its last ends
29271
+ * where the title row's controls do, and its row rules meet the border.
29272
+ *
29273
+ * ONLY THE OUTER ONES. Every cell took the frame's 16px a side, so two columns
29274
+ * stood 32px apart and a table of eight columns ran past a widget the full
29275
+ * width of a board; between columns a cell keeps the compact table's own
29276
+ * inset. The last column is the last before the table's trailing spacer,
29277
+ * which is not a column of the data.
29278
+ */
28073
29279
  .crewlet-widget-frame--flush .crewlet-widget-frame__body {
28074
29280
  padding-inline: 0;
28075
29281
  }
28076
29282
 
28077
- .crewlet-widget-frame--flush .crewlet-data-table--compact {
28078
- --crewlet-data-table-cell-pad-x: var(--spacing-4);
29283
+ .crewlet-widget-frame--flush .crewlet-data-table--compact :is(th, td):first-child {
29284
+ padding-inline-start: var(--spacing-4);
29285
+ }
29286
+
29287
+ .crewlet-widget-frame--flush .crewlet-data-table--compact :is(th, td):nth-last-child(1 of :not(.crewlet-data-table__th--spacer, .crewlet-data-table__td--spacer)) {
29288
+ padding-inline-end: var(--spacing-4);
28079
29289
  }
28080
29290
 
28081
29291
  /* A stat tile drawn flush as the figure stands on the frame's inset; its own
@@ -28085,6 +29295,23 @@ svg.crewlet-time-window__tick {
28085
29295
  padding: 0;
28086
29296
  }
28087
29297
 
29298
+ /* A FRAME TOO NARROW FOR THE DISPLAY NUMBER sets it a step down rather than
29299
+ cutting it: two columns of a board are about 120px, and a number at the
29300
+ display step lost its last digits there ("123.…"). */
29301
+ @container crewlet-widget-frame (width < 11rem) {
29302
+ .crewlet-widget-frame__body .crewlet-statcard__value {
29303
+ font-size: var(--font-size-xl);
29304
+ }
29305
+ }
29306
+
29307
+ /* NOR DOES IT RESERVE A SECOND LINE IT HAS NOTHING FOR. The reserve keeps a
29308
+ StatGroup's tiles at one height; a frame takes its height from the board,
29309
+ and the empty line stood as a band of air between the number and the
29310
+ citation that no other figure has. */
29311
+ .crewlet-widget-frame__body .crewlet-statcard__sub:empty {
29312
+ display: none;
29313
+ }
29314
+
28088
29315
  .crewlet-widget-frame__blocked {
28089
29316
  display: flex;
28090
29317
  align-items: flex-start;
@@ -28180,8 +29407,18 @@ svg.crewlet-time-window__tick {
28180
29407
  align-items: flex-start;
28181
29408
  }
28182
29409
 
29410
+ /* STACKED, THE TITLE TAKES A SECOND LINE BEFORE IT ENDS: a frame three
29411
+ columns wide cut "Deploys for the chosen service" to "Deploys for the
29412
+ chosen se…". Past two lines it ends in an ellipsis, and the whole title
29413
+ is the citation's tooltip. */
28183
29414
  .crewlet-widget-frame__source {
29415
+ display: -webkit-box;
28184
29416
  max-width: 100%;
29417
+ white-space: normal;
29418
+ overflow-wrap: anywhere;
29419
+ -webkit-box-orient: vertical;
29420
+ -webkit-line-clamp: 2;
29421
+ line-clamp: 2;
28185
29422
  }
28186
29423
 
28187
29424
  .crewlet-widget-frame__when::before {