ku4web-components 6.4.80 → 6.4.81

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 (280) hide show
  1. package/angular/index.js +1 -1
  2. package/angular/index.mjs +1 -1
  3. package/dist/cjs/app-globals-3a1e7e63.js +5 -0
  4. package/dist/cjs/css-shim-aaf4fec9.js +6 -0
  5. package/dist/cjs/dom-14886762.js +75 -0
  6. package/dist/cjs/index-652a3cbf.js +14 -0
  7. package/dist/cjs/index-8e9e8864.js +3093 -0
  8. package/dist/cjs/{index-1e13241e.js → index-a9159bd6.js} +1 -1
  9. package/dist/cjs/index-c904eb3a.js +10 -0
  10. package/dist/cjs/{index-da3ed39d.js → index-f78c109e.js} +1 -1
  11. package/dist/cjs/ku4-carousel-controls.cjs.entry.js +10 -4
  12. package/dist/cjs/ku4-carousel-slide.cjs.entry.js +1 -1
  13. package/dist/cjs/ku4-carousel.cjs.entry.js +3 -3
  14. package/dist/cjs/ku4-col.cjs.entry.js +1 -1
  15. package/dist/cjs/ku4-drawer.cjs.entry.js +1 -1
  16. package/dist/cjs/ku4-feature.cjs.entry.js +2 -2
  17. package/dist/cjs/ku4-focus-trap.cjs.entry.js +26 -26
  18. package/dist/cjs/ku4-form.cjs.entry.js +3 -3
  19. package/dist/cjs/ku4-grid.cjs.entry.js +1 -1
  20. package/dist/cjs/ku4-label.cjs.entry.js +2 -2
  21. package/dist/cjs/ku4-mask.cjs.entry.js +2 -2
  22. package/dist/cjs/ku4-modal.cjs.entry.js +3 -3
  23. package/dist/cjs/ku4-panel.cjs.entry.js +1 -1
  24. package/dist/cjs/ku4-preview.cjs.entry.js +43 -14
  25. package/dist/cjs/ku4-tab-list.cjs.entry.js +4 -4
  26. package/dist/cjs/ku4-tab-panel.cjs.entry.js +3 -3
  27. package/dist/cjs/ku4-tab.cjs.entry.js +3 -3
  28. package/dist/cjs/ku4-table.cjs.entry.js +1 -1
  29. package/dist/cjs/ku4-tooltip.cjs.entry.js +2 -2
  30. package/dist/cjs/ku4-validation.cjs.entry.js +2 -2
  31. package/dist/cjs/ku4web-components.cjs.js +103 -8
  32. package/dist/cjs/loader.cjs.js +19 -3
  33. package/dist/cjs/{shadow-css-8940f82d.js → shadow-css-c44ea13a.js} +1 -1
  34. package/dist/cjs/{uid-d6942c42.js → uid-97baaecc.js} +1 -1
  35. package/dist/cjs/uid-eb3bec28.js +11 -0
  36. package/dist/collection/capabilities/a11y/aria.js +26 -0
  37. package/dist/collection/capabilities/angular/index.js +24 -0
  38. package/dist/collection/capabilities/decorators/deprecated.js +20 -0
  39. package/dist/collection/capabilities/decorators/index.js +3 -0
  40. package/dist/collection/capabilities/decorators/memoize.js +7 -0
  41. package/dist/collection/capabilities/dom/isFocusable.js +7 -0
  42. package/dist/collection/capabilities/dom/queryFocusable.js +2 -0
  43. package/dist/collection/capabilities/identity/uid.js +6 -0
  44. package/dist/collection/capabilities/mask/index.js +5 -0
  45. package/dist/collection/capabilities/mask/patterns/date.js +40 -0
  46. package/dist/collection/capabilities/mask/patterns/index.js +7 -0
  47. package/dist/collection/capabilities/react/index.js +25 -0
  48. package/dist/collection/capabilities/testing/html.js +14 -0
  49. package/dist/collection/capabilities/testing/styles.js +14 -0
  50. package/dist/collection/capabilities/vue/index.js +28 -0
  51. package/dist/collection/capabilities/vue3/index.js +26 -0
  52. package/dist/collection/collection-manifest.json +31 -0
  53. package/dist/collection/components/ku4-carousel/ku4-carousel.css +221 -0
  54. package/dist/collection/components/ku4-carousel/ku4-carousel.js +362 -0
  55. package/dist/collection/components/ku4-carousel-controls/ku4-carousel-controls.css +32 -0
  56. package/dist/collection/components/ku4-carousel-controls/ku4-carousel-controls.js +112 -0
  57. package/dist/collection/components/ku4-carousel-slide/ku4-carousel-slide.css +3 -0
  58. package/dist/collection/components/ku4-carousel-slide/ku4-carousel-slide.js +159 -0
  59. package/dist/collection/components/ku4-col/ku4-col.css +601 -0
  60. package/dist/collection/components/ku4-col/ku4-col.js +288 -0
  61. package/dist/collection/components/ku4-drawer/ku4-drawer.css +56 -0
  62. package/dist/collection/components/ku4-drawer/ku4-drawer.js +163 -0
  63. package/dist/collection/components/ku4-feature/ku4-feature.js +70 -0
  64. package/dist/collection/components/ku4-focus-trap/ku4-focus-trap.css +3 -0
  65. package/dist/collection/components/ku4-focus-trap/ku4-focus-trap.js +441 -0
  66. package/dist/collection/components/ku4-form/ku4-form.js +225 -0
  67. package/dist/collection/components/ku4-grid/ku4-grid.css +751 -0
  68. package/dist/collection/components/ku4-grid/ku4-grid.js +408 -0
  69. package/dist/collection/components/ku4-label/ku4-label.css +36 -0
  70. package/dist/collection/components/ku4-label/ku4-label.js +115 -0
  71. package/dist/collection/components/ku4-mask/ku4-mask.css +3 -0
  72. package/dist/collection/components/ku4-mask/ku4-mask.js +458 -0
  73. package/dist/collection/components/ku4-modal/ku4-modal.css +85 -0
  74. package/dist/collection/components/ku4-modal/ku4-modal.js +208 -0
  75. package/dist/collection/components/ku4-panel/ku4-panel.css +14 -0
  76. package/dist/collection/components/ku4-panel/ku4-panel.js +119 -0
  77. package/dist/collection/components/ku4-preview/ku4-preview.css +23 -0
  78. package/dist/collection/components/ku4-preview/ku4-preview.js +266 -0
  79. package/dist/collection/components/ku4-tab/ku4-tab.css +82 -0
  80. package/dist/collection/components/ku4-tab/ku4-tab.js +191 -0
  81. package/dist/collection/components/ku4-tab-list/ku4-tab-list.css +6 -0
  82. package/dist/collection/components/ku4-tab-list/ku4-tab-list.js +118 -0
  83. package/dist/collection/components/ku4-tab-panel/ku4-tab-panel.css +26 -0
  84. package/dist/collection/components/ku4-tab-panel/ku4-tab-panel.js +166 -0
  85. package/dist/collection/components/ku4-table/ku4-table.css +116 -0
  86. package/dist/collection/components/ku4-table/ku4-table.js +120 -0
  87. package/dist/collection/components/ku4-tooltip/ku4-tooltip.css +56 -0
  88. package/dist/collection/components/ku4-tooltip/ku4-tooltip.js +274 -0
  89. package/dist/collection/components/ku4-validation/ku4-validation.css +19 -0
  90. package/dist/collection/components/ku4-validation/ku4-validation.js +364 -0
  91. package/dist/collection/components/ku4-validation/validate.js +14 -0
  92. package/dist/collection/index.js +1 -0
  93. package/dist/collection/security.js +27 -0
  94. package/dist/esm/app-globals-0f993ce5.js +3 -0
  95. package/dist/esm/css-shim-091f949f.js +4 -0
  96. package/dist/esm/dom-a385e381.js +73 -0
  97. package/dist/esm/{index-9e3af5f4.js → index-26cde78a.js} +1 -1
  98. package/dist/esm/index-3e1e5aa3.js +3 -0
  99. package/dist/esm/index-516c5188.js +3057 -0
  100. package/dist/esm/index-7ff6e718.js +3 -0
  101. package/dist/esm/{index-20c3926d.js → index-bdb0771a.js} +1 -1
  102. package/dist/esm/ku4-carousel-controls.entry.js +10 -4
  103. package/dist/esm/ku4-carousel-slide.entry.js +1 -1
  104. package/dist/esm/ku4-carousel.entry.js +3 -3
  105. package/dist/esm/ku4-col.entry.js +1 -1
  106. package/dist/esm/ku4-drawer.entry.js +1 -1
  107. package/dist/esm/ku4-feature.entry.js +2 -2
  108. package/dist/esm/ku4-focus-trap.entry.js +3 -3
  109. package/dist/esm/ku4-form.entry.js +3 -3
  110. package/dist/esm/ku4-grid.entry.js +1 -1
  111. package/dist/esm/ku4-label.entry.js +2 -2
  112. package/dist/esm/ku4-mask.entry.js +2 -2
  113. package/dist/esm/ku4-modal.entry.js +3 -3
  114. package/dist/esm/ku4-panel.entry.js +1 -1
  115. package/dist/esm/ku4-preview.entry.js +34 -5
  116. package/dist/esm/ku4-tab-list.entry.js +4 -4
  117. package/dist/esm/ku4-tab-panel.entry.js +3 -3
  118. package/dist/esm/ku4-tab.entry.js +3 -3
  119. package/dist/esm/ku4-table.entry.js +1 -1
  120. package/dist/esm/ku4-tooltip.entry.js +2 -2
  121. package/dist/esm/ku4-validation.entry.js +2 -2
  122. package/dist/esm/ku4web-components.js +103 -8
  123. package/dist/esm/loader.js +19 -3
  124. package/dist/esm/{shadow-css-5d2d01ce.js → shadow-css-ef431969.js} +1 -1
  125. package/dist/esm/{uid-15f8c937.js → uid-1ec3509b.js} +1 -1
  126. package/dist/esm/uid-9dbd7ad0.js +9 -0
  127. package/dist/esm-es5/{index-9e3af5f4.js → index-26cde78a.js} +1 -1
  128. package/dist/esm-es5/{index-20c3926d.js → index-bdb0771a.js} +1 -1
  129. package/dist/esm-es5/ku4-carousel-controls.entry.js +1 -1
  130. package/dist/esm-es5/ku4-carousel-slide.entry.js +1 -1
  131. package/dist/esm-es5/ku4-carousel.entry.js +1 -1
  132. package/dist/esm-es5/ku4-col.entry.js +1 -1
  133. package/dist/esm-es5/ku4-drawer.entry.js +1 -1
  134. package/dist/esm-es5/ku4-feature.entry.js +1 -1
  135. package/dist/esm-es5/ku4-focus-trap.entry.js +1 -1
  136. package/dist/esm-es5/ku4-form.entry.js +1 -1
  137. package/dist/esm-es5/ku4-grid.entry.js +1 -1
  138. package/dist/esm-es5/ku4-label.entry.js +1 -1
  139. package/dist/esm-es5/ku4-mask.entry.js +1 -1
  140. package/dist/esm-es5/ku4-modal.entry.js +1 -1
  141. package/dist/esm-es5/ku4-panel.entry.js +1 -1
  142. package/dist/esm-es5/ku4-preview.entry.js +1 -1
  143. package/dist/esm-es5/ku4-tab-list.entry.js +1 -1
  144. package/dist/esm-es5/ku4-tab-panel.entry.js +1 -1
  145. package/dist/esm-es5/ku4-tab.entry.js +1 -1
  146. package/dist/esm-es5/ku4-table.entry.js +1 -1
  147. package/dist/esm-es5/ku4-tooltip.entry.js +1 -1
  148. package/dist/esm-es5/ku4-validation.entry.js +1 -1
  149. package/dist/esm-es5/ku4web-components.js +1 -1
  150. package/dist/esm-es5/loader.js +1 -1
  151. package/dist/esm-es5/{shadow-css-5d2d01ce.js → shadow-css-ef431969.js} +0 -0
  152. package/dist/esm-es5/uid-1ec3509b.js +1 -0
  153. package/dist/index.js +1 -1
  154. package/dist/ku4web-components/app-globals-0f993ce5.js +3 -0
  155. package/dist/ku4web-components/app-globals-497eb362.system.js +1 -0
  156. package/dist/ku4web-components/css-shim-091f949f.js +4 -0
  157. package/dist/ku4web-components/css-shim-c5bffe6b.system.js +1 -0
  158. package/dist/ku4web-components/dom-99eb7b76.system.js +21 -0
  159. package/dist/ku4web-components/dom-a385e381.js +73 -0
  160. package/dist/ku4web-components/index-380cbe3a.system.js +1 -0
  161. package/dist/ku4web-components/index-3e1e5aa3.js +3 -0
  162. package/dist/ku4web-components/index-516c5188.js +3057 -0
  163. package/dist/ku4web-components/index-7d482e8a.system.js +1 -0
  164. package/dist/ku4web-components/index-7ff6e718.js +3 -0
  165. package/dist/ku4web-components/index-fd0c89d0.system.js +1 -0
  166. package/dist/ku4web-components/index.esm.js +1 -0
  167. package/dist/ku4web-components/index.system.js +1 -0
  168. package/dist/ku4web-components/ku4-carousel-controls.entry.js +89 -0
  169. package/dist/ku4web-components/ku4-carousel-controls.system.entry.js +1 -0
  170. package/dist/ku4web-components/ku4-carousel-slide.entry.js +47 -0
  171. package/dist/ku4web-components/ku4-carousel-slide.system.entry.js +1 -0
  172. package/dist/ku4web-components/ku4-carousel.entry.js +168 -0
  173. package/dist/ku4web-components/ku4-carousel.system.entry.js +1 -0
  174. package/dist/ku4web-components/ku4-col.entry.js +75 -0
  175. package/dist/ku4web-components/ku4-col.system.entry.js +1 -0
  176. package/dist/ku4web-components/ku4-drawer.entry.js +35 -0
  177. package/dist/ku4web-components/ku4-drawer.system.entry.js +1 -0
  178. package/dist/ku4web-components/ku4-feature.entry.js +29 -0
  179. package/dist/ku4web-components/ku4-feature.system.entry.js +1 -0
  180. package/dist/ku4web-components/ku4-focus-trap.entry.js +323 -0
  181. package/dist/ku4web-components/ku4-focus-trap.system.entry.js +1 -0
  182. package/dist/ku4web-components/ku4-form.entry.js +112 -0
  183. package/dist/ku4web-components/ku4-form.system.entry.js +1 -0
  184. package/dist/ku4web-components/ku4-grid.entry.js +108 -0
  185. package/dist/ku4web-components/ku4-grid.system.entry.js +1 -0
  186. package/dist/ku4web-components/ku4-label.entry.js +70 -0
  187. package/dist/ku4web-components/ku4-label.system.entry.js +1 -0
  188. package/dist/ku4web-components/ku4-mask.entry.js +342 -0
  189. package/dist/ku4web-components/ku4-mask.system.entry.js +1 -0
  190. package/dist/ku4web-components/ku4-modal.entry.js +75 -0
  191. package/dist/ku4web-components/ku4-modal.system.entry.js +1 -0
  192. package/dist/ku4web-components/ku4-panel.entry.js +49 -0
  193. package/dist/ku4web-components/ku4-panel.system.entry.js +1 -0
  194. package/dist/ku4web-components/ku4-preview.entry.js +128 -0
  195. package/dist/ku4web-components/ku4-preview.system.entry.js +1 -0
  196. package/dist/ku4web-components/ku4-tab-list.entry.js +76 -0
  197. package/dist/ku4web-components/ku4-tab-list.system.entry.js +1 -0
  198. package/dist/ku4web-components/ku4-tab-panel.entry.js +72 -0
  199. package/dist/ku4web-components/ku4-tab-panel.system.entry.js +1 -0
  200. package/dist/ku4web-components/ku4-tab.entry.js +63 -0
  201. package/dist/ku4web-components/ku4-tab.system.entry.js +1 -0
  202. package/dist/ku4web-components/ku4-table.entry.js +79 -0
  203. package/dist/ku4web-components/ku4-table.system.entry.js +1 -0
  204. package/dist/ku4web-components/ku4-tooltip.entry.js +120 -0
  205. package/dist/ku4web-components/ku4-tooltip.system.entry.js +1 -0
  206. package/dist/ku4web-components/ku4-validation.entry.js +162 -0
  207. package/dist/ku4web-components/ku4-validation.system.entry.js +1 -0
  208. package/dist/ku4web-components/ku4web-components.css +299 -1
  209. package/dist/ku4web-components/ku4web-components.esm.js +129 -1
  210. package/dist/ku4web-components/ku4web-components.js +1 -1
  211. package/dist/ku4web-components/ku4web-components.system.js +1 -0
  212. package/dist/ku4web-components/p-019be0a7.entry.js +1 -0
  213. package/dist/ku4web-components/{p-8f480cb5.system.entry.js → p-01ae9e4c.system.entry.js} +1 -1
  214. package/dist/ku4web-components/{p-02e342f7.system.entry.js → p-03d6fb35.system.entry.js} +1 -1
  215. package/dist/ku4web-components/{p-3c182b2f.entry.js → p-0c05c4ad.entry.js} +1 -1
  216. package/dist/ku4web-components/{p-04948520.system.entry.js → p-0cc659d9.system.entry.js} +1 -1
  217. package/dist/ku4web-components/{p-2aac6c90.js → p-0ded083e.js} +1 -1
  218. package/dist/ku4web-components/{p-761b2cbc.system.entry.js → p-0e222607.system.entry.js} +1 -1
  219. package/dist/ku4web-components/p-17d548db.js +1 -0
  220. package/dist/ku4web-components/{p-c1068ffa.js → p-189cde73.js} +1 -1
  221. package/dist/ku4web-components/{p-2f2d74dc.system.entry.js → p-2300b0b7.system.entry.js} +1 -1
  222. package/dist/ku4web-components/{p-8faad87d.entry.js → p-25ca27d4.entry.js} +1 -1
  223. package/dist/ku4web-components/{p-f1cc1b2d.entry.js → p-2a6d5089.entry.js} +1 -1
  224. package/dist/ku4web-components/{p-9c0d71af.system.entry.js → p-341081d6.system.entry.js} +1 -1
  225. package/dist/ku4web-components/{p-e4ff1c36.entry.js → p-55d15007.entry.js} +1 -1
  226. package/dist/ku4web-components/{p-d6ec34c3.entry.js → p-57ec7c89.entry.js} +1 -1
  227. package/dist/ku4web-components/{p-15ee8b8e.system.entry.js → p-5d6cf40f.system.entry.js} +1 -1
  228. package/dist/ku4web-components/{p-01debe28.system.entry.js → p-5eb48119.system.entry.js} +1 -1
  229. package/dist/ku4web-components/{p-67adc5b1.system.entry.js → p-64bcfdeb.system.entry.js} +1 -1
  230. package/dist/ku4web-components/{p-71d57b8b.system.js → p-6bf18c7c.system.js} +0 -0
  231. package/dist/ku4web-components/{p-0eb73a0f.system.entry.js → p-6c5699e3.system.entry.js} +1 -1
  232. package/dist/ku4web-components/{p-840704e4.entry.js → p-6d63d17d.entry.js} +1 -1
  233. package/dist/ku4web-components/{p-f06bf0ae.entry.js → p-6f47f245.entry.js} +1 -1
  234. package/dist/ku4web-components/{p-b4488a7d.system.entry.js → p-75161edb.system.entry.js} +1 -1
  235. package/dist/ku4web-components/{p-0e010c10.system.entry.js → p-801fab11.system.entry.js} +1 -1
  236. package/dist/ku4web-components/{p-0f8708f8.entry.js → p-8c0cb5c1.entry.js} +1 -1
  237. package/dist/ku4web-components/{p-2edd35f8.system.entry.js → p-92bc6bf1.system.entry.js} +1 -1
  238. package/dist/ku4web-components/{p-7273db60.entry.js → p-94dd5fad.entry.js} +1 -1
  239. package/dist/ku4web-components/{p-660ebd19.entry.js → p-993123b6.entry.js} +1 -1
  240. package/dist/ku4web-components/{p-c50540ec.system.entry.js → p-9f1bc248.system.entry.js} +1 -1
  241. package/dist/ku4web-components/{p-f6455ab3.js → p-b10887b2.js} +0 -0
  242. package/dist/ku4web-components/{p-a5c7f5f7.system.entry.js → p-b3bdc458.system.entry.js} +1 -1
  243. package/dist/ku4web-components/{p-d360c64a.entry.js → p-b60c60e4.entry.js} +1 -1
  244. package/dist/ku4web-components/{p-0785fc39.system.js → p-c3293202.system.js} +1 -1
  245. package/dist/ku4web-components/{p-7a47027b.entry.js → p-c459bbb7.entry.js} +1 -1
  246. package/dist/ku4web-components/{p-90c37394.entry.js → p-c62c66be.entry.js} +1 -1
  247. package/dist/ku4web-components/{p-c19fd841.entry.js → p-c646a177.entry.js} +1 -1
  248. package/dist/ku4web-components/{p-8e2fca0b.system.entry.js → p-ca547c71.system.entry.js} +1 -1
  249. package/dist/ku4web-components/{p-ce6eddc3.system.entry.js → p-d6f80a73.system.entry.js} +1 -1
  250. package/dist/ku4web-components/p-db3040f3.system.js +1 -0
  251. package/dist/ku4web-components/{p-19a8c0f6.system.entry.js → p-db493d59.system.entry.js} +1 -1
  252. package/dist/ku4web-components/{p-77f1853c.entry.js → p-dc35b1af.entry.js} +1 -1
  253. package/dist/ku4web-components/p-deb02b56.entry.js +1 -0
  254. package/dist/ku4web-components/{p-3874127d.entry.js → p-df1544c7.entry.js} +1 -1
  255. package/dist/ku4web-components/{p-22eed87f.entry.js → p-e10de631.entry.js} +1 -1
  256. package/dist/ku4web-components/{p-8d9eb18b.system.entry.js → p-e29d66a7.system.entry.js} +1 -1
  257. package/dist/ku4web-components/{p-f0b1c07c.system.js → p-e2ae0504.system.js} +1 -1
  258. package/dist/ku4web-components/p-e641f14e.system.js +1 -0
  259. package/dist/ku4web-components/{p-adddaeef.entry.js → p-e6937d21.entry.js} +1 -1
  260. package/dist/ku4web-components/{p-232787a5.system.entry.js → p-f0e309a9.system.entry.js} +1 -1
  261. package/dist/ku4web-components/shadow-css-27708fdd.system.js +13 -0
  262. package/dist/ku4web-components/shadow-css-ef431969.js +388 -0
  263. package/dist/ku4web-components/uid-9dbd7ad0.js +9 -0
  264. package/dist/ku4web-components/uid-fb867945.system.js +1 -0
  265. package/dist/types/components/ku4-carousel-controls/ku4-carousel-controls.d.ts +1 -0
  266. package/dist/types/components/ku4-carousel-slide/ku4-carousel-slide.d.ts +6 -0
  267. package/dist/types/components.d.ts +8 -0
  268. package/package.json +15 -15
  269. package/react/index.js +1 -1
  270. package/react/index.mjs +1 -1
  271. package/vue/index.js +1 -1
  272. package/vue/index.mjs +1 -1
  273. package/vue3/index.js +1 -1
  274. package/vue3/index.mjs +1 -1
  275. package/dist/esm-es5/uid-15f8c937.js +0 -1
  276. package/dist/ku4web-components/p-b590da20.entry.js +0 -1
  277. package/dist/ku4web-components/p-be7890a1.system.js +0 -1
  278. package/dist/ku4web-components/p-cbbb4b1b.js +0 -1
  279. package/dist/ku4web-components/p-eb58b04b.system.js +0 -1
  280. package/dist/ku4web-components/p-eb6882c8.entry.js +0 -1
@@ -0,0 +1,441 @@
1
+ import { Component, Prop, Method, Watch, Element, h } from '@stencil/core';
2
+ import { Assert, deduplicate } from 'ku4es-kernel';
3
+ import { Event, Key } from 'ku4es-ui-kernel';
4
+ import { ariaHidden } from '../../capabilities/a11y/aria';
5
+ import isFocusable from '../../capabilities/dom/isFocusable';
6
+ import { queryTabbable, queryFocusable } from '../../capabilities/dom/queryFocusable';
7
+ const { tab } = Key;
8
+ const tabShift = Key.tab.shift;
9
+ const tabAlt = Key.tab.alt;
10
+ const tabAltShift = Key.tab.alt.shift;
11
+ /**
12
+ * @description ku4-focus-trap
13
+ */
14
+ export class Ku4FocusTrap {
15
+ constructor() {
16
+ this.iframes = [];
17
+ /**
18
+ * Focus trap will be active when true.
19
+ */
20
+ this.active = false;
21
+ this.handleKeyDown = this.handleKeyDown.bind(this);
22
+ this.handleKeyUp = this.handleKeyUp.bind(this);
23
+ this.handleMouse = this.handleMouse.bind(this);
24
+ }
25
+ activeHandler(value) {
26
+ value ? this.handleActivate() : this.handleDeactivate();
27
+ }
28
+ /**
29
+ * Activate focus trap
30
+ * @param {Element} [element] - Element to return focus to when trap is deactivated.
31
+ */
32
+ async activate(element) {
33
+ this.lastActiveElement = element || document.querySelector(this.return || null);
34
+ this.active = true;
35
+ }
36
+ /**
37
+ * Deactivate focus trap.
38
+ */
39
+ async deactivate() {
40
+ this.active = false;
41
+ }
42
+ handleActivate() {
43
+ this.lastActiveElement = this.lastActiveElement || document.activeElement;
44
+ if (this.lastActiveElement && this.lastActiveElement.blur) {
45
+ this.lastActiveElement.blur();
46
+ }
47
+ this.addEventListeners(this.elements);
48
+ ariaHidden(this.outerElements, true);
49
+ window.requestAnimationFrame(() => {
50
+ const element = (document.querySelector(this.initial || null) ||
51
+ this.focusableElements[0] ||
52
+ this.trapElements[0]);
53
+ element.blur();
54
+ element.focus();
55
+ this.activateTraps();
56
+ });
57
+ }
58
+ handleDeactivate() {
59
+ this.removeEventListeners(this.elements);
60
+ this.deactivateTraps();
61
+ ariaHidden(this.outerElements);
62
+ if (this.lastActiveElement && this.lastActiveElement.focus) {
63
+ this.lastActiveElement.focus();
64
+ }
65
+ this.lastActiveElement = null;
66
+ }
67
+ // Handles keydown and mutes the event if it occurs on a focusable
68
+ // item that is in the focus trap. This allows this block to force
69
+ // the decision as to who will get next focus and not let that
70
+ // decisioning fall out to the browser.
71
+ handleKeyDown(e) {
72
+ if ((tabShift.didFire(e) || tabAltShift.didFire(e))) {
73
+ try {
74
+ if (this.iframes.length > 0 && (this.trapElements[1] === e.target ||
75
+ !Assert.isNull(e.target.getAttribute('ku4-focus-wrap')) ||
76
+ this.iframes.some(iframe => iframe.contains(e.target)))) {
77
+ return;
78
+ }
79
+ if (this.trapElements[0] === e.target) {
80
+ this.trapElements[1].focus();
81
+ return Event.mute(e);
82
+ }
83
+ const nextIndex = this.focusableElements.indexOf(e.target) - 1;
84
+ const next = nextIndex < 0 ? this.focusableElements.length - 1 : nextIndex;
85
+ this.focusableElements[next].focus();
86
+ return Event.mute(e);
87
+ }
88
+ catch (e) {
89
+ return Event.mute(e);
90
+ }
91
+ }
92
+ if ((tab.didFire(e) || tabAlt.didFire(e))) {
93
+ try {
94
+ if (this.iframes.length > 0 && (this.trapElements[0] === e.target ||
95
+ !Assert.isNull(e.target.getAttribute('ku4-focus-wrap')) ||
96
+ this.iframes.some(iframe => iframe.contains(e.target)))) {
97
+ return;
98
+ }
99
+ if (this.trapElements[1] === e.target) {
100
+ this.trapElements[0].focus();
101
+ return Event.mute(e);
102
+ }
103
+ const nextIndex = this.focusableElements.indexOf(e.target) + 1;
104
+ const next = nextIndex >= this.focusableElements.length ? 0 : nextIndex;
105
+ this.focusableElements[next].focus();
106
+ return Event.mute(e);
107
+ }
108
+ catch (e) {
109
+ return Event.mute(e);
110
+ }
111
+ }
112
+ }
113
+ // Handles keyup and mutes the event if it occurs on a focusable
114
+ // item that is in the focus trap. This allows for us to determine
115
+ // if we need to move to the next focusable if the key is released
116
+ // on one of the trapElements (the two dynamically created wrapper
117
+ // elements that create the trap);
118
+ handleKeyUp(e) {
119
+ const index = this.trapElements.indexOf(e.target);
120
+ if (index === 0 && (tabShift.didFire(e) || tabAltShift.didFire(e))) {
121
+ const element = this.focusableElements[this.focusableElements.length - 1] || this.trapElements[1];
122
+ element.focus();
123
+ return Event.mute(e);
124
+ }
125
+ if (index === 1 && (tab.didFire(e) || tabAlt.didFire(e))) {
126
+ const element = this.focusableElements[0] || this.trapElements[0];
127
+ element.focus();
128
+ return Event.mute(e);
129
+ }
130
+ }
131
+ // Prevents all mouse activity on any elements that are not focusable
132
+ // inside of the active trap.
133
+ handleMouse(e) {
134
+ if (!this.elements.some(element => element === e.target)) {
135
+ Event.mute(e);
136
+ }
137
+ }
138
+ addEventListeners(elements) {
139
+ elements.forEach(element => element.addEventListener('keydown', this.handleKeyDown, { passive: true }));
140
+ elements.forEach(element => element.addEventListener('keyup', this.handleKeyUp, { passive: true }));
141
+ window.addEventListener('click', this.handleMouse, { passive: true });
142
+ window.addEventListener('mousedown', this.handleMouse, { passive: true });
143
+ window.addEventListener('mouseup', this.handleMouse, { passive: true });
144
+ window.addEventListener('touchstart', this.handleMouse, { passive: true });
145
+ }
146
+ removeEventListeners(elements) {
147
+ elements.forEach(element => element.removeEventListener('keydown', this.handleKeyDown, true));
148
+ elements.forEach(element => element.removeEventListener('keyup', this.handleKeyUp, true));
149
+ window.removeEventListener('click', this.handleMouse, true);
150
+ window.removeEventListener('mousedown', this.handleMouse, true);
151
+ window.removeEventListener('mouseup', this.handleMouse, true);
152
+ window.addEventListener('touchstart', this.handleMouse, true);
153
+ }
154
+ activateTraps() {
155
+ this.setTraps(0);
156
+ }
157
+ deactivateTraps() {
158
+ this.setTraps(-1);
159
+ }
160
+ setTraps(value) {
161
+ [].slice.call(this.host.querySelectorAll('[ku4-focus-trap], [ku4-focus-wrap]'))
162
+ .forEach(element => element.setAttribute('tabindex', value));
163
+ }
164
+ wrap(element) {
165
+ const fragment = document.createDocumentFragment();
166
+ fragment.appendChild(this.createWrapTag());
167
+ fragment.appendChild(element.cloneNode());
168
+ fragment.appendChild(this.createWrapTag());
169
+ element.parentNode.replaceChild(fragment, element);
170
+ }
171
+ createTrapTag() {
172
+ return this.createTag('ku4-focus-trap');
173
+ }
174
+ createWrapTag() {
175
+ return this.createTag('ku4-focus-wrap');
176
+ }
177
+ createTag(type) {
178
+ const trap = document.createElement('button');
179
+ trap.setAttribute(type, '');
180
+ trap.setAttribute('tabindex', '0');
181
+ trap.setAttribute('aria-hidden', 'true');
182
+ trap.style.position = 'static';
183
+ trap.style.display = 'block';
184
+ trap.style.width = '0';
185
+ trap.style.height = '0';
186
+ trap.style.margin = '0';
187
+ trap.style.padding = '0';
188
+ trap.style.border = 'none';
189
+ trap.style.outline = 'none';
190
+ return trap;
191
+ }
192
+ initialize() {
193
+ // All elements in this focus-trap
194
+ const innerElements = [].slice.call(this.host.querySelectorAll('*'));
195
+ // May need to break this out as it is really included for the mouse events
196
+ // e.g. for an overlay on a modal to make that clickable that is make it
197
+ // so this does not include it for muting the mouse events. This component
198
+ // is very powerful in shutting everything down and needs to allow for
199
+ // the ability to let items be clickable.
200
+ const inclusions = [].slice.call(document.querySelectorAll(this.include || null) || []);
201
+ // May need to break this out as it is really here to explicitly exclude items from
202
+ // being read out by screen readers. That is make them hidden so that screen
203
+ // readers get the same treatment as regular users.
204
+ const exclusions = [].slice.call(document.querySelectorAll(this.exclude) || []);
205
+ let shadowExclusions = [];
206
+ (this.excludeShadow || '').split(',').forEach((selector) => {
207
+ if (Assert.isNullOrEmpty(selector)) {
208
+ return;
209
+ }
210
+ try {
211
+ const parts = selector.trim().replace(/\s/, '|').split('|');
212
+ const shadowElements = document.querySelector(parts[0]).shadowRoot.querySelectorAll(parts[1]);
213
+ shadowExclusions = shadowExclusions.concat([].slice.call(shadowElements || []));
214
+ }
215
+ catch (e) {
216
+ // eslint-disable-next-line no-console
217
+ console.error('Invalid shadow selector', selector);
218
+ }
219
+ });
220
+ // Get all of the iframes as we cannot reach into them to find
221
+ // their focusable elements. We can only focus on the trap elements
222
+ // that wrap it
223
+ this.iframes = [].slice.call(this.host.querySelectorAll('iframe') || []);
224
+ this.iframes.forEach(iframe => this.wrap(iframe));
225
+ // Set element in this trap deduplicating any that may have been duplicated
226
+ // with careless user inclusions.
227
+ this.elements = deduplicate([...queryTabbable(this.host), ...inclusions]);
228
+ // Get the focusable elements. This may be overkill as we really only need
229
+ // to know the first and last focusable. If that is the case, we may be
230
+ // able to just use the first and last `this.element` it is still not clear.
231
+ this.focusableElements = this.elements
232
+ .reduce((acc, value) => {
233
+ if (isFocusable(value) && !this.trapElements.includes(value)) {
234
+ acc.push(value);
235
+ }
236
+ return acc;
237
+ }, []);
238
+ /**
239
+ * We can not currently do this this way because MSEdge
240
+ * is reordering querySelectorAll items such that they
241
+ * not selecting in DOM order. If/when we dump support
242
+ * for MSEdge (non Chromium) or it fixes support we
243
+ * can move to this more efficient way. Until then, we
244
+ * need to use the && condition .includes in the
245
+ * `reduce` above. It will be more efficient to do it
246
+ * the below way when we can.
247
+ */
248
+ // this.focusableElements.shift();
249
+ // this.focusableElements.pop();
250
+ //This may need to be defied more specifically as a11y as it is needed
251
+ //for the screen reader capabilities and may be interfering with
252
+ //regular usage.
253
+ this.outerElements = [...queryFocusable(document.body), ...exclusions, ...shadowExclusions]
254
+ .filter(element => !(element === this.host ||
255
+ innerElements.includes(element) ||
256
+ inclusions.includes(element)));
257
+ }
258
+ componentDidLoad() {
259
+ const trapStart = this.createTrapTag();
260
+ const trapEnd = this.createTrapTag();
261
+ this.trapElements = [trapStart, trapEnd];
262
+ this.host.insertBefore(trapStart, this.host.firstChild);
263
+ this.host.appendChild(trapEnd);
264
+ this.initialize();
265
+ if (this.active) {
266
+ this.handleActivate();
267
+ }
268
+ else {
269
+ this.handleDeactivate();
270
+ }
271
+ }
272
+ disconnectedCallback() {
273
+ if (this.active) {
274
+ this.handleDeactivate();
275
+ }
276
+ }
277
+ render() {
278
+ return h("slot", null);
279
+ }
280
+ static get is() { return "ku4-focus-trap"; }
281
+ static get encapsulation() { return "shadow"; }
282
+ static get originalStyleUrls() { return {
283
+ "$": ["ku4-focus-trap.scss"]
284
+ }; }
285
+ static get styleUrls() { return {
286
+ "$": ["ku4-focus-trap.css"]
287
+ }; }
288
+ static get properties() { return {
289
+ "active": {
290
+ "type": "boolean",
291
+ "mutable": true,
292
+ "complexType": {
293
+ "original": "boolean",
294
+ "resolved": "boolean",
295
+ "references": {}
296
+ },
297
+ "required": false,
298
+ "optional": false,
299
+ "docs": {
300
+ "tags": [],
301
+ "text": "Focus trap will be active when true."
302
+ },
303
+ "attribute": "active",
304
+ "reflect": true,
305
+ "defaultValue": "false"
306
+ },
307
+ "include": {
308
+ "type": "string",
309
+ "mutable": false,
310
+ "complexType": {
311
+ "original": "string",
312
+ "resolved": "string",
313
+ "references": {}
314
+ },
315
+ "required": false,
316
+ "optional": false,
317
+ "docs": {
318
+ "tags": [],
319
+ "text": "A querySelector of elements to include in the trap that\nare not children of this focus trap. This can be useful\nfor specific situations such as modal overlays."
320
+ },
321
+ "attribute": "include",
322
+ "reflect": false
323
+ },
324
+ "exclude": {
325
+ "type": "string",
326
+ "mutable": false,
327
+ "complexType": {
328
+ "original": "string",
329
+ "resolved": "string",
330
+ "references": {}
331
+ },
332
+ "required": false,
333
+ "optional": false,
334
+ "docs": {
335
+ "tags": [],
336
+ "text": "A querySelector of elements to explicitly exclude. This\ncan be useful for greedy accessibility apis and screen\nreader fallover. Pass a comma delimited string of multiple\nselectors to target multiple exclusions."
337
+ },
338
+ "attribute": "exclude",
339
+ "reflect": false
340
+ },
341
+ "excludeShadow": {
342
+ "type": "string",
343
+ "mutable": false,
344
+ "complexType": {
345
+ "original": "string",
346
+ "resolved": "string",
347
+ "references": {}
348
+ },
349
+ "required": false,
350
+ "optional": false,
351
+ "docs": {
352
+ "tags": [],
353
+ "text": "A querySelector of shadow elements to explicitly exclude. This\ncan be useful for greedy accessibility apis and screen\nreader fallover. Pass a comma delimited string of multiple\nselectors to target multiple exclusions. Pass selectors that\nstarts with the target components host lightDom element\nE.g. `'ku4-carousel .next, ku4-carousel .prev'` will explicitly\nexclude the target ku4-carousel next and previous buttons from\nbeing navigable by greedy accessibility tools, i.e. VoiceOver."
354
+ },
355
+ "attribute": "exclude-shadow",
356
+ "reflect": false
357
+ },
358
+ "initial": {
359
+ "type": "string",
360
+ "mutable": false,
361
+ "complexType": {
362
+ "original": "string",
363
+ "resolved": "string",
364
+ "references": {}
365
+ },
366
+ "required": false,
367
+ "optional": false,
368
+ "docs": {
369
+ "tags": [],
370
+ "text": "A querySelector of element to initially focus"
371
+ },
372
+ "attribute": "initial",
373
+ "reflect": false
374
+ },
375
+ "return": {
376
+ "type": "string",
377
+ "mutable": false,
378
+ "complexType": {
379
+ "original": "string",
380
+ "resolved": "string",
381
+ "references": {}
382
+ },
383
+ "required": false,
384
+ "optional": false,
385
+ "docs": {
386
+ "tags": [],
387
+ "text": "A querySelector of element to return focus to"
388
+ },
389
+ "attribute": "return",
390
+ "reflect": false
391
+ }
392
+ }; }
393
+ static get methods() { return {
394
+ "activate": {
395
+ "complexType": {
396
+ "signature": "(element?: any) => Promise<void>",
397
+ "parameters": [{
398
+ "tags": [{
399
+ "name": "param",
400
+ "text": "element - Element to return focus to when trap is deactivated."
401
+ }],
402
+ "text": "- Element to return focus to when trap is deactivated."
403
+ }],
404
+ "references": {
405
+ "Promise": {
406
+ "location": "global"
407
+ }
408
+ },
409
+ "return": "Promise<void>"
410
+ },
411
+ "docs": {
412
+ "text": "Activate focus trap",
413
+ "tags": [{
414
+ "name": "param",
415
+ "text": "element - Element to return focus to when trap is deactivated."
416
+ }]
417
+ }
418
+ },
419
+ "deactivate": {
420
+ "complexType": {
421
+ "signature": "() => Promise<void>",
422
+ "parameters": [],
423
+ "references": {
424
+ "Promise": {
425
+ "location": "global"
426
+ }
427
+ },
428
+ "return": "Promise<void>"
429
+ },
430
+ "docs": {
431
+ "text": "Deactivate focus trap.",
432
+ "tags": []
433
+ }
434
+ }
435
+ }; }
436
+ static get elementRef() { return "host"; }
437
+ static get watchers() { return [{
438
+ "propName": "active",
439
+ "methodName": "activeHandler"
440
+ }]; }
441
+ }
@@ -0,0 +1,225 @@
1
+ import { Component, Method, Element, h, Prop } from '@stencil/core';
2
+ import { Assert } from 'ku4es-kernel';
3
+ import { form } from 'ku4es-ui-kernel';
4
+ /**
5
+ * @description ku4-form
6
+ */
7
+ export class Ku4Form {
8
+ constructor() {
9
+ this.validate = this.validate.bind(this);
10
+ this.handleReset = this.handleReset.bind(this);
11
+ }
12
+ /**
13
+ * Returns a list of the names of all of the fields
14
+ * associated with this form.
15
+ */
16
+ async listFieldNames() {
17
+ return form.readFieldNames(this.form);
18
+ }
19
+ /**
20
+ * Validates this form. This method is automatically called
21
+ * internally on submit of the form only allowing a successful
22
+ * submit if the form is valid.
23
+ */
24
+ async validate() {
25
+ const { fields } = this;
26
+ const methods = fields.map(field => field.validate());
27
+ this.isValid = await Promise.all(methods).then(values => !values.some(v => v === false));
28
+ this.invalid = !this.isValid;
29
+ return this.isValid;
30
+ }
31
+ /**
32
+ * A string of the name of the field to invalidate
33
+ * @param {string} name
34
+ */
35
+ async invalidate(name) {
36
+ if (Assert.isArray(name)) {
37
+ name.forEach((name) => {
38
+ const field = this.fields.find(field => field.for === name);
39
+ if (field) {
40
+ field.invalid = true;
41
+ }
42
+ });
43
+ }
44
+ else {
45
+ const field = this.fields.find(field => field.for === name);
46
+ if (field) {
47
+ field.invalid = true;
48
+ }
49
+ }
50
+ this.invalid = true;
51
+ return this;
52
+ }
53
+ /**
54
+ * Reads data from the associated form
55
+ */
56
+ async read() {
57
+ return form.read(this.form);
58
+ }
59
+ /**
60
+ * Writes data to the associated form
61
+ */
62
+ async write(data) {
63
+ form.write(this.form, data);
64
+ Object.keys(data).forEach((name) => {
65
+ try {
66
+ this.form.querySelector(`[name="${name}"]`)
67
+ .dispatchEvent(new Event('change'));
68
+ }
69
+ catch (e) {
70
+ /* Fail silently */
71
+ }
72
+ });
73
+ return this;
74
+ }
75
+ get form() {
76
+ return this.host.querySelector('form');
77
+ }
78
+ get fields() {
79
+ return [].slice.call(this.form.querySelectorAll('ku4-validation'));
80
+ }
81
+ handleReset() {
82
+ this.isValid = true;
83
+ this.invalid = !this.isValid;
84
+ }
85
+ componentWillLoad() {
86
+ const { form } = this;
87
+ if (Assert.exists(form)) {
88
+ const onsubmit = form.onsubmit || (() => { });
89
+ form.onsubmit = (e) => {
90
+ e.preventDefault();
91
+ this.validate()
92
+ .then(valid => valid && onsubmit.call(form, e))
93
+ .then(returnValue => !Assert.isFalse(returnValue) && form.submit());
94
+ return false;
95
+ };
96
+ form.addEventListener('reset', this.handleReset);
97
+ this.fields.forEach(field => field.addEventListener('validated', this.validate));
98
+ }
99
+ }
100
+ disconnectedCallback() {
101
+ const { form } = this;
102
+ if (Assert.exists(form)) {
103
+ form.removeEventListener('reset', this.handleReset);
104
+ this.fields.forEach(field => field.removeEventListener('validated', this.validate));
105
+ }
106
+ }
107
+ render() {
108
+ return h("slot", null);
109
+ }
110
+ static get is() { return "ku4-form"; }
111
+ static get properties() { return {
112
+ "invalid": {
113
+ "type": "boolean",
114
+ "mutable": true,
115
+ "complexType": {
116
+ "original": "boolean",
117
+ "resolved": "boolean",
118
+ "references": {}
119
+ },
120
+ "required": false,
121
+ "optional": false,
122
+ "docs": {
123
+ "tags": [],
124
+ "text": "Set to true to display as invalid"
125
+ },
126
+ "attribute": "invalid",
127
+ "reflect": true
128
+ }
129
+ }; }
130
+ static get methods() { return {
131
+ "listFieldNames": {
132
+ "complexType": {
133
+ "signature": "() => Promise<any>",
134
+ "parameters": [],
135
+ "references": {
136
+ "Promise": {
137
+ "location": "global"
138
+ }
139
+ },
140
+ "return": "Promise<any>"
141
+ },
142
+ "docs": {
143
+ "text": "Returns a list of the names of all of the fields\nassociated with this form.",
144
+ "tags": []
145
+ }
146
+ },
147
+ "validate": {
148
+ "complexType": {
149
+ "signature": "() => Promise<any>",
150
+ "parameters": [],
151
+ "references": {
152
+ "Promise": {
153
+ "location": "global"
154
+ }
155
+ },
156
+ "return": "Promise<any>"
157
+ },
158
+ "docs": {
159
+ "text": "Validates this form. This method is automatically called\ninternally on submit of the form only allowing a successful\nsubmit if the form is valid.",
160
+ "tags": []
161
+ }
162
+ },
163
+ "invalidate": {
164
+ "complexType": {
165
+ "signature": "(name: any) => Promise<this>",
166
+ "parameters": [{
167
+ "tags": [{
168
+ "name": "param",
169
+ "text": "name"
170
+ }],
171
+ "text": ""
172
+ }],
173
+ "references": {
174
+ "Promise": {
175
+ "location": "global"
176
+ }
177
+ },
178
+ "return": "Promise<this>"
179
+ },
180
+ "docs": {
181
+ "text": "A string of the name of the field to invalidate",
182
+ "tags": [{
183
+ "name": "param",
184
+ "text": "name"
185
+ }]
186
+ }
187
+ },
188
+ "read": {
189
+ "complexType": {
190
+ "signature": "() => Promise<any>",
191
+ "parameters": [],
192
+ "references": {
193
+ "Promise": {
194
+ "location": "global"
195
+ }
196
+ },
197
+ "return": "Promise<any>"
198
+ },
199
+ "docs": {
200
+ "text": "Reads data from the associated form",
201
+ "tags": []
202
+ }
203
+ },
204
+ "write": {
205
+ "complexType": {
206
+ "signature": "(data: any) => Promise<this>",
207
+ "parameters": [{
208
+ "tags": [],
209
+ "text": ""
210
+ }],
211
+ "references": {
212
+ "Promise": {
213
+ "location": "global"
214
+ }
215
+ },
216
+ "return": "Promise<this>"
217
+ },
218
+ "docs": {
219
+ "text": "Writes data to the associated form",
220
+ "tags": []
221
+ }
222
+ }
223
+ }; }
224
+ static get elementRef() { return "host"; }
225
+ }