@k2b/ui 0.21.0 → 0.23.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 (610) hide show
  1. package/dist/browser/actions/ContextMenu.js +3 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/FilterChip.js +3 -1
  4. package/dist/browser/actions/FilterChip.js.map +1 -1
  5. package/dist/browser/actions/SpotlightSearch.js +3 -1
  6. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  7. package/dist/browser/actions/filter-messages.js +20 -0
  8. package/dist/browser/actions/filter-messages.js.map +1 -0
  9. package/dist/browser/actions/spotlight-messages.js +16 -0
  10. package/dist/browser/actions/spotlight-messages.js.map +1 -0
  11. package/dist/browser/chat/ChatComposer.js +47 -41
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatPrimitives.js +25 -23
  14. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  15. package/dist/browser/chat/ChatRoot.js +3 -3
  16. package/dist/browser/chat/ChatRoot.js.map +1 -1
  17. package/dist/browser/chat/ChatTimeline.js +12 -12
  18. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  19. package/dist/browser/chat/chat-messages.js +236 -0
  20. package/dist/browser/chat/chat-messages.js.map +1 -0
  21. package/dist/browser/content/Calendar.js +1096 -1060
  22. package/dist/browser/content/Calendar.js.map +1 -1
  23. package/dist/browser/content/CalendarDayView.js +1187 -0
  24. package/dist/browser/content/CalendarDayView.js.map +1 -0
  25. package/dist/browser/content/CalendarWeekView.js +1571 -0
  26. package/dist/browser/content/CalendarWeekView.js.map +1 -0
  27. package/dist/browser/content/Chart.js +15 -8
  28. package/dist/browser/content/Chart.js.map +1 -1
  29. package/dist/browser/content/ChartExplorer.js +185 -85
  30. package/dist/browser/content/ChartExplorer.js.map +1 -1
  31. package/dist/browser/content/ChartExplorerControls.js +9 -7
  32. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  33. package/dist/browser/content/ChartFilterControls.js +93 -34
  34. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  35. package/dist/browser/content/ChartSnapshotView.js +3 -3
  36. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +238 -201
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/Docs.js +3 -1
  40. package/dist/browser/content/Docs.js.map +1 -1
  41. package/dist/browser/content/FileBrowser.js +30 -26
  42. package/dist/browser/content/FileBrowser.js.map +1 -1
  43. package/dist/browser/content/FileTree.js +9 -7
  44. package/dist/browser/content/FileTree.js.map +1 -1
  45. package/dist/browser/content/FileView.js +37 -28
  46. package/dist/browser/content/FileView.js.map +1 -1
  47. package/dist/browser/content/Lightbox.js +9 -7
  48. package/dist/browser/content/Lightbox.js.map +1 -1
  49. package/dist/browser/content/LogEntriesTable.js +3 -3
  50. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  51. package/dist/browser/content/MessageRow.js +24 -22
  52. package/dist/browser/content/MessageRow.js.map +1 -1
  53. package/dist/browser/content/Pagination.js +7 -7
  54. package/dist/browser/content/Pagination.js.map +1 -1
  55. package/dist/browser/content/PdfPreview.js +15 -13
  56. package/dist/browser/content/PdfPreview.js.map +1 -1
  57. package/dist/browser/content/RangePicker.js +3 -1
  58. package/dist/browser/content/RangePicker.js.map +1 -1
  59. package/dist/browser/content/StructuredDataPreview.js +3 -1
  60. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  61. package/dist/browser/content/Timeline.js +13 -11
  62. package/dist/browser/content/Timeline.js.map +1 -1
  63. package/dist/browser/content/VideoPlayer.js +5 -5
  64. package/dist/browser/content/VideoPlayer.js.map +1 -1
  65. package/dist/browser/content/VirtualFeed.js +6 -4
  66. package/dist/browser/content/VirtualFeed.js.map +1 -1
  67. package/dist/browser/content/ZoomPanViewport.js +10 -7
  68. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  69. package/dist/browser/content/calendar-day-scroll.js +98 -0
  70. package/dist/browser/content/calendar-day-scroll.js.map +1 -0
  71. package/dist/browser/content/calendar-days.js +408 -0
  72. package/dist/browser/content/calendar-days.js.map +1 -0
  73. package/dist/browser/content/calendar-dialogs.js +236 -0
  74. package/dist/browser/content/calendar-dialogs.js.map +1 -0
  75. package/dist/browser/content/calendar-messages.js +249 -3
  76. package/dist/browser/content/calendar-messages.js.map +1 -1
  77. package/dist/browser/content/calendar-pointer.js +19 -6
  78. package/dist/browser/content/calendar-pointer.js.map +1 -1
  79. package/dist/browser/content/calendar-shared.js +328 -0
  80. package/dist/browser/content/calendar-shared.js.map +1 -0
  81. package/dist/browser/content/calendar-time-view.js +1649 -0
  82. package/dist/browser/content/calendar-time-view.js.map +1 -0
  83. package/dist/browser/content/chart-messages.js +146 -0
  84. package/dist/browser/content/chart-messages.js.map +1 -0
  85. package/dist/browser/content/collection-selection.js +2 -0
  86. package/dist/browser/content/collection-selection.js.map +1 -1
  87. package/dist/browser/content/data-table-messages.js +24 -0
  88. package/dist/browser/content/data-table-messages.js.map +1 -0
  89. package/dist/browser/content/docs-messages.js +24 -0
  90. package/dist/browser/content/docs-messages.js.map +1 -0
  91. package/dist/browser/content/feed-messages.js +34 -0
  92. package/dist/browser/content/feed-messages.js.map +1 -0
  93. package/dist/browser/content/file-browser-messages.js +69 -0
  94. package/dist/browser/content/file-browser-messages.js.map +1 -0
  95. package/dist/browser/content/file-view-messages.js +64 -0
  96. package/dist/browser/content/file-view-messages.js.map +1 -0
  97. package/dist/browser/content/index.js.map +1 -1
  98. package/dist/browser/content/lightbox-messages.js +36 -0
  99. package/dist/browser/content/lightbox-messages.js.map +1 -0
  100. package/dist/browser/content/log-entries-messages.js +20 -0
  101. package/dist/browser/content/log-entries-messages.js.map +1 -0
  102. package/dist/browser/content/markdown-info-block-messages.js +24 -0
  103. package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
  104. package/dist/browser/content/markdown-info-blocks.js +3 -3
  105. package/dist/browser/content/markdown-info-blocks.js.map +1 -1
  106. package/dist/browser/content/markdown-links.js +2 -2
  107. package/dist/browser/content/markdown-links.js.map +1 -1
  108. package/dist/browser/content/markdown-reference-messages.js +30 -0
  109. package/dist/browser/content/markdown-reference-messages.js.map +1 -0
  110. package/dist/browser/content/pagination-messages.js +38 -0
  111. package/dist/browser/content/pagination-messages.js.map +1 -0
  112. package/dist/browser/content/pdf-messages.js +43 -0
  113. package/dist/browser/content/pdf-messages.js.map +1 -0
  114. package/dist/browser/content/range-picker-messages.js +20 -0
  115. package/dist/browser/content/range-picker-messages.js.map +1 -0
  116. package/dist/browser/content/structured-data-messages.js +22 -0
  117. package/dist/browser/content/structured-data-messages.js.map +1 -0
  118. package/dist/browser/content/timeline-messages.js +62 -0
  119. package/dist/browser/content/timeline-messages.js.map +1 -0
  120. package/dist/browser/content/video-messages.js +24 -0
  121. package/dist/browser/content/video-messages.js.map +1 -0
  122. package/dist/browser/content/viewport-messages.js +28 -0
  123. package/dist/browser/content/viewport-messages.js.map +1 -0
  124. package/dist/browser/feedback/HoverPreview.js +34 -6
  125. package/dist/browser/feedback/HoverPreview.js.map +1 -1
  126. package/dist/browser/feedback/InstallGuide.js +18 -18
  127. package/dist/browser/feedback/InstallGuide.js.map +1 -1
  128. package/dist/browser/feedback/install-messages.js +104 -0
  129. package/dist/browser/feedback/install-messages.js.map +1 -0
  130. package/dist/browser/feedback/prompt-messages.js +65 -0
  131. package/dist/browser/feedback/prompt-messages.js.map +1 -0
  132. package/dist/browser/feedback/prompts.js +14 -11
  133. package/dist/browser/feedback/prompts.js.map +1 -1
  134. package/dist/browser/feedback/toast-messages.js +18 -0
  135. package/dist/browser/feedback/toast-messages.js.map +1 -0
  136. package/dist/browser/feedback/toast.js +4 -3
  137. package/dist/browser/feedback/toast.js.map +1 -1
  138. package/dist/browser/index.js +1 -1
  139. package/dist/browser/index.js.map +1 -1
  140. package/dist/browser/inputs/AutocompleteEditor.js +6 -4
  141. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  142. package/dist/browser/inputs/AutocompleteSelect.js +10 -8
  143. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  144. package/dist/browser/inputs/ChoiceGroups.js +4 -0
  145. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  146. package/dist/browser/inputs/ChoiceInputs.js +5 -5
  147. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  148. package/dist/browser/inputs/Combobox.js +3 -2
  149. package/dist/browser/inputs/Combobox.js.map +1 -1
  150. package/dist/browser/inputs/FileDropTarget.js +6 -6
  151. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  152. package/dist/browser/inputs/FileInputs.js +30 -21
  153. package/dist/browser/inputs/FileInputs.js.map +1 -1
  154. package/dist/browser/inputs/MultiSelectInput.js +7 -5
  155. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  156. package/dist/browser/inputs/NumberInput.js +4 -2
  157. package/dist/browser/inputs/NumberInput.js.map +1 -1
  158. package/dist/browser/inputs/QrScanner.js +5 -5
  159. package/dist/browser/inputs/QrScanner.js.map +1 -1
  160. package/dist/browser/inputs/Select.js +7 -5
  161. package/dist/browser/inputs/Select.js.map +1 -1
  162. package/dist/browser/inputs/SelectChip.js +3 -3
  163. package/dist/browser/inputs/SelectChip.js.map +1 -1
  164. package/dist/browser/inputs/SignatureInput.js +9 -3
  165. package/dist/browser/inputs/SignatureInput.js.map +1 -1
  166. package/dist/browser/inputs/SpecialInputs.js +4 -2
  167. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  168. package/dist/browser/inputs/TagEditor.js +8 -6
  169. package/dist/browser/inputs/TagEditor.js.map +1 -1
  170. package/dist/browser/inputs/TagsInput.js +5 -5
  171. package/dist/browser/inputs/TagsInput.js.map +1 -1
  172. package/dist/browser/inputs/TemplateEditor.js +5 -5
  173. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  174. package/dist/browser/inputs/TextInput.js +3 -1
  175. package/dist/browser/inputs/TextInput.js.map +1 -1
  176. package/dist/browser/inputs/completion-messages.js +24 -0
  177. package/dist/browser/inputs/completion-messages.js.map +1 -0
  178. package/dist/browser/inputs/file-drop-messages.js +63 -0
  179. package/dist/browser/inputs/file-drop-messages.js.map +1 -0
  180. package/dist/browser/inputs/file-drop.js.map +1 -1
  181. package/dist/browser/inputs/file-input-messages.js +60 -0
  182. package/dist/browser/inputs/file-input-messages.js.map +1 -0
  183. package/dist/browser/inputs/icon-messages.js +22 -0
  184. package/dist/browser/inputs/icon-messages.js.map +1 -0
  185. package/dist/browser/inputs/input-messages.js +38 -0
  186. package/dist/browser/inputs/input-messages.js.map +1 -0
  187. package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
  188. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  189. package/dist/browser/inputs/markdown/Toolbar.js +13 -13
  190. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  191. package/dist/browser/inputs/markdown/editor-messages.js +43 -0
  192. package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
  193. package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
  194. package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
  195. package/dist/browser/inputs/qr-messages.js +26 -0
  196. package/dist/browser/inputs/qr-messages.js.map +1 -0
  197. package/dist/browser/inputs/select-messages.js +63 -0
  198. package/dist/browser/inputs/select-messages.js.map +1 -0
  199. package/dist/browser/inputs/tag-messages.js +44 -0
  200. package/dist/browser/inputs/tag-messages.js.map +1 -0
  201. package/dist/browser/inputs/template-messages.js +22 -0
  202. package/dist/browser/inputs/template-messages.js.map +1 -0
  203. package/dist/browser/internal/render-error-messages.js +20 -0
  204. package/dist/browser/internal/render-error-messages.js.map +1 -0
  205. package/dist/browser/internal/render-error.js +3 -1
  206. package/dist/browser/internal/render-error.js.map +1 -1
  207. package/dist/browser/internal/text-selection.js +101 -0
  208. package/dist/browser/internal/text-selection.js.map +1 -0
  209. package/dist/browser/intl/messages.js +6 -1155
  210. package/dist/browser/intl/messages.js.map +1 -1
  211. package/dist/browser/layout/AppWorkspace.js +594 -425
  212. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  213. package/dist/browser/layout/BottomSheet.js +6 -1
  214. package/dist/browser/layout/BottomSheet.js.map +1 -1
  215. package/dist/browser/layout/Discussion.js +8 -5
  216. package/dist/browser/layout/Discussion.js.map +1 -1
  217. package/dist/browser/layout/FloatingWindow.js +8 -5
  218. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  219. package/dist/browser/layout/Navigation.js +7 -6
  220. package/dist/browser/layout/Navigation.js.map +1 -1
  221. package/dist/browser/layout/PageTitle.js +373 -0
  222. package/dist/browser/layout/PageTitle.js.map +1 -0
  223. package/dist/browser/layout/PanelDialog.js +8 -6
  224. package/dist/browser/layout/PanelDialog.js.map +1 -1
  225. package/dist/browser/layout/Panes.js +23 -15
  226. package/dist/browser/layout/Panes.js.map +1 -1
  227. package/dist/browser/layout/PullToRefresh.js +13 -4
  228. package/dist/browser/layout/PullToRefresh.js.map +1 -1
  229. package/dist/browser/layout/Settings.js +14 -12
  230. package/dist/browser/layout/Settings.js.map +1 -1
  231. package/dist/browser/layout/SettingsCollection.js +6 -5
  232. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  233. package/dist/browser/layout/SettingsModal.js +3 -1
  234. package/dist/browser/layout/SettingsModal.js.map +1 -1
  235. package/dist/browser/layout/app-workspace-controller.js +821 -12
  236. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  237. package/dist/browser/layout/app-workspace-state.js +3 -2
  238. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  239. package/dist/browser/layout/floating-window-messages.js +28 -0
  240. package/dist/browser/layout/floating-window-messages.js.map +1 -0
  241. package/dist/browser/layout/index.js +2 -0
  242. package/dist/browser/layout/index.js.map +1 -1
  243. package/dist/browser/layout/navigation-model.js.map +1 -1
  244. package/dist/browser/layout/page-title-controller.js +169 -0
  245. package/dist/browser/layout/page-title-controller.js.map +1 -0
  246. package/dist/browser/layout/panel-dialog-messages.js +20 -0
  247. package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
  248. package/dist/browser/layout/panes-messages.js +48 -0
  249. package/dist/browser/layout/panes-messages.js.map +1 -0
  250. package/dist/browser/layout/refresh-messages.js +20 -0
  251. package/dist/browser/layout/refresh-messages.js.map +1 -0
  252. package/dist/browser/layout/settings-messages.js +54 -0
  253. package/dist/browser/layout/settings-messages.js.map +1 -0
  254. package/dist/browser/layout/workspace-messages.js +56 -0
  255. package/dist/browser/layout/workspace-messages.js.map +1 -0
  256. package/dist/browser/surfaces/Avatar.js +5 -5
  257. package/dist/browser/surfaces/Avatar.js.map +1 -1
  258. package/dist/browser/surfaces/ResourceCard.js +4 -2
  259. package/dist/browser/surfaces/ResourceCard.js.map +1 -1
  260. package/dist/browser/surfaces/StatCell.js +18 -6
  261. package/dist/browser/surfaces/StatCell.js.map +1 -1
  262. package/dist/browser/surfaces/Tag.js +3 -3
  263. package/dist/browser/surfaces/Tag.js.map +1 -1
  264. package/dist/browser/surfaces/avatar-messages.js +26 -0
  265. package/dist/browser/surfaces/avatar-messages.js.map +1 -0
  266. package/dist/browser/surfaces/resource-messages.js +26 -0
  267. package/dist/browser/surfaces/resource-messages.js.map +1 -0
  268. package/dist/browser/widgets/Widget.js +6 -0
  269. package/dist/browser/widgets/Widget.js.map +1 -1
  270. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  271. package/dist/ssr/actions/FilterChip.js +3 -1
  272. package/dist/ssr/actions/FilterChip.js.map +1 -1
  273. package/dist/ssr/actions/SpotlightSearch.js +3 -1
  274. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  275. package/dist/ssr/actions/filter-messages.js +20 -0
  276. package/dist/ssr/actions/filter-messages.js.map +1 -0
  277. package/dist/ssr/actions/spotlight-messages.js +16 -0
  278. package/dist/ssr/actions/spotlight-messages.js.map +1 -0
  279. package/dist/ssr/chat/ChatComposer.js +47 -41
  280. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  281. package/dist/ssr/chat/ChatPrimitives.js +23 -21
  282. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  283. package/dist/ssr/chat/ChatRoot.js +3 -3
  284. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  285. package/dist/ssr/chat/ChatTimeline.js +11 -11
  286. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  287. package/dist/ssr/chat/chat-messages.js +236 -0
  288. package/dist/ssr/chat/chat-messages.js.map +1 -0
  289. package/dist/ssr/content/Calendar.js +534 -346
  290. package/dist/ssr/content/Calendar.js.map +1 -1
  291. package/dist/ssr/content/CalendarDayView.js +800 -0
  292. package/dist/ssr/content/CalendarDayView.js.map +1 -0
  293. package/dist/ssr/content/CalendarWeekView.js +1069 -0
  294. package/dist/ssr/content/CalendarWeekView.js.map +1 -0
  295. package/dist/ssr/content/Chart.js +12 -5
  296. package/dist/ssr/content/Chart.js.map +1 -1
  297. package/dist/ssr/content/ChartExplorer.js +98 -37
  298. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  299. package/dist/ssr/content/ChartExplorerControls.js +9 -7
  300. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  301. package/dist/ssr/content/ChartFilterControls.js +52 -8
  302. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  303. package/dist/ssr/content/ChartSnapshotView.js +3 -3
  304. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  305. package/dist/ssr/content/DataTable.js +77 -53
  306. package/dist/ssr/content/DataTable.js.map +1 -1
  307. package/dist/ssr/content/Docs.js +3 -1
  308. package/dist/ssr/content/Docs.js.map +1 -1
  309. package/dist/ssr/content/FileBrowser.js +30 -26
  310. package/dist/ssr/content/FileBrowser.js.map +1 -1
  311. package/dist/ssr/content/FileTree.js +9 -7
  312. package/dist/ssr/content/FileTree.js.map +1 -1
  313. package/dist/ssr/content/FileView.js +37 -28
  314. package/dist/ssr/content/FileView.js.map +1 -1
  315. package/dist/ssr/content/Lightbox.js +8 -6
  316. package/dist/ssr/content/Lightbox.js.map +1 -1
  317. package/dist/ssr/content/LogEntriesTable.js +3 -3
  318. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  319. package/dist/ssr/content/MessageRow.js +24 -22
  320. package/dist/ssr/content/MessageRow.js.map +1 -1
  321. package/dist/ssr/content/Pagination.js +6 -6
  322. package/dist/ssr/content/Pagination.js.map +1 -1
  323. package/dist/ssr/content/PdfPreview.js +15 -13
  324. package/dist/ssr/content/PdfPreview.js.map +1 -1
  325. package/dist/ssr/content/RangePicker.js +3 -1
  326. package/dist/ssr/content/RangePicker.js.map +1 -1
  327. package/dist/ssr/content/StructuredDataPreview.js +3 -1
  328. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  329. package/dist/ssr/content/Timeline.js +13 -11
  330. package/dist/ssr/content/Timeline.js.map +1 -1
  331. package/dist/ssr/content/VideoPlayer.js +5 -5
  332. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  333. package/dist/ssr/content/VirtualFeed.js +6 -4
  334. package/dist/ssr/content/VirtualFeed.js.map +1 -1
  335. package/dist/ssr/content/ZoomPanViewport.js +7 -4
  336. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  337. package/dist/ssr/content/calendar-day-scroll.js +98 -0
  338. package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
  339. package/dist/ssr/content/calendar-days.js +408 -0
  340. package/dist/ssr/content/calendar-days.js.map +1 -0
  341. package/dist/ssr/content/calendar-dialogs.js +159 -0
  342. package/dist/ssr/content/calendar-dialogs.js.map +1 -0
  343. package/dist/ssr/content/calendar-messages.js +249 -3
  344. package/dist/ssr/content/calendar-messages.js.map +1 -1
  345. package/dist/ssr/content/calendar-pointer.js +19 -6
  346. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  347. package/dist/ssr/content/calendar-shared.js +261 -0
  348. package/dist/ssr/content/calendar-shared.js.map +1 -0
  349. package/dist/ssr/content/calendar-time-view.js +1306 -0
  350. package/dist/ssr/content/calendar-time-view.js.map +1 -0
  351. package/dist/ssr/content/chart-messages.js +146 -0
  352. package/dist/ssr/content/chart-messages.js.map +1 -0
  353. package/dist/ssr/content/collection-selection.js +2 -0
  354. package/dist/ssr/content/collection-selection.js.map +1 -1
  355. package/dist/ssr/content/data-table-messages.js +24 -0
  356. package/dist/ssr/content/data-table-messages.js.map +1 -0
  357. package/dist/ssr/content/docs-messages.js +24 -0
  358. package/dist/ssr/content/docs-messages.js.map +1 -0
  359. package/dist/ssr/content/feed-messages.js +34 -0
  360. package/dist/ssr/content/feed-messages.js.map +1 -0
  361. package/dist/ssr/content/file-browser-messages.js +69 -0
  362. package/dist/ssr/content/file-browser-messages.js.map +1 -0
  363. package/dist/ssr/content/file-view-messages.js +64 -0
  364. package/dist/ssr/content/file-view-messages.js.map +1 -0
  365. package/dist/ssr/content/index.js.map +1 -1
  366. package/dist/ssr/content/lightbox-messages.js +36 -0
  367. package/dist/ssr/content/lightbox-messages.js.map +1 -0
  368. package/dist/ssr/content/log-entries-messages.js +20 -0
  369. package/dist/ssr/content/log-entries-messages.js.map +1 -0
  370. package/dist/ssr/content/markdown-info-block-messages.js +24 -0
  371. package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
  372. package/dist/ssr/content/markdown-info-blocks.js +3 -3
  373. package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
  374. package/dist/ssr/content/markdown-links.js +2 -2
  375. package/dist/ssr/content/markdown-links.js.map +1 -1
  376. package/dist/ssr/content/markdown-reference-messages.js +30 -0
  377. package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
  378. package/dist/ssr/content/pagination-messages.js +38 -0
  379. package/dist/ssr/content/pagination-messages.js.map +1 -0
  380. package/dist/ssr/content/pdf-messages.js +43 -0
  381. package/dist/ssr/content/pdf-messages.js.map +1 -0
  382. package/dist/ssr/content/range-picker-messages.js +20 -0
  383. package/dist/ssr/content/range-picker-messages.js.map +1 -0
  384. package/dist/ssr/content/structured-data-messages.js +22 -0
  385. package/dist/ssr/content/structured-data-messages.js.map +1 -0
  386. package/dist/ssr/content/timeline-messages.js +62 -0
  387. package/dist/ssr/content/timeline-messages.js.map +1 -0
  388. package/dist/ssr/content/video-messages.js +24 -0
  389. package/dist/ssr/content/video-messages.js.map +1 -0
  390. package/dist/ssr/content/viewport-messages.js +28 -0
  391. package/dist/ssr/content/viewport-messages.js.map +1 -0
  392. package/dist/ssr/feedback/HoverPreview.js +34 -6
  393. package/dist/ssr/feedback/HoverPreview.js.map +1 -1
  394. package/dist/ssr/feedback/InstallGuide.js +18 -18
  395. package/dist/ssr/feedback/InstallGuide.js.map +1 -1
  396. package/dist/ssr/feedback/install-messages.js +104 -0
  397. package/dist/ssr/feedback/install-messages.js.map +1 -0
  398. package/dist/ssr/feedback/prompt-messages.js +65 -0
  399. package/dist/ssr/feedback/prompt-messages.js.map +1 -0
  400. package/dist/ssr/feedback/prompts.js +14 -11
  401. package/dist/ssr/feedback/prompts.js.map +1 -1
  402. package/dist/ssr/feedback/toast-messages.js +18 -0
  403. package/dist/ssr/feedback/toast-messages.js.map +1 -0
  404. package/dist/ssr/feedback/toast.js +4 -3
  405. package/dist/ssr/feedback/toast.js.map +1 -1
  406. package/dist/ssr/index.js +1 -1
  407. package/dist/ssr/index.js.map +1 -1
  408. package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
  409. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  410. package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
  411. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  412. package/dist/ssr/inputs/ChoiceGroups.js +4 -0
  413. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  414. package/dist/ssr/inputs/ChoiceInputs.js +5 -5
  415. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  416. package/dist/ssr/inputs/Combobox.js +3 -1
  417. package/dist/ssr/inputs/Combobox.js.map +1 -1
  418. package/dist/ssr/inputs/FileDropTarget.js +6 -6
  419. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  420. package/dist/ssr/inputs/FileInputs.js +29 -20
  421. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  422. package/dist/ssr/inputs/MultiSelectInput.js +7 -5
  423. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  424. package/dist/ssr/inputs/NumberInput.js +4 -2
  425. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  426. package/dist/ssr/inputs/QrScanner.js +4 -4
  427. package/dist/ssr/inputs/QrScanner.js.map +1 -1
  428. package/dist/ssr/inputs/Select.js +7 -5
  429. package/dist/ssr/inputs/Select.js.map +1 -1
  430. package/dist/ssr/inputs/SelectChip.js +3 -3
  431. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  432. package/dist/ssr/inputs/SignatureInput.js +9 -3
  433. package/dist/ssr/inputs/SignatureInput.js.map +1 -1
  434. package/dist/ssr/inputs/SpecialInputs.js +4 -2
  435. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  436. package/dist/ssr/inputs/TagEditor.js +8 -6
  437. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  438. package/dist/ssr/inputs/TagsInput.js +5 -5
  439. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  440. package/dist/ssr/inputs/TemplateEditor.js +5 -5
  441. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  442. package/dist/ssr/inputs/TextInput.js +3 -1
  443. package/dist/ssr/inputs/TextInput.js.map +1 -1
  444. package/dist/ssr/inputs/completion-messages.js +24 -0
  445. package/dist/ssr/inputs/completion-messages.js.map +1 -0
  446. package/dist/ssr/inputs/file-drop-messages.js +63 -0
  447. package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
  448. package/dist/ssr/inputs/file-drop.js.map +1 -1
  449. package/dist/ssr/inputs/file-input-messages.js +60 -0
  450. package/dist/ssr/inputs/file-input-messages.js.map +1 -0
  451. package/dist/ssr/inputs/icon-messages.js +22 -0
  452. package/dist/ssr/inputs/icon-messages.js.map +1 -0
  453. package/dist/ssr/inputs/input-messages.js +38 -0
  454. package/dist/ssr/inputs/input-messages.js.map +1 -0
  455. package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
  456. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  457. package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
  458. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  459. package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
  460. package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
  461. package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
  462. package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
  463. package/dist/ssr/inputs/qr-messages.js +26 -0
  464. package/dist/ssr/inputs/qr-messages.js.map +1 -0
  465. package/dist/ssr/inputs/select-messages.js +63 -0
  466. package/dist/ssr/inputs/select-messages.js.map +1 -0
  467. package/dist/ssr/inputs/tag-messages.js +44 -0
  468. package/dist/ssr/inputs/tag-messages.js.map +1 -0
  469. package/dist/ssr/inputs/template-messages.js +22 -0
  470. package/dist/ssr/inputs/template-messages.js.map +1 -0
  471. package/dist/ssr/internal/render-error-messages.js +20 -0
  472. package/dist/ssr/internal/render-error-messages.js.map +1 -0
  473. package/dist/ssr/internal/render-error.js +3 -1
  474. package/dist/ssr/internal/render-error.js.map +1 -1
  475. package/dist/ssr/internal/text-selection.js +101 -0
  476. package/dist/ssr/internal/text-selection.js.map +1 -0
  477. package/dist/ssr/intl/messages.js +6 -1155
  478. package/dist/ssr/intl/messages.js.map +1 -1
  479. package/dist/ssr/layout/AppWorkspace.js +219 -103
  480. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  481. package/dist/ssr/layout/BottomSheet.js +1 -0
  482. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  483. package/dist/ssr/layout/Discussion.js +8 -5
  484. package/dist/ssr/layout/Discussion.js.map +1 -1
  485. package/dist/ssr/layout/FloatingWindow.js +8 -5
  486. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  487. package/dist/ssr/layout/Navigation.js +6 -5
  488. package/dist/ssr/layout/Navigation.js.map +1 -1
  489. package/dist/ssr/layout/PageTitle.js +256 -0
  490. package/dist/ssr/layout/PageTitle.js.map +1 -0
  491. package/dist/ssr/layout/PanelDialog.js +8 -6
  492. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  493. package/dist/ssr/layout/Panes.js +22 -14
  494. package/dist/ssr/layout/Panes.js.map +1 -1
  495. package/dist/ssr/layout/PullToRefresh.js +13 -4
  496. package/dist/ssr/layout/PullToRefresh.js.map +1 -1
  497. package/dist/ssr/layout/Settings.js +14 -12
  498. package/dist/ssr/layout/Settings.js.map +1 -1
  499. package/dist/ssr/layout/SettingsCollection.js +6 -5
  500. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  501. package/dist/ssr/layout/SettingsModal.js +3 -1
  502. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  503. package/dist/ssr/layout/app-workspace-controller.js +821 -12
  504. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  505. package/dist/ssr/layout/app-workspace-state.js +3 -2
  506. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  507. package/dist/ssr/layout/floating-window-messages.js +28 -0
  508. package/dist/ssr/layout/floating-window-messages.js.map +1 -0
  509. package/dist/ssr/layout/index.js +2 -0
  510. package/dist/ssr/layout/index.js.map +1 -1
  511. package/dist/ssr/layout/navigation-model.js.map +1 -1
  512. package/dist/ssr/layout/page-title-controller.js +169 -0
  513. package/dist/ssr/layout/page-title-controller.js.map +1 -0
  514. package/dist/ssr/layout/panel-dialog-messages.js +20 -0
  515. package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
  516. package/dist/ssr/layout/panes-messages.js +48 -0
  517. package/dist/ssr/layout/panes-messages.js.map +1 -0
  518. package/dist/ssr/layout/refresh-messages.js +20 -0
  519. package/dist/ssr/layout/refresh-messages.js.map +1 -0
  520. package/dist/ssr/layout/settings-messages.js +54 -0
  521. package/dist/ssr/layout/settings-messages.js.map +1 -0
  522. package/dist/ssr/layout/workspace-messages.js +56 -0
  523. package/dist/ssr/layout/workspace-messages.js.map +1 -0
  524. package/dist/ssr/surfaces/Avatar.js +5 -5
  525. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  526. package/dist/ssr/surfaces/ResourceCard.js +4 -2
  527. package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
  528. package/dist/ssr/surfaces/StatCell.js +2 -2
  529. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  530. package/dist/ssr/surfaces/Tag.js +3 -3
  531. package/dist/ssr/surfaces/Tag.js.map +1 -1
  532. package/dist/ssr/surfaces/avatar-messages.js +26 -0
  533. package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
  534. package/dist/ssr/surfaces/resource-messages.js +26 -0
  535. package/dist/ssr/surfaces/resource-messages.js.map +1 -0
  536. package/dist/ssr/widgets/Widget.js +6 -0
  537. package/dist/ssr/widgets/Widget.js.map +1 -1
  538. package/dist/styles.css +1 -1
  539. package/dist/types/actions/filter-messages.d.ts +8 -0
  540. package/dist/types/actions/spotlight-messages.d.ts +8 -0
  541. package/dist/types/chat/chat-messages.d.ts +116 -0
  542. package/dist/types/content/Calendar.d.ts +91 -0
  543. package/dist/types/content/CalendarDayView.d.ts +7 -0
  544. package/dist/types/content/CalendarWeekView.d.ts +7 -0
  545. package/dist/types/content/ChartExplorer.d.ts +36 -1
  546. package/dist/types/content/ChartFilterControls.d.ts +6 -1
  547. package/dist/types/content/DataTable.d.ts +7 -0
  548. package/dist/types/content/FileView.d.ts +0 -10
  549. package/dist/types/content/calendar-day-scroll.d.ts +42 -0
  550. package/dist/types/content/calendar-days.d.ts +192 -0
  551. package/dist/types/content/calendar-dialogs.d.ts +22 -0
  552. package/dist/types/content/calendar-messages.d.ts +119 -1
  553. package/dist/types/content/calendar-pointer.d.ts +9 -0
  554. package/dist/types/content/calendar-shared.d.ts +69 -0
  555. package/dist/types/content/calendar-time-view.d.ts +252 -0
  556. package/dist/types/content/chart-messages.d.ts +37 -0
  557. package/dist/types/content/data-table-messages.d.ts +10 -0
  558. package/dist/types/content/docs-messages.d.ts +10 -0
  559. package/dist/types/content/feed-messages.d.ts +15 -0
  560. package/dist/types/content/file-browser-messages.d.ts +33 -0
  561. package/dist/types/content/file-view-messages.d.ts +30 -0
  562. package/dist/types/content/index.d.ts +2 -2
  563. package/dist/types/content/lightbox-messages.d.ts +16 -0
  564. package/dist/types/content/log-entries-messages.d.ts +8 -0
  565. package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
  566. package/dist/types/content/markdown-reference-messages.d.ts +15 -0
  567. package/dist/types/content/pagination-messages.d.ts +17 -0
  568. package/dist/types/content/pdf-messages.d.ts +20 -0
  569. package/dist/types/content/range-picker-messages.d.ts +8 -0
  570. package/dist/types/content/structured-data-messages.d.ts +9 -0
  571. package/dist/types/content/timeline-messages.d.ts +29 -0
  572. package/dist/types/content/video-messages.d.ts +10 -0
  573. package/dist/types/content/viewport-messages.d.ts +12 -0
  574. package/dist/types/feedback/install-messages.d.ts +50 -0
  575. package/dist/types/feedback/prompt-messages.d.ts +31 -0
  576. package/dist/types/feedback/toast-messages.d.ts +9 -0
  577. package/dist/types/index.d.ts +1 -0
  578. package/dist/types/inputs/completion-messages.d.ts +10 -0
  579. package/dist/types/inputs/file-drop-messages.d.ts +30 -0
  580. package/dist/types/inputs/file-drop.d.ts +3 -3
  581. package/dist/types/inputs/file-input-messages.d.ts +28 -0
  582. package/dist/types/inputs/icon-messages.d.ts +9 -0
  583. package/dist/types/inputs/input-messages.d.ts +17 -0
  584. package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
  585. package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
  586. package/dist/types/inputs/qr-messages.d.ts +11 -0
  587. package/dist/types/inputs/select-messages.d.ts +30 -0
  588. package/dist/types/inputs/tag-messages.d.ts +20 -0
  589. package/dist/types/inputs/template-messages.d.ts +9 -0
  590. package/dist/types/internal/render-error-messages.d.ts +8 -0
  591. package/dist/types/internal/text-selection.d.ts +18 -0
  592. package/dist/types/intl/messages.d.ts +3 -544
  593. package/dist/types/layout/AppWorkspace.d.ts +42 -5
  594. package/dist/types/layout/PageTitle.d.ts +65 -0
  595. package/dist/types/layout/app-workspace-controller.d.ts +12 -0
  596. package/dist/types/layout/app-workspace-state.d.ts +3 -2
  597. package/dist/types/layout/floating-window-messages.d.ts +12 -0
  598. package/dist/types/layout/index.d.ts +3 -0
  599. package/dist/types/layout/navigation-model.d.ts +7 -0
  600. package/dist/types/layout/page-title-controller.d.ts +13 -0
  601. package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
  602. package/dist/types/layout/panes-messages.d.ts +22 -0
  603. package/dist/types/layout/refresh-messages.d.ts +8 -0
  604. package/dist/types/layout/settings-messages.d.ts +25 -0
  605. package/dist/types/layout/workspace-messages.d.ts +26 -0
  606. package/dist/types/surfaces/StatCell.d.ts +5 -0
  607. package/dist/types/surfaces/avatar-messages.d.ts +11 -0
  608. package/dist/types/surfaces/resource-messages.d.ts +11 -0
  609. package/dist/types/widgets/Widget.d.ts +5 -1
  610. package/package.json +1 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Scroll rules of the day and week views, free of the DOM so they can be tested.
3
+ *
4
+ * The day view runs down through the days and stops gently at each day start: within `STOP_ZONE` pixels of one the
5
+ * wheel slows down, and a scroll that rests close to one glides onto it. The week view scrolls sideways through the
6
+ * days; a wheel or trackpad gesture keeps the axis it started on, and a scroll that rests between two days glides to
7
+ * the nearer day.
8
+ */
9
+
10
+ /** Pixels before and after a day start in which the wheel slows down. */
11
+ export const STOP_ZONE = 72;
12
+ /** How much of a wheel step remains right at a day start. */
13
+ export const STOP_MIN_FACTOR = 0.16;
14
+ /** A resting scroll this close to a day start glides onto it: a wheel or trackpad, and a finger that flings further. */
15
+ export const SETTLE_RADIUS = {
16
+ wheel: 40,
17
+ touch: 88
18
+ };
19
+ /** A pause between wheel events that starts a new gesture. */
20
+ export const GESTURE_GAP_MS = 150;
21
+
22
+ /** A wheel delta in pixels, whatever unit the browser reports it in. */
23
+ export const wheelPixels = (delta, mode, page) => delta * (mode === 1 ? 40 : mode === 2 ? page : 1);
24
+
25
+ /** The index of the last stop at or before a position; `stops` are sorted. */
26
+ export const stopIndexAt = (stops, position) => {
27
+ let low = 0;
28
+ let high = stops.length - 1;
29
+ while (low < high) {
30
+ const middle = Math.ceil((low + high) / 2);
31
+ if (stops[middle] <= position + 2) low = middle;else high = middle - 1;
32
+ }
33
+ return Math.max(0, low);
34
+ };
35
+ export const nearestStop = (stops, position) => {
36
+ if (stops.length === 0) return undefined;
37
+ const index = stopIndexAt(stops, position);
38
+ const candidates = [stops[index], stops[index + 1]].filter(value => value !== undefined);
39
+ return candidates.reduce((best, value) => Math.abs(value - position) < Math.abs(best - position) ? value : best, candidates[0]);
40
+ };
41
+
42
+ /** How much of a wheel step moves the view at a position: less the closer it is to a stop, eased. */
43
+ export const stopFactor = (stops, position) => {
44
+ const stop = nearestStop(stops, position);
45
+ if (stop === undefined) return 1;
46
+ const distance = Math.abs(position - stop);
47
+ if (distance >= STOP_ZONE) return 1;
48
+ const share = distance / STOP_ZONE;
49
+ return STOP_MIN_FACTOR + (1 - STOP_MIN_FACTOR) * share * share * (3 - 2 * share);
50
+ };
51
+
52
+ /**
53
+ * Where a wheel step of `delta` pixels takes the view, braked near stops, or `undefined` when no stop lies within
54
+ * reach and the browser scrolls as usual. The first stop at 0 brakes nothing: there is no day before it to leave.
55
+ */
56
+ export const brakedScroll = (stops, position, delta) => {
57
+ if (delta === 0) return undefined;
58
+ const direction = Math.sign(delta);
59
+ const reach = [position - STOP_ZONE, position + delta + direction * STOP_ZONE].sort((left, right) => left - right);
60
+ if (!stops.some(stop => stop > 0 && stop >= reach[0] && stop <= reach[1])) return undefined;
61
+ let next = position;
62
+ let left = Math.abs(delta);
63
+ while (left > 0) {
64
+ const step = Math.min(2, left);
65
+ next += direction * step * stopFactor(stops, next);
66
+ left -= step;
67
+ }
68
+ return next;
69
+ };
70
+
71
+ /** The stop a resting scroll glides onto, or `undefined` when it rests on one or too far from any. */
72
+ export const settleTarget = (stops, position, radius) => {
73
+ const stop = nearestStop(stops, position);
74
+ if (stop === undefined) return undefined;
75
+ const distance = Math.abs(position - stop);
76
+ return distance > 0.5 && distance < radius ? stop : undefined;
77
+ };
78
+
79
+ /** How far a header has crossed its stop, 0 to 1, for the line that fills while a day start passes. */
80
+ export const stopCrossing = (stop, position) => {
81
+ const distance = Math.abs(stop - position);
82
+ return distance < STOP_ZONE ? 1 - distance / STOP_ZONE : 0;
83
+ };
84
+ /** The axis a wheel gesture takes from its first event: Shift turns a vertical wheel sideways. */
85
+ export const wheelAxis = (deltaX, deltaY, shiftKey) => {
86
+ if (shiftKey && Math.abs(deltaY) > Math.abs(deltaX)) return "x";
87
+ return Math.abs(deltaX) > Math.abs(deltaY) ? "x" : "y";
88
+ };
89
+
90
+ /** The sideways part of a wheel event on an axis, Shift turning the vertical delta into a sideways one. */
91
+ export const wheelDelta = (axis, deltaX, deltaY, shiftKey) => {
92
+ if (axis === "y") return deltaY;
93
+ return shiftKey && deltaX === 0 ? deltaY : deltaX;
94
+ };
95
+
96
+ /** The scroll position of the nearest day start in a strip of equal columns. */
97
+ export const snapToColumn = (position, width) => width > 0 ? Math.round(position / width) * width : position;
98
+ //# sourceMappingURL=calendar-day-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/calendar-day-scroll.ts"],"sourcesContent":["/**\n * Scroll rules of the day and week views, free of the DOM so they can be tested.\n *\n * The day view runs down through the days and stops gently at each day start: within `STOP_ZONE` pixels of one the\n * wheel slows down, and a scroll that rests close to one glides onto it. The week view scrolls sideways through the\n * days; a wheel or trackpad gesture keeps the axis it started on, and a scroll that rests between two days glides to\n * the nearer day.\n */\n\n/** Pixels before and after a day start in which the wheel slows down. */\nexport const STOP_ZONE = 72;\n/** How much of a wheel step remains right at a day start. */\nexport const STOP_MIN_FACTOR = 0.16;\n/** A resting scroll this close to a day start glides onto it: a wheel or trackpad, and a finger that flings further. */\nexport const SETTLE_RADIUS = { wheel: 40, touch: 88 } as const;\n/** A pause between wheel events that starts a new gesture. */\nexport const GESTURE_GAP_MS = 150;\n\n/** A wheel delta in pixels, whatever unit the browser reports it in. */\nexport const wheelPixels = (delta: number, mode: number, page: number): number => delta * (mode === 1 ? 40 : mode === 2 ? page : 1);\n\n/** The index of the last stop at or before a position; `stops` are sorted. */\nexport const stopIndexAt = (stops: readonly number[], position: number): number => {\n let low = 0;\n let high = stops.length - 1;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (stops[middle]! <= position + 2) low = middle;\n else high = middle - 1;\n }\n return Math.max(0, low);\n};\n\nexport const nearestStop = (stops: readonly number[], position: number): number | undefined => {\n if (stops.length === 0) return undefined;\n const index = stopIndexAt(stops, position);\n const candidates = [stops[index], stops[index + 1]].filter((value): value is number => value !== undefined);\n return candidates.reduce((best, value) => (Math.abs(value - position) < Math.abs(best - position) ? value : best), candidates[0]!);\n};\n\n/** How much of a wheel step moves the view at a position: less the closer it is to a stop, eased. */\nexport const stopFactor = (stops: readonly number[], position: number): number => {\n const stop = nearestStop(stops, position);\n if (stop === undefined) return 1;\n const distance = Math.abs(position - stop);\n if (distance >= STOP_ZONE) return 1;\n const share = distance / STOP_ZONE;\n return STOP_MIN_FACTOR + (1 - STOP_MIN_FACTOR) * share * share * (3 - 2 * share);\n};\n\n/**\n * Where a wheel step of `delta` pixels takes the view, braked near stops, or `undefined` when no stop lies within\n * reach and the browser scrolls as usual. The first stop at 0 brakes nothing: there is no day before it to leave.\n */\nexport const brakedScroll = (stops: readonly number[], position: number, delta: number): number | undefined => {\n if (delta === 0) return undefined;\n const direction = Math.sign(delta);\n const reach = [position - STOP_ZONE, position + delta + direction * STOP_ZONE].sort((left, right) => left - right);\n if (!stops.some((stop) => stop > 0 && stop >= reach[0]! && stop <= reach[1]!)) return undefined;\n let next = position;\n let left = Math.abs(delta);\n while (left > 0) {\n const step = Math.min(2, left);\n next += direction * step * stopFactor(stops, next);\n left -= step;\n }\n return next;\n};\n\n/** The stop a resting scroll glides onto, or `undefined` when it rests on one or too far from any. */\nexport const settleTarget = (stops: readonly number[], position: number, radius: number): number | undefined => {\n const stop = nearestStop(stops, position);\n if (stop === undefined) return undefined;\n const distance = Math.abs(position - stop);\n return distance > 0.5 && distance < radius ? stop : undefined;\n};\n\n/** How far a header has crossed its stop, 0 to 1, for the line that fills while a day start passes. */\nexport const stopCrossing = (stop: number, position: number): number => {\n const distance = Math.abs(stop - position);\n return distance < STOP_ZONE ? 1 - distance / STOP_ZONE : 0;\n};\n\nexport type WheelAxis = \"x\" | \"y\";\n\n/** The axis a wheel gesture takes from its first event: Shift turns a vertical wheel sideways. */\nexport const wheelAxis = (deltaX: number, deltaY: number, shiftKey: boolean): WheelAxis => {\n if (shiftKey && Math.abs(deltaY) > Math.abs(deltaX)) return \"x\";\n return Math.abs(deltaX) > Math.abs(deltaY) ? \"x\" : \"y\";\n};\n\n/** The sideways part of a wheel event on an axis, Shift turning the vertical delta into a sideways one. */\nexport const wheelDelta = (axis: WheelAxis, deltaX: number, deltaY: number, shiftKey: boolean): number => {\n if (axis === \"y\") return deltaY;\n return shiftKey && deltaX === 0 ? deltaY : deltaX;\n};\n\n/** The scroll position of the nearest day start in a strip of equal columns. */\nexport const snapToColumn = (position: number, width: number): number => (width > 0 ? Math.round(position / width) * width : position);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,408 @@
1
+ import { dates as calendar } from "@k2b/stdlib";
2
+ import { layoutCalendarIntervals } from "./calendar-event-layout";
3
+
4
+ /**
5
+ * The time model of the day and week views with `dayHours`: a day runs from its start hour to the same hour of the next
6
+ * day, so the night after the waking hours belongs to the day before it. Every place in a day is a count of minutes on
7
+ * the wall clock after that start, which keeps a day 24 hours long on the clock across a change to or from summer
8
+ * time. Timed events over calendar dates go to the all-day row, unless they end by the next day's start hour.
9
+ * An event that crosses only the day start stays bands in both days. The functions here are pure and work on
10
+ * `YYYY-MM-DD` day keys in the calendar's time zone.
11
+ */
12
+
13
+ /** Waking hours: `start` begins the day, `end` begins its night, which lasts until `start` of the next day. */
14
+
15
+ export const DAY_MINUTES = 1440;
16
+ /** Free time from this length on is labelled, such as "1 hr free"; shorter gaps show only while dragging into them. */
17
+ export const GAP_LABEL_MINUTES = 60;
18
+ /** Free time from this length on stands out. */
19
+ export const GAP_LONG_MINUTES = 180;
20
+ const pad = value => String(value).padStart(2, "0");
21
+
22
+ /** Days since 1970-01-01 of a `YYYY-MM-DD` key; day keys need no time zone for this. */
23
+ export const dayKeyNumber = key => {
24
+ const [year = "1970", month = "1", day = "1"] = key.split("-");
25
+ return Date.UTC(Number(year), Number(month) - 1, Number(day)) / 86_400_000;
26
+ };
27
+ export const keyOfDayNumber = value => new Date(value * 86_400_000).toISOString().slice(0, 10);
28
+ export const addDayKeys = (key, days) => keyOfDayNumber(dayKeyNumber(key) + days);
29
+
30
+ /** Every key from `first` to `last`, both included. */
31
+ export const dayKeyRange = (first, last) => {
32
+ const keys = [];
33
+ for (let day = dayKeyNumber(first), end = dayKeyNumber(last); day <= end; day++) keys.push(keyOfDayNumber(day));
34
+ return keys;
35
+ };
36
+
37
+ /** The wall clock of an instant in the calendar's time zone, as `YYYY-MM-DDTHH:mm`. */
38
+ export const wallClock = (instant, context) => {
39
+ if (context?.timeZone) return calendar.instantToZonedInput(instant, context.timeZone);
40
+ return `${instant.getFullYear()}-${pad(instant.getMonth() + 1)}-${pad(instant.getDate())}T${pad(instant.getHours())}:${pad(instant.getMinutes())}`;
41
+ };
42
+
43
+ /** The instant of a wall clock in the calendar's time zone; a time a clock change skips moves forward, as clocks do. */
44
+ export const wallInstant = (wall, context) => {
45
+ if (context?.timeZone) return new Date(calendar.zonedDateTimeToInstant(wall, context.timeZone, {
46
+ disambiguation: "compatible"
47
+ }));
48
+ return new Date(wall);
49
+ };
50
+ const wallMinutes = wall => Number(wall.slice(11, 13)) * 60 + Number(wall.slice(14, 16));
51
+
52
+ /** Minutes on the wall clock from the start of the day `key` to the instant; negative before it, above 1440 after it. */
53
+ export const minuteInDay = (key, instant, hours, context) => {
54
+ const wall = wallClock(instant, context);
55
+ return (dayKeyNumber(wall.slice(0, 10)) - dayKeyNumber(key)) * DAY_MINUTES + wallMinutes(wall) - hours[0] * 60;
56
+ };
57
+
58
+ /** The instant at a minute of the day `key`. */
59
+ export const instantInDay = (key, minute, hours, context) => {
60
+ const total = Math.round(minute) + hours[0] * 60;
61
+ const day = Math.floor(total / DAY_MINUTES);
62
+ const rest = total - day * DAY_MINUTES;
63
+ return wallInstant(`${addDayKeys(key, day)}T${pad(Math.floor(rest / 60))}:${pad(rest % 60)}`, context);
64
+ };
65
+
66
+ /**
67
+ * The instants of a slot of the day `key`. A time the change to summer time skips moves forward, so a slot drawn there
68
+ * could end at or before its start; it then keeps the length it was drawn with.
69
+ */
70
+ export const instantsInDay = (key, start, end, hours, context) => {
71
+ const from = instantInDay(key, start, hours, context);
72
+ const to = instantInDay(key, end, hours, context);
73
+ return {
74
+ start: from,
75
+ end: to > from ? to : new Date(from.getTime() + Math.max(0, end - start) * 60_000)
76
+ };
77
+ };
78
+
79
+ /**
80
+ * An entry with one edge dragged to a minute of the day `key`, given as the slot `minutes` it now spans there. The
81
+ * other edge keeps its instant, so an entry in the hour a change from summer time repeats keeps its real time; the
82
+ * entry never ends before it starts.
83
+ */
84
+ export const resizedInDay = (entry, edge, key, minutes, hours, context) => {
85
+ const length = Math.max(0, minutes.end - minutes.start) * 60_000;
86
+ if (edge === "end") {
87
+ const end = instantInDay(key, minutes.end, hours, context);
88
+ return {
89
+ start: entry.start,
90
+ end: end > entry.start ? end : new Date(entry.start.getTime() + length)
91
+ };
92
+ }
93
+ const start = instantInDay(key, minutes.start, hours, context);
94
+ return {
95
+ start: start < entry.end ? start : new Date(entry.end.getTime() - length),
96
+ end: entry.end
97
+ };
98
+ };
99
+
100
+ /** The day an instant belongs to: before the start hour it is still the night of the day before. */
101
+ export const dayKeyOf = (instant, hours, context) => {
102
+ const wall = wallClock(instant, context);
103
+ return wallMinutes(wall) < hours[0] * 60 ? addDayKeys(wall.slice(0, 10), -1) : wall.slice(0, 10);
104
+ };
105
+
106
+ /** The wall-clock time `HH:mm` at a minute of a day. */
107
+ export const clockAt = (minute, hours) => {
108
+ const total = ((Math.round(minute) + hours[0] * 60) % DAY_MINUTES + DAY_MINUTES) % DAY_MINUTES;
109
+ return `${pad(Math.floor(total / 60))}:${pad(total % 60)}`;
110
+ };
111
+
112
+ /** Minutes of the waking hours, from the start of the day to the start of its night. */
113
+ export const wakeMinutes = hours => ((hours[1] - hours[0]) % 24 + 24) % 24 * 60 || DAY_MINUTES;
114
+
115
+ /** One entry the views place: a timed event, an all-day event, or a point in time such as a deadline. */
116
+
117
+ /** A timed entry of one day, in minutes of that day. */
118
+
119
+ /**
120
+ * An entry of the all-day row: all-day events, points due on a day, and timed events over calendar dates, ignoring
121
+ * the end date when the event ends by its day start. Events crossing only the day start stay bands in both days.
122
+ */
123
+
124
+ /** Where an entry goes: the timelines of the days it touches, or the all-day row over its calendar dates. */
125
+ export const placeEntry = (entry, hours, context) => {
126
+ if (entry.allDay) {
127
+ const firstKey = wallClock(entry.start, context).slice(0, 10);
128
+ const endWall = wallClock(entry.end, context);
129
+ // The end of an all-day entry is the midnight after its last day.
130
+ const lastKey = entry.end > entry.start && endWall.slice(11) === "00:00" ? addDayKeys(endWall.slice(0, 10), -1) : endWall.slice(0, 10);
131
+ return {
132
+ kind: "span",
133
+ span: {
134
+ item: entry.item,
135
+ firstKey,
136
+ lastKey: lastKey < firstKey ? firstKey : lastKey,
137
+ marker: entry.marker
138
+ }
139
+ };
140
+ }
141
+ const key = dayKeyOf(entry.start, hours, context);
142
+ const start = minuteInDay(key, entry.start, hours, context);
143
+ if (entry.marker) return {
144
+ kind: "marker",
145
+ key,
146
+ marker: {
147
+ item: entry.item,
148
+ minute: start
149
+ }
150
+ };
151
+ const startDate = wallClock(entry.start, context).slice(0, 10);
152
+ const endWall = wallClock(entry.end, context);
153
+ let endDate = endWall.slice(0, 10);
154
+ if (endDate > startDate && wallMinutes(endWall) <= hours[0] * 60) endDate = addDayKeys(endDate, -1);
155
+ if (endDate > startDate) return {
156
+ kind: "span",
157
+ span: {
158
+ item: entry.item,
159
+ firstKey: startDate,
160
+ lastKey: endDate,
161
+ marker: false
162
+ }
163
+ };
164
+ const lastKey = dayKeyOf(new Date(Math.max(entry.start.getTime(), entry.end.getTime() - 60_000)), hours, context);
165
+ const real = Math.round((entry.end.getTime() - entry.start.getTime()) / 60_000);
166
+ const bands = dayKeyRange(key, lastKey).map(key => {
167
+ const start = minuteInDay(key, entry.start, hours, context);
168
+ let end = minuteInDay(key, entry.end, hours, context);
169
+ // In the hour a clock change repeats, the wall clock can end before it starts; the entry keeps its real length.
170
+ if (end <= start && real > 0) end = start + real;
171
+ return {
172
+ key,
173
+ band: {
174
+ item: entry.item,
175
+ start,
176
+ end: Math.max(end, start)
177
+ }
178
+ };
179
+ });
180
+ return {
181
+ kind: "band",
182
+ bands
183
+ };
184
+ };
185
+
186
+ /** The model of each day from `first` to `last`. */
187
+ export const buildDays = (first, last, entries, hours, context) => {
188
+ const days = new Map();
189
+ for (const key of dayKeyRange(first, last)) days.set(key, {
190
+ key,
191
+ bands: [],
192
+ markers: [],
193
+ spans: [],
194
+ night: false,
195
+ empty: true
196
+ });
197
+ const wake = wakeMinutes(hours);
198
+ for (const entry of entries) {
199
+ const placed = placeEntry(entry, hours, context);
200
+ if (placed.kind === "band") {
201
+ for (const {
202
+ key,
203
+ band
204
+ } of placed.bands) {
205
+ const day = days.get(key);
206
+ if (!day) continue;
207
+ day.bands.push(band);
208
+ if (band.end > wake) day.night = true;
209
+ }
210
+ } else if (placed.kind === "marker") {
211
+ const day = days.get(placed.key);
212
+ if (!day) continue;
213
+ day.markers.push(placed.marker);
214
+ if (placed.marker.minute >= wake) day.night = true;
215
+ } else {
216
+ const from = placed.span.firstKey < first ? first : placed.span.firstKey;
217
+ const to = placed.span.lastKey > last ? last : placed.span.lastKey;
218
+ for (const key of from <= to ? dayKeyRange(from, to) : []) days.get(key)?.spans.push(placed.span);
219
+ }
220
+ }
221
+ for (const day of days.values()) {
222
+ day.bands.sort((left, right) => left.start - right.start || right.end - left.end);
223
+ day.markers.sort((left, right) => left.minute - right.minute);
224
+ day.empty = day.bands.length === 0 && day.markers.length === 0 && day.spans.length === 0;
225
+ }
226
+ return days;
227
+ };
228
+ /**
229
+ * Free time of a day's waking hours between its timed entries. `now` is the current minute of this day, `Infinity`
230
+ * for a day that is over, and `-Infinity` for one still ahead. The gap that holds now starts at the next quarter hour.
231
+ */
232
+ export const freeGaps = (bands, wake, now, minimum = 15) => {
233
+ const busy = bands.map(band => [Math.max(0, band.start), Math.min(wake, band.end)]).filter(([start, end]) => end > start).sort((left, right) => left[0] - right[0]);
234
+ const gaps = [];
235
+ const push = (start, end) => {
236
+ let from = start;
237
+ if (from < now && end > now) from = Math.min(end, Math.ceil(now / 15) * 15);
238
+ if (end - from >= minimum) gaps.push({
239
+ start: from,
240
+ end,
241
+ past: end <= now
242
+ });
243
+ };
244
+ let cursor = 0;
245
+ for (const [start, end] of busy) {
246
+ if (start > cursor) push(cursor, start);
247
+ cursor = Math.max(cursor, end);
248
+ }
249
+ if (wake > cursor) push(cursor, wake);
250
+ return gaps;
251
+ };
252
+
253
+ /**
254
+ * What activating free time creates: a gap up to two hours whole, a longer one an hour from its start. A gap from the
255
+ * start of the day that leaves room proposes 09:00, so "16 hrs free" never becomes a 16-hour event.
256
+ */
257
+ export const gapProposal = (gap, hours) => {
258
+ if (gap.end - gap.start <= 120) return [gap.start, gap.end];
259
+ const nine = (9 - hours[0]) * 60;
260
+ const start = gap.start === 0 && nine > 0 && gap.end - 60 >= nine ? nine : gap.start;
261
+ return [start, start + 60];
262
+ };
263
+ /** Overlapping bands side by side; a band counts at least `minimum` minutes long, as its drawn height does. */
264
+ export const dayLanes = (bands, minimum) => layoutCalendarIntervals(bands, band => ({
265
+ start: band.start,
266
+ end: Math.max(band.end, band.start + minimum)
267
+ })).map(({
268
+ item,
269
+ lane,
270
+ lanes
271
+ }) => ({
272
+ ...item,
273
+ lane,
274
+ lanes
275
+ }));
276
+
277
+ /** About the minutes a deadline's pill covers in the waking hours; the open night is half as tall, so twice as many. */
278
+ export const MARKER_MINUTES = 30;
279
+
280
+ /**
281
+ * Deadlines whose pills would cover each other side by side, in time order from the left; each line stays at its own
282
+ * minute. Two to-dos due at the same time, such as Spaces' default 17:00, so both keep their title and checkbox.
283
+ */
284
+ export const markerLanes = (markers, wake) => layoutCalendarIntervals(markers, marker => ({
285
+ start: marker.minute,
286
+ end: marker.minute + (marker.minute >= wake ? 2 * MARKER_MINUTES : MARKER_MINUTES)
287
+ }));
288
+ /**
289
+ * The days of the stream: each day with something in it alone, runs of empty days as one. The days in `keep`, such
290
+ * as today, the day the reader opened, and every day of a run the reader unfolded, never fold, so days that load
291
+ * next to an unfolded run fold on their own and leave it open.
292
+ */
293
+ export const dayGroups = (keys, empty, keep) => {
294
+ const groups = [];
295
+ let run = [];
296
+ const flush = () => {
297
+ if (run.length === 0) return;
298
+ groups.push({
299
+ kind: "empty",
300
+ keys: run
301
+ });
302
+ run = [];
303
+ };
304
+ for (const key of keys) {
305
+ if (empty(key) && !keep.has(key)) run.push(key);else {
306
+ flush();
307
+ groups.push({
308
+ kind: "day",
309
+ key
310
+ });
311
+ }
312
+ }
313
+ flush();
314
+ return groups;
315
+ };
316
+
317
+ /** Pixel sizes of a day's timeline: waking hours at full height, the night at half, below a bar or folded into a row. */
318
+
319
+ /** The top of a minute. */
320
+ export const dayY = (geometry, minute) => {
321
+ const {
322
+ hour,
323
+ nightHour,
324
+ nightBar,
325
+ fold,
326
+ wake,
327
+ expanded
328
+ } = geometry;
329
+ const awake = wake / 60 * hour;
330
+ if (minute <= wake) return Math.max(0, minute) / 60 * hour;
331
+ if (!expanded) return awake + fold / 2;
332
+ return awake + nightBar + (Math.min(minute, DAY_MINUTES) - wake) / 60 * nightHour;
333
+ };
334
+
335
+ /** The top of something that starts at a minute: from the start of the night on, below the night's bar. */
336
+ export const dayTopY = (geometry, minute) => minute >= geometry.wake && geometry.expanded ? dayY(geometry, Math.max(minute, geometry.wake + 1e-6)) : dayY(geometry, minute);
337
+
338
+ /** The minute at a height, the inverse of `dayY`; the night's bar and a folded night map to the start of the night. */
339
+ export const dayMinuteAt = (geometry, y) => {
340
+ const {
341
+ hour,
342
+ nightHour,
343
+ nightBar,
344
+ wake,
345
+ expanded
346
+ } = geometry;
347
+ const awake = wake / 60 * hour;
348
+ if (y <= awake) return Math.max(0, y) / hour * 60;
349
+ if (!expanded || y < awake + nightBar) return wake;
350
+ return Math.min(DAY_MINUTES, wake + (y - awake - nightBar) / nightHour * 60);
351
+ };
352
+ export const dayHeight = geometry => geometry.wake / 60 * geometry.hour + (geometry.expanded ? geometry.nightBar + (DAY_MINUTES - geometry.wake) / 60 * geometry.nightHour : geometry.fold);
353
+
354
+ /** The last minute the timeline draws: the end of the night when it is open, else the start of the night. */
355
+ export const dayLimit = geometry => geometry.expanded ? DAY_MINUTES : geometry.wake;
356
+
357
+ /** Rounds to the step, the 15 or 5 minutes a pointer snaps to. */
358
+ export const snapMinutes = (minute, step) => Math.round(minute / step) * step;
359
+
360
+ /**
361
+ * A height in a day's timeline as counts of the four sizes the stylesheet sets: waking hours, night hours, the night's
362
+ * bar, and the folded night row. The views draw with these, so a phone's smaller hours need no script.
363
+ */
364
+
365
+ /** `dayY` as terms. */
366
+ export const dayYTerms = (wake, expanded, minute) => {
367
+ if (minute <= wake) return [Math.max(0, minute) / 60, 0, 0, 0];
368
+ if (!expanded) return [wake / 60, 0, 0, 0.5];
369
+ return [wake / 60, (Math.min(minute, DAY_MINUTES) - wake) / 60, 1, 0];
370
+ };
371
+
372
+ /** `dayTopY` as terms. */
373
+ export const dayTopTerms = (wake, expanded, minute) => minute >= wake && expanded ? [wake / 60, (Math.min(minute, DAY_MINUTES) - wake) / 60, 1, 0] : dayYTerms(wake, expanded, minute);
374
+
375
+ /** `dayHeight` as terms. */
376
+ export const dayHeightTerms = (wake, expanded) => expanded ? [wake / 60, (DAY_MINUTES - wake) / 60, 1, 0] : [wake / 60, 0, 0, 1];
377
+ export const subtractTerms = (left, right) => [left[0] - right[0], left[1] - right[1], left[2] - right[2], left[3] - right[3]];
378
+ const TERM_SIZES = ["--k2b-calendar-hour", "--k2b-calendar-night-hour", "--k2b-calendar-night-bar", "--k2b-calendar-fold"];
379
+
380
+ /** Terms as a CSS length over the sizes of the stylesheet. */
381
+ export const termsCss = terms => {
382
+ const parts = terms.flatMap((count, index) => Math.abs(count) < 1e-6 ? [] : [`${Math.round(count * 10_000) / 10_000} * var(${TERM_SIZES[index]})`]);
383
+ return parts.length === 0 ? "0px" : `calc(${parts.join(" + ")})`;
384
+ };
385
+
386
+ /** The pixel sizes of the terms where an element draws its timeline, for pointer positions. */
387
+ export const readDayGeometry = (element, wake, expanded) => {
388
+ const style = getComputedStyle(element);
389
+ const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
390
+ // Custom properties keep the units they were written in, such as "3.5rem".
391
+ const size = (name, fallback) => {
392
+ const value = style.getPropertyValue(name).trim();
393
+ const number = Number.parseFloat(value);
394
+ if (!Number.isFinite(number)) return fallback;
395
+ if (value.endsWith("rem")) return number * rootSize;
396
+ if (value.endsWith("em")) return number * (Number.parseFloat(style.fontSize) || rootSize);
397
+ return number;
398
+ };
399
+ return {
400
+ hour: size(TERM_SIZES[0], 56),
401
+ nightHour: size(TERM_SIZES[1], 28),
402
+ nightBar: size(TERM_SIZES[2], 32),
403
+ fold: size(TERM_SIZES[3], 40),
404
+ wake,
405
+ expanded
406
+ };
407
+ };
408
+ //# sourceMappingURL=calendar-days.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/calendar-days.ts"],"sourcesContent":["import { dates as calendar, type DateContext } from \"@k2b/stdlib\";\nimport { layoutCalendarIntervals } from \"./calendar-event-layout\";\n\n/**\n * The time model of the day and week views with `dayHours`: a day runs from its start hour to the same hour of the next\n * day, so the night after the waking hours belongs to the day before it. Every place in a day is a count of minutes on\n * the wall clock after that start, which keeps a day 24 hours long on the clock across a change to or from summer\n * time. Timed events over calendar dates go to the all-day row, unless they end by the next day's start hour.\n * An event that crosses only the day start stays bands in both days. The functions here are pure and work on\n * `YYYY-MM-DD` day keys in the calendar's time zone.\n */\n\n/** Waking hours: `start` begins the day, `end` begins its night, which lasts until `start` of the next day. */\nexport type CalendarDayHours = readonly [start: number, end: number];\n\nexport const DAY_MINUTES = 1440;\n/** Free time from this length on is labelled, such as \"1 hr free\"; shorter gaps show only while dragging into them. */\nexport const GAP_LABEL_MINUTES = 60;\n/** Free time from this length on stands out. */\nexport const GAP_LONG_MINUTES = 180;\n\nconst pad = (value: number) => String(value).padStart(2, \"0\");\n\n/** Days since 1970-01-01 of a `YYYY-MM-DD` key; day keys need no time zone for this. */\nexport const dayKeyNumber = (key: string): number => {\n const [year = \"1970\", month = \"1\", day = \"1\"] = key.split(\"-\");\n return Date.UTC(Number(year), Number(month) - 1, Number(day)) / 86_400_000;\n};\n\nexport const keyOfDayNumber = (value: number): string => new Date(value * 86_400_000).toISOString().slice(0, 10);\n\nexport const addDayKeys = (key: string, days: number): string => keyOfDayNumber(dayKeyNumber(key) + days);\n\n/** Every key from `first` to `last`, both included. */\nexport const dayKeyRange = (first: string, last: string): string[] => {\n const keys: string[] = [];\n for (let day = dayKeyNumber(first), end = dayKeyNumber(last); day <= end; day++) keys.push(keyOfDayNumber(day));\n return keys;\n};\n\n/** The wall clock of an instant in the calendar's time zone, as `YYYY-MM-DDTHH:mm`. */\nexport const wallClock = (instant: Date, context?: DateContext): string => {\n if (context?.timeZone) return calendar.instantToZonedInput(instant, context.timeZone);\n return `${instant.getFullYear()}-${pad(instant.getMonth() + 1)}-${pad(instant.getDate())}T${pad(instant.getHours())}:${pad(instant.getMinutes())}`;\n};\n\n/** The instant of a wall clock in the calendar's time zone; a time a clock change skips moves forward, as clocks do. */\nexport const wallInstant = (wall: string, context?: DateContext): Date => {\n if (context?.timeZone) return new Date(calendar.zonedDateTimeToInstant(wall, context.timeZone, { disambiguation: \"compatible\" }));\n return new Date(wall);\n};\n\nconst wallMinutes = (wall: string) => Number(wall.slice(11, 13)) * 60 + Number(wall.slice(14, 16));\n\n/** Minutes on the wall clock from the start of the day `key` to the instant; negative before it, above 1440 after it. */\nexport const minuteInDay = (key: string, instant: Date, hours: CalendarDayHours, context?: DateContext): number => {\n const wall = wallClock(instant, context);\n return (dayKeyNumber(wall.slice(0, 10)) - dayKeyNumber(key)) * DAY_MINUTES + wallMinutes(wall) - hours[0] * 60;\n};\n\n/** The instant at a minute of the day `key`. */\nexport const instantInDay = (key: string, minute: number, hours: CalendarDayHours, context?: DateContext): Date => {\n const total = Math.round(minute) + hours[0] * 60;\n const day = Math.floor(total / DAY_MINUTES);\n const rest = total - day * DAY_MINUTES;\n return wallInstant(`${addDayKeys(key, day)}T${pad(Math.floor(rest / 60))}:${pad(rest % 60)}`, context);\n};\n\n/**\n * The instants of a slot of the day `key`. A time the change to summer time skips moves forward, so a slot drawn there\n * could end at or before its start; it then keeps the length it was drawn with.\n */\nexport const instantsInDay = (\n key: string,\n start: number,\n end: number,\n hours: CalendarDayHours,\n context?: DateContext,\n): { start: Date; end: Date } => {\n const from = instantInDay(key, start, hours, context);\n const to = instantInDay(key, end, hours, context);\n return { start: from, end: to > from ? to : new Date(from.getTime() + Math.max(0, end - start) * 60_000) };\n};\n\n/**\n * An entry with one edge dragged to a minute of the day `key`, given as the slot `minutes` it now spans there. The\n * other edge keeps its instant, so an entry in the hour a change from summer time repeats keeps its real time; the\n * entry never ends before it starts.\n */\nexport const resizedInDay = (\n entry: { start: Date; end: Date },\n edge: \"start\" | \"end\",\n key: string,\n minutes: { start: number; end: number },\n hours: CalendarDayHours,\n context?: DateContext,\n): { start: Date; end: Date } => {\n const length = Math.max(0, minutes.end - minutes.start) * 60_000;\n if (edge === \"end\") {\n const end = instantInDay(key, minutes.end, hours, context);\n return { start: entry.start, end: end > entry.start ? end : new Date(entry.start.getTime() + length) };\n }\n const start = instantInDay(key, minutes.start, hours, context);\n return { start: start < entry.end ? start : new Date(entry.end.getTime() - length), end: entry.end };\n};\n\n/** The day an instant belongs to: before the start hour it is still the night of the day before. */\nexport const dayKeyOf = (instant: Date, hours: CalendarDayHours, context?: DateContext): string => {\n const wall = wallClock(instant, context);\n return wallMinutes(wall) < hours[0] * 60 ? addDayKeys(wall.slice(0, 10), -1) : wall.slice(0, 10);\n};\n\n/** The wall-clock time `HH:mm` at a minute of a day. */\nexport const clockAt = (minute: number, hours: CalendarDayHours): string => {\n const total = (((Math.round(minute) + hours[0] * 60) % DAY_MINUTES) + DAY_MINUTES) % DAY_MINUTES;\n return `${pad(Math.floor(total / 60))}:${pad(total % 60)}`;\n};\n\n/** Minutes of the waking hours, from the start of the day to the start of its night. */\nexport const wakeMinutes = (hours: CalendarDayHours): number => ((((hours[1] - hours[0]) % 24) + 24) % 24) * 60 || DAY_MINUTES;\n\n/** One entry the views place: a timed event, an all-day event, or a point in time such as a deadline. */\nexport type DayEntry<T> = {\n item: T;\n start: Date;\n /** For all-day entries the midnight after their last day. */\n end: Date;\n allDay: boolean;\n /** A point in time at `start`; an all-day point is due on its day. */\n marker: boolean;\n};\n\n/** A timed entry of one day, in minutes of that day. */\nexport type DayBand<T> = { item: T; start: number; end: number };\nexport type DayMarker<T> = { item: T; minute: number };\n/**\n * An entry of the all-day row: all-day events, points due on a day, and timed events over calendar dates, ignoring\n * the end date when the event ends by its day start. Events crossing only the day start stay bands in both days.\n */\nexport type DaySpan<T> = { item: T; firstKey: string; lastKey: string; marker: boolean };\n\nexport type DayModel<T> = {\n key: string;\n bands: DayBand<T>[];\n markers: DayMarker<T>[];\n spans: DaySpan<T>[];\n /** Something lies in the night, so it opens by default. */\n night: boolean;\n empty: boolean;\n};\n\n/** Where an entry goes: the timelines of the days it touches, or the all-day row over its calendar dates. */\nexport const placeEntry = <T>(\n entry: DayEntry<T>,\n hours: CalendarDayHours,\n context?: DateContext,\n):\n | { kind: \"band\"; bands: { key: string; band: DayBand<T> }[] }\n | { kind: \"marker\"; key: string; marker: DayMarker<T> }\n | { kind: \"span\"; span: DaySpan<T> } => {\n if (entry.allDay) {\n const firstKey = wallClock(entry.start, context).slice(0, 10);\n const endWall = wallClock(entry.end, context);\n // The end of an all-day entry is the midnight after its last day.\n const lastKey = entry.end > entry.start && endWall.slice(11) === \"00:00\" ? addDayKeys(endWall.slice(0, 10), -1) : endWall.slice(0, 10);\n return { kind: \"span\", span: { item: entry.item, firstKey, lastKey: lastKey < firstKey ? firstKey : lastKey, marker: entry.marker } };\n }\n const key = dayKeyOf(entry.start, hours, context);\n const start = minuteInDay(key, entry.start, hours, context);\n if (entry.marker) return { kind: \"marker\", key, marker: { item: entry.item, minute: start } };\n const startDate = wallClock(entry.start, context).slice(0, 10);\n const endWall = wallClock(entry.end, context);\n let endDate = endWall.slice(0, 10);\n if (endDate > startDate && wallMinutes(endWall) <= hours[0] * 60) endDate = addDayKeys(endDate, -1);\n if (endDate > startDate) return { kind: \"span\", span: { item: entry.item, firstKey: startDate, lastKey: endDate, marker: false } };\n const lastKey = dayKeyOf(new Date(Math.max(entry.start.getTime(), entry.end.getTime() - 60_000)), hours, context);\n const real = Math.round((entry.end.getTime() - entry.start.getTime()) / 60_000);\n const bands = dayKeyRange(key, lastKey).map((key) => {\n const start = minuteInDay(key, entry.start, hours, context);\n let end = minuteInDay(key, entry.end, hours, context);\n // In the hour a clock change repeats, the wall clock can end before it starts; the entry keeps its real length.\n if (end <= start && real > 0) end = start + real;\n return { key, band: { item: entry.item, start, end: Math.max(end, start) } };\n });\n return { kind: \"band\", bands };\n};\n\n/** The model of each day from `first` to `last`. */\nexport const buildDays = <T>(\n first: string,\n last: string,\n entries: readonly DayEntry<T>[],\n hours: CalendarDayHours,\n context?: DateContext,\n): Map<string, DayModel<T>> => {\n const days = new Map<string, DayModel<T>>();\n for (const key of dayKeyRange(first, last)) days.set(key, { key, bands: [], markers: [], spans: [], night: false, empty: true });\n const wake = wakeMinutes(hours);\n for (const entry of entries) {\n const placed = placeEntry(entry, hours, context);\n if (placed.kind === \"band\") {\n for (const { key, band } of placed.bands) {\n const day = days.get(key);\n if (!day) continue;\n day.bands.push(band);\n if (band.end > wake) day.night = true;\n }\n } else if (placed.kind === \"marker\") {\n const day = days.get(placed.key);\n if (!day) continue;\n day.markers.push(placed.marker);\n if (placed.marker.minute >= wake) day.night = true;\n } else {\n const from = placed.span.firstKey < first ? first : placed.span.firstKey;\n const to = placed.span.lastKey > last ? last : placed.span.lastKey;\n for (const key of from <= to ? dayKeyRange(from, to) : []) days.get(key)?.spans.push(placed.span);\n }\n }\n for (const day of days.values()) {\n day.bands.sort((left, right) => left.start - right.start || right.end - left.end);\n day.markers.sort((left, right) => left.minute - right.minute);\n day.empty = day.bands.length === 0 && day.markers.length === 0 && day.spans.length === 0;\n }\n return days;\n};\n\nexport type DayGap = { start: number; end: number; past: boolean };\n\n/**\n * Free time of a day's waking hours between its timed entries. `now` is the current minute of this day, `Infinity`\n * for a day that is over, and `-Infinity` for one still ahead. The gap that holds now starts at the next quarter hour.\n */\nexport const freeGaps = <T>(bands: readonly DayBand<T>[], wake: number, now: number, minimum = 15): DayGap[] => {\n const busy = bands\n .map((band) => [Math.max(0, band.start), Math.min(wake, band.end)] as const)\n .filter(([start, end]) => end > start)\n .sort((left, right) => left[0] - right[0]);\n const gaps: DayGap[] = [];\n const push = (start: number, end: number) => {\n let from = start;\n if (from < now && end > now) from = Math.min(end, Math.ceil(now / 15) * 15);\n if (end - from >= minimum) gaps.push({ start: from, end, past: end <= now });\n };\n let cursor = 0;\n for (const [start, end] of busy) {\n if (start > cursor) push(cursor, start);\n cursor = Math.max(cursor, end);\n }\n if (wake > cursor) push(cursor, wake);\n return gaps;\n};\n\n/**\n * What activating free time creates: a gap up to two hours whole, a longer one an hour from its start. A gap from the\n * start of the day that leaves room proposes 09:00, so \"16 hrs free\" never becomes a 16-hour event.\n */\nexport const gapProposal = (gap: Pick<DayGap, \"start\" | \"end\">, hours: CalendarDayHours): [start: number, end: number] => {\n if (gap.end - gap.start <= 120) return [gap.start, gap.end];\n const nine = (9 - hours[0]) * 60;\n const start = gap.start === 0 && nine > 0 && gap.end - 60 >= nine ? nine : gap.start;\n return [start, start + 60];\n};\n\nexport type DayLane<T> = DayBand<T> & { lane: number; lanes: number };\n\n/** Overlapping bands side by side; a band counts at least `minimum` minutes long, as its drawn height does. */\nexport const dayLanes = <T>(bands: readonly DayBand<T>[], minimum: number): DayLane<T>[] =>\n layoutCalendarIntervals(bands, (band) => ({ start: band.start, end: Math.max(band.end, band.start + minimum) })).map(\n ({ item, lane, lanes }) => ({ ...item, lane, lanes }),\n );\n\n/** About the minutes a deadline's pill covers in the waking hours; the open night is half as tall, so twice as many. */\nexport const MARKER_MINUTES = 30;\n\n/**\n * Deadlines whose pills would cover each other side by side, in time order from the left; each line stays at its own\n * minute. Two to-dos due at the same time, such as Spaces' default 17:00, so both keep their title and checkbox.\n */\nexport const markerLanes = <T>(markers: readonly DayMarker<T>[], wake: number) =>\n layoutCalendarIntervals(markers, (marker) => ({\n start: marker.minute,\n end: marker.minute + (marker.minute >= wake ? 2 * MARKER_MINUTES : MARKER_MINUTES),\n }));\n\nexport type DayGroup = { kind: \"day\"; key: string } | { kind: \"empty\"; keys: string[] };\n\n/**\n * The days of the stream: each day with something in it alone, runs of empty days as one. The days in `keep`, such\n * as today, the day the reader opened, and every day of a run the reader unfolded, never fold, so days that load\n * next to an unfolded run fold on their own and leave it open.\n */\nexport const dayGroups = (keys: readonly string[], empty: (key: string) => boolean, keep: ReadonlySet<string>): DayGroup[] => {\n const groups: DayGroup[] = [];\n let run: string[] = [];\n const flush = () => {\n if (run.length === 0) return;\n groups.push({ kind: \"empty\", keys: run });\n run = [];\n };\n for (const key of keys) {\n if (empty(key) && !keep.has(key)) run.push(key);\n else {\n flush();\n groups.push({ kind: \"day\", key });\n }\n }\n flush();\n return groups;\n};\n\n/** Pixel sizes of a day's timeline: waking hours at full height, the night at half, below a bar or folded into a row. */\nexport type DayGeometry = {\n hour: number;\n nightHour: number;\n nightBar: number;\n fold: number;\n wake: number;\n expanded: boolean;\n};\n\n/** The top of a minute. */\nexport const dayY = (geometry: DayGeometry, minute: number): number => {\n const { hour, nightHour, nightBar, fold, wake, expanded } = geometry;\n const awake = (wake / 60) * hour;\n if (minute <= wake) return (Math.max(0, minute) / 60) * hour;\n if (!expanded) return awake + fold / 2;\n return awake + nightBar + ((Math.min(minute, DAY_MINUTES) - wake) / 60) * nightHour;\n};\n\n/** The top of something that starts at a minute: from the start of the night on, below the night's bar. */\nexport const dayTopY = (geometry: DayGeometry, minute: number): number =>\n minute >= geometry.wake && geometry.expanded ? dayY(geometry, Math.max(minute, geometry.wake + 1e-6)) : dayY(geometry, minute);\n\n/** The minute at a height, the inverse of `dayY`; the night's bar and a folded night map to the start of the night. */\nexport const dayMinuteAt = (geometry: DayGeometry, y: number): number => {\n const { hour, nightHour, nightBar, wake, expanded } = geometry;\n const awake = (wake / 60) * hour;\n if (y <= awake) return (Math.max(0, y) / hour) * 60;\n if (!expanded || y < awake + nightBar) return wake;\n return Math.min(DAY_MINUTES, wake + ((y - awake - nightBar) / nightHour) * 60);\n};\n\nexport const dayHeight = (geometry: DayGeometry): number =>\n (geometry.wake / 60) * geometry.hour +\n (geometry.expanded ? geometry.nightBar + ((DAY_MINUTES - geometry.wake) / 60) * geometry.nightHour : geometry.fold);\n\n/** The last minute the timeline draws: the end of the night when it is open, else the start of the night. */\nexport const dayLimit = (geometry: DayGeometry): number => (geometry.expanded ? DAY_MINUTES : geometry.wake);\n\n/** Rounds to the step, the 15 or 5 minutes a pointer snaps to. */\nexport const snapMinutes = (minute: number, step: number): number => Math.round(minute / step) * step;\n\n/**\n * A height in a day's timeline as counts of the four sizes the stylesheet sets: waking hours, night hours, the night's\n * bar, and the folded night row. The views draw with these, so a phone's smaller hours need no script.\n */\nexport type DayTerms = readonly [hours: number, nightHours: number, nightBars: number, folds: number];\n\n/** `dayY` as terms. */\nexport const dayYTerms = (wake: number, expanded: boolean, minute: number): DayTerms => {\n if (minute <= wake) return [Math.max(0, minute) / 60, 0, 0, 0];\n if (!expanded) return [wake / 60, 0, 0, 0.5];\n return [wake / 60, (Math.min(minute, DAY_MINUTES) - wake) / 60, 1, 0];\n};\n\n/** `dayTopY` as terms. */\nexport const dayTopTerms = (wake: number, expanded: boolean, minute: number): DayTerms =>\n minute >= wake && expanded ? [wake / 60, (Math.min(minute, DAY_MINUTES) - wake) / 60, 1, 0] : dayYTerms(wake, expanded, minute);\n\n/** `dayHeight` as terms. */\nexport const dayHeightTerms = (wake: number, expanded: boolean): DayTerms =>\n expanded ? [wake / 60, (DAY_MINUTES - wake) / 60, 1, 0] : [wake / 60, 0, 0, 1];\n\nexport const subtractTerms = (left: DayTerms, right: DayTerms): DayTerms => [\n left[0] - right[0],\n left[1] - right[1],\n left[2] - right[2],\n left[3] - right[3],\n];\n\nconst TERM_SIZES = [\"--k2b-calendar-hour\", \"--k2b-calendar-night-hour\", \"--k2b-calendar-night-bar\", \"--k2b-calendar-fold\"] as const;\n\n/** Terms as a CSS length over the sizes of the stylesheet. */\nexport const termsCss = (terms: DayTerms): string => {\n const parts = terms.flatMap((count, index) =>\n Math.abs(count) < 1e-6 ? [] : [`${Math.round(count * 10_000) / 10_000} * var(${TERM_SIZES[index]})`],\n );\n return parts.length === 0 ? \"0px\" : `calc(${parts.join(\" + \")})`;\n};\n\n/** The pixel sizes of the terms where an element draws its timeline, for pointer positions. */\nexport const readDayGeometry = (element: Element, wake: number, expanded: boolean): DayGeometry => {\n const style = getComputedStyle(element);\n const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n // Custom properties keep the units they were written in, such as \"3.5rem\".\n const size = (name: string, fallback: number) => {\n const value = style.getPropertyValue(name).trim();\n const number = Number.parseFloat(value);\n if (!Number.isFinite(number)) return fallback;\n if (value.endsWith(\"rem\")) return number * rootSize;\n if (value.endsWith(\"em\")) return number * (Number.parseFloat(style.fontSize) || rootSize);\n return number;\n };\n return {\n hour: size(TERM_SIZES[0], 56),\n nightHour: size(TERM_SIZES[1], 28),\n nightBar: size(TERM_SIZES[2], 32),\n fold: size(TERM_SIZES[3], 40),\n wake,\n expanded,\n };\n};\n"],"mappings":"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","ignoreList":[]}