@flanksource/clicky-ui 0.3.17 → 0.3.18

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 (822) hide show
  1. package/dist/ai.cjs +12 -6
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +10 -4
  4. package/dist/ai.js.map +1 -1
  5. package/dist/chat.cjs +36 -0
  6. package/dist/chat.cjs.map +1 -1
  7. package/dist/chat.js +37 -1
  8. package/dist/chat.js.map +1 -1
  9. package/dist/components/Combobox.cjs +122 -153
  10. package/dist/components/Combobox.cjs.map +1 -1
  11. package/dist/components/Combobox.d.ts.map +1 -1
  12. package/dist/components/Combobox.js +124 -155
  13. package/dist/components/Combobox.js.map +1 -1
  14. package/dist/components/ComboboxControl.cjs +145 -0
  15. package/dist/components/ComboboxControl.cjs.map +1 -0
  16. package/dist/components/ComboboxControl.d.ts +37 -0
  17. package/dist/components/ComboboxControl.d.ts.map +1 -0
  18. package/dist/components/ComboboxControl.js +145 -0
  19. package/dist/components/ComboboxControl.js.map +1 -0
  20. package/dist/components/ComboboxMenu.cjs +31 -14
  21. package/dist/components/ComboboxMenu.cjs.map +1 -1
  22. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  23. package/dist/components/ComboboxMenu.js +31 -14
  24. package/dist/components/ComboboxMenu.js.map +1 -1
  25. package/dist/components/ComboboxTags.cjs +40 -0
  26. package/dist/components/ComboboxTags.cjs.map +1 -0
  27. package/dist/components/ComboboxTags.d.ts +8 -0
  28. package/dist/components/ComboboxTags.d.ts.map +1 -0
  29. package/dist/components/ComboboxTags.js +40 -0
  30. package/dist/components/ComboboxTags.js.map +1 -0
  31. package/dist/components/ErrorWrapper.cjs +168 -0
  32. package/dist/components/ErrorWrapper.cjs.map +1 -0
  33. package/dist/components/ErrorWrapper.d.ts +19 -0
  34. package/dist/components/ErrorWrapper.d.ts.map +1 -0
  35. package/dist/components/ErrorWrapper.js +168 -0
  36. package/dist/components/ErrorWrapper.js.map +1 -0
  37. package/dist/components/FilterBar.cjs +64 -2
  38. package/dist/components/FilterBar.cjs.map +1 -1
  39. package/dist/components/FilterBar.d.ts +18 -1
  40. package/dist/components/FilterBar.d.ts.map +1 -1
  41. package/dist/components/FilterBar.js +64 -2
  42. package/dist/components/FilterBar.js.map +1 -1
  43. package/dist/components/JSONPathField.cjs +91 -0
  44. package/dist/components/JSONPathField.cjs.map +1 -0
  45. package/dist/components/JSONPathField.d.ts +19 -0
  46. package/dist/components/JSONPathField.d.ts.map +1 -0
  47. package/dist/components/JSONPathField.js +91 -0
  48. package/dist/components/JSONPathField.js.map +1 -0
  49. package/dist/components/JsonSchemaForm.cjs +8 -4
  50. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  51. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  52. package/dist/components/JsonSchemaForm.js +8 -4
  53. package/dist/components/JsonSchemaForm.js.map +1 -1
  54. package/dist/components/TreePickerField.cjs +22 -4
  55. package/dist/components/TreePickerField.cjs.map +1 -1
  56. package/dist/components/TreePickerField.d.ts +22 -2
  57. package/dist/components/TreePickerField.d.ts.map +1 -1
  58. package/dist/components/TreePickerField.js +22 -4
  59. package/dist/components/TreePickerField.js.map +1 -1
  60. package/dist/components/TriStateToggle.cjs +53 -0
  61. package/dist/components/TriStateToggle.cjs.map +1 -0
  62. package/dist/components/TriStateToggle.d.ts +27 -0
  63. package/dist/components/TriStateToggle.d.ts.map +1 -0
  64. package/dist/components/TriStateToggle.js +53 -0
  65. package/dist/components/TriStateToggle.js.map +1 -0
  66. package/dist/components/combobox-types.d.ts +16 -1
  67. package/dist/components/combobox-types.d.ts.map +1 -1
  68. package/dist/components/combobox-utils.cjs +26 -0
  69. package/dist/components/combobox-utils.cjs.map +1 -1
  70. package/dist/components/combobox-utils.d.ts +10 -0
  71. package/dist/components/combobox-utils.d.ts.map +1 -1
  72. package/dist/components/combobox-utils.js +26 -0
  73. package/dist/components/combobox-utils.js.map +1 -1
  74. package/dist/components/filter-bar-utils.cjs +5 -0
  75. package/dist/components/filter-bar-utils.cjs.map +1 -1
  76. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  77. package/dist/components/filter-bar-utils.js +5 -0
  78. package/dist/components/filter-bar-utils.js.map +1 -1
  79. package/dist/components/json-schema-form-accordion-array.cjs +290 -0
  80. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
  81. package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
  82. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
  83. package/dist/components/json-schema-form-accordion-array.js +290 -0
  84. package/dist/components/json-schema-form-accordion-array.js.map +1 -0
  85. package/dist/components/json-schema-form-array.cjs +99 -110
  86. package/dist/components/json-schema-form-array.cjs.map +1 -1
  87. package/dist/components/json-schema-form-array.d.ts +1 -1
  88. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-array.js +98 -109
  90. package/dist/components/json-schema-form-array.js.map +1 -1
  91. package/dist/components/json-schema-form-error-display.cjs +4 -2
  92. package/dist/components/json-schema-form-error-display.cjs.map +1 -1
  93. package/dist/components/json-schema-form-error-display.d.ts +4 -2
  94. package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
  95. package/dist/components/json-schema-form-error-display.js +4 -2
  96. package/dist/components/json-schema-form-error-display.js.map +1 -1
  97. package/dist/components/json-schema-form-extensions.cjs +10 -0
  98. package/dist/components/json-schema-form-extensions.cjs.map +1 -0
  99. package/dist/components/json-schema-form-extensions.d.ts +8 -0
  100. package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-extensions.js +10 -0
  102. package/dist/components/json-schema-form-extensions.js.map +1 -0
  103. package/dist/components/json-schema-form-fields.cjs +25 -101
  104. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  105. package/dist/components/json-schema-form-fields.d.ts +1 -32
  106. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-fields.js +28 -104
  108. package/dist/components/json-schema-form-fields.js.map +1 -1
  109. package/dist/components/json-schema-form-item-summary.cjs +131 -0
  110. package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
  111. package/dist/components/json-schema-form-item-summary.d.ts +13 -0
  112. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
  113. package/dist/components/json-schema-form-item-summary.js +131 -0
  114. package/dist/components/json-schema-form-item-summary.js.map +1 -0
  115. package/dist/components/json-schema-form-layout.cjs +156 -0
  116. package/dist/components/json-schema-form-layout.cjs.map +1 -0
  117. package/dist/components/json-schema-form-layout.d.ts +43 -0
  118. package/dist/components/json-schema-form-layout.d.ts.map +1 -0
  119. package/dist/components/json-schema-form-layout.js +156 -0
  120. package/dist/components/json-schema-form-layout.js.map +1 -0
  121. package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
  122. package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
  123. package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
  124. package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
  125. package/dist/components/json-schema-form-lookup-tree.js +149 -0
  126. package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
  127. package/dist/components/json-schema-form-object.cjs +11 -4
  128. package/dist/components/json-schema-form-object.cjs.map +1 -1
  129. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  130. package/dist/components/json-schema-form-object.js +11 -4
  131. package/dist/components/json-schema-form-object.js.map +1 -1
  132. package/dist/components/json-schema-form-render.cjs +51 -28
  133. package/dist/components/json-schema-form-render.cjs.map +1 -1
  134. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  135. package/dist/components/json-schema-form-render.js +51 -28
  136. package/dist/components/json-schema-form-render.js.map +1 -1
  137. package/dist/components/json-schema-form-resolve.cjs +62 -13
  138. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  139. package/dist/components/json-schema-form-resolve.d.ts +1 -0
  140. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  141. package/dist/components/json-schema-form-resolve.js +62 -13
  142. package/dist/components/json-schema-form-resolve.js.map +1 -1
  143. package/dist/components/json-schema-form-table-array.cjs +123 -0
  144. package/dist/components/json-schema-form-table-array.cjs.map +1 -0
  145. package/dist/components/json-schema-form-table-array.d.ts +7 -0
  146. package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
  147. package/dist/components/json-schema-form-table-array.js +123 -0
  148. package/dist/components/json-schema-form-table-array.js.map +1 -0
  149. package/dist/components/json-schema-form-tone.cjs +34 -0
  150. package/dist/components/json-schema-form-tone.cjs.map +1 -0
  151. package/dist/components/json-schema-form-tone.d.ts +8 -0
  152. package/dist/components/json-schema-form-tone.d.ts.map +1 -0
  153. package/dist/components/json-schema-form-tone.js +34 -0
  154. package/dist/components/json-schema-form-tone.js.map +1 -0
  155. package/dist/components/json-schema-form-types.d.ts +79 -10
  156. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  157. package/dist/components/json-schema-form-utils.cjs +47 -4
  158. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  159. package/dist/components/json-schema-form-utils.d.ts +19 -4
  160. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  161. package/dist/components/json-schema-form-utils.js +47 -4
  162. package/dist/components/json-schema-form-utils.js.map +1 -1
  163. package/dist/components/tri-state.cjs +8 -0
  164. package/dist/components/tri-state.cjs.map +1 -0
  165. package/dist/components/tri-state.d.ts +5 -0
  166. package/dist/components/tri-state.d.ts.map +1 -0
  167. package/dist/components/tri-state.js +8 -0
  168. package/dist/components/tri-state.js.map +1 -0
  169. package/dist/components/useComboboxLayout.cjs +59 -0
  170. package/dist/components/useComboboxLayout.cjs.map +1 -0
  171. package/dist/components/useComboboxLayout.d.ts +5 -0
  172. package/dist/components/useComboboxLayout.d.ts.map +1 -0
  173. package/dist/components/useComboboxLayout.js +59 -0
  174. package/dist/components/useComboboxLayout.js.map +1 -0
  175. package/dist/components.cjs +21 -0
  176. package/dist/components.cjs.map +1 -1
  177. package/dist/components.d.ts +14 -4
  178. package/dist/components.d.ts.map +1 -1
  179. package/dist/components.js +22 -1
  180. package/dist/components.js.map +1 -1
  181. package/dist/data/Clicky.cjs +51 -2
  182. package/dist/data/Clicky.cjs.map +1 -1
  183. package/dist/data/Clicky.d.ts +10 -1
  184. package/dist/data/Clicky.d.ts.map +1 -1
  185. package/dist/data/Clicky.js +51 -2
  186. package/dist/data/Clicky.js.map +1 -1
  187. package/dist/data/DataTable.cjs +185 -53
  188. package/dist/data/DataTable.cjs.map +1 -1
  189. package/dist/data/DataTable.d.ts +63 -3
  190. package/dist/data/DataTable.d.ts.map +1 -1
  191. package/dist/data/DataTable.js +185 -53
  192. package/dist/data/DataTable.js.map +1 -1
  193. package/dist/data/LogsTable.cjs +10 -1
  194. package/dist/data/LogsTable.cjs.map +1 -1
  195. package/dist/data/LogsTable.d.ts +3 -1
  196. package/dist/data/LogsTable.d.ts.map +1 -1
  197. package/dist/data/LogsTable.js +10 -1
  198. package/dist/data/LogsTable.js.map +1 -1
  199. package/dist/data/TaskManager.cjs +99 -14
  200. package/dist/data/TaskManager.cjs.map +1 -1
  201. package/dist/data/TaskManager.d.ts.map +1 -1
  202. package/dist/data/TaskManager.js +100 -15
  203. package/dist/data/TaskManager.js.map +1 -1
  204. package/dist/data/TaskProgress.cjs +50 -11
  205. package/dist/data/TaskProgress.cjs.map +1 -1
  206. package/dist/data/TaskProgress.d.ts +2 -1
  207. package/dist/data/TaskProgress.d.ts.map +1 -1
  208. package/dist/data/TaskProgress.js +50 -11
  209. package/dist/data/TaskProgress.js.map +1 -1
  210. package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
  211. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
  212. package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
  213. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
  214. package/dist/data/ai/AdvancedChatConfig.js +289 -0
  215. package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
  216. package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
  217. package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
  218. package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
  219. package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
  220. package/dist/data/ai/AdvancedCostsPanel.js +120 -0
  221. package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
  222. package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
  223. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
  224. package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
  225. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
  226. package/dist/data/ai/ChatWindow.catalogs.js +74 -0
  227. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
  228. package/dist/data/ai/ChatWindow.cjs +78 -100
  229. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  230. package/dist/data/ai/ChatWindow.d.ts +1 -1
  231. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  232. package/dist/data/ai/ChatWindow.js +80 -102
  233. package/dist/data/ai/ChatWindow.js.map +1 -1
  234. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  235. package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
  236. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  237. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  238. package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
  239. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
  240. package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
  241. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
  242. package/dist/data/ai/ChatWindow.runtime.js +120 -0
  243. package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
  244. package/dist/data/ai/ChatWindow.thread.cjs +1 -1
  245. package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
  246. package/dist/data/ai/ChatWindow.thread.js +1 -1
  247. package/dist/data/ai/ChatWindow.thread.js.map +1 -1
  248. package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
  249. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  250. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
  251. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  252. package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
  253. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  254. package/dist/data/ai/ChatWindow.types.d.ts +13 -5
  255. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  256. package/dist/data/ai/ChatWindowManager.cjs +3 -1
  257. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  258. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
  259. package/dist/data/ai/ChatWindowManager.js +3 -1
  260. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  261. package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
  262. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  263. package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
  264. package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
  265. package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
  266. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  267. package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
  268. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  269. package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
  270. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  271. package/dist/data/ai/PromptRunEditor/index.js +2 -2
  272. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  273. package/dist/data/ai/RuntimeModePicker.cjs +1 -1
  274. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  275. package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
  276. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  277. package/dist/data/ai/RuntimeModePicker.js +1 -1
  278. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  279. package/dist/data/ai/SessionInspector.files.cjs +26 -43
  280. package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
  281. package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
  282. package/dist/data/ai/SessionInspector.files.js +26 -43
  283. package/dist/data/ai/SessionInspector.files.js.map +1 -1
  284. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  285. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  286. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  287. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  288. package/dist/data/ai/SessionInspector.model.cjs +1 -1
  289. package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
  290. package/dist/data/ai/SessionInspector.model.js +1 -1
  291. package/dist/data/ai/SessionInspector.model.js.map +1 -1
  292. package/dist/data/ai/SessionViewer.rows.cjs +4 -16
  293. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  294. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  295. package/dist/data/ai/SessionViewer.rows.js +4 -16
  296. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  297. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
  298. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  299. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
  300. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  301. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
  302. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  303. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  304. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
  305. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  306. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  307. package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
  308. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  309. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
  310. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  311. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  312. package/dist/data/ai/ThreadPicker.cjs +65 -3
  313. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  314. package/dist/data/ai/ThreadPicker.d.ts +11 -5
  315. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  316. package/dist/data/ai/ThreadPicker.js +65 -3
  317. package/dist/data/ai/ThreadPicker.js.map +1 -1
  318. package/dist/data/ai/ToolPreferences.cjs +65 -685
  319. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  320. package/dist/data/ai/ToolPreferences.d.ts +15 -17
  321. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  322. package/dist/data/ai/ToolPreferences.js +64 -683
  323. package/dist/data/ai/ToolPreferences.js.map +1 -1
  324. package/dist/data/ai/ToolPreferences.model.cjs +148 -0
  325. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
  326. package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
  327. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
  328. package/dist/data/ai/ToolPreferences.model.js +148 -0
  329. package/dist/data/ai/ToolPreferences.model.js.map +1 -0
  330. package/dist/data/ai/ToolPreferencesList.cjs +270 -0
  331. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
  332. package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
  333. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
  334. package/dist/data/ai/ToolPreferencesList.js +270 -0
  335. package/dist/data/ai/ToolPreferencesList.js.map +1 -0
  336. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  337. package/dist/data/ai/agent-action-icons.js.map +1 -1
  338. package/dist/data/ai/chat-window-context.cjs +4 -1
  339. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  340. package/dist/data/ai/chat-window-context.d.ts +7 -0
  341. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  342. package/dist/data/ai/chat-window-context.js +4 -1
  343. package/dist/data/ai/chat-window-context.js.map +1 -1
  344. package/dist/data/ai/index.d.ts +6 -3
  345. package/dist/data/ai/index.d.ts.map +1 -1
  346. package/dist/data/ai/session-tones.cjs +67 -0
  347. package/dist/data/ai/session-tones.cjs.map +1 -0
  348. package/dist/data/ai/session-tones.d.ts +34 -0
  349. package/dist/data/ai/session-tones.d.ts.map +1 -0
  350. package/dist/data/ai/session-tones.js +67 -0
  351. package/dist/data/ai/session-tones.js.map +1 -0
  352. package/dist/data/ai/thread-costs.cjs +39 -0
  353. package/dist/data/ai/thread-costs.cjs.map +1 -0
  354. package/dist/data/ai/thread-costs.d.ts +62 -0
  355. package/dist/data/ai/thread-costs.d.ts.map +1 -0
  356. package/dist/data/ai/thread-costs.js +39 -0
  357. package/dist/data/ai/thread-costs.js.map +1 -0
  358. package/dist/data/cells/CellFilterActions.cjs +68 -0
  359. package/dist/data/cells/CellFilterActions.cjs.map +1 -0
  360. package/dist/data/cells/CellFilterActions.d.ts +15 -0
  361. package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
  362. package/dist/data/cells/CellFilterActions.js +68 -0
  363. package/dist/data/cells/CellFilterActions.js.map +1 -0
  364. package/dist/data/chat/Chat.cjs +156 -113
  365. package/dist/data/chat/Chat.cjs.map +1 -1
  366. package/dist/data/chat/Chat.d.ts +24 -7
  367. package/dist/data/chat/Chat.d.ts.map +1 -1
  368. package/dist/data/chat/Chat.fixtures.cjs +48 -3
  369. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  370. package/dist/data/chat/Chat.fixtures.d.ts +1 -1
  371. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  372. package/dist/data/chat/Chat.fixtures.js +48 -3
  373. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  374. package/dist/data/chat/Chat.js +160 -117
  375. package/dist/data/chat/Chat.js.map +1 -1
  376. package/dist/data/chat/Chat.runtime.cjs +63 -0
  377. package/dist/data/chat/Chat.runtime.cjs.map +1 -0
  378. package/dist/data/chat/Chat.runtime.d.ts +16 -0
  379. package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
  380. package/dist/data/chat/Chat.runtime.js +63 -0
  381. package/dist/data/chat/Chat.runtime.js.map +1 -0
  382. package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
  383. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
  384. package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
  385. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
  386. package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
  387. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
  388. package/dist/data/chat/ToolCall.cjs +86 -24
  389. package/dist/data/chat/ToolCall.cjs.map +1 -1
  390. package/dist/data/chat/ToolCall.d.ts +12 -5
  391. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  392. package/dist/data/chat/ToolCall.js +86 -24
  393. package/dist/data/chat/ToolCall.js.map +1 -1
  394. package/dist/data/chat/approval.cjs +49 -6
  395. package/dist/data/chat/approval.cjs.map +1 -1
  396. package/dist/data/chat/approval.d.ts +11 -4
  397. package/dist/data/chat/approval.d.ts.map +1 -1
  398. package/dist/data/chat/approval.js +49 -6
  399. package/dist/data/chat/approval.js.map +1 -1
  400. package/dist/data/chat/index.d.ts +5 -3
  401. package/dist/data/chat/index.d.ts.map +1 -1
  402. package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
  403. package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
  404. package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
  405. package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
  406. package/dist/data/chat/tool-render/ToolArgs.js +50 -0
  407. package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
  408. package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
  409. package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
  410. package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
  411. package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
  412. package/dist/data/chat/tool-render/ToolParams.js +155 -0
  413. package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
  414. package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
  415. package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
  416. package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
  417. package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
  418. package/dist/data/chat/tool-render/ToolValue.js +140 -0
  419. package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
  420. package/dist/data/chat/tool-render/adapter.cjs +48 -0
  421. package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
  422. package/dist/data/chat/tool-render/adapter.d.ts +57 -0
  423. package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
  424. package/dist/data/chat/tool-render/adapter.js +48 -0
  425. package/dist/data/chat/tool-render/adapter.js.map +1 -0
  426. package/dist/data/chat/tool-render/context.cjs +16 -0
  427. package/dist/data/chat/tool-render/context.cjs.map +1 -0
  428. package/dist/data/chat/tool-render/context.d.ts +6 -0
  429. package/dist/data/chat/tool-render/context.d.ts.map +1 -0
  430. package/dist/data/chat/tool-render/context.js +16 -0
  431. package/dist/data/chat/tool-render/context.js.map +1 -0
  432. package/dist/data/chat/tool-render/defaults.cjs +45 -0
  433. package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
  434. package/dist/data/chat/tool-render/defaults.d.ts +11 -0
  435. package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
  436. package/dist/data/chat/tool-render/defaults.js +45 -0
  437. package/dist/data/chat/tool-render/defaults.js.map +1 -0
  438. package/dist/data/chat/tool-render/index.d.ts +13 -0
  439. package/dist/data/chat/tool-render/index.d.ts.map +1 -0
  440. package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
  441. package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
  442. package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
  443. package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
  444. package/dist/data/chat/tool-render/known-tool-views.js +208 -0
  445. package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
  446. package/dist/data/chat/tool-render/known-tools.cjs +58 -0
  447. package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
  448. package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
  449. package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
  450. package/dist/data/chat/tool-render/known-tools.js +58 -0
  451. package/dist/data/chat/tool-render/known-tools.js.map +1 -0
  452. package/dist/data/chat/tool-render/normalize.cjs +42 -0
  453. package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
  454. package/dist/data/chat/tool-render/normalize.d.ts +13 -0
  455. package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
  456. package/dist/data/chat/tool-render/normalize.js +42 -0
  457. package/dist/data/chat/tool-render/normalize.js.map +1 -0
  458. package/dist/data/chat/tool-render/registry.cjs +14 -0
  459. package/dist/data/chat/tool-render/registry.cjs.map +1 -0
  460. package/dist/data/chat/tool-render/registry.d.ts +7 -0
  461. package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
  462. package/dist/data/chat/tool-render/registry.js +14 -0
  463. package/dist/data/chat/tool-render/registry.js.map +1 -0
  464. package/dist/data/chat/tool-render/schema.cjs +57 -0
  465. package/dist/data/chat/tool-render/schema.cjs.map +1 -0
  466. package/dist/data/chat/tool-render/schema.d.ts +28 -0
  467. package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
  468. package/dist/data/chat/tool-render/schema.js +57 -0
  469. package/dist/data/chat/tool-render/schema.js.map +1 -0
  470. package/dist/data/chat/tool-render/shape.cjs +94 -0
  471. package/dist/data/chat/tool-render/shape.cjs.map +1 -0
  472. package/dist/data/chat/tool-render/shape.d.ts +39 -0
  473. package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
  474. package/dist/data/chat/tool-render/shape.js +94 -0
  475. package/dist/data/chat/tool-render/shape.js.map +1 -0
  476. package/dist/data/chat/tool-render/summary.cjs +34 -0
  477. package/dist/data/chat/tool-render/summary.cjs.map +1 -0
  478. package/dist/data/chat/tool-render/summary.d.ts +8 -0
  479. package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
  480. package/dist/data/chat/tool-render/summary.js +34 -0
  481. package/dist/data/chat/tool-render/summary.js.map +1 -0
  482. package/dist/data/chat/types.cjs.map +1 -1
  483. package/dist/data/chat/types.d.ts +7 -0
  484. package/dist/data/chat/types.d.ts.map +1 -1
  485. package/dist/data/chat/types.js.map +1 -1
  486. package/dist/data/chat/usage-snapshot.cjs +17 -0
  487. package/dist/data/chat/usage-snapshot.cjs.map +1 -0
  488. package/dist/data/chat/usage-snapshot.d.ts +21 -0
  489. package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
  490. package/dist/data/chat/usage-snapshot.js +17 -0
  491. package/dist/data/chat/usage-snapshot.js.map +1 -0
  492. package/dist/data/data-table-filter-values.cjs +83 -0
  493. package/dist/data/data-table-filter-values.cjs.map +1 -0
  494. package/dist/data/data-table-filter-values.d.ts +18 -0
  495. package/dist/data/data-table-filter-values.d.ts.map +1 -0
  496. package/dist/data/data-table-filter-values.js +83 -0
  497. package/dist/data/data-table-filter-values.js.map +1 -0
  498. package/dist/data/data-table-server-filters.cjs +171 -0
  499. package/dist/data/data-table-server-filters.cjs.map +1 -0
  500. package/dist/data/data-table-server-filters.d.ts +128 -0
  501. package/dist/data/data-table-server-filters.d.ts.map +1 -0
  502. package/dist/data/data-table-server-filters.js +171 -0
  503. package/dist/data/data-table-server-filters.js.map +1 -0
  504. package/dist/data/query-browser/QueryBrowser.cjs +96 -19
  505. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  506. package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
  507. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  508. package/dist/data/query-browser/QueryBrowser.js +96 -19
  509. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  510. package/dist/data/query-browser/index.d.ts +1 -1
  511. package/dist/data/query-browser/index.d.ts.map +1 -1
  512. package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
  513. package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
  514. package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
  515. package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
  516. package/dist/data/runtime/ProviderStatusPanel.js +187 -0
  517. package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
  518. package/dist/data/runtime/RuntimeBar.cjs +147 -0
  519. package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
  520. package/dist/data/{ai → runtime}/RuntimeBar.d.ts +8 -6
  521. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
  522. package/dist/data/runtime/RuntimeBar.js +147 -0
  523. package/dist/data/runtime/RuntimeBar.js.map +1 -0
  524. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
  525. package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
  526. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
  527. package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
  528. package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
  529. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
  530. package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
  531. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
  532. package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
  533. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
  534. package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
  535. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
  536. package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
  537. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
  538. package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +58 -124
  539. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
  540. package/dist/data/runtime/availability.cjs +11 -0
  541. package/dist/data/runtime/availability.cjs.map +1 -0
  542. package/dist/data/runtime/availability.d.ts +6 -0
  543. package/dist/data/runtime/availability.d.ts.map +1 -0
  544. package/dist/data/runtime/availability.js +11 -0
  545. package/dist/data/runtime/availability.js.map +1 -0
  546. package/dist/data/runtime/model-capabilities.cjs.map +1 -0
  547. package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
  548. package/dist/data/runtime/model-capabilities.js.map +1 -0
  549. package/dist/data/runtime/provider-status.cjs +106 -0
  550. package/dist/data/runtime/provider-status.cjs.map +1 -0
  551. package/dist/data/runtime/provider-status.d.ts +24 -0
  552. package/dist/data/runtime/provider-status.d.ts.map +1 -0
  553. package/dist/data/runtime/provider-status.js +106 -0
  554. package/dist/data/runtime/provider-status.js.map +1 -0
  555. package/dist/data/{ai → runtime}/runtime-mode.cjs +119 -27
  556. package/dist/data/runtime/runtime-mode.cjs.map +1 -0
  557. package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
  558. package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
  559. package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
  560. package/dist/data/runtime/runtime-mode.js.map +1 -0
  561. package/dist/data/task-query-keys.cjs +26 -0
  562. package/dist/data/task-query-keys.cjs.map +1 -0
  563. package/dist/data/task-query-keys.d.ts +27 -0
  564. package/dist/data/task-query-keys.d.ts.map +1 -0
  565. package/dist/data/task-query-keys.js +26 -0
  566. package/dist/data/task-query-keys.js.map +1 -0
  567. package/dist/data/version-info.cjs +3 -3
  568. package/dist/data/version-info.js +3 -3
  569. package/dist/data.cjs +16 -0
  570. package/dist/data.cjs.map +1 -1
  571. package/dist/data.d.ts +6 -2
  572. package/dist/data.d.ts.map +1 -1
  573. package/dist/data.js +16 -0
  574. package/dist/data.js.map +1 -1
  575. package/dist/hooks/use-hotkey.cjs +6 -1
  576. package/dist/hooks/use-hotkey.cjs.map +1 -1
  577. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  578. package/dist/hooks/use-hotkey.js +6 -1
  579. package/dist/hooks/use-hotkey.js.map +1 -1
  580. package/dist/hooks/use-task-run.cjs +7 -4
  581. package/dist/hooks/use-task-run.cjs.map +1 -1
  582. package/dist/hooks/use-task-run.d.ts +12 -0
  583. package/dist/hooks/use-task-run.d.ts.map +1 -1
  584. package/dist/hooks/use-task-run.js +7 -4
  585. package/dist/hooks/use-task-run.js.map +1 -1
  586. package/dist/icons/index.d.ts +1 -0
  587. package/dist/icons/index.d.ts.map +1 -1
  588. package/dist/icons/registry.cjs +692 -0
  589. package/dist/icons/registry.cjs.map +1 -0
  590. package/dist/icons/registry.d.ts +21 -0
  591. package/dist/icons/registry.d.ts.map +1 -0
  592. package/dist/icons/registry.js +692 -0
  593. package/dist/icons/registry.js.map +1 -0
  594. package/dist/icons.cjs +3 -0
  595. package/dist/icons.cjs.map +1 -1
  596. package/dist/icons.js +4 -1
  597. package/dist/icons.js.map +1 -1
  598. package/dist/index.cjs +47 -0
  599. package/dist/index.cjs.map +1 -1
  600. package/dist/index.js +49 -2
  601. package/dist/index.js.map +1 -1
  602. package/dist/layout/AppShell.cjs +92 -56
  603. package/dist/layout/AppShell.cjs.map +1 -1
  604. package/dist/layout/AppShell.d.ts +49 -1
  605. package/dist/layout/AppShell.d.ts.map +1 -1
  606. package/dist/layout/AppShell.js +92 -56
  607. package/dist/layout/AppShell.js.map +1 -1
  608. package/dist/layout/AppShell.nav.cjs +144 -19
  609. package/dist/layout/AppShell.nav.cjs.map +1 -1
  610. package/dist/layout/AppShell.nav.d.ts +6 -1
  611. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  612. package/dist/layout/AppShell.nav.js +144 -19
  613. package/dist/layout/AppShell.nav.js.map +1 -1
  614. package/dist/layout/SplitPane.cjs +23 -7
  615. package/dist/layout/SplitPane.cjs.map +1 -1
  616. package/dist/layout/SplitPane.d.ts +3 -1
  617. package/dist/layout/SplitPane.d.ts.map +1 -1
  618. package/dist/layout/SplitPane.js +23 -7
  619. package/dist/layout/SplitPane.js.map +1 -1
  620. package/dist/lib/format.cjs +86 -4
  621. package/dist/lib/format.cjs.map +1 -1
  622. package/dist/lib/format.d.ts +69 -0
  623. package/dist/lib/format.d.ts.map +1 -1
  624. package/dist/lib/format.js +86 -4
  625. package/dist/lib/format.js.map +1 -1
  626. package/dist/lib/path-tree.cjs +69 -0
  627. package/dist/lib/path-tree.cjs.map +1 -0
  628. package/dist/lib/path-tree.d.ts +54 -0
  629. package/dist/lib/path-tree.d.ts.map +1 -0
  630. package/dist/lib/path-tree.js +69 -0
  631. package/dist/lib/path-tree.js.map +1 -0
  632. package/dist/monaco.d.ts +1 -0
  633. package/dist/monaco.d.ts.map +1 -1
  634. package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
  635. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  636. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  637. package/dist/overlay/DropdownMenuSubmenu.js +13 -7
  638. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  639. package/dist/overlay/Tour.cjs +173 -0
  640. package/dist/overlay/Tour.cjs.map +1 -0
  641. package/dist/overlay/Tour.d.ts +61 -0
  642. package/dist/overlay/Tour.d.ts.map +1 -0
  643. package/dist/overlay/Tour.js +173 -0
  644. package/dist/overlay/Tour.js.map +1 -0
  645. package/dist/overlay/TourCard.cjs +108 -0
  646. package/dist/overlay/TourCard.cjs.map +1 -0
  647. package/dist/overlay/TourCard.d.ts +23 -0
  648. package/dist/overlay/TourCard.d.ts.map +1 -0
  649. package/dist/overlay/TourCard.js +108 -0
  650. package/dist/overlay/TourCard.js.map +1 -0
  651. package/dist/overlay/TourProvider.cjs +160 -0
  652. package/dist/overlay/TourProvider.cjs.map +1 -0
  653. package/dist/overlay/TourProvider.d.ts +31 -0
  654. package/dist/overlay/TourProvider.d.ts.map +1 -0
  655. package/dist/overlay/TourProvider.js +160 -0
  656. package/dist/overlay/TourProvider.js.map +1 -0
  657. package/dist/overlay/TourSpotlight.cjs +47 -0
  658. package/dist/overlay/TourSpotlight.cjs.map +1 -0
  659. package/dist/overlay/TourSpotlight.d.ts +12 -0
  660. package/dist/overlay/TourSpotlight.d.ts.map +1 -0
  661. package/dist/overlay/TourSpotlight.js +47 -0
  662. package/dist/overlay/TourSpotlight.js.map +1 -0
  663. package/dist/overlay/modalStack.cjs +18 -4
  664. package/dist/overlay/modalStack.cjs.map +1 -1
  665. package/dist/overlay/modalStack.d.ts +10 -2
  666. package/dist/overlay/modalStack.d.ts.map +1 -1
  667. package/dist/overlay/modalStack.js +19 -5
  668. package/dist/overlay/modalStack.js.map +1 -1
  669. package/dist/overlay/tour-anchor.cjs +114 -0
  670. package/dist/overlay/tour-anchor.cjs.map +1 -0
  671. package/dist/overlay/tour-anchor.d.ts +30 -0
  672. package/dist/overlay/tour-anchor.d.ts.map +1 -0
  673. package/dist/overlay/tour-anchor.js +114 -0
  674. package/dist/overlay/tour-anchor.js.map +1 -0
  675. package/dist/overlay/tour-context.cjs +12 -0
  676. package/dist/overlay/tour-context.cjs.map +1 -0
  677. package/dist/overlay/tour-context.d.ts +40 -0
  678. package/dist/overlay/tour-context.d.ts.map +1 -0
  679. package/dist/overlay/tour-context.js +12 -0
  680. package/dist/overlay/tour-context.js.map +1 -0
  681. package/dist/overlay/tour-geometry.cjs +65 -0
  682. package/dist/overlay/tour-geometry.cjs.map +1 -0
  683. package/dist/overlay/tour-geometry.d.ts +47 -0
  684. package/dist/overlay/tour-geometry.d.ts.map +1 -0
  685. package/dist/overlay/tour-geometry.js +65 -0
  686. package/dist/overlay/tour-geometry.js.map +1 -0
  687. package/dist/overlay/tour-model.cjs +79 -0
  688. package/dist/overlay/tour-model.cjs.map +1 -0
  689. package/dist/overlay/tour-model.d.ts +29 -0
  690. package/dist/overlay/tour-model.d.ts.map +1 -0
  691. package/dist/overlay/tour-model.js +79 -0
  692. package/dist/overlay/tour-model.js.map +1 -0
  693. package/dist/overlay/tour-progress.cjs +54 -0
  694. package/dist/overlay/tour-progress.cjs.map +1 -0
  695. package/dist/overlay/tour-progress.d.ts +40 -0
  696. package/dist/overlay/tour-progress.d.ts.map +1 -0
  697. package/dist/overlay/tour-progress.js +54 -0
  698. package/dist/overlay/tour-progress.js.map +1 -0
  699. package/dist/overlay/tour-types.d.ts +144 -0
  700. package/dist/overlay/tour-types.d.ts.map +1 -0
  701. package/dist/overlay/use-tour-anchor.cjs +43 -0
  702. package/dist/overlay/use-tour-anchor.cjs.map +1 -0
  703. package/dist/overlay/use-tour-anchor.d.ts +23 -0
  704. package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
  705. package/dist/overlay/use-tour-anchor.js +43 -0
  706. package/dist/overlay/use-tour-anchor.js.map +1 -0
  707. package/dist/overlay/use-tour-rect.cjs +33 -0
  708. package/dist/overlay/use-tour-rect.cjs.map +1 -0
  709. package/dist/overlay/use-tour-rect.d.ts +12 -0
  710. package/dist/overlay/use-tour-rect.d.ts.map +1 -0
  711. package/dist/overlay/use-tour-rect.js +33 -0
  712. package/dist/overlay/use-tour-rect.js.map +1 -0
  713. package/dist/overlay/use-tour-step.cjs +66 -0
  714. package/dist/overlay/use-tour-step.cjs.map +1 -0
  715. package/dist/overlay/use-tour-step.d.ts +45 -0
  716. package/dist/overlay/use-tour-step.d.ts.map +1 -0
  717. package/dist/overlay/use-tour-step.js +66 -0
  718. package/dist/overlay/use-tour-step.js.map +1 -0
  719. package/dist/overlay/zIndex.cjs +8 -0
  720. package/dist/overlay/zIndex.cjs.map +1 -1
  721. package/dist/overlay/zIndex.d.ts +8 -0
  722. package/dist/overlay/zIndex.d.ts.map +1 -1
  723. package/dist/overlay/zIndex.js +8 -0
  724. package/dist/overlay/zIndex.js.map +1 -1
  725. package/dist/rpc/CommandOutput.cjs +8 -0
  726. package/dist/rpc/CommandOutput.cjs.map +1 -1
  727. package/dist/rpc/CommandOutput.d.ts +4 -1
  728. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  729. package/dist/rpc/CommandOutput.js +8 -0
  730. package/dist/rpc/CommandOutput.js.map +1 -1
  731. package/dist/rpc/EntityExplorerApp.cjs +10 -16
  732. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  733. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  734. package/dist/rpc/EntityExplorerApp.js +10 -16
  735. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  736. package/dist/rpc/OperationActionBar.cjs +1 -1
  737. package/dist/rpc/OperationActionBar.cjs.map +1 -1
  738. package/dist/rpc/OperationActionBar.js +1 -1
  739. package/dist/rpc/OperationActionBar.js.map +1 -1
  740. package/dist/rpc/OperationCatalog.cjs +83 -7
  741. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  742. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  743. package/dist/rpc/OperationCatalog.js +84 -8
  744. package/dist/rpc/OperationCatalog.js.map +1 -1
  745. package/dist/rpc/OperationResultView.cjs +2 -0
  746. package/dist/rpc/OperationResultView.cjs.map +1 -1
  747. package/dist/rpc/OperationResultView.d.ts +6 -0
  748. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  749. package/dist/rpc/OperationResultView.js +2 -0
  750. package/dist/rpc/OperationResultView.js.map +1 -1
  751. package/dist/rpc/SchemaActionForm.cjs +2 -21
  752. package/dist/rpc/SchemaActionForm.cjs.map +1 -1
  753. package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
  754. package/dist/rpc/SchemaActionForm.js +3 -22
  755. package/dist/rpc/SchemaActionForm.js.map +1 -1
  756. package/dist/rpc/apiClient.cjs +16 -2
  757. package/dist/rpc/apiClient.cjs.map +1 -1
  758. package/dist/rpc/apiClient.d.ts.map +1 -1
  759. package/dist/rpc/apiClient.js +16 -2
  760. package/dist/rpc/apiClient.js.map +1 -1
  761. package/dist/rpc/formMetadata.cjs +89 -49
  762. package/dist/rpc/formMetadata.cjs.map +1 -1
  763. package/dist/rpc/formMetadata.d.ts +14 -6
  764. package/dist/rpc/formMetadata.d.ts.map +1 -1
  765. package/dist/rpc/formMetadata.js +87 -47
  766. package/dist/rpc/formMetadata.js.map +1 -1
  767. package/dist/rpc/operationFilterSearch.cjs +23 -0
  768. package/dist/rpc/operationFilterSearch.cjs.map +1 -0
  769. package/dist/rpc/operationFilterSearch.d.ts +22 -0
  770. package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
  771. package/dist/rpc/operationFilterSearch.js +23 -0
  772. package/dist/rpc/operationFilterSearch.js.map +1 -0
  773. package/dist/rpc/operationLookupFetcher.cjs +28 -0
  774. package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
  775. package/dist/rpc/operationLookupFetcher.d.ts +17 -0
  776. package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
  777. package/dist/rpc/operationLookupFetcher.js +28 -0
  778. package/dist/rpc/operationLookupFetcher.js.map +1 -0
  779. package/dist/rpc/surfaceNav.cjs +77 -0
  780. package/dist/rpc/surfaceNav.cjs.map +1 -0
  781. package/dist/rpc/surfaceNav.d.ts +19 -0
  782. package/dist/rpc/surfaceNav.d.ts.map +1 -0
  783. package/dist/rpc/surfaceNav.js +77 -0
  784. package/dist/rpc/surfaceNav.js.map +1 -0
  785. package/dist/rpc/types.cjs.map +1 -1
  786. package/dist/rpc/types.d.ts +12 -1
  787. package/dist/rpc/types.d.ts.map +1 -1
  788. package/dist/rpc/types.js.map +1 -1
  789. package/dist/rpc.cjs +2 -0
  790. package/dist/rpc.cjs.map +1 -1
  791. package/dist/rpc.d.ts +1 -0
  792. package/dist/rpc.d.ts.map +1 -1
  793. package/dist/rpc.js +2 -0
  794. package/dist/rpc.js.map +1 -1
  795. package/dist/styles.css +1 -1
  796. package/dist/utils.cjs +8 -0
  797. package/dist/utils.cjs.map +1 -1
  798. package/dist/utils.d.ts +2 -1
  799. package/dist/utils.d.ts.map +1 -1
  800. package/dist/utils.js +10 -2
  801. package/dist/utils.js.map +1 -1
  802. package/package.json +1 -1
  803. package/dist/data/ai/RuntimeBar.cjs.map +0 -1
  804. package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
  805. package/dist/data/ai/RuntimeBar.js.map +0 -1
  806. package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
  807. package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
  808. package/dist/data/ai/RuntimeBar.model.js.map +0 -1
  809. package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
  810. package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
  811. package/dist/data/ai/RuntimeBarCombo.js.map +0 -1
  812. package/dist/data/ai/model-capabilities.cjs.map +0 -1
  813. package/dist/data/ai/model-capabilities.d.ts.map +0 -1
  814. package/dist/data/ai/model-capabilities.js.map +0 -1
  815. package/dist/data/ai/runtime-mode.cjs.map +0 -1
  816. package/dist/data/ai/runtime-mode.d.ts.map +0 -1
  817. package/dist/data/ai/runtime-mode.js.map +0 -1
  818. /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
  819. /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
  820. /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
  821. /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
  822. /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
@@ -14,6 +14,34 @@ function readStored(key) {
14
14
  if (!key || typeof window === "undefined") return null;
15
15
  return window.localStorage.getItem(key);
16
16
  }
17
+ const DEFAULT_GROUP_COLLAPSE_KEY = "clicky-ui:app-shell:groups";
18
+ function readGroupState(storageKey) {
19
+ if (typeof window === "undefined") return {};
20
+ try {
21
+ const raw = window.localStorage.getItem(storageKey);
22
+ if (!raw) return {};
23
+ const parsed = JSON.parse(raw);
24
+ return parsed && typeof parsed === "object" ? parsed : {};
25
+ } catch {
26
+ return {};
27
+ }
28
+ }
29
+ function useGroupCollapsed(storageKey) {
30
+ const [state, setState] = useState(
31
+ () => readGroupState(storageKey)
32
+ );
33
+ useEffect(() => {
34
+ if (typeof window === "undefined") return;
35
+ try {
36
+ window.localStorage.setItem(storageKey, JSON.stringify(state));
37
+ } catch {
38
+ }
39
+ }, [state, storageKey]);
40
+ return {
41
+ isCollapsed: (key, fallback) => state[key] ?? fallback,
42
+ toggle: (key, fallback) => setState((prev) => ({ ...prev, [key]: !(prev[key] ?? fallback) }))
43
+ };
44
+ }
17
45
  function AppShell(props) {
18
46
  const {
19
47
  brand,
@@ -30,6 +58,7 @@ function AppShell(props) {
30
58
  collapsible = true,
31
59
  defaultCollapsed = false,
32
60
  collapsedStorageKey,
61
+ groupCollapsedStorageKey,
33
62
  sidebarWidth = 240,
34
63
  collapsedWidth = 56,
35
64
  mobileSidebarLabel = "Navigation",
@@ -57,8 +86,10 @@ function AppShell(props) {
57
86
  window.localStorage.setItem(collapsedStorageKey, String(collapsed));
58
87
  }, [collapsed, collapsedStorageKey]);
59
88
  useEscapeLayer(mobileSidebarOpen, () => setMobileSidebarOpen(false));
89
+ const groupState = useGroupCollapsed(
90
+ groupCollapsedStorageKey ?? DEFAULT_GROUP_COLLAPSE_KEY
91
+ );
60
92
  const railWidth = collapsed ? collapsedWidth : sidebarWidth;
61
- const compactActions = mobileActions ?? actions;
62
93
  const hasTopBar = !hasSidebar && brand !== void 0 || nav !== void 0 || search !== void 0 || actions !== void 0 || mobileActions !== void 0 || toolbar !== void 0;
63
94
  const hasMobileHeader = hasSidebar;
64
95
  const hasBodyHeader = bodyHeader !== void 0 || bodyActions !== void 0;
@@ -68,6 +99,7 @@ function AppShell(props) {
68
99
  {
69
100
  sections: navSections,
70
101
  collapsed: collapsedValue,
102
+ groupState,
71
103
  ...onNavigate ? { onNavigate } : {}
72
104
  }
73
105
  );
@@ -143,56 +175,71 @@ function AppShell(props) {
143
175
  "data-slot": "app-shell-header",
144
176
  className: "shrink-0 border-b border-border bg-card",
145
177
  children: [
146
- hasMobileHeader && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 md:hidden", children: [
147
- /* @__PURE__ */ jsx(
148
- "button",
149
- {
150
- type: "button",
151
- "aria-label": `Open ${mobileSidebarLabel}`,
152
- title: mobileSidebarLabel,
153
- 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",
154
- onClick: () => setMobileSidebarOpen(true),
155
- children: /* @__PURE__ */ jsx(Icon, { icon: UiMenu, className: "h-4 w-4" })
156
- }
157
- ),
158
- brand && /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 items-center gap-density-2", children: brand }),
159
- compactActions && /* @__PURE__ */ jsx("div", { className: "ml-auto flex min-w-0 shrink items-center justify-end gap-density-2", children: compactActions }),
160
- search !== void 0 && /* @__PURE__ */ jsx("div", { className: "basis-full min-w-0", children: search }),
161
- nav && /* @__PURE__ */ jsx("div", { className: "basis-full min-w-0 overflow-x-auto", children: nav })
162
- ] }),
163
178
  /* @__PURE__ */ jsxs(
164
179
  "div",
165
180
  {
166
181
  className: cn(
167
- "hidden h-14 items-center gap-density-3 px-density-4 md:flex",
168
- !hasSidebar && "flex",
182
+ 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 h-14 items-center gap-density-3 px-density-4",
169
183
  headerClassName
170
184
  ),
171
185
  children: [
172
- !hasSidebar && brand && /* @__PURE__ */ jsx(
186
+ hasSidebar && /* @__PURE__ */ jsx(
187
+ "button",
188
+ {
189
+ type: "button",
190
+ "aria-label": `Open ${mobileSidebarLabel}`,
191
+ title: mobileSidebarLabel,
192
+ 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",
193
+ onClick: () => setMobileSidebarOpen(true),
194
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiMenu, className: "h-4 w-4" })
195
+ }
196
+ ),
197
+ brand && /* @__PURE__ */ jsx(
173
198
  "div",
174
199
  {
175
200
  "data-slot": "app-shell-brand",
176
- className: "flex shrink-0 items-center gap-density-2",
201
+ className: cn(
202
+ "min-w-0 items-center gap-density-2",
203
+ hasSidebar ? "flex flex-1 md:hidden" : "flex shrink-0"
204
+ ),
177
205
  children: brand
178
206
  }
179
207
  ),
180
- nav && /* @__PURE__ */ jsx("div", { "data-slot": "app-shell-nav", className: "flex shrink-0 items-center", children: nav }),
208
+ nav && /* @__PURE__ */ jsx(
209
+ "div",
210
+ {
211
+ "data-slot": "app-shell-nav",
212
+ className: cn(
213
+ "flex min-w-0 items-center",
214
+ hasSidebar && "order-3 basis-full overflow-x-auto md:order-none md:basis-auto md:overflow-visible"
215
+ ),
216
+ children: nav
217
+ }
218
+ ),
181
219
  search !== void 0 && /* @__PURE__ */ jsx(
182
220
  "div",
183
221
  {
184
222
  "data-slot": "app-shell-search",
185
- className: "flex min-w-0 flex-1 justify-center",
223
+ className: cn(
224
+ "flex min-w-0 flex-1 justify-center",
225
+ hasSidebar && "order-2 basis-full md:order-none md:basis-auto md:flex-1"
226
+ ),
186
227
  children: /* @__PURE__ */ jsx("div", { className: "w-full", style: { maxWidth: searchMaxWidth }, children: search })
187
228
  }
188
229
  ),
189
- search === void 0 && /* @__PURE__ */ jsx("div", { className: "flex-1" }),
190
- actions && /* @__PURE__ */ jsx(
230
+ search === void 0 && /* @__PURE__ */ jsx("div", { className: cn("flex-1", hasSidebar && "hidden md:block") }),
231
+ (actions !== void 0 || hasSidebar && mobileActions !== void 0) && /* @__PURE__ */ jsx(
191
232
  "div",
192
233
  {
193
234
  "data-slot": "app-shell-actions",
194
- className: "flex shrink-0 items-center gap-density-2",
195
- children: actions
235
+ className: cn(
236
+ "flex shrink-0 items-center gap-density-2",
237
+ hasSidebar && "order-1 ml-auto md:order-none md:ml-0"
238
+ ),
239
+ children: !hasSidebar || mobileActions === void 0 ? actions : /* @__PURE__ */ jsxs(Fragment, { children: [
240
+ /* @__PURE__ */ jsx("div", { className: "hidden items-center gap-density-2 md:flex", children: actions }),
241
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-density-2 md:hidden", children: mobileActions })
242
+ ] })
196
243
  }
197
244
  )
198
245
  ]
@@ -244,48 +291,37 @@ function AppShell(props) {
244
291
  )
245
292
  }
246
293
  ),
247
- bodySidebar !== void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
248
- /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden md:hidden", children: [
249
- /* @__PURE__ */ jsx(
294
+ bodySidebar !== void 0 ? /* @__PURE__ */ jsx(
295
+ SplitPane,
296
+ {
297
+ stackOnMobile: true,
298
+ className: "min-h-0 flex-1",
299
+ defaultSplit: bodySplit,
300
+ minLeft: 12,
301
+ minRight: 30,
302
+ left: /* @__PURE__ */ jsx(
250
303
  "div",
251
304
  {
252
305
  "data-slot": "app-shell-body-sidebar",
253
- className: "max-h-[40vh] shrink-0 overflow-y-auto border-b border-border bg-background",
306
+ className: "h-full",
254
307
  children: bodySidebar
255
308
  }
256
309
  ),
257
- /* @__PURE__ */ jsx(
310
+ right: /* @__PURE__ */ jsx(
258
311
  "main",
259
312
  {
260
313
  "data-slot": "app-shell-main",
261
314
  className: cn(
262
- "min-h-0 min-w-0 flex-1 overflow-auto",
315
+ "h-full min-h-0 min-w-0 overflow-auto",
263
316
  contentClassName
264
317
  ),
265
318
  children
266
319
  }
267
- )
268
- ] }),
269
- /* @__PURE__ */ jsx(
270
- SplitPane,
271
- {
272
- className: "hidden min-h-0 flex-1 md:flex",
273
- defaultSplit: bodySplit,
274
- minLeft: 12,
275
- minRight: 30,
276
- left: /* @__PURE__ */ jsx("div", { "data-slot": "app-shell-body-sidebar", className: "h-full", children: bodySidebar }),
277
- right: /* @__PURE__ */ jsx(
278
- "div",
279
- {
280
- "data-slot": "app-shell-main",
281
- className: cn("h-full min-w-0", contentClassName),
282
- children
283
- }
284
- ),
285
- rightClass: "overflow-y-auto"
286
- }
287
- )
288
- ] }) : /* @__PURE__ */ jsx(
320
+ ),
321
+ leftClass: "max-h-[40vh] shrink-0 border-b border-border md:max-h-none md:border-b-0",
322
+ rightClass: "min-h-0 flex-1 md:flex-none"
323
+ }
324
+ ) : /* @__PURE__ */ jsx(
289
325
  "main",
290
326
  {
291
327
  "data-slot": "app-shell-main",
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.js","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 { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections } from \"./AppShell.nav\";\nimport {\n contentWidthClassName,\n type ContentWidth,\n} 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 /** 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};\n\nexport type AppShellNavSection = {\n /** Section heading; collapses to a divider when the rail is collapsed. */\n label?: string;\n items: AppShellNavItem[];\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 /** 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\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 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 const railWidth = collapsed ? collapsedWidth : sidebarWidth;\n const compactActions = mobileActions ?? actions;\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 = (collapsedValue: boolean, onNavigate?: () => void) =>\n typeof sidebar === \"function\"\n ? sidebar(collapsedValue)\n : sidebar !== undefined\n ? sidebar\n : navSections && (\n <NavSections\n sections={navSections}\n collapsed={collapsedValue}\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 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 data-slot=\"app-shell-brand\" className=\"flex min-w-0 items-center gap-2\">\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 {hasMobileHeader && (\n <div className=\"flex flex-wrap items-center gap-density-2 px-density-3 py-density-2 md:hidden\">\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\"\n onClick={() => setMobileSidebarOpen(true)}\n >\n <Icon icon={UiMenu} className=\"h-4 w-4\" />\n </button>\n {brand && (\n <div className=\"flex min-w-0 flex-1 items-center gap-density-2\">\n {brand}\n </div>\n )}\n {compactActions && (\n <div className=\"ml-auto flex min-w-0 shrink items-center justify-end gap-density-2\">\n {compactActions}\n </div>\n )}\n {search !== undefined && (\n <div className=\"basis-full min-w-0\">\n {search}\n </div>\n )}\n {nav && (\n <div className=\"basis-full min-w-0 overflow-x-auto\">\n {nav}\n </div>\n )}\n </div>\n )}\n <div\n className={cn(\n \"hidden h-14 items-center gap-density-3 px-density-4 md:flex\",\n !hasSidebar && \"flex\",\n headerClassName,\n )}\n >\n {!hasSidebar && brand && (\n <div\n data-slot=\"app-shell-brand\"\n className=\"flex shrink-0 items-center gap-density-2\"\n >\n {brand}\n </div>\n )}\n {nav && (\n <div data-slot=\"app-shell-nav\" className=\"flex shrink-0 items-center\">\n {nav}\n </div>\n )}\n {search !== undefined && (\n <div\n data-slot=\"app-shell-search\"\n className=\"flex min-w-0 flex-1 justify-center\"\n >\n <div className=\"w-full\" style={{ maxWidth: searchMaxWidth }}>\n {search}\n </div>\n </div>\n )}\n {search === undefined && <div className=\"flex-1\" />}\n {actions && (\n <div\n data-slot=\"app-shell-actions\"\n className=\"flex shrink-0 items-center gap-density-2\"\n >\n {actions}\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 <>\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden md:hidden\">\n <div\n data-slot=\"app-shell-body-sidebar\"\n className=\"max-h-[40vh] shrink-0 overflow-y-auto border-b border-border bg-background\"\n >\n {bodySidebar}\n </div>\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 <SplitPane\n className=\"hidden min-h-0 flex-1 md:flex\"\n defaultSplit={bodySplit}\n minLeft={12}\n minRight={30}\n left={<div data-slot=\"app-shell-body-sidebar\" className=\"h-full\">{bodySidebar}</div>}\n right={\n <div\n data-slot=\"app-shell-main\"\n className={cn(\"h-full min-w-0\", contentClassName)}\n >\n {children}\n </div>\n }\n rightClass=\"overflow-y-auto\"\n />\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 && <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>}\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"],"names":[],"mappings":";;;;;;;;;;;;AAgHA,SAAS,WAAW,KAAwC;AAC1D,MAAI,CAAC,OAAO,OAAO,WAAW,YAAa,QAAO;AAClD,SAAO,OAAO,aAAa,QAAQ,GAAG;AACxC;AAEO,SAAS,SAAS,OAAsB;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB;AAAA,IACA,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,eAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,aAAa,YAAY,YAAc,2CAAa,WAAU,KAAK;AACzE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAEhE,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IAChC,MACE,WAAW,mBAAmB,MAAM,UACnC,WAAW,mBAAmB,MAAM,QAAQ;AAAA,EAAA;AAGjD,YAAU,MAAM;AACd,QAAI,uBAAuB,OAAO,WAAW;AAC3C,aAAO,aAAa,QAAQ,qBAAqB,OAAO,SAAS,CAAC;AAAA,EACtE,GAAG,CAAC,WAAW,mBAAmB,CAAC;AAEnC,iBAAe,mBAAmB,MAAM,qBAAqB,KAAK,CAAC;AAEnE,QAAM,YAAY,YAAY,iBAAiB;AAC/C,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,YACH,CAAC,cAAc,UAAU,UAC1B,QAAQ,UACR,WAAW,UACX,YAAY,UACZ,kBAAkB,UAClB,YAAY;AACd,QAAM,kBAAkB;AACxB,QAAM,gBAAgB,eAAe,UAAa,gBAAgB;AAClE,QAAM,wBACJ,gBAAgB,SAAY,eAAe;AAC7C,QAAM,uBAAuB,CAAC,gBAAyB,eACrD,OAAO,YAAY,aACf,QAAQ,cAAc,IACtB,YAAY,SACV,UACA,eACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAW;AAAA,MACV,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,IAAC;AAAA,EAAA;AAIhD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAG,4CAA4C,SAAS;AAAA,MAClE,GAAI,aAAa,EAAE,oBAAoB,OAAA,IAAW,CAAA;AAAA,MAElD,UAAA;AAAA,QAAA,kCAAe,sBAAA,EAAqB;AAAA,QACpC,cACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,OAAO,EAAE,OAAO,UAAA;AAAA,YAChB,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YAAA;AAAA,YAGF,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,YACI,wBACA;AAAA,kBAAA;AAAA,kBAGL,UAAA;AAAA,oBAAA,CAAC,aAAa,SACb,oBAAC,OAAA,EAAI,aAAU,mBAAkB,WAAU,mCACxC,UAAA,MAAA,CACH;AAAA,oBAED,eACC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;AAAA,wBACrC,cAAY,YAAY,mBAAmB;AAAA,wBAC3C,OAAO,YAAY,mBAAmB;AAAA,wBACtC,WAAU;AAAA,wBAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,WAAW,WAAU,UAAA,CAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAC7C;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGH,iBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBAET,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,kCAGJ,OAAA,EAAI,WAAU,+CACZ,UAAA,qBAAqB,SAAS,GACjC;AAAA,cACC,iBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBAET,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAKN;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,aAAU;AAAA,YACV,WAAU;AAAA,YAER,UAAA;AAAA,eAAA,aAAa,oBACb;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBAET,UAAA;AAAA,oBAAA,mBACC,qBAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAY,QAAQ,kBAAkB;AAAA,0BACtC,OAAO;AAAA,0BACP,WAAU;AAAA,0BACV,SAAS,MAAM,qBAAqB,IAAI;AAAA,0BAExC,UAAA,oBAAC,MAAA,EAAK,MAAM,QAAQ,WAAU,UAAA,CAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEzC,SACC,oBAAC,OAAA,EAAI,WAAU,kDACZ,UAAA,OACH;AAAA,sBAED,kBACC,oBAAC,OAAA,EAAI,WAAU,sEACZ,UAAA,gBACH;AAAA,sBAED,WAAW,UACV,oBAAC,OAAA,EAAI,WAAU,sBACZ,UAAA,QACH;AAAA,sBAED,OACC,oBAAC,OAAA,EAAI,WAAU,sCACZ,UAAA,IAAA,CACH;AAAA,oBAAA,GAEJ;AAAA,oBAEF;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAW;AAAA,0BACT;AAAA,0BACA,CAAC,cAAc;AAAA,0BACf;AAAA,wBAAA;AAAA,wBAGD,UAAA;AAAA,0BAAA,CAAC,cAAc,SACd;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,aAAU;AAAA,8BACV,WAAU;AAAA,8BAET,UAAA;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAGJ,OACC,oBAAC,OAAA,EAAI,aAAU,iBAAgB,WAAU,8BACtC,UAAA,KACH;AAAA,0BAED,WAAW,UACV;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,aAAU;AAAA,8BACV,WAAU;AAAA,8BAEV,UAAA,oBAAC,SAAI,WAAU,UAAS,OAAO,EAAE,UAAU,kBACxC,UAAA,OAAA,CACH;AAAA,4BAAA;AAAA,0BAAA;AAAA,0BAGH,WAAW,UAAa,oBAAC,OAAA,EAAI,WAAU,UAAS;AAAA,0BAChD,WACC;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,aAAU;AAAA,8BACV,WAAU;AAAA,8BAET,UAAA;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBACH;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGH,WACC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,aAAU;AAAA,wBACV,WAAW;AAAA,0BACT;AAAA,0BACA;AAAA,wBAAA;AAAA,wBAGD,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACH;AAAA,gBAAA;AAAA,cAAA;AAAA,cAKL,iBACC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,kBAGF,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,aAAU;AAAA,sBACV,sBAAoB;AAAA,sBACpB,WAAW;AAAA,wBACT;AAAA,wBACA,sBAAsB,qBAAqB;AAAA,sBAAA;AAAA,sBAG7C,UAAA;AAAA,wBAAA,oBAAC,OAAA,EAAI,WAAU,kBAAkB,UAAA,YAAW;AAAA,wBAC3C,eACC;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,aAAU;AAAA,4BACV,WAAU;AAAA,4BAET,UAAA;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBACH;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEJ;AAAA,cAAA;AAAA,cAIH,gBAAgB,SACf,qBAAA,UAAA,EACE,UAAA;AAAA,gBAAA,qBAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,aAAU;AAAA,sBACV,WAAU;AAAA,sBAET,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEH;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,aAAU;AAAA,sBACV,WAAW;AAAA,wBACT;AAAA,wBACA;AAAA,sBAAA;AAAA,sBAGD;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH,GACF;AAAA,gBACA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAU;AAAA,oBACV,cAAc;AAAA,oBACd,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,MAAM,oBAAC,OAAA,EAAI,aAAU,0BAAyB,WAAU,UAAU,UAAA,aAAY;AAAA,oBAC9E,OACE;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,aAAU;AAAA,wBACV,WAAW,GAAG,kBAAkB,gBAAgB;AAAA,wBAE/C;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGL,YAAW;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACb,EAAA,CACF,IAEA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,kBAGF,UAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,aAAU;AAAA,sBACV,sBAAoB;AAAA,sBACpB,WAAW,GAAG,sBAAsB,YAAY,GAAG,QAAQ;AAAA,sBAE1D;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH,cAAc,qBACb;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,MAAM,qBAAqB,KAAK;AAAA,YAEzC,UAAA;AAAA,cAAA,oBAAC,OAAA,EAAI,WAAU,+BAAA,CAA+B;AAAA,cAC9C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,cAAY;AAAA,kBACZ,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBAAA;AAAA,kBAEF,SAAS,CAAC,UAAU,MAAM,gBAAA;AAAA,kBAE1B,UAAA;AAAA,oBAAA,qBAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,sBAAA,SAAS,oBAAC,OAAA,EAAI,WAAU,mCAAmC,UAAA,OAAM;AAAA,sBAClE;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,cAAY,SAAS,kBAAkB;AAAA,0BACvC,OAAM;AAAA,0BACN,WAAU;AAAA,0BACV,SAAS,MAAM,qBAAqB,KAAK;AAAA,0BAEzC,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAA,CAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAC3C,GACF;AAAA,oBACC,iBACC,oBAAC,OAAA,EAAI,WAAU,qEACZ,UAAA,eACH;AAAA,oBAEF,oBAAC,OAAA,EAAI,WAAU,+CACZ,UAAA,qBAAqB,OAAO,MAAM,qBAAqB,KAAK,CAAC,EAAA,CAChE;AAAA,oBACC,iBACC,oBAAC,OAAA,EAAI,WAAU,6EACZ,UAAA,cAAA,CACH;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;"}
1
+ {"version":3,"file":"AppShell.js","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 { SplitPane } from \"./SplitPane\";\nimport { AppShellSlotOutlines } from \"./AppShell.debug\";\nimport { NavSections, type GroupState } from \"./AppShell.nav\";\nimport {\n contentWidthClassName,\n type ContentWidth,\n} 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 /** 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};\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 /** 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 * Mirrors `Tree.revealSelected`: 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 /** 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\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 = (collapsedValue: boolean, onNavigate?: () => void) =>\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 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 data-slot=\"app-shell-brand\" className=\"flex min-w-0 items-center gap-2\">\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 : \"flex h-14 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 \"flex min-w-0 items-center\",\n hasSidebar &&\n \"order-3 basis-full overflow-x-auto md:order-none md:basis-auto md:overflow-visible\",\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 className={cn(\"flex-1\", hasSidebar && \"hidden md:block\")} />\n )}\n {(actions !== undefined || (hasSidebar && mobileActions !== undefined)) && (\n <div\n data-slot=\"app-shell-actions\"\n className={cn(\n \"flex shrink-0 items-center gap-density-2\",\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\n data-slot=\"app-shell-body-sidebar\"\n className=\"h-full\"\n >\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 && <div className=\"flex min-w-0 items-center gap-2\">{brand}</div>}\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"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ const router = require("../rpc/router.cjs");
7
7
  function NavSections({
8
8
  sections,
9
9
  collapsed,
10
+ groupState,
10
11
  onNavigate
11
12
  }) {
12
13
  const { renderLink } = router.useRouter();
@@ -17,28 +18,152 @@ function NavSections({
17
18
  "flex flex-col gap-0.5",
18
19
  collapsed ? "px-2" : "px-density-2"
19
20
  ),
20
- children: sections.map((section, index) => /* @__PURE__ */ jsxRuntime.jsxs(
21
- "div",
21
+ children: sections.map((section, index) => {
22
+ var _a, _b;
23
+ return /* @__PURE__ */ jsxRuntime.jsxs(
24
+ "div",
25
+ {
26
+ className: "flex flex-col",
27
+ children: [
28
+ section.label && (collapsed ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1", children: section.label })),
29
+ (_a = section.items) == null ? void 0 : _a.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
30
+ NavItemRow,
31
+ {
32
+ item,
33
+ collapsed,
34
+ renderLink,
35
+ ...onNavigate ? { onNavigate } : {}
36
+ },
37
+ item.key
38
+ )),
39
+ (_b = section.groups) == null ? void 0 : _b.map(
40
+ (group) => (
41
+ // A collapsed rail has no room for group headings, so the whole
42
+ // subtree flattens into the icon strip rather than hiding behind
43
+ // toggles the user cannot see.
44
+ collapsed ? flattenGroup(group).map((item) => /* @__PURE__ */ jsxRuntime.jsx(
45
+ NavItemRow,
46
+ {
47
+ item,
48
+ collapsed: true,
49
+ renderLink,
50
+ ...onNavigate ? { onNavigate } : {}
51
+ },
52
+ item.key
53
+ )) : /* @__PURE__ */ jsxRuntime.jsx(
54
+ NavGroupRows,
55
+ {
56
+ group,
57
+ variant: section.variant ?? "list",
58
+ renderLink,
59
+ groupState,
60
+ ...onNavigate ? { onNavigate } : {}
61
+ },
62
+ group.key
63
+ )
64
+ )
65
+ )
66
+ ]
67
+ },
68
+ section.label ?? `section-${index}`
69
+ );
70
+ })
71
+ }
72
+ );
73
+ }
74
+ function flattenGroup(group) {
75
+ return [
76
+ ...group.item ? [group.item] : [],
77
+ ...group.items,
78
+ ...(group.groups ?? []).flatMap(flattenGroup)
79
+ ];
80
+ }
81
+ function NavGroupRows({
82
+ group,
83
+ variant,
84
+ renderLink,
85
+ groupState,
86
+ onNavigate
87
+ }) {
88
+ var _a;
89
+ const fallback = group.defaultCollapsed ?? false;
90
+ const collapsed = !group.forceExpanded && groupState.isCollapsed(group.key, fallback);
91
+ const toggle = () => groupState.toggle(group.key, fallback);
92
+ const chevron = /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "text-[0.65rem] opacity-60", children: collapsed ? "▸" : "▾" });
93
+ const groupIcon = group.icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-4 w-4 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
94
+ Icon.Icon,
95
+ {
96
+ ...typeof group.icon === "string" ? { name: group.icon } : { icon: group.icon }
97
+ }
98
+ ) });
99
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
100
+ group.item ? (
101
+ // Folder AND leaf: the link and the disclosure are siblings. Nesting a
102
+ // button inside the anchor would be invalid DOM and would make the
103
+ // click target ambiguous.
104
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/nav flex items-center gap-1", children: [
105
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
106
+ NavItemRow,
107
+ {
108
+ item: group.item,
109
+ collapsed: false,
110
+ renderLink,
111
+ ...onNavigate ? { onNavigate } : {}
112
+ }
113
+ ) }),
114
+ /* @__PURE__ */ jsxRuntime.jsx(
115
+ "button",
116
+ {
117
+ type: "button",
118
+ onClick: toggle,
119
+ "aria-expanded": !collapsed,
120
+ "aria-label": `${collapsed ? "Expand" : "Collapse"} ${group.label}`,
121
+ className: "shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
122
+ children: chevron
123
+ }
124
+ )
125
+ ] })
126
+ ) : /* @__PURE__ */ jsxRuntime.jsxs(
127
+ "button",
128
+ {
129
+ type: "button",
130
+ onClick: toggle,
131
+ "aria-expanded": !collapsed,
132
+ className: utils.cn(
133
+ "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",
134
+ variant === "tree" ? "text-[13px] text-sidebar-foreground" : "text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55"
135
+ ),
136
+ children: [
137
+ groupIcon,
138
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 truncate text-left", children: group.label }),
139
+ chevron
140
+ ]
141
+ }
142
+ ),
143
+ !collapsed && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2", children: [
144
+ group.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
145
+ NavItemRow,
146
+ {
147
+ item,
148
+ collapsed: false,
149
+ renderLink,
150
+ ...onNavigate ? { onNavigate } : {}
151
+ },
152
+ item.key
153
+ )),
154
+ (_a = group.groups) == null ? void 0 : _a.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
155
+ NavGroupRows,
22
156
  {
23
- className: "flex flex-col",
24
- children: [
25
- section.label && (collapsed ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1", children: section.label })),
26
- section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
27
- NavItemRow,
28
- {
29
- item,
30
- collapsed,
31
- renderLink,
32
- ...onNavigate ? { onNavigate } : {}
33
- },
34
- item.key
35
- ))
36
- ]
157
+ group: child,
158
+ variant,
159
+ renderLink,
160
+ groupState,
161
+ ...onNavigate ? { onNavigate } : {}
37
162
  },
38
- section.label ?? `section-${index}`
163
+ child.key
39
164
  ))
40
- }
41
- );
165
+ ] })
166
+ ] });
42
167
  }
43
168
  function NavItemRow({
44
169
  item,
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.nav.cjs","sources":["../../src/layout/AppShell.nav.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport type { RenderLink } from \"../rpc/EndpointList\";\nimport { useRouter } from \"../rpc/router\";\nimport type { AppShellNavItem, AppShellNavSection } from \"./AppShell\";\n\nexport function NavSections({\n sections,\n collapsed,\n onNavigate,\n}: {\n sections: AppShellNavSection[];\n collapsed: boolean;\n onNavigate?: () => void;\n}) {\n const { renderLink } = useRouter();\n return (\n <nav\n className={cn(\n \"flex flex-col gap-0.5\",\n collapsed ? \"px-2\" : \"px-density-2\",\n )}\n >\n {sections.map((section, index) => (\n <div\n key={section.label ?? `section-${index}`}\n className=\"flex flex-col\"\n >\n {section.label &&\n (collapsed ? (\n <div className=\"mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1\" />\n ) : (\n <div className=\"mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1\">\n {section.label}\n </div>\n ))}\n {section.items.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n </div>\n ))}\n </nav>\n );\n}\n\nfunction NavItemRow({\n item,\n collapsed,\n renderLink,\n onNavigate,\n}: {\n item: AppShellNavItem;\n collapsed: boolean;\n renderLink: RenderLink;\n onNavigate?: () => void;\n}) {\n const className = cn(\n \"flex w-full items-center gap-2.5 rounded-md px-density-2 py-1.5 text-left text-[13px] text-sidebar-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n collapsed && \"justify-center px-0\",\n item.active && \"bg-sidebar-accent font-medium text-sidebar-primary\",\n );\n const children: ReactNode = (\n <>\n {item.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof item.icon === \"string\"\n ? { name: item.icon }\n : { icon: item.icon })}\n />\n </span>\n )}\n {!collapsed && <span className=\"flex-1 truncate\">{item.label}</span>}\n {!collapsed && item.badge}\n </>\n );\n const title =\n collapsed && typeof item.label === \"string\" ? item.label : undefined;\n\n if (item.external) {\n return (\n <a\n href={item.to}\n className={className}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onNavigate}\n >\n {children}\n </a>\n );\n }\n const link = renderLink({\n key: item.key,\n to: item.to,\n className,\n children,\n ...(title ? { title } : {}),\n });\n\n if (!onNavigate) return link;\n return <div onClick={onNavigate}>{link}</div>;\n}\n"],"names":["useRouter","jsx","cn","jsxs","Fragment","Icon"],"mappings":";;;;;;AAOO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,WAAA,IAAeA,iBAAA;AACvB,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,YAAY,SAAS;AAAA,MAAA;AAAA,MAGtB,UAAA,SAAS,IAAI,CAAC,SAAS,UACtBC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UAET,UAAA;AAAA,YAAA,QAAQ,UACN,YACCF,2BAAAA,IAAC,OAAA,EAAI,WAAU,2DAAA,CAA2D,IAE1EA,2BAAAA,IAAC,OAAA,EAAI,WAAU,wHACZ,UAAA,QAAQ,MAAA,CACX;AAAA,YAEH,QAAQ,MAAM,IAAI,CAAC,SAClBA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACC,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,cAAC;AAAA,cAJ/B,KAAK;AAAA,YAAA,CAMb;AAAA,UAAA;AAAA,QAAA;AAAA,QAnBI,QAAQ,SAAS,WAAW,KAAK;AAAA,MAAA,CAqBzC;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,YAAYC,MAAAA;AAAAA,IAChB;AAAA,IACA,aAAa;AAAA,IACb,KAAK,UAAU;AAAA,EAAA;AAEjB,QAAM,WACJC,2BAAAA,KAAAC,WAAAA,UAAA,EACG,UAAA;AAAA,IAAA,KAAK,QACJH,+BAAC,QAAA,EAAK,WAAU,qDACd,UAAAA,2BAAAA;AAAAA,MAACI,KAAAA;AAAAA,MAAA;AAAA,QACE,GAAI,OAAO,KAAK,SAAS,WACtB,EAAE,MAAM,KAAK,KAAA,IACb,EAAE,MAAM,KAAK,KAAA;AAAA,MAAK;AAAA,IAAA,GAE1B;AAAA,IAED,CAAC,aAAaJ,+BAAC,UAAK,WAAU,mBAAmB,eAAK,OAAM;AAAA,IAC5D,CAAC,aAAa,KAAK;AAAA,EAAA,GACtB;AAEF,QAAM,QACJ,aAAa,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAE7D,MAAI,KAAK,UAAU;AACjB,WACEA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,SAAS;AAAA,QAER;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACA,QAAM,OAAO,WAAW;AAAA,IACtB,KAAK,KAAK;AAAA,IACV,IAAI,KAAK;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAI,QAAQ,EAAE,UAAU,CAAA;AAAA,EAAC,CAC1B;AAED,MAAI,CAAC,WAAY,QAAO;AACxB,SAAOA,2BAAAA,IAAC,OAAA,EAAI,SAAS,YAAa,UAAA,MAAK;AACzC;;"}
1
+ {"version":3,"file":"AppShell.nav.cjs","sources":["../../src/layout/AppShell.nav.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport type { RenderLink } from \"../rpc/EndpointList\";\nimport { useRouter } from \"../rpc/router\";\nimport type {\n AppShellNavGroup,\n AppShellNavItem,\n AppShellNavSection,\n} from \"./AppShell\";\n\n// Per-group collapsed state. Owned by AppShell (see `useGroupCollapsed` there)\n// and passed down, because AppShell renders NavSections twice — the desktop\n// rail and the mobile drawer — and per-render state behind one storage key\n// would desync: the rail stays mounted while the drawer is open, so a drawer\n// toggle would write localStorage the rail never reads back.\nexport interface GroupState {\n isCollapsed: (key: string, fallback: boolean) => boolean;\n toggle: (key: string, fallback: boolean) => void;\n}\n\nexport function NavSections({\n sections,\n collapsed,\n groupState,\n onNavigate,\n}: {\n sections: AppShellNavSection[];\n collapsed: boolean;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const { renderLink } = useRouter();\n return (\n <nav\n className={cn(\n \"flex flex-col gap-0.5\",\n collapsed ? \"px-2\" : \"px-density-2\",\n )}\n >\n {sections.map((section, index) => (\n <div\n key={section.label ?? `section-${index}`}\n className=\"flex flex-col\"\n >\n {section.label &&\n (collapsed ? (\n <div className=\"mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1\" />\n ) : (\n <div className=\"mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1\">\n {section.label}\n </div>\n ))}\n {section.items?.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {section.groups?.map((group) =>\n // A collapsed rail has no room for group headings, so the whole\n // subtree flattens into the icon strip rather than hiding behind\n // toggles the user cannot see.\n collapsed\n ? flattenGroup(group).map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))\n : (\n <NavGroupRows\n key={group.key}\n group={group}\n variant={section.variant ?? \"list\"}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ),\n )}\n </div>\n ))}\n </nav>\n );\n}\n\n// flattenGroup collects every destination in a group's subtree — its own row\n// (when it has one), its items, and everything under its nested groups.\nfunction flattenGroup(group: AppShellNavGroup): AppShellNavItem[] {\n return [\n ...(group.item ? [group.item] : []),\n ...group.items,\n ...(group.groups ?? []).flatMap(flattenGroup),\n ];\n}\n\nfunction NavGroupRows({\n group,\n variant,\n renderLink,\n groupState,\n onNavigate,\n}: {\n group: AppShellNavGroup;\n variant: \"list\" | \"tree\";\n renderLink: RenderLink;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const fallback = group.defaultCollapsed ?? false;\n const collapsed =\n !group.forceExpanded && groupState.isCollapsed(group.key, fallback);\n const toggle = () => groupState.toggle(group.key, fallback);\n const chevron = (\n <span aria-hidden className=\"text-[0.65rem] opacity-60\">\n {collapsed ? \"▸\" : \"▾\"}\n </span>\n );\n const groupIcon = group.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof group.icon === \"string\"\n ? { name: group.icon }\n : { icon: group.icon })}\n />\n </span>\n );\n return (\n <div className=\"flex flex-col\">\n {group.item ? (\n // Folder AND leaf: the link and the disclosure are siblings. Nesting a\n // button inside the anchor would be invalid DOM and would make the\n // click target ambiguous.\n <div className=\"group/nav flex items-center gap-1\">\n <div className=\"min-w-0 flex-1\">\n <NavItemRow\n item={group.item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n </div>\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group.label}`}\n className=\"shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {chevron}\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n className={cn(\n \"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\",\n variant === \"tree\"\n ? \"text-[13px] text-sidebar-foreground\"\n : \"text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55\",\n )}\n >\n {groupIcon}\n <span className=\"flex-1 truncate text-left\">{group.label}</span>\n {chevron}\n </button>\n )}\n {!collapsed && (\n <div className=\"ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2\">\n {group.items.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {group.groups?.map((child) => (\n <NavGroupRows\n key={child.key}\n group={child}\n variant={variant}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction NavItemRow({\n item,\n collapsed,\n renderLink,\n onNavigate,\n}: {\n item: AppShellNavItem;\n collapsed: boolean;\n renderLink: RenderLink;\n onNavigate?: () => void;\n}) {\n const className = cn(\n \"flex w-full items-center gap-2.5 rounded-md px-density-2 py-1.5 text-left text-[13px] text-sidebar-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n collapsed && \"justify-center px-0\",\n item.active && \"bg-sidebar-accent font-medium text-sidebar-primary\",\n );\n const children: ReactNode = (\n <>\n {item.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof item.icon === \"string\"\n ? { name: item.icon }\n : { icon: item.icon })}\n />\n </span>\n )}\n {!collapsed && <span className=\"flex-1 truncate\">{item.label}</span>}\n {!collapsed && item.badge}\n </>\n );\n const title =\n collapsed && typeof item.label === \"string\" ? item.label : undefined;\n\n if (item.external) {\n return (\n <a\n href={item.to}\n className={className}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onNavigate}\n >\n {children}\n </a>\n );\n }\n const link = renderLink({\n key: item.key,\n to: item.to,\n className,\n children,\n ...(title ? { title } : {}),\n });\n\n if (!onNavigate) return link;\n return <div onClick={onNavigate}>{link}</div>;\n}\n"],"names":["useRouter","jsx","cn","jsxs","Icon","Fragment"],"mappings":"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"}
@@ -1,7 +1,12 @@
1
1
  import { AppShellNavSection } from './AppShell';
2
- export declare function NavSections({ sections, collapsed, onNavigate, }: {
2
+ export interface GroupState {
3
+ isCollapsed: (key: string, fallback: boolean) => boolean;
4
+ toggle: (key: string, fallback: boolean) => void;
5
+ }
6
+ export declare function NavSections({ sections, collapsed, groupState, onNavigate, }: {
3
7
  sections: AppShellNavSection[];
4
8
  collapsed: boolean;
9
+ groupState: GroupState;
5
10
  onNavigate?: () => void;
6
11
  }): import("react/jsx-runtime").JSX.Element;
7
12
  //# sourceMappingURL=AppShell.nav.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.nav.d.ts","sourceRoot":"","sources":["../../src/layout/AppShell.nav.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,2CAmCA"}
1
+ {"version":3,"file":"AppShell.nav.d.ts","sourceRoot":"","sources":["../../src/layout/AppShell.nav.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC;IACzD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,UAAU,EACV,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,2CA4DA"}