@nanoporetech-digital/components 2.8.0 → 2.10.1

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 (515) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/cjs/{algoliasearch.umd-dcf18a4a.js → algoliasearch.umd-7ee60729.js} +3 -3
  3. package/dist/cjs/{algoliasearch.umd-dcf18a4a.js.map → algoliasearch.umd-7ee60729.js.map} +1 -1
  4. package/dist/cjs/{component-store-722032a5.js → component-store-19844199.js} +37 -25
  5. package/dist/cjs/component-store-19844199.js.map +1 -0
  6. package/dist/cjs/{form-control-8f530f7d.js → form-control-d54a847f.js} +26 -19
  7. package/dist/cjs/form-control-d54a847f.js.map +1 -0
  8. package/dist/cjs/index-cb62df44.js +5 -0
  9. package/dist/cjs/loader.cjs.js +1 -1
  10. package/dist/cjs/nano-algolia-filter.cjs.entry.js +1 -1
  11. package/dist/cjs/nano-algolia-input.cjs.entry.js +2 -2
  12. package/dist/cjs/nano-algolia.cjs.entry.js +2 -2
  13. package/dist/cjs/nano-checkbox-group.cjs.entry.js +58 -20
  14. package/dist/cjs/nano-checkbox-group.cjs.entry.js.map +1 -1
  15. package/dist/cjs/nano-checkbox.cjs.entry.js +27 -15
  16. package/dist/cjs/nano-checkbox.cjs.entry.js.map +1 -1
  17. package/dist/cjs/nano-components.cjs.js +1 -1
  18. package/dist/cjs/nano-datalist_3.cjs.entry.js +5 -3
  19. package/dist/cjs/nano-datalist_3.cjs.entry.js.map +1 -1
  20. package/dist/cjs/nano-date-input.cjs.entry.js +17 -4
  21. package/dist/cjs/nano-date-input.cjs.entry.js.map +1 -1
  22. package/dist/cjs/nano-dialog.cjs.entry.js +13 -2
  23. package/dist/cjs/nano-dialog.cjs.entry.js.map +1 -1
  24. package/dist/cjs/nano-field-validator.cjs.entry.js +531 -0
  25. package/dist/cjs/nano-field-validator.cjs.entry.js.map +1 -0
  26. package/dist/cjs/nano-file-upload.cjs.entry.js +59 -36
  27. package/dist/cjs/nano-file-upload.cjs.entry.js.map +1 -1
  28. package/dist/cjs/nano-global-nav.cjs.entry.js +2 -2
  29. package/dist/cjs/nano-icon.cjs.entry.js.map +1 -1
  30. package/dist/cjs/nano-input.cjs.entry.js +36 -20
  31. package/dist/cjs/nano-input.cjs.entry.js.map +1 -1
  32. package/dist/cjs/nano-nav-item_2.cjs.entry.js +65 -24
  33. package/dist/cjs/nano-nav-item_2.cjs.entry.js.map +1 -1
  34. package/dist/cjs/nano-resize-observe_2.cjs.entry.js +6 -4
  35. package/dist/cjs/nano-resize-observe_2.cjs.entry.js.map +1 -1
  36. package/dist/cjs/nano-sticker.cjs.entry.js +2 -2
  37. package/dist/cjs/nano-sticker.cjs.entry.js.map +1 -1
  38. package/dist/cjs/nano-tab-group.cjs.entry.js +1 -1
  39. package/dist/collection/collection-manifest.json +2 -1
  40. package/dist/collection/components/accordion/accordion.js +1 -1
  41. package/dist/collection/components/alert/alert.js +1 -1
  42. package/dist/collection/components/algolia/algolia-filter.js +2 -2
  43. package/dist/collection/components/algolia/algolia-input.js +5 -5
  44. package/dist/collection/components/algolia/algolia-results.js +1 -1
  45. package/dist/collection/components/algolia/algolia.js +6 -6
  46. package/dist/collection/components/checkbox/checkbox-group.css +5 -5
  47. package/dist/collection/components/checkbox/checkbox-group.js +119 -25
  48. package/dist/collection/components/checkbox/checkbox-group.js.map +1 -1
  49. package/dist/collection/components/checkbox/checkbox.css +1 -1
  50. package/dist/collection/components/checkbox/checkbox.js +83 -22
  51. package/dist/collection/components/checkbox/checkbox.js.map +1 -1
  52. package/dist/collection/components/datalist/datalist.js +5 -2
  53. package/dist/collection/components/datalist/datalist.js.map +1 -1
  54. package/dist/collection/components/date-input/date-input.js +44 -12
  55. package/dist/collection/components/date-input/date-input.js.map +1 -1
  56. package/dist/collection/components/date-picker/date-picker.js +5 -5
  57. package/dist/collection/components/details/details.js +1 -1
  58. package/dist/collection/components/dialog/dialog.js +34 -1
  59. package/dist/collection/components/dialog/dialog.js.map +1 -1
  60. package/dist/collection/components/dropdown/dropdown.js +1 -1
  61. package/dist/collection/components/field-validator/field-validator.js +579 -0
  62. package/dist/collection/components/field-validator/field-validator.js.map +1 -0
  63. package/dist/collection/components/file-upload/file-upload.css +17 -5
  64. package/dist/collection/components/file-upload/file-upload.js +111 -44
  65. package/dist/collection/components/file-upload/file-upload.js.map +1 -1
  66. package/dist/collection/components/form-control/form-control.js +25 -18
  67. package/dist/collection/components/form-control/form-control.js.map +1 -1
  68. package/dist/collection/components/global-nav/global-nav.js +4 -4
  69. package/dist/collection/components/grid/grid-item.js +1 -1
  70. package/dist/collection/components/icon/icon.js +2 -2
  71. package/dist/collection/components/icon/icon.js.map +1 -1
  72. package/dist/collection/components/input/input.css +57 -5
  73. package/dist/collection/components/input/input.js +65 -29
  74. package/dist/collection/components/input/input.js.map +1 -1
  75. package/dist/collection/components/menu/menu.js +1 -2
  76. package/dist/collection/components/menu/menu.js.map +1 -1
  77. package/dist/collection/components/nav-item/nav-item.js +4 -4
  78. package/dist/collection/components/range/range.js +4 -4
  79. package/dist/collection/components/resize-observe/resize-observe.js +7 -6
  80. package/dist/collection/components/resize-observe/resize-observe.js.map +1 -1
  81. package/dist/collection/components/select/select.css +61 -6
  82. package/dist/collection/components/select/select.js +100 -33
  83. package/dist/collection/components/select/select.js.map +1 -1
  84. package/dist/collection/components/slides/slides.js +7 -7
  85. package/dist/collection/components/{sticky → sticker}/sticker.css +0 -0
  86. package/dist/collection/components/{sticky → sticker}/sticker.js +2 -2
  87. package/dist/collection/components/sticker/sticker.js.map +1 -0
  88. package/dist/collection/components/tabs/tab-group.js +2 -2
  89. package/dist/collection/utils/store/component-store.js +4 -13
  90. package/dist/collection/utils/store/component-store.js.map +1 -1
  91. package/dist/collection/utils/store/get-set.js +15 -1
  92. package/dist/collection/utils/store/get-set.js.map +1 -1
  93. package/dist/components/algoliasearch.umd.js +2 -2
  94. package/dist/components/algoliasearch.umd.js.map +1 -1
  95. package/dist/components/component-store.js +36 -24
  96. package/dist/components/component-store.js.map +1 -1
  97. package/dist/components/datalist.js +4 -1
  98. package/dist/components/datalist.js.map +1 -1
  99. package/dist/components/form-control.js +25 -18
  100. package/dist/components/form-control.js.map +1 -1
  101. package/dist/components/icon.js.map +1 -1
  102. package/dist/components/input.js +39 -21
  103. package/dist/components/input.js.map +1 -1
  104. package/dist/components/menu.js +1 -2
  105. package/dist/components/menu.js.map +1 -1
  106. package/dist/components/nano-checkbox-group.js +62 -21
  107. package/dist/components/nano-checkbox-group.js.map +1 -1
  108. package/dist/components/nano-checkbox.js +31 -17
  109. package/dist/components/nano-checkbox.js.map +1 -1
  110. package/dist/components/nano-date-input.js +18 -4
  111. package/dist/components/nano-date-input.js.map +1 -1
  112. package/dist/components/nano-dialog.js +13 -1
  113. package/dist/components/nano-dialog.js.map +1 -1
  114. package/dist/components/nano-field-validator.d.ts +11 -0
  115. package/dist/components/nano-field-validator.js +559 -0
  116. package/dist/components/nano-field-validator.js.map +1 -0
  117. package/dist/components/nano-file-upload.js +62 -37
  118. package/dist/components/nano-file-upload.js.map +1 -1
  119. package/dist/components/resize-observe.js +6 -4
  120. package/dist/components/resize-observe.js.map +1 -1
  121. package/dist/components/select.js +69 -25
  122. package/dist/components/select.js.map +1 -1
  123. package/dist/components/sticker.js +2 -2
  124. package/dist/components/sticker.js.map +1 -1
  125. package/dist/custom-elements/index.d.ts +6 -0
  126. package/dist/custom-elements/index.js +2606 -691
  127. package/dist/custom-elements/index.js.map +1 -1
  128. package/dist/esm/{algolia-data-dd72d1b7.js → algolia-data-80c1169a.js} +2 -2
  129. package/dist/esm/{algolia-data-dd72d1b7.js.map → algolia-data-80c1169a.js.map} +1 -1
  130. package/dist/esm/{algoliasearch.umd-6143495f.js → algoliasearch.umd-86359963.js} +3 -3
  131. package/dist/esm/{algoliasearch.umd-6143495f.js.map → algoliasearch.umd-86359963.js.map} +1 -1
  132. package/dist/esm/{component-store-b6fbfa35.js → component-store-d238fee4.js} +38 -26
  133. package/dist/esm/component-store-d238fee4.js.map +1 -0
  134. package/dist/esm/{form-control-c52b6256.js → form-control-ad05507c.js} +27 -20
  135. package/dist/esm/form-control-ad05507c.js.map +1 -0
  136. package/dist/esm/{index-5f8d16e7.js → index-c42becad.js} +7 -2
  137. package/dist/esm/{index-5f8d16e7.js.map → index-c42becad.js.map} +1 -1
  138. package/dist/esm/loader.js +2 -2
  139. package/dist/esm/nano-accordion.entry.js +1 -1
  140. package/dist/esm/nano-alert.entry.js +1 -1
  141. package/dist/esm/nano-algolia-filter.entry.js +3 -3
  142. package/dist/esm/nano-algolia-input.entry.js +4 -4
  143. package/dist/esm/nano-algolia-pagination.entry.js +2 -2
  144. package/dist/esm/nano-algolia-results.entry.js +2 -2
  145. package/dist/esm/nano-algolia.entry.js +4 -4
  146. package/dist/esm/nano-aspect-ratio.entry.js +1 -1
  147. package/dist/esm/nano-checkbox-group.entry.js +59 -21
  148. package/dist/esm/nano-checkbox-group.entry.js.map +1 -1
  149. package/dist/esm/nano-checkbox.entry.js +28 -16
  150. package/dist/esm/nano-checkbox.entry.js.map +1 -1
  151. package/dist/esm/nano-components.js +2 -2
  152. package/dist/esm/nano-datalist_3.entry.js +6 -4
  153. package/dist/esm/nano-datalist_3.entry.js.map +1 -1
  154. package/dist/esm/nano-date-input.entry.js +18 -5
  155. package/dist/esm/nano-date-input.entry.js.map +1 -1
  156. package/dist/esm/nano-date-picker.entry.js +1 -1
  157. package/dist/esm/nano-details.entry.js +1 -1
  158. package/dist/esm/nano-dialog.entry.js +14 -3
  159. package/dist/esm/nano-dialog.entry.js.map +1 -1
  160. package/dist/esm/nano-drawer.entry.js +1 -1
  161. package/dist/esm/nano-dropdown.entry.js +1 -1
  162. package/dist/esm/nano-field-validator.entry.js +527 -0
  163. package/dist/esm/nano-field-validator.entry.js.map +1 -0
  164. package/dist/esm/nano-file-upload.entry.js +60 -37
  165. package/dist/esm/nano-file-upload.entry.js.map +1 -1
  166. package/dist/esm/nano-global-nav.entry.js +3 -3
  167. package/dist/esm/nano-global-search-results.entry.js +1 -1
  168. package/dist/esm/nano-grid_3.entry.js +1 -1
  169. package/dist/esm/nano-hero.entry.js +1 -1
  170. package/dist/esm/nano-icon-button.entry.js +1 -1
  171. package/dist/esm/nano-icon.entry.js +1 -1
  172. package/dist/esm/nano-icon.entry.js.map +1 -1
  173. package/dist/esm/nano-input.entry.js +38 -22
  174. package/dist/esm/nano-input.entry.js.map +1 -1
  175. package/dist/esm/nano-menu-drawer.entry.js +1 -1
  176. package/dist/esm/nano-nav-item_2.entry.js +67 -26
  177. package/dist/esm/nano-nav-item_2.entry.js.map +1 -1
  178. package/dist/esm/nano-range.entry.js +1 -1
  179. package/dist/esm/nano-rating.entry.js +1 -1
  180. package/dist/esm/nano-resize-observe_2.entry.js +7 -5
  181. package/dist/esm/nano-resize-observe_2.entry.js.map +1 -1
  182. package/dist/esm/nano-slide.entry.js +1 -1
  183. package/dist/esm/nano-slides.entry.js +1 -1
  184. package/dist/esm/nano-spinner.entry.js +1 -1
  185. package/dist/esm/nano-split-pane.entry.js +1 -1
  186. package/dist/esm/nano-sticker.entry.js +3 -3
  187. package/dist/esm/nano-sticker.entry.js.map +1 -1
  188. package/dist/esm/nano-tab-content.entry.js +1 -1
  189. package/dist/esm/nano-tab-group.entry.js +2 -2
  190. package/dist/esm/nano-tab.entry.js +1 -1
  191. package/dist/esm/nano-tooltip.entry.js +1 -1
  192. package/dist/esm-es5/{algolia-data-dd72d1b7.js → algolia-data-80c1169a.js} +2 -2
  193. package/dist/esm-es5/{algolia-data-dd72d1b7.js.map → algolia-data-80c1169a.js.map} +0 -0
  194. package/dist/esm-es5/{algoliasearch.umd-6143495f.js → algoliasearch.umd-86359963.js} +3 -3
  195. package/dist/esm-es5/{algoliasearch.umd-6143495f.js.map → algoliasearch.umd-86359963.js.map} +1 -1
  196. package/dist/esm-es5/component-store-d238fee4.js +5 -0
  197. package/dist/esm-es5/component-store-d238fee4.js.map +1 -0
  198. package/dist/esm-es5/form-control-ad05507c.js +5 -0
  199. package/dist/esm-es5/form-control-ad05507c.js.map +1 -0
  200. package/dist/esm-es5/{index-5f8d16e7.js → index-c42becad.js} +2 -2
  201. package/dist/esm-es5/{index-5f8d16e7.js.map → index-c42becad.js.map} +0 -0
  202. package/dist/esm-es5/loader.js +1 -1
  203. package/dist/esm-es5/loader.js.map +1 -1
  204. package/dist/esm-es5/nano-accordion.entry.js +1 -1
  205. package/dist/esm-es5/nano-alert.entry.js +1 -1
  206. package/dist/esm-es5/nano-algolia-filter.entry.js +1 -1
  207. package/dist/esm-es5/nano-algolia-input.entry.js +1 -1
  208. package/dist/esm-es5/nano-algolia-pagination.entry.js +1 -1
  209. package/dist/esm-es5/nano-algolia-results.entry.js +1 -1
  210. package/dist/esm-es5/nano-algolia.entry.js +1 -1
  211. package/dist/esm-es5/nano-aspect-ratio.entry.js +1 -1
  212. package/dist/esm-es5/nano-checkbox-group.entry.js +2 -2
  213. package/dist/esm-es5/nano-checkbox-group.entry.js.map +1 -1
  214. package/dist/esm-es5/nano-checkbox.entry.js +1 -1
  215. package/dist/esm-es5/nano-checkbox.entry.js.map +1 -1
  216. package/dist/esm-es5/nano-components.js +1 -1
  217. package/dist/esm-es5/nano-components.js.map +1 -1
  218. package/dist/esm-es5/nano-datalist_3.entry.js +1 -1
  219. package/dist/esm-es5/nano-datalist_3.entry.js.map +1 -1
  220. package/dist/esm-es5/nano-date-input.entry.js +1 -1
  221. package/dist/esm-es5/nano-date-input.entry.js.map +1 -1
  222. package/dist/esm-es5/nano-date-picker.entry.js +1 -1
  223. package/dist/esm-es5/nano-details.entry.js +1 -1
  224. package/dist/esm-es5/nano-dialog.entry.js +1 -1
  225. package/dist/esm-es5/nano-dialog.entry.js.map +1 -1
  226. package/dist/esm-es5/nano-drawer.entry.js +1 -1
  227. package/dist/esm-es5/nano-dropdown.entry.js +1 -1
  228. package/dist/esm-es5/nano-field-validator.entry.js +5 -0
  229. package/dist/esm-es5/nano-field-validator.entry.js.map +1 -0
  230. package/dist/esm-es5/nano-file-upload.entry.js +2 -2
  231. package/dist/esm-es5/nano-file-upload.entry.js.map +1 -1
  232. package/dist/esm-es5/nano-global-nav.entry.js +1 -1
  233. package/dist/esm-es5/nano-global-search-results.entry.js +1 -1
  234. package/dist/esm-es5/nano-grid_3.entry.js +1 -1
  235. package/dist/esm-es5/nano-hero.entry.js +1 -1
  236. package/dist/esm-es5/nano-icon-button.entry.js +1 -1
  237. package/dist/esm-es5/nano-icon.entry.js +1 -1
  238. package/dist/esm-es5/nano-icon.entry.js.map +1 -1
  239. package/dist/esm-es5/nano-input.entry.js +1 -1
  240. package/dist/esm-es5/nano-input.entry.js.map +1 -1
  241. package/dist/esm-es5/nano-menu-drawer.entry.js +1 -1
  242. package/dist/esm-es5/nano-nav-item_2.entry.js +1 -1
  243. package/dist/esm-es5/nano-nav-item_2.entry.js.map +1 -1
  244. package/dist/esm-es5/nano-range.entry.js +1 -1
  245. package/dist/esm-es5/nano-rating.entry.js +1 -1
  246. package/dist/esm-es5/nano-resize-observe_2.entry.js +2 -2
  247. package/dist/esm-es5/nano-resize-observe_2.entry.js.map +1 -1
  248. package/dist/esm-es5/nano-slide.entry.js +1 -1
  249. package/dist/esm-es5/nano-slides.entry.js +1 -1
  250. package/dist/esm-es5/nano-spinner.entry.js +1 -1
  251. package/dist/esm-es5/nano-split-pane.entry.js +1 -1
  252. package/dist/esm-es5/nano-sticker.entry.js +1 -1
  253. package/dist/esm-es5/nano-sticker.entry.js.map +1 -1
  254. package/dist/esm-es5/nano-tab-content.entry.js +1 -1
  255. package/dist/esm-es5/nano-tab-group.entry.js +1 -1
  256. package/dist/esm-es5/nano-tab.entry.js +2 -2
  257. package/dist/esm-es5/nano-tooltip.entry.js +1 -1
  258. package/dist/nano-components/nano-components.css +1 -1
  259. package/dist/nano-components/nano-components.esm.js +1 -1
  260. package/dist/nano-components/nano-components.esm.js.map +1 -1
  261. package/dist/nano-components/nano-components.js +1 -1
  262. package/dist/nano-components/p-00eaa36a.entry.js +5 -0
  263. package/dist/nano-components/p-00eaa36a.entry.js.map +1 -0
  264. package/dist/nano-components/p-01667573.entry.js +5 -0
  265. package/dist/nano-components/p-01667573.entry.js.map +1 -0
  266. package/dist/nano-components/{p-4429caac.system.entry.js → p-0c6c2141.system.entry.js} +2 -2
  267. package/dist/nano-components/{p-4429caac.system.entry.js.map → p-0c6c2141.system.entry.js.map} +0 -0
  268. package/dist/nano-components/{p-7232c046.system.entry.js → p-0d0dfc06.system.entry.js} +2 -2
  269. package/dist/nano-components/{p-7232c046.system.entry.js.map → p-0d0dfc06.system.entry.js.map} +0 -0
  270. package/dist/nano-components/{p-e562bffd.entry.js → p-0e2e3f4a.entry.js} +2 -2
  271. package/dist/nano-components/{p-e562bffd.entry.js.map → p-0e2e3f4a.entry.js.map} +0 -0
  272. package/dist/nano-components/{p-56ba0d63.entry.js → p-1030797a.entry.js} +2 -2
  273. package/dist/nano-components/{p-56ba0d63.entry.js.map → p-1030797a.entry.js.map} +0 -0
  274. package/dist/nano-components/p-129e2b4b.system.js +5 -0
  275. package/dist/nano-components/p-129e2b4b.system.js.map +1 -0
  276. package/dist/nano-components/{p-c0ddb4c3.entry.js → p-166ade3e.entry.js} +2 -2
  277. package/dist/nano-components/{p-c0ddb4c3.entry.js.map → p-166ade3e.entry.js.map} +0 -0
  278. package/dist/nano-components/{p-5653961d.system.entry.js → p-1a30dfdd.system.entry.js} +2 -2
  279. package/dist/nano-components/p-1a30dfdd.system.entry.js.map +1 -0
  280. package/dist/nano-components/p-1b120f53.entry.js +5 -0
  281. package/dist/nano-components/p-1b120f53.entry.js.map +1 -0
  282. package/dist/nano-components/{p-7d351076.system.entry.js → p-21af2a5e.system.entry.js} +2 -2
  283. package/dist/nano-components/{p-7d351076.system.entry.js.map → p-21af2a5e.system.entry.js.map} +0 -0
  284. package/dist/nano-components/p-21d6d31e.system.entry.js +5 -0
  285. package/dist/nano-components/p-21d6d31e.system.entry.js.map +1 -0
  286. package/dist/nano-components/{p-346588cc.entry.js → p-222d8095.entry.js} +2 -2
  287. package/dist/nano-components/{p-346588cc.entry.js.map → p-222d8095.entry.js.map} +0 -0
  288. package/dist/nano-components/p-241d90eb.system.entry.js +5 -0
  289. package/dist/nano-components/p-241d90eb.system.entry.js.map +1 -0
  290. package/dist/nano-components/{p-040b6cda.entry.js → p-2649fc8e.entry.js} +2 -2
  291. package/dist/nano-components/{p-040b6cda.entry.js.map → p-2649fc8e.entry.js.map} +0 -0
  292. package/dist/nano-components/{p-3456db01.entry.js → p-27efac97.entry.js} +2 -2
  293. package/dist/nano-components/{p-3456db01.entry.js.map → p-27efac97.entry.js.map} +0 -0
  294. package/dist/nano-components/{p-462ad4f1.entry.js → p-2c8d7273.entry.js} +2 -2
  295. package/dist/nano-components/{p-462ad4f1.entry.js.map → p-2c8d7273.entry.js.map} +0 -0
  296. package/dist/nano-components/{p-2e6c55e2.entry.js → p-2d53d1a0.entry.js} +2 -2
  297. package/dist/nano-components/{p-2e6c55e2.entry.js.map → p-2d53d1a0.entry.js.map} +0 -0
  298. package/dist/nano-components/{p-1f99d776.entry.js → p-3093915f.entry.js} +2 -2
  299. package/dist/nano-components/{p-1f99d776.entry.js.map → p-3093915f.entry.js.map} +0 -0
  300. package/dist/nano-components/{p-8a8f893b.system.entry.js → p-316f83a9.system.entry.js} +2 -2
  301. package/dist/nano-components/{p-8a8f893b.system.entry.js.map → p-316f83a9.system.entry.js.map} +0 -0
  302. package/dist/nano-components/{p-7246bef5.entry.js → p-325c1cad.entry.js} +2 -2
  303. package/dist/nano-components/{p-7246bef5.entry.js.map → p-325c1cad.entry.js.map} +0 -0
  304. package/dist/nano-components/{p-ec39b143.system.entry.js → p-32f396c0.system.entry.js} +2 -2
  305. package/dist/nano-components/{p-ec39b143.system.entry.js.map → p-32f396c0.system.entry.js.map} +0 -0
  306. package/dist/nano-components/p-32f4516e.js +5 -0
  307. package/dist/nano-components/p-32f4516e.js.map +1 -0
  308. package/dist/nano-components/{p-43543d18.entry.js → p-333237e8.entry.js} +2 -2
  309. package/dist/nano-components/{p-43543d18.entry.js.map → p-333237e8.entry.js.map} +0 -0
  310. package/dist/nano-components/{p-1e8321ea.entry.js → p-35108e08.entry.js} +2 -2
  311. package/dist/nano-components/{p-1e8321ea.entry.js.map → p-35108e08.entry.js.map} +0 -0
  312. package/dist/nano-components/{p-a898bf92.system.entry.js → p-379e21d9.system.entry.js} +2 -2
  313. package/dist/nano-components/{p-a898bf92.system.entry.js.map → p-379e21d9.system.entry.js.map} +0 -0
  314. package/dist/nano-components/{p-3ad1d5aa.system.entry.js → p-39d36fd1.system.entry.js} +2 -2
  315. package/dist/nano-components/{p-3ad1d5aa.system.entry.js.map → p-39d36fd1.system.entry.js.map} +0 -0
  316. package/dist/nano-components/{p-41a2e2e4.system.js → p-3a00de47.system.js} +2 -2
  317. package/dist/nano-components/{p-41a2e2e4.system.js.map → p-3a00de47.system.js.map} +0 -0
  318. package/dist/nano-components/{p-6afdb510.system.entry.js → p-3ccb176c.system.entry.js} +2 -2
  319. package/dist/nano-components/{p-6afdb510.system.entry.js.map → p-3ccb176c.system.entry.js.map} +0 -0
  320. package/dist/nano-components/{p-08b43111.entry.js → p-3e930ac7.entry.js} +2 -2
  321. package/dist/nano-components/{p-08b43111.entry.js.map → p-3e930ac7.entry.js.map} +0 -0
  322. package/dist/nano-components/{p-d8d8bac6.system.entry.js → p-42cebbfe.system.entry.js} +2 -2
  323. package/dist/nano-components/{p-d8d8bac6.system.entry.js.map → p-42cebbfe.system.entry.js.map} +0 -0
  324. package/dist/nano-components/{p-3ef30ded.system.entry.js → p-48874481.system.entry.js} +2 -2
  325. package/dist/nano-components/{p-3ef30ded.system.entry.js.map → p-48874481.system.entry.js.map} +0 -0
  326. package/dist/nano-components/{p-08ffc9a1.entry.js → p-4e2c0abb.entry.js} +2 -2
  327. package/dist/nano-components/{p-08ffc9a1.entry.js.map → p-4e2c0abb.entry.js.map} +0 -0
  328. package/dist/nano-components/{p-090f22a9.system.entry.js → p-5100ae70.system.entry.js} +2 -2
  329. package/dist/nano-components/{p-090f22a9.system.entry.js.map → p-5100ae70.system.entry.js.map} +0 -0
  330. package/dist/nano-components/{p-593de29b.system.entry.js → p-52769304.system.entry.js} +2 -2
  331. package/dist/nano-components/{p-593de29b.system.entry.js.map → p-52769304.system.entry.js.map} +0 -0
  332. package/dist/nano-components/{p-8278c5d2.system.entry.js → p-56f86047.system.entry.js} +2 -2
  333. package/dist/nano-components/{p-8278c5d2.system.entry.js.map → p-56f86047.system.entry.js.map} +0 -0
  334. package/dist/nano-components/{p-2057d480.system.entry.js → p-5b66bb8f.system.entry.js} +2 -2
  335. package/dist/nano-components/{p-2057d480.system.entry.js.map → p-5b66bb8f.system.entry.js.map} +0 -0
  336. package/dist/nano-components/{p-033296c7.system.entry.js → p-5d17cfbb.system.entry.js} +2 -2
  337. package/dist/nano-components/{p-033296c7.system.entry.js.map → p-5d17cfbb.system.entry.js.map} +0 -0
  338. package/dist/nano-components/{p-88f17c86.system.entry.js → p-5d5ea4ab.system.entry.js} +2 -2
  339. package/dist/nano-components/{p-88f17c86.system.entry.js.map → p-5d5ea4ab.system.entry.js.map} +0 -0
  340. package/dist/nano-components/p-6722447c.entry.js +5 -0
  341. package/dist/nano-components/p-6722447c.entry.js.map +1 -0
  342. package/dist/nano-components/{p-20387cde.system.entry.js → p-6b4dd158.system.entry.js} +2 -2
  343. package/dist/nano-components/{p-20387cde.system.entry.js.map → p-6b4dd158.system.entry.js.map} +0 -0
  344. package/dist/nano-components/{p-d24811c8.system.js → p-6b5760b1.system.js} +3 -3
  345. package/dist/nano-components/{p-d24811c8.system.js.map → p-6b5760b1.system.js.map} +1 -1
  346. package/dist/nano-components/p-6d138abf.entry.js +5 -0
  347. package/dist/nano-components/p-6d138abf.entry.js.map +1 -0
  348. package/dist/nano-components/{p-5066e563.system.entry.js → p-6dad332b.system.entry.js} +2 -2
  349. package/dist/nano-components/{p-5066e563.system.entry.js.map → p-6dad332b.system.entry.js.map} +0 -0
  350. package/dist/nano-components/{p-730f60ea.entry.js → p-6ddb51e4.entry.js} +2 -2
  351. package/dist/nano-components/p-6ddb51e4.entry.js.map +1 -0
  352. package/dist/nano-components/p-71e9fa33.js +5 -0
  353. package/dist/nano-components/p-71e9fa33.js.map +1 -0
  354. package/dist/nano-components/{p-313970ff.entry.js → p-73985eda.entry.js} +2 -2
  355. package/dist/nano-components/{p-313970ff.entry.js.map → p-73985eda.entry.js.map} +0 -0
  356. package/dist/nano-components/{p-58d7f10f.entry.js → p-76c903db.entry.js} +2 -2
  357. package/dist/nano-components/{p-58d7f10f.entry.js.map → p-76c903db.entry.js.map} +0 -0
  358. package/dist/nano-components/{p-3aa1d07d.entry.js → p-76d9d1d4.entry.js} +2 -2
  359. package/dist/nano-components/p-76d9d1d4.entry.js.map +1 -0
  360. package/dist/nano-components/{p-f53989c3.system.entry.js → p-7aa7425d.system.entry.js} +2 -2
  361. package/dist/nano-components/{p-f53989c3.system.entry.js.map → p-7aa7425d.system.entry.js.map} +1 -1
  362. package/dist/nano-components/{p-531d5275.system.entry.js → p-7ad4a27a.system.entry.js} +2 -2
  363. package/dist/nano-components/p-7ad4a27a.system.entry.js.map +1 -0
  364. package/dist/nano-components/{p-2ae4918d.system.entry.js → p-7e55b214.system.entry.js} +2 -2
  365. package/dist/nano-components/{p-2ae4918d.system.entry.js.map → p-7e55b214.system.entry.js.map} +0 -0
  366. package/dist/nano-components/{p-62ecd3a1.system.entry.js → p-7f1374b6.system.entry.js} +2 -2
  367. package/dist/nano-components/{p-62ecd3a1.system.entry.js.map → p-7f1374b6.system.entry.js.map} +0 -0
  368. package/dist/nano-components/{p-1e974cad.entry.js → p-7fe9d769.entry.js} +2 -2
  369. package/dist/nano-components/{p-1e974cad.entry.js.map → p-7fe9d769.entry.js.map} +0 -0
  370. package/dist/nano-components/p-85c8b070.system.entry.js +5 -0
  371. package/dist/nano-components/p-85c8b070.system.entry.js.map +1 -0
  372. package/dist/nano-components/p-866f083f.system.entry.js +5 -0
  373. package/dist/nano-components/p-866f083f.system.entry.js.map +1 -0
  374. package/dist/nano-components/p-86bd5194.entry.js +5 -0
  375. package/dist/nano-components/p-86bd5194.entry.js.map +1 -0
  376. package/dist/nano-components/{p-f2e7d2f9.system.entry.js → p-88779174.system.entry.js} +2 -2
  377. package/dist/nano-components/{p-f2e7d2f9.system.entry.js.map → p-88779174.system.entry.js.map} +0 -0
  378. package/dist/nano-components/{p-4535e3bb.entry.js → p-8b6fcd6d.entry.js} +2 -2
  379. package/dist/nano-components/{p-4535e3bb.entry.js.map → p-8b6fcd6d.entry.js.map} +0 -0
  380. package/dist/nano-components/{p-6ade3290.entry.js → p-8eb4f24a.entry.js} +2 -2
  381. package/dist/nano-components/{p-6ade3290.entry.js.map → p-8eb4f24a.entry.js.map} +0 -0
  382. package/dist/nano-components/{p-07bdf44d.entry.js → p-8fe2f846.entry.js} +2 -2
  383. package/dist/nano-components/{p-07bdf44d.entry.js.map → p-8fe2f846.entry.js.map} +0 -0
  384. package/dist/nano-components/p-96d9b8b9.system.entry.js +5 -0
  385. package/dist/nano-components/p-96d9b8b9.system.entry.js.map +1 -0
  386. package/dist/nano-components/{p-bcd69559.entry.js → p-97b13ad2.entry.js} +2 -2
  387. package/dist/nano-components/{p-bcd69559.entry.js.map → p-97b13ad2.entry.js.map} +0 -0
  388. package/dist/nano-components/{p-c9c1a345.system.entry.js → p-a02cc654.system.entry.js} +2 -2
  389. package/dist/nano-components/{p-c9c1a345.system.entry.js.map → p-a02cc654.system.entry.js.map} +0 -0
  390. package/dist/nano-components/{p-a77e3fbb.js → p-a0b93616.js} +3 -3
  391. package/dist/nano-components/{p-a77e3fbb.js.map → p-a0b93616.js.map} +1 -1
  392. package/dist/nano-components/p-a4969844.entry.js +5 -0
  393. package/dist/nano-components/p-a4969844.entry.js.map +1 -0
  394. package/dist/nano-components/{p-70dec19f.entry.js → p-a6327a9a.entry.js} +2 -2
  395. package/dist/nano-components/{p-70dec19f.entry.js.map → p-a6327a9a.entry.js.map} +0 -0
  396. package/dist/nano-components/{p-a315ed2c.entry.js → p-a9a4fc3e.entry.js} +2 -2
  397. package/dist/nano-components/{p-a315ed2c.entry.js.map → p-a9a4fc3e.entry.js.map} +1 -1
  398. package/dist/nano-components/{p-98222c39.system.entry.js → p-ab07c1fa.system.entry.js} +2 -2
  399. package/dist/nano-components/{p-98222c39.system.entry.js.map → p-ab07c1fa.system.entry.js.map} +0 -0
  400. package/dist/nano-components/{p-ab5813a7.js → p-b5c33aff.js} +2 -2
  401. package/dist/nano-components/{p-ab5813a7.js.map → p-b5c33aff.js.map} +0 -0
  402. package/dist/nano-components/p-bc394857.system.entry.js +5 -0
  403. package/dist/nano-components/p-bc394857.system.entry.js.map +1 -0
  404. package/dist/nano-components/{p-b4f8e541.entry.js → p-bce998f2.entry.js} +2 -2
  405. package/dist/nano-components/{p-b4f8e541.entry.js.map → p-bce998f2.entry.js.map} +0 -0
  406. package/dist/nano-components/{p-92f85aaf.system.entry.js → p-bf9aa89d.system.entry.js} +2 -2
  407. package/dist/nano-components/{p-92f85aaf.system.entry.js.map → p-bf9aa89d.system.entry.js.map} +0 -0
  408. package/dist/nano-components/p-c070ffd3.system.entry.js +5 -0
  409. package/dist/nano-components/p-c070ffd3.system.entry.js.map +1 -0
  410. package/dist/nano-components/p-c3830c43.entry.js +5 -0
  411. package/dist/nano-components/p-c3830c43.entry.js.map +1 -0
  412. package/dist/nano-components/{p-50514e5e.entry.js → p-c4156fea.entry.js} +2 -2
  413. package/dist/nano-components/{p-50514e5e.entry.js.map → p-c4156fea.entry.js.map} +0 -0
  414. package/dist/nano-components/p-d01bd3c3.system.js +5 -0
  415. package/dist/nano-components/p-d01bd3c3.system.js.map +1 -0
  416. package/dist/nano-components/{p-1238f0fc.system.entry.js → p-d0385948.system.entry.js} +2 -2
  417. package/dist/nano-components/{p-1238f0fc.system.entry.js.map → p-d0385948.system.entry.js.map} +0 -0
  418. package/dist/nano-components/{p-b59d2bd5.entry.js → p-d122b1ff.entry.js} +2 -2
  419. package/dist/nano-components/{p-b59d2bd5.entry.js.map → p-d122b1ff.entry.js.map} +0 -0
  420. package/dist/nano-components/{p-394c3c19.entry.js → p-defd4552.entry.js} +2 -2
  421. package/dist/nano-components/{p-394c3c19.entry.js.map → p-defd4552.entry.js.map} +0 -0
  422. package/dist/nano-components/p-e7140887.system.js +5 -0
  423. package/dist/nano-components/p-e7140887.system.js.map +1 -0
  424. package/dist/nano-components/{p-69439aa1.system.entry.js → p-e817ab4a.system.entry.js} +2 -2
  425. package/dist/nano-components/{p-69439aa1.system.entry.js.map → p-e817ab4a.system.entry.js.map} +0 -0
  426. package/dist/nano-components/{p-22884654.system.entry.js → p-eacf5b5b.system.entry.js} +2 -2
  427. package/dist/nano-components/{p-22884654.system.entry.js.map → p-eacf5b5b.system.entry.js.map} +0 -0
  428. package/dist/nano-components/p-ed336501.entry.js +5 -0
  429. package/dist/nano-components/p-ed336501.entry.js.map +1 -0
  430. package/dist/nano-components/{p-5ae80fd7.js → p-ef7f1e9c.js} +2 -2
  431. package/dist/nano-components/{p-5ae80fd7.js.map → p-ef7f1e9c.js.map} +0 -0
  432. package/dist/nano-components/{p-59b3d24b.system.js → p-f48be9f5.system.js} +2 -2
  433. package/dist/nano-components/{p-59b3d24b.system.js.map → p-f48be9f5.system.js.map} +0 -0
  434. package/dist/nano-components/p-f710c763.system.entry.js +5 -0
  435. package/dist/nano-components/p-f710c763.system.entry.js.map +1 -0
  436. package/dist/nano-components/p-f780d2f6.system.entry.js +5 -0
  437. package/dist/nano-components/p-f780d2f6.system.entry.js.map +1 -0
  438. package/dist/nano-components/{p-65c10b3f.entry.js → p-fbe3c89e.entry.js} +2 -2
  439. package/dist/nano-components/{p-65c10b3f.entry.js.map → p-fbe3c89e.entry.js.map} +0 -0
  440. package/dist/nano-components/{p-ba13bb56.entry.js → p-ffc2063a.entry.js} +2 -2
  441. package/dist/nano-components/{p-ba13bb56.entry.js.map → p-ffc2063a.entry.js.map} +0 -0
  442. package/dist/nano-components/{p-4870e76d.system.entry.js → p-fff27907.system.entry.js} +2 -2
  443. package/dist/nano-components/{p-4870e76d.system.entry.js.map → p-fff27907.system.entry.js.map} +0 -0
  444. package/dist/types/components/checkbox/checkbox-group.d.ts +12 -1
  445. package/dist/types/components/checkbox/checkbox.d.ts +11 -3
  446. package/dist/types/components/date-input/date-input.d.ts +4 -0
  447. package/dist/types/components/dialog/dialog.d.ts +4 -1
  448. package/dist/types/components/field-validator/field-validator.d.ts +125 -0
  449. package/dist/types/components/file-upload/file-upload.d.ts +8 -0
  450. package/dist/types/components/form-control/form-control.d.ts +2 -0
  451. package/dist/types/components/icon/icon.d.ts +1 -1
  452. package/dist/types/components/input/input.d.ts +9 -1
  453. package/dist/types/components/resize-observe/resize-observe.d.ts +0 -1
  454. package/dist/types/components/select/select.d.ts +12 -2
  455. package/dist/types/components/{sticky → sticker}/sticker.d.ts +0 -0
  456. package/dist/types/components.d.ts +187 -4
  457. package/dist/types/utils/store/get-set.d.ts +1 -1
  458. package/docs-json.json +454 -16
  459. package/docs-vscode.json +78 -2
  460. package/package.json +3 -2
  461. package/dist/cjs/component-store-722032a5.js.map +0 -1
  462. package/dist/cjs/form-control-8f530f7d.js.map +0 -1
  463. package/dist/collection/components/sticky/sticker.js.map +0 -1
  464. package/dist/esm/component-store-b6fbfa35.js.map +0 -1
  465. package/dist/esm/form-control-c52b6256.js.map +0 -1
  466. package/dist/esm-es5/component-store-b6fbfa35.js +0 -5
  467. package/dist/esm-es5/component-store-b6fbfa35.js.map +0 -1
  468. package/dist/esm-es5/form-control-c52b6256.js +0 -5
  469. package/dist/esm-es5/form-control-c52b6256.js.map +0 -1
  470. package/dist/nano-components/p-0618fac6.system.entry.js +0 -5
  471. package/dist/nano-components/p-0618fac6.system.entry.js.map +0 -1
  472. package/dist/nano-components/p-096682d9.system.js +0 -5
  473. package/dist/nano-components/p-096682d9.system.js.map +0 -1
  474. package/dist/nano-components/p-09e38c5f.system.entry.js +0 -5
  475. package/dist/nano-components/p-09e38c5f.system.entry.js.map +0 -1
  476. package/dist/nano-components/p-10a6216d.system.entry.js +0 -5
  477. package/dist/nano-components/p-10a6216d.system.entry.js.map +0 -1
  478. package/dist/nano-components/p-173bae15.system.entry.js +0 -5
  479. package/dist/nano-components/p-173bae15.system.entry.js.map +0 -1
  480. package/dist/nano-components/p-18176c26.system.entry.js +0 -5
  481. package/dist/nano-components/p-18176c26.system.entry.js.map +0 -1
  482. package/dist/nano-components/p-3aa1d07d.entry.js.map +0 -1
  483. package/dist/nano-components/p-4265cf95.system.entry.js +0 -5
  484. package/dist/nano-components/p-4265cf95.system.entry.js.map +0 -1
  485. package/dist/nano-components/p-457d4893.entry.js +0 -5
  486. package/dist/nano-components/p-457d4893.entry.js.map +0 -1
  487. package/dist/nano-components/p-4ee978ff.entry.js +0 -5
  488. package/dist/nano-components/p-4ee978ff.entry.js.map +0 -1
  489. package/dist/nano-components/p-531d5275.system.entry.js.map +0 -1
  490. package/dist/nano-components/p-5653961d.system.entry.js.map +0 -1
  491. package/dist/nano-components/p-5a0095f9.js +0 -5
  492. package/dist/nano-components/p-5a0095f9.js.map +0 -1
  493. package/dist/nano-components/p-5a315696.entry.js +0 -5
  494. package/dist/nano-components/p-5a315696.entry.js.map +0 -1
  495. package/dist/nano-components/p-5e7c7d3d.entry.js +0 -5
  496. package/dist/nano-components/p-5e7c7d3d.entry.js.map +0 -1
  497. package/dist/nano-components/p-730f60ea.entry.js.map +0 -1
  498. package/dist/nano-components/p-802e1416.system.entry.js +0 -5
  499. package/dist/nano-components/p-802e1416.system.entry.js.map +0 -1
  500. package/dist/nano-components/p-829d7f05.system.entry.js +0 -5
  501. package/dist/nano-components/p-829d7f05.system.entry.js.map +0 -1
  502. package/dist/nano-components/p-9d35768b.entry.js +0 -5
  503. package/dist/nano-components/p-9d35768b.entry.js.map +0 -1
  504. package/dist/nano-components/p-aaef7cc7.js +0 -5
  505. package/dist/nano-components/p-aaef7cc7.js.map +0 -1
  506. package/dist/nano-components/p-af7abf5e.entry.js +0 -5
  507. package/dist/nano-components/p-af7abf5e.entry.js.map +0 -1
  508. package/dist/nano-components/p-df0897ec.system.js +0 -5
  509. package/dist/nano-components/p-df0897ec.system.js.map +0 -1
  510. package/dist/nano-components/p-e1f46998.system.js +0 -5
  511. package/dist/nano-components/p-e1f46998.system.js.map +0 -1
  512. package/dist/nano-components/p-e7c69d4f.entry.js +0 -5
  513. package/dist/nano-components/p-e7c69d4f.entry.js.map +0 -1
  514. package/dist/nano-components/p-f79c3ea0.entry.js +0 -5
  515. package/dist/nano-components/p-f79c3ea0.entry.js.map +0 -1
@@ -13,7 +13,6 @@ import { debounce, getClassMap } from '../../utils';
13
13
  export class CheckboxGroup {
14
14
  constructor() {
15
15
  this.grpId = `nano-checkbox-group-${grpIds++}`;
16
- this._invalid = false;
17
16
  this.errorMessage = '';
18
17
  this.showErrorMsg = false;
19
18
  this.hasHelperSlot = false;
@@ -21,7 +20,7 @@ export class CheckboxGroup {
21
20
  /**
22
21
  * When should the field perform validation
23
22
  */
24
- this.validateOn = 'submit';
23
+ this.validateOn = 'submitThenDirty';
25
24
  /**
26
25
  * Whether to show validation errors underneath input
27
26
  */
@@ -44,6 +43,7 @@ export class CheckboxGroup {
44
43
  * A common label for children controls
45
44
  */
46
45
  this.legend = '';
46
+ this._invalid = false;
47
47
  this.handleInvalid = (ev) => {
48
48
  this._invalid = true;
49
49
  if (this.validateOn === 'submit') {
@@ -51,7 +51,7 @@ export class CheckboxGroup {
51
51
  }
52
52
  if (!!this.showInlineError)
53
53
  ev.preventDefault();
54
- setTimeout((_) => this.showInlineValidation(ev), 20);
54
+ this.showInlineValidation(ev);
55
55
  };
56
56
  this.showInlineValidation = (ev) => {
57
57
  if (!this.nativeCbs || !this.nativeCbs.length)
@@ -60,14 +60,11 @@ export class CheckboxGroup {
60
60
  this.validateOn = 'dirty';
61
61
  this.showErrorMsg = false;
62
62
  this._invalid = false;
63
- this.nativeCbs.forEach((cb, i) => {
63
+ this.nativeCbs.forEach((cb, _i) => {
64
64
  if (!cb.validity.valid) {
65
65
  this.errorMessage = cb.validationMessage;
66
66
  this.showErrorMsg = true;
67
67
  this._invalid = true;
68
- if (!!this.showInlineError) {
69
- this.checkboxes[i].setFocus();
70
- }
71
68
  }
72
69
  });
73
70
  this.nanoValidate.emit({
@@ -84,6 +81,12 @@ export class CheckboxGroup {
84
81
  get invalid() {
85
82
  return this._invalid;
86
83
  }
84
+ /**
85
+ * Current validation message - if any. @readonly
86
+ */
87
+ get validityMessage() {
88
+ return this.errorMessage;
89
+ }
87
90
  // Public methods
88
91
  /**
89
92
  * Get the current state of the control.
@@ -92,16 +95,37 @@ export class CheckboxGroup {
92
95
  */
93
96
  async reportValidity(validateFirst) {
94
97
  return new Promise((resolve) => {
95
- if (validateFirst)
98
+ if (validateFirst) {
99
+ this.customValidate();
96
100
  this.showInlineValidation();
101
+ }
97
102
  setTimeout(() => {
98
103
  resolve({
99
104
  isValid: !this.invalid,
100
105
  errorMessage: this.errorMessage,
101
106
  });
102
- }, 20);
107
+ }, 50);
103
108
  });
104
109
  }
110
+ /**
111
+ * Invalidate the field and show a custom error message.
112
+ * To clear the error you will need to re-call this method with an empty string.
113
+ * @param message - the error message to show
114
+ * @param optVal - optionally supply an option value to target which checkbox to show invalidate against (default is the first)
115
+ */
116
+ async showError(message, optVal) {
117
+ let cb;
118
+ if (optVal)
119
+ cb = this.checkboxes.find((c) => c.value === optVal);
120
+ if (!cb)
121
+ cb = this.checkboxes[0];
122
+ if (!cb)
123
+ return;
124
+ this.errorMessage = message;
125
+ await cb.setError(message);
126
+ if (!!this.showInlineError)
127
+ this.showInlineValidation();
128
+ }
105
129
  // listeners & watchers
106
130
  /**
107
131
  * Notes on validation... custom validation messages should be set
@@ -119,23 +143,36 @@ export class CheckboxGroup {
119
143
  customValidate() {
120
144
  if (!this.nativeCbs || !this.nativeCbs.length || !this.checkboxes)
121
145
  return;
146
+ let onlyRadios = this.nativeCbs.filter((cb) => cb.type === 'radio');
147
+ if (onlyRadios &&
148
+ onlyRadios.length &&
149
+ (this.showErrorMsg || this.validateOn === 'dirty')) {
150
+ let required = onlyRadios.find((cb) => cb.required);
151
+ let checked = onlyRadios.filter((cb) => cb.checked);
152
+ if (required && checked) {
153
+ this.checkboxes.forEach((rd) => rd.reportValidity(false));
154
+ return false;
155
+ }
156
+ else if (required && !checked)
157
+ return true;
158
+ }
122
159
  // we only care about checkbox controls.
123
160
  let onlyCbs = this.nativeCbs.filter((cb) => cb.type === 'checkbox');
124
161
  if (!onlyCbs || !onlyCbs.length)
125
162
  return;
126
- let checked = onlyCbs.filter((cb) => cb.checked).length;
163
+ let checked = onlyCbs.filter((cb) => cb.checked);
164
+ let required = onlyCbs.find((cb) => cb.required);
127
165
  let invalid = false;
166
+ if (required && !checked.find((cb) => cb === required))
167
+ return true;
128
168
  this.checkboxes.forEach((cb) => {
129
- if (cb.required && !cb.checked) {
130
- invalid = true;
131
- }
132
169
  cb.setError('');
133
- if (this.min && checked < this.min) {
134
- cb.setError(`You must select a minimum of ${this.min} values.`);
170
+ if (this.min && checked.length < this.min) {
171
+ cb.setError(`You must select a minimum of ${this.min} values.`, this.showErrorMsg);
135
172
  invalid = true;
136
173
  }
137
- if (this.max && checked > this.max) {
138
- cb.setError(`Only up to ${this.max} values are allowed.`);
174
+ if (this.max && checked.length > this.max) {
175
+ cb.setError(`Only up to ${this.max} values are allowed.`, this.showErrorMsg);
139
176
  invalid = true;
140
177
  }
141
178
  });
@@ -151,6 +188,8 @@ export class CheckboxGroup {
151
188
  }
152
189
  // private methods
153
190
  attachSlotObserver() {
191
+ if (!!this.mo)
192
+ return;
154
193
  const mo = (this.mo = new MutationObserver(() => this.handleSlotChange()));
155
194
  mo.observe(this.host, { childList: true });
156
195
  }
@@ -166,7 +205,7 @@ export class CheckboxGroup {
166
205
  }
167
206
  // stencil hooks
168
207
  componentWillLoad() {
169
- this.showInlineValidation = debounce(this.showInlineValidation, 20);
208
+ this.showInlineValidation = debounce(this.showInlineValidation, 50);
170
209
  this.customValidate = this.customValidate.bind(this);
171
210
  this.handleDisabledChange();
172
211
  }
@@ -221,7 +260,7 @@ export class CheckboxGroup {
221
260
  "setter": false,
222
261
  "attribute": "validate-on",
223
262
  "reflect": false,
224
- "defaultValue": "'submit'"
263
+ "defaultValue": "'submitThenDirty'"
225
264
  },
226
265
  "showInlineError": {
227
266
  "type": "boolean",
@@ -342,6 +381,26 @@ export class CheckboxGroup {
342
381
  "attribute": "invalid",
343
382
  "reflect": true,
344
383
  "defaultValue": "false"
384
+ },
385
+ "validityMessage": {
386
+ "type": "string",
387
+ "mutable": false,
388
+ "complexType": {
389
+ "original": "string",
390
+ "resolved": "string",
391
+ "references": {}
392
+ },
393
+ "required": false,
394
+ "optional": false,
395
+ "docs": {
396
+ "tags": [],
397
+ "text": "Current validation message - if any. @readonly"
398
+ },
399
+ "getter": true,
400
+ "setter": false,
401
+ "attribute": "validity-message",
402
+ "reflect": false,
403
+ "defaultValue": "''"
345
404
  }
346
405
  }; }
347
406
  static get states() { return {
@@ -349,7 +408,8 @@ export class CheckboxGroup {
349
408
  "nativeCbs": {},
350
409
  "errorMessage": {},
351
410
  "showErrorMsg": {},
352
- "hasHelperSlot": {}
411
+ "hasHelperSlot": {},
412
+ "_invalid": {}
353
413
  }; }
354
414
  static get events() { return [{
355
415
  "method": "nanoValidate",
@@ -370,7 +430,7 @@ export class CheckboxGroup {
370
430
  "references": {
371
431
  "ControlValidityEventDetail": {
372
432
  "location": "import",
373
- "path": "/builds/RxH386Vg/0/Digital/nano-components/packages/components/src/interface.d.ts"
433
+ "path": "/builds/oyGwf-FZ/0/Digital/nano-components/packages/components/src/interface.d.ts"
374
434
  }
375
435
  }
376
436
  }
@@ -392,7 +452,7 @@ export class CheckboxGroup {
392
452
  },
393
453
  "ControlValidity": {
394
454
  "location": "import",
395
- "path": "/builds/RxH386Vg/0/Digital/nano-components/packages/components/src/interface.d.ts"
455
+ "path": "/builds/oyGwf-FZ/0/Digital/nano-components/packages/components/src/interface.d.ts"
396
456
  }
397
457
  },
398
458
  "return": "Promise<ControlValidity>"
@@ -407,13 +467,47 @@ export class CheckboxGroup {
407
467
  "text": "`{ isValid: boolean, errorMessage: string }`"
408
468
  }]
409
469
  }
470
+ },
471
+ "showError": {
472
+ "complexType": {
473
+ "signature": "(message: string, optVal?: string) => Promise<void>",
474
+ "parameters": [{
475
+ "tags": [{
476
+ "name": "param",
477
+ "text": "message - the error message to show"
478
+ }],
479
+ "text": "- the error message to show"
480
+ }, {
481
+ "tags": [{
482
+ "name": "param",
483
+ "text": "optVal - optionally supply an option value to target which checkbox to show invalidate against (default is the first)"
484
+ }],
485
+ "text": "- optionally supply an option value to target which checkbox to show invalidate against (default is the first)"
486
+ }],
487
+ "references": {
488
+ "Promise": {
489
+ "location": "global"
490
+ },
491
+ "HTMLNanoCheckboxElement": {
492
+ "location": "global"
493
+ }
494
+ },
495
+ "return": "Promise<void>"
496
+ },
497
+ "docs": {
498
+ "text": "Invalidate the field and show a custom error message.\nTo clear the error you will need to re-call this method with an empty string.",
499
+ "tags": [{
500
+ "name": "param",
501
+ "text": "message - the error message to show"
502
+ }, {
503
+ "name": "param",
504
+ "text": "optVal - optionally supply an option value to target which checkbox to show invalidate against (default is the first)"
505
+ }]
506
+ }
410
507
  }
411
508
  }; }
412
509
  static get elementRef() { return "host"; }
413
510
  static get watchers() { return [{
414
- "propName": "validateOn",
415
- "methodName": "handleCbChange"
416
- }, {
417
511
  "propName": "min",
418
512
  "methodName": "handleCbChange"
419
513
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox-group.js","sourceRoot":"","sources":["../../../src/components/checkbox/checkbox-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Prop,\n Element,\n h,\n ComponentInterface,\n State,\n Listen,\n Watch,\n Host,\n Method,\n forceUpdate,\n Event,\n EventEmitter,\n} from '@stencil/core';\nimport {\n CssClassMap,\n ControlValidityEventDetail,\n ControlValidity,\n} from '../../interface';\nimport { debounce, getClassMap } from '../../utils';\n\n/**\n * `nano-checkbox-group` is an optional wrapper for all `nano-checkbox` controls.\n * It provides a convenient place to anchor a collective label and any validation issues.\n *\n * @slot - Used for grouping checkboxes inside the group wrapper\n * @slot helper - helper text to accompany the form field underneath.\n */\n@Component({\n tag: 'nano-checkbox-group',\n styleUrl: 'checkbox-group.scss',\n scoped: true,\n})\nexport class CheckboxGroup implements ComponentInterface {\n private mo?: MutationObserver;\n private checkboxTypes: CssClassMap;\n private grpId = `nano-checkbox-group-${grpIds++}`;\n private _invalid = false;\n\n @Element() host: HTMLNanoCheckboxGroupElement;\n\n // internal state\n\n @State() checkboxes: HTMLNanoCheckboxElement[];\n @State() nativeCbs: HTMLInputElement[];\n @State() errorMessage: string = '';\n @State() showErrorMsg = false;\n @State() hasHelperSlot = false;\n\n // public properties\n\n /**\n * When should the field perform validation\n */\n @Prop({ mutable: true }) validateOn?: 'dirty' | 'submit' | 'submitThenDirty' =\n 'submit';\n\n /**\n * Whether to show validation errors underneath input\n */\n @Prop() showInlineError = true;\n\n /**\n * The minimum number of checkboxes required to be valid. Only relevant for checkbox type controls.\n * A validation error will be thrown if not enough controls are checked.\n */\n @Prop() min: number = 0;\n\n /**\n * The maximum number of checkboxes allowed. Only relevant for checkbox type controls.\n * Other controls will automatically be disabled upon reaching this number.\n */\n @Prop() max: number = null;\n\n /**\n * Disable all the nested form controls\n */\n @Prop({ reflect: true }) disabled: boolean | null = null;\n\n /**\n * A common label for children controls\n */\n @Prop() legend: string = '';\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n return this._invalid;\n }\n\n // Public methods\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `{ isValid: boolean, errorMessage: string }`\n */\n @Method()\n async reportValidity(validateFirst: boolean): Promise<ControlValidity> {\n return new Promise((resolve) => {\n if (validateFirst) this.showInlineValidation();\n setTimeout(() => {\n resolve({\n isValid: !this.invalid,\n errorMessage: this.errorMessage,\n });\n }, 20);\n });\n }\n\n // Events\n\n /**\n * Called when validation is performed (which depends on `validateOn`).\n * @returns event.detail: `{ isValid: boolean, errorMessage: string, originalEvent: Event }`.\n */\n @Event() nanoValidate: EventEmitter<ControlValidityEventDetail>;\n\n // listeners & watchers\n\n /**\n * Notes on validation... custom validation messages should be set\n * no matter whether we show inline messages or native html5.\n * this will mean forms cannot submit when there are pending validation issues.\n */\n @Listen('nanoChange')\n @Watch('validateOn')\n @Watch('min')\n @Watch('max')\n handleCbChange() {\n if (this.invalid) this.showErrorMsg = this._invalid = false;\n this.customValidate();\n\n if (this.validateOn !== 'dirty') return;\n this.showInlineValidation();\n }\n\n @Watch('nativeCbs')\n customValidate() {\n if (!this.nativeCbs || !this.nativeCbs.length || !this.checkboxes) return;\n\n // we only care about checkbox controls.\n let onlyCbs = this.nativeCbs.filter((cb) => cb.type === 'checkbox');\n if (!onlyCbs || !onlyCbs.length) return;\n\n let checked = onlyCbs.filter((cb) => cb.checked).length;\n let invalid = false;\n\n this.checkboxes.forEach((cb) => {\n if (cb.required && !cb.checked) {\n invalid = true;\n }\n\n cb.setError('');\n\n if (this.min && checked < this.min) {\n cb.setError(`You must select a minimum of ${this.min} values.`);\n invalid = true;\n }\n if (this.max && checked > this.max) {\n cb.setError(`Only up to ${this.max} values are allowed.`);\n invalid = true;\n }\n });\n return invalid;\n }\n\n @Watch('checkboxes')\n handleComponentChange() {\n this.checkboxTypes = getClassMap(\n this.checkboxes.map((cb) => 'types-' + cb.type)\n );\n }\n\n @Watch('disabled')\n @Watch('checkboxes')\n handleDisabledChange() {\n if (this.disabled === null) return;\n this.checkboxes.map((cb) => (cb.disabled = this.disabled));\n }\n\n // private methods\n\n private attachSlotObserver() {\n const mo = (this.mo = new MutationObserver(() => this.handleSlotChange()));\n mo.observe(this.host, { childList: true });\n }\n\n private async handleSlotChange() {\n forceUpdate(this.host);\n this.checkboxes = Array.from(this.host.querySelectorAll('nano-checkbox'));\n this.hasHelperSlot = !!this.host.querySelector('[slot=\"helper\"]');\n\n this.nativeCbs = await Promise.all(\n this.checkboxes.reduce((acc: Array<Promise<HTMLInputElement>>, cb) => {\n acc.push(cb.getInputElement());\n return acc;\n }, [])\n );\n\n this.nativeCbs.forEach((cb) =>\n cb.addEventListener('invalid', this.handleInvalid)\n );\n }\n\n private handleInvalid = (ev: Event) => {\n this._invalid = true;\n\n if (this.validateOn === 'submit') {\n this._invalid = this.showErrorMsg = this.customValidate();\n }\n if (!!this.showInlineError) ev.preventDefault();\n\n setTimeout((_) => this.showInlineValidation(ev), 20);\n };\n\n private showInlineValidation = (ev?: Event) => {\n if (!this.nativeCbs || !this.nativeCbs.length) return;\n if (this.validateOn === 'submitThenDirty') this.validateOn = 'dirty';\n this.showErrorMsg = false;\n this._invalid = false;\n\n this.nativeCbs.forEach((cb, i) => {\n if (!cb.validity.valid) {\n this.errorMessage = cb.validationMessage;\n this.showErrorMsg = true;\n this._invalid = true;\n if (!!this.showInlineError) {\n this.checkboxes[i].setFocus();\n }\n }\n });\n\n this.nanoValidate.emit({\n isValid: !this.invalid,\n errorMessage: this.errorMessage,\n originalEvent: ev,\n });\n };\n\n // stencil hooks\n\n componentWillLoad() {\n this.showInlineValidation = debounce(this.showInlineValidation, 20);\n this.customValidate = this.customValidate.bind(this);\n this.handleDisabledChange();\n }\n\n connectedCallback() {\n this.attachSlotObserver();\n }\n\n disconnectedCallback() {\n if (this.mo) this.mo.disconnect();\n }\n\n componentDidLoad() {\n this.handleComponentChange();\n }\n\n render() {\n let isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n const legendId = this.grpId + '-lbl';\n const moreId =\n this.showInlineError || this.hasHelperSlot ? this.grpId + '-more' : '';\n\n return (\n <Host {...this.checkboxTypes} dir={isRtl ? 'rtl' : null}>\n <fieldset\n disabled={this.disabled}\n class={{ nanogroupcb: true, 'show-error': this.showErrorMsg }}\n >\n <legend class=\"nanogroupcb__legend\" id={legendId}>\n {this.legend}\n </legend>\n <div\n class=\"nanogroupcb__cbs\"\n role=\"group\"\n aria-labelledby={legendId + ' ' + moreId}\n >\n <slot />\n </div>\n {(this.showInlineError || this.hasHelperSlot) && (\n <div class=\"nanogroupcb__more\" id={moreId}>\n {!!this.showInlineError ? (\n <div class=\"nanogroupcb__error\">{this.errorMessage}</div>\n ) : (\n ''\n )}\n <div class=\"nanogroupcb__help\">\n <slot name=\"helper\" />\n </div>\n </div>\n )}\n </fieldset>\n </Host>\n );\n }\n}\n\nlet grpIds = 0;\n"]}
1
+ {"version":3,"file":"checkbox-group.js","sourceRoot":"","sources":["../../../src/components/checkbox/checkbox-group.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Prop,\n Element,\n h,\n ComponentInterface,\n State,\n Listen,\n Watch,\n Host,\n Method,\n forceUpdate,\n Event,\n EventEmitter,\n} from '@stencil/core';\nimport {\n CssClassMap,\n ControlValidityEventDetail,\n ControlValidity,\n} from '../../interface';\nimport { debounce, getClassMap } from '../../utils';\n\n/**\n * `nano-checkbox-group` is an optional wrapper for all `nano-checkbox` controls.\n * It provides a convenient place to anchor a collective label and any validation issues.\n *\n * @slot - Used for grouping checkboxes inside the group wrapper\n * @slot helper - helper text to accompany the form field underneath.\n */\n@Component({\n tag: 'nano-checkbox-group',\n styleUrl: 'checkbox-group.scss',\n scoped: true,\n})\nexport class CheckboxGroup implements ComponentInterface {\n private mo?: MutationObserver;\n private checkboxTypes: CssClassMap;\n private grpId = `nano-checkbox-group-${grpIds++}`;\n\n @Element() host: HTMLNanoCheckboxGroupElement;\n\n // internal state\n\n @State() checkboxes: HTMLNanoCheckboxElement[];\n @State() nativeCbs: HTMLInputElement[];\n @State() errorMessage: string = '';\n @State() showErrorMsg = false;\n @State() hasHelperSlot = false;\n\n // public properties\n\n /**\n * When should the field perform validation\n */\n @Prop({ mutable: true }) validateOn?: 'dirty' | 'submit' | 'submitThenDirty' =\n 'submitThenDirty';\n\n /**\n * Whether to show validation errors underneath input\n */\n @Prop() showInlineError = true;\n\n /**\n * The minimum number of checkboxes required to be valid. Only relevant for checkbox type controls.\n * A validation error will be thrown if not enough controls are checked.\n */\n @Prop() min: number = 0;\n\n /**\n * The maximum number of checkboxes allowed. Only relevant for checkbox type controls.\n * Other controls will automatically be disabled upon reaching this number.\n */\n @Prop() max: number = null;\n\n /**\n * Disable all the nested form controls\n */\n @Prop({ reflect: true }) disabled: boolean | null = null;\n\n /**\n * A common label for children controls\n */\n @Prop() legend: string = '';\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n return this._invalid;\n }\n @State() _invalid = false;\n\n /**\n * Current validation message - if any. @readonly\n */\n @Prop()\n get validityMessage() {\n return this.errorMessage;\n }\n\n // Public methods\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `{ isValid: boolean, errorMessage: string }`\n */\n @Method()\n async reportValidity(validateFirst: boolean): Promise<ControlValidity> {\n return new Promise((resolve) => {\n if (validateFirst) {\n this.customValidate();\n this.showInlineValidation();\n }\n setTimeout(() => {\n resolve({\n isValid: !this.invalid,\n errorMessage: this.errorMessage,\n });\n }, 50);\n });\n }\n\n /**\n * Invalidate the field and show a custom error message.\n * To clear the error you will need to re-call this method with an empty string.\n * @param message - the error message to show\n * @param optVal - optionally supply an option value to target which checkbox to show invalidate against (default is the first)\n */\n @Method()\n async showError(message: string, optVal?: string) {\n let cb: HTMLNanoCheckboxElement;\n if (optVal) cb = this.checkboxes.find((c) => c.value === optVal);\n if (!cb) cb = this.checkboxes[0];\n if (!cb) return;\n\n this.errorMessage = message;\n await cb.setError(message);\n if (!!this.showInlineError) this.showInlineValidation();\n }\n\n // Events\n\n /**\n * Called when validation is performed (which depends on `validateOn`).\n * @returns event.detail: `{ isValid: boolean, errorMessage: string, originalEvent: Event }`.\n */\n @Event() nanoValidate: EventEmitter<ControlValidityEventDetail>;\n\n // listeners & watchers\n\n /**\n * Notes on validation... custom validation messages should be set\n * no matter whether we show inline messages or native html5.\n * this will mean forms cannot submit when there are pending validation issues.\n */\n @Listen('nanoChange')\n @Watch('min')\n @Watch('max')\n handleCbChange() {\n if (this.invalid) this.showErrorMsg = this._invalid = false;\n this.customValidate();\n\n if (this.validateOn !== 'dirty') return;\n this.showInlineValidation();\n }\n\n @Watch('nativeCbs')\n customValidate() {\n if (!this.nativeCbs || !this.nativeCbs.length || !this.checkboxes) return;\n\n let onlyRadios = this.nativeCbs.filter((cb) => cb.type === 'radio');\n\n if (\n onlyRadios &&\n onlyRadios.length &&\n (this.showErrorMsg || this.validateOn === 'dirty')\n ) {\n let required = onlyRadios.find((cb) => cb.required);\n let checked = onlyRadios.filter((cb) => cb.checked);\n\n if (required && checked) {\n this.checkboxes.forEach((rd) => rd.reportValidity(false));\n return false;\n } else if (required && !checked) return true;\n }\n\n // we only care about checkbox controls.\n let onlyCbs = this.nativeCbs.filter((cb) => cb.type === 'checkbox');\n if (!onlyCbs || !onlyCbs.length) return;\n\n let checked = onlyCbs.filter((cb) => cb.checked);\n let required = onlyCbs.find((cb) => cb.required);\n let invalid = false;\n\n if (required && !checked.find((cb) => cb === required)) return true;\n\n this.checkboxes.forEach((cb) => {\n cb.setError('');\n\n if (this.min && checked.length < this.min) {\n cb.setError(\n `You must select a minimum of ${this.min} values.`,\n this.showErrorMsg\n );\n invalid = true;\n }\n if (this.max && checked.length > this.max) {\n cb.setError(\n `Only up to ${this.max} values are allowed.`,\n this.showErrorMsg\n );\n invalid = true;\n }\n });\n return invalid;\n }\n\n @Watch('checkboxes')\n handleComponentChange() {\n this.checkboxTypes = getClassMap(\n this.checkboxes.map((cb) => 'types-' + cb.type)\n );\n }\n\n @Watch('disabled')\n @Watch('checkboxes')\n handleDisabledChange() {\n if (this.disabled === null) return;\n this.checkboxes.map((cb) => (cb.disabled = this.disabled));\n }\n\n // private methods\n\n private attachSlotObserver() {\n if (!!this.mo) return;\n const mo = (this.mo = new MutationObserver(() => this.handleSlotChange()));\n mo.observe(this.host, { childList: true });\n }\n\n private async handleSlotChange() {\n forceUpdate(this.host);\n this.checkboxes = Array.from(this.host.querySelectorAll('nano-checkbox'));\n this.hasHelperSlot = !!this.host.querySelector('[slot=\"helper\"]');\n\n this.nativeCbs = await Promise.all(\n this.checkboxes.reduce((acc: Array<Promise<HTMLInputElement>>, cb) => {\n acc.push(cb.getInputElement());\n return acc;\n }, [])\n );\n\n this.nativeCbs.forEach((cb) =>\n cb.addEventListener('invalid', this.handleInvalid)\n );\n }\n\n private handleInvalid = (ev: Event) => {\n this._invalid = true;\n\n if (this.validateOn === 'submit') {\n this._invalid = this.showErrorMsg = this.customValidate();\n }\n if (!!this.showInlineError) ev.preventDefault();\n\n this.showInlineValidation(ev);\n };\n\n private showInlineValidation = (ev?: Event) => {\n if (!this.nativeCbs || !this.nativeCbs.length) return;\n if (this.validateOn === 'submitThenDirty') this.validateOn = 'dirty';\n this.showErrorMsg = false;\n this._invalid = false;\n\n this.nativeCbs.forEach((cb, _i) => {\n if (!cb.validity.valid) {\n this.errorMessage = cb.validationMessage;\n this.showErrorMsg = true;\n this._invalid = true;\n }\n });\n\n this.nanoValidate.emit({\n isValid: !this.invalid,\n errorMessage: this.errorMessage,\n originalEvent: ev,\n });\n };\n\n // stencil hooks\n\n componentWillLoad() {\n this.showInlineValidation = debounce(this.showInlineValidation, 50);\n this.customValidate = this.customValidate.bind(this);\n this.handleDisabledChange();\n }\n\n connectedCallback() {\n this.attachSlotObserver();\n }\n\n disconnectedCallback() {\n if (this.mo) this.mo.disconnect();\n }\n\n componentDidLoad() {\n this.handleComponentChange();\n }\n\n render() {\n let isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n const legendId = this.grpId + '-lbl';\n const moreId =\n this.showInlineError || this.hasHelperSlot ? this.grpId + '-more' : '';\n\n return (\n <Host {...this.checkboxTypes} dir={isRtl ? 'rtl' : null}>\n <fieldset\n disabled={this.disabled}\n class={{ nanogroupcb: true, 'show-error': this.showErrorMsg }}\n >\n <legend class=\"nanogroupcb__legend\" id={legendId}>\n {this.legend}\n </legend>\n <div\n class=\"nanogroupcb__cbs\"\n role=\"group\"\n aria-labelledby={legendId + ' ' + moreId}\n >\n <slot />\n </div>\n {(this.showInlineError || this.hasHelperSlot) && (\n <div class=\"nanogroupcb__more\" id={moreId}>\n {!!this.showInlineError ? (\n <div class=\"nanogroupcb__error\">{this.errorMessage}</div>\n ) : (\n ''\n )}\n <div class=\"nanogroupcb__help\">\n <slot name=\"helper\" />\n </div>\n </div>\n )}\n </fieldset>\n </Host>\n );\n }\n}\n\nlet grpIds = 0;\n"]}
@@ -34,7 +34,7 @@
34
34
  * @prop --segment-shadow: 0 1px 4px rgba(0,0,0,.2);
35
35
  */
36
36
  --focus-shadow: var(--nano-control-focus-shadow, 0 0 0 0.1875rem var(--nano-control-focus-color, rgba(144, 198, 231, 0.8)));
37
- --invalid-shadow: var(--nano-control-focus-shadow, 0 0 0 0.1875rem #e4e6e8);
37
+ --invalid-shadow: 0 0 0 0.1875rem #ef4135;
38
38
  --padding: initial;
39
39
  --check-bg-color: #fff;
40
40
  --check-border-style: 1px solid #b5aea7;
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * Web Components for Nanopore digital Web Apps
3
3
  */
4
- import { Component, Prop, Event, h, State, Watch, Method, Element, Host, } from '@stencil/core';
4
+ import { Component, Prop, Event, h, State, Watch, Method, Element, Host, Listen, } from '@stencil/core';
5
5
  import { createColorClasses } from '../../utils';
6
6
  import { focusVisible } from '../../utils/focus-visible';
7
7
  let checkboxIds = 0;
@@ -15,8 +15,6 @@ let checkboxIds = 0;
15
15
  export class Checkbox {
16
16
  constructor() {
17
17
  this.inputId = `nano-cb-${checkboxIds++}`;
18
- this.shouldReport = false;
19
- this._invalid = false;
20
18
  this.inputType = 'checkbox';
21
19
  /** @internal */
22
20
  this.hasFocus = false;
@@ -45,9 +43,9 @@ export class Checkbox {
45
43
  * If `true`, the checkbox will visually appear as indeterminate (only relevant for type="checkbox")
46
44
  */
47
45
  this.indeterminate = false;
46
+ this._invalid = false;
48
47
  // private handlers
49
48
  this.handleInvalid = (ev) => {
50
- this.shouldReport = true;
51
49
  this._invalid = !ev.target.validity.valid;
52
50
  };
53
51
  this.handleChange = (ev) => {
@@ -96,9 +94,15 @@ export class Checkbox {
96
94
  * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly
97
95
  */
98
96
  get invalid() {
99
- if (!this.shouldReport)
100
- return false;
101
- return !this.input.validity.valid;
97
+ return this._invalid;
98
+ }
99
+ /**
100
+ * Current validation message - if any. @readonly
101
+ */
102
+ get validityMessage() {
103
+ if (!this.input)
104
+ return '';
105
+ return this.input.validationMessage;
102
106
  }
103
107
  // public methods
104
108
  /**
@@ -114,10 +118,9 @@ export class Checkbox {
114
118
  * @returns `Promise<{ isValid: boolean, errorMessage: string }>`
115
119
  */
116
120
  async reportValidity(validateFirst = false) {
117
- if (validateFirst) {
118
- this.shouldReport = true;
119
- this._invalid = !this.input.reportValidity();
120
- }
121
+ if (validateFirst)
122
+ this.input.reportValidity();
123
+ this._invalid = !this.input.validity.valid;
121
124
  return {
122
125
  isValid: !this.invalid,
123
126
  errorMessage: this.input.validationMessage,
@@ -127,10 +130,11 @@ export class Checkbox {
127
130
  * Sets a custom validation message.
128
131
  * If `message` is not empty, the field will be considered invalid. Use in conjunction with `nano-checkbox-group`
129
132
  */
130
- async setError(message) {
133
+ async setError(message, updateStatus = true) {
131
134
  if (!this.input)
132
135
  return;
133
- this._invalid = !!message.length;
136
+ if (updateStatus)
137
+ this._invalid = !!message.length;
134
138
  this.input.setCustomValidity(message);
135
139
  }
136
140
  /**
@@ -151,10 +155,18 @@ export class Checkbox {
151
155
  focusVisible.force(this.input, false);
152
156
  }
153
157
  }
158
+ onReset(e) {
159
+ const form = this.form
160
+ ? document.querySelector('#' + this.form)
161
+ : this.host.closest('form');
162
+ if (!form || e.target !== this.host.closest('form'))
163
+ return;
164
+ this.checked = false;
165
+ }
154
166
  /* Although many radio components can be 'checked',
155
167
  the underlying control may not be. Check */
156
168
  isRadioChecked() {
157
- setTimeout(() => (this.checked = this.input.checked), 20);
169
+ requestAnimationFrame(() => (this.checked = this.input.checked));
158
170
  }
159
171
  // Stencil hooks
160
172
  componentWillLoad() {
@@ -180,7 +192,7 @@ export class Checkbox {
180
192
  'nanocb--focused': this.hasFocus,
181
193
  'nanocb--indeterminate': this.indeterminate,
182
194
  }, htmlFor: this.inputId },
183
- h("input", { type: this.inputType, name: this.name, required: this.required, checked: this.checked, disabled: this.disabled, value: this.value, "aria-labelledby": labelId, onBlur: this.handleBlur, onFocus: this.handleFocus, onChange: this.handleChange, ref: (input) => (this.input = input), id: this.inputId, onInvalid: this.handleInvalid }),
195
+ h("input", { type: this.inputType, name: this.name, form: this.form, required: this.required, checked: this.checked, disabled: this.disabled, value: this.value, "aria-labelledby": labelId, onBlur: this.handleBlur, onFocus: this.handleFocus, onChange: this.handleChange, ref: (input) => (this.input = input), id: this.inputId, onInvalid: this.handleInvalid }),
184
196
  h("span", { class: 'nanocb__input nanocb__input--' + this.type }),
185
197
  h("div", { id: labelId, class: 'nanocb__label nanocb__label--' + this.type },
186
198
  this.label && !!this.label.length && h("span", null, this.label),
@@ -394,7 +406,27 @@ export class Checkbox {
394
406
  "getter": true,
395
407
  "setter": false,
396
408
  "attribute": "invalid",
397
- "reflect": true
409
+ "reflect": true,
410
+ "defaultValue": "false"
411
+ },
412
+ "validityMessage": {
413
+ "type": "string",
414
+ "mutable": false,
415
+ "complexType": {
416
+ "original": "string",
417
+ "resolved": "string",
418
+ "references": {}
419
+ },
420
+ "required": false,
421
+ "optional": false,
422
+ "docs": {
423
+ "tags": [],
424
+ "text": "Current validation message - if any. @readonly"
425
+ },
426
+ "getter": true,
427
+ "setter": false,
428
+ "attribute": "validity-message",
429
+ "reflect": false
398
430
  },
399
431
  "color": {
400
432
  "type": "string",
@@ -405,7 +437,7 @@ export class Checkbox {
405
437
  "references": {
406
438
  "Color": {
407
439
  "location": "import",
408
- "path": "/builds/RxH386Vg/0/Digital/nano-components/packages/components/src/interface.d.ts"
440
+ "path": "/builds/oyGwf-FZ/0/Digital/nano-components/packages/components/src/interface.d.ts"
409
441
  }
410
442
  }
411
443
  },
@@ -419,11 +451,30 @@ export class Checkbox {
419
451
  "setter": false,
420
452
  "attribute": "color",
421
453
  "reflect": false
454
+ },
455
+ "form": {
456
+ "type": "string",
457
+ "mutable": false,
458
+ "complexType": {
459
+ "original": "string | null",
460
+ "resolved": "string",
461
+ "references": {}
462
+ },
463
+ "required": false,
464
+ "optional": true,
465
+ "docs": {
466
+ "tags": [],
467
+ "text": "The form element to associate the input with (its form owner). Must be the id of a form."
468
+ },
469
+ "getter": false,
470
+ "setter": false,
471
+ "attribute": "form",
472
+ "reflect": false
422
473
  }
423
474
  }; }
424
475
  static get states() { return {
425
- "_invalid": {},
426
- "inputType": {}
476
+ "inputType": {},
477
+ "_invalid": {}
427
478
  }; }
428
479
  static get events() { return [{
429
480
  "method": "nanoChange",
@@ -441,7 +492,7 @@ export class Checkbox {
441
492
  "references": {
442
493
  "CheckboxChangeEventDetail": {
443
494
  "location": "import",
444
- "path": "/builds/RxH386Vg/0/Digital/nano-components/packages/components/src/interface.d.ts"
495
+ "path": "/builds/oyGwf-FZ/0/Digital/nano-components/packages/components/src/interface.d.ts"
445
496
  }
446
497
  }
447
498
  }
@@ -512,7 +563,7 @@ export class Checkbox {
512
563
  },
513
564
  "ControlValidity": {
514
565
  "location": "import",
515
- "path": "/builds/RxH386Vg/0/Digital/nano-components/packages/components/src/interface.d.ts"
566
+ "path": "/builds/oyGwf-FZ/0/Digital/nano-components/packages/components/src/interface.d.ts"
516
567
  }
517
568
  },
518
569
  "return": "Promise<ControlValidity>"
@@ -530,10 +581,13 @@ export class Checkbox {
530
581
  },
531
582
  "setError": {
532
583
  "complexType": {
533
- "signature": "(message: string) => Promise<void>",
584
+ "signature": "(message: string, updateStatus?: boolean) => Promise<void>",
534
585
  "parameters": [{
535
586
  "tags": [],
536
587
  "text": ""
588
+ }, {
589
+ "tags": [],
590
+ "text": ""
537
591
  }],
538
592
  "references": {
539
593
  "Promise": {
@@ -591,5 +645,12 @@ export class Checkbox {
591
645
  "propName": "indeterminate",
592
646
  "methodName": "handleIndeterminateChange"
593
647
  }]; }
648
+ static get listeners() { return [{
649
+ "name": "reset",
650
+ "method": "onReset",
651
+ "target": "body",
652
+ "capture": false,
653
+ "passive": false
654
+ }]; }
594
655
  }
595
656
  //# sourceMappingURL=checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../../src/components/checkbox/checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,KAAK,EAEL,CAAC,EAED,KAAK,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,GACL,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB;;;;;;GAMG;AAMH,MAAM,OAAO,QAAQ;EALrB;IAMU,YAAO,GAAG,WAAW,WAAW,EAAE,EAAE,CAAC;IAErC,iBAAY,GAAG,KAAK,CAAC;IAIpB,aAAQ,GAAG,KAAK,CAAC;IACjB,cAAS,GAAyB,UAAU,CAAC;IAEtD,gBAAgB;IACwB,aAAQ,GAAG,KAAK,CAAC;IAEzD;;OAEG;IACqC,YAAO,GAAY,KAAK,CAAC;IAyBjE;;OAEG;IACsB,aAAQ,GAAY,KAAK,CAAC;IAEnD;;;OAGG;IACsB,UAAK,GAAW,IAAI,CAAC;IAO9C;;OAEG;IACsB,aAAQ,GAAY,KAAK,CAAC;IAEnD;;OAEG;IACsB,SAAI,GAKR,UAAU,CAAC;IAchC;;OAEG;IACqC,kBAAa,GAAY,KAAK,CAAC;IAqGvE,mBAAmB;IAEX,kBAAa,GAAG,CAAC,EAAS,EAAE,EAAE;MACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;MACzB,IAAI,CAAC,QAAQ,GAAG,CAAE,EAAE,CAAC,MAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC;IAClE,CAAC,CAAC;IAEM,iBAAY,GAAG,CAAC,EAAc,EAAE,EAAE;MACxC,IAAI,CAAC,OAAO,GAAI,EAAE,CAAC,MAA2B,CAAC,OAAO,CAAC;MACvD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC,CAAC;IAEM,gBAAW,GAAG,GAAG,EAAE;MACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;MACrB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC;IAEM,eAAU,GAAG,GAAG,EAAE;MACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;MACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC;GAuEH;EApQC,KAAK,CAAC,mBAAmB;IACvB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAElC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;MAC3D,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;MACrC,IAAI,MAAiB,CAAC;MACtB,IAAI,IAAI,EAAE;QACR,MAAM,GAAG,KAAK,CAAC,IAAI,CACjB,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,IAAI,CAAC,IAAI,IAAI,CAAC,CAC5D,CAAC;OACH;WAAM;QACL,MAAM,GAAG,KAAK,CAAC,IAAI,CACjB,QAAQ,CAAC,gBAAgB,CAAC,uBAAuB,IAAI,CAAC,IAAI,IAAI,CAAC,CAChE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;OAC7C;MACD,MAAM,CAAC,GAAG,CAAC,CAAC,EAA2B,EAAE,EAAE;QACzC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI;UAAE,EAAE,CAAC,OAAO,GAAG,KAAK,CAAC;MAC3C,CAAC,CAAC,CAAC;KACJ;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;EACrE,CAAC;EAkCD,UAAU;IACR,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;MACjD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;;MACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;EAChC,CAAC;EAaD,yBAAyB;IACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;EAChD,CAAC;EAED;;;KAGG;EACH,IACI,OAAO;IACT,IAAI,CAAC,IAAI,CAAC,YAAY;MAAE,OAAO,KAAK,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;EACpC,CAAC;EAsBD,iBAAiB;EAEjB;;KAEG;EAEH,KAAK,CAAC,eAAe;IACnB,IAAI,IAAI,CAAC,KAAK;MAAE,OAAO,IAAI,CAAC,KAAK,CAAC;EACpC,CAAC;EAED;;;;KAIG;EAEH,KAAK,CAAC,cAAc,CAClB,gBAAyB,KAAK;IAE9B,IAAI,aAAa,EAAE;MACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;MACzB,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;KAC9C;IACD,OAAO;MACL,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO;MACtB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB;KAC3C,CAAC;EACJ,CAAC;EAED;;;KAGG;EAEH,KAAK,CAAC,QAAQ,CAAC,OAAe;IAC5B,IAAI,CAAC,IAAI,CAAC,KAAK;MAAE,OAAO;IAExB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;EACxC,CAAC;EAED;;KAEG;EAEH,KAAK,CAAC,QAAQ;IACZ,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;MACnB,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;EACH,CAAC;EAED;;KAEG;EAEH,KAAK,CAAC,WAAW;IACf,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;MAClB,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KACvC;EACH,CAAC;EAwBD;6CAC2C;EACnC,cAAc;IACpB,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;EAC5D,CAAC;EAED,gBAAgB;EAEhB,iBAAiB;IACf,IAAI,CAAC,UAAU,EAAE,CAAC;EACpB,CAAC;EAED,gBAAgB;IACd,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;IACtB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACnC,CAAC;EAED,oBAAoB;IAClB,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACrC,CAAC;EAED,MAAM;IACJ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACtC,IAAI,KAAK,GAAI,IAAI,CAAC,IAAI,CAAC,aAA0B,CAAC,GAAG,KAAK,KAAK,CAAC;IAEhE,OAAO,CACL,EAAC,IAAI,IACH,KAAK,oBAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,GAC1C,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;MAEzB,aACE,KAAK,EAAE;UACL,MAAM,EAAE,IAAI;UACZ,iBAAiB,EAAE,IAAI,CAAC,OAAO;UAC/B,iBAAiB,EAAE,IAAI,CAAC,OAAO;UAC/B,kBAAkB,EAAE,IAAI,CAAC,QAAQ;UACjC,iBAAiB,EAAE,IAAI,CAAC,QAAQ;UAChC,uBAAuB,EAAE,IAAI,CAAC,aAAa;SAC5C,EACD,OAAO,EAAE,IAAI,CAAC,OAAO;QAErB,aACE,IAAI,EAAE,IAAI,CAAC,SAAS,EACpB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,KAAK,EAAE,IAAI,CAAC,KAAK,qBACA,OAAO,EACxB,MAAM,EAAE,IAAI,CAAC,UAAU,EACvB,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,QAAQ,EAAE,IAAI,CAAC,YAAY,EAC3B,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,EACpC,EAAE,EAAE,IAAI,CAAC,OAAO,EAChB,SAAS,EAAE,IAAI,CAAC,aAAa,GAC7B;QACF,YAAM,KAAK,EAAE,+BAA+B,GAAG,IAAI,CAAC,IAAI,GAAS;QAEjE,WAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,+BAA+B,GAAG,IAAI,CAAC,IAAI;UACjE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,gBAAO,IAAI,CAAC,KAAK,CAAQ;UAC/D,YAAM,MAAM,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YAC7C,eAAQ,CACH,CACH,CACA,CACH,CACR,CAAC;EACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import {\n Component,\n Prop,\n Event,\n EventEmitter,\n h,\n ComponentInterface,\n State,\n Watch,\n Method,\n Element,\n Host,\n} from '@stencil/core';\nimport { CheckboxChangeEventDetail, ControlValidity } from '../../interface';\nimport { Color } from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport { focusVisible } from '../../utils/focus-visible';\n\nlet checkboxIds = 0;\n\n/**\n * `nano-checkbox` is used to let a user choose one or more options from a limited number of options.\n * They appear as checked when activated.\n * They can be checked by mouse, keyboard, touch or programmatically by setting the checked property.\n *\n * @slot - if you do not set a label attribute, you can use this slot for more complex markup\n */\n@Component({\n tag: 'nano-checkbox',\n styleUrl: 'checkbox.scss',\n scoped: true,\n})\nexport class Checkbox implements ComponentInterface {\n private inputId = `nano-cb-${checkboxIds++}`;\n private input: HTMLInputElement;\n private shouldReport = false;\n\n @Element() private host: HTMLNanoCheckboxElement;\n\n @State() _invalid = false;\n @State() inputType: 'checkbox' | 'radio' = 'checkbox';\n\n /** @internal */\n @Prop({ mutable: true, reflect: true }) hasFocus = false;\n\n /**\n * checked property that can be used to get/set the value. accepts only boolean values\n */\n @Prop({ mutable: true, reflect: true }) checked: boolean = false;\n\n @Watch('checked')\n async handleCheckedChange() {\n this.input.checked = this.checked;\n\n if (this.inputType === 'radio' && this.name && this.checked) {\n let form = this.host.closest('form');\n let radios: Element[];\n if (form) {\n radios = Array.from(\n form.querySelectorAll(`nano-checkbox[name=\"${this.name}\"]`)\n );\n } else {\n radios = Array.from(\n document.querySelectorAll(`nano-checkbox[name=\"${this.name}\"]`)\n ).filter((radio) => !radio.closest('form'));\n }\n radios.map((el: HTMLNanoCheckboxElement) => {\n if (el !== this.host) el.checked = false;\n });\n }\n this.nanoChange.emit({ value: this.value, checked: this.checked });\n }\n\n /**\n * If `true`, the user cannot interact with the checkbox.\n */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * The value of a checkbox is analogous to the value of an `<input type='checkbox'>`,\n * it's only present when `checked` is true.\n */\n @Prop({ reflect: true }) value: string = 'on';\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop({ reflect: true }) name: string;\n\n /**\n * Set to true to make the field required.\n */\n @Prop({ reflect: true }) required: boolean = false;\n\n /**\n * Controls the underlying field type and style.\n */\n @Prop({ reflect: true }) type:\n | 'radio'\n | 'checkbox'\n | 'tag'\n | 'segment'\n | 'segment-pill' = 'checkbox';\n\n @Watch('type')\n typeChange() {\n if (this.type === 'checkbox' || this.type === 'tag')\n this.inputType = 'checkbox';\n else this.inputType = 'radio';\n }\n\n /**\n * label property that can be used to set the label text. Alternatively you may use a label slot.\n */\n @Prop() label?: string;\n\n /**\n * If `true`, the checkbox will visually appear as indeterminate (only relevant for type=\"checkbox\")\n */\n @Prop({ mutable: true, reflect: true }) indeterminate: boolean = false;\n\n @Watch('indeterminate')\n handleIndeterminateChange() {\n this.checked = false;\n this.input.indeterminate = this.indeterminate;\n }\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n if (!this.shouldReport) return false;\n return !this.input.validity.valid;\n }\n\n /**\n * Color to use from your application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * Emited when the checkbox is toggled\n */\n @Event() nanoChange: EventEmitter<CheckboxChangeEventDetail>;\n\n /**\n * Emited when the checkbox is focused\n */\n @Event() nanoFocus: EventEmitter;\n\n /**\n * Emited when the checkbox is blurred\n */\n @Event() nanoBlur: EventEmitter;\n\n // public methods\n\n /**\n * Returns the native input control\n */\n @Method()\n async getInputElement() {\n if (this.input) return this.input;\n }\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `Promise<{ isValid: boolean, errorMessage: string }>`\n */\n @Method()\n async reportValidity(\n validateFirst: boolean = false\n ): Promise<ControlValidity> {\n if (validateFirst) {\n this.shouldReport = true;\n this._invalid = !this.input.reportValidity();\n }\n return {\n isValid: !this.invalid,\n errorMessage: this.input.validationMessage,\n };\n }\n\n /**\n * Sets a custom validation message.\n * If `message` is not empty, the field will be considered invalid. Use in conjunction with `nano-checkbox-group`\n */\n @Method()\n async setError(message: string) {\n if (!this.input) return;\n\n this._invalid = !!message.length;\n this.input.setCustomValidity(message);\n }\n\n /**\n * Sets focus on the checkbox.\n */\n @Method()\n async setFocus() {\n if (this.input) {\n this.input.focus();\n focusVisible.force(this.input);\n }\n }\n\n /**\n * Removes focus from the checkbox.\n */\n @Method()\n async removeFocus() {\n if (this.input) {\n this.input.blur();\n focusVisible.force(this.input, false);\n }\n }\n\n // private handlers\n\n private handleInvalid = (ev: Event) => {\n this.shouldReport = true;\n this._invalid = !(ev.target as HTMLInputElement).validity.valid;\n };\n\n private handleChange = (ev: InputEvent) => {\n this.checked = (ev.target as HTMLInputElement).checked;\n this.indeterminate = false;\n };\n\n private handleFocus = () => {\n this.hasFocus = true;\n this.nanoFocus.emit();\n };\n\n private handleBlur = () => {\n this.hasFocus = false;\n this.nanoBlur.emit();\n };\n\n /* Although many radio components can be 'checked',\n the underlying control may not be. Check */\n private isRadioChecked() {\n setTimeout(() => (this.checked = this.input.checked), 20);\n }\n\n // Stencil hooks\n\n componentWillLoad() {\n this.typeChange();\n }\n\n componentDidLoad() {\n this.input.indeterminate = this.indeterminate;\n this.isRadioChecked();\n focusVisible.observe(this.input);\n }\n\n disconnectedCallback() {\n focusVisible.unobserve(this.input);\n }\n\n render() {\n const labelId = this.inputId + '-lbl';\n let isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n\n return (\n <Host\n class={{ ...createColorClasses(this.color) }}\n dir={isRtl ? 'rtl' : null}\n >\n <label\n class={{\n nanocb: true,\n 'nanocb--checked': this.checked,\n 'nanocb--invalid': this.invalid,\n 'nanocb--disabled': this.disabled,\n 'nanocb--focused': this.hasFocus,\n 'nanocb--indeterminate': this.indeterminate,\n }}\n htmlFor={this.inputId}\n >\n <input\n type={this.inputType}\n name={this.name}\n required={this.required}\n checked={this.checked}\n disabled={this.disabled}\n value={this.value}\n aria-labelledby={labelId}\n onBlur={this.handleBlur}\n onFocus={this.handleFocus}\n onChange={this.handleChange}\n ref={(input) => (this.input = input)}\n id={this.inputId}\n onInvalid={this.handleInvalid}\n />\n <span class={'nanocb__input nanocb__input--' + this.type}></span>\n\n <div id={labelId} class={'nanocb__label nanocb__label--' + this.type}>\n {this.label && !!this.label.length && <span>{this.label}</span>}\n <span hidden={this.label && !!this.label.length}>\n <slot />\n </span>\n </div>\n </label>\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../../src/components/checkbox/checkbox.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Prop,\n Event,\n EventEmitter,\n h,\n ComponentInterface,\n State,\n Watch,\n Method,\n Element,\n Host,\n Listen,\n} from '@stencil/core';\nimport { CheckboxChangeEventDetail, ControlValidity } from '../../interface';\nimport { Color } from '../../interface';\nimport { createColorClasses } from '../../utils';\nimport { focusVisible } from '../../utils/focus-visible';\n\nlet checkboxIds = 0;\n\n/**\n * `nano-checkbox` is used to let a user choose one or more options from a limited number of options.\n * They appear as checked when activated.\n * They can be checked by mouse, keyboard, touch or programmatically by setting the checked property.\n *\n * @slot - if you do not set a label attribute, you can use this slot for more complex markup\n */\n@Component({\n tag: 'nano-checkbox',\n styleUrl: 'checkbox.scss',\n scoped: true,\n})\nexport class Checkbox implements ComponentInterface {\n private inputId = `nano-cb-${checkboxIds++}`;\n private input: HTMLInputElement;\n\n @Element() private host: HTMLNanoCheckboxElement;\n @State() inputType: 'checkbox' | 'radio' = 'checkbox';\n\n /** @internal */\n @Prop({ mutable: true, reflect: true }) hasFocus = false;\n\n /**\n * checked property that can be used to get/set the value. accepts only boolean values\n */\n @Prop({ mutable: true, reflect: true }) checked: boolean = false;\n\n @Watch('checked')\n async handleCheckedChange() {\n this.input.checked = this.checked;\n\n if (this.inputType === 'radio' && this.name && this.checked) {\n let form = this.host.closest('form');\n let radios: Element[];\n if (form) {\n radios = Array.from(\n form.querySelectorAll(`nano-checkbox[name=\"${this.name}\"]`)\n );\n } else {\n radios = Array.from(\n document.querySelectorAll(`nano-checkbox[name=\"${this.name}\"]`)\n ).filter((radio) => !radio.closest('form'));\n }\n radios.map((el: HTMLNanoCheckboxElement) => {\n if (el !== this.host) el.checked = false;\n });\n }\n this.nanoChange.emit({ value: this.value, checked: this.checked });\n }\n\n /**\n * If `true`, the user cannot interact with the checkbox.\n */\n @Prop({ reflect: true }) disabled: boolean = false;\n\n /**\n * The value of a checkbox is analogous to the value of an `<input type='checkbox'>`,\n * it's only present when `checked` is true.\n */\n @Prop({ reflect: true }) value: string = 'on';\n\n /**\n * The name of the control, which is submitted with the form data.\n */\n @Prop({ reflect: true }) name: string;\n\n /**\n * Set to true to make the field required.\n */\n @Prop({ reflect: true }) required: boolean = false;\n\n /**\n * Controls the underlying field type and style.\n */\n @Prop({ reflect: true }) type:\n | 'radio'\n | 'checkbox'\n | 'tag'\n | 'segment'\n | 'segment-pill' = 'checkbox';\n\n @Watch('type')\n typeChange() {\n if (this.type === 'checkbox' || this.type === 'tag')\n this.inputType = 'checkbox';\n else this.inputType = 'radio';\n }\n\n /**\n * label property that can be used to set the label text. Alternatively you may use a label slot.\n */\n @Prop() label?: string;\n\n /**\n * If `true`, the checkbox will visually appear as indeterminate (only relevant for type=\"checkbox\")\n */\n @Prop({ mutable: true, reflect: true }) indeterminate: boolean = false;\n\n @Watch('indeterminate')\n handleIndeterminateChange() {\n this.checked = false;\n this.input.indeterminate = this.indeterminate;\n }\n\n /**\n * This will be true when the control is in an invalid state.\n * Validity is determined by the `required` prop. Or if custom validity message is set. @readonly\n */\n @Prop({ reflect: true })\n get invalid() {\n return this._invalid;\n }\n @State() _invalid = false;\n\n /**\n * Current validation message - if any. @readonly\n */\n @Prop()\n get validityMessage() {\n if (!this.input) return '';\n return this.input.validationMessage;\n }\n\n /**\n * Color to use from your application's color palette.\n */\n @Prop() color?: Color;\n\n /**\n * The form element to associate the input with (its form owner). Must be the id of a form.\n */\n @Prop() form?: string | null;\n\n /**\n * Emited when the checkbox is toggled\n */\n @Event() nanoChange: EventEmitter<CheckboxChangeEventDetail>;\n\n /**\n * Emited when the checkbox is focused\n */\n @Event() nanoFocus: EventEmitter;\n\n /**\n * Emited when the checkbox is blurred\n */\n @Event() nanoBlur: EventEmitter;\n\n // public methods\n\n /**\n * Returns the native input control\n */\n @Method()\n async getInputElement() {\n if (this.input) return this.input;\n }\n\n /**\n * Get the current state of the control.\n * @param validateFirst - perform validation first before reporting\n * @returns `Promise<{ isValid: boolean, errorMessage: string }>`\n */\n @Method()\n async reportValidity(\n validateFirst: boolean = false\n ): Promise<ControlValidity> {\n if (validateFirst) this.input.reportValidity();\n this._invalid = !this.input.validity.valid;\n\n return {\n isValid: !this.invalid,\n errorMessage: this.input.validationMessage,\n };\n }\n\n /**\n * Sets a custom validation message.\n * If `message` is not empty, the field will be considered invalid. Use in conjunction with `nano-checkbox-group`\n */\n @Method()\n async setError(message: string, updateStatus = true) {\n if (!this.input) return;\n if (updateStatus) this._invalid = !!message.length;\n this.input.setCustomValidity(message);\n }\n\n /**\n * Sets focus on the checkbox.\n */\n @Method()\n async setFocus() {\n if (this.input) {\n this.input.focus();\n focusVisible.force(this.input);\n }\n }\n\n /**\n * Removes focus from the checkbox.\n */\n @Method()\n async removeFocus() {\n if (this.input) {\n this.input.blur();\n focusVisible.force(this.input, false);\n }\n }\n\n @Listen('reset', { target: 'body' })\n onReset(e) {\n const form = this.form\n ? document.querySelector('#' + this.form)\n : this.host.closest('form');\n if (!form || e.target !== this.host.closest('form')) return;\n\n this.checked = false;\n }\n\n // private handlers\n\n private handleInvalid = (ev: Event) => {\n this._invalid = !(ev.target as HTMLInputElement).validity.valid;\n };\n\n private handleChange = (ev: InputEvent) => {\n this.checked = (ev.target as HTMLInputElement).checked;\n this.indeterminate = false;\n };\n\n private handleFocus = () => {\n this.hasFocus = true;\n this.nanoFocus.emit();\n };\n\n private handleBlur = () => {\n this.hasFocus = false;\n this.nanoBlur.emit();\n };\n\n /* Although many radio components can be 'checked',\n the underlying control may not be. Check */\n private isRadioChecked() {\n requestAnimationFrame(() => (this.checked = this.input.checked));\n }\n\n // Stencil hooks\n\n componentWillLoad() {\n this.typeChange();\n }\n\n componentDidLoad() {\n this.input.indeterminate = this.indeterminate;\n this.isRadioChecked();\n focusVisible.observe(this.input);\n }\n\n disconnectedCallback() {\n focusVisible.unobserve(this.input);\n }\n\n render() {\n const labelId = this.inputId + '-lbl';\n let isRtl = (this.host.ownerDocument as Document).dir === 'rtl';\n\n return (\n <Host\n class={{ ...createColorClasses(this.color) }}\n dir={isRtl ? 'rtl' : null}\n >\n <label\n class={{\n nanocb: true,\n 'nanocb--checked': this.checked,\n 'nanocb--invalid': this.invalid,\n 'nanocb--disabled': this.disabled,\n 'nanocb--focused': this.hasFocus,\n 'nanocb--indeterminate': this.indeterminate,\n }}\n htmlFor={this.inputId}\n >\n <input\n type={this.inputType}\n name={this.name}\n form={this.form}\n required={this.required}\n checked={this.checked}\n disabled={this.disabled}\n value={this.value}\n aria-labelledby={labelId}\n onBlur={this.handleBlur}\n onFocus={this.handleFocus}\n onChange={this.handleChange}\n ref={(input) => (this.input = input)}\n id={this.inputId}\n onInvalid={this.handleInvalid}\n />\n <span class={'nanocb__input nanocb__input--' + this.type}></span>\n\n <div id={labelId} class={'nanocb__label nanocb__label--' + this.type}>\n {this.label && !!this.label.length && <span>{this.label}</span>}\n <span hidden={this.label && !!this.label.length}>\n <slot />\n </span>\n </div>\n </label>\n </Host>\n );\n }\n}\n"]}