@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,1542 @@
1
+ import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
2
+ import { ssrElement as _$ssrElement } from "solid-js/web";
3
+ import { mergeProps as _$mergeProps } from "solid-js/web";
4
+ import { ssrStyle as _$ssrStyle } from "solid-js/web";
5
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
+ import { createComponent as _$createComponent } from "solid-js/web";
7
+ import { ssr as _$ssr } from "solid-js/web";
8
+ import { escape as _$escape } from "solid-js/web";
9
+ var _tmpl$ = ["<span class=\"k2b-calendar-event__title\">", "</span>"],
10
+ _tmpl$2 = ["<span class=\"k2b-calendar-event__meta\">", "</span>"],
11
+ _tmpl$3 = ["<span class=\"k2b-calendar-event__description\">", "</span>"],
12
+ _tmpl$4 = ["<a", " class=\"k2b-calendar-event\" data-calendar-event", " style=\"", "\"", " aria-label=\"", "\">", "</a>"],
13
+ _tmpl$5 = ["<button type=\"button\" class=\"k2b-calendar-event\" data-calendar-event", " data-interactive=\"true\"", " style=\"", "\" aria-label=\"", "\">", "</button>"],
14
+ _tmpl$6 = ["<div class=\"k2b-calendar-event\" role=\"group\" data-calendar-event", " style=\"", "\" aria-label=\"", "\">", "</div>"],
15
+ _tmpl$7 = ["<div role=\"radiogroup\"", " aria-orientation=\"horizontal\" class=\"k2b-segmented-control k2b-calendar-view-switcher\">", "</div>"],
16
+ _tmpl$8 = ["<i class=\"", "\"></i>"],
17
+ _tmpl$9 = ["<button type=\"button\"", " class=\"k2b-calendar-header__nav-button\"><i class=\"", "\"></i></button>"],
18
+ _tmpl$0 = ["<span class=\"k2b-button__label\">", "</span>"],
19
+ _tmpl$1 = "<span class=\"k2b-calendar-header__progress\" aria-hidden=\"true\"></span>",
20
+ _tmpl$10 = ["<header class=\"k2b-calendar-header\"><div class=\"k2b-calendar-header__navigation\">", "", "<div class=\"k2b-calendar-header__title\">", "</div></div><div class=\"k2b-calendar-header__actions\">", "", "", "</div>", "</header>"],
21
+ _tmpl$11 = ["<div class=\"k2b-calendar-month__weekday\">", "</div>"],
22
+ _tmpl$12 = ["<div class=\"k2b-calendar-month\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\"", ">", "", "</div>", "</div>"],
23
+ _tmpl$13 = ["<div class=\"k2b-calendar-month__week-number\">", "</div>"],
24
+ _tmpl$14 = ["<div class=\"k2b-calendar-month__week\"", ">", "", "</div>"],
25
+ _tmpl$15 = ["<div class=\"k2b-calendar-preview\">", "</div>"],
26
+ _tmpl$16 = ["<div class=\"k2b-calendar-month__day\"", ">", "<div class=\"k2b-calendar-month__day-header\">", "", "</div><div class=\"k2b-calendar-month__events\">", "", "", "</div><div class=\"k2b-calendar-month__dots\">", "</div></div>"],
27
+ _tmpl$17 = ["<span class=\"k2b-calendar-month__day-number\"", ">", "</span>"],
28
+ _tmpl$18 = ["<span class=\"k2b-calendar-month__badge\">", "", "</span>"],
29
+ _tmpl$19 = ["<span class=\"k2b-calendar-dot\"", " style=\"", "\"></span>"],
30
+ _tmpl$20 = ["<div class=\"k2b-calendar-time-grid__all-day\" style=\"", "\"><div class=\"k2b-calendar-time-grid__all-day-label\">", "</div>", "</div>"],
31
+ _tmpl$21 = ["<div class=\"k2b-calendar-time-grid\"><div class=\"k2b-calendar-time-grid__days\" style=\"", "\"><div></div>", "</div>", "<div class=\"k2b-calendar-time-grid__scroll\"><div class=\"k2b-calendar-time-grid__grid\" style=\"", "\"><div class=\"k2b-calendar-time-grid__gutter\" style=\"", "\">", "</div>", "</div></div></div>"],
32
+ _tmpl$22 = ["<span class=\"k2b-calendar-time-grid__day-label\"", ">", "</span>"],
33
+ _tmpl$23 = ["<span class=\"k2b-calendar-time-grid__badge\">", "", "</span>"],
34
+ _tmpl$24 = ["<div class=\"k2b-calendar-time-grid__all-day-events\">", "", "</div>"],
35
+ _tmpl$25 = ["<div class=\"k2b-calendar-time-grid__hour\"", ">", ":00</div>"],
36
+ _tmpl$26 = ["<div class=\"k2b-calendar-time-grid__now\" style=\"", "\"></div>"],
37
+ _tmpl$27 = ["<div class=\"k2b-calendar-time-grid__column\" style=\"", "\">", "", "", "", "", "</div>"],
38
+ _tmpl$28 = ["<div class=\"k2b-calendar-preview__title\">", "</div>"],
39
+ _tmpl$29 = ["<div class=\"k2b-calendar-preview k2b-calendar-preview--timed\"", " style=\"", "\"><div class=\"k2b-calendar-preview__content\">", "<div class=\"k2b-calendar-preview__label\">", " - ", "</div></div></div>"],
40
+ _tmpl$30 = ["<button type=\"button\"", " draggable=\"false\" class=\"k2b-calendar-time-grid__resize\"><span class=\"k2b-calendar-time-grid__resize-icon\" aria-hidden=\"true\"></span></button>"],
41
+ _tmpl$31 = ["<div class=\"k2b-calendar-time-grid__event-position\" style=\"", "\"><div class=\"k2b-calendar-time-grid__event-frame\">", "", "</div></div>"],
42
+ _tmpl$32 = ["<button type=\"button\" class=\"k2b-calendar-time-grid__overflow\" style=\"", "\"", "><span class=\"k2b-calendar-time-grid__overflow-count\">+", "</span></button>"],
43
+ _tmpl$33 = ["<div class=\"k2b-calendar-time-grid__overflow-menu\" style=\"", "\"><div class=\"k2b-calendar-time-grid__overflow-title\">", " - ", "</div>", "</div>"],
44
+ _tmpl$34 = ["<div class=\"k2b-calendar-year\">", "</div>"],
45
+ _tmpl$35 = ["<div class=\"k2b-calendar-year__month\"><div class=\"k2b-calendar-year__title\">", "</div><div class=\"k2b-calendar-year__grid\">", "</div></div>"],
46
+ _tmpl$36 = ["<span class=\"k2b-calendar-year__indicator\"", " style=\"", "\"></span>"],
47
+ _tmpl$37 = ["<div class=\"k2b-calendar-mobile-month__events\">", "</div>"],
48
+ _tmpl$38 = ["<div class=\"k2b-calendar-mobile-month\">", "<div class=\"k2b-calendar-mobile-month__agenda\"><div class=\"k2b-calendar-mobile-month__title\">", "</div>", "</div></div>"],
49
+ _tmpl$39 = ["<div class=\"k2b-calendar-mobile-month__empty\">", "</div>"],
50
+ _tmpl$40 = ["<div class=\"k2b-calendar-body\">", "</div>"],
51
+ _tmpl$41 = ["<section class=\"", "\"", ">", "", "", "</section>"];
52
+ import { Link } from "@k2b/ssr/nav";
53
+ import { dates as calendar } from "@k2b/stdlib";
54
+ import { createMemo, createSignal, For, mergeProps, onCleanup, onMount, Show } from "solid-js";
55
+ import { Button } from "../actions/Button";
56
+ import SegmentedControl from "../actions/SegmentedControl";
57
+ import { useDateConfigLocale } from "../intl/locale";
58
+ import { useUiMessages } from "../intl/messages";
59
+ import { layoutCalendarIntervals } from "./calendar-event-layout";
60
+ import { calendarDayIndexAtPoint, calendarMinuteAtPoint, startCalendarPointerSession } from "./calendar-pointer";
61
+ const ownerDateConfig = owner => ({
62
+ ...owner.dateConfig,
63
+ timeZone: owner.timeZone ?? owner.dateConfig?.timeZone,
64
+ firstDayOfWeek: owner.firstDayOfWeek ?? owner.dateConfig?.firstDayOfWeek ?? owner.dateConfig?.weekStartsOn ?? 1
65
+ });
66
+ const dateOnlyPattern = /^\d{4}-\d{2}-\d{2}$/;
67
+ const parseDate = (value, context) => {
68
+ if (value instanceof Date) return new Date(value);
69
+ if (dateOnlyPattern.test(value)) return calendar.parseCalendarDate(value, context);
70
+ const normalized = value.includes("T") ? value : value.replace(" ", "T");
71
+ const parsed = new Date(normalized);
72
+ if (!Number.isNaN(parsed.getTime())) return parsed;
73
+ const [year, month = "1", day = "1"] = value.split("-");
74
+ return new Date(Number(year), Number(month) - 1, Number(day), 12);
75
+ };
76
+ const validDate = value => !Number.isNaN(value.getTime());
77
+ const weekNumber = date => {
78
+ const target = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
79
+ const day = target.getUTCDay() || 7;
80
+ target.setUTCDate(target.getUTCDate() + 4 - day);
81
+ const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));
82
+ return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
83
+ };
84
+ const zonedWeekNumber = (date, context) => {
85
+ if (!context?.timeZone) return weekNumber(date);
86
+ const [year = "1970", month = "1", day = "1"] = calendar.formatDateKey(date, context).split("-");
87
+ return weekNumber(new Date(Date.UTC(Number(year), Number(month) - 1, Number(day))));
88
+ };
89
+ const formatTime = (date, context) => calendar.formatTime(date, context);
90
+ const formatDay = (date, context) => date.toLocaleDateString(context?.locale ?? "en", {
91
+ weekday: "short",
92
+ day: "numeric",
93
+ timeZone: context?.timeZone
94
+ });
95
+ const formatMonth = (date, context) => calendar.formatMonthYear(date, context);
96
+ const zonedYearMonth = (date, context) => {
97
+ const [year = "1970", month = "1"] = calendar.formatDateKey(date, context).split("-");
98
+ return {
99
+ year: Number(year),
100
+ month: Number(month) - 1
101
+ };
102
+ };
103
+ const zonedMonthDate = (year, month, context) => {
104
+ const value = `${year}-${String(month + 1).padStart(2, "0")}-01T12:00`;
105
+ if (!context?.timeZone) return parseDate(value);
106
+ return new Date(calendar.zonedDateTimeToInstant(value, context.timeZone, {
107
+ disambiguation: "compatible"
108
+ }));
109
+ };
110
+ const startOfDay = (date, context) => calendar.startOfDay(date, context);
111
+ const endOfDay = (date, context) => calendar.endOfDay(date, context);
112
+ const isStartOfDay = (date, context) => date.getTime() === startOfDay(date, context).getTime();
113
+ const addMinutes = (date, minutes) => new Date(date.getTime() + minutes * 60 * 1000);
114
+ const zonedHour = (date, context) => {
115
+ if (!context?.timeZone) return date.getHours() + date.getMinutes() / 60;
116
+ const value = calendar.instantToZonedInput(date, context.timeZone);
117
+ return Number(value.slice(11, 13)) + Number(value.slice(14, 16)) / 60;
118
+ };
119
+ const zonedSlot = (day, hour, context) => {
120
+ return zonedMinuteSlot(day, hour * 60, context);
121
+ };
122
+ const zonedMinuteSlot = (day, minuteOfDay, context) => {
123
+ const bounded = Math.max(0, Math.min(23 * 60 + 59, minuteOfDay));
124
+ const hour = Math.floor(bounded / 60);
125
+ const minute = bounded % 60;
126
+ const value = `${calendar.formatDateKey(day, context)}T${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
127
+ if (!context?.timeZone) return parseDate(value);
128
+ return new Date(calendar.zonedDateTimeToInstant(value, context.timeZone, {
129
+ disambiguation: "compatible"
130
+ }));
131
+ };
132
+ const normalizeEvents = (events, context) => events.flatMap(event => {
133
+ const startDate = parseDate(event.start, context);
134
+ if (!validDate(startDate)) return [];
135
+ const parsedEnd = event.end ? parseDate(event.end, context) : null;
136
+ const endDate = parsedEnd && validDate(parsedEnd) ? parsedEnd : new Date(startDate.getTime() + 60 * 60 * 1000);
137
+ const duration = Math.max(60 * 60 * 1000, endDate.getTime() - startDate.getTime());
138
+ const rangeEnd = endDate > startDate ? endDate : new Date(startDate.getTime() + duration);
139
+ const startKey = calendar.formatDateKey(startDate, context);
140
+ const endKey = calendar.formatDateKey(rangeEnd, context);
141
+ if (!event.allDay && startKey === endKey) {
142
+ return [{
143
+ ...event,
144
+ startDate,
145
+ endDate: rangeEnd,
146
+ sourceStartDate: startDate,
147
+ sourceEndDate: rangeEnd,
148
+ dayKey: startKey
149
+ }];
150
+ }
151
+ const lastDay = event.allDay && isStartOfDay(rangeEnd, context) ? calendar.addDays(startOfDay(rangeEnd, context), -1, context) : startOfDay(rangeEnd, context);
152
+ const days = [];
153
+ for (let day = startOfDay(startDate, context); day <= lastDay; day = calendar.addDays(day, 1, context)) {
154
+ const segmentStart = day.getTime() === startOfDay(startDate, context).getTime() ? startDate : startOfDay(day, context);
155
+ const segmentEnd = day.getTime() === startOfDay(rangeEnd, context).getTime() ? rangeEnd : endOfDay(day, context);
156
+ days.push({
157
+ ...event,
158
+ startDate: segmentStart,
159
+ endDate: segmentEnd,
160
+ sourceStartDate: startDate,
161
+ sourceEndDate: rangeEnd,
162
+ dayKey: calendar.formatDateKey(day, context),
163
+ allDay: event.allDay
164
+ });
165
+ }
166
+ return days;
167
+ });
168
+ const eventHref = (props, event) => props.getEventHref?.(event) ?? event.href;
169
+ const moveEventTo = (event, target, allDay = false, context) => {
170
+ const duration = Math.max(30 * 60 * 1000, event.sourceEndDate.getTime() - event.sourceStartDate.getTime());
171
+ const start = allDay ? startOfDay(target, context) : new Date(target);
172
+ start.setSeconds(0, 0);
173
+ return {
174
+ start,
175
+ end: new Date(start.getTime() + duration),
176
+ allDay
177
+ };
178
+ };
179
+ const moveEventToDay = (event, day, context) => {
180
+ if (event.allDay) return moveEventTo(event, startOfDay(day, context), true, context);
181
+ const localStart = context?.timeZone ? calendar.instantToZonedInput(event.sourceStartDate, context.timeZone) : null;
182
+ const hour = localStart ? Number(localStart.slice(11, 13)) : event.sourceStartDate.getHours();
183
+ const minute = localStart ? Number(localStart.slice(14, 16)) : event.sourceStartDate.getMinutes();
184
+ return moveEventTo(event, zonedMinuteSlot(day, hour * 60 + minute, context), false, context);
185
+ };
186
+ const eventTimeChanged = (event, next) => event.sourceStartDate.getTime() !== next.start.getTime() || event.sourceEndDate.getTime() !== next.end.getTime() || Boolean(event.allDay) !== Boolean(next.allDay);
187
+ const previewSegments = (preview, days, context) => preview ? normalizeEvents([{
188
+ id: `preview-${preview.id}`,
189
+ title: preview.title ?? "",
190
+ start: preview.start,
191
+ end: preview.end,
192
+ allDay: preview.allDay,
193
+ color: "blue"
194
+ }], context).filter(event => days.some(day => event.dayKey === calendar.formatDateKey(day, context))) : [];
195
+ const timedEventLayouts = events => {
196
+ return layoutCalendarIntervals(events, event => ({
197
+ start: event.startDate.getTime(),
198
+ end: event.endDate.getTime()
199
+ })).map(({
200
+ item: event,
201
+ lane,
202
+ lanes,
203
+ groupId,
204
+ groupStart,
205
+ groupEnd
206
+ }) => ({
207
+ event,
208
+ lane,
209
+ lanes,
210
+ groupId,
211
+ groupStartDate: new Date(groupStart),
212
+ groupEndDate: new Date(groupEnd)
213
+ }));
214
+ };
215
+ const EventChip = props => {
216
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
217
+ const color = () => props.event.color ?? "blue";
218
+ const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;
219
+ const style = () => props.event.colorHex ? {
220
+ "--k2b-calendar-accent": props.event.colorHex
221
+ } : undefined;
222
+ const isInteractive = () => Boolean(props.owner.onEventActivate);
223
+ const durationHours = () => (props.event.endDate.getTime() - props.event.startDate.getTime()) / 3_600_000;
224
+ const short = () => Boolean(props.fill && !props.event.allDay && durationHours() < 0.75);
225
+ const showTime = () => !props.event.allDay && !props.compact && durationHours() >= 0.75;
226
+ const showLocation = () => Boolean(props.event.location && !props.compact && durationHours() >= 1.25);
227
+ const showDescription = () => Boolean(props.event.description?.trim() && props.fill && !props.event.allDay && !props.compact && durationHours() >= 1.5);
228
+ const timeLabel = () => `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;
229
+ const renderedEvent = () => props.owner.renderEvent?.(props.event, {
230
+ compact: props.compact ?? false,
231
+ fill: props.fill ?? false,
232
+ start: props.event.startDate,
233
+ end: props.event.endDate,
234
+ allDay: props.event.allDay ?? false,
235
+ durationHours: durationHours(),
236
+ timeLabel: timeLabel()
237
+ });
238
+ const defaultContent = [_$ssr(_tmpl$, _$escape(props.event.title)), _$createComponent(Show, {
239
+ get when() {
240
+ return showTime();
241
+ },
242
+ get children() {
243
+ return _$ssr(_tmpl$2, _$escape(timeLabel()));
244
+ }
245
+ }), _$createComponent(Show, {
246
+ get when() {
247
+ return showLocation();
248
+ },
249
+ get children() {
250
+ return _$ssr(_tmpl$2, _$escape(props.event.location));
251
+ }
252
+ }), _$createComponent(Show, {
253
+ get when() {
254
+ return showDescription();
255
+ },
256
+ get children() {
257
+ return _$ssr(_tmpl$3, _$escape(props.event.description));
258
+ }
259
+ })];
260
+ const content = () => renderedEvent() ?? defaultContent;
261
+ const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);
262
+ let suppressClickUntil = 0;
263
+ const onClick = event => {
264
+ if (performance.now() < suppressClickUntil) {
265
+ event.preventDefault();
266
+ event.stopPropagation();
267
+ return;
268
+ }
269
+ if (!props.owner.onEventActivate || props.owner.eventActivation === "double") return;
270
+ event.preventDefault();
271
+ event.stopPropagation();
272
+ props.owner.onEventActivate(props.event);
273
+ };
274
+ const onDoubleClick = event => {
275
+ if (!props.owner.onEventActivate || props.owner.eventActivation !== "double") return;
276
+ event.preventDefault();
277
+ event.stopPropagation();
278
+ props.owner.onEventActivate(props.event);
279
+ };
280
+ const onButtonKeyDown = event => {
281
+ if (!isInteractive() || event.key !== "Enter" && event.key !== " ") return;
282
+ event.preventDefault();
283
+ props.owner.onEventActivate?.(props.event);
284
+ };
285
+ const onPointerDown = event => {
286
+ if (event.pointerType === "touch") return;
287
+ if (props.onMovePointerDown) event.stopPropagation();
288
+ props.onMovePointerDown?.(event, () => {
289
+ suppressClickUntil = performance.now() + 400;
290
+ });
291
+ };
292
+ return props.href ? _$ssr(_tmpl$4, _$ssrAttribute("href", _$escape(props.href, true), false), _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", isInteractive() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false) + _$ssrAttribute("data-space-item-id", _$escape(props.event.dataSpaceItemId, true), false), _$ssrStyle(style()), _$ssrAttribute("draggable", props.onMovePointerDown ? _$escape(false, true) : _$escape(undefined, true), false), `${_$escape(props.event.title, true)}${props.event.allDay ? "" : `, ${_$escape(formatTime(props.event.startDate, dateConfig()), true)} to ${_$escape(formatTime(props.event.endDate, dateConfig()), true)}`}`, _$escape(content())) : isActionable() ? _$ssr(_tmpl$5, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), `${_$escape(props.event.title, true)}${props.event.allDay ? "" : `, ${_$escape(formatTime(props.event.startDate, dateConfig()), true)} to ${_$escape(formatTime(props.event.endDate, dateConfig()), true)}`}`, _$escape(content())) : _$ssr(_tmpl$6, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), `${_$escape(props.event.title, true)}${props.event.allDay ? "" : `, ${_$escape(formatTime(props.event.startDate, dateConfig()), true)} to ${_$escape(formatTime(props.event.endDate, dateConfig()), true)}`}`, _$escape(content()));
293
+ };
294
+ const slotInteractionProps = (owner, slot, suppressed, nativeControl = false) => {
295
+ const isSlotChild = event => {
296
+ if (!(event.target instanceof Element)) return false;
297
+ const control = event.target.closest("a,button,[data-calendar-event]");
298
+ return Boolean(control && control !== event.currentTarget);
299
+ };
300
+ const interactive = Boolean(owner.onSlotActivate);
301
+ const activate = event => {
302
+ if (!owner.onSlotActivate || isSlotChild(event) || suppressed?.()) return;
303
+ event.preventDefault();
304
+ owner.onSlotActivate(slot());
305
+ };
306
+ return {
307
+ role: interactive && !nativeControl ? "button" : undefined,
308
+ tabIndex: interactive && !nativeControl ? 0 : undefined,
309
+ onClick: event => {
310
+ if (owner.slotActivation === "double") return;
311
+ activate(event);
312
+ },
313
+ onDblClick: event => {
314
+ if (owner.slotActivation !== "double") return;
315
+ activate(event);
316
+ },
317
+ onKeyDown: nativeControl ? undefined : event => {
318
+ if (event.key === "Enter" || event.key === " ") activate(event);
319
+ }
320
+ };
321
+ };
322
+ /** A real anchor is the baseline; the optional handler only enhances it after hydration. */
323
+ const CalendarNavigationLink = props => {
324
+ const preload = () => props.owner.onPrefetch?.(props.href);
325
+ const navigateHref = event => {
326
+ const anchor = event.currentTarget;
327
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || anchor.target && anchor.target !== "_self" || anchor.hasAttribute("download") || new URL(anchor.href).origin !== window.location.origin) {
328
+ return;
329
+ }
330
+ event.preventDefault();
331
+ props.owner.onNavigateHref?.(props.href);
332
+ };
333
+ return props.owner.onNavigateHref ? _$ssrElement("a", _$mergeProps(() => props.anchorProps, {
334
+ get href() {
335
+ return props.href;
336
+ }
337
+ }), _$escape(props.children), false) : props.owner.onNavigate ? _$createComponent(Link, _$mergeProps(() => props.anchorProps, {
338
+ get href() {
339
+ return props.href;
340
+ },
341
+ scroll: "preserve",
342
+ get onNavigate() {
343
+ return props.owner.onNavigate;
344
+ },
345
+ onPointerEnter: preload,
346
+ onFocus: preload,
347
+ get children() {
348
+ return props.children;
349
+ }
350
+ })) : _$ssrElement("a", _$mergeProps(() => props.anchorProps, {
351
+ get href() {
352
+ return props.href;
353
+ }
354
+ }), _$escape(props.children), false);
355
+ };
356
+ const CalendarViewLinks = props => {
357
+ const messages = useUiMessages();
358
+ const refs = [];
359
+ const selectRelative = (currentIndex, direction) => {
360
+ if (props.options.length === 0) return;
361
+ refs[(currentIndex + direction + props.options.length) % props.options.length]?.click();
362
+ };
363
+ const onKeyDown = (event, index) => {
364
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
365
+ event.preventDefault();
366
+ selectRelative(index, 1);
367
+ } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
368
+ event.preventDefault();
369
+ selectRelative(index, -1);
370
+ } else if (event.key === "Home" || event.key === "End") {
371
+ event.preventDefault();
372
+ refs[event.key === "Home" ? 0 : props.options.length - 1]?.click();
373
+ }
374
+ };
375
+ return _$ssr(_tmpl$7, _$ssrAttribute("aria-label", _$escape(messages().calendarView, true), false), _$escape(_$createComponent(For, {
376
+ get each() {
377
+ return props.options;
378
+ },
379
+ children: (option, index) => {
380
+ const active = () => (props.view === "mobile-month" ? "month" : props.view) === option.value;
381
+ const href = () => props.owner.getViewHref?.(option.value) ?? "#";
382
+ return _$createComponent(CalendarNavigationLink, {
383
+ get owner() {
384
+ return props.owner;
385
+ },
386
+ get href() {
387
+ return href();
388
+ },
389
+ get anchorProps() {
390
+ return {
391
+ ref: element => {
392
+ refs[index()] = element;
393
+ },
394
+ role: "radio",
395
+ "aria-checked": active(),
396
+ tabIndex: active() ? 0 : -1,
397
+ class: "k2b-segmented-control__option",
398
+ "data-divider": index() < props.options.length - 1 && !active() && (props.view === "mobile-month" ? "month" : props.view) !== props.options[index() + 1]?.value ? "true" : undefined,
399
+ onKeyDown: event => onKeyDown(event, index())
400
+ };
401
+ },
402
+ get children() {
403
+ return option.label;
404
+ }
405
+ });
406
+ }
407
+ })));
408
+ };
409
+ const adjacentCalendarDate = (date, view, direction, dateConfig) => {
410
+ if (view === "year") return calendar.addMonths(date, direction * 12, dateConfig);
411
+ if (view === "month" || view === "mobile-month") return calendar.addMonths(date, direction, dateConfig);
412
+ return calendar.addDays(date, direction * (view === "day" ? 1 : 7), dateConfig);
413
+ };
414
+ const CalendarHeader = props => {
415
+ const messages = useUiMessages();
416
+ const dateConfig = () => ownerDateConfig(props.owner);
417
+ const previous = () => adjacentCalendarDate(props.date, props.view, -1, dateConfig());
418
+ const next = () => adjacentCalendarDate(props.date, props.view, 1, dateConfig());
419
+ const title = () => {
420
+ if (props.view === "year") return new Intl.DateTimeFormat(dateConfig().locale ?? "en", {
421
+ year: "numeric",
422
+ timeZone: dateConfig().timeZone
423
+ }).format(props.date);
424
+ if (props.view === "day") return props.date.toLocaleDateString(dateConfig().locale ?? "en", {
425
+ weekday: "long",
426
+ month: "long",
427
+ day: "numeric",
428
+ year: "numeric",
429
+ timeZone: dateConfig().timeZone
430
+ });
431
+ if (props.view === "week") return `${formatDay(calendar.startOfWeek(props.date, dateConfig()), dateConfig())} - ${formatDay(calendar.addDays(calendar.startOfWeek(props.date, dateConfig()), 6, dateConfig()), dateConfig())}`;
432
+ return formatMonth(props.date, dateConfig());
433
+ };
434
+ const goDate = date => props.owner.onDateChange?.(date, props.view);
435
+ const goView = view => {
436
+ if (props.owner.onViewChange) {
437
+ props.owner.onViewChange(view);
438
+ return;
439
+ }
440
+ const href = props.owner.getViewHref?.(view);
441
+ if (href) window.location.href = href;
442
+ };
443
+ const navButton = (date, icon, label) => {
444
+ const href = props.owner.getDateHref?.(date, props.view);
445
+ return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
446
+ get owner() {
447
+ return props.owner;
448
+ },
449
+ href: href,
450
+ anchorProps: {
451
+ "aria-label": label,
452
+ title: label,
453
+ class: "k2b-calendar-header__nav-button"
454
+ },
455
+ get children() {
456
+ return _$ssr(_tmpl$8, `ti ${_$escape(icon, true)}`);
457
+ }
458
+ }) : props.owner.onDateChange ? _$ssr(_tmpl$9, _$ssrAttribute("aria-label", _$escape(label, true), false), `ti ${_$escape(icon, true)}`) : _$createComponent(CalendarNavigationLink, {
459
+ get owner() {
460
+ return props.owner;
461
+ },
462
+ href: href ?? "#",
463
+ anchorProps: {
464
+ "aria-label": label,
465
+ title: label,
466
+ class: "k2b-calendar-header__nav-button"
467
+ },
468
+ get children() {
469
+ return _$ssr(_tmpl$8, `ti ${_$escape(icon, true)}`);
470
+ }
471
+ });
472
+ };
473
+ const todayButton = () => {
474
+ const today = calendar.today(dateConfig());
475
+ const href = props.owner.getDateHref?.(today, props.view);
476
+ const label = _$ssr(_tmpl$0, _$escape(props.labels.today));
477
+ return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
478
+ get owner() {
479
+ return props.owner;
480
+ },
481
+ href: href,
482
+ anchorProps: {
483
+ class: "k2b-button k2b-calendar-header__today",
484
+ "data-size": "sm",
485
+ "data-variant": "input"
486
+ },
487
+ children: label
488
+ }) : props.owner.onDateChange ? _$createComponent(Button, {
489
+ type: "button",
490
+ variant: "input",
491
+ size: "sm",
492
+ "class": "k2b-calendar-header__today",
493
+ onClick: () => goDate(today),
494
+ get children() {
495
+ return props.labels.today;
496
+ }
497
+ }) : _$createComponent(CalendarNavigationLink, {
498
+ get owner() {
499
+ return props.owner;
500
+ },
501
+ href: href ?? "#",
502
+ anchorProps: {
503
+ class: "k2b-button k2b-calendar-header__today",
504
+ "data-size": "sm",
505
+ "data-variant": "input"
506
+ },
507
+ children: label
508
+ });
509
+ };
510
+ const viewOptions = createMemo(() => [{
511
+ value: "day",
512
+ label: props.labels.day
513
+ }, {
514
+ value: "week",
515
+ label: props.labels.week
516
+ }, {
517
+ value: "month",
518
+ label: props.labels.month
519
+ }, {
520
+ value: "year",
521
+ label: props.labels.year
522
+ }].filter(option => !props.owner.views || props.owner.views.includes(option.value)));
523
+ return _$ssr(_tmpl$10, _$escape(navButton(previous(), "ti-chevron-left", props.labels.previous)), _$escape(navButton(next(), "ti-chevron-right", props.labels.next)), _$escape(title()), _$escape(todayButton()), _$escape(_$createComponent(Show, {
524
+ get when() {
525
+ return !props.owner.onViewChange && props.owner.getViewHref;
526
+ },
527
+ get fallback() {
528
+ return _$createComponent(SegmentedControl, {
529
+ value: () => props.view === "mobile-month" ? "month" : props.view,
530
+ onValueChange: goView,
531
+ get ariaLabel() {
532
+ return messages().calendarView;
533
+ },
534
+ get options() {
535
+ return viewOptions();
536
+ }
537
+ });
538
+ },
539
+ get children() {
540
+ return _$createComponent(CalendarViewLinks, {
541
+ get owner() {
542
+ return props.owner;
543
+ },
544
+ get view() {
545
+ return props.view;
546
+ },
547
+ get options() {
548
+ return viewOptions();
549
+ }
550
+ });
551
+ }
552
+ })), _$escape(props.owner.toolbarActions), _$escape(_$createComponent(Show, {
553
+ get when() {
554
+ return props.owner.navigationPending;
555
+ },
556
+ get children() {
557
+ return _$ssr(_tmpl$1);
558
+ }
559
+ })));
560
+ };
561
+ const MonthView = props => {
562
+ const messages = useUiMessages();
563
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
564
+ const [movePreview, setMovePreview] = createSignal(null);
565
+ const [movingEventId, setMovingEventId] = createSignal("");
566
+ let cancelInteraction;
567
+ let suppressSlotClickUntil = 0;
568
+ const month = createMemo(() => zonedYearMonth(props.date, dateConfig()));
569
+ const weeks = createMemo(() => calendar.getMonthGrid(month().year, month().month, dateConfig()));
570
+ const weekdays = createMemo(() => calendar.weekdays(dateConfig()));
571
+ const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
572
+ const eventsByDay = createMemo(() => {
573
+ const grouped = new Map();
574
+ for (const event of props.events) {
575
+ const events = grouped.get(event.dayKey);
576
+ if (events) events.push(event);else grouped.set(event.dayKey, [event]);
577
+ }
578
+ return grouped;
579
+ });
580
+ const clearMove = () => {
581
+ setMovePreview(null);
582
+ setMovingEventId("");
583
+ };
584
+ const dayAtPoint = (clientX, clientY) => {
585
+ const target = document.elementFromPoint(clientX, clientY)?.closest("[data-calendar-day-key]");
586
+ const dayKey = target?.dataset.calendarDayKey;
587
+ return dayKey ? calendar.parseCalendarDate(dayKey, dateConfig()) : null;
588
+ };
589
+ const startMove = (pointerEvent, event, markDragged) => {
590
+ if (!props.owner.onEventDrop) return;
591
+ cancelInteraction?.();
592
+ cancelInteraction = startCalendarPointerSession({
593
+ event: pointerEvent,
594
+ resolve: (clientX, clientY) => {
595
+ const day = dayAtPoint(clientX, clientY);
596
+ return day ? {
597
+ id: event.id,
598
+ ...moveEventToDay(event, day, dateConfig())
599
+ } : null;
600
+ },
601
+ onActivate: () => {
602
+ markDragged();
603
+ suppressSlotClickUntil = performance.now() + 400;
604
+ setMovingEventId(event.id);
605
+ },
606
+ onPreview: setMovePreview,
607
+ onCommit: next => {
608
+ clearMove();
609
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
610
+ },
611
+ onCancel: clearMove
612
+ });
613
+ };
614
+ onCleanup(() => cancelInteraction?.());
615
+ return _$ssr(_tmpl$12, _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, minmax(5rem, 1fr))`), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
616
+ get when() {
617
+ return props.owner.withWeekNumbers;
618
+ },
619
+ get children() {
620
+ return _$ssr(_tmpl$11, _$escape(messages().weekShort));
621
+ }
622
+ })), _$escape(_$createComponent(For, {
623
+ get each() {
624
+ return weekdays();
625
+ },
626
+ children: day => _$ssr(_tmpl$11, _$escape(day))
627
+ })), _$escape(_$createComponent(For, {
628
+ get each() {
629
+ return weeks();
630
+ },
631
+ children: week => _$ssr(_tmpl$14, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
632
+ get when() {
633
+ return props.owner.withWeekNumbers;
634
+ },
635
+ get children() {
636
+ return _$ssr(_tmpl$13, _$escape(zonedWeekNumber(week[0], dateConfig())));
637
+ }
638
+ })), _$escape(_$createComponent(For, {
639
+ each: week,
640
+ children: day => {
641
+ const dayKey = calendar.formatDateKey(day, dateConfig());
642
+ const events = eventsByDay().get(dayKey) ?? [];
643
+ const href = props.owner.getDateHref?.(day, "day");
644
+ const dayBadge = props.owner.dayBadges?.[dayKey];
645
+ const sameMonth = calendar.isSameMonth(day, props.date, dateConfig());
646
+ const isToday = dayKey === todayKey();
647
+ const dayLabel = day.toLocaleDateString(dateConfig().locale ?? "en", {
648
+ weekday: "long",
649
+ year: "numeric",
650
+ month: "long",
651
+ day: "numeric",
652
+ timeZone: dateConfig().timeZone
653
+ });
654
+ const eventStack = createMemo(() => {
655
+ const preview = movePreview();
656
+ const previewForDay = preview && calendar.formatDateKey(preview.start, dateConfig()) === dayKey ? preview : null;
657
+ const candidates = previewForDay ? events.filter(event => event.id !== previewForDay.id) : events;
658
+ const visibleLimit = previewForDay ? 2 : 3;
659
+ return {
660
+ preview: previewForDay,
661
+ visibleEvents: candidates.slice(0, visibleLimit),
662
+ hiddenCount: Math.max(0, candidates.length - visibleLimit)
663
+ };
664
+ });
665
+ return _$ssr(_tmpl$16, _$ssrAttribute("data-calendar-day-key", _$escape(dayKey, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-drop-preview", movePreview()?.start && calendar.formatDateKey(movePreview().start, dateConfig()) === dayKey ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
666
+ get when() {
667
+ return props.owner.onSlotActivate;
668
+ },
669
+ get fallback() {
670
+ return _$createComponent(Show, {
671
+ when: href,
672
+ children: dayHref => _$createComponent(CalendarNavigationLink, {
673
+ get owner() {
674
+ return props.owner;
675
+ },
676
+ get href() {
677
+ return dayHref();
678
+ },
679
+ get anchorProps() {
680
+ return {
681
+ class: "k2b-calendar-month__day-target",
682
+ "aria-label": messages().openDate({
683
+ label: dayLabel
684
+ })
685
+ };
686
+ }
687
+ })
688
+ });
689
+ },
690
+ get children() {
691
+ return _$ssrElement("button", _$mergeProps({
692
+ type: "button",
693
+ "class": "k2b-calendar-month__day-target",
694
+ "data-interactive": "true",
695
+ get ["aria-label"]() {
696
+ return messages().createEventOn({
697
+ label: dayLabel
698
+ });
699
+ }
700
+ }, () => slotInteractionProps(props.owner, () => {
701
+ const start = startOfDay(day, dateConfig());
702
+ return {
703
+ start,
704
+ end: calendar.addDays(start, 1, dateConfig()),
705
+ allDay: true
706
+ };
707
+ }, () => performance.now() < suppressSlotClickUntil, true)), undefined, false);
708
+ }
709
+ })), _$escape(_$createComponent(Show, {
710
+ get when() {
711
+ return props.owner.onSlotActivate && href;
712
+ },
713
+ get fallback() {
714
+ return _$ssr(_tmpl$17, _$ssrAttribute("data-today", isToday ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())));
715
+ },
716
+ children: dayHref => _$createComponent(CalendarNavigationLink, {
717
+ get owner() {
718
+ return props.owner;
719
+ },
720
+ get href() {
721
+ return dayHref();
722
+ },
723
+ get anchorProps() {
724
+ return {
725
+ class: "k2b-calendar-month__day-number",
726
+ "data-today": isToday ? "true" : undefined,
727
+ "data-outside": !sameMonth ? "true" : undefined,
728
+ "aria-label": messages().openDate({
729
+ label: dayLabel
730
+ })
731
+ };
732
+ },
733
+ get children() {
734
+ return calendar.formatDayNumber(day, dateConfig());
735
+ }
736
+ })
737
+ })), _$escape(_$createComponent(Show, {
738
+ when: dayBadge,
739
+ children: badge => _$ssr(_tmpl$18, _$escape(_$createComponent(Show, {
740
+ get when() {
741
+ return badge().icon;
742
+ },
743
+ children: icon => _$ssr(_tmpl$8, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
744
+ })), _$escape(badge().label))
745
+ })), _$escape(_$createComponent(Show, {
746
+ get when() {
747
+ return eventStack().preview;
748
+ },
749
+ get children() {
750
+ return _$ssr(_tmpl$15, _$escape(props.events.find(event => event.id === eventStack().preview.id)?.title ?? messages().moveEvent));
751
+ }
752
+ })), _$escape(_$createComponent(For, {
753
+ get each() {
754
+ return eventStack().visibleEvents;
755
+ },
756
+ children: event => _$createComponent(EventChip, {
757
+ event: event,
758
+ get owner() {
759
+ return props.owner;
760
+ },
761
+ get href() {
762
+ return eventHref(props.owner, event);
763
+ },
764
+ compact: true,
765
+ get moving() {
766
+ return movingEventId() === event.id;
767
+ },
768
+ get onMovePointerDown() {
769
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, event, markDragged) : undefined;
770
+ }
771
+ })
772
+ })), _$escape(_$createComponent(Show, {
773
+ get when() {
774
+ return eventStack().hiddenCount > 0;
775
+ },
776
+ get children() {
777
+ return _$createComponent(CalendarNavigationLink, {
778
+ get owner() {
779
+ return props.owner;
780
+ },
781
+ href: href ?? "#",
782
+ anchorProps: {
783
+ class: "k2b-calendar-month__more"
784
+ },
785
+ get children() {
786
+ return ["+", eventStack().hiddenCount, " more"];
787
+ }
788
+ });
789
+ }
790
+ })), _$escape(_$createComponent(For, {
791
+ get each() {
792
+ return events.slice(0, 4);
793
+ },
794
+ children: event => _$ssr(_tmpl$19, _$ssrAttribute("data-color", event.colorHex ? _$escape(undefined, true) : _$escape(event.color ?? "blue", true), false), _$ssrStyle(event.colorHex ? {
795
+ "background-color": event.colorHex
796
+ } : undefined))
797
+ })));
798
+ }
799
+ })))
800
+ })));
801
+ };
802
+ const TimeGridView = props => {
803
+ const messages = useUiMessages();
804
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
805
+ const gridStartHour = () => props.owner.visibleStartHour ?? 0;
806
+ const gridEndHour = () => props.owner.visibleEndHour ?? 23;
807
+ const businessStartHour = () => props.owner.startHour ?? 8;
808
+ const businessEndHour = () => props.owner.endHour ?? 18;
809
+ const hours = createMemo(() => Array.from({
810
+ length: gridEndHour() - gridStartHour() + 1
811
+ }, (_, index) => gridStartHour() + index));
812
+ const [timePreview, setTimePreview] = createSignal(null);
813
+ const [movingEventId, setMovingEventId] = createSignal("");
814
+ const [expandedOverflow, setExpandedOverflow] = createSignal("");
815
+ let scrollContainer;
816
+ let timeGrid;
817
+ let timeGutter;
818
+ let defaultHourMarker;
819
+ let cancelInteraction;
820
+ let suppressSlotClickUntil = 0;
821
+ const slotEnd = start => addMinutes(start, 60);
822
+ const previewEvents = createMemo(() => previewSegments(timePreview(), props.days, dateConfig()));
823
+ const eventsByDay = createMemo(() => {
824
+ const grouped = new Map();
825
+ for (const event of props.events) {
826
+ const bucket = grouped.get(event.dayKey) ?? {
827
+ allDay: [],
828
+ timed: []
829
+ };
830
+ (event.allDay ? bucket.allDay : bucket.timed).push(event);
831
+ grouped.set(event.dayKey, bucket);
832
+ }
833
+ return grouped;
834
+ });
835
+ const clearInteraction = () => {
836
+ setTimePreview(null);
837
+ setMovingEventId("");
838
+ };
839
+ const dayAtPoint = (clientX, clientY) => {
840
+ const target = document.elementFromPoint(clientX, clientY)?.closest("[data-calendar-day-key]");
841
+ const dayKey = target?.dataset.calendarDayKey;
842
+ return dayKey ? calendar.parseCalendarDate(dayKey, dateConfig()) : null;
843
+ };
844
+ const timeAtPoint = (clientX, clientY) => {
845
+ if (!timeGrid || !timeGutter) return null;
846
+ const gridRect = timeGrid.getBoundingClientRect();
847
+ const gutterRect = timeGutter.getBoundingClientRect();
848
+ const dayIndex = calendarDayIndexAtPoint(clientX, gutterRect.right, gridRect.right - gutterRect.right, props.days.length);
849
+ if (dayIndex === null) return null;
850
+ const minute = Math.min(gridEndHour() * 60 + 45, calendarMinuteAtPoint(clientY, gridRect.top, gridRect.height, gridStartHour(), gridEndHour()));
851
+ return zonedMinuteSlot(props.days[dayIndex], minute, dateConfig());
852
+ };
853
+ const beginInteraction = options => {
854
+ cancelInteraction?.();
855
+ cancelInteraction = startCalendarPointerSession(options);
856
+ };
857
+ const startTimedMove = (pointerEvent, event, markDragged) => {
858
+ if (!props.owner.onEventDrop) return;
859
+ const pointerStart = timeAtPoint(pointerEvent.clientX, pointerEvent.clientY) ?? event.sourceStartDate;
860
+ const duration = Math.max(15 * 60_000, event.sourceEndDate.getTime() - event.sourceStartDate.getTime());
861
+ const offsetMinutes = Math.max(0, Math.min(duration / 60_000, Math.round((pointerStart.getTime() - event.sourceStartDate.getTime()) / 900_000) * 15));
862
+ beginInteraction({
863
+ event: pointerEvent,
864
+ scrollContainer,
865
+ resolve: (clientX, clientY) => {
866
+ const pointer = timeAtPoint(clientX, clientY);
867
+ if (!pointer) return null;
868
+ const start = new Date(pointer.getTime() - offsetMinutes * 60_000);
869
+ return {
870
+ id: event.id,
871
+ title: event.title,
872
+ start,
873
+ end: new Date(start.getTime() + duration),
874
+ allDay: false
875
+ };
876
+ },
877
+ onActivate: () => {
878
+ markDragged();
879
+ suppressSlotClickUntil = performance.now() + 400;
880
+ setMovingEventId(event.id);
881
+ },
882
+ onPreview: setTimePreview,
883
+ onCommit: next => {
884
+ clearInteraction();
885
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
886
+ },
887
+ onCancel: clearInteraction
888
+ });
889
+ };
890
+ const startAllDayMove = (pointerEvent, event, markDragged) => {
891
+ if (!props.owner.onEventDrop) return;
892
+ beginInteraction({
893
+ event: pointerEvent,
894
+ resolve: (clientX, clientY) => {
895
+ const day = dayAtPoint(clientX, clientY);
896
+ return day ? {
897
+ id: event.id,
898
+ title: event.title,
899
+ ...moveEventTo(event, startOfDay(day, dateConfig()), true, dateConfig())
900
+ } : null;
901
+ },
902
+ onActivate: () => {
903
+ markDragged();
904
+ suppressSlotClickUntil = performance.now() + 400;
905
+ setMovingEventId(event.id);
906
+ },
907
+ onPreview: setTimePreview,
908
+ onCommit: next => {
909
+ clearInteraction();
910
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
911
+ },
912
+ onCancel: clearInteraction
913
+ });
914
+ };
915
+ const startRange = pointerEvent => {
916
+ if (!props.owner.onSlotActivate || pointerEvent.pointerType === "touch") return;
917
+ const anchor = timeAtPoint(pointerEvent.clientX, pointerEvent.clientY);
918
+ if (!anchor) return;
919
+ beginInteraction({
920
+ event: pointerEvent,
921
+ scrollContainer,
922
+ resolve: (clientX, clientY) => {
923
+ const current = timeAtPoint(clientX, clientY);
924
+ if (!current) return null;
925
+ const start = current < anchor ? current : anchor;
926
+ const endBase = current < anchor ? anchor : current;
927
+ return {
928
+ id: "calendar-create-preview",
929
+ start,
930
+ end: addMinutes(endBase, 15),
931
+ allDay: false
932
+ };
933
+ },
934
+ onActivate: () => {
935
+ suppressSlotClickUntil = performance.now() + 400;
936
+ },
937
+ onPreview: setTimePreview,
938
+ onCommit: next => {
939
+ clearInteraction();
940
+ props.owner.onSlotActivate?.(next);
941
+ },
942
+ onCancel: clearInteraction
943
+ });
944
+ };
945
+ const timeRangeLayout = (startDate, endDate) => {
946
+ const start = zonedHour(startDate, dateConfig());
947
+ const end = zonedHour(endDate, dateConfig());
948
+ const visibleStart = Math.max(gridStartHour(), start);
949
+ const visibleEnd = Math.min(gridEndHour() + 1, end);
950
+ const total = Math.max(1, gridEndHour() - gridStartHour() + 1);
951
+ return {
952
+ top: Math.max(0, (visibleStart - gridStartHour()) / total * 100),
953
+ height: Math.max(1.25, (visibleEnd - visibleStart) / total * 100)
954
+ };
955
+ };
956
+ const eventLayout = event => timeRangeLayout(event.startDate, event.endDate);
957
+ const isDayView = () => props.days.length === 1;
958
+ const visibleLaneCount = lanes => isDayView() ? lanes : Math.min(lanes, 3);
959
+ const overflowLayouts = layouts => {
960
+ if (isDayView()) return [];
961
+ const groups = new Map();
962
+ for (const layout of layouts) {
963
+ if (layout.lane < visibleLaneCount(layout.lanes)) continue;
964
+ const existing = groups.get(layout.groupId);
965
+ if (existing) existing.hiddenEvents.push(layout.event);else groups.set(layout.groupId, {
966
+ groupId: layout.groupId,
967
+ hiddenEvents: [layout.event],
968
+ groupStartDate: layout.groupStartDate,
969
+ groupEndDate: layout.groupEndDate
970
+ });
971
+ }
972
+ return [...groups.values()];
973
+ };
974
+ const dayColumnMinWidth = layouts => {
975
+ if (!isDayView()) return undefined;
976
+ const lanes = Math.max(1, ...layouts.map(layout => layout.lanes));
977
+ return `${Math.max(32, lanes * 12)}rem`;
978
+ };
979
+ const laneStyle = layoutItem => {
980
+ if (isDayView()) {
981
+ const laneWidth = 100 / layoutItem.lanes;
982
+ return {
983
+ left: `calc(${layoutItem.lane * laneWidth}% + 0.25rem)`,
984
+ width: `calc(${laneWidth}% - 0.5rem)`
985
+ };
986
+ }
987
+ const visibleLanes = visibleLaneCount(layoutItem.lanes);
988
+ return {
989
+ left: `${layoutItem.lanes <= 1 ? 0 : 28 / Math.max(1, visibleLanes - 1) * layoutItem.lane}%`,
990
+ width: `${layoutItem.lanes <= 1 ? 100 : layoutItem.lanes > visibleLanes ? 68 : 72}%`
991
+ };
992
+ };
993
+ const currentTimeLine = day => {
994
+ const now = props.now;
995
+ if (calendar.formatDateKey(day, dateConfig()) !== calendar.formatDateKey(now, dateConfig())) return null;
996
+ const hour = zonedHour(now, dateConfig());
997
+ if (hour < gridStartHour() || hour > gridEndHour() + 1) return null;
998
+ return (hour - gridStartHour()) / Math.max(1, gridEndHour() - gridStartHour() + 1) * 100;
999
+ };
1000
+ onCleanup(() => cancelInteraction?.());
1001
+ onMount(() => {
1002
+ requestAnimationFrame(() => {
1003
+ if (!scrollContainer || !defaultHourMarker) return;
1004
+ const targetTop = defaultHourMarker.getBoundingClientRect().top - scrollContainer.getBoundingClientRect().top;
1005
+ scrollContainer.scrollTo({
1006
+ top: Math.max(0, scrollContainer.scrollTop + targetTop),
1007
+ behavior: "smooth"
1008
+ });
1009
+ });
1010
+ });
1011
+ return _$ssr(_tmpl$21, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`), _$escape(_$createComponent(For, {
1012
+ get each() {
1013
+ return props.days;
1014
+ },
1015
+ children: day => {
1016
+ const dayBadge = props.owner.dayBadges?.[calendar.formatDateKey(day, dateConfig())];
1017
+ const today = () => calendar.isToday(day, dateConfig());
1018
+ return _$createComponent(CalendarNavigationLink, {
1019
+ get owner() {
1020
+ return props.owner;
1021
+ },
1022
+ get href() {
1023
+ return props.owner.getDateHref?.(day, "day") ?? "#";
1024
+ },
1025
+ anchorProps: {
1026
+ class: "k2b-calendar-time-grid__day"
1027
+ },
1028
+ get children() {
1029
+ return [_$ssr(_tmpl$22, _$ssrAttribute("data-today", today() ? "true" : _$escape(undefined, true), false), _$escape(formatDay(day, dateConfig()))), _$createComponent(Show, {
1030
+ when: dayBadge,
1031
+ children: badge => _$ssr(_tmpl$23, _$escape(_$createComponent(Show, {
1032
+ get when() {
1033
+ return badge().icon;
1034
+ },
1035
+ children: icon => _$ssr(_tmpl$8, `k2b-calendar-time-grid__badge-icon ti ti-${_$escape(icon(), true)}`)
1036
+ })), _$escape(badge().label))
1037
+ })];
1038
+ }
1039
+ });
1040
+ }
1041
+ })), _$escape(_$createComponent(Show, {
1042
+ get when() {
1043
+ return !props.owner.hideAllDay;
1044
+ },
1045
+ get children() {
1046
+ return _$ssr(_tmpl$20, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`) + _$ssrStyleProperty(";max-height:", `${_$escape(props.owner.allDayMaxHeightRem ?? 7, true)}rem`), _$escape(props.labels.allDay), _$escape(_$createComponent(For, {
1047
+ get each() {
1048
+ return props.days;
1049
+ },
1050
+ children: day => {
1051
+ const dayKey = calendar.formatDateKey(day, dateConfig());
1052
+ const allDay = () => eventsByDay().get(dayKey)?.allDay ?? [];
1053
+ const previewAllDay = previewEvents().filter(event => event.dayKey === dayKey && event.allDay);
1054
+ return _$ssrElement("div", _$mergeProps({
1055
+ "class": "k2b-calendar-time-grid__all-day-cell",
1056
+ "data-calendar-day-key": dayKey,
1057
+ get ["data-drop-preview"]() {
1058
+ return timePreview()?.allDay && calendar.formatDateKey(timePreview().start, dateConfig()) === dayKey ? "true" : undefined;
1059
+ },
1060
+ get ["data-interactive"]() {
1061
+ return props.owner.onSlotActivate ? "true" : undefined;
1062
+ }
1063
+ }, () => slotInteractionProps(props.owner, () => {
1064
+ const start = startOfDay(day, dateConfig());
1065
+ return {
1066
+ start,
1067
+ end: calendar.addDays(start, 1, dateConfig()),
1068
+ allDay: true
1069
+ };
1070
+ }, () => performance.now() < suppressSlotClickUntil)), _$ssr(_tmpl$24, _$escape(_$createComponent(For, {
1071
+ each: previewAllDay,
1072
+ children: event => _$ssr(_tmpl$15, _$escape(event.title))
1073
+ })), _$escape(_$createComponent(For, {
1074
+ get each() {
1075
+ return allDay();
1076
+ },
1077
+ children: event => _$createComponent(EventChip, {
1078
+ event: event,
1079
+ get owner() {
1080
+ return props.owner;
1081
+ },
1082
+ get href() {
1083
+ return eventHref(props.owner, event);
1084
+ },
1085
+ compact: true,
1086
+ get moving() {
1087
+ return movingEventId() === event.id;
1088
+ },
1089
+ get onMovePointerDown() {
1090
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startAllDayMove(pointerEvent, event, markDragged) : undefined;
1091
+ }
1092
+ })
1093
+ }))), false);
1094
+ }
1095
+ })));
1096
+ }
1097
+ })), _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`), _$ssrStyleProperty("grid-template-rows:", `repeat(${_$escape(hours().length, true)}, minmax(4rem, 1fr))`), _$escape(_$createComponent(For, {
1098
+ get each() {
1099
+ return hours();
1100
+ },
1101
+ children: hour => _$ssr(_tmpl$25, _$ssrAttribute("data-outside-business", hour < businessStartHour() || hour > businessEndHour() ? "true" : _$escape(undefined, true), false), _$escape(`${hour}`.padStart(2, "0")))
1102
+ })), _$escape(_$createComponent(For, {
1103
+ get each() {
1104
+ return props.days;
1105
+ },
1106
+ children: day => {
1107
+ const dayKey = calendar.formatDateKey(day, dateConfig());
1108
+ const layouts = createMemo(() => timedEventLayouts(eventsByDay().get(dayKey)?.timed ?? []));
1109
+ return _$ssr(_tmpl$27, _$ssrStyleProperty("min-width:", _$escape(dayColumnMinWidth(layouts()), true)) + _$ssrStyleProperty(";grid-template-rows:", `repeat(${_$escape(hours().length, true)}, minmax(4rem, 1fr))`), _$escape(_$createComponent(Show, {
1110
+ get when() {
1111
+ return currentTimeLine(day) !== null;
1112
+ },
1113
+ get children() {
1114
+ return _$ssr(_tmpl$26, _$ssrStyleProperty("top:", `${_$escape(currentTimeLine(day) ?? 0, true)}%`));
1115
+ }
1116
+ })), _$escape(_$createComponent(For, {
1117
+ get each() {
1118
+ return hours();
1119
+ },
1120
+ children: hour => _$ssrElement("div", _$mergeProps({
1121
+ "class": "k2b-calendar-time-grid__slot",
1122
+ get ["data-outside-business"]() {
1123
+ return hour < businessStartHour() || hour > businessEndHour() ? "true" : undefined;
1124
+ },
1125
+ get ["data-interactive"]() {
1126
+ return props.owner.onSlotActivate ? "true" : undefined;
1127
+ }
1128
+ }, () => slotInteractionProps(props.owner, () => {
1129
+ const start = zonedSlot(day, hour, dateConfig());
1130
+ return {
1131
+ start,
1132
+ end: slotEnd(start),
1133
+ allDay: false
1134
+ };
1135
+ }, () => performance.now() < suppressSlotClickUntil)), undefined, false)
1136
+ })), _$escape(_$createComponent(For, {
1137
+ get each() {
1138
+ return previewEvents().filter(event => event.dayKey === dayKey && !event.allDay);
1139
+ },
1140
+ children: event => {
1141
+ const layout = eventLayout(event);
1142
+ const short = event.endDate.getTime() - event.startDate.getTime() < 60 * 60_000;
1143
+ return _$ssr(_tmpl$29, _$ssrAttribute("data-short", short ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$escape(_$createComponent(Show, {
1144
+ get when() {
1145
+ return event.title;
1146
+ },
1147
+ get children() {
1148
+ return _$ssr(_tmpl$28, _$escape(event.title));
1149
+ }
1150
+ })), _$escape(formatTime(event.startDate, dateConfig())), _$escape(formatTime(event.endDate, dateConfig())));
1151
+ }
1152
+ })), _$escape(_$createComponent(For, {
1153
+ get each() {
1154
+ return layouts();
1155
+ },
1156
+ children: layoutItem => {
1157
+ if (!isDayView() && layoutItem.lane >= visibleLaneCount(layoutItem.lanes)) return null;
1158
+ const event = layoutItem.event;
1159
+ const layout = eventLayout(event);
1160
+ const position = laneStyle(layoutItem);
1161
+ const resizeStart = pointerEvent => {
1162
+ if (!props.owner.onEventResize) return;
1163
+ pointerEvent.preventDefault();
1164
+ pointerEvent.stopPropagation();
1165
+ beginInteraction({
1166
+ event: pointerEvent,
1167
+ scrollContainer,
1168
+ threshold: 1,
1169
+ resolve: (clientX, clientY) => {
1170
+ const pointer = timeAtPoint(clientX, clientY);
1171
+ if (!pointer) return null;
1172
+ const minimumEnd = addMinutes(event.sourceStartDate, 15);
1173
+ const end = pointer > minimumEnd ? pointer : minimumEnd;
1174
+ return {
1175
+ id: event.id,
1176
+ title: event.title,
1177
+ start: event.sourceStartDate,
1178
+ end,
1179
+ allDay: false
1180
+ };
1181
+ },
1182
+ onActivate: () => {
1183
+ suppressSlotClickUntil = performance.now() + 400;
1184
+ setMovingEventId(event.id);
1185
+ },
1186
+ onPreview: setTimePreview,
1187
+ onCommit: next => {
1188
+ clearInteraction();
1189
+ if (eventTimeChanged(event, next)) props.owner.onEventResize?.(event, next);
1190
+ },
1191
+ onCancel: clearInteraction
1192
+ });
1193
+ };
1194
+ return _$ssr(_tmpl$31, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`) + _$ssrStyleProperty(";left:", _$escape(position.left, true)) + _$ssrStyleProperty(";width:", _$escape(position.width, true)) + _$ssrStyleProperty(";z-index:", _$escape(String(20 + layoutItem.lane), true)), _$escape(_$createComponent(EventChip, {
1195
+ event: event,
1196
+ get owner() {
1197
+ return props.owner;
1198
+ },
1199
+ get href() {
1200
+ return eventHref(props.owner, event);
1201
+ },
1202
+ fill: true,
1203
+ get moving() {
1204
+ return movingEventId() === event.id;
1205
+ },
1206
+ get onMovePointerDown() {
1207
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startTimedMove(pointerEvent, event, markDragged) : undefined;
1208
+ }
1209
+ })), _$escape(_$createComponent(Show, {
1210
+ get when() {
1211
+ return props.owner.onEventResize;
1212
+ },
1213
+ get children() {
1214
+ return _$ssr(_tmpl$30, _$ssrAttribute("aria-label", _$escape(messages().resizeEvent, true), false));
1215
+ }
1216
+ })));
1217
+ }
1218
+ })), _$escape(_$createComponent(For, {
1219
+ get each() {
1220
+ return overflowLayouts(layouts());
1221
+ },
1222
+ children: overflow => {
1223
+ const layout = timeRangeLayout(overflow.groupStartDate, overflow.groupEndDate);
1224
+ const key = `${dayKey}-${overflow.groupId}`;
1225
+ const hiddenTitle = () => overflow.hiddenEvents.map(event => `${formatTime(event.startDate, dateConfig())} ${event.title}`).join("\n");
1226
+ return [_$ssr(_tmpl$32, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$ssrAttribute("title", _$escape(hiddenTitle(), true), false) + _$ssrAttribute("aria-label", _$escape(messages().hiddenOverlappingEvents({
1227
+ count: overflow.hiddenEvents.length
1228
+ }), true), false), _$escape(overflow.hiddenEvents.length)), _$createComponent(Show, {
1229
+ get when() {
1230
+ return expandedOverflow() === key;
1231
+ },
1232
+ get children() {
1233
+ return _$ssr(_tmpl$33, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`), _$escape(formatTime(overflow.groupStartDate, dateConfig())), _$escape(formatTime(overflow.groupEndDate, dateConfig())), _$escape(_$createComponent(For, {
1234
+ get each() {
1235
+ return overflow.hiddenEvents;
1236
+ },
1237
+ children: event => _$createComponent(EventChip, {
1238
+ event: event,
1239
+ get owner() {
1240
+ return props.owner;
1241
+ },
1242
+ get href() {
1243
+ return eventHref(props.owner, event);
1244
+ },
1245
+ compact: true
1246
+ })
1247
+ })));
1248
+ }
1249
+ })];
1250
+ }
1251
+ })));
1252
+ }
1253
+ })));
1254
+ };
1255
+ const YearView = props => {
1256
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1257
+ const year = createMemo(() => zonedYearMonth(props.date, dateConfig()).year);
1258
+ const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
1259
+ const eventsByDay = createMemo(() => {
1260
+ const grouped = new Map();
1261
+ for (const event of props.events) {
1262
+ const events = grouped.get(event.dayKey);
1263
+ if (events) events.push(event);else grouped.set(event.dayKey, [event]);
1264
+ }
1265
+ return grouped;
1266
+ });
1267
+ const months = createMemo(() => {
1268
+ const context = dateConfig();
1269
+ return Array.from({
1270
+ length: 12
1271
+ }, (_, month) => {
1272
+ const date = zonedMonthDate(year(), month, context);
1273
+ return {
1274
+ date,
1275
+ label: date.toLocaleDateString(context.locale ?? "en", {
1276
+ month: "long",
1277
+ timeZone: context.timeZone
1278
+ }),
1279
+ days: calendar.getMonthGrid(year(), month, context).flat().map(day => {
1280
+ const key = calendar.formatDateKey(day, context);
1281
+ return {
1282
+ date: day,
1283
+ events: eventsByDay().get(key) ?? [],
1284
+ isToday: key === todayKey(),
1285
+ outside: !calendar.isSameMonth(day, date, context),
1286
+ number: calendar.formatDayNumber(day, context)
1287
+ };
1288
+ })
1289
+ };
1290
+ });
1291
+ });
1292
+ return _$ssr(_tmpl$34, _$escape(_$createComponent(For, {
1293
+ get each() {
1294
+ return months();
1295
+ },
1296
+ children: month => _$ssr(_tmpl$35, _$escape(month.label), _$escape(_$createComponent(For, {
1297
+ get each() {
1298
+ return month.days;
1299
+ },
1300
+ children: day => _$createComponent(CalendarNavigationLink, {
1301
+ get owner() {
1302
+ return props.owner;
1303
+ },
1304
+ get href() {
1305
+ return props.owner.getDateHref?.(day.date, "day") ?? "#";
1306
+ },
1307
+ get anchorProps() {
1308
+ return {
1309
+ class: "k2b-calendar-year__day",
1310
+ "data-today": day.isToday ? "true" : undefined,
1311
+ "data-outside": day.outside ? "true" : undefined
1312
+ };
1313
+ },
1314
+ get children() {
1315
+ return [day.number, _$createComponent(Show, {
1316
+ get when() {
1317
+ return day.events[0];
1318
+ },
1319
+ children: event => _$ssr(_tmpl$36, _$ssrAttribute("data-color", event().colorHex ? _$escape(undefined, true) : _$escape(event().color ?? "blue", true), false) + _$ssrAttribute("data-today", day.isToday ? "true" : _$escape(undefined, true), false), _$ssrStyle(event().colorHex ? {
1320
+ "background-color": day.isToday ? "white" : event().colorHex
1321
+ } : undefined))
1322
+ })];
1323
+ }
1324
+ })
1325
+ })))
1326
+ })));
1327
+ };
1328
+ const MobileMonthView = props => {
1329
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1330
+ const selectedDateKey = createMemo(() => calendar.formatDateKey(props.selectedDate, dateConfig()));
1331
+ const selectedEvents = createMemo(() => props.events.filter(event => event.dayKey === selectedDateKey()));
1332
+ return _$ssr(_tmpl$38, _$escape(_$createComponent(MonthView, {
1333
+ get owner() {
1334
+ return {
1335
+ ...props.owner,
1336
+ withWeekNumbers: false
1337
+ };
1338
+ },
1339
+ get date() {
1340
+ return props.date;
1341
+ },
1342
+ get now() {
1343
+ return props.now;
1344
+ },
1345
+ get events() {
1346
+ return props.events;
1347
+ },
1348
+ get labels() {
1349
+ return props.labels;
1350
+ }
1351
+ })), _$escape(props.selectedDate.toLocaleDateString(dateConfig().locale ?? "en", {
1352
+ weekday: "long",
1353
+ month: "long",
1354
+ day: "numeric",
1355
+ timeZone: dateConfig().timeZone
1356
+ })), _$escape(_$createComponent(Show, {
1357
+ get when() {
1358
+ return selectedEvents().length > 0;
1359
+ },
1360
+ get fallback() {
1361
+ return _$ssr(_tmpl$39, _$escape(props.labels.noEvents));
1362
+ },
1363
+ get children() {
1364
+ return _$ssr(_tmpl$37, _$escape(_$createComponent(For, {
1365
+ get each() {
1366
+ return selectedEvents();
1367
+ },
1368
+ children: event => _$createComponent(EventChip, {
1369
+ event: event,
1370
+ get owner() {
1371
+ return props.owner;
1372
+ },
1373
+ get href() {
1374
+ return eventHref(props.owner, event);
1375
+ }
1376
+ })
1377
+ })));
1378
+ }
1379
+ })));
1380
+ };
1381
+ const CalendarBody = props => _$ssr(_tmpl$40, _$escape(props.children));
1382
+ const Calendar = props => {
1383
+ const messages = useUiMessages();
1384
+ // Subviews derive their date config from the owner props, so the inherited
1385
+ // render locale is merged here once; an explicit dateConfig.locale wins.
1386
+ const localizedConfig = useDateConfigLocale(() => props.dateConfig);
1387
+ const owner = mergeProps(props, {
1388
+ get dateConfig() {
1389
+ return localizedConfig();
1390
+ }
1391
+ });
1392
+ const view = () => props.view ?? "month";
1393
+ const dateConfig = createMemo(() => ownerDateConfig(owner));
1394
+ const safeDate = value => {
1395
+ const parsed = parseDate(value, dateConfig());
1396
+ return validDate(parsed) ? parsed : calendar.today(dateConfig());
1397
+ };
1398
+ const date = createMemo(() => safeDate(props.date));
1399
+ const selectedDate = createMemo(() => safeDate(props.selectedDate ?? props.date));
1400
+ const [now, setNow] = createSignal(new Date());
1401
+ const normalizedEvents = createMemo(() => normalizeEvents(props.events, dateConfig()));
1402
+ const mergedLabels = createMemo(() => ({
1403
+ today: messages().today,
1404
+ day: messages().day,
1405
+ week: messages().week,
1406
+ month: messages().month,
1407
+ year: messages().year,
1408
+ allDay: messages().allDay,
1409
+ noEvents: messages().noEvents,
1410
+ previous: messages().previous,
1411
+ next: messages().next,
1412
+ ...props.labels
1413
+ }));
1414
+ const days = createMemo(() => {
1415
+ if (view() === "day") return [date()];
1416
+ return calendar.getWeekDays(date(), dateConfig());
1417
+ });
1418
+ onMount(() => {
1419
+ const updateNow = () => setNow(new Date());
1420
+ const interval = window.setInterval(updateNow, 60_000);
1421
+ document.addEventListener("visibilitychange", updateNow);
1422
+ onCleanup(() => {
1423
+ window.clearInterval(interval);
1424
+ document.removeEventListener("visibilitychange", updateNow);
1425
+ });
1426
+ });
1427
+ return _$ssr(_tmpl$41, `k2b-content-calendar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-busy", props.navigationPending ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(CalendarHeader, {
1428
+ get date() {
1429
+ return date();
1430
+ },
1431
+ get view() {
1432
+ return view();
1433
+ },
1434
+ get labels() {
1435
+ return mergedLabels();
1436
+ },
1437
+ owner: owner
1438
+ })), _$escape(props.toolbarContent), _$escape(_$createComponent(Show, {
1439
+ get when() {
1440
+ return view() !== "month";
1441
+ },
1442
+ get fallback() {
1443
+ return _$createComponent(CalendarBody, {
1444
+ get children() {
1445
+ return _$createComponent(MonthView, {
1446
+ owner: owner,
1447
+ get date() {
1448
+ return date();
1449
+ },
1450
+ get now() {
1451
+ return now();
1452
+ },
1453
+ get events() {
1454
+ return normalizedEvents();
1455
+ },
1456
+ get labels() {
1457
+ return mergedLabels();
1458
+ }
1459
+ });
1460
+ }
1461
+ });
1462
+ },
1463
+ get children() {
1464
+ return _$createComponent(Show, {
1465
+ get when() {
1466
+ return view() !== "year";
1467
+ },
1468
+ get fallback() {
1469
+ return _$createComponent(CalendarBody, {
1470
+ get children() {
1471
+ return _$createComponent(YearView, {
1472
+ owner: owner,
1473
+ get date() {
1474
+ return date();
1475
+ },
1476
+ get now() {
1477
+ return now();
1478
+ },
1479
+ get events() {
1480
+ return normalizedEvents();
1481
+ }
1482
+ });
1483
+ }
1484
+ });
1485
+ },
1486
+ get children() {
1487
+ return _$createComponent(Show, {
1488
+ get when() {
1489
+ return view() !== "mobile-month";
1490
+ },
1491
+ get fallback() {
1492
+ return _$createComponent(CalendarBody, {
1493
+ get children() {
1494
+ return _$createComponent(MobileMonthView, {
1495
+ owner: owner,
1496
+ get date() {
1497
+ return date();
1498
+ },
1499
+ get now() {
1500
+ return now();
1501
+ },
1502
+ get selectedDate() {
1503
+ return selectedDate();
1504
+ },
1505
+ get events() {
1506
+ return normalizedEvents();
1507
+ },
1508
+ get labels() {
1509
+ return mergedLabels();
1510
+ }
1511
+ });
1512
+ }
1513
+ });
1514
+ },
1515
+ get children() {
1516
+ return _$createComponent(TimeGridView, {
1517
+ owner: owner,
1518
+ get date() {
1519
+ return date();
1520
+ },
1521
+ get now() {
1522
+ return now();
1523
+ },
1524
+ get events() {
1525
+ return normalizedEvents();
1526
+ },
1527
+ get labels() {
1528
+ return mergedLabels();
1529
+ },
1530
+ get days() {
1531
+ return days();
1532
+ }
1533
+ });
1534
+ }
1535
+ });
1536
+ }
1537
+ });
1538
+ }
1539
+ })));
1540
+ };
1541
+ export default Calendar;
1542
+ //# sourceMappingURL=Calendar.js.map