@nanoporetech-digital/components 2.10.1 → 2.11.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 (333) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/{date-utils-0ae9a12d.js → date-utils-b3af910d.js} +2 -2
  3. package/dist/cjs/date-utils-b3af910d.js.map +1 -0
  4. package/dist/cjs/{global-0d4f3b77.js → global-989678ec.js} +1 -8
  5. package/dist/cjs/global-989678ec.js.map +1 -0
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/nano-components.cjs.js +2 -2
  8. package/dist/cjs/nano-datalist_3.cjs.entry.js +3 -1
  9. package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nano-date-input.cjs.entry.js +13 -5
  11. package/dist/cjs/nano-date-input.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nano-date-picker.cjs.entry.js +2 -2
  13. package/dist/cjs/nano-date-picker.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nano-details.cjs.entry.js +1 -2
  15. package/dist/cjs/nano-details.cjs.entry.js.map +1 -1
  16. package/dist/cjs/nano-global-search-results.cjs.entry.js +1 -2
  17. package/dist/cjs/nano-global-search-results.cjs.entry.js.map +1 -1
  18. package/dist/cjs/nano-grid_3.cjs.entry.js +1 -2
  19. package/dist/cjs/nano-grid_3.cjs.entry.js.map +1 -1
  20. package/dist/cjs/nano-icon-button.cjs.entry.js +4 -0
  21. package/dist/cjs/nano-icon-button.cjs.entry.js.map +1 -1
  22. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +1 -2
  23. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  24. package/dist/cjs/nano-slides.cjs.entry.js +1 -2
  25. package/dist/cjs/nano-slides.cjs.entry.js.map +1 -1
  26. package/dist/cjs/nano-sticker.cjs.entry.js +2 -3
  27. package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
  28. package/dist/cjs/nano-tab-group.cjs.entry.js +4 -2
  29. package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
  30. package/dist/cjs/nano-tab.cjs.entry.js +5 -1
  31. package/dist/cjs/nano-tab.cjs.entry.js.map +1 -1
  32. package/dist/cjs/nano-tooltip.cjs.entry.js +1 -1
  33. package/dist/cjs/nano-tooltip.cjs.entry.js.map +1 -1
  34. package/dist/collection/components/accordion/accordion.js +1 -1
  35. package/dist/collection/components/alert/alert.js +1 -1
  36. package/dist/collection/components/algolia/algolia-filter.js +2 -2
  37. package/dist/collection/components/algolia/algolia-input.js +5 -5
  38. package/dist/collection/components/algolia/algolia-results.js +1 -1
  39. package/dist/collection/components/algolia/algolia.js +6 -6
  40. package/dist/collection/components/checkbox/checkbox-group.js +2 -2
  41. package/dist/collection/components/checkbox/checkbox.js +3 -3
  42. package/dist/collection/components/datalist/datalist.js +4 -2
  43. package/dist/collection/components/datalist/datalist.js.map +1 -1
  44. package/dist/collection/components/date-input/date-input.js +62 -11
  45. package/dist/collection/components/date-input/date-input.js.map +1 -1
  46. package/dist/collection/components/date-picker/date-picker.css +1 -1
  47. package/dist/collection/components/date-picker/date-picker.js +5 -5
  48. package/dist/collection/components/details/details.js +1 -2
  49. package/dist/collection/components/details/details.js.map +1 -1
  50. package/dist/collection/components/dialog/dialog.js +1 -1
  51. package/dist/collection/components/dropdown/dropdown.js +1 -1
  52. package/dist/collection/components/file-upload/file-upload.js +4 -4
  53. package/dist/collection/components/global-nav/global-nav.js +4 -4
  54. package/dist/collection/components/global-search-results/global-search-results.js +0 -1
  55. package/dist/collection/components/global-search-results/global-search-results.js.map +1 -1
  56. package/dist/collection/components/grid/grid-item.js +1 -1
  57. package/dist/collection/components/grid/grid.js +0 -1
  58. package/dist/collection/components/grid/grid.js.map +1 -1
  59. package/dist/collection/components/icon/icon.js +1 -1
  60. package/dist/collection/components/icon-button/icon-button.js +23 -1
  61. package/dist/collection/components/icon-button/icon-button.js.map +1 -1
  62. package/dist/collection/components/input/input.js +5 -5
  63. package/dist/collection/components/nav-item/nav-item.js +4 -4
  64. package/dist/collection/components/range/range.js +4 -4
  65. package/dist/collection/components/resize-observe/resize-observe.js +1 -2
  66. package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
  67. package/dist/collection/components/select/select.js +7 -7
  68. package/dist/collection/components/slides/slides.js +7 -8
  69. package/dist/collection/components/slides/slides.js.map +1 -1
  70. package/dist/collection/components/sticker/sticker.js +0 -1
  71. package/dist/collection/components/sticker/sticker.js.map +1 -1
  72. package/dist/collection/components/tabs/tab-group.js +5 -3
  73. package/dist/collection/components/tabs/tab-group.js.map +1 -1
  74. package/dist/collection/components/tabs/tab.js +5 -1
  75. package/dist/collection/components/tabs/tab.js.map +1 -1
  76. package/dist/collection/components/tooltip/tooltip.css +0 -1
  77. package/dist/collection/global/script/global.js +0 -7
  78. package/dist/collection/global/script/global.js.map +1 -1
  79. package/dist/collection/utils/date-utils.js +1 -1
  80. package/dist/collection/utils/date-utils.js.map +1 -1
  81. package/dist/components/datalist.js +3 -1
  82. package/dist/components/datalist.js.map +1 -1
  83. package/dist/components/date-picker.js +2 -2
  84. package/dist/components/date-picker.js.map +1 -1
  85. package/dist/components/grid.js +1 -2
  86. package/dist/components/grid.js.map +1 -1
  87. package/dist/components/icon-button.js +6 -1
  88. package/dist/components/icon-button.js.map +1 -1
  89. package/dist/components/index.js +0 -7
  90. package/dist/components/index.js.map +1 -1
  91. package/dist/components/nano-date-input.js +14 -4
  92. package/dist/components/nano-date-input.js.map +1 -1
  93. package/dist/components/nano-details.js +1 -2
  94. package/dist/components/nano-details.js.map +1 -1
  95. package/dist/components/nano-global-search-results.js +1 -2
  96. package/dist/components/nano-global-search-results.js.map +1 -1
  97. package/dist/components/nano-slides.js +1 -2
  98. package/dist/components/nano-slides.js.map +1 -1
  99. package/dist/components/nano-tab-group.js +4 -2
  100. package/dist/components/nano-tab-group.js.map +1 -1
  101. package/dist/components/nano-tab.js +5 -1
  102. package/dist/components/nano-tab.js.map +1 -1
  103. package/dist/components/resize-observe.js +1 -2
  104. package/dist/components/resize-observe.js.map +1 -1
  105. package/dist/components/sticker.js +2 -3
  106. package/dist/components/sticker.js.map +1 -1
  107. package/dist/components/tooltip.js +1 -1
  108. package/dist/components/tooltip.js.map +1 -1
  109. package/dist/custom-elements/index.js +41 -1938
  110. package/dist/custom-elements/index.js.map +1 -1
  111. package/dist/esm/{date-utils-e4b757ff.js → date-utils-839cb010.js} +2 -2
  112. package/dist/esm/date-utils-839cb010.js.map +1 -0
  113. package/dist/esm/{global-d5ec4d53.js → global-8047b4ff.js} +1 -8
  114. package/dist/esm/global-8047b4ff.js.map +1 -0
  115. package/dist/esm/loader.js +2 -2
  116. package/dist/esm/nano-components.js +2 -2
  117. package/dist/esm/nano-datalist_3.entry.js +3 -1
  118. package/dist/esm/nano-datalist_3.entry.js.map +1 -1
  119. package/dist/esm/nano-date-input.entry.js +13 -5
  120. package/dist/esm/nano-date-input.entry.js.map +1 -1
  121. package/dist/esm/nano-date-picker.entry.js +2 -2
  122. package/dist/esm/nano-date-picker.entry.js.map +1 -1
  123. package/dist/esm/nano-details.entry.js +1 -2
  124. package/dist/esm/nano-details.entry.js.map +1 -1
  125. package/dist/esm/nano-global-search-results.entry.js +1 -2
  126. package/dist/esm/nano-global-search-results.entry.js.map +1 -1
  127. package/dist/esm/nano-grid_3.entry.js +1 -2
  128. package/dist/esm/nano-grid_3.entry.js.map +1 -1
  129. package/dist/esm/nano-icon-button.entry.js +4 -0
  130. package/dist/esm/nano-icon-button.entry.js.map +1 -1
  131. package/dist/esm/nano-resize-observe_2.entry.js +1 -2
  132. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  133. package/dist/esm/nano-slides.entry.js +1 -2
  134. package/dist/esm/nano-slides.entry.js.map +1 -1
  135. package/dist/esm/nano-sticker.entry.js +2 -3
  136. package/dist/esm/nano-sticker.entry.js.map +1 -1
  137. package/dist/esm/nano-tab-group.entry.js +4 -2
  138. package/dist/esm/nano-tab-group.entry.js.map +1 -1
  139. package/dist/esm/nano-tab.entry.js +5 -1
  140. package/dist/esm/nano-tab.entry.js.map +1 -1
  141. package/dist/esm/nano-tooltip.entry.js +1 -1
  142. package/dist/esm/nano-tooltip.entry.js.map +1 -1
  143. package/dist/esm-es5/date-utils-839cb010.js +5 -0
  144. package/dist/esm-es5/date-utils-839cb010.js.map +1 -0
  145. package/dist/esm-es5/{global-d5ec4d53.js → global-8047b4ff.js} +2 -2
  146. package/dist/esm-es5/global-8047b4ff.js.map +1 -0
  147. package/dist/esm-es5/loader.js +1 -1
  148. package/dist/esm-es5/loader.js.map +1 -1
  149. package/dist/esm-es5/nano-components.js +1 -1
  150. package/dist/esm-es5/nano-components.js.map +1 -1
  151. package/dist/esm-es5/nano-datalist_3.entry.js +1 -1
  152. package/dist/esm-es5/nano-datalist_3.entry.js.map +1 -1
  153. package/dist/esm-es5/nano-date-input.entry.js +1 -1
  154. package/dist/esm-es5/nano-date-input.entry.js.map +1 -1
  155. package/dist/esm-es5/nano-date-picker.entry.js +1 -1
  156. package/dist/esm-es5/nano-date-picker.entry.js.map +1 -1
  157. package/dist/esm-es5/nano-details.entry.js +1 -1
  158. package/dist/esm-es5/nano-details.entry.js.map +1 -1
  159. package/dist/esm-es5/nano-global-search-results.entry.js +1 -1
  160. package/dist/esm-es5/nano-global-search-results.entry.js.map +1 -1
  161. package/dist/esm-es5/nano-grid_3.entry.js +1 -1
  162. package/dist/esm-es5/nano-grid_3.entry.js.map +1 -1
  163. package/dist/esm-es5/nano-icon-button.entry.js +2 -2
  164. package/dist/esm-es5/nano-icon-button.entry.js.map +1 -1
  165. package/dist/esm-es5/nano-resize-observe_2.entry.js +1 -1
  166. package/dist/esm-es5/nano-resize-observe_2.entry.js.map +1 -1
  167. package/dist/esm-es5/nano-slides.entry.js +2 -2
  168. package/dist/esm-es5/nano-slides.entry.js.map +1 -1
  169. package/dist/esm-es5/nano-sticker.entry.js +1 -1
  170. package/dist/esm-es5/nano-sticker.entry.js.map +1 -1
  171. package/dist/esm-es5/nano-tab-group.entry.js +2 -2
  172. package/dist/esm-es5/nano-tab-group.entry.js.map +1 -1
  173. package/dist/esm-es5/nano-tab.entry.js +2 -2
  174. package/dist/esm-es5/nano-tab.entry.js.map +1 -1
  175. package/dist/esm-es5/nano-tooltip.entry.js +1 -1
  176. package/dist/esm-es5/nano-tooltip.entry.js.map +1 -1
  177. package/dist/nano-components/nano-components.esm.js +1 -1
  178. package/dist/nano-components/nano-components.esm.js.map +1 -1
  179. package/dist/nano-components/nano-components.js +1 -1
  180. package/dist/nano-components/p-0193a282.entry.js +5 -0
  181. package/dist/nano-components/p-0193a282.entry.js.map +1 -0
  182. package/dist/nano-components/p-0320410c.entry.js +5 -0
  183. package/dist/nano-components/p-0320410c.entry.js.map +1 -0
  184. package/dist/nano-components/p-2720ee8f.entry.js +5 -0
  185. package/dist/nano-components/p-2720ee8f.entry.js.map +1 -0
  186. package/dist/nano-components/p-32900c91.entry.js +5 -0
  187. package/dist/nano-components/p-32900c91.entry.js.map +1 -0
  188. package/dist/nano-components/p-33fce1a6.js +5 -0
  189. package/dist/nano-components/p-33fce1a6.js.map +1 -0
  190. package/dist/nano-components/p-371aebe7.system.entry.js +23 -0
  191. package/dist/nano-components/p-371aebe7.system.entry.js.map +1 -0
  192. package/dist/nano-components/p-41899a31.system.entry.js +5 -0
  193. package/dist/nano-components/p-41899a31.system.entry.js.map +1 -0
  194. package/dist/nano-components/p-53957ec6.system.js +5 -0
  195. package/dist/nano-components/{p-e7140887.system.js.map → p-53957ec6.system.js.map} +1 -1
  196. package/dist/nano-components/p-561500f0.system.entry.js +5 -0
  197. package/dist/nano-components/p-561500f0.system.entry.js.map +1 -0
  198. package/dist/nano-components/p-70272eae.js +5 -0
  199. package/dist/nano-components/p-70272eae.js.map +1 -0
  200. package/dist/nano-components/p-755d9227.entry.js +5 -0
  201. package/dist/nano-components/p-755d9227.entry.js.map +1 -0
  202. package/dist/nano-components/p-7bd25494.entry.js +5 -0
  203. package/dist/nano-components/p-7bd25494.entry.js.map +1 -0
  204. package/dist/nano-components/p-7c837460.entry.js +5 -0
  205. package/dist/nano-components/p-7c837460.entry.js.map +1 -0
  206. package/dist/nano-components/{p-93880c28.system.js → p-82e28afd.system.js} +2 -2
  207. package/dist/nano-components/p-82e28afd.system.js.map +1 -0
  208. package/dist/nano-components/p-8378428e.system.js +5 -0
  209. package/dist/nano-components/p-8378428e.system.js.map +1 -0
  210. package/dist/nano-components/p-8df4f125.system.entry.js +5 -0
  211. package/dist/nano-components/p-8df4f125.system.entry.js.map +1 -0
  212. package/dist/nano-components/{p-d0385948.system.entry.js → p-93596c3d.system.entry.js} +2 -2
  213. package/dist/nano-components/p-93596c3d.system.entry.js.map +1 -0
  214. package/dist/nano-components/{p-3e930ac7.entry.js → p-9d9b0b66.entry.js} +2 -2
  215. package/dist/nano-components/p-9d9b0b66.entry.js.map +1 -0
  216. package/dist/nano-components/p-9ffdf6cc.entry.js +5 -0
  217. package/dist/nano-components/{p-222d8095.entry.js.map → p-9ffdf6cc.entry.js.map} +1 -1
  218. package/dist/nano-components/p-a1444980.entry.js +5 -0
  219. package/dist/nano-components/p-a1444980.entry.js.map +1 -0
  220. package/dist/nano-components/p-aa84c727.system.entry.js +5 -0
  221. package/dist/nano-components/p-aa84c727.system.entry.js.map +1 -0
  222. package/dist/nano-components/p-ac5e3775.system.entry.js +5 -0
  223. package/dist/nano-components/p-ac5e3775.system.entry.js.map +1 -0
  224. package/dist/nano-components/p-b85cf493.system.entry.js +5 -0
  225. package/dist/nano-components/{p-e817ab4a.system.entry.js.map → p-b85cf493.system.entry.js.map} +1 -1
  226. package/dist/nano-components/{p-1030797a.entry.js → p-d37e1489.entry.js} +2 -2
  227. package/dist/nano-components/p-d37e1489.entry.js.map +1 -0
  228. package/dist/nano-components/p-d61ae833.system.entry.js +5 -0
  229. package/dist/nano-components/p-d61ae833.system.entry.js.map +1 -0
  230. package/dist/nano-components/p-d93274de.entry.js +5 -0
  231. package/dist/nano-components/p-d93274de.entry.js.map +1 -0
  232. package/dist/nano-components/p-da88981f.entry.js +23 -0
  233. package/dist/nano-components/p-da88981f.entry.js.map +1 -0
  234. package/dist/nano-components/p-e8a913ac.system.entry.js +5 -0
  235. package/dist/nano-components/p-e8a913ac.system.entry.js.map +1 -0
  236. package/dist/nano-components/p-e9a279ee.system.entry.js +5 -0
  237. package/dist/nano-components/p-e9a279ee.system.entry.js.map +1 -0
  238. package/dist/nano-components/p-faba2fc1.system.entry.js +5 -0
  239. package/dist/nano-components/p-faba2fc1.system.entry.js.map +1 -0
  240. package/dist/nano-components/p-ff026352.system.entry.js +5 -0
  241. package/dist/nano-components/p-ff026352.system.entry.js.map +1 -0
  242. package/dist/types/components/date-input/date-input.d.ts +6 -1
  243. package/dist/types/components/icon-button/icon-button.d.ts +2 -0
  244. package/dist/types/components/tabs/tab.d.ts +1 -0
  245. package/dist/types/components.d.ts +20 -0
  246. package/docs-json.json +54 -2
  247. package/package.json +2 -4
  248. package/dist/cjs/ResizeObserver.es-09b81a1b.js +0 -935
  249. package/dist/cjs/ResizeObserver.es-09b81a1b.js.map +0 -1
  250. package/dist/cjs/date-utils-0ae9a12d.js.map +0 -1
  251. package/dist/cjs/global-0d4f3b77.js.map +0 -1
  252. package/dist/cjs/intersection-observer-1822c787.js +0 -987
  253. package/dist/cjs/intersection-observer-1822c787.js.map +0 -1
  254. package/dist/components/ResizeObserver.es.js +0 -933
  255. package/dist/components/ResizeObserver.es.js.map +0 -1
  256. package/dist/components/intersection-observer.js +0 -985
  257. package/dist/components/intersection-observer.js.map +0 -1
  258. package/dist/esm/ResizeObserver.es-724af9fd.js +0 -933
  259. package/dist/esm/ResizeObserver.es-724af9fd.js.map +0 -1
  260. package/dist/esm/date-utils-e4b757ff.js.map +0 -1
  261. package/dist/esm/global-d5ec4d53.js.map +0 -1
  262. package/dist/esm/intersection-observer-dff9fb5b.js +0 -985
  263. package/dist/esm/intersection-observer-dff9fb5b.js.map +0 -1
  264. package/dist/esm-es5/ResizeObserver.es-724af9fd.js +0 -5
  265. package/dist/esm-es5/ResizeObserver.es-724af9fd.js.map +0 -1
  266. package/dist/esm-es5/date-utils-e4b757ff.js +0 -5
  267. package/dist/esm-es5/date-utils-e4b757ff.js.map +0 -1
  268. package/dist/esm-es5/global-d5ec4d53.js.map +0 -1
  269. package/dist/esm-es5/intersection-observer-dff9fb5b.js +0 -5
  270. package/dist/esm-es5/intersection-observer-dff9fb5b.js.map +0 -1
  271. package/dist/nano-components/p-00eaa36a.entry.js +0 -5
  272. package/dist/nano-components/p-00eaa36a.entry.js.map +0 -1
  273. package/dist/nano-components/p-1030797a.entry.js.map +0 -1
  274. package/dist/nano-components/p-11a2dcce.js +0 -5
  275. package/dist/nano-components/p-11a2dcce.js.map +0 -1
  276. package/dist/nano-components/p-1a30dfdd.system.entry.js +0 -5
  277. package/dist/nano-components/p-1a30dfdd.system.entry.js.map +0 -1
  278. package/dist/nano-components/p-222d8095.entry.js +0 -5
  279. package/dist/nano-components/p-241d90eb.system.entry.js +0 -5
  280. package/dist/nano-components/p-241d90eb.system.entry.js.map +0 -1
  281. package/dist/nano-components/p-2c8d7273.entry.js +0 -5
  282. package/dist/nano-components/p-2c8d7273.entry.js.map +0 -1
  283. package/dist/nano-components/p-3093915f.entry.js +0 -5
  284. package/dist/nano-components/p-3093915f.entry.js.map +0 -1
  285. package/dist/nano-components/p-325c1cad.entry.js +0 -5
  286. package/dist/nano-components/p-325c1cad.entry.js.map +0 -1
  287. package/dist/nano-components/p-32f396c0.system.entry.js +0 -5
  288. package/dist/nano-components/p-32f396c0.system.entry.js.map +0 -1
  289. package/dist/nano-components/p-35108e08.entry.js +0 -5
  290. package/dist/nano-components/p-35108e08.entry.js.map +0 -1
  291. package/dist/nano-components/p-3ccb176c.system.entry.js +0 -5
  292. package/dist/nano-components/p-3ccb176c.system.entry.js.map +0 -1
  293. package/dist/nano-components/p-3e930ac7.entry.js.map +0 -1
  294. package/dist/nano-components/p-42cebbfe.system.entry.js +0 -5
  295. package/dist/nano-components/p-42cebbfe.system.entry.js.map +0 -1
  296. package/dist/nano-components/p-5d17cfbb.system.entry.js +0 -23
  297. package/dist/nano-components/p-5d17cfbb.system.entry.js.map +0 -1
  298. package/dist/nano-components/p-5d5ea4ab.system.entry.js +0 -5
  299. package/dist/nano-components/p-5d5ea4ab.system.entry.js.map +0 -1
  300. package/dist/nano-components/p-6722447c.entry.js +0 -5
  301. package/dist/nano-components/p-6722447c.entry.js.map +0 -1
  302. package/dist/nano-components/p-6d138abf.entry.js +0 -5
  303. package/dist/nano-components/p-6d138abf.entry.js.map +0 -1
  304. package/dist/nano-components/p-76d9d1d4.entry.js +0 -5
  305. package/dist/nano-components/p-76d9d1d4.entry.js.map +0 -1
  306. package/dist/nano-components/p-866f083f.system.entry.js +0 -5
  307. package/dist/nano-components/p-866f083f.system.entry.js.map +0 -1
  308. package/dist/nano-components/p-88779174.system.entry.js +0 -5
  309. package/dist/nano-components/p-88779174.system.entry.js.map +0 -1
  310. package/dist/nano-components/p-93880c28.system.js.map +0 -1
  311. package/dist/nano-components/p-97b13ad2.entry.js +0 -5
  312. package/dist/nano-components/p-97b13ad2.entry.js.map +0 -1
  313. package/dist/nano-components/p-b430a9b6.system.js +0 -5
  314. package/dist/nano-components/p-b430a9b6.system.js.map +0 -1
  315. package/dist/nano-components/p-d0385948.system.entry.js.map +0 -1
  316. package/dist/nano-components/p-debd9efc.js +0 -5
  317. package/dist/nano-components/p-debd9efc.js.map +0 -1
  318. package/dist/nano-components/p-e195ab77.system.js +0 -5
  319. package/dist/nano-components/p-e195ab77.system.js.map +0 -1
  320. package/dist/nano-components/p-e7140887.system.js +0 -5
  321. package/dist/nano-components/p-e817ab4a.system.entry.js +0 -5
  322. package/dist/nano-components/p-f5d4d13b.system.js +0 -5
  323. package/dist/nano-components/p-f5d4d13b.system.js.map +0 -1
  324. package/dist/nano-components/p-f66958c1.js +0 -5
  325. package/dist/nano-components/p-f66958c1.js.map +0 -1
  326. package/dist/nano-components/p-f710c763.system.entry.js +0 -5
  327. package/dist/nano-components/p-f710c763.system.entry.js.map +0 -1
  328. package/dist/nano-components/p-f9c7d961.js +0 -5
  329. package/dist/nano-components/p-f9c7d961.js.map +0 -1
  330. package/dist/nano-components/p-ffc2063a.entry.js +0 -23
  331. package/dist/nano-components/p-ffc2063a.entry.js.map +0 -1
  332. package/dist/nano-components/p-fff27907.system.entry.js +0 -5
  333. package/dist/nano-components/p-fff27907.system.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["src/components/date-input/date-input.scss?tag=nano-date-input&encapsulation=scoped","src/components/date-input/date-input.tsx"],"names":["dateInputCss","DateRegxps","d","m","y","inputIds","DateInput","class_1","hostRef","_this","this","directInput","dateOrderIndeces","inputId","locale","window","navigator","languages","language","undefined","_invalid","helperText","helperTextFormat","year","month","day","floatLabel","name","readonly","disabled","autofocus","clearInput","value","validateOn","showInlineError","dateOrder","required","hideLabel","picker","pickerOpen","closeAfterPicked","_dropDownConfig","onInputChange","e","stopPropagation","setValue","target","onInputValidate","detail","isValid","nanoValidate","emit","errorMessage","originalEvent","onInputKey","onDatePicked","onDropdownHide","setTimeout","_","trigger","focus","onDropdownShow","pickerEle","setFocus","pickerOpenSource","onTriggerClick","onTriggerKey","includes","key","onCloseClick","onCloseKeyDown","shiftKey","preventDefault","Object","defineProperty","prototype","input","validityMessage","handleValueChange","inputValue","formatIsoDate","nanoChange","date","parseISODate","handleDateOrderChange","setDatePattern","testDateValidity","valueDate","min","max","error","toLocaleDateString","requestAnimationFrame","__awaiter","getInputElement","_a","sent","length","setCustomValidity","showError","handlePickerOpenChange","dropdown","open","ddc","assign","reportValidity","validateFirst","message","dateRegexOrdered","dateStrOrd","Array","from","map","datepart","i","push","pattern","join","placeholder","isoDate","matches","match","RegExp","formatted","createDate","Date","dateStr","printISODate","connectedCallback","componentDidLoad","pickerCloseBtn","firstFocusEle","tetherTo","render","dropDownConfig","placement","host","ownerDocument","dir","replace","hasHelperSlot","querySelector","h","Host","class","createColorClasses","color","slot","label","onNanoChange","onNanoInput","onNanoValidate","form","size","ref","inputmode","part","type","onKeyDown","onClick","onNanoHide","onNanoShow","dialogTitle","onMouseDown","pickerClose","onNanoDatePicked","is-modal","localization","selectedDate","initialPickerDate","firstDayOfWeek","vhidden"],"mappings":"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","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/layers';\n@import '../../global/style/utilities/globals';\n\n:host {\n /**\n * @prop --focus-shadow: defaults to #{$control-focus-style};\n * @prop --open-btn-color: defaults to #{$button-bg-color};\n * @prop --open-btn-border: defaults to none;\n * @prop --close-btn-color: defaults to #{map.get($colors, celsius)};\n * @prop --picker-base-size: Base font size of the date picker component. Defaults to 16px;\n */\n\n display: inline-block;\n width: 100%;\n\n --focus-shadow: #{$control-focus-style};\n --open-btn-color: #{$button-bg-color};\n --open-btn-border: none;\n --close-btn-color: #{$button-bg-color};\n --picker-base-size: 16px;\n}\n\n:host(.nano-color) {\n --focus-shadow: #{$control-focus-size current-color(tint, 0.56)};\n}\n\nnano-icon {\n pointer-events: none;\n}\n\n.date-field {\n display: flex;\n flex-direction: column;\n position: relative;\n\n &__dropdown {\n --padding: 0;\n --overflow: visible;\n\n padding: 0 !important;\n width: 0 !important;\n width: 100%;\n z-index: $layer-index-dropdown !important;\n }\n\n &__close-bar {\n align-items: center;\n display: flex;\n justify-content: space-between;\n text-overflow: ellipsis;\n white-space: nowrap;\n border: 0;\n margin: 0;\n overflow: visible;\n padding: 0;\n position: absolute;\n right: -8px;\n top: -8px;\n width: auto;\n z-index: 1;\n }\n\n &__open {\n background: var(--open-btn-color);\n border: var(--open-btn-border);\n margin: 0;\n appearance: none;\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: none;\n }\n }\n\n &__close {\n -webkit-appearance: none;\n align-items: center;\n appearance: none;\n background: var(--close-btn-color);\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n height: 24px;\n justify-content: center;\n padding: 0;\n width: 24px;\n\n @media (min-width: 36em) {\n opacity: 0;\n }\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: none;\n\n @media (min-width: 36em) {\n opacity: 1;\n }\n }\n\n nano-icon {\n margin: 0 auto;\n }\n }\n\n nano-date-picker {\n font-size: var(--picker-base-size);\n }\n}\n\n.vhidden {\n @include visually-hide();\n}\n","import {\n Component,\n ComponentInterface,\n Element,\n h,\n Prop,\n Watch,\n State,\n Event,\n EventEmitter,\n Host,\n Method,\n} from '@stencil/core';\nimport {\n createDate,\n DaysOfWeek,\n printISODate,\n parseISODate,\n} from '../../utils/date-utils';\n\nimport {\n PickerChangeEvent,\n DateInputChangeEventDetail,\n Color,\n LocalDateOpts,\n DuetLocalizedText,\n ControlValidity,\n ControlValidityEventDetail,\n} from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport type { Dropdown } from '../dropdown/dropdown';\n\nconst DateRegxps = {\n d: '(\\\\d{1,2})',\n m: '(\\\\d{1,2})',\n y: '(\\\\d{4})',\n};\n\nlet inputIds = 0;\n\n/**\n * The date-input component combines `nano-dropdown`, `nano-input` and `nano-date-picker` components to make a fully featured date form field. It has specific options for localisation, date formatting and validation.\n *\n * @slot label - if you do not set a label attribute, you can use this slot for more complex markup\n * @slot helper - helper text to accompany the form field underneath.\n * @slot start - input start slot\n * @slot end - input end slot\n */\n@Component({\n tag: 'nano-date-input',\n styleUrl: 'date-input.scss',\n scoped: true,\n})\nexport class DateInput implements ComponentInterface {\n private pickerEle!: HTMLNanoDatePickerElement;\n private trigger!: HTMLButtonElement;\n private pickerCloseBtn!: HTMLButtonElement;\n private dropdown!: HTMLNanoDropdownElement;\n private input: HTMLNanoInputElement;\n private pickerOpenSource: 'key' | 'mouse';\n\n private directInput = false;\n private dateOrderIndeces = { d: 0, m: 1, y: 3 };\n private inputId = `nano-input-${inputIds++}`;\n private locale =\n (window.navigator.languages as string[]) ||\n window.navigator.language ||\n undefined;\n\n @Element() host: HTMLNanoDateInputElement;\n\n // Private state\n\n @State() pattern!: string;\n @State() inputValue: string;\n\n // Public Api / Prop\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n return this._invalid;\n }\n @State() _invalid = false;\n\n /**\n * Current validation message - if any. @readonly\n */\n @Prop()\n get validityMessage() {\n if (!this.input) return '';\n return this.input.validityMessage;\n }\n\n /**\n * Whether to show a long form, confirmation date string of the one currently entered\n */\n @Prop() helperText: boolean = true;\n\n /**\n * Options for the date string display. Refer to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString.\n */\n @Prop() helperTextFormat: LocalDateOpts = {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n\n /**\n * Enable floating label behaviour. Will disable placeholder if set.\n */\n @Prop() floatLabel: boolean = false;\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop() name: string = this.inputId;\n\n /**\n * If `true`, the user cannot modify the value.\n */\n @Prop() readonly = false;\n\n /**\n * The initial size (number of characters) of the control.\n */\n @Prop() size?: number;\n\n /**\n * The form element to associate the select with (its form owner). Must be the id of a form.\n */\n @Prop() form?: string | null;\n\n /**\n * Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc.\n * Default is Monday.\n */\n @Prop() firstDayOfWeek?: DaysOfWeek;\n\n /**\n * Button labels, day names, month names, etc, used for localization.\n * Default is English.\n */\n @Prop() localization?: DuetLocalizedText;\n\n /**\n * If `true`, the user cannot interact with the input.\n */\n @Prop() disabled = false;\n\n /**\n * The color to use from the application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * This Boolean attribute lets you specify that a form control should have input focus when the page loads.\n */\n @Prop() autofocus = false;\n\n /**\n * If `true`, a clear icon will appear in the input when there is a value. Clicking it clears the input.\n */\n @Prop() clearInput = false;\n\n /**\n * String to place within a label element. Alternatively you may use a label slot.\n */\n @Prop() label?: string;\n\n /**\n * Instructional text that shows before the input has a value.\n * The pattern prop will be used to create a placeholder automatically if unused.\n */\n @Prop({ mutable: true }) placeholder: string;\n\n /**\n * Current value. Must be in IS0-8601 format: YYYY-MM-DD.\n */\n @Prop({ reflect: true, mutable: true }) value: string = '';\n\n @Watch('value')\n handleValueChange() {\n if (!this.directInput) this.inputValue = this.formatIsoDate(this.value);\n setTimeout(() => {\n this.nanoChange.emit({\n value: this.value,\n date: parseISODate(this.value),\n });\n }, 20);\n this.directInput = false;\n }\n\n /**\n * When should the field perform validation\n */\n @Prop() validateOn?: 'dirty' | 'submit' | 'submitThenDirty' =\n 'submitThenDirty';\n\n /**\n * Whether to show validation errors underneath input\n */\n @Prop({ reflect: true }) showInlineError = true;\n\n /**\n * The order of the date parts for entry and display.\n * e.g. dmy = dd mm yyyy\n */\n @Prop() dateOrder: 'dmy' | 'mdy' | 'ymd' | 'dym' = 'dmy';\n\n @Watch('dateOrder')\n handleDateOrderChange() {\n this.setDatePattern();\n }\n\n /**\n * If `true`, the user must fill in a value before submitting a form.\n */\n @Prop() required = false;\n\n /**\n * Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the max property.\n */\n @Prop() min?: string;\n\n /**\n * Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the min property.\n */\n @Prop() max?: string;\n\n /**\n * Visually hide the label - but make it accessible.\n */\n @Prop() hideLabel?: boolean = false;\n\n @Watch('min')\n @Watch('max')\n @Watch('value')\n testDateValidity() {\n const valueDate = parseISODate(this.value);\n let min: Date,\n max: Date,\n error: string = '';\n\n if (this.value && valueDate) {\n if (this.min && (min = parseISODate(this.min)) && valueDate < min) {\n error =\n 'Date below the minimum: ' +\n min.toLocaleDateString(this.locale, this.helperTextFormat);\n } else if (\n this.max &&\n (max = parseISODate(this.max)) &&\n valueDate > max\n ) {\n error =\n 'Date above the maximum: ' +\n max.toLocaleDateString(this.locale, this.helperTextFormat);\n }\n }\n\n requestAnimationFrame(async (_) => {\n if (!this.input) return;\n const input = await this.input.getInputElement();\n if (this.value.length && !valueDate) error = 'Please enter a valid date';\n\n input.setCustomValidity(error);\n if (this.input.validateOn === 'dirty') {\n this.input.showError(error);\n }\n });\n }\n\n /**\n * Show a date picker. Date pickers are not very useful\n * if the potential input is too far in the distance or past\n * e.g. Birthdays\n */\n @Prop() picker: boolean = true;\n\n /**\n * Initial picker date. Will be to `value` if set. Will be today's date if nothing set.\n * Must be in IS0-8601 format: YYYY-MM-DD.\n */\n @Prop() initialPickerDate?: string;\n\n /**\n * Set / read whether the picker is currently open.\n */\n @Prop({ reflect: true, mutable: true }) pickerOpen: boolean = false;\n\n @Watch('pickerOpen')\n handlePickerOpenChange() {\n this.dropdown.open = this.pickerOpen;\n }\n\n /**\n * Close the picker after a date is selected\n */\n @Prop() closeAfterPicked: boolean = true;\n\n /** nano-dropdown config options you can pass to the nested dropdown component */\n @Prop()\n get dropDownConfig() {\n return this._dropDownConfig;\n }\n set dropDownConfig(ddc: Partial<Dropdown>) {\n this._dropDownConfig = { ...this._dropDownConfig, ...ddc };\n }\n private _dropDownConfig: Partial<Dropdown> = {};\n\n // Event emitters\n\n /**\n * Event emitted when a date is selected.\n */\n @Event() nanoChange: EventEmitter<DateInputChangeEventDetail>;\n\n /**\n * Called when validation is performed (which depends on `validateOn`).\n * @returns event.detail: `{ isValid: boolean, errorMessage: string, originalEvent: Event }`.\n */\n @Event() nanoValidate: EventEmitter<ControlValidityEventDetail>;\n\n // Methods\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `{ isValid: boolean, errorMessage: string }`\n */\n @Method()\n async reportValidity(validateFirst: boolean): Promise<ControlValidity> {\n return await this.input.reportValidity(validateFirst);\n }\n\n /**\n * Sets focus on the child `nano-input`.\n */\n @Method()\n async setFocus() {\n if (this.input) this.input.setFocus();\n }\n\n /**\n * Returns the native `<input>` element used under the hood.\n */\n @Method()\n async getInputElement() {\n return await this.input.getInputElement();\n }\n\n /**\n * Invalidate the field and show a custom error message. To clear the error you will need to re-call this method with an empty string.\n */\n @Method()\n async showError(message: string) {\n if (!this.input) return;\n this.input.showError(message);\n }\n\n // Event handlers\n\n private onInputChange = (\n e: CustomEvent & {\n target: HTMLInputElement;\n }\n ) => {\n e.stopPropagation();\n this.setValue(e.target.value);\n };\n\n private onInputValidate = (e: CustomEvent<ControlValidityEventDetail>) => {\n e.stopPropagation();\n this._invalid = !e.detail.isValid;\n this.nanoValidate.emit({\n isValid: e.detail.isValid,\n errorMessage: e.detail.errorMessage,\n originalEvent: e.detail.originalEvent,\n });\n };\n\n private onInputKey = () => {\n this.directInput = true;\n };\n\n private onDatePicked = (e: { detail: PickerChangeEvent }) => {\n this.directInput = false;\n this.value = e.detail.value;\n if (this.closeAfterPicked) this.pickerOpen = false;\n };\n\n private onDropdownHide = () => {\n setTimeout((_) => (this.pickerOpen = false), 200);\n setTimeout((_) => this.trigger.focus(), 50);\n };\n\n private onDropdownShow = () => {\n setTimeout((_) => {\n this.pickerEle.setFocus(false, this.pickerOpenSource === 'key');\n this.pickerOpenSource = null;\n }, 200);\n };\n\n private onTriggerClick = () => {\n if (!this.pickerOpen) {\n this.pickerOpen = true;\n this.pickerOpenSource = 'mouse';\n }\n };\n\n private onTriggerKey = (e: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(e.key)) {\n if (!this.pickerOpen) {\n this.pickerOpen = true;\n this.pickerOpenSource = 'key';\n }\n }\n };\n\n private onCloseClick = () => {\n if (this.pickerOpen) this.pickerOpen = false;\n };\n\n private onCloseKeyDown = (e: KeyboardEvent) => {\n // this ensures focus is trapped inside the picker\n if (e.key === 'Tab' && e.shiftKey) {\n this.pickerEle.setFocus(true);\n e.preventDefault();\n }\n if (e.key === ' ' || e.key === 'Enter') {\n if (this.pickerOpen) this.pickerOpen = false;\n }\n };\n\n // Private logic\n\n // set the regexp input pattern and placeholder (if necessary)\n private setDatePattern() {\n let dateRegexOrdered = [];\n let dateStrOrd = [];\n Array.from(this.dateOrder).map((datepart, i) => {\n dateRegexOrdered.push(DateRegxps[datepart]);\n this.dateOrderIndeces[datepart] = i;\n dateStrOrd.push(datepart === 'y' ? 'yyyy' : datepart + datepart);\n });\n this.pattern = dateRegexOrdered.join('\\\\W+');\n\n if (!this.placeholder && this.placeholder !== 'false')\n this.placeholder = dateStrOrd.join(' ');\n }\n\n // set the public facing date string\n private formatIsoDate(isoDate: string) {\n let dateRegexOrdered = [];\n Array.from('ymd').map((datepart) =>\n dateRegexOrdered.push(DateRegxps[datepart])\n );\n const matches = isoDate.match(new RegExp(dateRegexOrdered.join('\\\\W+')));\n if (!matches) return '';\n\n let formatted = [];\n formatted[this.dateOrderIndeces.d] = matches[3];\n formatted[this.dateOrderIndeces.m] = matches[2];\n formatted[this.dateOrderIndeces.y] = matches[1];\n\n return formatted.join(' ');\n }\n\n // on manual user entry, set the value that will be sent with the form field\n private setValue(inputValue: string) {\n const matches = inputValue.match(new RegExp(this.pattern));\n\n // it's an invalid date, but we still need to set it\n if (!matches) {\n this.value = inputValue;\n return;\n }\n\n let date = createDate(\n matches[this.dateOrderIndeces.y + 1],\n matches[this.dateOrderIndeces.m + 1],\n matches[this.dateOrderIndeces.d + 1]\n );\n\n if (!date) {\n // last ditch attempt - see if the browser can get something\n date = new Date(inputValue);\n\n // it's definitely an invalid date, but set it anyway for validation messages\n if (!date) {\n this.value = inputValue;\n return;\n }\n }\n\n const dateStr = printISODate(date);\n this.value = dateStr;\n return dateStr;\n }\n\n connectedCallback() {\n this.setDatePattern();\n this.handleValueChange();\n }\n\n componentDidLoad() {\n if (!this.pickerCloseBtn || !this.picker) return;\n this.pickerEle.firstFocusEle = this.pickerCloseBtn;\n this.dropdown.tetherTo = this.trigger;\n setTimeout((_) => this.handlePickerOpenChange(), 300);\n }\n\n render() {\n this.locale =\n (navigator.languages as string[]) || navigator.language || undefined;\n\n this.dropDownConfig.placement =\n this.dropDownConfig.placement || 'bottom-end';\n\n if ((this.host.ownerDocument as Document).dir === 'rtl') {\n this.dropDownConfig.placement.replace('start', 'end');\n }\n if (this.trigger) this.dropDownConfig.tetherTo = this.trigger;\n\n const valueDate = parseISODate(this.value);\n const hasHelperSlot = !!this.host.querySelector('[slot=\"helper\"]');\n\n return (\n <Host class={{ ...createColorClasses(this.color) }}>\n <div class=\"date-field\">\n <nano-input\n class=\"date-field__input\"\n slot=\"trigger\"\n required={this.required || undefined}\n showInlineError={this.showInlineError}\n validateOn={this.validateOn}\n placeholder={\n this.placeholder !== 'false' ? this.placeholder : undefined\n }\n pattern={this.pattern}\n label={this.label}\n disabled={this.disabled || undefined}\n color={this.color || undefined}\n autofocus={this.autofocus || undefined}\n clearInput={this.clearInput || undefined}\n onNanoChange={this.onInputChange}\n onNanoInput={this.onInputKey}\n onNanoValidate={this.onInputValidate}\n name=\"\"\n form={this.form || undefined}\n size={this.size || undefined}\n readonly={this.readonly}\n value={this.inputValue}\n ref={(input) => (this.input = input)}\n floatLabel={this.floatLabel}\n hideLabel={this.hideLabel}\n inputmode={'numeric'}\n part=\"input\"\n >\n <slot name=\"start\" slot=\"start\" />\n <slot name=\"label\" />\n <slot name=\"end\" slot=\"end\" />\n {this.picker && [\n <button\n slot=\"end\"\n class=\"date-field__open\"\n type=\"button\"\n onKeyDown={this.onTriggerKey}\n onClick={this.onTriggerClick}\n ref={(trigger) => (this.trigger = trigger)}\n disabled={this.disabled || this.readonly}\n >\n <nano-icon name=\"light/calendar-alt\"></nano-icon>\n </button>,\n\n <nano-dropdown\n slot=\"end\"\n onNanoHide={this.onDropdownHide}\n onNanoShow={this.onDropdownShow}\n dialogTitle=\"Choose a date\"\n class=\"date-field__dropdown\"\n ref={(dropdown) => (this.dropdown = dropdown)}\n {...this.dropDownConfig}\n part=\"dropdown\"\n >\n <div>\n <div class=\"date-field__close-bar\">\n <button\n class=\"date-field__close\"\n type=\"button\"\n onMouseDown={this.onCloseClick}\n onKeyDown={this.onCloseKeyDown}\n ref={(pickerClose) => (this.pickerCloseBtn = pickerClose)}\n >\n <nano-icon name=\"light/times\"></nano-icon>\n <span class=\"vhidden\">Close window</span>\n </button>\n </div>\n <nano-date-picker\n onNanoDatePicked={this.onDatePicked}\n min={this.min || undefined}\n max={this.max || undefined}\n is-modal={true}\n ref={(picker) => (this.pickerEle = picker)}\n localization={this.localization}\n selectedDate={this.value || this.initialPickerDate}\n firstDayOfWeek={this.firstDayOfWeek}\n color={this.color || undefined}\n part=\"date-picker\"\n ></nano-date-picker>\n </div>\n </nano-dropdown>,\n ]}\n {(hasHelperSlot || this.helperText || this.showInlineError) && (\n <span slot=\"helper\">\n <span class={{ vhidden: !!this.value.length }}>\n <slot name=\"helper\" />\n </span>\n {this.helperText && !!valueDate && (\n <span>\n {valueDate.toLocaleDateString(\n this.locale,\n this.helperTextFormat\n )}\n </span>\n )}\n </span>\n )}\n </nano-input>\n <input type=\"hidden\" value={this.value} name={this.name} />\n </div>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["src/components/date-input/date-input.scss?tag=nano-date-input&encapsulation=scoped","src/components/date-input/date-input.tsx"],"names":["dateInputCss","DateRegxps","d","m","y","inputIds","DateInput","class_1","hostRef","_this","this","directInput","dateOrderIndeces","inputId","locale","window","navigator","languages","language","undefined","_invalid","helperText","helperTextFormat","year","month","day","floatLabel","name","readonly","disabled","autofocus","clearInput","value","validateOn","showInlineError","dateOrder","required","hideLabel","picker","pickerOpen","closeAfterPicked","_dropDownConfig","isDateDisabled","onInputChange","e","stopPropagation","setValue","target","onInputValidate","detail","isValid","nanoValidate","emit","errorMessage","originalEvent","onInputKey","onDatePicked","onDropdownHide","setTimeout","_","trigger","focus","onDropdownShow","pickerEle","setFocus","pickerOpenSource","onTriggerClick","onTriggerKey","includes","key","onCloseClick","onCloseKeyDown","shiftKey","preventDefault","Object","defineProperty","prototype","input","validityMessage","handleValueChange","inputValue","formatIsoDate","nanoChange","date","parseISODate","handleDateOrderChange","setDatePattern","testDateValidity","valueDate","min","max","error","toLocaleDateString","requestAnimationFrame","__awaiter","getInputElement","_a","sent","length","setCustomValidity","showError","handlePickerOpenChange","dropdown","open","ddc","assign","reportValidity","validateFirst","message","dateRegexOrdered","dateStrOrd","Array","from","map","datepart","i","push","pattern","join","placeholder","isoDate","matches","match","RegExp","formatted","createDate","Date","dateStr","printISODate","connectedCallback","componentDidLoad","pickerCloseBtn","firstFocusEle","tetherTo","render","dropDownConfig","placement","host","ownerDocument","dir","replace","hasHelperSlot","querySelector","h","Host","class","createColorClasses","color","slot","label","onNanoChange","onNanoInput","onNanoValidate","form","size","ref","inputmode","part","type","onKeyDown","onClick","onNanoHide","onNanoShow","dialogTitle","onMouseDown","pickerClose","onNanoDatePicked","is-modal","localization","selectedDate","initialPickerDate","firstDayOfWeek","vhidden"],"mappings":"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","sourcesContent":["@use 'sass:map';\n@use 'sass:list';\n\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/layers';\n@import '../../global/style/utilities/globals';\n\n:host {\n /**\n * @prop --focus-shadow: defaults to #{$control-focus-style};\n * @prop --open-btn-color: defaults to #{$button-bg-color};\n * @prop --open-btn-border: defaults to none;\n * @prop --close-btn-color: defaults to #{map.get($colors, celsius)};\n * @prop --picker-base-size: Base font size of the date picker component. Defaults to 16px;\n */\n\n display: inline-block;\n width: 100%;\n\n --focus-shadow: #{$control-focus-style};\n --open-btn-color: #{$button-bg-color};\n --open-btn-border: none;\n --close-btn-color: #{$button-bg-color};\n --picker-base-size: 16px;\n}\n\n:host(.nano-color) {\n --focus-shadow: #{$control-focus-size current-color(tint, 0.56)};\n}\n\nnano-icon {\n pointer-events: none;\n}\n\n.date-field {\n display: flex;\n flex-direction: column;\n position: relative;\n\n &__dropdown {\n --padding: 0;\n --overflow: visible;\n\n padding: 0 !important;\n width: 0 !important;\n width: 100%;\n z-index: $layer-index-dropdown !important;\n }\n\n &__close-bar {\n align-items: center;\n display: flex;\n justify-content: space-between;\n text-overflow: ellipsis;\n white-space: nowrap;\n border: 0;\n margin: 0;\n overflow: visible;\n padding: 0;\n position: absolute;\n right: -8px;\n top: -8px;\n width: auto;\n z-index: 1;\n }\n\n &__open {\n background: var(--open-btn-color);\n border: var(--open-btn-border);\n margin: 0;\n appearance: none;\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: none;\n }\n }\n\n &__close {\n -webkit-appearance: none;\n align-items: center;\n appearance: none;\n background: var(--close-btn-color);\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n height: 24px;\n justify-content: center;\n padding: 0;\n width: 24px;\n\n @media (min-width: 36em) {\n opacity: 0;\n }\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: none;\n\n @media (min-width: 36em) {\n opacity: 1;\n }\n }\n\n nano-icon {\n margin: 0 auto;\n }\n }\n\n nano-date-picker {\n font-size: var(--picker-base-size);\n }\n}\n\n.vhidden {\n @include visually-hide();\n}\n","import {\n Component,\n ComponentInterface,\n Element,\n h,\n Prop,\n Watch,\n State,\n Event,\n EventEmitter,\n Host,\n Method,\n} from '@stencil/core';\nimport {\n createDate,\n DaysOfWeek,\n printISODate,\n parseISODate,\n} from '../../utils/date-utils';\n\nimport {\n PickerChangeEvent,\n DateInputChangeEventDetail,\n Color,\n LocalDateOpts,\n DuetLocalizedText,\n ControlValidity,\n ControlValidityEventDetail,\n DateDisabledPredicate,\n} from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport type { Dropdown } from '../dropdown/dropdown';\n\nconst DateRegxps = {\n d: '(\\\\d{1,2})',\n m: '(\\\\d{1,2})',\n y: '(\\\\d{4})',\n};\n\nlet inputIds = 0;\n\n/**\n * The date-input component combines `nano-dropdown`, `nano-input` and `nano-date-picker` components to make a fully featured date form field. It has specific options for localisation, date formatting and validation.\n *\n * @slot label - if you do not set a label attribute, you can use this slot for more complex markup\n * @slot helper - helper text to accompany the form field underneath.\n * @slot start - input start slot\n * @slot end - input end slot\n */\n@Component({\n tag: 'nano-date-input',\n styleUrl: 'date-input.scss',\n scoped: true,\n})\nexport class DateInput implements ComponentInterface {\n private pickerEle!: HTMLNanoDatePickerElement;\n private trigger!: HTMLButtonElement;\n private pickerCloseBtn!: HTMLButtonElement;\n private dropdown!: HTMLNanoDropdownElement;\n private input: HTMLNanoInputElement;\n private pickerOpenSource: 'key' | 'mouse';\n\n private directInput = false;\n private dateOrderIndeces = { d: 0, m: 1, y: 3 };\n private inputId = `nano-input-${inputIds++}`;\n private locale =\n (window.navigator.languages as string[]) ||\n window.navigator.language ||\n undefined;\n\n @Element() host: HTMLNanoDateInputElement;\n\n // Private state\n\n @State() pattern!: string;\n @State() inputValue: string;\n\n // Public Api / Prop\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n return this._invalid;\n }\n @State() _invalid = false;\n\n /**\n * Current validation message - if any. @readonly\n */\n @Prop()\n get validityMessage() {\n if (!this.input) return '';\n return this.input.validityMessage;\n }\n\n /**\n * Whether to show a long form, confirmation date string of the one currently entered\n */\n @Prop() helperText: boolean = true;\n\n /**\n * Options for the date string display. Refer to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString.\n */\n @Prop() helperTextFormat: LocalDateOpts = {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n\n /**\n * Enable floating label behaviour. Will disable placeholder if set.\n */\n @Prop() floatLabel: boolean = false;\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop() name: string = this.inputId;\n\n /**\n * If `true`, the user cannot modify the value.\n */\n @Prop() readonly = false;\n\n /**\n * The initial size (number of characters) of the control.\n */\n @Prop() size?: number;\n\n /**\n * The form element to associate the select with (its form owner). Must be the id of a form.\n */\n @Prop() form?: string | null;\n\n /**\n * Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc.\n * Default is Monday.\n */\n @Prop() firstDayOfWeek?: DaysOfWeek;\n\n /**\n * Button labels, day names, month names, etc, used for localization.\n * Default is English.\n */\n @Prop() localization?: DuetLocalizedText;\n\n /**\n * If `true`, the user cannot interact with the input.\n */\n @Prop() disabled = false;\n\n /**\n * The color to use from the application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * This Boolean attribute lets you specify that a form control should have input focus when the page loads.\n */\n @Prop() autofocus = false;\n\n /**\n * If `true`, a clear icon will appear in the input when there is a value. Clicking it clears the input.\n */\n @Prop() clearInput = false;\n\n /**\n * String to place within a label element. Alternatively you may use a label slot.\n */\n @Prop() label?: string;\n\n /**\n * Instructional text that shows before the input has a value.\n * The pattern prop will be used to create a placeholder automatically if unused.\n */\n @Prop({ mutable: true }) placeholder: string;\n\n /**\n * Current value. Must be in IS0-8601 format: YYYY-MM-DD.\n */\n @Prop({ reflect: true, mutable: true }) value: string = '';\n\n @Watch('value')\n handleValueChange() {\n if (!this.directInput) this.inputValue = this.formatIsoDate(this.value);\n setTimeout(() => {\n this.nanoChange.emit({\n value: this.value,\n date: parseISODate(this.value),\n });\n }, 20);\n this.directInput = false;\n }\n\n /**\n * When should the field perform validation\n */\n @Prop() validateOn?: 'dirty' | 'submit' | 'submitThenDirty' =\n 'submitThenDirty';\n\n /**\n * Whether to show validation errors underneath input\n */\n @Prop({ reflect: true }) showInlineError = true;\n\n /**\n * The order of the date parts for entry and display.\n * e.g. dmy = dd mm yyyy\n */\n @Prop() dateOrder: 'dmy' | 'mdy' | 'ymd' | 'dym' = 'dmy';\n\n @Watch('dateOrder')\n handleDateOrderChange() {\n this.setDatePattern();\n }\n\n /**\n * If `true`, the user must fill in a value before submitting a form.\n */\n @Prop() required = false;\n\n /**\n * Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the max property.\n */\n @Prop() min?: string;\n\n /**\n * Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the min property.\n */\n @Prop() max?: string;\n\n /**\n * Visually hide the label - but make it accessible.\n */\n @Prop() hideLabel?: boolean = false;\n\n @Watch('min')\n @Watch('max')\n @Watch('value')\n testDateValidity() {\n const valueDate = parseISODate(this.value);\n let min: Date,\n max: Date,\n error: string = '';\n\n if (this.value && valueDate) {\n if (this.min && (min = parseISODate(this.min)) && valueDate < min) {\n error =\n 'Date below the minimum: ' +\n min.toLocaleDateString(this.locale, this.helperTextFormat);\n }\n if (this.max && (max = parseISODate(this.max)) && valueDate > max) {\n error =\n 'Date above the maximum: ' +\n max.toLocaleDateString(this.locale, this.helperTextFormat);\n }\n if (this.isDateDisabled(valueDate)) {\n error = 'Date selected is disabled.';\n }\n }\n\n requestAnimationFrame(async (_) => {\n if (!this.input) return;\n const input = await this.input.getInputElement();\n if (this.value.length && !valueDate) error = 'Please enter a valid date';\n\n input.setCustomValidity(error);\n if (this.input.validateOn === 'dirty') {\n this.input.showError(error);\n }\n });\n }\n\n /**\n * Show a date picker. Date pickers are not very useful\n * if the potential input is too far in the distance or past\n * e.g. Birthdays\n */\n @Prop() picker: boolean = true;\n\n /**\n * Initial picker date. Will be to `value` if set. Will be today's date if nothing set.\n * Must be in IS0-8601 format: YYYY-MM-DD.\n */\n @Prop() initialPickerDate?: string;\n\n /**\n * Set / read whether the picker is currently open.\n */\n @Prop({ reflect: true, mutable: true }) pickerOpen: boolean = false;\n\n @Watch('pickerOpen')\n handlePickerOpenChange() {\n this.dropdown.open = this.pickerOpen;\n }\n\n /**\n * Close the picker after a date is selected\n */\n @Prop() closeAfterPicked: boolean = true;\n\n /** nano-dropdown config options you can pass to the nested dropdown component */\n @Prop()\n get dropDownConfig() {\n return this._dropDownConfig;\n }\n set dropDownConfig(ddc: Partial<Dropdown>) {\n this._dropDownConfig = { ...this._dropDownConfig, ...ddc };\n }\n private _dropDownConfig: Partial<Dropdown> = {};\n\n /** @readonly get the value as a `Date` */\n @Prop()\n get dateValue() {\n return parseISODate(this.value);\n }\n\n /** Controls which days are disabled and therefore disallowed.\n * For example, this can be used to disallow selection of weekends. */\n @Prop() isDateDisabled: DateDisabledPredicate = () => false;\n\n // Event emitters\n\n /**\n * Event emitted when a date is selected.\n */\n @Event() nanoChange: EventEmitter<DateInputChangeEventDetail>;\n\n /**\n * Called when validation is performed (which depends on `validateOn`).\n * @returns event.detail: `{ isValid: boolean, errorMessage: string, originalEvent: Event }`.\n */\n @Event() nanoValidate: EventEmitter<ControlValidityEventDetail>;\n\n // Methods\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `{ isValid: boolean, errorMessage: string }`\n */\n @Method()\n async reportValidity(validateFirst: boolean): Promise<ControlValidity> {\n return await this.input.reportValidity(validateFirst);\n }\n\n /**\n * Sets focus on the child `nano-input`.\n */\n @Method()\n async setFocus() {\n if (this.input) this.input.setFocus();\n }\n\n /**\n * Returns the native `<input>` element used under the hood.\n */\n @Method()\n async getInputElement() {\n return await this.input.getInputElement();\n }\n\n /**\n * Invalidate the field and show a custom error message. To clear the error you will need to re-call this method with an empty string.\n */\n @Method()\n async showError(message: string) {\n if (!this.input) return;\n this.input.showError(message);\n }\n\n // Event handlers\n\n private onInputChange = (\n e: CustomEvent & {\n target: HTMLInputElement;\n }\n ) => {\n e.stopPropagation();\n this.setValue(e.target.value);\n };\n\n private onInputValidate = (e: CustomEvent<ControlValidityEventDetail>) => {\n e.stopPropagation();\n this._invalid = !e.detail.isValid;\n this.nanoValidate.emit({\n isValid: e.detail.isValid,\n errorMessage: e.detail.errorMessage,\n originalEvent: e.detail.originalEvent,\n });\n };\n\n private onInputKey = () => {\n this.directInput = true;\n };\n\n private onDatePicked = (e: { detail: PickerChangeEvent }) => {\n this.directInput = false;\n this.value = e.detail.value;\n if (this.closeAfterPicked) this.pickerOpen = false;\n };\n\n private onDropdownHide = () => {\n setTimeout((_) => (this.pickerOpen = false), 200);\n setTimeout((_) => this.trigger.focus(), 50);\n };\n\n private onDropdownShow = () => {\n setTimeout((_) => {\n this.pickerEle.setFocus(false, this.pickerOpenSource === 'key');\n this.pickerOpenSource = null;\n }, 200);\n };\n\n private onTriggerClick = () => {\n if (!this.pickerOpen) {\n this.pickerOpen = true;\n this.pickerOpenSource = 'mouse';\n }\n };\n\n private onTriggerKey = (e: KeyboardEvent) => {\n if ([' ', 'Enter'].includes(e.key)) {\n if (!this.pickerOpen) {\n this.pickerOpen = true;\n this.pickerOpenSource = 'key';\n }\n }\n };\n\n private onCloseClick = () => {\n if (this.pickerOpen) this.pickerOpen = false;\n };\n\n private onCloseKeyDown = (e: KeyboardEvent) => {\n // this ensures focus is trapped inside the picker\n if (e.key === 'Tab' && e.shiftKey) {\n this.pickerEle.setFocus(true);\n e.preventDefault();\n }\n if (e.key === ' ' || e.key === 'Enter') {\n if (this.pickerOpen) this.pickerOpen = false;\n }\n };\n\n // Private logic\n\n // set the regexp input pattern and placeholder (if necessary)\n private setDatePattern() {\n let dateRegexOrdered = [];\n let dateStrOrd = [];\n Array.from(this.dateOrder).map((datepart, i) => {\n dateRegexOrdered.push(DateRegxps[datepart]);\n this.dateOrderIndeces[datepart] = i;\n dateStrOrd.push(datepart === 'y' ? 'yyyy' : datepart + datepart);\n });\n this.pattern = dateRegexOrdered.join('\\\\W+');\n\n if (!this.placeholder && this.placeholder !== 'false')\n this.placeholder = dateStrOrd.join(' ');\n }\n\n // set the public facing date string\n private formatIsoDate(isoDate: string) {\n let dateRegexOrdered = [];\n Array.from('ymd').map((datepart) =>\n dateRegexOrdered.push(DateRegxps[datepart])\n );\n const matches = isoDate.match(new RegExp(dateRegexOrdered.join('\\\\W+')));\n if (!matches) return '';\n\n let formatted = [];\n formatted[this.dateOrderIndeces.d] = matches[3];\n formatted[this.dateOrderIndeces.m] = matches[2];\n formatted[this.dateOrderIndeces.y] = matches[1];\n\n return formatted.join(' ');\n }\n\n // on manual user entry, set the value that will be sent with the form field\n private setValue(inputValue: string) {\n const matches = inputValue.match(new RegExp(this.pattern));\n\n // it's an invalid date, but we still need to set it\n if (!matches) {\n this.value = inputValue;\n return;\n }\n\n let date = createDate(\n matches[this.dateOrderIndeces.y + 1],\n matches[this.dateOrderIndeces.m + 1],\n matches[this.dateOrderIndeces.d + 1]\n );\n\n if (!date) {\n // last ditch attempt - see if the browser can get something\n date = new Date(inputValue);\n\n // it's definitely an invalid date, but set it anyway for validation messages\n if (!date) {\n this.value = inputValue;\n return;\n }\n }\n\n const dateStr = printISODate(date);\n this.value = dateStr;\n return dateStr;\n }\n\n connectedCallback() {\n this.setDatePattern();\n this.handleValueChange();\n }\n\n componentDidLoad() {\n if (!this.pickerCloseBtn || !this.picker) return;\n this.pickerEle.firstFocusEle = this.pickerCloseBtn;\n this.dropdown.tetherTo = this.trigger;\n setTimeout((_) => this.handlePickerOpenChange(), 300);\n }\n\n render() {\n this.locale =\n (navigator.languages as string[]) || navigator.language || undefined;\n\n this.dropDownConfig.placement =\n this.dropDownConfig.placement || 'bottom-end';\n\n if ((this.host.ownerDocument as Document).dir === 'rtl') {\n this.dropDownConfig.placement.replace('start', 'end');\n }\n if (this.trigger) this.dropDownConfig.tetherTo = this.trigger;\n\n const valueDate = parseISODate(this.value);\n const hasHelperSlot = !!this.host.querySelector('[slot=\"helper\"]');\n\n return (\n <Host class={{ ...createColorClasses(this.color) }}>\n <div class=\"date-field\">\n <nano-input\n class=\"date-field__input\"\n slot=\"trigger\"\n required={this.required || undefined}\n showInlineError={this.showInlineError}\n validateOn={this.validateOn}\n placeholder={\n this.placeholder !== 'false' ? this.placeholder : undefined\n }\n pattern={this.pattern}\n label={this.label}\n disabled={this.disabled || undefined}\n color={this.color || undefined}\n autofocus={this.autofocus || undefined}\n clearInput={this.clearInput || undefined}\n onNanoChange={this.onInputChange}\n onNanoInput={this.onInputKey}\n onNanoValidate={this.onInputValidate}\n name=\"\"\n form={this.form || undefined}\n size={this.size || undefined}\n readonly={this.readonly}\n value={this.inputValue}\n ref={(input) => (this.input = input)}\n floatLabel={this.floatLabel}\n hideLabel={this.hideLabel}\n inputmode={'numeric'}\n part=\"input\"\n >\n <slot name=\"start\" slot=\"start\" />\n <slot name=\"label\" />\n <slot name=\"end\" slot=\"end\" />\n {this.picker && [\n <button\n slot=\"end\"\n class=\"date-field__open\"\n type=\"button\"\n onKeyDown={this.onTriggerKey}\n onClick={this.onTriggerClick}\n ref={(trigger) => (this.trigger = trigger)}\n disabled={this.disabled || this.readonly}\n >\n <nano-icon name=\"light/calendar-alt\"></nano-icon>\n </button>,\n\n <nano-dropdown\n slot=\"end\"\n onNanoHide={this.onDropdownHide}\n onNanoShow={this.onDropdownShow}\n dialogTitle=\"Choose a date\"\n class=\"date-field__dropdown\"\n ref={(dropdown) => (this.dropdown = dropdown)}\n {...this.dropDownConfig}\n part=\"dropdown\"\n >\n <div>\n <div class=\"date-field__close-bar\">\n <button\n class=\"date-field__close\"\n type=\"button\"\n onMouseDown={this.onCloseClick}\n onKeyDown={this.onCloseKeyDown}\n ref={(pickerClose) => (this.pickerCloseBtn = pickerClose)}\n >\n <nano-icon name=\"light/times\"></nano-icon>\n <span class=\"vhidden\">Close window</span>\n </button>\n </div>\n <nano-date-picker\n isDateDisabled={this.isDateDisabled}\n onNanoDatePicked={this.onDatePicked}\n min={this.min || undefined}\n max={this.max || undefined}\n is-modal={true}\n ref={(picker) => (this.pickerEle = picker)}\n localization={this.localization}\n selectedDate={this.value || this.initialPickerDate}\n firstDayOfWeek={this.firstDayOfWeek}\n color={this.color || undefined}\n part=\"date-picker\"\n ></nano-date-picker>\n </div>\n </nano-dropdown>,\n ]}\n {(hasHelperSlot || this.helperText || this.showInlineError) && (\n <span slot=\"helper\">\n <span class={{ vhidden: !!this.value.length }}>\n <slot name=\"helper\" />\n </span>\n {this.helperText && !!valueDate && (\n <span>\n {valueDate.toLocaleDateString(\n this.locale,\n this.helperTextFormat\n )}\n </span>\n )}\n </span>\n )}\n </nano-input>\n <input type=\"hidden\" value={this.value} name={this.name} />\n </div>\n </Host>\n );\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  var __awaiter=this&&this.__awaiter||function(e,t,a,n){function o(e){return e instanceof a?e:new a((function(t){t(e)}))}return new(a||(a=Promise))((function(a,i){function s(e){try{d(n.next(e))}catch(t){i(t)}}function r(e){try{d(n["throw"](e))}catch(t){i(t)}}function d(e){e.done?a(e.value):o(e.value).then(s,r)}d((n=n.apply(e,t||[])).next())}))};var __generator=this&&this.__generator||function(e,t){var a={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,s;return s={next:r(0),throw:r(1),return:r(2)},typeof Symbol==="function"&&(s[Symbol.iterator]=function(){return this}),s;function r(e){return function(t){return d([e,t])}}function d(s){if(n)throw new TypeError("Generator is already executing.");while(a)try{if(n=1,o&&(i=s[0]&2?o["return"]:s[0]?o["throw"]||((i=o["return"])&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;if(o=0,i)s=[s[0]&2,i.value];switch(s[0]){case 0:case 1:i=s;break;case 4:a.label++;return{value:s[1],done:false};case 5:a.label++;o=s[1];s=[0];continue;case 7:s=a.ops.pop();a.trys.pop();continue;default:if(!(i=a.trys,i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){a=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]<i[3])){a.label=s[1];break}if(s[0]===6&&a.label<i[1]){a.label=i[1];i=s;break}if(i&&a.label<i[2]){a.label=i[2];a.ops.push(s);break}if(i[2])a.ops.pop();a.trys.pop();continue}s=t.call(e,a)}catch(r){s=[6,r];o=0}finally{n=i=0}if(s[0]&5)throw s[1];return{value:s[0]?s[1]:void 0,done:true}}};
2
2
  /*!
3
3
  * Web Components for Nanopore digital Web Apps
4
- */import{h,r as registerInstance,c as createEvent,e as Host,g as getElement}from"./index-c42becad.js";import{b as createIdentifier,D as DaysOfWeek$1,i as inRange$1,p as parseISODate,d as addDays$1,s as startOfWeek$1,e as endOfWeek$1,f as setMonth,g as startOfMonth$1,h as endOfMonth$1,j as clamp$1,k as setYear,a as printISODate}from"./date-utils-e4b757ff.js";import{c as createColorClasses}from"./theme-1d4c8719.js";import{f as focusVisible}from"./focus-visible-8b2c14da.js";var DaysOfWeek;(function(e){e[e["Sunday"]=0]="Sunday";e[e["Monday"]=1]="Monday";e[e["Tuesday"]=2]="Tuesday";e[e["Wednesday"]=3]="Wednesday";e[e["Thursday"]=4]="Thursday";e[e["Friday"]=5]="Friday";e[e["Saturday"]=6]="Saturday"})(DaysOfWeek||(DaysOfWeek={}));function isEqual(e,t){if(e==null||t==null){return false}return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function addDays(e,t){var a=new Date(e);a.setDate(a.getDate()+t);return a}function startOfWeek(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=new Date(e);var n=a.getDay();var o=(n<t?7:0)+n-t;a.setDate(a.getDate()-o);return a}function endOfWeek(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=new Date(e);var n=a.getDay();var o=(n<t?-7:0)+6-(n-t);a.setDate(a.getDate()+o);return a}function startOfMonth(e){return new Date(e.getFullYear(),e.getMonth(),1)}function endOfMonth(e){return new Date(e.getFullYear(),e.getMonth()+1,0)}function inRange(e,t,a){return clamp(e,t,a)===e}function clamp(e,t,a){var n=e.getTime();if(t&&t instanceof Date&&n<t.getTime()){return t}if(a&&a instanceof Date&&n>a.getTime()){return a}return e}function getDaysInRange(e,t){var a=[];var n=e;while(!isEqual(n,t)){a.push(n);n=addDays(n,1)}a.push(n);return a}function getViewOfMonth(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=startOfWeek(startOfMonth(e),t);var n=endOfWeek(endOfMonth(e),t);return getDaysInRange(a,n)}var DatePickerDay=function(e){var t=e.focusedDay,a=e.today,n=e.day,o=e.onDaySelect,i=e.onKeyboardNavigation,s=e.focusedDayRef,r=e.inRange,d=e.disabled,l=e.isSelected;var c=isEqual(n,a);var u=isEqual(n,t);var f=n.getMonth()!==t.getMonth()||d;var b=!r;function p(e){o(e,n)}return h("button",{class:{"duet-date__day":true,"is-outside":b,"is-disabled":f,"is-today":c},tabIndex:u?0:-1,onClick:p,onKeyDown:i,disabled:b,type:"button","aria-pressed":l?"true":"false",ref:function(e){if(u&&e&&s){s(e)}}},h("span",{"aria-hidden":"true"},n.getDate()),h("span",{class:"duet-date__vhidden"},n.toLocaleDateString(undefined,{day:"numeric",month:"long"})))};function chunk(e,t){var a=[];for(var n=0;n<e.length;n+=t){a.push(e.slice(n,n+t))}return a}function mapWithOffset(e,t,a){return e.map((function(n,o){var i=(o+t)%e.length;return a(e[i])}))}var DatePickerMonth=function(e){var t=e.selectedDate,a=e.focusedDate,n=e.labelledById,o=e.localization,i=e.firstDayOfWeek,s=e.min,r=e.max,d=e.onDateSelect,l=e.onKeyboardNavigation,c=e.focusedDayRef,u=e.onMouseDown,f=e.onFocusIn,b=e.isDateDisabled;var p=new Date;var y=getViewOfMonth(a,i);return h("table",{class:"duet-date__table",role:"grid","aria-labelledby":n,onFocusin:f,onMouseDown:u},h("thead",null,h("tr",null,mapWithOffset(o.dayNames,i,(function(e){return h("th",{class:"duet-date__table-header",scope:"col"},h("span",{"aria-hidden":"true"},e.substr(0,2)),h("span",{class:"duet-date__vhidden"},e))})))),h("tbody",null,chunk(y,7).map((function(e){return h("tr",{class:"duet-date__row"},e.map((function(e){return h("td",{class:"duet-date__cell",role:"gridcell","aria-selected":isEqual(e,t)?"true":undefined},h(DatePickerDay,{day:e,today:p,focusedDay:a,inRange:inRange(e,s,r),onDaySelect:d,onKeyboardNavigation:l,focusedDayRef:c,disabled:b(e),isSelected:isEqual(e,t)}))})))}))))};var localization={buttonLabel:"Choose date",placeholder:"YYYY-MM-DD",selectedDateMessage:"Selected date is",prevMonthLabel:"Previous month",nextMonthLabel:"Next month",monthSelectLabel:"Month",yearSelectLabel:"Year",closeLabel:"Close window",keyboardInstruction:"You can use arrow keys to navigate dates",calendarHeading:"Choose a date",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]};var datePickerCss=':host{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden]{display:none !important}:host{--background:var(--nano-layer-bg, #fff);--active-color:var(--nano-color-base, var(--nano-color-primary, #007495));--active-text-color:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n );--focus-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));--inactive-color:var(--nano-button-color, #f0efed);display:block;font-size:16px}:host(.nano-color){--active-color:var(--nano-color-base, var(--nano-color-primary, #007495));--active-text-color:var(--nano-color-contrast);--focus-shadow:0 0 0 0.1875rem rgba(var(--nano-color-tint-rgb), 0.56)}.duet-date *,.duet-date *::before,.duet-date *::after{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}.duet-date{-webkit-box-sizing:border-box;box-sizing:border-box;color:currentColor;display:block;margin:0;position:relative;text-align:left;width:100%}.duet-date__dialog{display:-webkit-box;display:-ms-flexbox;display:flex;top:100%;max-width:100%;width:100%}.duet-date__dialog.is-left{left:auto;right:0;width:auto}.duet-date__dialog-content{background:var(--background);min-width:290px;padding:16px 16px 20px;position:relative;-webkit-transform:none;transform:none;max-width:100%;width:100%}.duet-date__table{border-collapse:collapse;border-spacing:0;font-size:1em;line-height:1.25;text-align:center;width:100%}.duet-date__table-header{font-size:0.75em;font-weight:600;letter-spacing:1px;line-height:1.25;padding-bottom:8px;text-decoration:none;text-transform:uppercase}.duet-date__cell{text-align:center}.duet-date__day{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:transparent;border:0;border-radius:50%;cursor:pointer;display:inline-block;font-size:0.875em;font-variant-numeric:tabular-nums;line-height:1.25;position:relative;text-align:center;vertical-align:middle;z-index:1;-webkit-transition:0.15s ease all;transition:0.15s ease all;height:2.5em;width:2.5em}.duet-date__day.is-today{-webkit-box-shadow:0 0 0 1px var(--active-color);box-shadow:0 0 0 1px var(--active-color);position:relative}.duet-date__day:hover::before,.duet-date__day.is-today::before{content:"";background:var(--active-color);border-radius:50%;bottom:0;left:0;opacity:0.16;position:absolute;right:0;top:0}[aria-selected=true] .duet-date__day{background:var(--active-color);color:var(--active-text-color);-webkit-box-shadow:none;box-shadow:none;outline:0}.duet-date__day:active{background:var(--active-color);-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);color:var(--active-text-color)}.duet-date__day:focus{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);outline:0}.duet-date__day.is-disabled{background:transparent;-webkit-box-shadow:none;box-shadow:none;cursor:default;opacity:0.5}.duet-date__day.is-disabled::before{display:none}.duet-date__day.is-outside{background:var(--inactive-color);-webkit-box-shadow:none;box-shadow:none;cursor:default;opacity:0.6;pointer-events:none}.duet-date__day.is-outside::before{display:none}.duet-date__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:16px;width:100%}.duet-date__nav{white-space:nowrap}.duet-date__prev,.duet-date__next{background:var(--inactive-color);-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;appearance:none;border:0;border-radius:50%;cursor:pointer;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:distribute;justify-content:space-around;margin-left:8px;padding:0;-webkit-transition:background-color 300ms ease;transition:background-color 300ms ease;font-size:0.9em;height:2.2em;width:2.2em}.duet-date__prev:focus,.duet-date__next:focus{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);outline:0}.duet-date__prev:active:focus,.duet-date__next:active:focus{-webkit-box-shadow:none;box-shadow:none}.duet-date__prev:disabled,.duet-date__next:disabled{cursor:default;opacity:0.5}.duet-date__prev nano-icon,.duet-date__next nano-icon{margin:0 auto}.duet-date__select{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-top:4px;position:relative}.duet-date__select span{margin-right:4px}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.duet-date__select span{margin-right:unset;-webkit-margin-end:4px;margin-inline-end:4px}}.duet-date__select select{cursor:pointer;font-size:1em;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%;z-index:2}.duet-date__select select.focus-visible:focus+.duet-date__select-label{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow)}.duet-date__select-label{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1.25em;font-weight:600;line-height:1.25;padding:0 4px 0 8px;pointer-events:none;position:relative;width:100%;z-index:1}.duet-date__select-label nano-icon{font-size:0.55em}.duet-date__vhidden{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;top:0;width:1px}';function range(e,t){var a=[];for(var n=e;n<=t;n++){a.push(n)}return a}var DatePicker=function(){function e(e){var t=this;registerInstance(this,e);this.nanoDatePicked=createEvent(this,"nanoDatePicked",7);this.monthSelectId=createIdentifier("NanoDateMonth");this.yearSelectId=createIdentifier("NanoDateYear");this.dialogLabelId=createIdentifier("NanoDateLabel");this.initialTouchX=null;this.initialTouchY=null;this.activeFocus=false;this.focusedDay=new Date;this.selectedDate="";this.min="";this.max="";this.firstDayOfWeek=DaysOfWeek$1.Monday;this.localization=localization;this.isDateDisabled=function(){return false};this.isModal=false;this.enableActiveFocus=function(){t.activeFocus=true};this.disableActiveFocus=function(){t.activeFocus=false};this.handleTouchStart=function(e){var a=e.changedTouches[0];t.initialTouchX=a.pageX;t.initialTouchY=a.pageY};this.handleTouchMove=function(e){e.preventDefault()};this.handleTouchEnd=function(e){var a=e.changedTouches[0];var n=a.pageX-t.initialTouchX;var o=a.pageY-t.initialTouchY;var i=70;var s=Math.abs(n)>=i&&Math.abs(o)<=i;if(s){t.addMonths(n<0?1:-1)}t.initialTouchY=null;t.initialTouchX=null};this.handleNextMonthClick=function(e){e.preventDefault();t.addMonths(1)};this.handlePreviousMonthClick=function(e){e.preventDefault();t.addMonths(-1)};this.handleKeyboardNavigation=function(e){if(e.key==="Tab"&&!e.shiftKey&&t.isModal){e.preventDefault();var a=t.firstFocusEle||t.firstFocusableElement;a.focus();return}var n=true;switch(e.key){case"ArrowRight":t.addDays(1);break;case"ArrowLeft":t.addDays(-1);break;case"ArrowDown":t.addDays(7);break;case"ArrowUp":t.addDays(-7);break;case"PageUp":if(e.shiftKey){t.addYears(-1)}else{t.addMonths(-1)}break;case"PageDown":if(e.shiftKey){t.addYears(1)}else{t.addMonths(1)}break;case"Home":t.startOfWeek();break;case"End":t.endOfWeek();break;default:n=false}if(n){e.preventDefault();t.enableActiveFocus()}};this.handleDaySelect=function(e,a){var n=!t.isDateDisabled(a);var o=inRange$1(a,parseISODate(t.min),parseISODate(t.max));if(!o||!n){return}if(a.getMonth()===t.focusedDay.getMonth()){t.setValue(a)}else{t.setFocusedDay(a)}};this.handleMonthSelect=function(e){t.setMonth(parseInt(e.target.value,10))};this.handleYearSelect=function(e){t.setYear(parseInt(e.target.value,10))};this.processFocusedDayNode=function(e){t.focusedDayNode=e;if(t.activeFocus){setTimeout((function(){return e.focus()}),0)}}}e.prototype.setFocus=function(e,t){if(e===void 0){e=false}if(t===void 0){t=false}return __awaiter(this,void 0,void 0,(function(){var a=this;return __generator(this,(function(n){this.setFocusedDay(parseISODate(this.selectedDate)||new Date);if(e){setTimeout((function(e){return a.focusedDayNode.focus()}),20);return[2]}clearTimeout(this.focusTimeoutId);this.focusTimeoutId=setTimeout((function(){if(t)focusVisible.force(a.monthSelectNode);a.monthSelectNode.focus()}),20);return[2]}))}))};e.prototype.handleSelectedDateChange=function(){this.setFocus(true)};e.prototype.addDays=function(e){this.setFocusedDay(addDays$1(this.focusedDay,e))};e.prototype.addMonths=function(e){this.setMonth(this.focusedDay.getMonth()+e)};e.prototype.addYears=function(e){this.setYear(this.focusedDay.getFullYear()+e)};e.prototype.startOfWeek=function(){this.setFocusedDay(startOfWeek$1(this.focusedDay,this.firstDayOfWeek))};e.prototype.endOfWeek=function(){this.setFocusedDay(endOfWeek$1(this.focusedDay,this.firstDayOfWeek))};e.prototype.setMonth=function(e){var t=setMonth(startOfMonth$1(this.focusedDay),e);var a=endOfMonth$1(t);var n=setMonth(this.focusedDay,e);this.setFocusedDay(clamp$1(n,t,a))};e.prototype.setYear=function(e){var t=setYear(startOfMonth$1(this.focusedDay),e);var a=endOfMonth$1(t);var n=setYear(this.focusedDay,e);this.setFocusedDay(clamp$1(n,t,a))};e.prototype.setFocusedDay=function(e){this.focusedDay=clamp$1(e,parseISODate(this.min),parseISODate(this.max))};e.prototype.setValue=function(e){this.selectedDate=printISODate(e);this.nanoDatePicked.emit({value:this.selectedDate,valueAsDate:e})};e.prototype.connectedCallback=function(){if(this.yearSelectNode)focusVisible.observe(this.yearSelectNode);if(this.monthSelectNode)focusVisible.observe(this.monthSelectNode)};e.prototype.componentWillLoad=function(){this.handleSelectedDateChange()};e.prototype.componentDidLoad=function(){this.connectedCallback()};e.prototype.disconnectedCallback=function(){focusVisible.unobserve(this.yearSelectNode);focusVisible.unobserve(this.monthSelectNode)};e.prototype.render=function(){var e=this;var t=parseISODate(this.selectedDate);var a=(t||this.focusedDay).getFullYear();var n=this.focusedDay.getMonth();var o=this.focusedDay.getFullYear();var i=parseISODate(this.min);var s=parseISODate(this.max);var r=i!=null&&i.getMonth()===n&&i.getFullYear()===o;var d=s!=null&&s.getMonth()===n&&s.getFullYear()===o;var l=a-10;var c=a+10;if(i)l=i.getFullYear();if(s)c=s.getFullYear();return h(Host,{class:Object.assign({},createColorClasses(this.color))},h("div",{class:"duet-date"},h("div",{class:{"duet-date__dialog":true,"is-active":true},onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd},h("div",{class:"duet-date__dialog-content"},h("div",{class:"duet-date__vhidden duet-date__instructions","aria-live":"polite"},this.localization.keyboardInstruction),h("div",{class:"duet-date__header",onFocusin:this.disableActiveFocus},h("div",null,h("h2",{id:this.dialogLabelId,class:"duet-date__vhidden","aria-live":"polite"},this.localization.monthNames[n]," ",this.focusedDay.getFullYear()),h("label",{htmlFor:this.monthSelectId,class:"duet-date__vhidden"},this.localization.monthSelectLabel),h("div",{class:"duet-date__select"},h("select",{id:this.monthSelectId,class:"duet-date__select--month",ref:function(t){return e.firstFocusableElement=e.monthSelectNode=t},onChange:this.handleMonthSelect},this.localization.monthNames.map((function(e,t){return h("option",{key:e,value:t,selected:t===n,disabled:!inRange$1(new Date(o,t,1),i?startOfMonth$1(i):null,s?endOfMonth$1(s):null)},e)}))),h("div",{class:"duet-date__select-label","aria-hidden":"true"},h("span",null,this.localization.monthNamesShort[n]),h("nano-icon",{name:"light/chevron-down"}))),h("label",{htmlFor:this.yearSelectId,class:"duet-date__vhidden"},this.localization.yearSelectLabel),h("div",{class:"duet-date__select"},h("select",{id:this.yearSelectId,class:"duet-date__select--year",onChange:this.handleYearSelect,ref:function(t){return e.yearSelectNode=t}},range(l,c).map((function(e){return h("option",{key:e,selected:e===o},e)}))),h("div",{class:"duet-date__select-label","aria-hidden":"true"},h("span",null,this.focusedDay.getFullYear()),h("nano-icon",{name:"light/chevron-down"})))),h("div",{class:"duet-date__nav"},h("button",{class:"duet-date__prev",onClick:this.handlePreviousMonthClick,disabled:r,type:"button"},h("nano-icon",{name:"light/chevron-left"}),h("span",{class:"duet-date__vhidden"},this.localization.prevMonthLabel)),h("button",{class:"duet-date__next",onClick:this.handleNextMonthClick,disabled:d,type:"button"},h("nano-icon",{name:"light/chevron-right"}),h("span",{class:"duet-date__vhidden"},this.localization.nextMonthLabel)))),h("div",null,h(DatePickerMonth,{selectedDate:t,focusedDate:this.focusedDay,onDateSelect:this.handleDaySelect,onKeyboardNavigation:this.handleKeyboardNavigation,labelledById:this.dialogLabelId,localization:this.localization,firstDayOfWeek:this.firstDayOfWeek,focusedDayRef:this.processFocusedDayNode,min:i,max:s,isDateDisabled:this.isDateDisabled}))))))};Object.defineProperty(e.prototype,"host",{get:function(){return getElement(this)},enumerable:false,configurable:true});Object.defineProperty(e,"watchers",{get:function(){return{selectedDate:["handleSelectedDateChange"]}},enumerable:false,configurable:true});return e}();DatePicker.style=datePickerCss;export{DatePicker as nano_date_picker};
4
+ */import{h,r as registerInstance,c as createEvent,e as Host,g as getElement}from"./index-c42becad.js";import{b as createIdentifier,D as DaysOfWeek$1,i as inRange$1,p as parseISODate,d as addDays$1,s as startOfWeek$1,e as endOfWeek$1,f as setMonth,g as startOfMonth$1,h as endOfMonth$1,j as clamp$1,k as setYear,a as printISODate}from"./date-utils-839cb010.js";import{c as createColorClasses}from"./theme-1d4c8719.js";import{f as focusVisible}from"./focus-visible-8b2c14da.js";var DaysOfWeek;(function(e){e[e["Sunday"]=0]="Sunday";e[e["Monday"]=1]="Monday";e[e["Tuesday"]=2]="Tuesday";e[e["Wednesday"]=3]="Wednesday";e[e["Thursday"]=4]="Thursday";e[e["Friday"]=5]="Friday";e[e["Saturday"]=6]="Saturday"})(DaysOfWeek||(DaysOfWeek={}));function isEqual(e,t){if(e==null||t==null){return false}return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function addDays(e,t){var a=new Date(e);a.setDate(a.getDate()+t);return a}function startOfWeek(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=new Date(e);var n=a.getDay();var o=(n<t?7:0)+n-t;a.setDate(a.getDate()-o);return a}function endOfWeek(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=new Date(e);var n=a.getDay();var o=(n<t?-7:0)+6-(n-t);a.setDate(a.getDate()+o);return a}function startOfMonth(e){return new Date(e.getFullYear(),e.getMonth(),1)}function endOfMonth(e){return new Date(e.getFullYear(),e.getMonth()+1,0)}function inRange(e,t,a){return clamp(e,t,a)===e}function clamp(e,t,a){var n=e.getTime();if(t&&t instanceof Date&&n<t.getTime()){return t}if(a&&a instanceof Date&&n>a.getTime()){return a}return e}function getDaysInRange(e,t){var a=[];var n=e;while(!isEqual(n,t)){a.push(n);n=addDays(n,1)}a.push(n);return a}function getViewOfMonth(e,t){if(t===void 0){t=DaysOfWeek.Monday}var a=startOfWeek(startOfMonth(e),t);var n=endOfWeek(endOfMonth(e),t);return getDaysInRange(a,n)}var DatePickerDay=function(e){var t=e.focusedDay,a=e.today,n=e.day,o=e.onDaySelect,i=e.onKeyboardNavigation,s=e.focusedDayRef,r=e.inRange,d=e.disabled,l=e.isSelected;var c=isEqual(n,a);var u=isEqual(n,t);var f=n.getMonth()!==t.getMonth()||d;var b=!r;function p(e){o(e,n)}return h("button",{class:{"duet-date__day":true,"is-outside":b,"is-disabled":f,"is-today":c},tabIndex:u?0:-1,onClick:p,onKeyDown:i,disabled:b,type:"button","aria-pressed":l?"true":"false",ref:function(e){if(u&&e&&s){s(e)}}},h("span",{"aria-hidden":"true"},n.getDate()),h("span",{class:"duet-date__vhidden"},n.toLocaleDateString(undefined,{day:"numeric",month:"long"})))};function chunk(e,t){var a=[];for(var n=0;n<e.length;n+=t){a.push(e.slice(n,n+t))}return a}function mapWithOffset(e,t,a){return e.map((function(n,o){var i=(o+t)%e.length;return a(e[i])}))}var DatePickerMonth=function(e){var t=e.selectedDate,a=e.focusedDate,n=e.labelledById,o=e.localization,i=e.firstDayOfWeek,s=e.min,r=e.max,d=e.onDateSelect,l=e.onKeyboardNavigation,c=e.focusedDayRef,u=e.onMouseDown,f=e.onFocusIn,b=e.isDateDisabled;var p=new Date;var y=getViewOfMonth(a,i);return h("table",{class:"duet-date__table",role:"grid","aria-labelledby":n,onFocusin:f,onMouseDown:u},h("thead",null,h("tr",null,mapWithOffset(o.dayNames,i,(function(e){return h("th",{class:"duet-date__table-header",scope:"col"},h("span",{"aria-hidden":"true"},e.substr(0,2)),h("span",{class:"duet-date__vhidden"},e))})))),h("tbody",null,chunk(y,7).map((function(e){return h("tr",{class:"duet-date__row"},e.map((function(e){return h("td",{class:"duet-date__cell",role:"gridcell","aria-selected":isEqual(e,t)?"true":undefined},h(DatePickerDay,{day:e,today:p,focusedDay:a,inRange:inRange(e,s,r),onDaySelect:d,onKeyboardNavigation:l,focusedDayRef:c,disabled:b(e),isSelected:isEqual(e,t)}))})))}))))};var localization={buttonLabel:"Choose date",placeholder:"YYYY-MM-DD",selectedDateMessage:"Selected date is",prevMonthLabel:"Previous month",nextMonthLabel:"Next month",monthSelectLabel:"Month",yearSelectLabel:"Year",closeLabel:"Close window",keyboardInstruction:"You can use arrow keys to navigate dates",calendarHeading:"Choose a date",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]};var datePickerCss=':host{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden]{display:none !important}:host{--background:var(--nano-layer-bg, #fff);--active-color:var(--nano-color-base, var(--nano-color-primary, #007495));--active-text-color:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n );--focus-shadow:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));--inactive-color:var(--nano-button-color, #f0efed);display:block;font-size:16px}:host(.nano-color){--active-color:var(--nano-color-base, var(--nano-color-primary, #007495));--active-text-color:var(--nano-color-contrast);--focus-shadow:0 0 0 0.1875rem rgba(var(--nano-color-tint-rgb), 0.56)}.duet-date *,.duet-date *::before,.duet-date *::after{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0}.duet-date{-webkit-box-sizing:border-box;box-sizing:border-box;color:currentColor;display:block;margin:0;position:relative;text-align:left;width:100%}.duet-date__dialog{display:-webkit-box;display:-ms-flexbox;display:flex;top:100%;max-width:100%;width:100%}.duet-date__dialog.is-left{left:auto;right:0;width:auto}.duet-date__dialog-content{background:var(--background);min-width:290px;padding:16px 16px 20px;position:relative;-webkit-transform:none;transform:none;max-width:100%;width:100%}.duet-date__table{border-collapse:collapse;border-spacing:0;font-size:1em;line-height:1.25;text-align:center;width:100%}.duet-date__table-header{font-size:0.75em;font-weight:600;letter-spacing:1px;line-height:1.25;padding-bottom:8px;text-decoration:none;text-transform:uppercase}.duet-date__cell{text-align:center}.duet-date__day{-moz-appearance:none;-webkit-appearance:none;appearance:none;background:transparent;border:0;border-radius:50%;cursor:pointer;display:inline-block;font-size:0.875em;font-variant-numeric:tabular-nums;line-height:1.25;position:relative;text-align:center;vertical-align:middle;z-index:1;-webkit-transition:0.15s ease all;transition:0.15s ease all;height:2.5em;width:2.5em}.duet-date__day.is-today{-webkit-box-shadow:0 0 0 1px var(--active-color);box-shadow:0 0 0 1px var(--active-color);position:relative}.duet-date__day:hover::before,.duet-date__day.is-today::before{content:"";background:var(--active-color);border-radius:50%;bottom:0;left:0;opacity:0.16;position:absolute;right:0;top:0}[aria-selected=true] .duet-date__day{background:var(--active-color) !important;color:var(--active-text-color);-webkit-box-shadow:none;box-shadow:none;outline:0}.duet-date__day:active{background:var(--active-color);-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);color:var(--active-text-color)}.duet-date__day:focus{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);outline:0}.duet-date__day.is-disabled{background:transparent;-webkit-box-shadow:none;box-shadow:none;cursor:default;opacity:0.5}.duet-date__day.is-disabled::before{display:none}.duet-date__day.is-outside{background:var(--inactive-color);-webkit-box-shadow:none;box-shadow:none;cursor:default;opacity:0.6;pointer-events:none}.duet-date__day.is-outside::before{display:none}.duet-date__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:16px;width:100%}.duet-date__nav{white-space:nowrap}.duet-date__prev,.duet-date__next{background:var(--inactive-color);-moz-appearance:none;-webkit-appearance:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;appearance:none;border:0;border-radius:50%;cursor:pointer;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:distribute;justify-content:space-around;margin-left:8px;padding:0;-webkit-transition:background-color 300ms ease;transition:background-color 300ms ease;font-size:0.9em;height:2.2em;width:2.2em}.duet-date__prev:focus,.duet-date__next:focus{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow);outline:0}.duet-date__prev:active:focus,.duet-date__next:active:focus{-webkit-box-shadow:none;box-shadow:none}.duet-date__prev:disabled,.duet-date__next:disabled{cursor:default;opacity:0.5}.duet-date__prev nano-icon,.duet-date__next nano-icon{margin:0 auto}.duet-date__select{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-top:4px;position:relative}.duet-date__select span{margin-right:4px}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){.duet-date__select span{margin-right:unset;-webkit-margin-end:4px;margin-inline-end:4px}}.duet-date__select select{cursor:pointer;font-size:1em;height:100%;left:0;opacity:0;position:absolute;top:0;width:100%;z-index:2}.duet-date__select select.focus-visible:focus+.duet-date__select-label{-webkit-box-shadow:var(--focus-shadow);box-shadow:var(--focus-shadow)}.duet-date__select-label{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:4px;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:1.25em;font-weight:600;line-height:1.25;padding:0 4px 0 8px;pointer-events:none;position:relative;width:100%;z-index:1}.duet-date__select-label nano-icon{font-size:0.55em}.duet-date__vhidden{border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;overflow:hidden;padding:0;position:absolute;top:0;width:1px}';function range(e,t){var a=[];for(var n=e;n<=t;n++){a.push(n)}return a}var DatePicker=function(){function e(e){var t=this;registerInstance(this,e);this.nanoDatePicked=createEvent(this,"nanoDatePicked",7);this.monthSelectId=createIdentifier("NanoDateMonth");this.yearSelectId=createIdentifier("NanoDateYear");this.dialogLabelId=createIdentifier("NanoDateLabel");this.initialTouchX=null;this.initialTouchY=null;this.activeFocus=false;this.focusedDay=new Date;this.selectedDate="";this.min="";this.max="";this.firstDayOfWeek=DaysOfWeek$1.Monday;this.localization=localization;this.isDateDisabled=function(){return false};this.isModal=false;this.enableActiveFocus=function(){t.activeFocus=true};this.disableActiveFocus=function(){t.activeFocus=false};this.handleTouchStart=function(e){var a=e.changedTouches[0];t.initialTouchX=a.pageX;t.initialTouchY=a.pageY};this.handleTouchMove=function(e){e.preventDefault()};this.handleTouchEnd=function(e){var a=e.changedTouches[0];var n=a.pageX-t.initialTouchX;var o=a.pageY-t.initialTouchY;var i=70;var s=Math.abs(n)>=i&&Math.abs(o)<=i;if(s){t.addMonths(n<0?1:-1)}t.initialTouchY=null;t.initialTouchX=null};this.handleNextMonthClick=function(e){e.preventDefault();t.addMonths(1)};this.handlePreviousMonthClick=function(e){e.preventDefault();t.addMonths(-1)};this.handleKeyboardNavigation=function(e){if(e.key==="Tab"&&!e.shiftKey&&t.isModal){e.preventDefault();var a=t.firstFocusEle||t.firstFocusableElement;a.focus();return}var n=true;switch(e.key){case"ArrowRight":t.addDays(1);break;case"ArrowLeft":t.addDays(-1);break;case"ArrowDown":t.addDays(7);break;case"ArrowUp":t.addDays(-7);break;case"PageUp":if(e.shiftKey){t.addYears(-1)}else{t.addMonths(-1)}break;case"PageDown":if(e.shiftKey){t.addYears(1)}else{t.addMonths(1)}break;case"Home":t.startOfWeek();break;case"End":t.endOfWeek();break;default:n=false}if(n){e.preventDefault();t.enableActiveFocus()}};this.handleDaySelect=function(e,a){var n=!t.isDateDisabled(a);var o=inRange$1(a,parseISODate(t.min),parseISODate(t.max));if(!o||!n){return}if(a.getMonth()===t.focusedDay.getMonth()){t.setValue(a)}else{t.setFocusedDay(a)}};this.handleMonthSelect=function(e){t.setMonth(parseInt(e.target.value,10))};this.handleYearSelect=function(e){t.setYear(parseInt(e.target.value,10))};this.processFocusedDayNode=function(e){t.focusedDayNode=e;if(t.activeFocus){setTimeout((function(){return e.focus()}),0)}}}e.prototype.setFocus=function(e,t){if(e===void 0){e=false}if(t===void 0){t=false}return __awaiter(this,void 0,void 0,(function(){var a=this;return __generator(this,(function(n){this.setFocusedDay(parseISODate(this.selectedDate)||new Date);if(e){setTimeout((function(e){return a.focusedDayNode.focus()}),20);return[2]}clearTimeout(this.focusTimeoutId);this.focusTimeoutId=setTimeout((function(){if(t)focusVisible.force(a.monthSelectNode);a.monthSelectNode.focus()}),20);return[2]}))}))};e.prototype.handleSelectedDateChange=function(){this.setFocus(true)};e.prototype.addDays=function(e){this.setFocusedDay(addDays$1(this.focusedDay,e))};e.prototype.addMonths=function(e){this.setMonth(this.focusedDay.getMonth()+e)};e.prototype.addYears=function(e){this.setYear(this.focusedDay.getFullYear()+e)};e.prototype.startOfWeek=function(){this.setFocusedDay(startOfWeek$1(this.focusedDay,this.firstDayOfWeek))};e.prototype.endOfWeek=function(){this.setFocusedDay(endOfWeek$1(this.focusedDay,this.firstDayOfWeek))};e.prototype.setMonth=function(e){var t=setMonth(startOfMonth$1(this.focusedDay),e);var a=endOfMonth$1(t);var n=setMonth(this.focusedDay,e);this.setFocusedDay(clamp$1(n,t,a))};e.prototype.setYear=function(e){var t=setYear(startOfMonth$1(this.focusedDay),e);var a=endOfMonth$1(t);var n=setYear(this.focusedDay,e);this.setFocusedDay(clamp$1(n,t,a))};e.prototype.setFocusedDay=function(e){this.focusedDay=clamp$1(e,parseISODate(this.min),parseISODate(this.max))};e.prototype.setValue=function(e){this.selectedDate=printISODate(e);this.nanoDatePicked.emit({value:this.selectedDate,valueAsDate:e})};e.prototype.connectedCallback=function(){if(this.yearSelectNode)focusVisible.observe(this.yearSelectNode);if(this.monthSelectNode)focusVisible.observe(this.monthSelectNode)};e.prototype.componentWillLoad=function(){this.handleSelectedDateChange()};e.prototype.componentDidLoad=function(){this.connectedCallback()};e.prototype.disconnectedCallback=function(){focusVisible.unobserve(this.yearSelectNode);focusVisible.unobserve(this.monthSelectNode)};e.prototype.render=function(){var e=this;var t=parseISODate(this.selectedDate);var a=(t||this.focusedDay).getFullYear();var n=this.focusedDay.getMonth();var o=this.focusedDay.getFullYear();var i=parseISODate(this.min);var s=parseISODate(this.max);var r=i!=null&&i.getMonth()===n&&i.getFullYear()===o;var d=s!=null&&s.getMonth()===n&&s.getFullYear()===o;var l=a-10;var c=a+10;if(i)l=i.getFullYear();if(s)c=s.getFullYear();return h(Host,{class:Object.assign({},createColorClasses(this.color))},h("div",{class:"duet-date"},h("div",{class:{"duet-date__dialog":true,"is-active":true},onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd},h("div",{class:"duet-date__dialog-content"},h("div",{class:"duet-date__vhidden duet-date__instructions","aria-live":"polite"},this.localization.keyboardInstruction),h("div",{class:"duet-date__header",onFocusin:this.disableActiveFocus},h("div",null,h("h2",{id:this.dialogLabelId,class:"duet-date__vhidden","aria-live":"polite"},this.localization.monthNames[n]," ",this.focusedDay.getFullYear()),h("label",{htmlFor:this.monthSelectId,class:"duet-date__vhidden"},this.localization.monthSelectLabel),h("div",{class:"duet-date__select"},h("select",{id:this.monthSelectId,class:"duet-date__select--month",ref:function(t){return e.firstFocusableElement=e.monthSelectNode=t},onChange:this.handleMonthSelect},this.localization.monthNames.map((function(e,t){return h("option",{key:e,value:t,selected:t===n,disabled:!inRange$1(new Date(o,t,1),i?startOfMonth$1(i):null,s?endOfMonth$1(s):null)},e)}))),h("div",{class:"duet-date__select-label","aria-hidden":"true"},h("span",null,this.localization.monthNamesShort[n]),h("nano-icon",{name:"light/chevron-down"}))),h("label",{htmlFor:this.yearSelectId,class:"duet-date__vhidden"},this.localization.yearSelectLabel),h("div",{class:"duet-date__select"},h("select",{id:this.yearSelectId,class:"duet-date__select--year",onChange:this.handleYearSelect,ref:function(t){return e.yearSelectNode=t}},range(l,c).map((function(e){return h("option",{key:e,selected:e===o},e)}))),h("div",{class:"duet-date__select-label","aria-hidden":"true"},h("span",null,this.focusedDay.getFullYear()),h("nano-icon",{name:"light/chevron-down"})))),h("div",{class:"duet-date__nav"},h("button",{class:"duet-date__prev",onClick:this.handlePreviousMonthClick,disabled:r,type:"button"},h("nano-icon",{name:"light/chevron-left"}),h("span",{class:"duet-date__vhidden"},this.localization.prevMonthLabel)),h("button",{class:"duet-date__next",onClick:this.handleNextMonthClick,disabled:d,type:"button"},h("nano-icon",{name:"light/chevron-right"}),h("span",{class:"duet-date__vhidden"},this.localization.nextMonthLabel)))),h("div",null,h(DatePickerMonth,{selectedDate:t,focusedDate:this.focusedDay,onDateSelect:this.handleDaySelect,onKeyboardNavigation:this.handleKeyboardNavigation,labelledById:this.dialogLabelId,localization:this.localization,firstDayOfWeek:this.firstDayOfWeek,focusedDayRef:this.processFocusedDayNode,min:i,max:s,isDateDisabled:this.isDateDisabled}))))))};Object.defineProperty(e.prototype,"host",{get:function(){return getElement(this)},enumerable:false,configurable:true});Object.defineProperty(e,"watchers",{get:function(){return{selectedDate:["handleSelectedDateChange"]}},enumerable:false,configurable:true});return e}();DatePicker.style=datePickerCss;export{DatePicker as nano_date_picker};
5
5
  //# sourceMappingURL=nano-date-picker.entry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["src/components/date-picker/duet-date-picker/date-utils.ts","src/components/date-picker/duet-date-picker/date-picker-day.tsx","src/components/date-picker/duet-date-picker/date-picker-month.tsx","src/components/date-picker/duet-date-picker/date-localization.ts","src/components/date-picker/date-picker.scss?tag=nano-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"names":["DaysOfWeek","isEqual","a","b","getFullYear","getMonth","getDate","addDays","date","days","d","Date","setDate","startOfWeek","firstDayOfWeek","Monday","day","getDay","diff","endOfWeek","startOfMonth","endOfMonth","inRange","min","max","clamp","time","getTime","getDaysInRange","start","end","current","push","getViewOfMonth","DatePickerDay","_a","focusedDay","today","onDaySelect","onKeyboardNavigation","focusedDayRef","disabled","isSelected","isToday","isFocused","isDisabled","isOutsideRange","handleClick","e","h","class","duet-date__day","is-outside","is-disabled","is-today","tabIndex","onClick","onKeyDown","type","aria-pressed","ref","el","aria-hidden","toLocaleDateString","undefined","month","chunk","array","chunkSize","result","i","length","slice","mapWithOffset","startingOffset","mapFn","map","_","adjustedIndex","DatePickerMonth","selectedDate","focusedDate","labelledById","localization","onDateSelect","onMouseDown","onFocusIn","isDateDisabled","role","aria-labelledby","onFocusin","dayNames","dayName","scope","substr","week","aria-selected","buttonLabel","placeholder","selectedDateMessage","prevMonthLabel","nextMonthLabel","monthSelectLabel","yearSelectLabel","closeLabel","keyboardInstruction","calendarHeading","monthNames","monthNamesShort","datePickerCss","range","from","to","DatePicker","class_1","hostRef","_this","this","monthSelectId","createIdentifier","yearSelectId","dialogLabelId","initialTouchX","initialTouchY","activeFocus","defaultLocalization","isModal","enableActiveFocus","disableActiveFocus","handleTouchStart","event","touch","changedTouches","pageX","pageY","handleTouchMove","preventDefault","handleTouchEnd","distX","distY","threshold","isHorizontalSwipe","Math","abs","addMonths","handleNextMonthClick","handlePreviousMonthClick","handleKeyboardNavigation","key","shiftKey","ele","firstFocusEle","firstFocusableElement","focus","handled","addYears","handleDaySelect","_event","isAllowed","isInRange","parseISODate","setValue","setFocusedDay","handleMonthSelect","setMonth","parseInt","target","value","handleYearSelect","setYear","processFocusedDayNode","element","focusedDayNode","setTimeout","prototype","setFocus","forceFocusVisible","clearTimeout","focusTimeoutId","focusVisible","force","monthSelectNode","handleSelectedDateChange","months","years","year","printISODate","nanoDatePicked","emit","valueAsDate","connectedCallback","yearSelectNode","observe","componentWillLoad","componentDidLoad","disconnectedCallback","unobserve","render","selectedYear","focusedMonth","focusedYear","minDate","maxDate","prevMonthDisabled","nextMonthDisabled","minYear","maxYear","Host","Object","assign","createColorClasses","color","duet-date__dialog","is-active","onTouchMove","onTouchStart","onTouchEnd","aria-live","id","htmlFor","onChange","selected","name"],"mappings":"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","sourcesContent":["const ISO_DATE_FORMAT = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport enum DaysOfWeek {\n Sunday = 0,\n Monday = 1,\n Tuesday = 2,\n Wednesday = 3,\n Thursday = 4,\n Friday = 5,\n Saturday = 6,\n}\n\nexport function createDate(year: string, month: string, day: string): Date {\n var dayInt = parseInt(day, 10);\n var monthInt = parseInt(month, 10);\n var yearInt = parseInt(year, 10);\n\n const isValid =\n Number.isInteger(yearInt) && // all parts should be integers\n Number.isInteger(monthInt) &&\n Number.isInteger(dayInt) &&\n monthInt > 0 && // month must be 1-12\n monthInt <= 12 &&\n dayInt > 0 && // day must be 1-31\n dayInt <= 31 &&\n yearInt > 0;\n\n if (isValid) {\n return new Date(yearInt, monthInt - 1, dayInt);\n }\n}\n\n/**\n * @param value date string in ISO format YYYY-MM-DD\n */\nexport function parseISODate(value: string): Date {\n if (!value) {\n return;\n }\n\n const matches = value.match(ISO_DATE_FORMAT);\n\n if (matches) {\n return createDate(matches[1], matches[2], matches[3]);\n }\n}\n\n/**\n * print date in format YYYY-MM-DD\n * @param date\n */\nexport function printISODate(date: Date): string {\n if (!date) {\n return '';\n }\n\n var d = date.getDate().toString(10);\n var m = (date.getMonth() + 1).toString(10);\n var y = date.getFullYear().toString(10);\n\n // days are not zero-indexed, so pad if less than 10\n if (date.getDate() < 10) {\n d = `0${d}`;\n }\n\n // months *are* zero-indexed, pad if less than 9!\n if (date.getMonth() < 9) {\n m = `0${m}`;\n }\n\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Compare if two dates are equal in terms of day, month, and year\n */\nexport function isEqual(a: Date, b: Date): boolean {\n if (a == null || b == null) {\n return false;\n }\n\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function addDays(date: Date, days: number): Date {\n var d = new Date(date);\n d.setDate(d.getDate() + days);\n return d;\n}\n\nexport function addMonths(date: Date, months: number): Date {\n const d = new Date(date);\n d.setMonth(date.getMonth() + months);\n return d;\n}\n\nexport function addYears(date: Date, years: number): Date {\n const d = new Date(date);\n d.setFullYear(date.getFullYear() + years);\n return d;\n}\n\nexport function startOfWeek(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date {\n var d = new Date(date);\n var day = d.getDay();\n var diff = (day < firstDayOfWeek ? 7 : 0) + day - firstDayOfWeek;\n\n d.setDate(d.getDate() - diff);\n return d;\n}\n\nexport function endOfWeek(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date {\n var d = new Date(date);\n var day = d.getDay();\n var diff = (day < firstDayOfWeek ? -7 : 0) + 6 - (day - firstDayOfWeek);\n\n d.setDate(d.getDate() + diff);\n return d;\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nexport function setMonth(date: Date, month: number): Date {\n const d = new Date(date);\n d.setMonth(month);\n return d;\n}\n\nexport function setYear(date: Date, year: number): Date {\n const d = new Date(date);\n d.setFullYear(year);\n return d;\n}\n\n/**\n * Check if date is within a min and max\n */\nexport function inRange(date: Date, min?: Date, max?: Date): boolean {\n return clamp(date, min, max) === date;\n}\n\n/**\n * Ensures date is within range, returns min or max if out of bounds\n */\nexport function clamp(date: Date, min?: Date, max?: Date): Date {\n const time = date.getTime();\n\n if (min && min instanceof Date && time < min.getTime()) {\n return min;\n }\n\n if (max && max instanceof Date && time > max.getTime()) {\n return max;\n }\n\n return date;\n}\n\n/**\n * given start and end date, return an (inclusive) array of all dates in between\n * @param start\n * @param end\n */\nfunction getDaysInRange(start: Date, end: Date): Date[] {\n const days: Date[] = [];\n let current = start;\n\n while (!isEqual(current, end)) {\n days.push(current);\n current = addDays(current, 1);\n }\n\n days.push(current);\n\n return days;\n}\n\n/**\n * given a date, return an array of dates from a calendar perspective\n * @param date\n * @param firstDayOfWeek\n */\nexport function getViewOfMonth(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date[] {\n const start = startOfWeek(startOfMonth(date), firstDayOfWeek);\n const end = endOfWeek(endOfMonth(date), firstDayOfWeek);\n\n return getDaysInRange(start, end);\n}\n\n/**\n * Form random hash\n */\nexport function chr4() {\n return Math.random().toString(16).slice(-4);\n}\n\n/**\n * Create random identifier with a prefix\n * @param prefix\n */\nexport function createIdentifier(prefix) {\n return `${prefix}-${chr4()}${chr4()}-${chr4()}-${chr4()}-${chr4()}-${chr4()}${chr4()}${chr4()}`;\n}\n","import { h, FunctionalComponent } from '@stencil/core';\nimport { isEqual } from './date-utils';\n\nexport type DatePickerDayProps = {\n focusedDay: Date;\n today: Date;\n day: Date;\n inRange: boolean;\n disabled: boolean;\n onDaySelect: (event: MouseEvent, day: Date) => void;\n onKeyboardNavigation: (event: KeyboardEvent) => void;\n focusedDayRef?: (element: HTMLButtonElement) => void;\n isSelected;\n};\n\nexport const DatePickerDay: FunctionalComponent<DatePickerDayProps> = ({\n focusedDay,\n today,\n day,\n onDaySelect,\n onKeyboardNavigation,\n focusedDayRef,\n inRange,\n disabled,\n isSelected,\n}) => {\n const isToday = isEqual(day, today);\n const isFocused = isEqual(day, focusedDay);\n const isDisabled = day.getMonth() !== focusedDay.getMonth() || disabled;\n const isOutsideRange = !inRange;\n\n function handleClick(e) {\n onDaySelect(e, day);\n }\n\n return (\n <button\n class={{\n 'duet-date__day': true,\n 'is-outside': isOutsideRange,\n 'is-disabled': isDisabled,\n 'is-today': isToday,\n }}\n tabIndex={isFocused ? 0 : -1}\n onClick={handleClick}\n onKeyDown={onKeyboardNavigation}\n disabled={isOutsideRange}\n type=\"button\"\n aria-pressed={isSelected ? 'true' : 'false'}\n ref={(el) => {\n if (isFocused && el && focusedDayRef) {\n focusedDayRef(el);\n }\n }}\n >\n <span aria-hidden=\"true\">{day.getDate()}</span>\n <span class=\"duet-date__vhidden\">\n {day.toLocaleDateString(undefined, { day: 'numeric', month: 'long' })}\n </span>\n </button>\n );\n};\n","import { h, FunctionalComponent } from '@stencil/core';\nimport { DuetLocalizedText } from './date-localization';\nimport { DatePickerDay, DatePickerDayProps } from './date-picker-day';\nimport { getViewOfMonth, inRange, DaysOfWeek, isEqual } from './date-utils';\nimport { DateDisabledPredicate } from '../../../interface';\n\nfunction chunk<T>(array: T[], chunkSize: number): T[][] {\n const result = [];\n\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nfunction mapWithOffset<T, U>(\n array: T[],\n startingOffset: number,\n mapFn: (item: T) => U\n): U[] {\n return array.map((_, i) => {\n const adjustedIndex = (i + startingOffset) % array.length;\n return mapFn(array[adjustedIndex]);\n });\n}\n\ntype DatePickerMonthProps = {\n selectedDate: Date;\n focusedDate: Date;\n labelledById: string;\n localization: DuetLocalizedText;\n firstDayOfWeek: DaysOfWeek;\n min?: Date;\n max?: Date;\n onDateSelect: DatePickerDayProps['onDaySelect'];\n onKeyboardNavigation: DatePickerDayProps['onKeyboardNavigation'];\n focusedDayRef: (element: HTMLButtonElement) => void;\n onFocusIn?: (e: FocusEvent) => void;\n onMouseDown?: (e: MouseEvent) => void;\n isDateDisabled: DateDisabledPredicate;\n};\n\nexport const DatePickerMonth: FunctionalComponent<DatePickerMonthProps> = ({\n selectedDate,\n focusedDate,\n labelledById,\n localization,\n firstDayOfWeek,\n min,\n max,\n onDateSelect,\n onKeyboardNavigation,\n focusedDayRef,\n onMouseDown,\n onFocusIn,\n isDateDisabled,\n}) => {\n const today = new Date();\n const days = getViewOfMonth(focusedDate, firstDayOfWeek);\n\n return (\n <table\n class=\"duet-date__table\"\n role=\"grid\"\n aria-labelledby={labelledById}\n // @ts-ignore\n onFocusin={onFocusIn}\n onMouseDown={onMouseDown}\n >\n <thead>\n <tr>\n {mapWithOffset(localization.dayNames, firstDayOfWeek, (dayName) => (\n <th class=\"duet-date__table-header\" scope=\"col\">\n <span aria-hidden=\"true\">{dayName.substr(0, 2)}</span>\n <span class=\"duet-date__vhidden\">{dayName}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {chunk(days, 7).map((week) => (\n <tr class=\"duet-date__row\">\n {week.map((day) => (\n <td\n class=\"duet-date__cell\"\n role=\"gridcell\"\n aria-selected={isEqual(day, selectedDate) ? 'true' : undefined}\n >\n <DatePickerDay\n day={day}\n today={today}\n focusedDay={focusedDate}\n inRange={inRange(day, min, max)}\n onDaySelect={onDateSelect}\n onKeyboardNavigation={onKeyboardNavigation}\n focusedDayRef={focusedDayRef}\n disabled={isDateDisabled(day)}\n isSelected={isEqual(day, selectedDate)}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n};\n","type MonthsNames = [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string\n];\ntype DayNames = [string, string, string, string, string, string, string];\n\nexport type DuetLocalizedText = {\n buttonLabel: string;\n placeholder: string;\n selectedDateMessage: string;\n prevMonthLabel: string;\n nextMonthLabel: string;\n monthSelectLabel: string;\n yearSelectLabel: string;\n closeLabel: string;\n keyboardInstruction: string;\n calendarHeading: string;\n dayNames: DayNames;\n monthNames: MonthsNames;\n monthNamesShort: MonthsNames;\n};\n\nconst localization: DuetLocalizedText = {\n buttonLabel: 'Choose date',\n placeholder: 'YYYY-MM-DD',\n selectedDateMessage: 'Selected date is',\n prevMonthLabel: 'Previous month',\n nextMonthLabel: 'Next month',\n monthSelectLabel: 'Month',\n yearSelectLabel: 'Year',\n closeLabel: 'Close window',\n keyboardInstruction: 'You can use arrow keys to navigate dates',\n calendarHeading: 'Choose a date',\n dayNames: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n monthNamesShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n};\n\nexport default localization;\n","@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/layers';\n\n:host {\n /**\n * @prop --background: defaults to #{$layer-bg-color}\n * @prop --active-color: defaults to var(--nano-color-base, #{nano-color(primary,base)})\n * @prop --active-text-color: defaults to var(--nano-color-contrast, #{nano-color(primary, contrast)})\n * @prop --focus-shadow: defaults to #{$control-focus-style}\n * @prop --inactive-color: defaults to #{$button-bg-color}\n */\n\n --background: #{$layer-bg-color};\n --active-color: var(--nano-color-base, #{nano-color(primary, base)});\n --active-text-color:\n var(\n --nano-color-contrast,\n #{nano-color(primary, contrast)}\n );\n --focus-shadow: #{$control-focus-style};\n --inactive-color: #{$button-bg-color};\n\n display: block;\n font-size: 16px;\n}\n\n:host(.nano-color) {\n --active-color: var(--nano-color-base, #{nano-color(primary, base)});\n --active-text-color: #{current-color(contrast)};\n --focus-shadow: #{$control-focus-size current-color(tint, 0.56)};\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER\n// ---------------------------------------------\n\n.duet-date *,\n.duet-date *::before,\n.duet-date *::after {\n box-sizing: border-box;\n margin: 0;\n}\n\n.duet-date {\n box-sizing: border-box;\n color: currentColor;\n display: block;\n margin: 0;\n position: relative;\n text-align: left;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ DIALOG\n// ---------------------------------------------\n\n.duet-date__dialog {\n display: flex;\n top: 100%;\n max-width: 100%;\n width: 100%;\n\n &.is-left {\n left: auto;\n right: 0;\n width: auto;\n }\n}\n\n.duet-date__dialog-content {\n background: var(--background);\n min-width: 290px;\n padding: 16px 16px 20px;\n position: relative;\n transform: none;\n max-width: 100%;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ TABLE\n// ---------------------------------------------\n\n.duet-date__table {\n border-collapse: collapse;\n border-spacing: 0;\n font-size: 1em;\n line-height: 1.25;\n text-align: center;\n width: 100%;\n}\n\n.duet-date__table-header {\n font-size: 0.75em;\n font-weight: 600;\n letter-spacing: 1px;\n line-height: 1.25;\n padding-bottom: 8px;\n text-decoration: none;\n text-transform: uppercase;\n}\n\n.duet-date__cell {\n text-align: center;\n}\n\n.duet-date__day {\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: inline-block;\n font-size: 0.875em;\n font-variant-numeric: tabular-nums;\n line-height: 1.25;\n position: relative;\n text-align: center;\n vertical-align: middle;\n z-index: 1;\n transition: 0.15s ease all;\n height: 2.5em;\n width: 2.5em;\n\n &.is-today {\n box-shadow: 0 0 0 1px var(--active-color);\n position: relative;\n }\n\n &:hover::before,\n &.is-today::before {\n content: '';\n background: var(--active-color);\n border-radius: 50%;\n bottom: 0;\n left: 0;\n opacity: 0.16;\n position: absolute;\n right: 0;\n top: 0;\n }\n\n [aria-selected='true'] & {\n background: var(--active-color);\n color: var(--active-text-color);\n box-shadow: none;\n outline: 0;\n }\n\n &:active {\n background: var(--active-color);\n box-shadow: var(--focus-shadow);\n color: var(--active-text-color);\n }\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: 0;\n }\n\n &.is-disabled {\n background: transparent;\n box-shadow: none;\n cursor: default;\n opacity: 0.5;\n\n &::before {\n display: none;\n }\n }\n\n &.is-outside {\n background: var(--inactive-color);\n box-shadow: none;\n cursor: default;\n opacity: 0.6;\n pointer-events: none;\n\n &::before {\n display: none;\n }\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ HEADER\n// ---------------------------------------------\n\n.duet-date__header {\n align-items: center;\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ NAVIGATION\n// ---------------------------------------------\n\n.duet-date__nav {\n white-space: nowrap;\n}\n\n.duet-date__prev,\n.duet-date__next {\n background: var(--inactive-color);\n -moz-appearance: none;\n -webkit-appearance: none;\n align-items: center;\n appearance: none;\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: inline-flex;\n justify-content: space-around;\n margin-left: 8px;\n padding: 0;\n transition: background-color 300ms ease;\n font-size: 0.9em;\n height: 2.2em;\n width: 2.2em;\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: 0;\n }\n\n &:active:focus {\n box-shadow: none;\n }\n\n &:disabled {\n cursor: default;\n opacity: 0.5;\n }\n\n nano-icon {\n margin: 0 auto;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ SELECT\n// ---------------------------------------------\n\n.duet-date__select {\n display: inline-flex;\n margin-top: 4px;\n position: relative;\n\n span {\n @include margin(null, 4px, null, null);\n }\n\n select {\n cursor: pointer;\n font-size: 1em;\n height: 100%;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 2;\n\n &.focus-visible:focus + .duet-date__select-label {\n box-shadow: var(--focus-shadow);\n }\n }\n}\n\n.duet-date__select-label {\n align-items: center;\n border-radius: 4px;\n display: flex;\n font-size: 1.25em;\n font-weight: 600;\n line-height: 1.25;\n padding: 0 4px 0 8px;\n pointer-events: none;\n position: relative;\n width: 100%;\n z-index: 1;\n\n nano-icon {\n font-size: 0.55em;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ VISUALLY HIDDEN\n// ---------------------------------------------\n\n.duet-date__vhidden {\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n top: 0;\n width: 1px;\n}\n","import {\n Component,\n ComponentInterface,\n Host,\n Prop,\n Element,\n h,\n Event,\n EventEmitter,\n State,\n Method,\n Watch,\n} from '@stencil/core';\nimport {\n addDays,\n startOfWeek,\n endOfWeek,\n setMonth,\n setYear,\n clamp,\n inRange,\n endOfMonth,\n startOfMonth,\n printISODate,\n parseISODate,\n createIdentifier,\n DaysOfWeek,\n} from '../../utils/date-utils';\nimport { DatePickerMonth } from './duet-date-picker/date-picker-month';\nimport defaultLocalization from './duet-date-picker/date-localization';\n\nimport {\n PickerChangeEvent,\n DuetLocalizedText,\n DateDisabledPredicate,\n Color,\n} from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport { focusVisible } from '../../utils/focus-visible';\n\nfunction range(from: number, to: number) {\n var result: number[] = [];\n for (var i = from; i <= to; i++) {\n result.push(i);\n }\n return result;\n}\n\n/**\n * A highly performant, small and accessible date-picker.\n * Customised from [Duet date-picker](https://duetds.github.io/date-picker/).\n */\n@Component({\n tag: 'nano-date-picker',\n styleUrl: 'date-picker.scss',\n shadow: true,\n})\nexport class DatePicker implements ComponentInterface {\n private monthSelectId = createIdentifier('NanoDateMonth');\n private yearSelectId = createIdentifier('NanoDateYear');\n private dialogLabelId = createIdentifier('NanoDateLabel');\n\n private firstFocusableElement: HTMLElement;\n private monthSelectNode: HTMLElement;\n private yearSelectNode: HTMLElement;\n private focusedDayNode: HTMLButtonElement;\n\n private focusTimeoutId: ReturnType<typeof setTimeout>;\n\n private initialTouchX: number = null;\n private initialTouchY: number = null;\n\n @Element() host: HTMLNanoDatePickerElement;\n\n @State() activeFocus = false;\n @State() focusedDay = new Date();\n\n // Public Property API\n\n /** Selected Date. Must be in IS0-8601 format: YYYY-MM-DD. */\n @Prop({ mutable: true }) selectedDate: string = '';\n\n /** Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the max property. */\n @Prop() min: string = '';\n\n /** Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the min property. */\n @Prop() max: string = '';\n\n /** Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc.\n * Default is Monday. */\n @Prop() firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday;\n\n /** Button labels, day names, month names, etc, used for localization.\n * Default is English. */\n @Prop() localization: DuetLocalizedText = defaultLocalization;\n\n /** The color to use from the application's color palette. */\n @Prop() color?: Color;\n\n /** Controls which days are disabled and therefore disallowed.\n * For example, this can be used to disallow selection of weekends. */\n @Prop() isDateDisabled: DateDisabledPredicate = () => false;\n\n /** Controls whether the picker is a modal or dialog,\n * popup control and will therefore keep focus within the control */\n @Prop() isModal: boolean = false;\n\n /** @internal First focusable element. Relevant for keeping focus within the control */\n @Prop() firstFocusEle: HTMLElement;\n\n // Events\n\n /** Event emitted when a date is selected. */\n @Event() nanoDatePicked: EventEmitter<PickerChangeEvent>;\n\n // Public methods API\n\n /** Focus to the calendar\n * @param day - focus to the current selected day\n * @param forceFocusVisible - force visible focus - required if opened via keyboad\n */\n @Method()\n async setFocus(day = false, forceFocusVisible = false) {\n this.setFocusedDay(parseISODate(this.selectedDate) || new Date());\n\n if (day) {\n setTimeout((_) => this.focusedDayNode.focus(), 20);\n return;\n }\n clearTimeout(this.focusTimeoutId);\n this.focusTimeoutId = setTimeout(() => {\n if (forceFocusVisible) focusVisible.force(this.monthSelectNode);\n this.monthSelectNode.focus();\n }, 20);\n }\n\n @Watch('selectedDate')\n handleSelectedDateChange() {\n this.setFocus(true);\n }\n\n // Local methods.\n\n private enableActiveFocus = () => {\n this.activeFocus = true;\n };\n\n private disableActiveFocus = () => {\n this.activeFocus = false;\n };\n\n private addDays(days: number) {\n this.setFocusedDay(addDays(this.focusedDay, days));\n }\n\n private addMonths(months: number) {\n this.setMonth(this.focusedDay.getMonth() + months);\n }\n\n private addYears(years: number) {\n this.setYear(this.focusedDay.getFullYear() + years);\n }\n\n private startOfWeek() {\n this.setFocusedDay(startOfWeek(this.focusedDay, this.firstDayOfWeek));\n }\n\n private endOfWeek() {\n this.setFocusedDay(endOfWeek(this.focusedDay, this.firstDayOfWeek));\n }\n\n private setMonth(month: number) {\n const min = setMonth(startOfMonth(this.focusedDay), month);\n const max = endOfMonth(min);\n const date = setMonth(this.focusedDay, month);\n\n this.setFocusedDay(clamp(date, min, max));\n }\n\n private setYear(year: number) {\n const min = setYear(startOfMonth(this.focusedDay), year);\n const max = endOfMonth(min);\n const date = setYear(this.focusedDay, year);\n\n this.setFocusedDay(clamp(date, min, max));\n }\n\n private setFocusedDay(day: Date) {\n this.focusedDay = clamp(\n day,\n parseISODate(this.min),\n parseISODate(this.max)\n );\n }\n\n private handleTouchStart = (event: TouchEvent) => {\n const touch = event.changedTouches[0];\n this.initialTouchX = touch.pageX;\n this.initialTouchY = touch.pageY;\n };\n\n private handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n const touch = event.changedTouches[0];\n const distX = touch.pageX - this.initialTouchX; // get horizontal dist traveled\n const distY = touch.pageY - this.initialTouchY; // get vertical dist traveled\n const threshold = 70;\n\n const isHorizontalSwipe =\n Math.abs(distX) >= threshold && Math.abs(distY) <= threshold;\n\n if (isHorizontalSwipe) {\n this.addMonths(distX < 0 ? 1 : -1);\n }\n\n this.initialTouchY = null;\n this.initialTouchX = null;\n };\n\n private handleNextMonthClick = (event: MouseEvent) => {\n event.preventDefault();\n this.addMonths(1);\n };\n\n private handlePreviousMonthClick = (event: MouseEvent) => {\n event.preventDefault();\n this.addMonths(-1);\n };\n\n private handleKeyboardNavigation = (event: KeyboardEvent) => {\n // handle tab separately, since it needs to be treated\n // differently to other keyboard interactions\n if (event.key === 'Tab' && !event.shiftKey && this.isModal) {\n event.preventDefault();\n let ele = this.firstFocusEle || this.firstFocusableElement;\n ele.focus();\n return;\n }\n\n var handled = true;\n\n switch (event.key) {\n case 'ArrowRight':\n this.addDays(1);\n break;\n case 'ArrowLeft':\n this.addDays(-1);\n break;\n case 'ArrowDown':\n this.addDays(7);\n break;\n case 'ArrowUp':\n this.addDays(-7);\n break;\n case 'PageUp':\n if (event.shiftKey) {\n this.addYears(-1);\n } else {\n this.addMonths(-1);\n }\n break;\n case 'PageDown':\n if (event.shiftKey) {\n this.addYears(1);\n } else {\n this.addMonths(1);\n }\n break;\n case 'Home':\n this.startOfWeek();\n break;\n case 'End':\n this.endOfWeek();\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n event.preventDefault();\n this.enableActiveFocus();\n }\n };\n\n private handleDaySelect = (_event: MouseEvent, day: Date) => {\n const isAllowed = !this.isDateDisabled(day);\n const isInRange = inRange(\n day,\n parseISODate(this.min),\n parseISODate(this.max)\n );\n\n if (!isInRange || !isAllowed) {\n return;\n }\n\n if (day.getMonth() === this.focusedDay.getMonth()) {\n this.setValue(day);\n } else {\n this.setFocusedDay(day);\n }\n };\n\n private handleMonthSelect = (e) => {\n this.setMonth(parseInt(e.target.value, 10));\n };\n\n private handleYearSelect = (e) => {\n this.setYear(parseInt(e.target.value, 10));\n };\n\n private setValue(date: Date) {\n this.selectedDate = printISODate(date);\n this.nanoDatePicked.emit({\n value: this.selectedDate,\n valueAsDate: date,\n });\n }\n\n private processFocusedDayNode = (element: HTMLButtonElement) => {\n this.focusedDayNode = element;\n\n if (this.activeFocus) {\n setTimeout(() => element.focus(), 0);\n }\n };\n\n connectedCallback() {\n if (this.yearSelectNode) focusVisible.observe(this.yearSelectNode);\n if (this.monthSelectNode) focusVisible.observe(this.monthSelectNode);\n }\n\n componentWillLoad() {\n this.handleSelectedDateChange();\n }\n\n componentDidLoad() {\n this.connectedCallback();\n }\n\n disconnectedCallback() {\n focusVisible.unobserve(this.yearSelectNode);\n focusVisible.unobserve(this.monthSelectNode);\n }\n\n render() {\n const valueAsDate = parseISODate(this.selectedDate);\n const selectedYear = (valueAsDate || this.focusedDay).getFullYear();\n const focusedMonth = this.focusedDay.getMonth();\n const focusedYear = this.focusedDay.getFullYear();\n\n const minDate = parseISODate(this.min);\n const maxDate = parseISODate(this.max);\n const prevMonthDisabled =\n minDate != null &&\n minDate.getMonth() === focusedMonth &&\n minDate.getFullYear() === focusedYear;\n const nextMonthDisabled =\n maxDate != null &&\n maxDate.getMonth() === focusedMonth &&\n maxDate.getFullYear() === focusedYear;\n\n let minYear = selectedYear - 10;\n let maxYear = selectedYear + 10;\n if (minDate) minYear = minDate.getFullYear();\n if (maxDate) maxYear = maxDate.getFullYear();\n\n return (\n <Host class={{ ...createColorClasses(this.color) }}>\n <div class=\"duet-date\">\n <div\n class={{\n 'duet-date__dialog': true,\n 'is-active': true,\n }}\n onTouchMove={this.handleTouchMove}\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n >\n <div class=\"duet-date__dialog-content\">\n <div\n class=\"duet-date__vhidden duet-date__instructions\"\n aria-live=\"polite\"\n >\n {this.localization.keyboardInstruction}\n </div>\n {/**\n * With onFocusIn, which is what TS types expect, Stencil ends up listening to a\n * focusIn event, which is wrong as it needs to be focusin. So we had to use onFocusin\n * here which is wrong for the TS types, but ends up with the correct event listener\n * in Stencil. See issue: https://github.com/ionic-team/stencil/issues/2628\n */}\n {/* @ts-ignore */}\n <div\n class=\"duet-date__header\"\n onFocusin={this.disableActiveFocus}\n >\n <div>\n <h2\n id={this.dialogLabelId}\n class=\"duet-date__vhidden\"\n aria-live=\"polite\"\n >\n {this.localization.monthNames[focusedMonth]}{' '}\n {this.focusedDay.getFullYear()}\n </h2>\n <label\n htmlFor={this.monthSelectId}\n class=\"duet-date__vhidden\"\n >\n {this.localization.monthSelectLabel}\n </label>\n <div class=\"duet-date__select\">\n <select\n id={this.monthSelectId}\n class=\"duet-date__select--month\"\n ref={(element) =>\n (this.firstFocusableElement = this.monthSelectNode =\n element)\n }\n onChange={this.handleMonthSelect}\n >\n {this.localization.monthNames.map((month, i) => (\n <option\n key={month}\n value={i}\n selected={i === focusedMonth}\n disabled={\n !inRange(\n new Date(focusedYear, i, 1),\n minDate ? startOfMonth(minDate) : null,\n maxDate ? endOfMonth(maxDate) : null\n )\n }\n >\n {month}\n </option>\n ))}\n </select>\n <div class=\"duet-date__select-label\" aria-hidden=\"true\">\n <span>\n {this.localization.monthNamesShort[focusedMonth]}\n </span>\n <nano-icon name=\"light/chevron-down\"></nano-icon>\n </div>\n </div>\n\n <label htmlFor={this.yearSelectId} class=\"duet-date__vhidden\">\n {this.localization.yearSelectLabel}\n </label>\n <div class=\"duet-date__select\">\n <select\n id={this.yearSelectId}\n class=\"duet-date__select--year\"\n onChange={this.handleYearSelect}\n ref={(element) => (this.yearSelectNode = element)}\n >\n {range(minYear, maxYear).map((year) => (\n <option key={year} selected={year === focusedYear}>\n {year}\n </option>\n ))}\n </select>\n <div class=\"duet-date__select-label\" aria-hidden=\"true\">\n <span>{this.focusedDay.getFullYear()}</span>\n <nano-icon name=\"light/chevron-down\"></nano-icon>\n </div>\n </div>\n </div>\n\n <div class=\"duet-date__nav\">\n <button\n class=\"duet-date__prev\"\n onClick={this.handlePreviousMonthClick}\n disabled={prevMonthDisabled}\n type=\"button\"\n >\n <nano-icon name=\"light/chevron-left\"></nano-icon>\n <span class=\"duet-date__vhidden\">\n {this.localization.prevMonthLabel}\n </span>\n </button>\n <button\n class=\"duet-date__next\"\n onClick={this.handleNextMonthClick}\n disabled={nextMonthDisabled}\n type=\"button\"\n >\n <nano-icon name=\"light/chevron-right\"></nano-icon>\n <span class=\"duet-date__vhidden\">\n {this.localization.nextMonthLabel}\n </span>\n </button>\n </div>\n </div>\n <div>\n <DatePickerMonth\n selectedDate={valueAsDate}\n focusedDate={this.focusedDay}\n onDateSelect={this.handleDaySelect}\n onKeyboardNavigation={this.handleKeyboardNavigation}\n labelledById={this.dialogLabelId}\n localization={this.localization}\n firstDayOfWeek={this.firstDayOfWeek}\n focusedDayRef={this.processFocusedDayNode}\n min={minDate}\n max={maxDate}\n isDateDisabled={this.isDateDisabled}\n />\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["src/components/date-picker/duet-date-picker/date-utils.ts","src/components/date-picker/duet-date-picker/date-picker-day.tsx","src/components/date-picker/duet-date-picker/date-picker-month.tsx","src/components/date-picker/duet-date-picker/date-localization.ts","src/components/date-picker/date-picker.scss?tag=nano-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"names":["DaysOfWeek","isEqual","a","b","getFullYear","getMonth","getDate","addDays","date","days","d","Date","setDate","startOfWeek","firstDayOfWeek","Monday","day","getDay","diff","endOfWeek","startOfMonth","endOfMonth","inRange","min","max","clamp","time","getTime","getDaysInRange","start","end","current","push","getViewOfMonth","DatePickerDay","_a","focusedDay","today","onDaySelect","onKeyboardNavigation","focusedDayRef","disabled","isSelected","isToday","isFocused","isDisabled","isOutsideRange","handleClick","e","h","class","duet-date__day","is-outside","is-disabled","is-today","tabIndex","onClick","onKeyDown","type","aria-pressed","ref","el","aria-hidden","toLocaleDateString","undefined","month","chunk","array","chunkSize","result","i","length","slice","mapWithOffset","startingOffset","mapFn","map","_","adjustedIndex","DatePickerMonth","selectedDate","focusedDate","labelledById","localization","onDateSelect","onMouseDown","onFocusIn","isDateDisabled","role","aria-labelledby","onFocusin","dayNames","dayName","scope","substr","week","aria-selected","buttonLabel","placeholder","selectedDateMessage","prevMonthLabel","nextMonthLabel","monthSelectLabel","yearSelectLabel","closeLabel","keyboardInstruction","calendarHeading","monthNames","monthNamesShort","datePickerCss","range","from","to","DatePicker","class_1","hostRef","_this","this","monthSelectId","createIdentifier","yearSelectId","dialogLabelId","initialTouchX","initialTouchY","activeFocus","defaultLocalization","isModal","enableActiveFocus","disableActiveFocus","handleTouchStart","event","touch","changedTouches","pageX","pageY","handleTouchMove","preventDefault","handleTouchEnd","distX","distY","threshold","isHorizontalSwipe","Math","abs","addMonths","handleNextMonthClick","handlePreviousMonthClick","handleKeyboardNavigation","key","shiftKey","ele","firstFocusEle","firstFocusableElement","focus","handled","addYears","handleDaySelect","_event","isAllowed","isInRange","parseISODate","setValue","setFocusedDay","handleMonthSelect","setMonth","parseInt","target","value","handleYearSelect","setYear","processFocusedDayNode","element","focusedDayNode","setTimeout","prototype","setFocus","forceFocusVisible","clearTimeout","focusTimeoutId","focusVisible","force","monthSelectNode","handleSelectedDateChange","months","years","year","printISODate","nanoDatePicked","emit","valueAsDate","connectedCallback","yearSelectNode","observe","componentWillLoad","componentDidLoad","disconnectedCallback","unobserve","render","selectedYear","focusedMonth","focusedYear","minDate","maxDate","prevMonthDisabled","nextMonthDisabled","minYear","maxYear","Host","Object","assign","createColorClasses","color","duet-date__dialog","is-active","onTouchMove","onTouchStart","onTouchEnd","aria-live","id","htmlFor","onChange","selected","name"],"mappings":";;;6dAEA,IAAYA,YAAZ,SAAYA,GACVA,EAAAA,EAAA,UAAA,GAAA,SACAA,EAAAA,EAAA,UAAA,GAAA,SACAA,EAAAA,EAAA,WAAA,GAAA,UACAA,EAAAA,EAAA,aAAA,GAAA,YACAA,EAAAA,EAAA,YAAA,GAAA,WACAA,EAAAA,EAAA,UAAA,GAAA,SACAA,EAAAA,EAAA,YAAA,GAAA,YAPF,CAAYA,aAAAA,WAAU,cA0ENC,QAAQC,EAASC,GAC/B,GAAID,GAAK,MAAQC,GAAK,KAAM,CAC1B,OAAO,MAGT,OACED,EAAEE,gBAAkBD,EAAEC,eACtBF,EAAEG,aAAeF,EAAEE,YACnBH,EAAEI,YAAcH,EAAEG,mBAINC,QAAQC,EAAYC,GAClC,IAAIC,EAAI,IAAIC,KAAKH,GACjBE,EAAEE,QAAQF,EAAEJ,UAAYG,GACxB,OAAOC,WAeOG,YACdL,EACAM,GAAA,GAAAA,SAAA,EAAA,CAAAA,EAA6Bd,WAAWe,OAExC,IAAIL,EAAI,IAAIC,KAAKH,GACjB,IAAIQ,EAAMN,EAAEO,SACZ,IAAIC,GAAQF,EAAMF,EAAiB,EAAI,GAAKE,EAAMF,EAElDJ,EAAEE,QAAQF,EAAEJ,UAAYY,GACxB,OAAOR,WAGOS,UACdX,EACAM,GAAA,GAAAA,SAAA,EAAA,CAAAA,EAA6Bd,WAAWe,OAExC,IAAIL,EAAI,IAAIC,KAAKH,GACjB,IAAIQ,EAAMN,EAAEO,SACZ,IAAIC,GAAQF,EAAMF,GAAkB,EAAI,GAAK,GAAKE,EAAMF,GAExDJ,EAAEE,QAAQF,EAAEJ,UAAYY,GACxB,OAAOR,WAGOU,aAAaZ,GAC3B,OAAO,IAAIG,KAAKH,EAAKJ,cAAeI,EAAKH,WAAY,YAGvCgB,WAAWb,GACzB,OAAO,IAAIG,KAAKH,EAAKJ,cAAeI,EAAKH,WAAa,EAAG,YAkB3CiB,QAAQd,EAAYe,EAAYC,GAC9C,OAAOC,MAAMjB,EAAMe,EAAKC,KAAShB,WAMnBiB,MAAMjB,EAAYe,EAAYC,GAC5C,IAAME,EAAOlB,EAAKmB,UAElB,GAAIJ,GAAOA,aAAeZ,MAAQe,EAAOH,EAAII,UAAW,CACtD,OAAOJ,EAGT,GAAIC,GAAOA,aAAeb,MAAQe,EAAOF,EAAIG,UAAW,CACtD,OAAOH,EAGT,OAAOhB,EAQT,SAASoB,eAAeC,EAAaC,GACnC,IAAMrB,EAAe,GACrB,IAAIsB,EAAUF,EAEd,OAAQ5B,QAAQ8B,EAASD,GAAM,CAC7BrB,EAAKuB,KAAKD,GACVA,EAAUxB,QAAQwB,EAAS,GAG7BtB,EAAKuB,KAAKD,GAEV,OAAOtB,WAQOwB,eACdzB,EACAM,GAAA,GAAAA,SAAA,EAAA,CAAAA,EAA6Bd,WAAWe,OAExC,IAAMc,EAAQhB,YAAYO,aAAaZ,GAAOM,GAC9C,IAAMgB,EAAMX,UAAUE,WAAWb,GAAOM,GAExC,OAAOc,eAAeC,EAAOC,GC9LxB,IAAMI,cAAyD,SAACC,OACrEC,EAAUD,EAAAC,WACVC,EAAKF,EAAAE,MACLrB,EAAGmB,EAAAnB,IACHsB,EAAWH,EAAAG,YACXC,EAAoBJ,EAAAI,qBACpBC,EAAaL,EAAAK,cACblB,EAAOa,EAAAb,QACPmB,EAAQN,EAAAM,SACRC,EAAUP,EAAAO,WAEV,IAAMC,EAAU1C,QAAQe,EAAKqB,GAC7B,IAAMO,EAAY3C,QAAQe,EAAKoB,GAC/B,IAAMS,EAAa7B,EAAIX,aAAe+B,EAAW/B,YAAcoC,EAC/D,IAAMK,GAAkBxB,EAExB,SAASyB,EAAYC,GACnBV,EAAYU,EAAGhC,GAGjB,OACEiC,EAAA,SAAA,CACEC,MAAO,CACLC,iBAAkB,KAClBC,aAAcN,EACdO,cAAeR,EACfS,WAAYX,GAEdY,SAAUX,EAAY,GAAK,EAC3BY,QAAST,EACTU,UAAWlB,EACXE,SAAUK,EACVY,KAAK,SAAQC,eACCjB,EAAa,OAAS,QACpCkB,IAAK,SAACC,GACJ,GAAIjB,GAAaiB,GAAMrB,EAAe,CACpCA,EAAcqB,MAIlBZ,EAAA,OAAA,CAAAa,cAAkB,QAAQ9C,EAAIV,WAC9B2C,EAAA,OAAA,CAAMC,MAAM,sBACTlC,EAAI+C,mBAAmBC,UAAW,CAAEhD,IAAK,UAAWiD,MAAO,YCnDpE,SAASC,MAASC,EAAYC,GAC5B,IAAMC,EAAS,GAEf,IAAK,IAAIC,EAAI,EAAGA,EAAIH,EAAMI,OAAQD,GAAKF,EAAW,CAChDC,EAAOrC,KAAKmC,EAAMK,MAAMF,EAAGA,EAAIF,IAGjC,OAAOC,EAGT,SAASI,cACPN,EACAO,EACAC,GAEA,OAAOR,EAAMS,KAAI,SAACC,EAAGP,GACnB,IAAMQ,GAAiBR,EAAII,GAAkBP,EAAMI,OACnD,OAAOI,EAAMR,EAAMW,OAoBhB,IAAMC,gBAA6D,SAAC5C,OACzE6C,EAAY7C,EAAA6C,aACZC,EAAW9C,EAAA8C,YACXC,EAAY/C,EAAA+C,aACZC,EAAYhD,EAAAgD,aACZrE,EAAcqB,EAAArB,eACdS,EAAGY,EAAAZ,IACHC,EAAGW,EAAAX,IACH4D,EAAYjD,EAAAiD,aACZ7C,EAAoBJ,EAAAI,qBACpBC,EAAaL,EAAAK,cACb6C,EAAWlD,EAAAkD,YACXC,EAASnD,EAAAmD,UACTC,EAAcpD,EAAAoD,eAEd,IAAMlD,EAAQ,IAAI1B,KAClB,IAAMF,EAAOwB,eAAegD,EAAanE,GAEzC,OACEmC,EAAA,QAAA,CACEC,MAAM,mBACNsC,KAAK,OAAMC,kBACMP,EAEjBQ,UAAWJ,EACXD,YAAaA,GAEbpC,EAAA,QAAA,KACEA,EAAA,KAAA,KACGwB,cAAcU,EAAaQ,SAAU7E,GAAgB,SAAC8E,GAAO,OAC5D3C,EAAA,KAAA,CAAIC,MAAM,0BAA0B2C,MAAM,OACxC5C,EAAA,OAAA,CAAAa,cAAkB,QAAQ8B,EAAQE,OAAO,EAAG,IAC5C7C,EAAA,OAAA,CAAMC,MAAM,sBAAsB0C,SAK1C3C,EAAA,QAAA,KACGiB,MAAMzD,EAAM,GAAGmE,KAAI,SAACmB,GAAI,OACvB9C,EAAA,KAAA,CAAIC,MAAM,kBACP6C,EAAKnB,KAAI,SAAC5D,GAAG,OACZiC,EAAA,KAAA,CACEC,MAAM,kBACNsC,KAAK,WAAUQ,gBACA/F,QAAQe,EAAKgE,GAAgB,OAAShB,WAErDf,EAACf,cAAa,CACZlB,IAAKA,EACLqB,MAAOA,EACPD,WAAY6C,EACZ3D,QAASA,QAAQN,EAAKO,EAAKC,GAC3Bc,YAAa8C,EACb7C,qBAAsBA,EACtBC,cAAeA,EACfC,SAAU8C,EAAevE,GACzB0B,WAAYzC,QAAQe,EAAKgE,gBClE3C,IAAMG,aAAkC,CACtCc,YAAa,cACbC,YAAa,aACbC,oBAAqB,mBACrBC,eAAgB,iBAChBC,eAAgB,aAChBC,iBAAkB,QAClBC,gBAAiB,OACjBC,WAAY,eACZC,oBAAqB,2CACrBC,gBAAiB,gBACjBf,SAAU,CACR,SACA,SACA,UACA,YACA,WACA,SACA,YAEFgB,WAAY,CACV,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEFC,gBAAiB,CACf,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QC9EJ,IAAMC,cAAgB,m2KCwCtB,SAASC,MAAMC,EAAcC,GAC3B,IAAI3C,EAAmB,GACvB,IAAK,IAAIC,EAAIyC,EAAMzC,GAAK0C,EAAI1C,IAAK,CAC/BD,EAAOrC,KAAKsC,GAEd,OAAOD,MAYI4C,WAAU,WALvB,SAAAC,EAAAC,GAAA,IAAAC,EAAAC,uFAMUA,KAAAC,cAAgBC,iBAAiB,iBACjCF,KAAAG,aAAeD,iBAAiB,gBAChCF,KAAAI,cAAgBF,iBAAiB,iBASjCF,KAAAK,cAAwB,KACxBL,KAAAM,cAAwB,KAIvBN,KAAAO,YAAc,MACdP,KAAAjF,WAAa,IAAIzB,KAKD0G,KAAArC,aAAuB,GAIxCqC,KAAA9F,IAAc,GAId8F,KAAA7F,IAAc,GAId6F,KAAAvG,eAA6Bd,aAAWe,OAIxCsG,KAAAlC,aAAkC0C,aAOlCR,KAAA9B,eAAwC,WAAM,OAAA,OAI9C8B,KAAAS,QAAmB,MAsCnBT,KAAAU,kBAAoB,WAC1BX,EAAKQ,YAAc,MAGbP,KAAAW,mBAAqB,WAC3BZ,EAAKQ,YAAc,OA+CbP,KAAAY,iBAAmB,SAACC,GAC1B,IAAMC,EAAQD,EAAME,eAAe,GACnChB,EAAKM,cAAgBS,EAAME,MAC3BjB,EAAKO,cAAgBQ,EAAMG,OAGrBjB,KAAAkB,gBAAkB,SAACL,GACzBA,EAAMM,kBAGAnB,KAAAoB,eAAiB,SAACP,GACxB,IAAMC,EAAQD,EAAME,eAAe,GACnC,IAAMM,EAAQP,EAAME,MAAQjB,EAAKM,cACjC,IAAMiB,EAAQR,EAAMG,MAAQlB,EAAKO,cACjC,IAAMiB,EAAY,GAElB,IAAMC,EACJC,KAAKC,IAAIL,IAAUE,GAAaE,KAAKC,IAAIJ,IAAUC,EAErD,GAAIC,EAAmB,CACrBzB,EAAK4B,UAAUN,EAAQ,EAAI,GAAK,GAGlCtB,EAAKO,cAAgB,KACrBP,EAAKM,cAAgB,MAGfL,KAAA4B,qBAAuB,SAACf,GAC9BA,EAAMM,iBACNpB,EAAK4B,UAAU,IAGT3B,KAAA6B,yBAA2B,SAAChB,GAClCA,EAAMM,iBACNpB,EAAK4B,WAAW,IAGV3B,KAAA8B,yBAA2B,SAACjB,GAGlC,GAAIA,EAAMkB,MAAQ,QAAUlB,EAAMmB,UAAYjC,EAAKU,QAAS,CAC1DI,EAAMM,iBACN,IAAIc,EAAMlC,EAAKmC,eAAiBnC,EAAKoC,sBACrCF,EAAIG,QACJ,OAGF,IAAIC,EAAU,KAEd,OAAQxB,EAAMkB,KACZ,IAAK,aACHhC,EAAK7G,QAAQ,GACb,MACF,IAAK,YACH6G,EAAK7G,SAAS,GACd,MACF,IAAK,YACH6G,EAAK7G,QAAQ,GACb,MACF,IAAK,UACH6G,EAAK7G,SAAS,GACd,MACF,IAAK,SACH,GAAI2H,EAAMmB,SAAU,CAClBjC,EAAKuC,UAAU,OACV,CACLvC,EAAK4B,WAAW,GAElB,MACF,IAAK,WACH,GAAId,EAAMmB,SAAU,CAClBjC,EAAKuC,SAAS,OACT,CACLvC,EAAK4B,UAAU,GAEjB,MACF,IAAK,OACH5B,EAAKvG,cACL,MACF,IAAK,MACHuG,EAAKjG,YACL,MACF,QACEuI,EAAU,MAGd,GAAIA,EAAS,CACXxB,EAAMM,iBACNpB,EAAKW,sBAIDV,KAAAuC,gBAAkB,SAACC,EAAoB7I,GAC7C,IAAM8I,GAAa1C,EAAK7B,eAAevE,GACvC,IAAM+I,EAAYzI,UAChBN,EACAgJ,aAAa5C,EAAK7F,KAClByI,aAAa5C,EAAK5F,MAGpB,IAAKuI,IAAcD,EAAW,CAC5B,OAGF,GAAI9I,EAAIX,aAAe+G,EAAKhF,WAAW/B,WAAY,CACjD+G,EAAK6C,SAASjJ,OACT,CACLoG,EAAK8C,cAAclJ,KAIfqG,KAAA8C,kBAAoB,SAACnH,GAC3BoE,EAAKgD,SAASC,SAASrH,EAAEsH,OAAOC,MAAO,MAGjClD,KAAAmD,iBAAmB,SAACxH,GAC1BoE,EAAKqD,QAAQJ,SAASrH,EAAEsH,OAAOC,MAAO,MAWhClD,KAAAqD,sBAAwB,SAACC,GAC/BvD,EAAKwD,eAAiBD,EAEtB,GAAIvD,EAAKQ,YAAa,CACpBiD,YAAW,WAAM,OAAAF,EAAQlB,UAAS,KA5MhCvC,EAAA4D,UAAAC,SAAN,SAAe/J,EAAagK,GAAb,GAAAhK,SAAA,EAAA,CAAAA,EAAA,MAAa,GAAAgK,SAAA,EAAA,CAAAA,EAAA,sGAC1B3D,KAAK6C,cAAcF,aAAa3C,KAAKrC,eAAiB,IAAIrE,MAE1D,GAAIK,EAAK,CACP6J,YAAW,SAAChG,GAAM,OAAAuC,EAAKwD,eAAenB,UAAS,IAC/C,MAAA,CAAA,GAEFwB,aAAa5D,KAAK6D,gBAClB7D,KAAK6D,eAAiBL,YAAW,WAC/B,GAAIG,EAAmBG,aAAaC,MAAMhE,EAAKiE,iBAC/CjE,EAAKiE,gBAAgB5B,UACpB,qBAILvC,EAAA4D,UAAAQ,yBAAA,WACEjE,KAAK0D,SAAS,OAaR7D,EAAA4D,UAAAvK,QAAA,SAAQE,GACd4G,KAAK6C,cAAc3J,UAAQ8G,KAAKjF,WAAY3B,KAGtCyG,EAAA4D,UAAA9B,UAAA,SAAUuC,GAChBlE,KAAK+C,SAAS/C,KAAKjF,WAAW/B,WAAakL,IAGrCrE,EAAA4D,UAAAnB,SAAA,SAAS6B,GACfnE,KAAKoD,QAAQpD,KAAKjF,WAAWhC,cAAgBoL,IAGvCtE,EAAA4D,UAAAjK,YAAA,WACNwG,KAAK6C,cAAcrJ,cAAYwG,KAAKjF,WAAYiF,KAAKvG,kBAG/CoG,EAAA4D,UAAA3J,UAAA,WACNkG,KAAK6C,cAAc/I,YAAUkG,KAAKjF,WAAYiF,KAAKvG,kBAG7CoG,EAAA4D,UAAAV,SAAA,SAASnG,GACf,IAAM1C,EAAM6I,SAAShJ,eAAaiG,KAAKjF,YAAa6B,GACpD,IAAMzC,EAAMH,aAAWE,GACvB,IAAMf,EAAO4J,SAAS/C,KAAKjF,WAAY6B,GAEvCoD,KAAK6C,cAAczI,QAAMjB,EAAMe,EAAKC,KAG9B0F,EAAA4D,UAAAL,QAAA,SAAQgB,GACd,IAAMlK,EAAMkJ,QAAQrJ,eAAaiG,KAAKjF,YAAaqJ,GACnD,IAAMjK,EAAMH,aAAWE,GACvB,IAAMf,EAAOiK,QAAQpD,KAAKjF,WAAYqJ,GAEtCpE,KAAK6C,cAAczI,QAAMjB,EAAMe,EAAKC,KAG9B0F,EAAA4D,UAAAZ,cAAA,SAAclJ,GACpBqG,KAAKjF,WAAaX,QAChBT,EACAgJ,aAAa3C,KAAK9F,KAClByI,aAAa3C,KAAK7F,OA2Hd0F,EAAA4D,UAAAb,SAAA,SAASzJ,GACf6G,KAAKrC,aAAe0G,aAAalL,GACjC6G,KAAKsE,eAAeC,KAAK,CACvBrB,MAAOlD,KAAKrC,aACZ6G,YAAarL,KAYjB0G,EAAA4D,UAAAgB,kBAAA,WACE,GAAIzE,KAAK0E,eAAgBZ,aAAaa,QAAQ3E,KAAK0E,gBACnD,GAAI1E,KAAKgE,gBAAiBF,aAAaa,QAAQ3E,KAAKgE,kBAGtDnE,EAAA4D,UAAAmB,kBAAA,WACE5E,KAAKiE,4BAGPpE,EAAA4D,UAAAoB,iBAAA,WACE7E,KAAKyE,qBAGP5E,EAAA4D,UAAAqB,qBAAA,WACEhB,aAAaiB,UAAU/E,KAAK0E,gBAC5BZ,aAAaiB,UAAU/E,KAAKgE,kBAG9BnE,EAAA4D,UAAAuB,OAAA,WAAA,IAAAjF,EAAAC,KACE,IAAMwE,EAAc7B,aAAa3C,KAAKrC,cACtC,IAAMsH,GAAgBT,GAAexE,KAAKjF,YAAYhC,cACtD,IAAMmM,EAAelF,KAAKjF,WAAW/B,WACrC,IAAMmM,EAAcnF,KAAKjF,WAAWhC,cAEpC,IAAMqM,EAAUzC,aAAa3C,KAAK9F,KAClC,IAAMmL,EAAU1C,aAAa3C,KAAK7F,KAClC,IAAMmL,EACJF,GAAW,MACXA,EAAQpM,aAAekM,GACvBE,EAAQrM,gBAAkBoM,EAC5B,IAAMI,EACJF,GAAW,MACXA,EAAQrM,aAAekM,GACvBG,EAAQtM,gBAAkBoM,EAE5B,IAAIK,EAAUP,EAAe,GAC7B,IAAIQ,EAAUR,EAAe,GAC7B,GAAIG,EAASI,EAAUJ,EAAQrM,cAC/B,GAAIsM,EAASI,EAAUJ,EAAQtM,cAE/B,OACE6C,EAAC8J,KAAI,CAAC7J,MAAK8J,OAAAC,OAAA,GAAOC,mBAAmB7F,KAAK8F,SACxClK,EAAA,MAAA,CAAKC,MAAM,aACTD,EAAA,MAAA,CACEC,MAAO,CACLkK,oBAAqB,KACrBC,YAAa,MAEfC,YAAajG,KAAKkB,gBAClBgF,aAAclG,KAAKY,iBACnBuF,WAAYnG,KAAKoB,gBAEjBxF,EAAA,MAAA,CAAKC,MAAM,6BACTD,EAAA,MAAA,CACEC,MAAM,6CAA4CuK,YACxC,UAETpG,KAAKlC,aAAasB,qBASrBxD,EAAA,MAAA,CACEC,MAAM,oBACNwC,UAAW2B,KAAKW,oBAEhB/E,EAAA,MAAA,KACEA,EAAA,KAAA,CACEyK,GAAIrG,KAAKI,cACTvE,MAAM,qBAAoBuK,YAChB,UAETpG,KAAKlC,aAAawB,WAAW4F,GAAe,IAC5ClF,KAAKjF,WAAWhC,eAEnB6C,EAAA,QAAA,CACE0K,QAAStG,KAAKC,cACdpE,MAAM,sBAELmE,KAAKlC,aAAamB,kBAErBrD,EAAA,MAAA,CAAKC,MAAM,qBACTD,EAAA,SAAA,CACEyK,GAAIrG,KAAKC,cACTpE,MAAM,2BACNU,IAAK,SAAC+G,GAAO,OACVvD,EAAKoC,sBAAwBpC,EAAKiE,gBACjCV,GAEJiD,SAAUvG,KAAK8C,mBAEd9C,KAAKlC,aAAawB,WAAW/B,KAAI,SAACX,EAAOK,GAAC,OACzCrB,EAAA,SAAA,CACEmG,IAAKnF,EACLsG,MAAOjG,EACPuJ,SAAUvJ,IAAMiI,EAChB9J,UACGnB,UACC,IAAIX,KAAK6L,EAAalI,EAAG,GACzBmI,EAAUrL,eAAaqL,GAAW,KAClCC,EAAUrL,aAAWqL,GAAW,OAInCzI,OAIPhB,EAAA,MAAA,CAAKC,MAAM,0BAAyBY,cAAa,QAC/Cb,EAAA,OAAA,KACGoE,KAAKlC,aAAayB,gBAAgB2F,IAErCtJ,EAAA,YAAA,CAAW6K,KAAK,yBAIpB7K,EAAA,QAAA,CAAO0K,QAAStG,KAAKG,aAActE,MAAM,sBACtCmE,KAAKlC,aAAaoB,iBAErBtD,EAAA,MAAA,CAAKC,MAAM,qBACTD,EAAA,SAAA,CACEyK,GAAIrG,KAAKG,aACTtE,MAAM,0BACN0K,SAAUvG,KAAKmD,iBACf5G,IAAK,SAAC+G,GAAO,OAAMvD,EAAK2E,eAAiBpB,IAExC7D,MAAM+F,EAASC,GAASlI,KAAI,SAAC6G,GAAI,OAChCxI,EAAA,SAAA,CAAQmG,IAAKqC,EAAMoC,SAAUpC,IAASe,GACnCf,OAIPxI,EAAA,MAAA,CAAKC,MAAM,0BAAyBY,cAAa,QAC/Cb,EAAA,OAAA,KAAOoE,KAAKjF,WAAWhC,eACvB6C,EAAA,YAAA,CAAW6K,KAAK,0BAKtB7K,EAAA,MAAA,CAAKC,MAAM,kBACTD,EAAA,SAAA,CACEC,MAAM,kBACNM,QAAS6D,KAAK6B,yBACdzG,SAAUkK,EACVjJ,KAAK,UAELT,EAAA,YAAA,CAAW6K,KAAK,uBAChB7K,EAAA,OAAA,CAAMC,MAAM,sBACTmE,KAAKlC,aAAaiB,iBAGvBnD,EAAA,SAAA,CACEC,MAAM,kBACNM,QAAS6D,KAAK4B,qBACdxG,SAAUmK,EACVlJ,KAAK,UAELT,EAAA,YAAA,CAAW6K,KAAK,wBAChB7K,EAAA,OAAA,CAAMC,MAAM,sBACTmE,KAAKlC,aAAakB,mBAK3BpD,EAAA,MAAA,KACEA,EAAC8B,gBAAe,CACdC,aAAc6G,EACd5G,YAAaoC,KAAKjF,WAClBgD,aAAciC,KAAKuC,gBACnBrH,qBAAsB8E,KAAK8B,yBAC3BjE,aAAcmC,KAAKI,cACnBtC,aAAckC,KAAKlC,aACnBrE,eAAgBuG,KAAKvG,eACrB0B,cAAe6E,KAAKqD,sBACpBnJ,IAAKkL,EACLjL,IAAKkL,EACLnH,eAAgB8B,KAAK9B,kSAvchB","sourcesContent":["const ISO_DATE_FORMAT = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport enum DaysOfWeek {\n Sunday = 0,\n Monday = 1,\n Tuesday = 2,\n Wednesday = 3,\n Thursday = 4,\n Friday = 5,\n Saturday = 6,\n}\n\nexport function createDate(year: string, month: string, day: string): Date {\n var dayInt = parseInt(day, 10);\n var monthInt = parseInt(month, 10);\n var yearInt = parseInt(year, 10);\n\n const isValid =\n Number.isInteger(yearInt) && // all parts should be integers\n Number.isInteger(monthInt) &&\n Number.isInteger(dayInt) &&\n monthInt > 0 && // month must be 1-12\n monthInt <= 12 &&\n dayInt > 0 && // day must be 1-31\n dayInt <= 31 &&\n yearInt > 0;\n\n if (isValid) {\n return new Date(yearInt, monthInt - 1, dayInt);\n }\n}\n\n/**\n * @param value date string in ISO format YYYY-MM-DD\n */\nexport function parseISODate(value: string): Date {\n if (!value) {\n return;\n }\n\n const matches = value.match(ISO_DATE_FORMAT);\n\n if (matches) {\n return createDate(matches[1], matches[2], matches[3]);\n }\n}\n\n/**\n * print date in format YYYY-MM-DD\n * @param date\n */\nexport function printISODate(date: Date): string {\n if (!date) {\n return '';\n }\n\n var d = date.getDate().toString(10);\n var m = (date.getMonth() + 1).toString(10);\n var y = date.getFullYear().toString(10);\n\n // days are not zero-indexed, so pad if less than 10\n if (date.getDate() < 10) {\n d = `0${d}`;\n }\n\n // months *are* zero-indexed, pad if less than 9!\n if (date.getMonth() < 9) {\n m = `0${m}`;\n }\n\n return `${y}-${m}-${d}`;\n}\n\n/**\n * Compare if two dates are equal in terms of day, month, and year\n */\nexport function isEqual(a: Date, b: Date): boolean {\n if (a == null || b == null) {\n return false;\n }\n\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function addDays(date: Date, days: number): Date {\n var d = new Date(date);\n d.setDate(d.getDate() + days);\n return d;\n}\n\nexport function addMonths(date: Date, months: number): Date {\n const d = new Date(date);\n d.setMonth(date.getMonth() + months);\n return d;\n}\n\nexport function addYears(date: Date, years: number): Date {\n const d = new Date(date);\n d.setFullYear(date.getFullYear() + years);\n return d;\n}\n\nexport function startOfWeek(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date {\n var d = new Date(date);\n var day = d.getDay();\n var diff = (day < firstDayOfWeek ? 7 : 0) + day - firstDayOfWeek;\n\n d.setDate(d.getDate() - diff);\n return d;\n}\n\nexport function endOfWeek(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date {\n var d = new Date(date);\n var day = d.getDay();\n var diff = (day < firstDayOfWeek ? -7 : 0) + 6 - (day - firstDayOfWeek);\n\n d.setDate(d.getDate() + diff);\n return d;\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\nexport function endOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\nexport function setMonth(date: Date, month: number): Date {\n const d = new Date(date);\n d.setMonth(month);\n return d;\n}\n\nexport function setYear(date: Date, year: number): Date {\n const d = new Date(date);\n d.setFullYear(year);\n return d;\n}\n\n/**\n * Check if date is within a min and max\n */\nexport function inRange(date: Date, min?: Date, max?: Date): boolean {\n return clamp(date, min, max) === date;\n}\n\n/**\n * Ensures date is within range, returns min or max if out of bounds\n */\nexport function clamp(date: Date, min?: Date, max?: Date): Date {\n const time = date.getTime();\n\n if (min && min instanceof Date && time < min.getTime()) {\n return min;\n }\n\n if (max && max instanceof Date && time > max.getTime()) {\n return max;\n }\n\n return date;\n}\n\n/**\n * given start and end date, return an (inclusive) array of all dates in between\n * @param start\n * @param end\n */\nfunction getDaysInRange(start: Date, end: Date): Date[] {\n const days: Date[] = [];\n let current = start;\n\n while (!isEqual(current, end)) {\n days.push(current);\n current = addDays(current, 1);\n }\n\n days.push(current);\n\n return days;\n}\n\n/**\n * given a date, return an array of dates from a calendar perspective\n * @param date\n * @param firstDayOfWeek\n */\nexport function getViewOfMonth(\n date: Date,\n firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday\n): Date[] {\n const start = startOfWeek(startOfMonth(date), firstDayOfWeek);\n const end = endOfWeek(endOfMonth(date), firstDayOfWeek);\n\n return getDaysInRange(start, end);\n}\n\n/**\n * Form random hash\n */\nexport function chr4() {\n return Math.random().toString(16).slice(-4);\n}\n\n/**\n * Create random identifier with a prefix\n * @param prefix\n */\nexport function createIdentifier(prefix) {\n return `${prefix}-${chr4()}${chr4()}-${chr4()}-${chr4()}-${chr4()}-${chr4()}${chr4()}${chr4()}`;\n}\n","import { h, FunctionalComponent } from '@stencil/core';\nimport { isEqual } from './date-utils';\n\nexport type DatePickerDayProps = {\n focusedDay: Date;\n today: Date;\n day: Date;\n inRange: boolean;\n disabled: boolean;\n onDaySelect: (event: MouseEvent, day: Date) => void;\n onKeyboardNavigation: (event: KeyboardEvent) => void;\n focusedDayRef?: (element: HTMLButtonElement) => void;\n isSelected;\n};\n\nexport const DatePickerDay: FunctionalComponent<DatePickerDayProps> = ({\n focusedDay,\n today,\n day,\n onDaySelect,\n onKeyboardNavigation,\n focusedDayRef,\n inRange,\n disabled,\n isSelected,\n}) => {\n const isToday = isEqual(day, today);\n const isFocused = isEqual(day, focusedDay);\n const isDisabled = day.getMonth() !== focusedDay.getMonth() || disabled;\n const isOutsideRange = !inRange;\n\n function handleClick(e) {\n onDaySelect(e, day);\n }\n\n return (\n <button\n class={{\n 'duet-date__day': true,\n 'is-outside': isOutsideRange,\n 'is-disabled': isDisabled,\n 'is-today': isToday,\n }}\n tabIndex={isFocused ? 0 : -1}\n onClick={handleClick}\n onKeyDown={onKeyboardNavigation}\n disabled={isOutsideRange}\n type=\"button\"\n aria-pressed={isSelected ? 'true' : 'false'}\n ref={(el) => {\n if (isFocused && el && focusedDayRef) {\n focusedDayRef(el);\n }\n }}\n >\n <span aria-hidden=\"true\">{day.getDate()}</span>\n <span class=\"duet-date__vhidden\">\n {day.toLocaleDateString(undefined, { day: 'numeric', month: 'long' })}\n </span>\n </button>\n );\n};\n","import { h, FunctionalComponent } from '@stencil/core';\nimport { DuetLocalizedText } from './date-localization';\nimport { DatePickerDay, DatePickerDayProps } from './date-picker-day';\nimport { getViewOfMonth, inRange, DaysOfWeek, isEqual } from './date-utils';\nimport { DateDisabledPredicate } from '../../../interface';\n\nfunction chunk<T>(array: T[], chunkSize: number): T[][] {\n const result = [];\n\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nfunction mapWithOffset<T, U>(\n array: T[],\n startingOffset: number,\n mapFn: (item: T) => U\n): U[] {\n return array.map((_, i) => {\n const adjustedIndex = (i + startingOffset) % array.length;\n return mapFn(array[adjustedIndex]);\n });\n}\n\ntype DatePickerMonthProps = {\n selectedDate: Date;\n focusedDate: Date;\n labelledById: string;\n localization: DuetLocalizedText;\n firstDayOfWeek: DaysOfWeek;\n min?: Date;\n max?: Date;\n onDateSelect: DatePickerDayProps['onDaySelect'];\n onKeyboardNavigation: DatePickerDayProps['onKeyboardNavigation'];\n focusedDayRef: (element: HTMLButtonElement) => void;\n onFocusIn?: (e: FocusEvent) => void;\n onMouseDown?: (e: MouseEvent) => void;\n isDateDisabled: DateDisabledPredicate;\n};\n\nexport const DatePickerMonth: FunctionalComponent<DatePickerMonthProps> = ({\n selectedDate,\n focusedDate,\n labelledById,\n localization,\n firstDayOfWeek,\n min,\n max,\n onDateSelect,\n onKeyboardNavigation,\n focusedDayRef,\n onMouseDown,\n onFocusIn,\n isDateDisabled,\n}) => {\n const today = new Date();\n const days = getViewOfMonth(focusedDate, firstDayOfWeek);\n\n return (\n <table\n class=\"duet-date__table\"\n role=\"grid\"\n aria-labelledby={labelledById}\n // @ts-ignore\n onFocusin={onFocusIn}\n onMouseDown={onMouseDown}\n >\n <thead>\n <tr>\n {mapWithOffset(localization.dayNames, firstDayOfWeek, (dayName) => (\n <th class=\"duet-date__table-header\" scope=\"col\">\n <span aria-hidden=\"true\">{dayName.substr(0, 2)}</span>\n <span class=\"duet-date__vhidden\">{dayName}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {chunk(days, 7).map((week) => (\n <tr class=\"duet-date__row\">\n {week.map((day) => (\n <td\n class=\"duet-date__cell\"\n role=\"gridcell\"\n aria-selected={isEqual(day, selectedDate) ? 'true' : undefined}\n >\n <DatePickerDay\n day={day}\n today={today}\n focusedDay={focusedDate}\n inRange={inRange(day, min, max)}\n onDaySelect={onDateSelect}\n onKeyboardNavigation={onKeyboardNavigation}\n focusedDayRef={focusedDayRef}\n disabled={isDateDisabled(day)}\n isSelected={isEqual(day, selectedDate)}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n};\n","type MonthsNames = [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string\n];\ntype DayNames = [string, string, string, string, string, string, string];\n\nexport type DuetLocalizedText = {\n buttonLabel: string;\n placeholder: string;\n selectedDateMessage: string;\n prevMonthLabel: string;\n nextMonthLabel: string;\n monthSelectLabel: string;\n yearSelectLabel: string;\n closeLabel: string;\n keyboardInstruction: string;\n calendarHeading: string;\n dayNames: DayNames;\n monthNames: MonthsNames;\n monthNamesShort: MonthsNames;\n};\n\nconst localization: DuetLocalizedText = {\n buttonLabel: 'Choose date',\n placeholder: 'YYYY-MM-DD',\n selectedDateMessage: 'Selected date is',\n prevMonthLabel: 'Previous month',\n nextMonthLabel: 'Next month',\n monthSelectLabel: 'Month',\n yearSelectLabel: 'Year',\n closeLabel: 'Close window',\n keyboardInstruction: 'You can use arrow keys to navigate dates',\n calendarHeading: 'Choose a date',\n dayNames: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n monthNamesShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n};\n\nexport default localization;\n","@import '../../global/style/utilities/globals';\n@import '../../global/style/nano-theme/form';\n@import '../../global/style/nano-theme/layers';\n\n:host {\n /**\n * @prop --background: defaults to #{$layer-bg-color}\n * @prop --active-color: defaults to var(--nano-color-base, #{nano-color(primary,base)})\n * @prop --active-text-color: defaults to var(--nano-color-contrast, #{nano-color(primary, contrast)})\n * @prop --focus-shadow: defaults to #{$control-focus-style}\n * @prop --inactive-color: defaults to #{$button-bg-color}\n */\n\n --background: #{$layer-bg-color};\n --active-color: var(--nano-color-base, #{nano-color(primary, base)});\n --active-text-color:\n var(\n --nano-color-contrast,\n #{nano-color(primary, contrast)}\n );\n --focus-shadow: #{$control-focus-style};\n --inactive-color: #{$button-bg-color};\n\n display: block;\n font-size: 16px;\n}\n\n:host(.nano-color) {\n --active-color: var(--nano-color-base, #{nano-color(primary, base)});\n --active-text-color: #{current-color(contrast)};\n --focus-shadow: #{$control-focus-size current-color(tint, 0.56)};\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER\n// ---------------------------------------------\n\n.duet-date *,\n.duet-date *::before,\n.duet-date *::after {\n box-sizing: border-box;\n margin: 0;\n}\n\n.duet-date {\n box-sizing: border-box;\n color: currentColor;\n display: block;\n margin: 0;\n position: relative;\n text-align: left;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ DIALOG\n// ---------------------------------------------\n\n.duet-date__dialog {\n display: flex;\n top: 100%;\n max-width: 100%;\n width: 100%;\n\n &.is-left {\n left: auto;\n right: 0;\n width: auto;\n }\n}\n\n.duet-date__dialog-content {\n background: var(--background);\n min-width: 290px;\n padding: 16px 16px 20px;\n position: relative;\n transform: none;\n max-width: 100%;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ TABLE\n// ---------------------------------------------\n\n.duet-date__table {\n border-collapse: collapse;\n border-spacing: 0;\n font-size: 1em;\n line-height: 1.25;\n text-align: center;\n width: 100%;\n}\n\n.duet-date__table-header {\n font-size: 0.75em;\n font-weight: 600;\n letter-spacing: 1px;\n line-height: 1.25;\n padding-bottom: 8px;\n text-decoration: none;\n text-transform: uppercase;\n}\n\n.duet-date__cell {\n text-align: center;\n}\n\n.duet-date__day {\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background: transparent;\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: inline-block;\n font-size: 0.875em;\n font-variant-numeric: tabular-nums;\n line-height: 1.25;\n position: relative;\n text-align: center;\n vertical-align: middle;\n z-index: 1;\n transition: 0.15s ease all;\n height: 2.5em;\n width: 2.5em;\n\n &.is-today {\n box-shadow: 0 0 0 1px var(--active-color);\n position: relative;\n }\n\n &:hover::before,\n &.is-today::before {\n content: '';\n background: var(--active-color);\n border-radius: 50%;\n bottom: 0;\n left: 0;\n opacity: 0.16;\n position: absolute;\n right: 0;\n top: 0;\n }\n\n [aria-selected='true'] & {\n background: var(--active-color) !important;\n color: var(--active-text-color);\n box-shadow: none;\n outline: 0;\n }\n\n &:active {\n background: var(--active-color);\n box-shadow: var(--focus-shadow);\n color: var(--active-text-color);\n }\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: 0;\n }\n\n &.is-disabled {\n background: transparent;\n box-shadow: none;\n cursor: default;\n opacity: 0.5;\n\n &::before {\n display: none;\n }\n }\n\n &.is-outside {\n background: var(--inactive-color);\n box-shadow: none;\n cursor: default;\n opacity: 0.6;\n pointer-events: none;\n\n &::before {\n display: none;\n }\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ HEADER\n// ---------------------------------------------\n\n.duet-date__header {\n align-items: center;\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ NAVIGATION\n// ---------------------------------------------\n\n.duet-date__nav {\n white-space: nowrap;\n}\n\n.duet-date__prev,\n.duet-date__next {\n background: var(--inactive-color);\n -moz-appearance: none;\n -webkit-appearance: none;\n align-items: center;\n appearance: none;\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n display: inline-flex;\n justify-content: space-around;\n margin-left: 8px;\n padding: 0;\n transition: background-color 300ms ease;\n font-size: 0.9em;\n height: 2.2em;\n width: 2.2em;\n\n &:focus {\n box-shadow: var(--focus-shadow);\n outline: 0;\n }\n\n &:active:focus {\n box-shadow: none;\n }\n\n &:disabled {\n cursor: default;\n opacity: 0.5;\n }\n\n nano-icon {\n margin: 0 auto;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ SELECT\n// ---------------------------------------------\n\n.duet-date__select {\n display: inline-flex;\n margin-top: 4px;\n position: relative;\n\n span {\n @include margin(null, 4px, null, null);\n }\n\n select {\n cursor: pointer;\n font-size: 1em;\n height: 100%;\n left: 0;\n opacity: 0;\n position: absolute;\n top: 0;\n width: 100%;\n z-index: 2;\n\n &.focus-visible:focus + .duet-date__select-label {\n box-shadow: var(--focus-shadow);\n }\n }\n}\n\n.duet-date__select-label {\n align-items: center;\n border-radius: 4px;\n display: flex;\n font-size: 1.25em;\n font-weight: 600;\n line-height: 1.25;\n padding: 0 4px 0 8px;\n pointer-events: none;\n position: relative;\n width: 100%;\n z-index: 1;\n\n nano-icon {\n font-size: 0.55em;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ VISUALLY HIDDEN\n// ---------------------------------------------\n\n.duet-date__vhidden {\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n top: 0;\n width: 1px;\n}\n","import {\n Component,\n ComponentInterface,\n Host,\n Prop,\n Element,\n h,\n Event,\n EventEmitter,\n State,\n Method,\n Watch,\n} from '@stencil/core';\nimport {\n addDays,\n startOfWeek,\n endOfWeek,\n setMonth,\n setYear,\n clamp,\n inRange,\n endOfMonth,\n startOfMonth,\n printISODate,\n parseISODate,\n createIdentifier,\n DaysOfWeek,\n} from '../../utils/date-utils';\nimport { DatePickerMonth } from './duet-date-picker/date-picker-month';\nimport defaultLocalization from './duet-date-picker/date-localization';\n\nimport {\n PickerChangeEvent,\n DuetLocalizedText,\n DateDisabledPredicate,\n Color,\n} from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport { focusVisible } from '../../utils/focus-visible';\n\nfunction range(from: number, to: number) {\n var result: number[] = [];\n for (var i = from; i <= to; i++) {\n result.push(i);\n }\n return result;\n}\n\n/**\n * A highly performant, small and accessible date-picker.\n * Customised from [Duet date-picker](https://duetds.github.io/date-picker/).\n */\n@Component({\n tag: 'nano-date-picker',\n styleUrl: 'date-picker.scss',\n shadow: true,\n})\nexport class DatePicker implements ComponentInterface {\n private monthSelectId = createIdentifier('NanoDateMonth');\n private yearSelectId = createIdentifier('NanoDateYear');\n private dialogLabelId = createIdentifier('NanoDateLabel');\n\n private firstFocusableElement: HTMLElement;\n private monthSelectNode: HTMLElement;\n private yearSelectNode: HTMLElement;\n private focusedDayNode: HTMLButtonElement;\n\n private focusTimeoutId: ReturnType<typeof setTimeout>;\n\n private initialTouchX: number = null;\n private initialTouchY: number = null;\n\n @Element() host: HTMLNanoDatePickerElement;\n\n @State() activeFocus = false;\n @State() focusedDay = new Date();\n\n // Public Property API\n\n /** Selected Date. Must be in IS0-8601 format: YYYY-MM-DD. */\n @Prop({ mutable: true }) selectedDate: string = '';\n\n /** Minimum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the max property. */\n @Prop() min: string = '';\n\n /** Maximum date allowed to be picked. Must be in IS0-8601 format: YYYY-MM-DD.\n * This setting can be used alone or together with the min property. */\n @Prop() max: string = '';\n\n /** Which day is considered first day of the week? `0` for Sunday, `1` for Monday, etc.\n * Default is Monday. */\n @Prop() firstDayOfWeek: DaysOfWeek = DaysOfWeek.Monday;\n\n /** Button labels, day names, month names, etc, used for localization.\n * Default is English. */\n @Prop() localization: DuetLocalizedText = defaultLocalization;\n\n /** The color to use from the application's color palette. */\n @Prop() color?: Color;\n\n /** Controls which days are disabled and therefore disallowed.\n * For example, this can be used to disallow selection of weekends. */\n @Prop() isDateDisabled: DateDisabledPredicate = () => false;\n\n /** Controls whether the picker is a modal or dialog,\n * popup control and will therefore keep focus within the control */\n @Prop() isModal: boolean = false;\n\n /** @internal First focusable element. Relevant for keeping focus within the control */\n @Prop() firstFocusEle: HTMLElement;\n\n // Events\n\n /** Event emitted when a date is selected. */\n @Event() nanoDatePicked: EventEmitter<PickerChangeEvent>;\n\n // Public methods API\n\n /** Focus to the calendar\n * @param day - focus to the current selected day\n * @param forceFocusVisible - force visible focus - required if opened via keyboad\n */\n @Method()\n async setFocus(day = false, forceFocusVisible = false) {\n this.setFocusedDay(parseISODate(this.selectedDate) || new Date());\n\n if (day) {\n setTimeout((_) => this.focusedDayNode.focus(), 20);\n return;\n }\n clearTimeout(this.focusTimeoutId);\n this.focusTimeoutId = setTimeout(() => {\n if (forceFocusVisible) focusVisible.force(this.monthSelectNode);\n this.monthSelectNode.focus();\n }, 20);\n }\n\n @Watch('selectedDate')\n handleSelectedDateChange() {\n this.setFocus(true);\n }\n\n // Local methods.\n\n private enableActiveFocus = () => {\n this.activeFocus = true;\n };\n\n private disableActiveFocus = () => {\n this.activeFocus = false;\n };\n\n private addDays(days: number) {\n this.setFocusedDay(addDays(this.focusedDay, days));\n }\n\n private addMonths(months: number) {\n this.setMonth(this.focusedDay.getMonth() + months);\n }\n\n private addYears(years: number) {\n this.setYear(this.focusedDay.getFullYear() + years);\n }\n\n private startOfWeek() {\n this.setFocusedDay(startOfWeek(this.focusedDay, this.firstDayOfWeek));\n }\n\n private endOfWeek() {\n this.setFocusedDay(endOfWeek(this.focusedDay, this.firstDayOfWeek));\n }\n\n private setMonth(month: number) {\n const min = setMonth(startOfMonth(this.focusedDay), month);\n const max = endOfMonth(min);\n const date = setMonth(this.focusedDay, month);\n\n this.setFocusedDay(clamp(date, min, max));\n }\n\n private setYear(year: number) {\n const min = setYear(startOfMonth(this.focusedDay), year);\n const max = endOfMonth(min);\n const date = setYear(this.focusedDay, year);\n\n this.setFocusedDay(clamp(date, min, max));\n }\n\n private setFocusedDay(day: Date) {\n this.focusedDay = clamp(\n day,\n parseISODate(this.min),\n parseISODate(this.max)\n );\n }\n\n private handleTouchStart = (event: TouchEvent) => {\n const touch = event.changedTouches[0];\n this.initialTouchX = touch.pageX;\n this.initialTouchY = touch.pageY;\n };\n\n private handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n };\n\n private handleTouchEnd = (event: TouchEvent) => {\n const touch = event.changedTouches[0];\n const distX = touch.pageX - this.initialTouchX; // get horizontal dist traveled\n const distY = touch.pageY - this.initialTouchY; // get vertical dist traveled\n const threshold = 70;\n\n const isHorizontalSwipe =\n Math.abs(distX) >= threshold && Math.abs(distY) <= threshold;\n\n if (isHorizontalSwipe) {\n this.addMonths(distX < 0 ? 1 : -1);\n }\n\n this.initialTouchY = null;\n this.initialTouchX = null;\n };\n\n private handleNextMonthClick = (event: MouseEvent) => {\n event.preventDefault();\n this.addMonths(1);\n };\n\n private handlePreviousMonthClick = (event: MouseEvent) => {\n event.preventDefault();\n this.addMonths(-1);\n };\n\n private handleKeyboardNavigation = (event: KeyboardEvent) => {\n // handle tab separately, since it needs to be treated\n // differently to other keyboard interactions\n if (event.key === 'Tab' && !event.shiftKey && this.isModal) {\n event.preventDefault();\n let ele = this.firstFocusEle || this.firstFocusableElement;\n ele.focus();\n return;\n }\n\n var handled = true;\n\n switch (event.key) {\n case 'ArrowRight':\n this.addDays(1);\n break;\n case 'ArrowLeft':\n this.addDays(-1);\n break;\n case 'ArrowDown':\n this.addDays(7);\n break;\n case 'ArrowUp':\n this.addDays(-7);\n break;\n case 'PageUp':\n if (event.shiftKey) {\n this.addYears(-1);\n } else {\n this.addMonths(-1);\n }\n break;\n case 'PageDown':\n if (event.shiftKey) {\n this.addYears(1);\n } else {\n this.addMonths(1);\n }\n break;\n case 'Home':\n this.startOfWeek();\n break;\n case 'End':\n this.endOfWeek();\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n event.preventDefault();\n this.enableActiveFocus();\n }\n };\n\n private handleDaySelect = (_event: MouseEvent, day: Date) => {\n const isAllowed = !this.isDateDisabled(day);\n const isInRange = inRange(\n day,\n parseISODate(this.min),\n parseISODate(this.max)\n );\n\n if (!isInRange || !isAllowed) {\n return;\n }\n\n if (day.getMonth() === this.focusedDay.getMonth()) {\n this.setValue(day);\n } else {\n this.setFocusedDay(day);\n }\n };\n\n private handleMonthSelect = (e) => {\n this.setMonth(parseInt(e.target.value, 10));\n };\n\n private handleYearSelect = (e) => {\n this.setYear(parseInt(e.target.value, 10));\n };\n\n private setValue(date: Date) {\n this.selectedDate = printISODate(date);\n this.nanoDatePicked.emit({\n value: this.selectedDate,\n valueAsDate: date,\n });\n }\n\n private processFocusedDayNode = (element: HTMLButtonElement) => {\n this.focusedDayNode = element;\n\n if (this.activeFocus) {\n setTimeout(() => element.focus(), 0);\n }\n };\n\n connectedCallback() {\n if (this.yearSelectNode) focusVisible.observe(this.yearSelectNode);\n if (this.monthSelectNode) focusVisible.observe(this.monthSelectNode);\n }\n\n componentWillLoad() {\n this.handleSelectedDateChange();\n }\n\n componentDidLoad() {\n this.connectedCallback();\n }\n\n disconnectedCallback() {\n focusVisible.unobserve(this.yearSelectNode);\n focusVisible.unobserve(this.monthSelectNode);\n }\n\n render() {\n const valueAsDate = parseISODate(this.selectedDate);\n const selectedYear = (valueAsDate || this.focusedDay).getFullYear();\n const focusedMonth = this.focusedDay.getMonth();\n const focusedYear = this.focusedDay.getFullYear();\n\n const minDate = parseISODate(this.min);\n const maxDate = parseISODate(this.max);\n const prevMonthDisabled =\n minDate != null &&\n minDate.getMonth() === focusedMonth &&\n minDate.getFullYear() === focusedYear;\n const nextMonthDisabled =\n maxDate != null &&\n maxDate.getMonth() === focusedMonth &&\n maxDate.getFullYear() === focusedYear;\n\n let minYear = selectedYear - 10;\n let maxYear = selectedYear + 10;\n if (minDate) minYear = minDate.getFullYear();\n if (maxDate) maxYear = maxDate.getFullYear();\n\n return (\n <Host class={{ ...createColorClasses(this.color) }}>\n <div class=\"duet-date\">\n <div\n class={{\n 'duet-date__dialog': true,\n 'is-active': true,\n }}\n onTouchMove={this.handleTouchMove}\n onTouchStart={this.handleTouchStart}\n onTouchEnd={this.handleTouchEnd}\n >\n <div class=\"duet-date__dialog-content\">\n <div\n class=\"duet-date__vhidden duet-date__instructions\"\n aria-live=\"polite\"\n >\n {this.localization.keyboardInstruction}\n </div>\n {/**\n * With onFocusIn, which is what TS types expect, Stencil ends up listening to a\n * focusIn event, which is wrong as it needs to be focusin. So we had to use onFocusin\n * here which is wrong for the TS types, but ends up with the correct event listener\n * in Stencil. See issue: https://github.com/ionic-team/stencil/issues/2628\n */}\n {/* @ts-ignore */}\n <div\n class=\"duet-date__header\"\n onFocusin={this.disableActiveFocus}\n >\n <div>\n <h2\n id={this.dialogLabelId}\n class=\"duet-date__vhidden\"\n aria-live=\"polite\"\n >\n {this.localization.monthNames[focusedMonth]}{' '}\n {this.focusedDay.getFullYear()}\n </h2>\n <label\n htmlFor={this.monthSelectId}\n class=\"duet-date__vhidden\"\n >\n {this.localization.monthSelectLabel}\n </label>\n <div class=\"duet-date__select\">\n <select\n id={this.monthSelectId}\n class=\"duet-date__select--month\"\n ref={(element) =>\n (this.firstFocusableElement = this.monthSelectNode =\n element)\n }\n onChange={this.handleMonthSelect}\n >\n {this.localization.monthNames.map((month, i) => (\n <option\n key={month}\n value={i}\n selected={i === focusedMonth}\n disabled={\n !inRange(\n new Date(focusedYear, i, 1),\n minDate ? startOfMonth(minDate) : null,\n maxDate ? endOfMonth(maxDate) : null\n )\n }\n >\n {month}\n </option>\n ))}\n </select>\n <div class=\"duet-date__select-label\" aria-hidden=\"true\">\n <span>\n {this.localization.monthNamesShort[focusedMonth]}\n </span>\n <nano-icon name=\"light/chevron-down\"></nano-icon>\n </div>\n </div>\n\n <label htmlFor={this.yearSelectId} class=\"duet-date__vhidden\">\n {this.localization.yearSelectLabel}\n </label>\n <div class=\"duet-date__select\">\n <select\n id={this.yearSelectId}\n class=\"duet-date__select--year\"\n onChange={this.handleYearSelect}\n ref={(element) => (this.yearSelectNode = element)}\n >\n {range(minYear, maxYear).map((year) => (\n <option key={year} selected={year === focusedYear}>\n {year}\n </option>\n ))}\n </select>\n <div class=\"duet-date__select-label\" aria-hidden=\"true\">\n <span>{this.focusedDay.getFullYear()}</span>\n <nano-icon name=\"light/chevron-down\"></nano-icon>\n </div>\n </div>\n </div>\n\n <div class=\"duet-date__nav\">\n <button\n class=\"duet-date__prev\"\n onClick={this.handlePreviousMonthClick}\n disabled={prevMonthDisabled}\n type=\"button\"\n >\n <nano-icon name=\"light/chevron-left\"></nano-icon>\n <span class=\"duet-date__vhidden\">\n {this.localization.prevMonthLabel}\n </span>\n </button>\n <button\n class=\"duet-date__next\"\n onClick={this.handleNextMonthClick}\n disabled={nextMonthDisabled}\n type=\"button\"\n >\n <nano-icon name=\"light/chevron-right\"></nano-icon>\n <span class=\"duet-date__vhidden\">\n {this.localization.nextMonthLabel}\n </span>\n </button>\n </div>\n </div>\n <div>\n <DatePickerMonth\n selectedDate={valueAsDate}\n focusedDate={this.focusedDay}\n onDateSelect={this.handleDaySelect}\n onKeyboardNavigation={this.handleKeyboardNavigation}\n labelledById={this.dialogLabelId}\n localization={this.localization}\n firstDayOfWeek={this.firstDayOfWeek}\n focusedDayRef={this.processFocusedDayNode}\n min={minDate}\n max={maxDate}\n isDateDisabled={this.isDateDisabled}\n />\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Web Components for Nanopore digital Web Apps
3
3
  */
4
- import{r as registerInstance,c as createEvent,i as readTask,f as writeTask,h,e as Host,g as getElement}from"./index-c42becad.js";import{i as index}from"./ResizeObserver.es-724af9fd.js";import{c as createColorClasses}from"./theme-1d4c8719.js";import{d as displayTransition}from"./index-bf53664b.js";var detailsCss=':host{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden]{display:none !important}:host{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;--padding:1em;--btn-padding:var(--padding);--btn-bg-color:var(--nano-color-contrast, #dad6d3);--btn-bg-color--open:var(--nano-color-base, #dad6d3);--btn-bg-color--hover:var(--nano-color-tint, #f9f9fb);--btn-text-color:var(--nano-color-base, #455556);--btn-text-color--open:var(--nano-color-contrast, var(--btn-text-color));--btn-text-color--hover:var(--nano-color-contrast, var(--btn-text-color));--content-bg-color:transparent;--content-text-color:#455556;--content-transition:height 0.2s ease-out;--border-width:none;--border-color:none;--border-style:none;--border-radius:none;--box-shadow:none;--focus-style:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));display:block;border-style:var(--border-style);border-width:var(--border-width-dims);border-color:var(--border-color);border-radius:var(--border-radius-dims);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}:host(:last-of-type){--border-width-dims:0 var(--border-width) var(--border-width);--border-radius-dims:0 0 var(--border-radius) var(--border-radius)}:host(:last-of-type) .open .content{border-radius:0 0 var(--border-radius) var(--border-radius)}:host(:first-of-type){--border-radius-dims:var(--border-radius) var(--border-radius) 0 0;--border-width-dims:var(--border-width)}:host(:first-of-type:last-of-type){--border-radius-dims:var(--border-radius);--border-width-dims:var(--border-width)}:host(:not(:last-of-type):not(:first-of-type)){--border-width-dims:0 var(--border-width) var(--border-width)}:host(.nano-color){--btn-bg-color:var(--nano-color-contrast, var(--nano-color-primary-contrast, #fff));--btn-bg-color--open:var(--nano-color-base, var(--nano-color-primary, #007495));--btn-bg-color--hover:var(--nano-color-tint, var(--nano-color-primary-tint, #2689a5));--btn-text-color:var(--nano-color-base, var(--nano-color-primary, #007495));--btn-text-color--open:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n );--btn-text-color--hover:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n )}button{left:0;top:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;position:absolute;width:100%;height:100%;border:0;background:transparent;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;padding:var(--btn-padding);text-align:inherit;position:relative;font-size:1em;margin:0;-webkit-transition:0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;transition:0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:var(--btn-bg-color);color:var(--btn-text-color);border-radius:var(--border-radius-dims)}button[dir=rtl]{left:unset;right:unset;right:0}button::-moz-focus-inner{border:0}button:focus{-webkit-box-shadow:var(--focus-style);box-shadow:var(--focus-style);outline:none;position:relative;z-index:1}:hover button{background:var(--btn-bg-color--hover);color:var(--btn-text-color--hover)}.open button{background:var(--btn-bg-color--open);color:var(--btn-text-color--open);border-bottom-right-radius:0;border-bottom-left-radius:0}button .label{width:100%;max-width:100%;max-height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;display:inline-block}button .icon{line-height:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;display:inline-block;color:currentColor;-webkit-transition:0.3s ease transform;transition:0.3s ease transform;-webkit-transform-origin:center;transform-origin:center}button .icon--start{margin-left:0;margin-right:var(--padding);margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){button .icon--start{margin-left:unset;margin-right:unset;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:var(--padding);margin-inline-end:var(--padding)}}button .icon--end{margin-left:var(--padding);margin-right:0;margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){button .icon--end{margin-left:unset;margin-right:unset;-webkit-margin-start:var(--padding);margin-inline-start:var(--padding);-webkit-margin-end:0;margin-inline-end:0}}button .icon ::slotted(nano-icon){--color:"currentColor"}.content{color:var(--content-text-color);background:var(--content-bg-color);height:0;overflow:hidden;-webkit-transition:0.2s ease border-radius;transition:0.2s ease border-radius;outline:none}.loaded .content{-webkit-transition:var(--content-transition), 0.2s ease border-radius;transition:var(--content-transition), 0.2s ease border-radius}.content>*{opacity:0;-webkit-transition:opacity 0.2s ease-out;transition:opacity 0.2s ease-out}.open .content>*{opacity:1}.content__area{padding:var(--padding)}';var Details=function(){function t(t){var o=this;registerInstance(this,t);this.nanoOpened=createEvent(this,"nanoOpened",7);this.nanoClosed=createEvent(this,"nanoClosed",7);this.slideId="nano-details-"+slideIds++;this.stateChanging=false;this.isLoading=true;this.label="";this.open=false;this.noHandle=false;this.iconRotation=90;this.onKeyDown=function(t){switch(t.key){case"Enter":case" ":o.open=!o.open;break}};this.onMouseDown=function(){if(o.stateChanging)return;o.open=!o.open}}t.prototype.toggleClick=function(){this.stateChanging=true;if(this.open)this.show();else this.hide()};t.prototype.hide=function(){var t=this;this.nanoClosed.emit(this.open);displayTransition(this.contentEl,"is-shown",false).then((function(){return t.stateChanging=false}));this.contentEl.style.height="0px"};t.prototype.show=function(){var t=this;this.nanoOpened.emit();displayTransition(this.contentEl,"is-shown",true).then((function(){t.stateChanging=false}));this.contentEl.style.height=this.contentArea.scrollHeight+"px"};t.prototype.resize=function(){var t=this;if(!this.open||!this.contentArea||!this.contentEl||this.stateChanging)return;readTask((function(){if(t.contentArea.scrollHeight>0){writeTask((function(){t.contentEl.style.height=t.contentArea.scrollHeight+"px"}))}}))};t.prototype.attachRO=function(){var t=this;if(this.ro||!this.contentArea)return;var o=this.ro=new index((function(){return t.resize()}));o.observe(this.contentArea)};t.prototype.componentWillLoad=function(){var t=this;this.hasStartSlot=!!this.el.querySelector('[slot="icon-start"]');this.hasEndSlot=!!this.el.querySelector('[slot="icon-end"]');setTimeout((function(){t.isLoading=false}),100)};t.prototype.componentDidLoad=function(){var t=this;if(this.open){setTimeout((function(){t.show()}),0)}this.attachRO()};t.prototype.connectedCallback=function(){var t=this;var o=this.mo=new MutationObserver((function(){return t.resize()}));o.observe(this.el,{childList:true,subtree:true,attributes:false});this.attachRO()};t.prototype.disconnectedCallback=function(){if(this.mo)this.mo.disconnect();if(this.ro)this.ro.disconnect()};t.prototype.render=function(){var t=this;return h(Host,{class:Object.assign({},createColorClasses(this.color))},h("div",{class:{open:this.open,loaded:!this.isLoading}},h("button",{onKeyDown:this.onKeyDown,onMouseDown:this.onMouseDown,onTouchEnd:this.onMouseDown,"aria-controls":this.slideId,"aria-expanded":this.open?"true":"false",style:{display:this.noHandle?"none":""},part:"button"},this.hasStartSlot?h("span",{part:"icon--start",class:"icon icon--start",style:{transform:this.open?"rotate("+this.iconRotation+"deg)":""}},h("slot",{name:"icon-start"})):"",h("div",{class:"label",part:"label"},this.label?this.label:h("slot",{name:"label"})),this.hasEndSlot?h("span",{part:"icon--end",class:"icon icon--end",style:{transform:this.open?"rotate("+this.iconRotation+"deg)":""}},h("slot",{name:"icon-end"})):""),h("div",{class:"content",ref:function(o){return t.contentEl=o},tabindex:"-1",id:this.slideId,part:"content"},h("div",{ref:function(o){return t.contentArea=o},class:"content__area"},h("slot",null)))))};Object.defineProperty(t.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});Object.defineProperty(t,"watchers",{get:function(){return{open:["toggleClick"]}},enumerable:false,configurable:true});return t}();var slideIds=0;Details.style=detailsCss;export{Details as nano_details};
4
+ import{r as registerInstance,c as createEvent,i as readTask,f as writeTask,h,e as Host,g as getElement}from"./index-c42becad.js";import{c as createColorClasses}from"./theme-1d4c8719.js";import{d as displayTransition}from"./index-bf53664b.js";var detailsCss=':host{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}[hidden]{display:none !important}:host{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit;--padding:1em;--btn-padding:var(--padding);--btn-bg-color:var(--nano-color-contrast, #dad6d3);--btn-bg-color--open:var(--nano-color-base, #dad6d3);--btn-bg-color--hover:var(--nano-color-tint, #f9f9fb);--btn-text-color:var(--nano-color-base, #455556);--btn-text-color--open:var(--nano-color-contrast, var(--btn-text-color));--btn-text-color--hover:var(--nano-color-contrast, var(--btn-text-color));--content-bg-color:transparent;--content-text-color:#455556;--content-transition:height 0.2s ease-out;--border-width:none;--border-color:none;--border-style:none;--border-radius:none;--box-shadow:none;--focus-style:var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));display:block;border-style:var(--border-style);border-width:var(--border-width-dims);border-color:var(--border-color);border-radius:var(--border-radius-dims);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}:host(:last-of-type){--border-width-dims:0 var(--border-width) var(--border-width);--border-radius-dims:0 0 var(--border-radius) var(--border-radius)}:host(:last-of-type) .open .content{border-radius:0 0 var(--border-radius) var(--border-radius)}:host(:first-of-type){--border-radius-dims:var(--border-radius) var(--border-radius) 0 0;--border-width-dims:var(--border-width)}:host(:first-of-type:last-of-type){--border-radius-dims:var(--border-radius);--border-width-dims:var(--border-width)}:host(:not(:last-of-type):not(:first-of-type)){--border-width-dims:0 var(--border-width) var(--border-width)}:host(.nano-color){--btn-bg-color:var(--nano-color-contrast, var(--nano-color-primary-contrast, #fff));--btn-bg-color--open:var(--nano-color-base, var(--nano-color-primary, #007495));--btn-bg-color--hover:var(--nano-color-tint, var(--nano-color-primary-tint, #2689a5));--btn-text-color:var(--nano-color-base, var(--nano-color-primary, #007495));--btn-text-color--open:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n );--btn-text-color--hover:var(\n --nano-color-contrast,\n var(--nano-color-primary-contrast, #fff)\n )}button{left:0;top:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;position:absolute;width:100%;height:100%;border:0;background:transparent;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;padding:var(--btn-padding);text-align:inherit;position:relative;font-size:1em;margin:0;-webkit-transition:0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;transition:0.3s ease background, 0.3s ease color, 0.15s ease box-shadow;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:var(--btn-bg-color);color:var(--btn-text-color);border-radius:var(--border-radius-dims)}button[dir=rtl]{left:unset;right:unset;right:0}button::-moz-focus-inner{border:0}button:focus{-webkit-box-shadow:var(--focus-style);box-shadow:var(--focus-style);outline:none;position:relative;z-index:1}:hover button{background:var(--btn-bg-color--hover);color:var(--btn-text-color--hover)}.open button{background:var(--btn-bg-color--open);color:var(--btn-text-color--open);border-bottom-right-radius:0;border-bottom-left-radius:0}button .label{width:100%;max-width:100%;max-height:100%;-webkit-box-flex:1;-ms-flex:1;flex:1;display:inline-block}button .icon{line-height:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;display:inline-block;color:currentColor;-webkit-transition:0.3s ease transform;transition:0.3s ease transform;-webkit-transform-origin:center;transform-origin:center}button .icon--start{margin-left:0;margin-right:var(--padding);margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){button .icon--start{margin-left:unset;margin-right:unset;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:var(--padding);margin-inline-end:var(--padding)}}button .icon--end{margin-left:var(--padding);margin-right:0;margin-top:0;margin-bottom:0}@supports ((-webkit-margin-start: 0) or (margin-inline-start: 0)) or (-webkit-margin-start: 0){button .icon--end{margin-left:unset;margin-right:unset;-webkit-margin-start:var(--padding);margin-inline-start:var(--padding);-webkit-margin-end:0;margin-inline-end:0}}button .icon ::slotted(nano-icon){--color:"currentColor"}.content{color:var(--content-text-color);background:var(--content-bg-color);height:0;overflow:hidden;-webkit-transition:0.2s ease border-radius;transition:0.2s ease border-radius;outline:none}.loaded .content{-webkit-transition:var(--content-transition), 0.2s ease border-radius;transition:var(--content-transition), 0.2s ease border-radius}.content>*{opacity:0;-webkit-transition:opacity 0.2s ease-out;transition:opacity 0.2s ease-out}.open .content>*{opacity:1}.content__area{padding:var(--padding)}';var Details=function(){function t(t){var o=this;registerInstance(this,t);this.nanoOpened=createEvent(this,"nanoOpened",7);this.nanoClosed=createEvent(this,"nanoClosed",7);this.slideId="nano-details-"+slideIds++;this.stateChanging=false;this.isLoading=true;this.label="";this.open=false;this.noHandle=false;this.iconRotation=90;this.onKeyDown=function(t){switch(t.key){case"Enter":case" ":o.open=!o.open;break}};this.onMouseDown=function(){if(o.stateChanging)return;o.open=!o.open}}t.prototype.toggleClick=function(){this.stateChanging=true;if(this.open)this.show();else this.hide()};t.prototype.hide=function(){var t=this;this.nanoClosed.emit(this.open);displayTransition(this.contentEl,"is-shown",false).then((function(){return t.stateChanging=false}));this.contentEl.style.height="0px"};t.prototype.show=function(){var t=this;this.nanoOpened.emit();displayTransition(this.contentEl,"is-shown",true).then((function(){t.stateChanging=false}));this.contentEl.style.height=this.contentArea.scrollHeight+"px"};t.prototype.resize=function(){var t=this;if(!this.open||!this.contentArea||!this.contentEl||this.stateChanging)return;readTask((function(){if(t.contentArea.scrollHeight>0){writeTask((function(){t.contentEl.style.height=t.contentArea.scrollHeight+"px"}))}}))};t.prototype.attachRO=function(){var t=this;if(this.ro||!this.contentArea)return;var o=this.ro=new ResizeObserver((function(){return t.resize()}));o.observe(this.contentArea)};t.prototype.componentWillLoad=function(){var t=this;this.hasStartSlot=!!this.el.querySelector('[slot="icon-start"]');this.hasEndSlot=!!this.el.querySelector('[slot="icon-end"]');setTimeout((function(){t.isLoading=false}),100)};t.prototype.componentDidLoad=function(){var t=this;if(this.open){setTimeout((function(){t.show()}),0)}this.attachRO()};t.prototype.connectedCallback=function(){var t=this;var o=this.mo=new MutationObserver((function(){return t.resize()}));o.observe(this.el,{childList:true,subtree:true,attributes:false});this.attachRO()};t.prototype.disconnectedCallback=function(){if(this.mo)this.mo.disconnect();if(this.ro)this.ro.disconnect()};t.prototype.render=function(){var t=this;return h(Host,{class:Object.assign({},createColorClasses(this.color))},h("div",{class:{open:this.open,loaded:!this.isLoading}},h("button",{onKeyDown:this.onKeyDown,onMouseDown:this.onMouseDown,onTouchEnd:this.onMouseDown,"aria-controls":this.slideId,"aria-expanded":this.open?"true":"false",style:{display:this.noHandle?"none":""},part:"button"},this.hasStartSlot?h("span",{part:"icon--start",class:"icon icon--start",style:{transform:this.open?"rotate("+this.iconRotation+"deg)":""}},h("slot",{name:"icon-start"})):"",h("div",{class:"label",part:"label"},this.label?this.label:h("slot",{name:"label"})),this.hasEndSlot?h("span",{part:"icon--end",class:"icon icon--end",style:{transform:this.open?"rotate("+this.iconRotation+"deg)":""}},h("slot",{name:"icon-end"})):""),h("div",{class:"content",ref:function(o){return t.contentEl=o},tabindex:"-1",id:this.slideId,part:"content"},h("div",{ref:function(o){return t.contentArea=o},class:"content__area"},h("slot",null)))))};Object.defineProperty(t.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});Object.defineProperty(t,"watchers",{get:function(){return{open:["toggleClick"]}},enumerable:false,configurable:true});return t}();var slideIds=0;Details.style=detailsCss;export{Details as nano_details};
5
5
  //# sourceMappingURL=nano-details.entry.js.map