@vonage/vivid 4.16.2 → 4.17.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 (292) hide show
  1. package/custom-elements.json +3426 -506
  2. package/elevation/index.cjs +1 -1
  3. package/elevation/index.js +1 -1
  4. package/index.cjs +147 -39
  5. package/index.js +64 -59
  6. package/lib/accordion/definition.d.ts +2 -0
  7. package/lib/accordion-item/definition.d.ts +2 -0
  8. package/lib/action-group/definition.d.ts +2 -0
  9. package/lib/alert/definition.d.ts +2 -0
  10. package/lib/audio-player/definition.d.ts +2 -0
  11. package/lib/avatar/definition.d.ts +2 -0
  12. package/lib/badge/definition.d.ts +2 -0
  13. package/lib/banner/definition.d.ts +2 -0
  14. package/lib/breadcrumb/definition.d.ts +2 -0
  15. package/lib/breadcrumb-item/definition.d.ts +2 -0
  16. package/lib/button/definition.d.ts +2 -0
  17. package/lib/calendar/calendar.d.ts +2 -0
  18. package/lib/calendar/definition.d.ts +2 -0
  19. package/lib/calendar-event/definition.d.ts +2 -0
  20. package/lib/card/definition.d.ts +2 -0
  21. package/lib/checkbox/definition.d.ts +2 -0
  22. package/lib/combobox/definition.d.ts +2 -0
  23. package/lib/components.d.ts +1 -0
  24. package/lib/data-grid/definition.d.ts +4 -0
  25. package/lib/date-picker/definition.d.ts +2 -0
  26. package/lib/date-range-picker/definition.d.ts +2 -0
  27. package/lib/dial-pad/definition.d.ts +2 -0
  28. package/lib/dialog/definition.d.ts +2 -0
  29. package/lib/divider/definition.d.ts +2 -0
  30. package/lib/empty-state/definition.d.ts +2 -0
  31. package/lib/enums.d.ts +6 -0
  32. package/lib/fab/definition.d.ts +2 -0
  33. package/lib/file-picker/definition.d.ts +2 -0
  34. package/lib/header/definition.d.ts +2 -0
  35. package/lib/icon/definition.d.ts +2 -0
  36. package/lib/layout/definition.d.ts +2 -0
  37. package/lib/menu/definition.d.ts +2 -0
  38. package/lib/menu/menu.d.ts +454 -4
  39. package/lib/menu-item/definition.d.ts +2 -0
  40. package/lib/nav/definition.d.ts +2 -0
  41. package/lib/nav-disclosure/definition.d.ts +2 -0
  42. package/lib/nav-item/definition.d.ts +2 -0
  43. package/lib/note/definition.d.ts +2 -0
  44. package/lib/number-field/definition.d.ts +2 -0
  45. package/lib/option/definition.d.ts +2 -0
  46. package/lib/pagination/definition.d.ts +2 -0
  47. package/lib/popup/definition.d.ts +0 -1
  48. package/lib/popup/popup.d.ts +25 -0
  49. package/lib/progress/definition.d.ts +2 -0
  50. package/lib/progress-ring/definition.d.ts +2 -0
  51. package/lib/radio/definition.d.ts +2 -0
  52. package/lib/radio-group/definition.d.ts +2 -0
  53. package/lib/range-slider/definition.d.ts +2 -0
  54. package/lib/rich-text-editor/definition.d.ts +2 -0
  55. package/lib/rich-text-editor/facades/prose-mirror-vivid.schema.d.ts +2 -0
  56. package/lib/rich-text-editor/facades/vivid-prose-mirror.facade.d.ts +7 -0
  57. package/lib/rich-text-editor/rich-text-editor.d.ts +13 -0
  58. package/lib/rich-text-editor/rich-text-editor.template.d.ts +4 -0
  59. package/lib/searchable-select/definition.d.ts +2 -0
  60. package/lib/select/definition.d.ts +2 -0
  61. package/lib/selectable-box/definition.d.ts +2 -0
  62. package/lib/side-drawer/definition.d.ts +2 -0
  63. package/lib/slider/definition.d.ts +2 -0
  64. package/lib/split-button/definition.d.ts +2 -0
  65. package/lib/switch/definition.d.ts +2 -0
  66. package/lib/tab/definition.d.ts +2 -0
  67. package/lib/tab-panel/definition.d.ts +2 -0
  68. package/lib/tabs/definition.d.ts +2 -0
  69. package/lib/tag/definition.d.ts +2 -0
  70. package/lib/tag-group/definition.d.ts +2 -0
  71. package/lib/text-area/definition.d.ts +2 -0
  72. package/lib/text-field/definition.d.ts +2 -0
  73. package/lib/time-picker/definition.d.ts +2 -0
  74. package/lib/time-picker/inline-time-picker/columns.d.ts +13 -0
  75. package/lib/time-picker/inline-time-picker/definition.d.ts +1 -0
  76. package/lib/time-picker/inline-time-picker/inline-time-picker.d.ts +15 -0
  77. package/lib/time-picker/inline-time-picker/inline-time-picker.template.d.ts +5 -0
  78. package/lib/time-picker/time-picker.template.d.ts +1 -2
  79. package/lib/toggletip/definition.d.ts +2 -0
  80. package/lib/toggletip/toggletip.d.ts +454 -4
  81. package/lib/tooltip/definition.d.ts +2 -0
  82. package/lib/tooltip/tooltip.d.ts +454 -4
  83. package/lib/tree-item/definition.d.ts +2 -0
  84. package/lib/tree-view/definition.d.ts +2 -0
  85. package/lib/video-player/definition.d.ts +2 -0
  86. package/menu/index.js +1 -1
  87. package/package.json +7 -2
  88. package/popup/index.cjs +1 -1
  89. package/popup/index.js +1 -1
  90. package/rich-text-editor/index.cjs +5 -0
  91. package/rich-text-editor/index.js +3 -0
  92. package/searchable-select/index.cjs +1 -1
  93. package/searchable-select/index.js +1 -1
  94. package/select/index.cjs +1 -1
  95. package/select/index.js +1 -1
  96. package/selectable-box/index.cjs +1 -1
  97. package/selectable-box/index.js +1 -1
  98. package/shared/affix.cjs +1 -3
  99. package/shared/affix.js +2 -4
  100. package/shared/anchored.cjs +12 -9
  101. package/shared/anchored.js +13 -10
  102. package/shared/definition.js +1 -1
  103. package/shared/definition10.cjs +1 -0
  104. package/shared/definition10.js +2 -2
  105. package/shared/definition11.cjs +1 -1
  106. package/shared/definition11.js +2 -2
  107. package/shared/definition12.cjs +1 -1
  108. package/shared/definition12.js +2 -2
  109. package/shared/definition13.cjs +15 -2
  110. package/shared/definition13.js +16 -4
  111. package/shared/definition14.cjs +3 -2
  112. package/shared/definition14.js +4 -4
  113. package/shared/definition15.cjs +1 -1
  114. package/shared/definition15.js +2 -2
  115. package/shared/definition16.cjs +18 -18
  116. package/shared/definition16.js +6 -6
  117. package/shared/definition17.cjs +3 -0
  118. package/shared/definition17.js +2 -2
  119. package/shared/definition18.cjs +7 -7
  120. package/shared/definition18.js +4 -4
  121. package/shared/definition19.cjs +15 -15
  122. package/shared/definition19.js +4 -4
  123. package/shared/definition2.cjs +1 -0
  124. package/shared/definition2.js +2 -2
  125. package/shared/definition20.cjs +5 -4
  126. package/shared/definition20.js +6 -6
  127. package/shared/definition21.cjs +3 -2
  128. package/shared/definition21.js +4 -4
  129. package/shared/definition22.js +1 -1
  130. package/shared/definition23.cjs +2 -1
  131. package/shared/definition23.js +3 -3
  132. package/shared/definition24.cjs +2 -1
  133. package/shared/definition24.js +3 -3
  134. package/shared/definition25.cjs +14 -14
  135. package/shared/definition25.js +3 -3
  136. package/shared/definition26.cjs +2 -1
  137. package/shared/definition26.js +3 -3
  138. package/shared/definition27.cjs +1 -1
  139. package/shared/definition27.js +2 -2
  140. package/shared/definition28.cjs +1 -0
  141. package/shared/definition28.js +2 -2
  142. package/shared/definition29.cjs +53 -61
  143. package/shared/definition29.js +54 -63
  144. package/shared/definition3.cjs +1 -0
  145. package/shared/definition3.js +2 -2
  146. package/shared/definition30.cjs +1 -0
  147. package/shared/definition30.js +2 -2
  148. package/shared/definition31.cjs +1 -0
  149. package/shared/definition31.js +2 -2
  150. package/shared/definition32.cjs +1 -0
  151. package/shared/definition32.js +2 -2
  152. package/shared/definition33.cjs +2 -1
  153. package/shared/definition33.js +3 -3
  154. package/shared/definition34.cjs +25 -25
  155. package/shared/definition34.js +5 -5
  156. package/shared/definition35.cjs +1 -1
  157. package/shared/definition35.js +2 -2
  158. package/shared/definition36.cjs +2 -1
  159. package/shared/definition36.js +3 -3
  160. package/shared/definition37.cjs +1 -1
  161. package/shared/definition37.js +2 -2
  162. package/shared/definition38.cjs +2 -1
  163. package/shared/definition38.js +3 -3
  164. package/shared/definition39.cjs +1 -0
  165. package/shared/definition39.js +2 -2
  166. package/shared/definition4.cjs +3 -2
  167. package/shared/definition4.js +4 -4
  168. package/shared/definition40.cjs +1 -1
  169. package/shared/definition40.js +2 -2
  170. package/shared/definition41.cjs +30 -30
  171. package/shared/definition41.js +5 -5
  172. package/shared/definition42.cjs +12538 -1052
  173. package/shared/definition42.js +12538 -1053
  174. package/shared/definition43.cjs +927 -701
  175. package/shared/definition43.js +929 -702
  176. package/shared/definition44.cjs +874 -104
  177. package/shared/definition44.js +874 -104
  178. package/shared/definition45.cjs +114 -90
  179. package/shared/definition45.js +113 -90
  180. package/shared/definition46.cjs +88 -464
  181. package/shared/definition46.js +87 -463
  182. package/shared/definition47.cjs +463 -109
  183. package/shared/definition47.js +462 -109
  184. package/shared/definition48.cjs +108 -106
  185. package/shared/definition48.js +107 -106
  186. package/shared/definition49.cjs +139 -13
  187. package/shared/definition49.js +138 -13
  188. package/shared/definition5.cjs +3 -2
  189. package/shared/definition5.js +5 -5
  190. package/shared/definition50.cjs +16 -114
  191. package/shared/definition50.js +15 -114
  192. package/shared/definition51.cjs +79 -485
  193. package/shared/definition51.js +78 -485
  194. package/shared/definition52.cjs +503 -23
  195. package/shared/definition52.js +502 -23
  196. package/shared/definition53.cjs +25 -123
  197. package/shared/definition53.js +24 -123
  198. package/shared/definition54.cjs +96 -254
  199. package/shared/definition54.js +96 -255
  200. package/shared/definition55.cjs +261 -59
  201. package/shared/definition55.js +262 -60
  202. package/shared/definition56.cjs +72 -861
  203. package/shared/definition56.js +72 -861
  204. package/shared/definition57.cjs +880 -107
  205. package/shared/definition57.js +880 -107
  206. package/shared/definition58.cjs +104 -88
  207. package/shared/definition58.js +104 -89
  208. package/shared/definition59.cjs +80 -165
  209. package/shared/definition59.js +79 -163
  210. package/shared/definition6.cjs +2 -1
  211. package/shared/definition6.js +3 -3
  212. package/shared/definition60.cjs +142 -228
  213. package/shared/definition60.js +141 -229
  214. package/shared/definition61.cjs +233 -70146
  215. package/shared/definition61.js +232 -70146
  216. package/shared/definition62.cjs +69381 -28
  217. package/shared/definition62.js +69380 -27
  218. package/shared/definition63.cjs +28 -2163
  219. package/shared/definition63.js +27 -2161
  220. package/shared/definition64.cjs +2195 -0
  221. package/shared/definition64.js +2190 -0
  222. package/shared/definition7.cjs +2 -1
  223. package/shared/definition7.js +3 -3
  224. package/shared/definition8.cjs +2 -1
  225. package/shared/definition8.js +3 -3
  226. package/shared/definition9.cjs +1 -1
  227. package/shared/definition9.js +2 -2
  228. package/shared/enums.cjs +8 -0
  229. package/shared/enums.js +8 -1
  230. package/shared/form-associated.js +1 -1
  231. package/shared/form-elements.cjs +7 -7
  232. package/shared/form-elements.js +8 -8
  233. package/shared/foundation/vivid-element/vivid-element.d.ts +1 -0
  234. package/shared/patterns/anchored.d.ts +891 -10
  235. package/shared/patterns/trapped-focus.d.ts +2 -0
  236. package/shared/presentationDate.cjs +5 -7
  237. package/shared/presentationDate.js +5 -7
  238. package/shared/slider.template.cjs +4 -4
  239. package/shared/slider.template.js +4 -4
  240. package/shared/text-anchor.template.cjs +2 -2
  241. package/shared/text-anchor.template.js +2 -2
  242. package/shared/text-field.cjs +555 -2
  243. package/shared/text-field.js +554 -2
  244. package/shared/text-field2.cjs +2 -572
  245. package/shared/text-field2.js +2 -571
  246. package/shared/trapped-focus.cjs +7 -1
  247. package/shared/trapped-focus.js +7 -1
  248. package/shared/utils/mixins.d.ts +3 -0
  249. package/shared/vivid-element.cjs +3 -0
  250. package/shared/vivid-element.js +4 -1
  251. package/side-drawer/index.cjs +1 -1
  252. package/side-drawer/index.js +1 -1
  253. package/slider/index.cjs +1 -1
  254. package/slider/index.js +1 -1
  255. package/split-button/index.cjs +1 -1
  256. package/split-button/index.js +1 -1
  257. package/styles/core/all.css +1 -1
  258. package/styles/core/theme.css +1 -1
  259. package/styles/core/typography.css +1 -1
  260. package/styles/tokens/theme-dark.css +4 -4
  261. package/styles/tokens/theme-light.css +4 -4
  262. package/styles/tokens/vivid-2-compat.css +1 -1
  263. package/switch/index.cjs +1 -1
  264. package/switch/index.js +1 -1
  265. package/tab/index.cjs +1 -1
  266. package/tab/index.js +1 -1
  267. package/tab-panel/index.cjs +1 -1
  268. package/tab-panel/index.js +1 -1
  269. package/tabs/index.cjs +1 -1
  270. package/tabs/index.js +1 -1
  271. package/tag/index.cjs +1 -1
  272. package/tag/index.js +1 -1
  273. package/tag-group/index.cjs +1 -1
  274. package/tag-group/index.js +1 -1
  275. package/text-anchor/index.js +1 -1
  276. package/text-area/index.cjs +1 -1
  277. package/text-area/index.js +1 -1
  278. package/text-field/index.cjs +1 -1
  279. package/text-field/index.js +1 -1
  280. package/time-picker/index.cjs +1 -1
  281. package/time-picker/index.js +1 -1
  282. package/toggletip/index.cjs +1 -1
  283. package/toggletip/index.js +1 -1
  284. package/tooltip/index.cjs +1 -1
  285. package/tooltip/index.js +1 -1
  286. package/tree-item/index.cjs +1 -1
  287. package/tree-item/index.js +1 -1
  288. package/tree-view/index.cjs +1 -1
  289. package/tree-view/index.js +1 -1
  290. package/video-player/index.cjs +1 -1
  291. package/video-player/index.js +1 -1
  292. package/vivid.api.json +22795 -1
@@ -1,164 +1,937 @@
1
- import { P as Popup, p as popupDefinition } from './definition63.js';
2
- import { V as VividElement, a as attr, D as DOM, h as html, d as defineVividComponent, f as createRegisterFunction } from './vivid-element.js';
3
- import { a as anchored, b as anchorSlotTemplateFactory } from './anchored.js';
1
+ import { t as textFieldDefinition } from './definition56.js';
2
+ import { P as Popup, p as popupDefinition } from './definition64.js';
3
+ import { B as Button, b as buttonDefinition } from './definition11.js';
4
+ import { V as VividElement, O as Observable, i as defaultExecutionContext, D as DOM, a as attr, n as nullableNumberConverter, v as volatile, o as observable, h as html, f as defineVividComponent, d as createRegisterFunction } from './vivid-element.js';
5
+ import { a as applyMixinsWithObservables } from './applyMixinsWithObservables.js';
4
6
  import { h as handleEscapeKeyAndStopPropogation } from './index.js';
7
+ import { F as FormAssociated } from './form-associated.js';
8
+ import { T as TrappedFocus } from './trapped-focus.js';
9
+ import { a as FormElementHelperText, e as errorText, f as formElements } from './form-elements.js';
10
+ import { L as Localized } from './localized.js';
11
+ import { T as TextField } from './text-field.js';
12
+ import { s as scrollIntoView } from './scrollIntoView.js';
5
13
  import { w as when } from './when.js';
14
+ import { r as repeat } from './repeat.js';
6
15
  import { c as classNames } from './class-names.js';
16
+ import { r as ref } from './ref.js';
17
+ import { s as slotted } from './slotted.js';
7
18
 
8
- const styles = ":host :host{display:var(--_popup-display, inline)}:host :host([slotted-anchor]){--_popup-display: contents}.content-wrapper{width:var(--toggletip-inline-size, auto);padding:16px;max-inline-size:var(--toggletip-max-inline-size, 30ch)}.headline{font:var(--vvd-typography-base-bold)}.action-items{display:flex;justify-content:flex-end;gap:10px}::slotted([slot=action-items]){margin-block-start:16px}";
19
+ const styles$1 = ":host{display:inline-block}.base,.control{inline-size:100%}.dialog{display:inline-flex;flex-direction:column}.dialog .footer{display:flex;align-items:center;justify-content:flex-end;padding:8px;border-top:1px solid var(--vvd-color-neutral-200);gap:8px}.time-pickers{display:flex;overflow:hidden;justify-content:center;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .item{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .item{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .item:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .item:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .item:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}.time-pickers .item{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}";
9
20
 
10
- var __defProp = Object.defineProperty;
21
+ class _TimePicker extends VividElement {
22
+ }
23
+ class FormAssociatedTimePicker extends FormAssociated(_TimePicker) {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.proxy = document.createElement("input");
27
+ }
28
+ }
29
+
30
+ const isValidTimeStr = (timeStr) => {
31
+ const parts = timeStr.split(":");
32
+ if (parts.length !== 3) {
33
+ return false;
34
+ }
35
+ const [hours, minutes, seconds] = parts;
36
+ if (hours.length !== 2 || minutes.length !== 2 || seconds.length !== 2) {
37
+ return false;
38
+ }
39
+ const hoursNum = parseInt(hours, 10);
40
+ const minutesNum = parseInt(minutes, 10);
41
+ const secondsNum = parseInt(seconds, 10);
42
+ if (isNaN(hoursNum) || isNaN(minutesNum) || isNaN(secondsNum)) {
43
+ return false;
44
+ }
45
+ if (hoursNum < 0 || hoursNum > 23) {
46
+ return false;
47
+ }
48
+ if (minutesNum < 0 || minutesNum > 59) {
49
+ return false;
50
+ }
51
+ if (secondsNum < 0 || secondsNum > 59) {
52
+ return false;
53
+ }
54
+ return true;
55
+ };
56
+ const parseTimePart = (partStr) => Number.parseInt(partStr, 10);
57
+ const formatTimePart = (part) => part.toString().padStart(2, "0");
58
+ const parseTimeStr = (timeStr) => {
59
+ const [hoursStr, minutesStr, secondsStr] = timeStr.split(":");
60
+ const hours = parseTimePart(hoursStr);
61
+ const minutes = parseTimePart(minutesStr);
62
+ const seconds = parseTimePart(secondsStr);
63
+ return {
64
+ hourStr: hoursStr,
65
+ hours,
66
+ minuteStr: minutesStr,
67
+ minutes,
68
+ secondStr: secondsStr,
69
+ seconds,
70
+ meridiem: hours < 12 ? "AM" : "PM"
71
+ };
72
+ };
73
+ const hoursAs12hClock = (hour) => hour % 12 || 12;
74
+
75
+ const formatPresentationTime = (timeStr, includeSeconds, use12HourClock) => {
76
+ const time = parseTimeStr(timeStr);
77
+ const hoursStr = formatTimePart(
78
+ use12HourClock ? hoursAs12hClock(time.hours) : time.hours
79
+ );
80
+ let result = `${hoursStr}:${time.minuteStr}`;
81
+ if (includeSeconds) {
82
+ result += `:${time.secondStr}`;
83
+ }
84
+ if (use12HourClock) {
85
+ result += ` ${time.meridiem}`;
86
+ }
87
+ return result;
88
+ };
89
+ const isDigit = (char) => char >= "0" && char <= "9";
90
+ const parsePresentationTime = (input, use12HourClock) => {
91
+ const cleanedInput = input.toLowerCase();
92
+ const numerals = [];
93
+ let meridiem;
94
+ for (let i = 0; i < cleanedInput.length; i++) {
95
+ const char = cleanedInput[i];
96
+ if (char === "a" && cleanedInput[i + 1] === "m") {
97
+ i++;
98
+ meridiem = "AM";
99
+ }
100
+ if (char === "p" && cleanedInput[i + 1] === "m") {
101
+ i++;
102
+ meridiem = "PM";
103
+ }
104
+ if (isDigit(char)) {
105
+ let numeral = char;
106
+ while (isDigit(cleanedInput[i + 1])) {
107
+ i++;
108
+ numeral += cleanedInput[i];
109
+ }
110
+ numerals.push(Number.parseInt(numeral, 10));
111
+ }
112
+ }
113
+ if (numerals.length === 0 || numerals.length > 3) {
114
+ throw new Error("Invalid time format");
115
+ }
116
+ if (meridiem && (numerals[0] < 1 || numerals[0] > 12)) {
117
+ throw new Error("Invalid time format");
118
+ }
119
+ if (meridiem || use12HourClock) {
120
+ if (numerals[0] === 12) {
121
+ numerals[0] = 0;
122
+ }
123
+ }
124
+ if (meridiem === "PM") {
125
+ numerals[0] = numerals[0] + 12;
126
+ }
127
+ const [hours, minutes = 0, seconds = 0] = numerals;
128
+ if (hours > 23 || minutes > 59 || seconds > 59) {
129
+ throw new Error("Invalid value");
130
+ }
131
+ return [hours, minutes, seconds].map(formatTimePart).join(":");
132
+ };
133
+
134
+ var __defProp$1 = Object.defineProperty;
11
135
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
136
  var __typeError = (msg) => {
13
137
  throw TypeError(msg);
14
138
  };
15
- var __decorateClass = (decorators, target, key, kind) => {
139
+ var __decorateClass$1 = (decorators, target, key, kind) => {
16
140
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
17
141
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
18
142
  if (decorator = decorators[i])
19
143
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
20
- if (kind && result) __defProp(target, key, result);
144
+ if (kind && result) __defProp$1(target, key, result);
21
145
  return result;
22
146
  };
23
147
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
24
148
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
25
149
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
150
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
26
151
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
27
- var _ANCHOR_ARIA_LABEL_SUFFIX, _Toggletip_instances, setupAnchor_fn, updateAnchor_fn, cleanupAnchor_fn, _openIfClosed, updateListeners_fn, _closeOnClickOutside, _closeOnEscape;
28
- let Toggletip = class extends VividElement {
152
+ var _clockChangeHandler, _clockChangeObserver, _getFocusableEls, _TimePicker_instances, updateValueDueToUserInteraction_fn, _onFocusIn, _onFocusOut, _dismissOnClickOutside, openPopupIfPossible_fn;
153
+ const ValidTimeFilter = {
154
+ fromView: (value) => {
155
+ if (value && isValidTimeStr(value)) {
156
+ return value;
157
+ }
158
+ return "";
159
+ },
160
+ toView(value) {
161
+ return value;
162
+ }
163
+ };
164
+ let TimePicker = class extends FormAssociatedTimePicker {
29
165
  constructor() {
30
- super(...arguments);
31
- __privateAdd(this, _Toggletip_instances);
32
- __privateAdd(this, _ANCHOR_ARIA_LABEL_SUFFIX, " ; Show more information");
33
- this.alternate = false;
34
- this.placement = "right";
35
- this.open = false;
36
- __privateAdd(this, _openIfClosed, () => {
37
- if (!this.open) DOM.queueUpdate(() => this.open = true);
166
+ super();
167
+ __privateAdd(this, _TimePicker_instances);
168
+ this.readOnly = false;
169
+ this.minutesStep = null;
170
+ this.secondsStep = null;
171
+ // Reformat the presentation value when the clock changes
172
+ __privateAdd(this, _clockChangeHandler, {
173
+ handleChange: () => {
174
+ if (this.value) {
175
+ this._presentationValue = formatPresentationTime(
176
+ this.value,
177
+ this._displaySeconds,
178
+ this._use12hClock
179
+ );
180
+ }
181
+ }
182
+ });
183
+ __privateAdd(this, _clockChangeObserver);
184
+ __privateAdd(this, _getFocusableEls, () => this.shadowRoot.querySelectorAll(`
185
+ #inline-time-picker,
186
+ .dialog .vwc-button:not(:disabled)
187
+ `));
188
+ __privateAdd(this, _onFocusIn, () => {
189
+ this.$emit("focus", void 0, { bubbles: false });
38
190
  });
39
- __privateAdd(this, _closeOnClickOutside, (e) => {
40
- const clickedOutside = !this.contains(e.target);
41
- const clickedOnAnchor = this._anchorEl?.contains(e.target);
42
- if (clickedOutside || clickedOnAnchor) this.open = false;
191
+ __privateAdd(this, _onFocusOut, () => {
192
+ this.$emit("blur", void 0, { bubbles: false });
43
193
  });
44
- __privateAdd(this, _closeOnEscape, (e) => {
45
- if (e.key === "Escape") {
46
- this.open = false;
194
+ this._popupOpen = false;
195
+ __privateAdd(this, _dismissOnClickOutside, (event) => {
196
+ if (!this._popupOpen) {
197
+ return;
198
+ }
199
+ const path = event.composedPath();
200
+ const elementsToIgnoreClicksOn = [this._dialogEl, this._clockButtonEl];
201
+ if (!elementsToIgnoreClicksOn.some((element) => path.includes(element))) {
202
+ this._closePopup(false);
47
203
  }
48
204
  });
205
+ this._presentationValue = "";
206
+ this.value = "";
207
+ this.min = "";
208
+ this.max = "";
209
+ this.proxy.type = "time";
210
+ this.proxy.step = "1";
49
211
  }
50
- openChanged(oldValue, newValue) {
51
- if (oldValue === void 0) return;
52
- if (newValue) {
53
- this.setAttribute("role", "status");
54
- } else {
55
- this.removeAttribute("role");
212
+ /**
213
+ * @internal
214
+ */
215
+ readOnlyChanged() {
216
+ if (this.proxy instanceof HTMLInputElement) {
217
+ this.proxy.readOnly = this.readOnly;
218
+ this.validate();
56
219
  }
57
- __privateMethod(this, _Toggletip_instances, updateListeners_fn).call(this);
58
- if (this._anchorEl) {
59
- __privateMethod(this, _Toggletip_instances, updateAnchor_fn).call(this, this._anchorEl);
220
+ }
221
+ /**
222
+ * @internal
223
+ */
224
+ minChanged(_, newMin) {
225
+ if (this.proxy instanceof HTMLInputElement) {
226
+ this.proxy.min = newMin;
227
+ this.validate();
228
+ }
229
+ }
230
+ /**
231
+ * @internal
232
+ */
233
+ maxChanged(_, newMax) {
234
+ if (this.proxy instanceof HTMLInputElement) {
235
+ this.proxy.max = newMax;
236
+ this.validate();
237
+ }
238
+ }
239
+ // --- Core ---
240
+ /**
241
+ * @internal
242
+ */
243
+ get _displaySeconds() {
244
+ return this.secondsStep !== null;
245
+ }
246
+ get _use12hClock() {
247
+ return this.clock ? this.clock === "12h" : this.locale.timePicker.defaultTo12HourClock;
248
+ }
249
+ /**
250
+ * @internal
251
+ */
252
+ valueChanged(previous, next) {
253
+ super.valueChanged(previous, next);
254
+ if (this.value) {
255
+ if (!isValidTimeStr(this.value)) {
256
+ this.value = "";
257
+ return;
258
+ }
259
+ this._presentationValue = formatPresentationTime(
260
+ this.value,
261
+ this._displaySeconds,
262
+ this._use12hClock
263
+ );
264
+ } else {
265
+ this._presentationValue = "";
60
266
  }
61
267
  }
62
268
  connectedCallback() {
63
269
  super.connectedCallback();
64
- __privateMethod(this, _Toggletip_instances, updateListeners_fn).call(this);
270
+ document.addEventListener("click", __privateGet(this, _dismissOnClickOutside));
271
+ this.addEventListener("focusin", __privateGet(this, _onFocusIn));
272
+ this.addEventListener("focusout", __privateGet(this, _onFocusOut));
273
+ __privateSet(this, _clockChangeObserver, Observable.binding(
274
+ () => this._use12hClock,
275
+ __privateGet(this, _clockChangeHandler)
276
+ ));
277
+ __privateGet(this, _clockChangeObserver).observe(this, defaultExecutionContext);
65
278
  }
66
279
  disconnectedCallback() {
67
280
  super.disconnectedCallback();
68
- __privateMethod(this, _Toggletip_instances, updateListeners_fn).call(this);
281
+ document.removeEventListener("click", __privateGet(this, _dismissOnClickOutside));
282
+ this.removeEventListener("focusin", __privateGet(this, _onFocusIn));
283
+ this.removeEventListener("focusout", __privateGet(this, _onFocusOut));
284
+ __privateGet(this, _clockChangeObserver).disconnect();
285
+ }
286
+ /**
287
+ * @internal
288
+ */
289
+ _closePopup(restoreFocusToTextField = true) {
290
+ this._popupOpen = false;
291
+ if (restoreFocusToTextField) {
292
+ this._textFieldEl.focus();
293
+ }
294
+ }
295
+ /**
296
+ * On keydown anywhere in the time picker.
297
+ * @internal
298
+ */
299
+ _onBaseKeyDown(event) {
300
+ if (this._popupOpen && handleEscapeKeyAndStopPropogation(event)) {
301
+ this._closePopup();
302
+ return false;
303
+ }
304
+ if (this._trappedFocus(event, __privateGet(this, _getFocusableEls))) {
305
+ return false;
306
+ }
307
+ return true;
308
+ }
309
+ /**
310
+ * @internal
311
+ */
312
+ _presentationValueChanged() {
313
+ this.dirtyValue = true;
314
+ this.validate();
315
+ }
316
+ /**
317
+ * @internal
318
+ */
319
+ get _textFieldPlaceholder() {
320
+ let format = "hh:mm";
321
+ if (this._displaySeconds) {
322
+ format += ":ss";
323
+ }
324
+ if (this._use12hClock) {
325
+ format += " aa";
326
+ }
327
+ return format;
328
+ }
329
+ /**
330
+ * @internal
331
+ */
332
+ _onTextFieldInput(event) {
333
+ const textField = event.currentTarget;
334
+ this._presentationValue = textField.value;
335
+ }
336
+ /**
337
+ * @internal
338
+ */
339
+ _onTextFieldChange() {
340
+ if (this._presentationValue === "") {
341
+ __privateMethod(this, _TimePicker_instances, updateValueDueToUserInteraction_fn).call(this, "");
342
+ return;
343
+ }
344
+ try {
345
+ __privateMethod(this, _TimePicker_instances, updateValueDueToUserInteraction_fn).call(this, parsePresentationTime(this._presentationValue, this._use12hClock));
346
+ } catch (_) {
347
+ return;
348
+ }
349
+ }
350
+ // --- Clock button ---
351
+ /**
352
+ * @internal
353
+ */
354
+ get _clockButtonLabel() {
355
+ if (this.value) {
356
+ return this.locale.timePicker.changeTimeLabel(
357
+ formatPresentationTime(
358
+ this.value,
359
+ this._displaySeconds,
360
+ this._use12hClock
361
+ )
362
+ );
363
+ }
364
+ return this.locale.timePicker.chooseTimeLabel;
365
+ }
366
+ /**
367
+ * @internal
368
+ */
369
+ _onClockButtonClick() {
370
+ if (this._popupOpen) {
371
+ this._closePopup();
372
+ } else {
373
+ __privateMethod(this, _TimePicker_instances, openPopupIfPossible_fn).call(this);
374
+ DOM.processUpdates();
375
+ this._inlineTimePickerEl.scrollSelectedOptionsToTop();
376
+ __privateGet(this, _getFocusableEls).call(this)[0].focus();
377
+ }
378
+ }
379
+ // --- Inline time picker ---
380
+ /**
381
+ * @internal
382
+ */
383
+ _onInlineTimePickerChange(event) {
384
+ __privateMethod(this, _TimePicker_instances, updateValueDueToUserInteraction_fn).call(this, event.detail);
385
+ }
386
+ /**
387
+ * @internal
388
+ */
389
+ _onInlineTimePickerLastColumnSelected() {
390
+ this._closePopup();
69
391
  }
392
+ // --- Dialog footer ---
70
393
  /**
71
394
  * @internal
72
395
  */
73
- _anchorElChanged(oldValue, newValue) {
74
- if (oldValue) __privateMethod(this, _Toggletip_instances, cleanupAnchor_fn).call(this, oldValue);
75
- if (newValue) __privateMethod(this, _Toggletip_instances, setupAnchor_fn).call(this, newValue);
396
+ _onOkClick() {
397
+ this._closePopup();
398
+ }
399
+ /**
400
+ * @internal
401
+ */
402
+ _onClearClick() {
403
+ __privateMethod(this, _TimePicker_instances, updateValueDueToUserInteraction_fn).call(this, "");
404
+ this._closePopup();
405
+ }
406
+ // --- Validation ---
407
+ /**
408
+ * @internal
409
+ */
410
+ validate() {
411
+ if (this.proxy) {
412
+ this.proxy.setCustomValidity(this._getCustomValidationError() ?? "");
413
+ }
414
+ super.validate(this._textFieldEl?.querySelector("input") ?? void 0);
415
+ }
416
+ /**
417
+ * @internal
418
+ */
419
+ _getCustomValidationError() {
420
+ if (this._isPresentationValueInvalid()) {
421
+ return this.locale.timePicker.invalidTimeError;
422
+ }
423
+ return null;
424
+ }
425
+ /**
426
+ * @internal
427
+ */
428
+ _isPresentationValueInvalid() {
429
+ if (this._presentationValue === "") {
430
+ return false;
431
+ }
432
+ try {
433
+ parsePresentationTime(this._presentationValue, this._use12hClock);
434
+ return false;
435
+ } catch (_) {
436
+ return true;
437
+ }
438
+ }
439
+ };
440
+ _clockChangeHandler = new WeakMap();
441
+ _clockChangeObserver = new WeakMap();
442
+ _getFocusableEls = new WeakMap();
443
+ _TimePicker_instances = new WeakSet();
444
+ updateValueDueToUserInteraction_fn = function(newValue) {
445
+ this.value = newValue;
446
+ this.$emit("change");
447
+ this.$emit("input");
448
+ };
449
+ _onFocusIn = new WeakMap();
450
+ _onFocusOut = new WeakMap();
451
+ _dismissOnClickOutside = new WeakMap();
452
+ openPopupIfPossible_fn = function() {
453
+ if (!this.readOnly) {
454
+ this._popupOpen = true;
455
+ }
456
+ };
457
+ __decorateClass$1([
458
+ attr({ attribute: "readonly", mode: "boolean" })
459
+ ], TimePicker.prototype, "readOnly", 2);
460
+ __decorateClass$1([
461
+ attr({ attribute: "minutes-step", converter: nullableNumberConverter })
462
+ ], TimePicker.prototype, "minutesStep", 2);
463
+ __decorateClass$1([
464
+ attr({ attribute: "seconds-step", converter: nullableNumberConverter })
465
+ ], TimePicker.prototype, "secondsStep", 2);
466
+ __decorateClass$1([
467
+ attr
468
+ ], TimePicker.prototype, "clock", 2);
469
+ __decorateClass$1([
470
+ attr({ converter: ValidTimeFilter })
471
+ ], TimePicker.prototype, "min", 2);
472
+ __decorateClass$1([
473
+ attr({ converter: ValidTimeFilter })
474
+ ], TimePicker.prototype, "max", 2);
475
+ __decorateClass$1([
476
+ volatile
477
+ ], TimePicker.prototype, "_use12hClock", 1);
478
+ __decorateClass$1([
479
+ observable
480
+ ], TimePicker.prototype, "_popupOpen", 2);
481
+ __decorateClass$1([
482
+ observable
483
+ ], TimePicker.prototype, "_presentationValue", 2);
484
+ TimePicker = __decorateClass$1([
485
+ errorText,
486
+ formElements
487
+ ], TimePicker);
488
+ applyMixinsWithObservables(
489
+ TimePicker,
490
+ Localized,
491
+ FormElementHelperText,
492
+ TrappedFocus
493
+ );
494
+
495
+ const fallsIntoMeridiem = (meridiem, hour) => meridiem === "AM" && hour < 12 || meridiem === "PM" && hour >= 12;
496
+ const getHoursOptions = (min, max, forMeridiem) => {
497
+ const result = [];
498
+ const minHour = min ? parseTimeStr(min).hours : 0;
499
+ const maxHour = max ? parseTimeStr(max).hours : 23;
500
+ for (let i = minHour; i <= maxHour; i++) {
501
+ if (forMeridiem && !fallsIntoMeridiem(forMeridiem, i)) {
502
+ continue;
503
+ }
504
+ result.push({
505
+ value: formatTimePart(i),
506
+ label: formatTimePart(forMeridiem ? hoursAs12hClock(i) : i)
507
+ });
508
+ }
509
+ return result;
510
+ };
511
+ const getMinutesOptions = (step, value, min, max) => {
512
+ const result = [];
513
+ let minMinute = 0;
514
+ let maxMinute = 59;
515
+ if (min) {
516
+ const { hourStr: minHourStr, minutes: minMinutes } = parseTimeStr(min);
517
+ if (value && parseTimeStr(value).hourStr === minHourStr) {
518
+ minMinute = minMinutes;
519
+ }
520
+ }
521
+ if (max) {
522
+ const { hourStr: maxHourStr, minutes: maxMinutes } = parseTimeStr(max);
523
+ if (value && parseTimeStr(value).hourStr === maxHourStr) {
524
+ maxMinute = maxMinutes;
525
+ }
526
+ }
527
+ for (let i = minMinute; i <= maxMinute; i += Math.max(1, step ?? 1)) {
528
+ const minutes = formatTimePart(i);
529
+ result.push({
530
+ value: minutes,
531
+ label: minutes
532
+ });
533
+ }
534
+ return result;
535
+ };
536
+ const getSecondsOptions = (step, value, min, max) => {
537
+ const result = [];
538
+ let minSecond = 0;
539
+ let maxSecond = 59;
540
+ if (min) {
541
+ const minTime = parseTimeStr(min);
542
+ if (value && (parseTimeStr(value).hourStr === minTime.hourStr && parseTimeStr(value).minuteStr) === minTime.minuteStr) {
543
+ minSecond = minTime.seconds;
544
+ }
545
+ }
546
+ if (max) {
547
+ const maxTime = parseTimeStr(max);
548
+ if (value && (parseTimeStr(value).hourStr === maxTime.hourStr && parseTimeStr(value).minuteStr) === maxTime.minuteStr) {
549
+ maxSecond = maxTime.seconds;
550
+ }
551
+ }
552
+ for (let i = minSecond; i <= maxSecond; i += Math.max(1, step)) {
553
+ const seconds = formatTimePart(i);
554
+ result.push({
555
+ value: seconds,
556
+ label: seconds
557
+ });
558
+ }
559
+ return result;
560
+ };
561
+ const getMeridiesOptions = (min, max) => {
562
+ const result = [];
563
+ const hideAM = min ? parseTimeStr(min).meridiem === "PM" : false;
564
+ if (!hideAM) {
565
+ result.push({
566
+ value: "AM",
567
+ label: "AM"
568
+ });
569
+ }
570
+ const hidePM = max ? parseTimeStr(max).meridiem === "AM" : false;
571
+ if (!hidePM) {
572
+ result.push({
573
+ value: "PM",
574
+ label: "PM"
575
+ });
576
+ }
577
+ return result;
578
+ };
579
+
580
+ const HoursColumn = {
581
+ id: "hours",
582
+ getLabel: (x) => x.locale.timePicker.hoursLabel,
583
+ getOptions: (x) => getHoursOptions(
584
+ x.min,
585
+ x.max,
586
+ x.clock === "12h" ? MeridiesColumn.getSelectedOptionValue(x) ?? MeridiesColumn.getOptions(x)[0].value : void 0
587
+ ),
588
+ getSelectedOptionValue: (x) => x.value ? parseTimeStr(x.value).hourStr : void 0,
589
+ updatedValue: (x, optionValue) => {
590
+ if (x.value) {
591
+ const { minuteStr, secondStr } = parseTimeStr(x.value);
592
+ return `${optionValue}:${minuteStr}:${secondStr}`;
593
+ } else {
594
+ return `${optionValue}:00:00`;
595
+ }
76
596
  }
77
597
  };
78
- _ANCHOR_ARIA_LABEL_SUFFIX = new WeakMap();
79
- _Toggletip_instances = new WeakSet();
80
- setupAnchor_fn = function(a) {
81
- a.addEventListener("click", __privateGet(this, _openIfClosed), true);
82
- a.ariaLabel = (a.ariaLabel ?? "") + __privateGet(this, _ANCHOR_ARIA_LABEL_SUFFIX);
83
- __privateMethod(this, _Toggletip_instances, updateAnchor_fn).call(this, a);
598
+ const MinutesColumn = {
599
+ id: "minutes",
600
+ getLabel: (x) => x.locale.timePicker.minutesLabel,
601
+ getOptions: (x) => getMinutesOptions(x.minutesStep, x.value, x.min, x.max),
602
+ getSelectedOptionValue: (x) => x.value ? parseTimeStr(x.value).minuteStr : void 0,
603
+ updatedValue: (x, optionValue) => {
604
+ if (x.value) {
605
+ const { hourStr, secondStr } = parseTimeStr(x.value);
606
+ return `${hourStr}:${optionValue}:${secondStr}`;
607
+ } else {
608
+ return `00:${optionValue}:00`;
609
+ }
610
+ }
84
611
  };
85
- updateAnchor_fn = function(a) {
86
- a.setAttribute("aria-expanded", this.open.toString());
612
+ const SecondsColumn = {
613
+ id: "seconds",
614
+ getLabel: (x) => x.locale.timePicker.secondsLabel,
615
+ getOptions: (x) => getSecondsOptions(x.secondsStep, x.value, x.min, x.max),
616
+ getSelectedOptionValue: (x) => x.value ? parseTimeStr(x.value).secondStr : void 0,
617
+ updatedValue: (x, optionValue) => {
618
+ if (x.value) {
619
+ const { hourStr, minuteStr } = parseTimeStr(x.value);
620
+ return `${hourStr}:${minuteStr}:${optionValue}`;
621
+ } else {
622
+ return `00:00:${optionValue}`;
623
+ }
624
+ }
87
625
  };
88
- cleanupAnchor_fn = function(a) {
89
- a.removeEventListener("click", __privateGet(this, _openIfClosed), true);
90
- if (a.ariaLabel)
91
- a.ariaLabel = a.ariaLabel.replace(__privateGet(this, _ANCHOR_ARIA_LABEL_SUFFIX), "");
626
+ const MeridiesColumn = {
627
+ id: "meridies",
628
+ getLabel: (x) => x.locale.timePicker.meridiesLabel,
629
+ getOptions: (x) => getMeridiesOptions(x.min, x.max),
630
+ getSelectedOptionValue: (x) => x.value ? parseTimeStr(x.value).meridiem : void 0,
631
+ updatedValue: (x, optionValue) => {
632
+ if (x.value) {
633
+ const { hours, minuteStr, secondStr } = parseTimeStr(x.value);
634
+ let adjustedHours = hours;
635
+ if (optionValue === "AM" && hours >= 12) {
636
+ adjustedHours -= 12;
637
+ } else if (optionValue === "PM" && hours < 12) {
638
+ adjustedHours += 12;
639
+ }
640
+ return `${formatTimePart(adjustedHours)}:${minuteStr}:${secondStr}`;
641
+ } else {
642
+ if (optionValue === "AM") {
643
+ return "00:00:00";
644
+ } else {
645
+ return "12:00:00";
646
+ }
647
+ }
648
+ }
92
649
  };
93
- _openIfClosed = new WeakMap();
94
- updateListeners_fn = function() {
95
- document.removeEventListener("click", __privateGet(this, _closeOnClickOutside));
96
- document.removeEventListener("keydown", __privateGet(this, _closeOnEscape));
97
- if (this.open && this.isConnected) {
98
- document.addEventListener("click", __privateGet(this, _closeOnClickOutside));
99
- document.addEventListener("keydown", __privateGet(this, _closeOnEscape));
650
+
651
+ const shouldDisplaySecondsPicker = (x) => x.secondsStep !== void 0;
652
+ const shouldDisplay12hClock = (x) => x.clock === "12h";
653
+ const onPickerOptionClick = (x, column, optionValue) => {
654
+ emitChange(x, column.updatedValue(x, optionValue));
655
+ scrollToOption(x, column.id, optionValue, "start");
656
+ const nextPickerEl = x.shadowRoot.querySelector(
657
+ `#${column.id} + .picker`
658
+ );
659
+ if (nextPickerEl) {
660
+ nextPickerEl.focus();
661
+ } else {
662
+ x.$emit("last-column-selected", void 0, {
663
+ bubbles: false
664
+ });
100
665
  }
101
666
  };
102
- _closeOnClickOutside = new WeakMap();
103
- _closeOnEscape = new WeakMap();
667
+ const onPickerKeyDown = (x, column, event) => {
668
+ const options = column.getOptions(x);
669
+ const selectedValue = column.getSelectedOptionValue(x);
670
+ const offset = {
671
+ ArrowUp: -1,
672
+ ArrowDown: 1
673
+ }[event.key];
674
+ if (offset) {
675
+ event.preventDefault();
676
+ const index = options.findIndex((h) => h.value === selectedValue);
677
+ const newRawIndex = index === -1 ? 0 : index + offset;
678
+ const newIndex = (newRawIndex + options.length) % options.length;
679
+ const newValue = options[newIndex].value;
680
+ emitChange(x, column.updatedValue(x, newValue));
681
+ scrollToOption(x, column.id, newValue, "nearest");
682
+ }
683
+ return true;
684
+ };
685
+ const scrollToOption = (x, picker, optionValue, position) => {
686
+ const element = x.shadowRoot.querySelector(
687
+ `#${picker}-${optionValue}`
688
+ );
689
+ if (!element) {
690
+ return;
691
+ }
692
+ scrollIntoView(element, element.parentElement, position);
693
+ };
694
+ const onBaseKeyDown = (x, event) => {
695
+ if (event.key === "Tab") {
696
+ const focusableElements = x.shadowRoot.querySelectorAll(".picker");
697
+ const terminalElement = event.shiftKey ? focusableElements[0] : focusableElements[focusableElements.length - 1];
698
+ if (x.shadowRoot.activeElement !== terminalElement) {
699
+ TrappedFocus.ignoreEvent(event);
700
+ }
701
+ }
702
+ return true;
703
+ };
704
+ const emitChange = (x, time) => {
705
+ x.$emit("change", time, { bubbles: false, composed: false });
706
+ };
707
+ const renderPicker = (column) => {
708
+ return html`<ul
709
+ id="${column.id}"
710
+ class="picker"
711
+ role="listbox"
712
+ tabindex="0"
713
+ aria-label="${column.getLabel}"
714
+ aria-activedescendant="${(x) => column.getSelectedOptionValue(x) ? `${column.id}-${column.getSelectedOptionValue(x)}` : void 0}"
715
+ @keydown="${(x, c) => onPickerKeyDown(x, column, c.event)}"
716
+ >
717
+ ${repeat(
718
+ (x) => column.getOptions(x),
719
+ html`<li
720
+ id="${(x) => `${column.id}-${x.value}`}"
721
+ class="${(x, c) => classNames("option", [
722
+ "selected",
723
+ column.getSelectedOptionValue(c.parent) === x.value
724
+ ])}"
725
+ aria-selected="${(x, c) => column.getSelectedOptionValue(c.parent) === x.value}"
726
+ role="option"
727
+ @click="${(x, c) => onPickerOptionClick(c.parent, column, x.value)}"
728
+ >
729
+ ${(x) => x.label}
730
+ </li>`
731
+ )}
732
+ </ul>`;
733
+ };
734
+ const InlineTimePickerTemplate = () => {
735
+ return html`<div
736
+ class="time-pickers"
737
+ @keydown="${(x, { event }) => onBaseKeyDown(x, event)}"
738
+ >
739
+ ${renderPicker(HoursColumn)} ${renderPicker(MinutesColumn)}
740
+ ${when(shouldDisplaySecondsPicker, renderPicker(SecondsColumn))}
741
+ ${when(shouldDisplay12hClock, renderPicker(MeridiesColumn))}
742
+ </div>`;
743
+ };
744
+
745
+ var __defProp = Object.defineProperty;
746
+ var __decorateClass = (decorators, target, key, kind) => {
747
+ var result = void 0 ;
748
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
749
+ if (decorator = decorators[i])
750
+ result = (decorator(target, key, result) ) || result;
751
+ if (result) __defProp(target, key, result);
752
+ return result;
753
+ };
754
+ class InlineTimePicker extends VividElement {
755
+ constructor() {
756
+ super(...arguments);
757
+ this.minutesStep = 1;
758
+ this.clock = "24h";
759
+ }
760
+ valueChanged(_, newValue) {
761
+ if (newValue !== void 0 && !isValidTimeStr(newValue)) {
762
+ this.value = void 0;
763
+ }
764
+ }
765
+ scrollSelectedOptionsToTop() {
766
+ if (HoursColumn.getSelectedOptionValue(this)) {
767
+ scrollToOption(
768
+ this,
769
+ "hours",
770
+ HoursColumn.getSelectedOptionValue(this),
771
+ "start"
772
+ );
773
+ }
774
+ if (MinutesColumn.getSelectedOptionValue(this)) {
775
+ scrollToOption(
776
+ this,
777
+ "minutes",
778
+ MinutesColumn.getSelectedOptionValue(this),
779
+ "start"
780
+ );
781
+ }
782
+ if (shouldDisplaySecondsPicker(this) && SecondsColumn.getSelectedOptionValue(this)) {
783
+ scrollToOption(
784
+ this,
785
+ "seconds",
786
+ SecondsColumn.getSelectedOptionValue(this),
787
+ "start"
788
+ );
789
+ }
790
+ if (shouldDisplay12hClock(this) && MeridiesColumn.getSelectedOptionValue(this)) {
791
+ scrollToOption(
792
+ this,
793
+ "meridies",
794
+ MeridiesColumn.getSelectedOptionValue(this),
795
+ "start"
796
+ );
797
+ }
798
+ }
799
+ focus(options) {
800
+ const firstFocusableElement = this.shadowRoot.querySelector(
801
+ ".picker"
802
+ );
803
+ firstFocusableElement.focus(options);
804
+ }
805
+ }
104
806
  __decorateClass([
105
- attr
106
- ], Toggletip.prototype, "headline", 2);
807
+ observable
808
+ ], InlineTimePicker.prototype, "value");
809
+ __decorateClass([
810
+ observable
811
+ ], InlineTimePicker.prototype, "minutesStep");
107
812
  __decorateClass([
108
- attr({ mode: "boolean" })
109
- ], Toggletip.prototype, "alternate", 2);
813
+ observable
814
+ ], InlineTimePicker.prototype, "secondsStep");
110
815
  __decorateClass([
111
- attr({ mode: "fromView" })
112
- ], Toggletip.prototype, "placement", 2);
816
+ observable
817
+ ], InlineTimePicker.prototype, "clock");
113
818
  __decorateClass([
114
- attr({ mode: "boolean" })
115
- ], Toggletip.prototype, "open", 2);
116
- Toggletip = __decorateClass([
117
- anchored
118
- ], Toggletip);
819
+ observable
820
+ ], InlineTimePicker.prototype, "min");
821
+ __decorateClass([
822
+ observable
823
+ ], InlineTimePicker.prototype, "max");
824
+ applyMixinsWithObservables(InlineTimePicker, Localized);
119
825
 
120
- const getClasses = (_) => classNames("control");
121
- const ToggletipTemplate = (context) => {
122
- const popup = context.tagFor(Popup);
123
- const anchorSlotTemplate = anchorSlotTemplateFactory();
124
- return html`
125
- ${anchorSlotTemplate}
126
- <${popup}
127
- @keydown="${(x, { event }) => {
128
- if (x.open && handleEscapeKeyAndStopPropogation(event)) {
129
- return false;
130
- }
131
- return true;
132
- }}"
133
- class="${getClasses}"
134
- arrow
135
- :anchor="${(x) => x._anchorEl}"
136
- :open="${(x) => x.open}"
137
- ?alternate="${(x) => !x.alternate}"
138
- placement="${(x) => x.placement}"
139
- exportparts="vvd-theme-alternate"
826
+ const TimePickerTemplate = (context) => {
827
+ const popupTag = context.tagFor(Popup);
828
+ const textFieldTag = context.tagFor(TextField);
829
+ const buttonTag = context.tagFor(Button);
830
+ const inlineTimePickerTag = context.tagFor(InlineTimePicker);
831
+ return html`<div class="base" @keydown="${(x, { event }) => x._onBaseKeyDown(event)}">
832
+ <${textFieldTag} id="text-field"
833
+ ${ref("_textFieldEl")}
834
+ class="control"
835
+ label="${(x) => x.label}"
836
+ helper-text="${(x) => x.helperText}"
837
+ error-text="${(x) => x.errorValidationMessage}"
838
+ placeholder="${(x) => x._textFieldPlaceholder}"
839
+ current-value="${(x) => x._presentationValue}"
840
+ ?disabled="${(x) => x.disabled}"
841
+ ?readonly="${(x) => x.readOnly}"
842
+ @input="${(x, c) => x._onTextFieldInput(c.event)}"
843
+ @change="${(x) => x._onTextFieldChange()}"
140
844
  >
141
- <div class="content-wrapper">
142
- ${when(
143
- (x) => x.headline,
144
- html`<header class="headline">${(x) => x.headline}</header>`
145
- )}
146
- <slot></slot>
147
- <footer class="action-items"><slot name="action-items"></slot></footer>
845
+ <slot
846
+ slot="${(x) => x._helperTextSlottedContent?.length ? "helper-text" : void 0}"
847
+ name="helper-text"
848
+ ${slotted("_helperTextSlottedContent")}
849
+ ></slot>
850
+ <${buttonTag}
851
+ id="clock-button"
852
+ ${ref("_clockButtonEl")}
853
+ slot="action-items"
854
+ size="condensed"
855
+ icon="clock-line"
856
+ appearance="ghost"
857
+ ?disabled="${(x) => x.disabled || x.readOnly}"
858
+ aria-label="${(x) => x._clockButtonLabel}"
859
+ @click="${(x) => x._onClockButtonClick()}"
860
+ ></${buttonTag}>
861
+ </${textFieldTag}>
862
+ <${popupTag}
863
+ ?open="${(x) => x._popupOpen}"
864
+ :anchor="${(x) => x._textFieldEl}"
865
+ placement="bottom-start"
866
+ class="popup">
867
+ <div class="dialog" role="dialog" ${ref(
868
+ "_dialogEl"
869
+ )} aria-modal="true" aria-label="${(x) => x.locale.timePicker.chooseTimeLabel}">
870
+ <${inlineTimePickerTag}
871
+ id="inline-time-picker"
872
+ ${ref("_inlineTimePickerEl")}
873
+ :value="${(x) => x.value || void 0}"
874
+ :clock="${(x) => x._use12hClock ? "12h" : "24h"}"
875
+ :min="${(x) => x.min || void 0}"
876
+ :max="${(x) => x.max || void 0}"
877
+ :minutesStep="${(x) => x.minutesStep ?? 1}"
878
+ :secondsStep="${(x) => x.secondsStep ?? void 0}"
879
+ @change="${(x, c) => x._onInlineTimePickerChange(c.event)}"
880
+ @last-column-selected="${(x) => x._onInlineTimePickerLastColumnSelected()}"
881
+ >
882
+ </${inlineTimePickerTag}>
883
+ <div class="footer">
884
+ <${buttonTag}
885
+ class="vwc-button"
886
+ size="condensed"
887
+ label="${(x) => x.locale.timePicker.clearLabel}"
888
+ @click="${(x) => x._onClearClick()}"
889
+ ></${buttonTag}>
890
+ <${buttonTag}
891
+ class="vwc-button"
892
+ size="condensed"
893
+ appearance="filled"
894
+ label="${(x) => x.locale.timePicker.okLabel}"
895
+ @click="${(x) => x._onOkClick()}"
896
+ ></${buttonTag}>
897
+ </div>
148
898
  </div>
149
- </${popup}>
150
- `;
899
+ </${popupTag}>
900
+ </div>`;
151
901
  };
152
902
 
153
- const toggletipDefinition = defineVividComponent(
154
- "toggletip",
155
- Toggletip,
156
- ToggletipTemplate,
157
- [popupDefinition],
903
+ const styles = ":host{display:inline-block}.time-pickers{display:flex;overflow:hidden;justify-content:center;padding:4px;block-size:188px;gap:4px}.time-pickers .picker{position:relative;display:flex;overflow:hidden;flex-direction:column;padding:0;border-radius:4px;margin:0;gap:4px;inline-size:50px;list-style:none}.time-pickers .picker:hover{overflow-y:auto}.time-pickers .picker:after{display:block;flex-shrink:0;block-size:156px;content:\"\"}.time-pickers .picker:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: -2px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.time-pickers .option{--_connotation-color-primary: var(--vvd-time-picker-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-firm: var(--vvd-time-picker-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-faint: var(--vvd-time-picker-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-time-picker-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-dim: var(--vvd-time-picker-accent-dim, var(--vvd-color-neutral-200));--_connotation-color-pale: var(--vvd-time-picker-accent-pale, var(--vvd-color-neutral-300))}.time-pickers .option{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.time-pickers .option:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.time-pickers .option:where(.active,:active):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .option:where(.selected):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-soft);--_appearance-color-outline: transparent}.time-pickers .option:where(.selected):where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-dim);--_appearance-color-outline: transparent}.time-pickers .option:where(.selected):where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: transparent}.time-pickers .option{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:4px;background-color:var(--_appearance-color-fill);block-size:28px;color:var(--_appearance-color-text);cursor:pointer;font:var(--vvd-typography-base);inline-size:50px}";
904
+
905
+ const inlineTimePickerDefinition = defineVividComponent(
906
+ "inline-time-picker",
907
+ InlineTimePicker,
908
+ InlineTimePickerTemplate,
909
+ [],
158
910
  {
159
- styles
911
+ styles,
912
+ shadowOptions: {
913
+ delegatesFocus: true
914
+ }
915
+ }
916
+ );
917
+
918
+ const timePickerDefinition = defineVividComponent(
919
+ "time-picker",
920
+ TimePicker,
921
+ TimePickerTemplate,
922
+ [
923
+ textFieldDefinition,
924
+ popupDefinition,
925
+ buttonDefinition,
926
+ inlineTimePickerDefinition
927
+ ],
928
+ {
929
+ styles: styles$1,
930
+ shadowOptions: {
931
+ delegatesFocus: true
932
+ }
160
933
  }
161
934
  );
162
- const registerToggletip = createRegisterFunction(toggletipDefinition);
935
+ const registerTimePicker = createRegisterFunction(timePickerDefinition);
163
936
 
164
- export { registerToggletip as r, toggletipDefinition as t };
937
+ export { TimePicker as T, registerTimePicker as r, timePickerDefinition as t };