@k2b/ui 0.29.0 → 0.31.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 (243) hide show
  1. package/README.md +2 -2
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/Dropdown.js +6 -3
  4. package/dist/browser/actions/Dropdown.js.map +1 -1
  5. package/dist/browser/actions/FilterChip.js +137 -7
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/SegmentedControl.js +5 -9
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SpotlightSearch.js +6 -3
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js +5 -2
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/Toolbar.js +2 -0
  14. package/dist/browser/actions/Toolbar.js.map +1 -1
  15. package/dist/browser/actions/ViewTabs.js +294 -0
  16. package/dist/browser/actions/ViewTabs.js.map +1 -0
  17. package/dist/browser/actions/filter-messages.js +6 -2
  18. package/dist/browser/actions/filter-messages.js.map +1 -1
  19. package/dist/browser/actions/index.js +2 -1
  20. package/dist/browser/actions/index.js.map +1 -1
  21. package/dist/browser/chat/ChatComposer.js +1108 -604
  22. package/dist/browser/chat/ChatComposer.js.map +1 -1
  23. package/dist/browser/chat/ChatDecision.js +146 -84
  24. package/dist/browser/chat/ChatDecision.js.map +1 -1
  25. package/dist/browser/chat/ChatPrimitives.js +292 -159
  26. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  27. package/dist/browser/chat/chat-messages.js +8 -0
  28. package/dist/browser/chat/chat-messages.js.map +1 -1
  29. package/dist/browser/chat/command-search.js +26 -15
  30. package/dist/browser/chat/command-search.js.map +1 -1
  31. package/dist/browser/chat/index.js +4 -2
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/content/Calendar.js +143 -116
  34. package/dist/browser/content/Calendar.js.map +1 -1
  35. package/dist/browser/content/CalendarWeekView.js +291 -266
  36. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +224 -155
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/MapAttribution.js +27 -0
  40. package/dist/browser/content/MapAttribution.js.map +1 -0
  41. package/dist/browser/content/MapView.js +553 -0
  42. package/dist/browser/content/MapView.js.map +1 -0
  43. package/dist/browser/content/MapViewFrame.js +395 -0
  44. package/dist/browser/content/MapViewFrame.js.map +1 -0
  45. package/dist/browser/content/data-table-messages.js +4 -2
  46. package/dist/browser/content/data-table-messages.js.map +1 -1
  47. package/dist/browser/content/index.js +5 -0
  48. package/dist/browser/content/index.js.map +1 -1
  49. package/dist/browser/content/map-palette.js +39 -0
  50. package/dist/browser/content/map-palette.js.map +1 -0
  51. package/dist/browser/content/map-style.js +276 -0
  52. package/dist/browser/content/map-style.js.map +1 -0
  53. package/dist/browser/content/map-view-geometry.js +269 -0
  54. package/dist/browser/content/map-view-geometry.js.map +1 -0
  55. package/dist/browser/content/map-view-live.js +28 -0
  56. package/dist/browser/content/map-view-live.js.map +1 -0
  57. package/dist/browser/content/map-view-messages.js +53 -0
  58. package/dist/browser/content/map-view-messages.js.map +1 -0
  59. package/dist/browser/content/map-view-types.js +2 -0
  60. package/dist/browser/content/map-view-types.js.map +1 -0
  61. package/dist/browser/content/map-view-worker.js +10 -0
  62. package/dist/browser/feedback/MovedHint.js +197 -0
  63. package/dist/browser/feedback/MovedHint.js.map +1 -0
  64. package/dist/browser/feedback/dialog-core.js +85 -9
  65. package/dist/browser/feedback/dialog-core.js.map +1 -1
  66. package/dist/browser/feedback/index.js +1 -0
  67. package/dist/browser/feedback/index.js.map +1 -1
  68. package/dist/browser/feedback/prompts.js +6 -1
  69. package/dist/browser/feedback/prompts.js.map +1 -1
  70. package/dist/browser/inputs/DatePicker.js +337 -212
  71. package/dist/browser/inputs/DatePicker.js.map +1 -1
  72. package/dist/browser/inputs/date-picker.js +59 -5
  73. package/dist/browser/inputs/date-picker.js.map +1 -1
  74. package/dist/browser/intl/messages.js +12 -0
  75. package/dist/browser/intl/messages.js.map +1 -1
  76. package/dist/browser/intl/weekend.js +39 -0
  77. package/dist/browser/intl/weekend.js.map +1 -0
  78. package/dist/browser/layout/AppOverview.js +0 -1
  79. package/dist/browser/layout/AppOverview.js.map +1 -1
  80. package/dist/browser/layout/AppWorkspace.js +701 -476
  81. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  82. package/dist/browser/layout/PageTitle.js +3 -2
  83. package/dist/browser/layout/PageTitle.js.map +1 -1
  84. package/dist/browser/layout/SettingsModal.js +2 -2
  85. package/dist/browser/layout/SettingsModal.js.map +1 -1
  86. package/dist/browser/layout/SidebarSwitcher.js +13 -12
  87. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  88. package/dist/browser/layout/TabBar.js +1 -1
  89. package/dist/browser/layout/TabBar.js.map +1 -1
  90. package/dist/browser/layout/app-host-width.js +44 -0
  91. package/dist/browser/layout/app-host-width.js.map +1 -0
  92. package/dist/browser/layout/app-workspace-controller.js +331 -45
  93. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  94. package/dist/browser/layout/app-workspace-width.js +26 -0
  95. package/dist/browser/layout/app-workspace-width.js.map +1 -0
  96. package/dist/browser/layout/index.js +2 -1
  97. package/dist/browser/layout/index.js.map +1 -1
  98. package/dist/browser/surfaces/Placeholder.js +36 -13
  99. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  100. package/dist/licenses/maplibre-gl.txt +116 -0
  101. package/dist/ssr/actions/Dropdown.js +5 -2
  102. package/dist/ssr/actions/Dropdown.js.map +1 -1
  103. package/dist/ssr/actions/FilterChip.js +59 -7
  104. package/dist/ssr/actions/FilterChip.js.map +1 -1
  105. package/dist/ssr/actions/SegmentedControl.js +1 -2
  106. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  107. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  108. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  109. package/dist/ssr/actions/Tabs.js +2 -2
  110. package/dist/ssr/actions/Tabs.js.map +1 -1
  111. package/dist/ssr/actions/Toolbar.js +2 -0
  112. package/dist/ssr/actions/Toolbar.js.map +1 -1
  113. package/dist/ssr/actions/ViewTabs.js +211 -0
  114. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  115. package/dist/ssr/actions/filter-messages.js +6 -2
  116. package/dist/ssr/actions/filter-messages.js.map +1 -1
  117. package/dist/ssr/actions/index.js +2 -1
  118. package/dist/ssr/actions/index.js.map +1 -1
  119. package/dist/ssr/chat/ChatComposer.js +546 -131
  120. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  121. package/dist/ssr/chat/ChatDecision.js +44 -19
  122. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  123. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  124. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  125. package/dist/ssr/chat/chat-messages.js +8 -0
  126. package/dist/ssr/chat/chat-messages.js.map +1 -1
  127. package/dist/ssr/chat/command-search.js +26 -15
  128. package/dist/ssr/chat/command-search.js.map +1 -1
  129. package/dist/ssr/chat/index.js +4 -2
  130. package/dist/ssr/chat/index.js.map +1 -1
  131. package/dist/ssr/content/Calendar.js +109 -100
  132. package/dist/ssr/content/Calendar.js.map +1 -1
  133. package/dist/ssr/content/CalendarWeekView.js +42 -28
  134. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  135. package/dist/ssr/content/DataTable.js +78 -31
  136. package/dist/ssr/content/DataTable.js.map +1 -1
  137. package/dist/ssr/content/MapAttribution.js +19 -0
  138. package/dist/ssr/content/MapAttribution.js.map +1 -0
  139. package/dist/ssr/content/MapView.js +474 -0
  140. package/dist/ssr/content/MapView.js.map +1 -0
  141. package/dist/ssr/content/MapViewFrame.js +193 -0
  142. package/dist/ssr/content/MapViewFrame.js.map +1 -0
  143. package/dist/ssr/content/data-table-messages.js +4 -2
  144. package/dist/ssr/content/data-table-messages.js.map +1 -1
  145. package/dist/ssr/content/index.js +5 -0
  146. package/dist/ssr/content/index.js.map +1 -1
  147. package/dist/ssr/content/map-palette.js +39 -0
  148. package/dist/ssr/content/map-palette.js.map +1 -0
  149. package/dist/ssr/content/map-style.js +276 -0
  150. package/dist/ssr/content/map-style.js.map +1 -0
  151. package/dist/ssr/content/map-view-geometry.js +269 -0
  152. package/dist/ssr/content/map-view-geometry.js.map +1 -0
  153. package/dist/ssr/content/map-view-live.js +1 -0
  154. package/dist/ssr/content/map-view-messages.js +53 -0
  155. package/dist/ssr/content/map-view-messages.js.map +1 -0
  156. package/dist/ssr/content/map-view-types.js +2 -0
  157. package/dist/ssr/content/map-view-types.js.map +1 -0
  158. package/dist/ssr/feedback/MovedHint.js +166 -0
  159. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  160. package/dist/ssr/feedback/dialog-core.js +85 -9
  161. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  162. package/dist/ssr/feedback/index.js +1 -0
  163. package/dist/ssr/feedback/index.js.map +1 -1
  164. package/dist/ssr/feedback/prompts.js +6 -1
  165. package/dist/ssr/feedback/prompts.js.map +1 -1
  166. package/dist/ssr/inputs/DatePicker.js +138 -69
  167. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  168. package/dist/ssr/inputs/date-picker.js +59 -5
  169. package/dist/ssr/inputs/date-picker.js.map +1 -1
  170. package/dist/ssr/intl/messages.js +12 -0
  171. package/dist/ssr/intl/messages.js.map +1 -1
  172. package/dist/ssr/intl/weekend.js +39 -0
  173. package/dist/ssr/intl/weekend.js.map +1 -0
  174. package/dist/ssr/layout/AppOverview.js +0 -1
  175. package/dist/ssr/layout/AppOverview.js.map +1 -1
  176. package/dist/ssr/layout/AppWorkspace.js +216 -44
  177. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  178. package/dist/ssr/layout/PageTitle.js +3 -2
  179. package/dist/ssr/layout/PageTitle.js.map +1 -1
  180. package/dist/ssr/layout/SettingsModal.js +2 -2
  181. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  182. package/dist/ssr/layout/SidebarSwitcher.js +13 -12
  183. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  184. package/dist/ssr/layout/TabBar.js +1 -1
  185. package/dist/ssr/layout/TabBar.js.map +1 -1
  186. package/dist/ssr/layout/app-host-width.js +44 -0
  187. package/dist/ssr/layout/app-host-width.js.map +1 -0
  188. package/dist/ssr/layout/app-workspace-controller.js +331 -45
  189. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  190. package/dist/ssr/layout/app-workspace-width.js +26 -0
  191. package/dist/ssr/layout/app-workspace-width.js.map +1 -0
  192. package/dist/ssr/layout/index.js +2 -1
  193. package/dist/ssr/layout/index.js.map +1 -1
  194. package/dist/ssr/surfaces/Placeholder.js +24 -7
  195. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  196. package/dist/styles.css +1 -1
  197. package/dist/types/actions/Dropdown.d.ts +4 -0
  198. package/dist/types/actions/FilterChip.d.ts +22 -0
  199. package/dist/types/actions/ViewTabs.d.ts +30 -0
  200. package/dist/types/actions/filter-messages.d.ts +2 -0
  201. package/dist/types/actions/index.d.ts +4 -2
  202. package/dist/types/chat/ChatComposer.d.ts +52 -0
  203. package/dist/types/chat/ChatDecision.d.ts +18 -2
  204. package/dist/types/chat/ChatPrimitives.d.ts +10 -0
  205. package/dist/types/chat/chat-messages.d.ts +4 -0
  206. package/dist/types/chat/command-search.d.ts +2 -0
  207. package/dist/types/chat/index.d.ts +9 -8
  208. package/dist/types/content/DataTable.d.ts +3 -0
  209. package/dist/types/content/MapAttribution.d.ts +6 -0
  210. package/dist/types/content/MapView.d.ts +5 -0
  211. package/dist/types/content/MapViewFrame.d.ts +31 -0
  212. package/dist/types/content/data-table-messages.d.ts +1 -0
  213. package/dist/types/content/index.d.ts +6 -0
  214. package/dist/types/content/map-palette.d.ts +58 -0
  215. package/dist/types/content/map-style.d.ts +29 -0
  216. package/dist/types/content/map-view-geometry.d.ts +55 -0
  217. package/dist/types/content/map-view-live.d.ts +2 -0
  218. package/dist/types/content/map-view-messages.d.ts +21 -0
  219. package/dist/types/content/map-view-types.d.ts +61 -0
  220. package/dist/types/feedback/MovedHint.d.ts +25 -0
  221. package/dist/types/feedback/dialog-core.d.ts +6 -2
  222. package/dist/types/feedback/index.d.ts +2 -0
  223. package/dist/types/feedback/prompts.d.ts +2 -0
  224. package/dist/types/inputs/DatePicker.d.ts +7 -0
  225. package/dist/types/inputs/date-picker.d.ts +25 -1
  226. package/dist/types/intl/messages.d.ts +6 -0
  227. package/dist/types/intl/weekend.d.ts +12 -0
  228. package/dist/types/layout/AppWorkspace.d.ts +48 -8
  229. package/dist/types/layout/app-host-width.d.ts +6 -0
  230. package/dist/types/layout/app-workspace-width.d.ts +13 -0
  231. package/dist/types/layout/index.d.ts +3 -2
  232. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  233. package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
  234. package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
  235. package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
  236. package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
  237. package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
  238. package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
  239. package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
  240. package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
  241. package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
  242. package/map-glyphs/OFL.txt +93 -0
  243. package/package.json +11 -6
@@ -1,6 +1,7 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
3
  import { setProperty as _$setProperty } from "solid-js/web";
4
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
4
5
  import { className as _$className } from "solid-js/web";
5
6
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
6
7
  import { setAttribute as _$setAttribute } from "solid-js/web";
@@ -20,27 +21,33 @@ var _tmpl$ = /*#__PURE__*/_$template(`<button type=button class="k2b-date-trigge
20
21
  _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-date-picker><button type=button class=k2b-date-trigger aria-haspopup=dialog><i aria-hidden=true></i><span class=k2b-date-trigger__value></span><i class="ti ti-chevron-down k2b-date-trigger__chevron"aria-hidden=true></i></button><!$><!/><div class=k2b-date-popover popover=auto role=dialog><!$><!/><!$><!/>`),
21
22
  _tmpl$6 = /*#__PURE__*/_$template(`<aside class=k2b-date-presets>`),
22
23
  _tmpl$7 = /*#__PURE__*/_$template(`<button type=button>`),
23
- _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-date-weekdays aria-hidden=true>`),
24
- _tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-date-grid role=grid>`),
24
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-date-weekdays aria-hidden=true><!$><!/><!$><!/>`),
25
+ _tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-date-grid role=grid><!$><!/><!$><!/>`),
25
26
  _tmpl$0 = /*#__PURE__*/_$template(`<section class=k2b-date-calendar><header class=k2b-date-calendar__header><button type=button class=k2b-date-calendar__nav><i class="ti ti-chevron-left"aria-hidden=true></i></button><button type=button class=k2b-date-calendar__title></button><button type=button class=k2b-date-calendar__nav><i class="ti ti-chevron-right"aria-hidden=true></i></button></header><!$><!/>`),
26
27
  _tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-date-months role=group>`),
27
- _tmpl$10 = /*#__PURE__*/_$template(`<span>`),
28
- _tmpl$11 = /*#__PURE__*/_$template(`<div class=k2b-date-week role=row>`),
29
- _tmpl$12 = /*#__PURE__*/_$template(`<button type=button role=gridcell>`),
30
- _tmpl$13 = /*#__PURE__*/_$template(`<label class=k2b-date-time><!$><!/><span class=k2b-date-time__control><input type=text inputmode=numeric placeholder=09:00><i class="ti ti-clock"aria-hidden=true>`),
31
- _tmpl$14 = /*#__PURE__*/_$template(`<div class=k2b-date-popover__body><!$><!/><!$><!/>`),
32
- _tmpl$15 = /*#__PURE__*/_$template(`<div class=k2b-date-actions><!$><!/><button type=button class=k2b-date-apply>`),
33
- _tmpl$16 = /*#__PURE__*/_$template(`<span class=k2b-date-range-value><span></span><i class="ti ti-arrow-narrow-right"aria-hidden=true></i><span>`),
34
- _tmpl$17 = /*#__PURE__*/_$template(`<span class=k2b-date-duration><i class="ti ti-hourglass-low"aria-hidden=true></i><!$><!/>`),
35
- _tmpl$18 = /*#__PURE__*/_$template(`<div class=k2b-date-range-times><!$><!/><!$><!/>`),
36
- _tmpl$19 = /*#__PURE__*/_$template(`<div class=k2b-date-durations role=group>`);
28
+ _tmpl$10 = /*#__PURE__*/_$template(`<span class=k2b-date-weekend>`),
29
+ _tmpl$11 = /*#__PURE__*/_$template(`<span>`),
30
+ _tmpl$12 = /*#__PURE__*/_$template(`<span class=k2b-date-weekend aria-hidden=true>`),
31
+ _tmpl$13 = /*#__PURE__*/_$template(`<div class=k2b-date-week role=row>`),
32
+ _tmpl$14 = /*#__PURE__*/_$template(`<button type=button role=gridcell>`),
33
+ _tmpl$15 = /*#__PURE__*/_$template(`<label class=k2b-date-time><!$><!/><span class=k2b-date-time__control><input type=text inputmode=numeric placeholder=09:00><i class="ti ti-clock"aria-hidden=true>`),
34
+ _tmpl$16 = /*#__PURE__*/_$template(`<div class=k2b-date-popover__body><!$><!/><!$><!/>`),
35
+ _tmpl$17 = /*#__PURE__*/_$template(`<button type=button class=k2b-date-optional-time__remove><i class="ti ti-x"aria-hidden=true>`),
36
+ _tmpl$18 = /*#__PURE__*/_$template(`<div class=k2b-date-optional-time>`),
37
+ _tmpl$19 = /*#__PURE__*/_$template(`<div class=k2b-date-actions><!$><!/><button type=button class=k2b-date-apply>`),
38
+ _tmpl$20 = /*#__PURE__*/_$template(`<button type=button class=k2b-date-optional-time__add><i class="ti ti-clock-plus"aria-hidden=true></i><!$><!/>`),
39
+ _tmpl$21 = /*#__PURE__*/_$template(`<span class=k2b-date-range-value><span></span><i class="ti ti-arrow-narrow-right"aria-hidden=true></i><span>`),
40
+ _tmpl$22 = /*#__PURE__*/_$template(`<span class=k2b-date-duration><i class="ti ti-hourglass-low"aria-hidden=true></i><!$><!/>`),
41
+ _tmpl$23 = /*#__PURE__*/_$template(`<div class=k2b-date-range-times><!$><!/><!$><!/>`),
42
+ _tmpl$24 = /*#__PURE__*/_$template(`<div class=k2b-date-durations role=group>`);
37
43
  import { dates } from "@k2b/stdlib";
38
44
  import { createEffect, createMemo, createSignal, For, onCleanup, onMount, Show } from "solid-js";
39
45
  import { createFieldMeta, Field, fieldControlAria, fieldDescribedBy } from "../internal/field";
40
46
  import { returnFocus, ringOnReturn } from "../internal/focus-return";
41
47
  import { useDateConfigLocale } from "../intl/locale";
42
48
  import { resolveUiMessages, useUiMessages } from "../intl/messages";
43
- import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, orderedRange, parseDateValue, pickerContext, previewRange, resolveFocusDay, splitDateTime, toDateTimeValue, yearMonth } from "./date-picker";
49
+ import { isWeekendKey } from "../intl/weekend";
50
+ import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isDateKey, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, parseDateValue, pickerContext, pickRangeDay, previewRange, rangeAnchor, resolveFocusDay, splitDateTime, toDateTimeValue, weekendBands, yearMonth } from "./date-picker";
44
51
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
45
52
  const popoverIsOpen = popover => {
46
53
  if (!popover) return false;
@@ -375,6 +382,9 @@ function DatePickerPanel(props) {
375
382
  document.addEventListener("visibilitychange", refresh);
376
383
  onCleanup(() => document.removeEventListener("visibilitychange", refresh));
377
384
  });
385
+ // The weekend columns of the locale, read from the first week so they follow the grid's first day of the week.
386
+ const weekendColumns = createMemo(() => (dayRows()[0] ?? []).map(cell => isWeekendKey(cell.key, context().locale)));
387
+ const bands = createMemo(() => weekendBands(weekendColumns()));
378
388
  let calendar;
379
389
  // Days that belong to the visible month; the roving tabindex must land on one
380
390
  // of them or the grid becomes unreachable by keyboard after month navigation.
@@ -423,8 +433,8 @@ function DatePickerPanel(props) {
423
433
  _el$29 = _el$28.firstChild,
424
434
  _el$30 = _el$29.nextSibling,
425
435
  _el$31 = _el$30.nextSibling,
426
- _el$34 = _el$28.nextSibling,
427
- [_el$35, _co$8] = _$getNextMarker(_el$34.nextSibling);
436
+ _el$42 = _el$28.nextSibling,
437
+ [_el$43, _co$10] = _$getNextMarker(_el$42.nextSibling);
428
438
  var _ref$3 = calendar;
429
439
  typeof _ref$3 === "function" ? _$use(_ref$3, _el$27) : calendar = _el$27;
430
440
  _el$29.$$click = () => view() === "days" ? moveMonth(-1) : moveYear(-1);
@@ -447,61 +457,99 @@ function DatePickerPanel(props) {
447
457
  },
448
458
  get fallback() {
449
459
  return (() => {
450
- var _el$36 = _$getNextElement(_tmpl$1);
451
- _$insert(_el$36, _$createComponent(For, {
460
+ var _el$44 = _$getNextElement(_tmpl$1);
461
+ _$insert(_el$44, _$createComponent(For, {
452
462
  get each() {
453
463
  return months();
454
464
  },
455
465
  children: (name, index) => (() => {
456
- var _el$37 = _$getNextElement(_tmpl$7);
457
- _el$37.$$click = () => {
466
+ var _el$45 = _$getNextElement(_tmpl$7);
467
+ _el$45.$$click = () => {
458
468
  props.setVisibleMonth(monthDate(month().year, index(), context()));
459
469
  setView("days");
460
470
  };
461
- _$insert(_el$37, name);
471
+ _$insert(_el$45, name);
462
472
  _$effect(_p$ => {
463
473
  var _v$0 = index() === month().month,
464
474
  _v$1 = index() === month().month ? "true" : undefined;
465
- _v$0 !== _p$.e && _$setAttribute(_el$37, "aria-pressed", _p$.e = _v$0);
466
- _v$1 !== _p$.t && _$setAttribute(_el$37, "data-selected", _p$.t = _v$1);
475
+ _v$0 !== _p$.e && _$setAttribute(_el$45, "aria-pressed", _p$.e = _v$0);
476
+ _v$1 !== _p$.t && _$setAttribute(_el$45, "data-selected", _p$.t = _v$1);
467
477
  return _p$;
468
478
  }, {
469
479
  e: undefined,
470
480
  t: undefined
471
481
  });
472
482
  _$runHydrationEvents();
473
- return _el$37;
483
+ return _el$45;
474
484
  })()
475
485
  }));
476
- _$effect(() => _$setAttribute(_el$36, "aria-label", `Months in ${month().year}`));
477
- return _el$36;
486
+ _$effect(() => _$setAttribute(_el$44, "aria-label", `Months in ${month().year}`));
487
+ return _el$44;
478
488
  })();
479
489
  },
480
490
  get children() {
481
491
  return [(() => {
482
- var _el$32 = _$getNextElement(_tmpl$8);
492
+ var _el$32 = _$getNextElement(_tmpl$8),
493
+ _el$33 = _el$32.firstChild,
494
+ [_el$34, _co$8] = _$getNextMarker(_el$33.nextSibling),
495
+ _el$35 = _el$34.nextSibling,
496
+ [_el$36, _co$9] = _$getNextMarker(_el$35.nextSibling);
497
+ _$insert(_el$32, _$createComponent(For, {
498
+ get each() {
499
+ return bands();
500
+ },
501
+ children: band => (() => {
502
+ var _el$46 = _$getNextElement(_tmpl$10);
503
+ _$effect(_$p => _$setStyleProperty(_el$46, "grid-column", `${band.start + 1} / span ${band.span}`));
504
+ return _el$46;
505
+ })()
506
+ }), _el$34, _co$8);
483
507
  _$insert(_el$32, _$createComponent(For, {
484
508
  get each() {
485
509
  return weekdays();
486
510
  },
487
- children: day => (() => {
488
- var _el$38 = _$getNextElement(_tmpl$10);
489
- _$insert(_el$38, day);
490
- return _el$38;
511
+ children: (day, index) => (() => {
512
+ var _el$47 = _$getNextElement(_tmpl$11);
513
+ _$insert(_el$47, day);
514
+ _$effect(() => _$setAttribute(_el$47, "data-weekend", weekendColumns()[index()] ? "true" : undefined));
515
+ return _el$47;
491
516
  })()
492
- }));
517
+ }), _el$36, _co$9);
493
518
  return _el$32;
494
519
  })(), (() => {
495
- var _el$33 = _$getNextElement(_tmpl$9);
496
- _$insert(_el$33, _$createComponent(For, {
520
+ var _el$37 = _$getNextElement(_tmpl$9),
521
+ _el$38 = _el$37.firstChild,
522
+ [_el$39, _co$0] = _$getNextMarker(_el$38.nextSibling),
523
+ _el$40 = _el$39.nextSibling,
524
+ [_el$41, _co$1] = _$getNextMarker(_el$40.nextSibling);
525
+ _$insert(_el$37, _$createComponent(For, {
526
+ get each() {
527
+ return bands();
528
+ },
529
+ children: band => (() => {
530
+ var _el$48 = _$getNextElement(_tmpl$12);
531
+ _$effect(_p$ => {
532
+ var _v$10 = `${band.start + 1} / span ${band.span}`,
533
+ _v$11 = `1 / span ${dayRows().length}`;
534
+ _v$10 !== _p$.e && _$setStyleProperty(_el$48, "grid-column", _p$.e = _v$10);
535
+ _v$11 !== _p$.t && _$setStyleProperty(_el$48, "grid-row", _p$.t = _v$11);
536
+ return _p$;
537
+ }, {
538
+ e: undefined,
539
+ t: undefined
540
+ });
541
+ return _el$48;
542
+ })()
543
+ }), _el$39, _co$0);
544
+ _$insert(_el$37, _$createComponent(For, {
497
545
  get each() {
498
546
  return dayRows();
499
547
  },
500
548
  children: week => (() => {
501
- var _el$39 = _$getNextElement(_tmpl$11);
502
- _$insert(_el$39, _$createComponent(For, {
549
+ var _el$49 = _$getNextElement(_tmpl$13);
550
+ _$insert(_el$49, _$createComponent(For, {
503
551
  each: week,
504
- children: cell => {
552
+ children: (cell, cellIndex) => {
505
553
  const selected = () => props.selected?.() === cell.key;
506
554
  const range = () => props.range?.() ?? {
507
555
  start: null,
@@ -511,36 +559,38 @@ function DatePickerPanel(props) {
511
559
  const focusable = () => cell.key === defaultFocus();
512
560
  const today = () => cell.key === todayKey();
513
561
  return (() => {
514
- var _el$40 = _$getNextElement(_tmpl$12);
515
- _el$40.addEventListener("pointerleave", () => props.onDayPreview?.(null));
516
- _el$40.addEventListener("pointerenter", () => props.onDayPreview?.(cell.key));
517
- _el$40.addEventListener("focus", () => {
562
+ var _el$50 = _$getNextElement(_tmpl$14);
563
+ _el$50.addEventListener("pointerleave", () => props.onDayPreview?.(null));
564
+ _el$50.addEventListener("pointerenter", () => props.onDayPreview?.(cell.key));
565
+ _el$50.addEventListener("focus", () => {
518
566
  setFocusedKey(cell.key);
519
567
  props.onDayPreview?.(cell.key);
520
568
  });
521
- _el$40.addEventListener("blur", () => props.onDayPreview?.(null));
522
- _el$40.$$keydown = event => handleDayKeyDown(event, cell.day);
523
- _el$40.$$click = () => props.onSelect(cell.key);
524
- _$insert(_el$40, () => cell.number);
569
+ _el$50.addEventListener("blur", () => props.onDayPreview?.(null));
570
+ _el$50.$$keydown = event => handleDayKeyDown(event, cell.day);
571
+ _el$50.$$click = () => props.onSelect(cell.key);
572
+ _$insert(_el$50, () => cell.number);
525
573
  _$effect(_p$ => {
526
- var _v$10 = cell.key,
527
- _v$11 = focusable() ? "true" : undefined,
528
- _v$12 = cell.outside ? "true" : undefined,
529
- _v$13 = inRange(cell.key, range()) && !active() ? "true" : undefined,
530
- _v$14 = today() ? "true" : undefined,
531
- _v$15 = today() ? "date" : undefined,
532
- _v$16 = today() ? todayLabel(cell.label) : cell.label,
533
- _v$17 = active(),
534
- _v$18 = focusable() ? 0 : -1;
535
- _v$10 !== _p$.e && _$setAttribute(_el$40, "data-date-day", _p$.e = _v$10);
536
- _v$11 !== _p$.t && _$setAttribute(_el$40, "data-date-focus", _p$.t = _v$11);
537
- _v$12 !== _p$.a && _$setAttribute(_el$40, "data-outside", _p$.a = _v$12);
538
- _v$13 !== _p$.o && _$setAttribute(_el$40, "data-in-range", _p$.o = _v$13);
539
- _v$14 !== _p$.i && _$setAttribute(_el$40, "data-today", _p$.i = _v$14);
540
- _v$15 !== _p$.n && _$setAttribute(_el$40, "aria-current", _p$.n = _v$15);
541
- _v$16 !== _p$.s && _$setAttribute(_el$40, "aria-label", _p$.s = _v$16);
542
- _v$17 !== _p$.h && _$setAttribute(_el$40, "aria-selected", _p$.h = _v$17);
543
- _v$18 !== _p$.r && _$setAttribute(_el$40, "tabindex", _p$.r = _v$18);
574
+ var _v$12 = cell.key,
575
+ _v$13 = focusable() ? "true" : undefined,
576
+ _v$14 = cell.outside ? "true" : undefined,
577
+ _v$15 = weekendColumns()[cellIndex()] ? "true" : undefined,
578
+ _v$16 = inRange(cell.key, range()) && !active() ? "true" : undefined,
579
+ _v$17 = today() ? "true" : undefined,
580
+ _v$18 = today() ? "date" : undefined,
581
+ _v$19 = today() ? todayLabel(cell.label) : cell.label,
582
+ _v$20 = active(),
583
+ _v$21 = focusable() ? 0 : -1;
584
+ _v$12 !== _p$.e && _$setAttribute(_el$50, "data-date-day", _p$.e = _v$12);
585
+ _v$13 !== _p$.t && _$setAttribute(_el$50, "data-date-focus", _p$.t = _v$13);
586
+ _v$14 !== _p$.a && _$setAttribute(_el$50, "data-outside", _p$.a = _v$14);
587
+ _v$15 !== _p$.o && _$setAttribute(_el$50, "data-weekend", _p$.o = _v$15);
588
+ _v$16 !== _p$.i && _$setAttribute(_el$50, "data-in-range", _p$.i = _v$16);
589
+ _v$17 !== _p$.n && _$setAttribute(_el$50, "data-today", _p$.n = _v$17);
590
+ _v$18 !== _p$.s && _$setAttribute(_el$50, "aria-current", _p$.s = _v$18);
591
+ _v$19 !== _p$.h && _$setAttribute(_el$50, "aria-label", _p$.h = _v$19);
592
+ _v$20 !== _p$.r && _$setAttribute(_el$50, "aria-selected", _p$.r = _v$20);
593
+ _v$21 !== _p$.d && _$setAttribute(_el$50, "tabindex", _p$.d = _v$21);
544
594
  return _p$;
545
595
  }, {
546
596
  e: undefined,
@@ -551,20 +601,21 @@ function DatePickerPanel(props) {
551
601
  n: undefined,
552
602
  s: undefined,
553
603
  h: undefined,
554
- r: undefined
604
+ r: undefined,
605
+ d: undefined
555
606
  });
556
607
  _$runHydrationEvents();
557
- return _el$40;
608
+ return _el$50;
558
609
  })();
559
610
  }
560
611
  }));
561
- return _el$39;
612
+ return _el$49;
562
613
  })()
563
- }));
564
- return _el$33;
614
+ }), _el$41, _co$1);
615
+ return _el$37;
565
616
  })()];
566
617
  }
567
- }), _el$35, _co$8);
618
+ }), _el$43, _co$10);
568
619
  _$effect(_p$ => {
569
620
  var _v$7 = messages().calendar,
570
621
  _v$8 = previousLabel(),
@@ -585,29 +636,29 @@ function DatePickerPanel(props) {
585
636
  function TimeInput(props) {
586
637
  const messages = useUiMessages();
587
638
  return (() => {
588
- var _el$41 = _$getNextElement(_tmpl$13),
589
- _el$45 = _el$41.firstChild,
590
- [_el$46, _co$9] = _$getNextMarker(_el$45.nextSibling),
591
- _el$43 = _el$46.nextSibling,
592
- _el$44 = _el$43.firstChild;
593
- _$insert(_el$41, _$createComponent(Show, {
639
+ var _el$51 = _$getNextElement(_tmpl$15),
640
+ _el$55 = _el$51.firstChild,
641
+ [_el$56, _co$11] = _$getNextMarker(_el$55.nextSibling),
642
+ _el$53 = _el$56.nextSibling,
643
+ _el$54 = _el$53.firstChild;
644
+ _$insert(_el$51, _$createComponent(Show, {
594
645
  get when() {
595
646
  return props.label;
596
647
  },
597
648
  get children() {
598
- var _el$42 = _$getNextElement(_tmpl$10);
599
- _$insert(_el$42, () => props.label);
600
- return _el$42;
649
+ var _el$52 = _$getNextElement(_tmpl$11);
650
+ _$insert(_el$52, () => props.label);
651
+ return _el$52;
601
652
  }
602
- }), _el$46, _co$9);
603
- _el$44.addEventListener("blur", () => props.onChange(normalizeTimeInput(props.time)));
604
- _el$44.$$input = event => props.onChange(filterTimeInput(event.currentTarget.value));
605
- _$effect(() => _$setAttribute(_el$44, "aria-label", props.label ? messages().timeLabel({
653
+ }), _el$56, _co$11);
654
+ _el$54.addEventListener("blur", () => props.onChange(normalizeTimeInput(props.time)));
655
+ _el$54.$$input = event => props.onChange(filterTimeInput(event.currentTarget.value));
656
+ _$effect(() => _$setAttribute(_el$54, "aria-label", props.label ? messages().timeLabel({
606
657
  label: props.label
607
658
  }) : messages().time));
608
- _$effect(() => _$setProperty(_el$44, "value", props.time));
659
+ _$effect(() => _$setProperty(_el$54, "value", props.time));
609
660
  _$runHydrationEvents();
610
- return _el$41;
661
+ return _el$51;
611
662
  })();
612
663
  }
613
664
  export function DatePicker(props) {
@@ -628,12 +679,12 @@ export function DatePicker(props) {
628
679
  return Boolean(props.presets?.length);
629
680
  },
630
681
  children: close => (() => {
631
- var _el$47 = _$getNextElement(_tmpl$14),
632
- _el$48 = _el$47.firstChild,
633
- [_el$49, _co$0] = _$getNextMarker(_el$48.nextSibling),
634
- _el$50 = _el$49.nextSibling,
635
- [_el$51, _co$1] = _$getNextMarker(_el$50.nextSibling);
636
- _$insert(_el$47, _$createComponent(PresetRail, {
682
+ var _el$57 = _$getNextElement(_tmpl$16),
683
+ _el$58 = _el$57.firstChild,
684
+ [_el$59, _co$12] = _$getNextMarker(_el$58.nextSibling),
685
+ _el$60 = _el$59.nextSibling,
686
+ [_el$61, _co$13] = _$getNextMarker(_el$60.nextSibling);
687
+ _$insert(_el$57, _$createComponent(PresetRail, {
637
688
  get presets() {
638
689
  return props.presets;
639
690
  },
@@ -641,8 +692,8 @@ export function DatePicker(props) {
641
692
  close();
642
693
  commitFieldValue(props, value);
643
694
  }
644
- }), _el$49, _co$0);
645
- _$insert(_el$47, _$createComponent(DatePickerPanel, {
695
+ }), _el$59, _co$12);
696
+ _$insert(_el$57, _$createComponent(DatePickerPanel, {
646
697
  visibleMonth: visibleMonth,
647
698
  setVisibleMonth: setVisibleMonth,
648
699
  selected: value,
@@ -654,8 +705,8 @@ export function DatePicker(props) {
654
705
  get dateConfig() {
655
706
  return dateConfig();
656
707
  }
657
- }), _el$51, _co$1);
658
- return _el$47;
708
+ }), _el$61, _co$13);
709
+ return _el$57;
659
710
  })()
660
711
  });
661
712
  }
@@ -664,19 +715,38 @@ export function DateTimePicker(props) {
664
715
  const value = () => resolveMaybeAccessor(props.value);
665
716
  const dateConfig = useDateConfigLocale(() => props.dateConfig);
666
717
  const parts = () => splitDateTime(value(), dateConfig());
718
+ const defaultTime = () => props.defaultTime ?? "09:00";
719
+ // Without `optionalTime` every value has a time; with it a date key has none.
720
+ const valueHasTime = () => !props.optionalTime || Boolean(value()) && !isDateKey(value());
667
721
  const [visibleMonth, setVisibleMonth] = createSignal(parseDateValue(parts().date, dateConfig()));
668
722
  const [draftDate, setDraftDate] = createSignal(parts().date);
669
- const [draftTime, setDraftTime] = createSignal(parts().time || "09:00");
670
- const valueLabel = () => formatDateTimeValue(value(), dateConfig());
723
+ const [draftTime, setDraftTime] = createSignal(parts().time || defaultTime());
724
+ const [withTime, setWithTime] = createSignal(valueHasTime());
725
+ const valueLabel = () => valueHasTime() ? formatDateTimeValue(value(), dateConfig()) : displayDate(value(), dateConfig());
726
+ let addTimeButton;
727
+ let timeField;
671
728
  const syncDraft = () => {
672
729
  const next = parts();
673
730
  setDraftDate(next.date);
674
- setDraftTime(next.time || "09:00");
731
+ setDraftTime(next.time || defaultTime());
732
+ setWithTime(valueHasTime());
675
733
  setVisibleMonth(parseDateValue(next.date, dateConfig()));
676
734
  };
735
+ const canApply = () => Boolean(draftDate()) && (!withTime() || isCompleteTime(draftTime()));
736
+ const draftValue = () => withTime() ? toDateTimeValue(draftDate(), draftTime(), dateConfig()) : draftDate() || null;
737
+ const addTime = () => {
738
+ setWithTime(true);
739
+ queueMicrotask(() => timeField?.querySelector("input")?.focus());
740
+ };
741
+ const removeTime = () => {
742
+ setWithTime(false);
743
+ queueMicrotask(() => addTimeButton?.focus());
744
+ };
677
745
  return _$createComponent(PickerShell, {
678
746
  owner: props,
679
- icon: "ti ti-calendar-time",
747
+ get icon() {
748
+ return props.optionalTime && !valueHasTime() ? "ti ti-calendar" : "ti ti-calendar-time";
749
+ },
680
750
  valueLabel: valueLabel,
681
751
  get valueContent() {
682
752
  return props.renderValue ? () => props.renderValue(value()) : undefined;
@@ -689,57 +759,118 @@ export function DateTimePicker(props) {
689
759
  get wide() {
690
760
  return Boolean(props.presets?.length);
691
761
  },
692
- children: close => [(() => {
693
- var _el$52 = _$getNextElement(_tmpl$14),
694
- _el$53 = _el$52.firstChild,
695
- [_el$54, _co$10] = _$getNextMarker(_el$53.nextSibling),
696
- _el$55 = _el$54.nextSibling,
697
- [_el$56, _co$11] = _$getNextMarker(_el$55.nextSibling);
698
- _$insert(_el$52, _$createComponent(PresetRail, {
699
- get presets() {
700
- return props.presets;
701
- },
702
- onSelect: value => {
703
- close();
704
- commitFieldValue(props, value);
705
- }
706
- }), _el$54, _co$10);
707
- _$insert(_el$52, _$createComponent(DatePickerPanel, {
708
- visibleMonth: visibleMonth,
709
- setVisibleMonth: setVisibleMonth,
710
- selected: draftDate,
711
- focusDate: draftDate,
712
- onSelect: value => {
713
- setDraftDate(value);
714
- setVisibleMonth(parseDateValue(value, dateConfig()));
715
- },
716
- get dateConfig() {
717
- return dateConfig();
718
- }
719
- }), _el$56, _co$11);
720
- return _el$52;
721
- })(), (() => {
722
- var _el$57 = _$getNextElement(_tmpl$15),
723
- _el$59 = _el$57.firstChild,
724
- [_el$60, _co$12] = _$getNextMarker(_el$59.nextSibling),
725
- _el$58 = _el$60.nextSibling;
726
- _$insert(_el$57, _$createComponent(TimeInput, {
727
- get time() {
728
- return draftTime();
729
- },
730
- onChange: setDraftTime
731
- }), _el$60, _co$12);
732
- _el$58.$$click = () => {
733
- if (!draftDate() || !isCompleteTime(draftTime())) return;
734
- const value = toDateTimeValue(draftDate(), draftTime(), dateConfig());
762
+ children: close => {
763
+ const apply = () => {
764
+ if (!canApply()) return;
765
+ const next = draftValue();
735
766
  close();
736
- commitFieldValue(props, value);
767
+ commitFieldValue(props, next);
737
768
  };
738
- _$insert(_el$58, () => messages().apply);
739
- _$effect(() => _$setProperty(_el$58, "disabled", !draftDate() || !isCompleteTime(draftTime())));
740
- _$runHydrationEvents();
741
- return _el$57;
742
- })()]
769
+ return [(() => {
770
+ var _el$62 = _$getNextElement(_tmpl$16),
771
+ _el$63 = _el$62.firstChild,
772
+ [_el$64, _co$14] = _$getNextMarker(_el$63.nextSibling),
773
+ _el$65 = _el$64.nextSibling,
774
+ [_el$66, _co$15] = _$getNextMarker(_el$65.nextSibling);
775
+ _$insert(_el$62, _$createComponent(PresetRail, {
776
+ get presets() {
777
+ return props.presets;
778
+ },
779
+ onSelect: value => {
780
+ close();
781
+ commitFieldValue(props, value);
782
+ }
783
+ }), _el$64, _co$14);
784
+ _$insert(_el$62, _$createComponent(DatePickerPanel, {
785
+ visibleMonth: visibleMonth,
786
+ setVisibleMonth: setVisibleMonth,
787
+ selected: draftDate,
788
+ focusDate: draftDate,
789
+ onSelect: value => {
790
+ setDraftDate(value);
791
+ setVisibleMonth(parseDateValue(value, dateConfig()));
792
+ // A date without a time is complete with the day, as in the date picker.
793
+ if (props.optionalTime && !withTime()) apply();
794
+ },
795
+ get dateConfig() {
796
+ return dateConfig();
797
+ }
798
+ }), _el$66, _co$15);
799
+ return _el$62;
800
+ })(), (() => {
801
+ var _el$67 = _$getNextElement(_tmpl$19),
802
+ _el$71 = _el$67.firstChild,
803
+ [_el$72, _co$16] = _$getNextMarker(_el$71.nextSibling),
804
+ _el$70 = _el$72.nextSibling;
805
+ _$insert(_el$67, _$createComponent(Show, {
806
+ get when() {
807
+ return props.optionalTime;
808
+ },
809
+ get fallback() {
810
+ return _$createComponent(TimeInput, {
811
+ get time() {
812
+ return draftTime();
813
+ },
814
+ onChange: setDraftTime
815
+ });
816
+ },
817
+ get children() {
818
+ var _el$68 = _$getNextElement(_tmpl$18);
819
+ var _ref$4 = timeField;
820
+ typeof _ref$4 === "function" ? _$use(_ref$4, _el$68) : timeField = _el$68;
821
+ _$insert(_el$68, _$createComponent(Show, {
822
+ get when() {
823
+ return withTime();
824
+ },
825
+ get fallback() {
826
+ return (() => {
827
+ var _el$73 = _$getNextElement(_tmpl$20),
828
+ _el$74 = _el$73.firstChild,
829
+ _el$75 = _el$74.nextSibling,
830
+ [_el$76, _co$17] = _$getNextMarker(_el$75.nextSibling);
831
+ _el$73.$$click = addTime;
832
+ var _ref$5 = addTimeButton;
833
+ typeof _ref$5 === "function" ? _$use(_ref$5, _el$73) : addTimeButton = _el$73;
834
+ _$insert(_el$73, () => messages().addTime, _el$76, _co$17);
835
+ _$runHydrationEvents();
836
+ return _el$73;
837
+ })();
838
+ },
839
+ get children() {
840
+ return [_$createComponent(TimeInput, {
841
+ get time() {
842
+ return draftTime();
843
+ },
844
+ onChange: setDraftTime
845
+ }), (() => {
846
+ var _el$69 = _$getNextElement(_tmpl$17);
847
+ _el$69.$$click = removeTime;
848
+ _$effect(_p$ => {
849
+ var _v$22 = messages().removeTime,
850
+ _v$23 = messages().removeTime;
851
+ _v$22 !== _p$.e && _$setAttribute(_el$69, "aria-label", _p$.e = _v$22);
852
+ _v$23 !== _p$.t && _$setAttribute(_el$69, "title", _p$.t = _v$23);
853
+ return _p$;
854
+ }, {
855
+ e: undefined,
856
+ t: undefined
857
+ });
858
+ _$runHydrationEvents();
859
+ return _el$69;
860
+ })()];
861
+ }
862
+ }));
863
+ _$effect(() => _$setAttribute(_el$68, "data-with-time", withTime() ? "true" : undefined));
864
+ return _el$68;
865
+ }
866
+ }), _el$72, _co$16);
867
+ _el$70.$$click = apply;
868
+ _$insert(_el$70, () => messages().apply);
869
+ _$effect(() => _$setProperty(_el$70, "disabled", !canApply()));
870
+ _$runHydrationEvents();
871
+ return _el$67;
872
+ })()];
873
+ }
743
874
  });
744
875
  }
745
876
  export function DateRangePicker(props) {
@@ -762,16 +893,19 @@ export function DateRangePicker(props) {
762
893
  start: parts().start.date || null,
763
894
  end: parts().end.date || null
764
895
  });
896
+ // The day of the last click that started a one-day range; the next click on another day extends from it.
897
+ const [anchor, setAnchor] = createSignal(null);
765
898
  const [previewDate, setPreviewDate] = createSignal(null);
766
899
  const [startTime, setStartTime] = createSignal(parts().start.time || "09:00");
767
900
  const [endTime, setEndTime] = createSignal(parts().end.time || "10:00");
768
- const displayRange = createMemo(() => previewRange(draftRange(), previewDate()));
901
+ const displayRange = createMemo(() => previewRange(draftRange(), anchor(), previewDate()));
769
902
  const syncDraft = () => {
770
903
  const next = parts();
771
904
  setDraftRange({
772
905
  start: next.start.date || null,
773
906
  end: next.end.date || null
774
907
  });
908
+ setAnchor(null);
775
909
  setPreviewDate(null);
776
910
  setStartTime(next.start.time || "09:00");
777
911
  setEndTime(next.end.time || "10:00");
@@ -785,31 +919,25 @@ export function DateRangePicker(props) {
785
919
  const valueContent = () => {
786
920
  const format = withTime() ? formatDateTimeValue : displayDate;
787
921
  return (() => {
788
- var _el$61 = _$getNextElement(_tmpl$16),
789
- _el$62 = _el$61.firstChild,
790
- _el$63 = _el$62.nextSibling,
791
- _el$64 = _el$63.nextSibling;
792
- _$insert(_el$62, (() => {
922
+ var _el$77 = _$getNextElement(_tmpl$21),
923
+ _el$78 = _el$77.firstChild,
924
+ _el$79 = _el$78.nextSibling,
925
+ _el$80 = _el$79.nextSibling;
926
+ _$insert(_el$78, (() => {
793
927
  var _c$ = _$memo(() => !!value().start);
794
928
  return () => _c$() ? format(value().start, dateConfig()) : messages().start;
795
929
  })());
796
- _$insert(_el$64, (() => {
930
+ _$insert(_el$80, (() => {
797
931
  var _c$2 = _$memo(() => !!value().end);
798
932
  return () => _c$2() ? format(value().end, dateConfig()) : "End";
799
933
  })());
800
- return _el$61;
934
+ return _el$77;
801
935
  })();
802
936
  };
803
937
  const selectDate = value => {
804
- const current = draftRange();
805
- if (!current.start || current.end) {
806
- setDraftRange({
807
- start: value,
808
- end: null
809
- });
810
- } else {
811
- setDraftRange(orderedRange(current.start, value));
812
- }
938
+ const next = pickRangeDay(draftRange(), anchor(), value);
939
+ setDraftRange(next.range);
940
+ setAnchor(next.anchor);
813
941
  setPreviewDate(null);
814
942
  };
815
943
  const applyDuration = minutes => {
@@ -874,12 +1002,12 @@ export function DateRangePicker(props) {
874
1002
  return durationLabel();
875
1003
  },
876
1004
  get children() {
877
- var _el$65 = _$getNextElement(_tmpl$17),
878
- _el$66 = _el$65.firstChild,
879
- _el$67 = _el$66.nextSibling,
880
- [_el$68, _co$13] = _$getNextMarker(_el$67.nextSibling);
881
- _$insert(_el$65, durationLabel, _el$68, _co$13);
882
- return _el$65;
1005
+ var _el$81 = _$getNextElement(_tmpl$22),
1006
+ _el$82 = _el$81.firstChild,
1007
+ _el$83 = _el$82.nextSibling,
1008
+ [_el$84, _co$18] = _$getNextMarker(_el$83.nextSibling);
1009
+ _$insert(_el$81, durationLabel, _el$84, _co$18);
1010
+ return _el$81;
883
1011
  }
884
1012
  }),
885
1013
  onOpen: syncDraft,
@@ -887,12 +1015,12 @@ export function DateRangePicker(props) {
887
1015
  return Boolean(props.datePresets?.length || props.presets?.length);
888
1016
  },
889
1017
  children: close => [(() => {
890
- var _el$69 = _$getNextElement(_tmpl$14),
891
- _el$70 = _el$69.firstChild,
892
- [_el$71, _co$14] = _$getNextMarker(_el$70.nextSibling),
893
- _el$72 = _el$71.nextSibling,
894
- [_el$73, _co$15] = _$getNextMarker(_el$72.nextSibling);
895
- _$insert(_el$69, _$createComponent(Show, {
1018
+ var _el$85 = _$getNextElement(_tmpl$16),
1019
+ _el$86 = _el$85.firstChild,
1020
+ [_el$87, _co$19] = _$getNextMarker(_el$86.nextSibling),
1021
+ _el$88 = _el$87.nextSibling,
1022
+ [_el$89, _co$20] = _$getNextMarker(_el$88.nextSibling);
1023
+ _$insert(_el$85, _$createComponent(Show, {
896
1024
  get when() {
897
1025
  return props.datePresets?.length;
898
1026
  },
@@ -924,33 +1052,30 @@ export function DateRangePicker(props) {
924
1052
  }
925
1053
  });
926
1054
  }
927
- }), _el$71, _co$14);
928
- _$insert(_el$69, _$createComponent(DatePickerPanel, {
1055
+ }), _el$87, _co$19);
1056
+ _$insert(_el$85, _$createComponent(DatePickerPanel, {
929
1057
  visibleMonth: visibleMonth,
930
1058
  setVisibleMonth: setVisibleMonth,
931
1059
  range: displayRange,
932
1060
  focusDate: () => draftRange().start,
933
1061
  onSelect: selectDate,
934
- onDayPreview: value => {
935
- const current = draftRange();
936
- setPreviewDate(current.start && !current.end ? value : null);
937
- },
1062
+ onDayPreview: value => setPreviewDate(rangeAnchor(draftRange(), anchor()) ? value : null),
938
1063
  get dateConfig() {
939
1064
  return dateConfig();
940
1065
  }
941
- }), _el$73, _co$15);
942
- return _el$69;
1066
+ }), _el$89, _co$20);
1067
+ return _el$85;
943
1068
  })(), _$createComponent(Show, {
944
1069
  get when() {
945
1070
  return withTime();
946
1071
  },
947
1072
  get children() {
948
- var _el$74 = _$getNextElement(_tmpl$18),
949
- _el$75 = _el$74.firstChild,
950
- [_el$76, _co$16] = _$getNextMarker(_el$75.nextSibling),
951
- _el$77 = _el$76.nextSibling,
952
- [_el$78, _co$17] = _$getNextMarker(_el$77.nextSibling);
953
- _$insert(_el$74, _$createComponent(TimeInput, {
1073
+ var _el$90 = _$getNextElement(_tmpl$23),
1074
+ _el$91 = _el$90.firstChild,
1075
+ [_el$92, _co$21] = _$getNextMarker(_el$91.nextSibling),
1076
+ _el$93 = _el$92.nextSibling,
1077
+ [_el$94, _co$22] = _$getNextMarker(_el$93.nextSibling);
1078
+ _$insert(_el$90, _$createComponent(TimeInput, {
954
1079
  get label() {
955
1080
  return messages().start;
956
1081
  },
@@ -958,8 +1083,8 @@ export function DateRangePicker(props) {
958
1083
  return startTime();
959
1084
  },
960
1085
  onChange: setStartTime
961
- }), _el$76, _co$16);
962
- _$insert(_el$74, _$createComponent(TimeInput, {
1086
+ }), _el$92, _co$21);
1087
+ _$insert(_el$90, _$createComponent(TimeInput, {
963
1088
  get label() {
964
1089
  return messages().end;
965
1090
  },
@@ -967,42 +1092,42 @@ export function DateRangePicker(props) {
967
1092
  return endTime();
968
1093
  },
969
1094
  onChange: setEndTime
970
- }), _el$78, _co$17);
971
- return _el$74;
1095
+ }), _el$94, _co$22);
1096
+ return _el$90;
972
1097
  }
973
1098
  }), (() => {
974
- var _el$79 = _$getNextElement(_tmpl$15),
975
- _el$82 = _el$79.firstChild,
976
- [_el$83, _co$18] = _$getNextMarker(_el$82.nextSibling),
977
- _el$81 = _el$83.nextSibling;
978
- _$insert(_el$79, _$createComponent(Show, {
1099
+ var _el$95 = _$getNextElement(_tmpl$19),
1100
+ _el$98 = _el$95.firstChild,
1101
+ [_el$99, _co$23] = _$getNextMarker(_el$98.nextSibling),
1102
+ _el$97 = _el$99.nextSibling;
1103
+ _$insert(_el$95, _$createComponent(Show, {
979
1104
  get when() {
980
1105
  return _$memo(() => !!withTime())() && props.durationPresets?.length;
981
1106
  },
982
1107
  get children() {
983
- var _el$80 = _$getNextElement(_tmpl$19);
984
- _$insert(_el$80, _$createComponent(For, {
1108
+ var _el$96 = _$getNextElement(_tmpl$24);
1109
+ _$insert(_el$96, _$createComponent(For, {
985
1110
  get each() {
986
1111
  return props.durationPresets;
987
1112
  },
988
1113
  children: preset => (() => {
989
- var _el$84 = _$getNextElement(_tmpl$7);
990
- _el$84.$$click = () => applyDuration(preset.minutes);
991
- _$insert(_el$84, () => preset.label);
992
- _$effect(() => _$setAttribute(_el$84, "aria-pressed", durationMinutes() === preset.minutes));
1114
+ var _el$100 = _$getNextElement(_tmpl$7);
1115
+ _el$100.$$click = () => applyDuration(preset.minutes);
1116
+ _$insert(_el$100, () => preset.label);
1117
+ _$effect(() => _$setAttribute(_el$100, "aria-pressed", durationMinutes() === preset.minutes));
993
1118
  _$runHydrationEvents();
994
- return _el$84;
1119
+ return _el$100;
995
1120
  })()
996
1121
  }));
997
- _$effect(() => _$setAttribute(_el$80, "aria-label", messages().durationPresets));
998
- return _el$80;
1122
+ _$effect(() => _$setAttribute(_el$96, "aria-label", messages().durationPresets));
1123
+ return _el$96;
999
1124
  }
1000
- }), _el$83, _co$18);
1001
- _el$81.$$click = () => commit(close);
1002
- _$insert(_el$81, () => messages().apply);
1003
- _$effect(() => _$setProperty(_el$81, "disabled", Boolean(draftRange().start) !== Boolean(draftRange().end) || Boolean(withTime() && draftRange().start && draftRange().end && (!isCompleteTime(startTime()) || !isCompleteTime(endTime())))));
1125
+ }), _el$99, _co$23);
1126
+ _el$97.$$click = () => commit(close);
1127
+ _$insert(_el$97, () => messages().apply);
1128
+ _$effect(() => _$setProperty(_el$97, "disabled", Boolean(draftRange().start) !== Boolean(draftRange().end) || Boolean(withTime() && draftRange().start && draftRange().end && (!isCompleteTime(startTime()) || !isCompleteTime(endTime())))));
1004
1129
  _$runHydrationEvents();
1005
- return _el$79;
1130
+ return _el$95;
1006
1131
  })()]
1007
1132
  });
1008
1133
  }