@k2b/ui 0.20.0 → 0.22.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 (595) hide show
  1. package/dist/browser/actions/Button.js +20 -31
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/ContextMenu.js +10 -4
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/CopyButton.js +10 -8
  6. package/dist/browser/actions/CopyButton.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +3 -1
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/GestureMenu.js +4 -0
  10. package/dist/browser/actions/GestureMenu.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -1
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/filter-messages.js +20 -0
  14. package/dist/browser/actions/filter-messages.js.map +1 -0
  15. package/dist/browser/actions/spotlight-messages.js +16 -0
  16. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  17. package/dist/browser/chat/ChatComposer.js +47 -41
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatPrimitives.js +25 -23
  20. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  21. package/dist/browser/chat/ChatRoot.js +3 -3
  22. package/dist/browser/chat/ChatRoot.js.map +1 -1
  23. package/dist/browser/chat/ChatTimeline.js +12 -12
  24. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  25. package/dist/browser/chat/chat-messages.js +236 -0
  26. package/dist/browser/chat/chat-messages.js.map +1 -0
  27. package/dist/browser/content/Calendar.js +1960 -575
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/Chart.js +15 -8
  30. package/dist/browser/content/Chart.js.map +1 -1
  31. package/dist/browser/content/ChartExplorer.js +20 -12
  32. package/dist/browser/content/ChartExplorer.js.map +1 -1
  33. package/dist/browser/content/ChartExplorerControls.js +9 -7
  34. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  35. package/dist/browser/content/ChartFilterControls.js +4 -2
  36. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  37. package/dist/browser/content/ChartSnapshotView.js +3 -3
  38. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  39. package/dist/browser/content/DataTable.js +68 -59
  40. package/dist/browser/content/DataTable.js.map +1 -1
  41. package/dist/browser/content/Docs.js +3 -1
  42. package/dist/browser/content/Docs.js.map +1 -1
  43. package/dist/browser/content/FileBrowser.js +30 -26
  44. package/dist/browser/content/FileBrowser.js.map +1 -1
  45. package/dist/browser/content/FileTree.js +9 -7
  46. package/dist/browser/content/FileTree.js.map +1 -1
  47. package/dist/browser/content/FileView.js +37 -28
  48. package/dist/browser/content/FileView.js.map +1 -1
  49. package/dist/browser/content/Lightbox.js +9 -7
  50. package/dist/browser/content/Lightbox.js.map +1 -1
  51. package/dist/browser/content/LogEntriesTable.js +3 -3
  52. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  53. package/dist/browser/content/MessageRow.js +24 -22
  54. package/dist/browser/content/MessageRow.js.map +1 -1
  55. package/dist/browser/content/Pagination.js +7 -7
  56. package/dist/browser/content/Pagination.js.map +1 -1
  57. package/dist/browser/content/PdfPreview.js +15 -13
  58. package/dist/browser/content/PdfPreview.js.map +1 -1
  59. package/dist/browser/content/RangePicker.js +3 -1
  60. package/dist/browser/content/RangePicker.js.map +1 -1
  61. package/dist/browser/content/StructuredDataPreview.js +3 -1
  62. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  63. package/dist/browser/content/Timeline.js +13 -11
  64. package/dist/browser/content/Timeline.js.map +1 -1
  65. package/dist/browser/content/VideoPlayer.js +5 -5
  66. package/dist/browser/content/VideoPlayer.js.map +1 -1
  67. package/dist/browser/content/VirtualFeed.js +6 -4
  68. package/dist/browser/content/VirtualFeed.js.map +1 -1
  69. package/dist/browser/content/ZoomPanViewport.js +10 -7
  70. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  71. package/dist/browser/content/calendar-messages.js +121 -0
  72. package/dist/browser/content/calendar-messages.js.map +1 -0
  73. package/dist/browser/content/calendar-month-layout.js +108 -0
  74. package/dist/browser/content/calendar-month-layout.js.map +1 -0
  75. package/dist/browser/content/calendar-pointer.js +4 -3
  76. package/dist/browser/content/calendar-pointer.js.map +1 -1
  77. package/dist/browser/content/chart-messages.js +136 -0
  78. package/dist/browser/content/chart-messages.js.map +1 -0
  79. package/dist/browser/content/collection-selection.js +2 -0
  80. package/dist/browser/content/collection-selection.js.map +1 -1
  81. package/dist/browser/content/data-table-messages.js +24 -0
  82. package/dist/browser/content/data-table-messages.js.map +1 -0
  83. package/dist/browser/content/docs-messages.js +24 -0
  84. package/dist/browser/content/docs-messages.js.map +1 -0
  85. package/dist/browser/content/feed-messages.js +34 -0
  86. package/dist/browser/content/feed-messages.js.map +1 -0
  87. package/dist/browser/content/file-browser-messages.js +69 -0
  88. package/dist/browser/content/file-browser-messages.js.map +1 -0
  89. package/dist/browser/content/file-view-messages.js +64 -0
  90. package/dist/browser/content/file-view-messages.js.map +1 -0
  91. package/dist/browser/content/index.js.map +1 -1
  92. package/dist/browser/content/lightbox-messages.js +36 -0
  93. package/dist/browser/content/lightbox-messages.js.map +1 -0
  94. package/dist/browser/content/log-entries-messages.js +20 -0
  95. package/dist/browser/content/log-entries-messages.js.map +1 -0
  96. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  97. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  98. package/dist/browser/content/markdown-info-blocks.js +3 -3
  99. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  100. package/dist/browser/content/markdown-links.js +2 -2
  101. package/dist/browser/content/markdown-links.js.map +1 -1
  102. package/dist/browser/content/markdown-reference-messages.js +30 -0
  103. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  104. package/dist/browser/content/pagination-messages.js +38 -0
  105. package/dist/browser/content/pagination-messages.js.map +1 -0
  106. package/dist/browser/content/pdf-messages.js +43 -0
  107. package/dist/browser/content/pdf-messages.js.map +1 -0
  108. package/dist/browser/content/range-picker-messages.js +20 -0
  109. package/dist/browser/content/range-picker-messages.js.map +1 -0
  110. package/dist/browser/content/structured-data-messages.js +22 -0
  111. package/dist/browser/content/structured-data-messages.js.map +1 -0
  112. package/dist/browser/content/timeline-messages.js +62 -0
  113. package/dist/browser/content/timeline-messages.js.map +1 -0
  114. package/dist/browser/content/video-messages.js +24 -0
  115. package/dist/browser/content/video-messages.js.map +1 -0
  116. package/dist/browser/content/viewport-messages.js +28 -0
  117. package/dist/browser/content/viewport-messages.js.map +1 -0
  118. package/dist/browser/feedback/HoverPreview.js +34 -6
  119. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  120. package/dist/browser/feedback/InstallGuide.js +18 -18
  121. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  122. package/dist/browser/feedback/install-messages.js +104 -0
  123. package/dist/browser/feedback/install-messages.js.map +1 -0
  124. package/dist/browser/feedback/prompt-messages.js +65 -0
  125. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  126. package/dist/browser/feedback/prompts.js +14 -11
  127. package/dist/browser/feedback/prompts.js.map +1 -1
  128. package/dist/browser/feedback/toast-messages.js +18 -0
  129. package/dist/browser/feedback/toast-messages.js.map +1 -0
  130. package/dist/browser/feedback/toast.js +4 -3
  131. package/dist/browser/feedback/toast.js.map +1 -1
  132. package/dist/browser/index.js +1 -1
  133. package/dist/browser/index.js.map +1 -1
  134. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  135. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  136. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  137. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  138. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  139. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  140. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  141. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  142. package/dist/browser/inputs/Combobox.js +3 -1
  143. package/dist/browser/inputs/Combobox.js.map +1 -1
  144. package/dist/browser/inputs/DatePicker.js +46 -10
  145. package/dist/browser/inputs/DatePicker.js.map +1 -1
  146. package/dist/browser/inputs/FileDropTarget.js +6 -6
  147. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  148. package/dist/browser/inputs/FileInputs.js +30 -21
  149. package/dist/browser/inputs/FileInputs.js.map +1 -1
  150. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  151. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  152. package/dist/browser/inputs/NumberInput.js +4 -2
  153. package/dist/browser/inputs/NumberInput.js.map +1 -1
  154. package/dist/browser/inputs/QrScanner.js +5 -5
  155. package/dist/browser/inputs/QrScanner.js.map +1 -1
  156. package/dist/browser/inputs/Select.js +7 -5
  157. package/dist/browser/inputs/Select.js.map +1 -1
  158. package/dist/browser/inputs/SelectChip.js +3 -3
  159. package/dist/browser/inputs/SelectChip.js.map +1 -1
  160. package/dist/browser/inputs/SignatureInput.js +9 -3
  161. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  162. package/dist/browser/inputs/SpecialInputs.js +4 -2
  163. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  164. package/dist/browser/inputs/TagEditor.js +8 -6
  165. package/dist/browser/inputs/TagEditor.js.map +1 -1
  166. package/dist/browser/inputs/TagsInput.js +5 -5
  167. package/dist/browser/inputs/TagsInput.js.map +1 -1
  168. package/dist/browser/inputs/TemplateEditor.js +5 -5
  169. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  170. package/dist/browser/inputs/TextInput.js +3 -1
  171. package/dist/browser/inputs/TextInput.js.map +1 -1
  172. package/dist/browser/inputs/completion-messages.js +24 -0
  173. package/dist/browser/inputs/completion-messages.js.map +1 -0
  174. package/dist/browser/inputs/date-picker.js +24 -0
  175. package/dist/browser/inputs/date-picker.js.map +1 -1
  176. package/dist/browser/inputs/file-drop-messages.js +63 -0
  177. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  178. package/dist/browser/inputs/file-drop.js.map +1 -1
  179. package/dist/browser/inputs/file-input-messages.js +60 -0
  180. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  181. package/dist/browser/inputs/icon-messages.js +22 -0
  182. package/dist/browser/inputs/icon-messages.js.map +1 -0
  183. package/dist/browser/inputs/input-messages.js +38 -0
  184. package/dist/browser/inputs/input-messages.js.map +1 -0
  185. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  186. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  187. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  188. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  189. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  190. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  191. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  192. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  193. package/dist/browser/inputs/qr-messages.js +26 -0
  194. package/dist/browser/inputs/qr-messages.js.map +1 -0
  195. package/dist/browser/inputs/select-messages.js +63 -0
  196. package/dist/browser/inputs/select-messages.js.map +1 -0
  197. package/dist/browser/inputs/tag-messages.js +44 -0
  198. package/dist/browser/inputs/tag-messages.js.map +1 -0
  199. package/dist/browser/inputs/template-messages.js +22 -0
  200. package/dist/browser/inputs/template-messages.js.map +1 -0
  201. package/dist/browser/internal/render-error-messages.js +20 -0
  202. package/dist/browser/internal/render-error-messages.js.map +1 -0
  203. package/dist/browser/internal/render-error.js +3 -1
  204. package/dist/browser/internal/render-error.js.map +1 -1
  205. package/dist/browser/internal/text-selection.js +101 -0
  206. package/dist/browser/internal/text-selection.js.map +1 -0
  207. package/dist/browser/intl/messages.js +12 -1155
  208. package/dist/browser/intl/messages.js.map +1 -1
  209. package/dist/browser/layout/AppWorkspace.js +561 -418
  210. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  211. package/dist/browser/layout/BottomSheet.js +6 -1
  212. package/dist/browser/layout/BottomSheet.js.map +1 -1
  213. package/dist/browser/layout/Discussion.js +8 -5
  214. package/dist/browser/layout/Discussion.js.map +1 -1
  215. package/dist/browser/layout/FloatingWindow.js +8 -5
  216. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  217. package/dist/browser/layout/Navigation.js +7 -6
  218. package/dist/browser/layout/Navigation.js.map +1 -1
  219. package/dist/browser/layout/PageTitle.js +370 -0
  220. package/dist/browser/layout/PageTitle.js.map +1 -0
  221. package/dist/browser/layout/PanelDialog.js +8 -6
  222. package/dist/browser/layout/PanelDialog.js.map +1 -1
  223. package/dist/browser/layout/Panes.js +23 -15
  224. package/dist/browser/layout/Panes.js.map +1 -1
  225. package/dist/browser/layout/PullToRefresh.js +13 -4
  226. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  227. package/dist/browser/layout/Settings.js +14 -12
  228. package/dist/browser/layout/Settings.js.map +1 -1
  229. package/dist/browser/layout/SettingsCollection.js +6 -5
  230. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  231. package/dist/browser/layout/SettingsModal.js +3 -1
  232. package/dist/browser/layout/SettingsModal.js.map +1 -1
  233. package/dist/browser/layout/app-workspace-controller.js +743 -12
  234. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  235. package/dist/browser/layout/app-workspace-state.js +3 -2
  236. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  237. package/dist/browser/layout/floating-window-messages.js +28 -0
  238. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  239. package/dist/browser/layout/index.js +2 -0
  240. package/dist/browser/layout/index.js.map +1 -1
  241. package/dist/browser/layout/navigation-model.js.map +1 -1
  242. package/dist/browser/layout/page-title-controller.js +169 -0
  243. package/dist/browser/layout/page-title-controller.js.map +1 -0
  244. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  245. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  246. package/dist/browser/layout/panes-messages.js +48 -0
  247. package/dist/browser/layout/panes-messages.js.map +1 -0
  248. package/dist/browser/layout/refresh-messages.js +20 -0
  249. package/dist/browser/layout/refresh-messages.js.map +1 -0
  250. package/dist/browser/layout/settings-messages.js +54 -0
  251. package/dist/browser/layout/settings-messages.js.map +1 -0
  252. package/dist/browser/layout/workspace-messages.js +56 -0
  253. package/dist/browser/layout/workspace-messages.js.map +1 -0
  254. package/dist/browser/surfaces/Avatar.js +5 -5
  255. package/dist/browser/surfaces/Avatar.js.map +1 -1
  256. package/dist/browser/surfaces/ResourceCard.js +4 -2
  257. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  258. package/dist/browser/surfaces/Tag.js +3 -3
  259. package/dist/browser/surfaces/Tag.js.map +1 -1
  260. package/dist/browser/surfaces/avatar-messages.js +26 -0
  261. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  262. package/dist/browser/surfaces/resource-messages.js +26 -0
  263. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  264. package/dist/browser/widgets/Widget.js +6 -0
  265. package/dist/browser/widgets/Widget.js.map +1 -1
  266. package/dist/ssr/actions/Button.js +21 -32
  267. package/dist/ssr/actions/Button.js.map +1 -1
  268. package/dist/ssr/actions/ContextMenu.js +7 -3
  269. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  270. package/dist/ssr/actions/CopyButton.js +9 -7
  271. package/dist/ssr/actions/CopyButton.js.map +1 -1
  272. package/dist/ssr/actions/FilterChip.js +3 -1
  273. package/dist/ssr/actions/FilterChip.js.map +1 -1
  274. package/dist/ssr/actions/GestureMenu.js +4 -0
  275. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  276. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  277. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  278. package/dist/ssr/actions/filter-messages.js +20 -0
  279. package/dist/ssr/actions/filter-messages.js.map +1 -0
  280. package/dist/ssr/actions/spotlight-messages.js +16 -0
  281. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  282. package/dist/ssr/chat/ChatComposer.js +47 -41
  283. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  284. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  285. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  286. package/dist/ssr/chat/ChatRoot.js +3 -3
  287. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  288. package/dist/ssr/chat/ChatTimeline.js +11 -11
  289. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  290. package/dist/ssr/chat/chat-messages.js +236 -0
  291. package/dist/ssr/chat/chat-messages.js.map +1 -0
  292. package/dist/ssr/content/Calendar.js +1232 -115
  293. package/dist/ssr/content/Calendar.js.map +1 -1
  294. package/dist/ssr/content/Chart.js +12 -5
  295. package/dist/ssr/content/Chart.js.map +1 -1
  296. package/dist/ssr/content/ChartExplorer.js +10 -8
  297. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  298. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  299. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  300. package/dist/ssr/content/ChartFilterControls.js +4 -2
  301. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  302. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  303. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  304. package/dist/ssr/content/DataTable.js +10 -4
  305. package/dist/ssr/content/DataTable.js.map +1 -1
  306. package/dist/ssr/content/Docs.js +3 -1
  307. package/dist/ssr/content/Docs.js.map +1 -1
  308. package/dist/ssr/content/FileBrowser.js +30 -26
  309. package/dist/ssr/content/FileBrowser.js.map +1 -1
  310. package/dist/ssr/content/FileTree.js +9 -7
  311. package/dist/ssr/content/FileTree.js.map +1 -1
  312. package/dist/ssr/content/FileView.js +37 -28
  313. package/dist/ssr/content/FileView.js.map +1 -1
  314. package/dist/ssr/content/Lightbox.js +8 -6
  315. package/dist/ssr/content/Lightbox.js.map +1 -1
  316. package/dist/ssr/content/LogEntriesTable.js +3 -3
  317. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  318. package/dist/ssr/content/MessageRow.js +24 -22
  319. package/dist/ssr/content/MessageRow.js.map +1 -1
  320. package/dist/ssr/content/Pagination.js +6 -6
  321. package/dist/ssr/content/Pagination.js.map +1 -1
  322. package/dist/ssr/content/PdfPreview.js +15 -13
  323. package/dist/ssr/content/PdfPreview.js.map +1 -1
  324. package/dist/ssr/content/RangePicker.js +3 -1
  325. package/dist/ssr/content/RangePicker.js.map +1 -1
  326. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  327. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  328. package/dist/ssr/content/Timeline.js +13 -11
  329. package/dist/ssr/content/Timeline.js.map +1 -1
  330. package/dist/ssr/content/VideoPlayer.js +5 -5
  331. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  332. package/dist/ssr/content/VirtualFeed.js +6 -4
  333. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  334. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  335. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  336. package/dist/ssr/content/calendar-messages.js +121 -0
  337. package/dist/ssr/content/calendar-messages.js.map +1 -0
  338. package/dist/ssr/content/calendar-month-layout.js +108 -0
  339. package/dist/ssr/content/calendar-month-layout.js.map +1 -0
  340. package/dist/ssr/content/calendar-pointer.js +4 -3
  341. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  342. package/dist/ssr/content/chart-messages.js +136 -0
  343. package/dist/ssr/content/chart-messages.js.map +1 -0
  344. package/dist/ssr/content/collection-selection.js +2 -0
  345. package/dist/ssr/content/collection-selection.js.map +1 -1
  346. package/dist/ssr/content/data-table-messages.js +24 -0
  347. package/dist/ssr/content/data-table-messages.js.map +1 -0
  348. package/dist/ssr/content/docs-messages.js +24 -0
  349. package/dist/ssr/content/docs-messages.js.map +1 -0
  350. package/dist/ssr/content/feed-messages.js +34 -0
  351. package/dist/ssr/content/feed-messages.js.map +1 -0
  352. package/dist/ssr/content/file-browser-messages.js +69 -0
  353. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  354. package/dist/ssr/content/file-view-messages.js +64 -0
  355. package/dist/ssr/content/file-view-messages.js.map +1 -0
  356. package/dist/ssr/content/index.js.map +1 -1
  357. package/dist/ssr/content/lightbox-messages.js +36 -0
  358. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  359. package/dist/ssr/content/log-entries-messages.js +20 -0
  360. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  361. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  362. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  363. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  364. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  365. package/dist/ssr/content/markdown-links.js +2 -2
  366. package/dist/ssr/content/markdown-links.js.map +1 -1
  367. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  368. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  369. package/dist/ssr/content/pagination-messages.js +38 -0
  370. package/dist/ssr/content/pagination-messages.js.map +1 -0
  371. package/dist/ssr/content/pdf-messages.js +43 -0
  372. package/dist/ssr/content/pdf-messages.js.map +1 -0
  373. package/dist/ssr/content/range-picker-messages.js +20 -0
  374. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  375. package/dist/ssr/content/structured-data-messages.js +22 -0
  376. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  377. package/dist/ssr/content/timeline-messages.js +62 -0
  378. package/dist/ssr/content/timeline-messages.js.map +1 -0
  379. package/dist/ssr/content/video-messages.js +24 -0
  380. package/dist/ssr/content/video-messages.js.map +1 -0
  381. package/dist/ssr/content/viewport-messages.js +28 -0
  382. package/dist/ssr/content/viewport-messages.js.map +1 -0
  383. package/dist/ssr/feedback/HoverPreview.js +34 -6
  384. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  385. package/dist/ssr/feedback/InstallGuide.js +18 -18
  386. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  387. package/dist/ssr/feedback/install-messages.js +104 -0
  388. package/dist/ssr/feedback/install-messages.js.map +1 -0
  389. package/dist/ssr/feedback/prompt-messages.js +65 -0
  390. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  391. package/dist/ssr/feedback/prompts.js +14 -11
  392. package/dist/ssr/feedback/prompts.js.map +1 -1
  393. package/dist/ssr/feedback/toast-messages.js +18 -0
  394. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  395. package/dist/ssr/feedback/toast.js +4 -3
  396. package/dist/ssr/feedback/toast.js.map +1 -1
  397. package/dist/ssr/index.js +1 -1
  398. package/dist/ssr/index.js.map +1 -1
  399. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  400. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  401. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  402. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  403. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  404. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  405. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  406. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  407. package/dist/ssr/inputs/Combobox.js +3 -1
  408. package/dist/ssr/inputs/Combobox.js.map +1 -1
  409. package/dist/ssr/inputs/DatePicker.js +34 -4
  410. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  411. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  412. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  413. package/dist/ssr/inputs/FileInputs.js +29 -20
  414. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  415. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  416. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  417. package/dist/ssr/inputs/NumberInput.js +4 -2
  418. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  419. package/dist/ssr/inputs/QrScanner.js +4 -4
  420. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  421. package/dist/ssr/inputs/Select.js +7 -5
  422. package/dist/ssr/inputs/Select.js.map +1 -1
  423. package/dist/ssr/inputs/SelectChip.js +3 -3
  424. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  425. package/dist/ssr/inputs/SignatureInput.js +9 -3
  426. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  427. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  428. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  429. package/dist/ssr/inputs/TagEditor.js +8 -6
  430. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  431. package/dist/ssr/inputs/TagsInput.js +5 -5
  432. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  433. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  434. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  435. package/dist/ssr/inputs/TextInput.js +3 -1
  436. package/dist/ssr/inputs/TextInput.js.map +1 -1
  437. package/dist/ssr/inputs/completion-messages.js +24 -0
  438. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  439. package/dist/ssr/inputs/date-picker.js +24 -0
  440. package/dist/ssr/inputs/date-picker.js.map +1 -1
  441. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  442. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  443. package/dist/ssr/inputs/file-drop.js.map +1 -1
  444. package/dist/ssr/inputs/file-input-messages.js +60 -0
  445. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  446. package/dist/ssr/inputs/icon-messages.js +22 -0
  447. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  448. package/dist/ssr/inputs/input-messages.js +38 -0
  449. package/dist/ssr/inputs/input-messages.js.map +1 -0
  450. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  451. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  452. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  453. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  454. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  455. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  456. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  457. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  458. package/dist/ssr/inputs/qr-messages.js +26 -0
  459. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  460. package/dist/ssr/inputs/select-messages.js +63 -0
  461. package/dist/ssr/inputs/select-messages.js.map +1 -0
  462. package/dist/ssr/inputs/tag-messages.js +44 -0
  463. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  464. package/dist/ssr/inputs/template-messages.js +22 -0
  465. package/dist/ssr/inputs/template-messages.js.map +1 -0
  466. package/dist/ssr/internal/render-error-messages.js +20 -0
  467. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  468. package/dist/ssr/internal/render-error.js +3 -1
  469. package/dist/ssr/internal/render-error.js.map +1 -1
  470. package/dist/ssr/internal/text-selection.js +101 -0
  471. package/dist/ssr/internal/text-selection.js.map +1 -0
  472. package/dist/ssr/intl/messages.js +12 -1155
  473. package/dist/ssr/intl/messages.js.map +1 -1
  474. package/dist/ssr/layout/AppWorkspace.js +203 -96
  475. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  476. package/dist/ssr/layout/BottomSheet.js +1 -0
  477. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  478. package/dist/ssr/layout/Discussion.js +8 -5
  479. package/dist/ssr/layout/Discussion.js.map +1 -1
  480. package/dist/ssr/layout/FloatingWindow.js +8 -5
  481. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  482. package/dist/ssr/layout/Navigation.js +6 -5
  483. package/dist/ssr/layout/Navigation.js.map +1 -1
  484. package/dist/ssr/layout/PageTitle.js +253 -0
  485. package/dist/ssr/layout/PageTitle.js.map +1 -0
  486. package/dist/ssr/layout/PanelDialog.js +8 -6
  487. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  488. package/dist/ssr/layout/Panes.js +22 -14
  489. package/dist/ssr/layout/Panes.js.map +1 -1
  490. package/dist/ssr/layout/PullToRefresh.js +13 -4
  491. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  492. package/dist/ssr/layout/Settings.js +14 -12
  493. package/dist/ssr/layout/Settings.js.map +1 -1
  494. package/dist/ssr/layout/SettingsCollection.js +6 -5
  495. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  496. package/dist/ssr/layout/SettingsModal.js +3 -1
  497. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  498. package/dist/ssr/layout/app-workspace-controller.js +743 -12
  499. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  500. package/dist/ssr/layout/app-workspace-state.js +3 -2
  501. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  502. package/dist/ssr/layout/floating-window-messages.js +28 -0
  503. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  504. package/dist/ssr/layout/index.js +2 -0
  505. package/dist/ssr/layout/index.js.map +1 -1
  506. package/dist/ssr/layout/navigation-model.js.map +1 -1
  507. package/dist/ssr/layout/page-title-controller.js +169 -0
  508. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  509. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  510. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  511. package/dist/ssr/layout/panes-messages.js +48 -0
  512. package/dist/ssr/layout/panes-messages.js.map +1 -0
  513. package/dist/ssr/layout/refresh-messages.js +20 -0
  514. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  515. package/dist/ssr/layout/settings-messages.js +54 -0
  516. package/dist/ssr/layout/settings-messages.js.map +1 -0
  517. package/dist/ssr/layout/workspace-messages.js +56 -0
  518. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  519. package/dist/ssr/surfaces/Avatar.js +5 -5
  520. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  521. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  522. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  523. package/dist/ssr/surfaces/Tag.js +3 -3
  524. package/dist/ssr/surfaces/Tag.js.map +1 -1
  525. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  526. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  527. package/dist/ssr/surfaces/resource-messages.js +26 -0
  528. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  529. package/dist/ssr/widgets/Widget.js +6 -0
  530. package/dist/ssr/widgets/Widget.js.map +1 -1
  531. package/dist/styles.css +1 -1
  532. package/dist/types/actions/GestureMenu.d.ts +2 -0
  533. package/dist/types/actions/filter-messages.d.ts +8 -0
  534. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  535. package/dist/types/chat/chat-messages.d.ts +116 -0
  536. package/dist/types/content/Calendar.d.ts +32 -0
  537. package/dist/types/content/DataTable.d.ts +2 -0
  538. package/dist/types/content/FileView.d.ts +0 -10
  539. package/dist/types/content/calendar-messages.d.ts +60 -0
  540. package/dist/types/content/calendar-month-layout.d.ts +52 -0
  541. package/dist/types/content/chart-messages.d.ts +32 -0
  542. package/dist/types/content/data-table-messages.d.ts +10 -0
  543. package/dist/types/content/docs-messages.d.ts +10 -0
  544. package/dist/types/content/feed-messages.d.ts +15 -0
  545. package/dist/types/content/file-browser-messages.d.ts +33 -0
  546. package/dist/types/content/file-view-messages.d.ts +30 -0
  547. package/dist/types/content/index.d.ts +1 -1
  548. package/dist/types/content/lightbox-messages.d.ts +16 -0
  549. package/dist/types/content/log-entries-messages.d.ts +8 -0
  550. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  551. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  552. package/dist/types/content/pagination-messages.d.ts +17 -0
  553. package/dist/types/content/pdf-messages.d.ts +20 -0
  554. package/dist/types/content/range-picker-messages.d.ts +8 -0
  555. package/dist/types/content/structured-data-messages.d.ts +9 -0
  556. package/dist/types/content/timeline-messages.d.ts +29 -0
  557. package/dist/types/content/video-messages.d.ts +10 -0
  558. package/dist/types/content/viewport-messages.d.ts +12 -0
  559. package/dist/types/feedback/install-messages.d.ts +50 -0
  560. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  561. package/dist/types/feedback/toast-messages.d.ts +9 -0
  562. package/dist/types/index.d.ts +1 -0
  563. package/dist/types/inputs/completion-messages.d.ts +10 -0
  564. package/dist/types/inputs/date-picker.d.ts +7 -0
  565. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  566. package/dist/types/inputs/file-drop.d.ts +3 -3
  567. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  568. package/dist/types/inputs/icon-messages.d.ts +9 -0
  569. package/dist/types/inputs/input-messages.d.ts +17 -0
  570. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  571. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  572. package/dist/types/inputs/qr-messages.d.ts +11 -0
  573. package/dist/types/inputs/select-messages.d.ts +30 -0
  574. package/dist/types/inputs/tag-messages.d.ts +20 -0
  575. package/dist/types/inputs/template-messages.d.ts +9 -0
  576. package/dist/types/internal/render-error-messages.d.ts +8 -0
  577. package/dist/types/internal/text-selection.d.ts +18 -0
  578. package/dist/types/intl/messages.d.ts +6 -544
  579. package/dist/types/layout/AppWorkspace.d.ts +19 -4
  580. package/dist/types/layout/PageTitle.d.ts +64 -0
  581. package/dist/types/layout/app-workspace-controller.d.ts +4 -0
  582. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  583. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  584. package/dist/types/layout/index.d.ts +3 -0
  585. package/dist/types/layout/navigation-model.d.ts +7 -0
  586. package/dist/types/layout/page-title-controller.d.ts +13 -0
  587. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  588. package/dist/types/layout/panes-messages.d.ts +22 -0
  589. package/dist/types/layout/refresh-messages.d.ts +8 -0
  590. package/dist/types/layout/settings-messages.d.ts +25 -0
  591. package/dist/types/layout/workspace-messages.d.ts +26 -0
  592. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  593. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  594. package/dist/types/widgets/Widget.d.ts +5 -1
  595. package/package.json +1 -1
@@ -4,61 +4,85 @@ import { ssrElement as _$ssrElement } from "solid-js/web";
4
4
  import { mergeProps as _$mergeProps } from "solid-js/web";
5
5
  import { ssrStyle as _$ssrStyle } from "solid-js/web";
6
6
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
7
- import { escape as _$escape } from "solid-js/web";
8
7
  import { createComponent as _$createComponent } from "solid-js/web";
9
8
  import { ssr as _$ssr } from "solid-js/web";
10
- var _tmpl$ = "<span class=\"k2b-calendar-event__marker\" aria-hidden=\"true\"></span>",
11
- _tmpl$2 = ["<span class=\"k2b-calendar-event__title\">", "", "</span>"],
12
- _tmpl$3 = ["<span class=\"k2b-calendar-event__meta\">", "</span>"],
13
- _tmpl$4 = ["<span class=\"k2b-calendar-event__description\">", "</span>"],
14
- _tmpl$5 = ["<a", " class=\"k2b-calendar-event\" data-calendar-event", " style=\"", "\"", ">", "</a>"],
15
- _tmpl$6 = ["<button type=\"button\" class=\"k2b-calendar-event\" data-calendar-event", " data-interactive=\"true\"", " style=\"", "\"", ">", "</button>"],
16
- _tmpl$7 = ["<div class=\"k2b-calendar-event\" role=\"group\" data-calendar-event", " style=\"", "\"", ">", "</div>"],
17
- _tmpl$8 = ["<div role=\"radiogroup\"", " aria-orientation=\"horizontal\" class=\"k2b-segmented-control k2b-calendar-view-switcher\">", "</div>"],
18
- _tmpl$9 = ["<i class=\"", "\"></i>"],
19
- _tmpl$0 = ["<button type=\"button\"", " class=\"k2b-calendar-header__nav-button\"><i class=\"", "\"></i></button>"],
20
- _tmpl$1 = ["<span class=\"k2b-button__label\">", "</span>"],
21
- _tmpl$10 = "<span class=\"k2b-calendar-header__progress\" aria-hidden=\"true\"></span>",
22
- _tmpl$11 = ["<header class=\"k2b-calendar-header\"><div class=\"k2b-calendar-header__navigation\">", "", "<div class=\"k2b-calendar-header__title\">", "</div></div><div class=\"k2b-calendar-header__actions\">", "", "", "</div>", "</header>"],
23
- _tmpl$12 = ["<div class=\"k2b-calendar-month__weekday\">", "</div>"],
24
- _tmpl$13 = ["<div class=\"k2b-calendar-month\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\"", ">", "", "</div>", "</div>"],
25
- _tmpl$14 = ["<div class=\"k2b-calendar-month__week-number\">", "</div>"],
26
- _tmpl$15 = ["<div class=\"k2b-calendar-month__week\"", ">", "", "</div>"],
27
- _tmpl$16 = ["<div class=\"k2b-calendar-preview\">", "</div>"],
28
- _tmpl$17 = ["<div class=\"k2b-calendar-month__day\"", ">", "<div class=\"k2b-calendar-month__day-header\">", "", "</div><div class=\"k2b-calendar-month__events\">", "", "", "</div><div class=\"k2b-calendar-month__dots\">", "</div></div>"],
29
- _tmpl$18 = ["<span class=\"k2b-calendar-month__day-number\"", ">", "</span>"],
30
- _tmpl$19 = ["<span class=\"k2b-calendar-month__badge\">", "", "</span>"],
31
- _tmpl$20 = ["<span class=\"k2b-calendar-dot\"", " style=\"", "\"></span>"],
32
- _tmpl$21 = ["<div class=\"k2b-calendar-time-grid__all-day\" style=\"", "\"><div class=\"k2b-calendar-time-grid__all-day-label\">", "</div>", "</div>"],
33
- _tmpl$22 = ["<div class=\"k2b-calendar-time-grid\"><div class=\"k2b-calendar-time-grid__days\" style=\"", "\"><div></div>", "</div>", "<div class=\"k2b-calendar-time-grid__scroll\"><div class=\"k2b-calendar-time-grid__grid\" style=\"", "\"><div class=\"k2b-calendar-time-grid__gutter\" style=\"", "\">", "</div>", "</div></div></div>"],
34
- _tmpl$23 = ["<span class=\"k2b-calendar-time-grid__day-label\"", ">", "</span>"],
35
- _tmpl$24 = ["<span class=\"k2b-calendar-time-grid__badge\">", "", "</span>"],
36
- _tmpl$25 = ["<div class=\"k2b-calendar-time-grid__all-day-events\">", "", "</div>"],
37
- _tmpl$26 = ["<div class=\"k2b-calendar-time-grid__hour\"", ">", ":00</div>"],
38
- _tmpl$27 = ["<div class=\"k2b-calendar-time-grid__now\" style=\"", "\"></div>"],
39
- _tmpl$28 = ["<div class=\"k2b-calendar-time-grid__column\" style=\"", "\">", "", "", "", "", "</div>"],
40
- _tmpl$29 = ["<div class=\"k2b-calendar-preview__title\">", "</div>"],
41
- _tmpl$30 = ["<div class=\"k2b-calendar-preview k2b-calendar-preview--timed\"", " style=\"", "\"><div class=\"k2b-calendar-preview__content\">", "<div class=\"k2b-calendar-preview__label\">", " - ", "</div></div></div>"],
42
- _tmpl$31 = ["<button type=\"button\"", " draggable=\"false\" class=\"k2b-calendar-time-grid__resize\"><span class=\"k2b-calendar-time-grid__resize-icon\" aria-hidden=\"true\"></span></button>"],
43
- _tmpl$32 = ["<div class=\"k2b-calendar-time-grid__event-position\" style=\"", "\"><div class=\"k2b-calendar-time-grid__event-frame\">", "", "</div></div>"],
44
- _tmpl$33 = ["<button type=\"button\" class=\"k2b-calendar-time-grid__overflow\" style=\"", "\"", "><span class=\"k2b-calendar-time-grid__overflow-count\">+", "</span></button>"],
45
- _tmpl$34 = ["<div class=\"k2b-calendar-time-grid__overflow-menu\" style=\"", "\"><div class=\"k2b-calendar-time-grid__overflow-title\">", " - ", "</div>", "</div>"],
46
- _tmpl$35 = ["<div class=\"k2b-calendar-year\">", "</div>"],
47
- _tmpl$36 = ["<div class=\"k2b-calendar-year__month\"><div class=\"k2b-calendar-year__title\">", "</div><div class=\"k2b-calendar-year__grid\">", "</div></div>"],
48
- _tmpl$37 = ["<span class=\"k2b-calendar-year__indicator\"", " style=\"", "\"></span>"],
49
- _tmpl$38 = ["<div class=\"k2b-calendar-mobile-month__events\">", "</div>"],
50
- _tmpl$39 = ["<div class=\"k2b-calendar-mobile-month\">", "<div class=\"k2b-calendar-mobile-month__agenda\"><div class=\"k2b-calendar-mobile-month__title\">", "</div>", "</div></div>"],
51
- _tmpl$40 = ["<div class=\"k2b-calendar-mobile-month__empty\">", "</div>"],
52
- _tmpl$41 = ["<div class=\"k2b-calendar-body\">", "</div>"],
53
- _tmpl$42 = ["<section class=\"", "\"", ">", "", "", "</section>"];
9
+ import { escape as _$escape } from "solid-js/web";
10
+ var _tmpl$ = ["<span class=\"k2b-calendar-event__time\">", "</span>"],
11
+ _tmpl$2 = "<span class=\"k2b-calendar-event__marker\" aria-hidden=\"true\"></span>",
12
+ _tmpl$3 = ["<span class=\"k2b-calendar-event__title\">", "", "</span>"],
13
+ _tmpl$4 = ["<span class=\"k2b-calendar-event__meta\">", "</span>"],
14
+ _tmpl$5 = ["<span class=\"k2b-calendar-event__description\">", "</span>"],
15
+ _tmpl$6 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"start\" aria-hidden=\"true\">", "</span>"],
16
+ _tmpl$7 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"end\" aria-hidden=\"true\">", "</span>"],
17
+ _tmpl$8 = ["<a", " class=\"k2b-calendar-event\" data-calendar-event", " style=\"", "\"", ">", "</a>"],
18
+ _tmpl$9 = ["<button type=\"button\" class=\"k2b-calendar-event\" data-calendar-event", " data-interactive=\"true\"", " style=\"", "\"", ">", "</button>"],
19
+ _tmpl$0 = ["<div class=\"k2b-calendar-event\" role=\"group\" data-calendar-event", " style=\"", "\"", ">", "</div>"],
20
+ _tmpl$1 = ["<div role=\"radiogroup\"", " aria-orientation=\"horizontal\" class=\"k2b-segmented-control k2b-calendar-view-switcher\">", "</div>"],
21
+ _tmpl$10 = ["<i class=\"", "\"></i>"],
22
+ _tmpl$11 = ["<button type=\"button\"", " class=\"k2b-calendar-header__nav-button\"><i class=\"", "\"></i></button>"],
23
+ _tmpl$12 = ["<span class=\"k2b-button__label\">", "</span>"],
24
+ _tmpl$13 = ["<div class=\"k2b-calendar-header__content\">", "</div>"],
25
+ _tmpl$14 = "<span class=\"k2b-calendar-header__progress\" aria-hidden=\"true\"></span>",
26
+ _tmpl$15 = ["<header class=\"k2b-calendar-header\"><div class=\"k2b-calendar-header__navigation\">", "", "<div class=\"k2b-calendar-header__title\"><span>", "</span>", "</div></div>", "<div class=\"k2b-calendar-header__actions\">", "", "", "</div>", "</header>"],
27
+ _tmpl$16 = ["<span class=\"k2b-calendar-header__title-size\" aria-hidden=\"true\">", "</span>"],
28
+ _tmpl$17 = ["<div class=\"k2b-calendar-month__weekday\">", "</div>"],
29
+ _tmpl$18 = ["<div class=\"k2b-calendar-month\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\"", ">", "", "</div>", "</div>"],
30
+ _tmpl$19 = ["<div class=\"k2b-calendar-month__week-number\">", "</div>"],
31
+ _tmpl$20 = ["<div class=\"k2b-calendar-month__week\"", ">", "", "</div>"],
32
+ _tmpl$21 = ["<div class=\"k2b-calendar-preview\">", "</div>"],
33
+ _tmpl$22 = ["<div class=\"k2b-calendar-month__day\"", ">", "<div class=\"k2b-calendar-month__day-header\">", "", "</div><div class=\"k2b-calendar-month__events\">", "", "", "</div><div class=\"k2b-calendar-month__dots\">", "</div></div>"],
34
+ _tmpl$23 = ["<span class=\"k2b-calendar-month__day-number\"", ">", "</span>"],
35
+ _tmpl$24 = ["<span class=\"k2b-calendar-month__badge\">", "", "</span>"],
36
+ _tmpl$25 = ["<span class=\"k2b-calendar-dot\"", " style=\"", "\"></span>"],
37
+ _tmpl$26 = ["<div class=\"k2b-calendar-month__weekday\" role=\"columnheader\">", "</div>"],
38
+ _tmpl$27 = ["<div class=\"k2b-calendar-month\" role=\"grid\"", " aria-multiselectable=\"true\" data-lanes=\"true\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\" role=\"row\"", ">", "", "</div>", "</div>"],
39
+ _tmpl$28 = ["<div class=\"k2b-calendar-month__weekday\" role=\"columnheader\"", ">", "</div>"],
40
+ _tmpl$29 = ["<div class=\"k2b-calendar-month__week-number\" role=\"rowheader\">", "</div>"],
41
+ _tmpl$30 = ["<div class=\"k2b-calendar-month__week\" role=\"row\"", ">", "", "</div>"],
42
+ _tmpl$31 = ["<button type=\"button\" class=\"k2b-calendar-month__week-link\" tabindex=\"-1\"", ">", "</button>"],
43
+ _tmpl$32 = ["<button type=\"button\" class=\"k2b-calendar-month__more\" tabindex=\"-1\" style=\"", "\"", " aria-haspopup=\"dialog\"", "><span class=\"k2b-calendar-month__more-long\">", "</span><span class=\"k2b-calendar-month__more-short\">+", "</span></button>"],
44
+ _tmpl$33 = ["<div class=\"k2b-calendar-month__day\" role=\"gridcell\"", "><div class=\"k2b-calendar-month__day-header\"><span class=\"k2b-calendar-month__day-number\"", ">", "</span>", "</div><div class=\"k2b-calendar-month__lanes\">", "", "", "</div></div>"],
45
+ _tmpl$34 = ["<div class=\"k2b-calendar-month__segment\" style=\"", "\">", "</div>"],
46
+ _tmpl$35 = ["<ul class=\"k2b-calendar-day-list__events\">", "</ul>"],
47
+ _tmpl$36 = "<i class=\"ti ti-plus\" aria-hidden=\"true\"></i>",
48
+ _tmpl$37 = ["<div class=\"k2b-calendar-day-list\"><div class=\"k2b-calendar-day-list__title\">", "</div>", "<div class=\"k2b-calendar-day-list__actions\">", "", "</div></div>"],
49
+ _tmpl$38 = ["<p class=\"k2b-calendar-day-list__empty\">", "</p>"],
50
+ _tmpl$39 = ["<li>", "</li>"],
51
+ _tmpl$40 = "<i class=\"ti ti-zoom-in\" aria-hidden=\"true\"></i>",
52
+ _tmpl$41 = ["<div class=\"k2b-calendar-popover\" popover=\"auto\" role=\"dialog\"", ">", "</div>"],
53
+ _tmpl$42 = ["<div class=\"k2b-calendar-time-grid__all-day\" style=\"", "\"><div class=\"k2b-calendar-time-grid__all-day-label\">", "</div>", "</div>"],
54
+ _tmpl$43 = ["<div class=\"k2b-calendar-time-grid\"><div class=\"k2b-calendar-time-grid__days\" style=\"", "\"><div></div>", "</div>", "<div class=\"k2b-calendar-time-grid__scroll\"><div class=\"k2b-calendar-time-grid__grid\" style=\"", "\"><div class=\"k2b-calendar-time-grid__gutter\" style=\"", "\">", "</div>", "</div></div></div>"],
55
+ _tmpl$44 = ["<span class=\"k2b-calendar-time-grid__day-label\"", ">", "</span>"],
56
+ _tmpl$45 = ["<span class=\"k2b-calendar-time-grid__badge\">", "", "</span>"],
57
+ _tmpl$46 = ["<div class=\"k2b-calendar-time-grid__all-day-events\">", "", "</div>"],
58
+ _tmpl$47 = ["<div class=\"k2b-calendar-time-grid__hour\"", ">", ":00</div>"],
59
+ _tmpl$48 = ["<div class=\"k2b-calendar-time-grid__now\" style=\"", "\"></div>"],
60
+ _tmpl$49 = ["<div class=\"k2b-calendar-time-grid__column\" style=\"", "\">", "", "", "", "", "</div>"],
61
+ _tmpl$50 = ["<div class=\"k2b-calendar-preview__title\">", "</div>"],
62
+ _tmpl$51 = ["<div class=\"k2b-calendar-preview k2b-calendar-preview--timed\"", " style=\"", "\"><div class=\"k2b-calendar-preview__content\">", "<div class=\"k2b-calendar-preview__label\">", " - ", "</div></div></div>"],
63
+ _tmpl$52 = ["<button type=\"button\"", " draggable=\"false\" class=\"k2b-calendar-time-grid__resize\"><span class=\"k2b-calendar-time-grid__resize-icon\" aria-hidden=\"true\"></span></button>"],
64
+ _tmpl$53 = ["<div class=\"k2b-calendar-time-grid__event-position\" style=\"", "\"><div class=\"k2b-calendar-time-grid__event-frame\">", "", "</div></div>"],
65
+ _tmpl$54 = ["<button type=\"button\" class=\"k2b-calendar-time-grid__overflow\" style=\"", "\"", "><span class=\"k2b-calendar-time-grid__overflow-count\">+", "</span></button>"],
66
+ _tmpl$55 = ["<div class=\"k2b-calendar-time-grid__overflow-menu\" style=\"", "\"><div class=\"k2b-calendar-time-grid__overflow-title\">", " - ", "</div>", "</div>"],
67
+ _tmpl$56 = ["<div class=\"k2b-calendar-year\">", "</div>"],
68
+ _tmpl$57 = ["<div class=\"k2b-calendar-year__month\"><div class=\"k2b-calendar-year__title\">", "</div><div class=\"k2b-calendar-year__grid\">", "</div></div>"],
69
+ _tmpl$58 = ["<span class=\"k2b-calendar-year__indicator\"", " style=\"", "\"></span>"],
70
+ _tmpl$59 = ["<div class=\"k2b-calendar-mobile-month__events\">", "</div>"],
71
+ _tmpl$60 = ["<div class=\"k2b-calendar-mobile-month\">", "<div class=\"k2b-calendar-mobile-month__agenda\"><div class=\"k2b-calendar-mobile-month__title\">", "</div>", "</div></div>"],
72
+ _tmpl$61 = ["<div class=\"k2b-calendar-mobile-month__empty\">", "</div>"],
73
+ _tmpl$62 = ["<div class=\"k2b-calendar-body\">", "</div>"],
74
+ _tmpl$63 = ["<section class=\"", "\"", ">", "", "</section>"];
54
75
  import { Link } from "@k2b/ssr/nav";
55
76
  import { dates as calendar } from "@k2b/stdlib";
56
- import { createMemo, createSignal, For, mergeProps, onCleanup, onMount, Show } from "solid-js";
77
+ import { createEffect, createMemo, createSignal, For, mergeProps, on, onCleanup, onMount, Show, untrack } from "solid-js";
57
78
  import { Button } from "../actions/Button";
79
+ import { GestureMenu } from "../actions/GestureMenu";
58
80
  import SegmentedControl from "../actions/SegmentedControl";
59
81
  import { useDateConfigLocale } from "../intl/locale";
60
82
  import { useUiMessages } from "../intl/messages";
61
83
  import { layoutCalendarIntervals } from "./calendar-event-layout";
84
+ import { useCalendarMessages } from "./calendar-messages";
85
+ import { fitMonthWeek, layoutMonthWeek, monthLaneCapacity } from "./calendar-month-layout";
62
86
  import { calendarDayIndexAtPoint, calendarMinuteAtPoint, startCalendarPointerSession } from "./calendar-pointer";
63
87
 
64
88
  /** A view the application adds to the switcher; the calendar shows its header and toolbar, the application the body. */
@@ -220,7 +244,7 @@ const timedEventLayouts = events => {
220
244
  }));
221
245
  };
222
246
  const EventChip = props => {
223
- const messages = useUiMessages();
247
+ const calendarMessages = useCalendarMessages();
224
248
  const dateConfig = createMemo(() => ownerDateConfig(props.owner));
225
249
  const color = () => props.event.color ?? "blue";
226
250
  const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;
@@ -235,7 +259,7 @@ const EventChip = props => {
235
259
  const showDescription = () => Boolean(props.event.description?.trim() && props.fill && !props.event.allDay && !props.compact && durationHours() >= 1.5);
236
260
  const timeLabel = () => `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;
237
261
  const ariaLabel = () => {
238
- const label = props.event.allDay ? props.event.title : messages().calendarEventTime({
262
+ const label = props.label ? props.label : props.event.allDay ? props.event.title : calendarMessages().calendarEventTime({
239
263
  title: props.event.title,
240
264
  start: formatTime(props.event.startDate, dateConfig()),
241
265
  end: formatTime(props.event.endDate, dateConfig())
@@ -249,38 +273,60 @@ const EventChip = props => {
249
273
  end: props.event.endDate,
250
274
  allDay: props.event.allDay ?? false,
251
275
  durationHours: durationHours(),
252
- timeLabel: timeLabel()
276
+ timeLabel: timeLabel(),
277
+ leadingTime: props.leadingTime
253
278
  });
254
- const defaultContent = [_$ssr(_tmpl$2, _$escape(_$createComponent(Show, {
279
+ const defaultContent = [_$createComponent(Show, {
280
+ get when() {
281
+ return props.leadingTime;
282
+ },
283
+ get children() {
284
+ return _$ssr(_tmpl$, _$escape(props.leadingTime));
285
+ }
286
+ }), _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
255
287
  get when() {
256
288
  return props.event.display === "marker";
257
289
  },
258
290
  get children() {
259
- return _$ssr(_tmpl$);
291
+ return _$ssr(_tmpl$2);
260
292
  }
261
293
  })), _$escape(props.event.title)), _$createComponent(Show, {
262
294
  get when() {
263
295
  return showTime();
264
296
  },
265
297
  get children() {
266
- return _$ssr(_tmpl$3, _$escape(timeLabel()));
298
+ return _$ssr(_tmpl$4, _$escape(timeLabel()));
267
299
  }
268
300
  }), _$createComponent(Show, {
269
301
  get when() {
270
302
  return showLocation();
271
303
  },
272
304
  get children() {
273
- return _$ssr(_tmpl$3, _$escape(props.event.location));
305
+ return _$ssr(_tmpl$4, _$escape(props.event.location));
274
306
  }
275
307
  }), _$createComponent(Show, {
276
308
  get when() {
277
309
  return showDescription();
278
310
  },
279
311
  get children() {
280
- return _$ssr(_tmpl$4, _$escape(props.event.description));
312
+ return _$ssr(_tmpl$5, _$escape(props.event.description));
313
+ }
314
+ })];
315
+ const content = () => [_$createComponent(Show, {
316
+ get when() {
317
+ return props.hintStart;
318
+ },
319
+ get children() {
320
+ return _$ssr(_tmpl$6, _$escape(props.hintStart));
321
+ }
322
+ }), renderedEvent() ?? defaultContent, _$createComponent(Show, {
323
+ get when() {
324
+ return props.hintEnd;
325
+ },
326
+ get children() {
327
+ return _$ssr(_tmpl$7, _$escape(props.hintEnd));
281
328
  }
282
329
  })];
283
- const content = () => renderedEvent() ?? defaultContent;
284
330
  const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);
285
331
  let suppressClickUntil = 0;
286
332
  const onClick = event => {
@@ -312,7 +358,7 @@ const EventChip = props => {
312
358
  suppressClickUntil = performance.now() + 400;
313
359
  });
314
360
  };
315
- return props.href ? _$ssr(_tmpl$5, _$ssrAttribute("href", _$escape(props.href, true), false), _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", isInteractive() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false) + _$ssrAttribute("data-space-item-id", _$escape(props.event.dataSpaceItemId, true), false), _$ssrStyle(style()), _$ssrAttribute("draggable", props.onMovePointerDown ? _$escape(false, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : isActionable() ? _$ssr(_tmpl$6, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : _$ssr(_tmpl$7, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content()));
361
+ return props.href ? _$ssr(_tmpl$8, _$ssrAttribute("href", _$escape(props.href, true), false), _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", isInteractive() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false) + _$ssrAttribute("data-space-item-id", _$escape(props.event.dataSpaceItemId, true), false), _$ssrStyle(style()), _$ssrAttribute("draggable", props.onMovePointerDown ? _$escape(false, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : isActionable() ? _$ssr(_tmpl$9, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : _$ssr(_tmpl$0, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content()));
316
362
  };
317
363
  const slotInteractionProps = (owner, slot, suppressed, nativeControl = false) => {
318
364
  const isSlotChild = event => {
@@ -377,7 +423,7 @@ const CalendarNavigationLink = props => {
377
423
  }), _$escape(props.children), false);
378
424
  };
379
425
  const CalendarViewLinks = props => {
380
- const messages = useUiMessages();
426
+ const calendarMessages = useCalendarMessages();
381
427
  const refs = [];
382
428
  const selectRelative = (currentIndex, direction) => {
383
429
  if (props.options.length === 0) return;
@@ -395,13 +441,17 @@ const CalendarViewLinks = props => {
395
441
  refs[event.key === "Home" ? 0 : props.options.length - 1]?.click();
396
442
  }
397
443
  };
398
- return _$ssr(_tmpl$8, _$ssrAttribute("aria-label", _$escape(messages().calendarView, true), false), _$escape(_$createComponent(For, {
444
+ return _$ssr(_tmpl$1, _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarView, true), false), _$escape(_$createComponent(For, {
399
445
  get each() {
400
446
  return props.options;
401
447
  },
402
448
  children: (option, index) => {
403
449
  const active = () => (props.view === "mobile-month" ? "month" : props.view) === option.value;
404
- const href = () => props.owner.getViewHref?.(option.value) ?? "#";
450
+ const href = () => {
451
+ const day = props.focusDay;
452
+ const atDay = day && !active() ? props.owner.getDateHref?.(day, option.value) : undefined;
453
+ return atDay ?? props.owner.getViewHref?.(option.value) ?? "#";
454
+ };
405
455
  return _$createComponent(CalendarNavigationLink, {
406
456
  get owner() {
407
457
  return props.owner;
@@ -430,14 +480,30 @@ const CalendarViewLinks = props => {
430
480
  })));
431
481
  };
432
482
 
483
+ /**
484
+ * The same day some months later, or the last day of that month when it is shorter: a step from January 31 lands on
485
+ * February 28, never in March. stdlib's `addMonths` runs over into the next month.
486
+ */
487
+ const addMonthsClamped = (date, months, dateConfig) => {
488
+ const moved = calendar.addMonths(date, months, dateConfig);
489
+ if (calendar.formatDateKey(moved, dateConfig).slice(8) === calendar.formatDateKey(date, dateConfig).slice(8)) return moved;
490
+ return calendar.addDays(calendar.startOfMonth(moved, dateConfig), -1, dateConfig);
491
+ };
492
+
433
493
  /** Custom views page by day, like the day view. */
434
494
  const adjacentCalendarDate = (date, view, direction, dateConfig) => {
435
- if (view === "year") return calendar.addMonths(date, direction * 12, dateConfig);
436
- if (view === "month" || view === "mobile-month") return calendar.addMonths(date, direction, dateConfig);
495
+ if (view === "year") return addMonthsClamped(date, direction * 12, dateConfig);
496
+ if (view === "month" || view === "mobile-month") return addMonthsClamped(date, direction, dateConfig);
437
497
  return calendar.addDays(date, direction * (view === "week" ? 7 : 1), dateConfig);
438
498
  };
499
+
500
+ /** Opens a view at a day through the host's callbacks. Hosts may keep the view and the date apart, so both hear it. */
501
+ const openViewAt = (owner, date, view) => {
502
+ owner.onViewChange?.(view);
503
+ owner.onDateChange?.(date, view);
504
+ };
439
505
  const CalendarHeader = props => {
440
- const messages = useUiMessages();
506
+ const calendarMessages = useCalendarMessages();
441
507
  const dateConfig = () => ownerDateConfig(props.owner);
442
508
  const previous = () => adjacentCalendarDate(props.date, props.view, -1, dateConfig());
443
509
  const next = () => adjacentCalendarDate(props.date, props.view, 1, dateConfig());
@@ -456,8 +522,51 @@ const CalendarHeader = props => {
456
522
  if (props.view === "week") return `${formatDay(calendar.startOfWeek(props.date, dateConfig()), dateConfig())} - ${formatDay(calendar.addDays(calendar.startOfWeek(props.date, dateConfig()), 6, dateConfig()), dateConfig())}`;
457
523
  return formatMonth(props.date, dateConfig());
458
524
  };
525
+ /**
526
+ * The titles this view can show around the current date: the months of the year, the weeks of the month, or a day
527
+ * of each weekday in every month. Their widest one sets the title's width.
528
+ */
529
+ const titleWidths = createMemo(() => {
530
+ const context = dateConfig();
531
+ if (props.view === "year") return [];
532
+ const {
533
+ year
534
+ } = zonedYearMonth(props.date, context);
535
+ if (props.view === "month" || props.view === "mobile-month") return Array.from({
536
+ length: 12
537
+ }, (_, month) => formatMonth(zonedMonthDate(year, month, context), context));
538
+ if (props.view === "week") {
539
+ const first = calendar.startOfWeek(calendar.startOfMonth(props.date, context), context);
540
+ return Array.from({
541
+ length: 6
542
+ }, (_, week) => {
543
+ const start = calendar.addDays(first, week * 7, context);
544
+ return `${formatDay(start, context)} - ${formatDay(calendar.addDays(start, 6, context), context)}`;
545
+ });
546
+ }
547
+ return Array.from({
548
+ length: 12
549
+ }, (_, month) => month).flatMap(month => {
550
+ const first = zonedMonthDate(year, month, context);
551
+ return Array.from({
552
+ length: 7
553
+ }, (_, offset) => calendar.addDays(first, 21 + offset, context).toLocaleDateString(context.locale ?? "en", {
554
+ weekday: "long",
555
+ month: "long",
556
+ day: "numeric",
557
+ year: "numeric",
558
+ timeZone: context.timeZone
559
+ }));
560
+ });
561
+ });
459
562
  const goDate = date => props.owner.onDateChange?.(date, props.view);
460
563
  const goView = view => {
564
+ // Like the switcher's links, the other views open at the day selected in the month view.
565
+ const day = props.focusDay;
566
+ if (day && props.owner.onDateChange && view !== props.view) {
567
+ openViewAt(props.owner, day, view);
568
+ return;
569
+ }
461
570
  if (props.owner.onViewChange) {
462
571
  props.owner.onViewChange(view);
463
572
  return;
@@ -478,9 +587,9 @@ const CalendarHeader = props => {
478
587
  class: "k2b-calendar-header__nav-button"
479
588
  },
480
589
  get children() {
481
- return _$ssr(_tmpl$9, `ti ${_$escape(icon, true)}`);
590
+ return _$ssr(_tmpl$10, `ti ${_$escape(icon, true)}`);
482
591
  }
483
- }) : props.owner.onDateChange ? _$ssr(_tmpl$0, _$ssrAttribute("aria-label", _$escape(label, true), false), `ti ${_$escape(icon, true)}`) : _$createComponent(CalendarNavigationLink, {
592
+ }) : props.owner.onDateChange ? _$ssr(_tmpl$11, _$ssrAttribute("aria-label", _$escape(label, true), false), `ti ${_$escape(icon, true)}`) : _$createComponent(CalendarNavigationLink, {
484
593
  get owner() {
485
594
  return props.owner;
486
595
  },
@@ -491,14 +600,14 @@ const CalendarHeader = props => {
491
600
  class: "k2b-calendar-header__nav-button"
492
601
  },
493
602
  get children() {
494
- return _$ssr(_tmpl$9, `ti ${_$escape(icon, true)}`);
603
+ return _$ssr(_tmpl$10, `ti ${_$escape(icon, true)}`);
495
604
  }
496
605
  });
497
606
  };
498
607
  const todayButton = () => {
499
608
  const today = calendar.today(dateConfig());
500
609
  const href = props.owner.getDateHref?.(today, props.view);
501
- const label = _$ssr(_tmpl$1, _$escape(props.labels.today));
610
+ const label = _$ssr(_tmpl$12, _$escape(props.labels.today));
502
611
  return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
503
612
  get owner() {
504
613
  return props.owner;
@@ -545,7 +654,19 @@ const CalendarHeader = props => {
545
654
  value: "year",
546
655
  label: props.labels.year
547
656
  }].filter(option => !props.owner.views || props.owner.views.includes(option.value)), ...(props.owner.customViews ?? [])]);
548
- return _$ssr(_tmpl$11, _$escape(navButton(previous(), "ti-chevron-left", props.labels.previous)), _$escape(navButton(next(), "ti-chevron-right", props.labels.next)), _$escape(title()), _$escape(todayButton()), _$escape(_$createComponent(Show, {
657
+ return _$ssr(_tmpl$15, _$escape(navButton(previous(), "ti-chevron-left", props.labels.previous)), _$escape(navButton(next(), "ti-chevron-right", props.labels.next)), _$escape(title()), _$escape(_$createComponent(For, {
658
+ get each() {
659
+ return titleWidths();
660
+ },
661
+ children: candidate => _$ssr(_tmpl$16, _$escape(candidate))
662
+ })), _$escape(_$createComponent(Show, {
663
+ get when() {
664
+ return props.owner.toolbarContent;
665
+ },
666
+ get children() {
667
+ return _$ssr(_tmpl$13, _$escape(props.owner.toolbarContent));
668
+ }
669
+ })), _$escape(todayButton()), _$escape(_$createComponent(Show, {
549
670
  get when() {
550
671
  return _$memo(() => !!!props.owner.onViewChange)() && props.owner.getViewHref;
551
672
  },
@@ -554,7 +675,7 @@ const CalendarHeader = props => {
554
675
  value: () => props.view === "mobile-month" ? "month" : props.view,
555
676
  onValueChange: goView,
556
677
  get ariaLabel() {
557
- return messages().calendarView;
678
+ return calendarMessages().calendarView;
558
679
  },
559
680
  get options() {
560
681
  return viewOptions();
@@ -571,6 +692,9 @@ const CalendarHeader = props => {
571
692
  },
572
693
  get options() {
573
694
  return viewOptions();
695
+ },
696
+ get focusDay() {
697
+ return props.focusDay;
574
698
  }
575
699
  });
576
700
  }
@@ -579,12 +703,14 @@ const CalendarHeader = props => {
579
703
  return props.owner.navigationPending;
580
704
  },
581
705
  get children() {
582
- return _$ssr(_tmpl$10);
706
+ return _$ssr(_tmpl$14);
583
707
  }
584
708
  })));
585
709
  };
586
- const MonthView = props => {
587
- const messages = useUiMessages();
710
+
711
+ /** The compact month of `mobile-month`: a picker whose days link to their agenda. */
712
+ const MonthPickerView = props => {
713
+ const calendarMessages = useCalendarMessages();
588
714
  const dateConfig = createMemo(() => ownerDateConfig(props.owner));
589
715
  const [movePreview, setMovePreview] = createSignal(null);
590
716
  const [movingEventId, setMovingEventId] = createSignal("");
@@ -637,28 +763,28 @@ const MonthView = props => {
637
763
  });
638
764
  };
639
765
  onCleanup(() => cancelInteraction?.());
640
- return _$ssr(_tmpl$13, _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, ${props.compact ? "minmax(2.75rem, auto)" : "minmax(5rem, 1fr)"})`), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
766
+ return _$ssr(_tmpl$18, _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, ${props.compact ? "minmax(2.75rem, auto)" : "minmax(5rem, 1fr)"})`), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
641
767
  get when() {
642
768
  return props.owner.withWeekNumbers;
643
769
  },
644
770
  get children() {
645
- return _$ssr(_tmpl$12, _$escape(messages().weekShort));
771
+ return _$ssr(_tmpl$17, _$escape(calendarMessages().weekShort));
646
772
  }
647
773
  })), _$escape(_$createComponent(For, {
648
774
  get each() {
649
775
  return weekdays();
650
776
  },
651
- children: day => _$ssr(_tmpl$12, _$escape(day))
777
+ children: day => _$ssr(_tmpl$17, _$escape(day))
652
778
  })), _$escape(_$createComponent(For, {
653
779
  get each() {
654
780
  return weeks();
655
781
  },
656
- children: week => _$ssr(_tmpl$15, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
782
+ children: week => _$ssr(_tmpl$20, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
657
783
  get when() {
658
784
  return props.owner.withWeekNumbers;
659
785
  },
660
786
  get children() {
661
- return _$ssr(_tmpl$14, _$escape(zonedWeekNumber(week[0], dateConfig())));
787
+ return _$ssr(_tmpl$19, _$escape(zonedWeekNumber(week[0], dateConfig())));
662
788
  }
663
789
  })), _$escape(_$createComponent(For, {
664
790
  each: week,
@@ -687,7 +813,7 @@ const MonthView = props => {
687
813
  hiddenCount: Math.max(0, candidates.length - visibleLimit)
688
814
  };
689
815
  });
690
- return _$ssr(_tmpl$17, _$ssrAttribute("data-calendar-day-key", _$escape(dayKey, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-drop-preview", movePreview()?.start && calendar.formatDateKey(movePreview().start, dateConfig()) === dayKey ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
816
+ return _$ssr(_tmpl$22, _$ssrAttribute("data-calendar-day-key", _$escape(dayKey, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-drop-preview", movePreview()?.start && calendar.formatDateKey(movePreview().start, dateConfig()) === dayKey ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
691
817
  get when() {
692
818
  return props.owner.onSlotActivate;
693
819
  },
@@ -704,7 +830,7 @@ const MonthView = props => {
704
830
  get anchorProps() {
705
831
  return {
706
832
  class: "k2b-calendar-month__day-target",
707
- "aria-label": messages().openDate({
833
+ "aria-label": calendarMessages().openDate({
708
834
  label: dayLabel
709
835
  })
710
836
  };
@@ -718,7 +844,7 @@ const MonthView = props => {
718
844
  "class": "k2b-calendar-month__day-target",
719
845
  "data-interactive": "true",
720
846
  get ["aria-label"]() {
721
- return messages().createEventOn({
847
+ return calendarMessages().createEventOn({
722
848
  label: dayLabel
723
849
  });
724
850
  }
@@ -736,7 +862,7 @@ const MonthView = props => {
736
862
  return props.owner.onSlotActivate && href;
737
863
  },
738
864
  get fallback() {
739
- return _$ssr(_tmpl$18, _$ssrAttribute("data-today", isToday ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())));
865
+ return _$ssr(_tmpl$23, _$ssrAttribute("data-today", isToday ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())));
740
866
  },
741
867
  children: dayHref => _$createComponent(CalendarNavigationLink, {
742
868
  get owner() {
@@ -750,7 +876,7 @@ const MonthView = props => {
750
876
  class: "k2b-calendar-month__day-number",
751
877
  "data-today": isToday ? "true" : undefined,
752
878
  "data-outside": !sameMonth ? "true" : undefined,
753
- "aria-label": messages().openDate({
879
+ "aria-label": calendarMessages().openDate({
754
880
  label: dayLabel
755
881
  })
756
882
  };
@@ -761,18 +887,18 @@ const MonthView = props => {
761
887
  })
762
888
  })), _$escape(_$createComponent(Show, {
763
889
  when: dayBadge,
764
- children: badge => _$ssr(_tmpl$19, _$escape(_$createComponent(Show, {
890
+ children: badge => _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
765
891
  get when() {
766
892
  return badge().icon;
767
893
  },
768
- children: icon => _$ssr(_tmpl$9, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
894
+ children: icon => _$ssr(_tmpl$10, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
769
895
  })), _$escape(badge().label))
770
896
  })), _$escape(_$createComponent(Show, {
771
897
  get when() {
772
898
  return eventStack().preview;
773
899
  },
774
900
  get children() {
775
- return _$ssr(_tmpl$16, _$escape(props.events.find(event => event.id === eventStack().preview.id)?.title ?? messages().moveEvent));
901
+ return _$ssr(_tmpl$21, _$escape(props.events.find(event => event.id === eventStack().preview.id)?.title ?? calendarMessages().moveEvent));
776
902
  }
777
903
  })), _$escape(_$createComponent(For, {
778
904
  get each() {
@@ -808,7 +934,9 @@ const MonthView = props => {
808
934
  class: "k2b-calendar-month__more"
809
935
  },
810
936
  get children() {
811
- return ["+", eventStack().hiddenCount, " more"];
937
+ return calendarMessages().calendarMoreEvents({
938
+ count: eventStack().hiddenCount
939
+ });
812
940
  }
813
941
  });
814
942
  }
@@ -816,7 +944,7 @@ const MonthView = props => {
816
944
  get each() {
817
945
  return events.slice(0, 4);
818
946
  },
819
- children: event => _$ssr(_tmpl$20, _$ssrAttribute("data-color", event.colorHex ? _$escape(undefined, true) : _$escape(event.color ?? "blue", true), false), _$ssrStyle(event.colorHex ? {
947
+ children: event => _$ssr(_tmpl$25, _$ssrAttribute("data-color", event.colorHex ? _$escape(undefined, true) : _$escape(event.color ?? "blue", true), false), _$ssrStyle(event.colorHex ? {
820
948
  "background-color": event.colorHex
821
949
  } : undefined))
822
950
  })));
@@ -824,8 +952,990 @@ const MonthView = props => {
824
952
  })))
825
953
  })));
826
954
  };
955
+
956
+ /** One entry of the month grid: its whole range, and the days it covers as `YYYY-MM-DD` keys. */
957
+
958
+ /** Lane height and gap of the month entries, in rem; the stylesheet reads both from the grid's custom properties. */
959
+ const MONTH_LANE_REM = 1.25;
960
+ const MONTH_LANE_GAP_REM = 0.125;
961
+ /** Rows drawn before the browser has measured the cells, as in the server response. */
962
+ const MONTH_DEFAULT_LANES = 3;
963
+ /** Room a bar keeps beside its title and date hint: padding, torn edge, gap, and an icon such as a task box or a flag. */
964
+ const MONTH_HINT_SLACK_REM = 2.25;
965
+ const dayKeyNumber = key => {
966
+ const [year = "1970", month = "1", day = "1"] = key.split("-");
967
+ return Date.UTC(Number(year), Number(month) - 1, Number(day)) / 86_400_000;
968
+ };
969
+ const orderedSelection = (anchor, focus) => anchor <= focus ? {
970
+ first: anchor,
971
+ last: focus
972
+ } : {
973
+ first: focus,
974
+ last: anchor
975
+ };
976
+
977
+ /** Groups the per-day pieces of the events back into one entry each: bars first, then the others by time. */
978
+ const monthItems = events => {
979
+ const items = new Map();
980
+ for (const piece of events) {
981
+ const key = `${piece.id}\u0000${piece.sourceStartDate.getTime()}`;
982
+ const item = items.get(key);
983
+ if (item) {
984
+ if (piece.dayKey < item.firstKey) item.firstKey = piece.dayKey;
985
+ if (piece.dayKey > item.lastKey) item.lastKey = piece.dayKey;
986
+ item.days.set(piece.dayKey, piece);
987
+ continue;
988
+ }
989
+ items.set(key, {
990
+ key,
991
+ event: {
992
+ ...piece,
993
+ startDate: piece.sourceStartDate,
994
+ endDate: piece.sourceEndDate
995
+ },
996
+ firstKey: piece.dayKey,
997
+ lastKey: piece.dayKey,
998
+ bar: false,
999
+ days: new Map([[piece.dayKey, piece]])
1000
+ });
1001
+ }
1002
+ for (const item of items.values()) item.bar = item.firstKey !== item.lastKey || Boolean(item.event.allDay && item.event.display !== "marker");
1003
+ return [...items.values()].sort((left, right) => Number(right.bar) - Number(left.bar) || left.event.sourceStartDate.getTime() - right.event.sourceStartDate.getTime() || left.event.title.localeCompare(right.event.title));
1004
+ };
1005
+
1006
+ /** Places a calendar popover below its anchor when there is room and above it otherwise, inside the viewport. */
1007
+ const placeCalendarPopover = (anchor, popover) => {
1008
+ const margin = 8;
1009
+ const gap = 4;
1010
+ const rect = anchor.getBoundingClientRect();
1011
+ const width = Math.min(popover.offsetWidth || 288, window.innerWidth - margin * 2);
1012
+ const height = popover.offsetHeight;
1013
+ const left = Math.max(margin, Math.min(rect.left, window.innerWidth - width - margin));
1014
+ const roomBelow = window.innerHeight - rect.bottom - gap - margin;
1015
+ const above = height > roomBelow && rect.top - gap - margin > roomBelow;
1016
+ const top = above ? Math.max(margin, rect.top - height - gap) : Math.min(rect.bottom + gap, window.innerHeight - height - margin);
1017
+ popover.style.left = `${left}px`;
1018
+ popover.style.top = `${Math.max(margin, top)}px`;
1019
+ };
1020
+ let measureContext;
1021
+ /** The width of a text in a font, from a canvas, so a bar can tell whether its title leaves room for a date hint. */
1022
+ const textWidth = (text, font) => {
1023
+ measureContext ??= typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
1024
+ if (!measureContext) return Number.POSITIVE_INFINITY;
1025
+ measureContext.font = font;
1026
+ return measureContext.measureText(text).width;
1027
+ };
1028
+
1029
+ /** Follows a calendar link the way the calendar's own links do: through the host's navigation when it has one. */
1030
+ const followCalendarHref = (owner, href) => {
1031
+ if (owner.onNavigateHref) owner.onNavigateHref(href);else window.location.assign(href);
1032
+ };
1033
+ const PRINTABLE_KEY = /^.$/u;
1034
+
1035
+ /**
1036
+ * The month grid. A click selects a day and never navigates, a drag or Shift selects a range, and the arrow keys move
1037
+ * the selection. The quick create opens at the selection: quietly after a click, with the focus after a drag, a
1038
+ * double-click, Enter, or N. Every event is one bar per week row in a lane it keeps on each of its days, and each
1039
+ * cell shows as many entries as its height holds.
1040
+ */
1041
+ const MonthView = props => {
1042
+ const calendarMessages = useCalendarMessages();
1043
+ const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1044
+ // The shown month and its grid change only with the month, so a refresh of the same month keeps every cell and its
1045
+ // focus.
1046
+ const month = createMemo(() => zonedYearMonth(props.date, dateConfig()), undefined, {
1047
+ equals: (previous, next) => previous.year === next.year && previous.month === next.month
1048
+ });
1049
+ const weeks = createMemo(() => calendar.getMonthGrid(month().year, month().month, dateConfig()).map(week => week.map(day => ({
1050
+ day,
1051
+ key: calendar.formatDateKey(day, dateConfig())
1052
+ }))), undefined, {
1053
+ equals: (previous, next) => previous.map(week => week[0]?.key).join() === next.map(week => week[0]?.key).join()
1054
+ });
1055
+ const weekdays = createMemo(() => calendar.weekdays(dateConfig()));
1056
+ const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
1057
+ const items = createMemo(() => monthItems(props.events));
1058
+ const weekLayouts = createMemo(() => weeks().map(week => layoutMonthWeek(week.map(entry => entry.key), items().map(item => ({
1059
+ item,
1060
+ firstKey: item.firstKey,
1061
+ lastKey: item.lastKey,
1062
+ bar: item.bar
1063
+ })))));
1064
+ const [capacities, setCapacities] = createSignal([]);
1065
+ const [cellWidth, setCellWidth] = createSignal(0);
1066
+ const [barFont, setBarFont] = createSignal("");
1067
+ const [anchorKey, setAnchorKey] = createSignal(null);
1068
+ const [focusKey, setFocusKey] = createSignal(null);
1069
+ const [popover, setPopover] = createSignal(null);
1070
+ /** Whether the quick create holds the focus; until then the grid keeps it. */
1071
+ const [createActive, setCreateActive] = createSignal(false);
1072
+ const [linkedItem, setLinkedItem] = createSignal("");
1073
+ const [movePreview, setMovePreview] = createSignal(null);
1074
+ const [movingEventId, setMovingEventId] = createSignal("");
1075
+ const cells = new Map();
1076
+ let popoverElement;
1077
+ let cancelInteraction;
1078
+ let suppressClickUntil = 0;
1079
+ let lastPointer = "mouse";
1080
+ let menuKey = null;
1081
+ /** The day to select once paging with Page Up or Page Down has shown its month. */
1082
+ let pendingKey = null;
1083
+ const selection = createMemo(() => {
1084
+ const anchor = anchorKey();
1085
+ const focus = focusKey();
1086
+ return anchor && focus ? orderedSelection(anchor, focus) : null;
1087
+ });
1088
+ const parseKey = key => calendar.parseCalendarDate(key, dateConfig());
1089
+ const rangeOf = range => ({
1090
+ start: parseKey(range.first),
1091
+ end: calendar.addDays(parseKey(range.last), 1, dateConfig()),
1092
+ allDay: true
1093
+ });
1094
+ const visibleKeys = createMemo(() => weeks().flatMap(week => week.map(entry => entry.key)));
1095
+ const rovingKey = createMemo(() => {
1096
+ const keys = visibleKeys();
1097
+ const focus = focusKey();
1098
+ if (focus && keys.includes(focus)) return focus;
1099
+ if (keys.includes(todayKey())) return todayKey();
1100
+ return calendar.formatDateKey(zonedMonthDate(month().year, month().month, dateConfig()), dateConfig());
1101
+ });
1102
+ const dropRange = createMemo(() => {
1103
+ const preview = movePreview();
1104
+ if (!preview) return null;
1105
+ const keys = previewSegments(preview, visibleKeys().map(parseKey), dateConfig()).map(piece => piece.dayKey);
1106
+ if (keys.length === 0) return null;
1107
+ keys.sort();
1108
+ return {
1109
+ first: keys[0],
1110
+ last: keys[keys.length - 1]
1111
+ };
1112
+ });
1113
+ const within = (range, key) => Boolean(range && key >= range.first && key <= range.last);
1114
+ /** Where a day sits in the selection: alone, at its start or end, or in between. */
1115
+ const selectionPart = key => {
1116
+ const range = selection();
1117
+ if (!range || !within(range, key)) return undefined;
1118
+ if (range.first === range.last) return "single";
1119
+ return key === range.first ? "start" : key === range.last ? "end" : "middle";
1120
+ };
1121
+ const select = (anchor, focus = anchor) => {
1122
+ setAnchorKey(anchor);
1123
+ setFocusKey(focus);
1124
+ };
1125
+ // The host learns every change of the selected days, and a new month starts without a selection. The selection
1126
+ // goes with the view, so switching to another view reports that nothing is selected.
1127
+ createEffect(on(selection, range => props.owner.onSelectionChange?.(range ? rangeOf(range) : null), {
1128
+ defer: true
1129
+ }));
1130
+ onCleanup(() => {
1131
+ if (untrack(selection)) props.owner.onSelectionChange?.(null);
1132
+ });
1133
+ createEffect(on(selection, range => props.onFocusDay?.(range ? parseKey(range.first) : null)));
1134
+ createEffect(on(month, () => {
1135
+ setPopover(null);
1136
+ const key = pendingKey;
1137
+ pendingKey = null;
1138
+ if (key && visibleKeys().includes(key)) {
1139
+ select(key);
1140
+ queueMicrotask(() => focusCell(key));
1141
+ } else select(null);
1142
+ }, {
1143
+ defer: true
1144
+ }));
1145
+ const dayLabel = day => day.toLocaleDateString(dateConfig().locale ?? "en", {
1146
+ weekday: "long",
1147
+ year: "numeric",
1148
+ month: "long",
1149
+ day: "numeric",
1150
+ timeZone: dateConfig().timeZone
1151
+ });
1152
+ const shortDayLabel = (key, withMonth = true) => parseKey(key).toLocaleDateString(dateConfig().locale ?? "en", {
1153
+ day: "numeric",
1154
+ ...(withMonth ? {
1155
+ month: "short"
1156
+ } : {}),
1157
+ timeZone: dateConfig().timeZone
1158
+ });
1159
+ const monthDayLabel = (date, withTime) => date.toLocaleString(dateConfig().locale ?? "en", {
1160
+ month: "long",
1161
+ day: "numeric",
1162
+ ...(withTime ? {
1163
+ hour: "2-digit",
1164
+ minute: "2-digit"
1165
+ } : {}),
1166
+ timeZone: dateConfig().timeZone
1167
+ });
1168
+ /** A long event names the days it spans; a one-day event keeps the chip's own title and time. */
1169
+ const itemLabel = item => {
1170
+ if (item.firstKey === item.lastKey) return undefined;
1171
+ const allDay = Boolean(item.event.allDay);
1172
+ return calendarMessages().calendarEventTime({
1173
+ title: item.event.title,
1174
+ start: monthDayLabel(allDay ? parseKey(item.firstKey) : item.event.sourceStartDate, !allDay),
1175
+ end: monthDayLabel(allDay ? parseKey(item.lastKey) : item.event.sourceEndDate, !allDay)
1176
+ });
1177
+ };
1178
+ /** The start time before the title of a one-day entry; bars and all-day entries show none. */
1179
+ const leadingTime = item => item.bar || item.event.allDay ? undefined : formatTime(item.event.sourceStartDate, dateConfig());
1180
+ /** The day at a torn end of a bar, with its month when that day lies outside the shown month. */
1181
+ const hintDate = target => ({
1182
+ day: Number(target.slice(8, 10)),
1183
+ month: Number(target.slice(0, 4)) === month().year && Number(target.slice(5, 7)) === month().month + 1 ? undefined : parseKey(target).toLocaleDateString(dateConfig().locale ?? "en", {
1184
+ month: "short",
1185
+ timeZone: dateConfig().timeZone
1186
+ }).replace(/\.$/, "")
1187
+ });
1188
+ const selectionHeading = range => {
1189
+ if (range.first === range.last) return parseKey(range.first).toLocaleDateString(dateConfig().locale ?? "en", {
1190
+ weekday: "long",
1191
+ month: "long",
1192
+ day: "numeric",
1193
+ timeZone: dateConfig().timeZone
1194
+ });
1195
+ const days = dayKeyNumber(range.last) - dayKeyNumber(range.first) + 1;
1196
+ return calendarMessages().calendarSelectedDays({
1197
+ start: shortDayLabel(range.first),
1198
+ end: shortDayLabel(range.last),
1199
+ count: days
1200
+ });
1201
+ };
1202
+ const viewAvailable = view => !props.owner.views || props.owner.views.includes(view);
1203
+ const viewHref = (key, view) => viewAvailable(view) ? props.owner.getDateHref?.(parseKey(key), view) : undefined;
1204
+ /** Whether the calendar can open another view at a day: through a link, or through the host's date change. */
1205
+ const canOpenView = view => viewAvailable(view) && Boolean(props.owner.getDateHref || props.owner.onDateChange);
1206
+ const openView = (key, view) => {
1207
+ const href = viewHref(key, view);
1208
+ if (href) followCalendarHref(props.owner, href);else openViewAt(props.owner, parseKey(key), view);
1209
+ };
1210
+ /** The calendar's own entries of the day menu, Open day and Open week, need no application entries. */
1211
+ const hasMenu = () => Boolean(props.owner.selectionMenu) || canOpenView("day") || canOpenView("week");
1212
+
1213
+ /** The day cell under a point, from the cells' boxes: a bar lies over days that are not its parent. */
1214
+ const dayKeyAtPoint = (clientX, clientY) => {
1215
+ for (const [key, cell] of cells) {
1216
+ if (!cell.isConnected) continue;
1217
+ const rect = cell.getBoundingClientRect();
1218
+ if (clientX >= rect.left && clientX < rect.right && clientY >= rect.top && clientY < rect.bottom) return key;
1219
+ }
1220
+ return null;
1221
+ };
1222
+ const focusCell = key => cells.get(key)?.focus({
1223
+ preventScroll: true
1224
+ });
1225
+ const closePopover = (restoreFocus = true) => {
1226
+ if (!popover()) return;
1227
+ setPopover(null);
1228
+ setCreateActive(false);
1229
+ if (restoreFocus) focusCell(rovingKey());
1230
+ };
1231
+ const popoverFocusable = () => popoverElement?.querySelector("input,textarea,select,button,a[href],[tabindex]:not([tabindex='-1'])") ?? null;
1232
+
1233
+ /**
1234
+ * Opens the quick create at the selection. Quietly, it only shows beside the grid, which keeps the focus until the
1235
+ * person types or tabs into it; otherwise it takes the focus at once.
1236
+ */
1237
+ const openCreate = (range, options) => {
1238
+ if (!props.owner.renderQuickCreate) return false;
1239
+ const anchor = cells.get(focusKey() && within(range, focusKey()) ? focusKey() : range.last);
1240
+ if (!anchor) return false;
1241
+ setCreateActive(options.active);
1242
+ setPopover({
1243
+ kind: "create",
1244
+ range,
1245
+ anchor,
1246
+ create: options.create
1247
+ });
1248
+ return true;
1249
+ };
1250
+ const activateCreate = () => {
1251
+ if (popover()?.kind !== "create") return false;
1252
+ setCreateActive(true);
1253
+ popoverFocusable()?.focus();
1254
+ return true;
1255
+ };
1256
+ /** Enter, a double-click, and N create on the selection, with the quick create or the host's own create action. */
1257
+ const createOnSelection = () => {
1258
+ const range = selection();
1259
+ if (!range) return;
1260
+ if (openCreate(range, {
1261
+ active: true
1262
+ })) return;
1263
+ if (props.owner.onSlotActivate) props.owner.onSlotActivate(rangeOf(range));
1264
+ };
1265
+ const openDayList = key => {
1266
+ const anchor = cells.get(key);
1267
+ if (!anchor) return;
1268
+ setCreateActive(true);
1269
+ setPopover({
1270
+ kind: "day",
1271
+ dayKey: key,
1272
+ anchor
1273
+ });
1274
+ };
1275
+ /** A quiet quick create follows the selection; any other popover closes when the selection changes. */
1276
+ const followSelection = () => {
1277
+ const current = popover();
1278
+ const range = selection();
1279
+ if (!current) return;
1280
+ if (current.kind === "create" && !createActive() && range) openCreate(range, {
1281
+ active: false
1282
+ });else closePopover(false);
1283
+ };
1284
+ const pageTo = target => {
1285
+ const date = parseKey(target);
1286
+ const href = props.owner.getDateHref?.(date, "month");
1287
+ // Only a month that is on its way may select the day, so a host that cannot page never leaves one behind.
1288
+ if (props.owner.onDateChange) {
1289
+ pendingKey = target;
1290
+ props.owner.onDateChange(date, "month");
1291
+ } else if (href) {
1292
+ pendingKey = target;
1293
+ followCalendarHref(props.owner, href);
1294
+ }
1295
+ };
1296
+ const moveFocus = (key, extend) => {
1297
+ if (!visibleKeys().includes(key)) {
1298
+ pageTo(key);
1299
+ return;
1300
+ }
1301
+ if (extend) select(anchorKey() ?? focusKey() ?? key, key);else select(key);
1302
+ focusCell(key);
1303
+ followSelection();
1304
+ };
1305
+ const onCellKeyDown = (event, key) => {
1306
+ if (event.target !== event.currentTarget || event.ctrlKey || event.metaKey || event.altKey) return;
1307
+ const current = popover();
1308
+ const quiet = current?.kind === "create" && !createActive();
1309
+ // The quiet quick create takes over once the person types or tabs into it. Space stays the grid's key for the day
1310
+ // list; N is a title's first letter like any other, as the quick create it would open is already there.
1311
+ if (quiet && (event.key === "Tab" && !event.shiftKey || PRINTABLE_KEY.test(event.key) && event.key !== " ")) {
1312
+ const field = popoverFocusable();
1313
+ if (field) {
1314
+ if (event.key === "Tab") event.preventDefault();
1315
+ setCreateActive(true);
1316
+ field.focus();
1317
+ return;
1318
+ }
1319
+ }
1320
+ const day = parseKey(key);
1321
+ const shift = days => calendar.formatDateKey(calendar.addDays(day, days, dateConfig()), dateConfig());
1322
+ const weekday = (dayKeyNumber(key) - dayKeyNumber(calendar.formatDateKey(calendar.startOfWeek(day, dateConfig()), dateConfig()))) % 7;
1323
+ const target = event.key === "ArrowLeft" ? shift(-1) : event.key === "ArrowRight" ? shift(1) : event.key === "ArrowUp" ? shift(-7) : event.key === "ArrowDown" ? shift(7) : event.key === "Home" ? shift(-weekday) : event.key === "End" ? shift(6 - weekday) : null;
1324
+ if (target) {
1325
+ event.preventDefault();
1326
+ moveFocus(target, event.shiftKey);
1327
+ return;
1328
+ }
1329
+ if (event.key === "PageUp" || event.key === "PageDown") {
1330
+ event.preventDefault();
1331
+ pageTo(calendar.formatDateKey(addMonthsClamped(day, event.key === "PageUp" ? -1 : 1, dateConfig()), dateConfig()));
1332
+ return;
1333
+ }
1334
+ if (event.key === "Enter" || (event.key === "n" || event.key === "N") && !event.shiftKey) {
1335
+ event.preventDefault();
1336
+ if (!within(selection(), key)) select(key);
1337
+ createOnSelection();
1338
+ return;
1339
+ }
1340
+ if (event.key === " ") {
1341
+ event.preventDefault();
1342
+ if (!within(selection(), key)) select(key);
1343
+ openDayList(key);
1344
+ return;
1345
+ }
1346
+ if (event.key === "Escape") {
1347
+ if (current) closePopover(false);else if (selection()) select(null);else return;
1348
+ event.preventDefault();
1349
+ return;
1350
+ }
1351
+ // The keyboard opens the day's menu where the day is, as a right-click there would.
1352
+ if (hasMenu() && (event.key === "ContextMenu" || event.shiftKey && event.key === "F10")) {
1353
+ event.preventDefault();
1354
+ event.stopPropagation();
1355
+ menuKey = key;
1356
+ const rect = event.currentTarget.getBoundingClientRect();
1357
+ event.currentTarget?.dispatchEvent(new MouseEvent("contextmenu", {
1358
+ bubbles: true,
1359
+ cancelable: true,
1360
+ clientX: rect.left + 12,
1361
+ clientY: rect.top + 12
1362
+ }));
1363
+ }
1364
+ };
1365
+ const fromControl = event => event.target instanceof Element && Boolean(event.target.closest("a,button,[data-calendar-event],.k2b-calendar-month__lanes > *"));
1366
+ const onCellClick = (event, key) => {
1367
+ if (fromControl(event) || performance.now() < suppressClickUntil) return;
1368
+ // A second tap on the one selected day opens the quick create, as a double-click does with a mouse.
1369
+ if (lastPointer === "touch") {
1370
+ const range = selection();
1371
+ if (range && range.first === key && range.last === key && openCreate(range, {
1372
+ active: true
1373
+ })) return;
1374
+ select(key);
1375
+ closePopover(false);
1376
+ return;
1377
+ }
1378
+ if (event.shiftKey && anchorKey()) select(anchorKey(), key);else select(key);
1379
+ focusCell(key);
1380
+ const range = selection();
1381
+ if (range) openCreate(range, {
1382
+ active: false
1383
+ });
1384
+ };
1385
+ const onCellDoubleClick = (event, key) => {
1386
+ if (fromControl(event) || lastPointer === "touch") return;
1387
+ event.preventDefault();
1388
+ if (!within(selection(), key)) select(key);
1389
+ if (popover()?.kind === "create") activateCreate();else createOnSelection();
1390
+ };
1391
+ /** The day under the pointer: a bar that spans several days sits in the cell of its first day. */
1392
+ const pressedKey = (event, key) => dayKeyAtPoint(event.clientX, event.clientY) ?? key;
1393
+ const onCellPointerDown = (event, key) => {
1394
+ lastPointer = event.pointerType;
1395
+ // The menu acts on the pressed day, or on the selection when the press is inside it.
1396
+ menuKey = pressedKey(event, key);
1397
+ if (event.pointerType !== "mouse" || event.button !== 0 || event.shiftKey || fromControl(event)) return;
1398
+ cancelInteraction?.();
1399
+ cancelInteraction = startCalendarPointerSession({
1400
+ event,
1401
+ resolve: (clientX, clientY) => dayKeyAtPoint(clientX, clientY),
1402
+ onActivate: () => {
1403
+ suppressClickUntil = performance.now() + 400;
1404
+ closePopover(false);
1405
+ select(key);
1406
+ },
1407
+ onPreview: current => select(key, current),
1408
+ onCommit: current => {
1409
+ select(key, current);
1410
+ focusCell(current);
1411
+ const range = orderedSelection(key, current);
1412
+ openCreate(range, {
1413
+ active: range.first !== range.last
1414
+ });
1415
+ },
1416
+ onCancel: () => select(key)
1417
+ });
1418
+ };
1419
+ const onMenuOpen = () => {
1420
+ closePopover(false);
1421
+ const key = menuKey;
1422
+ if (key && !within(selection(), key)) select(key);
1423
+ };
1424
+ // Until a day is selected, the menu acts on the day that takes focus, so it is never empty.
1425
+ const menuItems = createMemo(() => {
1426
+ if (!hasMenu()) return [];
1427
+ const range = selection() ?? {
1428
+ first: rovingKey(),
1429
+ last: rovingKey()
1430
+ };
1431
+ const own = props.owner.selectionMenu?.(rangeOf(range), {
1432
+ quickCreate: create => {
1433
+ select(range.first, range.last);
1434
+ if (!openCreate(range, {
1435
+ active: true,
1436
+ create
1437
+ })) props.owner.onSlotActivate?.(rangeOf(range));
1438
+ }
1439
+ }) ?? [];
1440
+ const actions = own.filter(item => !("items" in item));
1441
+ const sections = own.filter(item => "items" in item);
1442
+ const navigation = [...(canOpenView("day") ? [{
1443
+ label: calendarMessages().calendarOpenDay,
1444
+ icon: "ti ti-zoom-in",
1445
+ action: () => openView(range.first, "day")
1446
+ }] : []), ...(canOpenView("week") ? [{
1447
+ label: calendarMessages().calendarOpenWeek,
1448
+ icon: "ti ti-calendar-week",
1449
+ action: () => openView(range.first, "week")
1450
+ }] : []), ...(range.first !== range.last ? [{
1451
+ label: calendarMessages().calendarClearSelection,
1452
+ icon: "ti ti-x",
1453
+ action: () => select(null)
1454
+ }] : [])];
1455
+ const groups = [{
1456
+ items: actions
1457
+ }, ...sections, {
1458
+ items: navigation
1459
+ }].filter(section => section.items.length > 0);
1460
+ // The first group names the days the menu acts on, also when the calendar's own entries are all it has.
1461
+ const [first, ...rest] = groups;
1462
+ return first && !first.sectionLabel ? [{
1463
+ ...first,
1464
+ sectionLabel: selectionHeading(range)
1465
+ }, ...rest] : groups;
1466
+ });
1467
+ const clearMove = () => {
1468
+ setMovePreview(null);
1469
+ setMovingEventId("");
1470
+ };
1471
+ const startMove = (pointerEvent, item, markDragged) => {
1472
+ if (!props.owner.onEventDrop) return;
1473
+ const event = item.event;
1474
+ const grabbed = dayKeyAtPoint(pointerEvent.clientX, pointerEvent.clientY) ?? item.firstKey;
1475
+ const firstDay = startOfDay(event.sourceStartDate, dateConfig());
1476
+ cancelInteraction?.();
1477
+ cancelInteraction = startCalendarPointerSession({
1478
+ event: pointerEvent,
1479
+ resolve: (clientX, clientY) => {
1480
+ const key = dayKeyAtPoint(clientX, clientY);
1481
+ if (!key) return null;
1482
+ // The event moves by as many days as the pointer, wherever on the bar it was grabbed.
1483
+ const day = calendar.addDays(firstDay, dayKeyNumber(key) - dayKeyNumber(grabbed), dateConfig());
1484
+ return {
1485
+ id: event.id,
1486
+ title: event.title,
1487
+ ...moveEventToDay(event, day, dateConfig())
1488
+ };
1489
+ },
1490
+ onActivate: () => {
1491
+ markDragged();
1492
+ suppressClickUntil = performance.now() + 400;
1493
+ closePopover(false);
1494
+ setMovingEventId(event.id);
1495
+ },
1496
+ onPreview: setMovePreview,
1497
+ onCommit: next => {
1498
+ clearMove();
1499
+ if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
1500
+ },
1501
+ onCancel: clearMove
1502
+ });
1503
+ };
1504
+
1505
+ // Each week row measures the room below its day numbers; the rows only resize with the grid, never with content.
1506
+ let observer;
1507
+ const lanesOf = new WeakMap();
1508
+ const measure = (element, week) => {
1509
+ const style = getComputedStyle(element);
1510
+ const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
1511
+ const capacity = monthLaneCapacity(element.clientHeight, MONTH_LANE_REM * rootSize, MONTH_LANE_GAP_REM * rootSize);
1512
+ setCapacities(current => {
1513
+ if (current[week] === capacity) return current;
1514
+ const next = [...current];
1515
+ next[week] = capacity;
1516
+ return next;
1517
+ });
1518
+ if (week === 0) {
1519
+ setCellWidth(element.clientWidth);
1520
+ setBarFont(`600 ${0.6875 * rootSize}px ${style.fontFamily}`);
1521
+ }
1522
+ };
1523
+ const observeLanes = (element, week) => {
1524
+ lanesOf.set(element, week);
1525
+ if (typeof ResizeObserver === "undefined") return;
1526
+ observer ??= new ResizeObserver(entries => {
1527
+ for (const entry of entries) {
1528
+ const index = lanesOf.get(entry.target);
1529
+ if (index !== undefined) measure(entry.target, index);
1530
+ }
1531
+ });
1532
+ observer.observe(element);
1533
+ onCleanup(() => observer?.unobserve(element));
1534
+ };
1535
+ /** A date hint shows only when the bar holds its title and the hint whole; screen readers get the range anyway. */
1536
+ const hintFits = (title, hint, span) => {
1537
+ const width = cellWidth();
1538
+ const font = barFont();
1539
+ if (width <= 0 || !font) return false;
1540
+ const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
1541
+ return textWidth(title, font) + textWidth(hint, font) + MONTH_HINT_SLACK_REM * rootSize <= span * width;
1542
+ };
1543
+ createEffect(() => {
1544
+ const current = popover();
1545
+ const element = popoverElement;
1546
+ if (!element) return;
1547
+ if (!current) {
1548
+ if (element.matches(":popover-open")) element.hidePopover();
1549
+ return;
1550
+ }
1551
+ if (!element.matches(":popover-open")) element.showPopover();
1552
+ const focus = untrack(createActive);
1553
+ queueMicrotask(() => {
1554
+ if (popover() !== current || !element.isConnected) return;
1555
+ placeCalendarPopover(current.anchor, element);
1556
+ if (focus) popoverFocusable()?.focus();
1557
+ });
1558
+ });
1559
+ onMount(() => {
1560
+ const reposition = () => {
1561
+ const current = popover();
1562
+ if (current && popoverElement) placeCalendarPopover(current.anchor, popoverElement);
1563
+ };
1564
+ window.addEventListener("resize", reposition);
1565
+ window.addEventListener("scroll", reposition, true);
1566
+ onCleanup(() => {
1567
+ window.removeEventListener("resize", reposition);
1568
+ window.removeEventListener("scroll", reposition, true);
1569
+ });
1570
+ });
1571
+ onCleanup(() => {
1572
+ cancelInteraction?.();
1573
+ observer?.disconnect();
1574
+ });
1575
+ const dayEntries = dayKey => items().filter(item => item.days.has(dayKey));
1576
+ /** Every bar of a long entry lights up with the one under the pointer. */
1577
+ const linkProps = item => ({
1578
+ onPointerEnter: event => {
1579
+ if (event.pointerType === "mouse") setLinkedItem(item.key);
1580
+ },
1581
+ onPointerLeave: () => {
1582
+ if (linkedItem() === item.key) setLinkedItem("");
1583
+ }
1584
+ });
1585
+ const grid = () => _$ssr(_tmpl$27, _$ssrAttribute("aria-label", _$escape(formatMonth(props.date, dateConfig()), true), false), _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, minmax(5rem, 1fr))`) + _$ssrStyleProperty(";--k2b-calendar-lane:", "1.25rem") + _$ssrStyleProperty(";--k2b-calendar-lane-gap:", "0.125rem"), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
1586
+ get when() {
1587
+ return props.owner.withWeekNumbers;
1588
+ },
1589
+ get children() {
1590
+ return _$ssr(_tmpl$26, _$escape(calendarMessages().weekShort));
1591
+ }
1592
+ })), _$escape(_$createComponent(For, {
1593
+ get each() {
1594
+ return weekdays();
1595
+ },
1596
+ children: (day, index) => _$ssr(_tmpl$28, _$ssrAttribute("data-weekend", index() > 4 ? "true" : _$escape(undefined, true), false), _$escape(day))
1597
+ })), _$escape(_$createComponent(For, {
1598
+ get each() {
1599
+ return weeks();
1600
+ },
1601
+ children: (week, weekIndex) => {
1602
+ const fit = createMemo(() => fitMonthWeek(weekLayouts()[weekIndex()] ?? {
1603
+ bars: [],
1604
+ singles: []
1605
+ }, capacities()[weekIndex()] ?? MONTH_DEFAULT_LANES));
1606
+ const weekHref = () => viewHref(week[0].key, "week");
1607
+ const weekNumber = () => zonedWeekNumber(week[0].day, dateConfig());
1608
+ return _$ssr(_tmpl$30, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
1609
+ get when() {
1610
+ return props.owner.withWeekNumbers;
1611
+ },
1612
+ get children() {
1613
+ return _$ssr(_tmpl$29, _$escape(_$createComponent(Show, {
1614
+ get when() {
1615
+ return weekHref();
1616
+ },
1617
+ get fallback() {
1618
+ return _$createComponent(Show, {
1619
+ get when() {
1620
+ return canOpenView("week");
1621
+ },
1622
+ get fallback() {
1623
+ return weekNumber();
1624
+ },
1625
+ get children() {
1626
+ return _$ssr(_tmpl$31, _$ssrAttribute("title", _$escape(calendarMessages().calendarOpenWeekNumber({
1627
+ week: weekNumber()
1628
+ }), true), false) + _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarOpenWeekNumber({
1629
+ week: weekNumber()
1630
+ }), true), false), _$escape(weekNumber()));
1631
+ }
1632
+ });
1633
+ },
1634
+ children: href => _$createComponent(CalendarNavigationLink, {
1635
+ get owner() {
1636
+ return props.owner;
1637
+ },
1638
+ get href() {
1639
+ return href();
1640
+ },
1641
+ get anchorProps() {
1642
+ return {
1643
+ class: "k2b-calendar-month__week-link",
1644
+ tabIndex: -1,
1645
+ title: calendarMessages().calendarOpenWeekNumber({
1646
+ week: weekNumber()
1647
+ }),
1648
+ "aria-label": calendarMessages().calendarOpenWeekNumber({
1649
+ week: weekNumber()
1650
+ })
1651
+ };
1652
+ },
1653
+ get children() {
1654
+ return weekNumber();
1655
+ }
1656
+ })
1657
+ })));
1658
+ }
1659
+ })), _$escape(_$createComponent(For, {
1660
+ each: week,
1661
+ children: ({
1662
+ day,
1663
+ key
1664
+ }, column) => {
1665
+ const dayBadge = props.owner.dayBadges?.[key];
1666
+ const sameMonth = calendar.isSameMonth(day, props.date, dateConfig());
1667
+ const label = dayLabel(day);
1668
+ const bars = createMemo(() => fit().bars.filter(bar => bar.startColumn === column()));
1669
+ const cell = () => fit().cells[column()] ?? {
1670
+ top: 0,
1671
+ shown: [],
1672
+ hidden: 0
1673
+ };
1674
+ return _$ssr(_tmpl$33, _$ssrAttribute("tabindex", rovingKey() === key ? 0 : -1, false) + _$ssrAttribute("aria-label", _$escape(label, true), false) + _$ssrAttribute("aria-selected", within(selection(), key) ? "true" : "false", false) + _$ssrAttribute("aria-current", key === todayKey() ? "date" : _$escape(undefined, true), false) + _$ssrAttribute("data-calendar-day-key", _$escape(key, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-weekend", column() > 4 ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-past", key < todayKey() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-selected", _$escape(selectionPart(key), true), false) + _$ssrAttribute("data-drop-preview", within(dropRange(), key) ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-today", key === todayKey() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())), _$escape(_$createComponent(Show, {
1675
+ when: dayBadge,
1676
+ children: badge => _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
1677
+ get when() {
1678
+ return badge().icon;
1679
+ },
1680
+ children: icon => _$ssr(_tmpl$10, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
1681
+ })), _$escape(badge().label))
1682
+ })), _$escape(_$createComponent(For, {
1683
+ get each() {
1684
+ return bars();
1685
+ },
1686
+ children: bar => {
1687
+ const span = bar.endColumn - bar.startColumn + 1;
1688
+ const startHint = () => {
1689
+ if (!bar.continuesBefore) return undefined;
1690
+ const hint = calendarMessages().calendarContinuesFrom(hintDate(bar.item.firstKey));
1691
+ return hintFits(bar.item.event.title, hint, span) ? hint : undefined;
1692
+ };
1693
+ const endHint = () => {
1694
+ if (!bar.continuesAfter) return undefined;
1695
+ const hint = calendarMessages().calendarContinuesUntil(hintDate(bar.item.lastKey));
1696
+ return hintFits(`${bar.item.event.title}${startHint() ?? ""}`, hint, span) ? hint : undefined;
1697
+ };
1698
+ return _$ssrElement("div", _$mergeProps({
1699
+ "class": "k2b-calendar-month__segment",
1700
+ get style() {
1701
+ return {
1702
+ "--k2b-calendar-span": String(span),
1703
+ "--k2b-calendar-row": String(bar.lane)
1704
+ };
1705
+ },
1706
+ "data-bar": "true",
1707
+ get ["data-linked"]() {
1708
+ return linkedItem() === bar.item.key && bar.item.firstKey !== bar.item.lastKey ? "true" : undefined;
1709
+ },
1710
+ get ["data-continues-before"]() {
1711
+ return bar.continuesBefore ? "true" : undefined;
1712
+ },
1713
+ get ["data-continues-after"]() {
1714
+ return bar.continuesAfter ? "true" : undefined;
1715
+ }
1716
+ }, () => linkProps(bar.item)), _$escape(_$createComponent(EventChip, {
1717
+ get event() {
1718
+ return bar.item.event;
1719
+ },
1720
+ get owner() {
1721
+ return props.owner;
1722
+ },
1723
+ get href() {
1724
+ return eventHref(props.owner, bar.item.event);
1725
+ },
1726
+ get label() {
1727
+ return itemLabel(bar.item);
1728
+ },
1729
+ compact: true,
1730
+ bar: true,
1731
+ get continuesBefore() {
1732
+ return bar.continuesBefore;
1733
+ },
1734
+ get continuesAfter() {
1735
+ return bar.continuesAfter;
1736
+ },
1737
+ get hintStart() {
1738
+ return startHint();
1739
+ },
1740
+ get hintEnd() {
1741
+ return endHint();
1742
+ },
1743
+ get moving() {
1744
+ return movingEventId() === bar.item.event.id;
1745
+ },
1746
+ get onMovePointerDown() {
1747
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, bar.item, markDragged) : undefined;
1748
+ }
1749
+ })), false);
1750
+ }
1751
+ })), _$escape(_$createComponent(For, {
1752
+ get each() {
1753
+ return cell().shown;
1754
+ },
1755
+ children: (item, index) => _$ssr(_tmpl$34, _$ssrStyleProperty("--k2b-calendar-span:", "1") + _$ssrStyleProperty(";--k2b-calendar-row:", _$escape(String(cell().top + index()), true)), _$escape(_$createComponent(EventChip, {
1756
+ get event() {
1757
+ return item.event;
1758
+ },
1759
+ get owner() {
1760
+ return props.owner;
1761
+ },
1762
+ get href() {
1763
+ return eventHref(props.owner, item.event);
1764
+ },
1765
+ compact: true,
1766
+ get leadingTime() {
1767
+ return leadingTime(item);
1768
+ },
1769
+ get moving() {
1770
+ return movingEventId() === item.event.id;
1771
+ },
1772
+ get onMovePointerDown() {
1773
+ return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, item, markDragged) : undefined;
1774
+ }
1775
+ })))
1776
+ })), _$escape(_$createComponent(Show, {
1777
+ get when() {
1778
+ return cell().hidden > 0;
1779
+ },
1780
+ get children() {
1781
+ return _$ssr(_tmpl$32, _$ssrStyleProperty("--k2b-calendar-row:", _$escape(String(cell().top + cell().shown.length), true)), _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarMoreEventsOn({
1782
+ count: cell().hidden,
1783
+ label
1784
+ }), true), false), _$ssrAttribute("aria-expanded", (() => {
1785
+ const current = popover();
1786
+ return current?.kind === "day" && _$escape(current.dayKey, true) === _$escape(key, true);
1787
+ })(), false), _$escape(calendarMessages().calendarMoreEvents({
1788
+ count: cell().hidden
1789
+ })), _$escape(cell().hidden));
1790
+ }
1791
+ })));
1792
+ }
1793
+ })));
1794
+ }
1795
+ })));
1796
+ const dayList = dayKey => {
1797
+ const day = parseKey(dayKey);
1798
+ const href = viewHref(dayKey, "day");
1799
+ // Read where it renders, so a refresh while the list is open updates it as it does the grid.
1800
+ const entries = () => dayEntries(dayKey);
1801
+ return _$ssr(_tmpl$37, _$escape(dayLabel(day)), _$escape(_$createComponent(Show, {
1802
+ get when() {
1803
+ return entries().length > 0;
1804
+ },
1805
+ get fallback() {
1806
+ return _$ssr(_tmpl$38, _$escape(calendarMessages().calendarNothingPlanned));
1807
+ },
1808
+ get children() {
1809
+ return _$ssr(_tmpl$35, _$escape(_$createComponent(For, {
1810
+ get each() {
1811
+ return entries();
1812
+ },
1813
+ children: item => _$ssr(_tmpl$39, _$escape(_$createComponent(EventChip, {
1814
+ get event() {
1815
+ return item.event;
1816
+ },
1817
+ get owner() {
1818
+ return props.owner;
1819
+ },
1820
+ get href() {
1821
+ return eventHref(props.owner, item.event);
1822
+ },
1823
+ get label() {
1824
+ return itemLabel(item);
1825
+ },
1826
+ compact: true,
1827
+ get bar() {
1828
+ return item.bar;
1829
+ },
1830
+ get leadingTime() {
1831
+ return leadingTime(item);
1832
+ }
1833
+ })))
1834
+ })));
1835
+ }
1836
+ })), _$escape(_$createComponent(Show, {
1837
+ when: href,
1838
+ get fallback() {
1839
+ return _$createComponent(Show, {
1840
+ get when() {
1841
+ return canOpenView("day");
1842
+ },
1843
+ get children() {
1844
+ return _$createComponent(Button, {
1845
+ type: "button",
1846
+ variant: "ghost",
1847
+ size: "sm",
1848
+ onClick: () => openView(dayKey, "day"),
1849
+ get children() {
1850
+ return [_$ssr(_tmpl$40), calendarMessages().calendarOpenDay];
1851
+ }
1852
+ });
1853
+ }
1854
+ });
1855
+ },
1856
+ children: dayHref => _$createComponent(CalendarNavigationLink, {
1857
+ get owner() {
1858
+ return props.owner;
1859
+ },
1860
+ get href() {
1861
+ return dayHref();
1862
+ },
1863
+ anchorProps: {
1864
+ class: "k2b-button",
1865
+ "data-variant": "ghost",
1866
+ "data-size": "sm"
1867
+ },
1868
+ get children() {
1869
+ return [_$ssr(_tmpl$40), calendarMessages().calendarOpenDay];
1870
+ }
1871
+ })
1872
+ })), _$escape(_$createComponent(Show, {
1873
+ get when() {
1874
+ return props.owner.renderQuickCreate;
1875
+ },
1876
+ get children() {
1877
+ return _$createComponent(Button, {
1878
+ type: "button",
1879
+ variant: "ghost",
1880
+ size: "sm",
1881
+ onClick: () => {
1882
+ select(dayKey);
1883
+ openCreate({
1884
+ first: dayKey,
1885
+ last: dayKey
1886
+ }, {
1887
+ active: true
1888
+ });
1889
+ },
1890
+ get children() {
1891
+ return [_$ssr(_tmpl$36), calendarMessages().calendarNewEvent];
1892
+ }
1893
+ });
1894
+ }
1895
+ })));
1896
+ };
1897
+ return [_$createComponent(Show, {
1898
+ get when() {
1899
+ return hasMenu();
1900
+ },
1901
+ get fallback() {
1902
+ return grid();
1903
+ },
1904
+ get children() {
1905
+ return _$createComponent(GestureMenu, {
1906
+ get items() {
1907
+ return menuItems();
1908
+ },
1909
+ get label() {
1910
+ return calendarMessages().calendarSelectionActions;
1911
+ },
1912
+ tabIndex: -1,
1913
+ onOpen: onMenuOpen,
1914
+ "class": "k2b-calendar-month-menu",
1915
+ get children() {
1916
+ return grid();
1917
+ }
1918
+ });
1919
+ }
1920
+ }), _$ssr(_tmpl$41, _$ssrAttribute("aria-label", (() => {
1921
+ const current = popover();
1922
+ if (current?.kind === "day") return dayLabel(parseKey(current.dayKey));
1923
+ return _$escape(calendarMessages().calendarQuickCreate, true);
1924
+ })(), false) + _$ssrAttribute("data-kind", _$escape(popover()?.kind, true), false) + _$ssrAttribute("data-quiet", popover()?.kind === "create" && !createActive() ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
1925
+ get when() {
1926
+ return popover();
1927
+ },
1928
+ keyed: true,
1929
+ children: value => value.kind === "create" ? props.owner.renderQuickCreate?.(rangeOf(value.range), {
1930
+ create: value.create,
1931
+ close: () => {
1932
+ if (popover() === value) closePopover();
1933
+ }
1934
+ }) : dayList(value.dayKey)
1935
+ })))];
1936
+ };
827
1937
  const TimeGridView = props => {
828
- const messages = useUiMessages();
1938
+ const calendarMessages = useCalendarMessages();
829
1939
  const dateConfig = createMemo(() => ownerDateConfig(props.owner));
830
1940
  const gridStartHour = () => props.owner.visibleStartHour ?? 0;
831
1941
  const gridEndHour = () => props.owner.visibleEndHour ?? 23;
@@ -1035,7 +2145,7 @@ const TimeGridView = props => {
1035
2145
  });
1036
2146
  });
1037
2147
  });
1038
- return _$ssr(_tmpl$22, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`), _$escape(_$createComponent(For, {
2148
+ return _$ssr(_tmpl$43, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`), _$escape(_$createComponent(For, {
1039
2149
  get each() {
1040
2150
  return props.days;
1041
2151
  },
@@ -1053,13 +2163,13 @@ const TimeGridView = props => {
1053
2163
  class: "k2b-calendar-time-grid__day"
1054
2164
  },
1055
2165
  get children() {
1056
- return [_$ssr(_tmpl$23, _$ssrAttribute("data-today", today() ? "true" : _$escape(undefined, true), false), _$escape(formatDay(day, dateConfig()))), _$createComponent(Show, {
2166
+ return [_$ssr(_tmpl$44, _$ssrAttribute("data-today", today() ? "true" : _$escape(undefined, true), false), _$escape(formatDay(day, dateConfig()))), _$createComponent(Show, {
1057
2167
  when: dayBadge,
1058
- children: badge => _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
2168
+ children: badge => _$ssr(_tmpl$45, _$escape(_$createComponent(Show, {
1059
2169
  get when() {
1060
2170
  return badge().icon;
1061
2171
  },
1062
- children: icon => _$ssr(_tmpl$9, `k2b-calendar-time-grid__badge-icon ti ti-${_$escape(icon(), true)}`)
2172
+ children: icon => _$ssr(_tmpl$10, `k2b-calendar-time-grid__badge-icon ti ti-${_$escape(icon(), true)}`)
1063
2173
  })), _$escape(badge().label))
1064
2174
  })];
1065
2175
  }
@@ -1070,7 +2180,7 @@ const TimeGridView = props => {
1070
2180
  return !props.owner.hideAllDay;
1071
2181
  },
1072
2182
  get children() {
1073
- return _$ssr(_tmpl$21, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`) + _$ssrStyleProperty(";max-height:", `${_$escape(props.owner.allDayMaxHeightRem ?? 7, true)}rem`), _$escape(props.labels.allDay), _$escape(_$createComponent(For, {
2183
+ return _$ssr(_tmpl$42, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`) + _$ssrStyleProperty(";max-height:", `${_$escape(props.owner.allDayMaxHeightRem ?? 7, true)}rem`), _$escape(props.labels.allDay), _$escape(_$createComponent(For, {
1074
2184
  get each() {
1075
2185
  return props.days;
1076
2186
  },
@@ -1094,9 +2204,9 @@ const TimeGridView = props => {
1094
2204
  end: calendar.addDays(start, 1, dateConfig()),
1095
2205
  allDay: true
1096
2206
  };
1097
- }, () => performance.now() < suppressSlotClickUntil)), _$ssr(_tmpl$25, _$escape(_$createComponent(For, {
2207
+ }, () => performance.now() < suppressSlotClickUntil)), _$ssr(_tmpl$46, _$escape(_$createComponent(For, {
1098
2208
  each: previewAllDay,
1099
- children: event => _$ssr(_tmpl$16, _$escape(event.title))
2209
+ children: event => _$ssr(_tmpl$21, _$escape(event.title))
1100
2210
  })), _$escape(_$createComponent(For, {
1101
2211
  get each() {
1102
2212
  return allDay();
@@ -1125,7 +2235,7 @@ const TimeGridView = props => {
1125
2235
  get each() {
1126
2236
  return hours();
1127
2237
  },
1128
- children: hour => _$ssr(_tmpl$26, _$ssrAttribute("data-outside-business", hour < businessStartHour() || hour > businessEndHour() ? "true" : _$escape(undefined, true), false), _$escape(`${hour}`.padStart(2, "0")))
2238
+ children: hour => _$ssr(_tmpl$47, _$ssrAttribute("data-outside-business", hour < businessStartHour() || hour > businessEndHour() ? "true" : _$escape(undefined, true), false), _$escape(`${hour}`.padStart(2, "0")))
1129
2239
  })), _$escape(_$createComponent(For, {
1130
2240
  get each() {
1131
2241
  return props.days;
@@ -1133,12 +2243,12 @@ const TimeGridView = props => {
1133
2243
  children: day => {
1134
2244
  const dayKey = calendar.formatDateKey(day, dateConfig());
1135
2245
  const layouts = createMemo(() => timedEventLayouts(eventsByDay().get(dayKey)?.timed ?? []));
1136
- return _$ssr(_tmpl$28, _$ssrStyleProperty("min-width:", _$escape(dayColumnMinWidth(layouts()), true)) + _$ssrStyleProperty(";grid-template-rows:", `repeat(${_$escape(hours().length, true)}, minmax(4rem, 1fr))`), _$escape(_$createComponent(Show, {
2246
+ return _$ssr(_tmpl$49, _$ssrStyleProperty("min-width:", _$escape(dayColumnMinWidth(layouts()), true)) + _$ssrStyleProperty(";grid-template-rows:", `repeat(${_$escape(hours().length, true)}, minmax(4rem, 1fr))`), _$escape(_$createComponent(Show, {
1137
2247
  get when() {
1138
2248
  return currentTimeLine(day) !== null;
1139
2249
  },
1140
2250
  get children() {
1141
- return _$ssr(_tmpl$27, _$ssrStyleProperty("top:", `${_$escape(currentTimeLine(day) ?? 0, true)}%`));
2251
+ return _$ssr(_tmpl$48, _$ssrStyleProperty("top:", `${_$escape(currentTimeLine(day) ?? 0, true)}%`));
1142
2252
  }
1143
2253
  })), _$escape(_$createComponent(For, {
1144
2254
  get each() {
@@ -1167,12 +2277,12 @@ const TimeGridView = props => {
1167
2277
  children: event => {
1168
2278
  const layout = eventLayout(event);
1169
2279
  const short = event.endDate.getTime() - event.startDate.getTime() < 60 * 60_000;
1170
- return _$ssr(_tmpl$30, _$ssrAttribute("data-short", short ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$escape(_$createComponent(Show, {
2280
+ return _$ssr(_tmpl$51, _$ssrAttribute("data-short", short ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$escape(_$createComponent(Show, {
1171
2281
  get when() {
1172
2282
  return event.title;
1173
2283
  },
1174
2284
  get children() {
1175
- return _$ssr(_tmpl$29, _$escape(event.title));
2285
+ return _$ssr(_tmpl$50, _$escape(event.title));
1176
2286
  }
1177
2287
  })), _$escape(formatTime(event.startDate, dateConfig())), _$escape(formatTime(event.endDate, dateConfig())));
1178
2288
  }
@@ -1218,7 +2328,7 @@ const TimeGridView = props => {
1218
2328
  onCancel: clearInteraction
1219
2329
  });
1220
2330
  };
1221
- return _$ssr(_tmpl$32, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`) + _$ssrStyleProperty(";left:", _$escape(position.left, true)) + _$ssrStyleProperty(";width:", _$escape(position.width, true)) + _$ssrStyleProperty(";z-index:", _$escape(String(20 + layoutItem.lane), true)), _$escape(_$createComponent(EventChip, {
2331
+ return _$ssr(_tmpl$53, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`) + _$ssrStyleProperty(";left:", _$escape(position.left, true)) + _$ssrStyleProperty(";width:", _$escape(position.width, true)) + _$ssrStyleProperty(";z-index:", _$escape(String(20 + layoutItem.lane), true)), _$escape(_$createComponent(EventChip, {
1222
2332
  event: event,
1223
2333
  get owner() {
1224
2334
  return props.owner;
@@ -1238,7 +2348,7 @@ const TimeGridView = props => {
1238
2348
  return props.owner.onEventResize;
1239
2349
  },
1240
2350
  get children() {
1241
- return _$ssr(_tmpl$31, _$ssrAttribute("aria-label", _$escape(messages().resizeEvent, true), false));
2351
+ return _$ssr(_tmpl$52, _$ssrAttribute("aria-label", _$escape(calendarMessages().resizeEvent, true), false));
1242
2352
  }
1243
2353
  })));
1244
2354
  }
@@ -1250,14 +2360,14 @@ const TimeGridView = props => {
1250
2360
  const layout = timeRangeLayout(overflow.groupStartDate, overflow.groupEndDate);
1251
2361
  const key = `${dayKey}-${overflow.groupId}`;
1252
2362
  const hiddenTitle = () => overflow.hiddenEvents.map(event => `${formatTime(event.startDate, dateConfig())} ${event.title}`).join("\n");
1253
- return [_$ssr(_tmpl$33, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$ssrAttribute("title", _$escape(hiddenTitle(), true), false) + _$ssrAttribute("aria-label", _$escape(messages().hiddenOverlappingEvents({
2363
+ return [_$ssr(_tmpl$54, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$ssrAttribute("title", _$escape(hiddenTitle(), true), false) + _$ssrAttribute("aria-label", _$escape(calendarMessages().hiddenOverlappingEvents({
1254
2364
  count: overflow.hiddenEvents.length
1255
2365
  }), true), false), _$escape(overflow.hiddenEvents.length)), _$createComponent(Show, {
1256
2366
  get when() {
1257
2367
  return expandedOverflow() === key;
1258
2368
  },
1259
2369
  get children() {
1260
- return _$ssr(_tmpl$34, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`), _$escape(formatTime(overflow.groupStartDate, dateConfig())), _$escape(formatTime(overflow.groupEndDate, dateConfig())), _$escape(_$createComponent(For, {
2370
+ return _$ssr(_tmpl$55, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`), _$escape(formatTime(overflow.groupStartDate, dateConfig())), _$escape(formatTime(overflow.groupEndDate, dateConfig())), _$escape(_$createComponent(For, {
1261
2371
  get each() {
1262
2372
  return overflow.hiddenEvents;
1263
2373
  },
@@ -1316,11 +2426,11 @@ const YearView = props => {
1316
2426
  };
1317
2427
  });
1318
2428
  });
1319
- return _$ssr(_tmpl$35, _$escape(_$createComponent(For, {
2429
+ return _$ssr(_tmpl$56, _$escape(_$createComponent(For, {
1320
2430
  get each() {
1321
2431
  return months();
1322
2432
  },
1323
- children: month => _$ssr(_tmpl$36, _$escape(month.label), _$escape(_$createComponent(For, {
2433
+ children: month => _$ssr(_tmpl$57, _$escape(month.label), _$escape(_$createComponent(For, {
1324
2434
  get each() {
1325
2435
  return month.days;
1326
2436
  },
@@ -1343,7 +2453,7 @@ const YearView = props => {
1343
2453
  get when() {
1344
2454
  return day.events[0];
1345
2455
  },
1346
- children: event => _$ssr(_tmpl$37, _$ssrAttribute("data-color", event().colorHex ? _$escape(undefined, true) : _$escape(event().color ?? "blue", true), false) + _$ssrAttribute("data-today", day.isToday ? "true" : _$escape(undefined, true), false), _$ssrStyle(event().colorHex ? {
2456
+ children: event => _$ssr(_tmpl$58, _$ssrAttribute("data-color", event().colorHex ? _$escape(undefined, true) : _$escape(event().color ?? "blue", true), false) + _$ssrAttribute("data-today", day.isToday ? "true" : _$escape(undefined, true), false), _$ssrStyle(event().colorHex ? {
1347
2457
  "background-color": day.isToday ? "white" : event().colorHex
1348
2458
  } : undefined))
1349
2459
  })];
@@ -1356,7 +2466,7 @@ const MobileMonthView = props => {
1356
2466
  const dateConfig = createMemo(() => ownerDateConfig(props.owner));
1357
2467
  const selectedDateKey = createMemo(() => calendar.formatDateKey(props.selectedDate, dateConfig()));
1358
2468
  const selectedEvents = createMemo(() => props.events.filter(event => event.dayKey === selectedDateKey()));
1359
- return _$ssr(_tmpl$39, _$escape(_$createComponent(MonthView, {
2469
+ return _$ssr(_tmpl$60, _$escape(_$createComponent(MonthPickerView, {
1360
2470
  get owner() {
1361
2471
  return {
1362
2472
  ...props.owner,
@@ -1386,10 +2496,10 @@ const MobileMonthView = props => {
1386
2496
  return selectedEvents().length > 0;
1387
2497
  },
1388
2498
  get fallback() {
1389
- return _$ssr(_tmpl$40, _$escape(props.labels.noEvents));
2499
+ return _$ssr(_tmpl$61, _$escape(props.labels.noEvents));
1390
2500
  },
1391
2501
  get children() {
1392
- return _$ssr(_tmpl$38, _$escape(_$createComponent(For, {
2502
+ return _$ssr(_tmpl$59, _$escape(_$createComponent(For, {
1393
2503
  get each() {
1394
2504
  return selectedEvents();
1395
2505
  },
@@ -1406,9 +2516,10 @@ const MobileMonthView = props => {
1406
2516
  }
1407
2517
  })));
1408
2518
  };
1409
- const CalendarBody = props => _$ssr(_tmpl$41, _$escape(props.children));
2519
+ const CalendarBody = props => _$ssr(_tmpl$62, _$escape(props.children));
1410
2520
  const CalendarRoot = props => {
1411
2521
  const messages = useUiMessages();
2522
+ const calendarMessages = useCalendarMessages();
1412
2523
  // Subviews derive their date config from the owner props, so the inherited
1413
2524
  // render locale is merged here once; an explicit dateConfig.locale wins.
1414
2525
  const localizedConfig = useDateConfigLocale(() => props.dateConfig);
@@ -1427,6 +2538,8 @@ const CalendarRoot = props => {
1427
2538
  const date = createMemo(() => safeDate(props.date));
1428
2539
  const selectedDate = createMemo(() => safeDate(props.selectedDate ?? props.date));
1429
2540
  const [now, setNow] = createSignal(new Date());
2541
+ /** The first day selected in the month view, so the view switcher opens the other views at it. */
2542
+ const [focusDay, setFocusDay] = createSignal(null);
1430
2543
  const normalizedEvents = createMemo(() => normalizeEvents(props.events, dateConfig()));
1431
2544
  const mergedLabels = createMemo(() => ({
1432
2545
  today: messages().today,
@@ -1435,7 +2548,7 @@ const CalendarRoot = props => {
1435
2548
  month: messages().month,
1436
2549
  year: messages().year,
1437
2550
  allDay: messages().allDay,
1438
- noEvents: messages().noEvents,
2551
+ noEvents: calendarMessages().noEvents,
1439
2552
  previous: messages().previous,
1440
2553
  next: messages().next,
1441
2554
  ...props.labels
@@ -1453,7 +2566,7 @@ const CalendarRoot = props => {
1453
2566
  document.removeEventListener("visibilitychange", updateNow);
1454
2567
  });
1455
2568
  });
1456
- return _$ssr(_tmpl$42, `k2b-content-calendar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-busy", props.navigationPending ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(CalendarHeader, {
2569
+ return _$ssr(_tmpl$63, `k2b-content-calendar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-busy", props.navigationPending ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(CalendarHeader, {
1457
2570
  get date() {
1458
2571
  return date();
1459
2572
  },
@@ -1463,8 +2576,11 @@ const CalendarRoot = props => {
1463
2576
  get labels() {
1464
2577
  return mergedLabels();
1465
2578
  },
1466
- owner: owner
1467
- })), _$escape(props.toolbarContent), _$escape(_$createComponent(Show, {
2579
+ owner: owner,
2580
+ get focusDay() {
2581
+ return _$memo(() => view() === "month")() ? focusDay() : null;
2582
+ }
2583
+ })), _$escape(_$createComponent(Show, {
1468
2584
  get when() {
1469
2585
  return !custom();
1470
2586
  },
@@ -1496,7 +2612,8 @@ const CalendarRoot = props => {
1496
2612
  },
1497
2613
  get labels() {
1498
2614
  return mergedLabels();
1499
- }
2615
+ },
2616
+ onFocusDay: setFocusDay
1500
2617
  });
1501
2618
  }
1502
2619
  });