@crewlethq/ui 0.36.0 → 0.37.1

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 (201) hide show
  1. package/README.md +41 -1
  2. package/dist/AgentHandoffPanel/index.js +4 -4
  3. package/dist/AppShell/index.d.ts +1 -0
  4. package/dist/AppShell/index.js +5 -3
  5. package/dist/{AppShell-JTSEOA57.css → AppShell-JBCZSSX3.css} +14 -2
  6. package/dist/ArrangeList/index.js +4 -4
  7. package/dist/ArtifactAccess/ArtifactAccess.d.ts +40 -0
  8. package/dist/ArtifactAccess/index.d.ts +3 -0
  9. package/dist/ArtifactAccess/index.js +2 -0
  10. package/dist/ArtifactAccess-Y53ZTRFS.css +31 -0
  11. package/dist/ArtifactBar/index.js +9 -7
  12. package/dist/ArtifactCard/ArtifactCard.d.ts +1 -6
  13. package/dist/ArtifactCard/index.d.ts +2 -1
  14. package/dist/ArtifactCard/index.js +3 -2
  15. package/dist/ArtifactCover/index.js +3 -3
  16. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +1 -1
  17. package/dist/ArtifactKindIllustration/index.js +1 -1
  18. package/dist/{ArtifactKindIllustration-5KTP43QS.css → ArtifactKindIllustration-KLFL7KBG.css} +1 -1
  19. package/dist/ArtifactMakeRow/index.d.ts +1 -0
  20. package/dist/ArtifactMakeRow/index.js +2 -1
  21. package/dist/{ArtifactMakeRow-RWUTS5MC.css → ArtifactMakeRow-W3RD5YWZ.css} +7 -2
  22. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +37 -0
  23. package/dist/ArtifactNameCell/index.d.ts +4 -0
  24. package/dist/ArtifactNameCell/index.js +4 -0
  25. package/dist/ArtifactNameCell-RTVP4LO4.css +104 -0
  26. package/dist/AvatarPicker/index.js +8 -6
  27. package/dist/Canvas/index.js +4 -3
  28. package/dist/CanvasBoard/index.js +7 -6
  29. package/dist/CanvasToolbar/index.js +6 -5
  30. package/dist/ChangeMark/index.js +4 -3
  31. package/dist/Checkbox/index.js +3 -3
  32. package/dist/ChoiceList/index.d.ts +1 -0
  33. package/dist/ChoiceList/index.js +2 -1
  34. package/dist/{ChoiceList-EA2W6MOS.css → ChoiceList-KFYFAECP.css} +26 -4
  35. package/dist/Combobox/index.d.ts +1 -0
  36. package/dist/Combobox/index.js +6 -5
  37. package/dist/{Combobox-4FUVYIE7.css → Combobox-YDONYDTM.css} +2 -1
  38. package/dist/CommandPalette/index.d.ts +1 -0
  39. package/dist/CommandPalette/index.js +7 -6
  40. package/dist/{CommandPalette-7CFGVBND.css → CommandPalette-TOZYLWLE.css} +5 -1
  41. package/dist/CommentThread/index.js +5 -5
  42. package/dist/Composer/index.js +3 -3
  43. package/dist/{Composer-PXITWNEK.css → Composer-TXULCPPV.css} +1 -1
  44. package/dist/ConfirmField/index.js +3 -3
  45. package/dist/DataTable/index.js +7 -7
  46. package/dist/DataView/index.js +12 -12
  47. package/dist/DatasetSource/index.d.ts +1 -0
  48. package/dist/DatasetSource/index.js +2 -1
  49. package/dist/{DatasetSource-SMGX4PS5.css → DatasetSource-FFKTD3ZU.css} +16 -1
  50. package/dist/DateTimePicker/index.js +4 -4
  51. package/dist/{DateTimePicker-2IVTKFV2.css → DateTimePicker-3A7JIIVL.css} +3 -3
  52. package/dist/DocTabsEditor/index.js +5 -5
  53. package/dist/Document/index.js +2 -2
  54. package/dist/{Document-YFWTWXJP.css → Document-TZ2NBLOR.css} +2 -2
  55. package/dist/{Editor-HORWMUM3.js → Editor-QV4JP242.js} +6 -6
  56. package/dist/FactList/index.js +4 -3
  57. package/dist/FollowBanner/index.js +3 -2
  58. package/dist/HitArea/hitArea.d.ts +7 -0
  59. package/dist/HitArea/index.d.ts +2 -0
  60. package/dist/HitArea/index.js +2 -0
  61. package/dist/HitArea-QUOS6ZDJ.css +35 -0
  62. package/dist/HuePicker/index.js +4 -3
  63. package/dist/Input/index.js +2 -2
  64. package/dist/{Input-ABGOFENS.css → Input-OQZBCRX5.css} +9 -4
  65. package/dist/Layer/index.js +2 -1
  66. package/dist/LinkInterstitial/index.js +4 -3
  67. package/dist/ListInput/index.js +4 -4
  68. package/dist/Listbox/index.js +3 -2
  69. package/dist/{Listbox-6WJNJQVQ.css → Listbox-NQV6E3FS.css} +3 -0
  70. package/dist/LivePreview/LivePreview.d.ts +15 -3
  71. package/dist/LivePreview/index.d.ts +2 -2
  72. package/dist/LivePreview/index.js +1 -1
  73. package/dist/{LivePreview-BROGKR4N.css → LivePreview-KQEDMQCY.css} +13 -0
  74. package/dist/MarkdownEditor/index.js +8 -6
  75. package/dist/Menu/index.js +3 -2
  76. package/dist/MergeConflicts/index.js +5 -4
  77. package/dist/Modal/index.js +3 -2
  78. package/dist/OrgTable/index.js +4 -3
  79. package/dist/Popover/index.js +3 -2
  80. package/dist/PresenterView/index.js +4 -3
  81. package/dist/PrincipalPicker/index.js +7 -6
  82. package/dist/RichEditor/index.js +1 -1
  83. package/dist/SegmentedControl/index.d.ts +1 -0
  84. package/dist/SegmentedControl/index.js +4 -3
  85. package/dist/{SegmentedControl-FLI45IOW.css → SegmentedControl-B7XCUOML.css} +9 -2
  86. package/dist/Select/index.d.ts +1 -0
  87. package/dist/Select/index.js +5 -4
  88. package/dist/{Select-W3CHTZXP.css → Select-F526HLNR.css} +5 -4
  89. package/dist/ShareDialog/index.js +7 -6
  90. package/dist/SheetColumnEditor/index.js +12 -11
  91. package/dist/SheetGrid/index.js +7 -6
  92. package/dist/{SheetGrid-YRDXTIIZ.css → SheetGrid-XK7T7M34.css} +9 -4
  93. package/dist/Shortcut/index.js +3 -2
  94. package/dist/SidebarNav/index.d.ts +1 -0
  95. package/dist/SidebarNav/index.js +2 -1
  96. package/dist/{SidebarNav-KF66MLOM.css → SidebarNav-7SGUZYKK.css} +21 -2
  97. package/dist/SlideCompare/index.js +4 -3
  98. package/dist/SlideFilmstrip/index.js +5 -4
  99. package/dist/SlideGrid/index.js +4 -3
  100. package/dist/SlideStage/index.js +3 -2
  101. package/dist/SourceEditor/index.js +2 -2
  102. package/dist/{SourceEditor-QAYE2JS6.css → SourceEditor-OKPWPFXK.css} +1 -1
  103. package/dist/Switcher/index.js +7 -7
  104. package/dist/Tabs/index.d.ts +1 -0
  105. package/dist/Tabs/index.js +2 -1
  106. package/dist/{Tabs-MMZXV5EF.css → Tabs-WIF7457H.css} +20 -3
  107. package/dist/TagsInput/index.js +4 -4
  108. package/dist/{TagsInput-7EGBBXHS.css → TagsInput-CLFHP6I2.css} +1 -1
  109. package/dist/ThemeGallery/index.js +4 -3
  110. package/dist/ThemeSwitcher/index.js +5 -4
  111. package/dist/TimeWindowPicker/index.js +8 -7
  112. package/dist/{TimeWindowPicker-DEFDV77Z.css → TimeWindowPicker-I3HXC74I.css} +3 -3
  113. package/dist/Toaster/index.js +2 -1
  114. package/dist/Toolbar/index.js +3 -2
  115. package/dist/Tooltip/index.js +3 -2
  116. package/dist/TreeCanvas/index.js +5 -4
  117. package/dist/TreeGrid/index.js +3 -2
  118. package/dist/VersionCompare/index.js +5 -4
  119. package/dist/{chunk-CCAXYHQS.js → chunk-2QZ2VPHR.js} +3 -1
  120. package/dist/chunk-2YTOOH3A.js +4 -0
  121. package/dist/{chunk-QWNVSR6G.js → chunk-3KYVFG47.js} +1 -1
  122. package/dist/{chunk-3PTUDKSR.js → chunk-3SBM4DGI.js} +4 -4
  123. package/dist/{chunk-H5NOLRGH.js → chunk-3V5T5K5H.js} +1 -1
  124. package/dist/chunk-4ISUIS6F.js +3 -0
  125. package/dist/{chunk-PLTCDSTU.js → chunk-4LRAJXHL.js} +1 -1
  126. package/dist/{chunk-4ZJLOKSS.js → chunk-5BUOMF6N.js} +2 -2
  127. package/dist/{chunk-47JQAGRV.js → chunk-66X5WDKE.js} +1 -1
  128. package/dist/{chunk-MRMHZ437.js → chunk-6NNY5WBF.js} +7 -6
  129. package/dist/{chunk-5RT5O4JR.js → chunk-7CGPPAYR.js} +1 -1
  130. package/dist/{chunk-F73MC7EZ.js → chunk-7KHM2FZH.js} +2 -2
  131. package/dist/{chunk-VL6CUNSX.js → chunk-7SDUKCNW.js} +4 -1
  132. package/dist/{chunk-XMRTFPWX.js → chunk-A23KDROH.js} +3 -3
  133. package/dist/{chunk-N5SKHIAP.js → chunk-A72JPXIV.js} +8 -6
  134. package/dist/{chunk-PJIPUEJ3.js → chunk-AXS6MBNH.js} +1 -1
  135. package/dist/{chunk-2FPENTCF.js → chunk-AYHIF6DH.js} +1 -1
  136. package/dist/{chunk-J6ON5SYE.js → chunk-B5J23C73.js} +1 -1
  137. package/dist/{chunk-7VAUGG6B.js → chunk-B5UHX5UC.js} +2 -2
  138. package/dist/chunk-BGLKLXL3.js +29 -0
  139. package/dist/{chunk-FHHYXZSP.js → chunk-C7OKDYBH.js} +2 -2
  140. package/dist/{chunk-JBUMD6DS.js → chunk-CFGGE3HO.js} +1 -1
  141. package/dist/{chunk-XGBLRDSU.js → chunk-CQFQGAZI.js} +17 -7
  142. package/dist/{chunk-GMLAKNFY.js → chunk-D2OL3ZSS.js} +1 -1
  143. package/dist/{chunk-D7GNNID2.js → chunk-D3EJSLCL.js} +2 -2
  144. package/dist/{chunk-BUVCV3WI.js → chunk-D6FEHY5G.js} +3 -2
  145. package/dist/{chunk-4BYHAOHH.js → chunk-DAERKOOG.js} +3 -2
  146. package/dist/{chunk-IQH3DDZ2.js → chunk-DOLATMGF.js} +2 -2
  147. package/dist/{chunk-W3HYWD63.js → chunk-DZSBFITC.js} +15 -8
  148. package/dist/{chunk-PPFX6GRK.js → chunk-EAEJ7CDM.js} +6 -3
  149. package/dist/{chunk-WZGYIVYH.js → chunk-EAQLI2SO.js} +4 -2
  150. package/dist/{chunk-GYBDPCRC.js → chunk-ECGGQX2H.js} +2 -2
  151. package/dist/{chunk-FG4O64DV.js → chunk-F3WZ5AKM.js} +5 -5
  152. package/dist/{chunk-SUXP4OBT.js → chunk-F4LPQA4E.js} +1 -1
  153. package/dist/{chunk-KYZMN6I6.js → chunk-FBW3Q2OY.js} +2 -2
  154. package/dist/{chunk-JQLS3MZB.js → chunk-FWBKMPNR.js} +1 -1
  155. package/dist/{chunk-OOWPSBIS.js → chunk-GMW4ZHST.js} +3 -3
  156. package/dist/{chunk-R25RGPUB.js → chunk-H5XTJ7GJ.js} +2 -3
  157. package/dist/{chunk-PGZ2R3ON.js → chunk-HDHZWIFL.js} +8 -6
  158. package/dist/{chunk-GRYZ5EP3.js → chunk-HMLAWVG6.js} +13 -2
  159. package/dist/{chunk-6ZJ3N7QI.js → chunk-I33UIUZD.js} +1 -1
  160. package/dist/{chunk-RH2NCQBZ.js → chunk-ISA2O2BK.js} +2 -2
  161. package/dist/{chunk-K3IJQNB7.js → chunk-KHJIEPZV.js} +3 -2
  162. package/dist/{chunk-ES4RKQ7B.js → chunk-MG3HTY6F.js} +7 -7
  163. package/dist/chunk-MICRGE3J.js +1 -0
  164. package/dist/{chunk-WNAYQQ6Y.js → chunk-MMPKN7WV.js} +2 -2
  165. package/dist/{chunk-PGRPNDWM.js → chunk-NR4CPM4T.js} +1 -1
  166. package/dist/{chunk-5WDXPHEW.js → chunk-NRBAXRWE.js} +1 -1
  167. package/dist/{chunk-66ADEPFB.js → chunk-NS4NSHVX.js} +5 -3
  168. package/dist/{chunk-YSGLEHND.js → chunk-NUZHC6MM.js} +14 -2
  169. package/dist/{chunk-WGD2HX2A.js → chunk-OED6LUWE.js} +1 -1
  170. package/dist/{chunk-OSZDHN5Z.js → chunk-OHA6WSAG.js} +5 -10
  171. package/dist/chunk-P5VGSVWG.js +39 -0
  172. package/dist/{chunk-KJW2AS57.js → chunk-PEUGPAKH.js} +1 -1
  173. package/dist/{chunk-IPAU6FLH.js → chunk-PPHTIKZO.js} +1 -1
  174. package/dist/{chunk-P6WFZDKS.js → chunk-PWG3VHRQ.js} +2 -2
  175. package/dist/{chunk-HOIZ6MIS.js → chunk-RLJXVFEH.js} +1 -1
  176. package/dist/{chunk-NQGPD6NX.js → chunk-RMEBFYL7.js} +1 -1
  177. package/dist/{chunk-APDKUGSH.js → chunk-S27UBCVX.js} +5 -4
  178. package/dist/{chunk-XEGZHHRH.js → chunk-SVGARBDY.js} +1 -1
  179. package/dist/{chunk-UWGUKMBK.js → chunk-SYBYFQTY.js} +2 -2
  180. package/dist/{chunk-IUYUS2SO.js → chunk-TYONQSOK.js} +2 -2
  181. package/dist/{chunk-L4WZSVMT.js → chunk-UB6MLXUL.js} +3 -3
  182. package/dist/{chunk-MJW6SQYB.js → chunk-UBZDYOCA.js} +1 -1
  183. package/dist/{chunk-2DV4THNQ.js → chunk-UWRBD2YO.js} +2 -2
  184. package/dist/{chunk-DEMALFHY.js → chunk-UXYEOWG5.js} +1 -1
  185. package/dist/{chunk-UCCC7YVZ.js → chunk-W7PAIVAP.js} +4 -2
  186. package/dist/{chunk-T5RQGI6O.js → chunk-X3UYTAOG.js} +1 -1
  187. package/dist/{chunk-VKKUGZ3G.js → chunk-XQZ6EWOE.js} +8 -5
  188. package/dist/{chunk-TVRBQMIX.js → chunk-YPMGP2X4.js} +6 -6
  189. package/dist/{chunk-EOQFPZEE.js → chunk-YSG3DW7W.js} +1 -1
  190. package/dist/{chunk-2QEDJSJC.js → chunk-ZMDYQ2HH.js} +1 -1
  191. package/dist/{chunk-27GD7LVR.js → chunk-ZMWXE4GT.js} +1 -1
  192. package/dist/generated/index.d.ts +3 -0
  193. package/dist/generated/index.js +109 -105
  194. package/dist/index.js +109 -105
  195. package/dist/styles.css +371 -63
  196. package/dist/utils/focusModality.d.ts +17 -1
  197. package/dist/utils/index.d.ts +1 -1
  198. package/dist/utils/index.js +1 -1
  199. package/package.json +3 -3
  200. package/dist/chunk-WKEPORNM.js +0 -2
  201. /package/dist/{chunk-5BP6IS3N.js → chunk-4QQ3MND5.js} +0 -0
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-JTSEOA57.css */
705
+ /* AppShell-JBCZSSX3.css */
706
706
  /*
707
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
708
708
  * floats beside it.
@@ -851,10 +851,11 @@
851
851
  /* The same gutter the nav takes, so what the foot says lines up with the rows
852
852
  above it rather than sitting further out. */
853
853
  .crewlet-app-shell__rail-foot {
854
+ --crewlet-rail-foot-gap: var(--spacing-1);
854
855
  flex: none;
855
856
  display: flex;
856
857
  flex-direction: column;
857
- gap: var(--spacing-1);
858
+ gap: var(--crewlet-rail-foot-gap);
858
859
  padding: var(--spacing-2) var(--size-nav-gutter);
859
860
  border-top: 1px solid var(--color-border-default);
860
861
  }
@@ -914,6 +915,10 @@
914
915
 
915
916
  .crewlet-app-shell__rail-row--action,
916
917
  .crewlet-app-shell__rail-foot > .crewlet-btn {
918
+ /* Half the foot's gap to each neighbour, so the rows' targets meet
919
+ (HitArea.css), across the row's 1px border; the account row below
920
+ reaches back the same way. */
921
+ --crewlet-hit-area-block: calc(var(--crewlet-rail-foot-gap, 0px) / 2 + 1px);
917
922
  cursor: pointer;
918
923
  transition:
919
924
  background var(--motion-duration-fast) var(--motion-easing-default),
@@ -1340,11 +1345,12 @@
1340
1345
  * the controls off the rail.
1341
1346
  */
1342
1347
  .crewlet-account-row {
1348
+ --crewlet-account-row-pad: var(--spacing-1);
1343
1349
  display: flex;
1344
1350
  align-items: center;
1345
1351
  gap: var(--spacing-1);
1346
1352
  min-width: 0;
1347
- padding: var(--spacing-1) 0;
1353
+ padding: var(--crewlet-account-row-pad) 0;
1348
1354
  }
1349
1355
 
1350
1356
  .crewlet-account-row__who {
@@ -1361,6 +1367,12 @@
1361
1367
  transition: background var(--motion-duration-fast) var(--motion-easing-default);
1362
1368
  }
1363
1369
 
1370
+ /* In the rail's foot, the account row reaches up across its own padding to
1371
+ half the foot's gap, to meet the row above (HitArea.css). */
1372
+ .crewlet-app-shell__rail-foot .crewlet-account-row__who {
1373
+ --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
1374
+ }
1375
+
1364
1376
  /* The row as the reader's menu button: a button drawn as the link is. */
1365
1377
  button.crewlet-account-row__who {
1366
1378
  width: 100%;
@@ -2212,6 +2224,40 @@ button.crewlet-account-row__who:focus-visible {
2212
2224
  }
2213
2225
 
2214
2226
 
2227
+ /* ArtifactAccess-Y53ZTRFS.css */
2228
+ /*
2229
+ * An artifact's access as a glyph and its word. No colour of its own: the
2230
+ * glyph is the tertiary step and the word the secondary, one step stronger
2231
+ * where others can open it.
2232
+ */
2233
+
2234
+ .crewlet-artifact-access {
2235
+ display: inline-flex;
2236
+ align-items: center;
2237
+ gap: calc(var(--spacing-1) * 1.5);
2238
+ min-width: 0;
2239
+ max-width: 100%;
2240
+ color: var(--color-text-tertiary);
2241
+ }
2242
+
2243
+ .crewlet-artifact-access__glyph {
2244
+ display: inline-flex;
2245
+ flex: none;
2246
+ }
2247
+
2248
+ .crewlet-artifact-access__word {
2249
+ min-width: 0;
2250
+ overflow: hidden;
2251
+ text-overflow: ellipsis;
2252
+ white-space: nowrap;
2253
+ }
2254
+
2255
+ .crewlet-artifact-access--shared,
2256
+ .crewlet-artifact-access--company {
2257
+ color: var(--color-text-secondary);
2258
+ }
2259
+
2260
+
2215
2261
  /* ArtifactBar-FWPBBKQ5.css */
2216
2262
  /*
2217
2263
  * One row, one hairline under it, the height of a large row. The lead (the
@@ -2991,9 +3037,9 @@ button.crewlet-account-row__who:focus-visible {
2991
3037
  }
2992
3038
 
2993
3039
 
2994
- /* ArtifactKindIllustration-5KTP43QS.css */
3040
+ /* ArtifactKindIllustration-KLFL7KBG.css */
2995
3041
  /*
2996
- * A kind's drawing, its tinted ground and the Make something new tile.
3042
+ * A kind's drawing, its tinted ground and the "Start a new artifact" tile.
2997
3043
  *
2998
3044
  * Every colour is the kind's token, `--color-artifact-kind-<kind>` and its
2999
3045
  * Fill and Line steps, set once per kind on `--crewlet-kind-*`
@@ -3265,9 +3311,9 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3265
3311
  .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3266
3312
 
3267
3313
 
3268
- /* ArtifactMakeRow-RWUTS5MC.css */
3314
+ /* ArtifactMakeRow-W3RD5YWZ.css */
3269
3315
  /*
3270
- * The Make something new tray.
3316
+ * The "Start a new artifact" tray.
3271
3317
  *
3272
3318
  * Every colour is a token: the tray's ground, its dots and its hairlines are
3273
3319
  * the surface and border steps, and each kind's mark reads the kind's own
@@ -3294,9 +3340,10 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3294
3340
  }
3295
3341
 
3296
3342
  .crewlet-make-row__list {
3343
+ --crewlet-make-row-gap: var(--spacing-1);
3297
3344
  display: grid;
3298
3345
  grid-template-columns: repeat(3, minmax(0, 1fr));
3299
- gap: var(--spacing-1);
3346
+ gap: var(--crewlet-make-row-gap);
3300
3347
  margin: 0;
3301
3348
  padding: var(--spacing-1);
3302
3349
  list-style: none;
@@ -3321,6 +3368,10 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3321
3368
  color: var(--color-text-primary);
3322
3369
  text-decoration: none;
3323
3370
  outline: none;
3371
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css), and
3372
+ the 1px border the reach is measured inside of. */
3373
+ --crewlet-hit-area-block: calc(var(--crewlet-make-row-gap) / 2 + 1px);
3374
+ --crewlet-hit-area-inline: calc(var(--crewlet-make-row-gap) / 2 + 1px);
3324
3375
  transition:
3325
3376
  background-color var(--motion-duration-fast) var(--motion-easing-out),
3326
3377
  border-color var(--motion-duration-fast) var(--motion-easing-out),
@@ -3435,6 +3486,113 @@ a.crewlet-make-row__item:active {
3435
3486
  }
3436
3487
 
3437
3488
 
3489
+ /* ArtifactNameCell-RTVP4LO4.css */
3490
+ /*
3491
+ * An artifact's name in a list: the kind's mark on its tint, the title over
3492
+ * one quiet line. Every colour is a token: the mark reads the kind's own Fill,
3493
+ * Line and Ink (`ArtifactKinds.css`), the words the text steps.
3494
+ */
3495
+
3496
+ .crewlet-artifact-name {
3497
+ display: flex;
3498
+ align-items: center;
3499
+ gap: var(--spacing-3);
3500
+ min-width: 0;
3501
+ max-width: 100%;
3502
+ padding-block: var(--spacing-1);
3503
+ }
3504
+
3505
+ /* THE MARK, the Make row's tile at a list's size: the kind's glyph on its
3506
+ tint inside the kind's hairline. */
3507
+ .crewlet-artifact-name__mark {
3508
+ display: inline-flex;
3509
+ flex: none;
3510
+ align-items: center;
3511
+ justify-content: center;
3512
+ width: 32px;
3513
+ height: 32px;
3514
+ box-sizing: border-box;
3515
+ border-radius: var(--radius-md);
3516
+ background: var(--crewlet-kind-fill);
3517
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
3518
+ color: var(--crewlet-kind-ink);
3519
+ transition: box-shadow var(--motion-duration-fast) var(--motion-easing-out);
3520
+ }
3521
+
3522
+ /* UNDER THE POINTER the row's ground moves (the row's own hover), and the
3523
+ mark's hairline takes the kind's hue, so the one coloured thing on the row
3524
+ answers too. No lift and no movement: a list is read down, not played. */
3525
+ :is(tr, [role='row']):hover .crewlet-artifact-name__mark {
3526
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-hue);
3527
+ }
3528
+
3529
+ .crewlet-artifact-name--trashed .crewlet-artifact-name__mark {
3530
+ background: var(--color-surface-inset);
3531
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
3532
+ color: var(--color-text-tertiary);
3533
+ }
3534
+
3535
+ .crewlet-artifact-name__words {
3536
+ display: flex;
3537
+ flex-direction: column;
3538
+ gap: 2px;
3539
+ min-width: 0;
3540
+ }
3541
+
3542
+ .crewlet-artifact-name__title-row {
3543
+ display: flex;
3544
+ align-items: center;
3545
+ gap: var(--spacing-1);
3546
+ min-width: 0;
3547
+ }
3548
+
3549
+ .crewlet-artifact-name__title {
3550
+ min-width: 0;
3551
+ overflow: hidden;
3552
+ text-overflow: ellipsis;
3553
+ white-space: nowrap;
3554
+ color: var(--color-text-primary);
3555
+ font-size: var(--font-size-sm);
3556
+ font-weight: var(--font-weight-medium);
3557
+ line-height: 1.35;
3558
+ }
3559
+
3560
+ .crewlet-artifact-name__pin {
3561
+ display: inline-flex;
3562
+ flex: none;
3563
+ color: var(--color-text-tertiary);
3564
+ }
3565
+
3566
+ .crewlet-artifact-name__detail {
3567
+ display: flex;
3568
+ align-items: baseline;
3569
+ gap: var(--spacing-1);
3570
+ min-width: 0;
3571
+ overflow: hidden;
3572
+ white-space: nowrap;
3573
+ color: var(--color-text-tertiary);
3574
+ font-size: var(--font-size-xs);
3575
+ line-height: 1.35;
3576
+ }
3577
+
3578
+ .crewlet-artifact-name__kind,
3579
+ .crewlet-artifact-name__dot {
3580
+ flex: none;
3581
+ }
3582
+
3583
+ .crewlet-artifact-name__about {
3584
+ min-width: 0;
3585
+ overflow: hidden;
3586
+ text-overflow: ellipsis;
3587
+ }
3588
+
3589
+ @media (prefers-reduced-motion: reduce) {
3590
+ .crewlet-artifact-name__mark {
3591
+ transition: none;
3592
+ }
3593
+ }
3594
+
3595
+
3438
3596
  /* ArtifactPanel-KKUUIPEU.css */
3439
3597
  /*
3440
3598
  * The workspace is a row: the artifact's body, then at most one panel. The
@@ -7864,7 +8022,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7864
8022
  }
7865
8023
 
7866
8024
 
7867
- /* ChoiceList-EA2W6MOS.css */
8025
+ /* ChoiceList-KFYFAECP.css */
7868
8026
  /*
7869
8027
  * A short list of answers in one bordered box: a radio, the label with a line
7870
8028
  * of detail under it, and a tag at the row's end. The selected row takes the
@@ -7875,8 +8033,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7875
8033
  .crewlet-choice-list {
7876
8034
  /* The platform's radio, sized here so a panel can line up with the text beside it. */
7877
8035
  --crewlet-choice-list-radio-size: 13px;
8036
+ /* The step between two answers. Every row's pointer target reaches half of it. */
8037
+ --crewlet-choice-list-gap: var(--spacing-1);
7878
8038
  display: grid;
7879
- gap: var(--spacing-1);
8039
+ gap: var(--crewlet-choice-list-gap);
7880
8040
  padding: var(--spacing-1);
7881
8041
  border: 1px solid var(--color-border-strong);
7882
8042
  border-radius: var(--radius-md);
@@ -7889,21 +8049,24 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7889
8049
 
7890
8050
  .crewlet-choice-list__group {
7891
8051
  display: grid;
7892
- gap: var(--spacing-1);
8052
+ gap: var(--crewlet-choice-list-gap);
7893
8053
  }
7894
8054
 
7895
8055
  .crewlet-choice-list__item {
7896
8056
  display: grid;
7897
- gap: var(--spacing-1);
8057
+ gap: var(--crewlet-choice-list-gap);
7898
8058
  }
7899
8059
 
7900
8060
  /* The "Something else" a list ends with, set apart by a dashed rule. */
7901
8061
  .crewlet-choice-list__item.is-separated {
7902
- padding-top: var(--spacing-1);
8062
+ --crewlet-choice-list-rule-pad: var(--spacing-1);
8063
+ padding-top: var(--crewlet-choice-list-rule-pad);
7903
8064
  border-top: 1px dashed var(--color-border-strong);
7904
8065
  }
7905
8066
 
7906
8067
  .crewlet-choice-list__row {
8068
+ /* Half the step to each neighbour, so the targets meet (HitArea.css). */
8069
+ --crewlet-hit-area-block: calc(var(--crewlet-choice-list-gap) / 2);
7907
8070
  display: grid;
7908
8071
  grid-template-columns: auto minmax(0, 1fr) auto;
7909
8072
  align-items: start;
@@ -7914,6 +8077,23 @@ a.crewlet-breadcrumb__crumb:focus-visible {
7914
8077
  transition: background-color var(--motion-duration-fast) var(--motion-easing-default);
7915
8078
  }
7916
8079
 
8080
+ /*
8081
+ * THE ANSWER AFTER THE RULE reaches up across it, so the pointer leaving the
8082
+ * row above lands on this one rather than on the rule: the dashed line sets
8083
+ * the answer apart for the eye, and is no gap for the hand.
8084
+ */
8085
+ .crewlet-choice-list__item.is-separated > .crewlet-choice-list__row {
8086
+ --crewlet-hit-area-block-start: calc(var(--crewlet-choice-list-gap) / 2 + var(--crewlet-choice-list-rule-pad) + 1px);
8087
+ }
8088
+
8089
+ /*
8090
+ * A ROW WITH ITS PANEL OPEN reaches nothing downward: the panel is part of the
8091
+ * answer and holds controls of its own, which the row must not cover.
8092
+ */
8093
+ .crewlet-choice-list__item:has(> .crewlet-choice-list__panel) > .crewlet-choice-list__row {
8094
+ --crewlet-hit-area-block-end: 0px;
8095
+ }
8096
+
7917
8097
  /* A choice with a picture: the radio, the picture, the words, the tag. The
7918
8098
  picture centres on the label and its detail together. */
7919
8099
  .crewlet-choice-list__row.has-media {
@@ -8237,7 +8417,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8237
8417
  }
8238
8418
 
8239
8419
 
8240
- /* Combobox-4FUVYIE7.css */
8420
+ /* Combobox-YDONYDTM.css */
8241
8421
  /*
8242
8422
  * Combobox: a field that offers completions.
8243
8423
  *
@@ -8264,9 +8444,10 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8264
8444
  overflow-y: auto;
8265
8445
  overscroll-behavior: contain;
8266
8446
  padding: var(--spacing-1);
8447
+ --crewlet-listbox-gap: 1px;
8267
8448
  display: flex;
8268
8449
  flex-direction: column;
8269
- gap: 1px;
8450
+ gap: var(--crewlet-listbox-gap);
8270
8451
  /*
8271
8452
  * OPAQUE, and the product's own panel surface: a translucent list over a
8272
8453
  * form puts two sets of words in the same place, and the words underneath
@@ -8320,7 +8501,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8320
8501
  }
8321
8502
 
8322
8503
 
8323
- /* CommandPalette-7CFGVBND.css */
8504
+ /* CommandPalette-TOZYLWLE.css */
8324
8505
  /*
8325
8506
  * The command palette: a field, an optional row of scopes, one scroller
8326
8507
  * holding the lead and the list, and a key legend.
@@ -8486,10 +8667,11 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8486
8667
  * draw and no slider to measure, and the bar is each tab's own edge.
8487
8668
  */
8488
8669
  .crewlet-palette__scopes {
8670
+ --crewlet-palette-scope-gap: var(--spacing-4);
8489
8671
  flex-shrink: 0;
8490
8672
  display: flex;
8491
8673
  align-items: stretch;
8492
- gap: var(--spacing-4);
8674
+ gap: var(--crewlet-palette-scope-gap);
8493
8675
  min-height: var(--size-row-md);
8494
8676
  padding-inline: var(--spacing-4);
8495
8677
  border-bottom: 1px solid var(--color-border-default);
@@ -8518,6 +8700,9 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8518
8700
  font-weight: var(--font-weight-medium);
8519
8701
  white-space: nowrap;
8520
8702
  cursor: pointer;
8703
+ /* Half the gap to each neighbour, so the scopes' targets meet (HitArea.css).
8704
+ The row's own inline padding holds the reach at either end. */
8705
+ --crewlet-hit-area-inline: calc(var(--crewlet-palette-scope-gap) / 2);
8521
8706
  }
8522
8707
 
8523
8708
  .crewlet-palette__scope:hover,
@@ -8732,7 +8917,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8732
8917
  }
8733
8918
 
8734
8919
 
8735
- /* Composer-PXITWNEK.css */
8920
+ /* Composer-TXULCPPV.css */
8736
8921
  /*
8737
8922
  * A message written in place: the field and its footer strip in one box. The
8738
8923
  * BOX takes the focus ring every field in the package draws (see Input.css):
@@ -8762,7 +8947,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8762
8947
  outline-offset: -1px;
8763
8948
  }
8764
8949
 
8765
- :root[data-crewlet-focus='pointer'] .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8950
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-composer:has(.crewlet-composer__field:focus-visible) {
8766
8951
  outline-width: 1px;
8767
8952
  outline-color: var(--color-border-selected);
8768
8953
  }
@@ -11798,7 +11983,7 @@ body.crewlet-data-table-resizing {
11798
11983
  }
11799
11984
 
11800
11985
 
11801
- /* DatasetSource-SMGX4PS5.css */
11986
+ /* DatasetSource-FFKTD3ZU.css */
11802
11987
  /*
11803
11988
  * DatasetSource: one entry of a dashboard's Sources rail. The title and its
11804
11989
  * source kind, the definition, then where the rows stand, how many there are
@@ -11834,6 +12019,20 @@ body.crewlet-data-table-resizing {
11834
12019
 
11835
12020
  button.crewlet-dataset-source__summary {
11836
12021
  cursor: pointer;
12022
+ /* Half the list's gap to each neighbour, so the entries' targets meet
12023
+ (HitArea.css), across the entry's 1px boundary and the summary's own. */
12024
+ --crewlet-hit-area-block: calc(var(--crewlet-dataset-source-list-gap, 0px) / 2 + 2px);
12025
+ }
12026
+
12027
+ /* The list has no padding, so its first and last entries reach nothing past
12028
+ it; and an open entry's preview holds controls the summary must not cover. */
12029
+ .crewlet-dataset-source-list__item:first-child button.crewlet-dataset-source__summary {
12030
+ --crewlet-hit-area-block-start: 0px;
12031
+ }
12032
+
12033
+ .crewlet-dataset-source-list__item:last-child button.crewlet-dataset-source__summary,
12034
+ .crewlet-dataset-source--open > button.crewlet-dataset-source__summary {
12035
+ --crewlet-hit-area-block-end: 0px;
11837
12036
  }
11838
12037
 
11839
12038
  button.crewlet-dataset-source__summary:hover {
@@ -11959,9 +12158,10 @@ button.crewlet-dataset-source__summary:focus-visible {
11959
12158
  }
11960
12159
 
11961
12160
  .crewlet-dataset-source-list {
12161
+ --crewlet-dataset-source-list-gap: var(--spacing-1);
11962
12162
  display: flex;
11963
12163
  flex-direction: column;
11964
- gap: var(--spacing-1);
12164
+ gap: var(--crewlet-dataset-source-list-gap);
11965
12165
  margin: 0;
11966
12166
  padding: 0;
11967
12167
  list-style: none;
@@ -11972,7 +12172,7 @@ button.crewlet-dataset-source__summary:focus-visible {
11972
12172
  }
11973
12173
 
11974
12174
 
11975
- /* DateTimePicker-2IVTKFV2.css */
12175
+ /* DateTimePicker-3A7JIIVL.css */
11976
12176
  /*
11977
12177
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
11978
12178
  *
@@ -12031,8 +12231,8 @@ button.crewlet-dataset-source__summary:focus-visible {
12031
12231
  }
12032
12232
 
12033
12233
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12034
- :root[data-crewlet-focus='pointer'] .crewlet-datetime:focus-visible,
12035
- :root[data-crewlet-focus='pointer'] .crewlet-datetime.is-open {
12234
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime:focus-visible,
12235
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime.is-open {
12036
12236
  outline-width: 1px;
12037
12237
  outline-color: var(--color-border-selected);
12038
12238
  }
@@ -12164,7 +12364,7 @@ svg.crewlet-datetime__chevron {
12164
12364
  }
12165
12365
 
12166
12366
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
12167
- :root[data-crewlet-focus='pointer'] .crewlet-datetime__time-input:focus-visible {
12367
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-datetime__time-input:focus-visible {
12168
12368
  outline-width: 1px;
12169
12369
  outline-color: var(--color-border-selected);
12170
12370
  }
@@ -12881,7 +13081,7 @@ svg.crewlet-datetime__chevron {
12881
13081
  }
12882
13082
 
12883
13083
 
12884
- /* Document-YFWTWXJP.css */
13084
+ /* Document-TZ2NBLOR.css */
12885
13085
  /*
12886
13086
  * Rendered markdown, set as a document (Document.tsx).
12887
13087
  *
@@ -13257,7 +13457,7 @@ svg.crewlet-datetime__chevron {
13257
13457
  outline: 2px solid transparent;
13258
13458
  }
13259
13459
 
13260
- :root[data-crewlet-focus='pointer'] .crewlet-document-title-field:focus-visible {
13460
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-document-title-field:focus-visible {
13261
13461
  border-block-end-color: var(--color-border-selected);
13262
13462
  box-shadow: none;
13263
13463
  }
@@ -13270,7 +13470,7 @@ svg.crewlet-datetime__chevron {
13270
13470
  box-shadow: 0 1px 0 var(--color-feedback-danger);
13271
13471
  }
13272
13472
 
13273
- :root[data-crewlet-focus='pointer'] .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13473
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-document-title-field[aria-invalid='true']:focus-visible {
13274
13474
  border-block-end-color: var(--color-feedback-danger);
13275
13475
  }
13276
13476
 
@@ -14073,6 +14273,44 @@ button.crewlet-finding-list__row:focus-visible {
14073
14273
  }
14074
14274
 
14075
14275
 
14276
+ /* HitArea-QUOS6ZDJ.css */
14277
+ /*
14278
+ * A ROW'S TARGET RUNS TO ITS NEIGHBOUR'S. The rows of one list are drawn a
14279
+ * step apart, and the gap between them belonged to no row: a pointer crossing
14280
+ * the list slowly met the list itself there, so the hand turned into the arrow
14281
+ * and the hover fill went out between every two rows and came back on the
14282
+ * next, which a reader sees as the cursor flickering. Each row that carries
14283
+ * this class reaches half the gap on each side with an empty `::after`, so the
14284
+ * targets meet in the middle of every gap and the drawn rows keep their
14285
+ * spacing. The pseudo-element is part of its row: it takes the row's cursor,
14286
+ * makes the row `:hover`, and a press on it is a press on the row.
14287
+ *
14288
+ * The reach is set on the ROW, from the gap its list is laid out with, as
14289
+ * `--crewlet-hit-area-block` and `--crewlet-hit-area-inline` (each side may be
14290
+ * set alone with the `-start` and `-end` forms). A row that sets none reaches
14291
+ * nowhere. It stays inside the list's own padding, so no scroller grows.
14292
+ *
14293
+ * IT IS MEASURED FROM THE ROW'S PADDING EDGE, which is where an absolutely
14294
+ * placed box starts, so a row drawn with a border (a transparent one
14295
+ * included) adds the border's width to its reach.
14296
+ *
14297
+ * `position: relative` is at zero specificity, so a row positioned on purpose
14298
+ * keeps its own position and is still the pseudo-element's containing block.
14299
+ */
14300
+ :where(.crewlet-hit-area) {
14301
+ position: relative;
14302
+ }
14303
+
14304
+ .crewlet-hit-area::after {
14305
+ content: '';
14306
+ position: absolute;
14307
+ top: calc(var(--crewlet-hit-area-block-start, var(--crewlet-hit-area-block, 0px)) * -1);
14308
+ bottom: calc(var(--crewlet-hit-area-block-end, var(--crewlet-hit-area-block, 0px)) * -1);
14309
+ inset-inline-start: calc(var(--crewlet-hit-area-inline-start, var(--crewlet-hit-area-inline, 0px)) * -1);
14310
+ inset-inline-end: calc(var(--crewlet-hit-area-inline-end, var(--crewlet-hit-area-inline, 0px)) * -1);
14311
+ }
14312
+
14313
+
14076
14314
  /* HuePicker-PAIGH6LR.css */
14077
14315
  /*
14078
14316
  * A hue's swatch: the hue itself, as a dot beside its name. The name carries
@@ -14858,7 +15096,7 @@ button.crewlet-finding-list__row:focus-visible {
14858
15096
  }
14859
15097
 
14860
15098
 
14861
- /* Input-ABGOFENS.css */
15099
+ /* Input-OQZBCRX5.css */
14862
15100
  /*
14863
15101
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
14864
15102
  * ReadOnlyField.
@@ -14985,8 +15223,13 @@ button.crewlet-finding-list__row:focus-visible {
14985
15223
  * round it before anybody had touched a key. A refused field keeps its own
14986
15224
  * colour under a pointer too (below). A document that tracks nothing keeps
14987
15225
  * the keyboard's ring.
15226
+ *
15227
+ * The modality is matched inside :where(), here and in every field's narrowing
15228
+ * rule, so it narrows a ring and never outranks a variant's own: at the
15229
+ * attribute's specificity it beat `.crewlet-input--command`, and the palette's
15230
+ * borderless search field drew a square accent hairline round its text.
14988
15231
  */
14989
- :root[data-crewlet-focus='pointer'] .crewlet-input:has(.crewlet-input__control:focus-visible) {
15232
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-input:has(.crewlet-input__control:focus-visible) {
14990
15233
  outline-width: 1px;
14991
15234
  outline-color: var(--color-border-selected);
14992
15235
  }
@@ -15011,7 +15254,7 @@ button.crewlet-finding-list__row:focus-visible {
15011
15254
  outline-color: var(--color-feedback-danger);
15012
15255
  }
15013
15256
 
15014
- :root[data-crewlet-focus='pointer'] .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15257
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
15015
15258
  outline-color: var(--color-feedback-danger);
15016
15259
  }
15017
15260
 
@@ -15256,7 +15499,7 @@ button.crewlet-finding-list__row:focus-visible {
15256
15499
  }
15257
15500
 
15258
15501
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
15259
- :root[data-crewlet-focus='pointer'] .crewlet-textarea:focus-visible {
15502
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-textarea:focus-visible {
15260
15503
  outline-width: 1px;
15261
15504
  outline-color: var(--color-border-selected);
15262
15505
  }
@@ -15269,7 +15512,7 @@ button.crewlet-finding-list__row:focus-visible {
15269
15512
  outline-color: var(--color-feedback-danger);
15270
15513
  }
15271
15514
 
15272
- :root[data-crewlet-focus='pointer'] .crewlet-textarea.is-error:focus-visible {
15515
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-textarea.is-error:focus-visible {
15273
15516
  outline-color: var(--color-feedback-danger);
15274
15517
  }
15275
15518
 
@@ -16491,7 +16734,7 @@ button.crewlet-finding-list__row:focus-visible {
16491
16734
  }
16492
16735
 
16493
16736
 
16494
- /* Listbox-6WJNJQVQ.css */
16737
+ /* Listbox-NQV6E3FS.css */
16495
16738
  /*
16496
16739
  * The listbox register: one look for every list a field offers.
16497
16740
  *
@@ -16566,6 +16809,9 @@ button.crewlet-finding-list__row:focus-visible {
16566
16809
  cursor: pointer;
16567
16810
  /* A row is chosen by the arrows as often as by the pointer, so the highlight
16568
16811
  lands with no transition: a fade would lag a held arrow key. */
16812
+ /* Where a list sets its rows apart, each row's target reaches half the gap
16813
+ (HitArea.css), so the pointer never falls between two of them. */
16814
+ --crewlet-hit-area-block: calc(var(--crewlet-listbox-gap, 0px) / 2);
16569
16815
  }
16570
16816
 
16571
16817
  /*
@@ -16707,7 +16953,7 @@ button.crewlet-finding-list__row:focus-visible {
16707
16953
  }
16708
16954
 
16709
16955
 
16710
- /* LivePreview-BROGKR4N.css */
16956
+ /* LivePreview-KQEDMQCY.css */
16711
16957
  /*
16712
16958
  * A live preview: the stand-in, the still copy of what the content drew and
16713
16959
  * the live layer it is drawn in, stacked in that order in one box. The box
@@ -16762,6 +17008,19 @@ button.crewlet-finding-list__row:focus-visible {
16762
17008
  transition: none !important;
16763
17009
  }
16764
17010
 
17011
+ /* NOR DOES ANYTHING IN IT SCROLL: a copy of a box that scrolled (a sheet
17012
+ wider than the card, a long list) is a picture of its first view, so it
17013
+ draws no scrollbar. Shown, the bar sat across the card as a stray band.
17014
+ The live layer it is copied from draws none either, so what is laid out
17015
+ there (a sheet's room for a bar included) is what the copy shows. */
17016
+ :is(.crewlet-live-preview__live, .crewlet-live-preview__still) * {
17017
+ scrollbar-width: none !important;
17018
+ }
17019
+
17020
+ :is(.crewlet-live-preview__live, .crewlet-live-preview__still) *::-webkit-scrollbar {
17021
+ display: none;
17022
+ }
17023
+
16765
17024
  /* THE LIVE LAYER renders out of sight: content that is copied is never seen
16766
17025
  live, only its copy is. A frame's page is kept rather than copied, so a
16767
17026
  framed preview's live layer is what fades in once it has drawn. */
@@ -21691,7 +21950,7 @@ button.crewlet-presence-stack__member:focus-visible {
21691
21950
  }
21692
21951
 
21693
21952
 
21694
- /* SegmentedControl-FLI45IOW.css */
21953
+ /* SegmentedControl-B7XCUOML.css */
21695
21954
  /*
21696
21955
  * SegmentedControl: the pill row, drawn with the Tabs classes.
21697
21956
  *
@@ -21719,8 +21978,10 @@ button.crewlet-presence-stack__member:focus-visible {
21719
21978
  * equal weight in a file that happens to come later takes them back.
21720
21979
  */
21721
21980
  .crewlet-tabs.crewlet-segmented--cards {
21981
+ --crewlet-tabs-gap: var(--spacing-2);
21982
+ --crewlet-tabs-row-gap: var(--spacing-2);
21722
21983
  display: grid;
21723
- gap: var(--spacing-2);
21984
+ gap: var(--crewlet-tabs-gap);
21724
21985
  width: 100%;
21725
21986
  align-items: stretch;
21726
21987
  }
@@ -21731,6 +21992,9 @@ button.crewlet-presence-stack__member:focus-visible {
21731
21992
  * surface inside a panel of the same surface reads as a second panel.
21732
21993
  */
21733
21994
  .crewlet-segmented--cards .crewlet-segmented__option {
21995
+ /* A card's 1px border is inside the reach (HitArea.css). */
21996
+ --crewlet-hit-area-inline: calc(var(--crewlet-tabs-gap) / 2 + 1px);
21997
+ --crewlet-hit-area-block: calc(var(--crewlet-tabs-row-gap) / 2 + 1px);
21734
21998
  justify-content: flex-start;
21735
21999
  text-align: left;
21736
22000
  /* A sentence under a name is a sentence: it wraps rather than being cut. */
@@ -21775,7 +22039,8 @@ button.crewlet-presence-stack__member:focus-visible {
21775
22039
  /* No gap between ROWS: each chip's target already overhangs its drawing by
21776
22040
  half a step above and below, so two rows' drawings stand a whole step
21777
22041
  apart while their targets meet. */
21778
- gap: 0 var(--spacing-1);
22042
+ --crewlet-tabs-gap: var(--spacing-1);
22043
+ gap: 0 var(--crewlet-tabs-gap);
21779
22044
  }
21780
22045
 
21781
22046
  /*
@@ -21879,6 +22144,7 @@ button.crewlet-presence-stack__member:focus-visible {
21879
22144
  * every option stays visible and inside the focus ring's room.
21880
22145
  */
21881
22146
  .crewlet-tabs--pill.crewlet-segmented {
22147
+ --crewlet-tabs-row-gap: var(--crewlet-tabs-gap);
21882
22148
  flex-wrap: wrap;
21883
22149
  min-width: 0;
21884
22150
  max-width: 100%;
@@ -21997,7 +22263,7 @@ button.crewlet-presence-stack__member:focus-visible {
21997
22263
  }
21998
22264
 
21999
22265
 
22000
- /* Select-W3CHTZXP.css */
22266
+ /* Select-F526HLNR.css */
22001
22267
  /*
22002
22268
  * Select: one chrome over two controls, and the product's only dropdown.
22003
22269
  *
@@ -22076,7 +22342,7 @@ button.crewlet-presence-stack__member:focus-visible {
22076
22342
  }
22077
22343
 
22078
22344
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22079
- :root[data-crewlet-focus='pointer'] .crewlet-select:focus-within {
22345
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select:focus-within {
22080
22346
  outline-width: 1px;
22081
22347
  outline-color: var(--color-border-selected);
22082
22348
  }
@@ -22139,7 +22405,7 @@ button.crewlet-presence-stack__member:focus-visible {
22139
22405
  outline-color: var(--color-feedback-danger);
22140
22406
  }
22141
22407
 
22142
- :root[data-crewlet-focus='pointer'] .crewlet-select.is-error:focus-within {
22408
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select.is-error:focus-within {
22143
22409
  outline-color: var(--color-feedback-danger);
22144
22410
  }
22145
22411
 
@@ -22286,9 +22552,10 @@ svg.crewlet-select__chevron {
22286
22552
  }
22287
22553
 
22288
22554
  .crewlet-select__group {
22555
+ --crewlet-listbox-gap: 1px;
22289
22556
  display: flex;
22290
22557
  flex-direction: column;
22291
- gap: 1px;
22558
+ gap: var(--crewlet-listbox-gap);
22292
22559
  }
22293
22560
 
22294
22561
  .crewlet-select__option {
@@ -22441,7 +22708,7 @@ svg.crewlet-select__chevron {
22441
22708
  }
22442
22709
 
22443
22710
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
22444
- :root[data-crewlet-focus='pointer'] .crewlet-select__search:focus-within {
22711
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-select__search:focus-within {
22445
22712
  outline-width: 1px;
22446
22713
  outline-color: var(--color-border-selected);
22447
22714
  }
@@ -22716,7 +22983,7 @@ svg.crewlet-select__chevron {
22716
22983
  }
22717
22984
 
22718
22985
 
22719
- /* SheetGrid-YRDXTIIZ.css */
22986
+ /* SheetGrid-XK7T7M34.css */
22720
22987
  /*
22721
22988
  * The editable sheet (SheetGrid.tsx) and its cells (cells.tsx).
22722
22989
  *
@@ -23168,16 +23435,21 @@ svg.crewlet-select__chevron {
23168
23435
  /* ADD COLUMN stands beside the header row, outside the grid's roles: the
23169
23436
  scroller lays the grid and the control side by side, the grid's last track
23170
23437
  still takes the slack up to the control, and the control sticks to the top
23171
- with the header while the rows scroll under it. */
23438
+ with the header while the rows scroll under it. Its track is the control's
23439
+ own square plus an inset on each side, so the square never fills the track
23440
+ edge to edge. THE GRID GROWS INTO WHATEVER THE CONTROL LEAVES rather than
23441
+ into a width assumed for it: held to 100% less an assumed width, it
23442
+ overflowed by the difference whenever the control drew wider, and the
23443
+ sheet scrolled sideways by a few pixels. */
23172
23444
  .crewlet-sheet-grid__scroller--add-column {
23173
- --crewlet-sheet-add-column-width: var(--size-target-min);
23445
+ --crewlet-sheet-add-column-width: calc(var(--size-control-sm) + 2 * var(--spacing-1));
23174
23446
  display: flex;
23175
23447
  align-items: flex-start;
23176
23448
  }
23177
23449
 
23178
23450
  .crewlet-sheet-grid__scroller--add-column > .crewlet-sheet-grid__grid {
23179
- flex: 0 0 auto;
23180
- min-width: calc(100% - var(--crewlet-sheet-add-column-width));
23451
+ flex: 1 0 auto;
23452
+ min-width: 0;
23181
23453
  }
23182
23454
 
23183
23455
  .crewlet-sheet-grid__add-column {
@@ -23572,7 +23844,7 @@ svg.crewlet-select__chevron {
23572
23844
  }
23573
23845
 
23574
23846
 
23575
- /* SidebarNav-KF66MLOM.css */
23847
+ /* SidebarNav-7SGUZYKK.css */
23576
23848
  /*
23577
23849
  * The rail's navigation.
23578
23850
  *
@@ -23603,9 +23875,12 @@ svg.crewlet-select__chevron {
23603
23875
  * old step, so the gap is paid for many times over by the row it sits beside.
23604
23876
  */
23605
23877
  .crewlet-nav-group {
23878
+ --crewlet-nav-group-gap: calc(var(--spacing-1) / 2);
23879
+ /* What a row reaches across (HitArea.css): its own list's gap. */
23880
+ --crewlet-nav-row-gap: var(--crewlet-nav-group-gap);
23606
23881
  display: flex;
23607
23882
  flex-direction: column;
23608
- gap: calc(var(--spacing-1) / 2);
23883
+ gap: var(--crewlet-nav-group-gap);
23609
23884
  min-width: 0;
23610
23885
  }
23611
23886
 
@@ -23750,6 +24025,20 @@ svg.crewlet-select__chevron {
23750
24025
  transition:
23751
24026
  background var(--motion-duration-fast) var(--motion-easing-default),
23752
24027
  color var(--motion-duration-fast) var(--motion-easing-default);
24028
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css). */
24029
+ --crewlet-hit-area-block: calc(var(--crewlet-nav-row-gap, 0px) / 2);
24030
+ }
24031
+
24032
+ /*
24033
+ * AN OPEN ROW AND ITS FIRST NESTED ROW ABUT, with no gap between them to
24034
+ * cross, so neither reaches into the other.
24035
+ */
24036
+ .crewlet-nav-item:has(> .crewlet-nav-item__children:not([hidden])) > .crewlet-nav-item__head > .crewlet-nav-item__row {
24037
+ --crewlet-hit-area-block-end: 0px;
24038
+ }
24039
+
24040
+ .crewlet-nav-item__children > .crewlet-nav-item:first-child > .crewlet-nav-item__head > .crewlet-nav-item__row {
24041
+ --crewlet-hit-area-block-start: 0px;
23753
24042
  }
23754
24043
 
23755
24044
  .crewlet-nav-item__row:hover {
@@ -23961,9 +24250,11 @@ svg.crewlet-select__chevron {
23961
24250
  * rail keeps for the one count that asks the reader to act.
23962
24251
  */
23963
24252
  .crewlet-nav-item__children {
24253
+ --crewlet-nav-children-gap: var(--spacing-1);
24254
+ --crewlet-nav-row-gap: var(--crewlet-nav-children-gap);
23964
24255
  display: flex;
23965
24256
  flex-direction: column;
23966
- gap: var(--spacing-1);
24257
+ gap: var(--crewlet-nav-children-gap);
23967
24258
  margin-left: var(--size-nav-row-pad);
23968
24259
  padding-left: var(--spacing-2);
23969
24260
  border-left: 1px solid var(--color-border-default);
@@ -24995,7 +25286,7 @@ svg.crewlet-select__chevron {
24995
25286
  }
24996
25287
 
24997
25288
 
24998
- /* SourceEditor-QAYE2JS6.css */
25289
+ /* SourceEditor-OKPWPFXK.css */
24999
25290
  /*
25000
25291
  * Source text written in place: a gutter of line numbers beside a real
25001
25292
  * textarea, and the marks a checker placed drawn behind the text. The gutter,
@@ -25035,7 +25326,7 @@ svg.crewlet-select__chevron {
25035
25326
  outline-offset: -1px;
25036
25327
  }
25037
25328
 
25038
- :root[data-crewlet-focus='pointer'] .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25329
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-source-editor:has(.crewlet-source-editor__field:focus-visible) {
25039
25330
  outline-width: 1px;
25040
25331
  outline-color: var(--color-border-selected);
25041
25332
  }
@@ -26665,7 +26956,7 @@ b.crewlet-switcher__match {
26665
26956
  }
26666
26957
 
26667
26958
 
26668
- /* Tabs-MMZXV5EF.css */
26959
+ /* Tabs-WIF7457H.css */
26669
26960
  /*
26670
26961
  * The pill register: Tabs and SegmentedControl.
26671
26962
  *
@@ -26696,8 +26987,9 @@ b.crewlet-switcher__match {
26696
26987
  * row is reachable by the arrow keys either way.
26697
26988
  */
26698
26989
  .crewlet-tabs--underline {
26990
+ --crewlet-tabs-gap: var(--spacing-2);
26699
26991
  display: flex;
26700
- gap: var(--spacing-2);
26992
+ gap: var(--crewlet-tabs-gap);
26701
26993
  border-bottom: 1px solid var(--color-border-default);
26702
26994
  position: relative;
26703
26995
  width: 100%;
@@ -26771,8 +27063,9 @@ b.crewlet-switcher__match {
26771
27063
  */
26772
27064
  .crewlet-tabs--pill {
26773
27065
  --crewlet-tabs-pill-inset: 1px;
27066
+ --crewlet-tabs-gap: var(--crewlet-tabs-pill-inset);
26774
27067
 
26775
- gap: var(--crewlet-tabs-pill-inset);
27068
+ gap: var(--crewlet-tabs-gap);
26776
27069
  padding: var(--crewlet-tabs-pill-inset);
26777
27070
  background: var(--color-surface-elevated);
26778
27071
  border: 1px solid var(--color-border-default);
@@ -26833,6 +27126,20 @@ b.crewlet-switcher__match {
26833
27126
  background-color var(--motion-duration-fast) var(--motion-easing-default),
26834
27127
  color var(--motion-duration-fast) var(--motion-easing-default),
26835
27128
  box-shadow var(--motion-duration-fast) var(--motion-easing-default);
27129
+ /* Half the gap to each neighbour, so the targets meet (HitArea.css). A row
27130
+ that wraps reaches across its rows' gap too. */
27131
+ --crewlet-hit-area-inline: calc(var(--crewlet-tabs-gap, 0px) / 2);
27132
+ --crewlet-hit-area-block: calc(var(--crewlet-tabs-row-gap, 0px) / 2);
27133
+ }
27134
+
27135
+ /* The row's two ends reach nothing past it: the underline row is a scroller,
27136
+ and a target past its last tab would be width it scrolls by. */
27137
+ .crewlet-tabs__tab:first-child {
27138
+ --crewlet-hit-area-inline-start: 0px;
27139
+ }
27140
+
27141
+ .crewlet-tabs__tab:last-child {
27142
+ --crewlet-hit-area-inline-end: 0px;
26836
27143
  }
26837
27144
 
26838
27145
  /*
@@ -26979,9 +27286,10 @@ b.crewlet-switcher__match {
26979
27286
  * (FilterChip draws the same pair).
26980
27287
  */
26981
27288
  .crewlet-tabs--chip {
27289
+ --crewlet-tabs-gap: calc(var(--spacing-1) / 2);
26982
27290
  display: inline-flex;
26983
27291
  align-items: center;
26984
- gap: calc(var(--spacing-1) / 2);
27292
+ gap: var(--crewlet-tabs-gap);
26985
27293
  }
26986
27294
 
26987
27295
  .crewlet-tabs--chip .crewlet-tabs__tab {
@@ -27676,7 +27984,7 @@ b.crewlet-switcher__match {
27676
27984
  }
27677
27985
 
27678
27986
 
27679
- /* TagsInput-7EGBBXHS.css */
27987
+ /* TagsInput-CLFHP6I2.css */
27680
27988
  /*
27681
27989
  * TagsInput: several values in one field.
27682
27990
  *
@@ -27756,7 +28064,7 @@ b.crewlet-switcher__match {
27756
28064
  }
27757
28065
 
27758
28066
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
27759
- :root[data-crewlet-focus='pointer'] .crewlet-tags-input__box:focus-visible {
28067
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-tags-input__box:focus-visible {
27760
28068
  outline-width: 1px;
27761
28069
  outline-color: var(--color-border-selected);
27762
28070
  }
@@ -28406,7 +28714,7 @@ b.crewlet-switcher__match {
28406
28714
  }
28407
28715
 
28408
28716
 
28409
- /* TimeWindowPicker-DEFDV77Z.css */
28717
+ /* TimeWindowPicker-I3HXC74I.css */
28410
28718
  /*
28411
28719
  * TimeWindowPicker: one trigger over one panel.
28412
28720
  *
@@ -28461,8 +28769,8 @@ b.crewlet-switcher__match {
28461
28769
  }
28462
28770
 
28463
28771
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28464
- :root[data-crewlet-focus='pointer'] .crewlet-time-window:focus-visible,
28465
- :root[data-crewlet-focus='pointer'] .crewlet-time-window.is-open {
28772
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window:focus-visible,
28773
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window.is-open {
28466
28774
  outline-width: 1px;
28467
28775
  outline-color: var(--color-border-selected);
28468
28776
  }
@@ -28739,7 +29047,7 @@ svg.crewlet-time-window__tick {
28739
29047
  }
28740
29048
 
28741
29049
  /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
28742
- :root[data-crewlet-focus='pointer'] .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
29050
+ :where(:root[data-crewlet-focus='pointer']) .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
28743
29051
  outline-width: 1px;
28744
29052
  outline-color: var(--color-border-selected);
28745
29053
  }