@flanksource/clicky-ui 0.3.55 → 0.3.56

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 (991) hide show
  1. package/NOTICE.md +6 -0
  2. package/dist/ai.cjs +6 -0
  3. package/dist/ai.js +3 -1
  4. package/dist/chat.cjs +2 -0
  5. package/dist/chat.d.ts +1 -0
  6. package/dist/chat.d.ts.map +1 -1
  7. package/dist/chat.js +2 -1
  8. package/dist/comments/CommentCard.cjs +37 -7
  9. package/dist/comments/CommentCard.cjs.map +1 -1
  10. package/dist/comments/CommentCard.d.ts +11 -1
  11. package/dist/comments/CommentCard.d.ts.map +1 -1
  12. package/dist/comments/CommentCard.js +37 -7
  13. package/dist/comments/CommentCard.js.map +1 -1
  14. package/dist/comments/CommentCardParts.cjs +9 -4
  15. package/dist/comments/CommentCardParts.cjs.map +1 -1
  16. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  17. package/dist/comments/CommentCardParts.js +9 -4
  18. package/dist/comments/CommentCardParts.js.map +1 -1
  19. package/dist/comments/CommentComposer.cjs +8 -8
  20. package/dist/comments/CommentComposer.cjs.map +1 -1
  21. package/dist/comments/CommentComposer.d.ts.map +1 -1
  22. package/dist/comments/CommentComposer.js +8 -8
  23. package/dist/comments/CommentComposer.js.map +1 -1
  24. package/dist/comments/CommentProvider.cjs +5 -1
  25. package/dist/comments/CommentProvider.cjs.map +1 -1
  26. package/dist/comments/CommentProvider.d.ts +1 -1
  27. package/dist/comments/CommentProvider.d.ts.map +1 -1
  28. package/dist/comments/CommentProvider.js +5 -1
  29. package/dist/comments/CommentProvider.js.map +1 -1
  30. package/dist/comments/CommentSidePanel.cjs +17 -11
  31. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  32. package/dist/comments/CommentSidePanel.d.ts +6 -0
  33. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  34. package/dist/comments/CommentSidePanel.js +17 -11
  35. package/dist/comments/CommentSidePanel.js.map +1 -1
  36. package/dist/comments/CommentThread.cjs +4 -1
  37. package/dist/comments/CommentThread.cjs.map +1 -1
  38. package/dist/comments/CommentThread.d.ts +4 -1
  39. package/dist/comments/CommentThread.d.ts.map +1 -1
  40. package/dist/comments/CommentThread.js +4 -1
  41. package/dist/comments/CommentThread.js.map +1 -1
  42. package/dist/comments/CommentThreadList.cjs +6 -3
  43. package/dist/comments/CommentThreadList.cjs.map +1 -1
  44. package/dist/comments/CommentThreadList.d.ts +7 -2
  45. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  46. package/dist/comments/CommentThreadList.js +6 -3
  47. package/dist/comments/CommentThreadList.js.map +1 -1
  48. package/dist/comments/MentionTextarea.cjs +1 -1
  49. package/dist/comments/MentionTextarea.cjs.map +1 -1
  50. package/dist/comments/MentionTextarea.d.ts.map +1 -1
  51. package/dist/comments/MentionTextarea.js +1 -1
  52. package/dist/comments/MentionTextarea.js.map +1 -1
  53. package/dist/comments/comment-assign.cjs +68 -0
  54. package/dist/comments/comment-assign.cjs.map +1 -0
  55. package/dist/comments/comment-assign.d.ts +31 -0
  56. package/dist/comments/comment-assign.d.ts.map +1 -0
  57. package/dist/comments/comment-assign.js +67 -0
  58. package/dist/comments/comment-assign.js.map +1 -0
  59. package/dist/comments/comment-types.cjs.map +1 -1
  60. package/dist/comments/comment-types.d.ts +39 -0
  61. package/dist/comments/comment-types.d.ts.map +1 -1
  62. package/dist/comments/comment-types.js.map +1 -1
  63. package/dist/comments/comment-utils.cjs +2 -0
  64. package/dist/comments/comment-utils.cjs.map +1 -1
  65. package/dist/comments/comment-utils.d.ts +2 -0
  66. package/dist/comments/comment-utils.d.ts.map +1 -1
  67. package/dist/comments/comment-utils.js +2 -0
  68. package/dist/comments/comment-utils.js.map +1 -1
  69. package/dist/comments.cjs +3 -0
  70. package/dist/comments.d.ts +1 -0
  71. package/dist/comments.d.ts.map +1 -1
  72. package/dist/comments.js +2 -1
  73. package/dist/components/ComboboxMenu.cjs +23 -13
  74. package/dist/components/ComboboxMenu.cjs.map +1 -1
  75. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  76. package/dist/components/ComboboxMenu.js +23 -13
  77. package/dist/components/ComboboxMenu.js.map +1 -1
  78. package/dist/components/FilterBar.cjs +29 -6
  79. package/dist/components/FilterBar.cjs.map +1 -1
  80. package/dist/components/FilterBar.d.ts +3 -1
  81. package/dist/components/FilterBar.d.ts.map +1 -1
  82. package/dist/components/FilterBar.js +29 -6
  83. package/dist/components/FilterBar.js.map +1 -1
  84. package/dist/components/ItemActions.cjs +1 -1
  85. package/dist/components/ItemActions.cjs.map +1 -1
  86. package/dist/components/ItemActions.js +1 -1
  87. package/dist/components/ItemActions.js.map +1 -1
  88. package/dist/components/ListMenu.cjs +33 -3
  89. package/dist/components/ListMenu.cjs.map +1 -1
  90. package/dist/components/ListMenu.d.ts +4 -1
  91. package/dist/components/ListMenu.d.ts.map +1 -1
  92. package/dist/components/ListMenu.js +33 -3
  93. package/dist/components/ListMenu.js.map +1 -1
  94. package/dist/components/ListMenuItems.cjs +80 -0
  95. package/dist/components/ListMenuItems.cjs.map +1 -0
  96. package/dist/components/ListMenuItems.d.ts +8 -0
  97. package/dist/components/ListMenuItems.d.ts.map +1 -0
  98. package/dist/components/ListMenuItems.js +80 -0
  99. package/dist/components/ListMenuItems.js.map +1 -0
  100. package/dist/components/LocalPathPicker.cjs +182 -0
  101. package/dist/components/LocalPathPicker.cjs.map +1 -0
  102. package/dist/components/LocalPathPicker.d.ts +11 -0
  103. package/dist/components/LocalPathPicker.d.ts.map +1 -0
  104. package/dist/components/LocalPathPicker.js +182 -0
  105. package/dist/components/LocalPathPicker.js.map +1 -0
  106. package/dist/components/LocalPathTree.cjs +89 -0
  107. package/dist/components/LocalPathTree.cjs.map +1 -0
  108. package/dist/components/LocalPathTree.d.ts +9 -0
  109. package/dist/components/LocalPathTree.d.ts.map +1 -0
  110. package/dist/components/LocalPathTree.js +89 -0
  111. package/dist/components/LocalPathTree.js.map +1 -0
  112. package/dist/components/RangeSlider.cjs +10 -30
  113. package/dist/components/RangeSlider.cjs.map +1 -1
  114. package/dist/components/RangeSlider.d.ts.map +1 -1
  115. package/dist/components/RangeSlider.js +4 -24
  116. package/dist/components/RangeSlider.js.map +1 -1
  117. package/dist/components/Slider.cjs +79 -0
  118. package/dist/components/Slider.cjs.map +1 -0
  119. package/dist/components/Slider.d.ts +23 -0
  120. package/dist/components/Slider.d.ts.map +1 -0
  121. package/dist/components/Slider.js +79 -0
  122. package/dist/components/Slider.js.map +1 -0
  123. package/dist/components/combobox-types.d.ts +4 -1
  124. package/dist/components/combobox-types.d.ts.map +1 -1
  125. package/dist/components/filter-bar-field-utils.cjs +3 -5
  126. package/dist/components/filter-bar-field-utils.cjs.map +1 -1
  127. package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
  128. package/dist/components/filter-bar-field-utils.js +3 -5
  129. package/dist/components/filter-bar-field-utils.js.map +1 -1
  130. package/dist/components/filter-bar-tree-model.cjs +22 -0
  131. package/dist/components/filter-bar-tree-model.cjs.map +1 -0
  132. package/dist/components/filter-bar-tree-model.d.ts +33 -0
  133. package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
  134. package/dist/components/filter-bar-tree-model.js +21 -0
  135. package/dist/components/filter-bar-tree-model.js.map +1 -0
  136. package/dist/components/filter-bar-tree.cjs +84 -0
  137. package/dist/components/filter-bar-tree.cjs.map +1 -0
  138. package/dist/components/filter-bar-tree.d.ts +7 -0
  139. package/dist/components/filter-bar-tree.d.ts.map +1 -0
  140. package/dist/components/filter-bar-tree.js +84 -0
  141. package/dist/components/filter-bar-tree.js.map +1 -0
  142. package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
  143. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
  144. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
  145. package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
  146. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
  147. package/dist/components/json-schema-form-help-links.cjs +18 -0
  148. package/dist/components/json-schema-form-help-links.cjs.map +1 -0
  149. package/dist/components/json-schema-form-help-links.d.ts +5 -0
  150. package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
  151. package/dist/components/json-schema-form-help-links.js +18 -0
  152. package/dist/components/json-schema-form-help-links.js.map +1 -0
  153. package/dist/components/json-schema-form-help-model.cjs +7 -0
  154. package/dist/components/json-schema-form-help-model.cjs.map +1 -0
  155. package/dist/components/json-schema-form-help-model.d.ts +3 -0
  156. package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
  157. package/dist/components/json-schema-form-help-model.js +7 -0
  158. package/dist/components/json-schema-form-help-model.js.map +1 -0
  159. package/dist/components/json-schema-form-json.cjs +48 -0
  160. package/dist/components/json-schema-form-json.cjs.map +1 -0
  161. package/dist/components/json-schema-form-json.d.ts +7 -0
  162. package/dist/components/json-schema-form-json.d.ts.map +1 -0
  163. package/dist/components/json-schema-form-json.js +48 -0
  164. package/dist/components/json-schema-form-json.js.map +1 -0
  165. package/dist/components/json-schema-form-layout.cjs +7 -5
  166. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  167. package/dist/components/json-schema-form-layout.d.ts +2 -2
  168. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  169. package/dist/components/json-schema-form-layout.js +7 -5
  170. package/dist/components/json-schema-form-layout.js.map +1 -1
  171. package/dist/components/json-schema-form-object.cjs +2 -13
  172. package/dist/components/json-schema-form-object.cjs.map +1 -1
  173. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  174. package/dist/components/json-schema-form-object.js +2 -13
  175. package/dist/components/json-schema-form-object.js.map +1 -1
  176. package/dist/components/json-schema-form-refs.cjs +1 -1
  177. package/dist/components/json-schema-form-refs.cjs.map +1 -1
  178. package/dist/components/json-schema-form-refs.d.ts.map +1 -1
  179. package/dist/components/json-schema-form-refs.js +1 -1
  180. package/dist/components/json-schema-form-refs.js.map +1 -1
  181. package/dist/components/json-schema-form-render.cjs +20 -6
  182. package/dist/components/json-schema-form-render.cjs.map +1 -1
  183. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  184. package/dist/components/json-schema-form-render.js +20 -6
  185. package/dist/components/json-schema-form-render.js.map +1 -1
  186. package/dist/components/json-schema-form-resolve.cjs +22 -2
  187. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  188. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  189. package/dist/components/json-schema-form-resolve.js +22 -2
  190. package/dist/components/json-schema-form-resolve.js.map +1 -1
  191. package/dist/components/json-schema-form-types.d.ts +5 -1
  192. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  193. package/dist/components/json-schema-form-union-model.cjs +46 -0
  194. package/dist/components/json-schema-form-union-model.cjs.map +1 -0
  195. package/dist/components/json-schema-form-union-model.d.ts +6 -0
  196. package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
  197. package/dist/components/json-schema-form-union-model.js +43 -0
  198. package/dist/components/json-schema-form-union-model.js.map +1 -0
  199. package/dist/components/json-schema-form-union.cjs +52 -0
  200. package/dist/components/json-schema-form-union.cjs.map +1 -0
  201. package/dist/components/json-schema-form-union.d.ts +7 -0
  202. package/dist/components/json-schema-form-union.d.ts.map +1 -0
  203. package/dist/components/json-schema-form-union.js +52 -0
  204. package/dist/components/json-schema-form-union.js.map +1 -0
  205. package/dist/components/list-menu-virtual.cjs +5 -0
  206. package/dist/components/list-menu-virtual.cjs.map +1 -0
  207. package/dist/components/list-menu-virtual.d.ts +12 -0
  208. package/dist/components/list-menu-virtual.d.ts.map +1 -0
  209. package/dist/components/list-menu-virtual.js +6 -0
  210. package/dist/components/list-menu-virtual.js.map +1 -0
  211. package/dist/components/local-path.cjs +12 -0
  212. package/dist/components/local-path.cjs.map +1 -0
  213. package/dist/components/local-path.d.ts +14 -0
  214. package/dist/components/local-path.d.ts.map +1 -0
  215. package/dist/components/local-path.js +12 -0
  216. package/dist/components/local-path.js.map +1 -0
  217. package/dist/components/slider-shared.cjs +32 -0
  218. package/dist/components/slider-shared.cjs.map +1 -0
  219. package/dist/components/slider-shared.d.ts +18 -0
  220. package/dist/components/slider-shared.d.ts.map +1 -0
  221. package/dist/components/slider-shared.js +27 -0
  222. package/dist/components/slider-shared.js.map +1 -0
  223. package/dist/components.cjs +8 -0
  224. package/dist/components.d.ts +6 -1
  225. package/dist/components.d.ts.map +1 -1
  226. package/dist/components.js +5 -1
  227. package/dist/connections/ConnectionsPage.cjs +51 -19
  228. package/dist/connections/ConnectionsPage.cjs.map +1 -1
  229. package/dist/connections/ConnectionsPage.d.ts +9 -1
  230. package/dist/connections/ConnectionsPage.d.ts.map +1 -1
  231. package/dist/connections/ConnectionsPage.js +52 -20
  232. package/dist/connections/ConnectionsPage.js.map +1 -1
  233. package/dist/connections/connectionDashboard.cjs +13 -8
  234. package/dist/connections/connectionDashboard.cjs.map +1 -1
  235. package/dist/connections/connectionDashboard.d.ts +8 -3
  236. package/dist/connections/connectionDashboard.d.ts.map +1 -1
  237. package/dist/connections/connectionDashboard.js +14 -9
  238. package/dist/connections/connectionDashboard.js.map +1 -1
  239. package/dist/connections/connectionDashboardModel.cjs.map +1 -1
  240. package/dist/connections/connectionDashboardModel.d.ts +4 -0
  241. package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
  242. package/dist/connections/connectionDashboardModel.js.map +1 -1
  243. package/dist/connections/connectionDashboardRow.cjs +75 -55
  244. package/dist/connections/connectionDashboardRow.cjs.map +1 -1
  245. package/dist/connections/connectionDashboardRow.d.ts +3 -2
  246. package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
  247. package/dist/connections/connectionDashboardRow.js +75 -55
  248. package/dist/connections/connectionDashboardRow.js.map +1 -1
  249. package/dist/connections/connectionNamespaceField.cjs +17 -0
  250. package/dist/connections/connectionNamespaceField.cjs.map +1 -0
  251. package/dist/connections/connectionNamespaceField.d.ts +10 -0
  252. package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
  253. package/dist/connections/connectionNamespaceField.js +17 -0
  254. package/dist/connections/connectionNamespaceField.js.map +1 -0
  255. package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
  256. package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
  257. package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
  258. package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
  259. package/dist/connections/connectionSchemaFormExtensions.js +96 -0
  260. package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
  261. package/dist/connections/connectionsPageModel.cjs +11 -0
  262. package/dist/connections/connectionsPageModel.cjs.map +1 -1
  263. package/dist/connections/connectionsPageModel.d.ts +5 -0
  264. package/dist/connections/connectionsPageModel.d.ts.map +1 -1
  265. package/dist/connections/connectionsPageModel.js +11 -1
  266. package/dist/connections/connectionsPageModel.js.map +1 -1
  267. package/dist/connections.cjs +5 -0
  268. package/dist/connections.d.ts +2 -1
  269. package/dist/connections.d.ts.map +1 -1
  270. package/dist/connections.js +3 -2
  271. package/dist/data/AvatarBadge.cjs +3 -3
  272. package/dist/data/AvatarBadge.cjs.map +1 -1
  273. package/dist/data/AvatarBadge.js +3 -3
  274. package/dist/data/AvatarBadge.js.map +1 -1
  275. package/dist/data/CodeDiff.cjs +2 -0
  276. package/dist/data/CodeDiff.cjs.map +1 -1
  277. package/dist/data/CodeDiff.js +2 -0
  278. package/dist/data/CodeDiff.js.map +1 -1
  279. package/dist/data/DataTable.cjs +3 -2
  280. package/dist/data/DataTable.cjs.map +1 -1
  281. package/dist/data/DataTable.d.ts.map +1 -1
  282. package/dist/data/DataTable.js +3 -2
  283. package/dist/data/DataTable.js.map +1 -1
  284. package/dist/data/Gauge.cjs +1 -1
  285. package/dist/data/Gauge.cjs.map +1 -1
  286. package/dist/data/Gauge.js +1 -1
  287. package/dist/data/Gauge.js.map +1 -1
  288. package/dist/data/HighlightedTokens.cjs +2 -10
  289. package/dist/data/HighlightedTokens.cjs.map +1 -1
  290. package/dist/data/HighlightedTokens.d.ts.map +1 -1
  291. package/dist/data/HighlightedTokens.js +1 -9
  292. package/dist/data/HighlightedTokens.js.map +1 -1
  293. package/dist/data/Markdown.cjs +38 -11
  294. package/dist/data/Markdown.cjs.map +1 -1
  295. package/dist/data/Markdown.d.ts +9 -1
  296. package/dist/data/Markdown.d.ts.map +1 -1
  297. package/dist/data/Markdown.js +39 -12
  298. package/dist/data/Markdown.js.map +1 -1
  299. package/dist/data/MultiGaugeBar.cjs +157 -0
  300. package/dist/data/MultiGaugeBar.cjs.map +1 -0
  301. package/dist/data/MultiGaugeBar.d.ts +29 -0
  302. package/dist/data/MultiGaugeBar.d.ts.map +1 -0
  303. package/dist/data/MultiGaugeBar.js +157 -0
  304. package/dist/data/MultiGaugeBar.js.map +1 -0
  305. package/dist/data/OpenInFilesLink.cjs +27 -0
  306. package/dist/data/OpenInFilesLink.cjs.map +1 -0
  307. package/dist/data/OpenInFilesLink.d.ts +15 -0
  308. package/dist/data/OpenInFilesLink.d.ts.map +1 -0
  309. package/dist/data/OpenInFilesLink.js +27 -0
  310. package/dist/data/OpenInFilesLink.js.map +1 -0
  311. package/dist/data/ProgressBar.cjs +5 -3
  312. package/dist/data/ProgressBar.cjs.map +1 -1
  313. package/dist/data/ProgressBar.d.ts +5 -1
  314. package/dist/data/ProgressBar.d.ts.map +1 -1
  315. package/dist/data/ProgressBar.js +5 -3
  316. package/dist/data/ProgressBar.js.map +1 -1
  317. package/dist/data/ProgressBars.cjs +13 -5
  318. package/dist/data/ProgressBars.cjs.map +1 -1
  319. package/dist/data/ProgressBars.d.ts +6 -1
  320. package/dist/data/ProgressBars.d.ts.map +1 -1
  321. package/dist/data/ProgressBars.js +13 -5
  322. package/dist/data/ProgressBars.js.map +1 -1
  323. package/dist/data/Properties.cjs +3 -3
  324. package/dist/data/Properties.cjs.map +1 -1
  325. package/dist/data/Properties.js +3 -3
  326. package/dist/data/Properties.js.map +1 -1
  327. package/dist/data/TaskProgress.cjs +14 -6
  328. package/dist/data/TaskProgress.cjs.map +1 -1
  329. package/dist/data/TaskProgress.d.ts +3 -1
  330. package/dist/data/TaskProgress.d.ts.map +1 -1
  331. package/dist/data/TaskProgress.js +14 -6
  332. package/dist/data/TaskProgress.js.map +1 -1
  333. package/dist/data/TaskPrompts.cjs +96 -0
  334. package/dist/data/TaskPrompts.cjs.map +1 -0
  335. package/dist/data/TaskPrompts.d.ts +6 -0
  336. package/dist/data/TaskPrompts.d.ts.map +1 -0
  337. package/dist/data/TaskPrompts.js +96 -0
  338. package/dist/data/TaskPrompts.js.map +1 -0
  339. package/dist/data/TaskSnapshot.cjs.map +1 -1
  340. package/dist/data/TaskSnapshot.d.ts +3 -0
  341. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  342. package/dist/data/TaskSnapshot.js.map +1 -1
  343. package/dist/data/TimeseriesCoreBars.cjs +7 -3
  344. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  345. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  346. package/dist/data/TimeseriesCoreBars.js +8 -4
  347. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  348. package/dist/data/TimeseriesGauge.cjs +12 -5
  349. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  350. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  351. package/dist/data/TimeseriesGauge.js +13 -6
  352. package/dist/data/TimeseriesGauge.js.map +1 -1
  353. package/dist/data/TimeseriesPanel.cjs +10 -9
  354. package/dist/data/TimeseriesPanel.cjs.map +1 -1
  355. package/dist/data/TimeseriesPanel.d.ts +1 -1
  356. package/dist/data/TimeseriesPanel.d.ts.map +1 -1
  357. package/dist/data/TimeseriesPanel.js +11 -10
  358. package/dist/data/TimeseriesPanel.js.map +1 -1
  359. package/dist/data/TimeseriesPanel.model.cjs +62 -10
  360. package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
  361. package/dist/data/TimeseriesPanel.model.d.ts +40 -1
  362. package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
  363. package/dist/data/TimeseriesPanel.model.js +62 -11
  364. package/dist/data/TimeseriesPanel.model.js.map +1 -1
  365. package/dist/data/WorkloadCard.cjs +7 -3
  366. package/dist/data/WorkloadCard.cjs.map +1 -1
  367. package/dist/data/WorkloadCard.d.ts +3 -1
  368. package/dist/data/WorkloadCard.d.ts.map +1 -1
  369. package/dist/data/WorkloadCard.js +7 -3
  370. package/dist/data/WorkloadCard.js.map +1 -1
  371. package/dist/data/WorkloadCard.model.cjs.map +1 -1
  372. package/dist/data/WorkloadCard.model.d.ts +2 -0
  373. package/dist/data/WorkloadCard.model.d.ts.map +1 -1
  374. package/dist/data/WorkloadCard.model.js.map +1 -1
  375. package/dist/data/ai/ChatWindow.placement.cjs +2 -1
  376. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
  377. package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
  378. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
  379. package/dist/data/ai/ChatWindow.placement.js +2 -1
  380. package/dist/data/ai/ChatWindow.placement.js.map +1 -1
  381. package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
  382. package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
  383. package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
  384. package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
  385. package/dist/data/ai/SpecRuntimeBar.js +2 -2
  386. package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
  387. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
  388. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  389. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
  390. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  391. package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
  392. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  393. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
  394. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  395. package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
  396. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  397. package/dist/data/ai/ThreadPicker.cjs +2 -2
  398. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  399. package/dist/data/ai/ThreadPicker.js +2 -2
  400. package/dist/data/ai/ThreadPicker.js.map +1 -1
  401. package/dist/data/ai/index.d.ts +2 -0
  402. package/dist/data/ai/index.d.ts.map +1 -1
  403. package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
  404. package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
  405. package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
  406. package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
  407. package/dist/data/ai/use-prompt-run-stream.js +126 -0
  408. package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
  409. package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
  410. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
  411. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
  412. package/dist/data/cache-browser/CacheBrowser.js +1 -0
  413. package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
  414. package/dist/data/charts/BarChart.cjs +194 -0
  415. package/dist/data/charts/BarChart.cjs.map +1 -0
  416. package/dist/data/charts/BarChart.d.ts +19 -0
  417. package/dist/data/charts/BarChart.d.ts.map +1 -0
  418. package/dist/data/charts/BarChart.js +194 -0
  419. package/dist/data/charts/BarChart.js.map +1 -0
  420. package/dist/data/charts/ChartLegend.cjs +54 -0
  421. package/dist/data/charts/ChartLegend.cjs.map +1 -0
  422. package/dist/data/charts/ChartLegend.d.ts +17 -0
  423. package/dist/data/charts/ChartLegend.d.ts.map +1 -0
  424. package/dist/data/charts/ChartLegend.js +54 -0
  425. package/dist/data/charts/ChartLegend.js.map +1 -0
  426. package/dist/data/charts/Sparkline.cjs +56 -0
  427. package/dist/data/charts/Sparkline.cjs.map +1 -0
  428. package/dist/data/charts/Sparkline.d.ts +15 -0
  429. package/dist/data/charts/Sparkline.d.ts.map +1 -0
  430. package/dist/data/charts/Sparkline.js +56 -0
  431. package/dist/data/charts/Sparkline.js.map +1 -0
  432. package/dist/data/charts/StackedBarChart.cjs +241 -0
  433. package/dist/data/charts/StackedBarChart.cjs.map +1 -0
  434. package/dist/data/charts/StackedBarChart.d.ts +20 -0
  435. package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
  436. package/dist/data/charts/StackedBarChart.js +241 -0
  437. package/dist/data/charts/StackedBarChart.js.map +1 -0
  438. package/dist/data/charts/TrendChart.cjs +157 -0
  439. package/dist/data/charts/TrendChart.cjs.map +1 -0
  440. package/dist/data/charts/TrendChart.d.ts +20 -0
  441. package/dist/data/charts/TrendChart.d.ts.map +1 -0
  442. package/dist/data/charts/TrendChart.js +157 -0
  443. package/dist/data/charts/TrendChart.js.map +1 -0
  444. package/dist/data/charts/chart-marks.cjs +115 -0
  445. package/dist/data/charts/chart-marks.cjs.map +1 -0
  446. package/dist/data/charts/chart-marks.d.ts +39 -0
  447. package/dist/data/charts/chart-marks.d.ts.map +1 -0
  448. package/dist/data/charts/chart-marks.js +112 -0
  449. package/dist/data/charts/chart-marks.js.map +1 -0
  450. package/dist/data/charts/chart-palette.cjs +74 -0
  451. package/dist/data/charts/chart-palette.cjs.map +1 -0
  452. package/dist/data/charts/chart-palette.d.ts +58 -0
  453. package/dist/data/charts/chart-palette.d.ts.map +1 -0
  454. package/dist/data/charts/chart-palette.js +72 -0
  455. package/dist/data/charts/chart-palette.js.map +1 -0
  456. package/dist/data/charts/chart-scale.cjs +115 -0
  457. package/dist/data/charts/chart-scale.cjs.map +1 -0
  458. package/dist/data/charts/chart-scale.d.ts +41 -0
  459. package/dist/data/charts/chart-scale.d.ts.map +1 -0
  460. package/dist/data/charts/chart-scale.js +104 -0
  461. package/dist/data/charts/chart-scale.js.map +1 -0
  462. package/dist/data/charts/chart.test-utils.d.ts +7 -0
  463. package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
  464. package/dist/data/charts/index.d.ts +7 -0
  465. package/dist/data/charts/index.d.ts.map +1 -0
  466. package/dist/data/chat/MessageActions.cjs +1 -1
  467. package/dist/data/chat/MessageActions.cjs.map +1 -1
  468. package/dist/data/chat/MessageActions.js +1 -1
  469. package/dist/data/chat/MessageActions.js.map +1 -1
  470. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
  471. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
  472. package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
  473. package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
  474. package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
  475. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
  476. package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
  477. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  478. package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
  479. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  480. package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
  481. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  482. package/dist/data/diagnostics/ProblemActions.cjs +37 -0
  483. package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
  484. package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
  485. package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
  486. package/dist/data/diagnostics/ProblemActions.js +37 -0
  487. package/dist/data/diagnostics/ProblemActions.js.map +1 -0
  488. package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
  489. package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
  490. package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
  491. package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
  492. package/dist/data/diagnostics/ProblemFacet.js +33 -0
  493. package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
  494. package/dist/data/diagnostics/ProblemRow.cjs +62 -0
  495. package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
  496. package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
  497. package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
  498. package/dist/data/diagnostics/ProblemRow.js +62 -0
  499. package/dist/data/diagnostics/ProblemRow.js.map +1 -0
  500. package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
  501. package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
  502. package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
  503. package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
  504. package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
  505. package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
  506. package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
  507. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  508. package/dist/data/diagnostics/StackFrameRow.js +1 -1
  509. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  510. package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
  511. package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
  512. package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
  513. package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
  514. package/dist/data/diagnostics/diagnostic-identity.js +14 -0
  515. package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
  516. package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
  517. package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
  518. package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
  519. package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
  520. package/dist/data/diagnostics/use-problem-expansion.js +16 -0
  521. package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
  522. package/dist/data/git/GitChangeList.cjs +9 -6
  523. package/dist/data/git/GitChangeList.cjs.map +1 -1
  524. package/dist/data/git/GitChangeList.d.ts +6 -0
  525. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  526. package/dist/data/git/GitChangeList.js +9 -6
  527. package/dist/data/git/GitChangeList.js.map +1 -1
  528. package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
  529. package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
  530. package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
  531. package/dist/data/git/pickers/ReferencePicker.js +1 -0
  532. package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
  533. package/dist/data/lint/LintDetail.cjs +230 -189
  534. package/dist/data/lint/LintDetail.cjs.map +1 -1
  535. package/dist/data/lint/LintDetail.d.ts +25 -3
  536. package/dist/data/lint/LintDetail.d.ts.map +1 -1
  537. package/dist/data/lint/LintDetail.js +231 -192
  538. package/dist/data/lint/LintDetail.js.map +1 -1
  539. package/dist/data/lint/LintFilterBar.cjs +78 -83
  540. package/dist/data/lint/LintFilterBar.cjs.map +1 -1
  541. package/dist/data/lint/LintFilterBar.d.ts +23 -6
  542. package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
  543. package/dist/data/lint/LintFilterBar.js +78 -85
  544. package/dist/data/lint/LintFilterBar.js.map +1 -1
  545. package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
  546. package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
  547. package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
  548. package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
  549. package/dist/data/lint/LintIgnoreMenu.js +58 -0
  550. package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
  551. package/dist/data/lint/LintResults.cjs +59 -14
  552. package/dist/data/lint/LintResults.cjs.map +1 -1
  553. package/dist/data/lint/LintResults.d.ts +25 -1
  554. package/dist/data/lint/LintResults.d.ts.map +1 -1
  555. package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
  556. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
  557. package/dist/data/lint/LintResults.js +60 -15
  558. package/dist/data/lint/LintResults.js.map +1 -1
  559. package/dist/data/lint/LintTable.cjs +156 -0
  560. package/dist/data/lint/LintTable.cjs.map +1 -0
  561. package/dist/data/lint/LintTable.d.ts +13 -0
  562. package/dist/data/lint/LintTable.d.ts.map +1 -0
  563. package/dist/data/lint/LintTable.js +156 -0
  564. package/dist/data/lint/LintTable.js.map +1 -0
  565. package/dist/data/lint/LintTreeNode.cjs +42 -19
  566. package/dist/data/lint/LintTreeNode.cjs.map +1 -1
  567. package/dist/data/lint/LintTreeNode.d.ts +7 -2
  568. package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
  569. package/dist/data/lint/LintTreeNode.js +44 -21
  570. package/dist/data/lint/LintTreeNode.js.map +1 -1
  571. package/dist/data/lint/ViolationSnippet.cjs +113 -0
  572. package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
  573. package/dist/data/lint/ViolationSnippet.d.ts +20 -0
  574. package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
  575. package/dist/data/lint/ViolationSnippet.js +112 -0
  576. package/dist/data/lint/ViolationSnippet.js.map +1 -0
  577. package/dist/data/lint/actions.cjs +44 -16
  578. package/dist/data/lint/actions.cjs.map +1 -1
  579. package/dist/data/lint/actions.d.ts +7 -3
  580. package/dist/data/lint/actions.d.ts.map +1 -1
  581. package/dist/data/lint/actions.js +44 -16
  582. package/dist/data/lint/actions.js.map +1 -1
  583. package/dist/data/lint/grouping.cjs +105 -8
  584. package/dist/data/lint/grouping.cjs.map +1 -1
  585. package/dist/data/lint/grouping.d.ts +21 -1
  586. package/dist/data/lint/grouping.d.ts.map +1 -1
  587. package/dist/data/lint/grouping.js +105 -10
  588. package/dist/data/lint/grouping.js.map +1 -1
  589. package/dist/data/lint/ignore-menu-items.cjs +18 -0
  590. package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
  591. package/dist/data/lint/ignore-menu-items.d.ts +6 -0
  592. package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
  593. package/dist/data/lint/ignore-menu-items.js +17 -0
  594. package/dist/data/lint/ignore-menu-items.js.map +1 -0
  595. package/dist/data/lint/index.d.ts +7 -5
  596. package/dist/data/lint/index.d.ts.map +1 -1
  597. package/dist/data/lint/stats.cjs +19 -4
  598. package/dist/data/lint/stats.cjs.map +1 -1
  599. package/dist/data/lint/stats.d.ts +13 -3
  600. package/dist/data/lint/stats.d.ts.map +1 -1
  601. package/dist/data/lint/stats.js +17 -5
  602. package/dist/data/lint/stats.js.map +1 -1
  603. package/dist/data/lint/types.cjs +8 -0
  604. package/dist/data/lint/types.cjs.map +1 -1
  605. package/dist/data/lint/types.d.ts +47 -0
  606. package/dist/data/lint/types.d.ts.map +1 -1
  607. package/dist/data/lint/types.js +8 -1
  608. package/dist/data/lint/types.js.map +1 -1
  609. package/dist/data/lint/violation-menu-items.cjs +31 -0
  610. package/dist/data/lint/violation-menu-items.cjs.map +1 -0
  611. package/dist/data/lint/violation-menu-items.d.ts +12 -0
  612. package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
  613. package/dist/data/lint/violation-menu-items.js +31 -0
  614. package/dist/data/lint/violation-menu-items.js.map +1 -0
  615. package/dist/data/markdown-source-blocks.cjs +38 -0
  616. package/dist/data/markdown-source-blocks.cjs.map +1 -0
  617. package/dist/data/markdown-source-blocks.d.ts +32 -0
  618. package/dist/data/markdown-source-blocks.d.ts.map +1 -0
  619. package/dist/data/markdown-source-blocks.js +35 -0
  620. package/dist/data/markdown-source-blocks.js.map +1 -0
  621. package/dist/data/test-runner/FilterFacet.cjs +52 -0
  622. package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
  623. package/dist/data/test-runner/FilterFacet.d.ts +13 -0
  624. package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
  625. package/dist/data/test-runner/FilterFacet.js +52 -0
  626. package/dist/data/test-runner/FilterFacet.js.map +1 -0
  627. package/dist/data/test-runner/MatrixMarks.cjs +19 -29
  628. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  629. package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
  630. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  631. package/dist/data/test-runner/MatrixMarks.js +19 -29
  632. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  633. package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
  634. package/dist/data/test-runner/TestAttemptDetail.js +1 -1
  635. package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
  636. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  637. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  638. package/dist/data/test-runner/TestDetailPanel.js +11 -0
  639. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  640. package/dist/data/test-runner/TestFilterBar.cjs +3 -44
  641. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  642. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  643. package/dist/data/test-runner/TestFilterBar.js +3 -44
  644. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  645. package/dist/data/test-runner/TestRunner.cjs +3 -1
  646. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  647. package/dist/data/test-runner/TestRunner.d.ts +7 -1
  648. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  649. package/dist/data/test-runner/TestRunner.js +3 -1
  650. package/dist/data/test-runner/TestRunner.js.map +1 -1
  651. package/dist/data/test-runner/context.cjs.map +1 -1
  652. package/dist/data/test-runner/context.d.ts +3 -0
  653. package/dist/data/test-runner/context.d.ts.map +1 -1
  654. package/dist/data/test-runner/context.js.map +1 -1
  655. package/dist/data/test-runner/types.d.ts +2 -0
  656. package/dist/data/test-runner/types.d.ts.map +1 -1
  657. package/dist/data/timeseries-query.cjs +98 -2
  658. package/dist/data/timeseries-query.cjs.map +1 -1
  659. package/dist/data/timeseries-query.d.ts +31 -5
  660. package/dist/data/timeseries-query.d.ts.map +1 -1
  661. package/dist/data/timeseries-query.js +98 -3
  662. package/dist/data/timeseries-query.js.map +1 -1
  663. package/dist/data/timeseries-stream-provider.cjs +38 -0
  664. package/dist/data/timeseries-stream-provider.cjs.map +1 -0
  665. package/dist/data/timeseries-stream-provider.d.ts +26 -0
  666. package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
  667. package/dist/data/timeseries-stream-provider.js +38 -0
  668. package/dist/data/timeseries-stream-provider.js.map +1 -0
  669. package/dist/data/timeseries-stream.cjs +304 -0
  670. package/dist/data/timeseries-stream.cjs.map +1 -0
  671. package/dist/data/timeseries-stream.d.ts +81 -0
  672. package/dist/data/timeseries-stream.d.ts.map +1 -0
  673. package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
  674. package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
  675. package/dist/data/timeseries-stream.js +296 -0
  676. package/dist/data/timeseries-stream.js.map +1 -0
  677. package/dist/data/token-style.cjs +13 -0
  678. package/dist/data/token-style.cjs.map +1 -0
  679. package/dist/data/token-style.d.ts +4 -0
  680. package/dist/data/token-style.d.ts.map +1 -0
  681. package/dist/data/token-style.js +13 -0
  682. package/dist/data/token-style.js.map +1 -0
  683. package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
  684. package/dist/data/traces/ProcessTraceDetail.js +1 -1
  685. package/dist/data/traces/index.d.ts +1 -1
  686. package/dist/data/traces/index.d.ts.map +1 -1
  687. package/dist/data/use-data-table-virtual.d.ts +1 -1
  688. package/dist/data/version-info.cjs +3 -3
  689. package/dist/data/version-info.js +3 -3
  690. package/dist/data/workload-panel/MemoryStack.cjs +49 -0
  691. package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
  692. package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
  693. package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
  694. package/dist/data/workload-panel/MemoryStack.js +48 -0
  695. package/dist/data/workload-panel/MemoryStack.js.map +1 -0
  696. package/dist/data/workload-panel/Metrics.cjs +197 -0
  697. package/dist/data/workload-panel/Metrics.cjs.map +1 -0
  698. package/dist/data/workload-panel/Metrics.d.ts +11 -0
  699. package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
  700. package/dist/data/workload-panel/Metrics.js +196 -0
  701. package/dist/data/workload-panel/Metrics.js.map +1 -0
  702. package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
  703. package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
  704. package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
  705. package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
  706. package/dist/data/workload-panel/WorkloadPanel.js +66 -0
  707. package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
  708. package/dist/data/workload-panel/fixtures.d.ts +60 -0
  709. package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
  710. package/dist/data/workload-panel/model.cjs +137 -0
  711. package/dist/data/workload-panel/model.cjs.map +1 -0
  712. package/dist/data/workload-panel/model.d.ts +53 -0
  713. package/dist/data/workload-panel/model.d.ts.map +1 -0
  714. package/dist/data/workload-panel/model.js +133 -0
  715. package/dist/data/workload-panel/model.js.map +1 -0
  716. package/dist/data/workload-panel/types.d.ts +56 -0
  717. package/dist/data/workload-panel/types.d.ts.map +1 -0
  718. package/dist/data.cjs +57 -6
  719. package/dist/data.d.ts +9 -1
  720. package/dist/data.d.ts.map +1 -1
  721. package/dist/data.js +27 -10
  722. package/dist/file-findings/AnnotatedCode.cjs +243 -0
  723. package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
  724. package/dist/file-findings/AnnotatedCode.d.ts +30 -0
  725. package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
  726. package/dist/file-findings/AnnotatedCode.js +243 -0
  727. package/dist/file-findings/AnnotatedCode.js.map +1 -0
  728. package/dist/file-findings/FileFindingsView.cjs +213 -0
  729. package/dist/file-findings/FileFindingsView.cjs.map +1 -0
  730. package/dist/file-findings/FileFindingsView.d.ts +35 -0
  731. package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
  732. package/dist/file-findings/FileFindingsView.js +213 -0
  733. package/dist/file-findings/FileFindingsView.js.map +1 -0
  734. package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
  735. package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
  736. package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
  737. package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
  738. package/dist/file-findings/LazyAnnotatedCode.js +22 -0
  739. package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
  740. package/dist/file-findings/adapters.cjs +155 -0
  741. package/dist/file-findings/adapters.cjs.map +1 -0
  742. package/dist/file-findings/adapters.d.ts +24 -0
  743. package/dist/file-findings/adapters.d.ts.map +1 -0
  744. package/dist/file-findings/adapters.js +153 -0
  745. package/dist/file-findings/adapters.js.map +1 -0
  746. package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
  747. package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
  748. package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
  749. package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
  750. package/dist/file-findings/file-review/CommentDraft.js +97 -0
  751. package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
  752. package/dist/file-findings/file-review/FileReview.cjs +863 -0
  753. package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
  754. package/dist/file-findings/file-review/FileReview.d.ts +79 -0
  755. package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
  756. package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
  757. package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
  758. package/dist/file-findings/file-review/FileReview.js +863 -0
  759. package/dist/file-findings/file-review/FileReview.js.map +1 -0
  760. package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
  761. package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
  762. package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
  763. package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
  764. package/dist/file-findings/file-review/InlineAuthors.js +77 -0
  765. package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
  766. package/dist/file-findings/file-review/InlineThread.cjs +77 -0
  767. package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
  768. package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
  769. package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
  770. package/dist/file-findings/file-review/InlineThread.js +77 -0
  771. package/dist/file-findings/file-review/InlineThread.js.map +1 -0
  772. package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
  773. package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
  774. package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
  775. package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
  776. package/dist/file-findings/file-review/ProblemsList.js +164 -0
  777. package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
  778. package/dist/file-findings/file-review/SourceView.cjs +179 -0
  779. package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
  780. package/dist/file-findings/file-review/SourceView.d.ts +29 -0
  781. package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
  782. package/dist/file-findings/file-review/SourceView.js +179 -0
  783. package/dist/file-findings/file-review/SourceView.js.map +1 -0
  784. package/dist/file-findings/file-review/blame.cjs +35 -0
  785. package/dist/file-findings/file-review/blame.cjs.map +1 -0
  786. package/dist/file-findings/file-review/blame.d.ts +28 -0
  787. package/dist/file-findings/file-review/blame.d.ts.map +1 -0
  788. package/dist/file-findings/file-review/blame.js +33 -0
  789. package/dist/file-findings/file-review/blame.js.map +1 -0
  790. package/dist/file-findings/file-review/geometry.cjs +101 -0
  791. package/dist/file-findings/file-review/geometry.cjs.map +1 -0
  792. package/dist/file-findings/file-review/geometry.d.ts +45 -0
  793. package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
  794. package/dist/file-findings/file-review/geometry.js +98 -0
  795. package/dist/file-findings/file-review/geometry.js.map +1 -0
  796. package/dist/file-findings/file-review/hooks.cjs +101 -0
  797. package/dist/file-findings/file-review/hooks.cjs.map +1 -0
  798. package/dist/file-findings/file-review/hooks.d.ts +22 -0
  799. package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
  800. package/dist/file-findings/file-review/hooks.js +99 -0
  801. package/dist/file-findings/file-review/hooks.js.map +1 -0
  802. package/dist/file-findings/file-review/marks.cjs +52 -0
  803. package/dist/file-findings/file-review/marks.cjs.map +1 -0
  804. package/dist/file-findings/file-review/marks.d.ts +23 -0
  805. package/dist/file-findings/file-review/marks.d.ts.map +1 -0
  806. package/dist/file-findings/file-review/marks.js +47 -0
  807. package/dist/file-findings/file-review/marks.js.map +1 -0
  808. package/dist/file-findings/file-review/problem-filters.cjs +14 -0
  809. package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
  810. package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
  811. package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
  812. package/dist/file-findings/file-review/problem-filters.js +13 -0
  813. package/dist/file-findings/file-review/problem-filters.js.map +1 -0
  814. package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
  815. package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
  816. package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
  817. package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
  818. package/dist/file-findings/file-review/quote-anchor.js +226 -0
  819. package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
  820. package/dist/file-findings/file-review/source-anchor.cjs +104 -0
  821. package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
  822. package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
  823. package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
  824. package/dist/file-findings/file-review/source-anchor.js +99 -0
  825. package/dist/file-findings/file-review/source-anchor.js.map +1 -0
  826. package/dist/file-findings/file-review/source-marks.cjs +71 -0
  827. package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
  828. package/dist/file-findings/file-review/source-marks.d.ts +27 -0
  829. package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
  830. package/dist/file-findings/file-review/source-marks.js +68 -0
  831. package/dist/file-findings/file-review/source-marks.js.map +1 -0
  832. package/dist/file-findings/findings-comments.cjs +136 -0
  833. package/dist/file-findings/findings-comments.cjs.map +1 -0
  834. package/dist/file-findings/findings-comments.d.ts +28 -0
  835. package/dist/file-findings/findings-comments.d.ts.map +1 -0
  836. package/dist/file-findings/findings-comments.js +131 -0
  837. package/dist/file-findings/findings-comments.js.map +1 -0
  838. package/dist/file-findings/findings-languages.cjs +53 -0
  839. package/dist/file-findings/findings-languages.cjs.map +1 -0
  840. package/dist/file-findings/findings-languages.d.ts +11 -0
  841. package/dist/file-findings/findings-languages.d.ts.map +1 -0
  842. package/dist/file-findings/findings-languages.js +53 -0
  843. package/dist/file-findings/findings-languages.js.map +1 -0
  844. package/dist/file-findings/mdx-source.cjs +48 -0
  845. package/dist/file-findings/mdx-source.cjs.map +1 -0
  846. package/dist/file-findings/mdx-source.d.ts +7 -0
  847. package/dist/file-findings/mdx-source.d.ts.map +1 -0
  848. package/dist/file-findings/mdx-source.js +48 -0
  849. package/dist/file-findings/mdx-source.js.map +1 -0
  850. package/dist/file-findings/monaco-language.cjs +73 -0
  851. package/dist/file-findings/monaco-language.cjs.map +1 -0
  852. package/dist/file-findings/monaco-language.d.ts +11 -0
  853. package/dist/file-findings/monaco-language.d.ts.map +1 -0
  854. package/dist/file-findings/monaco-language.js +72 -0
  855. package/dist/file-findings/monaco-language.js.map +1 -0
  856. package/dist/file-findings/severity-counts.cjs +20 -0
  857. package/dist/file-findings/severity-counts.cjs.map +1 -0
  858. package/dist/file-findings/severity-counts.d.ts +5 -0
  859. package/dist/file-findings/severity-counts.d.ts.map +1 -0
  860. package/dist/file-findings/severity-counts.js +19 -0
  861. package/dist/file-findings/severity-counts.js.map +1 -0
  862. package/dist/file-findings/types.cjs +12 -0
  863. package/dist/file-findings/types.cjs.map +1 -0
  864. package/dist/file-findings/types.d.ts +43 -0
  865. package/dist/file-findings/types.d.ts.map +1 -0
  866. package/dist/file-findings/types.js +11 -0
  867. package/dist/file-findings/types.js.map +1 -0
  868. package/dist/file-findings.cjs +47 -0
  869. package/dist/file-findings.d.ts +15 -0
  870. package/dist/file-findings.d.ts.map +1 -0
  871. package/dist/file-findings.js +15 -0
  872. package/dist/hooks/event-hub.cjs +22 -8
  873. package/dist/hooks/event-hub.cjs.map +1 -1
  874. package/dist/hooks/event-hub.d.ts.map +1 -1
  875. package/dist/hooks/event-hub.js +22 -8
  876. package/dist/hooks/event-hub.js.map +1 -1
  877. package/dist/icons/components/UiBrowser.cjs +51 -0
  878. package/dist/icons/components/UiBrowser.cjs.map +1 -0
  879. package/dist/icons/components/UiBrowser.d.ts +15 -0
  880. package/dist/icons/components/UiBrowser.d.ts.map +1 -0
  881. package/dist/icons/components/UiBrowser.js +48 -0
  882. package/dist/icons/components/UiBrowser.js.map +1 -0
  883. package/dist/icons/components/UiCreditCard.cjs +51 -0
  884. package/dist/icons/components/UiCreditCard.cjs.map +1 -0
  885. package/dist/icons/components/UiCreditCard.d.ts +15 -0
  886. package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
  887. package/dist/icons/components/UiCreditCard.js +48 -0
  888. package/dist/icons/components/UiCreditCard.js.map +1 -0
  889. package/dist/icons/components/UiShoppingCart.cjs +51 -0
  890. package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
  891. package/dist/icons/components/UiShoppingCart.d.ts +15 -0
  892. package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
  893. package/dist/icons/components/UiShoppingCart.js +48 -0
  894. package/dist/icons/components/UiShoppingCart.js.map +1 -0
  895. package/dist/icons/index.d.ts +6 -0
  896. package/dist/icons/index.d.ts.map +1 -1
  897. package/dist/icons/registry.cjs +6 -0
  898. package/dist/icons/registry.cjs.map +1 -1
  899. package/dist/icons/registry.d.ts.map +1 -1
  900. package/dist/icons/registry.js +6 -0
  901. package/dist/icons/registry.js.map +1 -1
  902. package/dist/icons.cjs +9 -0
  903. package/dist/icons.js +4 -1
  904. package/dist/index.cjs +75 -7
  905. package/dist/index.d.ts +1 -0
  906. package/dist/index.d.ts.map +1 -1
  907. package/dist/index.js +35 -12
  908. package/dist/layout/AppShell.cjs +37 -21
  909. package/dist/layout/AppShell.cjs.map +1 -1
  910. package/dist/layout/AppShell.d.ts +13 -2
  911. package/dist/layout/AppShell.d.ts.map +1 -1
  912. package/dist/layout/AppShell.js +37 -21
  913. package/dist/layout/AppShell.js.map +1 -1
  914. package/dist/layout/AppShell.nav.cjs +7 -6
  915. package/dist/layout/AppShell.nav.cjs.map +1 -1
  916. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  917. package/dist/layout/AppShell.nav.js +7 -6
  918. package/dist/layout/AppShell.nav.js.map +1 -1
  919. package/dist/layout/SplitPane.cjs +16 -6
  920. package/dist/layout/SplitPane.cjs.map +1 -1
  921. package/dist/layout/SplitPane.d.ts +12 -2
  922. package/dist/layout/SplitPane.d.ts.map +1 -1
  923. package/dist/layout/SplitPane.js +16 -6
  924. package/dist/layout/SplitPane.js.map +1 -1
  925. package/dist/layout/Workspace.cjs +37 -33
  926. package/dist/layout/Workspace.cjs.map +1 -1
  927. package/dist/layout/Workspace.d.ts.map +1 -1
  928. package/dist/layout/Workspace.js +37 -33
  929. package/dist/layout/Workspace.js.map +1 -1
  930. package/dist/layout/Workspace.regions.cjs +3 -3
  931. package/dist/layout/Workspace.regions.cjs.map +1 -1
  932. package/dist/layout/Workspace.regions.js +3 -3
  933. package/dist/layout/Workspace.regions.js.map +1 -1
  934. package/dist/lib/breakpoints.cjs +102 -0
  935. package/dist/lib/breakpoints.cjs.map +1 -0
  936. package/dist/lib/breakpoints.d.ts +36 -0
  937. package/dist/lib/breakpoints.d.ts.map +1 -0
  938. package/dist/lib/breakpoints.js +99 -0
  939. package/dist/lib/breakpoints.js.map +1 -0
  940. package/dist/lib/combobox.cjs +2 -1
  941. package/dist/lib/combobox.cjs.map +1 -1
  942. package/dist/lib/combobox.d.ts +1 -1
  943. package/dist/lib/combobox.d.ts.map +1 -1
  944. package/dist/lib/combobox.js +2 -1
  945. package/dist/lib/combobox.js.map +1 -1
  946. package/dist/lib/path-tree.cjs +21 -0
  947. package/dist/lib/path-tree.cjs.map +1 -1
  948. package/dist/lib/path-tree.d.ts +15 -0
  949. package/dist/lib/path-tree.d.ts.map +1 -1
  950. package/dist/lib/path-tree.js +21 -1
  951. package/dist/lib/path-tree.js.map +1 -1
  952. package/dist/overlay/Modal.cjs +2 -1
  953. package/dist/overlay/Modal.cjs.map +1 -1
  954. package/dist/overlay/Modal.d.ts.map +1 -1
  955. package/dist/overlay/Modal.js +2 -1
  956. package/dist/overlay/Modal.js.map +1 -1
  957. package/dist/overlay/dropdownMenuContext.d.ts +1 -1
  958. package/dist/profiles/editor/profileEditor.cjs +1 -1
  959. package/dist/profiles/editor/profileEditor.cjs.map +1 -1
  960. package/dist/profiles/editor/profileEditor.js +1 -1
  961. package/dist/profiles/editor/profileEditor.js.map +1 -1
  962. package/dist/profiles/editor/profileEditorSections.cjs +2 -2
  963. package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
  964. package/dist/profiles/editor/profileEditorSections.js +2 -2
  965. package/dist/profiles/editor/profileEditorSections.js.map +1 -1
  966. package/dist/profiles/query/prometheusResults.cjs +24 -36
  967. package/dist/profiles/query/prometheusResults.cjs.map +1 -1
  968. package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
  969. package/dist/profiles/query/prometheusResults.js +24 -36
  970. package/dist/profiles/query/prometheusResults.js.map +1 -1
  971. package/dist/rpc/CommandForm.cjs +1 -1
  972. package/dist/rpc/CommandForm.cjs.map +1 -1
  973. package/dist/rpc/CommandForm.js +1 -1
  974. package/dist/rpc/CommandForm.js.map +1 -1
  975. package/dist/rpc/classify.cjs +1 -1
  976. package/dist/rpc/classify.cjs.map +1 -1
  977. package/dist/rpc/classify.d.ts.map +1 -1
  978. package/dist/rpc/classify.js +1 -1
  979. package/dist/rpc/classify.js.map +1 -1
  980. package/dist/rpc/useOperations.d.ts +24 -24
  981. package/dist/rpc.cjs +0 -2
  982. package/dist/rpc.d.ts +0 -1
  983. package/dist/rpc.d.ts.map +1 -1
  984. package/dist/rpc.js +1 -2
  985. package/dist/styles.css +1 -1
  986. package/dist/utils.cjs +6 -0
  987. package/dist/utils.d.ts +2 -1
  988. package/dist/utils.d.ts.map +1 -1
  989. package/dist/utils.js +3 -2
  990. package/package.json +9 -3
  991. package/schemas/json-schema-form.schema.json +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.cjs","names":["useState","NavSections","cn","AppShellSlotOutlines","Icon","UiSidebar","UiMenu","_Fragment","contentWidthClassName","SplitPane","UiClose"],"sources":["../../src/layout/AppShell.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiClose, UiMenu, UiSidebar } from \"../icons\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections, type GroupState } from \"./AppShell.nav\";\nimport type { AppShellNavDrag } from \"./AppShell.nav.drag\";\nimport { contentWidthClassName, type ContentWidth } from \"./content-width\";\n\n// AppShell is a sidebar-first application shell. The full-height DARK nav rail\n// owns the brand + collapse toggle and renders grouped nav sections; the top bar\n// (search, actions) sits to the RIGHT of the rail — there is no full-width top\n// bar when a rail is present. With no rail, the top bar spans full width. The\n// body carries a fixed bodyHeader + bodyActions row over an optional\n// bodySidebar | body-main split (body-main scrolls; bodySidebar — e.g. a tree —\n// scrolls independently via a resizable SplitPane).\n\nexport type AppShellNavItem = {\n /** Additional searchable text for a tree destination. */\n searchText?: string;\n /** Stable key; also the React key. */\n key: string;\n /** Visible label (hidden when the rail is collapsed). */\n label: ReactNode;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Highlights the item as the current location. */\n active?: boolean;\n /** Routing destination; rendered as an anchor via the RouterAdapter. */\n to: string;\n /** Opens `to` in a new tab. */\n external?: boolean;\n /** Trailing adornment (count, status dot). */\n badge?: ReactNode;\n /** Actions opened by right-click, the Context Menu key, or Shift+F10. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n};\n\nexport type AppShellNavGroup = {\n /** Stable key; also the key its collapsed state persists under. */\n key: string;\n /** Group heading rendered on the toggle row. */\n label: string;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Trailing adornment (aggregate count, status dot). */\n badge?: ReactNode;\n /** Actions opened from the group heading's context menu. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n /** Folded on first render until the user toggles it. */\n defaultCollapsed?: boolean;\n /**\n * Keeps the group open regardless of stored state, so a deep-linked\n * destination can never hide under a folder the user collapsed earlier.\n * Set it on the active item's ancestors.\n */\n forceExpanded?: boolean;\n items: AppShellNavItem[];\n /**\n * Nested sub-groups, rendered after `items` at one further indent. Groups\n * nest arbitrarily, so a backend hierarchy deeper than two levels does not\n * have to be flattened to fit the rail.\n */\n groups?: AppShellNavGroup[];\n /**\n * Makes the group's own heading row a destination as well as a disclosure:\n * the label becomes a nav link and the chevron sits beside it as a separate\n * control. Needed wherever a node is both a folder and a leaf — e.g. a\n * profile named `jms` that is runnable *and* the parent of `jms.incoming`.\n */\n item?: AppShellNavItem;\n};\n\nexport type AppShellNavSection = {\n /** Show a loading message instead of an empty tree while data is being fetched. */\n loading?: boolean;\n /** Optional controlled search for tree navigation. */\n search?: { value: string; onChange: (value: string) => void; label?: string };\n /** Section heading; collapses to a divider when the rail is collapsed. */\n label?: string;\n items?: AppShellNavItem[];\n /** Collapsible groups rendered after the flat items. High-cardinality\n * clusters (provider surfaces, per-ledger journals) belong here so they can\n * be folded away; a collapsed rail flattens them back to plain items. */\n groups?: AppShellNavGroup[];\n /**\n * How the groups read.\n *\n * `\"list\"` (the default) styles each group heading as a small uppercase\n * cluster label — right for a handful of named clusters under one section.\n *\n * `\"tree\"` styles headings as ordinary nav rows, because in a tree a folder\n * sits at the same level as its sibling destinations: a group carrying an\n * `item` renders as a link either way, so an uppercase heading beside it\n * would make two nodes of the same kind look like different things.\n */\n variant?: \"list\" | \"tree\";\n /**\n * Makes the section's rows draggable onto one another, so a hierarchy can be\n * rearranged in place. The section stays the boundary — a row never lands in\n * a different section — and the consumer owns what a move means. Ignored\n * while the rail is collapsed, where there are no folder rows to aim at.\n */\n drag?: AppShellNavDrag;\n};\n\nexport type AppShellProps = {\n // ── Top bar (right of the rail; full width when no rail) ─\n /** Brand mark / wordmark. Shown in the rail header when a rail is present, else in the top bar. */\n brand?: ReactNode;\n /** Inline primary nav (e.g. tabs) shown after the brand in the top bar. */\n nav?: ReactNode;\n /** Centered search slot; grows to fill and is width-capped. */\n search?: ReactNode;\n /** Right-aligned cluster (icon buttons, settings/org picker, …). */\n actions?: ReactNode;\n /** Compact action cluster used in the mobile header. Defaults to `actions`. */\n mobileActions?: ReactNode;\n /** Optional second top-bar row for filters / bulk actions. */\n toolbar?: ReactNode;\n /** Max width of the centered search slot. Defaults to 28rem. */\n searchMaxWidth?: string | number;\n\n // ── Left nav rail (dark, collapsible, fixed width) ───────\n /** Declarative nav sections rendered into the rail (collapse-aware). */\n navSections?: AppShellNavSection[];\n /** Custom sidebar content; receives the collapsed flag. Overrides navSections. */\n sidebar?: ReactNode | ((collapsed: boolean) => ReactNode);\n /** Pinned below the rail header (e.g. a context switcher). */\n sidebarHeader?: ReactNode;\n /** Pinned to the bottom of the rail (version, account). */\n sidebarFooter?: ReactNode;\n /** Show the collapse toggle. Defaults to true when a rail is present. */\n collapsible?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** localStorage key persisting the collapsed state. */\n collapsedStorageKey?: string;\n /** localStorage key persisting per-group collapsed state. */\n groupCollapsedStorageKey?: string;\n /** Expanded rail width in px. Defaults to 240. */\n sidebarWidth?: number;\n /** Collapsed rail width in px. Defaults to 56. */\n collapsedWidth?: number;\n /** Accessible label for the mobile navigation drawer. Defaults to \"Navigation\". */\n mobileSidebarLabel?: string;\n\n // ── Body ─────────────────────────────────────────────────\n /** Fixed header row, left side (breadcrumb, title, tabs). */\n bodyHeader?: ReactNode;\n /** Fixed header row, right side (entity actions) — same row as bodyHeader. */\n bodyActions?: ReactNode;\n /** Optional independent-scroll pane (e.g. a tree). Renders a SplitPane vs body-main. */\n bodySidebar?: ReactNode;\n /** bodySidebar width as a percent when present. Defaults to 24. */\n bodySplit?: number;\n /** Main content (body-main); fills the remaining space and scrolls. */\n children: ReactNode;\n /** Centers content at responsive wide breakpoints, or allows it to fill the workspace. */\n contentWidth?: ContentWidth;\n\n /**\n * Outlines every slot in its own colour and labels it with its `data-slot`\n * name — a layout-debugging aid for working out which region owns a given\n * area or scrollbar. Uses `outline`, so enabling it does not shift layout.\n */\n debugSlots?: boolean;\n\n className?: string;\n headerClassName?: string;\n toolbarClassName?: string;\n sidebarClassName?: string;\n bodyHeaderClassName?: string;\n contentClassName?: string;\n};\n\nfunction readStored(key: string | undefined): string | null {\n if (!key || typeof window === \"undefined\") return null;\n return window.localStorage.getItem(key);\n}\n\nconst DEFAULT_GROUP_COLLAPSE_KEY = \"clicky-ui:app-shell:groups\";\n\nfunction readGroupState(storageKey: string): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n}\n\n// Lives here rather than in AppShell.nav so a single instance can be shared by\n// both NavSections renders (rail + mobile drawer).\nfunction useGroupCollapsed(storageKey: string): GroupState {\n const [state, setState] = useState<Record<string, boolean>>(() =>\n readGroupState(storageKey),\n );\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch {\n // Rail state is a UX nicety; private-mode storage failures are safe to swallow.\n }\n }, [state, storageKey]);\n return {\n isCollapsed: (key, fallback) => state[key] ?? fallback,\n toggle: (key, fallback) =>\n setState((prev) => ({ ...prev, [key]: !(prev[key] ?? fallback) })),\n };\n}\n\nexport function AppShell(props: AppShellProps) {\n const {\n brand,\n nav,\n search,\n actions,\n mobileActions,\n toolbar,\n searchMaxWidth = \"28rem\",\n navSections,\n sidebar,\n sidebarHeader,\n sidebarFooter,\n collapsible = true,\n defaultCollapsed = false,\n collapsedStorageKey,\n groupCollapsedStorageKey,\n sidebarWidth = 240,\n collapsedWidth = 56,\n mobileSidebarLabel = \"Navigation\",\n bodyHeader,\n bodyActions,\n bodySidebar,\n bodySplit = 24,\n children,\n contentWidth = \"contained\",\n debugSlots = false,\n className,\n headerClassName,\n toolbarClassName,\n sidebarClassName,\n bodyHeaderClassName,\n contentClassName,\n } = props;\n\n const hasSidebar = sidebar !== undefined || (navSections?.length ?? 0) > 0;\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n const [collapsed, setCollapsed] = useState(\n () =>\n readStored(collapsedStorageKey) === \"true\" ||\n (readStored(collapsedStorageKey) === null && defaultCollapsed),\n );\n\n useEffect(() => {\n if (collapsedStorageKey && typeof window !== \"undefined\")\n window.localStorage.setItem(collapsedStorageKey, String(collapsed));\n }, [collapsed, collapsedStorageKey]);\n\n useEscapeLayer(mobileSidebarOpen, () => setMobileSidebarOpen(false));\n\n // One instance for the rail AND the mobile drawer: both render NavSections,\n // and per-render state behind a shared storage key would desync.\n const groupState = useGroupCollapsed(\n groupCollapsedStorageKey ?? DEFAULT_GROUP_COLLAPSE_KEY,\n );\n\n const railWidth = collapsed ? collapsedWidth : sidebarWidth;\n const hasTopBar =\n (!hasSidebar && brand !== undefined) ||\n nav !== undefined ||\n search !== undefined ||\n actions !== undefined ||\n mobileActions !== undefined ||\n toolbar !== undefined;\n const hasMobileHeader = hasSidebar;\n const hasBodyHeader = bodyHeader !== undefined || bodyActions !== undefined;\n const effectiveContentWidth =\n bodySidebar === undefined ? contentWidth : \"full\";\n const renderSidebarContent = (\n collapsedValue: boolean,\n onNavigate?: () => void,\n ) =>\n typeof sidebar === \"function\"\n ? sidebar(collapsedValue)\n : sidebar !== undefined\n ? sidebar\n : navSections && (\n <NavSections\n sections={navSections}\n collapsed={collapsedValue}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n );\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 w-full bg-background\", className)}\n {...(debugSlots ? { \"data-debug-slots\": \"true\" } : {})}\n >\n {debugSlots && <AppShellSlotOutlines />}\n {hasSidebar && (\n <aside\n data-slot=\"app-shell-sidebar\"\n data-collapsed={collapsed}\n style={{ width: railWidth }}\n className={cn(\n \"hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 md:flex\",\n sidebarClassName,\n )}\n >\n <div\n className={cn(\n \"flex h-14 shrink-0 items-center border-b border-sidebar-border\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-density-3\",\n )}\n >\n {!collapsed && brand && (\n <div\n data-slot=\"app-shell-brand\"\n className=\"flex min-w-0 items-center gap-2\"\n >\n {brand}\n </div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n <Icon icon={UiSidebar} className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {sidebarHeader && (\n <div\n data-slot=\"app-shell-sidebar-header\"\n className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(collapsed)}\n </div>\n {sidebarFooter && (\n <div\n data-slot=\"app-shell-sidebar-footer\"\n className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarFooter}\n </div>\n )}\n </aside>\n )}\n\n <div\n data-slot=\"app-shell-column\"\n className=\"@container/app-content flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n {(hasTopBar || hasMobileHeader) && (\n <header\n data-slot=\"app-shell-header\"\n className=\"shrink-0 border-b border-border bg-card\"\n >\n <div\n className={cn(\n hasSidebar\n ? \"flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 md:h-14 md:flex-nowrap md:gap-density-3 md:px-density-4 md:py-0\"\n : // Wraps rather than squeezing. The nav shrinks and the\n // actions cluster does not, so on a laptop a full actions\n // row left the nav a sliver — every tab but the first\n // scrolled out of sight. A second line costs 44px and only\n // appears when the row genuinely cannot fit.\n \"flex min-h-14 flex-wrap items-center gap-density-3 px-density-4\",\n headerClassName,\n )}\n >\n {hasSidebar && (\n <button\n type=\"button\"\n aria-label={`Open ${mobileSidebarLabel}`}\n title={mobileSidebarLabel}\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent md:hidden\"\n onClick={() => setMobileSidebarOpen(true)}\n >\n <Icon icon={UiMenu} className=\"h-4 w-4\" />\n </button>\n )}\n {brand && (\n <div\n data-slot=\"app-shell-brand\"\n className={cn(\n \"min-w-0 items-center gap-density-2\",\n hasSidebar ? \"flex flex-1 md:hidden\" : \"flex shrink-0\",\n )}\n >\n {brand}\n </div>\n )}\n {nav && (\n <div\n data-slot=\"app-shell-nav\"\n className={cn(\n // The nav is the only header slot that both shrinks\n // (min-w-0) and holds wide content, while the actions\n // cluster beside it is shrink-0. Give a full actions row\n // and this box collapses to a sliver — so it needs a guard,\n // or its tabs paint straight over the toolbar next to it\n // and both become unreadable. Scrolling keeps every tab\n // reachable; overflowing keeps none of them.\n \"flex min-w-0 items-center overflow-x-auto\",\n hasSidebar && \"order-3 basis-full md:order-none md:basis-auto\",\n )}\n >\n {nav}\n </div>\n )}\n {search !== undefined && (\n <div\n data-slot=\"app-shell-search\"\n className={cn(\n \"flex min-w-0 flex-1 justify-center\",\n hasSidebar &&\n \"order-2 basis-full md:order-none md:basis-auto md:flex-1\",\n )}\n >\n <div className=\"w-full\" style={{ maxWidth: searchMaxWidth }}>\n {search}\n </div>\n </div>\n )}\n {search === undefined && (\n <div\n className={cn(\"flex-1\", hasSidebar && \"hidden md:block\")}\n />\n )}\n {(actions !== undefined ||\n (hasSidebar && mobileActions !== undefined)) && (\n <div\n data-slot=\"app-shell-actions\"\n className={cn(\n \"flex shrink-0 items-center gap-density-2\",\n // Below md the cluster must never be wider than the\n // phone: a shrink-0 row that overflows widens the layout\n // viewport, and then every fixed overlay on the page\n // loses its right edge. Let it shrink and scroll its own\n // contents instead, the same guard the nav slot has.\n \"max-md:min-w-0 max-md:max-w-full max-md:shrink max-md:overflow-x-auto\",\n hasSidebar && \"order-1 ml-auto md:order-none md:ml-0\",\n )}\n >\n {!hasSidebar || mobileActions === undefined ? (\n actions\n ) : (\n <>\n <div className=\"hidden items-center gap-density-2 md:flex\">\n {actions}\n </div>\n <div className=\"flex items-center gap-density-2 md:hidden\">\n {mobileActions}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n {toolbar && (\n <div\n data-slot=\"app-shell-toolbar\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 md:px-density-4\",\n toolbarClassName,\n )}\n >\n {toolbar}\n </div>\n )}\n </header>\n )}\n\n {hasBodyHeader && (\n <div\n data-slot=\"app-shell-body-header\"\n className={cn(\n \"shrink-0 border-b border-border bg-card\",\n bodyHeaderClassName,\n )}\n >\n <div\n data-slot=\"app-shell-body-header-content\"\n data-content-width={effectiveContentWidth}\n className={cn(\n \"flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 md:flex-row md:items-start md:justify-between md:gap-density-3 md:px-density-4\",\n contentWidthClassName(effectiveContentWidth),\n )}\n >\n <div className=\"min-w-0 flex-1\">{bodyHeader}</div>\n {bodyActions && (\n <div\n data-slot=\"app-shell-body-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-density-2\"\n >\n {bodyActions}\n </div>\n )}\n </div>\n </div>\n )}\n\n {bodySidebar !== undefined ? (\n <SplitPane\n stackOnMobile\n className=\"min-h-0 flex-1\"\n defaultSplit={bodySplit}\n minLeft={12}\n minRight={30}\n left={\n <div data-slot=\"app-shell-body-sidebar\" className=\"h-full\">\n {bodySidebar}\n </div>\n }\n right={\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"h-full min-h-0 min-w-0 overflow-auto\",\n contentClassName,\n )}\n >\n {children}\n </main>\n }\n leftClass=\"max-h-[40vh] shrink-0 border-b border-border md:max-h-none md:border-b-0\"\n rightClass=\"min-h-0 flex-1 md:flex-none\"\n />\n ) : (\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n <div\n data-slot=\"app-shell-content\"\n data-content-width={contentWidth}\n className={cn(contentWidthClassName(contentWidth), \"h-full\")}\n >\n {children}\n </div>\n </main>\n )}\n </div>\n {hasSidebar && mobileSidebarOpen && (\n <div\n className=\"fixed inset-0 z-50 md:hidden\"\n role=\"presentation\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={mobileSidebarLabel}\n className={cn(\n \"relative z-10 flex h-full w-[min(20rem,85vw)] flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl\",\n sidebarClassName,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between border-b border-sidebar-border px-density-3\">\n {brand && (\n <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>\n )}\n <button\n type=\"button\"\n aria-label={`Close ${mobileSidebarLabel}`}\n title=\"Close\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <Icon icon={UiClose} className=\"h-4 w-4\" />\n </button>\n </div>\n {sidebarHeader && (\n <div className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\">\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(false, () => setMobileSidebarOpen(false))}\n </div>\n {sidebarFooter && (\n <div className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\">\n {sidebarFooter}\n </div>\n )}\n </aside>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAuLA,SAAS,WAAW,KAAwC;CAC1D,IAAI,CAAC,OAAO,OAAO,WAAW,aAAa,OAAO;CAClD,OAAO,OAAO,aAAa,QAAQ,GAAG;AACxC;AAEA,IAAM,6BAA6B;AAEnC,SAAS,eAAe,YAA6C;CACnE,IAAI,OAAO,WAAW,aAAa,OAAO,CAAC;CAC3C,IAAI;EACF,MAAM,MAAM,OAAO,aAAa,QAAQ,UAAU;EAClD,IAAI,CAAC,KAAK,OAAO,CAAC;EAClB,MAAM,SAAS,KAAK,MAAM,GAAG;EAC7B,OAAO,UAAU,OAAO,WAAW,WAC9B,SACD,CAAC;CACP,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAIA,SAAS,kBAAkB,YAAgC;CACzD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,OACxB,eAAe,UAAU,CAC3B;CACA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,OAAO,WAAW,aAAa;EACnC,IAAI;GACF,OAAO,aAAa,QAAQ,YAAY,KAAK,UAAU,KAAK,CAAC;EAC/D,QAAQ,CAER;CACF,GAAG,CAAC,OAAO,UAAU,CAAC;CACtB,OAAO;EACL,cAAc,KAAK,aAAa,MAAM,QAAQ;EAC9C,SAAS,KAAK,aACZ,UAAU,UAAU;GAAE,GAAG;IAAO,MAAM,EAAE,KAAK,QAAQ;EAAU,EAAE;CACrE;AACF;AAEA,SAAgB,SAAS,OAAsB;CAC7C,MAAM,EACJ,OACA,KACA,QACA,SACA,eACA,SACA,iBAAiB,SACjB,aACA,SACA,eACA,eACA,cAAc,MACd,mBAAmB,OACnB,qBACA,0BACA,eAAe,KACf,iBAAiB,IACjB,qBAAqB,cACrB,YACA,aACA,aACA,YAAY,IACZ,UACA,eAAe,aACf,aAAa,OACb,WACA,iBACA,kBACA,kBACA,qBACA,qBACE;CAEJ,MAAM,aAAa,YAAY,KAAA,MAAc,aAAa,UAAU,KAAK;CACzE,MAAM,CAAC,mBAAmB,yBAAA,GAAwBA,MAAAA,SAAAA,CAAS,KAAK;CAEhE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,OAE9B,WAAW,mBAAmB,MAAM,UACnC,WAAW,mBAAmB,MAAM,QAAQ,gBACjD;CAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,uBAAuB,OAAO,WAAW,aAC3C,OAAO,aAAa,QAAQ,qBAAqB,OAAO,SAAS,CAAC;CACtE,GAAG,CAAC,WAAW,mBAAmB,CAAC;CAEnC,mBAAA,eAAe,yBAAyB,qBAAqB,KAAK,CAAC;CAInE,MAAM,aAAa,kBACjB,4BAA4B,0BAC9B;CAEA,MAAM,YAAY,YAAY,iBAAiB;CAC/C,MAAM,YACH,CAAC,cAAc,UAAU,KAAA,KAC1B,QAAQ,KAAA,KACR,WAAW,KAAA,KACX,YAAY,KAAA,KACZ,kBAAkB,KAAA,KAClB,YAAY,KAAA;CACd,MAAM,kBAAkB;CACxB,MAAM,gBAAgB,eAAe,KAAA,KAAa,gBAAgB,KAAA;CAClE,MAAM,wBACJ,gBAAgB,KAAA,IAAY,eAAe;CAC7C,MAAM,wBACJ,gBACA,eAEA,OAAO,YAAY,aACf,QAAQ,cAAc,IACtB,YAAY,KAAA,IACV,UACA,eACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,qBAAAA,aAAD;EACE,UAAU;EACV,WAAW;EACC;EACZ,GAAK,aAAa,EAAE,WAAW,IAAI,CAAC;CACrC,CAAA;CAGX,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,WAAWC,cAAAA,GAAG,4CAA4C,SAAS;EACnE,GAAK,aAAa,EAAE,oBAAoB,OAAO,IAAI,CAAC;EAFtD,UAAA;GAIG,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,sBAAD,CAAuB,CAAA;GACrC,cACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IACE,aAAU;IACV,kBAAgB;IAChB,OAAO,EAAE,OAAO,UAAU;IAC1B,WAAWD,cAAAA,GACT,sJACA,gBACF;IAPF,UAAA;KASE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,WAAWA,cAAAA,GACT,kEACA,YACI,wBACA,8BACN;MANF,UAAA,CAQG,CAAC,aAAa,SACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OACE,aAAU;OACV,WAAU;OAET,UAAA;MACE,CAAA,GAEN,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,MAAK;OACL,eAAe,cAAc,MAAM,CAAC,CAAC;OACrC,cAAY,YAAY,mBAAmB;OAC3C,OAAO,YAAY,mBAAmB;OACtC,WAAU;OAEV,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,aAAAA,MAAD;QAAM,MAAMC,kBAAAA;QAAW,WAAU;OAAW,CAAA;MACtC,CAAA,CAEP;;KACJ,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MACE,aAAU;MACV,WAAU;MAET,UAAA;KACE,CAAA;KAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAU;MACZ,UAAA,qBAAqB,SAAS;KAC5B,CAAA;KACJ,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MACE,aAAU;MACV,WAAU;MAET,UAAA;KACE,CAAA;IAEF;;GAGT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,aAAU;IACV,WAAU;IAFZ,UAAA;MAII,aAAa,oBACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MACE,aAAU;MACV,WAAU;MAFZ,UAAA,CAIE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OACE,WAAWH,cAAAA,GACT,aACI,wIAMA,mEACJ,eACF;OAXF,UAAA;QAaG,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,cAAY,QAAQ;SACpB,OAAO;SACP,WAAU;SACV,eAAe,qBAAqB,IAAI;SAExC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,aAAAA,MAAD;UAAM,MAAME,eAAAA;UAAQ,WAAU;SAAW,CAAA;QACnC,CAAA;QAET,SACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SACE,aAAU;SACV,WAAWJ,cAAAA,GACT,sCACA,aAAa,0BAA0B,eACzC;SAEC,UAAA;QACE,CAAA;QAEN,OACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SACE,aAAU;SACV,WAAWA,cAAAA,GAQT,6CACA,cAAc,gDAChB;SAEC,UAAA;QACE,CAAA;QAEN,WAAW,KAAA,KACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SACE,aAAU;SACV,WAAWA,cAAAA,GACT,sCACA,cACE,0DACJ;SAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAU;UAAS,OAAO,EAAE,UAAU,eAAe;UACvD,UAAA;SACE,CAAA;QACF,CAAA;QAEN,WAAW,KAAA,KACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EACE,WAAWA,cAAAA,GAAG,UAAU,cAAc,iBAAiB,EACxD,CAAA;SAED,YAAY,KAAA,KACX,cAAc,kBAAkB,KAAA,MACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SACE,aAAU;SACV,WAAWA,cAAAA,GACT,4CAMA,yEACA,cAAc,uCAChB;SAEC,UAAA,CAAC,cAAc,kBAAkB,KAAA,IAChC,UAEA,iBAAA,GAAA,kBAAA,KAAA,CAAAK,kBAAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAU;UACZ,UAAA;SACE,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAU;UACZ,UAAA;SACE,CAAA,CACL,EAAA,CAAA;QAED,CAAA;OAEJ;MACJ,CAAA,GAAA,WACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OACE,aAAU;OACV,WAAWL,cAAAA,GACT,uHACA,gBACF;OAEC,UAAA;MACE,CAAA,CAED;;KAGT,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MACE,aAAU;MACV,WAAWA,cAAAA,GACT,2CACA,mBACF;MAEA,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OACE,aAAU;OACV,sBAAoB;OACpB,WAAWA,cAAAA,GACT,sJACAM,sBAAAA,sBAAsB,qBAAqB,CAC7C;OANF,UAAA,CAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAkB,UAAA;OAAgB,CAAA,GAChD,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QACE,aAAU;QACV,WAAU;QAET,UAAA;OACE,CAAA,CAEJ;;KACF,CAAA;KAGN,gBAAgB,KAAA,IACf,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,WAAD;MACE,eAAA;MACA,WAAU;MACV,cAAc;MACd,SAAS;MACT,UAAU;MACV,MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,aAAU;OAAyB,WAAU;OAC/C,UAAA;MACE,CAAA;MAEP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OACE,aAAU;OACV,WAAWP,cAAAA,GACT,wCACA,gBACF;OAEC;MACG,CAAA;MAER,WAAU;MACV,YAAW;KACZ,CAAA,IAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MACE,aAAU;MACV,WAAWA,cAAAA,GACT,wCACA,gBACF;MAEA,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OACE,aAAU;OACV,sBAAoB;OACpB,WAAWA,cAAAA,GAAGM,sBAAAA,sBAAsB,YAAY,GAAG,QAAQ;OAE1D;MACE,CAAA;KACD,CAAA;IAEL;;GACJ,cAAc,qBACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,eAAe,qBAAqB,KAAK;IAH3C,UAAA,CAKE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,GAC/C,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;KACE,MAAK;KACL,cAAW;KACX,cAAY;KACZ,WAAWN,cAAAA,GACT,sJACA,gBACF;KACA,UAAU,UAAU,MAAM,gBAAgB;KAR5C,UAAA;MAUE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACG,SACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAU;QAAmC,UAAA;OAAW,CAAA,GAE/D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,cAAY,SAAS;QACrB,OAAM;QACN,WAAU;QACV,eAAe,qBAAqB,KAAK;QAEzC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,aAAAA,MAAD;SAAM,MAAMM,gBAAAA;SAAS,WAAU;QAAW,CAAA;OACpC,CAAA,CACL;;MACJ,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OACZ,UAAA;MACE,CAAA;MAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OACZ,UAAA,qBAAqB,aAAa,qBAAqB,KAAK,CAAC;MAC3D,CAAA;MACJ,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAU;OACZ,UAAA;MACE,CAAA;KAEF;IACJ,CAAA,CAAA;;EAEJ;;AAET"}
1
+ {"version":3,"file":"AppShell.cjs","names":["useState","NavSections","cn","AppShellSlotOutlines","Icon","UiSidebar","UiMenu","_Fragment","contentWidthClassName","SplitPane","UiArrowLeft","UiClose"],"sources":["../../src/layout/AppShell.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiArrowLeft, UiClose, UiMenu, UiSidebar } from \"../icons\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections, type GroupState } from \"./AppShell.nav\";\nimport type { AppShellNavDrag } from \"./AppShell.nav.drag\";\nimport { contentWidthClassName, type ContentWidth } from \"./content-width\";\n\n// AppShell is a sidebar-first application shell. The full-height DARK nav rail\n// owns the brand + collapse toggle and renders grouped nav sections; the top bar\n// (search, actions) sits to the RIGHT of the rail — there is no full-width top\n// bar when a rail is present. With no rail, the top bar spans full width. The\n// body carries a fixed bodyHeader + bodyActions row over an optional\n// bodySidebar | body-main split (body-main scrolls; bodySidebar — e.g. a tree —\n// scrolls independently via a resizable SplitPane).\n\nexport type AppShellNavItem = {\n /** Additional searchable text for a tree destination. */\n searchText?: string;\n /** Stable key; also the React key. */\n key: string;\n /** Visible label (hidden when the rail is collapsed). */\n label: ReactNode;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Highlights the item as the current location. */\n active?: boolean;\n /** Routing destination; rendered as an anchor via the RouterAdapter. */\n to: string;\n /** Opens `to` in a new tab. */\n external?: boolean;\n /** Trailing adornment (count, status dot). */\n badge?: ReactNode;\n /** Actions opened by right-click, the Context Menu key, or Shift+F10. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n};\n\nexport type AppShellNavGroup = {\n /** Stable key; also the key its collapsed state persists under. */\n key: string;\n /** Group heading rendered on the toggle row. */\n label: string;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Trailing adornment (aggregate count, status dot). */\n badge?: ReactNode;\n /** Actions opened from the group heading's context menu. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n /** Folded on first render until the user toggles it. */\n defaultCollapsed?: boolean;\n /**\n * Keeps the group open regardless of stored state, so a deep-linked\n * destination can never hide under a folder the user collapsed earlier.\n * Set it on the active item's ancestors.\n */\n forceExpanded?: boolean;\n items: AppShellNavItem[];\n /**\n * Nested sub-groups, rendered after `items` at one further indent. Groups\n * nest arbitrarily, so a backend hierarchy deeper than two levels does not\n * have to be flattened to fit the rail.\n */\n groups?: AppShellNavGroup[];\n /**\n * Makes the group's own heading row a destination as well as a disclosure:\n * the label becomes a nav link and the chevron sits beside it as a separate\n * control. Needed wherever a node is both a folder and a leaf — e.g. a\n * profile named `jms` that is runnable *and* the parent of `jms.incoming`.\n */\n item?: AppShellNavItem;\n};\n\nexport type AppShellNavSection = {\n /** Show a loading message instead of an empty tree while data is being fetched. */\n loading?: boolean;\n /** Optional controlled search for tree navigation. */\n search?: { value: string; onChange: (value: string) => void; label?: string };\n /** Section heading; collapses to a divider when the rail is collapsed. */\n label?: string;\n items?: AppShellNavItem[];\n /** Collapsible groups rendered after the flat items. High-cardinality\n * clusters (provider surfaces, per-ledger journals) belong here so they can\n * be folded away; a collapsed rail flattens them back to plain items. */\n groups?: AppShellNavGroup[];\n /**\n * How the groups read.\n *\n * `\"list\"` (the default) renders groups as navigation rows with a trailing\n * disclosure and indented children. Section labels provide the cluster headings.\n *\n * `\"tree\"` styles headings as ordinary nav rows, because in a tree a folder\n * sits at the same level as its sibling destinations: a group carrying an\n * `item` renders as a link either way, so an uppercase heading beside it\n * would make two nodes of the same kind look like different things.\n */\n variant?: \"list\" | \"tree\";\n /**\n * Makes the section's rows draggable onto one another, so a hierarchy can be\n * rearranged in place. The section stays the boundary — a row never lands in\n * a different section — and the consumer owns what a move means. Ignored\n * while the rail is collapsed, where there are no folder rows to aim at.\n */\n drag?: AppShellNavDrag;\n};\n\nexport type AppShellProps = {\n // ── Top bar (right of the rail; full width when no rail) ─\n /** Brand mark / wordmark. Shown in the rail header when a rail is present, else in the top bar. */\n brand?: ReactNode;\n /** Inline primary nav (e.g. tabs) shown after the brand in the top bar. */\n nav?: ReactNode;\n /** Centered search slot; grows to fill and is width-capped. */\n search?: ReactNode;\n /** Right-aligned cluster (icon buttons, settings/org picker, …). */\n actions?: ReactNode;\n /** Compact action cluster used in the mobile header. Defaults to `actions`. */\n mobileActions?: ReactNode;\n /** Optional second top-bar row for filters / bulk actions. */\n toolbar?: ReactNode;\n /** Max width of the centered search slot. Defaults to 28rem. */\n searchMaxWidth?: string | number;\n\n // ── Left nav rail (dark, collapsible, fixed width) ───────\n /** Declarative nav sections rendered into the rail (collapse-aware). */\n navSections?: AppShellNavSection[];\n /** Custom sidebar content; receives the collapsed flag. Overrides navSections. */\n sidebar?: ReactNode | ((collapsed: boolean) => ReactNode);\n /** Pinned below the rail header (e.g. a context switcher). */\n sidebarHeader?: ReactNode;\n /** Pinned to the bottom of the rail (version, account). */\n sidebarFooter?: ReactNode;\n /** Show the collapse toggle. Defaults to true when a rail is present. */\n collapsible?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** localStorage key persisting the collapsed state. */\n collapsedStorageKey?: string;\n /** localStorage key persisting per-group collapsed state. */\n groupCollapsedStorageKey?: string;\n /** Expanded rail width in px. Defaults to 240. */\n sidebarWidth?: number;\n /** Collapsed rail width in px. Defaults to 56. */\n collapsedWidth?: number;\n /** Accessible label for the mobile navigation drawer. Defaults to \"Navigation\". */\n mobileSidebarLabel?: string;\n\n // ── Body ─────────────────────────────────────────────────\n /** Fixed header row, left side (breadcrumb, title, tabs). */\n bodyHeader?: ReactNode;\n /** Fixed header row, right side (entity actions) — same row as bodyHeader. */\n bodyActions?: ReactNode;\n /** Optional independent-scroll pane (e.g. a tree). Renders a SplitPane vs body-main. */\n bodySidebar?: ReactNode;\n /** bodySidebar width as a percent when present. Defaults to 24. */\n bodySplit?: number;\n /**\n * Pages a narrow body (under 48rem) between bodySidebar and body-main\n * instead of stacking them: only this pane shows, full height. A list/detail\n * host passes \"main\" while an item is selected and \"sidebar\" otherwise.\n * Wide layouts always show both panes.\n */\n bodyPane?: \"sidebar\" | \"main\";\n /** With `bodyPane=\"main\"`, a narrow body shows a back bar that calls this (e.g. to clear the selection). */\n onBodyBack?: () => void;\n /** Label of the narrow back bar. Defaults to \"Back\". */\n bodyBackLabel?: string;\n /** Main content (body-main); fills the remaining space and scrolls. */\n children: ReactNode;\n /** Centers content at responsive wide breakpoints, or allows it to fill the workspace. */\n contentWidth?: ContentWidth;\n\n /**\n * Outlines every slot in its own colour and labels it with its `data-slot`\n * name — a layout-debugging aid for working out which region owns a given\n * area or scrollbar. Uses `outline`, so enabling it does not shift layout.\n */\n debugSlots?: boolean;\n\n className?: string;\n headerClassName?: string;\n toolbarClassName?: string;\n sidebarClassName?: string;\n bodyHeaderClassName?: string;\n contentClassName?: string;\n};\n\nfunction readStored(key: string | undefined): string | null {\n if (!key || typeof window === \"undefined\") return null;\n return window.localStorage.getItem(key);\n}\n\nconst DEFAULT_GROUP_COLLAPSE_KEY = \"clicky-ui:app-shell:groups\";\n\nfunction readGroupState(storageKey: string): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n}\n\n// Lives here rather than in AppShell.nav so a single instance can be shared by\n// both NavSections renders (rail + mobile drawer).\nfunction useGroupCollapsed(storageKey: string): GroupState {\n const [state, setState] = useState<Record<string, boolean>>(() =>\n readGroupState(storageKey),\n );\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch {\n // Rail state is a UX nicety; private-mode storage failures are safe to swallow.\n }\n }, [state, storageKey]);\n return {\n isCollapsed: (key, fallback) => state[key] ?? fallback,\n toggle: (key, fallback) =>\n setState((prev) => ({ ...prev, [key]: !(prev[key] ?? fallback) })),\n };\n}\n\nexport function AppShell(props: AppShellProps) {\n const {\n brand,\n nav,\n search,\n actions,\n mobileActions,\n toolbar,\n searchMaxWidth = \"28rem\",\n navSections,\n sidebar,\n sidebarHeader,\n sidebarFooter,\n collapsible = true,\n defaultCollapsed = false,\n collapsedStorageKey,\n groupCollapsedStorageKey,\n sidebarWidth = 240,\n collapsedWidth = 56,\n mobileSidebarLabel = \"Navigation\",\n bodyHeader,\n bodyActions,\n bodySidebar,\n bodySplit = 24,\n bodyPane,\n onBodyBack,\n bodyBackLabel = \"Back\",\n children,\n contentWidth = \"contained\",\n debugSlots = false,\n className,\n headerClassName,\n toolbarClassName,\n sidebarClassName,\n bodyHeaderClassName,\n contentClassName,\n } = props;\n\n const hasSidebar = sidebar !== undefined || (navSections?.length ?? 0) > 0;\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n const [collapsed, setCollapsed] = useState(\n () =>\n readStored(collapsedStorageKey) === \"true\" ||\n (readStored(collapsedStorageKey) === null && defaultCollapsed),\n );\n\n useEffect(() => {\n if (collapsedStorageKey && typeof window !== \"undefined\")\n window.localStorage.setItem(collapsedStorageKey, String(collapsed));\n }, [collapsed, collapsedStorageKey]);\n\n useEscapeLayer(mobileSidebarOpen, () => setMobileSidebarOpen(false));\n\n // One instance for the rail AND the mobile drawer: both render NavSections,\n // and per-render state behind a shared storage key would desync.\n const groupState = useGroupCollapsed(\n groupCollapsedStorageKey ?? DEFAULT_GROUP_COLLAPSE_KEY,\n );\n\n const railWidth = collapsed ? collapsedWidth : sidebarWidth;\n const hasTopBar =\n (!hasSidebar && brand !== undefined) ||\n nav !== undefined ||\n search !== undefined ||\n actions !== undefined ||\n mobileActions !== undefined ||\n toolbar !== undefined;\n const hasMobileHeader = hasSidebar;\n const hasBodyHeader = bodyHeader !== undefined || bodyActions !== undefined;\n const effectiveContentWidth =\n bodySidebar === undefined ? contentWidth : \"full\";\n const renderSidebarContent = (\n collapsedValue: boolean,\n onNavigate?: () => void,\n ) =>\n typeof sidebar === \"function\"\n ? sidebar(collapsedValue)\n : sidebar !== undefined\n ? sidebar\n : navSections && (\n <NavSections\n sections={navSections}\n collapsed={collapsedValue}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n );\n\n return (\n <div\n className={cn(\"@container/app-shell flex h-full min-h-0 w-full bg-background\", className)}\n {...(debugSlots ? { \"data-debug-slots\": \"true\" } : {})}\n >\n {debugSlots && <AppShellSlotOutlines />}\n {hasSidebar && (\n <aside\n data-slot=\"app-shell-sidebar\"\n data-collapsed={collapsed}\n style={{ width: railWidth }}\n className={cn(\n \"hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 @3xl/app-shell:flex\",\n sidebarClassName,\n )}\n >\n <div\n className={cn(\n \"flex h-14 shrink-0 items-center border-b border-sidebar-border\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-density-3\",\n )}\n >\n {!collapsed && brand && (\n <div\n data-slot=\"app-shell-brand\"\n className=\"flex min-w-0 items-center gap-2\"\n >\n {brand}\n </div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n <Icon icon={UiSidebar} className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {sidebarHeader && (\n <div\n data-slot=\"app-shell-sidebar-header\"\n className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(collapsed)}\n </div>\n {sidebarFooter && (\n <div\n data-slot=\"app-shell-sidebar-footer\"\n className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarFooter}\n </div>\n )}\n </aside>\n )}\n\n <div\n data-slot=\"app-shell-column\"\n className=\"@container/app-content flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n {(hasTopBar || hasMobileHeader) && (\n <header\n data-slot=\"app-shell-header\"\n className=\"shrink-0 border-b border-border bg-card\"\n >\n <div\n className={cn(\n hasSidebar\n ? \"flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 @3xl/app-shell:h-14 @3xl/app-shell:flex-nowrap @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4 @3xl/app-shell:py-0\"\n : // Wraps rather than squeezing. The nav shrinks and the\n // actions cluster does not, so on a laptop a full actions\n // row left the nav a sliver — every tab but the first\n // scrolled out of sight. A second line costs 44px and only\n // appears when the row genuinely cannot fit.\n \"flex min-h-14 flex-wrap items-center gap-density-3 px-density-4\",\n headerClassName,\n )}\n >\n {hasSidebar && (\n <button\n type=\"button\"\n aria-label={`Open ${mobileSidebarLabel}`}\n title={mobileSidebarLabel}\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent @3xl/app-shell:hidden\"\n onClick={() => setMobileSidebarOpen(true)}\n >\n <Icon icon={UiMenu} className=\"h-4 w-4\" />\n </button>\n )}\n {brand && (\n <div\n data-slot=\"app-shell-brand\"\n className={cn(\n \"min-w-0 items-center gap-density-2\",\n hasSidebar ? \"flex flex-1 @3xl/app-shell:hidden\" : \"flex shrink-0\",\n )}\n >\n {brand}\n </div>\n )}\n {nav && (\n <div\n data-slot=\"app-shell-nav\"\n className={cn(\n // The nav is the only header slot that both shrinks\n // (min-w-0) and holds wide content, while the actions\n // cluster beside it is shrink-0. Give a full actions row\n // and this box collapses to a sliver — so it needs a guard,\n // or its tabs paint straight over the toolbar next to it\n // and both become unreadable. Scrolling keeps every tab\n // reachable; overflowing keeps none of them.\n \"flex min-w-0 items-center overflow-x-auto\",\n hasSidebar && \"order-3 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto\",\n )}\n >\n {nav}\n </div>\n )}\n {search !== undefined && (\n <div\n data-slot=\"app-shell-search\"\n className={cn(\n \"flex min-w-0 flex-1 justify-center\",\n hasSidebar &&\n \"order-2 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto @3xl/app-shell:flex-1\",\n )}\n >\n <div className=\"w-full\" style={{ maxWidth: searchMaxWidth }}>\n {search}\n </div>\n </div>\n )}\n {search === undefined && (\n <div\n className={cn(\"flex-1\", hasSidebar && \"hidden @3xl/app-shell:block\")}\n />\n )}\n {(actions !== undefined ||\n (hasSidebar && mobileActions !== undefined)) && (\n <div\n data-slot=\"app-shell-actions\"\n className={cn(\n \"flex shrink-0 items-center gap-density-2\",\n // Below md the cluster must never be wider than the\n // phone: a shrink-0 row that overflows widens the layout\n // viewport, and then every fixed overlay on the page\n // loses its right edge. Let it shrink and scroll its own\n // contents instead, the same guard the nav slot has.\n \"@max-3xl/app-shell:min-w-0 @max-3xl/app-shell:max-w-full @max-3xl/app-shell:shrink @max-3xl/app-shell:overflow-x-auto\",\n hasSidebar && \"order-1 ml-auto @3xl/app-shell:order-none @3xl/app-shell:ml-0\",\n )}\n >\n {!hasSidebar || mobileActions === undefined ? (\n actions\n ) : (\n <>\n <div className=\"hidden items-center gap-density-2 @3xl/app-shell:flex\">\n {actions}\n </div>\n <div className=\"flex items-center gap-density-2 @3xl/app-shell:hidden\">\n {mobileActions}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n {toolbar && (\n <div\n data-slot=\"app-shell-toolbar\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 @3xl/app-shell:px-density-4\",\n toolbarClassName,\n )}\n >\n {toolbar}\n </div>\n )}\n </header>\n )}\n\n {hasBodyHeader && (\n <div\n data-slot=\"app-shell-body-header\"\n className={cn(\n \"shrink-0 border-b border-border bg-card\",\n bodyHeaderClassName,\n )}\n >\n <div\n data-slot=\"app-shell-body-header-content\"\n data-content-width={effectiveContentWidth}\n className={cn(\n \"flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 @3xl/app-shell:flex-row @3xl/app-shell:items-start @3xl/app-shell:justify-between @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4\",\n contentWidthClassName(effectiveContentWidth),\n )}\n >\n <div className=\"min-w-0 flex-1\">{bodyHeader}</div>\n {bodyActions && (\n <div\n data-slot=\"app-shell-body-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-density-2\"\n >\n {bodyActions}\n </div>\n )}\n </div>\n </div>\n )}\n\n {bodySidebar !== undefined ? (\n <SplitPane\n stackOnMobile\n {...(bodyPane ? { mobilePane: bodyPane === \"sidebar\" ? \"left\" : \"right\" } : {})}\n className=\"min-h-0 flex-1\"\n defaultSplit={bodySplit}\n minLeft={12}\n minRight={30}\n left={\n <div data-slot=\"app-shell-body-sidebar\" className=\"h-full\">\n {bodySidebar}\n </div>\n }\n right={\n <div className=\"flex h-full min-h-0 min-w-0 flex-col\">\n {bodyPane === \"main\" && onBodyBack && (\n <div\n data-slot=\"app-shell-body-back\"\n className=\"shrink-0 border-b border-border px-density-2 @3xl/split-pane:hidden\"\n >\n <button\n type=\"button\"\n onClick={onBodyBack}\n className=\"inline-flex min-h-11 items-center gap-density-2 rounded-md px-density-2 text-sm font-medium text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiArrowLeft} className=\"h-4 w-4\" />\n {bodyBackLabel}\n </button>\n </div>\n )}\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n {children}\n </main>\n </div>\n }\n {...(bodyPane ? {} : { leftClass: \"max-h-[40vh]\" })}\n />\n ) : (\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n <div\n data-slot=\"app-shell-content\"\n data-content-width={contentWidth}\n className={cn(contentWidthClassName(contentWidth), \"h-full\")}\n >\n {children}\n </div>\n </main>\n )}\n </div>\n {hasSidebar && mobileSidebarOpen && (\n <div\n className=\"fixed inset-0 z-50 @3xl/app-shell:hidden\"\n role=\"presentation\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={mobileSidebarLabel}\n className={cn(\n \"relative z-10 flex h-full w-[min(20rem,85vw)] flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl\",\n sidebarClassName,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between border-b border-sidebar-border px-density-3\">\n {brand && (\n <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>\n )}\n <button\n type=\"button\"\n aria-label={`Close ${mobileSidebarLabel}`}\n title=\"Close\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <Icon icon={UiClose} className=\"h-4 w-4\" />\n </button>\n </div>\n {sidebarHeader && (\n <div className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\">\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(false, () => setMobileSidebarOpen(false))}\n </div>\n {sidebarFooter && (\n <div className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\">\n {sidebarFooter}\n </div>\n )}\n </aside>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -80,8 +80,8 @@ export type AppShellNavSection = {
80
80
  /**
81
81
  * How the groups read.
82
82
  *
83
- * `"list"` (the default) styles each group heading as a small uppercase
84
- * cluster label — right for a handful of named clusters under one section.
83
+ * `"list"` (the default) renders groups as navigation rows with a trailing
84
+ * disclosure and indented children. Section labels provide the cluster headings.
85
85
  *
86
86
  * `"tree"` styles headings as ordinary nav rows, because in a tree a folder
87
87
  * sits at the same level as its sibling destinations: a group carrying an
@@ -142,6 +142,17 @@ export type AppShellProps = {
142
142
  bodySidebar?: ReactNode;
143
143
  /** bodySidebar width as a percent when present. Defaults to 24. */
144
144
  bodySplit?: number;
145
+ /**
146
+ * Pages a narrow body (under 48rem) between bodySidebar and body-main
147
+ * instead of stacking them: only this pane shows, full height. A list/detail
148
+ * host passes "main" while an item is selected and "sidebar" otherwise.
149
+ * Wide layouts always show both panes.
150
+ */
151
+ bodyPane?: "sidebar" | "main";
152
+ /** With `bodyPane="main"`, a narrow body shows a back bar that calls this (e.g. to clear the selection). */
153
+ onBodyBack?: () => void;
154
+ /** Label of the narrow back bar. Defaults to "Back". */
155
+ bodyBackLabel?: string;
145
156
  /** Main content (body-main); fills the remaining space and scrolls. */
146
157
  children: ReactNode;
147
158
  /** Centers content at responsive wide breakpoints, or allows it to fill the workspace. */
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/layout/AppShell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../src/layout/AppShell.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { UiClose } from "../icons/components/UiClose.js";
3
3
  import { UiMenu } from "../icons/components/UiMenu.js";
4
+ import { UiArrowLeft } from "../icons/components/UiArrowLeft.js";
4
5
  import { UiSidebar } from "../icons/components/UiSidebar.js";
5
6
  import { Icon } from "../data/Icon.js";
6
7
  import { useEscapeLayer } from "../overlay/modalStack.js";
@@ -44,7 +45,7 @@ function useGroupCollapsed(storageKey) {
44
45
  };
45
46
  }
46
47
  function AppShell(props) {
47
- const { brand, nav, search, actions, mobileActions, toolbar, searchMaxWidth = "28rem", navSections, sidebar, sidebarHeader, sidebarFooter, collapsible = true, defaultCollapsed = false, collapsedStorageKey, groupCollapsedStorageKey, sidebarWidth = 240, collapsedWidth = 56, mobileSidebarLabel = "Navigation", bodyHeader, bodyActions, bodySidebar, bodySplit = 24, children, contentWidth = "contained", debugSlots = false, className, headerClassName, toolbarClassName, sidebarClassName, bodyHeaderClassName, contentClassName } = props;
48
+ const { brand, nav, search, actions, mobileActions, toolbar, searchMaxWidth = "28rem", navSections, sidebar, sidebarHeader, sidebarFooter, collapsible = true, defaultCollapsed = false, collapsedStorageKey, groupCollapsedStorageKey, sidebarWidth = 240, collapsedWidth = 56, mobileSidebarLabel = "Navigation", bodyHeader, bodyActions, bodySidebar, bodySplit = 24, bodyPane, onBodyBack, bodyBackLabel = "Back", children, contentWidth = "contained", debugSlots = false, className, headerClassName, toolbarClassName, sidebarClassName, bodyHeaderClassName, contentClassName } = props;
48
49
  const hasSidebar = sidebar !== void 0 || (navSections?.length ?? 0) > 0;
49
50
  const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
50
51
  const [collapsed, setCollapsed] = useState(() => readStored(collapsedStorageKey) === "true" || readStored(collapsedStorageKey) === null && defaultCollapsed);
@@ -65,7 +66,7 @@ function AppShell(props) {
65
66
  ...onNavigate ? { onNavigate } : {}
66
67
  });
67
68
  return /* @__PURE__ */ jsxs("div", {
68
- className: cn("flex h-full min-h-0 w-full bg-background", className),
69
+ className: cn("@container/app-shell flex h-full min-h-0 w-full bg-background", className),
69
70
  ...debugSlots ? { "data-debug-slots": "true" } : {},
70
71
  children: [
71
72
  debugSlots && /* @__PURE__ */ jsx(AppShellSlotOutlines, {}),
@@ -73,7 +74,7 @@ function AppShell(props) {
73
74
  "data-slot": "app-shell-sidebar",
74
75
  "data-collapsed": collapsed,
75
76
  style: { width: railWidth },
76
- className: cn("hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 md:flex", sidebarClassName),
77
+ className: cn("hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 @3xl/app-shell:flex", sidebarClassName),
77
78
  children: [
78
79
  /* @__PURE__ */ jsxs("div", {
79
80
  className: cn("flex h-14 shrink-0 items-center border-b border-sidebar-border", collapsed ? "justify-center px-2" : "justify-between px-density-3"),
@@ -117,13 +118,13 @@ function AppShell(props) {
117
118
  "data-slot": "app-shell-header",
118
119
  className: "shrink-0 border-b border-border bg-card",
119
120
  children: [/* @__PURE__ */ jsxs("div", {
120
- className: cn(hasSidebar ? "flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 md:h-14 md:flex-nowrap md:gap-density-3 md:px-density-4 md:py-0" : "flex min-h-14 flex-wrap items-center gap-density-3 px-density-4", headerClassName),
121
+ className: cn(hasSidebar ? "flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 @3xl/app-shell:h-14 @3xl/app-shell:flex-nowrap @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4 @3xl/app-shell:py-0" : "flex min-h-14 flex-wrap items-center gap-density-3 px-density-4", headerClassName),
121
122
  children: [
122
123
  hasSidebar && /* @__PURE__ */ jsx("button", {
123
124
  type: "button",
124
125
  "aria-label": `Open ${mobileSidebarLabel}`,
125
126
  title: mobileSidebarLabel,
126
- className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent md:hidden",
127
+ className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent @3xl/app-shell:hidden",
127
128
  onClick: () => setMobileSidebarOpen(true),
128
129
  children: /* @__PURE__ */ jsx(Icon, {
129
130
  icon: UiMenu,
@@ -132,39 +133,39 @@ function AppShell(props) {
132
133
  }),
133
134
  brand && /* @__PURE__ */ jsx("div", {
134
135
  "data-slot": "app-shell-brand",
135
- className: cn("min-w-0 items-center gap-density-2", hasSidebar ? "flex flex-1 md:hidden" : "flex shrink-0"),
136
+ className: cn("min-w-0 items-center gap-density-2", hasSidebar ? "flex flex-1 @3xl/app-shell:hidden" : "flex shrink-0"),
136
137
  children: brand
137
138
  }),
138
139
  nav && /* @__PURE__ */ jsx("div", {
139
140
  "data-slot": "app-shell-nav",
140
- className: cn("flex min-w-0 items-center overflow-x-auto", hasSidebar && "order-3 basis-full md:order-none md:basis-auto"),
141
+ className: cn("flex min-w-0 items-center overflow-x-auto", hasSidebar && "order-3 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto"),
141
142
  children: nav
142
143
  }),
143
144
  search !== void 0 && /* @__PURE__ */ jsx("div", {
144
145
  "data-slot": "app-shell-search",
145
- className: cn("flex min-w-0 flex-1 justify-center", hasSidebar && "order-2 basis-full md:order-none md:basis-auto md:flex-1"),
146
+ className: cn("flex min-w-0 flex-1 justify-center", hasSidebar && "order-2 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto @3xl/app-shell:flex-1"),
146
147
  children: /* @__PURE__ */ jsx("div", {
147
148
  className: "w-full",
148
149
  style: { maxWidth: searchMaxWidth },
149
150
  children: search
150
151
  })
151
152
  }),
152
- search === void 0 && /* @__PURE__ */ jsx("div", { className: cn("flex-1", hasSidebar && "hidden md:block") }),
153
+ search === void 0 && /* @__PURE__ */ jsx("div", { className: cn("flex-1", hasSidebar && "hidden @3xl/app-shell:block") }),
153
154
  (actions !== void 0 || hasSidebar && mobileActions !== void 0) && /* @__PURE__ */ jsx("div", {
154
155
  "data-slot": "app-shell-actions",
155
- className: cn("flex shrink-0 items-center gap-density-2", "max-md:min-w-0 max-md:max-w-full max-md:shrink max-md:overflow-x-auto", hasSidebar && "order-1 ml-auto md:order-none md:ml-0"),
156
+ className: cn("flex shrink-0 items-center gap-density-2", "@max-3xl/app-shell:min-w-0 @max-3xl/app-shell:max-w-full @max-3xl/app-shell:shrink @max-3xl/app-shell:overflow-x-auto", hasSidebar && "order-1 ml-auto @3xl/app-shell:order-none @3xl/app-shell:ml-0"),
156
157
  children: !hasSidebar || mobileActions === void 0 ? actions : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
157
- className: "hidden items-center gap-density-2 md:flex",
158
+ className: "hidden items-center gap-density-2 @3xl/app-shell:flex",
158
159
  children: actions
159
160
  }), /* @__PURE__ */ jsx("div", {
160
- className: "flex items-center gap-density-2 md:hidden",
161
+ className: "flex items-center gap-density-2 @3xl/app-shell:hidden",
161
162
  children: mobileActions
162
163
  })] })
163
164
  })
164
165
  ]
165
166
  }), toolbar && /* @__PURE__ */ jsx("div", {
166
167
  "data-slot": "app-shell-toolbar",
167
- className: cn("flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 md:px-density-4", toolbarClassName),
168
+ className: cn("flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 @3xl/app-shell:px-density-4", toolbarClassName),
168
169
  children: toolbar
169
170
  })]
170
171
  }),
@@ -174,7 +175,7 @@ function AppShell(props) {
174
175
  children: /* @__PURE__ */ jsxs("div", {
175
176
  "data-slot": "app-shell-body-header-content",
176
177
  "data-content-width": effectiveContentWidth,
177
- className: cn("flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 md:flex-row md:items-start md:justify-between md:gap-density-3 md:px-density-4", contentWidthClassName(effectiveContentWidth)),
178
+ className: cn("flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 @3xl/app-shell:flex-row @3xl/app-shell:items-start @3xl/app-shell:justify-between @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4", contentWidthClassName(effectiveContentWidth)),
178
179
  children: [/* @__PURE__ */ jsx("div", {
179
180
  className: "min-w-0 flex-1",
180
181
  children: bodyHeader
@@ -187,6 +188,7 @@ function AppShell(props) {
187
188
  }),
188
189
  bodySidebar !== void 0 ? /* @__PURE__ */ jsx(SplitPane, {
189
190
  stackOnMobile: true,
191
+ ...bodyPane ? { mobilePane: bodyPane === "sidebar" ? "left" : "right" } : {},
190
192
  className: "min-h-0 flex-1",
191
193
  defaultSplit: bodySplit,
192
194
  minLeft: 12,
@@ -196,13 +198,27 @@ function AppShell(props) {
196
198
  className: "h-full",
197
199
  children: bodySidebar
198
200
  }),
199
- right: /* @__PURE__ */ jsx("main", {
200
- "data-slot": "app-shell-main",
201
- className: cn("h-full min-h-0 min-w-0 overflow-auto", contentClassName),
202
- children
201
+ right: /* @__PURE__ */ jsxs("div", {
202
+ className: "flex h-full min-h-0 min-w-0 flex-col",
203
+ children: [bodyPane === "main" && onBodyBack && /* @__PURE__ */ jsx("div", {
204
+ "data-slot": "app-shell-body-back",
205
+ className: "shrink-0 border-b border-border px-density-2 @3xl/split-pane:hidden",
206
+ children: /* @__PURE__ */ jsxs("button", {
207
+ type: "button",
208
+ onClick: onBodyBack,
209
+ className: "inline-flex min-h-11 items-center gap-density-2 rounded-md px-density-2 text-sm font-medium text-muted-foreground hover:text-foreground",
210
+ children: [/* @__PURE__ */ jsx(Icon, {
211
+ icon: UiArrowLeft,
212
+ className: "h-4 w-4"
213
+ }), bodyBackLabel]
214
+ })
215
+ }), /* @__PURE__ */ jsx("main", {
216
+ "data-slot": "app-shell-main",
217
+ className: cn("min-h-0 min-w-0 flex-1 overflow-auto", contentClassName),
218
+ children
219
+ })]
203
220
  }),
204
- leftClass: "max-h-[40vh] shrink-0 border-b border-border md:max-h-none md:border-b-0",
205
- rightClass: "min-h-0 flex-1 md:flex-none"
221
+ ...bodyPane ? {} : { leftClass: "max-h-[40vh]" }
206
222
  }) : /* @__PURE__ */ jsx("main", {
207
223
  "data-slot": "app-shell-main",
208
224
  className: cn("min-h-0 min-w-0 flex-1 overflow-auto", contentClassName),
@@ -216,7 +232,7 @@ function AppShell(props) {
216
232
  ]
217
233
  }),
218
234
  hasSidebar && mobileSidebarOpen && /* @__PURE__ */ jsxs("div", {
219
- className: "fixed inset-0 z-50 md:hidden",
235
+ className: "fixed inset-0 z-50 @3xl/app-shell:hidden",
220
236
  role: "presentation",
221
237
  onClick: () => setMobileSidebarOpen(false),
222
238
  children: [/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/40" }), /* @__PURE__ */ jsxs("aside", {
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","names":["_Fragment"],"sources":["../../src/layout/AppShell.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiClose, UiMenu, UiSidebar } from \"../icons\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections, type GroupState } from \"./AppShell.nav\";\nimport type { AppShellNavDrag } from \"./AppShell.nav.drag\";\nimport { contentWidthClassName, type ContentWidth } from \"./content-width\";\n\n// AppShell is a sidebar-first application shell. The full-height DARK nav rail\n// owns the brand + collapse toggle and renders grouped nav sections; the top bar\n// (search, actions) sits to the RIGHT of the rail — there is no full-width top\n// bar when a rail is present. With no rail, the top bar spans full width. The\n// body carries a fixed bodyHeader + bodyActions row over an optional\n// bodySidebar | body-main split (body-main scrolls; bodySidebar — e.g. a tree —\n// scrolls independently via a resizable SplitPane).\n\nexport type AppShellNavItem = {\n /** Additional searchable text for a tree destination. */\n searchText?: string;\n /** Stable key; also the React key. */\n key: string;\n /** Visible label (hidden when the rail is collapsed). */\n label: ReactNode;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Highlights the item as the current location. */\n active?: boolean;\n /** Routing destination; rendered as an anchor via the RouterAdapter. */\n to: string;\n /** Opens `to` in a new tab. */\n external?: boolean;\n /** Trailing adornment (count, status dot). */\n badge?: ReactNode;\n /** Actions opened by right-click, the Context Menu key, or Shift+F10. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n};\n\nexport type AppShellNavGroup = {\n /** Stable key; also the key its collapsed state persists under. */\n key: string;\n /** Group heading rendered on the toggle row. */\n label: string;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Trailing adornment (aggregate count, status dot). */\n badge?: ReactNode;\n /** Actions opened from the group heading's context menu. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n /** Folded on first render until the user toggles it. */\n defaultCollapsed?: boolean;\n /**\n * Keeps the group open regardless of stored state, so a deep-linked\n * destination can never hide under a folder the user collapsed earlier.\n * Set it on the active item's ancestors.\n */\n forceExpanded?: boolean;\n items: AppShellNavItem[];\n /**\n * Nested sub-groups, rendered after `items` at one further indent. Groups\n * nest arbitrarily, so a backend hierarchy deeper than two levels does not\n * have to be flattened to fit the rail.\n */\n groups?: AppShellNavGroup[];\n /**\n * Makes the group's own heading row a destination as well as a disclosure:\n * the label becomes a nav link and the chevron sits beside it as a separate\n * control. Needed wherever a node is both a folder and a leaf — e.g. a\n * profile named `jms` that is runnable *and* the parent of `jms.incoming`.\n */\n item?: AppShellNavItem;\n};\n\nexport type AppShellNavSection = {\n /** Show a loading message instead of an empty tree while data is being fetched. */\n loading?: boolean;\n /** Optional controlled search for tree navigation. */\n search?: { value: string; onChange: (value: string) => void; label?: string };\n /** Section heading; collapses to a divider when the rail is collapsed. */\n label?: string;\n items?: AppShellNavItem[];\n /** Collapsible groups rendered after the flat items. High-cardinality\n * clusters (provider surfaces, per-ledger journals) belong here so they can\n * be folded away; a collapsed rail flattens them back to plain items. */\n groups?: AppShellNavGroup[];\n /**\n * How the groups read.\n *\n * `\"list\"` (the default) styles each group heading as a small uppercase\n * cluster label — right for a handful of named clusters under one section.\n *\n * `\"tree\"` styles headings as ordinary nav rows, because in a tree a folder\n * sits at the same level as its sibling destinations: a group carrying an\n * `item` renders as a link either way, so an uppercase heading beside it\n * would make two nodes of the same kind look like different things.\n */\n variant?: \"list\" | \"tree\";\n /**\n * Makes the section's rows draggable onto one another, so a hierarchy can be\n * rearranged in place. The section stays the boundary — a row never lands in\n * a different section — and the consumer owns what a move means. Ignored\n * while the rail is collapsed, where there are no folder rows to aim at.\n */\n drag?: AppShellNavDrag;\n};\n\nexport type AppShellProps = {\n // ── Top bar (right of the rail; full width when no rail) ─\n /** Brand mark / wordmark. Shown in the rail header when a rail is present, else in the top bar. */\n brand?: ReactNode;\n /** Inline primary nav (e.g. tabs) shown after the brand in the top bar. */\n nav?: ReactNode;\n /** Centered search slot; grows to fill and is width-capped. */\n search?: ReactNode;\n /** Right-aligned cluster (icon buttons, settings/org picker, …). */\n actions?: ReactNode;\n /** Compact action cluster used in the mobile header. Defaults to `actions`. */\n mobileActions?: ReactNode;\n /** Optional second top-bar row for filters / bulk actions. */\n toolbar?: ReactNode;\n /** Max width of the centered search slot. Defaults to 28rem. */\n searchMaxWidth?: string | number;\n\n // ── Left nav rail (dark, collapsible, fixed width) ───────\n /** Declarative nav sections rendered into the rail (collapse-aware). */\n navSections?: AppShellNavSection[];\n /** Custom sidebar content; receives the collapsed flag. Overrides navSections. */\n sidebar?: ReactNode | ((collapsed: boolean) => ReactNode);\n /** Pinned below the rail header (e.g. a context switcher). */\n sidebarHeader?: ReactNode;\n /** Pinned to the bottom of the rail (version, account). */\n sidebarFooter?: ReactNode;\n /** Show the collapse toggle. Defaults to true when a rail is present. */\n collapsible?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** localStorage key persisting the collapsed state. */\n collapsedStorageKey?: string;\n /** localStorage key persisting per-group collapsed state. */\n groupCollapsedStorageKey?: string;\n /** Expanded rail width in px. Defaults to 240. */\n sidebarWidth?: number;\n /** Collapsed rail width in px. Defaults to 56. */\n collapsedWidth?: number;\n /** Accessible label for the mobile navigation drawer. Defaults to \"Navigation\". */\n mobileSidebarLabel?: string;\n\n // ── Body ─────────────────────────────────────────────────\n /** Fixed header row, left side (breadcrumb, title, tabs). */\n bodyHeader?: ReactNode;\n /** Fixed header row, right side (entity actions) — same row as bodyHeader. */\n bodyActions?: ReactNode;\n /** Optional independent-scroll pane (e.g. a tree). Renders a SplitPane vs body-main. */\n bodySidebar?: ReactNode;\n /** bodySidebar width as a percent when present. Defaults to 24. */\n bodySplit?: number;\n /** Main content (body-main); fills the remaining space and scrolls. */\n children: ReactNode;\n /** Centers content at responsive wide breakpoints, or allows it to fill the workspace. */\n contentWidth?: ContentWidth;\n\n /**\n * Outlines every slot in its own colour and labels it with its `data-slot`\n * name — a layout-debugging aid for working out which region owns a given\n * area or scrollbar. Uses `outline`, so enabling it does not shift layout.\n */\n debugSlots?: boolean;\n\n className?: string;\n headerClassName?: string;\n toolbarClassName?: string;\n sidebarClassName?: string;\n bodyHeaderClassName?: string;\n contentClassName?: string;\n};\n\nfunction readStored(key: string | undefined): string | null {\n if (!key || typeof window === \"undefined\") return null;\n return window.localStorage.getItem(key);\n}\n\nconst DEFAULT_GROUP_COLLAPSE_KEY = \"clicky-ui:app-shell:groups\";\n\nfunction readGroupState(storageKey: string): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n}\n\n// Lives here rather than in AppShell.nav so a single instance can be shared by\n// both NavSections renders (rail + mobile drawer).\nfunction useGroupCollapsed(storageKey: string): GroupState {\n const [state, setState] = useState<Record<string, boolean>>(() =>\n readGroupState(storageKey),\n );\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch {\n // Rail state is a UX nicety; private-mode storage failures are safe to swallow.\n }\n }, [state, storageKey]);\n return {\n isCollapsed: (key, fallback) => state[key] ?? fallback,\n toggle: (key, fallback) =>\n setState((prev) => ({ ...prev, [key]: !(prev[key] ?? fallback) })),\n };\n}\n\nexport function AppShell(props: AppShellProps) {\n const {\n brand,\n nav,\n search,\n actions,\n mobileActions,\n toolbar,\n searchMaxWidth = \"28rem\",\n navSections,\n sidebar,\n sidebarHeader,\n sidebarFooter,\n collapsible = true,\n defaultCollapsed = false,\n collapsedStorageKey,\n groupCollapsedStorageKey,\n sidebarWidth = 240,\n collapsedWidth = 56,\n mobileSidebarLabel = \"Navigation\",\n bodyHeader,\n bodyActions,\n bodySidebar,\n bodySplit = 24,\n children,\n contentWidth = \"contained\",\n debugSlots = false,\n className,\n headerClassName,\n toolbarClassName,\n sidebarClassName,\n bodyHeaderClassName,\n contentClassName,\n } = props;\n\n const hasSidebar = sidebar !== undefined || (navSections?.length ?? 0) > 0;\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n const [collapsed, setCollapsed] = useState(\n () =>\n readStored(collapsedStorageKey) === \"true\" ||\n (readStored(collapsedStorageKey) === null && defaultCollapsed),\n );\n\n useEffect(() => {\n if (collapsedStorageKey && typeof window !== \"undefined\")\n window.localStorage.setItem(collapsedStorageKey, String(collapsed));\n }, [collapsed, collapsedStorageKey]);\n\n useEscapeLayer(mobileSidebarOpen, () => setMobileSidebarOpen(false));\n\n // One instance for the rail AND the mobile drawer: both render NavSections,\n // and per-render state behind a shared storage key would desync.\n const groupState = useGroupCollapsed(\n groupCollapsedStorageKey ?? DEFAULT_GROUP_COLLAPSE_KEY,\n );\n\n const railWidth = collapsed ? collapsedWidth : sidebarWidth;\n const hasTopBar =\n (!hasSidebar && brand !== undefined) ||\n nav !== undefined ||\n search !== undefined ||\n actions !== undefined ||\n mobileActions !== undefined ||\n toolbar !== undefined;\n const hasMobileHeader = hasSidebar;\n const hasBodyHeader = bodyHeader !== undefined || bodyActions !== undefined;\n const effectiveContentWidth =\n bodySidebar === undefined ? contentWidth : \"full\";\n const renderSidebarContent = (\n collapsedValue: boolean,\n onNavigate?: () => void,\n ) =>\n typeof sidebar === \"function\"\n ? sidebar(collapsedValue)\n : sidebar !== undefined\n ? sidebar\n : navSections && (\n <NavSections\n sections={navSections}\n collapsed={collapsedValue}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n );\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 w-full bg-background\", className)}\n {...(debugSlots ? { \"data-debug-slots\": \"true\" } : {})}\n >\n {debugSlots && <AppShellSlotOutlines />}\n {hasSidebar && (\n <aside\n data-slot=\"app-shell-sidebar\"\n data-collapsed={collapsed}\n style={{ width: railWidth }}\n className={cn(\n \"hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 md:flex\",\n sidebarClassName,\n )}\n >\n <div\n className={cn(\n \"flex h-14 shrink-0 items-center border-b border-sidebar-border\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-density-3\",\n )}\n >\n {!collapsed && brand && (\n <div\n data-slot=\"app-shell-brand\"\n className=\"flex min-w-0 items-center gap-2\"\n >\n {brand}\n </div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n <Icon icon={UiSidebar} className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {sidebarHeader && (\n <div\n data-slot=\"app-shell-sidebar-header\"\n className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(collapsed)}\n </div>\n {sidebarFooter && (\n <div\n data-slot=\"app-shell-sidebar-footer\"\n className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarFooter}\n </div>\n )}\n </aside>\n )}\n\n <div\n data-slot=\"app-shell-column\"\n className=\"@container/app-content flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n {(hasTopBar || hasMobileHeader) && (\n <header\n data-slot=\"app-shell-header\"\n className=\"shrink-0 border-b border-border bg-card\"\n >\n <div\n className={cn(\n hasSidebar\n ? \"flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 md:h-14 md:flex-nowrap md:gap-density-3 md:px-density-4 md:py-0\"\n : // Wraps rather than squeezing. The nav shrinks and the\n // actions cluster does not, so on a laptop a full actions\n // row left the nav a sliver — every tab but the first\n // scrolled out of sight. A second line costs 44px and only\n // appears when the row genuinely cannot fit.\n \"flex min-h-14 flex-wrap items-center gap-density-3 px-density-4\",\n headerClassName,\n )}\n >\n {hasSidebar && (\n <button\n type=\"button\"\n aria-label={`Open ${mobileSidebarLabel}`}\n title={mobileSidebarLabel}\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent md:hidden\"\n onClick={() => setMobileSidebarOpen(true)}\n >\n <Icon icon={UiMenu} className=\"h-4 w-4\" />\n </button>\n )}\n {brand && (\n <div\n data-slot=\"app-shell-brand\"\n className={cn(\n \"min-w-0 items-center gap-density-2\",\n hasSidebar ? \"flex flex-1 md:hidden\" : \"flex shrink-0\",\n )}\n >\n {brand}\n </div>\n )}\n {nav && (\n <div\n data-slot=\"app-shell-nav\"\n className={cn(\n // The nav is the only header slot that both shrinks\n // (min-w-0) and holds wide content, while the actions\n // cluster beside it is shrink-0. Give a full actions row\n // and this box collapses to a sliver — so it needs a guard,\n // or its tabs paint straight over the toolbar next to it\n // and both become unreadable. Scrolling keeps every tab\n // reachable; overflowing keeps none of them.\n \"flex min-w-0 items-center overflow-x-auto\",\n hasSidebar && \"order-3 basis-full md:order-none md:basis-auto\",\n )}\n >\n {nav}\n </div>\n )}\n {search !== undefined && (\n <div\n data-slot=\"app-shell-search\"\n className={cn(\n \"flex min-w-0 flex-1 justify-center\",\n hasSidebar &&\n \"order-2 basis-full md:order-none md:basis-auto md:flex-1\",\n )}\n >\n <div className=\"w-full\" style={{ maxWidth: searchMaxWidth }}>\n {search}\n </div>\n </div>\n )}\n {search === undefined && (\n <div\n className={cn(\"flex-1\", hasSidebar && \"hidden md:block\")}\n />\n )}\n {(actions !== undefined ||\n (hasSidebar && mobileActions !== undefined)) && (\n <div\n data-slot=\"app-shell-actions\"\n className={cn(\n \"flex shrink-0 items-center gap-density-2\",\n // Below md the cluster must never be wider than the\n // phone: a shrink-0 row that overflows widens the layout\n // viewport, and then every fixed overlay on the page\n // loses its right edge. Let it shrink and scroll its own\n // contents instead, the same guard the nav slot has.\n \"max-md:min-w-0 max-md:max-w-full max-md:shrink max-md:overflow-x-auto\",\n hasSidebar && \"order-1 ml-auto md:order-none md:ml-0\",\n )}\n >\n {!hasSidebar || mobileActions === undefined ? (\n actions\n ) : (\n <>\n <div className=\"hidden items-center gap-density-2 md:flex\">\n {actions}\n </div>\n <div className=\"flex items-center gap-density-2 md:hidden\">\n {mobileActions}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n {toolbar && (\n <div\n data-slot=\"app-shell-toolbar\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 md:px-density-4\",\n toolbarClassName,\n )}\n >\n {toolbar}\n </div>\n )}\n </header>\n )}\n\n {hasBodyHeader && (\n <div\n data-slot=\"app-shell-body-header\"\n className={cn(\n \"shrink-0 border-b border-border bg-card\",\n bodyHeaderClassName,\n )}\n >\n <div\n data-slot=\"app-shell-body-header-content\"\n data-content-width={effectiveContentWidth}\n className={cn(\n \"flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 md:flex-row md:items-start md:justify-between md:gap-density-3 md:px-density-4\",\n contentWidthClassName(effectiveContentWidth),\n )}\n >\n <div className=\"min-w-0 flex-1\">{bodyHeader}</div>\n {bodyActions && (\n <div\n data-slot=\"app-shell-body-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-density-2\"\n >\n {bodyActions}\n </div>\n )}\n </div>\n </div>\n )}\n\n {bodySidebar !== undefined ? (\n <SplitPane\n stackOnMobile\n className=\"min-h-0 flex-1\"\n defaultSplit={bodySplit}\n minLeft={12}\n minRight={30}\n left={\n <div data-slot=\"app-shell-body-sidebar\" className=\"h-full\">\n {bodySidebar}\n </div>\n }\n right={\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"h-full min-h-0 min-w-0 overflow-auto\",\n contentClassName,\n )}\n >\n {children}\n </main>\n }\n leftClass=\"max-h-[40vh] shrink-0 border-b border-border md:max-h-none md:border-b-0\"\n rightClass=\"min-h-0 flex-1 md:flex-none\"\n />\n ) : (\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n <div\n data-slot=\"app-shell-content\"\n data-content-width={contentWidth}\n className={cn(contentWidthClassName(contentWidth), \"h-full\")}\n >\n {children}\n </div>\n </main>\n )}\n </div>\n {hasSidebar && mobileSidebarOpen && (\n <div\n className=\"fixed inset-0 z-50 md:hidden\"\n role=\"presentation\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={mobileSidebarLabel}\n className={cn(\n \"relative z-10 flex h-full w-[min(20rem,85vw)] flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl\",\n sidebarClassName,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between border-b border-sidebar-border px-density-3\">\n {brand && (\n <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>\n )}\n <button\n type=\"button\"\n aria-label={`Close ${mobileSidebarLabel}`}\n title=\"Close\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <Icon icon={UiClose} className=\"h-4 w-4\" />\n </button>\n </div>\n {sidebarHeader && (\n <div className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\">\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(false, () => setMobileSidebarOpen(false))}\n </div>\n {sidebarFooter && (\n <div className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\">\n {sidebarFooter}\n </div>\n )}\n </aside>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.js","names":["_Fragment"],"sources":["../../src/layout/AppShell.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiArrowLeft, UiClose, UiMenu, UiSidebar } from \"../icons\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections, type GroupState } from \"./AppShell.nav\";\nimport type { AppShellNavDrag } from \"./AppShell.nav.drag\";\nimport { contentWidthClassName, type ContentWidth } from \"./content-width\";\n\n// AppShell is a sidebar-first application shell. The full-height DARK nav rail\n// owns the brand + collapse toggle and renders grouped nav sections; the top bar\n// (search, actions) sits to the RIGHT of the rail — there is no full-width top\n// bar when a rail is present. With no rail, the top bar spans full width. The\n// body carries a fixed bodyHeader + bodyActions row over an optional\n// bodySidebar | body-main split (body-main scrolls; bodySidebar — e.g. a tree —\n// scrolls independently via a resizable SplitPane).\n\nexport type AppShellNavItem = {\n /** Additional searchable text for a tree destination. */\n searchText?: string;\n /** Stable key; also the React key. */\n key: string;\n /** Visible label (hidden when the rail is collapsed). */\n label: ReactNode;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Highlights the item as the current location. */\n active?: boolean;\n /** Routing destination; rendered as an anchor via the RouterAdapter. */\n to: string;\n /** Opens `to` in a new tab. */\n external?: boolean;\n /** Trailing adornment (count, status dot). */\n badge?: ReactNode;\n /** Actions opened by right-click, the Context Menu key, or Shift+F10. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n};\n\nexport type AppShellNavGroup = {\n /** Stable key; also the key its collapsed state persists under. */\n key: string;\n /** Group heading rendered on the toggle row. */\n label: string;\n /** Leading icon (icon name or component). */\n icon?: string | StaticIconComponent;\n /** Trailing adornment (aggregate count, status dot). */\n badge?: ReactNode;\n /** Actions opened from the group heading's context menu. */\n contextMenu?: DropdownMenuItem[];\n /** Accessible label for the context menu. Defaults to `<label> actions`. */\n contextMenuLabel?: string;\n /** Folded on first render until the user toggles it. */\n defaultCollapsed?: boolean;\n /**\n * Keeps the group open regardless of stored state, so a deep-linked\n * destination can never hide under a folder the user collapsed earlier.\n * Set it on the active item's ancestors.\n */\n forceExpanded?: boolean;\n items: AppShellNavItem[];\n /**\n * Nested sub-groups, rendered after `items` at one further indent. Groups\n * nest arbitrarily, so a backend hierarchy deeper than two levels does not\n * have to be flattened to fit the rail.\n */\n groups?: AppShellNavGroup[];\n /**\n * Makes the group's own heading row a destination as well as a disclosure:\n * the label becomes a nav link and the chevron sits beside it as a separate\n * control. Needed wherever a node is both a folder and a leaf — e.g. a\n * profile named `jms` that is runnable *and* the parent of `jms.incoming`.\n */\n item?: AppShellNavItem;\n};\n\nexport type AppShellNavSection = {\n /** Show a loading message instead of an empty tree while data is being fetched. */\n loading?: boolean;\n /** Optional controlled search for tree navigation. */\n search?: { value: string; onChange: (value: string) => void; label?: string };\n /** Section heading; collapses to a divider when the rail is collapsed. */\n label?: string;\n items?: AppShellNavItem[];\n /** Collapsible groups rendered after the flat items. High-cardinality\n * clusters (provider surfaces, per-ledger journals) belong here so they can\n * be folded away; a collapsed rail flattens them back to plain items. */\n groups?: AppShellNavGroup[];\n /**\n * How the groups read.\n *\n * `\"list\"` (the default) renders groups as navigation rows with a trailing\n * disclosure and indented children. Section labels provide the cluster headings.\n *\n * `\"tree\"` styles headings as ordinary nav rows, because in a tree a folder\n * sits at the same level as its sibling destinations: a group carrying an\n * `item` renders as a link either way, so an uppercase heading beside it\n * would make two nodes of the same kind look like different things.\n */\n variant?: \"list\" | \"tree\";\n /**\n * Makes the section's rows draggable onto one another, so a hierarchy can be\n * rearranged in place. The section stays the boundary — a row never lands in\n * a different section — and the consumer owns what a move means. Ignored\n * while the rail is collapsed, where there are no folder rows to aim at.\n */\n drag?: AppShellNavDrag;\n};\n\nexport type AppShellProps = {\n // ── Top bar (right of the rail; full width when no rail) ─\n /** Brand mark / wordmark. Shown in the rail header when a rail is present, else in the top bar. */\n brand?: ReactNode;\n /** Inline primary nav (e.g. tabs) shown after the brand in the top bar. */\n nav?: ReactNode;\n /** Centered search slot; grows to fill and is width-capped. */\n search?: ReactNode;\n /** Right-aligned cluster (icon buttons, settings/org picker, …). */\n actions?: ReactNode;\n /** Compact action cluster used in the mobile header. Defaults to `actions`. */\n mobileActions?: ReactNode;\n /** Optional second top-bar row for filters / bulk actions. */\n toolbar?: ReactNode;\n /** Max width of the centered search slot. Defaults to 28rem. */\n searchMaxWidth?: string | number;\n\n // ── Left nav rail (dark, collapsible, fixed width) ───────\n /** Declarative nav sections rendered into the rail (collapse-aware). */\n navSections?: AppShellNavSection[];\n /** Custom sidebar content; receives the collapsed flag. Overrides navSections. */\n sidebar?: ReactNode | ((collapsed: boolean) => ReactNode);\n /** Pinned below the rail header (e.g. a context switcher). */\n sidebarHeader?: ReactNode;\n /** Pinned to the bottom of the rail (version, account). */\n sidebarFooter?: ReactNode;\n /** Show the collapse toggle. Defaults to true when a rail is present. */\n collapsible?: boolean;\n /** Initial collapsed state (uncontrolled). */\n defaultCollapsed?: boolean;\n /** localStorage key persisting the collapsed state. */\n collapsedStorageKey?: string;\n /** localStorage key persisting per-group collapsed state. */\n groupCollapsedStorageKey?: string;\n /** Expanded rail width in px. Defaults to 240. */\n sidebarWidth?: number;\n /** Collapsed rail width in px. Defaults to 56. */\n collapsedWidth?: number;\n /** Accessible label for the mobile navigation drawer. Defaults to \"Navigation\". */\n mobileSidebarLabel?: string;\n\n // ── Body ─────────────────────────────────────────────────\n /** Fixed header row, left side (breadcrumb, title, tabs). */\n bodyHeader?: ReactNode;\n /** Fixed header row, right side (entity actions) — same row as bodyHeader. */\n bodyActions?: ReactNode;\n /** Optional independent-scroll pane (e.g. a tree). Renders a SplitPane vs body-main. */\n bodySidebar?: ReactNode;\n /** bodySidebar width as a percent when present. Defaults to 24. */\n bodySplit?: number;\n /**\n * Pages a narrow body (under 48rem) between bodySidebar and body-main\n * instead of stacking them: only this pane shows, full height. A list/detail\n * host passes \"main\" while an item is selected and \"sidebar\" otherwise.\n * Wide layouts always show both panes.\n */\n bodyPane?: \"sidebar\" | \"main\";\n /** With `bodyPane=\"main\"`, a narrow body shows a back bar that calls this (e.g. to clear the selection). */\n onBodyBack?: () => void;\n /** Label of the narrow back bar. Defaults to \"Back\". */\n bodyBackLabel?: string;\n /** Main content (body-main); fills the remaining space and scrolls. */\n children: ReactNode;\n /** Centers content at responsive wide breakpoints, or allows it to fill the workspace. */\n contentWidth?: ContentWidth;\n\n /**\n * Outlines every slot in its own colour and labels it with its `data-slot`\n * name — a layout-debugging aid for working out which region owns a given\n * area or scrollbar. Uses `outline`, so enabling it does not shift layout.\n */\n debugSlots?: boolean;\n\n className?: string;\n headerClassName?: string;\n toolbarClassName?: string;\n sidebarClassName?: string;\n bodyHeaderClassName?: string;\n contentClassName?: string;\n};\n\nfunction readStored(key: string | undefined): string | null {\n if (!key || typeof window === \"undefined\") return null;\n return window.localStorage.getItem(key);\n}\n\nconst DEFAULT_GROUP_COLLAPSE_KEY = \"clicky-ui:app-shell:groups\";\n\nfunction readGroupState(storageKey: string): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n}\n\n// Lives here rather than in AppShell.nav so a single instance can be shared by\n// both NavSections renders (rail + mobile drawer).\nfunction useGroupCollapsed(storageKey: string): GroupState {\n const [state, setState] = useState<Record<string, boolean>>(() =>\n readGroupState(storageKey),\n );\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(state));\n } catch {\n // Rail state is a UX nicety; private-mode storage failures are safe to swallow.\n }\n }, [state, storageKey]);\n return {\n isCollapsed: (key, fallback) => state[key] ?? fallback,\n toggle: (key, fallback) =>\n setState((prev) => ({ ...prev, [key]: !(prev[key] ?? fallback) })),\n };\n}\n\nexport function AppShell(props: AppShellProps) {\n const {\n brand,\n nav,\n search,\n actions,\n mobileActions,\n toolbar,\n searchMaxWidth = \"28rem\",\n navSections,\n sidebar,\n sidebarHeader,\n sidebarFooter,\n collapsible = true,\n defaultCollapsed = false,\n collapsedStorageKey,\n groupCollapsedStorageKey,\n sidebarWidth = 240,\n collapsedWidth = 56,\n mobileSidebarLabel = \"Navigation\",\n bodyHeader,\n bodyActions,\n bodySidebar,\n bodySplit = 24,\n bodyPane,\n onBodyBack,\n bodyBackLabel = \"Back\",\n children,\n contentWidth = \"contained\",\n debugSlots = false,\n className,\n headerClassName,\n toolbarClassName,\n sidebarClassName,\n bodyHeaderClassName,\n contentClassName,\n } = props;\n\n const hasSidebar = sidebar !== undefined || (navSections?.length ?? 0) > 0;\n const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);\n\n const [collapsed, setCollapsed] = useState(\n () =>\n readStored(collapsedStorageKey) === \"true\" ||\n (readStored(collapsedStorageKey) === null && defaultCollapsed),\n );\n\n useEffect(() => {\n if (collapsedStorageKey && typeof window !== \"undefined\")\n window.localStorage.setItem(collapsedStorageKey, String(collapsed));\n }, [collapsed, collapsedStorageKey]);\n\n useEscapeLayer(mobileSidebarOpen, () => setMobileSidebarOpen(false));\n\n // One instance for the rail AND the mobile drawer: both render NavSections,\n // and per-render state behind a shared storage key would desync.\n const groupState = useGroupCollapsed(\n groupCollapsedStorageKey ?? DEFAULT_GROUP_COLLAPSE_KEY,\n );\n\n const railWidth = collapsed ? collapsedWidth : sidebarWidth;\n const hasTopBar =\n (!hasSidebar && brand !== undefined) ||\n nav !== undefined ||\n search !== undefined ||\n actions !== undefined ||\n mobileActions !== undefined ||\n toolbar !== undefined;\n const hasMobileHeader = hasSidebar;\n const hasBodyHeader = bodyHeader !== undefined || bodyActions !== undefined;\n const effectiveContentWidth =\n bodySidebar === undefined ? contentWidth : \"full\";\n const renderSidebarContent = (\n collapsedValue: boolean,\n onNavigate?: () => void,\n ) =>\n typeof sidebar === \"function\"\n ? sidebar(collapsedValue)\n : sidebar !== undefined\n ? sidebar\n : navSections && (\n <NavSections\n sections={navSections}\n collapsed={collapsedValue}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n );\n\n return (\n <div\n className={cn(\"@container/app-shell flex h-full min-h-0 w-full bg-background\", className)}\n {...(debugSlots ? { \"data-debug-slots\": \"true\" } : {})}\n >\n {debugSlots && <AppShellSlotOutlines />}\n {hasSidebar && (\n <aside\n data-slot=\"app-shell-sidebar\"\n data-collapsed={collapsed}\n style={{ width: railWidth }}\n className={cn(\n \"hidden shrink-0 flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 @3xl/app-shell:flex\",\n sidebarClassName,\n )}\n >\n <div\n className={cn(\n \"flex h-14 shrink-0 items-center border-b border-sidebar-border\",\n collapsed\n ? \"justify-center px-2\"\n : \"justify-between px-density-3\",\n )}\n >\n {!collapsed && brand && (\n <div\n data-slot=\"app-shell-brand\"\n className=\"flex min-w-0 items-center gap-2\"\n >\n {brand}\n </div>\n )}\n {collapsible && (\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n <Icon icon={UiSidebar} className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n {sidebarHeader && (\n <div\n data-slot=\"app-shell-sidebar-header\"\n className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(collapsed)}\n </div>\n {sidebarFooter && (\n <div\n data-slot=\"app-shell-sidebar-footer\"\n className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\"\n >\n {sidebarFooter}\n </div>\n )}\n </aside>\n )}\n\n <div\n data-slot=\"app-shell-column\"\n className=\"@container/app-content flex min-h-0 min-w-0 flex-1 flex-col\"\n >\n {(hasTopBar || hasMobileHeader) && (\n <header\n data-slot=\"app-shell-header\"\n className=\"shrink-0 border-b border-border bg-card\"\n >\n <div\n className={cn(\n hasSidebar\n ? \"flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 @3xl/app-shell:h-14 @3xl/app-shell:flex-nowrap @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4 @3xl/app-shell:py-0\"\n : // Wraps rather than squeezing. The nav shrinks and the\n // actions cluster does not, so on a laptop a full actions\n // row left the nav a sliver — every tab but the first\n // scrolled out of sight. A second line costs 44px and only\n // appears when the row genuinely cannot fit.\n \"flex min-h-14 flex-wrap items-center gap-density-3 px-density-4\",\n headerClassName,\n )}\n >\n {hasSidebar && (\n <button\n type=\"button\"\n aria-label={`Open ${mobileSidebarLabel}`}\n title={mobileSidebarLabel}\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground transition-colors hover:bg-accent @3xl/app-shell:hidden\"\n onClick={() => setMobileSidebarOpen(true)}\n >\n <Icon icon={UiMenu} className=\"h-4 w-4\" />\n </button>\n )}\n {brand && (\n <div\n data-slot=\"app-shell-brand\"\n className={cn(\n \"min-w-0 items-center gap-density-2\",\n hasSidebar ? \"flex flex-1 @3xl/app-shell:hidden\" : \"flex shrink-0\",\n )}\n >\n {brand}\n </div>\n )}\n {nav && (\n <div\n data-slot=\"app-shell-nav\"\n className={cn(\n // The nav is the only header slot that both shrinks\n // (min-w-0) and holds wide content, while the actions\n // cluster beside it is shrink-0. Give a full actions row\n // and this box collapses to a sliver — so it needs a guard,\n // or its tabs paint straight over the toolbar next to it\n // and both become unreadable. Scrolling keeps every tab\n // reachable; overflowing keeps none of them.\n \"flex min-w-0 items-center overflow-x-auto\",\n hasSidebar && \"order-3 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto\",\n )}\n >\n {nav}\n </div>\n )}\n {search !== undefined && (\n <div\n data-slot=\"app-shell-search\"\n className={cn(\n \"flex min-w-0 flex-1 justify-center\",\n hasSidebar &&\n \"order-2 basis-full @3xl/app-shell:order-none @3xl/app-shell:basis-auto @3xl/app-shell:flex-1\",\n )}\n >\n <div className=\"w-full\" style={{ maxWidth: searchMaxWidth }}>\n {search}\n </div>\n </div>\n )}\n {search === undefined && (\n <div\n className={cn(\"flex-1\", hasSidebar && \"hidden @3xl/app-shell:block\")}\n />\n )}\n {(actions !== undefined ||\n (hasSidebar && mobileActions !== undefined)) && (\n <div\n data-slot=\"app-shell-actions\"\n className={cn(\n \"flex shrink-0 items-center gap-density-2\",\n // Below md the cluster must never be wider than the\n // phone: a shrink-0 row that overflows widens the layout\n // viewport, and then every fixed overlay on the page\n // loses its right edge. Let it shrink and scroll its own\n // contents instead, the same guard the nav slot has.\n \"@max-3xl/app-shell:min-w-0 @max-3xl/app-shell:max-w-full @max-3xl/app-shell:shrink @max-3xl/app-shell:overflow-x-auto\",\n hasSidebar && \"order-1 ml-auto @3xl/app-shell:order-none @3xl/app-shell:ml-0\",\n )}\n >\n {!hasSidebar || mobileActions === undefined ? (\n actions\n ) : (\n <>\n <div className=\"hidden items-center gap-density-2 @3xl/app-shell:flex\">\n {actions}\n </div>\n <div className=\"flex items-center gap-density-2 @3xl/app-shell:hidden\">\n {mobileActions}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n {toolbar && (\n <div\n data-slot=\"app-shell-toolbar\"\n className={cn(\n \"flex flex-wrap items-center gap-density-2 border-t border-border bg-muted px-density-3 py-density-2 @3xl/app-shell:px-density-4\",\n toolbarClassName,\n )}\n >\n {toolbar}\n </div>\n )}\n </header>\n )}\n\n {hasBodyHeader && (\n <div\n data-slot=\"app-shell-body-header\"\n className={cn(\n \"shrink-0 border-b border-border bg-card\",\n bodyHeaderClassName,\n )}\n >\n <div\n data-slot=\"app-shell-body-header-content\"\n data-content-width={effectiveContentWidth}\n className={cn(\n \"flex flex-col items-stretch gap-density-2 px-density-3 py-density-2 @3xl/app-shell:flex-row @3xl/app-shell:items-start @3xl/app-shell:justify-between @3xl/app-shell:gap-density-3 @3xl/app-shell:px-density-4\",\n contentWidthClassName(effectiveContentWidth),\n )}\n >\n <div className=\"min-w-0 flex-1\">{bodyHeader}</div>\n {bodyActions && (\n <div\n data-slot=\"app-shell-body-actions\"\n className=\"flex shrink-0 flex-wrap items-center gap-density-2\"\n >\n {bodyActions}\n </div>\n )}\n </div>\n </div>\n )}\n\n {bodySidebar !== undefined ? (\n <SplitPane\n stackOnMobile\n {...(bodyPane ? { mobilePane: bodyPane === \"sidebar\" ? \"left\" : \"right\" } : {})}\n className=\"min-h-0 flex-1\"\n defaultSplit={bodySplit}\n minLeft={12}\n minRight={30}\n left={\n <div data-slot=\"app-shell-body-sidebar\" className=\"h-full\">\n {bodySidebar}\n </div>\n }\n right={\n <div className=\"flex h-full min-h-0 min-w-0 flex-col\">\n {bodyPane === \"main\" && onBodyBack && (\n <div\n data-slot=\"app-shell-body-back\"\n className=\"shrink-0 border-b border-border px-density-2 @3xl/split-pane:hidden\"\n >\n <button\n type=\"button\"\n onClick={onBodyBack}\n className=\"inline-flex min-h-11 items-center gap-density-2 rounded-md px-density-2 text-sm font-medium text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiArrowLeft} className=\"h-4 w-4\" />\n {bodyBackLabel}\n </button>\n </div>\n )}\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n {children}\n </main>\n </div>\n }\n {...(bodyPane ? {} : { leftClass: \"max-h-[40vh]\" })}\n />\n ) : (\n <main\n data-slot=\"app-shell-main\"\n className={cn(\n \"min-h-0 min-w-0 flex-1 overflow-auto\",\n contentClassName,\n )}\n >\n <div\n data-slot=\"app-shell-content\"\n data-content-width={contentWidth}\n className={cn(contentWidthClassName(contentWidth), \"h-full\")}\n >\n {children}\n </div>\n </main>\n )}\n </div>\n {hasSidebar && mobileSidebarOpen && (\n <div\n className=\"fixed inset-0 z-50 @3xl/app-shell:hidden\"\n role=\"presentation\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={mobileSidebarLabel}\n className={cn(\n \"relative z-10 flex h-full w-[min(20rem,85vw)] flex-col overflow-hidden border-r border-sidebar-border bg-sidebar text-sidebar-foreground shadow-xl\",\n sidebarClassName,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between border-b border-sidebar-border px-density-3\">\n {brand && (\n <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>\n )}\n <button\n type=\"button\"\n aria-label={`Close ${mobileSidebarLabel}`}\n title=\"Close\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-sidebar-foreground/70 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n onClick={() => setMobileSidebarOpen(false)}\n >\n <Icon icon={UiClose} className=\"h-4 w-4\" />\n </button>\n </div>\n {sidebarHeader && (\n <div className=\"shrink-0 border-b border-sidebar-border px-density-3 py-density-2\">\n {sidebarHeader}\n </div>\n )}\n <div className=\"min-h-0 flex-1 overflow-y-auto py-density-2\">\n {renderSidebarContent(false, () => setMobileSidebarOpen(false))}\n </div>\n {sidebarFooter && (\n <div className=\"mt-auto shrink-0 border-t border-sidebar-border px-density-3 py-density-2\">\n {sidebarFooter}\n </div>\n )}\n </aside>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  const require_utils = require("../lib/utils.cjs");
2
+ const require_UiChevronDown = require("../icons/components/UiChevronDown.cjs");
3
+ const require_UiChevronRight = require("../icons/components/UiChevronRight.cjs");
2
4
  const require_Icon = require("../data/Icon.cjs");
3
5
  const require_router = require("../rpc/router.cjs");
4
6
  const require_ContextMenu = require("../overlay/ContextMenu.cjs");
@@ -101,10 +103,9 @@ function NavGroupRows({ group, renderLink, groupState, dragState, onNavigate })
101
103
  const fallback = group.defaultCollapsed ?? false;
102
104
  const collapsed = !group.forceExpanded && groupState.isCollapsed(group.key, fallback);
103
105
  const toggle = () => groupState.toggle(group.key, fallback);
104
- const chevron = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
106
+ const chevron = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(collapsed ? require_UiChevronRight.UiChevronRight : require_UiChevronDown.UiChevronDown, {
105
107
  "aria-hidden": true,
106
- className: "text-[0.65rem] opacity-60",
107
- children: collapsed ? "▸" : "▾"
108
+ className: "size-3.5 shrink-0 opacity-60"
108
109
  });
109
110
  const groupIcon = group.icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
110
111
  className: "flex h-4 w-4 shrink-0 items-center justify-center",
@@ -144,7 +145,7 @@ function NavGroupRows({ group, renderLink, groupState, dragState, onNavigate })
144
145
  className: "flex flex-col",
145
146
  children: [group.item ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
146
147
  ref: setContextTarget,
147
- className: require_utils.cn("group/nav flex items-center gap-1", leafFolderDrag && "data-[nav-drag=source]:opacity-40 data-[nav-drop=over]:bg-sidebar-accent data-[nav-drop=over]:ring-1 data-[nav-drop=over]:ring-inset data-[nav-drop=over]:ring-sidebar-primary"),
148
+ className: require_utils.cn("group/nav flex items-center gap-1 rounded-md", !collapsed && "bg-sidebar-accent/50", leafFolderDrag && "data-[nav-drag=source]:opacity-40 data-[nav-drop=over]:bg-sidebar-accent data-[nav-drop=over]:ring-1 data-[nav-drop=over]:ring-inset data-[nav-drop=over]:ring-sidebar-primary"),
148
149
  ...leafFolderDrag,
149
150
  children: [
150
151
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -176,7 +177,7 @@ function NavGroupRows({ group, renderLink, groupState, dragState, onNavigate })
176
177
  type: "button",
177
178
  onClick: toggle,
178
179
  "aria-expanded": !collapsed,
179
- className: require_utils.cn("flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", "text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55", folderDrag && "data-[nav-drag=source]:opacity-40 data-[nav-drop=over]:bg-sidebar-accent data-[nav-drop=over]:ring-1 data-[nav-drop=over]:ring-inset data-[nav-drop=over]:ring-sidebar-primary"),
180
+ className: require_utils.cn("flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", "text-left text-[13px] text-sidebar-foreground", !collapsed && "bg-sidebar-accent/50", folderDrag && "data-[nav-drag=source]:opacity-40 data-[nav-drop=over]:bg-sidebar-accent data-[nav-drop=over]:ring-1 data-[nav-drop=over]:ring-inset data-[nav-drop=over]:ring-sidebar-primary"),
180
181
  ...folderDrag,
181
182
  children: [
182
183
  groupIcon,
@@ -192,7 +193,7 @@ function NavGroupRows({ group, renderLink, groupState, dragState, onNavigate })
192
193
  menuLabel: group.contextMenuLabel ?? `${group.label} actions`,
193
194
  menuItems: group.contextMenu
194
195
  })] }), !collapsed && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
195
- className: "ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2",
196
+ className: "ml-4 mt-0.5 flex flex-col gap-0.5",
196
197
  children: [group.items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NavItemRow, {
197
198
  item,
198
199
  collapsed: false,