@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,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":[]}
@@ -0,0 +1,124 @@
1
+ import { computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from "@k2b/stdlib";
2
+ const ROW_HEIGHT = 24;
3
+ const TOP = 38;
4
+ const AXIS_HEIGHT = 28;
5
+ const LEGEND_HEIGHT = 24;
6
+ const MIN_VIEW_FRACTION = 1 / 64;
7
+ const finiteDomain = domain => {
8
+ if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;
9
+ return domain[0] < domain[1] ? domain : [domain[1], domain[0]];
10
+ };
11
+ export const stateTimelineDomain = (rows, domain) => {
12
+ const explicit = domain ? finiteDomain(domain) : null;
13
+ if (explicit) return explicit;
14
+ return computeDomain(rows.flatMap(row => row.intervals.flatMap(interval => [interval.from, interval.to])));
15
+ };
16
+ export const normalizeStateTimelineViewport = (viewport, fullDomain) => {
17
+ const full = finiteDomain(fullDomain) ?? [0, 1];
18
+ const candidate = viewport ? finiteDomain(viewport) : null;
19
+ if (!candidate) return full;
20
+ const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);
21
+ const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));
22
+ return [from, from + span];
23
+ };
24
+ export const zoomStateTimelineViewport = (viewport, fullDomain, delta, anchor = 0.5) => {
25
+ const current = normalizeStateTimelineViewport(viewport, fullDomain);
26
+ const fullSpan = fullDomain[1] - fullDomain[0];
27
+ const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);
28
+ const factor = delta > 0 ? 0.7 : 1 / 0.7;
29
+ const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));
30
+ const safeAnchor = Math.max(0, Math.min(1, anchor));
31
+ const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;
32
+ return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);
33
+ };
34
+ export const panStateTimelineViewport = (viewport, fullDomain, pixelDelta, plotWidth) => {
35
+ if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);
36
+ const current = normalizeStateTimelineViewport(viewport, fullDomain);
37
+ const timeDelta = -pixelDelta / plotWidth * (current[1] - current[0]);
38
+ return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);
39
+ };
40
+ export const stateTimelineHeight = (rows, legend = true) => Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));
41
+ const fmt = value => Number.isInteger(value) ? String(value) : value.toFixed(2);
42
+ const safeHref = href => href && href.startsWith("/") && !href.startsWith("//") ? href : null;
43
+ const truncate = (value, maxChars) => value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;
44
+ const interactiveGroup = (body, href, tooltip, ariaLabel) => {
45
+ const safe = safeHref(href);
46
+ const attrs = [`aria-label="${escapeXml(ariaLabel)}"`, tooltip ? `data-chart-tooltip="${escapeXml(tooltip)}"` : ""].filter(Boolean).join(" ");
47
+ const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : "";
48
+ return safe ? `<a href="${escapeXml(safe)}" ${attrs}>${title}${body}</a>` : `<g ${attrs}${tooltip ? ' tabindex="0" role="img"' : ""}>${title}${body}</g>`;
49
+ };
50
+ export const renderStateTimelineSvg = opts => {
51
+ const {
52
+ width,
53
+ height,
54
+ rows
55
+ } = opts;
56
+ const fullDomain = stateTimelineDomain(rows, opts.domain);
57
+ const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);
58
+ const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;
59
+ const legendHeight = showLegend ? LEGEND_HEIGHT : 0;
60
+ const labels = rows.map(row => row.label);
61
+ const idealGutter = Math.max(72, ...labels.map(label => label.length * 6.3 + 20));
62
+ const gutter = Math.min(240, width * 0.35, idealGutter);
63
+ const plotLeft = gutter;
64
+ const plotRight = Math.max(plotLeft + 1, width - 16);
65
+ const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);
66
+ const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, {
67
+ ...state,
68
+ index
69
+ }]));
70
+ const stateKeys = opts.states?.map(state => state.state) ?? [...new Set(rows.flatMap(row => row.intervals.map(i => i.state)))];
71
+ const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));
72
+ const body = [];
73
+ const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));
74
+ rows.forEach((row, rowIndex) => {
75
+ const y = TOP + rowIndex * ROW_HEIGHT;
76
+ if (y + ROW_HEIGHT > rowsBottom + 1) return;
77
+ const label = truncate(row.label, maxLabelChars);
78
+ const labelBody = `<text class="stdlib-chart-state-label" x="${fmt(plotLeft - 8)}" y="${fmt(y + ROW_HEIGHT / 2)}" text-anchor="end" dominant-baseline="middle">${escapeXml(label)}</text>`;
79
+ body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));
80
+ for (const interval of row.intervals) {
81
+ if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;
82
+ const intervalFrom = Math.min(interval.from, interval.to);
83
+ const intervalTo = Math.max(interval.from, interval.to);
84
+ if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;
85
+ const from = Math.max(viewport[0], intervalFrom);
86
+ const to = Math.min(viewport[1], intervalTo);
87
+ const x = mapRange(from, viewport, [plotLeft, plotRight]);
88
+ const x2 = mapRange(to, viewport, [plotLeft, plotRight]);
89
+ const style = stateStyles.get(interval.state);
90
+ const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;
91
+ const color = style?.color ? ` fill="${escapeXml(style.color)}"` : "";
92
+ const rect = `<rect class="stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}"${color} x="${fmt(x)}" y="${fmt(y + 3)}" width="${fmt(Math.max(2, x2 - x))}" height="${ROW_HEIGHT - 6}" rx="3"/>`;
93
+ const stateLabel = style?.label ?? interval.state;
94
+ body.push(interactiveGroup(rect, interval.href, interval.tooltip ?? interval.label, [row.label, interval.label, stateLabel].filter(Boolean).join(", ")));
95
+ }
96
+ });
97
+ const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));
98
+ const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;
99
+ const format = opts.xAxis?.format ?? (value => fmt(value));
100
+ for (const tick of ticks) {
101
+ if (tick < viewport[0] || tick > viewport[1]) continue;
102
+ const x = mapRange(tick, viewport, [plotLeft, plotRight]);
103
+ body.push(`<line x1="${fmt(x)}" x2="${fmt(x)}" y1="${TOP}" y2="${fmt(rowsBottom)}" stroke="currentColor" opacity="0.08"/>`, `<text class="stdlib-chart-heatmap-label" x="${fmt(x)}" y="${fmt(rowsBottom + 17)}" text-anchor="middle">${escapeXml(format(tick))}</text>`);
104
+ }
105
+ if (opts.xAxis?.label) {
106
+ body.push(`<text class="stdlib-chart-axis-label" x="${fmt((plotLeft + plotRight) / 2)}" y="${fmt(rowsBottom + AXIS_HEIGHT - 2)}" text-anchor="middle">${escapeXml(opts.xAxis.label)}</text>`);
107
+ }
108
+ if (showLegend) {
109
+ let x = plotLeft;
110
+ const y = height - 9;
111
+ for (const [index, state] of (opts.states ?? []).entries()) {
112
+ const color = state.color ? ` fill="${escapeXml(state.color)}"` : "";
113
+ const label = state.label ?? state.state;
114
+ body.push(`<rect class="stdlib-chart-series-${index % 8}"${color} x="${fmt(x)}" y="${y - 8}" width="8" height="8" rx="2"/>`, `<text class="stdlib-chart-heatmap-label" x="${fmt(x + 12)}" y="${y}" text-anchor="start">${escapeXml(label)}</text>`);
115
+ x += 20 + label.length * 6.2;
116
+ }
117
+ }
118
+ return svgRoot({
119
+ width,
120
+ height,
121
+ className: opts.className
122
+ }, body.join(""));
123
+ };
124
+ //# sourceMappingURL=chart-state-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["computeDomain","escapeXml","extendDomainToNice","mapRange","niceStep","svgRoot","ROW_HEIGHT","TOP","AXIS_HEIGHT","LEGEND_HEIGHT","MIN_VIEW_FRACTION","finiteDomain","domain","Number","isFinite","stateTimelineDomain","rows","explicit","flatMap","row","intervals","interval","from","to","normalizeStateTimelineViewport","viewport","fullDomain","full","candidate","span","Math","min","max","zoomStateTimelineViewport","delta","anchor","current","fullSpan","minSpan","factor","nextSpan","safeAnchor","anchorValue","panStateTimelineViewport","pixelDelta","plotWidth","timeDelta","stateTimelineHeight","legend","fmt","value","isInteger","String","toFixed","safeHref","href","startsWith","truncate","maxChars","length","slice","interactiveGroup","body","tooltip","ariaLabel","safe","attrs","filter","Boolean","join","title","renderStateTimelineSvg","opts","width","height","showLegend","states","legendHeight","labels","map","label","idealGutter","gutter","plotLeft","plotRight","rowsBottom","stateStyles","Map","state","index","stateKeys","Set","i","stateIndexes","maxLabelChars","floor","forEach","rowIndex","y","labelBody","push","intervalFrom","intervalTo","x","x2","style","get","stateIndex","color","rect","stateLabel","tickTarget","ticks","format","xAxis","tick","entries","className"],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"@k2b/stdlib\";\n\nexport type StateTimelineDomain = readonly [number, number];\n\nexport type StateTimelineInterval = {\n from: number;\n to: number;\n state: string;\n label?: string;\n href?: string;\n tooltip?: string;\n};\n\nexport type StateTimelineRow = {\n label: string;\n href?: string;\n tooltip?: string;\n intervals: StateTimelineInterval[];\n};\n\nexport type StateTimelineState = {\n state: string;\n label?: string;\n color?: string;\n};\n\nexport type StateTimelineChartOptions = {\n rows: StateTimelineRow[];\n states?: StateTimelineState[];\n domain?: StateTimelineDomain;\n xAxis?: { format?: (value: number) => string; label?: string };\n legend?: boolean;\n interactive?: boolean;\n};\n\nconst ROW_HEIGHT = 24;\nconst TOP = 38;\nconst AXIS_HEIGHT = 28;\nconst LEGEND_HEIGHT = 24;\nconst MIN_VIEW_FRACTION = 1 / 64;\n\nconst finiteDomain = (domain: StateTimelineDomain): StateTimelineDomain | null => {\n if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;\n return domain[0] < domain[1] ? domain : [domain[1], domain[0]];\n};\n\nexport const stateTimelineDomain = (rows: readonly StateTimelineRow[], domain?: StateTimelineDomain): StateTimelineDomain => {\n const explicit = domain ? finiteDomain(domain) : null;\n if (explicit) return explicit;\n return computeDomain(rows.flatMap((row) => row.intervals.flatMap((interval) => [interval.from, interval.to])));\n};\n\nexport const normalizeStateTimelineViewport = (\n viewport: StateTimelineDomain | undefined,\n fullDomain: StateTimelineDomain,\n): StateTimelineDomain => {\n const full = finiteDomain(fullDomain) ?? [0, 1];\n const candidate = viewport ? finiteDomain(viewport) : null;\n if (!candidate) return full;\n const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);\n const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));\n return [from, from + span];\n};\n\nexport const zoomStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n delta: number,\n anchor = 0.5,\n): StateTimelineDomain => {\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const fullSpan = fullDomain[1] - fullDomain[0];\n const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);\n const factor = delta > 0 ? 0.7 : 1 / 0.7;\n const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));\n const safeAnchor = Math.max(0, Math.min(1, anchor));\n const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;\n return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);\n};\n\nexport const panStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n pixelDelta: number,\n plotWidth: number,\n): StateTimelineDomain => {\n if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const timeDelta = (-pixelDelta / plotWidth) * (current[1] - current[0]);\n return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);\n};\n\nexport const stateTimelineHeight = (rows: number, legend = true): number =>\n Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));\n\nconst fmt = (value: number): string => (Number.isInteger(value) ? String(value) : value.toFixed(2));\n\nconst safeHref = (href: string | undefined): string | null => (href && href.startsWith(\"/\") && !href.startsWith(\"//\") ? href : null);\n\nconst truncate = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;\n\nconst interactiveGroup = (body: string, href: string | undefined, tooltip: string | undefined, ariaLabel: string): string => {\n const safe = safeHref(href);\n const attrs = [`aria-label=\"${escapeXml(ariaLabel)}\"`, tooltip ? `data-chart-tooltip=\"${escapeXml(tooltip)}\"` : \"\"]\n .filter(Boolean)\n .join(\" \");\n const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : \"\";\n return safe\n ? `<a href=\"${escapeXml(safe)}\" ${attrs}>${title}${body}</a>`\n : `<g ${attrs}${tooltip ? ' tabindex=\"0\" role=\"img\"' : \"\"}>${title}${body}</g>`;\n};\n\nexport const renderStateTimelineSvg = (\n opts: StateTimelineChartOptions & {\n width: number;\n height: number;\n viewport?: StateTimelineDomain;\n className?: string;\n },\n): string => {\n const { width, height, rows } = opts;\n const fullDomain = stateTimelineDomain(rows, opts.domain);\n const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);\n const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;\n const legendHeight = showLegend ? LEGEND_HEIGHT : 0;\n const labels = rows.map((row) => row.label);\n const idealGutter = Math.max(72, ...labels.map((label) => label.length * 6.3 + 20));\n const gutter = Math.min(240, width * 0.35, idealGutter);\n const plotLeft = gutter;\n const plotRight = Math.max(plotLeft + 1, width - 16);\n const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);\n const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, { ...state, index }]));\n const stateKeys = opts.states?.map((state) => state.state) ?? [...new Set(rows.flatMap((row) => row.intervals.map((i) => i.state)))];\n const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));\n const body: string[] = [];\n const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));\n\n rows.forEach((row, rowIndex) => {\n const y = TOP + rowIndex * ROW_HEIGHT;\n if (y + ROW_HEIGHT > rowsBottom + 1) return;\n const label = truncate(row.label, maxLabelChars);\n const labelBody = `<text class=\"stdlib-chart-state-label\" x=\"${fmt(plotLeft - 8)}\" y=\"${fmt(\n y + ROW_HEIGHT / 2,\n )}\" text-anchor=\"end\" dominant-baseline=\"middle\">${escapeXml(label)}</text>`;\n body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));\n\n for (const interval of row.intervals) {\n if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;\n const intervalFrom = Math.min(interval.from, interval.to);\n const intervalTo = Math.max(interval.from, interval.to);\n if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;\n const from = Math.max(viewport[0], intervalFrom);\n const to = Math.min(viewport[1], intervalTo);\n const x = mapRange(from, viewport, [plotLeft, plotRight]);\n const x2 = mapRange(to, viewport, [plotLeft, plotRight]);\n const style = stateStyles.get(interval.state);\n const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;\n const color = style?.color ? ` fill=\"${escapeXml(style.color)}\"` : \"\";\n const rect = `<rect class=\"stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}\"${color} x=\"${fmt(\n x,\n )}\" y=\"${fmt(y + 3)}\" width=\"${fmt(Math.max(2, x2 - x))}\" height=\"${ROW_HEIGHT - 6}\" rx=\"3\"/>`;\n const stateLabel = style?.label ?? interval.state;\n body.push(\n interactiveGroup(\n rect,\n interval.href,\n interval.tooltip ?? interval.label,\n [row.label, interval.label, stateLabel].filter(Boolean).join(\", \"),\n ),\n );\n }\n });\n\n const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));\n const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;\n const format = opts.xAxis?.format ?? ((value: number) => fmt(value));\n for (const tick of ticks) {\n if (tick < viewport[0] || tick > viewport[1]) continue;\n const x = mapRange(tick, viewport, [plotLeft, plotRight]);\n body.push(\n `<line x1=\"${fmt(x)}\" x2=\"${fmt(x)}\" y1=\"${TOP}\" y2=\"${fmt(rowsBottom)}\" stroke=\"currentColor\" opacity=\"0.08\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x)}\" y=\"${fmt(rowsBottom + 17)}\" text-anchor=\"middle\">${escapeXml(\n format(tick),\n )}</text>`,\n );\n }\n\n if (opts.xAxis?.label) {\n body.push(\n `<text class=\"stdlib-chart-axis-label\" x=\"${fmt((plotLeft + plotRight) / 2)}\" y=\"${fmt(\n rowsBottom + AXIS_HEIGHT - 2,\n )}\" text-anchor=\"middle\">${escapeXml(opts.xAxis.label)}</text>`,\n );\n }\n\n if (showLegend) {\n let x = plotLeft;\n const y = height - 9;\n for (const [index, state] of (opts.states ?? []).entries()) {\n const color = state.color ? ` fill=\"${escapeXml(state.color)}\"` : \"\";\n const label = state.label ?? state.state;\n body.push(\n `<rect class=\"stdlib-chart-series-${index % 8}\"${color} x=\"${fmt(x)}\" y=\"${y - 8}\" width=\"8\" height=\"8\" rx=\"2\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x + 12)}\" y=\"${y}\" text-anchor=\"start\">${escapeXml(label)}</text>`,\n );\n x += 20 + label.length * 6.2;\n }\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Small safe highlighters for CodeDisplay.
3
+ *
4
+ * These are display-only highlighters: no AST, no runtime parser, no
5
+ * dependency. Every input character is HTML-escaped before being wrapped
6
+ * in token spans, so the returned strings are safe to inject with
7
+ * `innerHTML`.
8
+ */
9
+
10
+ const KEYWORDS = new Set(["const", "let", "var", "function", "return", "if", "else", "for", "while", "import", "from", "export", "default", "async", "await", "new", "true", "false", "null", "undefined", "as", "type", "interface", "void", "this", "typeof", "in", "of"]);
11
+ export const escapeCodeHtml = s => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
12
+ const isIdStart = c => /[A-Za-z_$]/.test(c);
13
+ const isIdCont = c => /[\w$]/.test(c);
14
+ const isDigit = c => /[0-9]/.test(c);
15
+ const wrap = (cls, raw) => `<span class="${cls}">${escapeCodeHtml(raw)}</span>`;
16
+ const isCodeLanguage = language => language === "script" || language === "js" || language === "jsx" || language === "ts" || language === "tsx";
17
+ export const highlightCode = code => {
18
+ let out = "";
19
+ let i = 0;
20
+ const n = code.length;
21
+ while (i < n) {
22
+ const c = code[i];
23
+ if (c === "/" && code[i + 1] === "/") {
24
+ const nl = code.indexOf("\n", i);
25
+ const end = nl === -1 ? n : nl;
26
+ out += wrap("cd-c", code.slice(i, end));
27
+ i = end;
28
+ continue;
29
+ }
30
+ if (c === "/" && code[i + 1] === "*") {
31
+ const close = code.indexOf("*/", i + 2);
32
+ const end = close === -1 ? n : close + 2;
33
+ out += wrap("cd-c", code.slice(i, end));
34
+ i = end;
35
+ continue;
36
+ }
37
+ if (c === '"' || c === "'" || c === "`") {
38
+ const quote = c;
39
+ let j = i + 1;
40
+ while (j < n) {
41
+ if (code[j] === "\\") {
42
+ j += 2;
43
+ continue;
44
+ }
45
+ if (code[j] === quote) {
46
+ j++;
47
+ break;
48
+ }
49
+ j++;
50
+ }
51
+ out += wrap("cd-s", code.slice(i, j));
52
+ i = j;
53
+ continue;
54
+ }
55
+ if (isDigit(c)) {
56
+ let j = i;
57
+ while (j < n && (isDigit(code[j]) || code[j] === ".")) j++;
58
+ out += wrap("cd-n", code.slice(i, j));
59
+ i = j;
60
+ continue;
61
+ }
62
+ if (isIdStart(c)) {
63
+ let j = i;
64
+ while (j < n && isIdCont(code[j])) j++;
65
+ const word = code.slice(i, j);
66
+ let cls = "";
67
+ if (KEYWORDS.has(word)) cls = "cd-k";else if (/^[A-Z]/.test(word)) cls = "cd-p";else {
68
+ let k = j;
69
+ while (k < n && code[k] === " ") k++;
70
+ const next = code[k];
71
+ const prev = i > 0 ? code[i - 1] : "";
72
+ const assignment = next === "=" && code[k + 1] !== "=" && code[k + 1] !== ">";
73
+ const objectKey = next === ":";
74
+ const functionCall = next === "(";
75
+ const property = prev === ".";
76
+ if (assignment || objectKey) cls = "cd-a";else if (functionCall || property) cls = "cd-f";
77
+ }
78
+ out += cls ? wrap(cls, word) : escapeCodeHtml(word);
79
+ i = j;
80
+ continue;
81
+ }
82
+ out += escapeCodeHtml(c);
83
+ i++;
84
+ }
85
+ return out;
86
+ };
87
+ const highlightMarkdownLine = line => {
88
+ const escaped = escapeCodeHtml(line);
89
+ const heading = /^(#{1,6})(\s.*)$/.exec(escaped);
90
+ if (heading) return `<span class="cd-md-syntax">${heading[1]}</span>${highlightMarkdownInline(heading[2] ?? "")}`;
91
+ const ref = /^(@[A-Za-z][\w-]*)$/.exec(escaped);
92
+ if (ref) return `<span class="cd-md-ref">${ref[1]}</span>`;
93
+ const directive = /^(\s*:::)([A-Za-z][\w-]*)?(.*)$/.exec(escaped);
94
+ if (directive) {
95
+ const name = directive[2] ? `<span class="cd-md-directive">${directive[2]}</span>` : "";
96
+ return `${directive[1] ? `<span class="cd-md-syntax">${directive[1]}</span>` : ""}${name}${highlightMarkdownInline(directive[3] ?? "")}`;
97
+ }
98
+ const fence = /^(```)(.*)$/.exec(escaped);
99
+ if (fence) {
100
+ const language = fence[2] ? `<span class="cd-md-ref">${fence[2]}</span>` : "";
101
+ return `<span class="cd-md-syntax">${fence[1]}</span>${language}`;
102
+ }
103
+ const table = /^(\s*\|)(.*)(\|\s*)$/.exec(escaped);
104
+ if (table) return `<span class="cd-md-syntax">${table[1]}</span>${table[2]}<span class="cd-md-syntax">${table[3]}</span>`;
105
+ const task = /^(\s*(?:[-*+]|\d+\.)\s+)(\[[ xX]\])(\s+.*)$/.exec(escaped);
106
+ if (task) {
107
+ return `<span class="cd-md-syntax">${task[1]}</span><span class="cd-md-checkbox">${task[2]}</span>${highlightMarkdownInline(task[3] ?? "")}`;
108
+ }
109
+ const list = /^(\s*(?:[-*+]|\d+\.)\s+)(.*)$/.exec(escaped);
110
+ if (list) return `<span class="cd-md-syntax">${list[1]}</span>${highlightMarkdownInline(list[2] ?? "")}`;
111
+ return highlightMarkdownInline(escaped);
112
+ };
113
+ const highlightMarkdownInline = escaped => escaped.replace(/(`)([^`\n]+?)(`)/g, '<span class="cd-md-syntax">$1</span><span class="cd-md-code">$2</span><span class="cd-md-syntax">$3</span>').replace(/(\*\*)([^*\n]+?)(\*\*)/g, '<span class="cd-md-syntax">$1</span>$2<span class="cd-md-syntax">$3</span>').replace(/(\[[^\]\n]+?\])(\([^)]+\))/g, '<span class="cd-md-link">$1</span><span class="cd-md-syntax">$2</span>').replace(/(^|\s)(@[A-Za-z][\w-]*)/g, '$1<span class="cd-md-ref">$2</span>').replace(/(#[A-Za-z][\w/-]*)/g, '<span class="cd-md-tag">$1</span>').replace(/(=[A-Z][A-Z0-9_]*\([^)\n]*\))/g, '<span class="cd-md-formula">$1</span>');
114
+ export const highlightMarkdownDisplay = code => code.split("\n").map(highlightMarkdownLine).join("\n");
115
+ export const highlightCodeDisplayLines = (code, language = "text") => {
116
+ const lines = code.split("\n");
117
+ if (language === "text") return lines.map(line => escapeCodeHtml(line || " "));
118
+ if (language === "markdown" || language === "md") {
119
+ let fencedLanguage;
120
+ return lines.map(line => {
121
+ const fence = /^(```)(\w+)?(.*)$/.exec(line);
122
+ if (fence) {
123
+ const highlightedFence = highlightMarkdownLine(line);
124
+ fencedLanguage = fencedLanguage ? undefined : fence[2];
125
+ return highlightedFence;
126
+ }
127
+ return isCodeLanguage(fencedLanguage) ? highlightCode(line || " ") : highlightMarkdownLine(line || " ");
128
+ });
129
+ }
130
+ if (lines.length >= 2 && /^```\w+/.test(lines[0] ?? "") && /^```\s*$/.test(lines[lines.length - 1] ?? "")) {
131
+ return lines.map((line, index) => {
132
+ if (index === 0 || index === lines.length - 1) return highlightMarkdownLine(line || " ");
133
+ return highlightCode(line || " ");
134
+ });
135
+ }
136
+ return lines.map(line => highlightCode(line || " "));
137
+ };
138
+ export const highlightCodeDisplay = (code, language = "text") => {
139
+ if (code.includes("\n")) return highlightCodeDisplayLines(code, language).join("\n");
140
+ if (language === "markdown" || language === "md") return highlightMarkdownDisplay(code);
141
+ if (language === "text") return escapeCodeHtml(code);
142
+ return highlightCode(code);
143
+ };
144
+ //# sourceMappingURL=code-highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["KEYWORDS","Set","escapeCodeHtml","s","replace","isIdStart","c","test","isIdCont","isDigit","wrap","cls","raw","isCodeLanguage","language","highlightCode","code","out","i","n","length","nl","indexOf","end","slice","close","quote","j","word","has","k","next","prev","assignment","objectKey","functionCall","property","highlightMarkdownLine","line","escaped","heading","exec","highlightMarkdownInline","ref","directive","name","fence","table","task","list","highlightMarkdownDisplay","split","map","join","highlightCodeDisplayLines","lines","fencedLanguage","highlightedFence","undefined","index","highlightCodeDisplay","includes"],"sources":["content/code-highlight.ts"],"sourcesContent":["/**\n * Small safe highlighters for CodeDisplay.\n *\n * These are display-only highlighters: no AST, no runtime parser, no\n * dependency. Every input character is HTML-escaped before being wrapped\n * in token spans, so the returned strings are safe to inject with\n * `innerHTML`.\n */\n\nconst KEYWORDS = new Set([\n \"const\",\n \"let\",\n \"var\",\n \"function\",\n \"return\",\n \"if\",\n \"else\",\n \"for\",\n \"while\",\n \"import\",\n \"from\",\n \"export\",\n \"default\",\n \"async\",\n \"await\",\n \"new\",\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"as\",\n \"type\",\n \"interface\",\n \"void\",\n \"this\",\n \"typeof\",\n \"in\",\n \"of\",\n]);\n\nexport type CodeDisplayLanguage = \"ts\" | \"tsx\" | \"js\" | \"jsx\" | \"script\" | \"markdown\" | \"md\" | \"text\";\n\nexport const escapeCodeHtml = (s: string): string => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nconst isIdStart = (c: string): boolean => /[A-Za-z_$]/.test(c);\nconst isIdCont = (c: string): boolean => /[\\w$]/.test(c);\nconst isDigit = (c: string): boolean => /[0-9]/.test(c);\nconst wrap = (cls: string, raw: string): string => `<span class=\"${cls}\">${escapeCodeHtml(raw)}</span>`;\nconst isCodeLanguage = (language: string | undefined): boolean =>\n language === \"script\" || language === \"js\" || language === \"jsx\" || language === \"ts\" || language === \"tsx\";\n\nexport const highlightCode = (code: string): string => {\n let out = \"\";\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n const c = code[i]!;\n\n if (c === \"/\" && code[i + 1] === \"/\") {\n const nl = code.indexOf(\"\\n\", i);\n const end = nl === -1 ? n : nl;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === \"/\" && code[i + 1] === \"*\") {\n const close = code.indexOf(\"*/\", i + 2);\n const end = close === -1 ? n : close + 2;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === '\"' || c === \"'\" || c === \"`\") {\n const quote = c;\n let j = i + 1;\n while (j < n) {\n if (code[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (code[j] === quote) {\n j++;\n break;\n }\n j++;\n }\n out += wrap(\"cd-s\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isDigit(c)) {\n let j = i;\n while (j < n && (isDigit(code[j]!) || code[j] === \".\")) j++;\n out += wrap(\"cd-n\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isIdStart(c)) {\n let j = i;\n while (j < n && isIdCont(code[j]!)) j++;\n const word = code.slice(i, j);\n let cls = \"\";\n if (KEYWORDS.has(word)) cls = \"cd-k\";\n else if (/^[A-Z]/.test(word)) cls = \"cd-p\";\n else {\n let k = j;\n while (k < n && code[k] === \" \") k++;\n const next = code[k];\n const prev = i > 0 ? code[i - 1] : \"\";\n const assignment = next === \"=\" && code[k + 1] !== \"=\" && code[k + 1] !== \">\";\n const objectKey = next === \":\";\n const functionCall = next === \"(\";\n const property = prev === \".\";\n if (assignment || objectKey) cls = \"cd-a\";\n else if (functionCall || property) cls = \"cd-f\";\n }\n out += cls ? wrap(cls, word) : escapeCodeHtml(word);\n i = j;\n continue;\n }\n\n out += escapeCodeHtml(c);\n i++;\n }\n\n return out;\n};\n\nconst highlightMarkdownLine = (line: string): string => {\n const escaped = escapeCodeHtml(line);\n\n const heading = /^(#{1,6})(\\s.*)$/.exec(escaped);\n if (heading) return `<span class=\"cd-md-syntax\">${heading[1]}</span>${highlightMarkdownInline(heading[2] ?? \"\")}`;\n\n const ref = /^(@[A-Za-z][\\w-]*)$/.exec(escaped);\n if (ref) return `<span class=\"cd-md-ref\">${ref[1]}</span>`;\n\n const directive = /^(\\s*:::)([A-Za-z][\\w-]*)?(.*)$/.exec(escaped);\n if (directive) {\n const name = directive[2] ? `<span class=\"cd-md-directive\">${directive[2]}</span>` : \"\";\n return `${directive[1] ? `<span class=\"cd-md-syntax\">${directive[1]}</span>` : \"\"}${name}${highlightMarkdownInline(directive[3] ?? \"\")}`;\n }\n\n const fence = /^(```)(.*)$/.exec(escaped);\n if (fence) {\n const language = fence[2] ? `<span class=\"cd-md-ref\">${fence[2]}</span>` : \"\";\n return `<span class=\"cd-md-syntax\">${fence[1]}</span>${language}`;\n }\n\n const table = /^(\\s*\\|)(.*)(\\|\\s*)$/.exec(escaped);\n if (table) return `<span class=\"cd-md-syntax\">${table[1]}</span>${table[2]}<span class=\"cd-md-syntax\">${table[3]}</span>`;\n\n const task = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(\\[[ xX]\\])(\\s+.*)$/.exec(escaped);\n if (task) {\n return `<span class=\"cd-md-syntax\">${task[1]}</span><span class=\"cd-md-checkbox\">${task[2]}</span>${highlightMarkdownInline(task[3] ?? \"\")}`;\n }\n\n const list = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(.*)$/.exec(escaped);\n if (list) return `<span class=\"cd-md-syntax\">${list[1]}</span>${highlightMarkdownInline(list[2] ?? \"\")}`;\n\n return highlightMarkdownInline(escaped);\n};\n\nconst highlightMarkdownInline = (escaped: string): string =>\n escaped\n .replace(\n /(`)([^`\\n]+?)(`)/g,\n '<span class=\"cd-md-syntax\">$1</span><span class=\"cd-md-code\">$2</span><span class=\"cd-md-syntax\">$3</span>',\n )\n .replace(/(\\*\\*)([^*\\n]+?)(\\*\\*)/g, '<span class=\"cd-md-syntax\">$1</span>$2<span class=\"cd-md-syntax\">$3</span>')\n .replace(/(\\[[^\\]\\n]+?\\])(\\([^)]+\\))/g, '<span class=\"cd-md-link\">$1</span><span class=\"cd-md-syntax\">$2</span>')\n .replace(/(^|\\s)(@[A-Za-z][\\w-]*)/g, '$1<span class=\"cd-md-ref\">$2</span>')\n .replace(/(#[A-Za-z][\\w/-]*)/g, '<span class=\"cd-md-tag\">$1</span>')\n .replace(/(=[A-Z][A-Z0-9_]*\\([^)\\n]*\\))/g, '<span class=\"cd-md-formula\">$1</span>');\n\nexport const highlightMarkdownDisplay = (code: string): string => code.split(\"\\n\").map(highlightMarkdownLine).join(\"\\n\");\n\nexport const highlightCodeDisplayLines = (code: string, language: CodeDisplayLanguage = \"text\"): string[] => {\n const lines = code.split(\"\\n\");\n\n if (language === \"text\") return lines.map((line) => escapeCodeHtml(line || \" \"));\n\n if (language === \"markdown\" || language === \"md\") {\n let fencedLanguage: string | undefined;\n return lines.map((line) => {\n const fence = /^(```)(\\w+)?(.*)$/.exec(line);\n if (fence) {\n const highlightedFence = highlightMarkdownLine(line);\n fencedLanguage = fencedLanguage ? undefined : fence[2];\n return highlightedFence;\n }\n return isCodeLanguage(fencedLanguage) ? highlightCode(line || \" \") : highlightMarkdownLine(line || \" \");\n });\n }\n\n if (lines.length >= 2 && /^```\\w+/.test(lines[0] ?? \"\") && /^```\\s*$/.test(lines[lines.length - 1] ?? \"\")) {\n return lines.map((line, index) => {\n if (index === 0 || index === lines.length - 1) return highlightMarkdownLine(line || \" \");\n return highlightCode(line || \" \");\n });\n }\n\n return lines.map((line) => highlightCode(line || \" \"));\n};\n\nexport const highlightCodeDisplay = (code: string, language: CodeDisplayLanguage = \"text\"): string => {\n if (code.includes(\"\\n\")) return highlightCodeDisplayLines(code, language).join(\"\\n\");\n if (language === \"markdown\" || language === \"md\") return highlightMarkdownDisplay(code);\n if (language === \"text\") return escapeCodeHtml(code);\n return highlightCode(code);\n};\n"],"mappings":"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","ignoreList":[]}