@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,2168 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { use as _$use } from "solid-js/web";
4
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
5
+ import { memo as _$memo } from "solid-js/web";
6
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { className as _$className } from "solid-js/web";
8
+ import { spread as _$spread } from "solid-js/web";
9
+ import { mergeProps as _$mergeProps } from "solid-js/web";
10
+ import { style as _$style } from "solid-js/web";
11
+ import { setAttribute as _$setAttribute } from "solid-js/web";
12
+ import { effect as _$effect } from "solid-js/web";
13
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
14
+ import { addEventListener as _$addEventListener } from "solid-js/web";
15
+ import { createComponent as _$createComponent } from "solid-js/web";
16
+ import { getNextElement as _$getNextElement } from "solid-js/web";
17
+ import { insert as _$insert } from "solid-js/web";
18
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-calendar-event__title>`),
19
+ _tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-calendar-event__meta>`),
20
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-calendar-event__description>`),
21
+ _tmpl$4 = /*#__PURE__*/_$template(`<a class=k2b-calendar-event data-calendar-event>`),
22
+ _tmpl$5 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-event data-calendar-event data-interactive=true>`),
23
+ _tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-calendar-event role=group data-calendar-event>`),
24
+ _tmpl$7 = /*#__PURE__*/_$template(`<a>`),
25
+ _tmpl$8 = /*#__PURE__*/_$template(`<div role=radiogroup aria-orientation=horizontal class="k2b-segmented-control k2b-calendar-view-switcher">`),
26
+ _tmpl$9 = /*#__PURE__*/_$template(`<i>`),
27
+ _tmpl$0 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-header__nav-button><i>`),
28
+ _tmpl$1 = /*#__PURE__*/_$template(`<span class=k2b-button__label>`),
29
+ _tmpl$10 = /*#__PURE__*/_$template(`<span class=k2b-calendar-header__progress aria-hidden=true>`),
30
+ _tmpl$11 = /*#__PURE__*/_$template(`<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><!$><!/>`),
31
+ _tmpl$12 = /*#__PURE__*/_$template(`<div class=k2b-calendar-month__weekday>`),
32
+ _tmpl$13 = /*#__PURE__*/_$template(`<div class=k2b-calendar-month><div class=k2b-calendar-month__weekdays><!$><!/><!$><!/></div><!$><!/>`),
33
+ _tmpl$14 = /*#__PURE__*/_$template(`<div class=k2b-calendar-month__week-number>`),
34
+ _tmpl$15 = /*#__PURE__*/_$template(`<div class=k2b-calendar-month__week><!$><!/><!$><!/>`),
35
+ _tmpl$16 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-month__day-target data-interactive=true>`),
36
+ _tmpl$17 = /*#__PURE__*/_$template(`<div class=k2b-calendar-preview>`),
37
+ _tmpl$18 = /*#__PURE__*/_$template(`<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>`),
38
+ _tmpl$19 = /*#__PURE__*/_$template(`<span class=k2b-calendar-month__day-number>`),
39
+ _tmpl$20 = /*#__PURE__*/_$template(`<span class=k2b-calendar-month__badge><!$><!/><!$><!/>`),
40
+ _tmpl$21 = /*#__PURE__*/_$template(`<span class=k2b-calendar-dot>`),
41
+ _tmpl$22 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__all-day><div class=k2b-calendar-time-grid__all-day-label></div><!$><!/>`),
42
+ _tmpl$23 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid><div class=k2b-calendar-time-grid__days><div></div><!$><!/></div><!$><!/><div class=k2b-calendar-time-grid__scroll><div class=k2b-calendar-time-grid__grid><div class=k2b-calendar-time-grid__gutter></div><!$><!/>`),
43
+ _tmpl$24 = /*#__PURE__*/_$template(`<span class=k2b-calendar-time-grid__day-label>`),
44
+ _tmpl$25 = /*#__PURE__*/_$template(`<span class=k2b-calendar-time-grid__badge><!$><!/><!$><!/>`),
45
+ _tmpl$26 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__all-day-cell><div class=k2b-calendar-time-grid__all-day-events><!$><!/><!$><!/>`),
46
+ _tmpl$27 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__hour><!$><!/>:00`),
47
+ _tmpl$28 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__now>`),
48
+ _tmpl$29 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__column><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
49
+ _tmpl$30 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__slot>`),
50
+ _tmpl$31 = /*#__PURE__*/_$template(`<div class=k2b-calendar-preview__title>`),
51
+ _tmpl$32 = /*#__PURE__*/_$template(`<div class="k2b-calendar-preview k2b-calendar-preview--timed"><div class=k2b-calendar-preview__content><!$><!/><div class=k2b-calendar-preview__label><!$><!/> - <!$><!/>`),
52
+ _tmpl$33 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-time-grid__resize><span class=k2b-calendar-time-grid__resize-icon aria-hidden=true>`),
53
+ _tmpl$34 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__event-position><div class=k2b-calendar-time-grid__event-frame><!$><!/><!$><!/>`),
54
+ _tmpl$35 = /*#__PURE__*/_$template(`<button type=button class=k2b-calendar-time-grid__overflow><span class=k2b-calendar-time-grid__overflow-count>+<!$><!/>`),
55
+ _tmpl$36 = /*#__PURE__*/_$template(`<div class=k2b-calendar-time-grid__overflow-menu><div class=k2b-calendar-time-grid__overflow-title><!$><!/> - <!$><!/></div><!$><!/>`),
56
+ _tmpl$37 = /*#__PURE__*/_$template(`<div class=k2b-calendar-year>`),
57
+ _tmpl$38 = /*#__PURE__*/_$template(`<div class=k2b-calendar-year__month><div class=k2b-calendar-year__title></div><div class=k2b-calendar-year__grid>`),
58
+ _tmpl$39 = /*#__PURE__*/_$template(`<span class=k2b-calendar-year__indicator>`),
59
+ _tmpl$40 = /*#__PURE__*/_$template(`<div class=k2b-calendar-mobile-month__events>`),
60
+ _tmpl$41 = /*#__PURE__*/_$template(`<div class=k2b-calendar-mobile-month><!$><!/><div class=k2b-calendar-mobile-month__agenda><div class=k2b-calendar-mobile-month__title></div><!$><!/>`),
61
+ _tmpl$42 = /*#__PURE__*/_$template(`<div class=k2b-calendar-mobile-month__empty>`),
62
+ _tmpl$43 = /*#__PURE__*/_$template(`<div class=k2b-calendar-body>`),
63
+ _tmpl$44 = /*#__PURE__*/_$template(`<section><!$><!/><!$><!/><!$><!/>`);
64
+ import { Link } from "@k2b/ssr/nav";
65
+ import { dates as calendar } from "@k2b/stdlib";
66
+ import { createMemo, createSignal, For, mergeProps, onCleanup, onMount, Show } from "solid-js";
67
+ import { Button } from "../actions/Button";
68
+ import SegmentedControl from "../actions/SegmentedControl";
69
+ import { useDateConfigLocale } from "../intl/locale";
70
+ import { useUiMessages } from "../intl/messages";
71
+ import { layoutCalendarIntervals } from "./calendar-event-layout";
72
+ import { calendarDayIndexAtPoint, calendarMinuteAtPoint, startCalendarPointerSession } from "./calendar-pointer";
73
+ const ownerDateConfig = owner => ({
74
+ ...owner.dateConfig,
75
+ timeZone: owner.timeZone ?? owner.dateConfig?.timeZone,
76
+ firstDayOfWeek: owner.firstDayOfWeek ?? owner.dateConfig?.firstDayOfWeek ?? owner.dateConfig?.weekStartsOn ?? 1
77
+ });
78
+ const dateOnlyPattern = /^\d{4}-\d{2}-\d{2}$/;
79
+ const parseDate = (value, context) => {
80
+ if (value instanceof Date) return new Date(value);
81
+ if (dateOnlyPattern.test(value)) return calendar.parseCalendarDate(value, context);
82
+ const normalized = value.includes("T") ? value : value.replace(" ", "T");
83
+ const parsed = new Date(normalized);
84
+ if (!Number.isNaN(parsed.getTime())) return parsed;
85
+ const [year, month = "1", day = "1"] = value.split("-");
86
+ return new Date(Number(year), Number(month) - 1, Number(day), 12);
87
+ };
88
+ const validDate = value => !Number.isNaN(value.getTime());
89
+ const weekNumber = date => {
90
+ const target = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
91
+ const day = target.getUTCDay() || 7;
92
+ target.setUTCDate(target.getUTCDate() + 4 - day);
93
+ const yearStart = new Date(Date.UTC(target.getUTCFullYear(), 0, 1));
94
+ return Math.ceil(((target.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
95
+ };
96
+ const zonedWeekNumber = (date, context) => {
97
+ if (!context?.timeZone) return weekNumber(date);
98
+ const [year = "1970", month = "1", day = "1"] = calendar.formatDateKey(date, context).split("-");
99
+ return weekNumber(new Date(Date.UTC(Number(year), Number(month) - 1, Number(day))));
100
+ };
101
+ const formatTime = (date, context) => calendar.formatTime(date, context);
102
+ const formatDay = (date, context) => date.toLocaleDateString(context?.locale ?? "en", {
103
+ weekday: "short",
104
+ day: "numeric",
105
+ timeZone: context?.timeZone
106
+ });
107
+ const formatMonth = (date, context) => calendar.formatMonthYear(date, context);
108
+ const zonedYearMonth = (date, context) => {
109
+ const [year = "1970", month = "1"] = calendar.formatDateKey(date, context).split("-");
110
+ return {
111
+ year: Number(year),
112
+ month: Number(month) - 1
113
+ };
114
+ };
115
+ const zonedMonthDate = (year, month, context) => {
116
+ const value = `${year}-${String(month + 1).padStart(2, "0")}-01T12:00`;
117
+ if (!context?.timeZone) return parseDate(value);
118
+ return new Date(calendar.zonedDateTimeToInstant(value, context.timeZone, {
119
+ disambiguation: "compatible"
120
+ }));
121
+ };
122
+ const startOfDay = (date, context) => calendar.startOfDay(date, context);
123
+ const endOfDay = (date, context) => calendar.endOfDay(date, context);
124
+ const isStartOfDay = (date, context) => date.getTime() === startOfDay(date, context).getTime();
125
+ const addMinutes = (date, minutes) => new Date(date.getTime() + minutes * 60 * 1000);
126
+ const zonedHour = (date, context) => {
127
+ if (!context?.timeZone) return date.getHours() + date.getMinutes() / 60;
128
+ const value = calendar.instantToZonedInput(date, context.timeZone);
129
+ return Number(value.slice(11, 13)) + Number(value.slice(14, 16)) / 60;
130
+ };
131
+ const zonedSlot = (day, hour, context) => {
132
+ return zonedMinuteSlot(day, hour * 60, context);
133
+ };
134
+ const zonedMinuteSlot = (day, minuteOfDay, context) => {
135
+ const bounded = Math.max(0, Math.min(23 * 60 + 59, minuteOfDay));
136
+ const hour = Math.floor(bounded / 60);
137
+ const minute = bounded % 60;
138
+ const value = `${calendar.formatDateKey(day, context)}T${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
139
+ if (!context?.timeZone) return parseDate(value);
140
+ return new Date(calendar.zonedDateTimeToInstant(value, context.timeZone, {
141
+ disambiguation: "compatible"
142
+ }));
143
+ };
144
+ const normalizeEvents = (events, context) => events.flatMap(event => {
145
+ const startDate = parseDate(event.start, context);
146
+ if (!validDate(startDate)) return [];
147
+ const parsedEnd = event.end ? parseDate(event.end, context) : null;
148
+ const endDate = parsedEnd && validDate(parsedEnd) ? parsedEnd : new Date(startDate.getTime() + 60 * 60 * 1000);
149
+ const duration = Math.max(60 * 60 * 1000, endDate.getTime() - startDate.getTime());
150
+ const rangeEnd = endDate > startDate ? endDate : new Date(startDate.getTime() + duration);
151
+ const startKey = calendar.formatDateKey(startDate, context);
152
+ const endKey = calendar.formatDateKey(rangeEnd, context);
153
+ if (!event.allDay && startKey === endKey) {
154
+ return [{
155
+ ...event,
156
+ startDate,
157
+ endDate: rangeEnd,
158
+ sourceStartDate: startDate,
159
+ sourceEndDate: rangeEnd,
160
+ dayKey: startKey
161
+ }];
162
+ }
163
+ const lastDay = event.allDay && isStartOfDay(rangeEnd, context) ? calendar.addDays(startOfDay(rangeEnd, context), -1, context) : startOfDay(rangeEnd, context);
164
+ const days = [];
165
+ for (let day = startOfDay(startDate, context); day <= lastDay; day = calendar.addDays(day, 1, context)) {
166
+ const segmentStart = day.getTime() === startOfDay(startDate, context).getTime() ? startDate : startOfDay(day, context);
167
+ const segmentEnd = day.getTime() === startOfDay(rangeEnd, context).getTime() ? rangeEnd : endOfDay(day, context);
168
+ days.push({
169
+ ...event,
170
+ startDate: segmentStart,
171
+ endDate: segmentEnd,
172
+ sourceStartDate: startDate,
173
+ sourceEndDate: rangeEnd,
174
+ dayKey: calendar.formatDateKey(day, context),
175
+ allDay: event.allDay
176
+ });
177
+ }
178
+ return days;
179
+ });
180
+ const eventHref = (props, event) => props.getEventHref?.(event) ?? event.href;
181
+ const moveEventTo = (event, target, allDay = false, context) => {
182
+ const duration = Math.max(30 * 60 * 1000, event.sourceEndDate.getTime() - event.sourceStartDate.getTime());
183
+ const start = allDay ? startOfDay(target, context) : new Date(target);
184
+ start.setSeconds(0, 0);
185
+ return {
186
+ start,
187
+ end: new Date(start.getTime() + duration),
188
+ allDay
189
+ };
190
+ };
191
+ const moveEventToDay = (event, day, context) => {
192
+ if (event.allDay) return moveEventTo(event, startOfDay(day, context), true, context);
193
+ const localStart = context?.timeZone ? calendar.instantToZonedInput(event.sourceStartDate, context.timeZone) : null;
194
+ const hour = localStart ? Number(localStart.slice(11, 13)) : event.sourceStartDate.getHours();
195
+ const minute = localStart ? Number(localStart.slice(14, 16)) : event.sourceStartDate.getMinutes();
196
+ return moveEventTo(event, zonedMinuteSlot(day, hour * 60 + minute, context), false, context);
197
+ };
198
+ const eventTimeChanged = (event, next) => event.sourceStartDate.getTime() !== next.start.getTime() || event.sourceEndDate.getTime() !== next.end.getTime() || Boolean(event.allDay) !== Boolean(next.allDay);
199
+ const previewSegments = (preview, days, context) => preview ? normalizeEvents([{
200
+ id: `preview-${preview.id}`,
201
+ title: preview.title ?? "",
202
+ start: preview.start,
203
+ end: preview.end,
204
+ allDay: preview.allDay,
205
+ color: "blue"
206
+ }], context).filter(event => days.some(day => event.dayKey === calendar.formatDateKey(day, context))) : [];
207
+ const timedEventLayouts = events => {
208
+ return layoutCalendarIntervals(events, event => ({
209
+ start: event.startDate.getTime(),
210
+ end: event.endDate.getTime()
211
+ })).map(({
212
+ item: event,
213
+ lane,
214
+ lanes,
215
+ groupId,
216
+ groupStart,
217
+ groupEnd
218
+ }) => ({
219
+ event,
220
+ lane,
221
+ lanes,
222
+ groupId,
223
+ groupStartDate: new Date(groupStart),
224
+ groupEndDate: new Date(groupEnd)
225
+ }));
226
+ };
227
+ const EventChip = props => {
228
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
229
+ const color = () => props.event.color ?? "blue";
230
+ const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;
231
+ const style = () => props.event.colorHex ? {
232
+ "--k2b-calendar-accent": props.event.colorHex
233
+ } : undefined;
234
+ const isInteractive = () => Boolean(props.owner.onEventActivate);
235
+ const durationHours = () => (props.event.endDate.getTime() - props.event.startDate.getTime()) / 3_600_000;
236
+ const short = () => Boolean(props.fill && !props.event.allDay && durationHours() < 0.75);
237
+ const showTime = () => !props.event.allDay && !props.compact && durationHours() >= 0.75;
238
+ const showLocation = () => Boolean(props.event.location && !props.compact && durationHours() >= 1.25);
239
+ const showDescription = () => Boolean(props.event.description?.trim() && props.fill && !props.event.allDay && !props.compact && durationHours() >= 1.5);
240
+ const timeLabel = () => `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;
241
+ const renderedEvent = () => props.owner.renderEvent?.(props.event, {
242
+ compact: props.compact ?? false,
243
+ fill: props.fill ?? false,
244
+ start: props.event.startDate,
245
+ end: props.event.endDate,
246
+ allDay: props.event.allDay ?? false,
247
+ durationHours: durationHours(),
248
+ timeLabel: timeLabel()
249
+ });
250
+ const defaultContent = [(() => {
251
+ var _el$ = _$getNextElement(_tmpl$);
252
+ _$insert(_el$, () => props.event.title);
253
+ return _el$;
254
+ })(), _$createComponent(Show, {
255
+ get when() {
256
+ return showTime();
257
+ },
258
+ get children() {
259
+ var _el$2 = _$getNextElement(_tmpl$2);
260
+ _$insert(_el$2, timeLabel);
261
+ return _el$2;
262
+ }
263
+ }), _$createComponent(Show, {
264
+ get when() {
265
+ return showLocation();
266
+ },
267
+ get children() {
268
+ var _el$3 = _$getNextElement(_tmpl$2);
269
+ _$insert(_el$3, () => props.event.location);
270
+ return _el$3;
271
+ }
272
+ }), _$createComponent(Show, {
273
+ get when() {
274
+ return showDescription();
275
+ },
276
+ get children() {
277
+ var _el$4 = _$getNextElement(_tmpl$3);
278
+ _$insert(_el$4, () => props.event.description);
279
+ return _el$4;
280
+ }
281
+ })];
282
+ const content = () => renderedEvent() ?? defaultContent;
283
+ const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);
284
+ let suppressClickUntil = 0;
285
+ const onClick = event => {
286
+ if (performance.now() < suppressClickUntil) {
287
+ event.preventDefault();
288
+ event.stopPropagation();
289
+ return;
290
+ }
291
+ if (!props.owner.onEventActivate || props.owner.eventActivation === "double") return;
292
+ event.preventDefault();
293
+ event.stopPropagation();
294
+ props.owner.onEventActivate(props.event);
295
+ };
296
+ const onDoubleClick = event => {
297
+ if (!props.owner.onEventActivate || props.owner.eventActivation !== "double") return;
298
+ event.preventDefault();
299
+ event.stopPropagation();
300
+ props.owner.onEventActivate(props.event);
301
+ };
302
+ const onButtonKeyDown = event => {
303
+ if (!isInteractive() || event.key !== "Enter" && event.key !== " ") return;
304
+ event.preventDefault();
305
+ props.owner.onEventActivate?.(props.event);
306
+ };
307
+ const onPointerDown = event => {
308
+ if (event.pointerType === "touch") return;
309
+ if (props.onMovePointerDown) event.stopPropagation();
310
+ props.onMovePointerDown?.(event, () => {
311
+ suppressClickUntil = performance.now() + 400;
312
+ });
313
+ };
314
+ return props.href ? (() => {
315
+ var _el$5 = _$getNextElement(_tmpl$4);
316
+ _el$5.$$pointerdown = onPointerDown;
317
+ _$addEventListener(_el$5, "dragstart", props.onMovePointerDown ? event => event.preventDefault() : undefined);
318
+ _el$5.$$dblclick = onDoubleClick;
319
+ _el$5.$$click = onClick;
320
+ _$insert(_el$5, content);
321
+ _$effect(_p$ => {
322
+ var _v$ = props.href,
323
+ _v$2 = props.event.colorHex ? undefined : color(),
324
+ _v$3 = selected() ? "true" : undefined,
325
+ _v$4 = props.compact ? "true" : undefined,
326
+ _v$5 = props.fill ? "true" : undefined,
327
+ _v$6 = short() ? "true" : undefined,
328
+ _v$7 = props.moving ? "true" : undefined,
329
+ _v$8 = isInteractive() ? "true" : undefined,
330
+ _v$9 = props.event.display,
331
+ _v$0 = props.event.dataSpaceItemId,
332
+ _v$1 = style(),
333
+ _v$10 = props.onMovePointerDown ? false : undefined,
334
+ _v$11 = `${props.event.title}${props.event.allDay ? "" : `, ${formatTime(props.event.startDate, dateConfig())} to ${formatTime(props.event.endDate, dateConfig())}`}`;
335
+ _v$ !== _p$.e && _$setAttribute(_el$5, "href", _p$.e = _v$);
336
+ _v$2 !== _p$.t && _$setAttribute(_el$5, "data-color", _p$.t = _v$2);
337
+ _v$3 !== _p$.a && _$setAttribute(_el$5, "data-selected", _p$.a = _v$3);
338
+ _v$4 !== _p$.o && _$setAttribute(_el$5, "data-compact", _p$.o = _v$4);
339
+ _v$5 !== _p$.i && _$setAttribute(_el$5, "data-fill", _p$.i = _v$5);
340
+ _v$6 !== _p$.n && _$setAttribute(_el$5, "data-short", _p$.n = _v$6);
341
+ _v$7 !== _p$.s && _$setAttribute(_el$5, "data-moving", _p$.s = _v$7);
342
+ _v$8 !== _p$.h && _$setAttribute(_el$5, "data-interactive", _p$.h = _v$8);
343
+ _v$9 !== _p$.r && _$setAttribute(_el$5, "data-display", _p$.r = _v$9);
344
+ _v$0 !== _p$.d && _$setAttribute(_el$5, "data-space-item-id", _p$.d = _v$0);
345
+ _p$.l = _$style(_el$5, _v$1, _p$.l);
346
+ _v$10 !== _p$.u && _$setAttribute(_el$5, "draggable", _p$.u = _v$10);
347
+ _v$11 !== _p$.c && _$setAttribute(_el$5, "aria-label", _p$.c = _v$11);
348
+ return _p$;
349
+ }, {
350
+ e: undefined,
351
+ t: undefined,
352
+ a: undefined,
353
+ o: undefined,
354
+ i: undefined,
355
+ n: undefined,
356
+ s: undefined,
357
+ h: undefined,
358
+ r: undefined,
359
+ d: undefined,
360
+ l: undefined,
361
+ u: undefined,
362
+ c: undefined
363
+ });
364
+ _$runHydrationEvents();
365
+ return _el$5;
366
+ })() : isActionable() ? (() => {
367
+ var _el$6 = _$getNextElement(_tmpl$5);
368
+ _el$6.$$keydown = onButtonKeyDown;
369
+ _el$6.$$pointerdown = onPointerDown;
370
+ _el$6.$$dblclick = onDoubleClick;
371
+ _el$6.$$click = onClick;
372
+ _$insert(_el$6, content);
373
+ _$effect(_p$ => {
374
+ var _v$12 = props.event.colorHex ? undefined : color(),
375
+ _v$13 = selected() ? "true" : undefined,
376
+ _v$14 = props.compact ? "true" : undefined,
377
+ _v$15 = props.fill ? "true" : undefined,
378
+ _v$16 = short() ? "true" : undefined,
379
+ _v$17 = props.moving ? "true" : undefined,
380
+ _v$18 = props.event.display,
381
+ _v$19 = style(),
382
+ _v$20 = `${props.event.title}${props.event.allDay ? "" : `, ${formatTime(props.event.startDate, dateConfig())} to ${formatTime(props.event.endDate, dateConfig())}`}`;
383
+ _v$12 !== _p$.e && _$setAttribute(_el$6, "data-color", _p$.e = _v$12);
384
+ _v$13 !== _p$.t && _$setAttribute(_el$6, "data-selected", _p$.t = _v$13);
385
+ _v$14 !== _p$.a && _$setAttribute(_el$6, "data-compact", _p$.a = _v$14);
386
+ _v$15 !== _p$.o && _$setAttribute(_el$6, "data-fill", _p$.o = _v$15);
387
+ _v$16 !== _p$.i && _$setAttribute(_el$6, "data-short", _p$.i = _v$16);
388
+ _v$17 !== _p$.n && _$setAttribute(_el$6, "data-moving", _p$.n = _v$17);
389
+ _v$18 !== _p$.s && _$setAttribute(_el$6, "data-display", _p$.s = _v$18);
390
+ _p$.h = _$style(_el$6, _v$19, _p$.h);
391
+ _v$20 !== _p$.r && _$setAttribute(_el$6, "aria-label", _p$.r = _v$20);
392
+ return _p$;
393
+ }, {
394
+ e: undefined,
395
+ t: undefined,
396
+ a: undefined,
397
+ o: undefined,
398
+ i: undefined,
399
+ n: undefined,
400
+ s: undefined,
401
+ h: undefined,
402
+ r: undefined
403
+ });
404
+ _$runHydrationEvents();
405
+ return _el$6;
406
+ })() : (() => {
407
+ var _el$7 = _$getNextElement(_tmpl$6);
408
+ _$setAttribute(_el$7, "data-interactive", undefined);
409
+ _$insert(_el$7, content);
410
+ _$effect(_p$ => {
411
+ var _v$21 = props.event.colorHex ? undefined : color(),
412
+ _v$22 = selected() ? "true" : undefined,
413
+ _v$23 = props.compact ? "true" : undefined,
414
+ _v$24 = props.fill ? "true" : undefined,
415
+ _v$25 = short() ? "true" : undefined,
416
+ _v$26 = props.moving ? "true" : undefined,
417
+ _v$27 = props.event.display,
418
+ _v$28 = style(),
419
+ _v$29 = `${props.event.title}${props.event.allDay ? "" : `, ${formatTime(props.event.startDate, dateConfig())} to ${formatTime(props.event.endDate, dateConfig())}`}`;
420
+ _v$21 !== _p$.e && _$setAttribute(_el$7, "data-color", _p$.e = _v$21);
421
+ _v$22 !== _p$.t && _$setAttribute(_el$7, "data-selected", _p$.t = _v$22);
422
+ _v$23 !== _p$.a && _$setAttribute(_el$7, "data-compact", _p$.a = _v$23);
423
+ _v$24 !== _p$.o && _$setAttribute(_el$7, "data-fill", _p$.o = _v$24);
424
+ _v$25 !== _p$.i && _$setAttribute(_el$7, "data-short", _p$.i = _v$25);
425
+ _v$26 !== _p$.n && _$setAttribute(_el$7, "data-moving", _p$.n = _v$26);
426
+ _v$27 !== _p$.s && _$setAttribute(_el$7, "data-display", _p$.s = _v$27);
427
+ _p$.h = _$style(_el$7, _v$28, _p$.h);
428
+ _v$29 !== _p$.r && _$setAttribute(_el$7, "aria-label", _p$.r = _v$29);
429
+ return _p$;
430
+ }, {
431
+ e: undefined,
432
+ t: undefined,
433
+ a: undefined,
434
+ o: undefined,
435
+ i: undefined,
436
+ n: undefined,
437
+ s: undefined,
438
+ h: undefined,
439
+ r: undefined
440
+ });
441
+ return _el$7;
442
+ })();
443
+ };
444
+ const slotInteractionProps = (owner, slot, suppressed, nativeControl = false) => {
445
+ const isSlotChild = event => {
446
+ if (!(event.target instanceof Element)) return false;
447
+ const control = event.target.closest("a,button,[data-calendar-event]");
448
+ return Boolean(control && control !== event.currentTarget);
449
+ };
450
+ const interactive = Boolean(owner.onSlotActivate);
451
+ const activate = event => {
452
+ if (!owner.onSlotActivate || isSlotChild(event) || suppressed?.()) return;
453
+ event.preventDefault();
454
+ owner.onSlotActivate(slot());
455
+ };
456
+ return {
457
+ role: interactive && !nativeControl ? "button" : undefined,
458
+ tabIndex: interactive && !nativeControl ? 0 : undefined,
459
+ onClick: event => {
460
+ if (owner.slotActivation === "double") return;
461
+ activate(event);
462
+ },
463
+ onDblClick: event => {
464
+ if (owner.slotActivation !== "double") return;
465
+ activate(event);
466
+ },
467
+ onKeyDown: nativeControl ? undefined : event => {
468
+ if (event.key === "Enter" || event.key === " ") activate(event);
469
+ }
470
+ };
471
+ };
472
+ /** A real anchor is the baseline; the optional handler only enhances it after hydration. */
473
+ const CalendarNavigationLink = props => {
474
+ const preload = () => props.owner.onPrefetch?.(props.href);
475
+ const navigateHref = event => {
476
+ const anchor = event.currentTarget;
477
+ 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) {
478
+ return;
479
+ }
480
+ event.preventDefault();
481
+ props.owner.onNavigateHref?.(props.href);
482
+ };
483
+ return props.owner.onNavigateHref ? (() => {
484
+ var _el$8 = _$getNextElement(_tmpl$7);
485
+ _$spread(_el$8, _$mergeProps(() => props.anchorProps, {
486
+ get href() {
487
+ return props.href;
488
+ },
489
+ "onClick": navigateHref,
490
+ "onPointerEnter": preload,
491
+ "onFocus": preload
492
+ }), false, true);
493
+ _$insert(_el$8, () => props.children);
494
+ _$runHydrationEvents();
495
+ return _el$8;
496
+ })() : props.owner.onNavigate ? _$createComponent(Link, _$mergeProps(() => props.anchorProps, {
497
+ get href() {
498
+ return props.href;
499
+ },
500
+ scroll: "preserve",
501
+ get onNavigate() {
502
+ return props.owner.onNavigate;
503
+ },
504
+ onPointerEnter: preload,
505
+ onFocus: preload,
506
+ get children() {
507
+ return props.children;
508
+ }
509
+ })) : (() => {
510
+ var _el$9 = _$getNextElement(_tmpl$7);
511
+ _$spread(_el$9, _$mergeProps(() => props.anchorProps, {
512
+ get href() {
513
+ return props.href;
514
+ },
515
+ "onPointerEnter": preload,
516
+ "onFocus": preload
517
+ }), false, true);
518
+ _$insert(_el$9, () => props.children);
519
+ _$runHydrationEvents();
520
+ return _el$9;
521
+ })();
522
+ };
523
+ const CalendarViewLinks = props => {
524
+ const messages = useUiMessages();
525
+ const refs = [];
526
+ const selectRelative = (currentIndex, direction) => {
527
+ if (props.options.length === 0) return;
528
+ refs[(currentIndex + direction + props.options.length) % props.options.length]?.click();
529
+ };
530
+ const onKeyDown = (event, index) => {
531
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
532
+ event.preventDefault();
533
+ selectRelative(index, 1);
534
+ } else if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
535
+ event.preventDefault();
536
+ selectRelative(index, -1);
537
+ } else if (event.key === "Home" || event.key === "End") {
538
+ event.preventDefault();
539
+ refs[event.key === "Home" ? 0 : props.options.length - 1]?.click();
540
+ }
541
+ };
542
+ return (() => {
543
+ var _el$0 = _$getNextElement(_tmpl$8);
544
+ _$insert(_el$0, _$createComponent(For, {
545
+ get each() {
546
+ return props.options;
547
+ },
548
+ children: (option, index) => {
549
+ const active = () => (props.view === "mobile-month" ? "month" : props.view) === option.value;
550
+ const href = () => props.owner.getViewHref?.(option.value) ?? "#";
551
+ return _$createComponent(CalendarNavigationLink, {
552
+ get owner() {
553
+ return props.owner;
554
+ },
555
+ get href() {
556
+ return href();
557
+ },
558
+ get anchorProps() {
559
+ return {
560
+ ref: element => {
561
+ refs[index()] = element;
562
+ },
563
+ role: "radio",
564
+ "aria-checked": active(),
565
+ tabIndex: active() ? 0 : -1,
566
+ class: "k2b-segmented-control__option",
567
+ "data-divider": index() < props.options.length - 1 && !active() && (props.view === "mobile-month" ? "month" : props.view) !== props.options[index() + 1]?.value ? "true" : undefined,
568
+ onKeyDown: event => onKeyDown(event, index())
569
+ };
570
+ },
571
+ get children() {
572
+ return option.label;
573
+ }
574
+ });
575
+ }
576
+ }));
577
+ _$effect(() => _$setAttribute(_el$0, "aria-label", messages().calendarView));
578
+ return _el$0;
579
+ })();
580
+ };
581
+ const adjacentCalendarDate = (date, view, direction, dateConfig) => {
582
+ if (view === "year") return calendar.addMonths(date, direction * 12, dateConfig);
583
+ if (view === "month" || view === "mobile-month") return calendar.addMonths(date, direction, dateConfig);
584
+ return calendar.addDays(date, direction * (view === "day" ? 1 : 7), dateConfig);
585
+ };
586
+ const CalendarHeader = props => {
587
+ const messages = useUiMessages();
588
+ const dateConfig = () => ownerDateConfig(props.owner);
589
+ const previous = () => adjacentCalendarDate(props.date, props.view, -1, dateConfig());
590
+ const next = () => adjacentCalendarDate(props.date, props.view, 1, dateConfig());
591
+ const title = () => {
592
+ if (props.view === "year") return new Intl.DateTimeFormat(dateConfig().locale ?? "en", {
593
+ year: "numeric",
594
+ timeZone: dateConfig().timeZone
595
+ }).format(props.date);
596
+ if (props.view === "day") return props.date.toLocaleDateString(dateConfig().locale ?? "en", {
597
+ weekday: "long",
598
+ month: "long",
599
+ day: "numeric",
600
+ year: "numeric",
601
+ timeZone: dateConfig().timeZone
602
+ });
603
+ if (props.view === "week") return `${formatDay(calendar.startOfWeek(props.date, dateConfig()), dateConfig())} - ${formatDay(calendar.addDays(calendar.startOfWeek(props.date, dateConfig()), 6, dateConfig()), dateConfig())}`;
604
+ return formatMonth(props.date, dateConfig());
605
+ };
606
+ const goDate = date => props.owner.onDateChange?.(date, props.view);
607
+ const goView = view => {
608
+ if (props.owner.onViewChange) {
609
+ props.owner.onViewChange(view);
610
+ return;
611
+ }
612
+ const href = props.owner.getViewHref?.(view);
613
+ if (href) window.location.href = href;
614
+ };
615
+ const navButton = (date, icon, label) => {
616
+ const href = props.owner.getDateHref?.(date, props.view);
617
+ return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
618
+ get owner() {
619
+ return props.owner;
620
+ },
621
+ href: href,
622
+ anchorProps: {
623
+ "aria-label": label,
624
+ title: label,
625
+ class: "k2b-calendar-header__nav-button"
626
+ },
627
+ get children() {
628
+ var _el$1 = _$getNextElement(_tmpl$9);
629
+ _$className(_el$1, `ti ${icon}`);
630
+ return _el$1;
631
+ }
632
+ }) : props.owner.onDateChange ? (() => {
633
+ var _el$10 = _$getNextElement(_tmpl$0),
634
+ _el$11 = _el$10.firstChild;
635
+ _el$10.$$click = () => goDate(date);
636
+ _$setAttribute(_el$10, "aria-label", label);
637
+ _$className(_el$11, `ti ${icon}`);
638
+ _$runHydrationEvents();
639
+ return _el$10;
640
+ })() : _$createComponent(CalendarNavigationLink, {
641
+ get owner() {
642
+ return props.owner;
643
+ },
644
+ href: href ?? "#",
645
+ anchorProps: {
646
+ "aria-label": label,
647
+ title: label,
648
+ class: "k2b-calendar-header__nav-button"
649
+ },
650
+ get children() {
651
+ var _el$12 = _$getNextElement(_tmpl$9);
652
+ _$className(_el$12, `ti ${icon}`);
653
+ return _el$12;
654
+ }
655
+ });
656
+ };
657
+ const todayButton = () => {
658
+ const today = calendar.today(dateConfig());
659
+ const href = props.owner.getDateHref?.(today, props.view);
660
+ const label = (() => {
661
+ var _el$13 = _$getNextElement(_tmpl$1);
662
+ _$insert(_el$13, () => props.labels.today);
663
+ return _el$13;
664
+ })();
665
+ return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
666
+ get owner() {
667
+ return props.owner;
668
+ },
669
+ href: href,
670
+ anchorProps: {
671
+ class: "k2b-button k2b-calendar-header__today",
672
+ "data-size": "sm",
673
+ "data-variant": "input"
674
+ },
675
+ children: label
676
+ }) : props.owner.onDateChange ? _$createComponent(Button, {
677
+ type: "button",
678
+ variant: "input",
679
+ size: "sm",
680
+ "class": "k2b-calendar-header__today",
681
+ onClick: () => goDate(today),
682
+ get children() {
683
+ return props.labels.today;
684
+ }
685
+ }) : _$createComponent(CalendarNavigationLink, {
686
+ get owner() {
687
+ return props.owner;
688
+ },
689
+ href: href ?? "#",
690
+ anchorProps: {
691
+ class: "k2b-button k2b-calendar-header__today",
692
+ "data-size": "sm",
693
+ "data-variant": "input"
694
+ },
695
+ children: label
696
+ });
697
+ };
698
+ const viewOptions = createMemo(() => [{
699
+ value: "day",
700
+ label: props.labels.day
701
+ }, {
702
+ value: "week",
703
+ label: props.labels.week
704
+ }, {
705
+ value: "month",
706
+ label: props.labels.month
707
+ }, {
708
+ value: "year",
709
+ label: props.labels.year
710
+ }].filter(option => !props.owner.views || props.owner.views.includes(option.value)));
711
+ return (() => {
712
+ var _el$14 = _$getNextElement(_tmpl$11),
713
+ _el$15 = _el$14.firstChild,
714
+ _el$17 = _el$15.firstChild,
715
+ [_el$18, _co$] = _$getNextMarker(_el$17.nextSibling),
716
+ _el$19 = _el$18.nextSibling,
717
+ [_el$20, _co$2] = _$getNextMarker(_el$19.nextSibling),
718
+ _el$16 = _el$20.nextSibling,
719
+ _el$21 = _el$15.nextSibling,
720
+ _el$22 = _el$21.firstChild,
721
+ [_el$23, _co$3] = _$getNextMarker(_el$22.nextSibling),
722
+ _el$24 = _el$23.nextSibling,
723
+ [_el$25, _co$4] = _$getNextMarker(_el$24.nextSibling),
724
+ _el$26 = _el$25.nextSibling,
725
+ [_el$27, _co$5] = _$getNextMarker(_el$26.nextSibling),
726
+ _el$29 = _el$21.nextSibling,
727
+ [_el$30, _co$6] = _$getNextMarker(_el$29.nextSibling);
728
+ _$insert(_el$15, () => navButton(previous(), "ti-chevron-left", props.labels.previous), _el$18, _co$);
729
+ _$insert(_el$15, () => navButton(next(), "ti-chevron-right", props.labels.next), _el$20, _co$2);
730
+ _$insert(_el$16, title);
731
+ _$insert(_el$21, todayButton, _el$23, _co$3);
732
+ _$insert(_el$21, _$createComponent(Show, {
733
+ get when() {
734
+ return _$memo(() => !!!props.owner.onViewChange)() && props.owner.getViewHref;
735
+ },
736
+ get fallback() {
737
+ return _$createComponent(SegmentedControl, {
738
+ value: () => props.view === "mobile-month" ? "month" : props.view,
739
+ onValueChange: goView,
740
+ get ariaLabel() {
741
+ return messages().calendarView;
742
+ },
743
+ get options() {
744
+ return viewOptions();
745
+ }
746
+ });
747
+ },
748
+ get children() {
749
+ return _$createComponent(CalendarViewLinks, {
750
+ get owner() {
751
+ return props.owner;
752
+ },
753
+ get view() {
754
+ return props.view;
755
+ },
756
+ get options() {
757
+ return viewOptions();
758
+ }
759
+ });
760
+ }
761
+ }), _el$25, _co$4);
762
+ _$insert(_el$21, () => props.owner.toolbarActions, _el$27, _co$5);
763
+ _$insert(_el$14, _$createComponent(Show, {
764
+ get when() {
765
+ return props.owner.navigationPending;
766
+ },
767
+ get children() {
768
+ return _$getNextElement(_tmpl$10);
769
+ }
770
+ }), _el$30, _co$6);
771
+ return _el$14;
772
+ })();
773
+ };
774
+ const MonthView = props => {
775
+ const messages = useUiMessages();
776
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
777
+ const [movePreview, setMovePreview] = createSignal(null);
778
+ const [movingEventId, setMovingEventId] = createSignal("");
779
+ let cancelInteraction;
780
+ let suppressSlotClickUntil = 0;
781
+ const month = createMemo(() => zonedYearMonth(props.date, dateConfig()));
782
+ const weeks = createMemo(() => calendar.getMonthGrid(month().year, month().month, dateConfig()));
783
+ const weekdays = createMemo(() => calendar.weekdays(dateConfig()));
784
+ const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
785
+ const eventsByDay = createMemo(() => {
786
+ const grouped = new Map();
787
+ for (const event of props.events) {
788
+ const events = grouped.get(event.dayKey);
789
+ if (events) events.push(event);else grouped.set(event.dayKey, [event]);
790
+ }
791
+ return grouped;
792
+ });
793
+ const clearMove = () => {
794
+ setMovePreview(null);
795
+ setMovingEventId("");
796
+ };
797
+ const dayAtPoint = (clientX, clientY) => {
798
+ const target = document.elementFromPoint(clientX, clientY)?.closest("[data-calendar-day-key]");
799
+ const dayKey = target?.dataset.calendarDayKey;
800
+ return dayKey ? calendar.parseCalendarDate(dayKey, dateConfig()) : null;
801
+ };
802
+ const startMove = (pointerEvent, event, markDragged) => {
803
+ if (!props.owner.onEventDrop) return;
804
+ cancelInteraction?.();
805
+ cancelInteraction = startCalendarPointerSession({
806
+ event: pointerEvent,
807
+ resolve: (clientX, clientY) => {
808
+ const day = dayAtPoint(clientX, clientY);
809
+ return day ? {
810
+ id: event.id,
811
+ ...moveEventToDay(event, day, dateConfig())
812
+ } : null;
813
+ },
814
+ onActivate: () => {
815
+ markDragged();
816
+ suppressSlotClickUntil = performance.now() + 400;
817
+ setMovingEventId(event.id);
818
+ },
819
+ onPreview: setMovePreview,
820
+ onCommit: next => {
821
+ clearMove();
822
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
823
+ },
824
+ onCancel: clearMove
825
+ });
826
+ };
827
+ onCleanup(() => cancelInteraction?.());
828
+ return (() => {
829
+ var _el$31 = _$getNextElement(_tmpl$13),
830
+ _el$32 = _el$31.firstChild,
831
+ _el$34 = _el$32.firstChild,
832
+ [_el$35, _co$7] = _$getNextMarker(_el$34.nextSibling),
833
+ _el$36 = _el$35.nextSibling,
834
+ [_el$37, _co$8] = _$getNextMarker(_el$36.nextSibling),
835
+ _el$38 = _el$32.nextSibling,
836
+ [_el$39, _co$9] = _$getNextMarker(_el$38.nextSibling);
837
+ _$insert(_el$32, _$createComponent(Show, {
838
+ get when() {
839
+ return props.owner.withWeekNumbers;
840
+ },
841
+ get children() {
842
+ var _el$33 = _$getNextElement(_tmpl$12);
843
+ _$insert(_el$33, () => messages().weekShort);
844
+ return _el$33;
845
+ }
846
+ }), _el$35, _co$7);
847
+ _$insert(_el$32, _$createComponent(For, {
848
+ get each() {
849
+ return weekdays();
850
+ },
851
+ children: day => (() => {
852
+ var _el$40 = _$getNextElement(_tmpl$12);
853
+ _$insert(_el$40, day);
854
+ return _el$40;
855
+ })()
856
+ }), _el$37, _co$8);
857
+ _$insert(_el$31, _$createComponent(For, {
858
+ get each() {
859
+ return weeks();
860
+ },
861
+ children: week => (() => {
862
+ var _el$41 = _$getNextElement(_tmpl$15),
863
+ _el$43 = _el$41.firstChild,
864
+ [_el$44, _co$0] = _$getNextMarker(_el$43.nextSibling),
865
+ _el$45 = _el$44.nextSibling,
866
+ [_el$46, _co$1] = _$getNextMarker(_el$45.nextSibling);
867
+ _$insert(_el$41, _$createComponent(Show, {
868
+ get when() {
869
+ return props.owner.withWeekNumbers;
870
+ },
871
+ get children() {
872
+ var _el$42 = _$getNextElement(_tmpl$14);
873
+ _$insert(_el$42, () => zonedWeekNumber(week[0], dateConfig()));
874
+ return _el$42;
875
+ }
876
+ }), _el$44, _co$0);
877
+ _$insert(_el$41, _$createComponent(For, {
878
+ each: week,
879
+ children: day => {
880
+ const dayKey = calendar.formatDateKey(day, dateConfig());
881
+ const events = eventsByDay().get(dayKey) ?? [];
882
+ const href = props.owner.getDateHref?.(day, "day");
883
+ const dayBadge = props.owner.dayBadges?.[dayKey];
884
+ const sameMonth = calendar.isSameMonth(day, props.date, dateConfig());
885
+ const isToday = dayKey === todayKey();
886
+ const dayLabel = day.toLocaleDateString(dateConfig().locale ?? "en", {
887
+ weekday: "long",
888
+ year: "numeric",
889
+ month: "long",
890
+ day: "numeric",
891
+ timeZone: dateConfig().timeZone
892
+ });
893
+ const eventStack = createMemo(() => {
894
+ const preview = movePreview();
895
+ const previewForDay = preview && calendar.formatDateKey(preview.start, dateConfig()) === dayKey ? preview : null;
896
+ const candidates = previewForDay ? events.filter(event => event.id !== previewForDay.id) : events;
897
+ const visibleLimit = previewForDay ? 2 : 3;
898
+ return {
899
+ preview: previewForDay,
900
+ visibleEvents: candidates.slice(0, visibleLimit),
901
+ hiddenCount: Math.max(0, candidates.length - visibleLimit)
902
+ };
903
+ });
904
+ return (() => {
905
+ var _el$47 = _$getNextElement(_tmpl$18),
906
+ _el$63 = _el$47.firstChild,
907
+ [_el$64, _co$15] = _$getNextMarker(_el$63.nextSibling),
908
+ _el$49 = _el$64.nextSibling,
909
+ _el$50 = _el$49.firstChild,
910
+ [_el$51, _co$10] = _$getNextMarker(_el$50.nextSibling),
911
+ _el$52 = _el$51.nextSibling,
912
+ [_el$53, _co$11] = _$getNextMarker(_el$52.nextSibling),
913
+ _el$54 = _el$49.nextSibling,
914
+ _el$56 = _el$54.firstChild,
915
+ [_el$57, _co$12] = _$getNextMarker(_el$56.nextSibling),
916
+ _el$58 = _el$57.nextSibling,
917
+ [_el$59, _co$13] = _$getNextMarker(_el$58.nextSibling),
918
+ _el$60 = _el$59.nextSibling,
919
+ [_el$61, _co$14] = _$getNextMarker(_el$60.nextSibling),
920
+ _el$62 = _el$54.nextSibling;
921
+ _$setAttribute(_el$47, "data-calendar-day-key", dayKey);
922
+ _$setAttribute(_el$47, "data-outside", !sameMonth ? "true" : undefined);
923
+ _$insert(_el$47, _$createComponent(Show, {
924
+ get when() {
925
+ return props.owner.onSlotActivate;
926
+ },
927
+ get fallback() {
928
+ return _$createComponent(Show, {
929
+ when: href,
930
+ children: dayHref => _$createComponent(CalendarNavigationLink, {
931
+ get owner() {
932
+ return props.owner;
933
+ },
934
+ get href() {
935
+ return dayHref();
936
+ },
937
+ get anchorProps() {
938
+ return {
939
+ class: "k2b-calendar-month__day-target",
940
+ "aria-label": messages().openDate({
941
+ label: dayLabel
942
+ })
943
+ };
944
+ }
945
+ })
946
+ });
947
+ },
948
+ get children() {
949
+ var _el$48 = _$getNextElement(_tmpl$16);
950
+ _$spread(_el$48, _$mergeProps({
951
+ get ["aria-label"]() {
952
+ return messages().createEventOn({
953
+ label: dayLabel
954
+ });
955
+ }
956
+ }, () => slotInteractionProps(props.owner, () => {
957
+ const start = startOfDay(day, dateConfig());
958
+ return {
959
+ start,
960
+ end: calendar.addDays(start, 1, dateConfig()),
961
+ allDay: true
962
+ };
963
+ }, () => performance.now() < suppressSlotClickUntil, true)), false, false);
964
+ _$runHydrationEvents();
965
+ return _el$48;
966
+ }
967
+ }), _el$64, _co$15);
968
+ _$insert(_el$49, _$createComponent(Show, {
969
+ get when() {
970
+ return props.owner.onSlotActivate && href;
971
+ },
972
+ get fallback() {
973
+ return (() => {
974
+ var _el$65 = _$getNextElement(_tmpl$19);
975
+ _$setAttribute(_el$65, "data-today", isToday ? "true" : undefined);
976
+ _$setAttribute(_el$65, "data-outside", !sameMonth ? "true" : undefined);
977
+ _$insert(_el$65, () => calendar.formatDayNumber(day, dateConfig()));
978
+ return _el$65;
979
+ })();
980
+ },
981
+ children: dayHref => _$createComponent(CalendarNavigationLink, {
982
+ get owner() {
983
+ return props.owner;
984
+ },
985
+ get href() {
986
+ return dayHref();
987
+ },
988
+ get anchorProps() {
989
+ return {
990
+ class: "k2b-calendar-month__day-number",
991
+ "data-today": isToday ? "true" : undefined,
992
+ "data-outside": !sameMonth ? "true" : undefined,
993
+ "aria-label": messages().openDate({
994
+ label: dayLabel
995
+ })
996
+ };
997
+ },
998
+ get children() {
999
+ return calendar.formatDayNumber(day, dateConfig());
1000
+ }
1001
+ })
1002
+ }), _el$51, _co$10);
1003
+ _$insert(_el$49, _$createComponent(Show, {
1004
+ when: dayBadge,
1005
+ children: badge => (() => {
1006
+ var _el$66 = _$getNextElement(_tmpl$20),
1007
+ _el$67 = _el$66.firstChild,
1008
+ [_el$68, _co$16] = _$getNextMarker(_el$67.nextSibling),
1009
+ _el$69 = _el$68.nextSibling,
1010
+ [_el$70, _co$17] = _$getNextMarker(_el$69.nextSibling);
1011
+ _$insert(_el$66, _$createComponent(Show, {
1012
+ get when() {
1013
+ return badge().icon;
1014
+ },
1015
+ children: icon => (() => {
1016
+ var _el$71 = _$getNextElement(_tmpl$9);
1017
+ _$effect(() => _$className(_el$71, `k2b-calendar-month__badge-icon ti ti-${icon()}`));
1018
+ return _el$71;
1019
+ })()
1020
+ }), _el$68, _co$16);
1021
+ _$insert(_el$66, () => badge().label, _el$70, _co$17);
1022
+ return _el$66;
1023
+ })()
1024
+ }), _el$53, _co$11);
1025
+ _$insert(_el$54, _$createComponent(Show, {
1026
+ get when() {
1027
+ return eventStack().preview;
1028
+ },
1029
+ get children() {
1030
+ var _el$55 = _$getNextElement(_tmpl$17);
1031
+ _$insert(_el$55, () => props.events.find(event => event.id === eventStack().preview.id)?.title ?? messages().moveEvent);
1032
+ return _el$55;
1033
+ }
1034
+ }), _el$57, _co$12);
1035
+ _$insert(_el$54, _$createComponent(For, {
1036
+ get each() {
1037
+ return eventStack().visibleEvents;
1038
+ },
1039
+ children: event => _$createComponent(EventChip, {
1040
+ event: event,
1041
+ get owner() {
1042
+ return props.owner;
1043
+ },
1044
+ get href() {
1045
+ return eventHref(props.owner, event);
1046
+ },
1047
+ compact: true,
1048
+ get moving() {
1049
+ return movingEventId() === event.id;
1050
+ },
1051
+ get onMovePointerDown() {
1052
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, event, markDragged) : undefined;
1053
+ }
1054
+ })
1055
+ }), _el$59, _co$13);
1056
+ _$insert(_el$54, _$createComponent(Show, {
1057
+ get when() {
1058
+ return eventStack().hiddenCount > 0;
1059
+ },
1060
+ get children() {
1061
+ return _$createComponent(CalendarNavigationLink, {
1062
+ get owner() {
1063
+ return props.owner;
1064
+ },
1065
+ href: href ?? "#",
1066
+ anchorProps: {
1067
+ class: "k2b-calendar-month__more"
1068
+ },
1069
+ get children() {
1070
+ return ["+", _$memo(() => eventStack().hiddenCount), " more"];
1071
+ }
1072
+ });
1073
+ }
1074
+ }), _el$61, _co$14);
1075
+ _$insert(_el$62, _$createComponent(For, {
1076
+ get each() {
1077
+ return events.slice(0, 4);
1078
+ },
1079
+ children: event => (() => {
1080
+ var _el$72 = _$getNextElement(_tmpl$21);
1081
+ _$effect(_p$ => {
1082
+ var _v$32 = event.colorHex ? undefined : event.color ?? "blue",
1083
+ _v$33 = event.colorHex ? {
1084
+ "background-color": event.colorHex
1085
+ } : undefined;
1086
+ _v$32 !== _p$.e && _$setAttribute(_el$72, "data-color", _p$.e = _v$32);
1087
+ _p$.t = _$style(_el$72, _v$33, _p$.t);
1088
+ return _p$;
1089
+ }, {
1090
+ e: undefined,
1091
+ t: undefined
1092
+ });
1093
+ return _el$72;
1094
+ })()
1095
+ }));
1096
+ _$effect(() => _$setAttribute(_el$47, "data-drop-preview", movePreview()?.start && calendar.formatDateKey(movePreview().start, dateConfig()) === dayKey ? "true" : undefined));
1097
+ return _el$47;
1098
+ })();
1099
+ }
1100
+ }), _el$46, _co$1);
1101
+ _$effect(() => _$setAttribute(_el$41, "data-week-numbers", props.owner.withWeekNumbers ? "true" : undefined));
1102
+ return _el$41;
1103
+ })()
1104
+ }), _el$39, _co$9);
1105
+ _$effect(_p$ => {
1106
+ var _v$30 = `auto repeat(${weeks().length}, minmax(5rem, 1fr))`,
1107
+ _v$31 = props.owner.withWeekNumbers ? "true" : undefined;
1108
+ _v$30 !== _p$.e && _$setStyleProperty(_el$31, "grid-template-rows", _p$.e = _v$30);
1109
+ _v$31 !== _p$.t && _$setAttribute(_el$32, "data-week-numbers", _p$.t = _v$31);
1110
+ return _p$;
1111
+ }, {
1112
+ e: undefined,
1113
+ t: undefined
1114
+ });
1115
+ return _el$31;
1116
+ })();
1117
+ };
1118
+ const TimeGridView = props => {
1119
+ const messages = useUiMessages();
1120
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1121
+ const gridStartHour = () => props.owner.visibleStartHour ?? 0;
1122
+ const gridEndHour = () => props.owner.visibleEndHour ?? 23;
1123
+ const businessStartHour = () => props.owner.startHour ?? 8;
1124
+ const businessEndHour = () => props.owner.endHour ?? 18;
1125
+ const hours = createMemo(() => Array.from({
1126
+ length: gridEndHour() - gridStartHour() + 1
1127
+ }, (_, index) => gridStartHour() + index));
1128
+ const [timePreview, setTimePreview] = createSignal(null);
1129
+ const [movingEventId, setMovingEventId] = createSignal("");
1130
+ const [expandedOverflow, setExpandedOverflow] = createSignal("");
1131
+ let scrollContainer;
1132
+ let timeGrid;
1133
+ let timeGutter;
1134
+ let defaultHourMarker;
1135
+ let cancelInteraction;
1136
+ let suppressSlotClickUntil = 0;
1137
+ const slotEnd = start => addMinutes(start, 60);
1138
+ const previewEvents = createMemo(() => previewSegments(timePreview(), props.days, dateConfig()));
1139
+ const eventsByDay = createMemo(() => {
1140
+ const grouped = new Map();
1141
+ for (const event of props.events) {
1142
+ const bucket = grouped.get(event.dayKey) ?? {
1143
+ allDay: [],
1144
+ timed: []
1145
+ };
1146
+ (event.allDay ? bucket.allDay : bucket.timed).push(event);
1147
+ grouped.set(event.dayKey, bucket);
1148
+ }
1149
+ return grouped;
1150
+ });
1151
+ const clearInteraction = () => {
1152
+ setTimePreview(null);
1153
+ setMovingEventId("");
1154
+ };
1155
+ const dayAtPoint = (clientX, clientY) => {
1156
+ const target = document.elementFromPoint(clientX, clientY)?.closest("[data-calendar-day-key]");
1157
+ const dayKey = target?.dataset.calendarDayKey;
1158
+ return dayKey ? calendar.parseCalendarDate(dayKey, dateConfig()) : null;
1159
+ };
1160
+ const timeAtPoint = (clientX, clientY) => {
1161
+ if (!timeGrid || !timeGutter) return null;
1162
+ const gridRect = timeGrid.getBoundingClientRect();
1163
+ const gutterRect = timeGutter.getBoundingClientRect();
1164
+ const dayIndex = calendarDayIndexAtPoint(clientX, gutterRect.right, gridRect.right - gutterRect.right, props.days.length);
1165
+ if (dayIndex === null) return null;
1166
+ const minute = Math.min(gridEndHour() * 60 + 45, calendarMinuteAtPoint(clientY, gridRect.top, gridRect.height, gridStartHour(), gridEndHour()));
1167
+ return zonedMinuteSlot(props.days[dayIndex], minute, dateConfig());
1168
+ };
1169
+ const beginInteraction = options => {
1170
+ cancelInteraction?.();
1171
+ cancelInteraction = startCalendarPointerSession(options);
1172
+ };
1173
+ const startTimedMove = (pointerEvent, event, markDragged) => {
1174
+ if (!props.owner.onEventDrop) return;
1175
+ const pointerStart = timeAtPoint(pointerEvent.clientX, pointerEvent.clientY) ?? event.sourceStartDate;
1176
+ const duration = Math.max(15 * 60_000, event.sourceEndDate.getTime() - event.sourceStartDate.getTime());
1177
+ const offsetMinutes = Math.max(0, Math.min(duration / 60_000, Math.round((pointerStart.getTime() - event.sourceStartDate.getTime()) / 900_000) * 15));
1178
+ beginInteraction({
1179
+ event: pointerEvent,
1180
+ scrollContainer,
1181
+ resolve: (clientX, clientY) => {
1182
+ const pointer = timeAtPoint(clientX, clientY);
1183
+ if (!pointer) return null;
1184
+ const start = new Date(pointer.getTime() - offsetMinutes * 60_000);
1185
+ return {
1186
+ id: event.id,
1187
+ title: event.title,
1188
+ start,
1189
+ end: new Date(start.getTime() + duration),
1190
+ allDay: false
1191
+ };
1192
+ },
1193
+ onActivate: () => {
1194
+ markDragged();
1195
+ suppressSlotClickUntil = performance.now() + 400;
1196
+ setMovingEventId(event.id);
1197
+ },
1198
+ onPreview: setTimePreview,
1199
+ onCommit: next => {
1200
+ clearInteraction();
1201
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
1202
+ },
1203
+ onCancel: clearInteraction
1204
+ });
1205
+ };
1206
+ const startAllDayMove = (pointerEvent, event, markDragged) => {
1207
+ if (!props.owner.onEventDrop) return;
1208
+ beginInteraction({
1209
+ event: pointerEvent,
1210
+ resolve: (clientX, clientY) => {
1211
+ const day = dayAtPoint(clientX, clientY);
1212
+ return day ? {
1213
+ id: event.id,
1214
+ title: event.title,
1215
+ ...moveEventTo(event, startOfDay(day, dateConfig()), true, dateConfig())
1216
+ } : null;
1217
+ },
1218
+ onActivate: () => {
1219
+ markDragged();
1220
+ suppressSlotClickUntil = performance.now() + 400;
1221
+ setMovingEventId(event.id);
1222
+ },
1223
+ onPreview: setTimePreview,
1224
+ onCommit: next => {
1225
+ clearInteraction();
1226
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
1227
+ },
1228
+ onCancel: clearInteraction
1229
+ });
1230
+ };
1231
+ const startRange = pointerEvent => {
1232
+ if (!props.owner.onSlotActivate || pointerEvent.pointerType === "touch") return;
1233
+ const anchor = timeAtPoint(pointerEvent.clientX, pointerEvent.clientY);
1234
+ if (!anchor) return;
1235
+ beginInteraction({
1236
+ event: pointerEvent,
1237
+ scrollContainer,
1238
+ resolve: (clientX, clientY) => {
1239
+ const current = timeAtPoint(clientX, clientY);
1240
+ if (!current) return null;
1241
+ const start = current < anchor ? current : anchor;
1242
+ const endBase = current < anchor ? anchor : current;
1243
+ return {
1244
+ id: "calendar-create-preview",
1245
+ start,
1246
+ end: addMinutes(endBase, 15),
1247
+ allDay: false
1248
+ };
1249
+ },
1250
+ onActivate: () => {
1251
+ suppressSlotClickUntil = performance.now() + 400;
1252
+ },
1253
+ onPreview: setTimePreview,
1254
+ onCommit: next => {
1255
+ clearInteraction();
1256
+ props.owner.onSlotActivate?.(next);
1257
+ },
1258
+ onCancel: clearInteraction
1259
+ });
1260
+ };
1261
+ const timeRangeLayout = (startDate, endDate) => {
1262
+ const start = zonedHour(startDate, dateConfig());
1263
+ const end = zonedHour(endDate, dateConfig());
1264
+ const visibleStart = Math.max(gridStartHour(), start);
1265
+ const visibleEnd = Math.min(gridEndHour() + 1, end);
1266
+ const total = Math.max(1, gridEndHour() - gridStartHour() + 1);
1267
+ return {
1268
+ top: Math.max(0, (visibleStart - gridStartHour()) / total * 100),
1269
+ height: Math.max(1.25, (visibleEnd - visibleStart) / total * 100)
1270
+ };
1271
+ };
1272
+ const eventLayout = event => timeRangeLayout(event.startDate, event.endDate);
1273
+ const isDayView = () => props.days.length === 1;
1274
+ const visibleLaneCount = lanes => isDayView() ? lanes : Math.min(lanes, 3);
1275
+ const overflowLayouts = layouts => {
1276
+ if (isDayView()) return [];
1277
+ const groups = new Map();
1278
+ for (const layout of layouts) {
1279
+ if (layout.lane < visibleLaneCount(layout.lanes)) continue;
1280
+ const existing = groups.get(layout.groupId);
1281
+ if (existing) existing.hiddenEvents.push(layout.event);else groups.set(layout.groupId, {
1282
+ groupId: layout.groupId,
1283
+ hiddenEvents: [layout.event],
1284
+ groupStartDate: layout.groupStartDate,
1285
+ groupEndDate: layout.groupEndDate
1286
+ });
1287
+ }
1288
+ return [...groups.values()];
1289
+ };
1290
+ const dayColumnMinWidth = layouts => {
1291
+ if (!isDayView()) return undefined;
1292
+ const lanes = Math.max(1, ...layouts.map(layout => layout.lanes));
1293
+ return `${Math.max(32, lanes * 12)}rem`;
1294
+ };
1295
+ const laneStyle = layoutItem => {
1296
+ if (isDayView()) {
1297
+ const laneWidth = 100 / layoutItem.lanes;
1298
+ return {
1299
+ left: `calc(${layoutItem.lane * laneWidth}% + 0.25rem)`,
1300
+ width: `calc(${laneWidth}% - 0.5rem)`
1301
+ };
1302
+ }
1303
+ const visibleLanes = visibleLaneCount(layoutItem.lanes);
1304
+ return {
1305
+ left: `${layoutItem.lanes <= 1 ? 0 : 28 / Math.max(1, visibleLanes - 1) * layoutItem.lane}%`,
1306
+ width: `${layoutItem.lanes <= 1 ? 100 : layoutItem.lanes > visibleLanes ? 68 : 72}%`
1307
+ };
1308
+ };
1309
+ const currentTimeLine = day => {
1310
+ const now = props.now;
1311
+ if (calendar.formatDateKey(day, dateConfig()) !== calendar.formatDateKey(now, dateConfig())) return null;
1312
+ const hour = zonedHour(now, dateConfig());
1313
+ if (hour < gridStartHour() || hour > gridEndHour() + 1) return null;
1314
+ return (hour - gridStartHour()) / Math.max(1, gridEndHour() - gridStartHour() + 1) * 100;
1315
+ };
1316
+ onCleanup(() => cancelInteraction?.());
1317
+ onMount(() => {
1318
+ requestAnimationFrame(() => {
1319
+ if (!scrollContainer || !defaultHourMarker) return;
1320
+ const targetTop = defaultHourMarker.getBoundingClientRect().top - scrollContainer.getBoundingClientRect().top;
1321
+ scrollContainer.scrollTo({
1322
+ top: Math.max(0, scrollContainer.scrollTop + targetTop),
1323
+ behavior: "smooth"
1324
+ });
1325
+ });
1326
+ });
1327
+ return (() => {
1328
+ var _el$73 = _$getNextElement(_tmpl$23),
1329
+ _el$74 = _el$73.firstChild,
1330
+ _el$75 = _el$74.firstChild,
1331
+ _el$76 = _el$75.nextSibling,
1332
+ [_el$77, _co$18] = _$getNextMarker(_el$76.nextSibling),
1333
+ _el$87 = _el$74.nextSibling,
1334
+ [_el$88, _co$21] = _$getNextMarker(_el$87.nextSibling),
1335
+ _el$82 = _el$88.nextSibling,
1336
+ _el$83 = _el$82.firstChild,
1337
+ _el$84 = _el$83.firstChild,
1338
+ _el$85 = _el$84.nextSibling,
1339
+ [_el$86, _co$20] = _$getNextMarker(_el$85.nextSibling);
1340
+ _$insert(_el$74, _$createComponent(For, {
1341
+ get each() {
1342
+ return props.days;
1343
+ },
1344
+ children: day => {
1345
+ const dayBadge = props.owner.dayBadges?.[calendar.formatDateKey(day, dateConfig())];
1346
+ const today = () => calendar.isToday(day, dateConfig());
1347
+ return _$createComponent(CalendarNavigationLink, {
1348
+ get owner() {
1349
+ return props.owner;
1350
+ },
1351
+ get href() {
1352
+ return props.owner.getDateHref?.(day, "day") ?? "#";
1353
+ },
1354
+ anchorProps: {
1355
+ class: "k2b-calendar-time-grid__day"
1356
+ },
1357
+ get children() {
1358
+ return [(() => {
1359
+ var _el$89 = _$getNextElement(_tmpl$24);
1360
+ _$insert(_el$89, () => formatDay(day, dateConfig()));
1361
+ _$effect(() => _$setAttribute(_el$89, "data-today", today() ? "true" : undefined));
1362
+ return _el$89;
1363
+ })(), _$createComponent(Show, {
1364
+ when: dayBadge,
1365
+ children: badge => (() => {
1366
+ var _el$90 = _$getNextElement(_tmpl$25),
1367
+ _el$91 = _el$90.firstChild,
1368
+ [_el$92, _co$22] = _$getNextMarker(_el$91.nextSibling),
1369
+ _el$93 = _el$92.nextSibling,
1370
+ [_el$94, _co$23] = _$getNextMarker(_el$93.nextSibling);
1371
+ _$insert(_el$90, _$createComponent(Show, {
1372
+ get when() {
1373
+ return badge().icon;
1374
+ },
1375
+ children: icon => (() => {
1376
+ var _el$95 = _$getNextElement(_tmpl$9);
1377
+ _$effect(() => _$className(_el$95, `k2b-calendar-time-grid__badge-icon ti ti-${icon()}`));
1378
+ return _el$95;
1379
+ })()
1380
+ }), _el$92, _co$22);
1381
+ _$insert(_el$90, () => badge().label, _el$94, _co$23);
1382
+ return _el$90;
1383
+ })()
1384
+ })];
1385
+ }
1386
+ });
1387
+ }
1388
+ }), _el$77, _co$18);
1389
+ _$insert(_el$73, _$createComponent(Show, {
1390
+ get when() {
1391
+ return !props.owner.hideAllDay;
1392
+ },
1393
+ get children() {
1394
+ var _el$78 = _$getNextElement(_tmpl$22),
1395
+ _el$79 = _el$78.firstChild,
1396
+ _el$80 = _el$79.nextSibling,
1397
+ [_el$81, _co$19] = _$getNextMarker(_el$80.nextSibling);
1398
+ _$insert(_el$79, () => props.labels.allDay);
1399
+ _$insert(_el$78, _$createComponent(For, {
1400
+ get each() {
1401
+ return props.days;
1402
+ },
1403
+ children: day => {
1404
+ const dayKey = calendar.formatDateKey(day, dateConfig());
1405
+ const allDay = () => eventsByDay().get(dayKey)?.allDay ?? [];
1406
+ const previewAllDay = previewEvents().filter(event => event.dayKey === dayKey && event.allDay);
1407
+ return (() => {
1408
+ var _el$96 = _$getNextElement(_tmpl$26),
1409
+ _el$97 = _el$96.firstChild,
1410
+ _el$98 = _el$97.firstChild,
1411
+ [_el$99, _co$24] = _$getNextMarker(_el$98.nextSibling),
1412
+ _el$100 = _el$99.nextSibling,
1413
+ [_el$101, _co$25] = _$getNextMarker(_el$100.nextSibling);
1414
+ _$setAttribute(_el$96, "data-calendar-day-key", dayKey);
1415
+ _$spread(_el$96, _$mergeProps({
1416
+ get ["data-drop-preview"]() {
1417
+ return timePreview()?.allDay && calendar.formatDateKey(timePreview().start, dateConfig()) === dayKey ? "true" : undefined;
1418
+ },
1419
+ get ["data-interactive"]() {
1420
+ return props.owner.onSlotActivate ? "true" : undefined;
1421
+ }
1422
+ }, () => slotInteractionProps(props.owner, () => {
1423
+ const start = startOfDay(day, dateConfig());
1424
+ return {
1425
+ start,
1426
+ end: calendar.addDays(start, 1, dateConfig()),
1427
+ allDay: true
1428
+ };
1429
+ }, () => performance.now() < suppressSlotClickUntil)), false, true);
1430
+ _$insert(_el$97, _$createComponent(For, {
1431
+ each: previewAllDay,
1432
+ children: event => (() => {
1433
+ var _el$102 = _$getNextElement(_tmpl$17);
1434
+ _$insert(_el$102, () => event.title);
1435
+ return _el$102;
1436
+ })()
1437
+ }), _el$99, _co$24);
1438
+ _$insert(_el$97, _$createComponent(For, {
1439
+ get each() {
1440
+ return allDay();
1441
+ },
1442
+ children: event => _$createComponent(EventChip, {
1443
+ event: event,
1444
+ get owner() {
1445
+ return props.owner;
1446
+ },
1447
+ get href() {
1448
+ return eventHref(props.owner, event);
1449
+ },
1450
+ compact: true,
1451
+ get moving() {
1452
+ return movingEventId() === event.id;
1453
+ },
1454
+ get onMovePointerDown() {
1455
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startAllDayMove(pointerEvent, event, markDragged) : undefined;
1456
+ }
1457
+ })
1458
+ }), _el$101, _co$25);
1459
+ _$runHydrationEvents();
1460
+ return _el$96;
1461
+ })();
1462
+ }
1463
+ }), _el$81, _co$19);
1464
+ _$effect(_p$ => {
1465
+ var _v$34 = `4rem repeat(${props.days.length}, minmax(0, 1fr))`,
1466
+ _v$35 = `${props.owner.allDayMaxHeightRem ?? 7}rem`;
1467
+ _v$34 !== _p$.e && _$setStyleProperty(_el$78, "grid-template-columns", _p$.e = _v$34);
1468
+ _v$35 !== _p$.t && _$setStyleProperty(_el$78, "max-height", _p$.t = _v$35);
1469
+ return _p$;
1470
+ }, {
1471
+ e: undefined,
1472
+ t: undefined
1473
+ });
1474
+ return _el$78;
1475
+ }
1476
+ }), _el$88, _co$21);
1477
+ var _ref$ = scrollContainer;
1478
+ typeof _ref$ === "function" ? _$use(_ref$, _el$82) : scrollContainer = _el$82;
1479
+ var _ref$2 = timeGrid;
1480
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$83) : timeGrid = _el$83;
1481
+ var _ref$3 = timeGutter;
1482
+ typeof _ref$3 === "function" ? _$use(_ref$3, _el$84) : timeGutter = _el$84;
1483
+ _$insert(_el$84, _$createComponent(For, {
1484
+ get each() {
1485
+ return hours();
1486
+ },
1487
+ children: hour => (() => {
1488
+ var _el$103 = _$getNextElement(_tmpl$27),
1489
+ _el$105 = _el$103.firstChild,
1490
+ [_el$106, _co$26] = _$getNextMarker(_el$105.nextSibling),
1491
+ _el$104 = _el$106.nextSibling;
1492
+ _$use(element => {
1493
+ if (hour === businessStartHour()) defaultHourMarker = element;
1494
+ }, _el$103);
1495
+ _$insert(_el$103, () => `${hour}`.padStart(2, "0"), _el$106, _co$26);
1496
+ _$effect(() => _$setAttribute(_el$103, "data-outside-business", hour < businessStartHour() || hour > businessEndHour() ? "true" : undefined));
1497
+ return _el$103;
1498
+ })()
1499
+ }));
1500
+ _$insert(_el$83, _$createComponent(For, {
1501
+ get each() {
1502
+ return props.days;
1503
+ },
1504
+ children: day => {
1505
+ const dayKey = calendar.formatDateKey(day, dateConfig());
1506
+ const layouts = createMemo(() => timedEventLayouts(eventsByDay().get(dayKey)?.timed ?? []));
1507
+ return (() => {
1508
+ var _el$107 = _$getNextElement(_tmpl$29),
1509
+ _el$109 = _el$107.firstChild,
1510
+ [_el$110, _co$27] = _$getNextMarker(_el$109.nextSibling),
1511
+ _el$111 = _el$110.nextSibling,
1512
+ [_el$112, _co$28] = _$getNextMarker(_el$111.nextSibling),
1513
+ _el$113 = _el$112.nextSibling,
1514
+ [_el$114, _co$29] = _$getNextMarker(_el$113.nextSibling),
1515
+ _el$115 = _el$114.nextSibling,
1516
+ [_el$116, _co$30] = _$getNextMarker(_el$115.nextSibling),
1517
+ _el$117 = _el$116.nextSibling,
1518
+ [_el$118, _co$31] = _$getNextMarker(_el$117.nextSibling);
1519
+ _$insert(_el$107, _$createComponent(Show, {
1520
+ get when() {
1521
+ return currentTimeLine(day) !== null;
1522
+ },
1523
+ get children() {
1524
+ var _el$108 = _$getNextElement(_tmpl$28);
1525
+ _$effect(_$p => _$setStyleProperty(_el$108, "top", `${currentTimeLine(day) ?? 0}%`));
1526
+ return _el$108;
1527
+ }
1528
+ }), _el$110, _co$27);
1529
+ _$insert(_el$107, _$createComponent(For, {
1530
+ get each() {
1531
+ return hours();
1532
+ },
1533
+ children: hour => (() => {
1534
+ var _el$119 = _$getNextElement(_tmpl$30);
1535
+ _$spread(_el$119, _$mergeProps({
1536
+ get ["data-outside-business"]() {
1537
+ return hour < businessStartHour() || hour > businessEndHour() ? "true" : undefined;
1538
+ },
1539
+ get ["data-interactive"]() {
1540
+ return props.owner.onSlotActivate ? "true" : undefined;
1541
+ }
1542
+ }, () => slotInteractionProps(props.owner, () => {
1543
+ const start = zonedSlot(day, hour, dateConfig());
1544
+ return {
1545
+ start,
1546
+ end: slotEnd(start),
1547
+ allDay: false
1548
+ };
1549
+ }, () => performance.now() < suppressSlotClickUntil), {
1550
+ "onPointerDown": startRange
1551
+ }), false, false);
1552
+ _$runHydrationEvents();
1553
+ return _el$119;
1554
+ })()
1555
+ }), _el$112, _co$28);
1556
+ _$insert(_el$107, _$createComponent(For, {
1557
+ get each() {
1558
+ return previewEvents().filter(event => event.dayKey === dayKey && !event.allDay);
1559
+ },
1560
+ children: event => {
1561
+ const layout = eventLayout(event);
1562
+ const short = event.endDate.getTime() - event.startDate.getTime() < 60 * 60_000;
1563
+ return (() => {
1564
+ var _el$120 = _$getNextElement(_tmpl$32),
1565
+ _el$121 = _el$120.firstChild,
1566
+ _el$129 = _el$121.firstChild,
1567
+ [_el$130, _co$34] = _$getNextMarker(_el$129.nextSibling),
1568
+ _el$123 = _el$130.nextSibling,
1569
+ _el$125 = _el$123.firstChild,
1570
+ [_el$126, _co$32] = _$getNextMarker(_el$125.nextSibling),
1571
+ _el$124 = _el$126.nextSibling,
1572
+ _el$127 = _el$124.nextSibling,
1573
+ [_el$128, _co$33] = _$getNextMarker(_el$127.nextSibling);
1574
+ _$setAttribute(_el$120, "data-short", short ? "true" : undefined);
1575
+ _$insert(_el$121, _$createComponent(Show, {
1576
+ get when() {
1577
+ return event.title;
1578
+ },
1579
+ get children() {
1580
+ var _el$122 = _$getNextElement(_tmpl$31);
1581
+ _$insert(_el$122, () => event.title);
1582
+ return _el$122;
1583
+ }
1584
+ }), _el$130, _co$34);
1585
+ _$insert(_el$123, () => formatTime(event.startDate, dateConfig()), _el$126, _co$32);
1586
+ _$insert(_el$123, () => formatTime(event.endDate, dateConfig()), _el$128, _co$33);
1587
+ _$effect(_p$ => {
1588
+ var _v$41 = `${layout.top}%`,
1589
+ _v$42 = `${layout.height}%`;
1590
+ _v$41 !== _p$.e && _$setStyleProperty(_el$120, "top", _p$.e = _v$41);
1591
+ _v$42 !== _p$.t && _$setStyleProperty(_el$120, "height", _p$.t = _v$42);
1592
+ return _p$;
1593
+ }, {
1594
+ e: undefined,
1595
+ t: undefined
1596
+ });
1597
+ return _el$120;
1598
+ })();
1599
+ }
1600
+ }), _el$114, _co$29);
1601
+ _$insert(_el$107, _$createComponent(For, {
1602
+ get each() {
1603
+ return layouts();
1604
+ },
1605
+ children: layoutItem => {
1606
+ if (!isDayView() && layoutItem.lane >= visibleLaneCount(layoutItem.lanes)) return null;
1607
+ const event = layoutItem.event;
1608
+ const layout = eventLayout(event);
1609
+ const position = laneStyle(layoutItem);
1610
+ const resizeStart = pointerEvent => {
1611
+ if (!props.owner.onEventResize) return;
1612
+ pointerEvent.preventDefault();
1613
+ pointerEvent.stopPropagation();
1614
+ beginInteraction({
1615
+ event: pointerEvent,
1616
+ scrollContainer,
1617
+ threshold: 1,
1618
+ resolve: (clientX, clientY) => {
1619
+ const pointer = timeAtPoint(clientX, clientY);
1620
+ if (!pointer) return null;
1621
+ const minimumEnd = addMinutes(event.sourceStartDate, 15);
1622
+ const end = pointer > minimumEnd ? pointer : minimumEnd;
1623
+ return {
1624
+ id: event.id,
1625
+ title: event.title,
1626
+ start: event.sourceStartDate,
1627
+ end,
1628
+ allDay: false
1629
+ };
1630
+ },
1631
+ onActivate: () => {
1632
+ suppressSlotClickUntil = performance.now() + 400;
1633
+ setMovingEventId(event.id);
1634
+ },
1635
+ onPreview: setTimePreview,
1636
+ onCommit: next => {
1637
+ clearInteraction();
1638
+ if (eventTimeChanged(event, next)) props.owner.onEventResize?.(event, next);
1639
+ },
1640
+ onCancel: clearInteraction
1641
+ });
1642
+ };
1643
+ return (() => {
1644
+ var _el$131 = _$getNextElement(_tmpl$34),
1645
+ _el$132 = _el$131.firstChild,
1646
+ _el$134 = _el$132.firstChild,
1647
+ [_el$135, _co$35] = _$getNextMarker(_el$134.nextSibling),
1648
+ _el$136 = _el$135.nextSibling,
1649
+ [_el$137, _co$36] = _$getNextMarker(_el$136.nextSibling);
1650
+ _$insert(_el$132, _$createComponent(EventChip, {
1651
+ event: event,
1652
+ get owner() {
1653
+ return props.owner;
1654
+ },
1655
+ get href() {
1656
+ return eventHref(props.owner, event);
1657
+ },
1658
+ fill: true,
1659
+ get moving() {
1660
+ return movingEventId() === event.id;
1661
+ },
1662
+ get onMovePointerDown() {
1663
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startTimedMove(pointerEvent, event, markDragged) : undefined;
1664
+ }
1665
+ }), _el$135, _co$35);
1666
+ _$insert(_el$132, _$createComponent(Show, {
1667
+ get when() {
1668
+ return props.owner.onEventResize;
1669
+ },
1670
+ get children() {
1671
+ var _el$133 = _$getNextElement(_tmpl$33);
1672
+ _el$133.addEventListener("dragstart", event => event.preventDefault());
1673
+ _el$133.$$pointerdown = resizeStart;
1674
+ _$setAttribute(_el$133, "draggable", false);
1675
+ _$effect(() => _$setAttribute(_el$133, "aria-label", messages().resizeEvent));
1676
+ _$runHydrationEvents();
1677
+ return _el$133;
1678
+ }
1679
+ }), _el$137, _co$36);
1680
+ _$effect(_p$ => {
1681
+ var _v$43 = `${layout.top}%`,
1682
+ _v$44 = `${layout.height}%`,
1683
+ _v$45 = position.left,
1684
+ _v$46 = position.width,
1685
+ _v$47 = String(20 + layoutItem.lane);
1686
+ _v$43 !== _p$.e && _$setStyleProperty(_el$131, "top", _p$.e = _v$43);
1687
+ _v$44 !== _p$.t && _$setStyleProperty(_el$131, "height", _p$.t = _v$44);
1688
+ _v$45 !== _p$.a && _$setStyleProperty(_el$131, "left", _p$.a = _v$45);
1689
+ _v$46 !== _p$.o && _$setStyleProperty(_el$131, "width", _p$.o = _v$46);
1690
+ _v$47 !== _p$.i && _$setStyleProperty(_el$131, "z-index", _p$.i = _v$47);
1691
+ return _p$;
1692
+ }, {
1693
+ e: undefined,
1694
+ t: undefined,
1695
+ a: undefined,
1696
+ o: undefined,
1697
+ i: undefined
1698
+ });
1699
+ return _el$131;
1700
+ })();
1701
+ }
1702
+ }), _el$116, _co$30);
1703
+ _$insert(_el$107, _$createComponent(For, {
1704
+ get each() {
1705
+ return overflowLayouts(layouts());
1706
+ },
1707
+ children: overflow => {
1708
+ const layout = timeRangeLayout(overflow.groupStartDate, overflow.groupEndDate);
1709
+ const key = `${dayKey}-${overflow.groupId}`;
1710
+ const hiddenTitle = () => overflow.hiddenEvents.map(event => `${formatTime(event.startDate, dateConfig())} ${event.title}`).join("\n");
1711
+ return [(() => {
1712
+ var _el$138 = _$getNextElement(_tmpl$35),
1713
+ _el$139 = _el$138.firstChild,
1714
+ _el$140 = _el$139.firstChild,
1715
+ _el$141 = _el$140.nextSibling,
1716
+ [_el$142, _co$37] = _$getNextMarker(_el$141.nextSibling);
1717
+ _el$138.$$click = event => {
1718
+ event.stopPropagation();
1719
+ setExpandedOverflow(expandedOverflow() === key ? "" : key);
1720
+ };
1721
+ _$insert(_el$139, () => overflow.hiddenEvents.length, _el$142, _co$37);
1722
+ _$effect(_p$ => {
1723
+ var _v$48 = `${layout.top}%`,
1724
+ _v$49 = `${layout.height}%`,
1725
+ _v$50 = hiddenTitle(),
1726
+ _v$51 = messages().hiddenOverlappingEvents({
1727
+ count: overflow.hiddenEvents.length
1728
+ });
1729
+ _v$48 !== _p$.e && _$setStyleProperty(_el$138, "top", _p$.e = _v$48);
1730
+ _v$49 !== _p$.t && _$setStyleProperty(_el$138, "height", _p$.t = _v$49);
1731
+ _v$50 !== _p$.a && _$setAttribute(_el$138, "title", _p$.a = _v$50);
1732
+ _v$51 !== _p$.o && _$setAttribute(_el$138, "aria-label", _p$.o = _v$51);
1733
+ return _p$;
1734
+ }, {
1735
+ e: undefined,
1736
+ t: undefined,
1737
+ a: undefined,
1738
+ o: undefined
1739
+ });
1740
+ _$runHydrationEvents();
1741
+ return _el$138;
1742
+ })(), _$createComponent(Show, {
1743
+ get when() {
1744
+ return expandedOverflow() === key;
1745
+ },
1746
+ get children() {
1747
+ var _el$143 = _$getNextElement(_tmpl$36),
1748
+ _el$144 = _el$143.firstChild,
1749
+ _el$146 = _el$144.firstChild,
1750
+ [_el$147, _co$38] = _$getNextMarker(_el$146.nextSibling),
1751
+ _el$145 = _el$147.nextSibling,
1752
+ _el$148 = _el$145.nextSibling,
1753
+ [_el$149, _co$39] = _$getNextMarker(_el$148.nextSibling),
1754
+ _el$150 = _el$144.nextSibling,
1755
+ [_el$151, _co$40] = _$getNextMarker(_el$150.nextSibling);
1756
+ _$insert(_el$144, () => formatTime(overflow.groupStartDate, dateConfig()), _el$147, _co$38);
1757
+ _$insert(_el$144, () => formatTime(overflow.groupEndDate, dateConfig()), _el$149, _co$39);
1758
+ _$insert(_el$143, _$createComponent(For, {
1759
+ get each() {
1760
+ return overflow.hiddenEvents;
1761
+ },
1762
+ children: event => _$createComponent(EventChip, {
1763
+ event: event,
1764
+ get owner() {
1765
+ return props.owner;
1766
+ },
1767
+ get href() {
1768
+ return eventHref(props.owner, event);
1769
+ },
1770
+ compact: true
1771
+ })
1772
+ }), _el$151, _co$40);
1773
+ _$effect(_$p => _$setStyleProperty(_el$143, "top", `${layout.top}%`));
1774
+ return _el$143;
1775
+ }
1776
+ })];
1777
+ }
1778
+ }), _el$118, _co$31);
1779
+ _$effect(_p$ => {
1780
+ var _v$39 = dayColumnMinWidth(layouts()),
1781
+ _v$40 = `repeat(${hours().length}, minmax(4rem, 1fr))`;
1782
+ _v$39 !== _p$.e && _$setStyleProperty(_el$107, "min-width", _p$.e = _v$39);
1783
+ _v$40 !== _p$.t && _$setStyleProperty(_el$107, "grid-template-rows", _p$.t = _v$40);
1784
+ return _p$;
1785
+ }, {
1786
+ e: undefined,
1787
+ t: undefined
1788
+ });
1789
+ return _el$107;
1790
+ })();
1791
+ }
1792
+ }), _el$86, _co$20);
1793
+ _$effect(_p$ => {
1794
+ var _v$36 = `4rem repeat(${props.days.length}, minmax(0, 1fr))`,
1795
+ _v$37 = `4rem repeat(${props.days.length}, minmax(0, 1fr))`,
1796
+ _v$38 = `repeat(${hours().length}, minmax(4rem, 1fr))`;
1797
+ _v$36 !== _p$.e && _$setStyleProperty(_el$74, "grid-template-columns", _p$.e = _v$36);
1798
+ _v$37 !== _p$.t && _$setStyleProperty(_el$83, "grid-template-columns", _p$.t = _v$37);
1799
+ _v$38 !== _p$.a && _$setStyleProperty(_el$84, "grid-template-rows", _p$.a = _v$38);
1800
+ return _p$;
1801
+ }, {
1802
+ e: undefined,
1803
+ t: undefined,
1804
+ a: undefined
1805
+ });
1806
+ return _el$73;
1807
+ })();
1808
+ };
1809
+ const YearView = props => {
1810
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1811
+ const year = createMemo(() => zonedYearMonth(props.date, dateConfig()).year);
1812
+ const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
1813
+ const eventsByDay = createMemo(() => {
1814
+ const grouped = new Map();
1815
+ for (const event of props.events) {
1816
+ const events = grouped.get(event.dayKey);
1817
+ if (events) events.push(event);else grouped.set(event.dayKey, [event]);
1818
+ }
1819
+ return grouped;
1820
+ });
1821
+ const months = createMemo(() => {
1822
+ const context = dateConfig();
1823
+ return Array.from({
1824
+ length: 12
1825
+ }, (_, month) => {
1826
+ const date = zonedMonthDate(year(), month, context);
1827
+ return {
1828
+ date,
1829
+ label: date.toLocaleDateString(context.locale ?? "en", {
1830
+ month: "long",
1831
+ timeZone: context.timeZone
1832
+ }),
1833
+ days: calendar.getMonthGrid(year(), month, context).flat().map(day => {
1834
+ const key = calendar.formatDateKey(day, context);
1835
+ return {
1836
+ date: day,
1837
+ events: eventsByDay().get(key) ?? [],
1838
+ isToday: key === todayKey(),
1839
+ outside: !calendar.isSameMonth(day, date, context),
1840
+ number: calendar.formatDayNumber(day, context)
1841
+ };
1842
+ })
1843
+ };
1844
+ });
1845
+ });
1846
+ return (() => {
1847
+ var _el$152 = _$getNextElement(_tmpl$37);
1848
+ _$insert(_el$152, _$createComponent(For, {
1849
+ get each() {
1850
+ return months();
1851
+ },
1852
+ children: month => (() => {
1853
+ var _el$153 = _$getNextElement(_tmpl$38),
1854
+ _el$154 = _el$153.firstChild,
1855
+ _el$155 = _el$154.nextSibling;
1856
+ _$insert(_el$154, () => month.label);
1857
+ _$insert(_el$155, _$createComponent(For, {
1858
+ get each() {
1859
+ return month.days;
1860
+ },
1861
+ children: day => _$createComponent(CalendarNavigationLink, {
1862
+ get owner() {
1863
+ return props.owner;
1864
+ },
1865
+ get href() {
1866
+ return props.owner.getDateHref?.(day.date, "day") ?? "#";
1867
+ },
1868
+ get anchorProps() {
1869
+ return {
1870
+ class: "k2b-calendar-year__day",
1871
+ "data-today": day.isToday ? "true" : undefined,
1872
+ "data-outside": day.outside ? "true" : undefined
1873
+ };
1874
+ },
1875
+ get children() {
1876
+ return [_$memo(() => day.number), _$createComponent(Show, {
1877
+ get when() {
1878
+ return day.events[0];
1879
+ },
1880
+ children: event => (() => {
1881
+ var _el$156 = _$getNextElement(_tmpl$39);
1882
+ _$effect(_p$ => {
1883
+ var _v$52 = event().colorHex ? undefined : event().color ?? "blue",
1884
+ _v$53 = day.isToday ? "true" : undefined,
1885
+ _v$54 = event().colorHex ? {
1886
+ "background-color": day.isToday ? "white" : event().colorHex
1887
+ } : undefined;
1888
+ _v$52 !== _p$.e && _$setAttribute(_el$156, "data-color", _p$.e = _v$52);
1889
+ _v$53 !== _p$.t && _$setAttribute(_el$156, "data-today", _p$.t = _v$53);
1890
+ _p$.a = _$style(_el$156, _v$54, _p$.a);
1891
+ return _p$;
1892
+ }, {
1893
+ e: undefined,
1894
+ t: undefined,
1895
+ a: undefined
1896
+ });
1897
+ return _el$156;
1898
+ })()
1899
+ })];
1900
+ }
1901
+ })
1902
+ }));
1903
+ return _el$153;
1904
+ })()
1905
+ }));
1906
+ return _el$152;
1907
+ })();
1908
+ };
1909
+ const MobileMonthView = props => {
1910
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1911
+ const selectedDateKey = createMemo(() => calendar.formatDateKey(props.selectedDate, dateConfig()));
1912
+ const selectedEvents = createMemo(() => props.events.filter(event => event.dayKey === selectedDateKey()));
1913
+ return (() => {
1914
+ var _el$157 = _$getNextElement(_tmpl$41),
1915
+ _el$163 = _el$157.firstChild,
1916
+ [_el$164, _co$42] = _$getNextMarker(_el$163.nextSibling),
1917
+ _el$158 = _el$164.nextSibling,
1918
+ _el$159 = _el$158.firstChild,
1919
+ _el$161 = _el$159.nextSibling,
1920
+ [_el$162, _co$41] = _$getNextMarker(_el$161.nextSibling);
1921
+ _$insert(_el$157, _$createComponent(MonthView, {
1922
+ get owner() {
1923
+ return {
1924
+ ...props.owner,
1925
+ withWeekNumbers: false
1926
+ };
1927
+ },
1928
+ get date() {
1929
+ return props.date;
1930
+ },
1931
+ get now() {
1932
+ return props.now;
1933
+ },
1934
+ get events() {
1935
+ return props.events;
1936
+ },
1937
+ get labels() {
1938
+ return props.labels;
1939
+ }
1940
+ }), _el$164, _co$42);
1941
+ _$insert(_el$159, () => props.selectedDate.toLocaleDateString(dateConfig().locale ?? "en", {
1942
+ weekday: "long",
1943
+ month: "long",
1944
+ day: "numeric",
1945
+ timeZone: dateConfig().timeZone
1946
+ }));
1947
+ _$insert(_el$158, _$createComponent(Show, {
1948
+ get when() {
1949
+ return selectedEvents().length > 0;
1950
+ },
1951
+ get fallback() {
1952
+ return (() => {
1953
+ var _el$165 = _$getNextElement(_tmpl$42);
1954
+ _$insert(_el$165, () => props.labels.noEvents);
1955
+ return _el$165;
1956
+ })();
1957
+ },
1958
+ get children() {
1959
+ var _el$160 = _$getNextElement(_tmpl$40);
1960
+ _$insert(_el$160, _$createComponent(For, {
1961
+ get each() {
1962
+ return selectedEvents();
1963
+ },
1964
+ children: event => _$createComponent(EventChip, {
1965
+ event: event,
1966
+ get owner() {
1967
+ return props.owner;
1968
+ },
1969
+ get href() {
1970
+ return eventHref(props.owner, event);
1971
+ }
1972
+ })
1973
+ }));
1974
+ return _el$160;
1975
+ }
1976
+ }), _el$162, _co$41);
1977
+ return _el$157;
1978
+ })();
1979
+ };
1980
+ const CalendarBody = props => (() => {
1981
+ var _el$166 = _$getNextElement(_tmpl$43);
1982
+ _$insert(_el$166, () => props.children);
1983
+ return _el$166;
1984
+ })();
1985
+ const Calendar = props => {
1986
+ const messages = useUiMessages();
1987
+ // Subviews derive their date config from the owner props, so the inherited
1988
+ // render locale is merged here once; an explicit dateConfig.locale wins.
1989
+ const localizedConfig = useDateConfigLocale(() => props.dateConfig);
1990
+ const owner = mergeProps(props, {
1991
+ get dateConfig() {
1992
+ return localizedConfig();
1993
+ }
1994
+ });
1995
+ const view = () => props.view ?? "month";
1996
+ const dateConfig = createMemo(() => ownerDateConfig(owner));
1997
+ const safeDate = value => {
1998
+ const parsed = parseDate(value, dateConfig());
1999
+ return validDate(parsed) ? parsed : calendar.today(dateConfig());
2000
+ };
2001
+ const date = createMemo(() => safeDate(props.date));
2002
+ const selectedDate = createMemo(() => safeDate(props.selectedDate ?? props.date));
2003
+ const [now, setNow] = createSignal(new Date());
2004
+ const normalizedEvents = createMemo(() => normalizeEvents(props.events, dateConfig()));
2005
+ const mergedLabels = createMemo(() => ({
2006
+ today: messages().today,
2007
+ day: messages().day,
2008
+ week: messages().week,
2009
+ month: messages().month,
2010
+ year: messages().year,
2011
+ allDay: messages().allDay,
2012
+ noEvents: messages().noEvents,
2013
+ previous: messages().previous,
2014
+ next: messages().next,
2015
+ ...props.labels
2016
+ }));
2017
+ const days = createMemo(() => {
2018
+ if (view() === "day") return [date()];
2019
+ return calendar.getWeekDays(date(), dateConfig());
2020
+ });
2021
+ onMount(() => {
2022
+ const updateNow = () => setNow(new Date());
2023
+ const interval = window.setInterval(updateNow, 60_000);
2024
+ document.addEventListener("visibilitychange", updateNow);
2025
+ onCleanup(() => {
2026
+ window.clearInterval(interval);
2027
+ document.removeEventListener("visibilitychange", updateNow);
2028
+ });
2029
+ });
2030
+ return (() => {
2031
+ var _el$167 = _$getNextElement(_tmpl$44),
2032
+ _el$168 = _el$167.firstChild,
2033
+ [_el$169, _co$43] = _$getNextMarker(_el$168.nextSibling),
2034
+ _el$170 = _el$169.nextSibling,
2035
+ [_el$171, _co$44] = _$getNextMarker(_el$170.nextSibling),
2036
+ _el$172 = _el$171.nextSibling,
2037
+ [_el$173, _co$45] = _$getNextMarker(_el$172.nextSibling);
2038
+ _$insert(_el$167, _$createComponent(CalendarHeader, {
2039
+ get date() {
2040
+ return date();
2041
+ },
2042
+ get view() {
2043
+ return view();
2044
+ },
2045
+ get labels() {
2046
+ return mergedLabels();
2047
+ },
2048
+ owner: owner
2049
+ }), _el$169, _co$43);
2050
+ _$insert(_el$167, () => props.toolbarContent, _el$171, _co$44);
2051
+ _$insert(_el$167, _$createComponent(Show, {
2052
+ get when() {
2053
+ return view() !== "month";
2054
+ },
2055
+ get fallback() {
2056
+ return _$createComponent(CalendarBody, {
2057
+ get children() {
2058
+ return _$createComponent(MonthView, {
2059
+ owner: owner,
2060
+ get date() {
2061
+ return date();
2062
+ },
2063
+ get now() {
2064
+ return now();
2065
+ },
2066
+ get events() {
2067
+ return normalizedEvents();
2068
+ },
2069
+ get labels() {
2070
+ return mergedLabels();
2071
+ }
2072
+ });
2073
+ }
2074
+ });
2075
+ },
2076
+ get children() {
2077
+ return _$createComponent(Show, {
2078
+ get when() {
2079
+ return view() !== "year";
2080
+ },
2081
+ get fallback() {
2082
+ return _$createComponent(CalendarBody, {
2083
+ get children() {
2084
+ return _$createComponent(YearView, {
2085
+ owner: owner,
2086
+ get date() {
2087
+ return date();
2088
+ },
2089
+ get now() {
2090
+ return now();
2091
+ },
2092
+ get events() {
2093
+ return normalizedEvents();
2094
+ }
2095
+ });
2096
+ }
2097
+ });
2098
+ },
2099
+ get children() {
2100
+ return _$createComponent(Show, {
2101
+ get when() {
2102
+ return view() !== "mobile-month";
2103
+ },
2104
+ get fallback() {
2105
+ return _$createComponent(CalendarBody, {
2106
+ get children() {
2107
+ return _$createComponent(MobileMonthView, {
2108
+ owner: owner,
2109
+ get date() {
2110
+ return date();
2111
+ },
2112
+ get now() {
2113
+ return now();
2114
+ },
2115
+ get selectedDate() {
2116
+ return selectedDate();
2117
+ },
2118
+ get events() {
2119
+ return normalizedEvents();
2120
+ },
2121
+ get labels() {
2122
+ return mergedLabels();
2123
+ }
2124
+ });
2125
+ }
2126
+ });
2127
+ },
2128
+ get children() {
2129
+ return _$createComponent(TimeGridView, {
2130
+ owner: owner,
2131
+ get date() {
2132
+ return date();
2133
+ },
2134
+ get now() {
2135
+ return now();
2136
+ },
2137
+ get events() {
2138
+ return normalizedEvents();
2139
+ },
2140
+ get labels() {
2141
+ return mergedLabels();
2142
+ },
2143
+ get days() {
2144
+ return days();
2145
+ }
2146
+ });
2147
+ }
2148
+ });
2149
+ }
2150
+ });
2151
+ }
2152
+ }), _el$173, _co$45);
2153
+ _$effect(_p$ => {
2154
+ var _v$55 = `k2b-content-calendar ${props.class ?? ""}`,
2155
+ _v$56 = props.navigationPending ? "true" : undefined;
2156
+ _v$55 !== _p$.e && _$className(_el$167, _p$.e = _v$55);
2157
+ _v$56 !== _p$.t && _$setAttribute(_el$167, "aria-busy", _p$.t = _v$56);
2158
+ return _p$;
2159
+ }, {
2160
+ e: undefined,
2161
+ t: undefined
2162
+ });
2163
+ return _el$167;
2164
+ })();
2165
+ };
2166
+ export default Calendar;
2167
+ _$delegateEvents(["click", "dblclick", "pointerdown", "keydown"]);
2168
+ //# sourceMappingURL=Calendar.js.map