@crewlethq/ui 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/README.md +131 -5
  2. package/dist/AccessDeniedCard/AccessDeniedCard.d.ts +5 -0
  3. package/dist/AccessDeniedCard/index.js +1 -5
  4. package/dist/AccessDeniedCard-QVNDMT46.css +8 -0
  5. package/dist/AppShell/index.js +4 -4
  6. package/dist/{AppShell-GCM4TDVY.css → AppShell-JTSEOA57.css} +3 -1
  7. package/dist/ArrangeGroup/ArrangeGroup.d.ts +16 -1
  8. package/dist/ArrangeGroup/index.d.ts +1 -1
  9. package/dist/ArrangeGroup/index.js +1 -1
  10. package/dist/{ArrangeGroup-GY5YMP6E.css → ArrangeGroup-KRWWOJKR.css} +43 -0
  11. package/dist/ArrangeList/index.js +2 -2
  12. package/dist/ArtifactBar/index.js +12 -12
  13. package/dist/{ArtifactBar-MLMJHWY6.css → ArtifactBar-C462VD4C.css} +8 -3
  14. package/dist/ArtifactCard/ArtifactCard.d.ts +19 -1
  15. package/dist/ArtifactCard/index.d.ts +1 -1
  16. package/dist/ArtifactCard/index.js +4 -4
  17. package/dist/{ArtifactCard-EXVAEBV6.css → ArtifactCard-AS5Z4CVI.css} +17 -2
  18. package/dist/ArtifactCover/index.js +6 -6
  19. package/dist/ArtifactIcon/index.js +5 -5
  20. package/dist/ArtifactPanel/ArtifactPanel.d.ts +6 -2
  21. package/dist/ArtifactPanel/index.js +1 -1
  22. package/dist/{ArtifactPanel-YFXT5O77.css → ArtifactPanel-HW3SU7CP.css} +25 -7
  23. package/dist/Avatar/Avatar.d.ts +6 -4
  24. package/dist/Avatar/index.js +2 -2
  25. package/dist/AvatarPicker/index.js +8 -8
  26. package/dist/Callout/index.js +1 -1
  27. package/dist/{Callout-SXXK4B5R.css → Callout-ZAVG3P66.css} +46 -6
  28. package/dist/Canvas/Canvas.d.ts +33 -2
  29. package/dist/Canvas/index.d.ts +1 -1
  30. package/dist/Canvas/index.js +4 -4
  31. package/dist/{Canvas-LRVNW7XN.css → Canvas-VUG2HLZK.css} +23 -0
  32. package/dist/CanvasBoard/CanvasBoard.d.ts +38 -3
  33. package/dist/CanvasBoard/budget.d.ts +9 -3
  34. package/dist/CanvasBoard/index.d.ts +2 -2
  35. package/dist/CanvasBoard/index.js +7 -7
  36. package/dist/{CanvasBoard-MBZVBWDO.css → CanvasBoard-5NNSKY6A.css} +127 -6
  37. package/dist/CanvasToolbar/index.js +5 -5
  38. package/dist/{CanvasToolbar-AE5MXH7T.css → CanvasToolbar-EM5EVZED.css} +4 -2
  39. package/dist/ChangeMark/index.js +4 -4
  40. package/dist/CharacterPicker/index.js +2 -2
  41. package/dist/Charts/ActivityStrip.d.ts +16 -1
  42. package/dist/Charts/BarList.d.ts +6 -0
  43. package/dist/Charts/ChartEmpty.d.ts +33 -0
  44. package/dist/Charts/Legend.d.ts +6 -0
  45. package/dist/Charts/StackedBar.d.ts +4 -1
  46. package/dist/Charts/StackedColumns.d.ts +14 -3
  47. package/dist/Charts/TimeSeries.d.ts +11 -1
  48. package/dist/Charts/index.d.ts +2 -0
  49. package/dist/Charts/index.js +1 -1
  50. package/dist/{Charts-RY4JN5FC.css → Charts-MBJG72BS.css} +140 -16
  51. package/dist/Checkbox/index.js +1 -1
  52. package/dist/{Checkbox-5UORUG3F.css → Checkbox-ALWG3WV2.css} +11 -0
  53. package/dist/CommandPalette/index.js +3 -3
  54. package/dist/{CommandPalette-HBTNKHZQ.css → CommandPalette-7CFGVBND.css} +4 -0
  55. package/dist/CommentThread/index.js +5 -5
  56. package/dist/Container/index.js +1 -1
  57. package/dist/{Container-3TSKMGNI.css → Container-34BAKG7B.css} +3 -1
  58. package/dist/{DashboardCover-RMINBODB.css → DashboardCover-KYGYMRKW.css} +42 -9
  59. package/dist/DataTable/index.js +5 -5
  60. package/dist/{DataTable-WZK3V62B.css → DataTable-NL2YWAIA.css} +4 -1
  61. package/dist/DataView/index.js +8 -8
  62. package/dist/DateTimePicker/index.js +3 -3
  63. package/dist/DocTabsEditor/DocTabsEditor.d.ts +34 -21
  64. package/dist/DocTabsEditor/index.js +4 -1
  65. package/dist/DocTabsEditor-4M452LNS.css +189 -0
  66. package/dist/Document/Document.d.ts +18 -1
  67. package/dist/Document/index.d.ts +2 -2
  68. package/dist/Document/index.js +1 -1
  69. package/dist/{Document-G3YTZIUL.css → Document-JUGCSQ4L.css} +78 -5
  70. package/dist/EditingStatus/index.js +1 -1
  71. package/dist/{EditingStatus-L6THUAN7.css → EditingStatus-NNA2CKIL.css} +17 -4
  72. package/dist/{Editor-YWBUJAQU.js → Editor-UUZ7XKCU.js} +5 -5
  73. package/dist/EntityChip/index.js +3 -3
  74. package/dist/FactList/index.js +3 -3
  75. package/dist/FollowBanner/index.js +3 -3
  76. package/dist/Fullscreen/index.d.ts +1 -0
  77. package/dist/Fullscreen/index.js +1 -1
  78. package/dist/Fullscreen/useIdle.d.ts +16 -0
  79. package/dist/HuePicker/index.js +3 -3
  80. package/dist/ImageUpload/index.js +3 -3
  81. package/dist/Layer/index.d.ts +1 -1
  82. package/dist/Layer/index.js +1 -1
  83. package/dist/Layer/place.d.ts +18 -0
  84. package/dist/LayersList/LayersList.d.ts +57 -0
  85. package/dist/LayersList/index.d.ts +3 -0
  86. package/dist/LayersList/index.js +3 -0
  87. package/dist/LayersList-NQZEIPZB.css +82 -0
  88. package/dist/LinkInterstitial/index.js +4 -4
  89. package/dist/ListInput/index.js +1 -1
  90. package/dist/Markdown/index.js +1 -1
  91. package/dist/MarkdownEditor/index.js +5 -5
  92. package/dist/MediaMatch/index.d.ts +1 -0
  93. package/dist/MediaMatch/index.js +1 -0
  94. package/dist/MediaMatch/useMediaMatch.d.ts +19 -0
  95. package/dist/Menu/index.js +2 -2
  96. package/dist/MergeConflicts/index.js +4 -4
  97. package/dist/Modal/index.js +2 -2
  98. package/dist/{Modal-XOSV6FAH.css → Modal-7MWRCWAI.css} +30 -0
  99. package/dist/Note/index.js +1 -1
  100. package/dist/{Note-ONSKKTOA.css → Note-WI5MLZOO.css} +13 -0
  101. package/dist/OrgLabel/index.js +3 -3
  102. package/dist/OrgNode/index.js +4 -4
  103. package/dist/OrgTable/index.js +7 -7
  104. package/dist/PeopleRail/index.js +3 -3
  105. package/dist/Popover/index.js +2 -2
  106. package/dist/PresenceStack/index.js +3 -3
  107. package/dist/{PresenceStack-QSXQJND5.css → PresenceStack-FJJQVH74.css} +11 -3
  108. package/dist/PresenterView/PresenterView.d.ts +3 -0
  109. package/dist/PresenterView/index.js +5 -3
  110. package/dist/PresenterView-T3EXIQ5S.css +147 -0
  111. package/dist/Principal/index.js +3 -3
  112. package/dist/PrincipalPicker/index.js +4 -4
  113. package/dist/RichEditor/index.js +5 -5
  114. package/dist/RichEditor/schema.d.ts +1 -1
  115. package/dist/RichEditorMarkdown/index.js +3 -3
  116. package/dist/SandboxedFrame/SandboxedFrame.d.ts +44 -2
  117. package/dist/SandboxedFrame/index.d.ts +2 -2
  118. package/dist/SandboxedFrame/index.js +3 -3
  119. package/dist/SandboxedFrame-P5NASXB7.css +72 -0
  120. package/dist/Section/index.js +1 -1
  121. package/dist/{Section-QR3ILQVK.css → Section-O5AHGSOG.css} +28 -5
  122. package/dist/SegmentedControl/index.js +3 -3
  123. package/dist/Select/index.js +2 -2
  124. package/dist/ShareDialog/ShareDialog.d.ts +10 -0
  125. package/dist/ShareDialog/index.js +9 -9
  126. package/dist/{ShareDialog-YZ4F37MW.css → ShareDialog-4QDCBWMH.css} +12 -0
  127. package/dist/SheetGrid/SheetGrid.d.ts +3 -1
  128. package/dist/SheetGrid/index.js +8 -8
  129. package/dist/{SheetGrid-J3TKKXZL.css → SheetGrid-AKPUCK67.css} +106 -7
  130. package/dist/SheetModel/fit.d.ts +34 -0
  131. package/dist/SheetModel/index.d.ts +1 -0
  132. package/dist/SheetModel/index.js +1 -1
  133. package/dist/Shortcut/index.js +1 -1
  134. package/dist/Skeleton/Skeleton.d.ts +2 -1
  135. package/dist/Skeleton/index.js +1 -1
  136. package/dist/SlideCompare/SlideCompare.d.ts +6 -1
  137. package/dist/SlideCompare/index.js +3 -3
  138. package/dist/{SlideCompare-MGM3U2ME.css → SlideCompare-HTCMPQFY.css} +36 -3
  139. package/dist/SlideFilmstrip/SlideFilmstrip.d.ts +14 -3
  140. package/dist/SlideFilmstrip/index.js +3 -3
  141. package/dist/{SlideFilmstrip-BCLNAHFX.css → SlideFilmstrip-5U6Z55GS.css} +63 -2
  142. package/dist/SlideGrid/index.js +3 -3
  143. package/dist/{SlideGrid-RT6QEQEE.css → SlideGrid-S4LTJ4UU.css} +9 -5
  144. package/dist/SlideNav/SlideNav.d.ts +49 -0
  145. package/dist/SlideNav/index.d.ts +3 -0
  146. package/dist/SlideNav/index.js +4 -0
  147. package/dist/SlideNav-BLFJF6AH.css +53 -0
  148. package/dist/SlideStage/SlideStage.d.ts +9 -1
  149. package/dist/SlideStage/index.js +2 -2
  150. package/dist/{SlideStage-KGRRALXR.css → SlideStage-S2FISF4C.css} +23 -0
  151. package/dist/StatCard/StatCard.d.ts +16 -1
  152. package/dist/StatCard/index.js +1 -1
  153. package/dist/{StatCard-KPAFD4E2.css → StatCard-4T7TMWMN.css} +40 -13
  154. package/dist/Switcher/index.js +6 -6
  155. package/dist/TableCells/index.js +3 -3
  156. package/dist/Tabs/Tabs.d.ts +21 -4
  157. package/dist/Tabs/index.js +1 -1
  158. package/dist/{Tabs-CJGO35BH.css → Tabs-MMZXV5EF.css} +9 -8
  159. package/dist/TagsInput/index.js +1 -1
  160. package/dist/ThemeSwitcher/index.js +4 -4
  161. package/dist/TimeWindowPicker/index.js +4 -4
  162. package/dist/Toaster/index.js +2 -2
  163. package/dist/{Toaster-EOOOTSJT.css → Toaster-C6BQ7L6I.css} +10 -1
  164. package/dist/Toolbar/index.js +1 -1
  165. package/dist/Tooltip/index.js +2 -2
  166. package/dist/TreeCanvas/index.js +5 -5
  167. package/dist/TreeGrid/index.js +3 -3
  168. package/dist/VersionCompare/index.js +4 -4
  169. package/dist/VersionTimeline/index.js +4 -4
  170. package/dist/WidgetFrame/WidgetFrame.d.ts +8 -1
  171. package/dist/WidgetFrame/index.js +2 -2
  172. package/dist/{WidgetFrame-LRZIL62O.css → WidgetFrame-BTFW3CRK.css} +49 -5
  173. package/dist/{chunk-OTN35CI4.js → chunk-22UEIXZE.js} +18 -6
  174. package/dist/{chunk-UZ6MA2V6.js → chunk-2DHMVB5J.js} +2 -2
  175. package/dist/{chunk-WJDQ7XQA.js → chunk-2QEDJSJC.js} +1 -1
  176. package/dist/{chunk-2HIOJ4YZ.js → chunk-3EB2AV3H.js} +2 -3
  177. package/dist/{chunk-ODT5H4MN.js → chunk-3LYWD3BO.js} +2 -2
  178. package/dist/{chunk-FAQGGX2Z.js → chunk-3TFDQLW3.js} +1 -1
  179. package/dist/{chunk-VYDFB6PJ.js → chunk-3U7S6ZUN.js} +50 -17
  180. package/dist/{chunk-A4E5YLXO.js → chunk-4B6LSFDS.js} +1 -1
  181. package/dist/{chunk-WTNUVQVI.js → chunk-4IJS5CPF.js} +1 -1
  182. package/dist/{chunk-UAN5NE7M.js → chunk-5AQBPHZD.js} +1 -1
  183. package/dist/{chunk-QWOPX2MN.js → chunk-5FYPE5GL.js} +2 -3
  184. package/dist/{chunk-CJKMURZO.js → chunk-5SZGKSGL.js} +1 -1
  185. package/dist/chunk-6VOS2GMB.js +54 -0
  186. package/dist/{chunk-3ZAFJ4GK.js → chunk-7Q7WDXHG.js} +4 -4
  187. package/dist/{chunk-JI5AVQLA.js → chunk-7WHDPLVJ.js} +1 -1
  188. package/dist/{chunk-QH3AKP2N.js → chunk-AC22RZKC.js} +2 -2
  189. package/dist/{chunk-ZITJKF6Z.js → chunk-AYB6AYNH.js} +1 -1
  190. package/dist/{chunk-Y5NQ2LMS.js → chunk-BY4N65PM.js} +1 -1
  191. package/dist/{chunk-YFW4MTK4.js → chunk-C7DKX453.js} +1 -1
  192. package/dist/{chunk-RCQXUT5K.js → chunk-CCAXYHQS.js} +1 -1
  193. package/dist/{chunk-4KP4RC3O.js → chunk-CI3VPIJN.js} +1 -1
  194. package/dist/{chunk-7T42VQQT.js → chunk-CPEPST4S.js} +1 -1
  195. package/dist/{chunk-AAOH2P6Y.js → chunk-DFK5EQTU.js} +5 -3
  196. package/dist/{chunk-GOSQXEZU.js → chunk-DFZMYB5X.js} +16 -10
  197. package/dist/{chunk-TGYDROIB.js → chunk-EBCHVFCS.js} +4 -4
  198. package/dist/{chunk-YDBC4DNW.js → chunk-FWYHRU7M.js} +1 -1
  199. package/dist/{chunk-LWXRD6L6.js → chunk-G4ZW7A2W.js} +123 -31
  200. package/dist/{chunk-E6EWK5YY.js → chunk-GLSOD5Z4.js} +3 -3
  201. package/dist/{chunk-LIXSV5YI.js → chunk-GPHWCK7M.js} +1 -1
  202. package/dist/{chunk-UQHKFF2N.js → chunk-GPWJCP3U.js} +1 -1
  203. package/dist/{chunk-77DRMDXR.js → chunk-HG5VF3TZ.js} +192 -67
  204. package/dist/{chunk-4JUKWWUD.js → chunk-HH2GKAAE.js} +1 -1
  205. package/dist/{chunk-QVE4GJAT.js → chunk-HJO4WCH6.js} +1 -1
  206. package/dist/{chunk-I3BSQUKN.js → chunk-HUVG2FFT.js} +1 -1
  207. package/dist/{chunk-VS3KOOOL.js → chunk-ILAEBSLJ.js} +3 -3
  208. package/dist/{chunk-GR55WT4R.js → chunk-IYO2N5ZH.js} +2 -2
  209. package/dist/{chunk-RWA4H2TV.js → chunk-J6ON5SYE.js} +1 -1
  210. package/dist/{chunk-NHBP2XS5.js → chunk-J6ZSH3F5.js} +49 -1
  211. package/dist/{chunk-AMNN4WDX.js → chunk-JBUMD6DS.js} +2 -2
  212. package/dist/{chunk-BWRGFKJP.js → chunk-K3IJQNB7.js} +2 -3
  213. package/dist/{chunk-LFNUH4GY.js → chunk-K4VP6ZKE.js} +1 -1
  214. package/dist/{chunk-ZR5VN5IV.js → chunk-KD2IRYCT.js} +2 -2
  215. package/dist/{chunk-SKOYC2CF.js → chunk-KK5OYNAF.js} +2 -1
  216. package/dist/{chunk-UB7TJEKZ.js → chunk-KV3ODJXH.js} +6 -7
  217. package/dist/chunk-LL5AFXU7.js +96 -0
  218. package/dist/{chunk-VYOKRN2I.js → chunk-LM3ISVJA.js} +1 -1
  219. package/dist/{chunk-E6CR5PEV.js → chunk-LV4APO72.js} +8 -2
  220. package/dist/{chunk-B4EBHPK3.js → chunk-M5KZX5JE.js} +9 -2
  221. package/dist/{chunk-PJD2KFHX.js → chunk-MDNVHIB2.js} +38 -13
  222. package/dist/{chunk-V5IGUXMZ.js → chunk-MTMKIUWF.js} +4 -4
  223. package/dist/{chunk-HVNTQ36V.js → chunk-O37AQNLK.js} +4 -4
  224. package/dist/{chunk-HMPFGIWM.js → chunk-OMV5W53A.js} +10 -1
  225. package/dist/chunk-ONL54WMH.js +55 -0
  226. package/dist/{chunk-AKEZ3G5V.js → chunk-ONQKKHON.js} +1 -1
  227. package/dist/{chunk-LZHLSQYK.js → chunk-OOWPSBIS.js} +2 -2
  228. package/dist/{chunk-JQLTG4KH.js → chunk-ORT5IKHP.js} +62 -51
  229. package/dist/{chunk-4KWOKX2B.js → chunk-OSKJZNBT.js} +1 -1
  230. package/dist/{chunk-EHQTPVV4.js → chunk-PLTCDSTU.js} +1 -1
  231. package/dist/{chunk-5OM447RW.js → chunk-PZKHBB7D.js} +1 -1
  232. package/dist/{chunk-VEB5ERRE.js → chunk-QWNVSR6G.js} +2 -2
  233. package/dist/{chunk-IG75YMUN.js → chunk-RTPQDNW3.js} +1 -1
  234. package/dist/{chunk-SVSCLHHI.js → chunk-SZZRIHGT.js} +1 -1
  235. package/dist/{chunk-EBNI36UQ.js → chunk-T46NR3WP.js} +3 -3
  236. package/dist/{chunk-FPS3JIPQ.js → chunk-TC7DJTXI.js} +1 -1
  237. package/dist/{chunk-W5J7R5EB.js → chunk-TEUQWOWZ.js} +1 -1
  238. package/dist/chunk-THROPJZC.js +115 -0
  239. package/dist/{chunk-IDBHX5SR.js → chunk-TRQCHF2F.js} +1 -1
  240. package/dist/{chunk-M3LUNN7F.js → chunk-TYKQ33CL.js} +13 -2
  241. package/dist/{chunk-VVRL27HM.js → chunk-ULPL26BU.js} +2 -2
  242. package/dist/{chunk-6AH2XJ3Q.js → chunk-UNXLTJU7.js} +3 -3
  243. package/dist/{chunk-FC4YTTFJ.js → chunk-UQGFHNDI.js} +2 -3
  244. package/dist/{chunk-EBJREOKS.js → chunk-UXXJDIYE.js} +4 -4
  245. package/dist/{chunk-5LUI3WQP.js → chunk-V43UVX4H.js} +1 -1
  246. package/dist/{chunk-W4XYY73O.js → chunk-VHZ3AXJD.js} +1 -1
  247. package/dist/{chunk-HJEVSQN6.js → chunk-VL6CUNSX.js} +11 -5
  248. package/dist/{chunk-XDTYBF2F.js → chunk-W5XCNEZC.js} +39 -1
  249. package/dist/{chunk-LDJ3J4TQ.js → chunk-WGD2HX2A.js} +1 -1
  250. package/dist/{chunk-FQCLKD7U.js → chunk-WKEPORNM.js} +1 -1
  251. package/dist/{chunk-I3KKZ2O3.js → chunk-XEGZHHRH.js} +45 -36
  252. package/dist/{chunk-IKB6HFGK.js → chunk-XO7PUL4F.js} +6 -4
  253. package/dist/chunk-XV32RKQZ.js +142 -0
  254. package/dist/{chunk-TBMDMXEX.js → chunk-YA3AWELW.js} +1 -1
  255. package/dist/{chunk-HVIX5ECM.js → chunk-YEVG2X5R.js} +1 -1
  256. package/dist/chunk-YZFLH463.js +215 -0
  257. package/dist/{chunk-P4BOXB6E.js → chunk-Z6GFMI2Z.js} +6 -7
  258. package/dist/{chunk-YEKYVJQR.js → chunk-ZNBLFCQS.js} +2 -2
  259. package/dist/generated/index.d.ts +3 -0
  260. package/dist/generated/index.js +105 -103
  261. package/dist/index.js +105 -103
  262. package/dist/styles.css +1448 -211
  263. package/package.json +3 -3
  264. package/dist/AccessDeniedCard-WXM5DBDZ.css +0 -8
  265. package/dist/DocTabsEditor-RCOWHX5J.css +0 -78
  266. package/dist/PresenterView-T2C6ZZ3N.css +0 -103
  267. package/dist/SandboxedFrame-L6HBQZCD.css +0 -50
  268. package/dist/chunk-CRKFL423.js +0 -74
  269. package/dist/chunk-MBNFJSZS.js +0 -107
  270. package/dist/chunk-RV7SZAHR.js +0 -105
  271. package/dist/chunk-UZ7ZUSLH.js +0 -179
  272. package/dist/utils/useMediaMatch.d.ts +0 -12
  273. /package/dist/{chunk-TF2P3OPS.js → chunk-2JJIN6JN.js} +0 -0
@@ -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,6 +172,24 @@
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
  }
@@ -157,6 +210,13 @@
157
210
  transform: translateY(-50%);
158
211
  }
159
212
 
213
+ /* The active row's actions and the active cell's history are the reader's
214
+ tools while they are in the grid, not marks on a sheet nobody has entered. */
215
+ .crewlet-sheet-grid__grid:not(:focus-within) .crewlet-sheet-grid__row-actions--active-row,
216
+ .crewlet-sheet-grid__grid:not(:focus-within) .crewlet-sheet-grid__cell--history:not(:hover) > .crewlet-sheet-grid__history {
217
+ visibility: hidden;
218
+ }
219
+
160
220
  /* The bar at a row's leading edge while somebody has it selected. */
161
221
  .crewlet-sheet-grid__rownum--present::before {
162
222
  position: absolute;
@@ -192,10 +252,21 @@
192
252
  justify-content: center;
193
253
  }
194
254
 
195
- .crewlet-sheet-grid__cell--selected {
255
+ /* THE SELECTION IS TINTED WHILE THE READER IS IN THE GRID, or while it
256
+ spans more than one cell. A grid nobody has entered still holds its first
257
+ cell as the active one (the keys start there), and tinting it drew a stray
258
+ highlight on every sheet as it opened. */
259
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
196
260
  background: var(--color-brand-accent-soft);
197
261
  }
198
262
 
263
+ /* THE FROZEN EDGE once the grid is scrolled sideways: the columns that stay
264
+ (or the row numbers, where none do) end on the strong hairline, so the
265
+ values passing under them read as scrolled rather than cut. */
266
+ .crewlet-sheet-grid__scroller--across .crewlet-sheet-grid__frozen-edge {
267
+ border-inline-end-color: var(--color-border-strong);
268
+ }
269
+
199
270
  .crewlet-sheet-grid__cell:focus-visible,
200
271
  .crewlet-sheet-grid__header:focus-visible {
201
272
  outline: 2px solid var(--color-focus);
@@ -263,6 +334,31 @@
263
334
  white-space: normal;
264
335
  }
265
336
 
337
+ /* THE HISTORY CONTROL HAS ITS OWN ROOM while it shows, so a value ends, or
338
+ ellipsises, before it rather than running under it. It sits at the edge
339
+ the value does not start from: the trailing edge of a value drawn from the
340
+ leading one, the leading edge of a number or a rating (drawn on the
341
+ trailing one), so neither moves when its cell becomes active. A checkbox,
342
+ centred in a column wider than it, needs no room made. */
343
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--history,
344
+ .crewlet-sheet-grid__cell--history:hover {
345
+ padding-inline-end: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size));
346
+ }
347
+
348
+ .crewlet-sheet-grid__grid:focus-within :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history,
349
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating).crewlet-sheet-grid__cell--history:hover {
350
+ padding-inline: calc(var(--spacing-1) * 2 + var(--crewlet-sheet-history-size)) var(--spacing-2);
351
+ }
352
+
353
+ .crewlet-sheet-grid__grid:focus-within .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history,
354
+ .crewlet-sheet-grid__cell--checkbox.crewlet-sheet-grid__cell--history:hover {
355
+ padding-inline-end: var(--spacing-2);
356
+ }
357
+
358
+ :is(.crewlet-sheet-grid__cell--number, .crewlet-sheet-grid__cell--rating) > .crewlet-sheet-grid__history {
359
+ inset-inline: var(--spacing-1) auto;
360
+ }
361
+
266
362
  .crewlet-sheet-grid__history {
267
363
  position: absolute;
268
364
  top: 50%;
@@ -270,9 +366,11 @@
270
366
  display: inline-flex;
271
367
  align-items: center;
272
368
  justify-content: center;
273
- padding: var(--spacing-1);
369
+ width: var(--crewlet-sheet-history-size);
370
+ height: var(--crewlet-sheet-history-size);
371
+ padding: 0;
274
372
  border: 0;
275
- border-radius: var(--radius-sm);
373
+ border-radius: var(--radius-md);
276
374
  background: var(--color-surface-elevated);
277
375
  color: var(--color-text-secondary);
278
376
  transform: translateY(-50%);
@@ -280,6 +378,7 @@
280
378
  }
281
379
 
282
380
  .crewlet-sheet-grid__history:hover {
381
+ background: var(--color-surface-hover);
283
382
  color: var(--color-text-primary);
284
383
  }
285
384
 
@@ -654,7 +753,7 @@
654
753
  }
655
754
 
656
755
  @media (forced-colors: active) {
657
- .crewlet-sheet-grid__cell--selected {
756
+ .crewlet-sheet-grid__grid:is(:focus-within, .crewlet-sheet-grid__grid--range) .crewlet-sheet-grid__cell--selected {
658
757
  background: Highlight;
659
758
  color: HighlightText;
660
759
  }
@@ -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-J6ZSH3F5.js';
2
2
  import '../chunk-Z7JYG5TF.js';
3
3
  import '../chunk-AYKXMIOR.js';
@@ -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
+ }
@@ -0,0 +1,49 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface SlideNavLabels {
3
+ /** The group's name. */
4
+ nav: string;
5
+ previous: string;
6
+ next: string;
7
+ /** Why Previous is off on the first slide. */
8
+ start: string;
9
+ /** Why Next is off on the last slide. */
10
+ end: string;
11
+ position: (position: number, total: number) => string;
12
+ }
13
+ export declare const SLIDE_NAV_LABELS: SlideNavLabels;
14
+ /**
15
+ * Where the controls sit: `page` on the interface's own ground, `projection`
16
+ * floating over a slide shown full screen, on a scrim in its own light ink
17
+ * whatever the theme, since the letterbox under it is black in every theme.
18
+ */
19
+ export type SlideNavTone = 'page' | 'projection';
20
+ export interface SlideNavProps {
21
+ /** One-based. */
22
+ position: number;
23
+ total: number;
24
+ onPrevious: () => void;
25
+ onNext: () => void;
26
+ tone?: SlideNavTone | undefined;
27
+ /**
28
+ * Controls after Next, set apart by a rule: Full screen. IconButtons take
29
+ * the tone; give them `size="sm"`, the step Previous and Next are drawn at.
30
+ */
31
+ children?: ReactNode;
32
+ className?: string | undefined;
33
+ labels?: Partial<SlideNavLabels> | undefined;
34
+ }
35
+ /**
36
+ * Previous, where the show is, and Next: the one set of controls every way of
37
+ * presenting a deck moves by, in the page, full screen and at the lectern.
38
+ *
39
+ * A TOOLBAR'S STEP: Previous and Next are the small control step, as tall as
40
+ * the buttons a toolbar or a panel sets beside them (the presenter's Pause).
41
+ *
42
+ * STOPS AT THE ENDS, SAYING WHY. Previous on the first slide and Next on the
43
+ * last are off, with the reason on the control, rather than pressable and
44
+ * doing nothing. The position is tabular in a fixed width, so the controls
45
+ * either side of it do not move as the count changes. It is not a live region:
46
+ * the host announces each slide as it arrives, by its number and its title,
47
+ * and a second announcement of the number alone would repeat it.
48
+ */
49
+ export declare function SlideNav({ position, total, onPrevious, onNext, tone, children, className, labels, }: SlideNavProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './SlideNav.css';
2
+ export { SlideNav, SLIDE_NAV_LABELS } from './SlideNav.js';
3
+ export type { SlideNavLabels, SlideNavProps } from './SlideNav.js';
@@ -0,0 +1,4 @@
1
+ export { SLIDE_NAV_LABELS, SlideNav } from '../chunk-6VOS2GMB.js';
2
+ import '../chunk-4FQT6ZAY.js';
3
+ import '../chunk-BZFWDIV6.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,53 @@
1
+ /*
2
+ * SlideNav: Previous, the position and Next, and whatever follows them.
3
+ */
4
+
5
+ .crewlet-slide-nav {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--spacing-1);
9
+ }
10
+
11
+ .crewlet-slide-nav__position {
12
+ min-width: 5em;
13
+ color: var(--color-text-secondary);
14
+ font-size: var(--font-size-sm);
15
+ font-variant-numeric: tabular-nums;
16
+ text-align: center;
17
+ white-space: nowrap;
18
+ }
19
+
20
+ .crewlet-slide-nav__more {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ gap: var(--spacing-1);
24
+ margin-left: var(--spacing-2);
25
+ padding-left: var(--spacing-3);
26
+ border-left: 1px solid var(--color-border-default);
27
+ }
28
+
29
+ /* OVER A PROJECTED SLIDE: a pill in the projection's own fixed colours, so it
30
+ reads over black bars and over a slide of any colour, in every theme. */
31
+ .crewlet-slide-nav--projection {
32
+ padding: var(--spacing-1) var(--spacing-2);
33
+ border-radius: var(--radius-pill);
34
+ background: var(--color-projection-ground);
35
+ color: var(--color-projection-ink);
36
+ }
37
+
38
+ .crewlet-slide-nav--projection .crewlet-slide-nav__position {
39
+ color: inherit;
40
+ }
41
+
42
+ .crewlet-slide-nav--projection .crewlet-slide-nav__more {
43
+ border-left-color: var(--color-projection-rule);
44
+ }
45
+
46
+ .crewlet-slide-nav--projection .crewlet-icon-btn--ghost {
47
+ color: inherit;
48
+ }
49
+
50
+ .crewlet-slide-nav--projection .crewlet-icon-btn--ghost:hover:not(:disabled):not([aria-disabled='true']) {
51
+ background: var(--color-projection-hover);
52
+ color: inherit;
53
+ }
@@ -33,6 +33,14 @@ export interface SlideStageProps {
33
33
  * "artboard" for a design's board shown at its own layout.
34
34
  */
35
35
  roleDescription?: string | undefined;
36
+ /**
37
+ * The slide's own edge, a hairline on a small radius, so a slide whose
38
+ * ground is the page's own colour still reads as a slide: a thumbnail, a
39
+ * card, the editor's stage, a show in the page. Not for `fit="contain"`,
40
+ * whose box is letterboxed by design, nor in full screen, where the screen's
41
+ * own edge is the slide's.
42
+ */
43
+ framed?: boolean | undefined;
36
44
  className?: string | undefined;
37
45
  }
38
46
  /**
@@ -60,4 +68,4 @@ export interface SlideStageProps {
60
68
  * A GROUP NAMED AS A SLIDE, so a screen reader announces "slide" with its
61
69
  * name and reads its text in source order, which is the slide's reading order.
62
70
  */
63
- export declare function SlideStage({ children, label, fit, scale, width, height, roleDescription, className, }: SlideStageProps): import("react").JSX.Element;
71
+ export declare function SlideStage({ children, label, fit, scale, width, height, roleDescription, framed, className, }: SlideStageProps): import("react").JSX.Element;