@crewlethq/ui 0.54.1 → 0.56.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 (320) hide show
  1. package/README.md +90 -7
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/AgentHandoffPanel/index.js +13 -8
  4. package/dist/AppShell/AppShell.d.ts +74 -1
  5. package/dist/AppShell/ResizeHandle.d.ts +74 -0
  6. package/dist/AppShell/index.d.ts +7 -2
  7. package/dist/AppShell/index.js +6 -4
  8. package/dist/AppShell/regions.d.ts +34 -0
  9. package/dist/AppShell/storedWidth.d.ts +47 -0
  10. package/dist/{AppShell-5LPXYUV3.css → AppShell-ZVCJRGXH.css} +172 -1
  11. package/dist/ArrangeFrame/index.js +2 -2
  12. package/dist/ArrangeList/index.js +4 -4
  13. package/dist/ArtifactBar/ArtifactBar.d.ts +13 -2
  14. package/dist/ArtifactBar/index.js +7 -6
  15. package/dist/{ArtifactBar-UMZCTARR.css → ArtifactBar-LEBMR35Y.css} +19 -1
  16. package/dist/ArtifactCard/index.js +5 -5
  17. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +7 -1
  18. package/dist/ArtifactNameCell/index.js +1 -1
  19. package/dist/ArtifactPanel/ArtifactPanel.d.ts +11 -17
  20. package/dist/ArtifactPanel/index.d.ts +3 -0
  21. package/dist/ArtifactPanel/index.js +8 -2
  22. package/dist/ArtifactPanel-TN4FFK2F.css +43 -0
  23. package/dist/AvatarPicker/index.js +8 -7
  24. package/dist/Breadcrumb/index.js +1 -1
  25. package/dist/Button/index.js +2 -1
  26. package/dist/{Button-UWKBTKYD.css → Button-VXJ7M5XF.css} +9 -32
  27. package/dist/Canvas/index.js +4 -3
  28. package/dist/CanvasBoard/index.js +6 -5
  29. package/dist/CanvasToolbar/index.js +5 -4
  30. package/dist/ChangeList/ChangeList.d.ts +114 -0
  31. package/dist/ChangeList/index.d.ts +3 -0
  32. package/dist/ChangeList/index.js +10 -0
  33. package/dist/ChangeList-CB2DLR5S.css +151 -0
  34. package/dist/ChatThread/ChatThread.d.ts +53 -0
  35. package/dist/ChatThread/index.d.ts +3 -0
  36. package/dist/ChatThread/index.js +6 -0
  37. package/dist/ChatThread-52KMDXHB.css +58 -0
  38. package/dist/Checkbox/index.js +3 -3
  39. package/dist/CodeBlock/index.js +5 -4
  40. package/dist/ColorField/index.js +3 -3
  41. package/dist/ColorSwatch/index.js +5 -4
  42. package/dist/Combobox/index.js +3 -3
  43. package/dist/CommandPalette/index.js +6 -5
  44. package/dist/CommentThread/index.js +8 -6
  45. package/dist/Composer/Composer.d.ts +39 -2
  46. package/dist/Composer/index.js +4 -3
  47. package/dist/Composer-JSGTOW3F.css +192 -0
  48. package/dist/ConfirmField/index.js +3 -3
  49. package/dist/ConflictNote/index.js +3 -2
  50. package/dist/ContrastHelp/index.js +2 -2
  51. package/dist/Copyable/index.js +4 -3
  52. package/dist/DataGrid/driving.d.ts +48 -0
  53. package/dist/DataGrid/index.d.ts +2 -0
  54. package/dist/DataGrid/index.js +6 -5
  55. package/dist/DataTable/index.js +8 -7
  56. package/dist/DataView/index.js +12 -11
  57. package/dist/DatasetSource/index.js +2 -2
  58. package/dist/DateTimePicker/index.js +4 -3
  59. package/dist/DiffList/DiffList.d.ts +12 -3
  60. package/dist/DiffList/index.d.ts +1 -1
  61. package/dist/DiffList/index.js +1 -1
  62. package/dist/{DiffList-3EX64AAE.css → DiffList-GE6YBRLJ.css} +53 -0
  63. package/dist/Disclosure/anatomy.d.ts +14 -1
  64. package/dist/Disclosure/index.js +2 -2
  65. package/dist/{Disclosure-P4FH3C35.css → Disclosure-FVMA4RW2.css} +36 -0
  66. package/dist/DocTabsEditor/index.js +6 -5
  67. package/dist/DownloadButton/DownloadButton.d.ts +21 -4
  68. package/dist/DownloadButton/index.d.ts +1 -1
  69. package/dist/DownloadButton/index.js +4 -3
  70. package/dist/EditingStatus/index.js +2 -2
  71. package/dist/{Editor-FEKMRFBK.js → Editor-X2J47LPD.js} +5 -4
  72. package/dist/EntityList/EntityList.d.ts +37 -0
  73. package/dist/EntityList/index.d.ts +3 -0
  74. package/dist/EntityList/index.js +10 -0
  75. package/dist/EntityList-XIICECVC.css +55 -0
  76. package/dist/ErrorBoundary/index.js +3 -2
  77. package/dist/FileDrop/index.js +3 -2
  78. package/dist/FollowBanner/index.js +3 -2
  79. package/dist/HuePicker/index.js +7 -6
  80. package/dist/IconButton/IconButton.d.ts +6 -1
  81. package/dist/IconButton/index.js +1 -1
  82. package/dist/{IconButton-K24JQHLF.css → IconButton-6WA7UEBJ.css} +44 -21
  83. package/dist/IconTile/IconTile.d.ts +8 -2
  84. package/dist/IconTile/index.js +1 -1
  85. package/dist/{IconTile-4GNWTLAW.css → IconTile-G52XZVR4.css} +3 -0
  86. package/dist/InlineEditor/index.js +5 -4
  87. package/dist/Input/index.js +2 -2
  88. package/dist/LinkInterstitial/index.js +5 -4
  89. package/dist/ListInput/index.js +5 -4
  90. package/dist/LogoSlot/index.js +4 -3
  91. package/dist/Markdown/grammar.d.ts +1 -1
  92. package/dist/MarkdownEditor/index.js +7 -6
  93. package/dist/Menu/index.js +4 -3
  94. package/dist/MergeConflicts/index.js +7 -6
  95. package/dist/MessageBubble/MessageBubble.d.ts +34 -0
  96. package/dist/MessageBubble/index.d.ts +3 -0
  97. package/dist/MessageBubble/index.js +2 -0
  98. package/dist/MessageBubble-GKO6X3QG.css +71 -0
  99. package/dist/Modal/index.js +4 -3
  100. package/dist/OpenInAppCard/OpenInAppCard.d.ts +44 -0
  101. package/dist/OpenInAppCard/index.d.ts +3 -0
  102. package/dist/OpenInAppCard/index.js +15 -0
  103. package/dist/OpenInAppCard-CKHCK7DO.css +24 -0
  104. package/dist/OrgTable/index.js +3 -3
  105. package/dist/PeekRail/PeekHost.d.ts +90 -0
  106. package/dist/PeekRail/PeekRail.d.ts +83 -0
  107. package/dist/PeekRail/activation.d.ts +30 -0
  108. package/dist/PeekRail/index.d.ts +8 -0
  109. package/dist/PeekRail/index.js +8 -0
  110. package/dist/PeekRail-4L5YUQMW.css +95 -0
  111. package/dist/PeopleRail/index.js +4 -3
  112. package/dist/PinTile/index.js +2 -2
  113. package/dist/PresenterView/index.js +5 -4
  114. package/dist/PrincipalPicker/index.js +4 -4
  115. package/dist/ProposalCard/ProposalCard.d.ts +134 -0
  116. package/dist/ProposalCard/index.d.ts +3 -0
  117. package/dist/ProposalCard/index.js +17 -0
  118. package/dist/ProposalCard-HLB3FNLA.css +19 -0
  119. package/dist/ReceiptStrip/ReceiptStrip.d.ts +66 -0
  120. package/dist/ReceiptStrip/index.d.ts +3 -0
  121. package/dist/ReceiptStrip/index.js +5 -0
  122. package/dist/ReceiptStrip-IIRKRTBG.css +93 -0
  123. package/dist/RefusalCard/RefusalCard.d.ts +34 -0
  124. package/dist/RefusalCard/index.d.ts +3 -0
  125. package/dist/RefusalCard/index.js +10 -0
  126. package/dist/RefusalCard-UM67F5HB.css +8 -0
  127. package/dist/RelativeTime/clock.d.ts +0 -6
  128. package/dist/RelativeTime/index.js +1 -1
  129. package/dist/ResizeHandle-2UNSZ4ZQ.css +59 -0
  130. package/dist/ResultTableCard/ResultTableCard.d.ts +64 -0
  131. package/dist/ResultTableCard/index.d.ts +3 -0
  132. package/dist/ResultTableCard/index.js +16 -0
  133. package/dist/ResultTableCard-HZRUDNTX.css +40 -0
  134. package/dist/ReviewList/index.js +2 -2
  135. package/dist/RichEditor/codec.d.ts +1 -1
  136. package/dist/RichEditor/index.js +3 -2
  137. package/dist/RichEditor/roundtrip.d.ts +1 -1
  138. package/dist/RunChip/RunChip.d.ts +53 -0
  139. package/dist/RunChip/index.d.ts +3 -0
  140. package/dist/RunChip/index.js +10 -0
  141. package/dist/RunChip-I2S4VZ3R.css +43 -0
  142. package/dist/SandboxedFrame/index.js +3 -2
  143. package/dist/SegmentedControl/index.js +6 -5
  144. package/dist/SelectionBar/index.js +3 -2
  145. package/dist/SendButton/SendButton.d.ts +38 -0
  146. package/dist/SendButton/index.d.ts +2 -0
  147. package/dist/SendButton/index.js +4 -0
  148. package/dist/SetupWizard/index.js +5 -4
  149. package/dist/ShareDialog/index.js +7 -6
  150. package/dist/SheetColumnEditor/index.js +10 -9
  151. package/dist/SheetGrid/index.js +6 -5
  152. package/dist/SidePanel/SidePanel.d.ts +137 -0
  153. package/dist/SidePanel/SidePanelBase.d.ts +59 -0
  154. package/dist/SidePanel/index.d.ts +5 -0
  155. package/dist/SidePanel/index.js +11 -0
  156. package/dist/SidePanel-ERBUIELD.css +235 -0
  157. package/dist/SlideCompare/index.js +3 -2
  158. package/dist/SlideFilmstrip/index.js +5 -4
  159. package/dist/SlideNav/index.js +2 -2
  160. package/dist/Spinner/Spinner.d.ts +35 -0
  161. package/dist/Spinner/index.d.ts +3 -0
  162. package/dist/Spinner/index.js +2 -0
  163. package/dist/Spinner-XZ2TVYE5.css +46 -0
  164. package/dist/StatusCard/StatusCard.d.ts +59 -0
  165. package/dist/StatusCard/index.d.ts +3 -0
  166. package/dist/StatusCard/index.js +9 -0
  167. package/dist/StatusCard-6RPEE6UU.css +62 -0
  168. package/dist/StepList-A4YVU4JI.css +119 -0
  169. package/dist/Stepper/StepList.d.ts +72 -0
  170. package/dist/Stepper/index.d.ts +3 -0
  171. package/dist/Stepper/index.js +2 -1
  172. package/dist/SuggestionRow/SuggestionRow.d.ts +45 -0
  173. package/dist/SuggestionRow/index.d.ts +3 -0
  174. package/dist/SuggestionRow/index.js +3 -0
  175. package/dist/SuggestionRow-OKBGNHSS.css +102 -0
  176. package/dist/Switcher/index.js +6 -5
  177. package/dist/Table/Table.d.ts +23 -2
  178. package/dist/Table/index.d.ts +1 -1
  179. package/dist/Table/index.js +1 -1
  180. package/dist/{Table-TGCS4C3F.css → Table-RUYMMWXT.css} +49 -0
  181. package/dist/TableCells/index.js +2 -2
  182. package/dist/Tabs/index.js +5 -4
  183. package/dist/TagsInput/index.js +3 -3
  184. package/dist/ThemeGallery/index.js +2 -2
  185. package/dist/ThemeSwitcher/index.js +7 -6
  186. package/dist/ThemeToggle/index.js +2 -2
  187. package/dist/TimeRangePicker/TimeRangePicker.d.ts +121 -0
  188. package/dist/TimeRangePicker/index.d.ts +2 -0
  189. package/dist/TimeRangePicker/index.js +23 -0
  190. package/dist/TimeWindowPicker/index.js +5 -4
  191. package/dist/Toaster/Toaster.d.ts +27 -3
  192. package/dist/Toaster/index.d.ts +2 -2
  193. package/dist/Toaster/index.js +1 -1
  194. package/dist/{Toaster-C6BQ7L6I.css → Toaster-MX7TBMC3.css} +32 -11
  195. package/dist/TreeCanvas/index.js +5 -4
  196. package/dist/TreeGrid/index.js +2 -2
  197. package/dist/VersionCompare/index.js +7 -6
  198. package/dist/VersionTimeline/index.js +4 -3
  199. package/dist/WidgetFrame/index.js +2 -2
  200. package/dist/{chunk-SS4XCUUJ.js → chunk-272Y3YMV.js} +3 -3
  201. package/dist/{chunk-LACA4JGC.js → chunk-2BQYODY3.js} +1 -1
  202. package/dist/{chunk-XS2FJVMT.js → chunk-2TTFDRR3.js} +2 -2
  203. package/dist/{chunk-4BJK7FE5.js → chunk-3EYSYEXP.js} +1 -1
  204. package/dist/chunk-3LI4TRUR.js +22 -0
  205. package/dist/{chunk-5WYPSVRX.js → chunk-3NQS6KYG.js} +1 -1
  206. package/dist/{chunk-V2N3BMOT.js → chunk-45KMH3E3.js} +11 -4
  207. package/dist/{chunk-2GIWL7IS.js → chunk-4CBGIRVU.js} +1 -1
  208. package/dist/{chunk-3QSKDZR5.js → chunk-4OINEWR4.js} +1 -1
  209. package/dist/{chunk-EZ43L6T7.js → chunk-56P72ZBE.js} +4 -4
  210. package/dist/{chunk-J24Q4HTD.js → chunk-5NT6OIPP.js} +13 -3
  211. package/dist/{chunk-FNPZ3LLQ.js → chunk-5OMV75GE.js} +3 -3
  212. package/dist/{chunk-6RMZH7P7.js → chunk-672GLRBU.js} +2 -2
  213. package/dist/{chunk-GPZXBJFU.js → chunk-67F2AM4R.js} +2 -2
  214. package/dist/{chunk-NQCY44B3.js → chunk-67MW366X.js} +2 -2
  215. package/dist/{chunk-SSHDQBHR.js → chunk-6KLK7E76.js} +2 -2
  216. package/dist/{chunk-ZFM5L7M4.js → chunk-6NJW5KSX.js} +2 -2
  217. package/dist/{chunk-A4GFEMVI.js → chunk-6T6V5565.js} +1 -1
  218. package/dist/{chunk-THDGBD6Y.js → chunk-AKFHMLEX.js} +1 -1
  219. package/dist/{chunk-6FVGSWLS.js → chunk-AWSFK2IK.js} +1 -1
  220. package/dist/{chunk-HQJ24WPM.js → chunk-AZ5BKSGV.js} +1 -1
  221. package/dist/chunk-BLPT6GHV.js +31 -0
  222. package/dist/chunk-C3FX7ZSU.js +30 -0
  223. package/dist/{chunk-LDGQIDIZ.js → chunk-CGT4R7LW.js} +64 -2
  224. package/dist/{chunk-WXWMHYKW.js → chunk-D5OSP3KI.js} +2 -2
  225. package/dist/{chunk-CQEYF3UW.js → chunk-DOPPU6TZ.js} +3 -3
  226. package/dist/{chunk-AC22RZKC.js → chunk-DRT4L4WC.js} +17 -5
  227. package/dist/chunk-E4DZOE55.js +162 -0
  228. package/dist/chunk-EA23JG6R.js +9 -0
  229. package/dist/{chunk-J53T2QAH.js → chunk-EBG3V4MK.js} +6 -6
  230. package/dist/{chunk-7PE56HHD.js → chunk-EDNZHW4K.js} +57 -7
  231. package/dist/{chunk-E6HXFFWO.js → chunk-EGL24VY5.js} +2 -2
  232. package/dist/{chunk-7SHAFLEX.js → chunk-ES4HR34Y.js} +2 -2
  233. package/dist/chunk-EVWTLFKI.js +102 -0
  234. package/dist/chunk-FA44M2YT.js +25 -0
  235. package/dist/{chunk-VWYT3GVV.js → chunk-FLTMDSC3.js} +1 -1
  236. package/dist/{chunk-LJHH4WWB.js → chunk-FXQLNETQ.js} +1 -1
  237. package/dist/{chunk-3NXWH5NC.js → chunk-GCASX3FD.js} +4 -4
  238. package/dist/{chunk-OGXHZHRX.js → chunk-GG4QZWMQ.js} +2 -2
  239. package/dist/{chunk-XP7EXNKF.js → chunk-GPW4M4OI.js} +2 -2
  240. package/dist/chunk-GZMEWWXW.js +78 -0
  241. package/dist/{chunk-OG6CL3EB.js → chunk-HD4QJ2SI.js} +3 -2
  242. package/dist/{chunk-SYY26XBX.js → chunk-HGCDJOEF.js} +2 -2
  243. package/dist/chunk-HGYHWWA5.js +54 -0
  244. package/dist/{chunk-GRKGLZFM.js → chunk-HL4CPLEK.js} +7 -7
  245. package/dist/{chunk-BEHFTRMZ.js → chunk-HNK43Z3P.js} +23 -5
  246. package/dist/{chunk-UO7JZVCO.js → chunk-HVEDVKXL.js} +1 -1
  247. package/dist/{chunk-ILFEWRLG.js → chunk-I7VG6RQE.js} +1 -1
  248. package/dist/{chunk-3RCHEFIL.js → chunk-ICJRP6QW.js} +2 -2
  249. package/dist/{chunk-CUL5XV6O.js → chunk-IDQBSMMZ.js} +2 -2
  250. package/dist/chunk-JILNCBBS.js +27 -0
  251. package/dist/{chunk-5O72FSOK.js → chunk-JJ3NOBJ6.js} +5 -5
  252. package/dist/chunk-JLRXCKTS.js +97 -0
  253. package/dist/{chunk-OJCVVCAZ.js → chunk-JMMS2PQU.js} +1 -1
  254. package/dist/{chunk-SXBJMBSV.js → chunk-JS2TRHBF.js} +2 -2
  255. package/dist/{chunk-3CZ7XAVY.js → chunk-KS7YIJ4S.js} +10 -6
  256. package/dist/{chunk-VWNC2L6W.js → chunk-KW6KCVM7.js} +1 -1
  257. package/dist/{chunk-X4NIE7CI.js → chunk-LQ6AGUDL.js} +2 -2
  258. package/dist/chunk-LXYSWQNE.js +214 -0
  259. package/dist/{chunk-6VQA2LZC.js → chunk-MYX4XABB.js} +3 -3
  260. package/dist/{chunk-PM3JVNRY.js → chunk-N3ISZVLK.js} +1 -1
  261. package/dist/chunk-NEHSV55H.js +119 -0
  262. package/dist/{chunk-RQI43UJ7.js → chunk-NHJQXDHA.js} +1 -1
  263. package/dist/{chunk-VVOPDWLX.js → chunk-NI7WUPH3.js} +2 -2
  264. package/dist/{chunk-OCRVY42T.js → chunk-NK3D66PB.js} +1 -1
  265. package/dist/{chunk-RHPBTE3F.js → chunk-NQGZRMUG.js} +1 -1
  266. package/dist/chunk-NVZCANJ5.js +3 -0
  267. package/dist/{chunk-RRO7UEYU.js → chunk-OHBXOEP3.js} +1 -1
  268. package/dist/{chunk-RFPCHMSX.js → chunk-OHG7762N.js} +1 -1
  269. package/dist/{chunk-OBUQVGEG.js → chunk-OJ2QULVH.js} +1 -1
  270. package/dist/{chunk-PGYIDNGG.js → chunk-OOZ5AGPS.js} +4 -4
  271. package/dist/{chunk-34RMTXDZ.js → chunk-OYAXKHVW.js} +1 -1
  272. package/dist/{chunk-WQQ5T5SA.js → chunk-OZIBNFLO.js} +1 -1
  273. package/dist/{chunk-DFK5EQTU.js → chunk-PDTEPN4D.js} +1 -1
  274. package/dist/chunk-PIYJNCN7.js +124 -0
  275. package/dist/{chunk-VP2ODUCC.js → chunk-Q6R6EUQ4.js} +3 -3
  276. package/dist/chunk-QYEOGGVS.js +161 -0
  277. package/dist/{chunk-YCC2S7DF.js → chunk-QZ4B72FP.js} +2 -2
  278. package/dist/chunk-RV2FGESF.js +98 -0
  279. package/dist/{chunk-SEPSXOGJ.js → chunk-S5C64PTT.js} +1 -1
  280. package/dist/chunk-SDSBVVLL.js +45 -0
  281. package/dist/{chunk-ZNOXQACX.js → chunk-T4D7RZNI.js} +2 -2
  282. package/dist/{chunk-G5SUSCWL.js → chunk-TA72CURM.js} +1 -1
  283. package/dist/{chunk-WXOYHVWG.js → chunk-TD3UHDFY.js} +4 -4
  284. package/dist/{chunk-VN47PYUF.js → chunk-TDQZ4LB5.js} +8 -6
  285. package/dist/chunk-TFGCNBWP.js +64 -0
  286. package/dist/{chunk-TMM32U7D.js → chunk-TKS7FTTO.js} +2 -2
  287. package/dist/{chunk-C6Z3MLSA.js → chunk-U5PJSGHG.js} +1 -1
  288. package/dist/{chunk-7CGPPAYR.js → chunk-UV4LOQ3E.js} +1 -1
  289. package/dist/{chunk-34ANLQW2.js → chunk-UVYGMCJ4.js} +173 -8
  290. package/dist/{chunk-ON2E46DX.js → chunk-VRNUKH2W.js} +1 -1
  291. package/dist/{chunk-XX2VQE55.js → chunk-WBRC3MNE.js} +1 -1
  292. package/dist/chunk-WDIVALLP.js +51 -0
  293. package/dist/{chunk-SQ4JFHO7.js → chunk-WOW5SCEK.js} +1 -1
  294. package/dist/chunk-XODESBSR.js +250 -0
  295. package/dist/chunk-XQI2OUV4.js +59 -0
  296. package/dist/{chunk-EJWPYEG4.js → chunk-XRZGGB6I.js} +1 -1
  297. package/dist/{chunk-34C7NYIQ.js → chunk-Y73BQL74.js} +1 -1
  298. package/dist/{chunk-KIRQZG3G.js → chunk-YCGZK2E4.js} +1 -1
  299. package/dist/{chunk-CAVWDJF4.js → chunk-YCZ2FBKA.js} +1 -1
  300. package/dist/{chunk-D7Q5MQRF.js → chunk-YEURM24I.js} +2 -2
  301. package/dist/{chunk-IW55G7XG.js → chunk-YNRKVY7X.js} +11 -1
  302. package/dist/chunk-YY445YFQ.js +55 -0
  303. package/dist/{chunk-LFHCXZO5.js → chunk-Z3GDMNMU.js} +3 -3
  304. package/dist/{chunk-NMR7AJSB.js → chunk-Z7PJF6F3.js} +2 -2
  305. package/dist/{chunk-U3LNU4B2.js → chunk-ZH4MJM73.js} +1 -1
  306. package/dist/generated/index.d.ts +17 -0
  307. package/dist/generated/index.js +138 -119
  308. package/dist/index.js +138 -119
  309. package/dist/styles.css +1877 -218
  310. package/dist/utils/index.js +1 -1
  311. package/dist/utils/useDownload.d.ts +6 -0
  312. package/package.json +3 -3
  313. package/dist/ArtifactPanel-KKUUIPEU.css +0 -159
  314. package/dist/Composer-TXULCPPV.css +0 -99
  315. package/dist/chunk-FZVJDJFN.js +0 -54
  316. package/dist/chunk-IXJHTFXG.js +0 -17
  317. package/dist/chunk-NBDN5JZV.js +0 -123
  318. package/dist/chunk-UJ4VVK7R.js +0 -48
  319. package/dist/{chunk-UTESMBPL.js → chunk-ESUZ27TS.js} +1 -1
  320. /package/dist/{chunk-55MPFB2U.js → chunk-EWTPXRRM.js} +0 -0
@@ -1,12 +1,14 @@
1
1
  import { useMediaMatch } from './chunk-RTPQDNW3.js';
2
- import { Menu } from './chunk-TMM32U7D.js';
2
+ import { Menu } from './chunk-TKS7FTTO.js';
3
+ import { PeekContext, AsideContext, ResizeHandle, clampSize } from './chunk-PIYJNCN7.js';
3
4
  import { HIT_AREA_CLASS } from './chunk-2YTOOH3A.js';
4
5
  import { useModalLayer, focusables } from './chunk-H5XTJ7GJ.js';
5
- import { IconButton } from './chunk-LACA4JGC.js';
6
+ import { IconButton } from './chunk-2BQYODY3.js';
6
7
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
7
8
  import { cx } from './chunk-ODEQTPFM.js';
8
9
  import './HitArea-QUOS6ZDJ.css';
9
- import './AppShell-5LPXYUV3.css';
10
+ import './AppShell-ZVCJRGXH.css';
11
+ import './ResizeHandle-2UNSZ4ZQ.css';
10
12
  import { createContext, forwardRef, useContext, useId, useState, useRef, useCallback, useEffect, useLayoutEffect } from 'react';
11
13
  import { breakpoint } from '@crewlethq/tokens';
12
14
  import { ChevronUpGlyph, ChevronsUpDownGlyph, ChevronRightGlyph, MenuGlyph } from '@crewlethq/icons/glyphs';
@@ -76,6 +78,7 @@ function AccountRow({
76
78
  actions ? /* @__PURE__ */ jsx("div", { className: "crewlet-account-row__actions", children: actions }) : null
77
79
  ] });
78
80
  }
81
+ var APP_SHELL_ASIDE_WIDTH = 420;
79
82
  var NARROW = `(width < ${breakpoint.shell})`;
80
83
  var AppShellContext = createContext(null);
81
84
  function useAppShell() {
@@ -94,11 +97,22 @@ function AppShell({
94
97
  navigationKey,
95
98
  toggleLabel = "Sections",
96
99
  skipLabel = "Skip to content",
100
+ aside,
101
+ asideWidth = APP_SHELL_ASIDE_WIDTH,
102
+ asideReserve,
103
+ asideLabel,
104
+ asideShape = "column",
105
+ onAsideClose,
106
+ asideResize,
107
+ peek,
108
+ peekShape = "column",
97
109
  className,
98
110
  style,
99
111
  children,
100
112
  ...rest
101
113
  }) {
114
+ const hasAside = aside !== void 0 && aside !== null && aside !== false;
115
+ const hasPeek = peek !== void 0 && peek !== null && peek !== false;
102
116
  const generatedId = useId();
103
117
  const railId = `${generatedId}-rail`;
104
118
  const main = mainId ?? `${generatedId}-main`;
@@ -132,6 +146,25 @@ function AppShell({
132
146
  observer.observe(scroller);
133
147
  return () => observer.disconnect();
134
148
  }, [scroller]);
149
+ const root = useRef(null);
150
+ const sheet = useRef(null);
151
+ const asideColumn = hasAside && asideShape === "column";
152
+ const [occupied, setOccupied] = useState(null);
153
+ useLayoutEffect(() => {
154
+ const frame = root.current;
155
+ const page = sheet.current;
156
+ if (!asideColumn || !frame || !page) {
157
+ setOccupied(null);
158
+ return void 0;
159
+ }
160
+ const measure = () => setOccupied(Math.max(0, Math.round(frame.getBoundingClientRect().right - page.getBoundingClientRect().right)));
161
+ measure();
162
+ if (typeof ResizeObserver === "undefined") return void 0;
163
+ const observer = new ResizeObserver(measure);
164
+ observer.observe(page);
165
+ observer.observe(frame);
166
+ return () => observer.disconnect();
167
+ }, [asideColumn]);
135
168
  const shell = {
136
169
  narrow,
137
170
  drawerOpen,
@@ -147,6 +180,7 @@ function AppShell({
147
180
  "div",
148
181
  {
149
182
  ...rest,
183
+ ref: root,
150
184
  className: cx(
151
185
  "crewlet-app-shell",
152
186
  fill && "crewlet-app-shell--fill",
@@ -155,10 +189,21 @@ function AppShell({
155
189
  !shell.hasRail && "crewlet-app-shell--no-rail",
156
190
  className
157
191
  ),
192
+ "data-aside": hasAside ? asideShape : void 0,
193
+ "data-peek": hasPeek ? peekShape : void 0,
158
194
  style: {
159
195
  ...style,
160
196
  ["--crewlet-app-shell-gutter"]: `${gutter}px`,
161
- ...drawerZ === null ? null : { ["--crewlet-app-shell-drawer-z"]: String(drawerZ) }
197
+ ...drawerZ === null ? null : { ["--crewlet-app-shell-drawer-z"]: String(drawerZ) },
198
+ // The aside's width is published on the ROOT, because two things
199
+ // read it from opposite sides: the grid track that sizes the column
200
+ // is declared here, and the overlay that sizes itself is a
201
+ // descendant. A custom property inherits downward only.
202
+ ...hasAside ? {
203
+ ["--crewlet-app-shell-aside"]: `${asideWidth}px`,
204
+ ...asideReserve === void 0 ? null : { ["--crewlet-app-shell-aside-reserve"]: `${asideReserve}px` }
205
+ } : null,
206
+ ...occupied === null ? null : { ["--crewlet-app-shell-aside-occupied"]: `${occupied}px` }
162
207
  },
163
208
  children: [
164
209
  /* @__PURE__ */ jsx(
@@ -187,16 +232,99 @@ function AppShell({
187
232
  children: sidebar
188
233
  }
189
234
  ) : null,
190
- /* @__PURE__ */ jsxs("div", { className: "crewlet-app-shell__sheet", children: [
235
+ /* @__PURE__ */ jsxs("div", { ref: sheet, className: "crewlet-app-shell__sheet", children: [
191
236
  topbar,
192
237
  banner ? /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__banner", children: banner }) : null,
193
- /* @__PURE__ */ jsx("main", { id: main, ref: setMain, className: "crewlet-app-shell__main", tabIndex: -1, children: /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__content", children }) }),
238
+ /* @__PURE__ */ jsxs("div", { className: "crewlet-app-shell__body", children: [
239
+ /* @__PURE__ */ jsx("main", { id: main, ref: setMain, className: "crewlet-app-shell__main", tabIndex: -1, children: /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__content", children }) }),
240
+ hasPeek ? /* @__PURE__ */ jsx(PeekContext.Provider, { value: { shape: peekShape }, children: peek }) : null
241
+ ] }),
194
242
  footer
195
- ] })
243
+ ] }),
244
+ hasAside ? /* @__PURE__ */ jsx(
245
+ ShellAside,
246
+ {
247
+ shape: asideShape,
248
+ label: asideLabel,
249
+ width: asideWidth,
250
+ resize: asideResize,
251
+ onClose: onAsideClose,
252
+ children: aside
253
+ }
254
+ ) : null
196
255
  ]
197
256
  }
198
257
  ) });
199
258
  }
259
+ function ShellAside({ shape, label, width, resize, onClose, children }) {
260
+ const region = useRef(null);
261
+ const surfaceId = useId();
262
+ const modal = shape !== "column";
263
+ const [z, setZ] = useState(null);
264
+ return /* @__PURE__ */ jsxs(AsideContext.Provider, { value: { shape }, children: [
265
+ /* @__PURE__ */ jsxs(
266
+ "div",
267
+ {
268
+ ref: region,
269
+ className: "crewlet-app-shell__aside",
270
+ "data-shape": shape,
271
+ role: modal ? "dialog" : "complementary",
272
+ "aria-modal": modal || void 0,
273
+ "aria-label": label,
274
+ tabIndex: modal ? -1 : void 0,
275
+ style: modal && z !== null ? { zIndex: z + 1 } : void 0,
276
+ children: [
277
+ !modal && resize ? /* @__PURE__ */ jsx(
278
+ ResizeHandle,
279
+ {
280
+ label: resize.label,
281
+ value: width,
282
+ min: resize.min,
283
+ max: resize.max,
284
+ defaultValue: resize.defaultValue,
285
+ onValueChange: resize.onChange,
286
+ onValueCommit: resize.onCommit,
287
+ controls: surfaceId,
288
+ edge: "left"
289
+ }
290
+ ) : null,
291
+ /* @__PURE__ */ jsx("div", { id: surfaceId, className: "crewlet-app-shell__aside-sheet", children })
292
+ ]
293
+ }
294
+ ),
295
+ modal ? /* @__PURE__ */ jsx(AsideVeil, { region, onClose, onZIndex: setZ }) : null
296
+ ] });
297
+ }
298
+ function AsideVeil({
299
+ region,
300
+ onClose,
301
+ onZIndex
302
+ }) {
303
+ const layer = useModalLayer({
304
+ onClose: () => onClose?.(),
305
+ // A modal that nothing can close keeps Escape and its veil from doing
306
+ // anything rather than pretending to: the host gave no way to close it.
307
+ dismissable: onClose !== void 0
308
+ });
309
+ const { panelRef, zIndex } = layer;
310
+ useEffect(() => {
311
+ onZIndex(zIndex);
312
+ return () => onZIndex(null);
313
+ }, [onZIndex, zIndex]);
314
+ useLayoutEffect(() => {
315
+ panelRef(region.current);
316
+ return () => panelRef(null);
317
+ }, [panelRef, region]);
318
+ return /* @__PURE__ */ jsx(
319
+ "div",
320
+ {
321
+ className: "crewlet-app-shell__veil crewlet-app-shell__aside-veil",
322
+ ref: layer.veilRef,
323
+ role: "presentation",
324
+ style: { zIndex }
325
+ }
326
+ );
327
+ }
200
328
  function ShellDrawer({
201
329
  rail,
202
330
  onClose,
@@ -395,5 +523,42 @@ AppShell.RailStatus = AppShellRailStatus;
395
523
  AppShell.Topbar = AppShellTopbar;
396
524
  AppShell.Toggle = AppShellToggle;
397
525
  AppShell.AccountRow = AccountRow;
526
+ AppShell.ResizeHandle = ResizeHandle;
527
+ function defaultStorage() {
528
+ try {
529
+ return typeof window === "undefined" ? null : window.localStorage;
530
+ } catch {
531
+ return null;
532
+ }
533
+ }
534
+ function readStoredWidth(storage, key, min, max) {
535
+ if (!storage) return null;
536
+ try {
537
+ const stored = storage.getItem(key);
538
+ if (stored === null || stored.trim() === "") return null;
539
+ const value = Number(stored);
540
+ return Number.isFinite(value) && value >= min && value <= max ? Math.round(value) : null;
541
+ } catch {
542
+ return null;
543
+ }
544
+ }
545
+ function useStoredWidth({ key, min, max, storage }) {
546
+ const [store] = useState(() => storage === void 0 ? defaultStorage() : storage);
547
+ const [width, setStored] = useState(() => readStoredWidth(store, key, min, max));
548
+ const setWidth = useCallback((px) => setStored(clampSize(px, min, max)), [min, max]);
549
+ const commitWidth = useCallback(
550
+ (px) => {
551
+ const next = clampSize(px, min, max);
552
+ setStored(next);
553
+ if (!store) return;
554
+ try {
555
+ store.setItem(key, String(next));
556
+ } catch {
557
+ }
558
+ },
559
+ [key, min, max, store]
560
+ );
561
+ return { width, setWidth, commitWidth };
562
+ }
398
563
 
399
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell };
564
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth };
@@ -2,7 +2,7 @@ import { useTreeState, treeExpandable, treeLevel, treePosInSet, treeSetSize, tre
2
2
  import { LayerNodeBridge } from './chunk-LM3ISVJA.js';
3
3
  import { LayerHost, LAYER_REPOSITION_EVENT } from './chunk-OMV5W53A.js';
4
4
  import { focusables } from './chunk-H5XTJ7GJ.js';
5
- import { IconButton } from './chunk-LACA4JGC.js';
5
+ import { IconButton } from './chunk-2BQYODY3.js';
6
6
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
7
7
  import { cx } from './chunk-ODEQTPFM.js';
8
8
  import './TreeGrid-UCPV37XB.css';
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-OG6CL3EB.js';
1
+ import { Button } from './chunk-HD4QJ2SI.js';
2
2
  import './ErrorBoundary-U2PA3LY2.css';
3
3
  import { Component } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -0,0 +1,51 @@
1
+ import { Tag } from './chunk-KYIAFNU7.js';
2
+ import { Card } from './chunk-INHXF2CL.js';
3
+ import { cx } from './chunk-ODEQTPFM.js';
4
+ import './StatusCard-6RPEE6UU.css';
5
+ import { useId } from 'react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ function StatusCard({
9
+ title,
10
+ subtitle,
11
+ subtitlePlacement,
12
+ status,
13
+ settled = false,
14
+ bodyPadding = "md",
15
+ strip,
16
+ actions,
17
+ actionsAlign = "end",
18
+ className,
19
+ children,
20
+ ...rest
21
+ }) {
22
+ const id = useId();
23
+ const titleId = `${id}-title`;
24
+ const statusId = `${id}-status`;
25
+ return /* @__PURE__ */ jsxs(
26
+ Card,
27
+ {
28
+ ...rest,
29
+ as: "section",
30
+ "aria-labelledby": status ? `${titleId} ${statusId}` : titleId,
31
+ className: cx("crewlet-status-card", settled && "crewlet-status-card--settled", className),
32
+ "data-settled": settled || void 0,
33
+ children: [
34
+ /* @__PURE__ */ jsx(
35
+ Card.Header,
36
+ {
37
+ subtitle,
38
+ subtitlePlacement,
39
+ actions: status ? /* @__PURE__ */ jsx(Tag, { id: statusId, size: "sm", variant: status.tone, leadingIcon: status.icon, children: status.label }) : void 0,
40
+ children: /* @__PURE__ */ jsx(Card.Title, { id: titleId, truncate: true, children: title })
41
+ }
42
+ ),
43
+ children === void 0 || children === null || children === false ? null : /* @__PURE__ */ jsx(Card.Body, { padding: bodyPadding, className: "crewlet-status-card__body", children }),
44
+ strip === void 0 || strip === null || strip === false ? null : /* @__PURE__ */ jsx(Card.Footer, { padding: "none", className: "crewlet-status-card__strip", children: strip }),
45
+ actions === void 0 || actions === null || actions === false ? null : /* @__PURE__ */ jsx(Card.Footer, { className: cx("crewlet-status-card__actions", `crewlet-status-card__actions--${actionsAlign}`), children: actions })
46
+ ]
47
+ }
48
+ );
49
+ }
50
+
51
+ export { StatusCard };
@@ -1,7 +1,7 @@
1
1
  import { SlideStage } from './chunk-RMEBFYL7.js';
2
2
  import { useReorder } from './chunk-XJ2QEBMM.js';
3
3
  import { Kbd, isApplePlatform } from './chunk-SMBKXWML.js';
4
- import { Menu } from './chunk-TMM32U7D.js';
4
+ import { Menu } from './chunk-TKS7FTTO.js';
5
5
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
7
  import './SlideFilmstrip-PAT7P4OG.css';
@@ -0,0 +1,250 @@
1
+ import { HeadingLevelProvider } from './chunk-PQADV6P6.js';
2
+ import { useAppShellAside, ResizeHandle } from './chunk-PIYJNCN7.js';
3
+ import { useModalLayer } from './chunk-H5XTJ7GJ.js';
4
+ import { IconButton } from './chunk-2BQYODY3.js';
5
+ import { cx } from './chunk-ODEQTPFM.js';
6
+ import { createContext, useId, useRef, useContext, useLayoutEffect, useEffect, useMemo } from 'react';
7
+ import { MinimizeGlyph, MaximizeGlyph, XGlyph } from '@crewlethq/icons/glyphs';
8
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
9
+
10
+ var SidePanelFrameContext = createContext(null);
11
+ function part(name, alias) {
12
+ return cx(`crewlet-side-panel__${name}`, alias && `${alias}__${name}`);
13
+ }
14
+ function SidePanelBase({
15
+ alias,
16
+ title,
17
+ icon,
18
+ onClose,
19
+ closeLabel,
20
+ actions,
21
+ footer,
22
+ flush = false,
23
+ initialFocus = "heading",
24
+ ringHeading = false,
25
+ hideTitle = false,
26
+ expanded = false,
27
+ onExpandedChange,
28
+ expandLabel = "Expand",
29
+ collapseLabel = "Collapse",
30
+ width,
31
+ minWidth = 0,
32
+ maxWidth,
33
+ defaultWidth,
34
+ onWidthChange,
35
+ onWidthCommit,
36
+ resizable = false,
37
+ resizeLabel,
38
+ className,
39
+ children
40
+ }) {
41
+ const titleId = useId();
42
+ const panelId = useId();
43
+ const root = useRef(null);
44
+ const heading = useRef(null);
45
+ const before = useRef(null);
46
+ const start = useRef(initialFocus);
47
+ const inShell = useAppShellAside() !== null;
48
+ const frame = useContext(SidePanelFrameContext);
49
+ const shape = frame?.shape ?? null;
50
+ const modal = !inShell && shape === "sheet";
51
+ const role = inShell ? void 0 : modal ? "dialog" : "complementary";
52
+ useLayoutEffect(() => {
53
+ const panel = root.current;
54
+ before.current = document.activeElement;
55
+ const target = start.current;
56
+ if (target === "heading") heading.current?.focus({ preventScroll: true });
57
+ else if (target !== "none") target.current?.focus({ preventScroll: true });
58
+ return () => {
59
+ const back = before.current;
60
+ if (panel?.contains(document.activeElement) && back instanceof HTMLElement && back.isConnected) {
61
+ back.focus({ preventScroll: true });
62
+ }
63
+ };
64
+ }, []);
65
+ const close = useRef(onClose);
66
+ close.current = onClose;
67
+ useEffect(() => {
68
+ const panel = root.current;
69
+ if (!panel) return void 0;
70
+ const doc = panel.ownerDocument;
71
+ const onKeyDown = (event) => {
72
+ if (event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
73
+ if (!(event.target instanceof Node) || !panel.contains(event.target)) return;
74
+ event.preventDefault();
75
+ close.current();
76
+ };
77
+ doc.addEventListener("keydown", onKeyDown);
78
+ return () => doc.removeEventListener("keydown", onKeyDown);
79
+ }, []);
80
+ const sized = !inShell && !expanded && width !== void 0;
81
+ const grip = resizable && !inShell && !expanded && (shape === null || shape === "column") && width !== void 0 && onWidthChange;
82
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
83
+ /* @__PURE__ */ jsxs(
84
+ "div",
85
+ {
86
+ ref: root,
87
+ id: panelId,
88
+ className: cx("crewlet-side-panel", inShell && "crewlet-side-panel--fill", alias, className),
89
+ role,
90
+ "aria-modal": modal || void 0,
91
+ "aria-labelledby": inShell ? void 0 : titleId,
92
+ "data-expanded": expanded || void 0,
93
+ style: sized ? { ["--crewlet-side-panel-width"]: `${width}px` } : void 0,
94
+ children: [
95
+ grip ? /* @__PURE__ */ jsx(
96
+ ResizeHandle,
97
+ {
98
+ label: resizeLabel ?? `Resize ${title}`,
99
+ value: width,
100
+ min: minWidth,
101
+ max: maxWidth ?? width,
102
+ defaultValue: defaultWidth,
103
+ onValueChange: onWidthChange,
104
+ onValueCommit: onWidthCommit,
105
+ controls: panelId,
106
+ edge: "left"
107
+ }
108
+ ) : null,
109
+ /* @__PURE__ */ jsxs("div", { className: part("head", alias), children: [
110
+ icon ? /* @__PURE__ */ jsx("span", { className: part("icon", alias), "aria-hidden": true, children: icon }) : null,
111
+ /* @__PURE__ */ jsx(
112
+ "h2",
113
+ {
114
+ ref: heading,
115
+ id: titleId,
116
+ className: cx(
117
+ part("title", alias),
118
+ !ringHeading && "crewlet-side-panel__title--quiet",
119
+ hideTitle && "crewlet-side-panel__title--hidden"
120
+ ),
121
+ tabIndex: -1,
122
+ children: title
123
+ }
124
+ ),
125
+ /* @__PURE__ */ jsxs("span", { className: part("actions", alias), children: [
126
+ actions,
127
+ onExpandedChange ? /* @__PURE__ */ jsx(
128
+ IconButton,
129
+ {
130
+ label: expanded ? collapseLabel : expandLabel,
131
+ icon: expanded ? /* @__PURE__ */ jsx(MinimizeGlyph, { size: "sm" }) : /* @__PURE__ */ jsx(MaximizeGlyph, { size: "sm" }),
132
+ size: "sm",
133
+ variant: "ghost",
134
+ onClick: () => onExpandedChange(!expanded)
135
+ }
136
+ ) : null,
137
+ /* @__PURE__ */ jsx(IconButton, { label: closeLabel, icon: /* @__PURE__ */ jsx(XGlyph, { size: "sm" }), size: "sm", variant: "ghost", onClick: onClose })
138
+ ] })
139
+ ] }),
140
+ /* @__PURE__ */ jsx("div", { className: cx(part("body", alias), flush && "crewlet-side-panel__body--flush"), children: /* @__PURE__ */ jsx(HeadingLevelProvider, { level: 3, children }) }),
141
+ footer ? /* @__PURE__ */ jsx("div", { className: part("foot", alias), children: footer }) : null
142
+ ]
143
+ }
144
+ ),
145
+ modal ? /* @__PURE__ */ jsx(SheetLayer, { panel: root, onClose }) : null
146
+ ] });
147
+ }
148
+ function SheetLayer({ panel, onClose }) {
149
+ const layer = useModalLayer({ onClose });
150
+ const { panelRef } = layer;
151
+ useLayoutEffect(() => {
152
+ panelRef(panel.current);
153
+ return () => panelRef(null);
154
+ }, [panelRef, panel]);
155
+ return null;
156
+ }
157
+ var SIDE_PANEL_WIDTH = 420;
158
+ var SIDE_PANEL_MIN_WIDTH = 360;
159
+ var SIDE_PANEL_MAX_WIDTH = 640;
160
+ var SIDE_PANEL_LABELS = {
161
+ close: (title) => `Close ${title}`,
162
+ resize: (title) => `Resize ${title}`
163
+ };
164
+ function SidePanel({
165
+ title,
166
+ icon,
167
+ hideTitle,
168
+ onClose,
169
+ actions,
170
+ footer,
171
+ flush,
172
+ width,
173
+ minWidth = SIDE_PANEL_MIN_WIDTH,
174
+ maxWidth = SIDE_PANEL_MAX_WIDTH,
175
+ defaultWidth = SIDE_PANEL_WIDTH,
176
+ onWidthChange,
177
+ onWidthCommit,
178
+ resizable,
179
+ initialFocus,
180
+ labels,
181
+ className,
182
+ children
183
+ }) {
184
+ const words = { ...SIDE_PANEL_LABELS, ...labels };
185
+ return /* @__PURE__ */ jsx(
186
+ SidePanelBase,
187
+ {
188
+ title,
189
+ icon,
190
+ hideTitle,
191
+ onClose,
192
+ closeLabel: words.close(title),
193
+ resizeLabel: words.resize(title),
194
+ actions,
195
+ footer,
196
+ flush,
197
+ width: width ?? (resizable ? defaultWidth : void 0),
198
+ minWidth,
199
+ maxWidth,
200
+ defaultWidth,
201
+ onWidthChange,
202
+ onWidthCommit,
203
+ resizable,
204
+ initialFocus,
205
+ className,
206
+ children
207
+ }
208
+ );
209
+ }
210
+ function SidePanelFrameBase({
211
+ alias,
212
+ panel,
213
+ shape,
214
+ reserve,
215
+ expanded = false,
216
+ bodyRef,
217
+ bodyClassName,
218
+ bodyLabel,
219
+ className,
220
+ children
221
+ }) {
222
+ const context = useMemo(() => ({ shape: shape ?? null }), [shape]);
223
+ return /* @__PURE__ */ jsx(SidePanelFrameContext.Provider, { value: context, children: /* @__PURE__ */ jsxs(
224
+ "div",
225
+ {
226
+ className: cx("crewlet-side-panel-frame", alias, className),
227
+ "data-shape": shape ?? "auto",
228
+ "data-panel": panel ? expanded ? "expanded" : "open" : void 0,
229
+ style: reserve === void 0 ? void 0 : { ["--crewlet-side-panel-reserve"]: `${reserve}px` },
230
+ children: [
231
+ /* @__PURE__ */ jsx(
232
+ "div",
233
+ {
234
+ ref: bodyRef,
235
+ className: cx("crewlet-side-panel-frame__body", alias && `${alias}__body`, bodyClassName),
236
+ role: bodyLabel ? "region" : void 0,
237
+ "aria-label": bodyLabel,
238
+ children
239
+ }
240
+ ),
241
+ panel
242
+ ]
243
+ }
244
+ ) });
245
+ }
246
+ function SidePanelFrame(props) {
247
+ return /* @__PURE__ */ jsx(SidePanelFrameBase, { ...props });
248
+ }
249
+
250
+ export { SIDE_PANEL_LABELS, SIDE_PANEL_MAX_WIDTH, SIDE_PANEL_MIN_WIDTH, SIDE_PANEL_WIDTH, SidePanel, SidePanelBase, SidePanelFrame, SidePanelFrameBase };
@@ -0,0 +1,59 @@
1
+ import { Button } from './chunk-HD4QJ2SI.js';
2
+ import { cx } from './chunk-ODEQTPFM.js';
3
+ import './ReceiptStrip-IIRKRTBG.css';
4
+ import { CircleAlertGlyph, TriangleAlertGlyph, InfoGlyph, CircleCheckGlyph } from '@crewlethq/icons/glyphs';
5
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
+
7
+ var ICONS = {
8
+ success: /* @__PURE__ */ jsx(CircleCheckGlyph, { size: "md" }),
9
+ neutral: /* @__PURE__ */ jsx(InfoGlyph, { size: "md" }),
10
+ info: /* @__PURE__ */ jsx(InfoGlyph, { size: "md" }),
11
+ warning: /* @__PURE__ */ jsx(TriangleAlertGlyph, { size: "md" }),
12
+ danger: /* @__PURE__ */ jsx(CircleAlertGlyph, { size: "md" })
13
+ };
14
+ function ReceiptStrip({ tone = "success", icon, children, actions, className, ...rest }) {
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ ...rest,
19
+ role: tone === "danger" ? "alert" : "status",
20
+ className: cx("crewlet-receipt-strip", `crewlet-receipt-strip--${tone}`, className),
21
+ children: [
22
+ /* @__PURE__ */ jsx("span", { className: "crewlet-receipt-strip__icon", "aria-hidden": "true", children: icon ?? ICONS[tone] }),
23
+ /* @__PURE__ */ jsx("div", { className: "crewlet-receipt-strip__text", children }),
24
+ actions === void 0 || actions === null || actions === false ? null : /* @__PURE__ */ jsx("div", { className: "crewlet-receipt-strip__actions", children: actions })
25
+ ]
26
+ }
27
+ );
28
+ }
29
+ var REFUSAL_STRIP_LABELS = { retry: "Try again", dismiss: "Dismiss" };
30
+ function RefusalStrip({
31
+ children,
32
+ hint,
33
+ onRetry,
34
+ retrying = false,
35
+ onDismiss,
36
+ placement = "inline",
37
+ labels: overrides,
38
+ className,
39
+ ...rest
40
+ }) {
41
+ const labels = overrides ? { ...REFUSAL_STRIP_LABELS, ...overrides } : REFUSAL_STRIP_LABELS;
42
+ const actions = onRetry || onDismiss ? /* @__PURE__ */ jsxs(Fragment, { children: [
43
+ onRetry ? /* @__PURE__ */ jsx(Button, { size: "small", variant: "ghost", loading: retrying, onClick: onRetry, children: labels.retry }) : null,
44
+ onDismiss ? /* @__PURE__ */ jsx(Button, { size: "small", variant: "ghost", onClick: onDismiss, children: labels.dismiss }) : null
45
+ ] }) : void 0;
46
+ const words = /* @__PURE__ */ jsxs(Fragment, { children: [
47
+ /* @__PURE__ */ jsx("span", { className: "crewlet-refusal-strip__sentence", children }),
48
+ hint === void 0 || hint === null ? null : /* @__PURE__ */ jsx("span", { className: "crewlet-refusal-strip__hint", children: hint })
49
+ ] });
50
+ if (placement === "foot") {
51
+ return /* @__PURE__ */ jsx(ReceiptStrip, { ...rest, tone: "danger", actions, className: cx("crewlet-refusal-strip--foot", className), children: words });
52
+ }
53
+ return /* @__PURE__ */ jsxs("span", { ...rest, role: "alert", className: cx("crewlet-refusal-strip", className), children: [
54
+ words,
55
+ actions
56
+ ] });
57
+ }
58
+
59
+ export { REFUSAL_STRIP_LABELS, ReceiptStrip, RefusalStrip };
@@ -1,4 +1,4 @@
1
- import { toISO, useNow, formatRelative } from './chunk-3CZ7XAVY.js';
1
+ import { toISO, useNow, formatRelative } from './chunk-KS7YIJ4S.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
3
  import './EditingStatus-YU7EGM6Y.css';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1,5 +1,5 @@
1
1
  import { Callout } from './chunk-BPCY7ZID.js';
2
- import { Button } from './chunk-OG6CL3EB.js';
2
+ import { Button } from './chunk-HD4QJ2SI.js';
3
3
  import { isComposing } from './chunk-H5XTJ7GJ.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
5
  import { useEffect } from 'react';
@@ -1,6 +1,6 @@
1
1
  import { ContrastLevelTag } from './chunk-WW7TU6HE.js';
2
2
  import { Popover } from './chunk-KHJIEPZV.js';
3
- import { IconButton } from './chunk-LACA4JGC.js';
3
+ import { IconButton } from './chunk-2BQYODY3.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
5
  import './ContrastHelp-MZCAW5WQ.css';
6
6
  import { InfoGlyph } from '@crewlethq/icons/glyphs';
@@ -1,5 +1,5 @@
1
1
  import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel, placeGroups } from './chunk-MY374UUD.js';
2
- import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-D7Q5MQRF.js';
2
+ import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-YEURM24I.js';
3
3
  import { focusables } from './chunk-H5XTJ7GJ.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
5
  import './TreeCanvas-QA3PDFTK.css';
@@ -1,9 +1,9 @@
1
1
  import { LayerNodeBridge } from './chunk-LM3ISVJA.js';
2
2
  import { Tooltip } from './chunk-I33UIUZD.js';
3
3
  import { Kbd } from './chunk-SMBKXWML.js';
4
+ import { Button } from './chunk-HD4QJ2SI.js';
4
5
  import { LAYER_REPOSITION_EVENT, LayerHost } from './chunk-OMV5W53A.js';
5
- import { Button } from './chunk-OG6CL3EB.js';
6
- import { IconButton } from './chunk-LACA4JGC.js';
6
+ import { IconButton } from './chunk-2BQYODY3.js';
7
7
  import { returnFocus } from './chunk-NUZHC6MM.js';
8
8
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
9
9
  import { cx } from './chunk-ODEQTPFM.js';