@nanoporetech-digital/components 3.1.1 → 3.3.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 (461) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/cjs/dom-d7c33f11.js.map +1 -1
  3. package/dist/cjs/index-41582c2a.js +4 -4
  4. package/dist/cjs/index.cjs.js +1 -1
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/{modal-f09e431f.js → modal-e4defcc3.js} +3 -3
  7. package/dist/cjs/{modal-f09e431f.js.map → modal-e4defcc3.js.map} +1 -1
  8. package/dist/cjs/nano-alert.cjs.entry.js +3 -3
  9. package/dist/cjs/nano-alert.cjs.entry.js.map +1 -1
  10. package/dist/cjs/nano-algolia.cjs.entry.js +1 -1
  11. package/dist/cjs/nano-algolia.cjs.entry.js.map +1 -1
  12. package/dist/cjs/nano-aspect-ratio.cjs.entry.js +1 -1
  13. package/dist/cjs/nano-aspect-ratio.cjs.entry.js.map +1 -1
  14. package/dist/cjs/nano-checkbox-group.cjs.entry.js +1 -1
  15. package/dist/cjs/nano-checkbox-group.cjs.entry.js.map +1 -1
  16. package/dist/cjs/nano-checkbox.cjs.entry.js +1 -1
  17. package/dist/cjs/nano-checkbox.cjs.entry.js.map +1 -1
  18. package/dist/cjs/nano-components.cjs.js +1 -1
  19. package/dist/cjs/nano-datalist_3.cjs.entry.js +2 -2
  20. package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
  21. package/dist/cjs/nano-date-input.cjs.entry.js +1 -1
  22. package/dist/cjs/nano-date-input.cjs.entry.js.map +1 -1
  23. package/dist/cjs/nano-date-picker.cjs.entry.js +1 -1
  24. package/dist/cjs/nano-date-picker.cjs.entry.js.map +1 -1
  25. package/dist/cjs/nano-details.cjs.entry.js +1 -1
  26. package/dist/cjs/nano-details.cjs.entry.js.map +1 -1
  27. package/dist/cjs/nano-dialog.cjs.entry.js +3 -3
  28. package/dist/cjs/nano-dialog.cjs.entry.js.map +1 -1
  29. package/dist/cjs/nano-drawer.cjs.entry.js +3 -3
  30. package/dist/cjs/nano-drawer.cjs.entry.js.map +1 -1
  31. package/dist/cjs/nano-dropdown.cjs.entry.js +2 -2
  32. package/dist/cjs/nano-dropdown.cjs.entry.js.map +1 -1
  33. package/dist/cjs/nano-file-upload.cjs.entry.js +1 -1
  34. package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
  35. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js +10 -5
  36. package/dist/cjs/nano-global-nav-user-profile_3.cjs.entry.js.map +1 -1
  37. package/dist/cjs/nano-global-nav.cjs.entry.js +41 -25
  38. package/dist/cjs/nano-global-nav.cjs.entry.js.map +1 -1
  39. package/dist/cjs/nano-global-search-results.cjs.entry.js +1 -1
  40. package/dist/cjs/nano-global-search-results.cjs.entry.js.map +1 -1
  41. package/dist/cjs/nano-grid_3.cjs.entry.js +2 -2
  42. package/dist/cjs/nano-grid_3.cjs.entry.js.map +1 -1
  43. package/dist/cjs/nano-hero.cjs.entry.js +1 -1
  44. package/dist/cjs/nano-hero.cjs.entry.js.map +1 -1
  45. package/dist/cjs/nano-icon-button.cjs.entry.js +1 -1
  46. package/dist/cjs/nano-icon-button.cjs.entry.js.map +1 -1
  47. package/dist/cjs/nano-icon.cjs.entry.js +1 -1
  48. package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
  49. package/dist/cjs/nano-input.cjs.entry.js +1 -1
  50. package/dist/cjs/nano-input.cjs.entry.js.map +1 -1
  51. package/dist/cjs/nano-menu-drawer.cjs.entry.js +1 -1
  52. package/dist/cjs/nano-menu-drawer.cjs.entry.js.map +1 -1
  53. package/dist/cjs/nano-progress-bar.cjs.entry.js +2 -2
  54. package/dist/cjs/nano-progress-bar.cjs.entry.js.map +1 -1
  55. package/dist/cjs/nano-range.cjs.entry.js +1 -1
  56. package/dist/cjs/nano-range.cjs.entry.js.map +1 -1
  57. package/dist/cjs/nano-rating.cjs.entry.js +1 -1
  58. package/dist/cjs/nano-rating.cjs.entry.js.map +1 -1
  59. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +23 -12
  60. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  61. package/dist/cjs/nano-slide.cjs.entry.js +1 -1
  62. package/dist/cjs/nano-slide.cjs.entry.js.map +1 -1
  63. package/dist/cjs/nano-slides.cjs.entry.js +1 -1
  64. package/dist/cjs/nano-slides.cjs.entry.js.map +1 -1
  65. package/dist/cjs/nano-spinner.cjs.entry.js +1 -1
  66. package/dist/cjs/nano-spinner.cjs.entry.js.map +1 -1
  67. package/dist/cjs/nano-split-pane.cjs.entry.js +1 -1
  68. package/dist/cjs/nano-split-pane.cjs.entry.js.map +1 -1
  69. package/dist/cjs/nano-sticker.cjs.entry.js +1 -1
  70. package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
  71. package/dist/cjs/nano-tab-content.cjs.entry.js +1 -1
  72. package/dist/cjs/nano-tab-content.cjs.entry.js.map +1 -1
  73. package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
  74. package/dist/cjs/nano-tab-group.cjs.entry.js.map +1 -1
  75. package/dist/cjs/nano-tab.cjs.entry.js +1 -1
  76. package/dist/cjs/nano-tab.cjs.entry.js.map +1 -1
  77. package/dist/cjs/{nano-table-844394ad.js → nano-table-2ddb22be.js} +27 -26
  78. package/dist/cjs/nano-table-2ddb22be.js.map +1 -0
  79. package/dist/cjs/nano-table.cjs.entry.js +1 -1
  80. package/dist/cjs/nano-tooltip.cjs.entry.js +1 -1
  81. package/dist/cjs/nano-tooltip.cjs.entry.js.map +1 -1
  82. package/dist/cjs/{tabbable-de4c23d8.js → tabbable-bdf10c84.js} +13 -4
  83. package/dist/cjs/tabbable-bdf10c84.js.map +1 -0
  84. package/dist/cjs/{table.worker-1bc19978.js → table.worker-ec62a083.js} +2 -2
  85. package/dist/cjs/table.worker-ec62a083.js.map +1 -0
  86. package/dist/collection/components/alert/alert.css +16 -56
  87. package/dist/collection/components/algolia/algolia.css +5 -22
  88. package/dist/collection/components/aspect-ratio/aspect-ratio.css +2 -4
  89. package/dist/collection/components/checkbox/checkbox-group.css +8 -19
  90. package/dist/collection/components/checkbox/checkbox.css +24 -61
  91. package/dist/collection/components/date-input/date-input.css +8 -29
  92. package/dist/collection/components/date-picker/date-picker.css +22 -61
  93. package/dist/collection/components/details/details.css +7 -27
  94. package/dist/collection/components/dialog/dialog.css +20 -79
  95. package/dist/collection/components/drawer/drawer.css +13 -42
  96. package/dist/collection/components/dropdown/dropdown.css +5 -13
  97. package/dist/collection/components/file-upload/file-upload.css +45 -127
  98. package/dist/collection/components/global-nav/global-nav.js +40 -24
  99. package/dist/collection/components/global-nav/global-nav.js.map +1 -1
  100. package/dist/collection/components/global-nav/style/global-nav.css +147 -302
  101. package/dist/collection/components/global-search-results/global-search-results.css +81 -248
  102. package/dist/collection/components/grid/grid.css +21 -76
  103. package/dist/collection/components/hero/hero.css +22 -63
  104. package/dist/collection/components/icon/icon.css +2 -5
  105. package/dist/collection/components/icon-button/icon-button.css +4 -15
  106. package/dist/collection/components/img/img.css +9 -19
  107. package/dist/collection/components/input/input.css +34 -148
  108. package/dist/collection/components/input/input.js +2 -2
  109. package/dist/collection/components/input/input.js.map +1 -1
  110. package/dist/collection/components/menu/menu.css +1 -2
  111. package/dist/collection/components/menu-drawer/menu-drawer.css +16 -47
  112. package/dist/collection/components/nav-item/nav-item.css +73 -147
  113. package/dist/collection/components/nav-item/nav-item.js +8 -3
  114. package/dist/collection/components/nav-item/nav-item.js.map +1 -1
  115. package/dist/collection/components/option/option.css +10 -40
  116. package/dist/collection/components/progress-bar/progress-bar.css +5 -26
  117. package/dist/collection/components/progress-bar/progress-bar.js +1 -1
  118. package/dist/collection/components/progress-bar/progress-bar.js.map +1 -1
  119. package/dist/collection/components/range/range.css +20 -56
  120. package/dist/collection/components/rating/rating.css +9 -28
  121. package/dist/collection/components/resize-observe/resize-observe.js +38 -12
  122. package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
  123. package/dist/collection/components/select/select.css +56 -210
  124. package/dist/collection/components/skeleton/skeleton.css +2 -17
  125. package/dist/collection/components/slides/slide.css +4 -13
  126. package/dist/collection/components/slides/slides.css +3 -14
  127. package/dist/collection/components/spinner/spinner.css +34 -122
  128. package/dist/collection/components/split-pane/split-pane.css +4 -18
  129. package/dist/collection/components/sticker/sticker.css +8 -18
  130. package/dist/collection/components/table/table.children.js +10 -10
  131. package/dist/collection/components/table/table.children.js.map +1 -1
  132. package/dist/collection/components/table/table.css +111 -61
  133. package/dist/collection/components/table/table.js +22 -20
  134. package/dist/collection/components/table/table.js.map +1 -1
  135. package/dist/collection/components/table/table.service.js +1 -1
  136. package/dist/collection/components/table/table.service.js.map +1 -1
  137. package/dist/collection/components/tabs/tab-content.css +11 -59
  138. package/dist/collection/components/tabs/tab-group.css +20 -77
  139. package/dist/collection/components/tabs/tab.css +11 -30
  140. package/dist/collection/components/tooltip/tooltip.css +26 -56
  141. package/dist/collection/utils/dom.js.map +1 -1
  142. package/dist/collection/utils/modal.js +1 -1
  143. package/dist/collection/utils/modal.js.map +1 -1
  144. package/dist/collection/utils/tabbable.js +12 -3
  145. package/dist/collection/utils/tabbable.js.map +1 -1
  146. package/dist/components/algolia.js +1 -1
  147. package/dist/components/algolia.js.map +1 -1
  148. package/dist/components/date-picker.js +1 -1
  149. package/dist/components/date-picker.js.map +1 -1
  150. package/dist/components/dom.js.map +1 -1
  151. package/dist/components/dropdown.js +1 -1
  152. package/dist/components/dropdown.js.map +1 -1
  153. package/dist/components/grid.js +1 -1
  154. package/dist/components/grid.js.map +1 -1
  155. package/dist/components/icon-button.js +1 -1
  156. package/dist/components/icon-button.js.map +1 -1
  157. package/dist/components/icon.js +1 -1
  158. package/dist/components/icon.js.map +1 -1
  159. package/dist/components/img.js +1 -1
  160. package/dist/components/img.js.map +1 -1
  161. package/dist/components/input.js +1 -1
  162. package/dist/components/input.js.map +1 -1
  163. package/dist/components/menu.js +1 -1
  164. package/dist/components/menu.js.map +1 -1
  165. package/dist/components/modal.js +1 -1
  166. package/dist/components/modal.js.map +1 -1
  167. package/dist/components/nano-alert.js +1 -1
  168. package/dist/components/nano-alert.js.map +1 -1
  169. package/dist/components/nano-aspect-ratio.js +1 -1
  170. package/dist/components/nano-aspect-ratio.js.map +1 -1
  171. package/dist/components/nano-checkbox-group.js +1 -1
  172. package/dist/components/nano-checkbox-group.js.map +1 -1
  173. package/dist/components/nano-checkbox.js +1 -1
  174. package/dist/components/nano-checkbox.js.map +1 -1
  175. package/dist/components/nano-date-input.js +1 -1
  176. package/dist/components/nano-date-input.js.map +1 -1
  177. package/dist/components/nano-details.js +1 -1
  178. package/dist/components/nano-details.js.map +1 -1
  179. package/dist/components/nano-dialog.js +1 -1
  180. package/dist/components/nano-dialog.js.map +1 -1
  181. package/dist/components/nano-drawer.js +1 -1
  182. package/dist/components/nano-drawer.js.map +1 -1
  183. package/dist/components/nano-file-upload.js +1 -1
  184. package/dist/components/nano-file-upload.js.map +1 -1
  185. package/dist/components/nano-global-nav.js +41 -25
  186. package/dist/components/nano-global-nav.js.map +1 -1
  187. package/dist/components/nano-global-search-results.js +1 -1
  188. package/dist/components/nano-global-search-results.js.map +1 -1
  189. package/dist/components/nano-hero.js +1 -1
  190. package/dist/components/nano-hero.js.map +1 -1
  191. package/dist/components/nano-menu-drawer.js +1 -1
  192. package/dist/components/nano-menu-drawer.js.map +1 -1
  193. package/dist/components/nano-range.js +1 -1
  194. package/dist/components/nano-range.js.map +1 -1
  195. package/dist/components/nano-rating.js +1 -1
  196. package/dist/components/nano-rating.js.map +1 -1
  197. package/dist/components/nano-slide.js +1 -1
  198. package/dist/components/nano-slide.js.map +1 -1
  199. package/dist/components/nano-slides.js +1 -1
  200. package/dist/components/nano-slides.js.map +1 -1
  201. package/dist/components/nano-split-pane.js +1 -1
  202. package/dist/components/nano-split-pane.js.map +1 -1
  203. package/dist/components/nano-tab-content.js +1 -1
  204. package/dist/components/nano-tab-content.js.map +1 -1
  205. package/dist/components/nano-tab-group.js +1 -1
  206. package/dist/components/nano-tab-group.js.map +1 -1
  207. package/dist/components/nano-tab.js +1 -1
  208. package/dist/components/nano-tab.js.map +1 -1
  209. package/dist/components/nano-table.js +35 -28
  210. package/dist/components/nano-table.js.map +1 -1
  211. package/dist/components/nav-item.js +9 -4
  212. package/dist/components/nav-item.js.map +1 -1
  213. package/dist/components/option.js +1 -1
  214. package/dist/components/option.js.map +1 -1
  215. package/dist/components/progress-bar.js +2 -2
  216. package/dist/components/progress-bar.js.map +1 -1
  217. package/dist/components/resize-observe.js +23 -13
  218. package/dist/components/resize-observe.js.map +1 -1
  219. package/dist/components/select.js +1 -1
  220. package/dist/components/select.js.map +1 -1
  221. package/dist/components/skeleton.js +1 -1
  222. package/dist/components/skeleton.js.map +1 -1
  223. package/dist/components/spinner.js +1 -1
  224. package/dist/components/spinner.js.map +1 -1
  225. package/dist/components/sticker.js +1 -1
  226. package/dist/components/sticker.js.map +1 -1
  227. package/dist/components/tabbable.js +12 -3
  228. package/dist/components/tabbable.js.map +1 -1
  229. package/dist/components/tooltip.js +1 -1
  230. package/dist/components/tooltip.js.map +1 -1
  231. package/dist/custom-elements/index.js +147 -106
  232. package/dist/custom-elements/index.js.map +1 -1
  233. package/dist/esm/dom-d3ad49e2.js.map +1 -1
  234. package/dist/esm/index-3c280603.js +4 -4
  235. package/dist/esm/index.js +1 -1
  236. package/dist/esm/loader.js +1 -1
  237. package/dist/esm/{modal-215df46b.js → modal-5c9ce466.js} +3 -3
  238. package/dist/esm/{modal-215df46b.js.map → modal-5c9ce466.js.map} +1 -1
  239. package/dist/esm/nano-alert.entry.js +3 -3
  240. package/dist/esm/nano-alert.entry.js.map +1 -1
  241. package/dist/esm/nano-algolia.entry.js +1 -1
  242. package/dist/esm/nano-algolia.entry.js.map +1 -1
  243. package/dist/esm/nano-aspect-ratio.entry.js +1 -1
  244. package/dist/esm/nano-aspect-ratio.entry.js.map +1 -1
  245. package/dist/esm/nano-checkbox-group.entry.js +1 -1
  246. package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
  247. package/dist/esm/nano-checkbox.entry.js +1 -1
  248. package/dist/esm/nano-checkbox.entry.js.map +1 -1
  249. package/dist/esm/nano-components.js +1 -1
  250. package/dist/esm/nano-datalist_3.entry.js +2 -2
  251. package/dist/esm/nano-datalist_3.entry.js.map +1 -1
  252. package/dist/esm/nano-date-input.entry.js +1 -1
  253. package/dist/esm/nano-date-input.entry.js.map +1 -1
  254. package/dist/esm/nano-date-picker.entry.js +1 -1
  255. package/dist/esm/nano-date-picker.entry.js.map +1 -1
  256. package/dist/esm/nano-details.entry.js +1 -1
  257. package/dist/esm/nano-details.entry.js.map +1 -1
  258. package/dist/esm/nano-dialog.entry.js +3 -3
  259. package/dist/esm/nano-dialog.entry.js.map +1 -1
  260. package/dist/esm/nano-drawer.entry.js +3 -3
  261. package/dist/esm/nano-drawer.entry.js.map +1 -1
  262. package/dist/esm/nano-dropdown.entry.js +2 -2
  263. package/dist/esm/nano-dropdown.entry.js.map +1 -1
  264. package/dist/esm/nano-file-upload.entry.js +1 -1
  265. package/dist/esm/nano-file-upload.entry.js.map +1 -1
  266. package/dist/esm/nano-global-nav-user-profile_3.entry.js +10 -5
  267. package/dist/esm/nano-global-nav-user-profile_3.entry.js.map +1 -1
  268. package/dist/esm/nano-global-nav.entry.js +41 -25
  269. package/dist/esm/nano-global-nav.entry.js.map +1 -1
  270. package/dist/esm/nano-global-search-results.entry.js +1 -1
  271. package/dist/esm/nano-global-search-results.entry.js.map +1 -1
  272. package/dist/esm/nano-grid_3.entry.js +2 -2
  273. package/dist/esm/nano-grid_3.entry.js.map +1 -1
  274. package/dist/esm/nano-hero.entry.js +1 -1
  275. package/dist/esm/nano-hero.entry.js.map +1 -1
  276. package/dist/esm/nano-icon-button.entry.js +1 -1
  277. package/dist/esm/nano-icon-button.entry.js.map +1 -1
  278. package/dist/esm/nano-icon.entry.js +1 -1
  279. package/dist/esm/nano-icon.entry.js.map +1 -1
  280. package/dist/esm/nano-input.entry.js +1 -1
  281. package/dist/esm/nano-input.entry.js.map +1 -1
  282. package/dist/esm/nano-menu-drawer.entry.js +1 -1
  283. package/dist/esm/nano-menu-drawer.entry.js.map +1 -1
  284. package/dist/esm/nano-progress-bar.entry.js +2 -2
  285. package/dist/esm/nano-progress-bar.entry.js.map +1 -1
  286. package/dist/esm/nano-range.entry.js +1 -1
  287. package/dist/esm/nano-range.entry.js.map +1 -1
  288. package/dist/esm/nano-rating.entry.js +1 -1
  289. package/dist/esm/nano-rating.entry.js.map +1 -1
  290. package/dist/esm/nano-resize-observe_2.entry.js +23 -12
  291. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  292. package/dist/esm/nano-slide.entry.js +1 -1
  293. package/dist/esm/nano-slide.entry.js.map +1 -1
  294. package/dist/esm/nano-slides.entry.js +1 -1
  295. package/dist/esm/nano-slides.entry.js.map +1 -1
  296. package/dist/esm/nano-spinner.entry.js +1 -1
  297. package/dist/esm/nano-spinner.entry.js.map +1 -1
  298. package/dist/esm/nano-split-pane.entry.js +1 -1
  299. package/dist/esm/nano-split-pane.entry.js.map +1 -1
  300. package/dist/esm/nano-sticker.entry.js +1 -1
  301. package/dist/esm/nano-sticker.entry.js.map +1 -1
  302. package/dist/esm/nano-tab-content.entry.js +1 -1
  303. package/dist/esm/nano-tab-content.entry.js.map +1 -1
  304. package/dist/esm/nano-tab-group.entry.js +1 -1
  305. package/dist/esm/nano-tab-group.entry.js.map +1 -1
  306. package/dist/esm/nano-tab.entry.js +1 -1
  307. package/dist/esm/nano-tab.entry.js.map +1 -1
  308. package/dist/esm/{nano-table-19d19d72.js → nano-table-9d4fbd41.js} +27 -26
  309. package/dist/esm/nano-table-9d4fbd41.js.map +1 -0
  310. package/dist/esm/nano-table.entry.js +1 -1
  311. package/dist/esm/nano-tooltip.entry.js +1 -1
  312. package/dist/esm/nano-tooltip.entry.js.map +1 -1
  313. package/dist/esm/{tabbable-614f515e.js → tabbable-31485ff7.js} +13 -4
  314. package/dist/esm/tabbable-31485ff7.js.map +1 -0
  315. package/dist/esm/{table.worker-c82cecdf.js → table.worker-1ba8ac3f.js} +2 -2
  316. package/dist/esm/table.worker-1ba8ac3f.js.map +1 -0
  317. package/dist/nano-components/index.esm.js +1 -1
  318. package/dist/nano-components/nano-components.css +1 -1
  319. package/dist/nano-components/nano-components.esm.js +1 -1
  320. package/dist/nano-components/{p-35295332.entry.js → p-151aad1e.entry.js} +5 -5
  321. package/dist/nano-components/{p-35295332.entry.js.map → p-151aad1e.entry.js.map} +1 -1
  322. package/dist/nano-components/p-15543295.entry.js +5 -0
  323. package/dist/nano-components/{p-6e3412d2.entry.js.map → p-15543295.entry.js.map} +1 -1
  324. package/dist/nano-components/p-1e709f87.entry.js +5 -0
  325. package/dist/nano-components/p-1e709f87.entry.js.map +1 -0
  326. package/dist/nano-components/p-1f347342.entry.js +5 -0
  327. package/dist/nano-components/{p-02df1f62.entry.js.map → p-1f347342.entry.js.map} +1 -1
  328. package/dist/nano-components/p-216ece9a.js +5 -0
  329. package/dist/nano-components/{p-7ade1695.js.map → p-216ece9a.js.map} +0 -0
  330. package/dist/nano-components/p-23575705.entry.js +5 -0
  331. package/dist/nano-components/{p-6958df8c.entry.js.map → p-23575705.entry.js.map} +1 -1
  332. package/dist/nano-components/p-244223f0.entry.js +5 -0
  333. package/dist/nano-components/{p-6cd59e58.entry.js.map → p-244223f0.entry.js.map} +1 -1
  334. package/dist/nano-components/p-284dd9a2.entry.js +5 -0
  335. package/dist/nano-components/{p-5107646c.entry.js.map → p-284dd9a2.entry.js.map} +1 -1
  336. package/dist/nano-components/p-2cb4615b.entry.js +5 -0
  337. package/dist/nano-components/{p-e3730878.entry.js.map → p-2cb4615b.entry.js.map} +1 -1
  338. package/dist/nano-components/p-36842a50.entry.js +5 -0
  339. package/dist/nano-components/{p-f69f93e9.entry.js.map → p-36842a50.entry.js.map} +1 -1
  340. package/dist/nano-components/p-41addb3a.entry.js +5 -0
  341. package/dist/nano-components/{p-0a5ad0ef.entry.js.map → p-41addb3a.entry.js.map} +1 -1
  342. package/dist/nano-components/{p-9a385481.js → p-45abbbdd.js} +2 -2
  343. package/dist/nano-components/p-45abbbdd.js.map +1 -0
  344. package/dist/nano-components/p-46b348b7.entry.js +5 -0
  345. package/dist/nano-components/{p-28f713fb.entry.js.map → p-46b348b7.entry.js.map} +1 -1
  346. package/dist/nano-components/p-4b69178e.entry.js +5 -0
  347. package/dist/nano-components/{p-5e33798f.entry.js.map → p-4b69178e.entry.js.map} +1 -1
  348. package/dist/nano-components/p-4f0e14b5.entry.js +5 -0
  349. package/dist/nano-components/{p-8f5e0022.entry.js.map → p-4f0e14b5.entry.js.map} +1 -1
  350. package/dist/nano-components/p-559a6492.entry.js +5 -0
  351. package/dist/nano-components/p-559a6492.entry.js.map +1 -0
  352. package/dist/nano-components/p-601e18d5.entry.js +5 -0
  353. package/dist/nano-components/p-601e18d5.entry.js.map +1 -0
  354. package/dist/nano-components/p-69e5a37d.entry.js +5 -0
  355. package/dist/nano-components/{p-282987e6.entry.js.map → p-69e5a37d.entry.js.map} +1 -1
  356. package/dist/nano-components/p-751927d1.entry.js +5 -0
  357. package/dist/nano-components/{p-5d81773d.entry.js.map → p-751927d1.entry.js.map} +1 -1
  358. package/dist/nano-components/p-845ae77e.js.map +1 -1
  359. package/dist/nano-components/p-866e7e88.js +5 -0
  360. package/dist/nano-components/p-866e7e88.js.map +1 -0
  361. package/dist/nano-components/{p-b4a045a2.entry.js → p-89b8ce4f.entry.js} +2 -2
  362. package/dist/nano-components/{p-b4a045a2.entry.js.map → p-89b8ce4f.entry.js.map} +0 -0
  363. package/dist/nano-components/p-9059c8c1.entry.js +5 -0
  364. package/dist/nano-components/{p-d8e8d7e3.entry.js.map → p-9059c8c1.entry.js.map} +1 -1
  365. package/dist/nano-components/p-92504f7f.entry.js +5 -0
  366. package/dist/nano-components/{p-50fcb11c.entry.js.map → p-92504f7f.entry.js.map} +1 -1
  367. package/dist/nano-components/p-99fbae74.entry.js +5 -0
  368. package/dist/nano-components/{p-8a52a411.entry.js.map → p-99fbae74.entry.js.map} +1 -1
  369. package/dist/nano-components/p-9eeed8f5.entry.js +5 -0
  370. package/dist/nano-components/{p-4c97f05f.entry.js.map → p-9eeed8f5.entry.js.map} +1 -1
  371. package/dist/nano-components/p-a183e3c7.entry.js +5 -0
  372. package/dist/nano-components/{p-b290a970.entry.js.map → p-a183e3c7.entry.js.map} +1 -1
  373. package/dist/nano-components/p-a2e38472.entry.js +5 -0
  374. package/dist/nano-components/p-a2e38472.entry.js.map +1 -0
  375. package/dist/nano-components/p-b87539f0.entry.js +5 -0
  376. package/dist/nano-components/{p-efa8c520.entry.js.map → p-b87539f0.entry.js.map} +1 -1
  377. package/dist/nano-components/p-b9c8b99f.entry.js +5 -0
  378. package/dist/nano-components/p-b9c8b99f.entry.js.map +1 -0
  379. package/dist/nano-components/{p-cb79d1ec.js → p-c9a7c7ea.js} +2 -2
  380. package/dist/nano-components/{p-cb79d1ec.js.map → p-c9a7c7ea.js.map} +1 -1
  381. package/dist/nano-components/{p-c45851c3.entry.js → p-d1c8eca4.entry.js} +2 -2
  382. package/dist/nano-components/{p-c45851c3.entry.js.map → p-d1c8eca4.entry.js.map} +1 -1
  383. package/dist/nano-components/p-d8678bdc.entry.js +5 -0
  384. package/dist/nano-components/p-d8678bdc.entry.js.map +1 -0
  385. package/dist/nano-components/p-db4b6602.entry.js +5 -0
  386. package/dist/nano-components/{p-716064b6.entry.js.map → p-db4b6602.entry.js.map} +1 -1
  387. package/dist/nano-components/{p-916e4b6b.entry.js → p-dba8a88d.entry.js} +2 -2
  388. package/dist/nano-components/{p-916e4b6b.entry.js.map → p-dba8a88d.entry.js.map} +1 -1
  389. package/dist/nano-components/p-e4e41e06.entry.js +5 -0
  390. package/dist/nano-components/p-e4e41e06.entry.js.map +1 -0
  391. package/dist/nano-components/p-e5408bc8.entry.js +5 -0
  392. package/dist/nano-components/{p-c5bb5540.entry.js.map → p-e5408bc8.entry.js.map} +1 -1
  393. package/dist/nano-components/p-f43d1d8e.entry.js +5 -0
  394. package/dist/nano-components/p-f43d1d8e.entry.js.map +1 -0
  395. package/dist/nano-components/p-f7471cca.entry.js +5 -0
  396. package/dist/nano-components/{p-66ad1418.entry.js.map → p-f7471cca.entry.js.map} +1 -1
  397. package/dist/nano-components/p-fe94eeff.entry.js +5 -0
  398. package/dist/nano-components/{p-701e8ebf.entry.js.map → p-fe94eeff.entry.js.map} +1 -1
  399. package/dist/nano-components/p-feb9f164.entry.js +5 -0
  400. package/dist/nano-components/{p-81136f24.entry.js.map → p-feb9f164.entry.js.map} +1 -1
  401. package/dist/themes/nanopore.css +1 -1
  402. package/dist/themes/nanopore.css.map +1 -1
  403. package/dist/types/components/global-nav/global-nav.d.ts +8 -3
  404. package/dist/types/components/input/input.d.ts +2 -2
  405. package/dist/types/components/resize-observe/resize-observe.d.ts +5 -2
  406. package/dist/types/components/table/table.d.ts +8 -7
  407. package/dist/types/components.d.ts +4 -0
  408. package/dist/types/utils/dom.d.ts +1 -1
  409. package/docs-json.json +175 -9
  410. package/docs-vscode.json +2 -2
  411. package/package.json +2 -2
  412. package/dist/cjs/nano-table-844394ad.js.map +0 -1
  413. package/dist/cjs/tabbable-de4c23d8.js.map +0 -1
  414. package/dist/cjs/table.worker-1bc19978.js.map +0 -1
  415. package/dist/esm/nano-table-19d19d72.js.map +0 -1
  416. package/dist/esm/tabbable-614f515e.js.map +0 -1
  417. package/dist/esm/table.worker-c82cecdf.js.map +0 -1
  418. package/dist/nano-components/p-02df1f62.entry.js +0 -5
  419. package/dist/nano-components/p-0a5ad0ef.entry.js +0 -5
  420. package/dist/nano-components/p-1ae8c03e.entry.js +0 -5
  421. package/dist/nano-components/p-1ae8c03e.entry.js.map +0 -1
  422. package/dist/nano-components/p-282987e6.entry.js +0 -5
  423. package/dist/nano-components/p-28b43ee9.entry.js +0 -5
  424. package/dist/nano-components/p-28b43ee9.entry.js.map +0 -1
  425. package/dist/nano-components/p-28f713fb.entry.js +0 -5
  426. package/dist/nano-components/p-37553477.entry.js +0 -5
  427. package/dist/nano-components/p-37553477.entry.js.map +0 -1
  428. package/dist/nano-components/p-4c97f05f.entry.js +0 -5
  429. package/dist/nano-components/p-50fcb11c.entry.js +0 -5
  430. package/dist/nano-components/p-5107646c.entry.js +0 -5
  431. package/dist/nano-components/p-5d81773d.entry.js +0 -5
  432. package/dist/nano-components/p-5e33798f.entry.js +0 -5
  433. package/dist/nano-components/p-66ad1418.entry.js +0 -5
  434. package/dist/nano-components/p-6958df8c.entry.js +0 -5
  435. package/dist/nano-components/p-6cd59e58.entry.js +0 -5
  436. package/dist/nano-components/p-6e3412d2.entry.js +0 -5
  437. package/dist/nano-components/p-701e8ebf.entry.js +0 -5
  438. package/dist/nano-components/p-716064b6.entry.js +0 -5
  439. package/dist/nano-components/p-7ade1695.js +0 -5
  440. package/dist/nano-components/p-81136f24.entry.js +0 -5
  441. package/dist/nano-components/p-8a52a411.entry.js +0 -5
  442. package/dist/nano-components/p-8f5e0022.entry.js +0 -5
  443. package/dist/nano-components/p-9a385481.js.map +0 -1
  444. package/dist/nano-components/p-a151dea5.entry.js +0 -5
  445. package/dist/nano-components/p-a151dea5.entry.js.map +0 -1
  446. package/dist/nano-components/p-b290a970.entry.js +0 -5
  447. package/dist/nano-components/p-b7901427.entry.js +0 -5
  448. package/dist/nano-components/p-b7901427.entry.js.map +0 -1
  449. package/dist/nano-components/p-b83a8320.js +0 -5
  450. package/dist/nano-components/p-b83a8320.js.map +0 -1
  451. package/dist/nano-components/p-c5bb5540.entry.js +0 -5
  452. package/dist/nano-components/p-d8e8d7e3.entry.js +0 -5
  453. package/dist/nano-components/p-e3730878.entry.js +0 -5
  454. package/dist/nano-components/p-efa8c520.entry.js +0 -5
  455. package/dist/nano-components/p-f69f93e9.entry.js +0 -5
  456. package/dist/nano-components/p-f71f69c9.entry.js +0 -5
  457. package/dist/nano-components/p-f71f69c9.entry.js.map +0 -1
  458. package/dist/nano-components/p-f95a263c.entry.js +0 -5
  459. package/dist/nano-components/p-f95a263c.entry.js.map +0 -1
  460. package/dist/nano-components/p-fa2a6733.entry.js +0 -5
  461. package/dist/nano-components/p-fa2a6733.entry.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Web Components for Nanopore digital Web Apps
3
+ */
4
+ import{h as e,r as t,c as a,a as s,g as i}from"./p-1fe12320.js";import{i as n,g as o,b as d,p as r,D as l,d as c,s as h,e as u,f as b,h as p,j as _,k as f,l as v,a as y}from"./p-15a60f7e.js";import{f as g}from"./p-f8f89998.js";import{c as m}from"./p-7b3638b7.js";const x={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"]};const k=({focusedDay:t,today:a,day:s,onDaySelect:i,onKeyboardNavigation:o,focusedDayRef:d,inRange:r,disabled:l,isSelected:c})=>{const h=n(s,a);const u=n(s,t);const b=s.getMonth()!==t.getMonth()||l;const p=!r;function _(e){i(e,s)}return e("button",{class:{"duet-date__day":true,"is-outside":p,"is-disabled":b,"is-today":h},tabIndex:u?0:-1,onClick:_,onKeyDown:o,disabled:p,type:"button","aria-pressed":c?"true":"false",ref:e=>{if(u&&e&&d){d(e)}}},e("span",{"aria-hidden":"true"},s.getDate()),e("span",{class:"duet-date__vhidden"},s.toLocaleDateString(undefined,{day:"numeric",month:"long"})))};function w(e,t){const a=[];for(let s=0;s<e.length;s+=t){a.push(e.slice(s,s+t))}return a}function D(e,t,a){return e.map(((s,i)=>{const n=(i+t)%e.length;return a(e[n])}))}const z=({selectedDate:t,focusedDate:a,labelledById:s,localization:i,firstDayOfWeek:r,min:l,max:c,onDateSelect:h,onKeyboardNavigation:u,focusedDayRef:b,onMouseDown:p,onFocusIn:_,isDateDisabled:f})=>{const v=new Date;const y=o(a,r);return e("table",{class:"duet-date__table",role:"grid","aria-labelledby":s,onFocusin:_,onMouseDown:p},e("thead",null,e("tr",null,D(i.dayNames,r,(t=>e("th",{class:"duet-date__table-header",scope:"col"},e("span",{"aria-hidden":"true"},t.substr(0,2)),e("span",{class:"duet-date__vhidden"},t)))))),e("tbody",null,w(y,7).map((s=>e("tr",{class:"duet-date__row"},s.map((s=>e("td",{class:"duet-date__cell",role:"gridcell","aria-selected":n(s,t)?"true":undefined},e(k,{day:s,today:v,focusedDay:a,inRange:d(s,l,c),onDaySelect:h,onKeyboardNavigation:u,focusedDayRef:b,disabled:f(s),isSelected:n(s,t)})))))))))};const M=':host{box-sizing:border-box}*,*::before,*::after{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{box-sizing:border-box;margin:0}.duet-date{box-sizing:border-box;color:currentColor;display:block;margin:0;position:relative;text-align:start;inline-size:100%}.duet-date__dialog{display:flex;inset-block-start:100%;max-inline-size:100%;inline-size:100%}.duet-date__dialog.is-left{inset-inline:auto 0;inline-size:auto}.duet-date__dialog-content{background:var(--background);min-inline-size:290px;padding-block:16px 20px;padding-inline:16px;position:relative;transform:none;max-inline-size:100%;inline-size:100%}.duet-date__table{border-collapse:collapse;border-spacing:0;font-size:1em;line-height:1.25;text-align:center;inline-size:100%}.duet-date__table-header{font-size:0.75em;font-weight:600;letter-spacing:1px;line-height:1.25;padding-block-end:8px;text-decoration:none;text-transform:uppercase}.duet-date__cell{text-align:center}.duet-date__day{-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;transition:0.15s ease all;block-size:2.5em;inline-size:2.5em}.duet-date__day.is-today{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%;opacity:0.16;position:absolute;inset:0}[aria-selected=true] .duet-date__day{background:var(--active-color) !important;color:var(--active-text-color);box-shadow:none;outline:0}.duet-date__day:active{background:var(--active-color);box-shadow:var(--focus-shadow);color:var(--active-text-color)}.duet-date__day:focus{box-shadow:var(--focus-shadow);outline:0}.duet-date__day.is-disabled{background:transparent;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);box-shadow:none;cursor:default;opacity:0.6;pointer-events:none}.duet-date__day.is-outside::before{display:none}.duet-date__header{align-items:center;display:flex;justify-content:space-between;margin-block-end:16px;inline-size:100%}.duet-date__nav{white-space:nowrap}.duet-date__prev,.duet-date__next{background:var(--inactive-color);-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;border:0;border-radius:50%;cursor:pointer;display:inline-flex;justify-content:space-around;margin-inline-start:8px;padding:0;transition:background-color 300ms ease;font-size:0.9em;block-size:2.2em;inline-size:2.2em}.duet-date__prev:focus,.duet-date__next:focus{box-shadow:var(--focus-shadow);outline:0}.duet-date__prev:active:focus,.duet-date__next:active:focus{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-block:0;margin-inline:auto}.duet-date__select{display:inline-flex;margin-block-start:4px;position:relative}.duet-date__select span{margin-inline-end:4px}.duet-date__select select{cursor:pointer;font-size:1em;block-size:100%;inset-inline-start:0;opacity:0;position:absolute;inset-block-start:0;inline-size:100%;z-index:2}.duet-date__select select.focus-visible:focus+.duet-date__select-label{box-shadow:var(--focus-shadow)}.duet-date__select-label{align-items:center;border-radius:4px;display:flex;font-size:1.25em;font-weight:600;line-height:1.25;padding-block:0;padding-inline:8px 4px;pointer-events:none;position:relative;inline-size: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);block-size:1px;overflow:hidden;padding:0;position:absolute;inset-block-start:0;inline-size:1px}';function S(e,t){const a=[];for(let s=e;s<=t;s++){a.push(s)}return a}let C=0;const F=class{constructor(e){t(this,e);this.nanoDatePicked=a(this,"nanoDatePicked",7);this.dateId=`nano-datepicker-${C++}`;this.monthSelectId=this.dateId+"-"+"month";this.yearSelectId=this.dateId+"-"+"year";this.dialogLabelId=this.dateId+"-"+"dialog";this.initialTouchX=null;this.initialTouchY=null;this.enableActiveFocus=()=>{this.activeFocus=true};this.disableActiveFocus=()=>{this.activeFocus=false};this.handleTouchStart=e=>{const t=e.changedTouches[0];this.initialTouchX=t.pageX;this.initialTouchY=t.pageY};this.handleTouchMove=e=>{e.preventDefault()};this.handleTouchEnd=e=>{const t=e.changedTouches[0];const a=t.pageX-this.initialTouchX;const s=t.pageY-this.initialTouchY;const i=70;const n=Math.abs(a)>=i&&Math.abs(s)<=i;if(n){this.addMonths(a<0?1:-1)}this.initialTouchY=null;this.initialTouchX=null};this.handleNextMonthClick=e=>{e.preventDefault();this.addMonths(1)};this.handlePreviousMonthClick=e=>{e.preventDefault();this.addMonths(-1)};this.handleKeyboardNavigation=e=>{if(e.key==="Tab"&&!e.shiftKey&&this.isModal){e.preventDefault();const t=this.firstFocusEle||this.firstFocusableElement;t.focus();return}let t=true;switch(e.key){case"ArrowRight":this.addDays(1);break;case"ArrowLeft":this.addDays(-1);break;case"ArrowDown":this.addDays(7);break;case"ArrowUp":this.addDays(-7);break;case"PageUp":if(e.shiftKey){this.addYears(-1)}else{this.addMonths(-1)}break;case"PageDown":if(e.shiftKey){this.addYears(1)}else{this.addMonths(1)}break;case"Home":this.startOfWeek();break;case"End":this.endOfWeek();break;default:t=false}if(t){e.preventDefault();this.enableActiveFocus()}};this.handleDaySelect=(e,t)=>{const a=!this.isDateDisabled(t);const s=d(t,r(this.min),r(this.max));if(!s||!a){return}if(t.getMonth()===this.focusedDay.getMonth()){this.setValue(t)}else{this.setFocusedDay(t)}};this.handleMonthSelect=e=>{this.setMonth(parseInt(e.target.value,10))};this.handleYearSelect=e=>{this.setYear(parseInt(e.target.value,10))};this.processFocusedDayNode=e=>{this.focusedDayNode=e;if(this.activeFocus){setTimeout((()=>e.focus()),0)}};this.activeFocus=false;this.focusedDay=new Date;this.selectedDate="";this.min="";this.max="";this.firstDayOfWeek=l.Monday;this.localization=x;this.color=undefined;this.isDateDisabled=()=>false;this.isModal=false;this.firstFocusEle=undefined}async setFocus(e=false,t=false){this.setFocusedDay(r(this.selectedDate)||new Date);if(e){setTimeout((e=>this.focusedDayNode.focus()),20);return}clearTimeout(this.focusTimeoutId);this.focusTimeoutId=setTimeout((()=>{if(t)g.force(this.monthSelectNode);this.monthSelectNode.focus()}),20)}handleSelectedDateChange(){this.setFocus(true)}addDays(e){this.setFocusedDay(c(this.focusedDay,e))}addMonths(e){this.setMonth(this.focusedDay.getMonth()+e)}addYears(e){this.setYear(this.focusedDay.getFullYear()+e)}startOfWeek(){this.setFocusedDay(h(this.focusedDay,this.firstDayOfWeek))}endOfWeek(){this.setFocusedDay(u(this.focusedDay,this.firstDayOfWeek))}setMonth(e){const t=b(p(this.focusedDay),e);const a=_(t);const s=b(this.focusedDay,e);this.setFocusedDay(f(s,t,a))}setYear(e){const t=v(p(this.focusedDay),e);const a=_(t);const s=v(this.focusedDay,e);this.setFocusedDay(f(s,t,a))}setFocusedDay(e){this.focusedDay=f(e,r(this.min),r(this.max))}setValue(e){this.selectedDate=y(e);this.nanoDatePicked.emit({value:this.selectedDate,valueAsDate:e})}connectedCallback(){if(this.yearSelectNode)g.observe(this.yearSelectNode);if(this.monthSelectNode)g.observe(this.monthSelectNode)}componentWillLoad(){this.handleSelectedDateChange()}componentDidLoad(){this.connectedCallback()}disconnectedCallback(){g.unobserve(this.yearSelectNode);g.unobserve(this.monthSelectNode)}render(){const t=r(this.selectedDate);const a=(t||this.focusedDay).getFullYear();const i=this.focusedDay.getMonth();const n=this.focusedDay.getFullYear();const o=r(this.min);const l=r(this.max);const c=o!=null&&o.getMonth()===i&&o.getFullYear()===n;const h=l!=null&&l.getMonth()===i&&l.getFullYear()===n;let u=a-10;let b=a+10;if(o)u=o.getFullYear();if(l)b=l.getFullYear();return e(s,{class:{...m(this.color)}},e("div",{class:"duet-date"},e("div",{class:{"duet-date__dialog":true,"is-active":true},onTouchMove:this.handleTouchMove,onTouchStart:this.handleTouchStart,onTouchEnd:this.handleTouchEnd},e("div",{class:"duet-date__dialog-content"},e("div",{class:"duet-date__vhidden duet-date__instructions","aria-live":"polite"},this.localization.keyboardInstruction),e("div",{class:"duet-date__header",onFocusin:this.disableActiveFocus},e("div",null,e("h2",{id:this.dialogLabelId,class:"duet-date__vhidden","aria-live":"polite"},this.localization.monthNames[i]," ",this.focusedDay.getFullYear()),e("label",{htmlFor:this.monthSelectId,class:"duet-date__vhidden"},this.localization.monthSelectLabel),e("div",{class:"duet-date__select"},e("select",{id:this.monthSelectId,class:"duet-date__select--month",ref:e=>this.firstFocusableElement=this.monthSelectNode=e,onChange:this.handleMonthSelect},this.localization.monthNames.map(((t,a)=>e("option",{key:t,value:a,selected:a===i,disabled:!d(new Date(n,a,1),o?p(o):null,l?_(l):null)},t)))),e("div",{class:"duet-date__select-label","aria-hidden":"true"},e("span",null,this.localization.monthNamesShort[i]),e("nano-icon",{name:"light/chevron-down"}))),e("label",{htmlFor:this.yearSelectId,class:"duet-date__vhidden"},this.localization.yearSelectLabel),e("div",{class:"duet-date__select"},e("select",{id:this.yearSelectId,class:"duet-date__select--year",onChange:this.handleYearSelect,ref:e=>this.yearSelectNode=e},S(u,b).map((t=>e("option",{key:t,selected:t===n},t)))),e("div",{class:"duet-date__select-label","aria-hidden":"true"},e("span",null,this.focusedDay.getFullYear()),e("nano-icon",{name:"light/chevron-down"})))),e("div",{class:"duet-date__nav"},e("button",{class:"duet-date__prev",onClick:this.handlePreviousMonthClick,disabled:c,type:"button"},e("nano-icon",{name:"light/chevron-left"}),e("span",{class:"duet-date__vhidden"},this.localization.prevMonthLabel)),e("button",{class:"duet-date__next",onClick:this.handleNextMonthClick,disabled:h,type:"button"},e("nano-icon",{name:"light/chevron-right"}),e("span",{class:"duet-date__vhidden"},this.localization.nextMonthLabel)))),e("div",null,e(z,{selectedDate:t,focusedDate:this.focusedDay,onDateSelect:this.handleDaySelect,onKeyboardNavigation:this.handleKeyboardNavigation,labelledById:this.dialogLabelId,localization:this.localization,firstDayOfWeek:this.firstDayOfWeek,focusedDayRef:this.processFocusedDayNode,min:o,max:l,isDateDisabled:this.isDateDisabled}))))))}get host(){return i(this)}static get watchers(){return{selectedDate:["handleSelectedDateChange"]}}};F.style=M;export{F as nano_date_picker};
5
+ //# sourceMappingURL=p-46b348b7.entry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["src/components/date-picker/duet-date-picker/date-localization.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/date-picker.scss?tag=nano-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"names":["localization","buttonLabel","placeholder","selectedDateMessage","prevMonthLabel","nextMonthLabel","monthSelectLabel","yearSelectLabel","closeLabel","keyboardInstruction","calendarHeading","dayNames","monthNames","monthNamesShort","DatePickerDay","focusedDay","today","day","onDaySelect","onKeyboardNavigation","focusedDayRef","inRange","disabled","isSelected","isToday","isEqual","isFocused","isDisabled","getMonth","isOutsideRange","handleClick","e","h","class","duet-date__day","is-outside","is-disabled","is-today","tabIndex","onClick","onKeyDown","type","aria-pressed","ref","el","aria-hidden","getDate","toLocaleDateString","undefined","month","chunk","array","chunkSize","result","i","length","push","slice","mapWithOffset","startingOffset","mapFn","map","_","adjustedIndex","DatePickerMonth","selectedDate","focusedDate","labelledById","firstDayOfWeek","min","max","onDateSelect","onMouseDown","onFocusIn","isDateDisabled","Date","days","getViewOfMonth","role","aria-labelledby","onFocusin","dayName","scope","substr","week","aria-selected","datePickerCss","range","from","to","dateIds","DatePicker","this","dateId","monthSelectId","yearSelectId","dialogLabelId","initialTouchX","initialTouchY","enableActiveFocus","activeFocus","disableActiveFocus","handleTouchStart","event","touch","changedTouches","pageX","pageY","handleTouchMove","preventDefault","handleTouchEnd","distX","distY","threshold","isHorizontalSwipe","Math","abs","addMonths","handleNextMonthClick","handlePreviousMonthClick","handleKeyboardNavigation","key","shiftKey","isModal","ele","firstFocusEle","firstFocusableElement","focus","handled","addDays","addYears","startOfWeek","endOfWeek","handleDaySelect","_event","isAllowed","isInRange","parseISODate","setValue","setFocusedDay","handleMonthSelect","setMonth","parseInt","target","value","handleYearSelect","setYear","processFocusedDayNode","element","focusedDayNode","setTimeout","DaysOfWeek","Monday","defaultLocalization","[object Object]","forceFocusVisible","clearTimeout","focusTimeoutId","focusVisible","force","monthSelectNode","setFocus","months","years","getFullYear","startOfMonth","endOfMonth","date","dateClamp","year","printISODate","nanoDatePicked","emit","valueAsDate","yearSelectNode","observe","handleSelectedDateChange","connectedCallback","unobserve","selectedYear","focusedMonth","focusedYear","minDate","maxDate","prevMonthDisabled","nextMonthDisabled","minYear","maxYear","Host","createColorClasses","color","duet-date__dialog","is-active","onTouchMove","onTouchStart","onTouchEnd","aria-live","id","htmlFor","onChange","selected","name"],"mappings":"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","sourcesContent":["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 { h, FunctionalComponent } from '@stencil/core';\nimport { isEqual } from '../../../utils/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 {\n getViewOfMonth,\n inRange,\n DaysOfWeek,\n isEqual,\n} from '../../../utils/date-utils';\nimport { DatePickerDay, DatePickerDayProps } from './date-picker-day';\nimport type { DateDisabledPredicate } from '../../../interface';\nimport type { DuetLocalizedText } from './date-localization';\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","@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: start;\n inline-size: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ DIALOG\n// ---------------------------------------------\n\n.duet-date__dialog {\n display: flex;\n inset-block-start: 100%;\n max-inline-size: 100%;\n inline-size: 100%;\n\n &.is-left {\n inset-inline: auto 0;\n inline-size: auto;\n }\n}\n\n.duet-date__dialog-content {\n background: var(--background);\n min-inline-size: 290px;\n padding-block: 16px 20px;\n padding-inline: 16px;\n position: relative;\n transform: none;\n max-inline-size: 100%;\n inline-size: 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 inline-size: 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-block-end: 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 block-size: 2.5em;\n inline-size: 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 opacity: 0.16;\n position: absolute;\n inset: 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-block-end: 16px;\n inline-size: 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-inline-start: 8px;\n padding: 0;\n transition: background-color 300ms ease;\n font-size: 0.9em;\n block-size: 2.2em;\n inline-size: 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-block: 0;\n margin-inline: auto;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ SELECT\n// ---------------------------------------------\n\n.duet-date__select {\n display: inline-flex;\n margin-block-start: 4px;\n position: relative;\n\n span {\n margin-inline-end: 4px;\n }\n\n select {\n cursor: pointer;\n font-size: 1em;\n block-size: 100%;\n inset-inline-start: 0;\n opacity: 0;\n position: absolute;\n inset-block-start: 0;\n inline-size: 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-block: 0;\n padding-inline: 8px 4px;\n pointer-events: none;\n position: relative;\n inline-size: 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 block-size: 1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n inset-block-start: 0;\n inline-size: 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 dateClamp,\n inRange,\n endOfMonth,\n startOfMonth,\n printISODate,\n parseISODate,\n DaysOfWeek,\n} from '../../utils/date-utils';\n\nimport { focusVisible } from '../../utils/focus-visible';\nimport { createColorClasses } from '../../utils/theme';\nimport defaultLocalization from './duet-date-picker/date-localization';\nimport { DatePickerMonth } from './duet-date-picker/date-picker-month';\nimport type {\n PickerChangeEvent,\n DuetLocalizedText,\n DateDisabledPredicate,\n Color,\n} from '../../interface';\n\nfunction range(from: number, to: number) {\n const result: number[] = [];\n for (let i = from; i <= to; i++) {\n result.push(i);\n }\n return result;\n}\n\nlet dateIds = 0;\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 dateId = `nano-datepicker-${dateIds++}`;\n private monthSelectId = this.dateId + '-' + 'month';\n private yearSelectId = this.dateId + '-' + 'year';\n private dialogLabelId = this.dateId + '-' + 'dialog';\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 /**\n * Controls which days are disabled and therefore disallowed.\n * For example, this can be used to disallow selection of weekends.\n * @returns `false` for not disabled and `true` for disabled\n */\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(dateClamp(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(dateClamp(date, min, max));\n }\n\n private setFocusedDay(day: Date) {\n this.focusedDay = dateClamp(\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 const ele = this.firstFocusEle || this.firstFocusableElement;\n ele.focus();\n return;\n }\n\n let 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-localization.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/date-picker.scss?tag=nano-date-picker&encapsulation=shadow","src/components/date-picker/date-picker.tsx"],"names":["localization","buttonLabel","placeholder","selectedDateMessage","prevMonthLabel","nextMonthLabel","monthSelectLabel","yearSelectLabel","closeLabel","keyboardInstruction","calendarHeading","dayNames","monthNames","monthNamesShort","DatePickerDay","focusedDay","today","day","onDaySelect","onKeyboardNavigation","focusedDayRef","inRange","disabled","isSelected","isToday","isEqual","isFocused","isDisabled","getMonth","isOutsideRange","handleClick","e","h","class","duet-date__day","is-outside","is-disabled","is-today","tabIndex","onClick","onKeyDown","type","aria-pressed","ref","el","aria-hidden","getDate","toLocaleDateString","undefined","month","chunk","array","chunkSize","result","i","length","push","slice","mapWithOffset","startingOffset","mapFn","map","_","adjustedIndex","DatePickerMonth","selectedDate","focusedDate","labelledById","firstDayOfWeek","min","max","onDateSelect","onMouseDown","onFocusIn","isDateDisabled","Date","days","getViewOfMonth","role","aria-labelledby","onFocusin","dayName","scope","substr","week","aria-selected","datePickerCss","range","from","to","dateIds","DatePicker","this","dateId","monthSelectId","yearSelectId","dialogLabelId","initialTouchX","initialTouchY","enableActiveFocus","activeFocus","disableActiveFocus","handleTouchStart","event","touch","changedTouches","pageX","pageY","handleTouchMove","preventDefault","handleTouchEnd","distX","distY","threshold","isHorizontalSwipe","Math","abs","addMonths","handleNextMonthClick","handlePreviousMonthClick","handleKeyboardNavigation","key","shiftKey","isModal","ele","firstFocusEle","firstFocusableElement","focus","handled","addDays","addYears","startOfWeek","endOfWeek","handleDaySelect","_event","isAllowed","isInRange","parseISODate","setValue","setFocusedDay","handleMonthSelect","setMonth","parseInt","target","value","handleYearSelect","setYear","processFocusedDayNode","element","focusedDayNode","setTimeout","DaysOfWeek","Monday","defaultLocalization","[object Object]","forceFocusVisible","clearTimeout","focusTimeoutId","focusVisible","force","monthSelectNode","setFocus","months","years","getFullYear","startOfMonth","endOfMonth","date","dateClamp","year","printISODate","nanoDatePicked","emit","valueAsDate","yearSelectNode","observe","handleSelectedDateChange","connectedCallback","unobserve","selectedYear","focusedMonth","focusedYear","minDate","maxDate","prevMonthDisabled","nextMonthDisabled","minYear","maxYear","Host","createColorClasses","color","duet-date__dialog","is-active","onTouchMove","onTouchStart","onTouchEnd","aria-live","id","htmlFor","onChange","selected","name"],"mappings":"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","sourcesContent":["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 { h, FunctionalComponent } from '@stencil/core';\nimport { isEqual } from '../../../utils/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 {\n getViewOfMonth,\n inRange,\n DaysOfWeek,\n isEqual,\n} from '../../../utils/date-utils';\nimport { DatePickerDay, DatePickerDayProps } from './date-picker-day';\nimport type { DateDisabledPredicate } from '../../../interface';\nimport type { DuetLocalizedText } from './date-localization';\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","@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: start;\n inline-size: 100%;\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ DIALOG\n// ---------------------------------------------\n\n.duet-date__dialog {\n display: flex;\n inset-block-start: 100%;\n max-inline-size: 100%;\n inline-size: 100%;\n\n &.is-left {\n inset-inline: auto 0;\n inline-size: auto;\n }\n}\n\n.duet-date__dialog-content {\n background: var(--background);\n min-inline-size: 290px;\n padding-block: 16px 20px;\n padding-inline: 16px;\n position: relative;\n transform: none;\n max-inline-size: 100%;\n inline-size: 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 inline-size: 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-block-end: 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 block-size: 2.5em;\n inline-size: 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 opacity: 0.16;\n position: absolute;\n inset: 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-block-end: 16px;\n inline-size: 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-inline-start: 8px;\n padding: 0;\n transition: background-color 300ms ease;\n font-size: 0.9em;\n block-size: 2.2em;\n inline-size: 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-block: 0;\n margin-inline: auto;\n }\n}\n\n// ---------------------------------------------\n// DUET DATE PICKER __ SELECT\n// ---------------------------------------------\n\n.duet-date__select {\n display: inline-flex;\n margin-block-start: 4px;\n position: relative;\n\n span {\n margin-inline-end: 4px;\n }\n\n select {\n cursor: pointer;\n font-size: 1em;\n block-size: 100%;\n inset-inline-start: 0;\n opacity: 0;\n position: absolute;\n inset-block-start: 0;\n inline-size: 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-block: 0;\n padding-inline: 8px 4px;\n pointer-events: none;\n position: relative;\n inline-size: 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 block-size: 1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n inset-block-start: 0;\n inline-size: 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 dateClamp,\n inRange,\n endOfMonth,\n startOfMonth,\n printISODate,\n parseISODate,\n DaysOfWeek,\n} from '../../utils/date-utils';\n\nimport { focusVisible } from '../../utils/focus-visible';\nimport { createColorClasses } from '../../utils/theme';\nimport defaultLocalization from './duet-date-picker/date-localization';\nimport { DatePickerMonth } from './duet-date-picker/date-picker-month';\nimport type {\n PickerChangeEvent,\n DuetLocalizedText,\n DateDisabledPredicate,\n Color,\n} from '../../interface';\n\nfunction range(from: number, to: number) {\n const result: number[] = [];\n for (let i = from; i <= to; i++) {\n result.push(i);\n }\n return result;\n}\n\nlet dateIds = 0;\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 dateId = `nano-datepicker-${dateIds++}`;\n private monthSelectId = this.dateId + '-' + 'month';\n private yearSelectId = this.dateId + '-' + 'year';\n private dialogLabelId = this.dateId + '-' + 'dialog';\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 /**\n * Controls which days are disabled and therefore disallowed.\n * For example, this can be used to disallow selection of weekends.\n * @returns `false` for not disabled and `true` for disabled\n */\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(dateClamp(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(dateClamp(date, min, max));\n }\n\n private setFocusedDay(day: Date) {\n this.focusedDay = dateClamp(\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 const ele = this.firstFocusEle || this.firstFocusableElement;\n ele.focus();\n return;\n }\n\n let 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"]}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Web Components for Nanopore digital Web Apps
3
+ */
4
+ import{r as t,c as i,h as r,a as s,g as o}from"./p-1fe12320.js";import{d as n}from"./p-9746b0a5.js";const a=':host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--grid-col-gap:var(--nano-spacing-medium, 16px);--grid-row-gap:var(--nano-spacing-medium, 16px);--current-grid-size:"\'grid size: sm\'";display:block;opacity:0;transition:0.2s ease opacity}:host .grid{display:grid;grid-gap:var(--grid-row-gap) var(--grid-col-gap);block-size:inherit;min-block-size:inherit}:host(.ready){opacity:1}:host(.has-grid) .grid{display:grid}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-1){grid-column-start:1 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-1){grid-row-start:1 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-1){grid-column-end:span 1 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-1){grid-row-end:span 1 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-2){grid-column-start:2 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-2){grid-row-start:2 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-2){grid-column-end:span 2 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-2){grid-row-end:span 2 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-3){grid-column-start:3 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-3){grid-row-start:3 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-3){grid-column-end:span 3 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-3){grid-row-end:span 3 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-4){grid-column-start:4 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-4){grid-row-start:4 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-4){grid-column-end:span 4 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-4){grid-row-end:span 4 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-5){grid-column-start:5 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-5){grid-row-start:5 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-5){grid-column-end:span 5 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-5){grid-row-end:span 5 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-6){grid-column-start:6 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-6){grid-row-start:6 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-6){grid-column-end:span 6 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-6){grid-row-end:span 6 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-7){grid-column-start:7 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-7){grid-row-start:7 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-7){grid-column-end:span 7 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-7){grid-row-end:span 7 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-8){grid-column-start:8 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-8){grid-row-start:8 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-8){grid-column-end:span 8 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-8){grid-row-end:span 8 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-9){grid-column-start:9 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-9){grid-row-start:9 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-9){grid-column-end:span 9 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-9){grid-row-end:span 9 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-start-10){grid-column-start:10 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-start-10){grid-row-start:10 !important}:host(.has-grid) .grid ::slotted(.nano-grid-col-span-10){grid-column-end:span 10 !important}:host(.has-grid) .grid ::slotted(.nano-grid-row-span-10){grid-row-end:span 10 !important}:host([content-panel]:not([content-panel=false])) .grid{grid-template-rows:auto 1fr}:host([full-height]:not([full-height=false])){block-size:100%}:host([full-height]:not([full-height=false])) .grid{grid-template-rows:1fr}:host([show-helper]:not([show-helper=false])) .grid{position:relative}:host([show-helper]:not([show-helper=false])) .grid::after{content:"";position:absolute;inset:0;pointer-events:none;background-image:repeating-linear-gradient(to right, rgba(126, 195, 241, 0.25), rgba(126, 195, 241, 0.25) var(--col-width), transparent var(--col-width), transparent var(--repeat-width));background-size:calc(100% + var(--grid-col-gap)) 100%;z-index:100}:host([show-helper]:not([show-helper=false])) .grid::before{content:var(--current-grid-size);font-size:30px;position:absolute;inline-size:100%;inset-inline-start:0;text-align:center;inset-block-start:50%;transform:translateY(-50%);color:rgba(0, 0, 0, 0.2);text-transform:uppercase;z-index:99;pointer-events:none}:host(.nano-grid-1){--current-grid-size:"grid size: 1";--col-width:calc(100% - var(--grid-col-gap));--repeat-width:calc(100% / 1)}:host(.nano-grid-1) .grid{grid-template-columns:repeat(1, minmax(var(--col-width), 1fr))}:host(.nano-grid-2){--current-grid-size:"grid size: 2";--col-width:calc(50% - var(--grid-col-gap));--repeat-width:calc(100% / 2)}:host(.nano-grid-2) .grid{grid-template-columns:repeat(2, minmax(var(--col-width), 1fr))}:host(.nano-grid-3){--current-grid-size:"grid size: 3";--col-width:calc(33.3333333333% - var(--grid-col-gap));--repeat-width:calc(100% / 3)}:host(.nano-grid-3) .grid{grid-template-columns:repeat(3, minmax(var(--col-width), 1fr))}:host(.nano-grid-4){--current-grid-size:"grid size: 4";--col-width:calc(25% - var(--grid-col-gap));--repeat-width:calc(100% / 4)}:host(.nano-grid-4) .grid{grid-template-columns:repeat(4, minmax(var(--col-width), 1fr))}:host(.nano-grid-5){--current-grid-size:"grid size: 5";--col-width:calc(20% - var(--grid-col-gap));--repeat-width:calc(100% / 5)}:host(.nano-grid-5) .grid{grid-template-columns:repeat(5, minmax(var(--col-width), 1fr))}:host(.nano-grid-6){--current-grid-size:"grid size: 6";--col-width:calc(16.6666666667% - var(--grid-col-gap));--repeat-width:calc(100% / 6)}:host(.nano-grid-6) .grid{grid-template-columns:repeat(6, minmax(var(--col-width), 1fr))}:host(.nano-grid-7){--current-grid-size:"grid size: 7";--col-width:calc(14.2857142857% - var(--grid-col-gap));--repeat-width:calc(100% / 7)}:host(.nano-grid-7) .grid{grid-template-columns:repeat(7, minmax(var(--col-width), 1fr))}:host(.nano-grid-8){--current-grid-size:"grid size: 8";--col-width:calc(12.5% - var(--grid-col-gap));--repeat-width:calc(100% / 8)}:host(.nano-grid-8) .grid{grid-template-columns:repeat(8, minmax(var(--col-width), 1fr))}:host(.nano-grid-9){--current-grid-size:"grid size: 9";--col-width:calc(11.1111111111% - var(--grid-col-gap));--repeat-width:calc(100% / 9)}:host(.nano-grid-9) .grid{grid-template-columns:repeat(9, minmax(var(--col-width), 1fr))}:host(.nano-grid-10){--current-grid-size:"grid size: 10";--col-width:calc(10% - var(--grid-col-gap));--repeat-width:calc(100% / 10)}:host(.nano-grid-10) .grid{grid-template-columns:repeat(10, minmax(var(--col-width), 1fr))}';const e=["col-span","col-start","row-span","row-start"];const d=class{constructor(r){t(this,r);this.nanoBpChange=i(this,"nanoBpChange",7);this.generalClasses=[""];this.gridClass=null;this.isSizes=[null];this.ready=false;this.isSmall=false;this.isMedium=false;this.isLarge=false;this.isXL=false;this.isXXL=false;this.sSize=300;this.mSize=550;this.lSize=800;this.xlSize=1e3;this.sCols=undefined;this.mCols=undefined;this.lCols=undefined;this.xlCols=undefined;this.xxlCols=undefined;this.showHelper=false;this.contentPanel=false;this.fullHeight=false;this.stateChange=n(this.stateChange.bind(this),100)}propChanged(){this.applySizeClasses()}applySizeClasses(){const t=this.currentWidth;this.isSmall=false;this.isMedium=false;this.isLarge=false;this.isXL=false;this.isXXL=false;this.generalClasses=[];this.gridClass=null;this.isSizes=[null];this.isSmall=true;this.generalClasses.push("is-small");if(this.sCols)this.gridClass=`nano-grid-${this.sCols}`;this.isSizes.push({size:"s",active:true});if(t>this.sSize){this.isMedium=true;this.generalClasses.push("is-medium");if(this.mCols)this.gridClass=`nano-grid-${this.mCols}`;this.isSizes.push({size:"m",active:true})}if(t>this.mSize){this.isLarge=true;this.generalClasses.push("is-large");if(this.lCols)this.gridClass=`nano-grid-${this.lCols}`;this.isSizes.push({size:"l",active:true})}if(t>this.lSize){this.isXL=true;this.generalClasses.push("is-xl");if(this.xlCols)this.gridClass=`nano-grid-${this.xlCols}`;this.isSizes.push({size:"xl",active:true})}if(t>this.xlSize){this.isXXL=true;this.generalClasses.push("is-xxl");if(this.xxlCols)this.gridClass=`nano-grid-${this.xxlCols}`;this.isSizes.push({size:"xxl",active:true})}this.el.style.setProperty("--current-grid-size",`'grid size: ${this.isSizes.slice().pop().size}'`);this.applyChildrenClasses();setTimeout((()=>this.ready=true),0)}stateChange(){this.nanoBpChange.emit(this.generalClasses)}applyChildrenClasses(){const t=this.el.querySelectorAll("nano-grid-item");if(t.length){t.forEach((t=>{t.changeBP(this.isSizes)}));return}let i=[""];let r="";let s;let o;const n=this.el;[].map.call(n.children,(t=>{if(!t.hasAttribute("grid-states"))return;o=t.className.split(" ").filter((t=>!t.startsWith("nano-grid-")));t.className=o.join(" ").trim();const n=t.getAttribute("grid-states").split(" ");e.forEach((a=>{s=false;this.isSizes.slice().reverse().forEach((function(e){if(s||!e)return;s=n.find((t=>t.indexOf(`${e.size}-${a}`)===0));if(s){o=t.className.split(" ").filter((t=>!t.includes("nano-grid-${stateOpt}")));t.className=o.join(" ").trim();i=s.split("-");i.shift();r=i.join("-");t.classList.add(`nano-grid-${r}`)}}))}))}))}componentWillLoad(){const t=this.el;[].map.call(t.children,(t=>t.classList.add("nano-griditem")))}componentDidLoad(){this.ro=new ResizeObserver((t=>{for(const i of t){if(!i.contentRect.width)return;this.currentWidth=i.contentRect.width;this.applySizeClasses()}}));this.ro.observe(this.el)}disconnectedCallback(){if(this.ro)this.ro.disconnect()}render(){return r(s,{class:{[this.generalClasses.join(" ")]:true,"has-grid":!!this.gridClass,ready:this.ready,[this.gridClass]:true}},r("div",{class:{grid:true}},r("slot",null)))}get el(){return o(this)}static get watchers(){return{sSize:["propChanged"],mSize:["propChanged"],lSize:["propChanged"],xlSize:["propChanged"],sCols:["propChanged"],mCols:["propChanged"],lCols:["propChanged"],xlCols:["propChanged"],xxlCols:["propChanged"],isSmall:["stateChange"],isMedium:["stateChange"],isLarge:["stateChange"],isXL:["stateChange"],isXXL:["stateChange"]}}};d.style=a;const h=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{display:block}";const g=["col-span","col-start","row-span","row-start"];const l=class{constructor(i){t(this,i);this.currGridSizes=[null];this.gridStates=""}updateGridClasses(){this.applyChildrenClasses()}async changeBP(t){if(this.currGridSizes===t)return;this.currGridSizes=t;if(!this.gridStates.length)return;this.applyChildrenClasses()}applyChildrenClasses(){let t=[""];let i="";let r;let s;s=this.el.className.split(" ").filter((t=>!t.startsWith("nano-grid-")));this.el.className=s.join(" ").trim();const o=this.gridStates.split(" ");g.forEach((n=>{r=false;this.currGridSizes.slice().reverse().forEach((a=>{if(r||!a)return;r=o.find((t=>t.indexOf(`${a.size}-${n}`)===0));if(r){s=this.el.className.split(" ").filter((t=>!t.includes("nano-grid-${stateOpt}")));this.el.className=s.join(" ").trim();t=r.split("-");t.shift();i=t.join("-");this.el.classList.add(`nano-grid-${i}`)}}))}))}render(){return r("slot",null)}get el(){return o(this)}static get watchers(){return{gridStates:["updateGridClasses"]}}};l.style=h;const c=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--padding:0;display:inline-block;object-fit:cover;object-position:center;background-size:cover;background-position:center}:host *{border-radius:inherit}:host([background]:not([background=false])){display:block}.img{position:relative;min-block-size:inherit;block-size:100%;display:block;object-fit:inherit;object-position:inherit;background-color:inherit;background-position:inherit;background-size:inherit;background-origin:inherit;background-attachment:inherit;background-repeat:inherit}.img__loader,.img__observer{position:absolute;inset:0;block-size:100%;inline-size:100%;z-index:-1}.img__image,.img__bg{border-radius:inherit;display:block;opacity:0;transition:0.5s ease opacity, 0.3s ease filter 0.4s;filter:blur(5px)}.img__image.loaded,.img__bg.loaded{opacity:1;filter:blur(0.1px)}@media not all and (min-resolution: 0.001dpcm){@supports (-webkit-appearance: none){.img__image.loaded,.img__bg.loaded{filter:blur(0)}}}.img__image{object-fit:inherit;object-position:inherit;max-inline-size:100%;block-size:auto}.img__image.hide{visibility:hidden}.img__image.hide.no-height{block-size:1px;position:absolute;z-index:-1}.img__bg{background-color:inherit;background-position:inherit;background-size:inherit;background-origin:inherit;background-attachment:inherit;background-repeat:inherit;overflow:auto;padding:var(--padding)}.img__bg.no-height{position:absolute;inset:0}";const p=class{constructor(r){t(this,r);this.nanoImgWillLoad=i(this,"nanoImgWillLoad",7);this.nanoImgDidLoad=i(this,"nanoImgDidLoad",7);this.nanoImgError=i(this,"nanoImgError",7);this._srcSet={};this.onLoad=()=>{this.nanoImgDidLoad.emit();setTimeout((()=>this.hasLoaded=true),50)};this.onError=()=>{this.nanoImgError.emit()};this.onResize=t=>{Object.entries(t.detail).forEach((([t,i])=>{this._srcSet[t].active=i}));const i=[];Object.keys(this._srcSet).sort().forEach((t=>{if(this._srcSet[t].active)i.push(this._srcSet[t].src)}));if(i.length)this._src=i.slice(-1)[0];else this._src=this.src};this.loadSrc=undefined;this.loadError=undefined;this.hasLoaded=false;this.imgStates=null;this._src=undefined;this.alt=undefined;this.src=undefined;this.srcSet=undefined;this.lazy=true;this.background=undefined;this.autoHeight="content"}_srcChanged(){this.hasLoaded=false;this.addIO()}srcChanged(){this._src=this.src}srcSetChanged(){if(!this.srcSet)return;delete this._srcSet;this._srcSet={};this.imgStates=this.srcSet.split(",").map((t=>{const[i,r]=t.split(" ").filter((t=>t.length));this._srcSet[i]={src:r,active:false};return i})).join(", ")}lazyChanged(){if(!this.lazy)this.load()}addIO(){if(!this._src||this.hasLoaded)return;if(!this.lazy){this.load();return}if(typeof window!=="undefined"&&"IntersectionObserver"in window&&"isIntersecting"in window.IntersectionObserverEntry.prototype){this.removeIO();this.io=new IntersectionObserver((t=>{if(t[0].isIntersecting){this.load();this.removeIO()}}));this.io.observe(this.host)}else setTimeout((()=>this.load()),200)}load(){this.loadError=this.onError;this.loadSrc=this._src;this.nanoImgWillLoad.emit()}removeIO(){if(this.io){this.io.disconnect();this.io=undefined}}connectedCallback(){this.srcChanged();this.srcSetChanged();this.lazyChanged()}componentDidLoad(){this.addIO()}disconnectedCallback(){this.removeIO()}render(){const t=!!this.loadSrc?{"background-image":`url(${this.loadSrc})`}:{};return r("div",{class:"img"},r("nano-skeleton",{class:"img__loader"}),!!this.background&&r("div",{class:{loaded:this.hasLoaded,img__bg:true,"no-height":this.autoHeight==="image"},style:t},r("slot",null)),r("img",{class:{img__image:true,loaded:this.hasLoaded,hide:this.background,"no-height":this.autoHeight==="content"},decoding:"async",src:this.loadSrc,alt:this.alt,onLoad:this.onLoad,onError:this.loadError}),r("nano-resize-observe",{class:"img__observer",onNanoResizeStateChange:this.onResize,states:this.imgStates}))}get host(){return o(this)}static get watchers(){return{_src:["_srcChanged"],src:["srcChanged"],srcSet:["srcSetChanged"],lazy:["lazyChanged"]}}};p.style=c;export{d as nano_grid,l as nano_grid_item,p as nano_img};
5
+ //# sourceMappingURL=p-4b69178e.entry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["src/components/grid/grid.scss?tag=nano-grid&encapsulation=shadow","src/components/grid/grid.tsx","src/components/grid/grid-item.scss?tag=nano-grid-item&encapsulation=shadow","src/components/grid/grid-item.tsx","src/components/img/img.scss?tag=nano-img&encapsulation=shadow","src/components/img/img.tsx"],"names":["gridCss","STATEOPTS","Grid","[object Object]","hostRef","this","generalClasses","gridClass","isSizes","stateChange","debounce","bind","applySizeClasses","size","currentWidth","isSmall","isMedium","isLarge","isXL","isXXL","push","sCols","active","sSize","mCols","mSize","lCols","lSize","xlCols","xlSize","xxlCols","el","style","setProperty","slice","pop","applyChildrenClasses","setTimeout","ready","nanoBpChange","emit","gridItems","querySelectorAll","length","forEach","gridItem","changeBP","stateArr","itemState","found","classes","ctx","map","call","children","gItem","hasAttribute","className","split","filter","c","startsWith","join","trim","itemStates","getAttribute","stateOpt","reverse","find","state","indexOf","includes","shift","classList","add","ele","ro","ResizeObserver","entries","entry","contentRect","width","observe","disconnect","h","Host","class","has-grid","grid","gridItemCss","GridItem","currGridSizes","newGridSizes","gridStates","imgCss","Img","_srcSet","onLoad","nanoImgDidLoad","hasLoaded","onError","nanoImgError","onResize","e","Object","detail","bp","srcOpts","keys","sort","src","_src","addIO","srcSet","imgStates","bpSrc","lazy","load","window","IntersectionObserverEntry","prototype","removeIO","io","IntersectionObserver","data","isIntersecting","host","loadError","loadSrc","nanoImgWillLoad","undefined","srcChanged","srcSetChanged","lazyChanged","bgStyle","background-image","background","loaded","img__bg","no-height","autoHeight","img__image","hide","decoding","alt","onNanoResizeStateChange","states"],"mappings":"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","sourcesContent":["@use 'sass:math';\n\n@import '../../global/style/nano-theme/base';\n\n// ie 11 fixes ... maximum numbers we can place on the grid ... upping this number decreases performance a lot.\n$max-grid-cols: 10;\n\n@mixin grid($size: 1) {\n @at-root :host(.nano-grid-#{$size}) {\n --current-grid-size: 'grid size: #{$size}';\n --col-width: calc(#{math.div(100, $size)}% - var(--grid-col-gap));\n --repeat-width: calc(100% / #{$size});\n\n .grid {\n grid-template-columns: repeat(#{$size}, minmax(var(--col-width), 1fr));\n\n $current-column: 1;\n $current-row: 1;\n\n @for $i from 1 through ($max-grid-cols * 2) {\n @if $current-column > $size {\n $current-column: 1;\n $current-row: $current-row + 1;\n }\n $current-column: $current-column + 1;\n }\n }\n }\n}\n\n@mixin grid-spans {\n @for $i from 1 through $max-grid-cols {\n ::slotted(.nano-grid-col-start-#{$i}) {\n grid-column-start: #{$i} !important;\n }\n\n ::slotted(.nano-grid-row-start-#{$i}) {\n grid-row-start: #{$i} !important;\n }\n\n ::slotted(.nano-grid-col-span-#{$i}) {\n grid-column-end: span #{$i} !important;\n }\n\n ::slotted(.nano-grid-row-span-#{$i}) {\n grid-row-end: span #{$i} !important;\n }\n }\n}\n\n:host {\n /**\n * @prop --grid-col-gap: gap between all columns. Defaults to theme's global padding\n * @prop --grid-row-gap: gap between all rows. Defaults to theme's global padding\n */\n\n --grid-col-gap: #{$spacing-medium};\n --grid-row-gap: #{$spacing-medium};\n --current-grid-size: \"'grid size: sm'\";\n\n display: block;\n opacity: 0;\n transition: 0.2s ease opacity;\n\n .grid {\n /* autoprefixer: ignore next */\n display: grid;\n\n /* autoprefixer: ignore next */\n grid-gap: var(--grid-row-gap) var(--grid-col-gap);\n block-size: inherit;\n min-block-size: inherit;\n }\n}\n\n:host(.ready) {\n opacity: 1;\n}\n\n:host(.has-grid) {\n .grid {\n display: grid;\n\n @include grid-spans;\n }\n}\n\n:host([content-panel]:not([content-panel='false'])) {\n .grid {\n grid-template-rows: auto 1fr;\n }\n}\n\n:host([full-height]:not([full-height='false'])) {\n block-size: 100%;\n\n .grid {\n grid-template-rows: 1fr;\n }\n}\n\n:host([show-helper]:not([show-helper='false'])) {\n .grid {\n position: relative;\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-image:\n repeating-linear-gradient(\n to right,\n hsla(204, 80%, 72%, 0.25),\n hsla(204, 80%, 72%, 0.25) var(--col-width),\n transparent var(--col-width),\n transparent var(--repeat-width)\n );\n background-size: calc(100% + var(--grid-col-gap)) 100%;\n z-index: 100;\n }\n\n &::before {\n content: var(--current-grid-size);\n font-size: 30px;\n position: absolute;\n inline-size: 100%;\n inset-inline-start: 0;\n text-align: center;\n inset-block-start: 50%;\n transform: translateY(-50%);\n color: rgba(0, 0, 0, 0.2);\n text-transform: uppercase;\n z-index: 99;\n pointer-events: none;\n }\n }\n}\n\n@for $i from 1 through $max-grid-cols {\n @include grid($i);\n}\n","import {\n Component,\n h,\n Prop,\n Element,\n Host,\n State,\n Watch,\n Event,\n EventEmitter,\n} from '@stencil/core';\nimport { debounce } from '../../utils/throttle';\nimport type { GridSizes } from '../../interface';\n\nconst STATEOPTS = ['col-span', 'col-start', 'row-span', 'row-start'];\n\n/**\n * A context-aware CSS grid implementation.\n * Uses it's own width to choose column number - not screen width.\n */\n@Component({\n tag: 'nano-grid',\n styleUrl: 'grid.scss',\n shadow: true,\n})\nexport class Grid {\n @Element() private el: HTMLNanoGridElement;\n private ro: ResizeObserver;\n private generalClasses: Array<string> = [''];\n private gridClass: string = null;\n private isSizes: GridSizes[] = [null];\n private currentWidth: number;\n\n constructor() {\n this.stateChange = debounce(this.stateChange.bind(this), 100);\n }\n\n @State() ready: boolean = false;\n @State() isSmall = false;\n @State() isMedium = false;\n @State() isLarge = false;\n @State() isXL = false;\n @State() isXXL = false;\n\n /**\n * the component's small breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() sSize: number = 300;\n\n /**\n * the component's medium breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() mSize: number = 550;\n\n /**\n * the component's large breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() lSize: number = 800;\n\n /**\n * the component's xl breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() xlSize: number = 1000;\n\n /**\n * the number of columns the grid has at the small breakpoint.\n */\n @Prop() sCols: number;\n\n /**\n * the number of columns the grid has at the medium breakpoint.\n */\n @Prop() mCols: number;\n\n /**\n * the number of columns the grid has at the large breakpoint.\n */\n @Prop() lCols: number;\n\n /**\n * the number of columns the grid has at the xl breakpoint.\n */\n @Prop() xlCols: number;\n\n /**\n * the number of columns the grid has at the xxl breakpoint (anything greater than the xl breakpoint)\n */\n @Prop() xxlCols: number;\n\n /**\n * shows a grid helper to visualise where columns are\n */\n @Prop({ reflect: true }) showHelper: boolean = false;\n\n /**\n * shortcut for a traditional website like grid (requires more than one row). The second row will auto expand to fill the grid height. The first row and > 2nd row will be the size of their content. e.g. header, body and footer.\n */\n @Prop({ reflect: true }) contentPanel: boolean = false;\n\n /**\n * Helper to make grid items expand to full height in IE11\n */\n @Prop({ reflect: true }) fullHeight: boolean = false;\n\n /**\n * Emitted when the `nano-grid` changes breakpoint\n */\n @Event() nanoBpChange: EventEmitter<string[]>;\n\n @Watch('sSize')\n @Watch('mSize')\n @Watch('lSize')\n @Watch('xlSize')\n @Watch('sCols')\n @Watch('mCols')\n @Watch('lCols')\n @Watch('xlCols')\n @Watch('xxlCols')\n propChanged() {\n this.applySizeClasses();\n }\n\n private applySizeClasses() {\n const size = this.currentWidth;\n\n this.isSmall = false;\n this.isMedium = false;\n this.isLarge = false;\n this.isXL = false;\n this.isXXL = false;\n\n this.generalClasses = [];\n this.gridClass = null;\n this.isSizes = [null];\n\n this.isSmall = true;\n this.generalClasses.push('is-small');\n if (this.sCols) this.gridClass = `nano-grid-${this.sCols}`;\n this.isSizes.push({ size: 's', active: true });\n\n if (size > this.sSize) {\n this.isMedium = true;\n this.generalClasses.push('is-medium');\n if (this.mCols) this.gridClass = `nano-grid-${this.mCols}`;\n this.isSizes.push({ size: 'm', active: true });\n }\n\n if (size > this.mSize) {\n this.isLarge = true;\n this.generalClasses.push('is-large');\n if (this.lCols) this.gridClass = `nano-grid-${this.lCols}`;\n this.isSizes.push({ size: 'l', active: true });\n }\n\n if (size > this.lSize) {\n this.isXL = true;\n this.generalClasses.push('is-xl');\n if (this.xlCols) this.gridClass = `nano-grid-${this.xlCols}`;\n this.isSizes.push({ size: 'xl', active: true });\n }\n\n if (size > this.xlSize) {\n this.isXXL = true;\n this.generalClasses.push('is-xxl');\n if (this.xxlCols) this.gridClass = `nano-grid-${this.xxlCols}`;\n this.isSizes.push({ size: 'xxl', active: true });\n }\n\n this.el.style.setProperty(\n '--current-grid-size',\n `'grid size: ${this.isSizes.slice().pop().size}'`\n );\n this.applyChildrenClasses();\n setTimeout(() => (this.ready = true), 0);\n }\n\n @Watch('isSmall')\n @Watch('isMedium')\n @Watch('isLarge')\n @Watch('isXL')\n @Watch('isXXL')\n stateChange() {\n this.nanoBpChange.emit(this.generalClasses);\n }\n\n private applyChildrenClasses() {\n const gridItems = this.el.querySelectorAll('nano-grid-item');\n if (gridItems.length) {\n gridItems.forEach((gridItem: HTMLNanoGridItemElement) => {\n gridItem.changeBP(this.isSizes);\n });\n return;\n }\n\n // this logic has been put into grid-item. Keep here for legacy for now\n let stateArr: Array<string> = [''];\n let itemState: string = '';\n let found: any;\n let classes: Array<string>;\n\n const ctx = this.el;\n\n // item states come in 4 possible flavours at every breakpoint. E.g.\n // xl-col-span-2\n // xl-col-start-2\n // xl-row-span-2\n // xl-row-start-2\n\n // loop through all grid items with states.\n [].map.call(ctx.children, (gItem: HTMLElement) => {\n if (!gItem.hasAttribute('grid-states')) return;\n\n // gridItems.forEach(gItem => {\n\n // clear all previous grid state classnames\n classes = gItem.className\n .split(' ')\n .filter((c) => !c.startsWith('nano-grid-'));\n gItem.className = classes.join(' ').trim();\n\n // get all potential states this element can have\n const itemStates = gItem.getAttribute('grid-states').split(' ');\n\n // loop through all potential state options: col & row span & start\n STATEOPTS.forEach((stateOpt) => {\n // reset found flag\n found = false;\n\n // loop through all the current valid breakpoints / sizes backwards because\n // we only care about the item's state at the largest current breakpoint.\n this.isSizes\n .slice()\n .reverse()\n .forEach(function (size) {\n if (found || !size) return;\n found = itemStates.find(\n (state) => state.indexOf(`${size.size}-${stateOpt}`) === 0\n );\n\n // found a state at this current size. apply class.\n if (found) {\n // clear previous grid state classname\n classes = gItem.className\n .split(' ')\n .filter((c) => !c.includes('nano-grid-${stateOpt}'));\n gItem.className = classes.join(' ').trim();\n\n stateArr = found.split('-');\n\n // remove the size of the state\n stateArr.shift();\n itemState = stateArr.join('-');\n\n // add new class\n gItem.classList.add(`nano-grid-${itemState}`);\n }\n });\n });\n });\n }\n\n componentWillLoad() {\n const ctx = this.el;\n [].map.call(ctx.children, (ele: HTMLElement) =>\n ele.classList.add('nano-griditem')\n );\n }\n\n componentDidLoad() {\n this.ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (!entry.contentRect.width) return;\n this.currentWidth = entry.contentRect.width;\n this.applySizeClasses();\n }\n });\n this.ro.observe(this.el);\n }\n\n disconnectedCallback() {\n if (this.ro) this.ro.disconnect();\n }\n\n render() {\n return (\n <Host\n class={{\n [this.generalClasses.join(' ')]: true,\n 'has-grid': !!this.gridClass,\n ready: this.ready,\n [this.gridClass]: true,\n }}\n >\n <div\n class={{\n grid: true,\n }}\n >\n <slot />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n","import { Component, h, Prop, Element, Method, Watch } from '@stencil/core';\nimport type { GridSizes } from '../../interface';\n\nconst STATEOPTS = ['col-span', 'col-start', 'row-span', 'row-start'];\n\n/**\n * Grid items to be used with [grid](/story/nano-components-grid) elements\n */\n@Component({\n tag: 'nano-grid-item',\n styleUrl: 'grid-item.scss',\n shadow: true,\n})\nexport class GridItem {\n private currGridSizes: GridSizes[] = [null];\n\n @Element() private el: HTMLNanoGridItemElement;\n /**\n * How to position this item within it's parent grid at different break points. Examples:\n * xl-col-span-2\n * l-col-start-2\n * xxl-row-span-2\n * m-row-start-2\n */\n @Prop() gridStates: string = '';\n\n @Watch('gridStates')\n updateGridClasses() {\n this.applyChildrenClasses();\n }\n\n /**\n * Called by parent grid to trigger new classes\n * @internal\n */\n @Method()\n async changeBP(newGridSizes: GridSizes[]) {\n if (this.currGridSizes === newGridSizes) return;\n this.currGridSizes = newGridSizes;\n\n if (!this.gridStates.length) return;\n this.applyChildrenClasses();\n }\n\n private applyChildrenClasses() {\n let stateArr: Array<string> = [''];\n let itemState: string = '';\n let found: any;\n let classes: Array<string>;\n\n // item states come in 4 possible flavours at every breakpoint. E.g.\n // xl-col-span-2\n // xl-col-start-2\n // xl-row-span-2\n // xl-row-start-2\n\n // clear all previous grid state classnames\n classes = this.el.className\n .split(' ')\n .filter((c) => !c.startsWith('nano-grid-'));\n this.el.className = classes.join(' ').trim();\n\n // get all potential states this element can have\n const itemStates = this.gridStates.split(' ');\n\n // loop through all potential state options: col & row span & start\n STATEOPTS.forEach((stateOpt) => {\n // reset found flag\n found = false;\n\n // loop through all the current valid breakpoints / sizes backwards because\n // we only care about the item's state at the largest current breakpoint.\n this.currGridSizes\n .slice()\n .reverse()\n .forEach((size) => {\n if (found || !size) return;\n found = itemStates.find(\n (state) => state.indexOf(`${size.size}-${stateOpt}`) === 0\n );\n\n // found a state at this current size. apply class.\n if (found) {\n // clear previous grid state classname\n classes = this.el.className\n .split(' ')\n .filter((c) => !c.includes('nano-grid-${stateOpt}'));\n this.el.className = classes.join(' ').trim();\n\n stateArr = found.split('-');\n\n // remove the size of the state\n stateArr.shift();\n itemState = stateArr.join('-');\n\n // add new class\n this.el.classList.add(`nano-grid-${itemState}`);\n }\n });\n });\n }\n\n render() {\n return <slot />;\n }\n}\n",":host {\n /**\n * @prop --padding: padding around any content. Only relevent on `<nano-img background>`\n */\n --padding: 0;\n\n display: inline-block;\n object-fit: cover;\n object-position: center;\n background-size: cover;\n background-position: center;\n\n * {\n border-radius: inherit;\n }\n}\n\n:host([background]:not([background='false'])) {\n display: block;\n}\n\n.img {\n position: relative;\n min-block-size: inherit;\n block-size: 100%;\n display: block;\n object-fit: inherit;\n object-position: inherit;\n background-color: inherit;\n background-position: inherit;\n background-size: inherit;\n background-origin: inherit;\n background-attachment: inherit;\n background-repeat: inherit;\n}\n\n.img__loader,\n.img__observer {\n position: absolute;\n inset: 0;\n block-size: 100%;\n inline-size: 100%;\n z-index: -1;\n}\n\n.img__image,\n.img__bg {\n border-radius: inherit;\n display: block;\n opacity: 0;\n transition: 0.5s ease opacity, 0.3s ease filter 0.4s;\n filter: blur(5px);\n\n &.loaded {\n opacity: 1;\n filter: blur(0.1px);\n\n @media not all and (min-resolution: 0.001dpcm) {\n @supports (-webkit-appearance: none) {\n filter: blur(0);\n }\n }\n }\n}\n\n.img__image {\n object-fit: inherit;\n object-position: inherit;\n max-inline-size: 100%;\n block-size: auto;\n\n &.hide {\n visibility: hidden;\n\n &.no-height {\n block-size: 1px;\n position: absolute;\n z-index: -1;\n }\n }\n}\n\n.img__bg {\n background-color: inherit;\n background-position: inherit;\n background-size: inherit;\n background-origin: inherit;\n background-attachment: inherit;\n background-repeat: inherit;\n overflow: auto;\n padding: var(--padding);\n\n &.no-height {\n position: absolute;\n inset: 0;\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n State,\n Prop,\n Watch,\n h,\n ComponentInterface,\n} from '@stencil/core';\nimport type { ResizeStateChangeEventDetail } from '../../interface';\n\n/**\n * Img with benefits. Lazy loading. Simple `srcSet` solution for both `<img>` and `background-image` varieties.\n * @slot - Main slot. Only relevant with `<nano-img background>`\n */\n@Component({\n tag: 'nano-img',\n styleUrl: 'img.scss',\n shadow: true,\n})\nexport class Img implements ComponentInterface {\n private io?: IntersectionObserver;\n private _srcSet: { [key: string]: { src: string; active: boolean } } = {};\n\n @Element() host!: HTMLNanoImgElement;\n\n @State() loadSrc?: string;\n @State() loadError?: () => void;\n @State() hasLoaded: boolean = false;\n @State() imgStates: string = null;\n @State() _src: string;\n @Watch('_src')\n _srcChanged() {\n this.hasLoaded = false;\n this.addIO();\n }\n\n /** This attribute defines the alternative text describing the image.\n * Users will see this text displayed if the image URL is wrong, or if the image is not yet downloaded. */\n @Prop() alt?: string;\n\n /** The image URL. This attribute is mandatory for the `<img>` element. */\n @Prop() src!: string;\n @Watch('src')\n srcChanged() {\n this._src = this.src;\n }\n\n /** Optional list string providing media sizes with corresponding image srcs.\n * i.e. show img-x at 300px wide. Format `srcSet=\"200w src/imgSmall.jpg, 500h src/imgMed.png\"` */\n @Prop() srcSet?: string;\n @Watch('srcSet')\n srcSetChanged() {\n if (!this.srcSet) return;\n\n delete this._srcSet;\n this._srcSet = {};\n\n this.imgStates = this.srcSet\n .split(',')\n .map((bpSrc) => {\n const [bp, src] = bpSrc.split(' ').filter((bp) => bp.length);\n this._srcSet[bp] = { src: src, active: false };\n return bp;\n })\n .join(', ');\n }\n\n /** Render image lazily, when it comes into the browser viewport **/\n @Prop() lazy: boolean = true;\n @Watch('lazy')\n lazyChanged() {\n if (!this.lazy) this.load();\n }\n\n /** Render the image as a background image **/\n @Prop() background?: boolean;\n\n /** When the image is rendered as a background, and there is no preset dimensions of the component,\n * you can set how the component height will be set. Via image size or via the content **/\n @Prop() autoHeight: 'content' | 'image' = 'content';\n\n /** Emitted when the img src has been set */\n @Event() nanoImgWillLoad!: EventEmitter<void>;\n\n /** Emitted when the image has finished loading */\n @Event() nanoImgDidLoad!: EventEmitter<void>;\n\n /** Emitted when the img fails to load */\n @Event() nanoImgError!: EventEmitter<void>;\n\n private addIO() {\n if (!this._src || this.hasLoaded) return;\n if (!this.lazy) {\n this.load();\n return;\n }\n if (\n typeof (window as any) !== 'undefined' &&\n 'IntersectionObserver' in window &&\n 'isIntersecting' in window.IntersectionObserverEntry.prototype\n ) {\n this.removeIO();\n this.io = new IntersectionObserver((data) => {\n if (data[0].isIntersecting) {\n this.load();\n this.removeIO();\n }\n });\n\n this.io.observe(this.host);\n } else setTimeout(() => this.load(), 200);\n }\n\n private load() {\n this.loadError = this.onError;\n this.loadSrc = this._src;\n this.nanoImgWillLoad.emit();\n }\n\n private onLoad = () => {\n this.nanoImgDidLoad.emit();\n setTimeout(() => (this.hasLoaded = true), 50);\n };\n\n private onError = () => {\n this.nanoImgError.emit();\n };\n\n private onResize = (e: { detail: ResizeStateChangeEventDetail }) => {\n Object.entries(e.detail).forEach(([bp, active]) => {\n this._srcSet[bp].active = active;\n });\n\n // sort and find the highest sized matching image.\n const srcOpts = [];\n Object.keys(this._srcSet)\n .sort()\n .forEach((bp) => {\n if (this._srcSet[bp].active) srcOpts.push(this._srcSet[bp].src);\n });\n\n if (srcOpts.length) this._src = srcOpts.slice(-1)[0];\n // no matching image? Set back to default\n else this._src = this.src;\n };\n\n private removeIO() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n connectedCallback() {\n this.srcChanged();\n this.srcSetChanged();\n this.lazyChanged();\n }\n\n componentDidLoad() {\n this.addIO();\n }\n\n disconnectedCallback() {\n this.removeIO();\n }\n\n render() {\n const bgStyle = !!this.loadSrc\n ? { 'background-image': `url(${this.loadSrc})` }\n : {};\n return (\n <div class=\"img\">\n <nano-skeleton class=\"img__loader\"></nano-skeleton>\n {!!this.background && (\n <div\n class={{\n loaded: this.hasLoaded,\n img__bg: true,\n 'no-height': this.autoHeight === 'image',\n }}\n style={bgStyle}\n >\n <slot />\n </div>\n )}\n <img\n class={{\n img__image: true,\n loaded: this.hasLoaded,\n hide: this.background,\n 'no-height': this.autoHeight === 'content',\n }}\n decoding=\"async\"\n src={this.loadSrc}\n alt={this.alt}\n onLoad={this.onLoad}\n onError={this.loadError}\n />\n <nano-resize-observe\n class=\"img__observer\"\n onNanoResizeStateChange={this.onResize}\n states={this.imgStates}\n />\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["src/components/grid/grid.scss?tag=nano-grid&encapsulation=shadow","src/components/grid/grid.tsx","src/components/grid/grid-item.scss?tag=nano-grid-item&encapsulation=shadow","src/components/grid/grid-item.tsx","src/components/img/img.scss?tag=nano-img&encapsulation=shadow","src/components/img/img.tsx"],"names":["gridCss","STATEOPTS","Grid","[object Object]","hostRef","this","generalClasses","gridClass","isSizes","stateChange","debounce","bind","applySizeClasses","size","currentWidth","isSmall","isMedium","isLarge","isXL","isXXL","push","sCols","active","sSize","mCols","mSize","lCols","lSize","xlCols","xlSize","xxlCols","el","style","setProperty","slice","pop","applyChildrenClasses","setTimeout","ready","nanoBpChange","emit","gridItems","querySelectorAll","length","forEach","gridItem","changeBP","stateArr","itemState","found","classes","ctx","map","call","children","gItem","hasAttribute","className","split","filter","c","startsWith","join","trim","itemStates","getAttribute","stateOpt","reverse","find","state","indexOf","includes","shift","classList","add","ele","ro","ResizeObserver","entries","entry","contentRect","width","observe","disconnect","h","Host","class","has-grid","grid","gridItemCss","GridItem","currGridSizes","newGridSizes","gridStates","imgCss","Img","_srcSet","onLoad","nanoImgDidLoad","hasLoaded","onError","nanoImgError","onResize","e","Object","detail","bp","srcOpts","keys","sort","src","_src","addIO","srcSet","imgStates","bpSrc","lazy","load","window","IntersectionObserverEntry","prototype","removeIO","io","IntersectionObserver","data","isIntersecting","host","loadError","loadSrc","nanoImgWillLoad","undefined","srcChanged","srcSetChanged","lazyChanged","bgStyle","background-image","background","loaded","img__bg","no-height","autoHeight","img__image","hide","decoding","alt","onNanoResizeStateChange","states"],"mappings":"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","sourcesContent":["@use 'sass:math';\n\n@import '../../global/style/nano-theme/base';\n\n// ie 11 fixes ... maximum numbers we can place on the grid ... upping this number decreases performance a lot.\n$max-grid-cols: 10;\n\n@mixin grid($size: 1) {\n @at-root :host(.nano-grid-#{$size}) {\n --current-grid-size: 'grid size: #{$size}';\n --col-width: calc(#{math.div(100, $size)}% - var(--grid-col-gap));\n --repeat-width: calc(100% / #{$size});\n\n .grid {\n grid-template-columns: repeat(#{$size}, minmax(var(--col-width), 1fr));\n\n $current-column: 1;\n $current-row: 1;\n\n @for $i from 1 through ($max-grid-cols * 2) {\n @if $current-column > $size {\n $current-column: 1;\n $current-row: $current-row + 1;\n }\n $current-column: $current-column + 1;\n }\n }\n }\n}\n\n@mixin grid-spans {\n @for $i from 1 through $max-grid-cols {\n ::slotted(.nano-grid-col-start-#{$i}) {\n grid-column-start: #{$i} !important;\n }\n\n ::slotted(.nano-grid-row-start-#{$i}) {\n grid-row-start: #{$i} !important;\n }\n\n ::slotted(.nano-grid-col-span-#{$i}) {\n grid-column-end: span #{$i} !important;\n }\n\n ::slotted(.nano-grid-row-span-#{$i}) {\n grid-row-end: span #{$i} !important;\n }\n }\n}\n\n:host {\n /**\n * @prop --grid-col-gap: gap between all columns. Defaults to theme's global padding\n * @prop --grid-row-gap: gap between all rows. Defaults to theme's global padding\n */\n\n --grid-col-gap: #{$spacing-medium};\n --grid-row-gap: #{$spacing-medium};\n --current-grid-size: \"'grid size: sm'\";\n\n display: block;\n opacity: 0;\n transition: 0.2s ease opacity;\n\n .grid {\n /* autoprefixer: ignore next */\n display: grid;\n\n /* autoprefixer: ignore next */\n grid-gap: var(--grid-row-gap) var(--grid-col-gap);\n block-size: inherit;\n min-block-size: inherit;\n }\n}\n\n:host(.ready) {\n opacity: 1;\n}\n\n:host(.has-grid) {\n .grid {\n display: grid;\n\n @include grid-spans;\n }\n}\n\n:host([content-panel]:not([content-panel='false'])) {\n .grid {\n grid-template-rows: auto 1fr;\n }\n}\n\n:host([full-height]:not([full-height='false'])) {\n block-size: 100%;\n\n .grid {\n grid-template-rows: 1fr;\n }\n}\n\n:host([show-helper]:not([show-helper='false'])) {\n .grid {\n position: relative;\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-image:\n repeating-linear-gradient(\n to right,\n hsla(204, 80%, 72%, 0.25),\n hsla(204, 80%, 72%, 0.25) var(--col-width),\n transparent var(--col-width),\n transparent var(--repeat-width)\n );\n background-size: calc(100% + var(--grid-col-gap)) 100%;\n z-index: 100;\n }\n\n &::before {\n content: var(--current-grid-size);\n font-size: 30px;\n position: absolute;\n inline-size: 100%;\n inset-inline-start: 0;\n text-align: center;\n inset-block-start: 50%;\n transform: translateY(-50%);\n color: rgba(0, 0, 0, 0.2);\n text-transform: uppercase;\n z-index: 99;\n pointer-events: none;\n }\n }\n}\n\n@for $i from 1 through $max-grid-cols {\n @include grid($i);\n}\n","import {\n Component,\n h,\n Prop,\n Element,\n Host,\n State,\n Watch,\n Event,\n EventEmitter,\n} from '@stencil/core';\nimport { debounce } from '../../utils/throttle';\nimport type { GridSizes } from '../../interface';\n\nconst STATEOPTS = ['col-span', 'col-start', 'row-span', 'row-start'];\n\n/**\n * A context-aware CSS grid implementation.\n * Uses it's own width to choose column number - not screen width.\n */\n@Component({\n tag: 'nano-grid',\n styleUrl: 'grid.scss',\n shadow: true,\n})\nexport class Grid {\n @Element() private el: HTMLNanoGridElement;\n private ro: ResizeObserver;\n private generalClasses: Array<string> = [''];\n private gridClass: string = null;\n private isSizes: GridSizes[] = [null];\n private currentWidth: number;\n\n constructor() {\n this.stateChange = debounce(this.stateChange.bind(this), 100);\n }\n\n @State() ready: boolean = false;\n @State() isSmall = false;\n @State() isMedium = false;\n @State() isLarge = false;\n @State() isXL = false;\n @State() isXXL = false;\n\n /**\n * the component's small breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() sSize: number = 300;\n\n /**\n * the component's medium breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() mSize: number = 550;\n\n /**\n * the component's large breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() lSize: number = 800;\n\n /**\n * the component's xl breakpoint. Note - all breakpoints are based on component width, not screen width.\n */\n @Prop() xlSize: number = 1000;\n\n /**\n * the number of columns the grid has at the small breakpoint.\n */\n @Prop() sCols: number;\n\n /**\n * the number of columns the grid has at the medium breakpoint.\n */\n @Prop() mCols: number;\n\n /**\n * the number of columns the grid has at the large breakpoint.\n */\n @Prop() lCols: number;\n\n /**\n * the number of columns the grid has at the xl breakpoint.\n */\n @Prop() xlCols: number;\n\n /**\n * the number of columns the grid has at the xxl breakpoint (anything greater than the xl breakpoint)\n */\n @Prop() xxlCols: number;\n\n /**\n * shows a grid helper to visualise where columns are\n */\n @Prop({ reflect: true }) showHelper: boolean = false;\n\n /**\n * shortcut for a traditional website like grid (requires more than one row). The second row will auto expand to fill the grid height. The first row and > 2nd row will be the size of their content. e.g. header, body and footer.\n */\n @Prop({ reflect: true }) contentPanel: boolean = false;\n\n /**\n * Helper to make grid items expand to full height in IE11\n */\n @Prop({ reflect: true }) fullHeight: boolean = false;\n\n /**\n * Emitted when the `nano-grid` changes breakpoint\n */\n @Event() nanoBpChange: EventEmitter<string[]>;\n\n @Watch('sSize')\n @Watch('mSize')\n @Watch('lSize')\n @Watch('xlSize')\n @Watch('sCols')\n @Watch('mCols')\n @Watch('lCols')\n @Watch('xlCols')\n @Watch('xxlCols')\n propChanged() {\n this.applySizeClasses();\n }\n\n private applySizeClasses() {\n const size = this.currentWidth;\n\n this.isSmall = false;\n this.isMedium = false;\n this.isLarge = false;\n this.isXL = false;\n this.isXXL = false;\n\n this.generalClasses = [];\n this.gridClass = null;\n this.isSizes = [null];\n\n this.isSmall = true;\n this.generalClasses.push('is-small');\n if (this.sCols) this.gridClass = `nano-grid-${this.sCols}`;\n this.isSizes.push({ size: 's', active: true });\n\n if (size > this.sSize) {\n this.isMedium = true;\n this.generalClasses.push('is-medium');\n if (this.mCols) this.gridClass = `nano-grid-${this.mCols}`;\n this.isSizes.push({ size: 'm', active: true });\n }\n\n if (size > this.mSize) {\n this.isLarge = true;\n this.generalClasses.push('is-large');\n if (this.lCols) this.gridClass = `nano-grid-${this.lCols}`;\n this.isSizes.push({ size: 'l', active: true });\n }\n\n if (size > this.lSize) {\n this.isXL = true;\n this.generalClasses.push('is-xl');\n if (this.xlCols) this.gridClass = `nano-grid-${this.xlCols}`;\n this.isSizes.push({ size: 'xl', active: true });\n }\n\n if (size > this.xlSize) {\n this.isXXL = true;\n this.generalClasses.push('is-xxl');\n if (this.xxlCols) this.gridClass = `nano-grid-${this.xxlCols}`;\n this.isSizes.push({ size: 'xxl', active: true });\n }\n\n this.el.style.setProperty(\n '--current-grid-size',\n `'grid size: ${this.isSizes.slice().pop().size}'`\n );\n this.applyChildrenClasses();\n setTimeout(() => (this.ready = true), 0);\n }\n\n @Watch('isSmall')\n @Watch('isMedium')\n @Watch('isLarge')\n @Watch('isXL')\n @Watch('isXXL')\n stateChange() {\n this.nanoBpChange.emit(this.generalClasses);\n }\n\n private applyChildrenClasses() {\n const gridItems = this.el.querySelectorAll('nano-grid-item');\n if (gridItems.length) {\n gridItems.forEach((gridItem: HTMLNanoGridItemElement) => {\n gridItem.changeBP(this.isSizes);\n });\n return;\n }\n\n // this logic has been put into grid-item. Keep here for legacy for now\n let stateArr: Array<string> = [''];\n let itemState: string = '';\n let found: any;\n let classes: Array<string>;\n\n const ctx = this.el;\n\n // item states come in 4 possible flavours at every breakpoint. E.g.\n // xl-col-span-2\n // xl-col-start-2\n // xl-row-span-2\n // xl-row-start-2\n\n // loop through all grid items with states.\n [].map.call(ctx.children, (gItem: HTMLElement) => {\n if (!gItem.hasAttribute('grid-states')) return;\n\n // gridItems.forEach(gItem => {\n\n // clear all previous grid state classnames\n classes = gItem.className\n .split(' ')\n .filter((c) => !c.startsWith('nano-grid-'));\n gItem.className = classes.join(' ').trim();\n\n // get all potential states this element can have\n const itemStates = gItem.getAttribute('grid-states').split(' ');\n\n // loop through all potential state options: col & row span & start\n STATEOPTS.forEach((stateOpt) => {\n // reset found flag\n found = false;\n\n // loop through all the current valid breakpoints / sizes backwards because\n // we only care about the item's state at the largest current breakpoint.\n this.isSizes\n .slice()\n .reverse()\n .forEach(function (size) {\n if (found || !size) return;\n found = itemStates.find(\n (state) => state.indexOf(`${size.size}-${stateOpt}`) === 0\n );\n\n // found a state at this current size. apply class.\n if (found) {\n // clear previous grid state classname\n classes = gItem.className\n .split(' ')\n .filter((c) => !c.includes('nano-grid-${stateOpt}'));\n gItem.className = classes.join(' ').trim();\n\n stateArr = found.split('-');\n\n // remove the size of the state\n stateArr.shift();\n itemState = stateArr.join('-');\n\n // add new class\n gItem.classList.add(`nano-grid-${itemState}`);\n }\n });\n });\n });\n }\n\n componentWillLoad() {\n const ctx = this.el;\n [].map.call(ctx.children, (ele: HTMLElement) =>\n ele.classList.add('nano-griditem')\n );\n }\n\n componentDidLoad() {\n this.ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (!entry.contentRect.width) return;\n this.currentWidth = entry.contentRect.width;\n this.applySizeClasses();\n }\n });\n this.ro.observe(this.el);\n }\n\n disconnectedCallback() {\n if (this.ro) this.ro.disconnect();\n }\n\n render() {\n return (\n <Host\n class={{\n [this.generalClasses.join(' ')]: true,\n 'has-grid': !!this.gridClass,\n ready: this.ready,\n [this.gridClass]: true,\n }}\n >\n <div\n class={{\n grid: true,\n }}\n >\n <slot />\n </div>\n </Host>\n );\n }\n}\n",":host {\n display: block;\n}\n","import { Component, h, Prop, Element, Method, Watch } from '@stencil/core';\nimport type { GridSizes } from '../../interface';\n\nconst STATEOPTS = ['col-span', 'col-start', 'row-span', 'row-start'];\n\n/**\n * Grid items to be used with [grid](/story/nano-components-grid) elements\n */\n@Component({\n tag: 'nano-grid-item',\n styleUrl: 'grid-item.scss',\n shadow: true,\n})\nexport class GridItem {\n private currGridSizes: GridSizes[] = [null];\n\n @Element() private el: HTMLNanoGridItemElement;\n /**\n * How to position this item within it's parent grid at different break points. Examples:\n * xl-col-span-2\n * l-col-start-2\n * xxl-row-span-2\n * m-row-start-2\n */\n @Prop() gridStates: string = '';\n\n @Watch('gridStates')\n updateGridClasses() {\n this.applyChildrenClasses();\n }\n\n /**\n * Called by parent grid to trigger new classes\n * @internal\n */\n @Method()\n async changeBP(newGridSizes: GridSizes[]) {\n if (this.currGridSizes === newGridSizes) return;\n this.currGridSizes = newGridSizes;\n\n if (!this.gridStates.length) return;\n this.applyChildrenClasses();\n }\n\n private applyChildrenClasses() {\n let stateArr: Array<string> = [''];\n let itemState: string = '';\n let found: any;\n let classes: Array<string>;\n\n // item states come in 4 possible flavours at every breakpoint. E.g.\n // xl-col-span-2\n // xl-col-start-2\n // xl-row-span-2\n // xl-row-start-2\n\n // clear all previous grid state classnames\n classes = this.el.className\n .split(' ')\n .filter((c) => !c.startsWith('nano-grid-'));\n this.el.className = classes.join(' ').trim();\n\n // get all potential states this element can have\n const itemStates = this.gridStates.split(' ');\n\n // loop through all potential state options: col & row span & start\n STATEOPTS.forEach((stateOpt) => {\n // reset found flag\n found = false;\n\n // loop through all the current valid breakpoints / sizes backwards because\n // we only care about the item's state at the largest current breakpoint.\n this.currGridSizes\n .slice()\n .reverse()\n .forEach((size) => {\n if (found || !size) return;\n found = itemStates.find(\n (state) => state.indexOf(`${size.size}-${stateOpt}`) === 0\n );\n\n // found a state at this current size. apply class.\n if (found) {\n // clear previous grid state classname\n classes = this.el.className\n .split(' ')\n .filter((c) => !c.includes('nano-grid-${stateOpt}'));\n this.el.className = classes.join(' ').trim();\n\n stateArr = found.split('-');\n\n // remove the size of the state\n stateArr.shift();\n itemState = stateArr.join('-');\n\n // add new class\n this.el.classList.add(`nano-grid-${itemState}`);\n }\n });\n });\n }\n\n render() {\n return <slot />;\n }\n}\n",":host {\n /**\n * @prop --padding: padding around any content. Only relevent on `<nano-img background>`\n */\n --padding: 0;\n\n display: inline-block;\n object-fit: cover;\n object-position: center;\n background-size: cover;\n background-position: center;\n\n * {\n border-radius: inherit;\n }\n}\n\n:host([background]:not([background='false'])) {\n display: block;\n}\n\n.img {\n position: relative;\n min-block-size: inherit;\n block-size: 100%;\n display: block;\n object-fit: inherit;\n object-position: inherit;\n background-color: inherit;\n background-position: inherit;\n background-size: inherit;\n background-origin: inherit;\n background-attachment: inherit;\n background-repeat: inherit;\n}\n\n.img__loader,\n.img__observer {\n position: absolute;\n inset: 0;\n block-size: 100%;\n inline-size: 100%;\n z-index: -1;\n}\n\n.img__image,\n.img__bg {\n border-radius: inherit;\n display: block;\n opacity: 0;\n transition: 0.5s ease opacity, 0.3s ease filter 0.4s;\n filter: blur(5px);\n\n &.loaded {\n opacity: 1;\n filter: blur(0.1px);\n\n @media not all and (min-resolution: 0.001dpcm) {\n @supports (-webkit-appearance: none) {\n filter: blur(0);\n }\n }\n }\n}\n\n.img__image {\n object-fit: inherit;\n object-position: inherit;\n max-inline-size: 100%;\n block-size: auto;\n\n &.hide {\n visibility: hidden;\n\n &.no-height {\n block-size: 1px;\n position: absolute;\n z-index: -1;\n }\n }\n}\n\n.img__bg {\n background-color: inherit;\n background-position: inherit;\n background-size: inherit;\n background-origin: inherit;\n background-attachment: inherit;\n background-repeat: inherit;\n overflow: auto;\n padding: var(--padding);\n\n &.no-height {\n position: absolute;\n inset: 0;\n }\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n State,\n Prop,\n Watch,\n h,\n ComponentInterface,\n} from '@stencil/core';\nimport type { ResizeStateChangeEventDetail } from '../../interface';\n\n/**\n * Img with benefits. Lazy loading. Simple `srcSet` solution for both `<img>` and `background-image` varieties.\n * @slot - Main slot. Only relevant with `<nano-img background>`\n */\n@Component({\n tag: 'nano-img',\n styleUrl: 'img.scss',\n shadow: true,\n})\nexport class Img implements ComponentInterface {\n private io?: IntersectionObserver;\n private _srcSet: { [key: string]: { src: string; active: boolean } } = {};\n\n @Element() host!: HTMLNanoImgElement;\n\n @State() loadSrc?: string;\n @State() loadError?: () => void;\n @State() hasLoaded: boolean = false;\n @State() imgStates: string = null;\n @State() _src: string;\n @Watch('_src')\n _srcChanged() {\n this.hasLoaded = false;\n this.addIO();\n }\n\n /** This attribute defines the alternative text describing the image.\n * Users will see this text displayed if the image URL is wrong, or if the image is not yet downloaded. */\n @Prop() alt?: string;\n\n /** The image URL. This attribute is mandatory for the `<img>` element. */\n @Prop() src!: string;\n @Watch('src')\n srcChanged() {\n this._src = this.src;\n }\n\n /** Optional list string providing media sizes with corresponding image srcs.\n * i.e. show img-x at 300px wide. Format `srcSet=\"200w src/imgSmall.jpg, 500h src/imgMed.png\"` */\n @Prop() srcSet?: string;\n @Watch('srcSet')\n srcSetChanged() {\n if (!this.srcSet) return;\n\n delete this._srcSet;\n this._srcSet = {};\n\n this.imgStates = this.srcSet\n .split(',')\n .map((bpSrc) => {\n const [bp, src] = bpSrc.split(' ').filter((bp) => bp.length);\n this._srcSet[bp] = { src: src, active: false };\n return bp;\n })\n .join(', ');\n }\n\n /** Render image lazily, when it comes into the browser viewport **/\n @Prop() lazy: boolean = true;\n @Watch('lazy')\n lazyChanged() {\n if (!this.lazy) this.load();\n }\n\n /** Render the image as a background image **/\n @Prop() background?: boolean;\n\n /** When the image is rendered as a background, and there is no preset dimensions of the component,\n * you can set how the component height will be set. Via image size or via the content **/\n @Prop() autoHeight: 'content' | 'image' = 'content';\n\n /** Emitted when the img src has been set */\n @Event() nanoImgWillLoad!: EventEmitter<void>;\n\n /** Emitted when the image has finished loading */\n @Event() nanoImgDidLoad!: EventEmitter<void>;\n\n /** Emitted when the img fails to load */\n @Event() nanoImgError!: EventEmitter<void>;\n\n private addIO() {\n if (!this._src || this.hasLoaded) return;\n if (!this.lazy) {\n this.load();\n return;\n }\n if (\n typeof (window as any) !== 'undefined' &&\n 'IntersectionObserver' in window &&\n 'isIntersecting' in window.IntersectionObserverEntry.prototype\n ) {\n this.removeIO();\n this.io = new IntersectionObserver((data) => {\n if (data[0].isIntersecting) {\n this.load();\n this.removeIO();\n }\n });\n\n this.io.observe(this.host);\n } else setTimeout(() => this.load(), 200);\n }\n\n private load() {\n this.loadError = this.onError;\n this.loadSrc = this._src;\n this.nanoImgWillLoad.emit();\n }\n\n private onLoad = () => {\n this.nanoImgDidLoad.emit();\n setTimeout(() => (this.hasLoaded = true), 50);\n };\n\n private onError = () => {\n this.nanoImgError.emit();\n };\n\n private onResize = (e: { detail: ResizeStateChangeEventDetail }) => {\n Object.entries(e.detail).forEach(([bp, active]) => {\n this._srcSet[bp].active = active;\n });\n\n // sort and find the highest sized matching image.\n const srcOpts = [];\n Object.keys(this._srcSet)\n .sort()\n .forEach((bp) => {\n if (this._srcSet[bp].active) srcOpts.push(this._srcSet[bp].src);\n });\n\n if (srcOpts.length) this._src = srcOpts.slice(-1)[0];\n // no matching image? Set back to default\n else this._src = this.src;\n };\n\n private removeIO() {\n if (this.io) {\n this.io.disconnect();\n this.io = undefined;\n }\n }\n\n connectedCallback() {\n this.srcChanged();\n this.srcSetChanged();\n this.lazyChanged();\n }\n\n componentDidLoad() {\n this.addIO();\n }\n\n disconnectedCallback() {\n this.removeIO();\n }\n\n render() {\n const bgStyle = !!this.loadSrc\n ? { 'background-image': `url(${this.loadSrc})` }\n : {};\n return (\n <div class=\"img\">\n <nano-skeleton class=\"img__loader\"></nano-skeleton>\n {!!this.background && (\n <div\n class={{\n loaded: this.hasLoaded,\n img__bg: true,\n 'no-height': this.autoHeight === 'image',\n }}\n style={bgStyle}\n >\n <slot />\n </div>\n )}\n <img\n class={{\n img__image: true,\n loaded: this.hasLoaded,\n hide: this.background,\n 'no-height': this.autoHeight === 'content',\n }}\n decoding=\"async\"\n src={this.loadSrc}\n alt={this.alt}\n onLoad={this.onLoad}\n onError={this.loadError}\n />\n <nano-resize-observe\n class=\"img__observer\"\n onNanoResizeStateChange={this.onResize}\n states={this.imgStates}\n />\n </div>\n );\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Web Components for Nanopore digital Web Apps
3
+ */
4
+ import{r as i,c as t,h as s,g as e}from"./p-1fe12320.js";import{g as n}from"./p-74a7fc4f.js";import{P as o}from"./p-8d747891.js";import{a as r}from"./p-45abbbdd.js";const a=":host{box-sizing:border-box}*,*::before,*::after{box-sizing:border-box}[hidden]{display:none !important}:host{--width:auto;--border:var(--nano-layer-border-style, 1px solid var(--nano-layer-border-color, rgba(0, 0, 0, 0.1)));--border-radius:var(--nano-layer-border-radius, var(--nano-border-radius-medium, 4px));--background:var(--nano-layer-bg, #fff);--padding:10px 0;--overflow:hidden;--dropdown-z-index:var(--nano-layer-index-dropdown, 300);--min-width:0;--box-shadow:var(--nano-layer-shadow-large, 0 2px 8px rgba(0, 0, 0, 0.2));display:flex}.dropdown{position:relative}.dropdown__trigger{display:block}.dropdown__positioner{position:absolute;z-index:var(--dropdown-z-index);min-inline-size:var(--min-width)}@media (max-width: 35.9375em){.dropdown__positioner{z-index:100}}.dropdown__panel{padding:var(--padding);background:var(--background);min-inline-size:var(--min-width);inline-size:var(--width);border:var(--border);border-radius:var(--border-radius);color:currentColor;box-shadow:var(--box-shadow);opacity:0;transition:0.2s ease opacity, 0.2s ease transform, 0.2s ease min-block-size;min-block-size:20px;overflow:var(--overflow);box-sizing:content-box !important}.dropdown__panel.loading{overflow-y:hidden}.dropdown__panel.top{transform:translateY(-20px) translateZ(0)}.dropdown__panel.bottom{transform:translateY(20px) translateZ(0)}.dropdown__positioner.popover-visible .dropdown__panel{opacity:1;transform:translateY(0) translateZ(0)}.dropdown__panel ::slotted(nano-menu){max-block-size:50vh}.dropdown__accessible-title{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);block-size:1px;inline-size:1px;margin:-1px;overflow:hidden;padding:0;position:absolute}";let h=0;const d=class{constructor(s){i(this,s);this.nanoShow=t(this,"nanoShow",7);this.nanoAfterShow=t(this,"nanoAfterShow",7);this.nanoHide=t(this,"nanoHide",7);this.nanoAfterHide=t(this,"nanoAfterHide",7);this.dropdownId=`dropdown-${h++}`;this.labelId=this.dropdownId+"-title";this.ignoreOpenWatcher=false;this.didLoad=false;this.togglePanel=()=>{if(!this.autoOpen)return;this.open?this.hide():this.show()};this.handleTriggerKeyDown=i=>{if(["ArrowDown","ArrowUp"," "].includes(i.key)){this.show();i.preventDefault();i.stopPropagation();if(this.menu)this.menu.setFocus()}};this.handleTriggerSlotChange=()=>{this.updateAccessibleTrigger()};this.autoOpen=true;this.open=false;this.closeOnSelect=true;this.containingElement=undefined;this.tetherTo=null;this.placement="bottom-start";this.distance=2;this.skidding=0;this.hoist=false;this.dialogTitle=undefined;this.eventType=undefined}get menu(){return this.host.querySelector("nano-menu")}handleOpenChange(){if(this.ignoreOpenWatcher)return;this.open?this.show():this.hide();if(this.accessibleTrigger){this.accessibleTrigger.setAttribute("aria-expanded",this.open.toString());return}this.updateAccessibleTrigger()}handleTetherToChange(){this.createPopover();this.updateAccessibleTrigger()}handlePopoverOptionsChange(){this.popover.setOptions({strategy:this.hoist?"fixed":"absolute",placement:this.placement,skidding:this.skidding,distance:this.distance})}secondaryOpen(i){if(!i.detail.secondaryMenu)return;i.stopPropagation();this.panel.classList.add("loading");this.panel.addEventListener("transitionend",(()=>{this.panel.classList.remove("loading")}),{once:true});this.panel.style.minHeight=i.detail.secondaryMenu.scrollHeight+"px"}secondaryClose(i){if(!i.detail.secondaryMenu)return;i.stopPropagation();if(!i.target.parentElement)return;this.panel.style.minHeight=i.target.parentElement.scrollHeight+"px"}handlePanelSelect(i){const t=i.target;if(this.closeOnSelect&&t.tagName.toLowerCase()==="nano-menu")this.hide()}async show(){this.ignoreOpenWatcher=true;this.open=true;const i=this.nanoShow.emit();if(i.defaultPrevented){this.open=false;this.ignoreOpenWatcher=false;return}this.popover.show();this.ignoreOpenWatcher=false;document.addEventListener("mousedown",this.handleDocumentMouseDown);document.addEventListener("keydown",this.handleDocumentKeyDown)}async hide(){this.ignoreOpenWatcher=true;this.open=false;const i=this.nanoHide.emit();if(i.defaultPrevented){this.open=true;this.ignoreOpenWatcher=false;return}if(this.popover)this.popover.hide();this.ignoreOpenWatcher=false;document.removeEventListener("mousedown",this.handleDocumentMouseDown);document.removeEventListener("keydown",this.handleDocumentKeyDown);if(this.accessibleTrigger&&this.focusEleInDropDwn()){this.accessibleTrigger.focus()}}focusEleInDropDwn(i){const t=n();if(i&&i.composedPath()?.length){const t=i.composedPath().includes(this.containingElement);return!i.composedPath().includes(this.accessibleTrigger)&&t}return t&&t.closest(this.containingElement.tagName.toLowerCase())===this.containingElement&&t!==this.accessibleTrigger}updateAccessibleTrigger(){if(!this.didLoad)return;let i;this.accessibleTrigger=null;if(!this.tetherTo){const t=Array.from(this.host.querySelectorAll('[slot="trigger"]'));i=t.map(r)[0]}else{i=r(this.tetherTo)}if(i){i.setAttribute("aria-haspopup","true");i.setAttribute("aria-expanded",this.open?"true":"false");this.accessibleTrigger=i}}handleDocumentKeyDown(i){if(i.key==="Escape"){this.hide();return}if(i.key==="Tab"){setTimeout((()=>{if(document.activeElement&&document.activeElement.closest(this.containingElement.tagName.toLowerCase())!==this.containingElement){this.hide();return}}))}if(this.menu&&["ArrowDown","ArrowUp"].includes(i.key)){if(!this.open||this.focusEleInDropDwn(i))return;i.preventDefault();this.menu.setFocus();return}const t=i.composedPath();if(this.menu&&t.length&&!t.find((i=>i!==this.menu))){this.menu.dispatchEvent(new KeyboardEvent(i.type,i));return}}handleDocumentMouseDown(i){if(!this.focusEleInDropDwn(i)){this.hide();return}}createPopover(){if(this.popover){if(this.open)this.hide();this.popover.destroy();this.popover=null}this.popover=new o(this.tetherTo||this.trigger,this.positioner,{strategy:this.hoist?"fixed":"absolute",placement:this.placement,distance:this.distance,skidding:this.skidding,transitionElement:this.panel,onAfterHide:()=>this.nanoAfterHide.emit(),onAfterShow:()=>this.nanoAfterShow.emit(),onTransitionEnd:()=>{if(!this.open){this.panel.scrollTop=0}else if(this.menu){this.menu.showActiveElement()}}});if(this.open){this.show()}}connectedCallback(){this.handleDocumentKeyDown=this.handleDocumentKeyDown.bind(this);this.handleDocumentMouseDown=this.handleDocumentMouseDown.bind(this);if(!this.containingElement)this.containingElement=this.host}componentDidLoad(){this.didLoad=true;this.createPopover();setTimeout((()=>this.updateAccessibleTrigger()),100)}disconnectedCallback(){this.hide();if(this.popover)this.popover.destroy()}render(){return s("div",{part:"base",id:this.dropdownId,class:{dropdown:true,"dropdown--open":this.open}},s("span",{part:"trigger",class:"dropdown__trigger",ref:i=>this.trigger=i,onKeyDown:this.handleTriggerKeyDown,onClick:this.togglePanel},s("slot",{name:"trigger",onSlotchange:this.handleTriggerSlotChange})),s("div",{ref:i=>this.positioner=i,class:"dropdown__positioner"},s("div",{ref:i=>this.panel=i,part:"panel",class:`dropdown__panel ${this.placement.split("-").join(" ")}`,"aria-hidden":!this.open,role:"dialog","aria-modal":"true","aria-labelledby":this.dialogTitle?this.labelId:undefined},this.dialogTitle&&s("h2",{id:this.labelId,class:"dropdown__accessible-title","aria-live":"polite"},this.dialogTitle),s("slot",null))))}get host(){return e(this)}static get watchers(){return{open:["handleOpenChange"],tetherTo:["handleTetherToChange"],placement:["handlePopoverOptionsChange"],distance:["handlePopoverOptionsChange"],skidding:["handlePopoverOptionsChange"],hoist:["handlePopoverOptionsChange"]}}};d.style=a;export{d as nano_dropdown};
5
+ //# sourceMappingURL=p-4f0e14b5.entry.js.map