@k2b/ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/Disclosure.js +11 -8
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +4 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +2 -2
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/chat/ChatComposer.js +751 -423
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatContextPopup.js +123 -0
  20. package/dist/browser/chat/ChatContextPopup.js.map +1 -0
  21. package/dist/browser/chat/ChatPrimitives.js +141 -78
  22. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  23. package/dist/browser/chat/ChatTasks.js +112 -0
  24. package/dist/browser/chat/ChatTasks.js.map +1 -0
  25. package/dist/browser/chat/ChatTimeline.js +31 -14
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +114 -0
  43. package/dist/browser/content/ChartSnapshotView.js.map +1 -0
  44. package/dist/browser/content/DataTable.js +48 -32
  45. package/dist/browser/content/DataTable.js.map +1 -1
  46. package/dist/browser/content/FileBrowser.js +3 -0
  47. package/dist/browser/content/FileBrowser.js.map +1 -1
  48. package/dist/browser/content/FileGrid.js +93 -0
  49. package/dist/browser/content/FileGrid.js.map +1 -0
  50. package/dist/browser/content/FileTree.js +2 -2
  51. package/dist/browser/content/FileTree.js.map +1 -1
  52. package/dist/browser/content/FileView.js +511 -162
  53. package/dist/browser/content/FileView.js.map +1 -1
  54. package/dist/browser/content/MarkdownView.js +6 -0
  55. package/dist/browser/content/MarkdownView.js.map +1 -1
  56. package/dist/browser/content/Pagination.js.map +1 -1
  57. package/dist/browser/content/PdfPreview.js +107 -90
  58. package/dist/browser/content/PdfPreview.js.map +1 -1
  59. package/dist/browser/content/chart-cursor.js +33 -0
  60. package/dist/browser/content/chart-cursor.js.map +1 -0
  61. package/dist/browser/content/chart-explorer.js +147 -0
  62. package/dist/browser/content/chart-explorer.js.map +1 -0
  63. package/dist/browser/content/chart-inspection.js +447 -0
  64. package/dist/browser/content/chart-inspection.js.map +1 -0
  65. package/dist/browser/content/chart-line-gaps.js +53 -0
  66. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  67. package/dist/browser/content/chart-map-viewport.js +5 -1
  68. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  69. package/dist/browser/content/chart-snapshot.js +63 -0
  70. package/dist/browser/content/chart-snapshot.js.map +1 -0
  71. package/dist/browser/content/chart-state-timeline.js +32 -4
  72. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  73. package/dist/browser/content/chart-svg.js +54 -0
  74. package/dist/browser/content/chart-svg.js.map +1 -0
  75. package/dist/browser/content/collection-selection.js +109 -0
  76. package/dist/browser/content/collection-selection.js.map +1 -0
  77. package/dist/browser/content/delimited-preferences.js +21 -0
  78. package/dist/browser/content/delimited-preferences.js.map +1 -0
  79. package/dist/browser/content/file-tree.js.map +1 -1
  80. package/dist/browser/content/file-view-preview.js +11 -7
  81. package/dist/browser/content/file-view-preview.js.map +1 -1
  82. package/dist/browser/content/index.js +9 -0
  83. package/dist/browser/content/index.js.map +1 -1
  84. package/dist/browser/feedback/InlineGuidance.js +17 -3
  85. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  86. package/dist/browser/feedback/dialog-core.js +81 -7
  87. package/dist/browser/feedback/dialog-core.js.map +1 -1
  88. package/dist/browser/feedback/prompts.js +6 -0
  89. package/dist/browser/feedback/prompts.js.map +1 -1
  90. package/dist/browser/feedback/toast.js +29 -6
  91. package/dist/browser/feedback/toast.js.map +1 -1
  92. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  93. package/dist/browser/inputs/Select.js.map +1 -1
  94. package/dist/browser/inputs/SelectChip.js +3 -2
  95. package/dist/browser/inputs/SelectChip.js.map +1 -1
  96. package/dist/browser/inputs/TextInput.js +7 -1
  97. package/dist/browser/inputs/TextInput.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  99. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  100. package/dist/browser/inputs/markdown/behaviors.js +1 -1
  101. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  102. package/dist/browser/intl/Format.js +89 -16
  103. package/dist/browser/intl/Format.js.map +1 -1
  104. package/dist/browser/intl/index.js.map +1 -1
  105. package/dist/browser/intl/messages.js +130 -2
  106. package/dist/browser/intl/messages.js.map +1 -1
  107. package/dist/browser/layout/AppWorkspace.js +712 -624
  108. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  109. package/dist/browser/layout/BottomSheet.js +95 -0
  110. package/dist/browser/layout/BottomSheet.js.map +1 -0
  111. package/dist/browser/layout/DetailPanel.js +56 -44
  112. package/dist/browser/layout/DetailPanel.js.map +1 -1
  113. package/dist/browser/layout/Navigation.js +278 -0
  114. package/dist/browser/layout/Navigation.js.map +1 -0
  115. package/dist/browser/layout/PanelDialog.js +219 -71
  116. package/dist/browser/layout/PanelDialog.js.map +1 -1
  117. package/dist/browser/layout/ScrollArea.js +21 -1
  118. package/dist/browser/layout/ScrollArea.js.map +1 -1
  119. package/dist/browser/layout/Settings.js.map +1 -1
  120. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  121. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  122. package/dist/browser/layout/app-workspace-controller.js +3 -0
  123. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  124. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  125. package/dist/browser/layout/index.js +3 -0
  126. package/dist/browser/layout/index.js.map +1 -1
  127. package/dist/browser/layout/navigation-model.js +23 -0
  128. package/dist/browser/layout/navigation-model.js.map +1 -0
  129. package/dist/browser/layout/scroll-fade.js +100 -0
  130. package/dist/browser/layout/scroll-fade.js.map +1 -0
  131. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  132. package/dist/browser/surfaces/StatusBadge.js +2 -1
  133. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  134. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  135. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  136. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  178. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  179. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  180. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  181. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  182. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  183. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  184. package/dist/plex.css +1 -1
  185. package/dist/ssr/actions/Button.js +11 -2
  186. package/dist/ssr/actions/Button.js.map +1 -1
  187. package/dist/ssr/actions/Disclosure.js +2 -2
  188. package/dist/ssr/actions/Disclosure.js.map +1 -1
  189. package/dist/ssr/actions/Dropdown.js +4 -1
  190. package/dist/ssr/actions/Dropdown.js.map +1 -1
  191. package/dist/ssr/actions/FilterChip.js +16 -2
  192. package/dist/ssr/actions/FilterChip.js.map +1 -1
  193. package/dist/ssr/actions/SplitButton.js +69 -22
  194. package/dist/ssr/actions/SplitButton.js.map +1 -1
  195. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  196. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  197. package/dist/ssr/actions/Tabs.js +58 -11
  198. package/dist/ssr/actions/Tabs.js.map +1 -1
  199. package/dist/ssr/actions/index.js +2 -2
  200. package/dist/ssr/actions/index.js.map +1 -1
  201. package/dist/ssr/chat/ChatComposer.js +366 -134
  202. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  203. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  204. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  205. package/dist/ssr/chat/ChatPrimitives.js +49 -11
  206. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  207. package/dist/ssr/chat/ChatTasks.js +48 -0
  208. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  209. package/dist/ssr/chat/ChatTimeline.js +14 -4
  210. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  211. package/dist/ssr/chat/chat-behavior.js +0 -5
  212. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  213. package/dist/ssr/chat/composer-document.js +55 -0
  214. package/dist/ssr/chat/composer-document.js.map +1 -0
  215. package/dist/ssr/chat/index.js +6 -1
  216. package/dist/ssr/chat/index.js.map +1 -1
  217. package/dist/ssr/chat/types.js.map +1 -1
  218. package/dist/ssr/content/Chart.js +121 -219
  219. package/dist/ssr/content/Chart.js.map +1 -1
  220. package/dist/ssr/content/ChartExplorer.js +257 -0
  221. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  222. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  223. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  224. package/dist/ssr/content/ChartFilterControls.js +139 -0
  225. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  226. package/dist/ssr/content/ChartSnapshotView.js +58 -0
  227. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  228. package/dist/ssr/content/DataTable.js +13 -9
  229. package/dist/ssr/content/DataTable.js.map +1 -1
  230. package/dist/ssr/content/FileBrowser.js +3 -0
  231. package/dist/ssr/content/FileBrowser.js.map +1 -1
  232. package/dist/ssr/content/FileGrid.js +38 -0
  233. package/dist/ssr/content/FileGrid.js.map +1 -0
  234. package/dist/ssr/content/FileTree.js +2 -2
  235. package/dist/ssr/content/FileTree.js.map +1 -1
  236. package/dist/ssr/content/FileView.js +356 -75
  237. package/dist/ssr/content/FileView.js.map +1 -1
  238. package/dist/ssr/content/MarkdownView.js +6 -0
  239. package/dist/ssr/content/MarkdownView.js.map +1 -1
  240. package/dist/ssr/content/Pagination.js.map +1 -1
  241. package/dist/ssr/content/PdfPreview.js +37 -24
  242. package/dist/ssr/content/PdfPreview.js.map +1 -1
  243. package/dist/ssr/content/chart-cursor.js +33 -0
  244. package/dist/ssr/content/chart-cursor.js.map +1 -0
  245. package/dist/ssr/content/chart-explorer.js +147 -0
  246. package/dist/ssr/content/chart-explorer.js.map +1 -0
  247. package/dist/ssr/content/chart-inspection.js +447 -0
  248. package/dist/ssr/content/chart-inspection.js.map +1 -0
  249. package/dist/ssr/content/chart-line-gaps.js +53 -0
  250. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  251. package/dist/ssr/content/chart-map-viewport.js +5 -1
  252. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  253. package/dist/ssr/content/chart-snapshot.js +63 -0
  254. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  255. package/dist/ssr/content/chart-state-timeline.js +32 -4
  256. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  257. package/dist/ssr/content/chart-svg.js +54 -0
  258. package/dist/ssr/content/chart-svg.js.map +1 -0
  259. package/dist/ssr/content/collection-selection.js +109 -0
  260. package/dist/ssr/content/collection-selection.js.map +1 -0
  261. package/dist/ssr/content/delimited-preferences.js +21 -0
  262. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  263. package/dist/ssr/content/file-tree.js.map +1 -1
  264. package/dist/ssr/content/file-view-preview.js +11 -7
  265. package/dist/ssr/content/file-view-preview.js.map +1 -1
  266. package/dist/ssr/content/index.js +9 -0
  267. package/dist/ssr/content/index.js.map +1 -1
  268. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  269. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  270. package/dist/ssr/feedback/dialog-core.js +81 -7
  271. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  272. package/dist/ssr/feedback/prompts.js +6 -0
  273. package/dist/ssr/feedback/prompts.js.map +1 -1
  274. package/dist/ssr/feedback/toast.js +29 -6
  275. package/dist/ssr/feedback/toast.js.map +1 -1
  276. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  277. package/dist/ssr/inputs/Select.js.map +1 -1
  278. package/dist/ssr/inputs/SelectChip.js +3 -3
  279. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  280. package/dist/ssr/inputs/TextInput.js.map +1 -1
  281. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  282. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  283. package/dist/ssr/inputs/markdown/behaviors.js +1 -1
  284. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  285. package/dist/ssr/intl/Format.js +61 -0
  286. package/dist/ssr/intl/Format.js.map +1 -1
  287. package/dist/ssr/intl/index.js.map +1 -1
  288. package/dist/ssr/intl/messages.js +130 -2
  289. package/dist/ssr/intl/messages.js.map +1 -1
  290. package/dist/ssr/layout/AppWorkspace.js +368 -275
  291. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  292. package/dist/ssr/layout/BottomSheet.js +43 -0
  293. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  294. package/dist/ssr/layout/DetailPanel.js +11 -4
  295. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  296. package/dist/ssr/layout/Navigation.js +181 -0
  297. package/dist/ssr/layout/Navigation.js.map +1 -0
  298. package/dist/ssr/layout/PanelDialog.js +111 -26
  299. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  300. package/dist/ssr/layout/ScrollArea.js +16 -1
  301. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  302. package/dist/ssr/layout/Settings.js.map +1 -1
  303. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  304. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  305. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  306. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  307. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  308. package/dist/ssr/layout/index.js +3 -0
  309. package/dist/ssr/layout/index.js.map +1 -1
  310. package/dist/ssr/layout/navigation-model.js +23 -0
  311. package/dist/ssr/layout/navigation-model.js.map +1 -0
  312. package/dist/ssr/layout/scroll-fade.js +100 -0
  313. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  314. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  315. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  316. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  317. package/dist/styles.css +1 -1
  318. package/dist/tabler.css +1 -1
  319. package/dist/types/actions/Button.d.ts +4 -0
  320. package/dist/types/actions/Disclosure.d.ts +1 -0
  321. package/dist/types/actions/FilterChip.d.ts +4 -0
  322. package/dist/types/actions/SplitButton.d.ts +6 -0
  323. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  324. package/dist/types/actions/Tabs.d.ts +4 -0
  325. package/dist/types/actions/index.d.ts +4 -4
  326. package/dist/types/chat/ChatComposer.d.ts +20 -2
  327. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  328. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  329. package/dist/types/chat/ChatTasks.d.ts +15 -0
  330. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  331. package/dist/types/chat/chat-behavior.d.ts +0 -3
  332. package/dist/types/chat/composer-document.d.ts +14 -0
  333. package/dist/types/chat/index.d.ts +8 -1
  334. package/dist/types/chat/types.d.ts +7 -0
  335. package/dist/types/content/Chart.d.ts +42 -23
  336. package/dist/types/content/ChartExplorer.d.ts +34 -0
  337. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  338. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  339. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  340. package/dist/types/content/DataTable.d.ts +4 -0
  341. package/dist/types/content/FileBrowser.d.ts +1 -0
  342. package/dist/types/content/FileGrid.d.ts +21 -0
  343. package/dist/types/content/FileView.d.ts +20 -0
  344. package/dist/types/content/PdfPreview.d.ts +8 -1
  345. package/dist/types/content/chart-cursor.d.ts +15 -0
  346. package/dist/types/content/chart-explorer.d.ts +48 -0
  347. package/dist/types/content/chart-inspection.d.ts +40 -0
  348. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  349. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  350. package/dist/types/content/chart-snapshot.d.ts +26 -0
  351. package/dist/types/content/chart-svg.d.ts +21 -0
  352. package/dist/types/content/collection-selection.d.ts +24 -0
  353. package/dist/types/content/delimited-preferences.d.ts +11 -0
  354. package/dist/types/content/file-tree.d.ts +2 -0
  355. package/dist/types/content/file-view-preview.d.ts +4 -1
  356. package/dist/types/content/index.d.ts +16 -2
  357. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  358. package/dist/types/feedback/dialog-core.d.ts +11 -0
  359. package/dist/types/feedback/prompts.d.ts +2 -0
  360. package/dist/types/feedback/toast.d.ts +7 -1
  361. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  362. package/dist/types/intl/Format.d.ts +9 -0
  363. package/dist/types/intl/index.d.ts +1 -1
  364. package/dist/types/intl/messages.d.ts +31 -1
  365. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  366. package/dist/types/layout/BottomSheet.d.ts +23 -0
  367. package/dist/types/layout/DetailPanel.d.ts +1 -0
  368. package/dist/types/layout/Navigation.d.ts +8 -0
  369. package/dist/types/layout/PanelDialog.d.ts +14 -1
  370. package/dist/types/layout/ScrollArea.d.ts +4 -0
  371. package/dist/types/layout/Settings.d.ts +1 -1
  372. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  373. package/dist/types/layout/index.d.ts +4 -1
  374. package/dist/types/layout/navigation-model.d.ts +48 -0
  375. package/dist/types/layout/scroll-fade.d.ts +3 -0
  376. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  377. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  378. package/package.json +5 -7
@@ -1 +1 @@
1
- {"version":3,"names":["createContext","Show","useContext","Tabs","prompts","resolveUiMessages","useUiMessages","PanelDialogSurfaceContext","usePanelDialogSurface","panelDialogBasePanelClass","panelDialogPanelClass","panelDialogOptions","panelClassName","contentClassName","panelDialogWidePanelClass","panelDialogWideOptions","panelDialogFixedPanelClass","panelDialogFixedOptions","panelDialogWorkspacePanelClass","panelDialogWorkspaceOptions","confirmDiscardIfDirty","dirty","hasChanges","Boolean","confirm","discardUnsavedChanges","title","unsavedChangesTitle","variant","confirmText","discard","PanelDialogHeader","props","messages","_$ssr","_tmpl$4","_$ssrAttribute","_$escape","subtitle","_$createComponent","when","icon","children","_tmpl$5","_tmpl$","actions","_tmpl$2","close","_tmpl$3","closeLabel","closeDialog","closeDisabled","PanelDialogBody","_tmpl$6","scrollPreserveKey","PanelDialogFooter","_tmpl$7","PanelDialogSection","_tmpl$8","_tmpl$9","PanelDialogTabs","value","onValueChange","ariaLabel","label","dialogTabs","options","PanelDialog","surface","Provider","_tmpl$0","Header","Body","Footer","Section"],"sources":["layout/PanelDialog.tsx"],"sourcesContent":["import { createContext, type JSX, Show, useContext } from \"solid-js\";\nimport { Tabs } from \"../actions/Tabs\";\nimport type { OpenDialogOptions } from \"../feedback/dialog-core\";\nimport { prompts } from \"../feedback/prompts\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\n\nexport type PanelDialogSurface = \"contained\" | \"floating\";\n\nexport type PanelDialogProps = {\n children: JSX.Element;\n surface?: PanelDialogSurface;\n};\n\nexport type PanelDialogHeaderProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n close?: () => void;\n closeDisabled?: boolean;\n closeLabel?: string;\n};\n\nexport type PanelDialogBodyProps = {\n children: JSX.Element;\n scrollPreserveKey?: string;\n};\n\nexport type PanelDialogFooterProps = {\n children: JSX.Element;\n};\n\nexport type PanelDialogSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n};\n\nexport type PanelDialogTabOption<T extends string = string> = {\n value: T;\n label: JSX.Element;\n icon?: string;\n disabled?: boolean;\n};\n\nexport type PanelDialogTabsProps<T extends string = string> = {\n options: readonly PanelDialogTabOption<T>[];\n value: T | (() => T);\n onValueChange: (value: T) => void;\n ariaLabel?: string;\n label?: string;\n};\n\ntype PanelDialogComponent = ((props: PanelDialogProps) => JSX.Element) & {\n Header: (props: PanelDialogHeaderProps) => JSX.Element;\n Body: (props: PanelDialogBodyProps) => JSX.Element;\n Footer: (props: PanelDialogFooterProps) => JSX.Element;\n Section: (props: PanelDialogSectionProps) => JSX.Element;\n Tabs: <T extends string>(props: PanelDialogTabsProps<T>) => JSX.Element;\n};\n\nconst PanelDialogSurfaceContext = createContext<PanelDialogSurface>(\"contained\");\nconst usePanelDialogSurface = () => useContext(PanelDialogSurfaceContext);\n\nconst panelDialogBasePanelClass = \"k2b-dialog k2b-panel-dialog-frame\";\n\nexport const panelDialogPanelClass = `${panelDialogBasePanelClass} is-standard`;\nexport const panelDialogOptions = {\n panelClassName: panelDialogPanelClass,\n contentClassName: \"k2b-panel-dialog-viewport\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogWidePanelClass = `${panelDialogBasePanelClass} is-wide`;\nexport const panelDialogWideOptions = {\n panelClassName: panelDialogWidePanelClass,\n contentClassName: \"k2b-panel-dialog-viewport\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogFixedPanelClass = `${panelDialogBasePanelClass} is-fixed`;\nexport const panelDialogFixedOptions = {\n panelClassName: panelDialogFixedPanelClass,\n contentClassName: \"k2b-panel-dialog-viewport is-fixed\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogWorkspacePanelClass = `${panelDialogBasePanelClass} is-workspace`;\nexport const panelDialogWorkspaceOptions = {\n panelClassName: panelDialogWorkspacePanelClass,\n contentClassName: \"k2b-panel-dialog-viewport is-workspace\",\n} satisfies OpenDialogOptions;\n\nexport const confirmDiscardIfDirty = async (dirty: boolean | (() => boolean)): Promise<boolean> => {\n const hasChanges = typeof dirty === \"function\" ? dirty() : dirty;\n if (!hasChanges) return true;\n return Boolean(\n await prompts.confirm(resolveUiMessages().discardUnsavedChanges, {\n title: resolveUiMessages().unsavedChangesTitle,\n variant: \"danger\",\n confirmText: resolveUiMessages().discard,\n }),\n );\n};\n\nconst PanelDialogHeader = (props: PanelDialogHeaderProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <header class=\"k2b-panel-dialog__header\" data-surface={usePanelDialogSurface()} data-has-subtitle={Boolean(props.subtitle)}>\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-panel-dialog__heading\">\n <h2>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-dialog__actions\">{props.actions}</div>\n </Show>\n <Show when={props.close}>\n <button\n type=\"button\"\n class=\"k2b-dialog__close\"\n aria-label={props.closeLabel ?? messages().closeDialog}\n disabled={props.closeDisabled}\n onClick={props.close}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </header>\n );\n};\n\nconst PanelDialogBody = (props: PanelDialogBodyProps): JSX.Element => (\n <div class=\"k2b-panel-dialog__body\" data-scroll-preserve={props.scrollPreserveKey} data-surface={usePanelDialogSurface()}>\n {props.children}\n </div>\n);\n\nconst PanelDialogFooter = (props: PanelDialogFooterProps): JSX.Element => (\n <footer class=\"k2b-panel-dialog__footer\" data-surface={usePanelDialogSurface()}>\n {props.children}\n </footer>\n);\n\nconst PanelDialogSection = (props: PanelDialogSectionProps): JSX.Element => (\n <section class=\"k2b-panel-dialog__section\" data-surface={usePanelDialogSurface()}>\n <header>\n <Show when={props.icon}>\n {(icon) => (\n <span class=\"k2b-panel-dialog__section-icon\">\n <i class={icon()} aria-hidden=\"true\" />\n </span>\n )}\n </Show>\n <div>\n <h3>{props.title}</h3>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-dialog__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-panel-dialog__section-body\">{props.children}</div>\n </section>\n);\n\nconst PanelDialogTabs = <T extends string>(props: PanelDialogTabsProps<T>): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Tabs\n class=\"k2b-panel-dialog__tabs\"\n value={props.value}\n onValueChange={props.onValueChange}\n ariaLabel={props.ariaLabel ?? props.label ?? messages().dialogTabs}\n options={props.options}\n />\n );\n};\n\nconst PanelDialog = ((props: PanelDialogProps): JSX.Element => {\n const surface = props.surface ?? \"contained\";\n return (\n <PanelDialogSurfaceContext.Provider value={surface}>\n <div class=\"k2b-panel-dialog\" data-surface={surface}>\n {props.children}\n </div>\n </PanelDialogSurfaceContext.Provider>\n );\n}) as PanelDialogComponent;\n\nPanelDialog.Header = PanelDialogHeader;\nPanelDialog.Body = PanelDialogBody;\nPanelDialog.Footer = PanelDialogFooter;\nPanelDialog.Section = PanelDialogSection;\nPanelDialog.Tabs = PanelDialogTabs;\n\nexport default PanelDialog;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createContext","createEffect","createSignal","createUniqueId","Show","useContext","Button","Tabs","prompts","resolveUiMessages","useUiMessages","createScrollFade","PanelDialogSurfaceContext","usePanelDialogSurface","panelDialogBasePanelClass","panelDialogPanelClass","panelDialogOptions","panelClassName","contentClassName","panelDialogWidePanelClass","panelDialogWideOptions","panelDialogFixedPanelClass","panelDialogFixedOptions","panelDialogWorkspacePanelClass","panelDialogWorkspaceOptions","confirmDiscardIfDirty","dirty","hasChanges","Boolean","confirm","discardUnsavedChanges","title","unsavedChangesTitle","variant","confirmText","discard","PanelDialogHeader","props","messages","_$ssr","_tmpl$4","_$ssrAttribute","_$escape","subtitle","_$createComponent","when","icon","children","_tmpl$5","_tmpl$","actions","_tmpl$2","close","_tmpl$3","closeLabel","closeDialog","closeDisabled","PanelDialogBody","body","scrollFade","_tmpl$6","scrollPreserveKey","undefined","PanelDialogFooter","_tmpl$7","PanelDialogSection","id","internalOpen","setInternalOpen","defaultOpen","open","hideable","section","expand","collapse","toggle","next","disabled","onOpenChange","expanded","queueMicrotask","active","ownerDocument","activeElement","focus","contains","_tmpl$11","_tmpl$1","onClick","_tmpl$9","_tmpl$8","_tmpl$0","_tmpl$12","size","_tmpl$10","PanelDialogTabs","value","onValueChange","ariaLabel","label","dialogTabs","options","PanelDialog","surface","Provider","_tmpl$13","Header","Body","Footer","Section"],"sources":["layout/PanelDialog.tsx"],"sourcesContent":["import { createContext, createEffect, createSignal, createUniqueId, type JSX, Show, useContext } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Tabs } from \"../actions/Tabs\";\nimport type { OpenDialogOptions } from \"../feedback/dialog-core\";\nimport { prompts } from \"../feedback/prompts\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"./scroll-fade\";\n\nexport type PanelDialogSurface = \"contained\" | \"floating\";\n\nexport type PanelDialogProps = {\n children: JSX.Element;\n surface?: PanelDialogSurface;\n};\n\nexport type PanelDialogHeaderProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n close?: () => void;\n closeDisabled?: boolean;\n closeLabel?: string;\n};\n\nexport type PanelDialogBodyProps = {\n children: JSX.Element;\n scrollPreserveKey?: string;\n scrollFade?: boolean;\n};\n\nexport type PanelDialogFooterProps = {\n children: JSX.Element;\n};\n\nexport type PanelDialogSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n} & (\n | { hideable?: false; open?: never; defaultOpen?: never; onOpenChange?: never; disabled?: never }\n | { hideable: true; open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; disabled?: boolean }\n);\n\nexport type PanelDialogTabOption<T extends string = string> = {\n value: T;\n label: JSX.Element;\n icon?: string;\n disabled?: boolean;\n};\n\nexport type PanelDialogTabsProps<T extends string = string> = {\n options: readonly PanelDialogTabOption<T>[];\n value: T | (() => T);\n onValueChange: (value: T) => void;\n ariaLabel?: string;\n label?: string;\n};\n\ntype PanelDialogComponent = ((props: PanelDialogProps) => JSX.Element) & {\n Header: (props: PanelDialogHeaderProps) => JSX.Element;\n Body: (props: PanelDialogBodyProps) => JSX.Element;\n Footer: (props: PanelDialogFooterProps) => JSX.Element;\n Section: (props: PanelDialogSectionProps) => JSX.Element;\n Tabs: <T extends string>(props: PanelDialogTabsProps<T>) => JSX.Element;\n};\n\nconst PanelDialogSurfaceContext = createContext<PanelDialogSurface>(\"contained\");\nconst usePanelDialogSurface = () => useContext(PanelDialogSurfaceContext);\n\nconst panelDialogBasePanelClass = \"k2b-dialog k2b-panel-dialog-frame\";\n\nexport const panelDialogPanelClass = `${panelDialogBasePanelClass} is-standard`;\nexport const panelDialogOptions = {\n panelClassName: panelDialogPanelClass,\n contentClassName: \"k2b-panel-dialog-viewport\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogWidePanelClass = `${panelDialogBasePanelClass} is-wide`;\nexport const panelDialogWideOptions = {\n panelClassName: panelDialogWidePanelClass,\n contentClassName: \"k2b-panel-dialog-viewport\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogFixedPanelClass = `${panelDialogBasePanelClass} is-fixed`;\nexport const panelDialogFixedOptions = {\n panelClassName: panelDialogFixedPanelClass,\n contentClassName: \"k2b-panel-dialog-viewport is-fixed\",\n} satisfies OpenDialogOptions;\n\nexport const panelDialogWorkspacePanelClass = `${panelDialogBasePanelClass} is-workspace`;\nexport const panelDialogWorkspaceOptions = {\n panelClassName: panelDialogWorkspacePanelClass,\n contentClassName: \"k2b-panel-dialog-viewport is-workspace\",\n} satisfies OpenDialogOptions;\n\nexport const confirmDiscardIfDirty = async (dirty: boolean | (() => boolean)): Promise<boolean> => {\n const hasChanges = typeof dirty === \"function\" ? dirty() : dirty;\n if (!hasChanges) return true;\n return Boolean(\n await prompts.confirm(resolveUiMessages().discardUnsavedChanges, {\n title: resolveUiMessages().unsavedChangesTitle,\n variant: \"danger\",\n confirmText: resolveUiMessages().discard,\n }),\n );\n};\n\nconst PanelDialogHeader = (props: PanelDialogHeaderProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <header class=\"k2b-panel-dialog__header\" data-surface={usePanelDialogSurface()} data-has-subtitle={Boolean(props.subtitle)}>\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-panel-dialog__heading\">\n <h2>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-dialog__actions\">{props.actions}</div>\n </Show>\n <Show when={props.close}>\n <button\n type=\"button\"\n class=\"k2b-dialog__close\"\n aria-label={props.closeLabel ?? messages().closeDialog}\n disabled={props.closeDisabled}\n onClick={props.close}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </header>\n );\n};\n\nconst PanelDialogBody = (props: PanelDialogBodyProps): JSX.Element => {\n let body: HTMLDivElement | undefined;\n createScrollFade(\n () => body,\n () => props.scrollFade !== false,\n );\n return (\n <div\n ref={body}\n class=\"k2b-panel-dialog__body\"\n data-scroll-preserve={props.scrollPreserveKey}\n data-surface={usePanelDialogSurface()}\n data-scroll-fade-mode={props.scrollFade !== false ? \"both\" : undefined}\n >\n {props.children}\n </div>\n );\n};\n\nconst PanelDialogFooter = (props: PanelDialogFooterProps): JSX.Element => (\n <footer class=\"k2b-panel-dialog__footer\" data-surface={usePanelDialogSurface()}>\n {props.children}\n </footer>\n);\n\nconst PanelDialogSection = (props: PanelDialogSectionProps): JSX.Element => {\n const id = `k2b-panel-dialog-section-${createUniqueId()}`;\n const [internalOpen, setInternalOpen] = createSignal(props.defaultOpen ?? false);\n const open = () => !props.hideable || (props.open ?? internalOpen());\n let section: HTMLElement | undefined;\n let expand: HTMLButtonElement | undefined;\n let collapse: HTMLButtonElement | undefined;\n const toggle = (next: boolean) => {\n if (props.disabled) return;\n if (props.open === undefined) setInternalOpen(next);\n props.onOpenChange?.(next);\n };\n createEffect(() => {\n if (!props.hideable) return;\n const expanded = open();\n queueMicrotask(() => {\n if (expanded !== open()) return;\n const active = section?.ownerDocument.activeElement;\n if (expanded && active === expand) collapse?.focus();\n if (!expanded && active && active !== expand && section?.contains(active)) expand?.focus();\n });\n });\n\n return (\n <section\n ref={section}\n class=\"k2b-panel-dialog__section\"\n data-surface={usePanelDialogSurface()}\n data-hideable={props.hideable || undefined}\n data-open={props.hideable ? open() : undefined}\n aria-labelledby={open() ? id : `${id}-closed`}\n >\n <Show when={props.hideable}>\n <div hidden={open()}>\n <Button\n ref={expand}\n variant=\"ghost\"\n class=\"k2b-panel-dialog__section-summary\"\n disabled={props.disabled}\n aria-expanded={false}\n aria-controls={`${id}-body`}\n onClick={() => toggle(true)}\n >\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <span class=\"k2b-panel-dialog__section-copy\">\n <span id={`${id}-closed`} class=\"k2b-panel-dialog__section-title\">\n {props.title}\n </span>\n <Show when={props.subtitle}>\n <span class=\"k2b-panel-dialog__section-subtitle\">{props.subtitle}</span>\n </Show>\n </span>\n <i class=\"ti ti-eye\" aria-hidden=\"true\" />\n </Button>\n </div>\n </Show>\n <header hidden={!open()}>\n <Show when={props.icon}>\n {(icon) => (\n <span class=\"k2b-panel-dialog__section-icon\">\n <i class={icon()} aria-hidden=\"true\" />\n </span>\n )}\n </Show>\n <div>\n <h3 id={id}>{props.title}</h3>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-dialog__actions\">{props.actions}</div>\n </Show>\n <Show when={props.hideable}>\n <Button\n ref={collapse}\n variant=\"ghost\"\n size=\"sm\"\n disabled={props.disabled}\n aria-labelledby={id}\n aria-expanded={true}\n aria-controls={`${id}-body`}\n onClick={() => toggle(false)}\n >\n <i class=\"ti ti-eye-off\" aria-hidden=\"true\" />\n </Button>\n </Show>\n </header>\n <div id={`${id}-body`} class=\"k2b-panel-dialog__section-body\" hidden={!open()}>\n {props.children}\n </div>\n </section>\n );\n};\n\nconst PanelDialogTabs = <T extends string>(props: PanelDialogTabsProps<T>): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Tabs\n class=\"k2b-panel-dialog__tabs\"\n value={props.value}\n onValueChange={props.onValueChange}\n ariaLabel={props.ariaLabel ?? props.label ?? messages().dialogTabs}\n options={props.options}\n />\n );\n};\n\nconst PanelDialog = ((props: PanelDialogProps): JSX.Element => {\n const surface = props.surface ?? \"contained\";\n return (\n <PanelDialogSurfaceContext.Provider value={surface}>\n <div class=\"k2b-panel-dialog\" data-surface={surface}>\n {props.children}\n </div>\n </PanelDialogSurfaceContext.Provider>\n );\n}) as PanelDialogComponent;\n\nPanelDialog.Header = PanelDialogHeader;\nPanelDialog.Body = PanelDialogBody;\nPanelDialog.Footer = PanelDialogFooter;\nPanelDialog.Section = PanelDialogSection;\nPanelDialog.Tabs = PanelDialogTabs;\n\nexport default PanelDialog;\n"],"mappings":"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","ignoreList":[]}
@@ -2,10 +2,25 @@ import { ssrElement as _$ssrElement } from "solid-js/web";
2
2
  import { mergeProps as _$mergeProps } from "solid-js/web";
3
3
  import { escape as _$escape } from "solid-js/web";
4
4
  import { splitProps } from "solid-js";
5
+ import { createScrollFade } from "./scroll-fade";
5
6
  export function ScrollArea(props) {
6
- const [local, elementProps] = splitProps(props, ["children", "scrollPreserveKey", "class"]);
7
+ const [local, elementProps] = splitProps(props, ["children", "scrollPreserveKey", "class", "scrollFade", "orientation", "viewportSize", "ref"]);
8
+ let body;
9
+ createScrollFade(() => body, () => local.scrollFade !== false);
7
10
  const className = () => local.class?.trim();
8
11
  return _$ssrElement("div", _$mergeProps(elementProps, {
12
+ get ["data-scroll-fade-axis"]() {
13
+ return local.orientation ?? "vertical";
14
+ },
15
+ get ["data-viewport-size"]() {
16
+ return local.viewportSize;
17
+ },
18
+ get ["data-orientation"]() {
19
+ return local.orientation ?? "vertical";
20
+ },
21
+ get ["data-scroll-fade-mode"]() {
22
+ return local.scrollFade !== false ? "both" : undefined;
23
+ },
9
24
  get ["class"]() {
10
25
  return className() ? `k2b-scroll-area ${className()}` : "k2b-scroll-area";
11
26
  },
@@ -1 +1 @@
1
- {"version":3,"names":["splitProps","ScrollArea","props","local","elementProps","className","class","trim","_$ssrElement","_$mergeProps","data-scroll-preserve","scrollPreserveKey","undefined","_$escape","children"],"sources":["layout/ScrollArea.tsx"],"sourcesContent":["import { type JSX, splitProps } from \"solid-js\";\n\nexport type ScrollAreaProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\"> & {\n children: JSX.Element;\n scrollPreserveKey?: string | false;\n class?: string;\n};\n\nexport function ScrollArea(props: ScrollAreaProps): JSX.Element {\n const [local, elementProps] = splitProps(props, [\"children\", \"scrollPreserveKey\", \"class\"]);\n const className = () => local.class?.trim();\n\n return (\n <div\n {...elementProps}\n class={className() ? `k2b-scroll-area ${className()}` : \"k2b-scroll-area\"}\n data-scroll-preserve={local.scrollPreserveKey || undefined}\n >\n {local.children}\n </div>\n );\n}\n\nexport default ScrollArea;\n"],"mappings":";;;AAAA,SAAmBA,UAAU,QAAQ,UAAU;AAQ/C,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAe;EAC9D,MAAM,CAACC,KAAK,EAAEC,YAAY,CAAC,GAAGJ,UAAU,CAACE,KAAK,EAAE,CAAC,UAAU,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;EAC3F,MAAMG,SAAS,GAAGA,CAAA,KAAMF,KAAK,CAACG,KAAK,EAAEC,IAAI,CAAC,CAAC;EAE3C,OAAAC,YAAA,QAAAC,YAAA,CAEQL,YAAY;IAAA,aAAAE,CAAA;MAAA,OACTD,SAAS,CAAC,CAAC,GAAG,mBAAmBA,SAAS,CAAC,CAAC,EAAE,GAAG,iBAAiB;IAAA;IAAA,4BAAAK,CAAA;MAAA,OACnDP,KAAK,CAACQ,iBAAiB,IAAIC,SAAS;IAAA;EAAA,IAAAC,QAAA,CAEzDV,KAAK,CAACW,QAAQ;AAGrB;AAEA,eAAeb,UAAU","ignoreList":[]}
1
+ {"version":3,"names":["splitProps","createScrollFade","ScrollArea","props","local","elementProps","body","scrollFade","className","class","trim","_$ssrElement","_$mergeProps","data-scroll-fade-axis","orientation","data-viewport-size","viewportSize","data-orientation","data-scroll-fade-mode","undefined","data-scroll-preserve","scrollPreserveKey","_$escape","children"],"sources":["layout/ScrollArea.tsx"],"sourcesContent":["import { type JSX, splitProps } from \"solid-js\";\nimport { createScrollFade } from \"./scroll-fade\";\n\nexport type ScrollAreaProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\"> & {\n children: JSX.Element;\n scrollFade?: boolean;\n /** Stable compact catalog height, clamped to 60% of the dynamic viewport. */\n viewportSize?: \"compact\";\n orientation?: \"vertical\" | \"horizontal\";\n scrollPreserveKey?: string | false;\n class?: string;\n};\n\nexport function ScrollArea(props: ScrollAreaProps): JSX.Element {\n const [local, elementProps] = splitProps(props, [\n \"children\",\n \"scrollPreserveKey\",\n \"class\",\n \"scrollFade\",\n \"orientation\",\n \"viewportSize\",\n \"ref\",\n ]);\n let body!: HTMLDivElement;\n createScrollFade(\n () => body,\n () => local.scrollFade !== false,\n );\n const className = () => local.class?.trim();\n\n return (\n <div\n {...elementProps}\n ref={(el) => {\n body = el;\n if (typeof local.ref === \"function\") local.ref(el);\n }}\n data-scroll-fade-axis={local.orientation ?? \"vertical\"}\n data-viewport-size={local.viewportSize}\n data-orientation={local.orientation ?? \"vertical\"}\n data-scroll-fade-mode={local.scrollFade !== false ? \"both\" : undefined}\n class={className() ? `k2b-scroll-area ${className()}` : \"k2b-scroll-area\"}\n data-scroll-preserve={local.scrollPreserveKey || undefined}\n >\n {local.children}\n </div>\n );\n}\n\nexport default ScrollArea;\n"],"mappings":";;;AAAA,SAAmBA,UAAU,QAAQ,UAAU;AAC/C,SAASC,gBAAgB,QAAQ,eAAe;AAYhD,OAAO,SAASC,UAAUA,CAACC,KAAsB,EAAe;EAC9D,MAAM,CAACC,KAAK,EAAEC,YAAY,CAAC,GAAGL,UAAU,CAACG,KAAK,EAAE,CAC9C,UAAU,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,cAAc,EACd,KAAK,CACN,CAAC;EACF,IAAIG,IAAqB;EACzBL,gBAAgB,CACd,MAAMK,IAAI,EACV,MAAMF,KAAK,CAACG,UAAU,KAAK,KAC7B,CAAC;EACD,MAAMC,SAAS,GAAGA,CAAA,KAAMJ,KAAK,CAACK,KAAK,EAAEC,IAAI,CAAC,CAAC;EAE3C,OAAAC,YAAA,QAAAC,YAAA,CAEQP,YAAY;IAAA,6BAAAQ,CAAA;MAAA,OAKOT,KAAK,CAACU,WAAW,IAAI,UAAU;IAAA;IAAA,0BAAAC,CAAA;MAAA,OAClCX,KAAK,CAACY,YAAY;IAAA;IAAA,wBAAAC,CAAA;MAAA,OACpBb,KAAK,CAACU,WAAW,IAAI,UAAU;IAAA;IAAA,6BAAAI,CAAA;MAAA,OAC1Bd,KAAK,CAACG,UAAU,KAAK,KAAK,GAAG,MAAM,GAAGY,SAAS;IAAA;IAAA,aAAAV,CAAA;MAAA,OAC/DD,SAAS,CAAC,CAAC,GAAG,mBAAmBA,SAAS,CAAC,CAAC,EAAE,GAAG,iBAAiB;IAAA;IAAA,4BAAAY,CAAA;MAAA,OACnDhB,KAAK,CAACiB,iBAAiB,IAAIF,SAAS;IAAA;EAAA,IAAAG,QAAA,CAEzDlB,KAAK,CAACmB,QAAQ;AAGrB;AAEA,eAAerB,UAAU","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["children","createMemo","createUniqueId","Show","Button","useUiMessages","read","value","SettingsPage","props","_$ssr","_tmpl$4","class","_$escape","_$ssrStyle","style","_$createComponent","when","icon","_tmpl$5","_$ssrAttribute","title","subtitle","_tmpl$","actions","_tmpl$2","scrollPreserveKey","footer","_tmpl$3","SettingsSection","headingId","_tmpl$7","_tmpl$6","SETTINGS_GROUP_ACTION","Symbol","SettingsGroupAction","kind","collectSettingsGroupActions","Array","isArray","flatMap","collectSettingsGroupContent","SettingsGroup","resolved","action","content","_tmpl$8","description","slot","_tmpl$9","Action","sameSettingValue","left","right","JSON","stringify","readSettingsError","response","fallback","data","json","catch","message","fields","errors","SettingsField","messages","id","descriptionId","errorId","describedBy","error","control","_tmpl$1","label","changed","undefined","_tmpl$0","unsaved","_tmpl$10","SettingsActions","changeCount","loading","disabled","Boolean","disableWithoutChanges","saveDisabled","_tmpl$12","variant","onClick","onDiscard","discard","saveVariant","loadingLabel","saving","onSave","_tmpl$11","saveLabel","saveChanges","SettingsSaveBar","_tmpl$13","unsavedChangeLabel","count","SettingsPanelFooter","_tmpl$15","noUnsavedChanges","_tmpl$14","_$mergeProps"],"sources":["layout/Settings.tsx"],"sourcesContent":["import { children, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, type ButtonVariant } from \"../actions/Button\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nconst read = <T,>(value: MaybeAccessor<T>): T => (typeof value === \"function\" ? (value as () => T)() : value);\n\nexport type SettingsPageProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n footer?: JSX.Element;\n scrollPreserveKey?: string;\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nexport function SettingsPage(props: SettingsPageProps): JSX.Element {\n return (\n <section class={`k2b-settings-page${props.class ? ` ${props.class}` : \"\"}`} style={props.style}>\n <header class=\"k2b-settings-page__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-page__heading\">\n <h1>{props.title}</h1>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-page__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-page__body\" data-scroll-preserve={props.scrollPreserveKey}>\n {props.children}\n </div>\n <Show when={props.footer}>\n <footer class=\"k2b-settings-page__footer\">{props.footer}</footer>\n </Show>\n </section>\n );\n}\n\nexport type SettingsSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\n/**\n * A full-page settings group. Dialogs keep using PanelDialog.Section; this\n * component owns the quieter, observability-style paper used on admin pages.\n */\nexport function SettingsSection(props: SettingsSectionProps): JSX.Element {\n const headingId = `k2b-settings-section-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-section${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-section__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-section__heading\">\n <h2 id={headingId}>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-section__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-section__body\">{props.children}</div>\n </section>\n );\n}\n\nconst SETTINGS_GROUP_ACTION = Symbol(\"SettingsGroup.Action\");\n\nexport type SettingsGroupProps = {\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\nexport type SettingsGroupActionProps = {\n children: JSX.Element;\n};\n\ntype SettingsGroupActionDefinition = {\n readonly kind: typeof SETTINGS_GROUP_ACTION;\n readonly props: SettingsGroupActionProps;\n};\n\ntype SettingsGroupComponent = ((props: SettingsGroupProps) => JSX.Element) & {\n Action: (props: SettingsGroupActionProps) => JSX.Element;\n};\n\nconst SettingsGroupAction = (props: SettingsGroupActionProps): JSX.Element =>\n ({ kind: SETTINGS_GROUP_ACTION, props }) satisfies SettingsGroupActionDefinition as unknown as JSX.Element;\n\nconst collectSettingsGroupActions = (value: unknown): SettingsGroupActionDefinition[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupActions);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION\n ? [value as SettingsGroupActionDefinition]\n : [];\n};\n\nconst collectSettingsGroupContent = (value: unknown): JSX.Element[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupContent);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION ? [] : [value as JSX.Element];\n};\n\nexport const SettingsGroup = ((props: SettingsGroupProps): JSX.Element => {\n const resolved = children(() => props.children);\n const action = createMemo(() => collectSettingsGroupActions(resolved())[0]);\n const content = createMemo(() => collectSettingsGroupContent(resolved()));\n const headingId = `k2b-settings-group-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-group${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-group__header\">\n <div class=\"k2b-settings-group__heading\">\n <h3 id={headingId}>{props.title}</h3>\n <Show when={props.description}>\n <p>{props.description}</p>\n </Show>\n </div>\n <Show when={action()}>{(slot) => <div class=\"k2b-settings-group__action\">{slot().props.children}</div>}</Show>\n </header>\n <div class=\"k2b-settings-group__body\">{content()}</div>\n </section>\n );\n}) as SettingsGroupComponent;\n\nSettingsGroup.Action = SettingsGroupAction;\n\nexport const sameSettingValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right);\n\nexport const readSettingsError = async (\n response: Response,\n fallback: string,\n): Promise<{ message: string; fields: Record<string, string> }> => {\n const data = (await response.json().catch(() => null)) as {\n message?: string;\n errors?: Record<string, string>;\n } | null;\n return { message: data?.message ?? fallback, fields: data?.errors ?? {} };\n};\n\nexport type SettingsFieldProps = {\n label: string;\n description: string;\n error: MaybeAccessor<string | undefined>;\n changed?: MaybeAccessor<boolean>;\n children: JSX.Element | ((control: SettingsFieldControlProps) => JSX.Element);\n class?: string;\n};\n\nexport type SettingsFieldControlProps = {\n describedBy: () => string;\n};\n\nexport function SettingsField(props: SettingsFieldProps): JSX.Element {\n const messages = useUiMessages();\n const id = createUniqueId();\n const descriptionId = `k2b-settings-field-${id}-description`;\n const errorId = `k2b-settings-field-${id}-error`;\n const describedBy = () => (read(props.error) ? `${descriptionId} ${errorId}` : descriptionId);\n const control = () =>\n typeof props.children === \"function\"\n ? (props.children as (control: SettingsFieldControlProps) => JSX.Element)({ describedBy })\n : props.children;\n return (\n <div class={`k2b-settings-field ${props.class ?? \"\"}`}>\n <div class=\"k2b-settings-field__copy\">\n <div class=\"k2b-settings-field__heading\">\n <strong>{props.label}</strong>\n <Show when={props.changed !== undefined && read(props.changed)}>\n <span>{messages().unsaved}</span>\n </Show>\n </div>\n <p id={descriptionId}>{props.description}</p>\n </div>\n {control()}\n <Show when={read(props.error)}>\n {(error) => (\n <p id={errorId} class=\"k2b-settings-field__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" /> {error()}\n </p>\n )}\n </Show>\n </div>\n );\n}\n\nexport type SettingsSaveBarProps = {\n changeCount: MaybeAccessor<number>;\n loading: MaybeAccessor<boolean>;\n saveDisabled?: MaybeAccessor<boolean>;\n onDiscard: () => void;\n onSave: () => void;\n saveLabel?: string;\n saveVariant?: ButtonVariant;\n class?: string;\n};\n\nconst SettingsActions = (\n props: SettingsSaveBarProps & {\n disableWithoutChanges?: boolean;\n },\n): JSX.Element => {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n const loading = () => read(props.loading);\n const disabled = () => loading() || Boolean(props.disableWithoutChanges && changeCount() === 0);\n const saveDisabled = () => disabled() || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled));\n return (\n <div class=\"k2b-settings-actions\">\n <Button variant=\"secondary\" disabled={disabled()} onClick={props.onDiscard}>\n {messages().discard}\n </Button>\n <Button\n variant={props.saveVariant ?? \"primary\"}\n loading={loading()}\n loadingLabel={messages().saving}\n disabled={saveDisabled()}\n onClick={props.onSave}\n >\n <i class=\"ti ti-device-floppy\" aria-hidden=\"true\" />\n {props.saveLabel ?? messages().saveChanges}\n </Button>\n </div>\n );\n};\n\nexport function SettingsSaveBar(props: SettingsSaveBarProps): JSX.Element {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <Show when={changeCount() > 0}>\n <div class={`k2b-settings-save-bar ${props.class ?? \"\"}`}>\n <p role=\"status\" aria-live=\"polite\">\n <strong>{changeCount()}</strong> {messages().unsavedChangeLabel({ count: changeCount() })}\n </p>\n <SettingsActions {...props} />\n </div>\n </Show>\n );\n}\n\nexport type SettingsPanelFooterProps = SettingsSaveBarProps;\n\nexport function SettingsPanelFooter(props: SettingsPanelFooterProps): JSX.Element {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <>\n <p class=\"k2b-settings-panel-footer__status\" role=\"status\" aria-live=\"polite\">\n <Show when={changeCount() > 0} fallback={messages().noUnsavedChanges}>\n <strong>{changeCount()}</strong> {messages().unsavedChangeLabel({ count: changeCount() })}\n </Show>\n </p>\n <SettingsActions {...props} disableWithoutChanges />\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["children","createMemo","createUniqueId","Show","Button","useUiMessages","read","value","SettingsPage","props","_$ssr","_tmpl$4","class","_$escape","_$ssrStyle","style","_$createComponent","when","icon","_tmpl$5","_$ssrAttribute","title","subtitle","_tmpl$","actions","_tmpl$2","scrollPreserveKey","footer","_tmpl$3","SettingsSection","headingId","_tmpl$7","_tmpl$6","SETTINGS_GROUP_ACTION","Symbol","SettingsGroupAction","kind","collectSettingsGroupActions","Array","isArray","flatMap","collectSettingsGroupContent","SettingsGroup","resolved","action","content","_tmpl$8","description","slot","_tmpl$9","Action","sameSettingValue","left","right","JSON","stringify","readSettingsError","response","fallback","data","json","catch","message","fields","errors","SettingsField","messages","id","descriptionId","errorId","describedBy","error","control","_tmpl$1","label","changed","undefined","_tmpl$0","unsaved","_tmpl$10","SettingsActions","changeCount","loading","disabled","Boolean","disableWithoutChanges","saveDisabled","_tmpl$12","variant","onClick","onDiscard","discard","saveVariant","loadingLabel","saving","onSave","_tmpl$11","saveLabel","saveChanges","SettingsSaveBar","_tmpl$13","unsavedChangeLabel","count","SettingsPanelFooter","_tmpl$15","noUnsavedChanges","_tmpl$14","_$mergeProps"],"sources":["layout/Settings.tsx"],"sourcesContent":["import { children, createMemo, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { Button, type ButtonVariant } from \"../actions/Button\";\nimport type { MaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nconst read = <T,>(value: MaybeAccessor<T>): T => (typeof value === \"function\" ? (value as () => T)() : value);\n\nexport type SettingsPageProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n footer?: JSX.Element;\n scrollPreserveKey?: string;\n class?: string;\n style?: JSX.CSSProperties | string;\n};\n\nexport function SettingsPage(props: SettingsPageProps): JSX.Element {\n return (\n <section class={`k2b-settings-page${props.class ? ` ${props.class}` : \"\"}`} style={props.style}>\n <header class=\"k2b-settings-page__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-page__heading\">\n <h1>{props.title}</h1>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-page__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-page__body\" data-scroll-preserve={props.scrollPreserveKey}>\n {props.children}\n </div>\n <Show when={props.footer}>\n <footer class=\"k2b-settings-page__footer\">{props.footer}</footer>\n </Show>\n </section>\n );\n}\n\nexport type SettingsSectionProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n icon?: string;\n actions?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\n/**\n * A full-page settings group. Dialogs keep using PanelDialog.Section; this\n * component owns the quieter, observability-style paper used on admin pages.\n */\nexport function SettingsSection(props: SettingsSectionProps): JSX.Element {\n const headingId = `k2b-settings-section-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-section${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-section__header\">\n <Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-settings-section__heading\">\n <h2 id={headingId}>{props.title}</h2>\n <Show when={props.subtitle}>\n <p>{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-settings-section__actions\">{props.actions}</div>\n </Show>\n </header>\n <div class=\"k2b-settings-section__body\">{props.children}</div>\n </section>\n );\n}\n\nconst SETTINGS_GROUP_ACTION = Symbol(\"SettingsGroup.Action\");\n\nexport type SettingsGroupProps = {\n title: JSX.Element;\n description?: JSX.Element;\n children: JSX.Element;\n class?: string;\n};\n\nexport type SettingsGroupActionProps = {\n children: JSX.Element;\n};\n\ntype SettingsGroupActionDefinition = {\n readonly kind: typeof SETTINGS_GROUP_ACTION;\n readonly props: SettingsGroupActionProps;\n};\n\ntype SettingsGroupComponent = ((props: SettingsGroupProps) => JSX.Element) & {\n Action: (props: SettingsGroupActionProps) => JSX.Element;\n};\n\nconst SettingsGroupAction = (props: SettingsGroupActionProps): JSX.Element =>\n ({ kind: SETTINGS_GROUP_ACTION, props }) satisfies SettingsGroupActionDefinition as unknown as JSX.Element;\n\nconst collectSettingsGroupActions = (value: unknown): SettingsGroupActionDefinition[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupActions);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION\n ? [value as SettingsGroupActionDefinition]\n : [];\n};\n\nconst collectSettingsGroupContent = (value: unknown): JSX.Element[] => {\n if (Array.isArray(value)) return value.flatMap(collectSettingsGroupContent);\n return value && typeof value === \"object\" && (value as { kind?: unknown }).kind === SETTINGS_GROUP_ACTION ? [] : [value as JSX.Element];\n};\n\nexport const SettingsGroup = ((props: SettingsGroupProps): JSX.Element => {\n const resolved = children(() => props.children);\n const action = createMemo(() => collectSettingsGroupActions(resolved())[0]);\n const content = createMemo(() => collectSettingsGroupContent(resolved()));\n const headingId = `k2b-settings-group-${createUniqueId()}`;\n return (\n <section class={`k2b-settings-group${props.class ? ` ${props.class}` : \"\"}`} aria-labelledby={headingId}>\n <header class=\"k2b-settings-group__header\">\n <div class=\"k2b-settings-group__heading\">\n <h3 id={headingId}>{props.title}</h3>\n <Show when={props.description}>\n <p>{props.description}</p>\n </Show>\n </div>\n <Show when={action()}>{(slot) => <div class=\"k2b-settings-group__action\">{slot().props.children}</div>}</Show>\n </header>\n <div class=\"k2b-settings-group__body\">{content()}</div>\n </section>\n );\n}) as SettingsGroupComponent;\n\nSettingsGroup.Action = SettingsGroupAction;\n\nexport const sameSettingValue = (left: unknown, right: unknown): boolean => JSON.stringify(left) === JSON.stringify(right);\n\nexport const readSettingsError = async (\n response: Pick<Response, \"json\">,\n fallback: string,\n): Promise<{ message: string; fields: Record<string, string> }> => {\n const data = (await response.json().catch(() => null)) as {\n message?: string;\n errors?: Record<string, string>;\n } | null;\n return { message: data?.message ?? fallback, fields: data?.errors ?? {} };\n};\n\nexport type SettingsFieldProps = {\n label: string;\n description: string;\n error: MaybeAccessor<string | undefined>;\n changed?: MaybeAccessor<boolean>;\n children: JSX.Element | ((control: SettingsFieldControlProps) => JSX.Element);\n class?: string;\n};\n\nexport type SettingsFieldControlProps = {\n describedBy: () => string;\n};\n\nexport function SettingsField(props: SettingsFieldProps): JSX.Element {\n const messages = useUiMessages();\n const id = createUniqueId();\n const descriptionId = `k2b-settings-field-${id}-description`;\n const errorId = `k2b-settings-field-${id}-error`;\n const describedBy = () => (read(props.error) ? `${descriptionId} ${errorId}` : descriptionId);\n const control = () =>\n typeof props.children === \"function\"\n ? (props.children as (control: SettingsFieldControlProps) => JSX.Element)({ describedBy })\n : props.children;\n return (\n <div class={`k2b-settings-field ${props.class ?? \"\"}`}>\n <div class=\"k2b-settings-field__copy\">\n <div class=\"k2b-settings-field__heading\">\n <strong>{props.label}</strong>\n <Show when={props.changed !== undefined && read(props.changed)}>\n <span>{messages().unsaved}</span>\n </Show>\n </div>\n <p id={descriptionId}>{props.description}</p>\n </div>\n {control()}\n <Show when={read(props.error)}>\n {(error) => (\n <p id={errorId} class=\"k2b-settings-field__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" /> {error()}\n </p>\n )}\n </Show>\n </div>\n );\n}\n\nexport type SettingsSaveBarProps = {\n changeCount: MaybeAccessor<number>;\n loading: MaybeAccessor<boolean>;\n saveDisabled?: MaybeAccessor<boolean>;\n onDiscard: () => void;\n onSave: () => void;\n saveLabel?: string;\n saveVariant?: ButtonVariant;\n class?: string;\n};\n\nconst SettingsActions = (\n props: SettingsSaveBarProps & {\n disableWithoutChanges?: boolean;\n },\n): JSX.Element => {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n const loading = () => read(props.loading);\n const disabled = () => loading() || Boolean(props.disableWithoutChanges && changeCount() === 0);\n const saveDisabled = () => disabled() || Boolean(props.saveDisabled !== undefined && read(props.saveDisabled));\n return (\n <div class=\"k2b-settings-actions\">\n <Button variant=\"secondary\" disabled={disabled()} onClick={props.onDiscard}>\n {messages().discard}\n </Button>\n <Button\n variant={props.saveVariant ?? \"primary\"}\n loading={loading()}\n loadingLabel={messages().saving}\n disabled={saveDisabled()}\n onClick={props.onSave}\n >\n <i class=\"ti ti-device-floppy\" aria-hidden=\"true\" />\n {props.saveLabel ?? messages().saveChanges}\n </Button>\n </div>\n );\n};\n\nexport function SettingsSaveBar(props: SettingsSaveBarProps): JSX.Element {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <Show when={changeCount() > 0}>\n <div class={`k2b-settings-save-bar ${props.class ?? \"\"}`}>\n <p role=\"status\" aria-live=\"polite\">\n <strong>{changeCount()}</strong> {messages().unsavedChangeLabel({ count: changeCount() })}\n </p>\n <SettingsActions {...props} />\n </div>\n </Show>\n );\n}\n\nexport type SettingsPanelFooterProps = SettingsSaveBarProps;\n\nexport function SettingsPanelFooter(props: SettingsPanelFooterProps): JSX.Element {\n const messages = useUiMessages();\n const changeCount = () => read(props.changeCount);\n return (\n <>\n <p class=\"k2b-settings-panel-footer__status\" role=\"status\" aria-live=\"polite\">\n <Show when={changeCount() > 0} fallback={messages().noUnsavedChanges}>\n <strong>{changeCount()}</strong> {messages().unsavedChangeLabel({ count: changeCount() })}\n </Show>\n </p>\n <SettingsActions {...props} disableWithoutChanges />\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,133 @@
1
+ import { createComponent as _$createComponent } from "solid-js/web";
2
+ import { ssr as _$ssr } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<button type=\"button\" class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\" data-visibility=\"hover\"", " aria-haspopup=\"dialog\"", "><i", " aria-hidden=\"true\"></i></button>"],
6
+ _tmpl$2 = ["<div", " popover=\"auto\" role=\"dialog\"", " tabindex=\"-1\" class=\"k2b-app-workspace__sidebar-preview\">", "</div>"];
7
+ import { createSignal, createUniqueId, onCleanup, onMount } from "solid-js";
8
+ import { positionTooltipSurface } from "../feedback/tooltip-position";
9
+ import { ScrollArea } from "./ScrollArea";
10
+
11
+ /** A non-modal, interactive row preview. Native popover owns light dismissal. */
12
+ export function SidebarItemPreview(props) {
13
+ const id = `sidebar-preview-${createUniqueId()}`;
14
+ const [open, setOpen] = createSignal(false);
15
+ let button;
16
+ let panel;
17
+ let row = null;
18
+ let main = null;
19
+ let timer;
20
+ let pinned = false;
21
+ let dismissed = false;
22
+ const clear = () => {
23
+ clearTimeout(timer);
24
+ timer = undefined;
25
+ };
26
+ const close = () => {
27
+ clear();
28
+ panel.hidePopover();
29
+ };
30
+ const position = () => {
31
+ const target = row ?? button;
32
+ positionTooltipSurface(panel, target, "right");
33
+ if (props.align === "end") {
34
+ const height = panel.getBoundingClientRect().height;
35
+ const bottom = target.getBoundingClientRect().bottom;
36
+ panel.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;
37
+ }
38
+ };
39
+ const show = () => {
40
+ clear();
41
+ if (dismissed || open()) return;
42
+ panel.showPopover();
43
+ position();
44
+ };
45
+ const enter = () => {
46
+ clear();
47
+ if (!dismissed && !open()) timer = setTimeout(show, 250);
48
+ };
49
+ const leave = () => {
50
+ clear();
51
+ dismissed = false;
52
+ if (!pinned) timer = setTimeout(() => {
53
+ if (!panel.contains(document.activeElement) && !row?.contains(document.activeElement)) close();
54
+ }, 180);
55
+ };
56
+ const dismiss = () => {
57
+ const restore = panel.contains(document.activeElement);
58
+ dismissed = true;
59
+ close();
60
+ if (restore) (main ?? button).focus();
61
+ };
62
+ const toggle = () => {
63
+ clear();
64
+ if (open() && pinned) {
65
+ dismiss();
66
+ return;
67
+ }
68
+ dismissed = false;
69
+ pinned = true;
70
+ show();
71
+ panel.focus();
72
+ };
73
+ onMount(() => {
74
+ row = button.closest(".k2b-app-workspace__sidebar-item");
75
+ if (props.trigger === "row") {
76
+ main = row?.querySelector(":scope > button.k2b-app-workspace__sidebar-item-main") ?? null;
77
+ main?.setAttribute("aria-label", props.label);
78
+ main?.setAttribute("aria-haspopup", "dialog");
79
+ main?.setAttribute("aria-controls", id);
80
+ main?.setAttribute("aria-expanded", "false");
81
+ main?.addEventListener("click", toggle);
82
+ }
83
+ const pointerEnter = event => {
84
+ if (event.pointerType === "mouse") enter();
85
+ };
86
+ const focusOut = event => {
87
+ const next = event.relatedTarget;
88
+ if (next instanceof Node && (panel.contains(next) || row?.contains(next))) return;
89
+ pinned = false;
90
+ leave();
91
+ };
92
+ const escape = event => {
93
+ if (event.key !== "Escape" || !open()) return;
94
+ dismiss();
95
+ };
96
+ const reposition = () => {
97
+ if (open()) position();
98
+ };
99
+ row?.addEventListener("pointerenter", pointerEnter);
100
+ row?.addEventListener("pointerleave", leave);
101
+ row?.addEventListener("focusin", enter);
102
+ row?.addEventListener("focusout", focusOut);
103
+ panel.addEventListener("focusout", focusOut);
104
+ document.addEventListener("keydown", escape);
105
+ window.addEventListener("resize", reposition);
106
+ window.addEventListener("scroll", reposition, true);
107
+ const observer = new ResizeObserver(reposition);
108
+ observer.observe(panel);
109
+ onCleanup(() => {
110
+ clear();
111
+ observer.disconnect();
112
+ main?.removeEventListener("click", toggle);
113
+ row?.removeEventListener("pointerenter", pointerEnter);
114
+ row?.removeEventListener("pointerleave", leave);
115
+ row?.removeEventListener("focusin", enter);
116
+ row?.removeEventListener("focusout", focusOut);
117
+ panel.removeEventListener("focusout", focusOut);
118
+ document.removeEventListener("keydown", escape);
119
+ window.removeEventListener("resize", reposition);
120
+ window.removeEventListener("scroll", reposition, true);
121
+ });
122
+ });
123
+ return [_$ssr(_tmpl$, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$ssrAttribute("aria-expanded", _$escape(open(), true), false) + _$ssrAttribute("aria-controls", _$escape(id, true), false) + _$ssrAttribute("data-row-trigger", props.trigger === "row" ? "true" : _$escape(undefined, true), false), _$ssrAttribute("class", props.trigger === "row" ? "ti ti-chevron-right" : "ti ti-info-circle", false)), _$ssr(_tmpl$2, _$ssrAttribute("id", _$escape(id, true), false), _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(ScrollArea, {
124
+ get viewportSize() {
125
+ return props.viewportSize;
126
+ },
127
+ "class": "k2b-app-workspace__sidebar-preview-body",
128
+ get children() {
129
+ return typeof props.children === "function" ? props.children(dismiss) : props.children;
130
+ }
131
+ })))];
132
+ }
133
+ //# sourceMappingURL=SidebarItemPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createSignal","createUniqueId","onCleanup","onMount","positionTooltipSurface","ScrollArea","SidebarItemPreview","props","id","open","setOpen","button","panel","row","main","timer","pinned","dismissed","clear","clearTimeout","undefined","close","hidePopover","position","target","align","height","getBoundingClientRect","bottom","style","top","Math","round","max","min","window","innerHeight","show","showPopover","enter","setTimeout","leave","contains","document","activeElement","dismiss","restore","focus","toggle","closest","trigger","querySelector","setAttribute","label","addEventListener","pointerEnter","event","pointerType","focusOut","next","relatedTarget","Node","escape","key","reposition","observer","ResizeObserver","observe","disconnect","removeEventListener","_$ssr","_tmpl$","_$ssrAttribute","_$escape","_tmpl$2","_$createComponent","viewportSize","children"],"sources":["layout/SidebarItemPreview.tsx"],"sourcesContent":["import { createSignal, createUniqueId, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport { ScrollArea, type ScrollAreaProps } from \"./ScrollArea\";\n\n/** A non-modal, interactive row preview. Native popover owns light dismissal. */\nexport function SidebarItemPreview(props: {\n label: string;\n children: JSX.Element | ((close: () => void) => JSX.Element);\n trigger?: \"action\" | \"row\";\n align?: \"center\" | \"end\";\n viewportSize?: ScrollAreaProps[\"viewportSize\"];\n onOpenChange?: (open: boolean) => void;\n}) {\n const id = `sidebar-preview-${createUniqueId()}`;\n const [open, setOpen] = createSignal(false);\n let button!: HTMLButtonElement;\n let panel!: HTMLDivElement;\n let row: HTMLElement | null = null;\n let main: HTMLButtonElement | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pinned = false;\n let dismissed = false;\n const clear = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const close = () => {\n clear();\n panel.hidePopover();\n };\n const position = () => {\n const target = row ?? button;\n positionTooltipSurface(panel, target, \"right\");\n if (props.align === \"end\") {\n const height = panel.getBoundingClientRect().height;\n const bottom = target.getBoundingClientRect().bottom;\n panel.style.top = `${Math.round(Math.max(8, Math.min(bottom - height, window.innerHeight - height - 8)))}px`;\n }\n };\n const show = () => {\n clear();\n if (dismissed || open()) return;\n panel.showPopover();\n position();\n };\n const enter = () => {\n clear();\n if (!dismissed && !open()) timer = setTimeout(show, 250);\n };\n const leave = () => {\n clear();\n dismissed = false;\n if (!pinned)\n timer = setTimeout(() => {\n if (!panel.contains(document.activeElement) && !row?.contains(document.activeElement)) close();\n }, 180);\n };\n const dismiss = () => {\n const restore = panel.contains(document.activeElement);\n dismissed = true;\n close();\n if (restore) (main ?? button).focus();\n };\n const toggle = () => {\n clear();\n if (open() && pinned) {\n dismiss();\n return;\n }\n dismissed = false;\n pinned = true;\n show();\n panel.focus();\n };\n onMount(() => {\n row = button.closest<HTMLElement>(\".k2b-app-workspace__sidebar-item\");\n if (props.trigger === \"row\") {\n main = row?.querySelector<HTMLButtonElement>(\":scope > button.k2b-app-workspace__sidebar-item-main\") ?? null;\n main?.setAttribute(\"aria-label\", props.label);\n main?.setAttribute(\"aria-haspopup\", \"dialog\");\n main?.setAttribute(\"aria-controls\", id);\n main?.setAttribute(\"aria-expanded\", \"false\");\n main?.addEventListener(\"click\", toggle);\n }\n const pointerEnter = (event: PointerEvent) => {\n if (event.pointerType === \"mouse\") enter();\n };\n const focusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (next instanceof Node && (panel.contains(next) || row?.contains(next))) return;\n pinned = false;\n leave();\n };\n const escape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !open()) return;\n dismiss();\n };\n const reposition = () => {\n if (open()) position();\n };\n row?.addEventListener(\"pointerenter\", pointerEnter);\n row?.addEventListener(\"pointerleave\", leave);\n row?.addEventListener(\"focusin\", enter);\n row?.addEventListener(\"focusout\", focusOut);\n panel.addEventListener(\"focusout\", focusOut);\n document.addEventListener(\"keydown\", escape);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n const observer = new ResizeObserver(reposition);\n observer.observe(panel);\n onCleanup(() => {\n clear();\n observer.disconnect();\n main?.removeEventListener(\"click\", toggle);\n row?.removeEventListener(\"pointerenter\", pointerEnter);\n row?.removeEventListener(\"pointerleave\", leave);\n row?.removeEventListener(\"focusin\", enter);\n row?.removeEventListener(\"focusout\", focusOut);\n panel.removeEventListener(\"focusout\", focusOut);\n document.removeEventListener(\"keydown\", escape);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n return (\n <>\n <button\n ref={button}\n type=\"button\"\n class=\"k2b-app-workspace__sidebar-item-action k2b-app-workspace__sidebar-preview-trigger\"\n data-visibility=\"hover\"\n aria-label={props.label}\n aria-haspopup=\"dialog\"\n aria-expanded={open()}\n aria-controls={id}\n data-row-trigger={props.trigger === \"row\" ? \"true\" : undefined}\n onClick={toggle}\n >\n <i class={props.trigger === \"row\" ? \"ti ti-chevron-right\" : \"ti ti-info-circle\"} aria-hidden=\"true\" />\n </button>\n <div\n ref={panel}\n id={id}\n popover=\"auto\"\n role=\"dialog\"\n aria-label={props.label}\n tabIndex={-1}\n class=\"k2b-app-workspace__sidebar-preview\"\n onPointerEnter={clear}\n onPointerLeave={leave}\n onToggle={(event) => {\n const visible = event.newState === \"open\";\n setOpen(visible);\n main?.setAttribute(\"aria-expanded\", String(visible));\n props.onOpenChange?.(visible);\n if (!visible) pinned = false;\n }}\n >\n <ScrollArea viewportSize={props.viewportSize} class=\"k2b-app-workspace__sidebar-preview-body\">\n {typeof props.children === \"function\" ? props.children(dismiss) : props.children}\n </ScrollArea>\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;AAAA,SAASA,YAAY,EAAEC,cAAc,EAAYC,SAAS,EAAEC,OAAO,QAAQ,UAAU;AACrF,SAASC,sBAAsB,QAAQ,8BAA8B;AACrE,SAASC,UAAU,QAA8B,cAAc;;AAE/D;AACA,OAAO,SAASC,kBAAkBA,CAACC,KAOlC,EAAE;EACD,MAAMC,EAAE,GAAG,mBAAmBP,cAAc,CAAC,CAAC,EAAE;EAChD,MAAM,CAACQ,IAAI,EAAEC,OAAO,CAAC,GAAGV,YAAY,CAAC,KAAK,CAAC;EAC3C,IAAIW,MAA0B;EAC9B,IAAIC,KAAsB;EAC1B,IAAIC,GAAuB,GAAG,IAAI;EAClC,IAAIC,IAA8B,GAAG,IAAI;EACzC,IAAIC,KAAgD;EACpD,IAAIC,MAAM,GAAG,KAAK;EAClB,IAAIC,SAAS,GAAG,KAAK;EACrB,MAAMC,KAAK,GAAGA,CAAA,KAAM;IAClBC,YAAY,CAACJ,KAAK,CAAC;IACnBA,KAAK,GAAGK,SAAS;EACnB,CAAC;EACD,MAAMC,KAAK,GAAGA,CAAA,KAAM;IAClBH,KAAK,CAAC,CAAC;IACPN,KAAK,CAACU,WAAW,CAAC,CAAC;EACrB,CAAC;EACD,MAAMC,QAAQ,GAAGA,CAAA,KAAM;IACrB,MAAMC,MAAM,GAAGX,GAAG,IAAIF,MAAM;IAC5BP,sBAAsB,CAACQ,KAAK,EAAEY,MAAM,EAAE,OAAO,CAAC;IAC9C,IAAIjB,KAAK,CAACkB,KAAK,KAAK,KAAK,EAAE;MACzB,MAAMC,MAAM,GAAGd,KAAK,CAACe,qBAAqB,CAAC,CAAC,CAACD,MAAM;MACnD,MAAME,MAAM,GAAGJ,MAAM,CAACG,qBAAqB,CAAC,CAAC,CAACC,MAAM;MACpDhB,KAAK,CAACiB,KAAK,CAACC,GAAG,GAAG,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEF,IAAI,CAACG,GAAG,CAACN,MAAM,GAAGF,MAAM,EAAES,MAAM,CAACC,WAAW,GAAGV,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;IAC9G;EACF,CAAC;EACD,MAAMW,IAAI,GAAGA,CAAA,KAAM;IACjBnB,KAAK,CAAC,CAAC;IACP,IAAID,SAAS,IAAIR,IAAI,CAAC,CAAC,EAAE;IACzBG,KAAK,CAAC0B,WAAW,CAAC,CAAC;IACnBf,QAAQ,CAAC,CAAC;EACZ,CAAC;EACD,MAAMgB,KAAK,GAAGA,CAAA,KAAM;IAClBrB,KAAK,CAAC,CAAC;IACP,IAAI,CAACD,SAAS,IAAI,CAACR,IAAI,CAAC,CAAC,EAAEM,KAAK,GAAGyB,UAAU,CAACH,IAAI,EAAE,GAAG,CAAC;EAC1D,CAAC;EACD,MAAMI,KAAK,GAAGA,CAAA,KAAM;IAClBvB,KAAK,CAAC,CAAC;IACPD,SAAS,GAAG,KAAK;IACjB,IAAI,CAACD,MAAM,EACTD,KAAK,GAAGyB,UAAU,CAAC,MAAM;MACvB,IAAI,CAAC5B,KAAK,CAAC8B,QAAQ,CAACC,QAAQ,CAACC,aAAa,CAAC,IAAI,CAAC/B,GAAG,EAAE6B,QAAQ,CAACC,QAAQ,CAACC,aAAa,CAAC,EAAEvB,KAAK,CAAC,CAAC;IAChG,CAAC,EAAE,GAAG,CAAC;EACX,CAAC;EACD,MAAMwB,OAAO,GAAGA,CAAA,KAAM;IACpB,MAAMC,OAAO,GAAGlC,KAAK,CAAC8B,QAAQ,CAACC,QAAQ,CAACC,aAAa,CAAC;IACtD3B,SAAS,GAAG,IAAI;IAChBI,KAAK,CAAC,CAAC;IACP,IAAIyB,OAAO,EAAE,CAAChC,IAAI,IAAIH,MAAM,EAAEoC,KAAK,CAAC,CAAC;EACvC,CAAC;EACD,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnB9B,KAAK,CAAC,CAAC;IACP,IAAIT,IAAI,CAAC,CAAC,IAAIO,MAAM,EAAE;MACpB6B,OAAO,CAAC,CAAC;MACT;IACF;IACA5B,SAAS,GAAG,KAAK;IACjBD,MAAM,GAAG,IAAI;IACbqB,IAAI,CAAC,CAAC;IACNzB,KAAK,CAACmC,KAAK,CAAC,CAAC;EACf,CAAC;EACD5C,OAAO,CAAC,MAAM;IACZU,GAAG,GAAGF,MAAM,CAACsC,OAAO,CAAc,kCAAkC,CAAC;IACrE,IAAI1C,KAAK,CAAC2C,OAAO,KAAK,KAAK,EAAE;MAC3BpC,IAAI,GAAGD,GAAG,EAAEsC,aAAa,CAAoB,sDAAsD,CAAC,IAAI,IAAI;MAC5GrC,IAAI,EAAEsC,YAAY,CAAC,YAAY,EAAE7C,KAAK,CAAC8C,KAAK,CAAC;MAC7CvC,IAAI,EAAEsC,YAAY,CAAC,eAAe,EAAE,QAAQ,CAAC;MAC7CtC,IAAI,EAAEsC,YAAY,CAAC,eAAe,EAAE5C,EAAE,CAAC;MACvCM,IAAI,EAAEsC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;MAC5CtC,IAAI,EAAEwC,gBAAgB,CAAC,OAAO,EAAEN,MAAM,CAAC;IACzC;IACA,MAAMO,YAAY,GAAIC,KAAmB,IAAK;MAC5C,IAAIA,KAAK,CAACC,WAAW,KAAK,OAAO,EAAElB,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,MAAMmB,QAAQ,GAAIF,KAAiB,IAAK;MACtC,MAAMG,IAAI,GAAGH,KAAK,CAACI,aAAa;MAChC,IAAID,IAAI,YAAYE,IAAI,KAAKjD,KAAK,CAAC8B,QAAQ,CAACiB,IAAI,CAAC,IAAI9C,GAAG,EAAE6B,QAAQ,CAACiB,IAAI,CAAC,CAAC,EAAE;MAC3E3C,MAAM,GAAG,KAAK;MACdyB,KAAK,CAAC,CAAC;IACT,CAAC;IACD,MAAMqB,MAAM,GAAIN,KAAoB,IAAK;MACvC,IAAIA,KAAK,CAACO,GAAG,KAAK,QAAQ,IAAI,CAACtD,IAAI,CAAC,CAAC,EAAE;MACvCoC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAMmB,UAAU,GAAGA,CAAA,KAAM;MACvB,IAAIvD,IAAI,CAAC,CAAC,EAAEc,QAAQ,CAAC,CAAC;IACxB,CAAC;IACDV,GAAG,EAAEyC,gBAAgB,CAAC,cAAc,EAAEC,YAAY,CAAC;IACnD1C,GAAG,EAAEyC,gBAAgB,CAAC,cAAc,EAAEb,KAAK,CAAC;IAC5C5B,GAAG,EAAEyC,gBAAgB,CAAC,SAAS,EAAEf,KAAK,CAAC;IACvC1B,GAAG,EAAEyC,gBAAgB,CAAC,UAAU,EAAEI,QAAQ,CAAC;IAC3C9C,KAAK,CAAC0C,gBAAgB,CAAC,UAAU,EAAEI,QAAQ,CAAC;IAC5Cf,QAAQ,CAACW,gBAAgB,CAAC,SAAS,EAAEQ,MAAM,CAAC;IAC5C3B,MAAM,CAACmB,gBAAgB,CAAC,QAAQ,EAAEU,UAAU,CAAC;IAC7C7B,MAAM,CAACmB,gBAAgB,CAAC,QAAQ,EAAEU,UAAU,EAAE,IAAI,CAAC;IACnD,MAAMC,QAAQ,GAAG,IAAIC,cAAc,CAACF,UAAU,CAAC;IAC/CC,QAAQ,CAACE,OAAO,CAACvD,KAAK,CAAC;IACvBV,SAAS,CAAC,MAAM;MACdgB,KAAK,CAAC,CAAC;MACP+C,QAAQ,CAACG,UAAU,CAAC,CAAC;MACrBtD,IAAI,EAAEuD,mBAAmB,CAAC,OAAO,EAAErB,MAAM,CAAC;MAC1CnC,GAAG,EAAEwD,mBAAmB,CAAC,cAAc,EAAEd,YAAY,CAAC;MACtD1C,GAAG,EAAEwD,mBAAmB,CAAC,cAAc,EAAE5B,KAAK,CAAC;MAC/C5B,GAAG,EAAEwD,mBAAmB,CAAC,SAAS,EAAE9B,KAAK,CAAC;MAC1C1B,GAAG,EAAEwD,mBAAmB,CAAC,UAAU,EAAEX,QAAQ,CAAC;MAC9C9C,KAAK,CAACyD,mBAAmB,CAAC,UAAU,EAAEX,QAAQ,CAAC;MAC/Cf,QAAQ,CAAC0B,mBAAmB,CAAC,SAAS,EAAEP,MAAM,CAAC;MAC/C3B,MAAM,CAACkC,mBAAmB,CAAC,QAAQ,EAAEL,UAAU,CAAC;MAChD7B,MAAM,CAACkC,mBAAmB,CAAC,QAAQ,EAAEL,UAAU,EAAE,IAAI,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,QAAAM,KAAA,CAAAC,MAAA,EAAAC,cAAA,eAAAC,QAAA,CAOkBlE,KAAK,CAAC8C,KAAK,iBAAAmB,cAAA,kBAAAC,QAAA,CAERhE,IAAI,CAAC,CAAC,kBAAA+D,cAAA,kBAAAC,QAAA,CACNjE,EAAE,kBAAAgE,cAAA,qBACCjE,KAAK,CAAC2C,OAAO,KAAK,KAAK,GAAG,MAAM,GAAAuB,QAAA,CAAGrD,SAAS,iBAAAoD,cAAA,UAGpDjE,KAAK,CAAC2C,OAAO,KAAK,KAAK,GAAG,qBAAqB,GAAG,mBAAmB,WAAAoB,KAAA,CAAAI,OAAA,EAAAF,cAAA,OAAAC,QAAA,CAI3EjE,EAAE,iBAAAgE,cAAA,eAAAC,QAAA,CAGMlE,KAAK,CAAC8C,KAAK,iBAAAoB,QAAA,CAAAE,iBAAA,CAatBtE,UAAU;IAAA,IAACuE,YAAYA,CAAA;MAAA,OAAErE,KAAK,CAACqE,YAAY;IAAA;IAAA;IAAA,IAAAC,SAAA;MAAA,OACzC,OAAOtE,KAAK,CAACsE,QAAQ,KAAK,UAAU,GAAGtE,KAAK,CAACsE,QAAQ,CAAChC,OAAO,CAAC,GAAGtC,KAAK,CAACsE,QAAQ;IAAA;EAAA;AAK1F","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import { APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspacePanelVariable, appWorkspaceResizeLimits, fitAppWorkspacePaneSizes, normalizeAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, shouldCollapseAppWorkspaceSidebar } from "./app-workspace-state";
2
+ import { installScrollFades } from "./scroll-fade";
2
3
  const HANDLE_SELECTOR = "[data-app-workspace-resize]";
3
4
  const ROOT_SELECTOR = "[data-k2b-app-workspace]";
4
5
  const LAYOUT_REGION_SELECTOR = [ROOT_SELECTOR, ".k2b-app-workspace__sidebar", ".k2b-app-workspace__main-pane", ".k2b-app-workspace__detail", ".k2b-app-workspace__drawer", HANDLE_SELECTOR].join(",");
@@ -152,6 +153,7 @@ const measureLabel = label => {
152
153
  };
153
154
  export const installAppWorkspaceController = (options = {}) => {
154
155
  const eventRoot = options.root ?? document;
156
+ const stopScrollFades = installScrollFades(eventRoot);
155
157
  let layoutState = normalizeAppWorkspaceLayoutState(options.readState?.()) ?? {
156
158
  version: 2
157
159
  };
@@ -402,6 +404,7 @@ export const installAppWorkspaceController = (options = {}) => {
402
404
  });
403
405
  scheduleReconcile();
404
406
  return () => {
407
+ stopScrollFades();
405
408
  // Flush the latest coalesced pointer sample before listeners and frames are
406
409
  // torn down, so unmounting during a drag cannot lose the final size.
407
410
  stopResize();