@watermarkinsights/ripple 3.8.0-2 → 3.8.0-3

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 (343) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/{functions-edfdd03f.js → functions-9b5b7f3c.js} +488 -509
  3. package/dist/cjs/{global-ffd0392c.js → global-fad306c8.js} +65 -65
  4. package/dist/cjs/{http-service-9e8c4dd5.js → http-service-494d81de.js} +49 -49
  5. package/dist/cjs/{index-0e7e3668.js → index-cd179539.js} +64 -96
  6. package/dist/cjs/{interfaces-30a74c1f.js → interfaces-a3338581.js} +29 -29
  7. package/dist/cjs/loader.cjs.js +4 -4
  8. package/dist/cjs/priv-chart-popover.cjs.entry.js +79 -79
  9. package/dist/cjs/priv-datepicker.cjs.entry.js +674 -674
  10. package/dist/cjs/priv-navigator-button.cjs.entry.js +19 -19
  11. package/dist/cjs/priv-navigator-item.cjs.entry.js +24 -24
  12. package/dist/cjs/ripple.cjs.js +4 -4
  13. package/dist/cjs/wm-action-menu_2.cjs.entry.js +342 -342
  14. package/dist/cjs/wm-button.cjs.entry.js +228 -238
  15. package/dist/cjs/wm-chart-slice.cjs.entry.js +14 -14
  16. package/dist/cjs/wm-chart.cjs.entry.js +475 -475
  17. package/dist/cjs/wm-datepicker.cjs.entry.js +273 -273
  18. package/dist/cjs/wm-input.cjs.entry.js +136 -136
  19. package/dist/cjs/wm-modal-footer.cjs.entry.js +32 -32
  20. package/dist/cjs/wm-modal-header.cjs.entry.js +35 -35
  21. package/dist/cjs/wm-modal.cjs.entry.js +164 -164
  22. package/dist/cjs/wm-navigator.cjs.entry.js +269 -269
  23. package/dist/cjs/wm-network-uploader.cjs.entry.js +422 -422
  24. package/dist/cjs/wm-option_2.cjs.entry.js +497 -497
  25. package/dist/cjs/wm-pagination.cjs.entry.js +168 -168
  26. package/dist/cjs/wm-search.cjs.entry.js +233 -233
  27. package/dist/cjs/wm-snackbar.cjs.entry.js +172 -172
  28. package/dist/cjs/wm-tab-item_3.cjs.entry.js +297 -297
  29. package/dist/cjs/wm-tag-input.cjs.entry.js +581 -581
  30. package/dist/cjs/wm-timepicker.cjs.entry.js +385 -385
  31. package/dist/cjs/wm-toggletip.cjs.entry.js +126 -126
  32. package/dist/cjs/wm-uploader.cjs.entry.js +348 -348
  33. package/dist/cjs/wm-wrapper.cjs.entry.js +13 -13
  34. package/dist/collection/collection-manifest.json +2 -10
  35. package/dist/collection/components/wm-action-menu/wm-action-menu.css +1 -0
  36. package/dist/collection/components/wm-action-menu/wm-action-menu.js +460 -460
  37. package/dist/collection/components/wm-button/wm-button.css +3 -1
  38. package/dist/collection/components/wm-button/wm-button.js +491 -503
  39. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.css +1 -0
  40. package/dist/collection/components/wm-chart/priv-chart-popover/priv-chart-popover.js +232 -232
  41. package/dist/collection/components/wm-chart/wm-chart-slice.js +115 -115
  42. package/dist/collection/components/wm-chart/wm-chart.css +1 -0
  43. package/dist/collection/components/wm-chart/wm-chart.js +718 -718
  44. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.css +5 -3
  45. package/dist/collection/components/wm-datepicker/priv-datepicker/priv-datepicker.js +1039 -1039
  46. package/dist/collection/components/wm-datepicker/wm-datepicker.css +3 -1
  47. package/dist/collection/components/wm-datepicker/wm-datepicker.js +483 -483
  48. package/dist/collection/components/wm-input/wm-input.css +3 -1
  49. package/dist/collection/components/wm-input/wm-input.js +423 -423
  50. package/dist/collection/components/wm-menuitem/wm-menuitem.css +1 -0
  51. package/dist/collection/components/wm-menuitem/wm-menuitem.js +444 -444
  52. package/dist/collection/components/wm-modal/wm-modal-footer.css +1 -0
  53. package/dist/collection/components/wm-modal/wm-modal-footer.js +141 -141
  54. package/dist/collection/components/wm-modal/wm-modal-header.css +1 -0
  55. package/dist/collection/components/wm-modal/wm-modal-header.js +92 -92
  56. package/dist/collection/components/wm-modal/wm-modal.css +1 -0
  57. package/dist/collection/components/wm-modal/wm-modal.js +461 -461
  58. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.css +1 -0
  59. package/dist/collection/components/wm-navigator/priv-navigator-button/priv-navigator-button.js +97 -97
  60. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.css +1 -0
  61. package/dist/collection/components/wm-navigator/priv-navigator-item/priv-navigator-item.js +114 -114
  62. package/dist/collection/components/wm-navigator/wm-navigator.css +1 -0
  63. package/dist/collection/components/wm-navigator/wm-navigator.js +468 -468
  64. package/dist/collection/components/wm-option/wm-option.css +4 -2
  65. package/dist/collection/components/wm-option/wm-option.js +422 -422
  66. package/dist/collection/components/wm-pagination/wm-pagination.css +1 -0
  67. package/dist/collection/components/wm-pagination/wm-pagination.js +368 -368
  68. package/dist/collection/components/wm-search/wm-search.css +1 -0
  69. package/dist/collection/components/wm-search/wm-search.js +480 -480
  70. package/dist/collection/components/wm-select/wm-select.css +4 -2
  71. package/dist/collection/components/wm-select/wm-select.js +720 -720
  72. package/dist/collection/components/wm-snackbar/wm-snackbar.css +4 -2
  73. package/dist/collection/components/wm-snackbar/wm-snackbar.js +297 -297
  74. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.css +1 -0
  75. package/dist/collection/components/wm-tabs/wm-tab-item/wm-tab-item.js +216 -216
  76. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.css +1 -0
  77. package/dist/collection/components/wm-tabs/wm-tab-list/wm-tab-list.js +330 -330
  78. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.css +1 -0
  79. package/dist/collection/components/wm-tabs/wm-tab-panel/wm-tab-panel.js +104 -104
  80. package/dist/collection/components/wm-tag-input/wm-tag-input.css +4 -2
  81. package/dist/collection/components/wm-tag-input/wm-tag-input.js +810 -810
  82. package/dist/collection/components/wm-timepicker/wm-timepicker.css +4 -2
  83. package/dist/collection/components/wm-timepicker/wm-timepicker.js +583 -583
  84. package/dist/collection/components/wm-toggletip/wm-toggletip.css +3 -1
  85. package/dist/collection/components/wm-toggletip/wm-toggletip.js +241 -241
  86. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.css +3 -1
  87. package/dist/collection/components/wm-uploader/wm-network-uploader/wm-network-uploader.js +753 -753
  88. package/dist/collection/components/wm-uploader/wm-uploader.css +3 -1
  89. package/dist/collection/components/wm-uploader/wm-uploader.js +748 -748
  90. package/dist/collection/components/wm-wrapper/wm-wrapper.js +27 -27
  91. package/dist/collection/dev/scripts.js +20 -20
  92. package/dist/collection/global/__mocks__/functions.js +6 -6
  93. package/dist/collection/global/functions.js +449 -445
  94. package/dist/collection/global/global.js +72 -72
  95. package/dist/collection/global/interfaces.js +49 -49
  96. package/dist/collection/global/services/__mocks__/http-service.js +130 -130
  97. package/dist/collection/global/services/http-service.js +50 -50
  98. package/dist/collection/lang/lang.js +5 -5
  99. package/dist/collection/lang/missing.js +39 -39
  100. package/dist/collection/lang/piglatin.js +93 -93
  101. package/dist/esm/{functions-6cd52dcf.js → functions-a8d1ed3e.js} +488 -510
  102. package/dist/esm/{global-51d6ea5f.js → global-191b6775.js} +65 -65
  103. package/dist/esm/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +49 -49
  104. package/dist/esm/{index-cd8f9ae2.js → index-66f8130e.js} +64 -96
  105. package/dist/esm/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +29 -29
  106. package/dist/esm/loader.js +4 -4
  107. package/dist/esm/polyfills/core-js.js +0 -0
  108. package/dist/esm/polyfills/css-shim.js +1 -1
  109. package/dist/esm/polyfills/dom.js +0 -0
  110. package/dist/esm/polyfills/es5-html-element.js +0 -0
  111. package/dist/esm/polyfills/index.js +0 -0
  112. package/dist/esm/polyfills/system.js +0 -0
  113. package/dist/esm/priv-chart-popover.entry.js +79 -79
  114. package/dist/esm/priv-datepicker.entry.js +674 -674
  115. package/dist/esm/priv-navigator-button.entry.js +19 -19
  116. package/dist/esm/priv-navigator-item.entry.js +24 -24
  117. package/dist/esm/ripple.js +4 -4
  118. package/dist/esm/wm-action-menu_2.entry.js +342 -342
  119. package/dist/esm/wm-button.entry.js +228 -238
  120. package/dist/esm/wm-chart-slice.entry.js +14 -14
  121. package/dist/esm/wm-chart.entry.js +475 -475
  122. package/dist/esm/wm-datepicker.entry.js +273 -273
  123. package/dist/esm/wm-input.entry.js +136 -136
  124. package/dist/esm/wm-modal-footer.entry.js +32 -32
  125. package/dist/esm/wm-modal-header.entry.js +35 -35
  126. package/dist/esm/wm-modal.entry.js +164 -164
  127. package/dist/esm/wm-navigator.entry.js +269 -269
  128. package/dist/esm/wm-network-uploader.entry.js +422 -422
  129. package/dist/esm/wm-option_2.entry.js +497 -497
  130. package/dist/esm/wm-pagination.entry.js +168 -168
  131. package/dist/esm/wm-search.entry.js +233 -233
  132. package/dist/esm/wm-snackbar.entry.js +172 -172
  133. package/dist/esm/wm-tab-item_3.entry.js +297 -297
  134. package/dist/esm/wm-tag-input.entry.js +581 -581
  135. package/dist/esm/wm-timepicker.entry.js +385 -385
  136. package/dist/esm/wm-toggletip.entry.js +126 -126
  137. package/dist/esm/wm-uploader.entry.js +348 -348
  138. package/dist/esm/wm-wrapper.entry.js +13 -13
  139. package/dist/esm-es5/functions-a8d1ed3e.js +15 -0
  140. package/dist/esm-es5/{global-51d6ea5f.js → global-191b6775.js} +1 -1
  141. package/dist/esm-es5/{http-service-5d037e16.js → http-service-3dc3b3e7.js} +1 -1
  142. package/dist/esm-es5/index-66f8130e.js +1 -0
  143. package/dist/esm-es5/{interfaces-61c6305b.js → interfaces-2b97fab2.js} +0 -0
  144. package/dist/esm-es5/loader.js +1 -1
  145. package/dist/esm-es5/priv-chart-popover.entry.js +1 -1
  146. package/dist/esm-es5/priv-datepicker.entry.js +1 -1
  147. package/dist/esm-es5/priv-navigator-button.entry.js +1 -1
  148. package/dist/esm-es5/priv-navigator-item.entry.js +1 -1
  149. package/dist/esm-es5/ripple.js +1 -1
  150. package/dist/esm-es5/wm-action-menu_2.entry.js +1 -1
  151. package/dist/esm-es5/wm-button.entry.js +1 -1
  152. package/dist/esm-es5/wm-chart-slice.entry.js +1 -1
  153. package/dist/esm-es5/wm-chart.entry.js +1 -1
  154. package/dist/esm-es5/wm-datepicker.entry.js +1 -1
  155. package/dist/esm-es5/wm-input.entry.js +1 -1
  156. package/dist/esm-es5/wm-modal-footer.entry.js +1 -1
  157. package/dist/esm-es5/wm-modal-header.entry.js +1 -1
  158. package/dist/esm-es5/wm-modal.entry.js +1 -1
  159. package/dist/esm-es5/wm-navigator.entry.js +1 -1
  160. package/dist/esm-es5/wm-network-uploader.entry.js +1 -1
  161. package/dist/esm-es5/wm-option_2.entry.js +1 -1
  162. package/dist/esm-es5/wm-pagination.entry.js +1 -1
  163. package/dist/esm-es5/wm-search.entry.js +1 -1
  164. package/dist/esm-es5/wm-snackbar.entry.js +1 -1
  165. package/dist/esm-es5/wm-tab-item_3.entry.js +1 -1
  166. package/dist/esm-es5/wm-tag-input.entry.js +1 -1
  167. package/dist/esm-es5/wm-timepicker.entry.js +1 -1
  168. package/dist/esm-es5/wm-toggletip.entry.js +1 -1
  169. package/dist/esm-es5/wm-uploader.entry.js +1 -1
  170. package/dist/esm-es5/wm-wrapper.entry.js +1 -1
  171. package/dist/loader/index.d.ts +1 -0
  172. package/dist/ripple/p-04bd5281.entry.js +1 -0
  173. package/dist/ripple/p-07353b27.system.js +1 -0
  174. package/dist/ripple/p-0b2a9a9a.entry.js +1 -0
  175. package/dist/ripple/p-0c58f50d.entry.js +1 -0
  176. package/dist/ripple/p-0d8bd4ee.entry.js +1 -0
  177. package/dist/ripple/p-0deeb79c.system.entry.js +1 -0
  178. package/dist/ripple/{p-45ee5b9d.system.entry.js → p-1fa979d7.system.entry.js} +1 -1
  179. package/dist/ripple/p-2145d012.entry.js +1 -0
  180. package/dist/ripple/p-2544cbd6.system.entry.js +1 -0
  181. package/dist/ripple/{p-c19298a5.system.entry.js → p-261ea633.system.entry.js} +1 -1
  182. package/dist/ripple/p-29a232bc.entry.js +1 -0
  183. package/dist/ripple/{p-9a9743f5.system.entry.js → p-2d49a016.system.entry.js} +1 -1
  184. package/dist/ripple/{p-284a9749.system.entry.js → p-2d63611b.system.entry.js} +1 -1
  185. package/dist/ripple/p-32733046.entry.js +1 -0
  186. package/dist/ripple/p-39b93119.entry.js +1 -0
  187. package/dist/ripple/p-3fb2fff9.entry.js +1 -0
  188. package/dist/ripple/{p-888bec42.js → p-43f1298b.js} +0 -0
  189. package/dist/ripple/p-510c5446.system.entry.js +1 -0
  190. package/dist/ripple/p-566a8814.entry.js +1 -0
  191. package/dist/ripple/p-5f3e2db4.entry.js +1 -0
  192. package/dist/ripple/{p-1d7049b5.system.entry.js → p-616d11c9.system.entry.js} +1 -1
  193. package/dist/ripple/p-639ad0f5.system.entry.js +1 -0
  194. package/dist/ripple/p-6a4cc1e1.system.entry.js +1 -0
  195. package/dist/ripple/p-6facd692.entry.js +1 -0
  196. package/dist/ripple/p-764def28.system.entry.js +1 -0
  197. package/dist/ripple/p-78473c96.system.entry.js +1 -0
  198. package/dist/ripple/p-7a684273.entry.js +1 -0
  199. package/dist/ripple/{p-e758db14.system.entry.js → p-7a9aac92.system.entry.js} +1 -1
  200. package/dist/ripple/{p-504579c2.system.entry.js → p-7bc744bf.system.entry.js} +1 -1
  201. package/dist/ripple/p-7c879f30.system.entry.js +1 -0
  202. package/dist/ripple/p-7d6552fb.entry.js +1 -0
  203. package/dist/ripple/{p-83028f2c.js → p-7f41b5fc.js} +1 -1
  204. package/dist/ripple/p-80d598f9.js +16 -0
  205. package/dist/ripple/{p-4ed98fb1.system.entry.js → p-831c3da1.system.entry.js} +1 -1
  206. package/dist/ripple/p-835d8720.system.entry.js +1 -0
  207. package/dist/ripple/p-8b0eb05e.entry.js +1 -0
  208. package/dist/ripple/p-8dab4579.entry.js +1 -0
  209. package/dist/ripple/p-99548d58.system.js +1 -0
  210. package/dist/ripple/p-99db8501.entry.js +1 -0
  211. package/dist/ripple/p-9baa3039.js +1 -0
  212. package/dist/ripple/p-9d02957d.system.js +1 -0
  213. package/dist/ripple/p-a9a28ef6.entry.js +1 -0
  214. package/dist/ripple/p-aa5c6a4a.system.entry.js +1 -0
  215. package/dist/ripple/p-b2f08d3e.system.entry.js +1 -0
  216. package/dist/ripple/{p-a5177480.system.entry.js → p-b3ce2033.system.entry.js} +1 -1
  217. package/dist/ripple/p-b6d1ab55.entry.js +1 -0
  218. package/dist/ripple/p-c6ac6f80.entry.js +1 -0
  219. package/dist/ripple/{p-15759528.system.entry.js → p-cde0c4bd.system.entry.js} +1 -1
  220. package/dist/ripple/p-d0643c9b.entry.js +1 -0
  221. package/dist/ripple/p-d064dbb9.entry.js +1 -0
  222. package/dist/ripple/p-d0d5fd00.entry.js +1 -0
  223. package/dist/ripple/p-eb446a26.system.entry.js +1 -0
  224. package/dist/ripple/{p-aedd95e6.system.js → p-ee93660f.system.js} +1 -1
  225. package/dist/ripple/{p-f2ba1a0f.system.entry.js → p-f04fb2d2.system.entry.js} +1 -1
  226. package/dist/ripple/p-f10fbff8.entry.js +1 -0
  227. package/dist/ripple/p-f3c8868c.entry.js +1 -0
  228. package/dist/ripple/{p-08b7ec08.system.js → p-f5df5903.system.js} +0 -0
  229. package/dist/ripple/p-fc0f044d.system.entry.js +1 -0
  230. package/dist/ripple/{p-a6d6eae7.js → p-fd8070fb.js} +0 -0
  231. package/dist/ripple/{p-088e3c4c.system.entry.js → p-fd991998.system.entry.js} +1 -1
  232. package/dist/ripple/p-fe4dd552.system.js +15 -0
  233. package/dist/ripple/ripple.esm.js +1 -1
  234. package/dist/ripple/ripple.js +1 -1
  235. package/dist/types/components/wm-action-menu/wm-action-menu.d.ts +48 -48
  236. package/dist/types/components/wm-button/wm-button.d.ts +43 -44
  237. package/dist/types/components/wm-chart/priv-chart-popover/priv-chart-popover.d.ts +23 -23
  238. package/dist/types/components/wm-chart/wm-chart-slice.d.ts +11 -11
  239. package/dist/types/components/wm-chart/wm-chart.d.ts +82 -82
  240. package/dist/types/components/wm-datepicker/priv-datepicker/priv-datepicker.d.ts +80 -80
  241. package/dist/types/components/wm-datepicker/wm-datepicker.d.ts +42 -42
  242. package/dist/types/components/wm-input/wm-input.d.ts +46 -46
  243. package/dist/types/components/wm-menuitem/wm-menuitem.d.ts +34 -34
  244. package/dist/types/components/wm-modal/wm-modal-footer.d.ts +15 -15
  245. package/dist/types/components/wm-modal/wm-modal-header.d.ts +12 -12
  246. package/dist/types/components/wm-modal/wm-modal.d.ts +41 -41
  247. package/dist/types/components/wm-navigator/priv-navigator-button/priv-navigator-button.d.ts +10 -10
  248. package/dist/types/components/wm-navigator/priv-navigator-item/priv-navigator-item.d.ts +13 -13
  249. package/dist/types/components/wm-navigator/wm-navigator.d.ts +61 -61
  250. package/dist/types/components/wm-option/wm-option.d.ts +32 -32
  251. package/dist/types/components/wm-pagination/wm-pagination.d.ts +32 -32
  252. package/dist/types/components/wm-search/wm-search.d.ts +86 -86
  253. package/dist/types/components/wm-select/wm-select.d.ts +66 -66
  254. package/dist/types/components/wm-snackbar/wm-snackbar.d.ts +35 -35
  255. package/dist/types/components/wm-tabs/wm-tab-item/wm-tab-item.d.ts +38 -38
  256. package/dist/types/components/wm-tabs/wm-tab-list/wm-tab-list.d.ts +53 -53
  257. package/dist/types/components/wm-tabs/wm-tab-panel/wm-tab-panel.d.ts +20 -20
  258. package/dist/types/components/wm-tag-input/wm-tag-input.d.ts +92 -92
  259. package/dist/types/components/wm-timepicker/wm-timepicker.d.ts +61 -61
  260. package/dist/types/components/wm-toggletip/wm-toggletip.d.ts +27 -27
  261. package/dist/types/components/wm-uploader/wm-network-uploader/wm-network-uploader.d.ts +85 -85
  262. package/dist/types/components/wm-uploader/wm-uploader.d.ts +80 -80
  263. package/dist/types/components/wm-wrapper/wm-wrapper.d.ts +7 -7
  264. package/dist/types/components.d.ts +24 -74
  265. package/dist/types/global/__mocks__/functions.d.ts +6 -6
  266. package/dist/types/global/functions.d.ts +41 -40
  267. package/dist/types/global/global.d.ts +1 -1
  268. package/dist/types/global/interfaces.d.ts +34 -34
  269. package/dist/types/global/services/__mocks__/http-service.d.ts +6 -6
  270. package/dist/types/global/services/http-service.d.ts +4 -4
  271. package/dist/types/lang/lang.d.ts +5 -5
  272. package/dist/types/stencil-public-runtime.d.ts +4 -6
  273. package/package.json +47 -47
  274. package/dist/cjs/wm-navigation-hamburger.cjs.entry.js +0 -56
  275. package/dist/cjs/wm-navigation-item.cjs.entry.js +0 -31
  276. package/dist/cjs/wm-navigation.cjs.entry.js +0 -87
  277. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.css +0 -86
  278. package/dist/collection/components/wm-navigation/wm-navigation-hamburger.js +0 -96
  279. package/dist/collection/components/wm-navigation/wm-navigation-item.css +0 -85
  280. package/dist/collection/components/wm-navigation/wm-navigation-item.js +0 -101
  281. package/dist/collection/components/wm-navigation/wm-navigation.css +0 -117
  282. package/dist/collection/components/wm-navigation/wm-navigation.js +0 -142
  283. package/dist/esm/wm-navigation-hamburger.entry.js +0 -52
  284. package/dist/esm/wm-navigation-item.entry.js +0 -27
  285. package/dist/esm/wm-navigation.entry.js +0 -83
  286. package/dist/esm-es5/functions-6cd52dcf.js +0 -15
  287. package/dist/esm-es5/index-cd8f9ae2.js +0 -1
  288. package/dist/esm-es5/wm-navigation-hamburger.entry.js +0 -1
  289. package/dist/esm-es5/wm-navigation-item.entry.js +0 -1
  290. package/dist/esm-es5/wm-navigation.entry.js +0 -1
  291. package/dist/ripple/p-05b44011.system.entry.js +0 -1
  292. package/dist/ripple/p-17fef956.entry.js +0 -1
  293. package/dist/ripple/p-20856a2d.system.js +0 -1
  294. package/dist/ripple/p-2206c8d0.entry.js +0 -1
  295. package/dist/ripple/p-244877c8.entry.js +0 -1
  296. package/dist/ripple/p-2b526a98.entry.js +0 -1
  297. package/dist/ripple/p-2f63e022.system.entry.js +0 -1
  298. package/dist/ripple/p-313b6073.system.js +0 -1
  299. package/dist/ripple/p-323c8fbd.entry.js +0 -1
  300. package/dist/ripple/p-38062c39.js +0 -1
  301. package/dist/ripple/p-3ba3afca.entry.js +0 -1
  302. package/dist/ripple/p-48ab9e16.entry.js +0 -1
  303. package/dist/ripple/p-4999f5dc.entry.js +0 -1
  304. package/dist/ripple/p-4ab257fe.entry.js +0 -1
  305. package/dist/ripple/p-4c0de099.system.entry.js +0 -1
  306. package/dist/ripple/p-4c75587a.system.entry.js +0 -1
  307. package/dist/ripple/p-58a1e616.system.entry.js +0 -1
  308. package/dist/ripple/p-5fd47eac.entry.js +0 -1
  309. package/dist/ripple/p-664c3f62.entry.js +0 -1
  310. package/dist/ripple/p-6923b8f6.system.js +0 -15
  311. package/dist/ripple/p-6e5a35ae.system.entry.js +0 -1
  312. package/dist/ripple/p-741972e8.system.entry.js +0 -1
  313. package/dist/ripple/p-764fa608.entry.js +0 -1
  314. package/dist/ripple/p-77bd8d1b.entry.js +0 -1
  315. package/dist/ripple/p-7ff67db9.entry.js +0 -1
  316. package/dist/ripple/p-8139cdfe.system.js +0 -1
  317. package/dist/ripple/p-864b71bf.system.entry.js +0 -1
  318. package/dist/ripple/p-87b8fddf.entry.js +0 -1
  319. package/dist/ripple/p-8a0450fd.entry.js +0 -1
  320. package/dist/ripple/p-9173f673.entry.js +0 -1
  321. package/dist/ripple/p-9f442b49.system.entry.js +0 -1
  322. package/dist/ripple/p-a2c2f475.system.entry.js +0 -1
  323. package/dist/ripple/p-a3fcdd9f.entry.js +0 -1
  324. package/dist/ripple/p-a588ae81.entry.js +0 -1
  325. package/dist/ripple/p-a8358b36.entry.js +0 -1
  326. package/dist/ripple/p-a88d46f9.system.entry.js +0 -1
  327. package/dist/ripple/p-a8dfec6d.system.entry.js +0 -1
  328. package/dist/ripple/p-b1d25dec.entry.js +0 -1
  329. package/dist/ripple/p-b542340c.system.entry.js +0 -1
  330. package/dist/ripple/p-c401898d.entry.js +0 -1
  331. package/dist/ripple/p-ce81ccb4.system.entry.js +0 -1
  332. package/dist/ripple/p-cfa8106a.system.entry.js +0 -1
  333. package/dist/ripple/p-dadb6c78.js +0 -16
  334. package/dist/ripple/p-db7f5d60.entry.js +0 -1
  335. package/dist/ripple/p-dff01b0a.system.entry.js +0 -1
  336. package/dist/ripple/p-ecb6a2e0.entry.js +0 -1
  337. package/dist/ripple/p-ef344252.entry.js +0 -1
  338. package/dist/ripple/p-f0dfc5d7.entry.js +0 -1
  339. package/dist/ripple/p-f92f2d83.entry.js +0 -1
  340. package/dist/ripple/p-fe0a25c1.entry.js +0 -1
  341. package/dist/types/components/wm-navigation/wm-navigation-hamburger.d.ts +0 -13
  342. package/dist/types/components/wm-navigation/wm-navigation-item.d.ts +0 -10
  343. package/dist/types/components/wm-navigation/wm-navigation.d.ts +0 -19
@@ -1,583 +1,583 @@
1
- import { h, Component, Host, Element, Prop, Watch, State, Listen, Event } from "@stencil/core";
2
- import { intl, generateId, shouldOpenUp, isRelatedTarget } from "../../global/functions";
3
- export class Timepicker {
4
- constructor() {
5
- this.disabled = false;
6
- this.value = "";
7
- this.label = "";
8
- this.labelPosition = "top";
9
- this.requiredField = false;
10
- this.isExpanded = false;
11
- this.isTabbing = false;
12
- this.twelveHrValid = /^(0?[0-9]|1[0-2])\s*:?\s*([0-5][0-9])?\s?(a|p|am|pm)?$/i;
13
- this.twentyFourHrValid = /^(0?[0-9]|1[0-9]|2[0-4])\s*:?\s*([0-5][0-9])?$/;
14
- this.uid = "";
15
- this.timeFormat = "hh:mm";
16
- this.times = [];
17
- this.openUp = false;
18
- this.buttonAriaLabel = intl.formatMessage({
19
- id: "time.selectTime",
20
- defaultMessage: "Select time",
21
- description: "Button text for screen readers.",
22
- });
23
- }
24
- toggleTabbingOn() {
25
- this.isTabbing = true;
26
- }
27
- toggleTabbingOff() {
28
- this.isTabbing = false;
29
- }
30
- handleKey(ev) {
31
- switch (ev.key) {
32
- case "ArrowDown":
33
- ev.preventDefault();
34
- if (this.isExpanded === false) {
35
- this.open("next");
36
- }
37
- else {
38
- this.moveDown(this.selectedOption);
39
- }
40
- break;
41
- case "ArrowUp":
42
- ev.preventDefault();
43
- if (this.isExpanded === false) {
44
- this.open("previous");
45
- }
46
- else {
47
- this.moveUp(this.selectedOption);
48
- }
49
- break;
50
- case "Enter":
51
- case " ":
52
- if (this.isExpanded) {
53
- ev.preventDefault();
54
- this.handleOptionClick(this.selectedOption.textContent);
55
- }
56
- break;
57
- case "Escape":
58
- ev.preventDefault();
59
- if (this.isExpanded) {
60
- ev.stopPropagation(); // for instance if select is in a modal, esc should close the select but not the modal
61
- this.close();
62
- }
63
- break;
64
- case "Tab":
65
- if (this.isExpanded) {
66
- this.close(false);
67
- }
68
- break;
69
- case "Home":
70
- ev.preventDefault();
71
- if (this.isExpanded) {
72
- this.focusOption(this.optionsList[0]);
73
- this.setDropdownPosition("first");
74
- }
75
- break;
76
- case "End":
77
- ev.preventDefault();
78
- if (this.isExpanded) {
79
- this.focusOption(this.optionsList[this.optionsList.length - 1]);
80
- this.setDropdownPosition("last");
81
- }
82
- break;
83
- }
84
- }
85
- updateErrorState() {
86
- this.displayedErrorMessage = this.errorMessage;
87
- }
88
- componentWillLoad() {
89
- if (this.label === "") {
90
- console.error("You must include a label prop for the timepicker (for accessibility reasons), even if the label position is none.");
91
- }
92
- this.el.focus = function () {
93
- if (!this.disabled) {
94
- this.shadowRoot.querySelector("input").focus();
95
- }
96
- };
97
- this.uid = this.el.id ? this.el.id : generateId();
98
- this.updateErrorState();
99
- this.timeFormat = intl.formatMessage({
100
- id: "time.timeFormat",
101
- defaultMessage: "hh:mm",
102
- });
103
- this.times = this.generateTimes();
104
- }
105
- componentDidLoad() {
106
- this.optionsEl.classList.add("hidden");
107
- this.optionsList = Array.from(this.optionsEl.querySelectorAll("li"));
108
- if (this.value) {
109
- this.processInput();
110
- }
111
- }
112
- isValidTime(input) {
113
- return this.twelveHrValid.test(input) || this.twentyFourHrValid.test(input);
114
- }
115
- generateTimes() {
116
- let times = [];
117
- let startTime = 0;
118
- for (let i = 0; startTime < 24 * 60; i++) {
119
- const h = Math.floor(startTime / 60);
120
- const hour = h.toString().padStart(2, "0");
121
- const m = (startTime % 60).toString();
122
- const min = m.padStart(2, "0");
123
- times[i] = `${hour}:${min}`;
124
- startTime = startTime + 15;
125
- }
126
- return times;
127
- }
128
- findNearestTimeInterval(time) {
129
- let formattedTime = this.formatToStorage(time);
130
- const minutes = parseInt(formattedTime.slice(3, 5));
131
- // first find the closest 15 min increment
132
- if (minutes % 15 !== 0) {
133
- const hour = parseInt(formattedTime.slice(0, 2));
134
- let roundedMinutes = (Math.round(minutes / 15) * 15).toString().padStart(2, "0");
135
- if (roundedMinutes === "60") {
136
- roundedMinutes = "00";
137
- let roundedHour = hour + 1;
138
- if (roundedHour === 24) {
139
- roundedHour = 0;
140
- }
141
- formattedTime = formattedTime.replace(`${hour.toString().padStart(2, "0")}:`, `${roundedHour.toString().padStart(2, "0")}:`);
142
- }
143
- if (parseInt(roundedMinutes) < 8) {
144
- roundedMinutes = "00";
145
- }
146
- time = formattedTime.replace(`:${minutes.toString().padStart(2, "0")}`, `:${roundedMinutes}`);
147
- }
148
- return time;
149
- }
150
- handleListSelection(time) {
151
- time = this.findNearestTimeInterval(time);
152
- const option = this.optionsList.filter((o) => o.textContent == this.formatToDisplay(time))[0];
153
- option && this.focusOption(option);
154
- }
155
- setValue(time) {
156
- const previousValue = this.value;
157
- this.inputEl.value = this.formatToDisplay(time);
158
- this.value = this.formatToStorage(time);
159
- // update the selection in the list
160
- // so it opens on the closest item
161
- this.handleListSelection(time);
162
- if (previousValue !== this.value) {
163
- this.wmTimepickerNewValidValue.emit({ value: this.value });
164
- }
165
- // deprecated in favor of wmTimepickerNewValidValue and input
166
- this.wmTimepickerOnChange.emit({
167
- value: this.value,
168
- isValid: !!this.displayedErrorMessage,
169
- });
170
- }
171
- processInput() {
172
- if (this.isValidTime(this.value)) {
173
- this.setValue(this.value);
174
- }
175
- const newErrorMessage = this.determineErrorMessage();
176
- this.displayedErrorMessage = newErrorMessage;
177
- }
178
- determineErrorMessage() {
179
- let message = this.errorMessage;
180
- const requiredError = intl.formatMessage({
181
- id: "time.requiredError",
182
- defaultMessage: "A time is required.",
183
- });
184
- const invalidError = intl.formatMessage({
185
- id: "time.invalidTime",
186
- defaultMessage: "Please enter a valid time.",
187
- });
188
- const isValid = this.isValidTime(this.value);
189
- if (isValid && !this.errorMessage) {
190
- message = null;
191
- }
192
- else if (!isValid && !this.errorMessage) {
193
- if (this.requiredField && !this.value) {
194
- message = requiredError;
195
- }
196
- else if (this.value) {
197
- message = invalidError;
198
- }
199
- else {
200
- message = null;
201
- }
202
- }
203
- return message;
204
- }
205
- splitTime(time) {
206
- const splitTime = this.twelveHrValid.exec(time) || this.twentyFourHrValid.exec(time);
207
- let hours = parseInt(splitTime[1]);
208
- let minutes = splitTime[2] || "00";
209
- let amPm = splitTime ? splitTime[3] : undefined;
210
- // handles edge case uncaught by regex '0pm'
211
- if (hours === 0 && (amPm === null || amPm === void 0 ? void 0 : amPm.toUpperCase().includes("P"))) {
212
- // if user types '0pm' we change it to midnight
213
- amPm = "AM";
214
- }
215
- return [hours, minutes, amPm];
216
- }
217
- formatToDisplay(time) {
218
- let [hours, minutes, amPm] = this.splitTime(time);
219
- // at the moment the component only displays in 12hr AM/PM
220
- if (hours === 12 && !amPm) {
221
- amPm = "PM";
222
- }
223
- if (hours === 0 || hours === 24) {
224
- hours = 12;
225
- }
226
- if (hours > 12) {
227
- hours -= 12;
228
- amPm = "PM";
229
- }
230
- if (amPm && amPm.toUpperCase().includes("P")) {
231
- amPm = "PM";
232
- }
233
- else {
234
- amPm = "AM";
235
- }
236
- return `${hours.toString().padStart(2, "0")}:${minutes} ${amPm}`;
237
- }
238
- formatToStorage(time) {
239
- let [hours, minutes, amPm] = this.splitTime(time);
240
- if (hours === 24) {
241
- hours = 0;
242
- }
243
- if (hours === 12 && amPm && amPm.toUpperCase().includes("A")) {
244
- hours -= 12;
245
- }
246
- if (amPm && amPm.toUpperCase().includes("P") && hours !== 12) {
247
- hours += 12;
248
- }
249
- return `${hours.toString().padStart(2, "0")}:${minutes}`;
250
- }
251
- open(itemToSelect) {
252
- this.openUp = shouldOpenUp(this.el, this.optionsEl);
253
- this.isExpanded = true;
254
- this.optionsEl.classList.remove("hidden");
255
- if (this.errorMessage || !this.value) {
256
- this.handleListSelection("09:00");
257
- }
258
- this.setDropdownPosition("center", this.selectedOption);
259
- this.focusOption(this.selectedOption);
260
- window.requestAnimationFrame(() => {
261
- if (itemToSelect === "next") {
262
- this.moveDown(this.selectedOption);
263
- }
264
- else if (itemToSelect === "previous") {
265
- this.moveUp(this.selectedOption);
266
- }
267
- });
268
- }
269
- close(returnFocus = true) {
270
- this.isExpanded = false;
271
- window.setTimeout(() => {
272
- this.optionsEl.classList.add("hidden");
273
- // Returns focus to button after popup closes (no need if user is tabbing)
274
- // Delay is necessary for screenreader to get new expanded state before focus
275
- // window.requestAnimationFrame is probably enough, but since we are already using setTimeout it may as well be here
276
- // also UX wise, it makes sense for the button to only be focused after the animation is complete
277
- if (returnFocus) {
278
- this.buttonEl.focus();
279
- }
280
- }, 150);
281
- }
282
- focusOption(item) {
283
- this.optionsList.forEach((option) => {
284
- option.tabIndex = -1;
285
- });
286
- item.tabIndex = 0;
287
- this.selectedOption = item;
288
- item.focus();
289
- }
290
- setDropdownPosition(position, item) {
291
- switch (position) {
292
- case "top":
293
- const prevItem = item === null || item === void 0 ? void 0 : item.previousElementSibling;
294
- this.optionsEl.scrollTop =
295
- prevItem.getBoundingClientRect().top - this.optionsEl.getBoundingClientRect().top + this.optionsEl.scrollTop;
296
- break;
297
- case "bottom":
298
- const nextItem = item === null || item === void 0 ? void 0 : item.nextElementSibling;
299
- this.optionsEl.scrollTop =
300
- nextItem.getBoundingClientRect().bottom -
301
- this.optionsEl.getBoundingClientRect().top +
302
- this.optionsEl.scrollTop -
303
- this.optionsEl.offsetHeight;
304
- break;
305
- case "center":
306
- this.optionsEl.scrollTop =
307
- (this.optionsList.findIndex((x) => x.textContent === (item === null || item === void 0 ? void 0 : item.textContent)) - 2) * item.offsetHeight;
308
- break;
309
- case "first":
310
- this.optionsEl.scrollTop = 0;
311
- break;
312
- case "last":
313
- this.optionsEl.scrollTop = this.optionsList[0].clientHeight * this.optionsList.length;
314
- break;
315
- }
316
- }
317
- moveUp(el) {
318
- const prevEl = el.previousElementSibling;
319
- if (prevEl) {
320
- // scroll option to top of dropdown if partially obscured / out of view
321
- if (prevEl.getBoundingClientRect().top < this.optionsEl.getBoundingClientRect().top) {
322
- this.setDropdownPosition("top", el);
323
- }
324
- this.focusOption(prevEl);
325
- }
326
- else {
327
- this.focusOption(this.optionsList[this.optionsList.length - 1]);
328
- this.setDropdownPosition("last");
329
- }
330
- }
331
- moveDown(el) {
332
- const nextEl = el.nextElementSibling;
333
- if (nextEl) {
334
- // scroll option to bottom of dropdown if partially obscured / out of view
335
- if (nextEl.getBoundingClientRect().bottom > this.optionsEl.getBoundingClientRect().bottom) {
336
- this.setDropdownPosition("bottom", el);
337
- }
338
- this.focusOption(nextEl);
339
- }
340
- else {
341
- this.focusOption(this.optionsList[0]);
342
- this.setDropdownPosition("first");
343
- }
344
- }
345
- handleOptionClick(time) {
346
- this.close();
347
- this.setValue(time);
348
- this.processInput();
349
- }
350
- handleInput() {
351
- this.value = this.inputEl.value;
352
- if (this.isValidTime(this.value)) {
353
- this.handleListSelection(this.findNearestTimeInterval(this.value));
354
- this.setDropdownPosition("center", this.selectedOption);
355
- }
356
- }
357
- handleInputBlur(ev) {
358
- // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)
359
- const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);
360
- if (!shouldPreventValidation) {
361
- this.processInput();
362
- }
363
- this.tpWrapper.classList.remove("focus");
364
- }
365
- renderOptions() {
366
- return this.times.map((time, index) => (h("li", { id: `option${index + 1}`, role: "option", onClick: () => this.handleOptionClick(time) }, this.formatToDisplay(time))));
367
- }
368
- render() {
369
- return (h(Host, { id: this.uid, invalid: !!this.displayedErrorMessage ? "true" : null, onBlur: () => this.close(false) },
370
- h("div", { class: `wrapper label-${this.labelPosition} ${!!this.displayedErrorMessage ? "invalid" : ""}`, ref: (t) => (this.tpWrapper = t) },
371
- h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { id: `label-${this.uid}`, class: "label", htmlFor: `time-input-${this.uid}` },
372
- this.label,
373
- this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
374
- h("div", null,
375
- h("div", { class: "inner-wrapper" },
376
- h("input", { id: `time-input-${this.uid}`, "aria-label": this.label, "aria-describedby": `error-${this.uid}`, ref: (el) => (this.inputEl = el), onBlur: (ev) => this.handleInputBlur(ev), onInput: () => this.handleInput(), disabled: this.disabled, required: this.requiredField, placeholder: this.timeFormat, autocomplete: "off", onFocus: () => this.tpWrapper.classList.add("focus") }),
377
- h("button", { id: `btn-${this.uid}`, class: this.isTabbing ? "user-is-tabbing" : "", ref: (el) => (this.buttonEl = el), disabled: this.disabled, "aria-controls": `list-${this.uid}`, "aria-expanded": this.isExpanded ? "true" : "false", "aria-label": this.buttonAriaLabel, "aria-describedby": `time-input-${this.uid}`, onClick: () => (this.isExpanded ? this.close() : this.open()),
378
- // This addresses an issue in Safari, where clicking buttons does not focus them
379
- // if the button does not receive focus when clicked, Timepicker incorrectly emits a blur event
380
- onMouseDown: (ev) => {
381
- ev.preventDefault();
382
- this.buttonEl.focus();
383
- } },
384
- h("span", { class: "clock" })),
385
- h("ul", { class: `options ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, id: `list-${this.uid}`, role: "listbox", "aria-labelledby": `label-${this.uid}`, "aria-describedby": this.isExpanded ? "collapsed" : null, tabindex: -1, ref: (el) => (this.optionsEl = el) }, this.renderOptions())),
386
- h("div", { id: `error-${this.uid}`, class: "error", "aria-live": "assertive", "aria-atomic": "true" }, this.displayedErrorMessage)))));
387
- }
388
- static get is() { return "wm-timepicker"; }
389
- static get encapsulation() { return "shadow"; }
390
- static get originalStyleUrls() { return {
391
- "$": ["wm-timepicker.scss"]
392
- }; }
393
- static get styleUrls() { return {
394
- "$": ["wm-timepicker.css"]
395
- }; }
396
- static get properties() { return {
397
- "disabled": {
398
- "type": "boolean",
399
- "mutable": false,
400
- "complexType": {
401
- "original": "boolean",
402
- "resolved": "boolean",
403
- "references": {}
404
- },
405
- "required": false,
406
- "optional": false,
407
- "docs": {
408
- "tags": [],
409
- "text": ""
410
- },
411
- "attribute": "disabled",
412
- "reflect": false,
413
- "defaultValue": "false"
414
- },
415
- "value": {
416
- "type": "string",
417
- "mutable": true,
418
- "complexType": {
419
- "original": "string",
420
- "resolved": "string",
421
- "references": {}
422
- },
423
- "required": false,
424
- "optional": false,
425
- "docs": {
426
- "tags": [],
427
- "text": ""
428
- },
429
- "attribute": "value",
430
- "reflect": true,
431
- "defaultValue": "\"\""
432
- },
433
- "errorMessage": {
434
- "type": "string",
435
- "mutable": false,
436
- "complexType": {
437
- "original": "string | null",
438
- "resolved": "null | string | undefined",
439
- "references": {}
440
- },
441
- "required": false,
442
- "optional": true,
443
- "docs": {
444
- "tags": [],
445
- "text": ""
446
- },
447
- "attribute": "error-message",
448
- "reflect": false
449
- },
450
- "label": {
451
- "type": "string",
452
- "mutable": false,
453
- "complexType": {
454
- "original": "string",
455
- "resolved": "string",
456
- "references": {}
457
- },
458
- "required": false,
459
- "optional": false,
460
- "docs": {
461
- "tags": [],
462
- "text": ""
463
- },
464
- "attribute": "label",
465
- "reflect": false,
466
- "defaultValue": "\"\""
467
- },
468
- "labelPosition": {
469
- "type": "string",
470
- "mutable": false,
471
- "complexType": {
472
- "original": "\"top\" | \"left\" | \"none\"",
473
- "resolved": "\"left\" | \"none\" | \"top\"",
474
- "references": {}
475
- },
476
- "required": false,
477
- "optional": false,
478
- "docs": {
479
- "tags": [],
480
- "text": ""
481
- },
482
- "attribute": "label-position",
483
- "reflect": false,
484
- "defaultValue": "\"top\""
485
- },
486
- "requiredField": {
487
- "type": "boolean",
488
- "mutable": false,
489
- "complexType": {
490
- "original": "boolean",
491
- "resolved": "boolean",
492
- "references": {}
493
- },
494
- "required": false,
495
- "optional": false,
496
- "docs": {
497
- "tags": [],
498
- "text": ""
499
- },
500
- "attribute": "required-field",
501
- "reflect": false,
502
- "defaultValue": "false"
503
- },
504
- "preventValidation": {
505
- "type": "string",
506
- "mutable": false,
507
- "complexType": {
508
- "original": "string",
509
- "resolved": "string | undefined",
510
- "references": {}
511
- },
512
- "required": false,
513
- "optional": true,
514
- "docs": {
515
- "tags": [],
516
- "text": ""
517
- },
518
- "attribute": "prevent-validation",
519
- "reflect": false
520
- }
521
- }; }
522
- static get states() { return {
523
- "selectedOption": {},
524
- "isExpanded": {},
525
- "isTabbing": {},
526
- "displayedErrorMessage": {}
527
- }; }
528
- static get events() { return [{
529
- "method": "wmTimepickerNewValidValue",
530
- "name": "wmTimepickerNewValidValue",
531
- "bubbles": true,
532
- "cancelable": true,
533
- "composed": true,
534
- "docs": {
535
- "tags": [],
536
- "text": ""
537
- },
538
- "complexType": {
539
- "original": "{ value: string }",
540
- "resolved": "{ value: string; }",
541
- "references": {}
542
- }
543
- }, {
544
- "method": "wmTimepickerOnChange",
545
- "name": "wmTimepickerOnChange",
546
- "bubbles": true,
547
- "cancelable": true,
548
- "composed": true,
549
- "docs": {
550
- "tags": [],
551
- "text": ""
552
- },
553
- "complexType": {
554
- "original": "{\n // deprecated in favor of wmTimepickerNewValidValue and standard input event\n value: string;\n isValid: boolean;\n }",
555
- "resolved": "{ value: string; isValid: boolean; }",
556
- "references": {}
557
- }
558
- }]; }
559
- static get elementRef() { return "el"; }
560
- static get watchers() { return [{
561
- "propName": "errorMessage",
562
- "methodName": "updateErrorState"
563
- }]; }
564
- static get listeners() { return [{
565
- "name": "wmUserIsTabbing",
566
- "method": "toggleTabbingOn",
567
- "target": "window",
568
- "capture": false,
569
- "passive": false
570
- }, {
571
- "name": "wmUserIsNotTabbing",
572
- "method": "toggleTabbingOff",
573
- "target": "window",
574
- "capture": false,
575
- "passive": false
576
- }, {
577
- "name": "keydown",
578
- "method": "handleKey",
579
- "target": undefined,
580
- "capture": false,
581
- "passive": false
582
- }]; }
583
- }
1
+ import { h, Component, Host, Element, Prop, Watch, State, Listen, Event } from "@stencil/core";
2
+ import { intl, generateId, shouldOpenUp, isRelatedTarget } from "../../global/functions";
3
+ export class Timepicker {
4
+ constructor() {
5
+ this.disabled = false;
6
+ this.value = "";
7
+ this.label = "";
8
+ this.labelPosition = "top";
9
+ this.requiredField = false;
10
+ this.isExpanded = false;
11
+ this.isTabbing = false;
12
+ this.twelveHrValid = /^(0?[0-9]|1[0-2])\s*:?\s*([0-5][0-9])?\s?(a|p|am|pm)?$/i;
13
+ this.twentyFourHrValid = /^(0?[0-9]|1[0-9]|2[0-4])\s*:?\s*([0-5][0-9])?$/;
14
+ this.uid = "";
15
+ this.timeFormat = "hh:mm";
16
+ this.times = [];
17
+ this.openUp = false;
18
+ this.buttonAriaLabel = intl.formatMessage({
19
+ id: "time.selectTime",
20
+ defaultMessage: "Select time",
21
+ description: "Button text for screen readers.",
22
+ });
23
+ }
24
+ toggleTabbingOn() {
25
+ this.isTabbing = true;
26
+ }
27
+ toggleTabbingOff() {
28
+ this.isTabbing = false;
29
+ }
30
+ handleKey(ev) {
31
+ switch (ev.key) {
32
+ case "ArrowDown":
33
+ ev.preventDefault();
34
+ if (this.isExpanded === false) {
35
+ this.open("next");
36
+ }
37
+ else {
38
+ this.moveDown(this.selectedOption);
39
+ }
40
+ break;
41
+ case "ArrowUp":
42
+ ev.preventDefault();
43
+ if (this.isExpanded === false) {
44
+ this.open("previous");
45
+ }
46
+ else {
47
+ this.moveUp(this.selectedOption);
48
+ }
49
+ break;
50
+ case "Enter":
51
+ case " ":
52
+ if (this.isExpanded) {
53
+ ev.preventDefault();
54
+ this.handleOptionClick(this.selectedOption.textContent);
55
+ }
56
+ break;
57
+ case "Escape":
58
+ ev.preventDefault();
59
+ if (this.isExpanded) {
60
+ ev.stopPropagation(); // for instance if select is in a modal, esc should close the select but not the modal
61
+ this.close();
62
+ }
63
+ break;
64
+ case "Tab":
65
+ if (this.isExpanded) {
66
+ this.close(false);
67
+ }
68
+ break;
69
+ case "Home":
70
+ ev.preventDefault();
71
+ if (this.isExpanded) {
72
+ this.focusOption(this.optionsList[0]);
73
+ this.setDropdownPosition("first");
74
+ }
75
+ break;
76
+ case "End":
77
+ ev.preventDefault();
78
+ if (this.isExpanded) {
79
+ this.focusOption(this.optionsList[this.optionsList.length - 1]);
80
+ this.setDropdownPosition("last");
81
+ }
82
+ break;
83
+ }
84
+ }
85
+ updateErrorState() {
86
+ this.displayedErrorMessage = this.errorMessage;
87
+ }
88
+ componentWillLoad() {
89
+ if (this.label === "") {
90
+ console.error("You must include a label prop for the timepicker (for accessibility reasons), even if the label position is none.");
91
+ }
92
+ this.el.focus = function () {
93
+ if (!this.disabled) {
94
+ this.shadowRoot.querySelector("input").focus();
95
+ }
96
+ };
97
+ this.uid = this.el.id ? this.el.id : generateId();
98
+ this.updateErrorState();
99
+ this.timeFormat = intl.formatMessage({
100
+ id: "time.timeFormat",
101
+ defaultMessage: "hh:mm",
102
+ });
103
+ this.times = this.generateTimes();
104
+ }
105
+ componentDidLoad() {
106
+ this.optionsEl.classList.add("hidden");
107
+ this.optionsList = Array.from(this.optionsEl.querySelectorAll("li"));
108
+ if (this.value) {
109
+ this.processInput();
110
+ }
111
+ }
112
+ isValidTime(input) {
113
+ return this.twelveHrValid.test(input) || this.twentyFourHrValid.test(input);
114
+ }
115
+ generateTimes() {
116
+ let times = [];
117
+ let startTime = 0;
118
+ for (let i = 0; startTime < 24 * 60; i++) {
119
+ const h = Math.floor(startTime / 60);
120
+ const hour = h.toString().padStart(2, "0");
121
+ const m = (startTime % 60).toString();
122
+ const min = m.padStart(2, "0");
123
+ times[i] = `${hour}:${min}`;
124
+ startTime = startTime + 15;
125
+ }
126
+ return times;
127
+ }
128
+ findNearestTimeInterval(time) {
129
+ let formattedTime = this.formatToStorage(time);
130
+ const minutes = parseInt(formattedTime.slice(3, 5));
131
+ // first find the closest 15 min increment
132
+ if (minutes % 15 !== 0) {
133
+ const hour = parseInt(formattedTime.slice(0, 2));
134
+ let roundedMinutes = (Math.round(minutes / 15) * 15).toString().padStart(2, "0");
135
+ if (roundedMinutes === "60") {
136
+ roundedMinutes = "00";
137
+ let roundedHour = hour + 1;
138
+ if (roundedHour === 24) {
139
+ roundedHour = 0;
140
+ }
141
+ formattedTime = formattedTime.replace(`${hour.toString().padStart(2, "0")}:`, `${roundedHour.toString().padStart(2, "0")}:`);
142
+ }
143
+ if (parseInt(roundedMinutes) < 8) {
144
+ roundedMinutes = "00";
145
+ }
146
+ time = formattedTime.replace(`:${minutes.toString().padStart(2, "0")}`, `:${roundedMinutes}`);
147
+ }
148
+ return time;
149
+ }
150
+ handleListSelection(time) {
151
+ time = this.findNearestTimeInterval(time);
152
+ const option = this.optionsList.filter((o) => o.textContent == this.formatToDisplay(time))[0];
153
+ option && this.focusOption(option);
154
+ }
155
+ setValue(time) {
156
+ const previousValue = this.value;
157
+ this.inputEl.value = this.formatToDisplay(time);
158
+ this.value = this.formatToStorage(time);
159
+ // update the selection in the list
160
+ // so it opens on the closest item
161
+ this.handleListSelection(time);
162
+ if (previousValue !== this.value) {
163
+ this.wmTimepickerNewValidValue.emit({ value: this.value });
164
+ }
165
+ // deprecated in favor of wmTimepickerNewValidValue and input
166
+ this.wmTimepickerOnChange.emit({
167
+ value: this.value,
168
+ isValid: !!this.displayedErrorMessage,
169
+ });
170
+ }
171
+ processInput() {
172
+ if (this.isValidTime(this.value)) {
173
+ this.setValue(this.value);
174
+ }
175
+ const newErrorMessage = this.determineErrorMessage();
176
+ this.displayedErrorMessage = newErrorMessage;
177
+ }
178
+ determineErrorMessage() {
179
+ let message = this.errorMessage;
180
+ const requiredError = intl.formatMessage({
181
+ id: "time.requiredError",
182
+ defaultMessage: "A time is required.",
183
+ });
184
+ const invalidError = intl.formatMessage({
185
+ id: "time.invalidTime",
186
+ defaultMessage: "Please enter a valid time.",
187
+ });
188
+ const isValid = this.isValidTime(this.value);
189
+ if (isValid && !this.errorMessage) {
190
+ message = null;
191
+ }
192
+ else if (!isValid && !this.errorMessage) {
193
+ if (this.requiredField && !this.value) {
194
+ message = requiredError;
195
+ }
196
+ else if (this.value) {
197
+ message = invalidError;
198
+ }
199
+ else {
200
+ message = null;
201
+ }
202
+ }
203
+ return message;
204
+ }
205
+ splitTime(time) {
206
+ const splitTime = this.twelveHrValid.exec(time) || this.twentyFourHrValid.exec(time);
207
+ let hours = parseInt(splitTime[1]);
208
+ let minutes = splitTime[2] || "00";
209
+ let amPm = splitTime ? splitTime[3] : undefined;
210
+ // handles edge case uncaught by regex '0pm'
211
+ if (hours === 0 && (amPm === null || amPm === void 0 ? void 0 : amPm.toUpperCase().includes("P"))) {
212
+ // if user types '0pm' we change it to midnight
213
+ amPm = "AM";
214
+ }
215
+ return [hours, minutes, amPm];
216
+ }
217
+ formatToDisplay(time) {
218
+ let [hours, minutes, amPm] = this.splitTime(time);
219
+ // at the moment the component only displays in 12hr AM/PM
220
+ if (hours === 12 && !amPm) {
221
+ amPm = "PM";
222
+ }
223
+ if (hours === 0 || hours === 24) {
224
+ hours = 12;
225
+ }
226
+ if (hours > 12) {
227
+ hours -= 12;
228
+ amPm = "PM";
229
+ }
230
+ if (amPm && amPm.toUpperCase().includes("P")) {
231
+ amPm = "PM";
232
+ }
233
+ else {
234
+ amPm = "AM";
235
+ }
236
+ return `${hours.toString().padStart(2, "0")}:${minutes} ${amPm}`;
237
+ }
238
+ formatToStorage(time) {
239
+ let [hours, minutes, amPm] = this.splitTime(time);
240
+ if (hours === 24) {
241
+ hours = 0;
242
+ }
243
+ if (hours === 12 && amPm && amPm.toUpperCase().includes("A")) {
244
+ hours -= 12;
245
+ }
246
+ if (amPm && amPm.toUpperCase().includes("P") && hours !== 12) {
247
+ hours += 12;
248
+ }
249
+ return `${hours.toString().padStart(2, "0")}:${minutes}`;
250
+ }
251
+ open(itemToSelect) {
252
+ this.openUp = shouldOpenUp(this.el, this.optionsEl);
253
+ this.isExpanded = true;
254
+ this.optionsEl.classList.remove("hidden");
255
+ if (this.errorMessage || !this.value) {
256
+ this.handleListSelection("09:00");
257
+ }
258
+ this.setDropdownPosition("center", this.selectedOption);
259
+ this.focusOption(this.selectedOption);
260
+ window.requestAnimationFrame(() => {
261
+ if (itemToSelect === "next") {
262
+ this.moveDown(this.selectedOption);
263
+ }
264
+ else if (itemToSelect === "previous") {
265
+ this.moveUp(this.selectedOption);
266
+ }
267
+ });
268
+ }
269
+ close(returnFocus = true) {
270
+ this.isExpanded = false;
271
+ window.setTimeout(() => {
272
+ this.optionsEl.classList.add("hidden");
273
+ // Returns focus to button after popup closes (no need if user is tabbing)
274
+ // Delay is necessary for screenreader to get new expanded state before focus
275
+ // window.requestAnimationFrame is probably enough, but since we are already using setTimeout it may as well be here
276
+ // also UX wise, it makes sense for the button to only be focused after the animation is complete
277
+ if (returnFocus) {
278
+ this.buttonEl.focus();
279
+ }
280
+ }, 150);
281
+ }
282
+ focusOption(item) {
283
+ this.optionsList.forEach((option) => {
284
+ option.tabIndex = -1;
285
+ });
286
+ item.tabIndex = 0;
287
+ this.selectedOption = item;
288
+ item.focus();
289
+ }
290
+ setDropdownPosition(position, item) {
291
+ switch (position) {
292
+ case "top":
293
+ const prevItem = item === null || item === void 0 ? void 0 : item.previousElementSibling;
294
+ this.optionsEl.scrollTop =
295
+ prevItem.getBoundingClientRect().top - this.optionsEl.getBoundingClientRect().top + this.optionsEl.scrollTop;
296
+ break;
297
+ case "bottom":
298
+ const nextItem = item === null || item === void 0 ? void 0 : item.nextElementSibling;
299
+ this.optionsEl.scrollTop =
300
+ nextItem.getBoundingClientRect().bottom -
301
+ this.optionsEl.getBoundingClientRect().top +
302
+ this.optionsEl.scrollTop -
303
+ this.optionsEl.offsetHeight;
304
+ break;
305
+ case "center":
306
+ this.optionsEl.scrollTop =
307
+ (this.optionsList.findIndex((x) => x.textContent === (item === null || item === void 0 ? void 0 : item.textContent)) - 2) * item.offsetHeight;
308
+ break;
309
+ case "first":
310
+ this.optionsEl.scrollTop = 0;
311
+ break;
312
+ case "last":
313
+ this.optionsEl.scrollTop = this.optionsList[0].clientHeight * this.optionsList.length;
314
+ break;
315
+ }
316
+ }
317
+ moveUp(el) {
318
+ const prevEl = el.previousElementSibling;
319
+ if (prevEl) {
320
+ // scroll option to top of dropdown if partially obscured / out of view
321
+ if (prevEl.getBoundingClientRect().top < this.optionsEl.getBoundingClientRect().top) {
322
+ this.setDropdownPosition("top", el);
323
+ }
324
+ this.focusOption(prevEl);
325
+ }
326
+ else {
327
+ this.focusOption(this.optionsList[this.optionsList.length - 1]);
328
+ this.setDropdownPosition("last");
329
+ }
330
+ }
331
+ moveDown(el) {
332
+ const nextEl = el.nextElementSibling;
333
+ if (nextEl) {
334
+ // scroll option to bottom of dropdown if partially obscured / out of view
335
+ if (nextEl.getBoundingClientRect().bottom > this.optionsEl.getBoundingClientRect().bottom) {
336
+ this.setDropdownPosition("bottom", el);
337
+ }
338
+ this.focusOption(nextEl);
339
+ }
340
+ else {
341
+ this.focusOption(this.optionsList[0]);
342
+ this.setDropdownPosition("first");
343
+ }
344
+ }
345
+ handleOptionClick(time) {
346
+ this.close();
347
+ this.setValue(time);
348
+ this.processInput();
349
+ }
350
+ handleInput() {
351
+ this.value = this.inputEl.value;
352
+ if (this.isValidTime(this.value)) {
353
+ this.handleListSelection(this.findNearestTimeInterval(this.value));
354
+ this.setDropdownPosition("center", this.selectedOption);
355
+ }
356
+ }
357
+ handleInputBlur(ev) {
358
+ // do not validate if clicking to an element that should prevent validation (e.g. close button on modal)
359
+ const shouldPreventValidation = this.preventValidation && isRelatedTarget(ev, this.preventValidation);
360
+ if (!shouldPreventValidation) {
361
+ this.processInput();
362
+ }
363
+ this.tpWrapper.classList.remove("focus");
364
+ }
365
+ renderOptions() {
366
+ return this.times.map((time, index) => (h("li", { id: `option${index + 1}`, role: "option", onClick: () => this.handleOptionClick(time) }, this.formatToDisplay(time))));
367
+ }
368
+ render() {
369
+ return (h(Host, { id: this.uid, invalid: !!this.displayedErrorMessage ? "true" : null, onBlur: () => this.close(false) },
370
+ h("div", { class: `wrapper label-${this.labelPosition} ${!!this.displayedErrorMessage ? "invalid" : ""}`, ref: (t) => (this.tpWrapper = t) },
371
+ h("div", { class: "label-wrapper" }, this.labelPosition !== "none" && (h("label", { id: `label-${this.uid}`, class: "label", htmlFor: `time-input-${this.uid}` },
372
+ this.label,
373
+ this.requiredField && (h("span", { class: "required", "aria-hidden": "true" }, "*"))))),
374
+ h("div", null,
375
+ h("div", { class: "inner-wrapper" },
376
+ h("input", { id: `time-input-${this.uid}`, "aria-label": this.label, "aria-describedby": `error-${this.uid}`, ref: (el) => (this.inputEl = el), onBlur: (ev) => this.handleInputBlur(ev), onInput: () => this.handleInput(), disabled: this.disabled, required: this.requiredField, placeholder: this.timeFormat, autocomplete: "off", onFocus: () => this.tpWrapper.classList.add("focus") }),
377
+ h("button", { id: `btn-${this.uid}`, class: this.isTabbing ? "user-is-tabbing" : "", ref: (el) => (this.buttonEl = el), disabled: this.disabled, "aria-controls": `list-${this.uid}`, "aria-expanded": this.isExpanded ? "true" : "false", "aria-label": this.buttonAriaLabel, "aria-describedby": `time-input-${this.uid}`, onClick: () => (this.isExpanded ? this.close() : this.open()),
378
+ // This addresses an issue in Safari, where clicking buttons does not focus them
379
+ // if the button does not receive focus when clicked, Timepicker incorrectly emits a blur event
380
+ onMouseDown: (ev) => {
381
+ ev.preventDefault();
382
+ this.buttonEl.focus();
383
+ } },
384
+ h("span", { class: "clock" })),
385
+ h("ul", { class: `options ${this.isExpanded ? "open" : ""} ${this.openUp ? "upwards" : ""}`, id: `list-${this.uid}`, role: "listbox", "aria-labelledby": `label-${this.uid}`, "aria-describedby": this.isExpanded ? "collapsed" : null, tabindex: -1, ref: (el) => (this.optionsEl = el) }, this.renderOptions())),
386
+ h("div", { id: `error-${this.uid}`, class: "error", "aria-live": "assertive", "aria-atomic": "true" }, this.displayedErrorMessage)))));
387
+ }
388
+ static get is() { return "wm-timepicker"; }
389
+ static get encapsulation() { return "shadow"; }
390
+ static get originalStyleUrls() { return {
391
+ "$": ["wm-timepicker.scss"]
392
+ }; }
393
+ static get styleUrls() { return {
394
+ "$": ["wm-timepicker.css"]
395
+ }; }
396
+ static get properties() { return {
397
+ "disabled": {
398
+ "type": "boolean",
399
+ "mutable": false,
400
+ "complexType": {
401
+ "original": "boolean",
402
+ "resolved": "boolean",
403
+ "references": {}
404
+ },
405
+ "required": false,
406
+ "optional": false,
407
+ "docs": {
408
+ "tags": [],
409
+ "text": ""
410
+ },
411
+ "attribute": "disabled",
412
+ "reflect": false,
413
+ "defaultValue": "false"
414
+ },
415
+ "value": {
416
+ "type": "string",
417
+ "mutable": true,
418
+ "complexType": {
419
+ "original": "string",
420
+ "resolved": "string",
421
+ "references": {}
422
+ },
423
+ "required": false,
424
+ "optional": false,
425
+ "docs": {
426
+ "tags": [],
427
+ "text": ""
428
+ },
429
+ "attribute": "value",
430
+ "reflect": true,
431
+ "defaultValue": "\"\""
432
+ },
433
+ "errorMessage": {
434
+ "type": "string",
435
+ "mutable": false,
436
+ "complexType": {
437
+ "original": "string | null",
438
+ "resolved": "null | string | undefined",
439
+ "references": {}
440
+ },
441
+ "required": false,
442
+ "optional": true,
443
+ "docs": {
444
+ "tags": [],
445
+ "text": ""
446
+ },
447
+ "attribute": "error-message",
448
+ "reflect": false
449
+ },
450
+ "label": {
451
+ "type": "string",
452
+ "mutable": false,
453
+ "complexType": {
454
+ "original": "string",
455
+ "resolved": "string",
456
+ "references": {}
457
+ },
458
+ "required": false,
459
+ "optional": false,
460
+ "docs": {
461
+ "tags": [],
462
+ "text": ""
463
+ },
464
+ "attribute": "label",
465
+ "reflect": false,
466
+ "defaultValue": "\"\""
467
+ },
468
+ "labelPosition": {
469
+ "type": "string",
470
+ "mutable": false,
471
+ "complexType": {
472
+ "original": "\"top\" | \"left\" | \"none\"",
473
+ "resolved": "\"left\" | \"none\" | \"top\"",
474
+ "references": {}
475
+ },
476
+ "required": false,
477
+ "optional": false,
478
+ "docs": {
479
+ "tags": [],
480
+ "text": ""
481
+ },
482
+ "attribute": "label-position",
483
+ "reflect": false,
484
+ "defaultValue": "\"top\""
485
+ },
486
+ "requiredField": {
487
+ "type": "boolean",
488
+ "mutable": false,
489
+ "complexType": {
490
+ "original": "boolean",
491
+ "resolved": "boolean",
492
+ "references": {}
493
+ },
494
+ "required": false,
495
+ "optional": false,
496
+ "docs": {
497
+ "tags": [],
498
+ "text": ""
499
+ },
500
+ "attribute": "required-field",
501
+ "reflect": false,
502
+ "defaultValue": "false"
503
+ },
504
+ "preventValidation": {
505
+ "type": "string",
506
+ "mutable": false,
507
+ "complexType": {
508
+ "original": "string",
509
+ "resolved": "string | undefined",
510
+ "references": {}
511
+ },
512
+ "required": false,
513
+ "optional": true,
514
+ "docs": {
515
+ "tags": [],
516
+ "text": ""
517
+ },
518
+ "attribute": "prevent-validation",
519
+ "reflect": false
520
+ }
521
+ }; }
522
+ static get states() { return {
523
+ "selectedOption": {},
524
+ "isExpanded": {},
525
+ "isTabbing": {},
526
+ "displayedErrorMessage": {}
527
+ }; }
528
+ static get events() { return [{
529
+ "method": "wmTimepickerNewValidValue",
530
+ "name": "wmTimepickerNewValidValue",
531
+ "bubbles": true,
532
+ "cancelable": true,
533
+ "composed": true,
534
+ "docs": {
535
+ "tags": [],
536
+ "text": ""
537
+ },
538
+ "complexType": {
539
+ "original": "{ value: string }",
540
+ "resolved": "{ value: string; }",
541
+ "references": {}
542
+ }
543
+ }, {
544
+ "method": "wmTimepickerOnChange",
545
+ "name": "wmTimepickerOnChange",
546
+ "bubbles": true,
547
+ "cancelable": true,
548
+ "composed": true,
549
+ "docs": {
550
+ "tags": [],
551
+ "text": ""
552
+ },
553
+ "complexType": {
554
+ "original": "{\r\n // deprecated in favor of wmTimepickerNewValidValue and standard input event\r\n value: string;\r\n isValid: boolean;\r\n }",
555
+ "resolved": "{ value: string; isValid: boolean; }",
556
+ "references": {}
557
+ }
558
+ }]; }
559
+ static get elementRef() { return "el"; }
560
+ static get watchers() { return [{
561
+ "propName": "errorMessage",
562
+ "methodName": "updateErrorState"
563
+ }]; }
564
+ static get listeners() { return [{
565
+ "name": "wmUserIsTabbing",
566
+ "method": "toggleTabbingOn",
567
+ "target": "window",
568
+ "capture": false,
569
+ "passive": false
570
+ }, {
571
+ "name": "wmUserIsNotTabbing",
572
+ "method": "toggleTabbingOff",
573
+ "target": "window",
574
+ "capture": false,
575
+ "passive": false
576
+ }, {
577
+ "name": "keydown",
578
+ "method": "handleKey",
579
+ "target": undefined,
580
+ "capture": false,
581
+ "passive": false
582
+ }]; }
583
+ }