@k2b/ui 0.5.0 → 0.5.1

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 (364) hide show
  1. package/dist/browser/actions/Button.js.map +1 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/CopyButton.js.map +1 -1
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/RemoveButton.js.map +1 -1
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js.map +1 -1
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js.map +1 -1
  12. package/dist/browser/actions/Toolbar.js.map +1 -1
  13. package/dist/browser/actions/index.js.map +1 -1
  14. package/dist/browser/chat/ChatComposer.js.map +1 -1
  15. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  16. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/browser/chat/ChatRoot.js.map +1 -1
  18. package/dist/browser/chat/ChatTasks.js +1 -1
  19. package/dist/browser/chat/ChatTasks.js.map +1 -1
  20. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  21. package/dist/browser/chat/chat-behavior.js.map +1 -1
  22. package/dist/browser/chat/composer-document.js.map +1 -1
  23. package/dist/browser/chat/index.js.map +1 -1
  24. package/dist/browser/content/Calendar.js.map +1 -1
  25. package/dist/browser/content/Chart.js.map +1 -1
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  28. package/dist/browser/content/ChartFilterControls.js +1 -1
  29. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  30. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  31. package/dist/browser/content/CodeDisplay.js.map +1 -1
  32. package/dist/browser/content/DataTable.js.map +1 -1
  33. package/dist/browser/content/Docs.js.map +1 -1
  34. package/dist/browser/content/FileBrowser.js.map +1 -1
  35. package/dist/browser/content/FileGrid.js.map +1 -1
  36. package/dist/browser/content/FileTree.js.map +1 -1
  37. package/dist/browser/content/FileView.js.map +1 -1
  38. package/dist/browser/content/Lightbox.js.map +1 -1
  39. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  40. package/dist/browser/content/MarkdownView.js.map +1 -1
  41. package/dist/browser/content/Pagination.js.map +1 -1
  42. package/dist/browser/content/PdfPreview.js.map +1 -1
  43. package/dist/browser/content/RangePicker.js.map +1 -1
  44. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  45. package/dist/browser/content/calendar-event-layout.js.map +1 -1
  46. package/dist/browser/content/calendar-pointer.js.map +1 -1
  47. package/dist/browser/content/chart-cursor.js.map +1 -1
  48. package/dist/browser/content/chart-explorer.js.map +1 -1
  49. package/dist/browser/content/chart-inspection.js.map +1 -1
  50. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  51. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  52. package/dist/browser/content/chart-snapshot.js.map +1 -1
  53. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  54. package/dist/browser/content/chart-svg.js.map +1 -1
  55. package/dist/browser/content/code-highlight.js.map +1 -1
  56. package/dist/browser/content/collection-selection.js.map +1 -1
  57. package/dist/browser/content/delimited-preferences.js.map +1 -1
  58. package/dist/browser/content/file-tree.js.map +1 -1
  59. package/dist/browser/content/file-view-preview.js.map +1 -1
  60. package/dist/browser/content/index.js.map +1 -1
  61. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  62. package/dist/browser/feedback/Tooltip.js.map +1 -1
  63. package/dist/browser/feedback/dialog-core.js.map +1 -1
  64. package/dist/browser/feedback/index.js.map +1 -1
  65. package/dist/browser/feedback/prompts.js.map +1 -1
  66. package/dist/browser/feedback/toast.js.map +1 -1
  67. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  68. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  69. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  70. package/dist/browser/inputs/Checkbox.js.map +1 -1
  71. package/dist/browser/inputs/CheckboxCard.js.map +1 -1
  72. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  73. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  74. package/dist/browser/inputs/Combobox.js.map +1 -1
  75. package/dist/browser/inputs/DatePicker.js.map +1 -1
  76. package/dist/browser/inputs/FileInputs.js.map +1 -1
  77. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  78. package/dist/browser/inputs/NumberInput.js.map +1 -1
  79. package/dist/browser/inputs/Select.js.map +1 -1
  80. package/dist/browser/inputs/SelectChip.js.map +1 -1
  81. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  82. package/dist/browser/inputs/Switch.js.map +1 -1
  83. package/dist/browser/inputs/TagEditor.js.map +1 -1
  84. package/dist/browser/inputs/TagsInput.js.map +1 -1
  85. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  86. package/dist/browser/inputs/TextInput.js.map +1 -1
  87. package/dist/browser/inputs/choice.js.map +1 -1
  88. package/dist/browser/inputs/completion/behaviors.js.map +1 -1
  89. package/dist/browser/inputs/completion/engine.js.map +1 -1
  90. package/dist/browser/inputs/completion/index.js.map +1 -1
  91. package/dist/browser/inputs/completion/overlay.js.map +1 -1
  92. package/dist/browser/inputs/date-picker.js.map +1 -1
  93. package/dist/browser/inputs/editor-dom.js.map +1 -1
  94. package/dist/browser/inputs/field-contract.js.map +1 -1
  95. package/dist/browser/inputs/icon-options.js.map +1 -1
  96. package/dist/browser/inputs/image-crop.js.map +1 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  99. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  100. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  101. package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
  102. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  103. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  104. package/dist/browser/internal/color.js.map +1 -1
  105. package/dist/browser/internal/field.js.map +1 -1
  106. package/dist/browser/internal/portal.js.map +1 -1
  107. package/dist/browser/intl/Format.js.map +1 -1
  108. package/dist/browser/intl/index.js.map +1 -1
  109. package/dist/browser/intl/locale.js.map +1 -1
  110. package/dist/browser/intl/messages.js.map +1 -1
  111. package/dist/browser/layout/AppOverview.js.map +1 -1
  112. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  113. package/dist/browser/layout/BottomSheet.js.map +1 -1
  114. package/dist/browser/layout/DataPanel.js.map +1 -1
  115. package/dist/browser/layout/DetailPanel.js.map +1 -1
  116. package/dist/browser/layout/Discussion.js.map +1 -1
  117. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  118. package/dist/browser/layout/Navigation.js.map +1 -1
  119. package/dist/browser/layout/PanelDialog.js.map +1 -1
  120. package/dist/browser/layout/PanelHeader.js.map +1 -1
  121. package/dist/browser/layout/Panes.js.map +1 -1
  122. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  123. package/dist/browser/layout/ScrollArea.js.map +1 -1
  124. package/dist/browser/layout/Settings.js.map +1 -1
  125. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  126. package/dist/browser/layout/SettingsModal.js.map +1 -1
  127. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  128. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  129. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  130. package/dist/browser/layout/floating-window-geometry.js.map +1 -1
  131. package/dist/browser/layout/index.js.map +1 -1
  132. package/dist/browser/layout/navigation-model.js.map +1 -1
  133. package/dist/browser/layout/panes-layout.js.map +1 -1
  134. package/dist/browser/layout/scroll-fade.js.map +1 -1
  135. package/dist/browser/layout/stable-id.js.map +1 -1
  136. package/dist/browser/surfaces/Avatar.js.map +1 -1
  137. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  138. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  139. package/dist/browser/surfaces/NotFoundState.js.map +1 -1
  140. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  141. package/dist/browser/surfaces/Paper.js.map +1 -1
  142. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  143. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  144. package/dist/browser/surfaces/StatCell.js.map +1 -1
  145. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  146. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  147. package/dist/browser/surfaces/Tag.js.map +1 -1
  148. package/dist/browser/surfaces/index.js.map +1 -1
  149. package/dist/browser/widgets/Widget.js.map +1 -1
  150. package/dist/browser/widgets/WidgetHero.js.map +1 -1
  151. package/dist/browser/widgets/WidgetList.js.map +1 -1
  152. package/dist/browser/widgets/WidgetPills.js.map +1 -1
  153. package/dist/browser/widgets/WidgetStat.js.map +1 -1
  154. package/dist/browser/widgets/WidgetStatus.js.map +1 -1
  155. package/dist/ssr/actions/Button.js +5 -4
  156. package/dist/ssr/actions/Button.js.map +1 -1
  157. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  158. package/dist/ssr/actions/CopyButton.js +2 -1
  159. package/dist/ssr/actions/CopyButton.js.map +1 -1
  160. package/dist/ssr/actions/Disclosure.js.map +1 -1
  161. package/dist/ssr/actions/Dropdown.js +7 -6
  162. package/dist/ssr/actions/Dropdown.js.map +1 -1
  163. package/dist/ssr/actions/FilterChip.js +5 -4
  164. package/dist/ssr/actions/FilterChip.js.map +1 -1
  165. package/dist/ssr/actions/RemoveButton.js +1 -0
  166. package/dist/ssr/actions/RemoveButton.js.map +1 -1
  167. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  168. package/dist/ssr/actions/SplitButton.js +1 -0
  169. package/dist/ssr/actions/SplitButton.js.map +1 -1
  170. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  171. package/dist/ssr/actions/Tabs.js.map +1 -1
  172. package/dist/ssr/actions/Toolbar.js.map +1 -1
  173. package/dist/ssr/actions/index.js.map +1 -1
  174. package/dist/ssr/chat/ChatComposer.js +6 -5
  175. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  176. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  177. package/dist/ssr/chat/ChatPrimitives.js +6 -5
  178. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  179. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  180. package/dist/ssr/chat/ChatTasks.js +1 -1
  181. package/dist/ssr/chat/ChatTasks.js.map +1 -1
  182. package/dist/ssr/chat/ChatTimeline.js +5 -4
  183. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  184. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  185. package/dist/ssr/chat/composer-document.js.map +1 -1
  186. package/dist/ssr/chat/index.js.map +1 -1
  187. package/dist/ssr/content/Calendar.js +2 -1
  188. package/dist/ssr/content/Calendar.js.map +1 -1
  189. package/dist/ssr/content/Chart.js.map +1 -1
  190. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  191. package/dist/ssr/content/ChartExplorerControls.js +5 -4
  192. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  193. package/dist/ssr/content/ChartFilterControls.js +3 -2
  194. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  195. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  196. package/dist/ssr/content/CodeDisplay.js.map +1 -1
  197. package/dist/ssr/content/DataTable.js +1 -0
  198. package/dist/ssr/content/DataTable.js.map +1 -1
  199. package/dist/ssr/content/Docs.js +1 -0
  200. package/dist/ssr/content/Docs.js.map +1 -1
  201. package/dist/ssr/content/FileBrowser.js +2 -1
  202. package/dist/ssr/content/FileBrowser.js.map +1 -1
  203. package/dist/ssr/content/FileGrid.js.map +1 -1
  204. package/dist/ssr/content/FileTree.js +2 -1
  205. package/dist/ssr/content/FileTree.js.map +1 -1
  206. package/dist/ssr/content/FileView.js +5 -4
  207. package/dist/ssr/content/FileView.js.map +1 -1
  208. package/dist/ssr/content/Lightbox.js +2 -1
  209. package/dist/ssr/content/Lightbox.js.map +1 -1
  210. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  211. package/dist/ssr/content/MarkdownView.js.map +1 -1
  212. package/dist/ssr/content/Pagination.js +2 -1
  213. package/dist/ssr/content/Pagination.js.map +1 -1
  214. package/dist/ssr/content/PdfPreview.js.map +1 -1
  215. package/dist/ssr/content/RangePicker.js.map +1 -1
  216. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  217. package/dist/ssr/content/calendar-event-layout.js.map +1 -1
  218. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  219. package/dist/ssr/content/chart-cursor.js.map +1 -1
  220. package/dist/ssr/content/chart-explorer.js.map +1 -1
  221. package/dist/ssr/content/chart-inspection.js.map +1 -1
  222. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  223. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  224. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  225. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  226. package/dist/ssr/content/chart-svg.js.map +1 -1
  227. package/dist/ssr/content/code-highlight.js.map +1 -1
  228. package/dist/ssr/content/collection-selection.js.map +1 -1
  229. package/dist/ssr/content/delimited-preferences.js.map +1 -1
  230. package/dist/ssr/content/file-tree.js.map +1 -1
  231. package/dist/ssr/content/file-view-preview.js.map +1 -1
  232. package/dist/ssr/content/index.js.map +1 -1
  233. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  234. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  235. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  236. package/dist/ssr/feedback/index.js.map +1 -1
  237. package/dist/ssr/feedback/prompts.js +3 -2
  238. package/dist/ssr/feedback/prompts.js.map +1 -1
  239. package/dist/ssr/feedback/toast.js.map +1 -1
  240. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  241. package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
  242. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  243. package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
  244. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  245. package/dist/ssr/inputs/Checkbox.js +1 -0
  246. package/dist/ssr/inputs/Checkbox.js.map +1 -1
  247. package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
  248. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  249. package/dist/ssr/inputs/ChoiceInputs.js +1 -0
  250. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  251. package/dist/ssr/inputs/Combobox.js +2 -1
  252. package/dist/ssr/inputs/Combobox.js.map +1 -1
  253. package/dist/ssr/inputs/DatePicker.js +4 -3
  254. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  255. package/dist/ssr/inputs/FileInputs.js +2 -1
  256. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  257. package/dist/ssr/inputs/MultiSelectInput.js +4 -3
  258. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  259. package/dist/ssr/inputs/NumberInput.js +2 -1
  260. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  261. package/dist/ssr/inputs/Select.js +4 -3
  262. package/dist/ssr/inputs/Select.js.map +1 -1
  263. package/dist/ssr/inputs/SelectChip.js +3 -2
  264. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  265. package/dist/ssr/inputs/SpecialInputs.js +1 -0
  266. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  267. package/dist/ssr/inputs/Switch.js.map +1 -1
  268. package/dist/ssr/inputs/TagEditor.js +3 -2
  269. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  270. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  271. package/dist/ssr/inputs/TemplateEditor.js +1 -0
  272. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  273. package/dist/ssr/inputs/TextInput.js +4 -3
  274. package/dist/ssr/inputs/TextInput.js.map +1 -1
  275. package/dist/ssr/inputs/choice.js.map +1 -1
  276. package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
  277. package/dist/ssr/inputs/completion/engine.js.map +1 -1
  278. package/dist/ssr/inputs/completion/index.js.map +1 -1
  279. package/dist/ssr/inputs/completion/overlay.js.map +1 -1
  280. package/dist/ssr/inputs/date-picker.js.map +1 -1
  281. package/dist/ssr/inputs/editor-dom.js.map +1 -1
  282. package/dist/ssr/inputs/field-contract.js.map +1 -1
  283. package/dist/ssr/inputs/icon-options.js.map +1 -1
  284. package/dist/ssr/inputs/image-crop.js.map +1 -1
  285. package/dist/ssr/inputs/index.js.map +1 -1
  286. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  287. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  288. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  289. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  290. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
  291. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  292. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  293. package/dist/ssr/internal/color.js.map +1 -1
  294. package/dist/ssr/internal/field.js.map +1 -1
  295. package/dist/ssr/internal/portal.js.map +1 -1
  296. package/dist/ssr/intl/Format.js.map +1 -1
  297. package/dist/ssr/intl/index.js.map +1 -1
  298. package/dist/ssr/intl/locale.js.map +1 -1
  299. package/dist/ssr/intl/messages.js.map +1 -1
  300. package/dist/ssr/layout/AppOverview.js +2 -1
  301. package/dist/ssr/layout/AppOverview.js.map +1 -1
  302. package/dist/ssr/layout/AppWorkspace.js +7 -6
  303. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  304. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  305. package/dist/ssr/layout/DataPanel.js +1 -0
  306. package/dist/ssr/layout/DataPanel.js.map +1 -1
  307. package/dist/ssr/layout/DetailPanel.js +1 -0
  308. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  309. package/dist/ssr/layout/Discussion.js +3 -2
  310. package/dist/ssr/layout/Discussion.js.map +1 -1
  311. package/dist/ssr/layout/FloatingWindow.js +1 -0
  312. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  313. package/dist/ssr/layout/Navigation.js +3 -2
  314. package/dist/ssr/layout/Navigation.js.map +1 -1
  315. package/dist/ssr/layout/PanelDialog.js +1 -0
  316. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  317. package/dist/ssr/layout/PanelHeader.js.map +1 -1
  318. package/dist/ssr/layout/Panes.js.map +1 -1
  319. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  320. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  321. package/dist/ssr/layout/Settings.js +2 -1
  322. package/dist/ssr/layout/Settings.js.map +1 -1
  323. package/dist/ssr/layout/SettingsCollection.js +1 -0
  324. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  325. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  326. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  327. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  328. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  329. package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
  330. package/dist/ssr/layout/index.js.map +1 -1
  331. package/dist/ssr/layout/navigation-model.js.map +1 -1
  332. package/dist/ssr/layout/panes-layout.js.map +1 -1
  333. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  334. package/dist/ssr/layout/stable-id.js.map +1 -1
  335. package/dist/ssr/surfaces/Avatar.js +2 -1
  336. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  337. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  338. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  339. package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
  340. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  341. package/dist/ssr/surfaces/Paper.js +2 -1
  342. package/dist/ssr/surfaces/Paper.js.map +1 -1
  343. package/dist/ssr/surfaces/Placeholder.js +2 -1
  344. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  345. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  346. package/dist/ssr/surfaces/StatCell.js +2 -1
  347. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  348. package/dist/ssr/surfaces/StatGrid.js +1 -0
  349. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  350. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  351. package/dist/ssr/surfaces/Tag.js.map +1 -1
  352. package/dist/ssr/surfaces/index.js.map +1 -1
  353. package/dist/ssr/widgets/Widget.js +1 -0
  354. package/dist/ssr/widgets/Widget.js.map +1 -1
  355. package/dist/ssr/widgets/WidgetHero.js.map +1 -1
  356. package/dist/ssr/widgets/WidgetList.js.map +1 -1
  357. package/dist/ssr/widgets/WidgetPills.js.map +1 -1
  358. package/dist/ssr/widgets/WidgetStat.js +1 -0
  359. package/dist/ssr/widgets/WidgetStat.js.map +1 -1
  360. package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
  361. package/dist/styles.css +1 -1
  362. package/dist/types/actions/SpotlightSearch.d.ts +1 -1
  363. package/dist/types/feedback/prompts.d.ts +2 -2
  364. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"names":["Show","Heading","props","className","size","as","_$ssr","_tmpl$","_$ssrAttribute","_$escape","title","_tmpl$2","_tmpl$3","PanelHeader","_tmpl$6","class","_$createComponent","when","subtitle","children","_tmpl$4","actions","_tmpl$5"],"sources":["layout/PanelHeader.tsx"],"sourcesContent":["import { type JSX, Show } from \"solid-js\";\n\nexport type PanelHeaderProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n actions?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\" | \"lg\";\n class?: string;\n};\n\nconst Heading = (props: Pick<PanelHeaderProps, \"as\" | \"size\" | \"title\">): JSX.Element => {\n const className = `k2b-panel-header__title ${props.size === \"md\" ? \"is-medium\" : props.size === \"lg\" ? \"is-large\" : \"\"}`;\n if (props.as === \"h1\") return <h1 class={className}>{props.title}</h1>;\n if (props.as === \"h3\") return <h3 class={className}>{props.title}</h3>;\n return <h2 class={className}>{props.title}</h2>;\n};\n\nexport function PanelHeader(props: PanelHeaderProps): JSX.Element {\n return (\n <div class={`k2b-panel-header ${props.class ?? \"\"}`} data-size={props.size ?? \"sm\"}>\n <div class=\"k2b-panel-header__copy\">\n <Heading as={props.as} size={props.size} title={props.title} />\n <Show when={props.subtitle}>\n <p class=\"k2b-panel-header__subtitle\">{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-header__actions\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAmBA,IAAI,QAAQ,UAAU;AAWzC,MAAMC,OAAO,GAAIC,KAAsD,IAAkB;EACvF,MAAMC,SAAS,GAAG,2BAA2BD,KAAK,CAACE,IAAI,KAAK,IAAI,GAAG,WAAW,GAAGF,KAAK,CAACE,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,EAAE,EAAE;EACxH,IAAIF,KAAK,CAACG,EAAE,KAAK,IAAI,EAAE,OAAAC,KAAA,CAAAC,MAAA,EAAAC,cAAA,UAAAC,QAAA,CAAkBN,SAAS,iBAAAM,QAAA,CAAGP,KAAK,CAACQ,KAAK;EAChE,IAAIR,KAAK,CAACG,EAAE,KAAK,IAAI,EAAE,OAAAC,KAAA,CAAAK,OAAA,EAAAH,cAAA,UAAAC,QAAA,CAAkBN,SAAS,iBAAAM,QAAA,CAAGP,KAAK,CAACQ,KAAK;EAChE,OAAAJ,KAAA,CAAAM,OAAA,EAAAJ,cAAA,UAAAC,QAAA,CAAkBN,SAAS,iBAAAM,QAAA,CAAGP,KAAK,CAACQ,KAAK;AAC3C,CAAC;AAED,OAAO,SAASG,WAAWA,CAACX,KAAuB,EAAe;EAChE,OAAAI,KAAA,CAAAQ,OAAA,EACc,oBAAAL,QAAA,CAAoBP,KAAK,CAACa,KAAK,IAAI,EAAE,SAAE,EAAAP,cAAA,cAAAC,QAAA,CAAaP,KAAK,CAACE,IAAI,IAAI,IAAI,iBAAAK,QAAA,CAAAO,iBAAA,CAE7Ef,OAAO;IAAA,IAACI,EAAEA,CAAA;MAAA,OAAEH,KAAK,CAACG,EAAE;IAAA;IAAA,IAAED,IAAIA,CAAA;MAAA,OAAEF,KAAK,CAACE,IAAI;IAAA;IAAA,IAAEM,KAAKA,CAAA;MAAA,OAAER,KAAK,CAACQ,KAAK;IAAA;EAAA,KAAAD,QAAA,CAAAO,iBAAA,CAC1DhB,IAAI;IAAA,IAACiB,IAAIA,CAAA;MAAA,OAAEf,KAAK,CAACgB,QAAQ;IAAA;IAAA,IAAAC,SAAA;MAAA,OAAAb,KAAA,CAAAc,OAAA,EAAAX,QAAA,CACeP,KAAK,CAACgB,QAAQ;IAAA;EAAA,KAAAT,QAAA,CAAAO,iBAAA,CAGxDhB,IAAI;IAAA,IAACiB,IAAIA,CAAA;MAAA,OAAEf,KAAK,CAACmB,OAAO;IAAA;IAAA,IAAAF,SAAA;MAAA,OAAAb,KAAA,CAAAgB,OAAA,EAAAb,QAAA,CACiBP,KAAK,CAACmB,OAAO;IAAA;EAAA;AAI7D","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/PanelHeader.tsx"],"sourcesContent":["import { type JSX, Show } from \"solid-js\";\n\nexport type PanelHeaderProps = {\n title: JSX.Element;\n subtitle?: JSX.Element;\n actions?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\" | \"lg\";\n class?: string;\n};\n\nconst Heading = (props: Pick<PanelHeaderProps, \"as\" | \"size\" | \"title\">): JSX.Element => {\n const className = `k2b-panel-header__title ${props.size === \"md\" ? \"is-medium\" : props.size === \"lg\" ? \"is-large\" : \"\"}`;\n if (props.as === \"h1\") return <h1 class={className}>{props.title}</h1>;\n if (props.as === \"h3\") return <h3 class={className}>{props.title}</h3>;\n return <h2 class={className}>{props.title}</h2>;\n};\n\nexport function PanelHeader(props: PanelHeaderProps): JSX.Element {\n return (\n <div class={`k2b-panel-header ${props.class ?? \"\"}`} data-size={props.size ?? \"sm\"}>\n <div class=\"k2b-panel-header__copy\">\n <Heading as={props.as} size={props.size} title={props.title} />\n <Show when={props.subtitle}>\n <p class=\"k2b-panel-header__subtitle\">{props.subtitle}</p>\n </Show>\n </div>\n <Show when={props.actions}>\n <div class=\"k2b-panel-header__actions\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAmB,IAAI,QAAQ,UAAU;AAWzC,MAAM,OAAO,GAAI,KAAsD,IAAkB;EACvF,MAAM,SAAS,GAAG,2BAA2B,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,EAAE,EAAE;EACxH,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,sDAAkB,SAAS,0BAAG,KAAK,CAAC,KAAK;EAChE,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,uDAAkB,SAAS,0BAAG,KAAK,CAAC,KAAK;EAChE,uDAAkB,SAAS,0BAAG,KAAK,CAAC,KAAK;AAC3C,CAAC;AAED,OAAO,SAAS,WAAW,CAAC,KAAuB,EAAe;EAChE,sBACc,6BAAoB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,uCAAa,KAAK,CAAC,IAAI,IAAI,IAAI,4CAE7E,OAAO;IAAA,IAAC,EAAE;MAAA,OAAE,KAAK,CAAC,EAAE;IAAA;IAAA,IAAE,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,IAAE,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;EAAA,gCAC1D,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA,+BACe,KAAK,CAAC,QAAQ;IAAA;EAAA,gCAGxD,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA;MAAA,+BACiB,KAAK,CAAC,OAAO;IAAA;EAAA;AAI7D","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["dnd","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","useUiMessages","activatePanesItem","applyPanesIntent","getPanesDropTargets","PANES_MAX_ID_LENGTH","PANES_MIN_RATIO","parsePanesLayout","resizePanesSplit","samePanesIntent","assertUniqueStableUiIds","PANES_RESIZE_SNAP_DISTANCE","PANES_RESIZE_UNSNAP_DISTANCE","PANES_RESIZE_NEIGHBOR_GAP","intervalGap","left","right","crossEnd","crossStart","resolvePanesResizeSnap","coordinate","source","candidates","options","neighbors","filter","candidate","gap","activeCoordinate","active","undefined","find","Math","abs","snappedTo","previous","previousCoordinate","winner","winnerDistance","Number","POSITIVE_INFINITY","distanceToRange","min","max","distanceToCoordinate","indexPanesDropTargets","targets","mutable","Map","target","indexed","get","targetItemId","tabs","body","set","kind","beforeItemId","push","iconClass","icon","value","trim","startsWith","collectLayoutItemIds","node","ids","type","items","first","second","nearestDroppable","entries","reduce","entry","distance","pointerHitsPanesDropTarget","pointer","hitElement","element","contains","side","meta","containsPointer","x","rect","y","top","width","corner","height","panesCollisionDetector","context","mode","document","droppables","ownerDocument","elementFromPoint","id","createItemMap","map","item","requireItem","Error","Panes","props","messages","instanceId","layout","root","canMove","movable","canResize","resizable","split","draggedItemId","setDraggedItemId","dragMode","setDragMode","dropTargets","itemId","dropTargetIndex","paneDnd","create","collisionDetector","buildIntent","over","intent","isSameIntent","onDragStart","announcements","dragStart","label","dragOver","drop","cancel","onDrop","current","next","onLayoutChange","queueMicrotask","getElementById","focus","onCancel","activate","requestAdd","onAddItem","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","ariaLabel","paneWorkspace","_$createComponent","when","fallback","_tmpl$3","children","_tmpl$2","addPane","PanesNodeRenderer","path","itemById","addItem","canAdd","onActivate","group","PanesSplitRenderer","_$mergeProps","PanesGroupRenderer","container","separatorElement","stopResize","finishResize","stopActiveResize","finishActiveResize","commitRatio","ratio","resizeGeometry","separator","direction","containerRect","getBoundingClientRect","separatorRect","extent","separatorExtent","availableExtent","geometry","bottom","panes","closest","Array","from","querySelectorAll","origin","coordinateForRatio","ratioForCoordinate","startResize","event","preventDefault","pointerId","captureTarget","currentTarget","start","clientX","clientY","startRatio","startCoordinate","frame","pendingRatio","flush","cancelAnimationFrame","onMove","move","snapped","requestAnimationFrame","onEnd","end","window","removeEventListener","hasPointerCapture","releasePointerCapture","setPointerCapture","addEventListener","onResizeKeyDown","step","shiftKey","key","_tmpl$4","_$ssrStyleProperty","round","resizePanes","ActivePane","render","tabsElement","scrollbarDragOffset","stopTabPress","suppressedPointerClick","clearSuppressedPointerClick","dndInstanceId","draggableId","itemIds","groupTargets","index","targetBefore","targetAtEnd","bodyTargets","startTabPress","button","isPrimary","ownerWindow","stop","onPointerUp","onPointerCancel","up","releasedInside","shouldActivate","isDragging","clearTimeout","setTimeout","scrollbar","setScrollbar","overflow","syncScrollbar","clientWidth","scrollLeft","scrollWidth","scrollFromPointer","track","available","thumbLeft","startScrollbarDrag","observer","ResizeObserver","observe","disconnect","length","tabId","panelId","focusTab","onTabKeyDown","activeId","onClose","count","targetLabel","targetItem","addToNamed","name","title","before","insertBeforeNamed","insertAtEnd","addPaneSide","_tmpl$8","paneTabs","each","_tmpl$0","PanesDropTargetView","placement","_tmpl$9","closeNamed","_tmpl$5","_tmpl$6","keyed","_tmpl$7","_tmpl$10","overId","_tmpl$11","_tmpl$1"],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const messages = useUiMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? messages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={messages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{messages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const messages = useUiMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize()) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n stopResize = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={messages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return messages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? messages().insertBeforeNamed({ name: before.title }) : messages().insertAtEnd;\n }\n return target.side\n ? messages().addPaneSide({ side: target.side, name: targetItem.title })\n : messages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={messages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <button\n type=\"button\"\n class=\"k2b-panes__close\"\n title={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <button\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={messages().addPane}\n title={messages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const messages = useUiMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? messages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={messages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{messages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const messages = useUiMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize()) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n stopResize = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={messages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return messages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? messages().insertBeforeNamed({ name: before.title }) : messages().insertAtEnd;\n }\n return target.side\n ? messages().addPaneSide({ side: target.side, name: targetItem.title })\n : messages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={messages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <button\n type=\"button\"\n class=\"k2b-panes__close\"\n title={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <button\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={messages().addPane}\n title={messages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["createSignal","onCleanup","onMount","useUiMessages","THRESHOLD","MAX_DISTANCE","RESISTANCE","WHEEL_IDLE_MS","LINE_HEIGHT","INTERACTIVE","PullToRefresh","props","messages","state","setState","distance","setDistance","root","active","disabled","atTop","target","node","Element","parentElement","scrollTop","interactive","closest","capture","id","setPointerCapture","reset","pull","travel","next","Math","min","max","refresh","onRefresh","release","abort","wheelTravel","wheelTimer","endWheel","onWheel","event","clearTimeout","setTimeout","deltaY","scale","deltaMode","clientHeight","pointer","onPointerDown","pointerType","button","pointerId","startY","clientY","onPointerMove","preventDefault","onPointerUp","onPointerCancel","touch","onTouchStart","first","touches","length","identifier","onTouchMove","current","Array","from","find","item","cancelable","onTouchEnd","onTouchCancel","addEventListener","passive","removeEventListener","className","class","trim","progress","_$ssr","_tmpl$","_$ssrAttribute","_$escape","_$ssrStyleProperty","String","label","refreshing","children"],"sources":["layout/PullToRefresh.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/** Android's SwipeRefreshLayout triggers at 64dp; the pull is damped to half the input travel. */\nconst THRESHOLD = 64;\nconst MAX_DISTANCE = 96;\nconst RESISTANCE = 0.5;\n/** A trackpad has no release event, so an idle gap ends the wheel gesture. */\nconst WHEEL_IDLE_MS = 300;\nconst LINE_HEIGHT = 16;\n\nexport type PullToRefreshState = \"idle\" | \"pulling\" | \"ready\" | \"refreshing\";\n\nexport type PullToRefreshProps = {\n /** Reloads the wrapped content. The indicator stays busy until the promise settles. */\n onRefresh: () => Promise<void>;\n disabled?: boolean;\n /** Status text announced while refreshing. Defaults to the shared \"Refreshing\" message. */\n label?: string;\n class?: string;\n /** Exactly one scroll container; the gesture only starts while it is scrolled to the top. */\n children: JSX.Element;\n};\n\nconst INTERACTIVE = \"a, button, input, textarea, select, [contenteditable], [role='button']\";\n\n/**\n * Turns a downward pull on a scroll container that is already at its top into\n * one `onRefresh` call. Touch pulls, mouse or pen drags on non-interactive\n * space, and trackpad or wheel overscroll share one gesture model. The gesture\n * is an enhancement: keep a keyboard-reachable refresh (a button or the page\n * reload) next to it.\n */\nexport function PullToRefresh(props: PullToRefreshProps): JSX.Element {\n const messages = useUiMessages();\n const [state, setState] = createSignal<PullToRefreshState>(\"idle\");\n const [distance, setDistance] = createSignal(0);\n let root!: HTMLDivElement;\n\n const active = () => !props.disabled && state() !== \"refreshing\";\n const atTop = (target: EventTarget | null) => {\n for (let node = target instanceof Element ? target : null; node && node !== root; node = node.parentElement)\n if (node.scrollTop > 0) return false;\n return true;\n };\n const interactive = (target: EventTarget | null) => target instanceof Element && target.closest(INTERACTIVE) !== null;\n /** Keeps the drag alive when the pointer leaves the wrapper; a pointer that is already gone must not end the gesture. */\n const capture = (id: number) => {\n try {\n root.setPointerCapture(id);\n } catch {}\n };\n\n const reset = () => {\n setDistance(0);\n setState(\"idle\");\n };\n const pull = (travel: number) => {\n const next = Math.min(MAX_DISTANCE, Math.max(0, travel * RESISTANCE));\n setDistance(next);\n setState(next >= THRESHOLD ? \"ready\" : next > 0 ? \"pulling\" : \"idle\");\n };\n const refresh = async () => {\n if (state() === \"refreshing\") return;\n setState(\"refreshing\");\n setDistance(THRESHOLD);\n try {\n await props.onRefresh();\n } finally {\n reset();\n }\n };\n const release = () => {\n if (state() === \"ready\") void refresh();\n else if (state() !== \"refreshing\") reset();\n };\n const abort = () => {\n if (state() !== \"refreshing\") reset();\n };\n\n let wheelTravel = 0;\n let wheelTimer: ReturnType<typeof setTimeout> | undefined;\n const endWheel = () => {\n wheelTravel = 0;\n abort();\n };\n const onWheel = (event: WheelEvent) => {\n if (!active()) return;\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(endWheel, WHEEL_IDLE_MS);\n if (event.deltaY >= 0 || !atTop(event.target)) return endWheel();\n const scale = event.deltaMode === 1 ? LINE_HEIGHT : event.deltaMode === 2 ? root.clientHeight : 1;\n wheelTravel -= event.deltaY * scale;\n pull(wheelTravel);\n if (state() === \"ready\") {\n wheelTravel = 0;\n void refresh();\n }\n };\n\n let pointer: { id: number; startY: number } | null = null;\n const onPointerDown = (event: PointerEvent) => {\n if (event.pointerType === \"touch\" || event.button !== 0 || !active() || interactive(event.target) || !atTop(event.target)) return;\n pointer = { id: event.pointerId, startY: event.clientY };\n };\n const onPointerMove = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n const travel = event.clientY - pointer.startY;\n if (travel <= 0 && state() === \"idle\") return;\n if (state() === \"idle\") capture(pointer.id);\n pull(travel);\n if (state() !== \"idle\") event.preventDefault();\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n release();\n };\n const onPointerCancel = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n abort();\n };\n\n let touch: { id: number; startY: number } | null = null;\n const onTouchStart = (event: TouchEvent) => {\n const first = event.touches[0];\n if (!first || event.touches.length !== 1 || !active() || !atTop(event.target)) return;\n touch = { id: first.identifier, startY: first.clientY };\n };\n const onTouchMove = (event: TouchEvent) => {\n if (!touch) return;\n const current = Array.from(event.touches).find((item) => item.identifier === touch?.id);\n if (!current) return;\n const travel = current.clientY - touch.startY;\n if (travel <= 0 && state() === \"idle\") {\n touch = null;\n return;\n }\n pull(travel);\n if (state() !== \"idle\" && event.cancelable) event.preventDefault();\n };\n const onTouchEnd = () => {\n if (!touch) return;\n touch = null;\n release();\n };\n const onTouchCancel = () => {\n if (!touch) return;\n touch = null;\n abort();\n };\n\n onMount(() => {\n root.addEventListener(\"wheel\", onWheel, { passive: true });\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerCancel);\n root.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n root.addEventListener(\"touchend\", onTouchEnd);\n root.addEventListener(\"touchcancel\", onTouchCancel);\n onCleanup(() => {\n clearTimeout(wheelTimer);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerCancel);\n root.removeEventListener(\"touchstart\", onTouchStart);\n root.removeEventListener(\"touchmove\", onTouchMove);\n root.removeEventListener(\"touchend\", onTouchEnd);\n root.removeEventListener(\"touchcancel\", onTouchCancel);\n });\n });\n\n const className = () => (props.class?.trim() ? `k2b-pull-to-refresh ${props.class.trim()}` : \"k2b-pull-to-refresh\");\n const progress = () => Math.min(1, distance() / THRESHOLD);\n\n return (\n <div\n ref={root}\n class={className()}\n data-state={state()}\n style={{ \"--k2b-pull-to-refresh-distance\": `${distance()}px`, \"--k2b-pull-to-refresh-progress\": String(progress()) }}\n >\n <div class=\"k2b-pull-to-refresh__indicator\" role=\"status\" aria-live=\"polite\">\n <i class={state() === \"refreshing\" ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-refresh\"} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{state() === \"refreshing\" ? (props.label ?? messages().refreshing) : \"\"}</span>\n </div>\n {props.children}\n </div>\n );\n}\n\nexport default PullToRefresh;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["layout/PullToRefresh.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/** Android's SwipeRefreshLayout triggers at 64dp; the pull is damped to half the input travel. */\nconst THRESHOLD = 64;\nconst MAX_DISTANCE = 96;\nconst RESISTANCE = 0.5;\n/** A trackpad has no release event, so an idle gap ends the wheel gesture. */\nconst WHEEL_IDLE_MS = 300;\nconst LINE_HEIGHT = 16;\n\nexport type PullToRefreshState = \"idle\" | \"pulling\" | \"ready\" | \"refreshing\";\n\nexport type PullToRefreshProps = {\n /** Reloads the wrapped content. The indicator stays busy until the promise settles. */\n onRefresh: () => Promise<void>;\n disabled?: boolean;\n /** Status text announced while refreshing. Defaults to the shared \"Refreshing\" message. */\n label?: string;\n class?: string;\n /** Exactly one scroll container; the gesture only starts while it is scrolled to the top. */\n children: JSX.Element;\n};\n\nconst INTERACTIVE = \"a, button, input, textarea, select, [contenteditable], [role='button']\";\n\n/**\n * Turns a downward pull on a scroll container that is already at its top into\n * one `onRefresh` call. Touch pulls, mouse or pen drags on non-interactive\n * space, and trackpad or wheel overscroll share one gesture model. The gesture\n * is an enhancement: keep a keyboard-reachable refresh (a button or the page\n * reload) next to it.\n */\nexport function PullToRefresh(props: PullToRefreshProps): JSX.Element {\n const messages = useUiMessages();\n const [state, setState] = createSignal<PullToRefreshState>(\"idle\");\n const [distance, setDistance] = createSignal(0);\n let root!: HTMLDivElement;\n\n const active = () => !props.disabled && state() !== \"refreshing\";\n const atTop = (target: EventTarget | null) => {\n for (let node = target instanceof Element ? target : null; node && node !== root; node = node.parentElement)\n if (node.scrollTop > 0) return false;\n return true;\n };\n const interactive = (target: EventTarget | null) => target instanceof Element && target.closest(INTERACTIVE) !== null;\n /** Keeps the drag alive when the pointer leaves the wrapper; a pointer that is already gone must not end the gesture. */\n const capture = (id: number) => {\n try {\n root.setPointerCapture(id);\n } catch {}\n };\n\n const reset = () => {\n setDistance(0);\n setState(\"idle\");\n };\n const pull = (travel: number) => {\n const next = Math.min(MAX_DISTANCE, Math.max(0, travel * RESISTANCE));\n setDistance(next);\n setState(next >= THRESHOLD ? \"ready\" : next > 0 ? \"pulling\" : \"idle\");\n };\n const refresh = async () => {\n if (state() === \"refreshing\") return;\n setState(\"refreshing\");\n setDistance(THRESHOLD);\n try {\n await props.onRefresh();\n } finally {\n reset();\n }\n };\n const release = () => {\n if (state() === \"ready\") void refresh();\n else if (state() !== \"refreshing\") reset();\n };\n const abort = () => {\n if (state() !== \"refreshing\") reset();\n };\n\n let wheelTravel = 0;\n let wheelTimer: ReturnType<typeof setTimeout> | undefined;\n const endWheel = () => {\n wheelTravel = 0;\n abort();\n };\n const onWheel = (event: WheelEvent) => {\n if (!active()) return;\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(endWheel, WHEEL_IDLE_MS);\n if (event.deltaY >= 0 || !atTop(event.target)) return endWheel();\n const scale = event.deltaMode === 1 ? LINE_HEIGHT : event.deltaMode === 2 ? root.clientHeight : 1;\n wheelTravel -= event.deltaY * scale;\n pull(wheelTravel);\n if (state() === \"ready\") {\n wheelTravel = 0;\n void refresh();\n }\n };\n\n let pointer: { id: number; startY: number } | null = null;\n const onPointerDown = (event: PointerEvent) => {\n if (event.pointerType === \"touch\" || event.button !== 0 || !active() || interactive(event.target) || !atTop(event.target)) return;\n pointer = { id: event.pointerId, startY: event.clientY };\n };\n const onPointerMove = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n const travel = event.clientY - pointer.startY;\n if (travel <= 0 && state() === \"idle\") return;\n if (state() === \"idle\") capture(pointer.id);\n pull(travel);\n if (state() !== \"idle\") event.preventDefault();\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n release();\n };\n const onPointerCancel = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n abort();\n };\n\n let touch: { id: number; startY: number } | null = null;\n const onTouchStart = (event: TouchEvent) => {\n const first = event.touches[0];\n if (!first || event.touches.length !== 1 || !active() || !atTop(event.target)) return;\n touch = { id: first.identifier, startY: first.clientY };\n };\n const onTouchMove = (event: TouchEvent) => {\n if (!touch) return;\n const current = Array.from(event.touches).find((item) => item.identifier === touch?.id);\n if (!current) return;\n const travel = current.clientY - touch.startY;\n if (travel <= 0 && state() === \"idle\") {\n touch = null;\n return;\n }\n pull(travel);\n if (state() !== \"idle\" && event.cancelable) event.preventDefault();\n };\n const onTouchEnd = () => {\n if (!touch) return;\n touch = null;\n release();\n };\n const onTouchCancel = () => {\n if (!touch) return;\n touch = null;\n abort();\n };\n\n onMount(() => {\n root.addEventListener(\"wheel\", onWheel, { passive: true });\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerCancel);\n root.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n root.addEventListener(\"touchend\", onTouchEnd);\n root.addEventListener(\"touchcancel\", onTouchCancel);\n onCleanup(() => {\n clearTimeout(wheelTimer);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerCancel);\n root.removeEventListener(\"touchstart\", onTouchStart);\n root.removeEventListener(\"touchmove\", onTouchMove);\n root.removeEventListener(\"touchend\", onTouchEnd);\n root.removeEventListener(\"touchcancel\", onTouchCancel);\n });\n });\n\n const className = () => (props.class?.trim() ? `k2b-pull-to-refresh ${props.class.trim()}` : \"k2b-pull-to-refresh\");\n const progress = () => Math.min(1, distance() / THRESHOLD);\n\n return (\n <div\n ref={root}\n class={className()}\n data-state={state()}\n style={{ \"--k2b-pull-to-refresh-distance\": `${distance()}px`, \"--k2b-pull-to-refresh-progress\": String(progress()) }}\n >\n <div class=\"k2b-pull-to-refresh__indicator\" role=\"status\" aria-live=\"polite\">\n <i class={state() === \"refreshing\" ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-refresh\"} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{state() === \"refreshing\" ? (props.label ?? messages().refreshing) : \"\"}</span>\n </div>\n {props.children}\n </div>\n );\n}\n\nexport default PullToRefresh;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
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
+ {"version":3,"names":[],"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,SAAmB,UAAU,QAAQ,UAAU;AAC/C,SAAS,gBAAgB,QAAQ,eAAe;AAYhD,OAAO,SAAS,UAAU,CAAC,KAAsB,EAAe;EAC9D,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAC9C,UAAU,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,cAAc,EACd,KAAK,CACN,CAAC;EACF,IAAI,IAAqB;EACzB,gBAAgB,CACd,MAAM,IAAI,EACV,MAAM,KAAK,CAAC,UAAU,KAAK,KAC7B,CAAC;EACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EAE3C,wCAEQ,YAAY;IAAA;MAAA,OAKO,KAAK,CAAC,WAAW,IAAI,UAAU;IAAA;IAAA;MAAA,OAClC,KAAK,CAAC,YAAY;IAAA;IAAA;MAAA,OACpB,KAAK,CAAC,WAAW,IAAI,UAAU;IAAA;IAAA;MAAA,OAC1B,KAAK,CAAC,UAAU,KAAK,KAAK,GAAG,MAAM,GAAG,SAAS;IAAA;IAAA;MAAA,OAC/D,SAAS,CAAC,CAAC,GAAG,mBAAmB,SAAS,CAAC,CAAC,EAAE,GAAG,iBAAiB;IAAA;IAAA;MAAA,OACnD,KAAK,CAAC,iBAAiB,IAAI,SAAS;IAAA;EAAA,aAEzD,KAAK,CAAC,QAAQ;AAGrB;AAEA,eAAe,UAAU","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import { mergeProps as _$mergeProps } from "solid-js/web";
2
+ import { memo as _$memo } from "solid-js/web";
2
3
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
3
4
  import { ssr as _$ssr } from "solid-js/web";
4
5
  import { createComponent as _$createComponent } from "solid-js/web";
@@ -133,7 +134,7 @@ export function SettingsField(props) {
133
134
  }) : props.children;
134
135
  return _$ssr(_tmpl$1, `k2b-settings-field ${_$escape(props.class ?? "", true)}`, _$escape(props.label), _$escape(_$createComponent(Show, {
135
136
  get when() {
136
- return props.changed !== undefined && read(props.changed);
137
+ return _$memo(() => props.changed !== undefined)() && read(props.changed);
137
138
  },
138
139
  get children() {
139
140
  return _$ssr(_tmpl$0, _$escape(messages().unsaved));
@@ -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: 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":[]}
1
+ {"version":3,"names":[],"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":[]}
@@ -2,6 +2,7 @@ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
2
2
  import { escape as _$escape } from "solid-js/web";
3
3
  import { createComponent as _$createComponent } from "solid-js/web";
4
4
  import { ssr as _$ssr } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
5
6
  var _tmpl$ = "<i class=\"ti ti-arrow-up\" aria-hidden=\"true\"></i>",
6
7
  _tmpl$2 = "<i class=\"ti ti-arrow-down\" aria-hidden=\"true\"></i>",
7
8
  _tmpl$3 = ["<p>", "</p>"],