@crewlethq/ui 0.32.0 → 0.34.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 (292) hide show
  1. package/README.md +149 -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 +14 -12
  13. package/dist/{ArtifactBar-MLMJHWY6.css → ArtifactBar-C462VD4C.css} +8 -3
  14. package/dist/ArtifactCard/ArtifactCard.d.ts +64 -6
  15. package/dist/ArtifactCard/index.d.ts +2 -2
  16. package/dist/ArtifactCard/index.js +6 -4
  17. package/dist/ArtifactCard-XHRLAL7C.css +289 -0
  18. package/dist/ArtifactCover/index.js +8 -6
  19. package/dist/ArtifactIcon/index.js +7 -5
  20. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +53 -0
  21. package/dist/ArtifactKindIllustration/index.d.ts +3 -0
  22. package/dist/ArtifactKindIllustration/index.js +3 -0
  23. package/dist/ArtifactKindIllustration-4NG6IE3C.css +211 -0
  24. package/dist/ArtifactPanel/ArtifactPanel.d.ts +6 -2
  25. package/dist/ArtifactPanel/index.js +1 -1
  26. package/dist/{ArtifactPanel-YFXT5O77.css → ArtifactPanel-HW3SU7CP.css} +25 -7
  27. package/dist/Avatar/Avatar.d.ts +6 -4
  28. package/dist/Avatar/index.js +2 -2
  29. package/dist/AvatarPicker/index.js +8 -8
  30. package/dist/Callout/index.js +1 -1
  31. package/dist/{Callout-SXXK4B5R.css → Callout-ZAVG3P66.css} +46 -6
  32. package/dist/Canvas/Canvas.d.ts +33 -2
  33. package/dist/Canvas/index.d.ts +1 -1
  34. package/dist/Canvas/index.js +4 -4
  35. package/dist/{Canvas-LRVNW7XN.css → Canvas-VUG2HLZK.css} +23 -0
  36. package/dist/CanvasBoard/CanvasBoard.d.ts +38 -3
  37. package/dist/CanvasBoard/budget.d.ts +9 -3
  38. package/dist/CanvasBoard/index.d.ts +2 -2
  39. package/dist/CanvasBoard/index.js +7 -7
  40. package/dist/{CanvasBoard-MBZVBWDO.css → CanvasBoard-5NNSKY6A.css} +127 -6
  41. package/dist/CanvasToolbar/index.js +5 -5
  42. package/dist/{CanvasToolbar-AE5MXH7T.css → CanvasToolbar-EM5EVZED.css} +4 -2
  43. package/dist/ChangeMark/index.js +4 -4
  44. package/dist/CharacterPicker/index.js +2 -2
  45. package/dist/Charts/ActivityStrip.d.ts +16 -1
  46. package/dist/Charts/BarList.d.ts +6 -0
  47. package/dist/Charts/ChartEmpty.d.ts +33 -0
  48. package/dist/Charts/Legend.d.ts +6 -0
  49. package/dist/Charts/StackedBar.d.ts +4 -1
  50. package/dist/Charts/StackedColumns.d.ts +14 -3
  51. package/dist/Charts/TimeSeries.d.ts +11 -1
  52. package/dist/Charts/index.d.ts +2 -0
  53. package/dist/Charts/index.js +1 -1
  54. package/dist/{Charts-RY4JN5FC.css → Charts-MBJG72BS.css} +140 -16
  55. package/dist/Checkbox/index.js +1 -1
  56. package/dist/{Checkbox-5UORUG3F.css → Checkbox-ALWG3WV2.css} +11 -0
  57. package/dist/CommandPalette/index.js +3 -3
  58. package/dist/{CommandPalette-HBTNKHZQ.css → CommandPalette-7CFGVBND.css} +4 -0
  59. package/dist/CommentThread/index.js +5 -5
  60. package/dist/Container/index.js +1 -1
  61. package/dist/{Container-3TSKMGNI.css → Container-34BAKG7B.css} +3 -1
  62. package/dist/{DashboardCover-RMINBODB.css → DashboardCover-KYGYMRKW.css} +42 -9
  63. package/dist/DataTable/index.js +5 -5
  64. package/dist/{DataTable-WZK3V62B.css → DataTable-NL2YWAIA.css} +4 -1
  65. package/dist/DataView/index.js +8 -8
  66. package/dist/DateTimePicker/index.js +3 -3
  67. package/dist/DocTabsEditor/DocTabsEditor.d.ts +34 -21
  68. package/dist/DocTabsEditor/index.js +4 -1
  69. package/dist/DocTabsEditor-4M452LNS.css +189 -0
  70. package/dist/Document/Document.d.ts +18 -1
  71. package/dist/Document/index.d.ts +2 -2
  72. package/dist/Document/index.js +1 -1
  73. package/dist/{Document-G3YTZIUL.css → Document-JUGCSQ4L.css} +78 -5
  74. package/dist/EditingStatus/index.js +1 -1
  75. package/dist/{EditingStatus-L6THUAN7.css → EditingStatus-NNA2CKIL.css} +17 -4
  76. package/dist/{Editor-YWBUJAQU.js → Editor-UUZ7XKCU.js} +5 -5
  77. package/dist/EntityChip/index.js +3 -3
  78. package/dist/FactList/index.js +3 -3
  79. package/dist/FollowBanner/index.js +3 -3
  80. package/dist/Fullscreen/index.d.ts +1 -0
  81. package/dist/Fullscreen/index.js +1 -1
  82. package/dist/Fullscreen/useIdle.d.ts +16 -0
  83. package/dist/HuePicker/index.js +3 -3
  84. package/dist/ImageUpload/index.js +3 -3
  85. package/dist/Layer/index.d.ts +1 -1
  86. package/dist/Layer/index.js +1 -1
  87. package/dist/Layer/place.d.ts +18 -0
  88. package/dist/LayersList/LayersList.d.ts +57 -0
  89. package/dist/LayersList/index.d.ts +3 -0
  90. package/dist/LayersList/index.js +3 -0
  91. package/dist/LayersList-NQZEIPZB.css +82 -0
  92. package/dist/LinkInterstitial/index.js +4 -4
  93. package/dist/ListInput/index.js +1 -1
  94. package/dist/LivePreview/LivePreview.d.ts +83 -0
  95. package/dist/LivePreview/budget.d.ts +50 -0
  96. package/dist/LivePreview/index.d.ts +5 -0
  97. package/dist/LivePreview/index.js +2 -0
  98. package/dist/LivePreview-SRO7KHO4.css +65 -0
  99. package/dist/Markdown/index.js +1 -1
  100. package/dist/MarkdownEditor/index.js +5 -5
  101. package/dist/MediaMatch/index.d.ts +1 -0
  102. package/dist/MediaMatch/index.js +1 -0
  103. package/dist/MediaMatch/useMediaMatch.d.ts +19 -0
  104. package/dist/Menu/index.js +2 -2
  105. package/dist/MergeConflicts/index.js +4 -4
  106. package/dist/Modal/index.js +2 -2
  107. package/dist/{Modal-XOSV6FAH.css → Modal-7MWRCWAI.css} +30 -0
  108. package/dist/Note/index.js +1 -1
  109. package/dist/{Note-ONSKKTOA.css → Note-WI5MLZOO.css} +13 -0
  110. package/dist/OrgLabel/index.js +3 -3
  111. package/dist/OrgNode/index.js +4 -4
  112. package/dist/OrgTable/index.js +7 -7
  113. package/dist/PeopleRail/index.js +3 -3
  114. package/dist/Popover/index.js +2 -2
  115. package/dist/PresenceStack/index.js +3 -3
  116. package/dist/{PresenceStack-QSXQJND5.css → PresenceStack-FJJQVH74.css} +11 -3
  117. package/dist/PresenterView/PresenterView.d.ts +3 -0
  118. package/dist/PresenterView/index.js +5 -3
  119. package/dist/PresenterView-T3EXIQ5S.css +147 -0
  120. package/dist/Principal/index.js +3 -3
  121. package/dist/PrincipalPicker/index.js +4 -4
  122. package/dist/RichEditor/index.js +5 -5
  123. package/dist/RichEditor/schema.d.ts +1 -1
  124. package/dist/RichEditorMarkdown/index.js +3 -3
  125. package/dist/SandboxedFrame/SandboxedFrame.d.ts +44 -2
  126. package/dist/SandboxedFrame/index.d.ts +2 -2
  127. package/dist/SandboxedFrame/index.js +3 -3
  128. package/dist/SandboxedFrame-P5NASXB7.css +72 -0
  129. package/dist/Section/index.js +1 -1
  130. package/dist/{Section-QR3ILQVK.css → Section-O5AHGSOG.css} +28 -5
  131. package/dist/SegmentedControl/index.js +3 -3
  132. package/dist/Select/Select.d.ts +10 -0
  133. package/dist/Select/index.d.ts +1 -1
  134. package/dist/Select/index.js +2 -2
  135. package/dist/{Select-2P7AWUE4.css → Select-A54YS5EP.css} +29 -0
  136. package/dist/ShareDialog/ShareDialog.d.ts +10 -0
  137. package/dist/ShareDialog/index.js +9 -9
  138. package/dist/{ShareDialog-YZ4F37MW.css → ShareDialog-4QDCBWMH.css} +12 -0
  139. package/dist/SheetGrid/SheetGrid.d.ts +7 -3
  140. package/dist/SheetGrid/index.js +8 -8
  141. package/dist/{SheetGrid-J3TKKXZL.css → SheetGrid-GDPCCZ4V.css} +154 -14
  142. package/dist/SheetModel/fit.d.ts +34 -0
  143. package/dist/SheetModel/index.d.ts +1 -0
  144. package/dist/SheetModel/index.js +1 -1
  145. package/dist/SheetModel/labels.d.ts +1 -1
  146. package/dist/Shortcut/index.js +1 -1
  147. package/dist/Skeleton/Skeleton.d.ts +2 -1
  148. package/dist/Skeleton/index.js +1 -1
  149. package/dist/SlideCompare/SlideCompare.d.ts +6 -1
  150. package/dist/SlideCompare/index.js +3 -3
  151. package/dist/{SlideCompare-MGM3U2ME.css → SlideCompare-HTCMPQFY.css} +36 -3
  152. package/dist/SlideFilmstrip/SlideFilmstrip.d.ts +14 -3
  153. package/dist/SlideFilmstrip/index.js +3 -3
  154. package/dist/{SlideFilmstrip-BCLNAHFX.css → SlideFilmstrip-5U6Z55GS.css} +63 -2
  155. package/dist/SlideGrid/index.js +3 -3
  156. package/dist/{SlideGrid-RT6QEQEE.css → SlideGrid-S4LTJ4UU.css} +9 -5
  157. package/dist/SlideNav/SlideNav.d.ts +49 -0
  158. package/dist/SlideNav/index.d.ts +3 -0
  159. package/dist/SlideNav/index.js +4 -0
  160. package/dist/SlideNav-BLFJF6AH.css +53 -0
  161. package/dist/SlideStage/SlideStage.d.ts +9 -1
  162. package/dist/SlideStage/index.js +2 -2
  163. package/dist/{SlideStage-KGRRALXR.css → SlideStage-S2FISF4C.css} +23 -0
  164. package/dist/StatCard/StatCard.d.ts +16 -1
  165. package/dist/StatCard/index.js +1 -1
  166. package/dist/{StatCard-KPAFD4E2.css → StatCard-4T7TMWMN.css} +40 -13
  167. package/dist/Switcher/index.js +6 -6
  168. package/dist/TableCells/index.js +3 -3
  169. package/dist/Tabs/Tabs.d.ts +21 -4
  170. package/dist/Tabs/index.js +1 -1
  171. package/dist/{Tabs-CJGO35BH.css → Tabs-MMZXV5EF.css} +9 -8
  172. package/dist/TagsInput/index.js +1 -1
  173. package/dist/ThemeSwitcher/index.js +4 -4
  174. package/dist/TimeWindowPicker/index.js +4 -4
  175. package/dist/Toaster/index.js +2 -2
  176. package/dist/{Toaster-EOOOTSJT.css → Toaster-C6BQ7L6I.css} +10 -1
  177. package/dist/Toolbar/index.js +1 -1
  178. package/dist/Tooltip/Tooltip.d.ts +12 -1
  179. package/dist/Tooltip/index.d.ts +1 -1
  180. package/dist/Tooltip/index.js +2 -2
  181. package/dist/TreeCanvas/index.js +5 -5
  182. package/dist/TreeGrid/index.js +3 -3
  183. package/dist/VersionCompare/index.js +4 -4
  184. package/dist/VersionTimeline/index.js +4 -4
  185. package/dist/WidgetFrame/WidgetFrame.d.ts +8 -1
  186. package/dist/WidgetFrame/index.js +2 -2
  187. package/dist/{WidgetFrame-LRZIL62O.css → WidgetFrame-BTFW3CRK.css} +49 -5
  188. package/dist/{chunk-WJDQ7XQA.js → chunk-2QEDJSJC.js} +1 -1
  189. package/dist/{chunk-VYDFB6PJ.js → chunk-356JNSER.js} +50 -17
  190. package/dist/{chunk-2HIOJ4YZ.js → chunk-3EB2AV3H.js} +2 -3
  191. package/dist/{chunk-ODT5H4MN.js → chunk-3LYWD3BO.js} +2 -2
  192. package/dist/{chunk-OTN35CI4.js → chunk-3P4Y5RX6.js} +18 -6
  193. package/dist/{chunk-FAQGGX2Z.js → chunk-3TFDQLW3.js} +1 -1
  194. package/dist/{chunk-E6EWK5YY.js → chunk-3Y56GQPM.js} +3 -3
  195. package/dist/{chunk-A4E5YLXO.js → chunk-4B6LSFDS.js} +1 -1
  196. package/dist/{chunk-UAN5NE7M.js → chunk-5AQBPHZD.js} +1 -1
  197. package/dist/{chunk-CJKMURZO.js → chunk-5SZGKSGL.js} +1 -1
  198. package/dist/chunk-6VOS2GMB.js +54 -0
  199. package/dist/{chunk-QWOPX2MN.js → chunk-6ZJ3N7QI.js} +7 -5
  200. package/dist/{chunk-3ZAFJ4GK.js → chunk-7Q7WDXHG.js} +4 -4
  201. package/dist/{chunk-QH3AKP2N.js → chunk-AC22RZKC.js} +2 -2
  202. package/dist/{chunk-UZ6MA2V6.js → chunk-AORVEG5V.js} +2 -2
  203. package/dist/{chunk-ZITJKF6Z.js → chunk-AYB6AYNH.js} +1 -1
  204. package/dist/{chunk-FC4YTTFJ.js → chunk-BQ7AKL2N.js} +5 -5
  205. package/dist/{chunk-Y5NQ2LMS.js → chunk-BY4N65PM.js} +1 -1
  206. package/dist/{chunk-YFW4MTK4.js → chunk-C7DKX453.js} +1 -1
  207. package/dist/{chunk-RCQXUT5K.js → chunk-CCAXYHQS.js} +1 -1
  208. package/dist/{chunk-JQLTG4KH.js → chunk-CCLNGVCM.js} +62 -51
  209. package/dist/{chunk-6AH2XJ3Q.js → chunk-CFAJP777.js} +3 -3
  210. package/dist/{chunk-4KP4RC3O.js → chunk-CI3VPIJN.js} +1 -1
  211. package/dist/{chunk-7T42VQQT.js → chunk-CPEPST4S.js} +1 -1
  212. package/dist/{chunk-AAOH2P6Y.js → chunk-DFK5EQTU.js} +5 -3
  213. package/dist/{chunk-V5IGUXMZ.js → chunk-E4NNGC6X.js} +4 -4
  214. package/dist/{chunk-TGYDROIB.js → chunk-EBCHVFCS.js} +4 -4
  215. package/dist/{chunk-LWXRD6L6.js → chunk-EWAFN2IU.js} +118 -27
  216. package/dist/{chunk-YDBC4DNW.js → chunk-FWYHRU7M.js} +1 -1
  217. package/dist/{chunk-HVNTQ36V.js → chunk-GMU6SQ6B.js} +4 -4
  218. package/dist/{chunk-LIXSV5YI.js → chunk-GPHWCK7M.js} +1 -1
  219. package/dist/{chunk-UQHKFF2N.js → chunk-GPWJCP3U.js} +1 -1
  220. package/dist/{chunk-77DRMDXR.js → chunk-HG5VF3TZ.js} +192 -67
  221. package/dist/{chunk-QVE4GJAT.js → chunk-HJO4WCH6.js} +1 -1
  222. package/dist/{chunk-JI5AVQLA.js → chunk-HOIZ6MIS.js} +1 -1
  223. package/dist/{chunk-I3BSQUKN.js → chunk-HUVG2FFT.js} +1 -1
  224. package/dist/{chunk-VS3KOOOL.js → chunk-ILAEBSLJ.js} +3 -3
  225. package/dist/{chunk-P4BOXB6E.js → chunk-IUD5VA2Z.js} +6 -7
  226. package/dist/{chunk-GR55WT4R.js → chunk-IYO2N5ZH.js} +2 -2
  227. package/dist/{chunk-RWA4H2TV.js → chunk-J6ON5SYE.js} +1 -1
  228. package/dist/{chunk-AMNN4WDX.js → chunk-JBUMD6DS.js} +2 -2
  229. package/dist/{chunk-BWRGFKJP.js → chunk-K3IJQNB7.js} +2 -3
  230. package/dist/{chunk-LFNUH4GY.js → chunk-K4VP6ZKE.js} +1 -1
  231. package/dist/{chunk-ZR5VN5IV.js → chunk-KD2IRYCT.js} +2 -2
  232. package/dist/chunk-KF6YGL4B.js +160 -0
  233. package/dist/{chunk-SKOYC2CF.js → chunk-KK5OYNAF.js} +2 -1
  234. package/dist/{chunk-UB7TJEKZ.js → chunk-KV3ODJXH.js} +6 -7
  235. package/dist/chunk-LL5AFXU7.js +96 -0
  236. package/dist/{chunk-VYOKRN2I.js → chunk-LM3ISVJA.js} +1 -1
  237. package/dist/{chunk-E6CR5PEV.js → chunk-LV4APO72.js} +8 -2
  238. package/dist/{chunk-B4EBHPK3.js → chunk-M5KZX5JE.js} +9 -2
  239. package/dist/{chunk-HMPFGIWM.js → chunk-OMV5W53A.js} +10 -1
  240. package/dist/chunk-ONL54WMH.js +55 -0
  241. package/dist/{chunk-AKEZ3G5V.js → chunk-ONQKKHON.js} +1 -1
  242. package/dist/{chunk-LZHLSQYK.js → chunk-OOWPSBIS.js} +2 -2
  243. package/dist/{chunk-4KWOKX2B.js → chunk-OSKJZNBT.js} +1 -1
  244. package/dist/{chunk-4JUKWWUD.js → chunk-PLDUNXAO.js} +1 -1
  245. package/dist/{chunk-EHQTPVV4.js → chunk-PLTCDSTU.js} +1 -1
  246. package/dist/{chunk-5OM447RW.js → chunk-PZKHBB7D.js} +1 -1
  247. package/dist/{chunk-VEB5ERRE.js → chunk-QWNVSR6G.js} +2 -2
  248. package/dist/{chunk-IG75YMUN.js → chunk-RTPQDNW3.js} +1 -1
  249. package/dist/{chunk-YEKYVJQR.js → chunk-SGHIAGPR.js} +2 -2
  250. package/dist/{chunk-SVSCLHHI.js → chunk-SZZRIHGT.js} +1 -1
  251. package/dist/{chunk-EBNI36UQ.js → chunk-T46NR3WP.js} +3 -3
  252. package/dist/{chunk-FPS3JIPQ.js → chunk-TC7DJTXI.js} +1 -1
  253. package/dist/{chunk-W5J7R5EB.js → chunk-TEUQWOWZ.js} +1 -1
  254. package/dist/chunk-THROPJZC.js +115 -0
  255. package/dist/{chunk-IDBHX5SR.js → chunk-TRQCHF2F.js} +1 -1
  256. package/dist/{chunk-M3LUNN7F.js → chunk-TYKQ33CL.js} +13 -2
  257. package/dist/chunk-UDQW6UK7.js +129 -0
  258. package/dist/{chunk-WTNUVQVI.js → chunk-UHJQDFKQ.js} +1 -1
  259. package/dist/{chunk-VVRL27HM.js → chunk-ULPL26BU.js} +2 -2
  260. package/dist/{chunk-EBJREOKS.js → chunk-UXXJDIYE.js} +4 -4
  261. package/dist/{chunk-5LUI3WQP.js → chunk-V43UVX4H.js} +1 -1
  262. package/dist/{chunk-W4XYY73O.js → chunk-VHZ3AXJD.js} +1 -1
  263. package/dist/{chunk-NHBP2XS5.js → chunk-VI5FWDZW.js} +51 -3
  264. package/dist/{chunk-HJEVSQN6.js → chunk-VL6CUNSX.js} +11 -5
  265. package/dist/{chunk-XDTYBF2F.js → chunk-W5XCNEZC.js} +39 -1
  266. package/dist/{chunk-LDJ3J4TQ.js → chunk-WGD2HX2A.js} +1 -1
  267. package/dist/{chunk-FQCLKD7U.js → chunk-WKEPORNM.js} +1 -1
  268. package/dist/{chunk-PJD2KFHX.js → chunk-WPX6A5BV.js} +38 -13
  269. package/dist/{chunk-I3KKZ2O3.js → chunk-XEGZHHRH.js} +45 -36
  270. package/dist/{chunk-IKB6HFGK.js → chunk-XO7PUL4F.js} +6 -4
  271. package/dist/chunk-XTOVADJU.js +170 -0
  272. package/dist/chunk-XV32RKQZ.js +142 -0
  273. package/dist/{chunk-TBMDMXEX.js → chunk-YA3AWELW.js} +1 -1
  274. package/dist/{chunk-HVIX5ECM.js → chunk-YEVG2X5R.js} +1 -1
  275. package/dist/chunk-YZFLH463.js +215 -0
  276. package/dist/generated/index.d.ts +5 -0
  277. package/dist/generated/index.js +112 -108
  278. package/dist/index.js +112 -108
  279. package/dist/styles.css +1982 -228
  280. package/package.json +3 -3
  281. package/dist/AccessDeniedCard-WXM5DBDZ.css +0 -8
  282. package/dist/ArtifactCard-EXVAEBV6.css +0 -109
  283. package/dist/DocTabsEditor-RCOWHX5J.css +0 -78
  284. package/dist/PresenterView-T2C6ZZ3N.css +0 -103
  285. package/dist/SandboxedFrame-L6HBQZCD.css +0 -50
  286. package/dist/chunk-CRKFL423.js +0 -74
  287. package/dist/chunk-GOSQXEZU.js +0 -102
  288. package/dist/chunk-MBNFJSZS.js +0 -107
  289. package/dist/chunk-RV7SZAHR.js +0 -105
  290. package/dist/chunk-UZ7ZUSLH.js +0 -179
  291. package/dist/utils/useMediaMatch.d.ts +0 -12
  292. /package/dist/{chunk-TF2P3OPS.js → chunk-YCARLYI6.js} +0 -0
@@ -77,12 +77,16 @@ export interface SheetGridProps {
77
77
  * `content` is as tall as its rows, up to `height` (or the
78
78
  * `--crewlet-sheet-max-height` the page sets, 70% of the viewport by
79
79
  * default), so twelve rows draw no empty bordered slab under the last one
80
- * and Add row sits right under them.
80
+ * and Add row sits right under them. In a column of bounded height it
81
+ * shrinks to the room left, down to the `--crewlet-sheet-min-height` the
82
+ * page sets.
81
83
  */
82
84
  fit?: 'container' | 'content' | undefined;
83
85
  /**
84
- * Shows the row actions menu on a row's number (the active row, a hovered
85
- * one, and Shift+F10 from any of its cells) with Delete row. The grid only
86
+ * Shows the row actions menu in a row's number gutter (the number gives way
87
+ * to the button under the pointer, on the row holding focus, and while the
88
+ * menu is open; a tap on the number opens it on a touch screen; Shift+F10
89
+ * opens it from any of the row's cells) with Delete row. The grid only
86
90
  * asks: the host confirms with its own dialog before it deletes anything.
87
91
  */
88
92
  onDeleteRow?: ((rowId: string) => void) | undefined;
@@ -1,19 +1,19 @@
1
- export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-LWXRD6L6.js';
1
+ export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-EWAFN2IU.js';
2
2
  import '../chunk-O2EGEONV.js';
3
3
  import '../chunk-CENOOTAV.js';
4
4
  import '../chunk-GFV4LJHH.js';
5
5
  import '../chunk-WIATRXEJ.js';
6
6
  import '../chunk-3BYIWOTV.js';
7
7
  import '../chunk-I6POAB4V.js';
8
- import '../chunk-YEKYVJQR.js';
9
- import '../chunk-NHBP2XS5.js';
8
+ import '../chunk-SGHIAGPR.js';
9
+ import '../chunk-VI5FWDZW.js';
10
10
  import '../chunk-Z7JYG5TF.js';
11
11
  import '../chunk-AYKXMIOR.js';
12
- import '../chunk-QWOPX2MN.js';
13
- import '../chunk-UAN5NE7M.js';
14
- import '../chunk-5OM447RW.js';
15
- import '../chunk-2HIOJ4YZ.js';
16
- import '../chunk-HMPFGIWM.js';
12
+ import '../chunk-6ZJ3N7QI.js';
13
+ import '../chunk-5AQBPHZD.js';
14
+ import '../chunk-PZKHBB7D.js';
15
+ import '../chunk-3EB2AV3H.js';
16
+ import '../chunk-OMV5W53A.js';
17
17
  import '../chunk-R25RGPUB.js';
18
18
  import '../chunk-OG6CL3EB.js';
19
19
  import '../chunk-RSAQOKH3.js';
@@ -13,6 +13,8 @@
13
13
 
14
14
  .crewlet-sheet-grid {
15
15
  --crewlet-sheet-row-height: var(--size-sheet-row);
16
+ /* The history control: a target-sized button, which its room in the cell is sized from. */
17
+ --crewlet-sheet-history-size: var(--size-target-min);
16
18
  position: relative;
17
19
  display: flex;
18
20
  flex-direction: column;
@@ -20,7 +22,33 @@
20
22
  min-height: 0;
21
23
  color: var(--color-text-primary);
22
24
  font-family: var(--font-family-sans);
23
- font-size: var(--font-size-sm);
25
+ /* Values at the compact step, a grid's own register: the headers stay a
26
+ step under them, in sentence case. */
27
+ font-size: var(--font-size-compact);
28
+ }
29
+
30
+ /* THE MEASURING ROW: each sized column's header and sampled values, drawn by
31
+ the real header and cell rules at their natural width, out of sight and out
32
+ of reach. The grid reads each one's widest part as the column's width. */
33
+ .crewlet-sheet-grid__measure {
34
+ position: absolute;
35
+ inset-block-start: 0;
36
+ inset-inline-start: 0;
37
+ width: 0;
38
+ height: 0;
39
+ overflow: hidden;
40
+ visibility: hidden;
41
+ pointer-events: none;
42
+ }
43
+
44
+ .crewlet-sheet-grid__measure > div {
45
+ display: flex;
46
+ flex-direction: column;
47
+ width: max-content;
48
+ }
49
+
50
+ .crewlet-sheet-grid__measure :is(.crewlet-sheet-grid__header, .crewlet-sheet-grid__cell) {
51
+ width: max-content;
24
52
  }
25
53
 
26
54
  /* Measured by the component: the resolved row height at the current density. */
@@ -49,9 +77,16 @@
49
77
  }
50
78
 
51
79
  /* AS TALL AS ITS ROWS (fit="content"): the component writes the height, the
52
- page may cap it, and the grid never grows past the height it was given. */
80
+ page may cap it, and the grid never grows past the height it was given.
81
+ IN A BOUNDED COLUMN IT GIVES WAY: the scroller shrinks to the room its
82
+ container has left under whatever stands above it (a bar that wraps on a
83
+ phone included), so the foot lands on the container's edge rather than
84
+ on a guess of how tall the rest is. It never shrinks below the floor the
85
+ page sets (--crewlet-sheet-min-height), and never below its own rows'
86
+ height, so a short sheet is not stretched into an empty slab. */
53
87
  .crewlet-sheet-grid--fit-content > .crewlet-sheet-grid__scroller {
54
- flex: none;
88
+ flex: 0 1 auto;
89
+ min-height: min(var(--crewlet-sheet-min-height, 0px), var(--crewlet-sheet-content-height, 0px));
55
90
  max-height: var(--crewlet-sheet-max-height, 70vh);
56
91
  }
57
92
 
@@ -137,24 +172,80 @@
137
172
  margin-inline-start: auto;
138
173
  }
139
174
 
175
+ /* A HEADER SITS ON ITS COLUMN'S EDGE: a number's and a rating's name end
176
+ where their values end, the sort mark on the inner side, and a checkbox's
177
+ name is centred over its boxes. A name on the leading edge over values on
178
+ the trailing one read as belonging to the column before. */
179
+ .crewlet-sheet-grid__header--number,
180
+ .crewlet-sheet-grid__header--rating {
181
+ flex-direction: row-reverse;
182
+ }
183
+
184
+ .crewlet-sheet-grid__header--number > .crewlet-sheet-grid__header-presence,
185
+ .crewlet-sheet-grid__header--rating > .crewlet-sheet-grid__header-presence {
186
+ margin-inline: 0 auto;
187
+ }
188
+
189
+ .crewlet-sheet-grid__header--checkbox {
190
+ justify-content: center;
191
+ }
192
+
140
193
  .crewlet-sheet-grid .crewlet-sheet-grid__header-badge {
141
194
  box-shadow: 0 0 0 2px var(--crewlet-presence-hue);
142
195
  }
143
196
 
197
+ /* THE GUTTER: one centred stack, so the number and the row's actions button
198
+ take exactly the same place and swapping one for the other moves nothing.
199
+ Its width is the component's fixed track (SHEET_ROW_NUMBER_WIDTH), which
200
+ holds five tabular digits, so row 9 and row 10000 stand in one column. */
144
201
  .crewlet-sheet-grid__rownum {
202
+ display: grid;
203
+ grid-template-areas: 'gutter';
204
+ place-items: center;
145
205
  color: var(--color-text-tertiary);
146
206
  font-size: var(--font-size-xs);
147
207
  font-variant-numeric: tabular-nums;
148
208
  }
149
209
 
150
- /* The row actions sit at the number's trailing edge, over the cell's own
151
- background, so the number stays readable beside them. */
210
+ .crewlet-sheet-grid__rownum-number,
211
+ .crewlet-sheet-grid__row-actions {
212
+ grid-area: gutter;
213
+ }
214
+
215
+ /* THE ACTIONS BUTTON IS ALWAYS THERE, drawn clear until it is wanted, so a
216
+ tap on the number opens the row's menu on a screen with no pointer to
217
+ hover with. It shows, and the number gives way to it, under the pointer,
218
+ on the row holding focus (the active cell, or the button itself) and while
219
+ its menu is open. A row the reader has not entered keeps its number. */
152
220
  .crewlet-sheet-grid__row-actions {
153
- position: absolute;
154
- top: 50%;
155
- inset-inline-end: 0;
156
221
  display: inline-flex;
157
- transform: translateY(-50%);
222
+ opacity: 0;
223
+ }
224
+
225
+ .crewlet-sheet-grid__row:is(:hover, :focus-within) > .crewlet-sheet-grid__rownum > .crewlet-sheet-grid__row-actions,
226
+ .crewlet-sheet-grid__rownum--open > .crewlet-sheet-grid__row-actions {
227
+ opacity: 1;
228
+ }
229
+
230
+ .crewlet-sheet-grid__row:is(:hover, :focus-within) > .crewlet-sheet-grid__rownum--actions > .crewlet-sheet-grid__rownum-number,
231
+ .crewlet-sheet-grid__rownum--open > .crewlet-sheet-grid__rownum-number {
232
+ visibility: hidden;
233
+ }
234
+
235
+ /* THE SELECTED ROWS' NUMBERS are marked as their cells are, and on the same
236
+ condition (the reader is in the grid, or the selection spans more than one
237
+ cell), the way a spreadsheet lights the row headers of a selection. The
238
+ tint is laid over the gutter's own ground, which a sticky gutter needs: a
239
+ translucent tint alone lets the values scrolling under it show through. */
240
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__rownum--selected {
241
+ background: linear-gradient(var(--color-brand-accent-soft), var(--color-brand-accent-soft)) var(--color-surface-background);
242
+ color: var(--color-brand-accent-ink);
243
+ }
244
+
245
+ /* The active cell's history is the reader's tool while they are in the grid,
246
+ not a mark on a sheet nobody has entered. */
247
+ .crewlet-sheet-grid__grid:not(:focus-within) .crewlet-sheet-grid__cell--history:not(:hover) > .crewlet-sheet-grid__history {
248
+ visibility: hidden;
158
249
  }
159
250
 
160
251
  /* The bar at a row's leading edge while somebody has it selected. */
@@ -192,8 +283,21 @@
192
283
  justify-content: center;
193
284
  }
194
285
 
195
- .crewlet-sheet-grid__cell--selected {
196
- background: var(--color-brand-accent-soft);
286
+ /* THE SELECTION IS TINTED WHILE THE READER IS IN THE GRID, or while it
287
+ spans more than one cell. A grid nobody has entered still holds its first
288
+ cell as the active one (the keys start there), and tinting it drew a stray
289
+ highlight on every sheet as it opened. The tint is laid over the cell's
290
+ own ground: alone, a translucent tint on a frozen cell let the values
291
+ scrolling under it show through. */
292
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
293
+ background: linear-gradient(var(--color-brand-accent-soft), var(--color-brand-accent-soft)) var(--color-surface-background);
294
+ }
295
+
296
+ /* THE FROZEN EDGE once the grid is scrolled sideways: the columns that stay
297
+ (or the row numbers, where none do) end on the strong hairline, so the
298
+ values passing under them read as scrolled rather than cut. */
299
+ .crewlet-sheet-grid__scroller--across .crewlet-sheet-grid__frozen-edge {
300
+ border-inline-end-color: var(--color-border-strong);
197
301
  }
198
302
 
199
303
  .crewlet-sheet-grid__cell:focus-visible,
@@ -263,6 +367,31 @@
263
367
  white-space: normal;
264
368
  }
265
369
 
370
+ /* THE HISTORY CONTROL HAS ITS OWN ROOM while it shows, so a value ends, or
371
+ ellipsises, before it rather than running under it. It sits at the edge
372
+ the value does not start from: the trailing edge of a value drawn from the
373
+ leading one, the leading edge of a number or a rating (drawn on the
374
+ trailing one), so neither moves when its cell becomes active. A checkbox,
375
+ centred in a column wider than it, needs no room made. */
376
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--history,
377
+ .crewlet-sheet-grid__cell--history:hover {
378
+ padding-inline-end: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size));
379
+ }
380
+
381
+ .crewlet-sheet-grid__grid:focus-within :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history,
382
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history:hover {
383
+ padding-inline: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size)) var(--spacing-2);
384
+ }
385
+
386
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history,
387
+ .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history:hover {
388
+ padding-inline-end: var(--spacing-2);
389
+ }
390
+
391
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating) > .crewlet-sheet-grid__history {
392
+ inset-inline: var(--spacing-1) auto;
393
+ }
394
+
266
395
  .crewlet-sheet-grid__history {
267
396
  position: absolute;
268
397
  top: 50%;
@@ -270,9 +399,11 @@
270
399
  display: inline-flex;
271
400
  align-items: center;
272
401
  justify-content: center;
273
- padding: var(--spacing-1);
402
+ width: var(--crewlet-sheet-history-size);
403
+ height: var(--crewlet-sheet-history-size);
404
+ padding: 0;
274
405
  border: 0;
275
- border-radius: var(--radius-sm);
406
+ border-radius: var(--radius-md);
276
407
  background: var(--color-surface-elevated);
277
408
  color: var(--color-text-secondary);
278
409
  transform: translateY(-50%);
@@ -280,6 +411,7 @@
280
411
  }
281
412
 
282
413
  .crewlet-sheet-grid__history:hover {
414
+ background: var(--color-surface-hover);
283
415
  color: var(--color-text-primary);
284
416
  }
285
417
 
@@ -654,11 +786,19 @@
654
786
  }
655
787
 
656
788
  @media (forced-colors: active) {
657
- .crewlet-sheet-grid__cell--selected {
789
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
658
790
  background: Highlight;
659
791
  color: HighlightText;
660
792
  }
661
793
 
794
+ /* A selected row's number takes the selection's ink on the page's ground:
795
+ on a Highlight ground the browser's backplate behind the digits drew
796
+ them as a solid block. */
797
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__rownum--selected {
798
+ background: Canvas;
799
+ color: Highlight;
800
+ }
801
+
662
802
  .crewlet-sheet-grid__rownum--present::before {
663
803
  background: Highlight;
664
804
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Columns sized to what they hold. A column that declares no width is as wide
3
+ * as the widest of its header and its values as drawn, within bounds its type
4
+ * sets: a status column wide enough for "Changes requested", a checkbox column
5
+ * wide enough for its name, and no text column running a screen wide.
6
+ *
7
+ * The grid measures; this module says WHAT it measures (a few values per
8
+ * column, not every row) and how a measurement becomes a width.
9
+ */
10
+ import type { SheetColumn, SheetColumnType, SheetRow, SheetValue } from './types.js';
11
+ import { type SheetValueContext } from './values.js';
12
+ /**
13
+ * The narrowest and widest a column sizes itself to, in px, by type. The
14
+ * floor keeps a column a target and its header readable; the ceiling keeps one
15
+ * long value from pushing every other column off the screen (the rest of it is
16
+ * one Enter away, in the editor).
17
+ */
18
+ export declare const SHEET_COLUMN_BOUNDS: Readonly<Record<SheetColumnType, readonly [min: number, max: number]>>;
19
+ /** How many of a column's longest values it is measured by. */
20
+ export declare const SHEET_FIT_SAMPLES = 8;
21
+ /**
22
+ * The width a column takes from its measurement (the widest of its header and
23
+ * sampled values as drawn, border included), within its type's bounds. Nothing
24
+ * measured (no layout, as on a server or in a test) leaves the type's default.
25
+ */
26
+ export declare function fittedWidth(type: SheetColumnType, measured: number): number;
27
+ /**
28
+ * The values a column is measured by. A choice column is measured by every
29
+ * live choice, whatever the rows hold, so a choice nobody has picked yet still
30
+ * fits when somebody does. A checkbox and a multi-select by their header alone
31
+ * (one box, and chips that count what does not fit), a rating by its full
32
+ * mark. Every other column by its `limit` longest values as displayed.
33
+ */
34
+ export declare function fitSamples(column: SheetColumn, rows: readonly SheetRow[], context: SheetValueContext, limit?: number): SheetValue[];
@@ -7,6 +7,7 @@ export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, TEXT_MAX_
7
7
  export type { SheetParse, SheetValueContext } from './values.js';
8
8
  export { SHEET_COLUMN_WIDTHS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, columnOffsets, columnWidth, drawnColumns, editorSide, inRange, isMod, isMultiCell, isTypingKey, moveFrom, rangeOf, scrollToRow, visibleRows, } from './navigation.js';
9
9
  export type { SheetBounds, SheetKey, SheetPosition, SheetRange } from './navigation.js';
10
+ export { SHEET_COLUMN_BOUNDS, SHEET_FIT_SAMPLES, fitSamples, fittedWidth } from './fit.js';
10
11
  export { parseTSV, planClear, planPaste, toTSV } from './clipboard.js';
11
12
  export type { SheetPastePlan } from './clipboard.js';
12
13
  export { SheetPendingEdits, changeText, changeTime, hasPrevious, refusalText } from './edits.js';
@@ -1,3 +1,3 @@
1
- export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from '../chunk-NHBP2XS5.js';
1
+ export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_BOUNDS, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_FIT_SAMPLES, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, fitSamples, fittedWidth, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from '../chunk-VI5FWDZW.js';
2
2
  import '../chunk-Z7JYG5TF.js';
3
3
  import '../chunk-AYKXMIOR.js';
@@ -59,7 +59,7 @@ export interface SheetLabels {
59
59
  dismiss: string;
60
60
  /** A refusal, as the grid announces it: "Not saved: <reason>". */
61
61
  notSaved: (reason: string) => string;
62
- /** The row actions control on a row's number, and its delete item. */
62
+ /** The row actions button in a row's number gutter (its name and tooltip), and its delete item. */
63
63
  rowActions: (row: number) => string;
64
64
  deleteRow: string;
65
65
  /** Appended to the keyboard help when a row has actions. */
@@ -1,4 +1,4 @@
1
1
  export { matchesShortcut, useShortcut } from '../chunk-2FPENTCF.js';
2
- import '../chunk-HMPFGIWM.js';
2
+ import '../chunk-OMV5W53A.js';
3
3
  import '../chunk-R25RGPUB.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -30,7 +30,8 @@ export interface SkeletonProps {
30
30
  style?: CSSProperties;
31
31
  width?: number | string;
32
32
  height?: number | string;
33
- borderRadius?: number;
33
+ /** A number of px, or any CSS length, such as a radius token: `var(--radius-md)`. */
34
+ borderRadius?: number | string;
34
35
  marginTop?: number;
35
36
  marginBottom?: number;
36
37
  }
@@ -1,3 +1,3 @@
1
- export { Skeleton } from '../chunk-W5J7R5EB.js';
1
+ export { Skeleton } from '../chunk-TEUQWOWZ.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -24,7 +24,8 @@ export interface SlideCompareLabels {
24
24
  removed: string;
25
25
  unchanged: string;
26
26
  moved: (from: number, to: number) => string;
27
- missing: (version: string) => string;
27
+ /** The empty side of a slide one version lacks, under that version's heading. */
28
+ missing: string;
28
29
  summary: (counts: Record<Exclude<SlideChange, 'unchanged'> | 'moved', number>) => string;
29
30
  showUnchanged: (count: number) => string;
30
31
  hideUnchanged: string;
@@ -43,6 +44,10 @@ export interface SlideCompareProps {
43
44
  * drawings side by side, paired by its id, with a slide one version lacks in
44
45
  * its place and an empty side saying so.
45
46
  *
47
+ * EACH SIDE IS NAMED: the two columns carry their versions' names over the
48
+ * first row, and again over each side once the sides stack on a phone, so a
49
+ * reader never has to guess which drawing is the older one.
50
+ *
46
51
  * SAID IN WORDS, NEVER COLOUR ALONE. Every row names what happened to it
47
52
  * (Changed, Added, Removed, Moved from 6 to 7) beside a glyph, and the list
48
53
  * opens with the count of each, so a reader hears the comparison before they
@@ -1,6 +1,6 @@
1
- export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-CRKFL423.js';
2
- import '../chunk-E6CR5PEV.js';
3
- import '../chunk-HMPFGIWM.js';
1
+ export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-LL5AFXU7.js';
2
+ import '../chunk-LV4APO72.js';
3
+ import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-R25RGPUB.js';
5
5
  import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
@@ -56,9 +56,34 @@
56
56
  gap: var(--spacing-3);
57
57
  }
58
58
 
59
- .crewlet-slide-compare__side .crewlet-slide-stage {
60
- border-radius: var(--radius-sm);
61
- outline: 1px solid var(--color-border-default);
59
+ .crewlet-slide-compare__side {
60
+ display: flex;
61
+ flex-direction: column;
62
+ gap: var(--spacing-1);
63
+ min-width: 0;
64
+ }
65
+
66
+ /* THE VERSIONS' NAMES over the two columns; over each side instead once the
67
+ sides stack. */
68
+ .crewlet-slide-compare__columns {
69
+ display: grid;
70
+ grid-template-columns: repeat(2, minmax(0, 1fr));
71
+ gap: var(--spacing-3);
72
+ padding-bottom: var(--spacing-2);
73
+ border-bottom: 1px solid var(--color-border-default);
74
+ color: var(--color-text-secondary);
75
+ font-size: var(--font-size-xs);
76
+ font-weight: var(--font-weight-semibold);
77
+ }
78
+
79
+ .crewlet-slide-compare__side-label {
80
+ display: none;
81
+ color: var(--color-text-tertiary);
82
+ font-size: var(--font-size-xs);
83
+ }
84
+
85
+ .crewlet-slide-compare__toggle {
86
+ align-self: flex-start;
62
87
  }
63
88
 
64
89
  .crewlet-slide-compare__missing {
@@ -77,4 +102,12 @@
77
102
  .crewlet-slide-compare__sides {
78
103
  grid-template-columns: minmax(0, 1fr);
79
104
  }
105
+
106
+ .crewlet-slide-compare__columns {
107
+ display: none;
108
+ }
109
+
110
+ .crewlet-slide-compare__side-label {
111
+ display: block;
112
+ }
80
113
  }
@@ -15,6 +15,11 @@ export interface SlideFilmstripLabels {
15
15
  hidden: string;
16
16
  untitled: string;
17
17
  }
18
+ /**
19
+ * Which way the strip runs: a column beside the stage, or a row under it
20
+ * where the stage takes the whole width (a phone).
21
+ */
22
+ export type SlideFilmstripOrientation = 'vertical' | 'horizontal';
18
23
  export interface SlideFilmstripProps {
19
24
  slides: readonly FilmstripSlide[];
20
25
  /** The slide on the stage. */
@@ -27,6 +32,7 @@ export interface SlideFilmstripProps {
27
32
  * out, the filmstrip is read only and draws no handles.
28
33
  */
29
34
  onReorder?: ((ids: string[]) => void) | undefined;
35
+ orientation?: SlideFilmstripOrientation | undefined;
30
36
  className?: string | undefined;
31
37
  labels?: Partial<SlideFilmstripLabels> | undefined;
32
38
  }
@@ -37,14 +43,19 @@ export interface SlideFilmstripProps {
37
43
  *
38
44
  * ONE STOP IN THE TAB ORDER for the thumbnails: each is a button marked
39
45
  * `aria-current` when its slide is on the stage, and only that one is in the
40
- * tab order; Up and Down move to the next or previous slide, Home and End to
41
- * the ends, and the stage follows. A handle is its own control beside its
46
+ * tab order; Up and Down (Left and Right in a row) move to the next or
47
+ * previous slide, Home and End to the ends, and the stage follows. A handle is its own control beside its
42
48
  * thumbnail, since moving a slide is a different act from looking at it; its
43
49
  * arrow keys move the slide, and the move is announced with where it landed.
44
50
  * (A listbox would hold the handles inside its options, which a listbox may
45
51
  * not.)
46
52
  *
53
+ * THE SLIDE ON THE STAGE IS KEPT IN VIEW. The strip is its own scroller, and
54
+ * whenever the selection moves, whether by a press here, by Present, by a link
55
+ * that opened on slide 25 or by following somebody, the strip scrolls just
56
+ * enough to show it, and nothing else on the page moves.
57
+ *
47
58
  * THUMBNAILS ARE THE SLIDES THEMSELVES, drawn by the caller at the slide's own
48
59
  * size and scaled by `SlideStage`, so what the strip shows is what presents.
49
60
  */
50
- export declare function SlideFilmstrip({ slides, selected, onSelect, renderSlide, onReorder, className, labels, }: SlideFilmstripProps): import("react").JSX.Element;
61
+ export declare function SlideFilmstrip({ slides, selected, onSelect, renderSlide, onReorder, orientation, className, labels, }: SlideFilmstripProps): import("react").JSX.Element;
@@ -1,7 +1,7 @@
1
- export { SlideFilmstrip } from '../chunk-RV7SZAHR.js';
2
- import '../chunk-E6CR5PEV.js';
1
+ export { SlideFilmstrip } from '../chunk-XV32RKQZ.js';
2
+ import '../chunk-LV4APO72.js';
3
3
  import '../chunk-XJ2QEBMM.js';
4
- import '../chunk-HMPFGIWM.js';
4
+ import '../chunk-OMV5W53A.js';
5
5
  import '../chunk-R25RGPUB.js';
6
6
  import '../chunk-RSAQOKH3.js';
7
7
  import '../chunk-BZFWDIV6.js';
@@ -1,10 +1,21 @@
1
1
  /*
2
- * SlideFilmstrip: the column of slide thumbnails beside a deck's stage.
2
+ * SlideFilmstrip: the column of slide thumbnails beside a deck's stage, or
3
+ * the row under it on a phone.
3
4
  *
4
5
  * The selected slide is ringed in the brand accent rather than filled, so its
5
6
  * thumbnail still shows the slide's own colours.
7
+ *
8
+ * THE STRIP IS ITS OWN SCROLLER: a host bounds it (a column's max-height, a
9
+ * row's width) and the strip scrolls inside that, keeping the selected slide
10
+ * in view, with its scroll chained to nothing so a flick at its end does not
11
+ * scroll the page under the reader's thumb.
6
12
  */
7
13
 
14
+ .crewlet-slide-filmstrip {
15
+ overflow: auto;
16
+ overscroll-behavior: contain;
17
+ }
18
+
8
19
  .crewlet-slide-filmstrip__list {
9
20
  display: flex;
10
21
  flex-direction: column;
@@ -72,6 +83,9 @@
72
83
  color: var(--color-text-secondary);
73
84
  }
74
85
 
86
+ /* A CONTROL'S CORNER: the handle is a 24px control like any toolbar button,
87
+ so it takes --radius-md; the thumbnail beside it is a slide, and keeps the
88
+ slide's own smaller corner. */
75
89
  .crewlet-slide-filmstrip__handle {
76
90
  display: inline-flex;
77
91
  align-items: center;
@@ -80,7 +94,7 @@
80
94
  min-height: var(--size-target-min);
81
95
  padding: 0;
82
96
  border: 0;
83
- border-radius: var(--radius-sm);
97
+ border-radius: var(--radius-md);
84
98
  background: transparent;
85
99
  color: var(--color-text-tertiary);
86
100
  cursor: grab;
@@ -106,3 +120,50 @@
106
120
  .crewlet-slide-filmstrip__item[data-reorder-target='after'] .crewlet-slide-filmstrip__thumb {
107
121
  box-shadow: 0 var(--spacing-1) 0 var(--color-brand-accent);
108
122
  }
123
+
124
+ /* A ROW UNDER THE STAGE: fixed-width thumbnails that scroll sideways, each
125
+ with its number and its handle under it rather than beside it. */
126
+ /* NO SCROLL SNAP: a snap point would pull the strip back to the start of an
127
+ earlier thumbnail just after it scrolled the selected one into view. */
128
+ .crewlet-slide-filmstrip--horizontal {
129
+ overflow-y: hidden;
130
+ }
131
+
132
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__list {
133
+ flex-direction: row;
134
+ gap: var(--spacing-3);
135
+ width: max-content;
136
+ }
137
+
138
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item {
139
+ grid-template-columns: minmax(0, 1fr) auto;
140
+ grid-template-areas:
141
+ 'thumb thumb'
142
+ 'number handle';
143
+ align-items: center;
144
+ width: 7.5rem;
145
+ }
146
+
147
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__thumb {
148
+ grid-area: thumb;
149
+ }
150
+
151
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__number {
152
+ grid-area: number;
153
+ padding-top: 0;
154
+ text-align: left;
155
+ }
156
+
157
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__handle {
158
+ grid-area: handle;
159
+ min-height: var(--size-control-sm);
160
+ cursor: grab;
161
+ }
162
+
163
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item[data-reorder-target='before'] .crewlet-slide-filmstrip__thumb {
164
+ box-shadow: calc(var(--spacing-1) * -1) 0 0 var(--color-brand-accent);
165
+ }
166
+
167
+ .crewlet-slide-filmstrip--horizontal .crewlet-slide-filmstrip__item[data-reorder-target='after'] .crewlet-slide-filmstrip__thumb {
168
+ box-shadow: var(--spacing-1) 0 0 var(--color-brand-accent);
169
+ }
@@ -1,5 +1,5 @@
1
- export { SlideGrid } from '../chunk-VS3KOOOL.js';
2
- import '../chunk-E6CR5PEV.js';
3
- import '../chunk-HMPFGIWM.js';
1
+ export { SlideGrid } from '../chunk-ILAEBSLJ.js';
2
+ import '../chunk-LV4APO72.js';
3
+ import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-R25RGPUB.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -38,11 +38,6 @@
38
38
  cursor: pointer;
39
39
  }
40
40
 
41
- .crewlet-slide-grid__card .crewlet-slide-stage {
42
- border-radius: var(--radius-sm);
43
- outline: 1px solid var(--color-border-default);
44
- }
45
-
46
41
  .crewlet-slide-grid__card:hover .crewlet-slide-stage {
47
42
  outline-color: var(--color-border-hover);
48
43
  }
@@ -80,3 +75,12 @@
80
75
  text-overflow: ellipsis;
81
76
  white-space: nowrap;
82
77
  }
78
+
79
+ /* TWO TO A ROW ON A PHONE: a grid of one is the filmstrip at full size, and
80
+ the grid is for seeing the deck's run at a glance. */
81
+ @media (width < 640px) {
82
+ .crewlet-slide-grid__list {
83
+ grid-template-columns: repeat(2, minmax(0, 1fr));
84
+ gap: var(--spacing-3);
85
+ }
86
+ }