@k2b/ui 0.1.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +343 -0
  3. package/dist/.build-complete +0 -0
  4. package/dist/browser/actions/Button.js +236 -0
  5. package/dist/browser/actions/Button.js.map +1 -0
  6. package/dist/browser/actions/ContextMenu.js +199 -0
  7. package/dist/browser/actions/ContextMenu.js.map +1 -0
  8. package/dist/browser/actions/CopyButton.js +97 -0
  9. package/dist/browser/actions/CopyButton.js.map +1 -0
  10. package/dist/browser/actions/Disclosure.js +83 -0
  11. package/dist/browser/actions/Disclosure.js.map +1 -0
  12. package/dist/browser/actions/Dropdown.js +669 -0
  13. package/dist/browser/actions/Dropdown.js.map +1 -0
  14. package/dist/browser/actions/FilterChip.js +149 -0
  15. package/dist/browser/actions/FilterChip.js.map +1 -0
  16. package/dist/browser/actions/RemoveButton.js +47 -0
  17. package/dist/browser/actions/RemoveButton.js.map +1 -0
  18. package/dist/browser/actions/SegmentedControl.js +138 -0
  19. package/dist/browser/actions/SegmentedControl.js.map +1 -0
  20. package/dist/browser/actions/SplitButton.js +76 -0
  21. package/dist/browser/actions/SplitButton.js.map +1 -0
  22. package/dist/browser/actions/SpotlightSearch.js +87 -0
  23. package/dist/browser/actions/SpotlightSearch.js.map +1 -0
  24. package/dist/browser/actions/Tabs.js +185 -0
  25. package/dist/browser/actions/Tabs.js.map +1 -0
  26. package/dist/browser/actions/Toolbar.js +87 -0
  27. package/dist/browser/actions/Toolbar.js.map +1 -0
  28. package/dist/browser/actions/index.js +13 -0
  29. package/dist/browser/actions/index.js.map +1 -0
  30. package/dist/browser/chat/ChatComposer.js +760 -0
  31. package/dist/browser/chat/ChatComposer.js.map +1 -0
  32. package/dist/browser/chat/ChatPrimitives.js +688 -0
  33. package/dist/browser/chat/ChatPrimitives.js.map +1 -0
  34. package/dist/browser/chat/ChatRoot.js +27 -0
  35. package/dist/browser/chat/ChatRoot.js.map +1 -0
  36. package/dist/browser/chat/ChatTimeline.js +404 -0
  37. package/dist/browser/chat/ChatTimeline.js.map +1 -0
  38. package/dist/browser/chat/chat-behavior.js +53 -0
  39. package/dist/browser/chat/chat-behavior.js.map +1 -0
  40. package/dist/browser/chat/index.js +17 -0
  41. package/dist/browser/chat/index.js.map +1 -0
  42. package/dist/browser/chat/types.js +2 -0
  43. package/dist/browser/chat/types.js.map +1 -0
  44. package/dist/browser/content/Calendar.js +2168 -0
  45. package/dist/browser/content/Calendar.js.map +1 -0
  46. package/dist/browser/content/Chart.js +680 -0
  47. package/dist/browser/content/Chart.js.map +1 -0
  48. package/dist/browser/content/CodeDisplay.js +104 -0
  49. package/dist/browser/content/CodeDisplay.js.map +1 -0
  50. package/dist/browser/content/DataTable.js +724 -0
  51. package/dist/browser/content/DataTable.js.map +1 -0
  52. package/dist/browser/content/Docs.js +227 -0
  53. package/dist/browser/content/Docs.js.map +1 -0
  54. package/dist/browser/content/FileBrowser.js +462 -0
  55. package/dist/browser/content/FileBrowser.js.map +1 -0
  56. package/dist/browser/content/FileTree.js +453 -0
  57. package/dist/browser/content/FileTree.js.map +1 -0
  58. package/dist/browser/content/FileView.js +842 -0
  59. package/dist/browser/content/FileView.js.map +1 -0
  60. package/dist/browser/content/Lightbox.js +285 -0
  61. package/dist/browser/content/Lightbox.js.map +1 -0
  62. package/dist/browser/content/LogEntriesTable.js +139 -0
  63. package/dist/browser/content/LogEntriesTable.js.map +1 -0
  64. package/dist/browser/content/MarkdownView.js +138 -0
  65. package/dist/browser/content/MarkdownView.js.map +1 -0
  66. package/dist/browser/content/Pagination.js +182 -0
  67. package/dist/browser/content/Pagination.js.map +1 -0
  68. package/dist/browser/content/PdfPreview.js +204 -0
  69. package/dist/browser/content/PdfPreview.js.map +1 -0
  70. package/dist/browser/content/RangePicker.js +83 -0
  71. package/dist/browser/content/RangePicker.js.map +1 -0
  72. package/dist/browser/content/StructuredDataPreview.js +194 -0
  73. package/dist/browser/content/StructuredDataPreview.js.map +1 -0
  74. package/dist/browser/content/calendar-event-layout.js +92 -0
  75. package/dist/browser/content/calendar-event-layout.js.map +1 -0
  76. package/dist/browser/content/calendar-pointer.js +114 -0
  77. package/dist/browser/content/calendar-pointer.js.map +1 -0
  78. package/dist/browser/content/chart-map-viewport.js +33 -0
  79. package/dist/browser/content/chart-map-viewport.js.map +1 -0
  80. package/dist/browser/content/chart-state-timeline.js +124 -0
  81. package/dist/browser/content/chart-state-timeline.js.map +1 -0
  82. package/dist/browser/content/code-highlight.js +144 -0
  83. package/dist/browser/content/code-highlight.js.map +1 -0
  84. package/dist/browser/content/file-tree.js +93 -0
  85. package/dist/browser/content/file-tree.js.map +1 -0
  86. package/dist/browser/content/file-view-preview.js +112 -0
  87. package/dist/browser/content/file-view-preview.js.map +1 -0
  88. package/dist/browser/content/index.js +16 -0
  89. package/dist/browser/content/index.js.map +1 -0
  90. package/dist/browser/feedback/InlineGuidance.js +46 -0
  91. package/dist/browser/feedback/InlineGuidance.js.map +1 -0
  92. package/dist/browser/feedback/Tooltip.js +189 -0
  93. package/dist/browser/feedback/Tooltip.js.map +1 -0
  94. package/dist/browser/feedback/dialog-core.js +207 -0
  95. package/dist/browser/feedback/dialog-core.js.map +1 -0
  96. package/dist/browser/feedback/index.js +6 -0
  97. package/dist/browser/feedback/index.js.map +1 -0
  98. package/dist/browser/feedback/prompts.js +991 -0
  99. package/dist/browser/feedback/prompts.js.map +1 -0
  100. package/dist/browser/feedback/toast.js +271 -0
  101. package/dist/browser/feedback/toast.js.map +1 -0
  102. package/dist/browser/feedback/tooltip-position.js +25 -0
  103. package/dist/browser/feedback/tooltip-position.js.map +1 -0
  104. package/dist/browser/index.js +11 -0
  105. package/dist/browser/index.js.map +1 -0
  106. package/dist/browser/inputs/AutocompleteEditor.js +610 -0
  107. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -0
  108. package/dist/browser/inputs/AutocompleteSelect.js +632 -0
  109. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -0
  110. package/dist/browser/inputs/Checkbox.js +137 -0
  111. package/dist/browser/inputs/Checkbox.js.map +1 -0
  112. package/dist/browser/inputs/CheckboxCard.js +130 -0
  113. package/dist/browser/inputs/CheckboxCard.js.map +1 -0
  114. package/dist/browser/inputs/ChoiceGroups.js +174 -0
  115. package/dist/browser/inputs/ChoiceGroups.js.map +1 -0
  116. package/dist/browser/inputs/ChoiceInputs.js +400 -0
  117. package/dist/browser/inputs/ChoiceInputs.js.map +1 -0
  118. package/dist/browser/inputs/Combobox.js +274 -0
  119. package/dist/browser/inputs/Combobox.js.map +1 -0
  120. package/dist/browser/inputs/DatePicker.js +923 -0
  121. package/dist/browser/inputs/DatePicker.js.map +1 -0
  122. package/dist/browser/inputs/FileInputs.js +736 -0
  123. package/dist/browser/inputs/FileInputs.js.map +1 -0
  124. package/dist/browser/inputs/MultiSelectInput.js +565 -0
  125. package/dist/browser/inputs/MultiSelectInput.js.map +1 -0
  126. package/dist/browser/inputs/NumberInput.js +288 -0
  127. package/dist/browser/inputs/NumberInput.js.map +1 -0
  128. package/dist/browser/inputs/Select.js +507 -0
  129. package/dist/browser/inputs/Select.js.map +1 -0
  130. package/dist/browser/inputs/SelectChip.js +151 -0
  131. package/dist/browser/inputs/SelectChip.js.map +1 -0
  132. package/dist/browser/inputs/SpecialInputs.js +117 -0
  133. package/dist/browser/inputs/SpecialInputs.js.map +1 -0
  134. package/dist/browser/inputs/Switch.js +117 -0
  135. package/dist/browser/inputs/Switch.js.map +1 -0
  136. package/dist/browser/inputs/TagEditor.js +358 -0
  137. package/dist/browser/inputs/TagEditor.js.map +1 -0
  138. package/dist/browser/inputs/TagsInput.js +195 -0
  139. package/dist/browser/inputs/TagsInput.js.map +1 -0
  140. package/dist/browser/inputs/TemplateEditor.js +190 -0
  141. package/dist/browser/inputs/TemplateEditor.js.map +1 -0
  142. package/dist/browser/inputs/TextInput.js +318 -0
  143. package/dist/browser/inputs/TextInput.js.map +1 -0
  144. package/dist/browser/inputs/choice.js +188 -0
  145. package/dist/browser/inputs/choice.js.map +1 -0
  146. package/dist/browser/inputs/completion/behaviors.js +108 -0
  147. package/dist/browser/inputs/completion/behaviors.js.map +1 -0
  148. package/dist/browser/inputs/completion/engine.js +103 -0
  149. package/dist/browser/inputs/completion/engine.js.map +1 -0
  150. package/dist/browser/inputs/completion/index.js +4 -0
  151. package/dist/browser/inputs/completion/index.js.map +1 -0
  152. package/dist/browser/inputs/completion/overlay.js +25 -0
  153. package/dist/browser/inputs/completion/overlay.js.map +1 -0
  154. package/dist/browser/inputs/date-picker.js +123 -0
  155. package/dist/browser/inputs/date-picker.js.map +1 -0
  156. package/dist/browser/inputs/editor-dom.js +26 -0
  157. package/dist/browser/inputs/editor-dom.js.map +1 -0
  158. package/dist/browser/inputs/field-contract.js +9 -0
  159. package/dist/browser/inputs/field-contract.js.map +1 -0
  160. package/dist/browser/inputs/icon-options.js +46 -0
  161. package/dist/browser/inputs/icon-options.js.map +1 -0
  162. package/dist/browser/inputs/image-crop.js +145 -0
  163. package/dist/browser/inputs/image-crop.js.map +1 -0
  164. package/dist/browser/inputs/index.js +23 -0
  165. package/dist/browser/inputs/index.js.map +1 -0
  166. package/dist/browser/inputs/markdown/MarkdownEditor.js +725 -0
  167. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -0
  168. package/dist/browser/inputs/markdown/Toolbar.js +172 -0
  169. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -0
  170. package/dist/browser/inputs/markdown/actions.js +140 -0
  171. package/dist/browser/inputs/markdown/actions.js.map +1 -0
  172. package/dist/browser/inputs/markdown/active-formats.js +36 -0
  173. package/dist/browser/inputs/markdown/active-formats.js.map +1 -0
  174. package/dist/browser/inputs/markdown/behaviors.js +63 -0
  175. package/dist/browser/inputs/markdown/behaviors.js.map +1 -0
  176. package/dist/browser/inputs/markdown/code-zone.js +8 -0
  177. package/dist/browser/inputs/markdown/code-zone.js.map +1 -0
  178. package/dist/browser/internal/color.js +18 -0
  179. package/dist/browser/internal/color.js.map +1 -0
  180. package/dist/browser/internal/field.js +158 -0
  181. package/dist/browser/internal/field.js.map +1 -0
  182. package/dist/browser/internal/portal.js +17 -0
  183. package/dist/browser/internal/portal.js.map +1 -0
  184. package/dist/browser/intl/Format.js +273 -0
  185. package/dist/browser/intl/Format.js.map +1 -0
  186. package/dist/browser/intl/index.js +3 -0
  187. package/dist/browser/intl/index.js.map +1 -0
  188. package/dist/browser/intl/locale.js +63 -0
  189. package/dist/browser/intl/locale.js.map +1 -0
  190. package/dist/browser/intl/messages.js +753 -0
  191. package/dist/browser/intl/messages.js.map +1 -0
  192. package/dist/browser/layout/AppOverview.js +151 -0
  193. package/dist/browser/layout/AppOverview.js.map +1 -0
  194. package/dist/browser/layout/AppWorkspace.js +1502 -0
  195. package/dist/browser/layout/AppWorkspace.js.map +1 -0
  196. package/dist/browser/layout/DataPanel.js +122 -0
  197. package/dist/browser/layout/DataPanel.js.map +1 -0
  198. package/dist/browser/layout/DetailPanel.js +484 -0
  199. package/dist/browser/layout/DetailPanel.js.map +1 -0
  200. package/dist/browser/layout/Discussion.js +511 -0
  201. package/dist/browser/layout/Discussion.js.map +1 -0
  202. package/dist/browser/layout/FloatingWindow.js +332 -0
  203. package/dist/browser/layout/FloatingWindow.js.map +1 -0
  204. package/dist/browser/layout/PanelDialog.js +236 -0
  205. package/dist/browser/layout/PanelDialog.js.map +1 -0
  206. package/dist/browser/layout/PanelHeader.js +91 -0
  207. package/dist/browser/layout/PanelHeader.js.map +1 -0
  208. package/dist/browser/layout/Panes.js +978 -0
  209. package/dist/browser/layout/Panes.js.map +1 -0
  210. package/dist/browser/layout/ScrollArea.js +29 -0
  211. package/dist/browser/layout/ScrollArea.js.map +1 -0
  212. package/dist/browser/layout/Settings.js +381 -0
  213. package/dist/browser/layout/Settings.js.map +1 -0
  214. package/dist/browser/layout/SettingsCollection.js +212 -0
  215. package/dist/browser/layout/SettingsCollection.js.map +1 -0
  216. package/dist/browser/layout/SettingsModal.js +281 -0
  217. package/dist/browser/layout/SettingsModal.js.map +1 -0
  218. package/dist/browser/layout/app-workspace-controller.js +419 -0
  219. package/dist/browser/layout/app-workspace-controller.js.map +1 -0
  220. package/dist/browser/layout/app-workspace-state.js +125 -0
  221. package/dist/browser/layout/app-workspace-state.js.map +1 -0
  222. package/dist/browser/layout/floating-window-geometry.js +15 -0
  223. package/dist/browser/layout/floating-window-geometry.js.map +1 -0
  224. package/dist/browser/layout/index.js +17 -0
  225. package/dist/browser/layout/index.js.map +1 -0
  226. package/dist/browser/layout/panes-layout.js +436 -0
  227. package/dist/browser/layout/panes-layout.js.map +1 -0
  228. package/dist/browser/layout/stable-id.js +17 -0
  229. package/dist/browser/layout/stable-id.js.map +1 -0
  230. package/dist/browser/semantics.js +2 -0
  231. package/dist/browser/semantics.js.map +1 -0
  232. package/dist/browser/surfaces/Avatar.js +97 -0
  233. package/dist/browser/surfaces/Avatar.js.map +1 -0
  234. package/dist/browser/surfaces/DescriptionList.js +66 -0
  235. package/dist/browser/surfaces/DescriptionList.js.map +1 -0
  236. package/dist/browser/surfaces/LinkCard.js +40 -0
  237. package/dist/browser/surfaces/LinkCard.js.map +1 -0
  238. package/dist/browser/surfaces/NotFoundState.js +85 -0
  239. package/dist/browser/surfaces/NotFoundState.js.map +1 -0
  240. package/dist/browser/surfaces/NoticeCard.js +145 -0
  241. package/dist/browser/surfaces/NoticeCard.js.map +1 -0
  242. package/dist/browser/surfaces/Paper.js +33 -0
  243. package/dist/browser/surfaces/Paper.js.map +1 -0
  244. package/dist/browser/surfaces/Placeholder.js +90 -0
  245. package/dist/browser/surfaces/Placeholder.js.map +1 -0
  246. package/dist/browser/surfaces/ProgressBar.js +58 -0
  247. package/dist/browser/surfaces/ProgressBar.js.map +1 -0
  248. package/dist/browser/surfaces/StatCell.js +172 -0
  249. package/dist/browser/surfaces/StatCell.js.map +1 -0
  250. package/dist/browser/surfaces/StatGrid.js +80 -0
  251. package/dist/browser/surfaces/StatGrid.js.map +1 -0
  252. package/dist/browser/surfaces/StatusBadge.js +70 -0
  253. package/dist/browser/surfaces/StatusBadge.js.map +1 -0
  254. package/dist/browser/surfaces/Tag.js +94 -0
  255. package/dist/browser/surfaces/Tag.js.map +1 -0
  256. package/dist/browser/surfaces/index.js +13 -0
  257. package/dist/browser/surfaces/index.js.map +1 -0
  258. package/dist/browser/widgets/Widget.js +89 -0
  259. package/dist/browser/widgets/Widget.js.map +1 -0
  260. package/dist/browser/widgets/WidgetHero.js +47 -0
  261. package/dist/browser/widgets/WidgetHero.js.map +1 -0
  262. package/dist/browser/widgets/WidgetList.js +125 -0
  263. package/dist/browser/widgets/WidgetList.js.map +1 -0
  264. package/dist/browser/widgets/WidgetPills.js +78 -0
  265. package/dist/browser/widgets/WidgetPills.js.map +1 -0
  266. package/dist/browser/widgets/WidgetStat.js +114 -0
  267. package/dist/browser/widgets/WidgetStat.js.map +1 -0
  268. package/dist/browser/widgets/WidgetStatus.js +54 -0
  269. package/dist/browser/widgets/WidgetStatus.js.map +1 -0
  270. package/dist/browser/widgets/index.js +7 -0
  271. package/dist/browser/widgets/index.js.map +1 -0
  272. package/dist/global.css +3 -0
  273. package/dist/licenses/ibm-plex-mono.txt +93 -0
  274. package/dist/licenses/ibm-plex-sans.txt +93 -0
  275. package/dist/licenses/tabler-icons.txt +21 -0
  276. package/dist/plex.css +1 -0
  277. package/dist/ssr/actions/Button.js +203 -0
  278. package/dist/ssr/actions/Button.js.map +1 -0
  279. package/dist/ssr/actions/ContextMenu.js +128 -0
  280. package/dist/ssr/actions/ContextMenu.js.map +1 -0
  281. package/dist/ssr/actions/CopyButton.js +79 -0
  282. package/dist/ssr/actions/CopyButton.js.map +1 -0
  283. package/dist/ssr/actions/Disclosure.js +26 -0
  284. package/dist/ssr/actions/Disclosure.js.map +1 -0
  285. package/dist/ssr/actions/Dropdown.js +443 -0
  286. package/dist/ssr/actions/Dropdown.js.map +1 -0
  287. package/dist/ssr/actions/FilterChip.js +132 -0
  288. package/dist/ssr/actions/FilterChip.js.map +1 -0
  289. package/dist/ssr/actions/RemoveButton.js +45 -0
  290. package/dist/ssr/actions/RemoveButton.js.map +1 -0
  291. package/dist/ssr/actions/SegmentedControl.js +57 -0
  292. package/dist/ssr/actions/SegmentedControl.js.map +1 -0
  293. package/dist/ssr/actions/SplitButton.js +74 -0
  294. package/dist/ssr/actions/SplitButton.js.map +1 -0
  295. package/dist/ssr/actions/SpotlightSearch.js +38 -0
  296. package/dist/ssr/actions/SpotlightSearch.js.map +1 -0
  297. package/dist/ssr/actions/Tabs.js +91 -0
  298. package/dist/ssr/actions/Tabs.js.map +1 -0
  299. package/dist/ssr/actions/Toolbar.js +33 -0
  300. package/dist/ssr/actions/Toolbar.js.map +1 -0
  301. package/dist/ssr/actions/index.js +13 -0
  302. package/dist/ssr/actions/index.js.map +1 -0
  303. package/dist/ssr/chat/ChatComposer.js +392 -0
  304. package/dist/ssr/chat/ChatComposer.js.map +1 -0
  305. package/dist/ssr/chat/ChatPrimitives.js +377 -0
  306. package/dist/ssr/chat/ChatPrimitives.js.map +1 -0
  307. package/dist/ssr/chat/ChatRoot.js +10 -0
  308. package/dist/ssr/chat/ChatRoot.js.map +1 -0
  309. package/dist/ssr/chat/ChatTimeline.js +301 -0
  310. package/dist/ssr/chat/ChatTimeline.js.map +1 -0
  311. package/dist/ssr/chat/chat-behavior.js +53 -0
  312. package/dist/ssr/chat/chat-behavior.js.map +1 -0
  313. package/dist/ssr/chat/index.js +17 -0
  314. package/dist/ssr/chat/index.js.map +1 -0
  315. package/dist/ssr/chat/types.js +2 -0
  316. package/dist/ssr/chat/types.js.map +1 -0
  317. package/dist/ssr/content/Calendar.js +1542 -0
  318. package/dist/ssr/content/Calendar.js.map +1 -0
  319. package/dist/ssr/content/Chart.js +552 -0
  320. package/dist/ssr/content/Chart.js.map +1 -0
  321. package/dist/ssr/content/CodeDisplay.js +55 -0
  322. package/dist/ssr/content/CodeDisplay.js.map +1 -0
  323. package/dist/ssr/content/DataTable.js +470 -0
  324. package/dist/ssr/content/DataTable.js.map +1 -0
  325. package/dist/ssr/content/Docs.js +108 -0
  326. package/dist/ssr/content/Docs.js.map +1 -0
  327. package/dist/ssr/content/FileBrowser.js +422 -0
  328. package/dist/ssr/content/FileBrowser.js.map +1 -0
  329. package/dist/ssr/content/FileTree.js +299 -0
  330. package/dist/ssr/content/FileTree.js.map +1 -0
  331. package/dist/ssr/content/FileView.js +612 -0
  332. package/dist/ssr/content/FileView.js.map +1 -0
  333. package/dist/ssr/content/Lightbox.js +164 -0
  334. package/dist/ssr/content/Lightbox.js.map +1 -0
  335. package/dist/ssr/content/LogEntriesTable.js +106 -0
  336. package/dist/ssr/content/LogEntriesTable.js.map +1 -0
  337. package/dist/ssr/content/MarkdownView.js +119 -0
  338. package/dist/ssr/content/MarkdownView.js.map +1 -0
  339. package/dist/ssr/content/Pagination.js +141 -0
  340. package/dist/ssr/content/Pagination.js.map +1 -0
  341. package/dist/ssr/content/PdfPreview.js +126 -0
  342. package/dist/ssr/content/PdfPreview.js.map +1 -0
  343. package/dist/ssr/content/RangePicker.js +35 -0
  344. package/dist/ssr/content/RangePicker.js.map +1 -0
  345. package/dist/ssr/content/StructuredDataPreview.js +127 -0
  346. package/dist/ssr/content/StructuredDataPreview.js.map +1 -0
  347. package/dist/ssr/content/calendar-event-layout.js +92 -0
  348. package/dist/ssr/content/calendar-event-layout.js.map +1 -0
  349. package/dist/ssr/content/calendar-pointer.js +114 -0
  350. package/dist/ssr/content/calendar-pointer.js.map +1 -0
  351. package/dist/ssr/content/chart-map-viewport.js +33 -0
  352. package/dist/ssr/content/chart-map-viewport.js.map +1 -0
  353. package/dist/ssr/content/chart-state-timeline.js +124 -0
  354. package/dist/ssr/content/chart-state-timeline.js.map +1 -0
  355. package/dist/ssr/content/code-highlight.js +144 -0
  356. package/dist/ssr/content/code-highlight.js.map +1 -0
  357. package/dist/ssr/content/file-tree.js +93 -0
  358. package/dist/ssr/content/file-tree.js.map +1 -0
  359. package/dist/ssr/content/file-view-preview.js +112 -0
  360. package/dist/ssr/content/file-view-preview.js.map +1 -0
  361. package/dist/ssr/content/index.js +16 -0
  362. package/dist/ssr/content/index.js.map +1 -0
  363. package/dist/ssr/feedback/InlineGuidance.js +26 -0
  364. package/dist/ssr/feedback/InlineGuidance.js.map +1 -0
  365. package/dist/ssr/feedback/Tooltip.js +156 -0
  366. package/dist/ssr/feedback/Tooltip.js.map +1 -0
  367. package/dist/ssr/feedback/dialog-core.js +207 -0
  368. package/dist/ssr/feedback/dialog-core.js.map +1 -0
  369. package/dist/ssr/feedback/index.js +6 -0
  370. package/dist/ssr/feedback/index.js.map +1 -0
  371. package/dist/ssr/feedback/prompts.js +703 -0
  372. package/dist/ssr/feedback/prompts.js.map +1 -0
  373. package/dist/ssr/feedback/toast.js +271 -0
  374. package/dist/ssr/feedback/toast.js.map +1 -0
  375. package/dist/ssr/feedback/tooltip-position.js +25 -0
  376. package/dist/ssr/feedback/tooltip-position.js.map +1 -0
  377. package/dist/ssr/index.js +11 -0
  378. package/dist/ssr/index.js.map +1 -0
  379. package/dist/ssr/inputs/AutocompleteEditor.js +463 -0
  380. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -0
  381. package/dist/ssr/inputs/AutocompleteSelect.js +420 -0
  382. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -0
  383. package/dist/ssr/inputs/Checkbox.js +75 -0
  384. package/dist/ssr/inputs/Checkbox.js.map +1 -0
  385. package/dist/ssr/inputs/CheckboxCard.js +69 -0
  386. package/dist/ssr/inputs/CheckboxCard.js.map +1 -0
  387. package/dist/ssr/inputs/ChoiceGroups.js +101 -0
  388. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -0
  389. package/dist/ssr/inputs/ChoiceInputs.js +250 -0
  390. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -0
  391. package/dist/ssr/inputs/Combobox.js +177 -0
  392. package/dist/ssr/inputs/Combobox.js.map +1 -0
  393. package/dist/ssr/inputs/DatePicker.js +629 -0
  394. package/dist/ssr/inputs/DatePicker.js.map +1 -0
  395. package/dist/ssr/inputs/FileInputs.js +543 -0
  396. package/dist/ssr/inputs/FileInputs.js.map +1 -0
  397. package/dist/ssr/inputs/MultiSelectInput.js +347 -0
  398. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -0
  399. package/dist/ssr/inputs/NumberInput.js +177 -0
  400. package/dist/ssr/inputs/NumberInput.js.map +1 -0
  401. package/dist/ssr/inputs/Select.js +308 -0
  402. package/dist/ssr/inputs/Select.js.map +1 -0
  403. package/dist/ssr/inputs/SelectChip.js +129 -0
  404. package/dist/ssr/inputs/SelectChip.js.map +1 -0
  405. package/dist/ssr/inputs/SpecialInputs.js +116 -0
  406. package/dist/ssr/inputs/SpecialInputs.js.map +1 -0
  407. package/dist/ssr/inputs/Switch.js +62 -0
  408. package/dist/ssr/inputs/Switch.js.map +1 -0
  409. package/dist/ssr/inputs/TagEditor.js +280 -0
  410. package/dist/ssr/inputs/TagEditor.js.map +1 -0
  411. package/dist/ssr/inputs/TagsInput.js +122 -0
  412. package/dist/ssr/inputs/TagsInput.js.map +1 -0
  413. package/dist/ssr/inputs/TemplateEditor.js +164 -0
  414. package/dist/ssr/inputs/TemplateEditor.js.map +1 -0
  415. package/dist/ssr/inputs/TextInput.js +211 -0
  416. package/dist/ssr/inputs/TextInput.js.map +1 -0
  417. package/dist/ssr/inputs/choice.js +188 -0
  418. package/dist/ssr/inputs/choice.js.map +1 -0
  419. package/dist/ssr/inputs/completion/behaviors.js +108 -0
  420. package/dist/ssr/inputs/completion/behaviors.js.map +1 -0
  421. package/dist/ssr/inputs/completion/engine.js +103 -0
  422. package/dist/ssr/inputs/completion/engine.js.map +1 -0
  423. package/dist/ssr/inputs/completion/index.js +4 -0
  424. package/dist/ssr/inputs/completion/index.js.map +1 -0
  425. package/dist/ssr/inputs/completion/overlay.js +25 -0
  426. package/dist/ssr/inputs/completion/overlay.js.map +1 -0
  427. package/dist/ssr/inputs/date-picker.js +123 -0
  428. package/dist/ssr/inputs/date-picker.js.map +1 -0
  429. package/dist/ssr/inputs/editor-dom.js +26 -0
  430. package/dist/ssr/inputs/editor-dom.js.map +1 -0
  431. package/dist/ssr/inputs/field-contract.js +9 -0
  432. package/dist/ssr/inputs/field-contract.js.map +1 -0
  433. package/dist/ssr/inputs/icon-options.js +46 -0
  434. package/dist/ssr/inputs/icon-options.js.map +1 -0
  435. package/dist/ssr/inputs/image-crop.js +145 -0
  436. package/dist/ssr/inputs/image-crop.js.map +1 -0
  437. package/dist/ssr/inputs/index.js +23 -0
  438. package/dist/ssr/inputs/index.js.map +1 -0
  439. package/dist/ssr/inputs/markdown/MarkdownEditor.js +516 -0
  440. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -0
  441. package/dist/ssr/inputs/markdown/Toolbar.js +115 -0
  442. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -0
  443. package/dist/ssr/inputs/markdown/actions.js +140 -0
  444. package/dist/ssr/inputs/markdown/actions.js.map +1 -0
  445. package/dist/ssr/inputs/markdown/active-formats.js +36 -0
  446. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -0
  447. package/dist/ssr/inputs/markdown/behaviors.js +63 -0
  448. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -0
  449. package/dist/ssr/inputs/markdown/code-zone.js +8 -0
  450. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -0
  451. package/dist/ssr/internal/color.js +18 -0
  452. package/dist/ssr/internal/color.js.map +1 -0
  453. package/dist/ssr/internal/field.js +90 -0
  454. package/dist/ssr/internal/field.js.map +1 -0
  455. package/dist/ssr/internal/portal.js +17 -0
  456. package/dist/ssr/internal/portal.js.map +1 -0
  457. package/dist/ssr/intl/Format.js +192 -0
  458. package/dist/ssr/intl/Format.js.map +1 -0
  459. package/dist/ssr/intl/index.js +3 -0
  460. package/dist/ssr/intl/index.js.map +1 -0
  461. package/dist/ssr/intl/locale.js +63 -0
  462. package/dist/ssr/intl/locale.js.map +1 -0
  463. package/dist/ssr/intl/messages.js +753 -0
  464. package/dist/ssr/intl/messages.js.map +1 -0
  465. package/dist/ssr/layout/AppOverview.js +85 -0
  466. package/dist/ssr/layout/AppOverview.js.map +1 -0
  467. package/dist/ssr/layout/AppWorkspace.js +976 -0
  468. package/dist/ssr/layout/AppWorkspace.js.map +1 -0
  469. package/dist/ssr/layout/DataPanel.js +101 -0
  470. package/dist/ssr/layout/DataPanel.js.map +1 -0
  471. package/dist/ssr/layout/DetailPanel.js +284 -0
  472. package/dist/ssr/layout/DetailPanel.js.map +1 -0
  473. package/dist/ssr/layout/Discussion.js +319 -0
  474. package/dist/ssr/layout/Discussion.js.map +1 -0
  475. package/dist/ssr/layout/FloatingWindow.js +259 -0
  476. package/dist/ssr/layout/FloatingWindow.js.map +1 -0
  477. package/dist/ssr/layout/PanelDialog.js +136 -0
  478. package/dist/ssr/layout/PanelDialog.js.map +1 -0
  479. package/dist/ssr/layout/PanelHeader.js +45 -0
  480. package/dist/ssr/layout/PanelHeader.js.map +1 -0
  481. package/dist/ssr/layout/Panes.js +678 -0
  482. package/dist/ssr/layout/Panes.js.map +1 -0
  483. package/dist/ssr/layout/ScrollArea.js +18 -0
  484. package/dist/ssr/layout/ScrollArea.js.map +1 -0
  485. package/dist/ssr/layout/Settings.js +219 -0
  486. package/dist/ssr/layout/Settings.js.map +1 -0
  487. package/dist/ssr/layout/SettingsCollection.js +150 -0
  488. package/dist/ssr/layout/SettingsCollection.js.map +1 -0
  489. package/dist/ssr/layout/SettingsModal.js +156 -0
  490. package/dist/ssr/layout/SettingsModal.js.map +1 -0
  491. package/dist/ssr/layout/app-workspace-controller.js +419 -0
  492. package/dist/ssr/layout/app-workspace-controller.js.map +1 -0
  493. package/dist/ssr/layout/app-workspace-state.js +125 -0
  494. package/dist/ssr/layout/app-workspace-state.js.map +1 -0
  495. package/dist/ssr/layout/floating-window-geometry.js +15 -0
  496. package/dist/ssr/layout/floating-window-geometry.js.map +1 -0
  497. package/dist/ssr/layout/index.js +17 -0
  498. package/dist/ssr/layout/index.js.map +1 -0
  499. package/dist/ssr/layout/panes-layout.js +436 -0
  500. package/dist/ssr/layout/panes-layout.js.map +1 -0
  501. package/dist/ssr/layout/stable-id.js +17 -0
  502. package/dist/ssr/layout/stable-id.js.map +1 -0
  503. package/dist/ssr/semantics.js +2 -0
  504. package/dist/ssr/semantics.js.map +1 -0
  505. package/dist/ssr/surfaces/Avatar.js +43 -0
  506. package/dist/ssr/surfaces/Avatar.js.map +1 -0
  507. package/dist/ssr/surfaces/DescriptionList.js +25 -0
  508. package/dist/ssr/surfaces/DescriptionList.js.map +1 -0
  509. package/dist/ssr/surfaces/LinkCard.js +25 -0
  510. package/dist/ssr/surfaces/LinkCard.js.map +1 -0
  511. package/dist/ssr/surfaces/NotFoundState.js +38 -0
  512. package/dist/ssr/surfaces/NotFoundState.js.map +1 -0
  513. package/dist/ssr/surfaces/NoticeCard.js +83 -0
  514. package/dist/ssr/surfaces/NoticeCard.js.map +1 -0
  515. package/dist/ssr/surfaces/Paper.js +32 -0
  516. package/dist/ssr/surfaces/Paper.js.map +1 -0
  517. package/dist/ssr/surfaces/Placeholder.js +76 -0
  518. package/dist/ssr/surfaces/Placeholder.js.map +1 -0
  519. package/dist/ssr/surfaces/ProgressBar.js +13 -0
  520. package/dist/ssr/surfaces/ProgressBar.js.map +1 -0
  521. package/dist/ssr/surfaces/StatCell.js +80 -0
  522. package/dist/ssr/surfaces/StatCell.js.map +1 -0
  523. package/dist/ssr/surfaces/StatGrid.js +62 -0
  524. package/dist/ssr/surfaces/StatGrid.js.map +1 -0
  525. package/dist/ssr/surfaces/StatusBadge.js +38 -0
  526. package/dist/ssr/surfaces/StatusBadge.js.map +1 -0
  527. package/dist/ssr/surfaces/Tag.js +32 -0
  528. package/dist/ssr/surfaces/Tag.js.map +1 -0
  529. package/dist/ssr/surfaces/index.js +13 -0
  530. package/dist/ssr/surfaces/index.js.map +1 -0
  531. package/dist/ssr/widgets/Widget.js +54 -0
  532. package/dist/ssr/widgets/Widget.js.map +1 -0
  533. package/dist/ssr/widgets/WidgetHero.js +23 -0
  534. package/dist/ssr/widgets/WidgetHero.js.map +1 -0
  535. package/dist/ssr/widgets/WidgetList.js +73 -0
  536. package/dist/ssr/widgets/WidgetList.js.map +1 -0
  537. package/dist/ssr/widgets/WidgetPills.js +40 -0
  538. package/dist/ssr/widgets/WidgetPills.js.map +1 -0
  539. package/dist/ssr/widgets/WidgetStat.js +45 -0
  540. package/dist/ssr/widgets/WidgetStat.js.map +1 -0
  541. package/dist/ssr/widgets/WidgetStatus.js +23 -0
  542. package/dist/ssr/widgets/WidgetStatus.js.map +1 -0
  543. package/dist/ssr/widgets/index.js +7 -0
  544. package/dist/ssr/widgets/index.js.map +1 -0
  545. package/dist/styles.css +1 -0
  546. package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
  547. package/dist/tabler.css +4 -0
  548. package/package.json +77 -0
@@ -0,0 +1,83 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { setAttribute as _$setAttribute } from "solid-js/web";
3
+ import { className as _$className } from "solid-js/web";
4
+ import { effect as _$effect } from "solid-js/web";
5
+ import { getNextElement as _$getNextElement } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { insert as _$insert } from "solid-js/web";
8
+ import { createComponent as _$createComponent } from "solid-js/web";
9
+ import { memo as _$memo } from "solid-js/web";
10
+ var _tmpl$ = /*#__PURE__*/_$template(`<nav><!$><!/><!$><!/>`),
11
+ _tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-range-picker__caption>`),
12
+ _tmpl$3 = /*#__PURE__*/_$template(`<a class=k2b-range-picker__option>`);
13
+ import { For } from "solid-js";
14
+ import { useUiMessages } from "../intl/messages";
15
+
16
+ /**
17
+ * RangePicker — the time window every observability surface needs.
18
+ *
19
+ * Rendered as links rather than buttons on purpose: window selection is a
20
+ * server concern (the query, not the rendering), so it belongs in the URL and
21
+ * works without hydration. Callers supply the href per option, which is what
22
+ * lets each page keep its own other params intact — the hand-rolled copies
23
+ * differed exactly there, with one silently dropping every unrelated filter.
24
+ *
25
+ * The vocabulary stays with the caller too. Traces think in `10m…30d`, request
26
+ * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong
27
+ * for most of them.
28
+ */
29
+
30
+ export default function RangePicker(props) {
31
+ const messages = useUiMessages();
32
+ const caption = () => props.label === null ? null : props.label ?? messages().window;
33
+ return (() => {
34
+ var _el$ = _$getNextElement(_tmpl$),
35
+ _el$2 = _el$.firstChild,
36
+ [_el$3, _co$] = _$getNextMarker(_el$2.nextSibling),
37
+ _el$4 = _el$3.nextSibling,
38
+ [_el$5, _co$2] = _$getNextMarker(_el$4.nextSibling);
39
+ _$insert(_el$, (() => {
40
+ var _c$ = _$memo(() => !!caption());
41
+ return () => _c$() ? (() => {
42
+ var _el$6 = _$getNextElement(_tmpl$2);
43
+ _$insert(_el$6, caption);
44
+ return _el$6;
45
+ })() : null;
46
+ })(), _el$3, _co$);
47
+ _$insert(_el$, _$createComponent(For, {
48
+ get each() {
49
+ return props.options;
50
+ },
51
+ children: option => (() => {
52
+ var _el$7 = _$getNextElement(_tmpl$3);
53
+ _$insert(_el$7, () => option.label ?? option.value);
54
+ _$effect(_p$ => {
55
+ var _v$3 = option.href,
56
+ _v$4 = option.value === props.value ? "true" : undefined,
57
+ _v$5 = option.value === props.value ? "true" : undefined;
58
+ _v$3 !== _p$.e && _$setAttribute(_el$7, "href", _p$.e = _v$3);
59
+ _v$4 !== _p$.t && _$setAttribute(_el$7, "data-selected", _p$.t = _v$4);
60
+ _v$5 !== _p$.a && _$setAttribute(_el$7, "aria-current", _p$.a = _v$5);
61
+ return _p$;
62
+ }, {
63
+ e: undefined,
64
+ t: undefined,
65
+ a: undefined
66
+ });
67
+ return _el$7;
68
+ })()
69
+ }), _el$5, _co$2);
70
+ _$effect(_p$ => {
71
+ var _v$ = `k2b-range-picker ${props.class ?? ""}`,
72
+ _v$2 = props.ariaLabel ?? caption() ?? messages().range;
73
+ _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
74
+ _v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
75
+ return _p$;
76
+ }, {
77
+ e: undefined,
78
+ t: undefined
79
+ });
80
+ return _el$;
81
+ })();
82
+ }
83
+ //# sourceMappingURL=RangePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["For","useUiMessages","RangePicker","props","messages","caption","label","window","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_co$","_$getNextMarker","nextSibling","_el$4","_el$5","_co$2","_$insert","_c$","_$memo","_el$6","_tmpl$2","_$createComponent","each","options","children","option","_el$7","_tmpl$3","value","_$effect","_p$","_v$3","href","_v$4","undefined","_v$5","e","_$setAttribute","t","a","_v$","class","_v$2","ariaLabel","range","_$className"],"sources":["content/RangePicker.tsx"],"sourcesContent":["import { For } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * RangePicker — the time window every observability surface needs.\n *\n * Rendered as links rather than buttons on purpose: window selection is a\n * server concern (the query, not the rendering), so it belongs in the URL and\n * works without hydration. Callers supply the href per option, which is what\n * lets each page keep its own other params intact — the hand-rolled copies\n * differed exactly there, with one silently dropping every unrelated filter.\n *\n * The vocabulary stays with the caller too. Traces think in `10m…30d`, request\n * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong\n * for most of them.\n */\nexport type RangeOption<T extends string> = {\n value: T;\n /** Defaults to the value, which is already short by convention (`24h`). */\n label?: string;\n href: string;\n};\n\nexport type RangePickerProps<T extends string> = {\n options: readonly RangeOption<T>[];\n value: T;\n /** Leading caption. Pass `null` to omit it in tight toolbars. */\n label?: string | null;\n /** Names the control for assistive tech; defaults to the visible label. */\n ariaLabel?: string;\n class?: string;\n};\n\nexport default function RangePicker<T extends string>(props: RangePickerProps<T>) {\n const messages = useUiMessages();\n const caption = () => (props.label === null ? null : (props.label ?? messages().window));\n return (\n <nav class={`k2b-range-picker ${props.class ?? \"\"}`} aria-label={props.ariaLabel ?? caption() ?? messages().range}>\n {caption() ? <span class=\"k2b-range-picker__caption\">{caption()}</span> : null}\n <For each={props.options}>\n {(option) => (\n <a\n href={option.href}\n class=\"k2b-range-picker__option\"\n data-selected={option.value === props.value ? \"true\" : undefined}\n aria-current={option.value === props.value ? \"true\" : undefined}\n >\n {option.label ?? option.value}\n </a>\n )}\n </For>\n </nav>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,194 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { setAttribute as _$setAttribute } from "solid-js/web";
4
+ import { className as _$className } from "solid-js/web";
5
+ import { effect as _$effect } from "solid-js/web";
6
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
7
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
8
+ import { memo as _$memo } from "solid-js/web";
9
+ import { getNextElement as _$getNextElement } from "solid-js/web";
10
+ import { insert as _$insert } from "solid-js/web";
11
+ import { createComponent as _$createComponent } from "solid-js/web";
12
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__rows>`),
13
+ _tmpl$2 = /*#__PURE__*/_$template(`<p class=k2b-content-structured-data__hidden><!$><!/> more row<!$><!/> hidden.`),
14
+ _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__surface>`),
15
+ _tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-content-structured-data__action>`),
16
+ _tmpl$5 = /*#__PURE__*/_$template(`<div><!$><!/><!$><!/><div class=k2b-content-structured-data__footer>`),
17
+ _tmpl$6 = /*#__PURE__*/_$template(`<h2 class=k2b-content-structured-data__title>`),
18
+ _tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__copy>`),
19
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__surface data-mode=raw><pre></pre><!$><!/>`),
20
+ _tmpl$9 = /*#__PURE__*/_$template(`<p class=k2b-content-structured-data__empty>`),
21
+ _tmpl$0 = /*#__PURE__*/_$template(`<span class=k2b-content-structured-data__key>`),
22
+ _tmpl$1 = /*#__PURE__*/_$template(`<span class=k2b-content-structured-data__value>`);
23
+ import { createMemo, createSignal, For, Show } from "solid-js";
24
+ import CopyButton from "../actions/CopyButton";
25
+ import { resolveMaybeAccessor } from "../inputs/field-contract";
26
+ import { useUiMessages } from "../intl/messages";
27
+ export const isStructuredDataValue = (value, seen = new WeakSet()) => {
28
+ if (value === null || typeof value === "string" || typeof value === "boolean") return true;
29
+ if (typeof value === "number") return Number.isFinite(value);
30
+ if (typeof value !== "object" || seen.has(value)) return false;
31
+ const prototype = Object.getPrototypeOf(value);
32
+ if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;
33
+ seen.add(value);
34
+ const valid = Array.isArray(value) ? value.every(item => isStructuredDataValue(item, seen)) : Object.values(value).every(item => isStructuredDataValue(item, seen));
35
+ seen.delete(value);
36
+ return valid;
37
+ };
38
+ const toRows = data => {
39
+ if (Array.isArray(data)) return data.map((value, index) => ({
40
+ key: String(index),
41
+ value
42
+ }));
43
+ if (data && typeof data === "object") return Object.entries(data).map(([key, value]) => ({
44
+ key,
45
+ value
46
+ }));
47
+ if (data === null) return [];
48
+ return [{
49
+ key: "value",
50
+ value: data
51
+ }];
52
+ };
53
+ const formatInlineValue = value => {
54
+ if (value === null) return "null";
55
+ if (typeof value === "string") return value;
56
+ if (typeof value === "number" || typeof value === "boolean") return String(value);
57
+ return JSON.stringify(value);
58
+ };
59
+ const formatJson = data => JSON.stringify(data, null, 2);
60
+ export default function StructuredDataPreview(props) {
61
+ const messages = useUiMessages();
62
+ const [internalMode, setInternalMode] = createSignal(props.defaultMode ?? "formatted");
63
+ const mode = () => props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode);
64
+ const setMode = next => {
65
+ if (props.mode === undefined) setInternalMode(next);
66
+ props.onModeChange?.(next);
67
+ };
68
+ const rows = createMemo(() => toRows(props.data));
69
+ const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));
70
+ const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));
71
+ const raw = createMemo(() => formatJson(props.data));
72
+ const hasData = createMemo(() => rows().length > 0);
73
+ const showRaw = createMemo(() => mode() === "raw");
74
+ return (() => {
75
+ var _el$ = _$getNextElement(_tmpl$5),
76
+ _el$11 = _el$.firstChild,
77
+ [_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling),
78
+ _el$13 = _el$12.nextSibling,
79
+ [_el$14, _co$4] = _$getNextMarker(_el$13.nextSibling),
80
+ _el$1 = _el$14.nextSibling;
81
+ _$insert(_el$, _$createComponent(Show, {
82
+ get when() {
83
+ return props.title;
84
+ },
85
+ children: title => (() => {
86
+ var _el$15 = _$getNextElement(_tmpl$6);
87
+ _$insert(_el$15, title);
88
+ return _el$15;
89
+ })()
90
+ }), _el$12, _co$3);
91
+ _$insert(_el$, _$createComponent(Show, {
92
+ get when() {
93
+ return !showRaw();
94
+ },
95
+ get fallback() {
96
+ return (() => {
97
+ var _el$16 = _$getNextElement(_tmpl$8),
98
+ _el$17 = _el$16.firstChild,
99
+ _el$19 = _el$17.nextSibling,
100
+ [_el$20, _co$5] = _$getNextMarker(_el$19.nextSibling);
101
+ _$insert(_el$17, raw);
102
+ _$insert(_el$16, _$createComponent(Show, {
103
+ get when() {
104
+ return props.copy !== false;
105
+ },
106
+ get children() {
107
+ var _el$18 = _$getNextElement(_tmpl$7);
108
+ _$insert(_el$18, _$createComponent(CopyButton, {
109
+ get text() {
110
+ return raw();
111
+ }
112
+ }));
113
+ return _el$18;
114
+ }
115
+ }), _el$20, _co$5);
116
+ return _el$16;
117
+ })();
118
+ },
119
+ get children() {
120
+ var _el$2 = _$getNextElement(_tmpl$3);
121
+ _$insert(_el$2, _$createComponent(Show, {
122
+ get when() {
123
+ return hasData();
124
+ },
125
+ get fallback() {
126
+ return (() => {
127
+ var _el$21 = _$getNextElement(_tmpl$9);
128
+ _$insert(_el$21, () => props.empty ?? messages().noData);
129
+ return _el$21;
130
+ })();
131
+ },
132
+ get children() {
133
+ return [(() => {
134
+ var _el$3 = _$getNextElement(_tmpl$);
135
+ _$insert(_el$3, _$createComponent(For, {
136
+ get each() {
137
+ return visibleRows();
138
+ },
139
+ children: row => {
140
+ const complex = typeof row.value === "object" && row.value !== null;
141
+ return [(() => {
142
+ var _el$22 = _$getNextElement(_tmpl$0);
143
+ _$insert(_el$22, () => row.key);
144
+ _$effect(() => _$setAttribute(_el$22, "title", row.key));
145
+ return _el$22;
146
+ })(), (() => {
147
+ var _el$23 = _$getNextElement(_tmpl$1);
148
+ _$setAttribute(_el$23, "data-complex", complex ? "true" : undefined);
149
+ _$insert(_el$23, () => formatInlineValue(row.value));
150
+ return _el$23;
151
+ })()];
152
+ }
153
+ }));
154
+ return _el$3;
155
+ })(), _$createComponent(Show, {
156
+ get when() {
157
+ return hiddenCount() > 0;
158
+ },
159
+ get children() {
160
+ var _el$4 = _$getNextElement(_tmpl$2),
161
+ _el$7 = _el$4.firstChild,
162
+ [_el$8, _co$] = _$getNextMarker(_el$7.nextSibling),
163
+ _el$5 = _el$8.nextSibling,
164
+ _el$9 = _el$5.nextSibling,
165
+ [_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling),
166
+ _el$6 = _el$0.nextSibling;
167
+ _$insert(_el$4, hiddenCount, _el$8, _co$);
168
+ _$insert(_el$4, () => hiddenCount() === 1 ? "" : "s", _el$0, _co$2);
169
+ return _el$4;
170
+ }
171
+ })];
172
+ }
173
+ }));
174
+ return _el$2;
175
+ }
176
+ }), _el$14, _co$4);
177
+ _$insert(_el$1, _$createComponent(Show, {
178
+ get when() {
179
+ return hasData();
180
+ },
181
+ get children() {
182
+ var _el$10 = _$getNextElement(_tmpl$4);
183
+ _el$10.$$click = () => setMode(showRaw() ? "formatted" : "raw");
184
+ _$insert(_el$10, () => showRaw() ? "View formatted" : "View raw");
185
+ _$runHydrationEvents();
186
+ return _el$10;
187
+ }
188
+ }));
189
+ _$effect(() => _$className(_el$, ["k2b-content-structured-data", props.class].filter(Boolean).join(" ")));
190
+ return _el$;
191
+ })();
192
+ }
193
+ _$delegateEvents(["click"]);
194
+ //# sourceMappingURL=StructuredDataPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createMemo","createSignal","For","Show","CopyButton","resolveMaybeAccessor","useUiMessages","isStructuredDataValue","value","seen","WeakSet","Number","isFinite","has","prototype","Object","getPrototypeOf","Array","isArray","add","valid","every","item","values","delete","toRows","data","map","index","key","String","entries","formatInlineValue","JSON","stringify","formatJson","StructuredDataPreview","props","messages","internalMode","setInternalMode","defaultMode","mode","undefined","setMode","next","onModeChange","rows","visibleRows","slice","maxRows","length","hiddenCount","Math","max","raw","hasData","showRaw","_el$","_$getNextElement","_tmpl$5","_el$11","firstChild","_el$12","_co$3","_$getNextMarker","nextSibling","_el$13","_el$14","_co$4","_el$1","_$insert","_$createComponent","when","title","children","_el$15","_tmpl$6","fallback","_el$16","_tmpl$8","_el$17","_el$19","_el$20","_co$5","copy","_el$18","_tmpl$7","text","_el$2","_tmpl$3","_el$21","_tmpl$9","empty","noData","_el$3","_tmpl$","each","row","complex","_el$22","_tmpl$0","_$effect","_$setAttribute","_el$23","_tmpl$1","_el$4","_tmpl$2","_el$7","_el$8","_co$","_el$5","_el$9","_el$0","_co$2","_el$6","_el$10","_tmpl$4","$$click","_$runHydrationEvents","_$className","class","filter","Boolean","join","_$delegateEvents"],"sources":["content/StructuredDataPreview.tsx"],"sourcesContent":["import { createMemo, createSignal, For, Show } from \"solid-js\";\nimport CopyButton from \"../actions/CopyButton\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type StructuredDataPreviewMode = \"formatted\" | \"raw\";\nexport type StructuredDataValue =\n | null\n | boolean\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport const isStructuredDataValue = (value: unknown, seen = new WeakSet<object>()): value is StructuredDataValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;\n\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isStructuredDataValue(item, seen))\n : Object.values(value).every((item) => isStructuredDataValue(item, seen));\n seen.delete(value);\n return valid;\n};\n\nexport type StructuredDataPreviewProps = {\n title?: string;\n data: StructuredDataValue;\n /** Controlled display mode. */\n mode?: MaybeAccessor<StructuredDataPreviewMode>;\n onModeChange?: (mode: StructuredDataPreviewMode) => void;\n /** Initial mode for an uncontrolled preview. */\n defaultMode?: StructuredDataPreviewMode;\n copy?: boolean;\n empty?: string;\n maxRows?: number;\n class?: string;\n};\n\ntype Row = {\n key: string;\n value: StructuredDataValue;\n};\n\nconst toRows = (data: StructuredDataValue): Row[] => {\n if (Array.isArray(data)) return data.map((value, index) => ({ key: String(index), value }));\n if (data && typeof data === \"object\") return Object.entries(data).map(([key, value]) => ({ key, value }));\n if (data === null) return [];\n return [{ key: \"value\", value: data }];\n};\n\nconst formatInlineValue = (value: StructuredDataValue): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nconst formatJson = (data: StructuredDataValue): string => JSON.stringify(data, null, 2);\n\nexport default function StructuredDataPreview(props: StructuredDataPreviewProps) {\n const messages = useUiMessages();\n const [internalMode, setInternalMode] = createSignal<StructuredDataPreviewMode>(props.defaultMode ?? \"formatted\");\n const mode = () => (props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode));\n const setMode = (next: StructuredDataPreviewMode) => {\n if (props.mode === undefined) setInternalMode(next);\n props.onModeChange?.(next);\n };\n const rows = createMemo(() => toRows(props.data));\n const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));\n const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));\n const raw = createMemo(() => formatJson(props.data));\n const hasData = createMemo(() => rows().length > 0);\n const showRaw = createMemo(() => mode() === \"raw\");\n\n return (\n <div class={[\"k2b-content-structured-data\", props.class].filter(Boolean).join(\" \")}>\n <Show when={props.title}>{(title) => <h2 class=\"k2b-content-structured-data__title\">{title()}</h2>}</Show>\n\n <Show\n when={!showRaw()}\n fallback={\n <div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\">\n <pre>{raw()}</pre>\n <Show when={props.copy !== false}>\n <div class=\"k2b-content-structured-data__copy\">\n <CopyButton text={raw()} />\n </div>\n </Show>\n </div>\n }\n >\n <div class=\"k2b-content-structured-data__surface\">\n <Show when={hasData()} fallback={<p class=\"k2b-content-structured-data__empty\">{props.empty ?? messages().noData}</p>}>\n <div class=\"k2b-content-structured-data__rows\">\n <For each={visibleRows()}>\n {(row) => {\n const complex = typeof row.value === \"object\" && row.value !== null;\n return (\n <>\n <span class=\"k2b-content-structured-data__key\" title={row.key}>\n {row.key}\n </span>\n <span class=\"k2b-content-structured-data__value\" data-complex={complex ? \"true\" : undefined}>\n {formatInlineValue(row.value)}\n </span>\n </>\n );\n }}\n </For>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"k2b-content-structured-data__hidden\">\n {hiddenCount()} more row{hiddenCount() === 1 ? \"\" : \"s\"} hidden.\n </p>\n </Show>\n </Show>\n </div>\n </Show>\n\n <div class=\"k2b-content-structured-data__footer\">\n <Show when={hasData()}>\n <button type=\"button\" class=\"k2b-content-structured-data__action\" onClick={() => setMode(showRaw() ? \"formatted\" : \"raw\")}>\n {showRaw() ? \"View formatted\" : \"View raw\"}\n </button>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,92 @@
1
+ const heapPush = (heap, value, before) => {
2
+ heap.push(value);
3
+ let index = heap.length - 1;
4
+ while (index > 0) {
5
+ const parent = Math.floor((index - 1) / 2);
6
+ if (!before(heap[index], heap[parent])) break;
7
+ [heap[parent], heap[index]] = [heap[index], heap[parent]];
8
+ index = parent;
9
+ }
10
+ };
11
+ const heapPop = (heap, before) => {
12
+ const first = heap[0];
13
+ const last = heap.pop();
14
+ if (heap.length === 0 || last === undefined) return first;
15
+ heap[0] = last;
16
+ let index = 0;
17
+ while (true) {
18
+ const left = index * 2 + 1;
19
+ const right = left + 1;
20
+ let next = index;
21
+ if (left < heap.length && before(heap[left], heap[next])) next = left;
22
+ if (right < heap.length && before(heap[right], heap[next])) next = right;
23
+ if (next === index) return first;
24
+ [heap[index], heap[next]] = [heap[next], heap[index]];
25
+ index = next;
26
+ }
27
+ };
28
+ const layoutGroup = (group, groupId) => {
29
+ const active = [];
30
+ const freeLanes = [];
31
+ const assigned = [];
32
+ let laneCount = 0;
33
+ for (const entry of group) {
34
+ while (active[0] && active[0].end <= entry.start) {
35
+ const released = heapPop(active, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
36
+ if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);
37
+ }
38
+ const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;
39
+ heapPush(active, {
40
+ end: entry.end,
41
+ lane
42
+ }, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
43
+ assigned.push({
44
+ item: entry.item,
45
+ lane
46
+ });
47
+ }
48
+ const groupStart = group[0]?.start ?? 0;
49
+ const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);
50
+ return assigned.map(({
51
+ item,
52
+ lane
53
+ }) => ({
54
+ item,
55
+ lane,
56
+ lanes: Math.max(1, laneCount),
57
+ groupId,
58
+ groupStart,
59
+ groupEnd
60
+ }));
61
+ };
62
+
63
+ /**
64
+ * Assigns the lowest available visual lane to overlapping intervals.
65
+ * Sorting plus two binary heaps keeps large overlap groups at O(n log n).
66
+ */
67
+ export const layoutCalendarIntervals = (items, bounds) => {
68
+ const sorted = items.map(item => {
69
+ const interval = bounds(item);
70
+ return {
71
+ item,
72
+ start: interval.start,
73
+ end: Math.max(interval.start, interval.end)
74
+ };
75
+ }).sort((left, right) => left.start - right.start || right.end - left.end);
76
+ const groups = [];
77
+ let group = [];
78
+ let groupEnd = Number.NEGATIVE_INFINITY;
79
+ for (const entry of sorted) {
80
+ if (group.length === 0 || entry.start < groupEnd) {
81
+ group.push(entry);
82
+ groupEnd = Math.max(groupEnd, entry.end);
83
+ continue;
84
+ }
85
+ groups.push(group);
86
+ group = [entry];
87
+ groupEnd = entry.end;
88
+ }
89
+ if (group.length > 0) groups.push(group);
90
+ return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));
91
+ };
92
+ //# sourceMappingURL=calendar-event-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["heapPush","heap","value","before","push","index","length","parent","Math","floor","heapPop","first","last","pop","undefined","left","right","next","layoutGroup","group","groupId","active","freeLanes","assigned","laneCount","entry","end","start","released","lane","item","groupStart","groupEnd","reduce","latest","max","map","lanes","layoutCalendarIntervals","items","bounds","sorted","interval","sort","groups","Number","NEGATIVE_INFINITY","flatMap","entries"],"sources":["content/calendar-event-layout.ts"],"sourcesContent":["export type CalendarIntervalLayout<T> = {\n item: T;\n lane: number;\n lanes: number;\n groupId: number;\n groupStart: number;\n groupEnd: number;\n};\n\ntype BoundedItem<T> = {\n item: T;\n start: number;\n end: number;\n};\n\ntype ActiveLane = {\n end: number;\n lane: number;\n};\n\nconst heapPush = <T>(heap: T[], value: T, before: (left: T, right: T) => boolean): void => {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (!before(heap[index]!, heap[parent]!)) break;\n [heap[parent], heap[index]] = [heap[index]!, heap[parent]!];\n index = parent;\n }\n};\n\nconst heapPop = <T>(heap: T[], before: (left: T, right: T) => boolean): T | undefined => {\n const first = heap[0];\n const last = heap.pop();\n if (heap.length === 0 || last === undefined) return first;\n heap[0] = last;\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n const right = left + 1;\n let next = index;\n if (left < heap.length && before(heap[left]!, heap[next]!)) next = left;\n if (right < heap.length && before(heap[right]!, heap[next]!)) next = right;\n if (next === index) return first;\n [heap[index], heap[next]] = [heap[next]!, heap[index]!];\n index = next;\n }\n};\n\nconst layoutGroup = <T>(group: readonly BoundedItem<T>[], groupId: number): CalendarIntervalLayout<T>[] => {\n const active: ActiveLane[] = [];\n const freeLanes: number[] = [];\n const assigned: Array<{ item: T; lane: number }> = [];\n let laneCount = 0;\n\n for (const entry of group) {\n while (active[0] && active[0].end <= entry.start) {\n const released = heapPop(active, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);\n }\n const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;\n heapPush(active, { end: entry.end, lane }, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n assigned.push({ item: entry.item, lane });\n }\n\n const groupStart = group[0]?.start ?? 0;\n const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);\n return assigned.map(({ item, lane }) => ({ item, lane, lanes: Math.max(1, laneCount), groupId, groupStart, groupEnd }));\n};\n\n/**\n * Assigns the lowest available visual lane to overlapping intervals.\n * Sorting plus two binary heaps keeps large overlap groups at O(n log n).\n */\nexport const layoutCalendarIntervals = <T>(\n items: readonly T[],\n bounds: (item: T) => { start: number; end: number },\n): CalendarIntervalLayout<T>[] => {\n const sorted = items\n .map((item) => {\n const interval = bounds(item);\n return { item, start: interval.start, end: Math.max(interval.start, interval.end) };\n })\n .sort((left, right) => left.start - right.start || right.end - left.end);\n const groups: Array<Array<BoundedItem<T>>> = [];\n let group: Array<BoundedItem<T>> = [];\n let groupEnd = Number.NEGATIVE_INFINITY;\n\n for (const entry of sorted) {\n if (group.length === 0 || entry.start < groupEnd) {\n group.push(entry);\n groupEnd = Math.max(groupEnd, entry.end);\n continue;\n }\n groups.push(group);\n group = [entry];\n groupEnd = entry.end;\n }\n if (group.length > 0) groups.push(group);\n\n return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,114 @@
1
+ export const CALENDAR_SNAP_MINUTES = 15;
2
+ export const snapCalendarMinutes = (minutes, step = CALENDAR_SNAP_MINUTES) => Math.round(minutes / step) * step;
3
+ export const calendarDayIndexAtPoint = (clientX, startX, width, days) => {
4
+ if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;
5
+ return Math.min(days - 1, Math.floor((clientX - startX) / width * days));
6
+ };
7
+ export const calendarMinuteAtPoint = (clientY, top, height, startHour, endHour) => {
8
+ const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);
9
+ const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;
10
+ return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);
11
+ };
12
+ export const calendarAutoScrollSpeed = (clientY, top, bottom, edge = 56, maximum = 18) => {
13
+ if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));
14
+ if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));
15
+ return 0;
16
+ };
17
+ let cancelActiveSession = null;
18
+
19
+ /**
20
+ * Owns one pointer gesture from threshold crossing through commit or cancel.
21
+ * Views provide geometry through `resolve`; this helper owns global cleanup,
22
+ * pointer cancellation, Escape handling, and edge auto-scroll.
23
+ */
24
+ export const startCalendarPointerSession = options => {
25
+ if (options.event.button !== 0 || !options.event.isPrimary) return () => {};
26
+ cancelActiveSession?.();
27
+ const pointerId = options.event.pointerId;
28
+ const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;
29
+ const startX = options.event.clientX;
30
+ const startY = options.event.clientY;
31
+ // Leave enough room for normal click jitter before an event becomes a drag.
32
+ const threshold = options.threshold ?? 6;
33
+ const previousUserSelect = document.body.style.userSelect;
34
+ let clientX = startX;
35
+ let clientY = startY;
36
+ let active = false;
37
+ let finished = false;
38
+ let latest = null;
39
+ let scrollFrame = 0;
40
+ const preview = () => {
41
+ const value = options.resolve(clientX, clientY);
42
+ if (value === null) return;
43
+ latest = value;
44
+ options.onPreview(value);
45
+ };
46
+ const autoScroll = () => {
47
+ scrollFrame = 0;
48
+ if (!active || !options.scrollContainer) return;
49
+ const rect = options.scrollContainer.getBoundingClientRect();
50
+ const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);
51
+ if (speed !== 0) {
52
+ const before = options.scrollContainer.scrollTop;
53
+ options.scrollContainer.scrollTop += speed;
54
+ if (options.scrollContainer.scrollTop !== before) preview();
55
+ }
56
+ scrollFrame = requestAnimationFrame(autoScroll);
57
+ };
58
+ const cleanup = () => {
59
+ if (scrollFrame) cancelAnimationFrame(scrollFrame);
60
+ window.removeEventListener("pointermove", onMove);
61
+ window.removeEventListener("pointerup", onUp);
62
+ window.removeEventListener("pointercancel", cancel);
63
+ window.removeEventListener("blur", cancel);
64
+ window.removeEventListener("keydown", onKeyDown);
65
+ if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);
66
+ document.body.style.userSelect = previousUserSelect;
67
+ if (cancelActiveSession === cancel) cancelActiveSession = null;
68
+ };
69
+ const activate = () => {
70
+ if (active) return;
71
+ active = true;
72
+ document.body.style.userSelect = "none";
73
+ target?.setPointerCapture?.(pointerId);
74
+ options.onActivate?.();
75
+ preview();
76
+ if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);
77
+ };
78
+ function cancel() {
79
+ if (finished) return;
80
+ finished = true;
81
+ cleanup();
82
+ if (active) options.onCancel?.();
83
+ }
84
+ function onMove(event) {
85
+ if (finished || event.pointerId !== pointerId) return;
86
+ clientX = event.clientX;
87
+ clientY = event.clientY;
88
+ if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();
89
+ if (!active) return;
90
+ event.preventDefault();
91
+ preview();
92
+ }
93
+ function onUp(event) {
94
+ if (finished || event.pointerId !== pointerId) return;
95
+ finished = true;
96
+ cleanup();
97
+ if (active && latest !== null) options.onCommit(latest);else if (active) options.onCancel?.();
98
+ }
99
+ function onKeyDown(event) {
100
+ if (event.key !== "Escape") return;
101
+ event.preventDefault();
102
+ cancel();
103
+ }
104
+ window.addEventListener("pointermove", onMove, {
105
+ passive: false
106
+ });
107
+ window.addEventListener("pointerup", onUp);
108
+ window.addEventListener("pointercancel", cancel);
109
+ window.addEventListener("blur", cancel);
110
+ window.addEventListener("keydown", onKeyDown);
111
+ cancelActiveSession = cancel;
112
+ return cancel;
113
+ };
114
+ //# sourceMappingURL=calendar-pointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CALENDAR_SNAP_MINUTES","snapCalendarMinutes","minutes","step","Math","round","calendarDayIndexAtPoint","clientX","startX","width","days","min","floor","calendarMinuteAtPoint","clientY","top","height","startHour","endHour","totalMinutes","max","ratio","calendarAutoScrollSpeed","bottom","edge","maximum","ceil","cancelActiveSession","startCalendarPointerSession","options","event","button","isPrimary","pointerId","target","currentTarget","HTMLElement","startY","threshold","previousUserSelect","document","body","style","userSelect","active","finished","latest","scrollFrame","preview","value","resolve","onPreview","autoScroll","scrollContainer","rect","getBoundingClientRect","speed","before","scrollTop","requestAnimationFrame","cleanup","cancelAnimationFrame","window","removeEventListener","onMove","onUp","cancel","onKeyDown","hasPointerCapture","releasePointerCapture","activate","setPointerCapture","onActivate","onCancel","hypot","preventDefault","onCommit","key","addEventListener","passive"],"sources":["content/calendar-pointer.ts"],"sourcesContent":["export const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n const previousUserSelect = document.body.style.userSelect;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n document.body.style.userSelect = previousUserSelect;\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n document.body.style.userSelect = \"none\";\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n if (active) options.onCancel?.();\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ export const DEFAULT_MAP_VIEWPORT = {
2
+ latitude: 0,
3
+ longitude: 0,
4
+ zoom: 0
5
+ };
6
+ const MIN_ZOOM = 0;
7
+ const MAX_ZOOM = 5;
8
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
9
+ export const normalizeMapViewport = viewport => {
10
+ const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);
11
+ const scale = 2 ** zoom;
12
+ const latitudeLimit = 90 - 90 / scale;
13
+ const longitudeLimit = 180 - 180 / scale;
14
+ return {
15
+ latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),
16
+ longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),
17
+ zoom
18
+ };
19
+ };
20
+ export const zoomMapViewport = (viewport, delta) => normalizeMapViewport({
21
+ ...viewport,
22
+ zoom: viewport.zoom + delta
23
+ });
24
+ export const panMapViewport = (viewport, deltaX, deltaY, width, height) => {
25
+ if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);
26
+ const scale = 2 ** viewport.zoom;
27
+ return normalizeMapViewport({
28
+ latitude: viewport.latitude + deltaY / height * (180 / scale),
29
+ longitude: viewport.longitude - deltaX / width * (360 / scale),
30
+ zoom: viewport.zoom
31
+ });
32
+ };
33
+ //# sourceMappingURL=chart-map-viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_MAP_VIEWPORT","latitude","longitude","zoom","MIN_ZOOM","MAX_ZOOM","clamp","value","min","max","Math","normalizeMapViewport","viewport","Number","isFinite","scale","latitudeLimit","longitudeLimit","zoomMapViewport","delta","panMapViewport","deltaX","deltaY","width","height"],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (viewport: MapViewport, delta: number): MapViewport =>\n normalizeMapViewport({\n ...viewport,\n zoom: viewport.zoom + delta,\n });\n\nexport const panMapViewport = (viewport: MapViewport, deltaX: number, deltaY: number, width: number, height: number): MapViewport => {\n if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);\n\n const scale = 2 ** viewport.zoom;\n return normalizeMapViewport({\n latitude: viewport.latitude + (deltaY / height) * (180 / scale),\n longitude: viewport.longitude - (deltaX / width) * (360 / scale),\n zoom: viewport.zoom,\n });\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAiC,GAAG;EAC/CC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,CAAC;EACZC,IAAI,EAAE;AACR,CAAC;AAED,MAAMC,QAAQ,GAAG,CAAC;AAClB,MAAMC,QAAQ,GAAG,CAAC;AAElB,MAAMC,KAAK,GAAGA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,KAAaC,IAAI,CAACF,GAAG,CAACC,GAAG,EAAEC,IAAI,CAACD,GAAG,CAACD,GAAG,EAAED,KAAK,CAAC,CAAC;AAEtG,OAAO,MAAMI,oBAAoB,GAAIC,QAAiC,IAAkB;EACtF,MAAMT,IAAI,GAAGG,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACT,IAAI,CAAC,GAAGS,QAAQ,CAACT,IAAI,GAAGC,QAAQ,EAAEA,QAAQ,EAAEC,QAAQ,CAAC;EAC7G,MAAMU,KAAK,GAAG,CAAC,IAAIZ,IAAI;EACvB,MAAMa,aAAa,GAAG,EAAE,GAAG,EAAE,GAAGD,KAAK;EACrC,MAAME,cAAc,GAAG,GAAG,GAAG,GAAG,GAAGF,KAAK;EAExC,OAAO;IACLd,QAAQ,EAAEK,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACX,QAAQ,CAAC,GAAGW,QAAQ,CAACX,QAAQ,GAAG,CAAC,EAAE,CAACe,aAAa,EAAEA,aAAa,CAAC;IACtHd,SAAS,EAAEI,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACV,SAAS,CAAC,GAAGU,QAAQ,CAACV,SAAS,GAAG,CAAC,EAAE,CAACe,cAAc,EAAEA,cAAc,CAAC;IAC3Hd;EACF,CAAC;AACH,CAAC;AAED,OAAO,MAAMe,eAAe,GAAGA,CAACN,QAAqB,EAAEO,KAAa,KAClER,oBAAoB,CAAC;EACnB,GAAGC,QAAQ;EACXT,IAAI,EAAES,QAAQ,CAACT,IAAI,GAAGgB;AACxB,CAAC,CAAC;AAEJ,OAAO,MAAMC,cAAc,GAAGA,CAACR,QAAqB,EAAES,MAAc,EAAEC,MAAc,EAAEC,KAAa,EAAEC,MAAc,KAAkB;EACnI,IAAID,KAAK,IAAI,CAAC,IAAIC,MAAM,IAAI,CAAC,EAAE,OAAOb,oBAAoB,CAACC,QAAQ,CAAC;EAEpE,MAAMG,KAAK,GAAG,CAAC,IAAIH,QAAQ,CAACT,IAAI;EAChC,OAAOQ,oBAAoB,CAAC;IAC1BV,QAAQ,EAAEW,QAAQ,CAACX,QAAQ,GAAIqB,MAAM,GAAGE,MAAM,IAAK,GAAG,GAAGT,KAAK,CAAC;IAC/Db,SAAS,EAAEU,QAAQ,CAACV,SAAS,GAAImB,MAAM,GAAGE,KAAK,IAAK,GAAG,GAAGR,KAAK,CAAC;IAChEZ,IAAI,EAAES,QAAQ,CAACT;EACjB,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}