wj-elements 0.2.0-alpha.9 → 0.3.0-alpha.2

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 (264) hide show
  1. package/dist/animations.js.map +1 -1
  2. package/dist/base-path.js.map +1 -1
  3. package/dist/dark.css +15 -1
  4. package/dist/date.js.map +1 -1
  5. package/dist/element-utils.js.map +1 -1
  6. package/dist/event.js.map +1 -1
  7. package/dist/{form-associated-element-o0UjvdUp.js → form-associated-element-DEQ4y-jn.js} +1 -2
  8. package/dist/form-associated-element-DEQ4y-jn.js.map +1 -0
  9. package/dist/{icon-DY5AZ6xM.js → icon-DVyMc4Wv.js} +36 -2
  10. package/dist/{icon-DY5AZ6xM.js.map → icon-DVyMc4Wv.js.map} +1 -1
  11. package/dist/light.css +7 -2
  12. package/dist/localize.js +8 -5
  13. package/dist/localize.js.map +1 -1
  14. package/dist/packages/internals/form-associated-element.d.ts +0 -1
  15. package/dist/packages/utils/utils.d.ts +16 -0
  16. package/dist/packages/wje-accordion-item/accordion-item.element.d.ts +3 -0
  17. package/dist/packages/wje-avatar/avatar.element.d.ts +5 -0
  18. package/dist/packages/wje-breadcrumb/breadcrumb.element.d.ts +1 -0
  19. package/dist/packages/wje-button/button.element.d.ts +5 -1
  20. package/dist/packages/wje-button-group/button-group.element.d.ts +4 -0
  21. package/dist/packages/wje-card/card.element.d.ts +15 -6
  22. package/dist/packages/wje-carousel/carousel.element.d.ts +4 -0
  23. package/dist/packages/wje-checkbox/checkbox.element.d.ts +14 -0
  24. package/dist/packages/wje-chip/chip.element.d.ts +6 -0
  25. package/dist/packages/wje-color-picker/color-picker.element.d.ts +43 -1
  26. package/dist/packages/wje-copy-button/copy-button.element.d.ts +4 -0
  27. package/dist/packages/wje-dialog/dialog.element.d.ts +2 -0
  28. package/dist/packages/wje-dropdown/dropdown.element.d.ts +7 -0
  29. package/dist/packages/wje-element/element.d.ts +55 -24
  30. package/dist/packages/wje-file-upload/file-upload.element.d.ts +17 -6
  31. package/dist/packages/wje-file-upload/service/service.d.ts +0 -23
  32. package/dist/packages/wje-file-upload-item/file-upload-item.element.d.ts +5 -0
  33. package/dist/packages/wje-format-digital/format-digital.element.d.ts +2 -0
  34. package/dist/packages/wje-icon/icon.element.d.ts +11 -0
  35. package/dist/packages/wje-icon-picker/icon-picker.element.d.ts +4 -0
  36. package/dist/packages/wje-img/img.element.d.ts +1 -0
  37. package/dist/packages/wje-infinite-scroll/infinite-scroll.element.d.ts +4 -0
  38. package/dist/packages/wje-input/input.element.d.ts +9 -1
  39. package/dist/packages/wje-item/item.element.d.ts +8 -0
  40. package/dist/packages/wje-kanban/kanban.element.d.ts +4 -0
  41. package/dist/packages/wje-level-indicator/level-indicator.element.d.ts +17 -0
  42. package/dist/packages/wje-list/list.element.d.ts +4 -0
  43. package/dist/packages/wje-menu-item/menu-item.element.d.ts +4 -0
  44. package/dist/packages/wje-option/option.element.d.ts +4 -0
  45. package/dist/packages/wje-options/options.element.d.ts +4 -0
  46. package/dist/packages/wje-orgchart/orgchart.element.d.ts +4 -0
  47. package/dist/packages/wje-progress-bar/progress-bar.element.d.ts +11 -0
  48. package/dist/packages/wje-qr-code/qr-code.element.d.ts +63 -0
  49. package/dist/packages/wje-radio/radio.element.d.ts +5 -0
  50. package/dist/packages/wje-radio-group/radio-group.element.d.ts +16 -1
  51. package/dist/packages/wje-rate/rate.element.d.ts +4 -0
  52. package/dist/packages/wje-relative-time/relative-time.element.d.ts +2 -0
  53. package/dist/packages/wje-reorder/reorder.element.d.ts +4 -0
  54. package/dist/packages/wje-reorder-handle/reorder-handle.element.d.ts +4 -0
  55. package/dist/packages/wje-select/select.element.d.ts +7 -0
  56. package/dist/packages/wje-slider/slider.element.d.ts +5 -0
  57. package/dist/packages/wje-sliding-container/sliding-container.element.d.ts +4 -0
  58. package/dist/packages/wje-split-view/split-view.element.d.ts +1 -0
  59. package/dist/packages/wje-stepper/stepper.element.d.ts +1 -0
  60. package/dist/packages/wje-tab/tab.element.d.ts +10 -0
  61. package/dist/packages/wje-tab-group/tab-group.element.d.ts +11 -0
  62. package/dist/packages/wje-textarea/textarea.element.d.ts +20 -1
  63. package/dist/packages/wje-thumbnail/thumbnail.element.d.ts +4 -0
  64. package/dist/packages/wje-timeline/timeline.element.d.ts +4 -0
  65. package/dist/packages/wje-toggle/toggle.element.d.ts +4 -0
  66. package/dist/packages/wje-toolbar/toolbar.element.d.ts +4 -0
  67. package/dist/packages/wje-tooltip/tooltip.element.d.ts +3 -0
  68. package/dist/packages/wje-tree/tree.element.d.ts +4 -0
  69. package/dist/packages/wje-tree-item/tree-item.element.d.ts +5 -0
  70. package/dist/permissions.js.map +1 -1
  71. package/dist/{popup.element-DeajFyOQ.js → popup.element-DklicGea.js} +130 -97
  72. package/dist/popup.element-DklicGea.js.map +1 -0
  73. package/dist/{router-links-CJnOdbas.js → router-links-wjqCnncc.js} +9 -3
  74. package/dist/router-links-wjqCnncc.js.map +1 -0
  75. package/dist/skeleton.css +197 -0
  76. package/dist/universal-service.js.map +1 -1
  77. package/dist/utils.js +18 -1
  78. package/dist/utils.js.map +1 -1
  79. package/dist/wje-accordion-item.js +26 -4
  80. package/dist/wje-accordion-item.js.map +1 -1
  81. package/dist/wje-accordion.js +1 -0
  82. package/dist/wje-accordion.js.map +1 -1
  83. package/dist/wje-animation.js +1 -0
  84. package/dist/wje-animation.js.map +1 -1
  85. package/dist/wje-aside.js.map +1 -1
  86. package/dist/wje-avatar.js +18 -0
  87. package/dist/wje-avatar.js.map +1 -1
  88. package/dist/wje-badge.js +1 -0
  89. package/dist/wje-badge.js.map +1 -1
  90. package/dist/wje-breadcrumb.js +13 -1
  91. package/dist/wje-breadcrumb.js.map +1 -1
  92. package/dist/wje-breadcrumbs.js +1 -0
  93. package/dist/wje-breadcrumbs.js.map +1 -1
  94. package/dist/wje-button-group.js +10 -0
  95. package/dist/wje-button-group.js.map +1 -1
  96. package/dist/wje-button.js +30 -6
  97. package/dist/wje-button.js.map +1 -1
  98. package/dist/wje-card-content.js.map +1 -1
  99. package/dist/wje-card-controls.js.map +1 -1
  100. package/dist/wje-card-header.js.map +1 -1
  101. package/dist/wje-card-subtitle.js.map +1 -1
  102. package/dist/wje-card-title.js.map +1 -1
  103. package/dist/wje-card.js +37 -0
  104. package/dist/wje-card.js.map +1 -1
  105. package/dist/wje-carousel-item.js.map +1 -1
  106. package/dist/wje-carousel.js +38 -4
  107. package/dist/wje-carousel.js.map +1 -1
  108. package/dist/wje-checkbox.js +48 -3
  109. package/dist/wje-checkbox.js.map +1 -1
  110. package/dist/wje-chip.js +22 -0
  111. package/dist/wje-chip.js.map +1 -1
  112. package/dist/wje-col.js.map +1 -1
  113. package/dist/wje-color-picker.js +145 -31
  114. package/dist/wje-color-picker.js.map +1 -1
  115. package/dist/wje-container.js.map +1 -1
  116. package/dist/wje-copy-button.js +21 -0
  117. package/dist/wje-copy-button.js.map +1 -1
  118. package/dist/wje-dialog.js +35 -2
  119. package/dist/wje-dialog.js.map +1 -1
  120. package/dist/wje-divider.js.map +1 -1
  121. package/dist/wje-dropdown.js +27 -3
  122. package/dist/wje-dropdown.js.map +1 -1
  123. package/dist/wje-element.js +87 -242
  124. package/dist/wje-element.js.map +1 -1
  125. package/dist/wje-file-upload-item.js +23 -1
  126. package/dist/wje-file-upload-item.js.map +1 -1
  127. package/dist/wje-file-upload.js +100 -77
  128. package/dist/wje-file-upload.js.map +1 -1
  129. package/dist/wje-footer.js.map +1 -1
  130. package/dist/wje-form.js.map +1 -1
  131. package/dist/wje-format-digital.js +9 -0
  132. package/dist/wje-format-digital.js.map +1 -1
  133. package/dist/wje-grid.js.map +1 -1
  134. package/dist/wje-header.js.map +1 -1
  135. package/dist/wje-icon-library.js.map +1 -1
  136. package/dist/wje-icon-picker.js +15 -0
  137. package/dist/wje-icon-picker.js.map +1 -1
  138. package/dist/wje-icon.js +1 -1
  139. package/dist/wje-img-comparer.js +5 -1
  140. package/dist/wje-img-comparer.js.map +1 -1
  141. package/dist/wje-img.js +16 -1
  142. package/dist/wje-img.js.map +1 -1
  143. package/dist/wje-infinite-scroll.js +10 -0
  144. package/dist/wje-infinite-scroll.js.map +1 -1
  145. package/dist/wje-input-file.js +2 -0
  146. package/dist/wje-input-file.js.map +1 -1
  147. package/dist/wje-input.js +59 -4
  148. package/dist/wje-input.js.map +1 -1
  149. package/dist/wje-item.js +14 -0
  150. package/dist/wje-item.js.map +1 -1
  151. package/dist/wje-kanban.js +14 -0
  152. package/dist/wje-kanban.js.map +1 -1
  153. package/dist/wje-label.js.map +1 -1
  154. package/dist/wje-level-indicator.js +36 -0
  155. package/dist/wje-level-indicator.js.map +1 -1
  156. package/dist/wje-list.js +10 -0
  157. package/dist/wje-list.js.map +1 -1
  158. package/dist/wje-main.js.map +1 -1
  159. package/dist/wje-masonry.js.map +1 -1
  160. package/dist/wje-master.js +12 -3
  161. package/dist/wje-master.js.map +1 -1
  162. package/dist/wje-menu-button.js +1 -0
  163. package/dist/wje-menu-button.js.map +1 -1
  164. package/dist/wje-menu-item.js +25 -1
  165. package/dist/wje-menu-item.js.map +1 -1
  166. package/dist/wje-menu-label.js.map +1 -1
  167. package/dist/wje-menu.js +4 -1
  168. package/dist/wje-menu.js.map +1 -1
  169. package/dist/wje-option.js +14 -1
  170. package/dist/wje-option.js.map +1 -1
  171. package/dist/wje-options.js +13 -0
  172. package/dist/wje-options.js.map +1 -1
  173. package/dist/wje-orgchart-group.js.map +1 -1
  174. package/dist/wje-orgchart-item.js.map +1 -1
  175. package/dist/wje-orgchart.js +9 -0
  176. package/dist/wje-orgchart.js.map +1 -1
  177. package/dist/wje-pagination.js +18 -9
  178. package/dist/wje-pagination.js.map +1 -1
  179. package/dist/wje-popup.js +1 -1
  180. package/dist/wje-progress-bar.js +26 -0
  181. package/dist/wje-progress-bar.js.map +1 -1
  182. package/dist/wje-qr-code.js +162 -20
  183. package/dist/wje-qr-code.js.map +1 -1
  184. package/dist/wje-radio-group.js +49 -2
  185. package/dist/wje-radio-group.js.map +1 -1
  186. package/dist/wje-radio.js +27 -1
  187. package/dist/wje-radio.js.map +1 -1
  188. package/dist/wje-rate.js +23 -1
  189. package/dist/wje-rate.js.map +1 -1
  190. package/dist/wje-relative-time.js +14 -1
  191. package/dist/wje-relative-time.js.map +1 -1
  192. package/dist/wje-reorder-dropzone.js.map +1 -1
  193. package/dist/wje-reorder-handle.js +21 -0
  194. package/dist/wje-reorder-handle.js.map +1 -1
  195. package/dist/wje-reorder-item.js.map +1 -1
  196. package/dist/wje-reorder.js +10 -0
  197. package/dist/wje-reorder.js.map +1 -1
  198. package/dist/wje-route.js.map +1 -1
  199. package/dist/wje-router-link.js +1 -1
  200. package/dist/wje-router-link.js.map +1 -1
  201. package/dist/wje-router-outlet.js +15 -5
  202. package/dist/wje-router-outlet.js.map +1 -1
  203. package/dist/wje-routerx.js +64 -66
  204. package/dist/wje-routerx.js.map +1 -1
  205. package/dist/wje-row.js.map +1 -1
  206. package/dist/wje-select.js +35 -5
  207. package/dist/wje-select.js.map +1 -1
  208. package/dist/wje-slider.js +51 -1
  209. package/dist/wje-slider.js.map +1 -1
  210. package/dist/wje-sliding-container.js +18 -0
  211. package/dist/wje-sliding-container.js.map +1 -1
  212. package/dist/wje-split-view.js +9 -0
  213. package/dist/wje-split-view.js.map +1 -1
  214. package/dist/wje-status.js +1 -0
  215. package/dist/wje-status.js.map +1 -1
  216. package/dist/wje-step.js.map +1 -1
  217. package/dist/wje-stepper.js +24 -1
  218. package/dist/wje-stepper.js.map +1 -1
  219. package/dist/wje-store.js.map +1 -1
  220. package/dist/wje-tab-group.js +59 -2
  221. package/dist/wje-tab-group.js.map +1 -1
  222. package/dist/wje-tab-panel.js.map +1 -1
  223. package/dist/wje-tab.js +31 -1
  224. package/dist/wje-tab.js.map +1 -1
  225. package/dist/wje-textarea.js +96 -14
  226. package/dist/wje-textarea.js.map +1 -1
  227. package/dist/wje-thumbnail.js +19 -0
  228. package/dist/wje-thumbnail.js.map +1 -1
  229. package/dist/wje-toast.js +4 -0
  230. package/dist/wje-toast.js.map +1 -1
  231. package/dist/wje-toggle.js +17 -1
  232. package/dist/wje-toggle.js.map +1 -1
  233. package/dist/wje-toolbar-action.js.map +1 -1
  234. package/dist/wje-toolbar.js +14 -0
  235. package/dist/wje-toolbar.js.map +1 -1
  236. package/dist/wje-tooltip.js +31 -7
  237. package/dist/wje-tooltip.js.map +1 -1
  238. package/dist/wje-tree-item.js +41 -5
  239. package/dist/wje-tree-item.js.map +1 -1
  240. package/dist/wje-tree.js +12 -1
  241. package/dist/wje-tree.js.map +1 -1
  242. package/dist/wje-visually-hidden.js.map +1 -1
  243. package/package.json +22 -3
  244. package/dist/form-associated-element-o0UjvdUp.js.map +0 -1
  245. package/dist/packages/wje-accordion/accordion.test.d.ts +0 -0
  246. package/dist/packages/wje-animation/animation.test.d.ts +0 -1
  247. package/dist/packages/wje-avatar/avatar.test.d.ts +0 -1
  248. package/dist/packages/wje-badge/badge.test.d.ts +0 -1
  249. package/dist/packages/wje-breadcrumbs/breadcrumbs.test.d.ts +0 -1
  250. package/dist/packages/wje-button/button.test.d.ts +0 -1
  251. package/dist/packages/wje-chip/chip.test.d.ts +0 -1
  252. package/dist/packages/wje-color-picker/color-picker.test.d.ts +0 -1
  253. package/dist/packages/wje-file-upload/file-upload.test.d.ts +0 -1
  254. package/dist/packages/wje-format-digital/format-digital.test.d.ts +0 -1
  255. package/dist/packages/wje-pagination/pagination.test.d.ts +0 -1
  256. package/dist/packages/wje-relative-time/relative-time.test.d.ts +0 -1
  257. package/dist/packages/wje-select/select.test.d.ts +0 -1
  258. package/dist/packages/wje-tab-group/tab-group.test.d.ts +0 -1
  259. package/dist/packages/wje-toast/toast.test.d.ts +0 -1
  260. package/dist/packages/wje-toggle/toggle.test.d.ts +0 -1
  261. package/dist/packages/wje-tree/tree.test.d.ts +0 -1
  262. package/dist/packages/wje-tree-item/tree-item.test.d.ts +0 -1
  263. package/dist/popup.element-DeajFyOQ.js.map +0 -1
  264. package/dist/router-links-CJnOdbas.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"animations.js","sources":["../packages/utils/animations.js"],"sourcesContent":["let animations = [];\n\nfunction parseCSS(css) {\n const keyframesRegex = /@keyframes\\s+([\\w-]+)\\s*{([\\s\\S]+?})\\s*}/g;\n let match;\n let localAnimations = [];\n\n while ((match = keyframesRegex.exec(css)) !== null) {\n let name = match[1];\n let frames = match[2].trim();\n let keyframes = parseKeyframes(frames);\n\n localAnimations.push({ name, keyframes });\n }\n\n return localAnimations;\n}\n\nfunction parseKeyframes(frames) {\n const frameRegex = /([\\d%]+)\\s*{([\\s\\S]+?)}/g;\n let match;\n let keyframes = [];\n\n while ((match = frameRegex.exec(frames)) !== null) {\n let offset = parseFloat(match[1]) / 100; // Prevedenie percent na desatinné číslo\n let properties = parseProperties(match[2]);\n\n // Preformátovanie vlastností na požadovaný formát\n let keyframeObject = {\n offset: offset,\n ...properties,\n };\n\n keyframes.push(keyframeObject);\n }\n\n // Zoradenie keyframes podľa offsetu\n keyframes.sort((a, b) => a.offset - b.offset);\n\n return keyframes;\n}\n\nfunction parseProperties(propertiesString) {\n const properties = {};\n propertiesString.split(';').forEach((property) => {\n const [key, value] = property.split(':').map((part) => part.trim());\n if (key && value) {\n // Mapovanie názvov vlastností na požadované kľúčové slová\n if (key === 'animation-timing-function') {\n properties['easing'] = value;\n } else {\n properties[key] = value;\n }\n }\n });\n return properties;\n}\n\nexport async function fetchAndParseCSS(css) {\n try {\n if (animations.length > 0) {\n return animations;\n }\n animations = parseCSS(css);\n\n return await animations;\n } catch (error) {\n console.error('Error:', error);\n return null;\n }\n}\n\nexport { animations };\n"],"names":[],"mappings":"AAAG,IAAC,aAAa,CAAA;AAEjB,SAAS,SAAS,KAAK;AACnB,QAAM,iBAAiB;AACvB,MAAI;AACJ,MAAI,kBAAkB,CAAE;AAExB,UAAQ,QAAQ,eAAe,KAAK,GAAG,OAAO,MAAM;AAChD,QAAI,OAAO,MAAM,CAAC;AAClB,QAAI,SAAS,MAAM,CAAC,EAAE,KAAM;AAC5B,QAAI,YAAY,eAAe,MAAM;AAErC,oBAAgB,KAAK,EAAE,MAAM,UAAS,CAAE;AAAA,EAChD;AAEI,SAAO;AACX;AAEA,SAAS,eAAe,QAAQ;AAC5B,QAAM,aAAa;AACnB,MAAI;AACJ,MAAI,YAAY,CAAE;AAElB,UAAQ,QAAQ,WAAW,KAAK,MAAM,OAAO,MAAM;AAC/C,QAAI,SAAS,WAAW,MAAM,CAAC,CAAC,IAAI;AACpC,QAAI,aAAa,gBAAgB,MAAM,CAAC,CAAC;AAGzC,QAAI,iBAAiB;AAAA,MACjB;AAAA,MACA,GAAG;AAAA,IACN;AAED,cAAU,KAAK,cAAc;AAAA,EACrC;AAGI,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAE5C,SAAO;AACX;AAEA,SAAS,gBAAgB,kBAAkB;AACvC,QAAM,aAAa,CAAE;AACrB,mBAAiB,MAAM,GAAG,EAAE,QAAQ,CAAC,aAAa;AAC9C,UAAM,CAAC,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAI,CAAE;AAClE,QAAI,OAAO,OAAO;AAEd,UAAI,QAAQ,6BAA6B;AACrC,mBAAW,QAAQ,IAAI;AAAA,MACvC,OAAmB;AACH,mBAAW,GAAG,IAAI;AAAA,MAClC;AAAA,IACA;AAAA,EACA,CAAK;AACD,SAAO;AACX;AAEO,eAAe,iBAAiB,KAAK;AACxC,MAAI;AACA,QAAI,WAAW,SAAS,GAAG;AACvB,aAAO;AAAA,IACnB;AACQ,iBAAa,SAAS,GAAG;AAEzB,WAAO,MAAM;AAAA,EAChB,SAAQ,OAAO;AACZ,YAAQ,MAAM,UAAU,KAAK;AAC7B,WAAO;AAAA,EACf;AACA;"}
1
+ {"version":3,"file":"animations.js","sources":["../packages/utils/animations.js"],"sourcesContent":["let animations = [];\n\nfunction parseCSS(css) {\n const keyframesRegex = /@keyframes\\s+([\\w-]+)\\s*{([\\s\\S]+?})\\s*}/g;\n let match;\n let localAnimations = [];\n\n while ((match = keyframesRegex.exec(css)) !== null) {\n let name = match[1];\n let frames = match[2].trim();\n let keyframes = parseKeyframes(frames);\n\n localAnimations.push({ name, keyframes });\n }\n\n return localAnimations;\n}\n\nfunction parseKeyframes(frames) {\n const frameRegex = /([\\d%]+)\\s*{([\\s\\S]+?)}/g;\n let match;\n let keyframes = [];\n\n while ((match = frameRegex.exec(frames)) !== null) {\n let offset = parseFloat(match[1]) / 100; // Prevedenie percent na desatinné číslo\n let properties = parseProperties(match[2]);\n\n // Preformátovanie vlastností na požadovaný formát\n let keyframeObject = {\n offset: offset,\n ...properties,\n };\n\n keyframes.push(keyframeObject);\n }\n\n // Zoradenie keyframes podľa offsetu\n keyframes.sort((a, b) => a.offset - b.offset);\n\n return keyframes;\n}\n\nfunction parseProperties(propertiesString) {\n const properties = {};\n propertiesString.split(';').forEach((property) => {\n const [key, value] = property.split(':').map((part) => part.trim());\n if (key && value) {\n // Mapovanie názvov vlastností na požadované kľúčové slová\n if (key === 'animation-timing-function') {\n properties['easing'] = value;\n } else {\n properties[key] = value;\n }\n }\n });\n return properties;\n}\n\nexport async function fetchAndParseCSS(css) {\n try {\n if (animations.length > 0) {\n return animations;\n }\n animations = parseCSS(css);\n\n return await animations;\n } catch (error) {\n console.error('Error:', error);\n return null;\n }\n}\n\nexport { animations };\n"],"names":[],"mappings":"AAAG,IAAC,aAAa,CAAA;AAEjB,SAAS,SAAS,KAAK;AACnB,QAAM,iBAAiB;AACvB,MAAI;AACJ,MAAI,kBAAkB,CAAA;AAEtB,UAAQ,QAAQ,eAAe,KAAK,GAAG,OAAO,MAAM;AAChD,QAAI,OAAO,MAAM,CAAC;AAClB,QAAI,SAAS,MAAM,CAAC,EAAE,KAAI;AAC1B,QAAI,YAAY,eAAe,MAAM;AAErC,oBAAgB,KAAK,EAAE,MAAM,UAAS,CAAE;AAAA,EAC5C;AAEA,SAAO;AACX;AAEA,SAAS,eAAe,QAAQ;AAC5B,QAAM,aAAa;AACnB,MAAI;AACJ,MAAI,YAAY,CAAA;AAEhB,UAAQ,QAAQ,WAAW,KAAK,MAAM,OAAO,MAAM;AAC/C,QAAI,SAAS,WAAW,MAAM,CAAC,CAAC,IAAI;AACpC,QAAI,aAAa,gBAAgB,MAAM,CAAC,CAAC;AAGzC,QAAI,iBAAiB;AAAA,MACjB;AAAA,MACA,GAAG;AAAA,IACf;AAEQ,cAAU,KAAK,cAAc;AAAA,EACjC;AAGA,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAE5C,SAAO;AACX;AAEA,SAAS,gBAAgB,kBAAkB;AACvC,QAAM,aAAa,CAAA;AACnB,mBAAiB,MAAM,GAAG,EAAE,QAAQ,CAAC,aAAa;AAC9C,UAAM,CAAC,KAAK,KAAK,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAI,CAAE;AAClE,QAAI,OAAO,OAAO;AAEd,UAAI,QAAQ,6BAA6B;AACrC,mBAAW,QAAQ,IAAI;AAAA,MAC3B,OAAO;AACH,mBAAW,GAAG,IAAI;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AAEO,eAAe,iBAAiB,KAAK;AACxC,MAAI;AACA,QAAI,WAAW,SAAS,GAAG;AACvB,aAAO;AAAA,IACX;AACA,iBAAa,SAAS,GAAG;AAEzB,WAAO,MAAM;AAAA,EACjB,SAAS,OAAO;AACZ,YAAQ,MAAM,UAAU,KAAK;AAC7B,WAAO;AAAA,EACX;AACJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"base-path.js","sources":["../packages/utils/base-path.js"],"sourcesContent":["let basePath = '';\n\n/**\n * Sets the base path for the application.\n * @param {string} path The base path to be set.\n * @returns {void} This function does not return anything.\n */\nexport function setBasePath(path) {\n basePath = path;\n}\n\n/**\n * Returns the base path of the application, optionally appending a specified relative path.\n * If the base path has not been set, it determines the base path from the first script element\n * with a `base-path` attribute or generates it based on the current script location.\n * @param {string} [appendedPath] The relative path to append to the base path. Defaults to an empty string.\n * @returns {string} The complete base path, with the appended relative path if specified.\n */\nexport function getBasePath(appendedPath = '') {\n if (!basePath) {\n const scripts = [...document.getElementsByTagName('script')];\n const basePathScript = scripts.find(script => script.hasAttribute('data-base-path'));\n\n if (basePathScript) {\n setBasePath(basePathScript.dataset.basePath || '');\n } else {\n const path = '';\n\n setBasePath(path.split('/').slice(0, -1).join('/'));\n }\n }\n\n const subPath = appendedPath.replace(/^\\//, '');\n\n return basePath.replace(/\\/$/, '') + (appendedPath ? '/' + subPath : '');\n}"],"names":[],"mappings":"AAAA,IAAI,WAAW;AAOR,SAAS,YAAY,MAAM;AAChC,aAAW;AACb;AASO,SAAS,YAAY,eAAe,IAAI;AAC7C,MAAI,CAAC,UAAU;AACb,UAAM,UAAU,CAAC,GAAG,SAAS,qBAAqB,QAAQ,CAAC;AAC3D,UAAM,iBAAiB,QAAQ,KAAK,YAAU,OAAO,aAAa,gBAAgB,CAAC;AAEnF,QAAI,gBAAgB;AAClB,kBAAY,eAAe,QAAQ,YAAa,EAAE;AAAA,IACxD,OAAW;AACL,YAAM,OAAO;AAEb,kBAAY,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,IACxD;AAAA,EACA;AAEE,QAAM,UAAU,aAAa,QAAQ,OAAO,EAAE;AAE9C,SAAO,SAAS,QAAQ,OAAO,EAAE,KAAK,eAAe,MAAM,UAAU;AACvE;"}
1
+ {"version":3,"file":"base-path.js","sources":["../packages/utils/base-path.js"],"sourcesContent":["let basePath = '';\n\n/**\n * Sets the base path for the application.\n * @param {string} path The base path to be set.\n * @returns {void} This function does not return anything.\n */\nexport function setBasePath(path) {\n basePath = path;\n}\n\n/**\n * Returns the base path of the application, optionally appending a specified relative path.\n * If the base path has not been set, it determines the base path from the first script element\n * with a `base-path` attribute or generates it based on the current script location.\n * @param {string} [appendedPath] The relative path to append to the base path. Defaults to an empty string.\n * @returns {string} The complete base path, with the appended relative path if specified.\n */\nexport function getBasePath(appendedPath = '') {\n if (!basePath) {\n const scripts = [...document.getElementsByTagName('script')];\n const basePathScript = scripts.find(script => script.hasAttribute('data-base-path'));\n\n if (basePathScript) {\n setBasePath(basePathScript.dataset.basePath || '');\n } else {\n const path = '';\n\n setBasePath(path.split('/').slice(0, -1).join('/'));\n }\n }\n\n const subPath = appendedPath.replace(/^\\//, '');\n\n return basePath.replace(/\\/$/, '') + (appendedPath ? '/' + subPath : '');\n}"],"names":[],"mappings":"AAAA,IAAI,WAAW;AAOR,SAAS,YAAY,MAAM;AAChC,aAAW;AACb;AASO,SAAS,YAAY,eAAe,IAAI;AAC7C,MAAI,CAAC,UAAU;AACb,UAAM,UAAU,CAAC,GAAG,SAAS,qBAAqB,QAAQ,CAAC;AAC3D,UAAM,iBAAiB,QAAQ,KAAK,YAAU,OAAO,aAAa,gBAAgB,CAAC;AAEnF,QAAI,gBAAgB;AAClB,kBAAY,eAAe,QAAQ,YAAa,EAAE;AAAA,IACpD,OAAO;AACL,YAAM,OAAO;AAEb,kBAAY,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,IACpD;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,QAAQ,OAAO,EAAE;AAE9C,SAAO,SAAS,QAAQ,OAAO,EAAE,KAAK,eAAe,MAAM,UAAU;AACvE;"}
package/dist/dark.css CHANGED
@@ -4,7 +4,8 @@
4
4
 
5
5
  :host,
6
6
  .wje-theme-dark,
7
- .dark {
7
+ .dark,
8
+ [data-theme=dark] {
8
9
  color-scheme: dark;
9
10
 
10
11
  --wje-font-family:
@@ -134,6 +135,13 @@
134
135
  --wje-color-contrast-10: hsla(0, 0%, 98%, 1);
135
136
  --wje-color-contrast-11: hsla(0, 0%, 100%, 1);
136
137
 
138
+ /*
139
+ [ Skeleton ]
140
+ */
141
+ --wje-skeleton-bg: var(--wje-color-contrast-3);
142
+ --wje-skeleton-bg-strong: var(--wje-color-contrast-5);
143
+ --wje-skeleton-highlight: rgba(255, 255, 255, 0.45);
144
+
137
145
  /*
138
146
  [ Elements ]
139
147
  */
@@ -157,6 +165,9 @@
157
165
  --wje-card-color: var(--wje-color-white);
158
166
  --wje-card-border-color: transparent;
159
167
 
168
+ /* Dialog */
169
+ --wje-dialog-background: var(--wje-color-contrast-1);
170
+
160
171
  /* Divider */
161
172
  --wje-divider-border-color: var(--wje-border-color);
162
173
 
@@ -224,6 +235,9 @@
224
235
  --wje-orgchart-item-boss-border: 1px solid var(--wje-border-color);
225
236
  --wje-orgchart-item-hover-border: 1px solid var(--wje-color-danger-3);
226
237
 
238
+ /* Popup */
239
+ --wje-popup-overlay-background: var(--wje-color-contrast-0);
240
+
227
241
  /* Rate */
228
242
  --wje-rate-color: var(--wje-color-contrast-11);
229
243
  --wje-rate-selected-color: var(--wje-color-danger-6);
package/dist/date.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"date.js","sources":["../packages/utils/date.js"],"sourcesContent":["export function formatDate(input, format) {\n let date;\n\n // Rozpoznanie typu vstupu a jeho konverzia na objekt Date\n if (typeof input === 'string') {\n date = new Date(input); // Predpokladáme, že je to ISO reťazec\n } else if (typeof input === 'number') {\n date = new Date(input); // Predpokladáme, že je to timestamp\n } else if (input instanceof Date) {\n date = input; // Je to objekt Date\n } else {\n throw new Error('Invalid date input');\n }\n\n const map = {\n yyyy: date.getFullYear(),\n MM: String(date.getMonth() + 1).padStart(2, '0'), // Mesiace sú indexované od 0\n dd: String(date.getDate()).padStart(2, '0'),\n HH: String(date.getHours()).padStart(2, '0'),\n mm: String(date.getMinutes()).padStart(2, '0'),\n ss: String(date.getSeconds()).padStart(2, '0'),\n MMMM: date.toLocaleString('en-US', { month: 'long' }), // Full month name\n MMM: date.toLocaleString('en-US', { month: 'short' }), // Short month name\n };\n\n return format.replace(/yyyy|MM|dd|HH|mm|ss|MMMM|MMM/g, (matched) => map[matched]);\n}\n\nexport function toSafeDate(iso) {\n // Match 07:00, 07:00:00, 07:00:00.000, 07:00:00.000Z\n const timeOnlyRegex = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{3})?)?(Z)?$/;\n\n if (timeOnlyRegex.test(iso)) {\n let cleanTime = iso.replace(/Z$/, ''); // Remove Z if present\n let [h, m, s = '00.000'] = cleanTime.split(':');\n\n // Ensure seconds and milliseconds\n if (!s.includes('.')) {\n s = `${s}.000`;\n }\n\n return `1970-01-01T${h}:${m}:${s}Z`;\n }\n\n return iso;\n}\n"],"names":[],"mappings":"AAAO,SAAS,WAAW,OAAO,QAAQ;AACtC,MAAI;AAGJ,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,IAAI,KAAK,KAAK;AAAA,EAC7B,WAAe,OAAO,UAAU,UAAU;AAClC,WAAO,IAAI,KAAK,KAAK;AAAA,EAC7B,WAAe,iBAAiB,MAAM;AAC9B,WAAO;AAAA,EACf,OAAW;AACH,UAAM,IAAI,MAAM,oBAAoB;AAAA,EAC5C;AAEI,QAAM,MAAM;AAAA,IACR,MAAM,KAAK,YAAa;AAAA,IACxB,IAAI,OAAO,KAAK,SAAQ,IAAK,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA;AAAA,IAC/C,IAAI,OAAO,KAAK,QAAS,CAAA,EAAE,SAAS,GAAG,GAAG;AAAA,IAC1C,IAAI,OAAO,KAAK,SAAU,CAAA,EAAE,SAAS,GAAG,GAAG;AAAA,IAC3C,IAAI,OAAO,KAAK,WAAY,CAAA,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7C,IAAI,OAAO,KAAK,WAAY,CAAA,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7C,MAAM,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ;AAAA;AAAA,IACpD,KAAK,KAAK,eAAe,SAAS,EAAE,OAAO,SAAS;AAAA;AAAA,EACvD;AAED,SAAO,OAAO,QAAQ,iCAAiC,CAAC,YAAY,IAAI,OAAO,CAAC;AACpF;AAEO,SAAS,WAAW,KAAK;AAE5B,QAAM,gBAAgB;AAEtB,MAAI,cAAc,KAAK,GAAG,GAAG;AACzB,QAAI,YAAY,IAAI,QAAQ,MAAM,EAAE;AACpC,QAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,IAAI,UAAU,MAAM,GAAG;AAG9C,QAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAClB,UAAI,GAAG,CAAC;AAAA,IACpB;AAEQ,WAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,EACxC;AAEI,SAAO;AACX;"}
1
+ {"version":3,"file":"date.js","sources":["../packages/utils/date.js"],"sourcesContent":["export function formatDate(input, format) {\n let date;\n\n // Rozpoznanie typu vstupu a jeho konverzia na objekt Date\n if (typeof input === 'string') {\n date = new Date(input); // Predpokladáme, že je to ISO reťazec\n } else if (typeof input === 'number') {\n date = new Date(input); // Predpokladáme, že je to timestamp\n } else if (input instanceof Date) {\n date = input; // Je to objekt Date\n } else {\n throw new Error('Invalid date input');\n }\n\n const map = {\n yyyy: date.getFullYear(),\n MM: String(date.getMonth() + 1).padStart(2, '0'), // Mesiace sú indexované od 0\n dd: String(date.getDate()).padStart(2, '0'),\n HH: String(date.getHours()).padStart(2, '0'),\n mm: String(date.getMinutes()).padStart(2, '0'),\n ss: String(date.getSeconds()).padStart(2, '0'),\n MMMM: date.toLocaleString('en-US', { month: 'long' }), // Full month name\n MMM: date.toLocaleString('en-US', { month: 'short' }), // Short month name\n };\n\n return format.replace(/yyyy|MM|dd|HH|mm|ss|MMMM|MMM/g, (matched) => map[matched]);\n}\n\nexport function toSafeDate(iso) {\n // Match 07:00, 07:00:00, 07:00:00.000, 07:00:00.000Z\n const timeOnlyRegex = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{3})?)?(Z)?$/;\n\n if (timeOnlyRegex.test(iso)) {\n let cleanTime = iso.replace(/Z$/, ''); // Remove Z if present\n let [h, m, s = '00.000'] = cleanTime.split(':');\n\n // Ensure seconds and milliseconds\n if (!s.includes('.')) {\n s = `${s}.000`;\n }\n\n return `1970-01-01T${h}:${m}:${s}Z`;\n }\n\n return iso;\n}\n"],"names":[],"mappings":"AAAO,SAAS,WAAW,OAAO,QAAQ;AACtC,MAAI;AAGJ,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,IAAI,KAAK,KAAK;AAAA,EACzB,WAAW,OAAO,UAAU,UAAU;AAClC,WAAO,IAAI,KAAK,KAAK;AAAA,EACzB,WAAW,iBAAiB,MAAM;AAC9B,WAAO;AAAA,EACX,OAAO;AACH,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACxC;AAEA,QAAM,MAAM;AAAA,IACR,MAAM,KAAK,YAAW;AAAA,IACtB,IAAI,OAAO,KAAK,SAAQ,IAAK,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA;AAAA,IAC/C,IAAI,OAAO,KAAK,QAAO,CAAE,EAAE,SAAS,GAAG,GAAG;AAAA,IAC1C,IAAI,OAAO,KAAK,SAAQ,CAAE,EAAE,SAAS,GAAG,GAAG;AAAA,IAC3C,IAAI,OAAO,KAAK,WAAU,CAAE,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7C,IAAI,OAAO,KAAK,WAAU,CAAE,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7C,MAAM,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ;AAAA;AAAA,IACpD,KAAK,KAAK,eAAe,SAAS,EAAE,OAAO,SAAS;AAAA;AAAA,EAC5D;AAEI,SAAO,OAAO,QAAQ,iCAAiC,CAAC,YAAY,IAAI,OAAO,CAAC;AACpF;AAEO,SAAS,WAAW,KAAK;AAE5B,QAAM,gBAAgB;AAEtB,MAAI,cAAc,KAAK,GAAG,GAAG;AACzB,QAAI,YAAY,IAAI,QAAQ,MAAM,EAAE;AACpC,QAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,IAAI,UAAU,MAAM,GAAG;AAG9C,QAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAClB,UAAI,GAAG,CAAC;AAAA,IACZ;AAEA,WAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,EACpC;AAEA,SAAO;AACX;"}
@@ -1 +1 @@
1
- {"version":3,"file":"element-utils.js","sources":["../packages/utils/element-utils.js"],"sourcesContent":["export class WjElementUtils {\n /**\n * This function creates an element.\n * @param element : HTMLElement - The element value.\n * @param object : Object - The object value.\n */\n static setAttributesToElement(element, object) {\n Object.entries(object).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n }\n\n /**\n * This function gets the attributes from an element.\n * @param {string|HTMLElement} el The element or selector to retrieve attributes from.\n * @returns {object} - An object containing the element's attributes as key-value pairs.\n */\n static getAttributes(el) {\n if (typeof el === 'string') el = document.querySelector(el);\n\n return Array.from(el.attributes)\n .filter((a) => !a.name.startsWith('@'))\n .map((a) => [\n a.name\n .split('-')\n .map((s, i) => {\n if (i !== 0) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n } else {\n return s;\n }\n })\n .join(''),\n a.value,\n ])\n .reduce((acc, attr) => {\n acc[attr[0]] = attr[1];\n return acc;\n }, {});\n }\n\n /**\n * This function gets the events from an element.\n * @param {string|HTMLElement} el The element or selector to retrieve events from.\n * @returns {Map<any, any>} - The map value.\n */\n static getEvents(el) {\n if (typeof el === 'string') el = document.querySelector(el);\n\n return Array.from(el.attributes)\n .filter((a) => a.name.startsWith('@wje'))\n .map((a) => [a.name.substring(3).split('-').join(''), a.value])\n .reduce((acc, attr) => {\n acc.set(attr[0], attr[1]);\n return acc;\n }, new Map());\n }\n\n /**\n * This function converts an object to a string.\n * @param {object} object The object to convert.\n * @returns {string} - The string value.\n */\n static attributesToString(object) {\n return Object.entries(object)\n .map(([key, value]) => {\n return `${key}=\"${value}\"`;\n })\n .join(' ');\n }\n\n /**\n * This function checks if the slot exists.\n * @param {string|HTMLElement} el The element or selector to check for slots.\n * @param slotName The slot name to check for.\n * @returns {boolean} - The boolean value.\n */\n static hasSlot(el, slotName = null) {\n let selector = slotName ? `[slot=\"${slotName}\"]` : '[slot]';\n\n return el.querySelectorAll(selector).length > 0 ? true : false;\n }\n\n /**\n * This function checks if the slot has content.\n * @param {string|HTMLElement} el The element or selector to check for slot content\n * @param slotName The slot name to check for.\n * @returns {boolean} - The boolean value.\n */\n static hasSlotContent(el, slotName = null) {\n let slotElement = el.querySelector(`slot`);\n if (slotName) {\n slotElement = el.querySelector(`slot[name=\"${slotName}\"]`);\n }\n\n if (slotElement) {\n const assignedElements = slotElement.assignedElements();\n return assignedElements.length > 0;\n }\n\n return false;\n }\n\n /**\n * This function converts a string to a boolean.\n * @param {string | object} value The value to convert to a boolean. If the value is a boolean, it will be returned as is.\n * @returns {boolean} - The boolean value.\n */\n static stringToBoolean(value) {\n if (typeof value === 'boolean') return value;\n\n return !['false', '0', 0].includes(value);\n }\n}\n"],"names":[],"mappings":"AAAO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,OAAO,uBAAuB,SAAS,QAAQ;AAC3C,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7C,cAAQ,aAAa,KAAK,KAAK;AAAA,IAC3C,CAAS;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOI,OAAO,cAAc,IAAI;AACrB,QAAI,OAAO,OAAO,SAAU,MAAK,SAAS,cAAc,EAAE;AAE1D,WAAO,MAAM,KAAK,GAAG,UAAU,EAC1B,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,EACrC,IAAI,CAAC,MAAM;AAAA,MACR,EAAE,KACG,MAAM,GAAG,EACT,IAAI,CAAC,GAAG,MAAM;AACX,YAAI,MAAM,GAAG;AACT,iBAAO,EAAE,OAAO,CAAC,EAAE,YAAW,IAAK,EAAE,MAAM,CAAC;AAAA,QACxE,OAA+B;AACH,iBAAO;AAAA,QACnC;AAAA,MACqB,CAAA,EACA,KAAK,EAAE;AAAA,MACZ,EAAE;AAAA,IACL,CAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACnB,UAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AACrB,aAAO;AAAA,IACV,GAAE,EAAE;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOI,OAAO,UAAU,IAAI;AACjB,QAAI,OAAO,OAAO,SAAU,MAAK,SAAS,cAAc,EAAE;AAE1D,WAAO,MAAM,KAAK,GAAG,UAAU,EAC1B,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,MAAM,CAAC,EACvC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAC7D,OAAO,CAAC,KAAK,SAAS;AACnB,UAAI,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACxB,aAAO;AAAA,IACvB,GAAe,oBAAI,IAAG,CAAE;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOI,OAAO,mBAAmB,QAAQ;AAC9B,WAAO,OAAO,QAAQ,MAAM,EACvB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACnB,aAAO,GAAG,GAAG,KAAK,KAAK;AAAA,IAC1B,CAAA,EACA,KAAK,GAAG;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,OAAO,QAAQ,IAAI,WAAW,MAAM;AAChC,QAAI,WAAW,WAAW,UAAU,QAAQ,OAAO;AAEnD,WAAO,GAAG,iBAAiB,QAAQ,EAAE,SAAS,IAAI,OAAO;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,OAAO,eAAe,IAAI,WAAW,MAAM;AACvC,QAAI,cAAc,GAAG,cAAc,MAAM;AACzC,QAAI,UAAU;AACV,oBAAc,GAAG,cAAc,cAAc,QAAQ,IAAI;AAAA,IACrE;AAEQ,QAAI,aAAa;AACb,YAAM,mBAAmB,YAAY,iBAAkB;AACvD,aAAO,iBAAiB,SAAS;AAAA,IAC7C;AAEQ,WAAO;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOI,OAAO,gBAAgB,OAAO;AAC1B,QAAI,OAAO,UAAU,UAAW,QAAO;AAEvC,WAAO,CAAC,CAAC,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK;AAAA,EAChD;AACA;"}
1
+ {"version":3,"file":"element-utils.js","sources":["../packages/utils/element-utils.js"],"sourcesContent":["export class WjElementUtils {\n /**\n * This function creates an element.\n * @param element : HTMLElement - The element value.\n * @param object : Object - The object value.\n */\n static setAttributesToElement(element, object) {\n Object.entries(object).forEach(([key, value]) => {\n element.setAttribute(key, value);\n });\n }\n\n /**\n * This function gets the attributes from an element.\n * @param {string|HTMLElement} el The element or selector to retrieve attributes from.\n * @returns {object} - An object containing the element's attributes as key-value pairs.\n */\n static getAttributes(el) {\n if (typeof el === 'string') el = document.querySelector(el);\n\n return Array.from(el.attributes)\n .filter((a) => !a.name.startsWith('@'))\n .map((a) => [\n a.name\n .split('-')\n .map((s, i) => {\n if (i !== 0) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n } else {\n return s;\n }\n })\n .join(''),\n a.value,\n ])\n .reduce((acc, attr) => {\n acc[attr[0]] = attr[1];\n return acc;\n }, {});\n }\n\n /**\n * This function gets the events from an element.\n * @param {string|HTMLElement} el The element or selector to retrieve events from.\n * @returns {Map<any, any>} - The map value.\n */\n static getEvents(el) {\n if (typeof el === 'string') el = document.querySelector(el);\n\n return Array.from(el.attributes)\n .filter((a) => a.name.startsWith('@wje'))\n .map((a) => [a.name.substring(3).split('-').join(''), a.value])\n .reduce((acc, attr) => {\n acc.set(attr[0], attr[1]);\n return acc;\n }, new Map());\n }\n\n /**\n * This function converts an object to a string.\n * @param {object} object The object to convert.\n * @returns {string} - The string value.\n */\n static attributesToString(object) {\n return Object.entries(object)\n .map(([key, value]) => {\n return `${key}=\"${value}\"`;\n })\n .join(' ');\n }\n\n /**\n * This function checks if the slot exists.\n * @param {string|HTMLElement} el The element or selector to check for slots.\n * @param slotName The slot name to check for.\n * @returns {boolean} - The boolean value.\n */\n static hasSlot(el, slotName = null) {\n let selector = slotName ? `[slot=\"${slotName}\"]` : '[slot]';\n\n return el.querySelectorAll(selector).length > 0 ? true : false;\n }\n\n /**\n * This function checks if the slot has content.\n * @param {string|HTMLElement} el The element or selector to check for slot content\n * @param slotName The slot name to check for.\n * @returns {boolean} - The boolean value.\n */\n static hasSlotContent(el, slotName = null) {\n let slotElement = el.querySelector(`slot`);\n if (slotName) {\n slotElement = el.querySelector(`slot[name=\"${slotName}\"]`);\n }\n\n if (slotElement) {\n const assignedElements = slotElement.assignedElements();\n return assignedElements.length > 0;\n }\n\n return false;\n }\n\n /**\n * This function converts a string to a boolean.\n * @param {string | object} value The value to convert to a boolean. If the value is a boolean, it will be returned as is.\n * @returns {boolean} - The boolean value.\n */\n static stringToBoolean(value) {\n if (typeof value === 'boolean') return value;\n\n return !['false', '0', 0].includes(value);\n }\n}\n"],"names":[],"mappings":"AAAO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,OAAO,uBAAuB,SAAS,QAAQ;AAC3C,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7C,cAAQ,aAAa,KAAK,KAAK;AAAA,IACnC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAAc,IAAI;AACrB,QAAI,OAAO,OAAO,SAAU,MAAK,SAAS,cAAc,EAAE;AAE1D,WAAO,MAAM,KAAK,GAAG,UAAU,EAC1B,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,EACrC,IAAI,CAAC,MAAM;AAAA,MACR,EAAE,KACG,MAAM,GAAG,EACT,IAAI,CAAC,GAAG,MAAM;AACX,YAAI,MAAM,GAAG;AACT,iBAAO,EAAE,OAAO,CAAC,EAAE,YAAW,IAAK,EAAE,MAAM,CAAC;AAAA,QAChD,OAAO;AACH,iBAAO;AAAA,QACX;AAAA,MACJ,CAAC,EACA,KAAK,EAAE;AAAA,MACZ,EAAE;AAAA,IAClB,CAAa,EACA,OAAO,CAAC,KAAK,SAAS;AACnB,UAAI,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AACrB,aAAO;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,IAAI;AACjB,QAAI,OAAO,OAAO,SAAU,MAAK,SAAS,cAAc,EAAE;AAE1D,WAAO,MAAM,KAAK,GAAG,UAAU,EAC1B,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,MAAM,CAAC,EACvC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAC7D,OAAO,CAAC,KAAK,SAAS;AACnB,UAAI,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACxB,aAAO;AAAA,IACX,GAAG,oBAAI,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,mBAAmB,QAAQ;AAC9B,WAAO,OAAO,QAAQ,MAAM,EACvB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACnB,aAAO,GAAG,GAAG,KAAK,KAAK;AAAA,IAC3B,CAAC,EACA,KAAK,GAAG;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ,IAAI,WAAW,MAAM;AAChC,QAAI,WAAW,WAAW,UAAU,QAAQ,OAAO;AAEnD,WAAO,GAAG,iBAAiB,QAAQ,EAAE,SAAS,IAAI,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,eAAe,IAAI,WAAW,MAAM;AACvC,QAAI,cAAc,GAAG,cAAc,MAAM;AACzC,QAAI,UAAU;AACV,oBAAc,GAAG,cAAc,cAAc,QAAQ,IAAI;AAAA,IAC7D;AAEA,QAAI,aAAa;AACb,YAAM,mBAAmB,YAAY,iBAAgB;AACrD,aAAO,iBAAiB,SAAS;AAAA,IACrC;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,OAAO;AAC1B,QAAI,OAAO,UAAU,UAAW,QAAO;AAEvC,WAAO,CAAC,CAAC,SAAS,KAAK,CAAC,EAAE,SAAS,KAAK;AAAA,EAC5C;AACJ;"}
package/dist/event.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sources":["../packages/utils/event.js"],"sourcesContent":["var self; // eslint-disable-line no-var\n\nclass Event {\n constructor() {\n this.customEventWeakMap = new WeakMap();\n self = this;\n }\n\n /**\n * Dispatch event to the element and trigger the listener.\n * @param e\n */\n #dispatch(e) {\n let element = this;\n // let record = self.findRecordByElement(element);\n let record = self.customEventWeakMap.get(this);\n\n if (!record) return;\n\n let listeners = record[e.type];\n\n listeners.forEach((listener) => {\n self.dispatchCustomEvent(element, listener.event, {\n originalEvent: e?.type || null,\n context: element,\n event: self,\n });\n\n if (listener.options && listener.options.stopPropagation === true) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n });\n }\n\n /**\n * Dispatch custom event to the element with the specified event name and detail.\n * @param element\n * @param event\n * @param detail\n */\n dispatchCustomEvent(element, event, detail) {\n element.dispatchEvent(\n new CustomEvent(event, {\n detail: detail || {\n context: element,\n event: self,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n }\n\n /**\n * Find record by element in the storage.\n * @param element\n * @returns {*}\n */\n\n findRecordByElement(element) {\n return this.customEventWeakMap.get(element);\n }\n\n /**\n * Add listener to the element. If the element is an array, the listener will be added to all elements in the array.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n addListener(element, originalEvent, event, listener, options) {\n if (!element) return;\n\n if (!Array.isArray(element)) element = [element];\n\n element.forEach((el) => {\n this.writeRecord(el, originalEvent, event, listener, options);\n });\n }\n\n /**\n * Write record to the storage.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n writeRecord(element, originalEvent, event, listener, options) {\n let recordListeners = this.findRecordByElement(element);\n\n if (!recordListeners) {\n this.customEventWeakMap.set(element, {\n [originalEvent]: [],\n });\n\n recordListeners = this.findRecordByElement(element);\n } else {\n recordListeners[originalEvent] = recordListeners[originalEvent] || [];\n }\n\n listener = listener || this.#dispatch;\n let obj = {\n listener: listener,\n options: options,\n event: event,\n };\n\n // skontrolujeme ci uz tento listener neexistuje\n if (!this.isRecordExists(recordListeners[originalEvent], obj)) {\n if (!this.listenerExists(recordListeners[originalEvent], obj)) {\n element.addEventListener(originalEvent, listener, options);\n obj.unbind = () => {\n element.removeEventListener(originalEvent, listener, options);\n };\n }\n\n recordListeners[originalEvent].push(obj);\n\n } else {\n // in case we want to add the same listener multiple times trigger a warning for a better debugging\n //console.info(\"Listener already exists\", element, originalEvent);\n }\n }\n\n /**\n * Performs a deep equality check between two objects.\n * @param x The first object to compare.\n * @param y The second object to compare.\n * @returns - Returns `true` if the objects are deeply equal, `false` otherwise.\n */\n deepEqual(x, y) {\n return x && y && typeof x === 'object' && typeof x === typeof y\n ? Object.keys(x).length === Object.keys(y).length &&\n Object.keys(x).every((key) => this.deepEqual(x[key], y[key]))\n : x === y;\n }\n\n /**\n * Check if the listener already exists on the element.\n * @param records\n * @param eventObj\n * @returns\n */\n listenerExists(records, eventObj) {\n return records.some((e) => e.listener === eventObj.listener);\n }\n\n isRecordExists(records, eventObj) {\n return records.some((e) => this.deepEqual(e, eventObj))\n }\n\n /**\n * Remove listener from the element and delete the listener from the custom event storage.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n removeListener(element, originalEvent, event, listener, options) {\n let records = this.findRecordByElement(element);\n let listeners = records?.[originalEvent];\n listener = listener || this.#dispatch;\n\n if (listeners) {\n let listenerOfWeakMap = listeners.find((e) => e.listener === listener);\n\n if (listenerOfWeakMap) {\n listeners.splice(listeners.indexOf(listenerOfWeakMap), 1);\n }\n\n if (!listeners.length) {\n delete records[originalEvent];\n element?.removeEventListener(originalEvent, listener, options);\n }\n }\n }\n\n /**\n * Remove all event listeners from the specified element and delete the element from the custom event storage.\n * @param {HTMLElement} element The element from which all listeners will be removed.\n */\n removeElement(element) {\n // remove all listeners from the element\n let listeners = this.customEventWeakMap.get(element);\n if (listeners) {\n queueMicrotask(() => {\n for (let event in listeners) {\n listeners[event].forEach((e) => {\n element.removeEventListener(event, e.listener, e.options);\n e.unbind();\n });\n }\n\n this.customEventWeakMap.delete(element);\n });\n }\n }\n\n // TODO\n createPromiseFromEvent(element, event) {\n return new Promise((resolve) => {\n let success = () => {\n element.removeEventListener(event, success);\n resolve();\n };\n\n element.addEventListener(event, success);\n });\n }\n}\n\nlet event = new Event();\nexport { event };\n"],"names":["event"],"mappings":"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"}
1
+ {"version":3,"file":"event.js","sources":["../packages/utils/event.js"],"sourcesContent":["var self; // eslint-disable-line no-var\n\nclass Event {\n constructor() {\n this.customEventWeakMap = new WeakMap();\n self = this;\n }\n\n /**\n * Dispatch event to the element and trigger the listener.\n * @param e\n */\n #dispatch(e) {\n let element = this;\n // let record = self.findRecordByElement(element);\n let record = self.customEventWeakMap.get(this);\n\n if (!record) return;\n\n let listeners = record[e.type];\n\n listeners.forEach((listener) => {\n self.dispatchCustomEvent(element, listener.event, {\n originalEvent: e?.type || null,\n context: element,\n event: self,\n });\n\n if (listener.options && listener.options.stopPropagation === true) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n });\n }\n\n /**\n * Dispatch custom event to the element with the specified event name and detail.\n * @param element\n * @param event\n * @param detail\n */\n dispatchCustomEvent(element, event, detail) {\n element.dispatchEvent(\n new CustomEvent(event, {\n detail: detail || {\n context: element,\n event: self,\n },\n bubbles: true,\n composed: true,\n cancelable: true,\n })\n );\n }\n\n /**\n * Find record by element in the storage.\n * @param element\n * @returns {*}\n */\n\n findRecordByElement(element) {\n return this.customEventWeakMap.get(element);\n }\n\n /**\n * Add listener to the element. If the element is an array, the listener will be added to all elements in the array.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n addListener(element, originalEvent, event, listener, options) {\n if (!element) return;\n\n if (!Array.isArray(element)) element = [element];\n\n element.forEach((el) => {\n this.writeRecord(el, originalEvent, event, listener, options);\n });\n }\n\n /**\n * Write record to the storage.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n writeRecord(element, originalEvent, event, listener, options) {\n let recordListeners = this.findRecordByElement(element);\n\n if (!recordListeners) {\n this.customEventWeakMap.set(element, {\n [originalEvent]: [],\n });\n\n recordListeners = this.findRecordByElement(element);\n } else {\n recordListeners[originalEvent] = recordListeners[originalEvent] || [];\n }\n\n listener = listener || this.#dispatch;\n let obj = {\n listener: listener,\n options: options,\n event: event,\n };\n\n // skontrolujeme ci uz tento listener neexistuje\n if (!this.isRecordExists(recordListeners[originalEvent], obj)) {\n if (!this.listenerExists(recordListeners[originalEvent], obj)) {\n element.addEventListener(originalEvent, listener, options);\n obj.unbind = () => {\n element.removeEventListener(originalEvent, listener, options);\n };\n }\n\n recordListeners[originalEvent].push(obj);\n\n } else {\n // in case we want to add the same listener multiple times trigger a warning for a better debugging\n //console.info(\"Listener already exists\", element, originalEvent);\n }\n }\n\n /**\n * Performs a deep equality check between two objects.\n * @param x The first object to compare.\n * @param y The second object to compare.\n * @returns - Returns `true` if the objects are deeply equal, `false` otherwise.\n */\n deepEqual(x, y) {\n return x && y && typeof x === 'object' && typeof x === typeof y\n ? Object.keys(x).length === Object.keys(y).length &&\n Object.keys(x).every((key) => this.deepEqual(x[key], y[key]))\n : x === y;\n }\n\n /**\n * Check if the listener already exists on the element.\n * @param records\n * @param eventObj\n * @returns\n */\n listenerExists(records, eventObj) {\n return records.some((e) => e.listener === eventObj.listener);\n }\n\n isRecordExists(records, eventObj) {\n return records.some((e) => this.deepEqual(e, eventObj))\n }\n\n /**\n * Remove listener from the element and delete the listener from the custom event storage.\n * @param element\n * @param originalEvent\n * @param event\n * @param listener\n * @param options\n */\n removeListener(element, originalEvent, event, listener, options) {\n let records = this.findRecordByElement(element);\n let listeners = records?.[originalEvent];\n listener = listener || this.#dispatch;\n\n if (listeners) {\n let listenerOfWeakMap = listeners.find((e) => e.listener === listener);\n\n if (listenerOfWeakMap) {\n listeners.splice(listeners.indexOf(listenerOfWeakMap), 1);\n }\n\n if (!listeners.length) {\n delete records[originalEvent];\n element?.removeEventListener(originalEvent, listener, options);\n }\n }\n }\n\n /**\n * Remove all event listeners from the specified element and delete the element from the custom event storage.\n * @param {HTMLElement} element The element from which all listeners will be removed.\n */\n removeElement(element) {\n // remove all listeners from the element\n let listeners = this.customEventWeakMap.get(element);\n if (listeners) {\n queueMicrotask(() => {\n for (let event in listeners) {\n listeners[event].forEach((e) => {\n element.removeEventListener(event, e.listener, e.options);\n e.unbind();\n });\n }\n\n this.customEventWeakMap.delete(element);\n });\n }\n }\n\n // TODO\n createPromiseFromEvent(element, event) {\n return new Promise((resolve) => {\n let success = () => {\n element.removeEventListener(event, success);\n resolve();\n };\n\n element.addEventListener(event, success);\n });\n }\n}\n\nlet event = new Event();\nexport { event };\n"],"names":["event"],"mappings":"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"}
@@ -6,7 +6,6 @@ import { event } from "./event.js";
6
6
  class FormAssociatedElement extends WJElement {
7
7
  constructor() {
8
8
  super();
9
- this.internals = this.attachInternals();
10
9
  }
11
10
  /**
12
11
  * Sets the 'name' attribute to the given value.
@@ -243,4 +242,4 @@ __publicField(FormAssociatedElement, "formAssociated", true);
243
242
  export {
244
243
  FormAssociatedElement as F
245
244
  };
246
- //# sourceMappingURL=form-associated-element-o0UjvdUp.js.map
245
+ //# sourceMappingURL=form-associated-element-DEQ4y-jn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-associated-element-DEQ4y-jn.js","sources":["../packages/internals/form-associated-element.js"],"sourcesContent":["import { default as WJElement, event } from \"../wje-element/element.js\";\n\nexport class FormAssociatedElement extends WJElement {\n static formAssociated = true;\n\n constructor() {\n super();\n }\n\n /**\n * Sets the 'name' attribute to the given value.\n * @param {string} value The new value for the 'name' attribute.\n */\n set name(value) {\n this.setAttribute('name', value);\n }\n\n /**\n * Getter for the name attribute.\n * @returns {string} The name of the input.\n */\n get name() {\n return this.getAttribute('name');\n }\n\n /**\n * Getter for the type attribute.\n * @returns {string} The type of the input.\n */\n get type() {\n return this.getAttribute(\"type\");\n }\n\n /**\n * Sets or removes the 'required' attribute on the element.\n * @param {boolean} value If true, adds the 'required' attribute. If false, removes the 'required' attribute.\n */\n set required(value) {\n if (value) {\n this.setAttribute('required', '');\n } else {\n this.removeAttribute('required');\n }\n }\n\n /**\n * Checks if the 'required' attribute is present on the element.\n * @returns {boolean} `true` if the 'required' attribute is set, otherwise `false`.\n */\n get required() {\n return this.hasAttribute('required');\n }\n\n /**\n * Setter for the invalid attribute.\n * @param {boolean} isInvalid Whether the input is invalid.\n */\n set invalid(isInvalid) {\n if (isInvalid) this.setAttribute('invalid', '');\n else this.removeAttribute('invalid');\n }\n\n /**\n * Getter for the invalid attribute.\n * @returns {boolean} Whether the attribute is present.\n */\n get invalid() {\n return this.hasAttribute('invalid');\n }\n\n /**\n * Set checked attribute.\n * @param {boolean} value true if the toggle is checked, false otherwise\n */\n set disabled(value) {\n if (value) {\n this.setAttribute('disabled', '');\n } else {\n this.removeAttribute('disabled');\n }\n }\n\n /**\n * Get disabled attribute value.\n * @returns {boolean} true if the toggle is disabled, false otherwise\n */\n get disabled() {\n return this.hasAttribute('disabled');\n }\n\n /**\n * Retrieves the form element associated with this object.\n * @returns {HTMLFormElement|null} The associated form element, or null if there isn't one.\n */\n get form() {\n return this.internals.form;\n }\n\n /**\n * Retrieves the validity state of the element by returning the validity object from the internal element.\n * The validity object provides information on whether the element satisfies its validation constraints.\n * @returns {ValidityState} The validity state object representing the element's validation constraints.\n */\n get validity() {\n return this.internals.validity;\n }\n\n /**\n * Retrieves the current validation message associated with the element.\n * @returns {string} The validation message that describes why the element's value fails validity checks.\n */\n get validationMessage() {\n return this.internals.validationMessage;\n }\n\n /**\n * Indicates whether the element is a candidate for constraint validation.\n * @returns {boolean} Returns true if the element will be validated during constraint validation, false otherwise.\n */\n get willValidate() {\n return this.internals.willValidate;\n }\n\n /**\n * Validates the input element associated with the component and updates its validity state\n * and error messages based on the user's input and the current validation rules.\n * @returns {void} This method does not return a value. It modifies the validity state\n * internally and sets appropriate validation messages.\n */\n validate() {\n const validState = this.input.validity;\n\n if (!validState.valid) {\n for (let state in validState) {\n const attr = `message-${state.toString()}`;\n\n if (validState[state]) {\n this.validationError = state.toString();\n let errorMessage = this.message;\n\n // TODO this take error messages based on lang from operating system of user should we implement custom translations based on app language ?\n if (!this.hasAttribute('message'))\n errorMessage = this.hasAttribute(attr) ? this.getAttribute(attr) : this.input.validationMessage;\n\n this.internals.setValidity({ [this.validationError]: true }, errorMessage, this.input);\n }\n }\n } else {\n this.internals.setValidity({});\n }\n }\n\n /**\n * Propagates a validation event based on the validity state of the component.\n *\n * This method checks the validity status of the component and emits a custom\n * event if the component is invalid. The event's name and additional details\n * can be specified.\n * @param {string} [eventName] The name of the event to dispatch when the component is invalid.\n * @param {object} [detail] Additional detail to include in the dispatched event.\n * @returns {void} This method does not return a value.\n */\n propagateValidation(eventName = 'invalid', detail = {}) {\n const internals = this.internals;\n\n this.invalid = !this.pristine && !internals.validity.valid;\n\n if (this.invalid) {\n event.dispatchCustomEvent(this, this.tagName.toLocaleLowerCase() + ':' + eventName, detail);\n }\n }\n\n /**\n * Displays an invalid message for the current element.\n * If an error message element does not exist within the designated slot,\n * it creates one and appends it to the slot. Updates the text content\n * of the error message element with the validation message from the\n * element's internals.\n * @returns {void} This method does not return any value.\n */\n showInvalidMessage() {\n const internals = this.internals;\n const slot = this.querySelector(\"[slot='error']\");\n let errorMessageEl = slot?.querySelector('[error-message]');\n\n if (!errorMessageEl) {\n const error = document.createElement('div');\n error.setAttribute('error-message', '');\n slot?.append(error);\n errorMessageEl = error;\n }\n\n errorMessageEl.textContent = internals.validationMessage;\n }\n\n /**\n * Checks the validity of the input by invoking custom validation logic\n * and then verifying against internal validation rules.\n * @returns {boolean} Returns true if the input is valid according to both custom validation and internal validation rules, otherwise false.\n */\n checkValidity() {\n // zavolá tvoju vlastnú validáciu pred kontrolou internals\n this.validate();\n return this.internals.checkValidity();\n }\n\n /**\n * Callback to handle the reset action for a form.\n * Resets the value of the form control to its default value, updates the form value, and clears any validity states.\n * @returns {void} Does not return a value.\n */\n formResetCallback() {\n this.value = this.defaultValue;\n this.internals.setFormValue(this.defaultValue);\n this.internals.setValidity({});\n }\n\n /**\n * Restores the form state by assigning the provided state value\n * and updating the internal form value and validity.\n * @param {object} state The state object containing the value to restore the form.\n * @param {*} state.value The value to set for the form element.\n * @returns {void} This method does not return any value.\n */\n formStateRestoreCallback(state) {\n this.value = state.value;\n this.internals.setFormValue(state.value);\n this.internals.setValidity({});\n }\n\n /**\n * Callback method to save the current state of a form.\n * This method captures and returns the form's value property.\n * @returns {object} An object containing the `value` property of the current form state.\n */\n formStateSaveCallback() {\n return {\n value: this.value\n };\n }\n\n /**\n * Toggles the disabled state of the component and updates corresponding attributes.\n * @param {boolean} disabled Indicates whether the form should be marked as disabled.\n * If true, the 'disabled' class is added, and the 'disabled' attribute is set.\n * If false, both the class and attribute are removed.\n * @returns {void}\n */\n formDisabledCallback(disabled) {\n this.native?.classList.toggle('disabled', disabled);\n this.toggleAttribute('disabled', disabled);\n }\n\n /**\n * A lifecycle callback that is executed when the element is associated with a form.\n * It updates the form's value field with the element's value and sets up an event\n * listener to perform validation and propagate it whenever the form is submitted.\n * @returns {void} Does not return any value.\n */\n formAssociatedCallback() {\n if (this.form) {\n this.internals.setFormValue(this.value);\n this.form?.addEventListener('submit', () => {\n this.validate();\n this.propagateValidation();\n });\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -156,13 +156,14 @@ class Icon extends WJElement {
156
156
  * @returns {Array<string>}
157
157
  */
158
158
  static get observedAttributes() {
159
- return ["name", "filled"];
159
+ return ["name", "filled", "label"];
160
160
  }
161
161
  /**
162
162
  * Sets up the attributes for the component.
163
163
  */
164
164
  setupAttributes() {
165
165
  this.isShadowRoot = "open";
166
+ this.syncAria();
166
167
  }
167
168
  /**
168
169
  * Draws the component.
@@ -186,6 +187,7 @@ class Icon extends WJElement {
186
187
  * Called after the component has been drawn.
187
188
  */
188
189
  afterDraw() {
190
+ this.syncAria();
189
191
  let lazyImageObserver = new IntersectionObserver((entries, observer) => {
190
192
  entries.forEach((entry) => {
191
193
  if (entry.isIntersecting) {
@@ -201,6 +203,38 @@ class Icon extends WJElement {
201
203
  });
202
204
  lazyImageObserver.observe(this.native);
203
205
  }
206
+ /**
207
+ * Sync ARIA attributes on host.
208
+ */
209
+ syncAria() {
210
+ const ariaLabel = this.getAttribute("aria-label");
211
+ const label = this.getAttribute("label");
212
+ if (ariaLabel || label) {
213
+ if (!this.hasAttribute("role")) {
214
+ this.setAttribute("role", "img");
215
+ }
216
+ if (!ariaLabel && label) {
217
+ this.setAriaState({ label });
218
+ }
219
+ this.removeAttribute("aria-hidden");
220
+ } else {
221
+ this.setAttribute("aria-hidden", "true");
222
+ }
223
+ }
224
+ /**
225
+ * Handles attribute changes for ARIA sync.
226
+ * @param {string} name
227
+ * @param {string|null} oldValue
228
+ * @param {string|null} newValue
229
+ */
230
+ attributeChangedCallback(name, oldValue, newValue) {
231
+ if (super.attributeChangedCallback) {
232
+ super.attributeChangedCallback(name, oldValue, newValue);
233
+ }
234
+ if (name === "label" && oldValue !== newValue) {
235
+ this.syncAria();
236
+ }
237
+ }
204
238
  }
205
239
  Icon.define("wje-icon", Icon);
206
240
  export {
@@ -208,4 +242,4 @@ export {
208
242
  registerIconLibrary as r,
209
243
  unregisterIconLibrary as u
210
244
  };
211
- //# sourceMappingURL=icon-DY5AZ6xM.js.map
245
+ //# sourceMappingURL=icon-DVyMc4Wv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"icon-DY5AZ6xM.js","sources":["../packages/utils/icon-library.js","../packages/wje-icon/service/service.js","../packages/wje-icon/icon.element.js","../packages/wje-icon/icon.js"],"sourcesContent":["import { getBasePath } from \"./base-path.js\";\n\nlet registry = [];\n\nregisterIconLibrary(\"default\", {\n resolver: (name, style) => getBasePath(`assets/img/icons/${style}/${name}.svg`)\n});\n\nexport function getIconLibrary(name) {\n return registry.find(lib => lib.name === name);\n}\n\nexport function registerIconLibrary(name, options) {\n unregisterIconLibrary(name);\n registry.push({\n name,\n resolver: options.resolver,\n });\n}\n\nexport function unregisterIconLibrary(name) {\n registry = registry.filter(lib => lib.name !== name);\n}","import { getIconLibrary } from \"../../utils/icon-library.js\";\n\nexport const iconContent = new Map();\nconst requests = new Map();\n\nlet parser;\n\n/**\n * Validates and returns a trimmed source string if it meets the required criteria.\n * @param {string} src The source string to validate and trim.\n * @returns {string|null} The validated and trimmed source string, or `null` if invalid.\n * @example\n * getSrc(' https://example.com/image.jpg '); // Returns 'https://example.com/image.jpg'\n * getSrc('invalid-src'); // Returns null\n */\nexport const getSrc = (src) => {\n if (isStr(src)) {\n src = src.trim();\n if (isSrc(src)) {\n return src;\n }\n }\n return null;\n};\n\n/**\n * Checks if a given string is a valid source based on specific criteria.\n * @param {string} str The string to validate as a source.\n * @returns {boolean} `true` if the string is considered a valid source, `false` otherwise.\n * @example\n * isSrc('https://example.com/image.jpg'); // Returns true\n * isSrc('image.jpg'); // Returns true\n * isSrc('invalid-src'); // Returns false\n */\nexport const isSrc = (str) => str.length > 0 && /(\\/|\\.)/.test(str);\n\n/**\n * Checks if the provided URL is an SVG data URL.\n * @param {string} url The URL to check.\n * @returns {boolean} - Returns `true` if the URL starts with 'data:image/svg+xml', otherwise `false`.\n * @example\n * isSvgDataUrl('data:image/svg+xml;base64,...'); // Returns true\n * isSvgDataUrl('https://example.com/image.svg'); // Returns false\n */\nexport const isSvgDataUrl = (url) => url.startsWith('data:image/svg+xml');\n\n/**\n * Checks if the provided URL is an encoded data URL.\n * @param {string} url The URL to check.\n * @returns {boolean} - Returns `true` if the URL contains ';utf8,', otherwise `false`.\n * @example\n * isEncodedDataUrl('data:text/plain;charset=utf8,...'); // Returns true\n * isEncodedDataUrl('https://example.com/file.txt'); // Returns false\n */\nexport const isEncodedDataUrl = (url) => url.indexOf(';utf8,') !== -1;\n\n/**\n * Checks if the provided value is of string type.\n * @param {*} val The value to check.\n * @returns {boolean} - Returns `true` if the value is a string, otherwise `false`.\n * @example\n * isStr('Hello, World!'); // Returns true\n * isStr(12345); // Returns false\n */\nexport const isStr = (val) => typeof val === 'string';\n\n/**\n * Validates the provided SVG content and ensures it contains a valid SVG element.\n * @param {string} svgContent The SVG content to validate.\n * @returns {string} Returns the validated SVG content as a string if valid, otherwise an empty string.\n * @example\n * const validSvg = '&lt;svg class=\"icon\" xmlns=\"http://www.w3.org/2000/svg\">&lt;/svg>';\n * validateContent(validSvg); // Returns '&lt;svg class=\"icon\" xmlns=\"http://www.w3.org/2000/svg\">&lt;/svg>'\n * const invalidSvg = '&lt;div>&lt;/div>';\n * validateContent(invalidSvg); // Returns ''\n */\nexport const validateContent = (svgContent) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n\n if (isValid(svgElm)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\n/**\n * Validates an element to ensure it does not contain potentially unsafe content.\n * @param {Element|Node} elm The element or node to validate.\n * @returns {boolean} - Returns `true` if the element is valid, otherwise `false`.\n * @description\n * This function checks the following:\n * 1. The element is an element node (nodeType 1).\n * 2. The element is not a `&lt;script>` tag.\n * 3. The element does not contain any `on*` event handler attributes (e.g., `onclick`).\n * 4. All child nodes recursively pass the same validation.\n * @example\n * const validElement = document.createElement('div');\n * isValid(validElement); // Returns true\n *\n * const scriptElement = document.createElement('script');\n * isValid(scriptElement); // Returns false\n *\n * const divWithOnClick = document.createElement('div');\n * divWithOnClick.setAttribute('onclick', 'alert(\"hi\")');\n * isValid(divWithOnClick); // Returns false\n */\nexport const isValid = (elm) => {\n // Only element nodes\n if (elm.nodeType === 1) {\n // Check for script elements\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n // Check for on* attributes\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n // Check for child nodes\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i])) {\n return false;\n }\n }\n }\n return true;\n};\n\n/**\n * Fetches and optionally sanitizes SVG content from a given URL.\n * @param {string} url The URL of the SVG resource or data URL.\n * @param {boolean} [sanitize] Whether to sanitize the SVG content. Defaults to `true`.\n * @returns {Promise<void>} A promise that resolves when the SVG content is fetched and stored.\n * @description\n * This function performs the following:\n * - If the URL is an SVG data URL and encoded, it parses the content to extract the SVG.\n * - If the URL is a standard HTTP/HTTPS URL, it fetches the content.\n * - Optionally sanitizes the fetched SVG content.\n * - Caches the content for future use.\n * @example\n * getSvgContent('https://example.com/icon.svg').then(() => {\n * console.log('SVG content fetched and stored.');\n * });\n * @example\n * getSvgContent('data:image/svg+xml;base64,...', false).then(() => {\n * console.log('SVG data URL processed without sanitization.');\n * });\n */\nexport const getSvgContent = (url, sanitize) => {\n let req = requests.get(url);\n if (!req) {\n if (typeof fetch !== 'undefined' && typeof document !== 'undefined') {\n if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {\n if (!parser) {\n parser = new DOMParser();\n }\n const doc = parser.parseFromString(url, 'text/html');\n const svg = doc.querySelector('svg');\n if (svg) {\n iconContent.set(url, svg.outerHTML);\n }\n return Promise.resolve();\n } else {\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n iconContent.set(url, svgContent || '');\n });\n }\n return iconContent.set(url, '');\n });\n requests.set(url, req);\n }\n } else {\n iconContent.set(url, '');\n return Promise.resolve();\n }\n }\n return req;\n};\n\n/**\n * Retrieves the URL for an icon based on its `src` or `name` attributes.\n * @param {HTMLElement} i The icon element from which to extract the URL.\n * @returns {string|null} The URL of the icon if found, or `null` if no valid URL can be determined.\n * @description\n * This function performs the following:\n * 1. Attempts to retrieve the URL from the `src` attribute using `getSrc`.\n * 2. If no `src` is provided, it falls back to the `name` attribute using `getName`.\n * 3. If a name is found, it uses `getNamedUrl` to construct the URL, considering the `filled` attribute.\n * @example\n * const iconElement = document.querySelector('wje-icon');\n * const url = getUrl(iconElement);\n * console.log(url); // Outputs the resolved URL or `null`.\n */\nexport const getUrl = (i) => {\n let url = getSrc(i.src);\n if (url) {\n return url;\n }\n\n url = getName(i.name);\n\n if (url) {\n return getNamedUrl(url, i.library, i.hasAttribute('filled'));\n }\n\n return null;\n};\n\n/**\n * Validates and returns a sanitized icon name.\n * @param {string} iconName The icon name to validate.\n * @returns {string|null} The sanitized icon name, or `null` if the input is invalid.\n * @description\n * This function checks if the provided `iconName` is a valid string:\n * - It must not be empty or contain invalid characters.\n * - Only alphanumeric characters, hyphens, and digits are allowed.\n * @example\n * const validName = getName('user-icon');\n * console.log(validName); // 'user-icon'\n * const invalidName = getName('user@icon!');\n * console.log(invalidName); // null\n */\nexport const getName = (iconName) => {\n if (!isStr(iconName) || iconName.trim() === '') {\n return null;\n }\n\n const invalidChars = iconName.replace(/[a-z]|-|\\d/gi, '');\n if (invalidChars !== '') {\n return null;\n }\n\n return iconName;\n};\n\n/**\n * Constructs the URL for a named SVG icon.\n * @param {string} iconName The name of the icon to retrieve.\n * @param {string} [libraryName] The name of the icon library to use. Defaults to \"default\".\n * @param {boolean} [filled] Whether to use the \"filled\" variant of the icon. Defaults to \"outline\" if `false`.\n * @returns {string} - The complete URL to the SVG icon.\n * @description\n * This function generates a URL for an icon based on its name and style (filled or outline).\n * It uses the base URL from the environment variable `VITE_ICON_ASSETS_URL`.\n * @example\n * const url = getNamedUrl('user-icon', 'default', true);\n * console.log(url); // 'https://example.com/filled/user-icon.svg'\n *\n * const outlineUrl = getNamedUrl('settings', 'default');\n * console.log(outlineUrl); // 'https://example.com/outline/settings.svg'\n */\nconst getNamedUrl = (iconName, libraryName = 'default', filled = false) => {\n let library = getIconLibrary(libraryName);\n let url = library.resolver(iconName, filled ? 'filled' : 'outline');\n\n return url;\n}\n","import { default as WJElement } from '../wje-element/element.js';\nimport { getSvgContent, getUrl, iconContent } from './service/service.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary This element represents an icon. `IconElement` is a custom web component that represents an icon.\n * @documentation https://elements.webjet.sk/components/icon\n * @status stable\n * @augments WJElement\n * @csspart svg - The SVG part of the icon\n * @cssproperty [--wje-icon-size=1rem] - The size of the icon element\n * @cssproperty [--wje-icon-width=var(--wje-icon-size, 100%)] - The width of the icon element\n * @cssproperty [--wje-icon-height=var(--wje-icon-size, 100%)] - The height of the icon element\n * @tag wje-icon\n */\nexport default class Icon extends WJElement {\n /**\n * Creates an instance of IconElement.\n * @class\n */\n constructor() {\n super();\n }\n\n /**\n * Sets the name of the icon.\n * @type {string}\n */\n className = 'Icon';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return ['name', 'filled'];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n }\n\n /**\n * Draws the component.\n * @param {object} context The context for drawing.\n * @param {object} store The store for drawing.\n * @param {object} params The parameters for drawing.\n * @returns {DocumentFragment}\n */\n draw(context, store, params) {\n let fragment = document.createDocumentFragment();\n\n this.classList.add('lazy-loaded-image', 'lazy');\n\n let native = document.createElement('div');\n native.setAttribute('part', 'native');\n native.classList.add('native-icon');\n\n this.url = getUrl(this);\n\n fragment.appendChild(native);\n\n this.native = native;\n\n return fragment;\n }\n\n /**\n * Called after the component has been drawn.\n */\n afterDraw() {\n let lazyImageObserver = new IntersectionObserver((entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n getSvgContent(this.url).then((svgContent) => {\n this.native.innerHTML = iconContent?.get(this.url);\n this.native.querySelector('svg')?.setAttribute('part', 'svg');\n });\n\n this.classList.remove('lazy');\n lazyImageObserver.unobserve(entry.target);\n }\n });\n });\n\n lazyImageObserver.observe(this.native);\n }\n}\n","import Icon from './icon.element.js';\n\nexport default Icon;\n\nIcon.define('wje-icon', Icon);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"icon-DVyMc4Wv.js","sources":["../packages/utils/icon-library.js","../packages/wje-icon/service/service.js","../packages/wje-icon/icon.element.js","../packages/wje-icon/icon.js"],"sourcesContent":["import { getBasePath } from \"./base-path.js\";\n\nlet registry = [];\n\nregisterIconLibrary(\"default\", {\n resolver: (name, style) => getBasePath(`assets/img/icons/${style}/${name}.svg`)\n});\n\nexport function getIconLibrary(name) {\n return registry.find(lib => lib.name === name);\n}\n\nexport function registerIconLibrary(name, options) {\n unregisterIconLibrary(name);\n registry.push({\n name,\n resolver: options.resolver,\n });\n}\n\nexport function unregisterIconLibrary(name) {\n registry = registry.filter(lib => lib.name !== name);\n}","import { getIconLibrary } from \"../../utils/icon-library.js\";\n\nexport const iconContent = new Map();\nconst requests = new Map();\n\nlet parser;\n\n/**\n * Validates and returns a trimmed source string if it meets the required criteria.\n * @param {string} src The source string to validate and trim.\n * @returns {string|null} The validated and trimmed source string, or `null` if invalid.\n * @example\n * getSrc(' https://example.com/image.jpg '); // Returns 'https://example.com/image.jpg'\n * getSrc('invalid-src'); // Returns null\n */\nexport const getSrc = (src) => {\n if (isStr(src)) {\n src = src.trim();\n if (isSrc(src)) {\n return src;\n }\n }\n return null;\n};\n\n/**\n * Checks if a given string is a valid source based on specific criteria.\n * @param {string} str The string to validate as a source.\n * @returns {boolean} `true` if the string is considered a valid source, `false` otherwise.\n * @example\n * isSrc('https://example.com/image.jpg'); // Returns true\n * isSrc('image.jpg'); // Returns true\n * isSrc('invalid-src'); // Returns false\n */\nexport const isSrc = (str) => str.length > 0 && /(\\/|\\.)/.test(str);\n\n/**\n * Checks if the provided URL is an SVG data URL.\n * @param {string} url The URL to check.\n * @returns {boolean} - Returns `true` if the URL starts with 'data:image/svg+xml', otherwise `false`.\n * @example\n * isSvgDataUrl('data:image/svg+xml;base64,...'); // Returns true\n * isSvgDataUrl('https://example.com/image.svg'); // Returns false\n */\nexport const isSvgDataUrl = (url) => url.startsWith('data:image/svg+xml');\n\n/**\n * Checks if the provided URL is an encoded data URL.\n * @param {string} url The URL to check.\n * @returns {boolean} - Returns `true` if the URL contains ';utf8,', otherwise `false`.\n * @example\n * isEncodedDataUrl('data:text/plain;charset=utf8,...'); // Returns true\n * isEncodedDataUrl('https://example.com/file.txt'); // Returns false\n */\nexport const isEncodedDataUrl = (url) => url.indexOf(';utf8,') !== -1;\n\n/**\n * Checks if the provided value is of string type.\n * @param {*} val The value to check.\n * @returns {boolean} - Returns `true` if the value is a string, otherwise `false`.\n * @example\n * isStr('Hello, World!'); // Returns true\n * isStr(12345); // Returns false\n */\nexport const isStr = (val) => typeof val === 'string';\n\n/**\n * Validates the provided SVG content and ensures it contains a valid SVG element.\n * @param {string} svgContent The SVG content to validate.\n * @returns {string} Returns the validated SVG content as a string if valid, otherwise an empty string.\n * @example\n * const validSvg = '&lt;svg class=\"icon\" xmlns=\"http://www.w3.org/2000/svg\">&lt;/svg>';\n * validateContent(validSvg); // Returns '&lt;svg class=\"icon\" xmlns=\"http://www.w3.org/2000/svg\">&lt;/svg>'\n * const invalidSvg = '&lt;div>&lt;/div>';\n * validateContent(invalidSvg); // Returns ''\n */\nexport const validateContent = (svgContent) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n const svgClass = svgElm.getAttribute('class') || '';\n\n if (isValid(svgElm)) {\n return div.innerHTML;\n }\n }\n return '';\n};\n\n/**\n * Validates an element to ensure it does not contain potentially unsafe content.\n * @param {Element|Node} elm The element or node to validate.\n * @returns {boolean} - Returns `true` if the element is valid, otherwise `false`.\n * @description\n * This function checks the following:\n * 1. The element is an element node (nodeType 1).\n * 2. The element is not a `&lt;script>` tag.\n * 3. The element does not contain any `on*` event handler attributes (e.g., `onclick`).\n * 4. All child nodes recursively pass the same validation.\n * @example\n * const validElement = document.createElement('div');\n * isValid(validElement); // Returns true\n *\n * const scriptElement = document.createElement('script');\n * isValid(scriptElement); // Returns false\n *\n * const divWithOnClick = document.createElement('div');\n * divWithOnClick.setAttribute('onclick', 'alert(\"hi\")');\n * isValid(divWithOnClick); // Returns false\n */\nexport const isValid = (elm) => {\n // Only element nodes\n if (elm.nodeType === 1) {\n // Check for script elements\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n // Check for on* attributes\n for (let i = 0; i < elm.attributes.length; i++) {\n const name = elm.attributes[i].name;\n if (isStr(name) && name.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n // Check for child nodes\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i])) {\n return false;\n }\n }\n }\n return true;\n};\n\n/**\n * Fetches and optionally sanitizes SVG content from a given URL.\n * @param {string} url The URL of the SVG resource or data URL.\n * @param {boolean} [sanitize] Whether to sanitize the SVG content. Defaults to `true`.\n * @returns {Promise<void>} A promise that resolves when the SVG content is fetched and stored.\n * @description\n * This function performs the following:\n * - If the URL is an SVG data URL and encoded, it parses the content to extract the SVG.\n * - If the URL is a standard HTTP/HTTPS URL, it fetches the content.\n * - Optionally sanitizes the fetched SVG content.\n * - Caches the content for future use.\n * @example\n * getSvgContent('https://example.com/icon.svg').then(() => {\n * console.log('SVG content fetched and stored.');\n * });\n * @example\n * getSvgContent('data:image/svg+xml;base64,...', false).then(() => {\n * console.log('SVG data URL processed without sanitization.');\n * });\n */\nexport const getSvgContent = (url, sanitize) => {\n let req = requests.get(url);\n if (!req) {\n if (typeof fetch !== 'undefined' && typeof document !== 'undefined') {\n if (isSvgDataUrl(url) && isEncodedDataUrl(url)) {\n if (!parser) {\n parser = new DOMParser();\n }\n const doc = parser.parseFromString(url, 'text/html');\n const svg = doc.querySelector('svg');\n if (svg) {\n iconContent.set(url, svg.outerHTML);\n }\n return Promise.resolve();\n } else {\n req = fetch(url).then((rsp) => {\n if (rsp.ok) {\n return rsp.text().then((svgContent) => {\n if (svgContent && sanitize !== false) {\n svgContent = validateContent(svgContent);\n }\n iconContent.set(url, svgContent || '');\n });\n }\n return iconContent.set(url, '');\n });\n requests.set(url, req);\n }\n } else {\n iconContent.set(url, '');\n return Promise.resolve();\n }\n }\n return req;\n};\n\n/**\n * Retrieves the URL for an icon based on its `src` or `name` attributes.\n * @param {HTMLElement} i The icon element from which to extract the URL.\n * @returns {string|null} The URL of the icon if found, or `null` if no valid URL can be determined.\n * @description\n * This function performs the following:\n * 1. Attempts to retrieve the URL from the `src` attribute using `getSrc`.\n * 2. If no `src` is provided, it falls back to the `name` attribute using `getName`.\n * 3. If a name is found, it uses `getNamedUrl` to construct the URL, considering the `filled` attribute.\n * @example\n * const iconElement = document.querySelector('wje-icon');\n * const url = getUrl(iconElement);\n * console.log(url); // Outputs the resolved URL or `null`.\n */\nexport const getUrl = (i) => {\n let url = getSrc(i.src);\n if (url) {\n return url;\n }\n\n url = getName(i.name);\n\n if (url) {\n return getNamedUrl(url, i.library, i.hasAttribute('filled'));\n }\n\n return null;\n};\n\n/**\n * Validates and returns a sanitized icon name.\n * @param {string} iconName The icon name to validate.\n * @returns {string|null} The sanitized icon name, or `null` if the input is invalid.\n * @description\n * This function checks if the provided `iconName` is a valid string:\n * - It must not be empty or contain invalid characters.\n * - Only alphanumeric characters, hyphens, and digits are allowed.\n * @example\n * const validName = getName('user-icon');\n * console.log(validName); // 'user-icon'\n * const invalidName = getName('user@icon!');\n * console.log(invalidName); // null\n */\nexport const getName = (iconName) => {\n if (!isStr(iconName) || iconName.trim() === '') {\n return null;\n }\n\n const invalidChars = iconName.replace(/[a-z]|-|\\d/gi, '');\n if (invalidChars !== '') {\n return null;\n }\n\n return iconName;\n};\n\n/**\n * Constructs the URL for a named SVG icon.\n * @param {string} iconName The name of the icon to retrieve.\n * @param {string} [libraryName] The name of the icon library to use. Defaults to \"default\".\n * @param {boolean} [filled] Whether to use the \"filled\" variant of the icon. Defaults to \"outline\" if `false`.\n * @returns {string} - The complete URL to the SVG icon.\n * @description\n * This function generates a URL for an icon based on its name and style (filled or outline).\n * It uses the base URL from the environment variable `VITE_ICON_ASSETS_URL`.\n * @example\n * const url = getNamedUrl('user-icon', 'default', true);\n * console.log(url); // 'https://example.com/filled/user-icon.svg'\n *\n * const outlineUrl = getNamedUrl('settings', 'default');\n * console.log(outlineUrl); // 'https://example.com/outline/settings.svg'\n */\nconst getNamedUrl = (iconName, libraryName = 'default', filled = false) => {\n let library = getIconLibrary(libraryName);\n let url = library.resolver(iconName, filled ? 'filled' : 'outline');\n\n return url;\n}\n","import { default as WJElement } from '../wje-element/element.js';\nimport { getSvgContent, getUrl, iconContent } from './service/service.js';\nimport styles from './styles/styles.css?inline';\n\n/**\n * @summary This element represents an icon. `IconElement` is a custom web component that represents an icon.\n * @documentation https://elements.webjet.sk/components/icon\n * @status stable\n * @augments WJElement\n * @csspart svg - The SVG part of the icon\n * @cssproperty [--wje-icon-size=1rem] - The size of the icon element\n * @cssproperty [--wje-icon-width=var(--wje-icon-size, 100%)] - The width of the icon element\n * @cssproperty [--wje-icon-height=var(--wje-icon-size, 100%)] - The height of the icon element\n * @tag wje-icon\n */\nexport default class Icon extends WJElement {\n /**\n * Creates an instance of IconElement.\n * @class\n */\n constructor() {\n super();\n }\n\n /**\n * Sets the name of the icon.\n * @type {string}\n */\n className = 'Icon';\n\n /**\n * Returns the CSS styles for the component.\n * @static\n * @returns {CSSStyleSheet}\n */\n static get cssStyleSheet() {\n return styles;\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n * @static\n * @returns {Array<string>}\n */\n static get observedAttributes() {\n return ['name', 'filled', 'label'];\n }\n\n /**\n * Sets up the attributes for the component.\n */\n setupAttributes() {\n this.isShadowRoot = 'open';\n this.syncAria();\n }\n\n /**\n * Draws the component.\n * @param {object} context The context for drawing.\n * @param {object} store The store for drawing.\n * @param {object} params The parameters for drawing.\n * @returns {DocumentFragment}\n */\n draw(context, store, params) {\n let fragment = document.createDocumentFragment();\n\n this.classList.add('lazy-loaded-image', 'lazy');\n\n let native = document.createElement('div');\n native.setAttribute('part', 'native');\n native.classList.add('native-icon');\n\n this.url = getUrl(this);\n\n fragment.appendChild(native);\n\n this.native = native;\n\n return fragment;\n }\n\n /**\n * Called after the component has been drawn.\n */\n afterDraw() {\n this.syncAria();\n let lazyImageObserver = new IntersectionObserver((entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n getSvgContent(this.url).then((svgContent) => {\n this.native.innerHTML = iconContent?.get(this.url);\n this.native.querySelector('svg')?.setAttribute('part', 'svg');\n });\n\n this.classList.remove('lazy');\n lazyImageObserver.unobserve(entry.target);\n }\n });\n });\n\n lazyImageObserver.observe(this.native);\n }\n\n /**\n * Sync ARIA attributes on host.\n */\n syncAria() {\n const ariaLabel = this.getAttribute('aria-label');\n const label = this.getAttribute('label');\n\n if (ariaLabel || label) {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'img');\n }\n if (!ariaLabel && label) {\n this.setAriaState({ label });\n }\n this.removeAttribute('aria-hidden');\n } else {\n this.setAttribute('aria-hidden', 'true');\n }\n }\n\n /**\n * Handles attribute changes for ARIA sync.\n * @param {string} name\n * @param {string|null} oldValue\n * @param {string|null} newValue\n */\n attributeChangedCallback(name, oldValue, newValue) {\n if (super.attributeChangedCallback) {\n super.attributeChangedCallback(name, oldValue, newValue);\n }\n\n if (name === 'label' && oldValue !== newValue) {\n this.syncAria();\n }\n }\n}\n","import Icon from './icon.element.js';\n\nexport default Icon;\n\nIcon.define('wje-icon', Icon);\n"],"names":[],"mappings":"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"}
package/dist/light.css CHANGED
@@ -5,7 +5,8 @@
5
5
  :root,
6
6
  :host,
7
7
  .wje-theme-light,
8
- .light {
8
+ .light,
9
+ [data-theme=light] {
9
10
  * {
10
11
  box-sizing: border-box !important;
11
12
  }
@@ -226,7 +227,7 @@
226
227
  [ Skeleton ]
227
228
  */
228
229
  --wje-skeleton-bg: var(--wje-color-contrast-3);
229
- --wje-skeleton-bg-strong: var(--wje-color-contrast-4);
230
+ --wje-skeleton-bg-strong: var(--wje-color-contrast-5);
230
231
  --wje-skeleton-highlight: rgba(255, 255, 255, 0.45);
231
232
  --wje-skeleton-radius: var(--wje-border-radius-pill);
232
233
  --wje-skeleton-height: var(--wje-size-small);
@@ -358,6 +359,7 @@
358
359
  --wje-chip-padding-inline: var(--wje-spacing-small);
359
360
 
360
361
  /* Dialog */
362
+ --wje-dialog-background: var(--wje-color-contrast-1);
361
363
  --wje-dialog-width: 600px;
362
364
  --wje-dialog-height: 600px;
363
365
  --wje-dialog-border-radius: var(--wje-border-radius-medium);
@@ -562,6 +564,9 @@
562
564
  --wje-orgchart-group-height-line: 10px;
563
565
  --wje-orgchart-group-padding: 0.25rem 0;
564
566
 
567
+ /* Popup */
568
+ --wje-popup-overlay-background: var(--wje-color-contrast-0);
569
+
565
570
  /* Radio */
566
571
  --wje-radio-margin-top: 0;
567
572
  --wje-radio-margin-bottom: 0.5rem;
package/dist/localize.js CHANGED
@@ -4,9 +4,10 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
4
4
  class LocalizerDefault {
5
5
  constructor(element) {
6
6
  __publicField(this, "convertLangCode", (lang) => lang.replace("-", "_").replace(/_([a-z]{2})$/, (_, code) => `_${code.toUpperCase()}`));
7
+ var _a, _b, _c, _d;
7
8
  this.element = element;
8
- this.lang = this.element.lang || document.documentElement.lang || "en-GB";
9
- this.dir = this.element.dir || document.documentElement.dir || "ltr";
9
+ this.lang = ((_a = this.element) == null ? void 0 : _a.lang) || ((_b = document.documentElement) == null ? void 0 : _b.lang) || "en-GB";
10
+ this.dir = ((_c = this.element) == null ? void 0 : _c.dir) || ((_d = document.documentElement) == null ? void 0 : _d.dir) || "ltr";
10
11
  this.currentLang = "en-GB";
11
12
  this.setLanguage();
12
13
  }
@@ -41,9 +42,11 @@ class LocalizerDefault {
41
42
  * @returns {string} The translated string, adapted to the pluralization rules and count.
42
43
  */
43
44
  translatePlural(key, count = 0, type = "cardinal") {
44
- const plural = new Intl.PluralRules(this.lang, { type });
45
- if (count !== void 0) key += "." + plural.select(count);
46
- return this.translate(key);
45
+ const plural = new Intl.PluralRules(this.currentLang, { type });
46
+ const k = `${key}.${plural.select(count)}`;
47
+ const t = this.translate(k);
48
+ if (t !== k) return t;
49
+ return this.translate(`${key}.other`);
47
50
  }
48
51
  /**
49
52
  * Formats a number according to the specified locale and formatting options.
@@ -1 +1 @@
1
- {"version":3,"file":"localize.js","sources":["../packages/localize/localize.js","../packages/utils/localize.js"],"sourcesContent":["// export const translations = new Map();\n\nexport class LocalizerDefault {\n constructor(element) {\n this.element = element;\n\n this.lang = this.element.lang || document.documentElement.lang || 'en-GB';\n this.dir = this.element.dir || document.documentElement.dir || 'ltr';\n this.currentLang = 'en-GB';\n\n this.setLanguage();\n }\n\n get languages() {\n return window.translations;\n }\n\n // Nastavenie aktuálneho jazyka\n setLanguage() {\n if (this.languages?.has(this.lang)) {\n this.currentLang = this.lang;\n } else {\n console.error(`Language \"${this.lang}\" not loaded.`);\n }\n }\n\n convertLangCode = (lang) => lang.replace(\"-\", \"_\").replace(/_([a-z]{2})$/, (_, code) => `_${code.toUpperCase()}`);\n\n /**\n * Translates a given translation key based on the currently selected language.\n * @param {string} key The key representing the text to be translated.\n * @returns {string} The translated text if available; otherwise, returns the original key.\n */\n translate(key) {\n const langMap = this.languages?.get(this.currentLang);\n if (!langMap) return key;\n return langMap ? langMap[key] || key : key;\n }\n\n /**\n * Translates a key into a localized string based on the provided count and pluralization type.\n * @param {string} key The base translation key to be used for fetching the localized string.\n * @param {number} [count=0] The count value used to determine the pluralization form.\n * @param {string} [type='cardinal'] The type of pluralization to use, such as 'cardinal' or 'ordinal'.\n * @returns {string} The translated string, adapted to the pluralization rules and count.\n */\n translatePlural(key, count = 0, type = 'cardinal') {\n const plural = new Intl.PluralRules(this.lang, { type: type });\n\n if (count !== undefined) key += '.' + plural.select(count);\n\n return this.translate(key);\n }\n\n /**\n * Formats a number according to the specified locale and formatting options.\n * @param {number} number The numeric value to format.\n * @param {object} options An object containing formatting options for the number.\n * @returns {string} The formatted number as a string.\n */\n formatNumber(number, options) {\n return new Intl.NumberFormat(this.currentLang, options).format(number);\n }\n\n /**\n * Formats a given date based on the specified options and the current language setting.\n * @param {string|Date|number} date The date to format. Can be a Date object, a timestamp, or a date string.\n * @param {object} options The formatting options to customize the output, as supported by Intl.DateTimeFormat.\n * @returns {string} The formatted date string based on the specified options and current language.\n */\n formatDate(date, options) {\n return new Intl.DateTimeFormat(this.currentLang, options).format(new Date(date));\n }\n\n /**\n * Formats a relative time string based on a given language, value, unit, and formatting options.\n * @param {string} lang The language to use for formatting. Defaults to `this.currentLang` if not provided.\n * @param {number} value The numerical value to format, representing the time difference.\n * @param {string} [unit] The unit of time to use (e.g., \"second\", \"minute\", \"hour\", \"day\", \"week\", \"month\", \"year\").\n * @param {object} [options] An object containing formatting options, such as the style for the numeric representation.\n * @returns {string} The formatted relative time string in the specified language.\n */\n relativeTime(lang, value = 0, unit = 'day', options = { numeric: 'auto' }) {\n lang = lang || this.currentLang;\n return new Intl.RelativeTimeFormat(lang, options).format(value, unit);\n }\n}\n\nexport function registerTranslation(...translation) {\n translation.forEach((t) => {\n if (!t.code) {\n console.error(\"Translation object is missing 'code' property:\", t);\n return;\n }\n\n const code = t.code.toLowerCase();\n if (window.translations.has(code)) {\n window.translations.set(code, { ...window.translations.get(code), ...t });\n } else {\n window.translations.set(code, t);\n }\n });\n}\n","import { LocalizerDefault, registerTranslation } from '../localize/localize.js';\n\nexport class Localizer extends LocalizerDefault {\n constructor(element) {\n super(element);\n }\n static registerTranslation(...translation) {\n registerTranslation(...translation);\n }\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,iBAAiB;AAAA,EAC1B,YAAY,SAAS;AAuBrB,2CAAkB,CAAC,SAAS,KAAK,QAAQ,KAAK,GAAG,EAAE,QAAQ,gBAAgB,CAAC,GAAG,SAAS,IAAI,KAAK,YAAa,CAAA,EAAE;AAtB5G,SAAK,UAAU;AAEf,SAAK,OAAO,KAAK,QAAQ,QAAQ,SAAS,gBAAgB,QAAQ;AAClE,SAAK,MAAM,KAAK,QAAQ,OAAO,SAAS,gBAAgB,OAAO;AAC/D,SAAK,cAAc;AAEnB,SAAK,YAAa;AAAA,EAC1B;AAAA,EAEI,IAAI,YAAY;AACZ,WAAO,OAAO;AAAA,EACtB;AAAA;AAAA,EAGI,cAAc;AAlBlB;AAmBQ,SAAI,UAAK,cAAL,mBAAgB,IAAI,KAAK,OAAO;AAChC,WAAK,cAAc,KAAK;AAAA,IACpC,OAAe;AACH,cAAQ,MAAM,aAAa,KAAK,IAAI,eAAe;AAAA,IAC/D;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASI,UAAU,KAAK;AAjCnB;AAkCQ,UAAM,WAAU,UAAK,cAAL,mBAAgB,IAAI,KAAK;AACzC,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,UAAU,QAAQ,GAAG,KAAK,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASI,gBAAgB,KAAK,QAAQ,GAAG,OAAO,YAAY;AAC/C,UAAM,SAAS,IAAI,KAAK,YAAY,KAAK,MAAM,EAAE,MAAY;AAE7D,QAAI,UAAU,OAAW,QAAO,MAAM,OAAO,OAAO,KAAK;AAEzD,WAAO,KAAK,UAAU,GAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,aAAa,QAAQ,SAAS;AAC1B,WAAO,IAAI,KAAK,aAAa,KAAK,aAAa,OAAO,EAAE,OAAO,MAAM;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,WAAW,MAAM,SAAS;AACtB,WAAO,IAAI,KAAK,eAAe,KAAK,aAAa,OAAO,EAAE,OAAO,IAAI,KAAK,IAAI,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUI,aAAa,MAAM,QAAQ,GAAG,OAAO,OAAO,UAAU,EAAE,SAAS,UAAU;AACvE,WAAO,QAAQ,KAAK;AACpB,WAAO,IAAI,KAAK,mBAAmB,MAAM,OAAO,EAAE,OAAO,OAAO,IAAI;AAAA,EAC5E;AACA;AAEO,SAAS,uBAAuB,aAAa;AAChD,cAAY,QAAQ,CAAC,MAAM;AACvB,QAAI,CAAC,EAAE,MAAM;AACT,cAAQ,MAAM,kDAAkD,CAAC;AACjE;AAAA,IACZ;AAEQ,UAAM,OAAO,EAAE,KAAK,YAAa;AACjC,QAAI,OAAO,aAAa,IAAI,IAAI,GAAG;AAC/B,aAAO,aAAa,IAAI,MAAM,EAAE,GAAG,OAAO,aAAa,IAAI,IAAI,GAAG,GAAG,EAAC,CAAE;AAAA,IACpF,OAAe;AACH,aAAO,aAAa,IAAI,MAAM,CAAC;AAAA,IAC3C;AAAA,EACA,CAAK;AACL;ACpGO,MAAM,kBAAkB,iBAAiB;AAAA,EAC5C,YAAY,SAAS;AACjB,UAAM,OAAO;AAAA,EACrB;AAAA,EACI,OAAO,uBAAuB,aAAa;AACvC,wBAAoB,GAAG,WAAW;AAAA,EAC1C;AACA;"}
1
+ {"version":3,"file":"localize.js","sources":["../packages/localize/localize.js","../packages/utils/localize.js"],"sourcesContent":["// export const translations = new Map();\n\nexport class LocalizerDefault {\n constructor(element) {\n this.element = element;\n\n this.lang = this.element?.lang || document.documentElement?.lang || 'en-GB';\n this.dir = this.element?.dir || document.documentElement?.dir || 'ltr';\n this.currentLang = 'en-GB';\n\n this.setLanguage();\n }\n\n get languages() {\n return window.translations;\n }\n\n // Nastavenie aktuálneho jazyka\n setLanguage() {\n if (this.languages?.has(this.lang)) {\n this.currentLang = this.lang;\n } else {\n console.error(`Language \"${this.lang}\" not loaded.`);\n }\n }\n\n convertLangCode = (lang) => lang.replace(\"-\", \"_\").replace(/_([a-z]{2})$/, (_, code) => `_${code.toUpperCase()}`);\n\n /**\n * Translates a given translation key based on the currently selected language.\n * @param {string} key The key representing the text to be translated.\n * @returns {string} The translated text if available; otherwise, returns the original key.\n */\n translate(key) {\n const langMap = this.languages?.get(this.currentLang);\n if (!langMap) return key;\n return langMap ? langMap[key] || key : key;\n }\n\n /**\n * Translates a key into a localized string based on the provided count and pluralization type.\n * @param {string} key The base translation key to be used for fetching the localized string.\n * @param {number} [count=0] The count value used to determine the pluralization form.\n * @param {string} [type='cardinal'] The type of pluralization to use, such as 'cardinal' or 'ordinal'.\n * @returns {string} The translated string, adapted to the pluralization rules and count.\n */\n translatePlural(key, count = 0, type = 'cardinal') {\n const plural = new Intl.PluralRules(this.currentLang, { type });\n const k = `${key}.${plural.select(count)}`;\n const t = this.translate(k);\n if (t !== k) return t;\n return this.translate(`${key}.other`);\n }\n\n /**\n * Formats a number according to the specified locale and formatting options.\n * @param {number} number The numeric value to format.\n * @param {object} options An object containing formatting options for the number.\n * @returns {string} The formatted number as a string.\n */\n formatNumber(number, options) {\n return new Intl.NumberFormat(this.currentLang, options).format(number);\n }\n\n /**\n * Formats a given date based on the specified options and the current language setting.\n * @param {string|Date|number} date The date to format. Can be a Date object, a timestamp, or a date string.\n * @param {object} options The formatting options to customize the output, as supported by Intl.DateTimeFormat.\n * @returns {string} The formatted date string based on the specified options and current language.\n */\n formatDate(date, options) {\n return new Intl.DateTimeFormat(this.currentLang, options).format(new Date(date));\n }\n\n /**\n * Formats a relative time string based on a given language, value, unit, and formatting options.\n * @param {string} lang The language to use for formatting. Defaults to `this.currentLang` if not provided.\n * @param {number} value The numerical value to format, representing the time difference.\n * @param {string} [unit] The unit of time to use (e.g., \"second\", \"minute\", \"hour\", \"day\", \"week\", \"month\", \"year\").\n * @param {object} [options] An object containing formatting options, such as the style for the numeric representation.\n * @returns {string} The formatted relative time string in the specified language.\n */\n relativeTime(lang, value = 0, unit = 'day', options = { numeric: 'auto' }) {\n lang = lang || this.currentLang;\n return new Intl.RelativeTimeFormat(lang, options).format(value, unit);\n }\n}\n\nexport function registerTranslation(...translation) {\n translation.forEach((t) => {\n if (!t.code) {\n console.error(\"Translation object is missing 'code' property:\", t);\n return;\n }\n\n const code = t.code.toLowerCase();\n if (window.translations.has(code)) {\n window.translations.set(code, { ...window.translations.get(code), ...t });\n } else {\n window.translations.set(code, t);\n }\n });\n}\n","import { LocalizerDefault, registerTranslation } from '../localize/localize.js';\n\nexport class Localizer extends LocalizerDefault {\n constructor(element) {\n super(element);\n }\n static registerTranslation(...translation) {\n registerTranslation(...translation);\n }\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,iBAAiB;AAAA,EAC1B,YAAY,SAAS;AAuBrB,2CAAkB,CAAC,SAAS,KAAK,QAAQ,KAAK,GAAG,EAAE,QAAQ,gBAAgB,CAAC,GAAG,SAAS,IAAI,KAAK,YAAW,CAAE,EAAE;AA1BpH;AAIQ,SAAK,UAAU;AAEf,SAAK,SAAO,UAAK,YAAL,mBAAc,WAAQ,cAAS,oBAAT,mBAA0B,SAAQ;AACpE,SAAK,QAAM,UAAK,YAAL,mBAAc,UAAO,cAAS,oBAAT,mBAA0B,QAAO;AACjE,SAAK,cAAc;AAEnB,SAAK,YAAW;AAAA,EACpB;AAAA,EAEA,IAAI,YAAY;AACZ,WAAO,OAAO;AAAA,EAClB;AAAA;AAAA,EAGA,cAAc;AAlBlB;AAmBQ,SAAI,UAAK,cAAL,mBAAgB,IAAI,KAAK,OAAO;AAChC,WAAK,cAAc,KAAK;AAAA,IAC5B,OAAO;AACH,cAAQ,MAAM,aAAa,KAAK,IAAI,eAAe;AAAA,IACvD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,KAAK;AAjCnB;AAkCQ,UAAM,WAAU,UAAK,cAAL,mBAAgB,IAAI,KAAK;AACzC,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,UAAU,QAAQ,GAAG,KAAK,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,KAAK,QAAQ,GAAG,OAAO,YAAY;AAC/C,UAAM,SAAS,IAAI,KAAK,YAAY,KAAK,aAAa,EAAE,MAAM;AAC9D,UAAM,IAAI,GAAG,GAAG,IAAI,OAAO,OAAO,KAAK,CAAC;AACxC,UAAM,IAAI,KAAK,UAAU,CAAC;AAC1B,QAAI,MAAM,EAAG,QAAO;AACpB,WAAO,KAAK,UAAU,GAAG,GAAG,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,QAAQ,SAAS;AAC1B,WAAO,IAAI,KAAK,aAAa,KAAK,aAAa,OAAO,EAAE,OAAO,MAAM;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAM,SAAS;AACtB,WAAO,IAAI,KAAK,eAAe,KAAK,aAAa,OAAO,EAAE,OAAO,IAAI,KAAK,IAAI,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,MAAM,QAAQ,GAAG,OAAO,OAAO,UAAU,EAAE,SAAS,UAAU;AACvE,WAAO,QAAQ,KAAK;AACpB,WAAO,IAAI,KAAK,mBAAmB,MAAM,OAAO,EAAE,OAAO,OAAO,IAAI;AAAA,EACxE;AACJ;AAEO,SAAS,uBAAuB,aAAa;AAChD,cAAY,QAAQ,CAAC,MAAM;AACvB,QAAI,CAAC,EAAE,MAAM;AACT,cAAQ,MAAM,kDAAkD,CAAC;AACjE;AAAA,IACJ;AAEA,UAAM,OAAO,EAAE,KAAK,YAAW;AAC/B,QAAI,OAAO,aAAa,IAAI,IAAI,GAAG;AAC/B,aAAO,aAAa,IAAI,MAAM,EAAE,GAAG,OAAO,aAAa,IAAI,IAAI,GAAG,GAAG,EAAC,CAAE;AAAA,IAC5E,OAAO;AACH,aAAO,aAAa,IAAI,MAAM,CAAC;AAAA,IACnC;AAAA,EACJ,CAAC;AACL;ACpGO,MAAM,kBAAkB,iBAAiB;AAAA,EAC5C,YAAY,SAAS;AACjB,UAAM,OAAO;AAAA,EACjB;AAAA,EACA,OAAO,uBAAuB,aAAa;AACvC,wBAAoB,GAAG,WAAW;AAAA,EACtC;AACJ;"}
@@ -1,7 +1,6 @@
1
1
  import { default as WJElement } from '../wje-element/element.js';
2
2
  export class FormAssociatedElement extends WJElement {
3
3
  static formAssociated: boolean;
4
- internals: ElementInternals;
5
4
  /**
6
5
  * Sets the 'name' attribute to the given value.
7
6
  * @param {string} value The new value for the 'name' attribute.
@@ -1 +1,17 @@
1
+ /**
2
+ * Checks if a given file matches any of the accepted file types.
3
+ * @param {File} file The file to validate.
4
+ * @param {string|string[]} acceptedFileTypes A comma-separated string or an array of accepted MIME types or file extensions.
5
+ * @returns {boolean} Returns `true` if the file type is valid, otherwise `false`.
6
+ * @throws {Error} Throws an error if `acceptedFileTypes` is empty.
7
+ * @example
8
+ * const file = new File([""], "example.png", { type: "image/png" });
9
+ * const isValid = isValidFileType(file, "image/*,application/pdf");
10
+ * console.log(isValid); // true
11
+ * @example
12
+ * const file = new File([""], "example.txt", { type: "text/plain" });
13
+ * const isValid = isValidFileType(file, ["text/plain", "application/json"]);
14
+ * console.log(isValid); // true
15
+ */
16
+ export function isValidFileType(file: File, acceptedFileTypes: string | string[]): boolean;
1
17
  export function bool(v: any): boolean;
@@ -8,6 +8,7 @@ import { default as WJElement } from '../wje-element/element.js';
8
8
  * @tag wje-accordion
9
9
  */
10
10
  export default class AccordionItem extends WJElement {
11
+ static _instanceId: number;
11
12
  /**
12
13
  * Getter for the CSS stylesheet.
13
14
  * @returns {object} The styles for the Accordion Item element.
@@ -18,6 +19,7 @@ export default class AccordionItem extends WJElement {
18
19
  * @returns {Array} An array containing the name of the observed attribute.
19
20
  */
20
21
  static get observedAttributes(): any[];
22
+ _instanceId: number;
21
23
  /**
22
24
  * Method to draw the Accordion Item element. This method returns a document fragment containing the drawn element.
23
25
  * @returns {object} The document fragment containing the drawn element.
@@ -25,6 +27,7 @@ export default class AccordionItem extends WJElement {
25
27
  draw(): object;
26
28
  headline: HTMLDivElement;
27
29
  toggle: HTMLSlotElement;
30
+ content: HTMLDivElement;
28
31
  /**
29
32
  * Method to execute after the Accordion Item element is drawn.
30
33
  */
@@ -63,11 +63,16 @@ export default class Avatar extends WJElement {
63
63
  * @returns {string} The size value of the element or 'medium' if not specified.
64
64
  */
65
65
  get size(): string;
66
+ attributeChangedCallback(name: any, oldValue: any, newValue: any): void;
66
67
  /**
67
68
  * Method to draw the avatar element and return a document fragment.
68
69
  * @returns {object} fragment - The document fragment
69
70
  */
70
71
  draw(): object;
72
+ /**
73
+ * Syncs ARIA attributes on the host element.
74
+ */
75
+ syncAria(): void;
71
76
  /**
72
77
  * Method to check if the avatar is an image.
73
78
  * @returns {boolean} - True if the avatar is an image, false otherwise
@@ -59,6 +59,7 @@ export default class Breadcrumb extends WJElement {
59
59
  */
60
60
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): boolean;
61
61
  active: boolean;
62
+ syncAria(): void;
62
63
  /**
63
64
  * Draw method for the Breadcrumb element.
64
65
  * @returns {object} fragment - The document fragment
@@ -40,7 +40,6 @@ export default class Button extends WJElement {
40
40
  * @type {boolean}
41
41
  */
42
42
  static formAssociated: boolean;
43
- internals_: ElementInternals;
44
43
  /**
45
44
  * Dependencies of the Button element.
46
45
  * @type {object}
@@ -166,6 +165,7 @@ export default class Button extends WJElement {
166
165
  * @returns {object} An object containing key-value pairs of custom event parameters.
167
166
  */
168
167
  get customEventParameters(): object;
168
+ attributeChangedCallback(name: any, oldValue: any, newValue: any): void;
169
169
  /**
170
170
  * @summary Callback function that is called when the custom element is associated with a form.
171
171
  * This function sets the internal `_form` property to the associated form.
@@ -200,5 +200,9 @@ export default class Button extends WJElement {
200
200
  * Toggle states method for the Button element.
201
201
  */
202
202
  toggleStates: () => void;
203
+ /**
204
+ * Syncs ARIA attributes on the host element.
205
+ */
206
+ syncAria(): void;
203
207
  #private;
204
208
  }
@@ -73,6 +73,10 @@ export default class ButtonGroup extends WJElement {
73
73
  * After draw method for the ButtonGroup element.
74
74
  */
75
75
  afterDraw(): void;
76
+ /**
77
+ * Sync ARIA attributes on host.
78
+ */
79
+ syncAria(): void;
76
80
  /**
77
81
  * Find button method to find the button element.
78
82
  * @param {object} el The element