ku4web-components 6.4.80 → 6.4.83

Sign up to get free protection for your applications and to get access to all the features.
Files changed (281) 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-6ca600c2.js +6 -0
  5. package/dist/cjs/dom-8d415461.js +75 -0
  6. package/dist/cjs/index-652a3cbf.js +14 -0
  7. package/dist/cjs/{index-1e13241e.js → index-a7b6d98c.js} +1 -1
  8. package/dist/cjs/index-c904eb3a.js +10 -0
  9. package/dist/cjs/index-ca4336bd.js +3093 -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 +14 -7
  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-78860e39.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 +369 -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-e6dd2538.js +4 -0
  96. package/dist/esm/dom-7fc649b0.js +73 -0
  97. package/dist/esm/index-3e1e5aa3.js +3 -0
  98. package/dist/esm/index-7fe386de.js +3057 -0
  99. package/dist/esm/index-7ff6e718.js +3 -0
  100. package/dist/esm/{index-9e3af5f4.js → index-81a98b72.js} +1 -1
  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 +14 -7
  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-4d56fa31.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-81a98b72.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-4d56fa31.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-b6eec689.system.js +1 -0
  157. package/dist/ku4web-components/css-shim-e6dd2538.js +4 -0
  158. package/dist/ku4web-components/dom-7fc649b0.js +73 -0
  159. package/dist/ku4web-components/dom-88962da0.system.js +21 -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-5029fd1f.system.js +1 -0
  163. package/dist/ku4web-components/index-7d482e8a.system.js +1 -0
  164. package/dist/ku4web-components/index-7fe386de.js +3057 -0
  165. package/dist/ku4web-components/index-7ff6e718.js +3 -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 +175 -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-15ee8b8e.system.entry.js → p-02328d34.system.entry.js} +1 -1
  213. package/dist/ku4web-components/{p-01debe28.system.entry.js → p-050f184b.system.entry.js} +1 -1
  214. package/dist/ku4web-components/{p-8e2fca0b.system.entry.js → p-073cefec.system.entry.js} +1 -1
  215. package/dist/ku4web-components/{p-22eed87f.entry.js → p-097ba217.entry.js} +1 -1
  216. package/dist/ku4web-components/{p-f1cc1b2d.entry.js → p-0adeb8e4.entry.js} +1 -1
  217. package/dist/ku4web-components/{p-840704e4.entry.js → p-0ce97586.entry.js} +1 -1
  218. package/dist/ku4web-components/p-0f77bef9.system.js +1 -0
  219. package/dist/ku4web-components/{p-761b2cbc.system.entry.js → p-136e5a03.system.entry.js} +1 -1
  220. package/dist/ku4web-components/p-17d548db.js +1 -0
  221. package/dist/ku4web-components/{p-c1068ffa.js → p-189cde73.js} +1 -1
  222. package/dist/ku4web-components/{p-2f2d74dc.system.entry.js → p-1d5a1caf.system.entry.js} +1 -1
  223. package/dist/ku4web-components/{p-a5c7f5f7.system.entry.js → p-288482da.system.entry.js} +1 -1
  224. package/dist/ku4web-components/{p-0e010c10.system.entry.js → p-3a0d1ff7.system.entry.js} +1 -1
  225. package/dist/ku4web-components/{p-d360c64a.entry.js → p-3f147a02.entry.js} +1 -1
  226. package/dist/ku4web-components/{p-0f8708f8.entry.js → p-3f2a008c.entry.js} +1 -1
  227. package/dist/ku4web-components/{p-8faad87d.entry.js → p-3f4082d5.entry.js} +1 -1
  228. package/dist/ku4web-components/{p-7273db60.entry.js → p-49275772.entry.js} +1 -1
  229. package/dist/ku4web-components/{p-232787a5.system.entry.js → p-4bfca34b.system.entry.js} +1 -1
  230. package/dist/ku4web-components/{p-04948520.system.entry.js → p-524cef27.system.entry.js} +1 -1
  231. package/dist/ku4web-components/{p-67adc5b1.system.entry.js → p-52d815ab.system.entry.js} +1 -1
  232. package/dist/ku4web-components/{p-2edd35f8.system.entry.js → p-596beaad.system.entry.js} +1 -1
  233. package/dist/ku4web-components/{p-f06bf0ae.entry.js → p-5f9d0077.entry.js} +1 -1
  234. package/dist/ku4web-components/{p-660ebd19.entry.js → p-5fcea805.entry.js} +1 -1
  235. package/dist/ku4web-components/{p-adddaeef.entry.js → p-61214088.entry.js} +1 -1
  236. package/dist/ku4web-components/{p-d6ec34c3.entry.js → p-66b8247f.entry.js} +1 -1
  237. package/dist/ku4web-components/{p-9c0d71af.system.entry.js → p-6b9e3523.system.entry.js} +1 -1
  238. package/dist/ku4web-components/{p-02e342f7.system.entry.js → p-6cfd9011.system.entry.js} +1 -1
  239. package/dist/ku4web-components/{p-8d9eb18b.system.entry.js → p-7bfc256a.system.entry.js} +1 -1
  240. package/dist/ku4web-components/{p-77f1853c.entry.js → p-818caf0f.entry.js} +1 -1
  241. package/dist/ku4web-components/{p-3874127d.entry.js → p-8642aef5.entry.js} +1 -1
  242. package/dist/ku4web-components/{p-f6455ab3.js → p-881e100a.js} +0 -0
  243. package/dist/ku4web-components/{p-19a8c0f6.system.entry.js → p-95698618.system.entry.js} +1 -1
  244. package/dist/ku4web-components/{p-f0b1c07c.system.js → p-96ec7b4f.system.js} +1 -1
  245. package/dist/ku4web-components/{p-ce6eddc3.system.entry.js → p-a0d0c99e.system.entry.js} +1 -1
  246. package/dist/ku4web-components/{p-b4488a7d.system.entry.js → p-acb43765.system.entry.js} +1 -1
  247. package/dist/ku4web-components/{p-c19fd841.entry.js → p-b47bb3d0.entry.js} +1 -1
  248. package/dist/ku4web-components/{p-0785fc39.system.js → p-c3293202.system.js} +1 -1
  249. package/dist/ku4web-components/{p-eb6882c8.entry.js → p-c798faf2.entry.js} +1 -1
  250. package/dist/ku4web-components/{p-3c182b2f.entry.js → p-cd0d0b40.entry.js} +1 -1
  251. package/dist/ku4web-components/p-cd4cdcbb.entry.js +1 -0
  252. package/dist/ku4web-components/{p-8f480cb5.system.entry.js → p-d848909c.system.entry.js} +1 -1
  253. package/dist/ku4web-components/{p-90c37394.entry.js → p-d8868855.entry.js} +1 -1
  254. package/dist/ku4web-components/p-db3040f3.system.js +1 -0
  255. package/dist/ku4web-components/{p-2aac6c90.js → p-e6b3a708.js} +1 -1
  256. package/dist/ku4web-components/{p-c50540ec.system.entry.js → p-ea4b32de.system.entry.js} +1 -1
  257. package/dist/ku4web-components/{p-e4ff1c36.entry.js → p-f3fbe1e6.entry.js} +1 -1
  258. package/dist/ku4web-components/p-f64c1f55.entry.js +1 -0
  259. package/dist/ku4web-components/{p-71d57b8b.system.js → p-fbf3ad1e.system.js} +0 -0
  260. package/dist/ku4web-components/{p-0eb73a0f.system.entry.js → p-fc0c3bf4.system.entry.js} +1 -1
  261. package/dist/ku4web-components/shadow-css-4d56fa31.js +388 -0
  262. package/dist/ku4web-components/shadow-css-d0426811.system.js +13 -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/ku4-carousel.d.ts +3 -2
  266. package/dist/types/components/ku4-carousel-controls/ku4-carousel-controls.d.ts +1 -0
  267. package/dist/types/components/ku4-carousel-slide/ku4-carousel-slide.d.ts +6 -0
  268. package/dist/types/components.d.ts +10 -2
  269. package/package.json +15 -15
  270. package/react/index.js +1 -1
  271. package/react/index.mjs +1 -1
  272. package/vue/index.js +1 -1
  273. package/vue/index.mjs +1 -1
  274. package/vue3/index.js +1 -1
  275. package/vue3/index.mjs +1 -1
  276. package/dist/esm-es5/uid-15f8c937.js +0 -1
  277. package/dist/ku4web-components/p-7a47027b.entry.js +0 -1
  278. package/dist/ku4web-components/p-b590da20.entry.js +0 -1
  279. package/dist/ku4web-components/p-be7890a1.system.js +0 -1
  280. package/dist/ku4web-components/p-cbbb4b1b.js +0 -1
  281. package/dist/ku4web-components/p-eb58b04b.system.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
+ }