igniteui-webcomponents 7.3.0-beta.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/animations/player.d.ts +7 -2
  3. package/animations/player.js +1 -2
  4. package/animations/player.js.map +1 -1
  5. package/components/accordion/accordion.js +4 -16
  6. package/components/accordion/accordion.js.map +1 -1
  7. package/components/avatar/avatar.d.ts +0 -1
  8. package/components/avatar/avatar.js +5 -9
  9. package/components/avatar/avatar.js.map +1 -1
  10. package/components/badge/badge.d.ts +1 -3
  11. package/components/badge/badge.js +4 -8
  12. package/components/badge/badge.js.map +1 -1
  13. package/components/banner/banner.d.ts +6 -5
  14. package/components/banner/banner.js +19 -17
  15. package/components/banner/banner.js.map +1 -1
  16. package/components/button/button-base.d.ts +1 -1
  17. package/components/button/button-base.js.map +1 -1
  18. package/components/button-group/button-group.d.ts +0 -1
  19. package/components/button-group/button-group.js +12 -17
  20. package/components/button-group/button-group.js.map +1 -1
  21. package/components/calendar/base.d.ts +3 -13
  22. package/components/calendar/base.js +10 -31
  23. package/components/calendar/base.js.map +1 -1
  24. package/components/calendar/calendar.d.ts +2 -2
  25. package/components/calendar/months-view/months-view.d.ts +1 -1
  26. package/components/calendar/months-view/months-view.js.map +1 -1
  27. package/components/carousel/carousel-indicator.d.ts +1 -1
  28. package/components/carousel/carousel-indicator.js +13 -13
  29. package/components/carousel/carousel-indicator.js.map +1 -1
  30. package/components/carousel/carousel-slide.d.ts +0 -2
  31. package/components/carousel/carousel-slide.js +7 -9
  32. package/components/carousel/carousel-slide.js.map +1 -1
  33. package/components/carousel/carousel.d.ts +52 -35
  34. package/components/carousel/carousel.js +136 -122
  35. package/components/carousel/carousel.js.map +1 -1
  36. package/components/carousel/themes/carousel.base.css.js +1 -1
  37. package/components/carousel/themes/carousel.base.css.js.map +1 -1
  38. package/components/chat/chat-input.d.ts +1 -1
  39. package/components/chat/chat-input.js +21 -21
  40. package/components/chat/chat-input.js.map +1 -1
  41. package/components/chat/chat.d.ts +0 -2
  42. package/components/chat/chat.js +6 -12
  43. package/components/chat/chat.js.map +1 -1
  44. package/components/checkbox/checkbox-base.d.ts +1 -1
  45. package/components/checkbox/checkbox.d.ts +3 -5
  46. package/components/checkbox/checkbox.js +33 -44
  47. package/components/checkbox/checkbox.js.map +1 -1
  48. package/components/checkbox/switch.d.ts +1 -1
  49. package/components/checkbox/switch.js +23 -34
  50. package/components/checkbox/switch.js.map +1 -1
  51. package/components/chip/chip.d.ts +1 -14
  52. package/components/chip/chip.js +12 -33
  53. package/components/chip/chip.js.map +1 -1
  54. package/components/color-picker/color-picker.d.ts +261 -0
  55. package/components/color-picker/color-picker.js +620 -0
  56. package/components/color-picker/color-picker.js.map +1 -0
  57. package/components/color-picker/common.d.ts +37 -0
  58. package/components/color-picker/common.js +55 -0
  59. package/components/color-picker/common.js.map +1 -0
  60. package/components/color-picker/converters.d.ts +18 -0
  61. package/components/color-picker/converters.js +173 -0
  62. package/components/color-picker/converters.js.map +1 -0
  63. package/components/color-picker/model.d.ts +120 -0
  64. package/components/color-picker/model.js +174 -0
  65. package/components/color-picker/model.js.map +1 -0
  66. package/components/color-picker/picker-canvas.d.ts +95 -0
  67. package/components/color-picker/picker-canvas.js +154 -0
  68. package/components/color-picker/picker-canvas.js.map +1 -0
  69. package/components/color-picker/themes/color-picker.base.css.d.ts +1 -0
  70. package/components/color-picker/themes/color-picker.base.css.js +3 -0
  71. package/components/color-picker/themes/color-picker.base.css.js.map +1 -0
  72. package/components/color-picker/themes/dark/color-picker.bootstrap.css.d.ts +1 -0
  73. package/components/color-picker/themes/dark/color-picker.bootstrap.css.js +3 -0
  74. package/components/color-picker/themes/dark/color-picker.bootstrap.css.js.map +1 -0
  75. package/components/color-picker/themes/dark/color-picker.fluent.css.d.ts +1 -0
  76. package/components/color-picker/themes/dark/color-picker.fluent.css.js +3 -0
  77. package/components/color-picker/themes/dark/color-picker.fluent.css.js.map +1 -0
  78. package/components/color-picker/themes/dark/color-picker.indigo.css.d.ts +1 -0
  79. package/components/color-picker/themes/dark/color-picker.indigo.css.js +3 -0
  80. package/components/color-picker/themes/dark/color-picker.indigo.css.js.map +1 -0
  81. package/components/color-picker/themes/dark/color-picker.material.css.d.ts +1 -0
  82. package/components/color-picker/themes/dark/color-picker.material.css.js +3 -0
  83. package/components/color-picker/themes/dark/color-picker.material.css.js.map +1 -0
  84. package/components/color-picker/themes/light/color-picker.bootstrap.css.d.ts +1 -0
  85. package/components/color-picker/themes/light/color-picker.bootstrap.css.js +3 -0
  86. package/components/color-picker/themes/light/color-picker.bootstrap.css.js.map +1 -0
  87. package/components/color-picker/themes/light/color-picker.fluent.css.d.ts +1 -0
  88. package/components/color-picker/themes/light/color-picker.fluent.css.js +3 -0
  89. package/components/color-picker/themes/light/color-picker.fluent.css.js.map +1 -0
  90. package/components/color-picker/themes/light/color-picker.indigo.css.d.ts +1 -0
  91. package/components/color-picker/themes/light/color-picker.indigo.css.js +3 -0
  92. package/components/color-picker/themes/light/color-picker.indigo.css.js.map +1 -0
  93. package/components/color-picker/themes/light/color-picker.material.css.d.ts +1 -0
  94. package/components/color-picker/themes/light/color-picker.material.css.js +3 -0
  95. package/components/color-picker/themes/light/color-picker.material.css.js.map +1 -0
  96. package/components/color-picker/themes/light/color-picker.shared.css.d.ts +1 -0
  97. package/components/color-picker/themes/light/color-picker.shared.css.js +3 -0
  98. package/components/color-picker/themes/light/color-picker.shared.css.js.map +1 -0
  99. package/components/color-picker/themes/picker-canvas.base.css.d.ts +1 -0
  100. package/components/color-picker/themes/picker-canvas.base.css.js +3 -0
  101. package/components/color-picker/themes/picker-canvas.base.css.js.map +1 -0
  102. package/components/color-picker/themes/shared/color-picker.bootstrap.css.d.ts +1 -0
  103. package/components/color-picker/themes/shared/color-picker.bootstrap.css.js +3 -0
  104. package/components/color-picker/themes/shared/color-picker.bootstrap.css.js.map +1 -0
  105. package/components/color-picker/themes/shared/color-picker.common.css.d.ts +1 -0
  106. package/components/color-picker/themes/shared/color-picker.common.css.js +3 -0
  107. package/components/color-picker/themes/shared/color-picker.common.css.js.map +1 -0
  108. package/components/color-picker/themes/shared/color-picker.fluent.css.d.ts +1 -0
  109. package/components/color-picker/themes/shared/color-picker.fluent.css.js +3 -0
  110. package/components/color-picker/themes/shared/color-picker.fluent.css.js.map +1 -0
  111. package/components/color-picker/themes/shared/color-picker.indigo.css.d.ts +1 -0
  112. package/components/color-picker/themes/shared/color-picker.indigo.css.js +3 -0
  113. package/components/color-picker/themes/shared/color-picker.indigo.css.js.map +1 -0
  114. package/components/color-picker/themes/shared/color-picker.material.css.d.ts +1 -0
  115. package/components/color-picker/themes/shared/color-picker.material.css.js +3 -0
  116. package/components/color-picker/themes/shared/color-picker.material.css.js.map +1 -0
  117. package/components/color-picker/themes/themes.d.ts +2 -0
  118. package/components/color-picker/themes/themes.js +50 -0
  119. package/components/color-picker/themes/themes.js.map +1 -0
  120. package/components/color-picker/validators.d.ts +3 -0
  121. package/components/color-picker/validators.js +5 -0
  122. package/components/color-picker/validators.js.map +1 -0
  123. package/components/combo/combo-item.d.ts +1 -3
  124. package/components/combo/combo-item.js +5 -12
  125. package/components/combo/combo-item.js.map +1 -1
  126. package/components/combo/combo.d.ts +7 -20
  127. package/components/combo/combo.js +59 -81
  128. package/components/combo/combo.js.map +1 -1
  129. package/components/date-picker/date-picker.base.d.ts +12 -9
  130. package/components/date-picker/date-picker.base.js +24 -31
  131. package/components/date-picker/date-picker.base.js.map +1 -1
  132. package/components/date-picker/date-picker.d.ts +1 -1
  133. package/components/date-picker/date-picker.js +3 -5
  134. package/components/date-picker/date-picker.js.map +1 -1
  135. package/components/date-range-picker/date-range-input.d.ts +2 -4
  136. package/components/date-range-picker/date-range-input.js +6 -37
  137. package/components/date-range-picker/date-range-input.js.map +1 -1
  138. package/components/date-range-picker/date-range-picker.d.ts +2 -5
  139. package/components/date-range-picker/date-range-picker.js +15 -28
  140. package/components/date-range-picker/date-range-picker.js.map +1 -1
  141. package/components/date-range-picker/predefined-ranges-area.d.ts +2 -2
  142. package/components/date-range-picker/predefined-ranges-area.js +4 -6
  143. package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
  144. package/components/date-range-picker/validators.d.ts +1 -1
  145. package/components/date-range-picker/validators.js +5 -18
  146. package/components/date-range-picker/validators.js.map +1 -1
  147. package/components/date-time-input/date-part.d.ts +2 -1
  148. package/components/date-time-input/date-part.js +38 -75
  149. package/components/date-time-input/date-part.js.map +1 -1
  150. package/components/date-time-input/date-time-input.base.d.ts +31 -12
  151. package/components/date-time-input/date-time-input.base.js +43 -11
  152. package/components/date-time-input/date-time-input.base.js.map +1 -1
  153. package/components/date-time-input/date-time-input.d.ts +1 -3
  154. package/components/date-time-input/date-time-input.js +7 -40
  155. package/components/date-time-input/date-time-input.js.map +1 -1
  156. package/components/date-time-input/datetime-mask-parser.d.ts +8 -0
  157. package/components/date-time-input/datetime-mask-parser.js +8 -8
  158. package/components/date-time-input/datetime-mask-parser.js.map +1 -1
  159. package/components/date-time-input/validators.js +3 -14
  160. package/components/date-time-input/validators.js.map +1 -1
  161. package/components/dialog/dialog.d.ts +6 -7
  162. package/components/dialog/dialog.js +21 -26
  163. package/components/dialog/dialog.js.map +1 -1
  164. package/components/divider/divider.d.ts +1 -4
  165. package/components/divider/divider.js +8 -17
  166. package/components/divider/divider.js.map +1 -1
  167. package/components/dropdown/dropdown-group.js +1 -6
  168. package/components/dropdown/dropdown-group.js.map +1 -1
  169. package/components/expansion-panel/expansion-panel.d.ts +15 -5
  170. package/components/expansion-panel/expansion-panel.js +23 -34
  171. package/components/expansion-panel/expansion-panel.js.map +1 -1
  172. package/components/file-input/file-input.d.ts +2 -14
  173. package/components/file-input/file-input.js +5 -23
  174. package/components/file-input/file-input.js.map +1 -1
  175. package/components/highlight/highlight.d.ts +6 -8
  176. package/components/highlight/highlight.js +12 -20
  177. package/components/highlight/highlight.js.map +1 -1
  178. package/components/icon/icon-references.js +1 -0
  179. package/components/icon/icon-references.js.map +1 -1
  180. package/components/icon/icon.d.ts +1 -1
  181. package/components/icon/internal-icons-lib.js +3 -0
  182. package/components/icon/internal-icons-lib.js.map +1 -1
  183. package/components/icon/registry/types.d.ts +1 -1
  184. package/components/icon/registry/types.js.map +1 -1
  185. package/components/input/input.d.ts +9 -19
  186. package/components/input/input.js +30 -60
  187. package/components/input/input.js.map +1 -1
  188. package/components/input/themes/shared/input.material.css.js +1 -1
  189. package/components/input/themes/shared/input.material.css.js.map +1 -1
  190. package/components/mask-input/mask-input.d.ts +1 -1
  191. package/components/mask-input/mask-input.js +2 -4
  192. package/components/mask-input/mask-input.js.map +1 -1
  193. package/components/nav-drawer/nav-drawer.d.ts +7 -7
  194. package/components/nav-drawer/nav-drawer.js +12 -23
  195. package/components/nav-drawer/nav-drawer.js.map +1 -1
  196. package/components/progress/base.d.ts +4 -7
  197. package/components/progress/base.js +21 -45
  198. package/components/progress/base.js.map +1 -1
  199. package/components/qr-code/qr-code.d.ts +1 -1
  200. package/components/qr-code/qr-code.js +3 -2
  201. package/components/qr-code/qr-code.js.map +1 -1
  202. package/components/qr-code/types.d.ts +1 -1
  203. package/components/qr-code/types.js.map +1 -1
  204. package/components/radio/controller.d.ts +2 -30
  205. package/components/radio/controller.js +8 -94
  206. package/components/radio/controller.js.map +1 -1
  207. package/components/radio/radio.d.ts +5 -5
  208. package/components/radio/radio.js +48 -58
  209. package/components/radio/radio.js.map +1 -1
  210. package/components/radio-group/radio-group.d.ts +1 -2
  211. package/components/radio-group/radio-group.js +2 -9
  212. package/components/radio-group/radio-group.js.map +1 -1
  213. package/components/rating/rating.d.ts +24 -12
  214. package/components/rating/rating.js +79 -73
  215. package/components/rating/rating.js.map +1 -1
  216. package/components/resize-container/default-ghost.js +4 -3
  217. package/components/resize-container/default-ghost.js.map +1 -1
  218. package/components/resize-container/resize-container.d.ts +1 -1
  219. package/components/resize-container/resize-container.js +5 -3
  220. package/components/resize-container/resize-container.js.map +1 -1
  221. package/components/resize-container/resize-controller.js +4 -3
  222. package/components/resize-container/resize-controller.js.map +1 -1
  223. package/components/select/select-group.d.ts +2 -1
  224. package/components/select/select-group.js +7 -11
  225. package/components/select/select-group.js.map +1 -1
  226. package/components/select/select.d.ts +3 -4
  227. package/components/select/select.js +23 -28
  228. package/components/select/select.js.map +1 -1
  229. package/components/slider/range-slider.d.ts +3 -2
  230. package/components/slider/range-slider.js +22 -70
  231. package/components/slider/range-slider.js.map +1 -1
  232. package/components/slider/slider-base.d.ts +9 -6
  233. package/components/slider/slider-base.js +27 -28
  234. package/components/slider/slider-base.js.map +1 -1
  235. package/components/slider/slider.js +9 -5
  236. package/components/slider/slider.js.map +1 -1
  237. package/components/splitter/splitter.d.ts +1 -1
  238. package/components/splitter/splitter.js.map +1 -1
  239. package/components/stepper/step.d.ts +3 -0
  240. package/components/stepper/step.js +9 -5
  241. package/components/stepper/step.js.map +1 -1
  242. package/components/stepper/stepper.d.ts +0 -11
  243. package/components/stepper/stepper.js +21 -86
  244. package/components/stepper/stepper.js.map +1 -1
  245. package/components/tabs/tab.d.ts +1 -1
  246. package/components/tabs/tab.js +6 -5
  247. package/components/tabs/tab.js.map +1 -1
  248. package/components/tabs/tabs.d.ts +1 -5
  249. package/components/tabs/tabs.js +12 -34
  250. package/components/tabs/tabs.js.map +1 -1
  251. package/components/textarea/textarea.d.ts +6 -7
  252. package/components/textarea/textarea.js +3 -10
  253. package/components/textarea/textarea.js.map +1 -1
  254. package/components/theme-provider/theme-provider.d.ts +2 -4
  255. package/components/theme-provider/theme-provider.js +11 -21
  256. package/components/theme-provider/theme-provider.js.map +1 -1
  257. package/components/tile-manager/tile-manager.d.ts +10 -21
  258. package/components/tile-manager/tile-manager.js +43 -74
  259. package/components/tile-manager/tile-manager.js.map +1 -1
  260. package/components/tile-manager/tile.d.ts +10 -18
  261. package/components/tile-manager/tile.js +50 -67
  262. package/components/tile-manager/tile.js.map +1 -1
  263. package/components/tooltip/tooltip.d.ts +4 -7
  264. package/components/tooltip/tooltip.js +20 -28
  265. package/components/tooltip/tooltip.js.map +1 -1
  266. package/components/tree/tree.d.ts +1 -14
  267. package/components/tree/tree.js +5 -23
  268. package/components/tree/tree.js.map +1 -1
  269. package/components/tree/tree.navigation.d.ts +1 -1
  270. package/components/tree/tree.navigation.js.map +1 -1
  271. package/components/types.d.ts +2 -0
  272. package/components/types.js.map +1 -1
  273. package/components/validation-container/validation-container.d.ts +1 -2
  274. package/components/validation-container/validation-container.js.map +1 -1
  275. package/components/virtualization/engine.d.ts +40 -38
  276. package/components/virtualization/engine.js.map +1 -1
  277. package/components/virtualization/types.d.ts +6 -5
  278. package/components/virtualization/types.js.map +1 -1
  279. package/components/virtualization/virtualization.d.ts +94 -80
  280. package/components/virtualization/virtualization.js +10 -2
  281. package/components/virtualization/virtualization.js.map +1 -1
  282. package/custom-elements.json +31948 -26708
  283. package/igniteui-webcomponents.css-data.json +1 -1
  284. package/igniteui-webcomponents.html-data.json +1 -1
  285. package/index.d.ts +1 -0
  286. package/index.js +1 -0
  287. package/index.js.map +1 -1
  288. package/internals/controllers/aria-projection.d.ts +6 -6
  289. package/internals/controllers/aria-projection.js.map +1 -1
  290. package/internals/controllers/context-provider.d.ts +48 -0
  291. package/internals/controllers/context-provider.js +29 -0
  292. package/internals/controllers/context-provider.js.map +1 -0
  293. package/internals/controllers/drag.js +6 -6
  294. package/internals/controllers/drag.js.map +1 -1
  295. package/internals/controllers/gestures.js +3 -0
  296. package/internals/controllers/gestures.js.map +1 -1
  297. package/internals/controllers/group.d.ts +64 -0
  298. package/internals/controllers/group.js +104 -0
  299. package/internals/controllers/group.js.map +1 -0
  300. package/internals/controllers/internals.d.ts +16 -3
  301. package/internals/controllers/internals.js +10 -3
  302. package/internals/controllers/internals.js.map +1 -1
  303. package/internals/controllers/key-bindings.d.ts +6 -0
  304. package/internals/controllers/key-bindings.js +3 -0
  305. package/internals/controllers/key-bindings.js.map +1 -1
  306. package/internals/controllers/roving-focus.d.ts +72 -0
  307. package/internals/controllers/roving-focus.js +61 -0
  308. package/internals/controllers/roving-focus.js.map +1 -0
  309. package/internals/controllers/slot.d.ts +8 -0
  310. package/internals/controllers/slot.js +4 -0
  311. package/internals/controllers/slot.js.map +1 -1
  312. package/internals/controllers/toggle.d.ts +96 -0
  313. package/internals/controllers/toggle.js +65 -0
  314. package/internals/controllers/toggle.js.map +1 -0
  315. package/internals/date/converters.js +2 -5
  316. package/internals/date/converters.js.map +1 -1
  317. package/internals/date/model.d.ts +4 -0
  318. package/internals/date/model.js +6 -0
  319. package/internals/date/model.js.map +1 -1
  320. package/internals/decorators/coerced-property.d.ts +47 -0
  321. package/internals/decorators/coerced-property.js +36 -0
  322. package/internals/decorators/coerced-property.js.map +1 -0
  323. package/internals/definitions/defineAllComponents.js +2 -0
  324. package/internals/definitions/defineAllComponents.js.map +1 -1
  325. package/internals/i18n/i18n-controller.d.ts +22 -3
  326. package/internals/i18n/i18n-controller.js +28 -6
  327. package/internals/i18n/i18n-controller.js.map +1 -1
  328. package/internals/mixins/alert.d.ts +1 -1
  329. package/internals/mixins/alert.js +5 -3
  330. package/internals/mixins/alert.js.map +1 -1
  331. package/internals/mixins/combo-box.d.ts +3 -12
  332. package/internals/mixins/combo-box.js +6 -32
  333. package/internals/mixins/combo-box.js.map +1 -1
  334. package/internals/mixins/forms/associated.js +18 -0
  335. package/internals/mixins/forms/associated.js.map +1 -1
  336. package/internals/mixins/forms/types.d.ts +20 -1
  337. package/internals/mixins/forms/types.js.map +1 -1
  338. package/internals/mixins/i18n.d.ts +31 -0
  339. package/internals/mixins/i18n.js +36 -0
  340. package/internals/mixins/i18n.js.map +1 -0
  341. package/internals/mixins/mask-behavior.d.ts +6 -5
  342. package/internals/mixins/mask-behavior.js +1 -2
  343. package/internals/mixins/mask-behavior.js.map +1 -1
  344. package/internals/mixins/option.js +4 -2
  345. package/internals/mixins/option.js.map +1 -1
  346. package/internals/templates/masked-input.d.ts +1 -1
  347. package/internals/templates/masked-input.js.map +1 -1
  348. package/internals/templates/slotted-icon.d.ts +32 -0
  349. package/internals/templates/slotted-icon.js +19 -0
  350. package/internals/templates/slotted-icon.js.map +1 -0
  351. package/internals/templates/toggle-shell.d.ts +46 -0
  352. package/internals/templates/toggle-shell.js +38 -0
  353. package/internals/templates/toggle-shell.js.map +1 -0
  354. package/internals/timing.d.ts +32 -0
  355. package/internals/timing.js +20 -0
  356. package/internals/timing.js.map +1 -0
  357. package/internals/utils/arrays.d.ts +2 -2
  358. package/internals/utils/arrays.js.map +1 -1
  359. package/internals/utils/dom.d.ts +22 -0
  360. package/internals/utils/dom.js +15 -1
  361. package/internals/utils/dom.js.map +1 -1
  362. package/internals/utils/math.d.ts +1 -1
  363. package/internals/utils/math.js.map +1 -1
  364. package/internals/utils/types.d.ts +1 -1
  365. package/internals/utils/types.js.map +1 -1
  366. package/internals/validators.d.ts +23 -0
  367. package/internals/validators.js +21 -0
  368. package/internals/validators.js.map +1 -1
  369. package/package.json +3 -1
  370. package/theming/theming-controller.d.ts +3 -3
  371. package/theming/theming-controller.js.map +1 -1
  372. package/web-types.json +2 -2
  373. package/internals/decorators/watch.d.ts +0 -5
  374. package/internals/decorators/watch.js +0 -19
  375. package/internals/decorators/watch.js.map +0 -1
@@ -11,6 +11,7 @@ import { ifDefined } from 'lit/directives/if-defined.js';
11
11
  import { createRef, ref } from 'lit/directives/ref.js';
12
12
  import { addCommandController } from '#internals/controllers/command.js';
13
13
  import { addSlotController, setSlots } from '#internals/controllers/slot.js';
14
+ import { addToggleController } from '#internals/controllers/toggle.js';
14
15
  import { registerComponent } from '#internals/definitions/register.js';
15
16
  import { EventEmitterMixin } from '#internals/mixins/event-emitter.js';
16
17
  import { partMap } from '#internals/part-map.js';
@@ -44,6 +45,13 @@ export default class IgcNavDrawerComponent extends EventEmitterMixin(LitElement)
44
45
  super();
45
46
  this._dialogRef = createRef();
46
47
  this._miniRef = createRef();
48
+ this._toggleController = addToggleController(this, {
49
+ transition: async (open) => {
50
+ this.open = open;
51
+ await this.updateComplete;
52
+ return true;
53
+ },
54
+ });
47
55
  this._slots = addSlotController(this, {
48
56
  slots: setSlots('mini'),
49
57
  onChange: this._handleMiniState,
@@ -113,36 +121,17 @@ export default class IgcNavDrawerComponent extends EventEmitterMixin(LitElement)
113
121
  this._closeWithEvent();
114
122
  }
115
123
  }
116
- _emitClosing() {
117
- return this.emitEvent('igcClosing', { cancelable: true });
118
- }
119
124
  async _closeWithEvent() {
120
- if (!(this.open && this._emitClosing())) {
121
- return false;
122
- }
123
- this.open = false;
124
- await this.updateComplete;
125
- this.emitEvent('igcClosed');
126
- return true;
125
+ return this._toggleController.hide(true);
127
126
  }
128
127
  async show() {
129
- if (this.open) {
130
- return false;
131
- }
132
- this.open = true;
133
- await this.updateComplete;
134
- return true;
128
+ return this._toggleController.show();
135
129
  }
136
130
  async hide() {
137
- if (!this.open) {
138
- return false;
139
- }
140
- this.open = false;
141
- await this.updateComplete;
142
- return true;
131
+ return this._toggleController.hide();
143
132
  }
144
133
  toggle() {
145
- return this.open ? this.hide() : this.show();
134
+ return this._toggleController.toggle();
146
135
  }
147
136
  _renderMiniVariant() {
148
137
  return html `
@@ -1 +1 @@
1
- {"version":3,"file":"nav-drawer.js","sourceRoot":"","sources":["../../../src/components/nav-drawer/nav-drawer.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { addCommandController } from '#internals/controllers/command.js';\nimport { addSlotController, setSlots } from '#internals/controllers/slot.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport type { Constructor } from '#internals/mixins/constructor.js';\nimport { EventEmitterMixin } from '#internals/mixins/event-emitter.js';\nimport { partMap } from '#internals/part-map.js';\nimport { isPointInsideElement, isPopoverOpen } from '#internals/utils/dom.js';\nimport { bindIf } from '#internals/utils/lit.js';\nimport { addThemingController } from '#theming/theming-controller.js';\nimport type { NavDrawerPosition } from '../types.js';\nimport IgcNavDrawerHeaderItemComponent from './nav-drawer-header-item.js';\nimport IgcNavDrawerItemComponent from './nav-drawer-item.js';\nimport { styles } from './themes/container.base.css.js';\nimport { all } from './themes/container.js';\nimport { styles as shared } from './themes/shared/container/nav-drawer.common.css.js';\n\nexport interface IgcNavDrawerComponentEventMap {\n igcClosing: CustomEvent<void>;\n igcClosed: CustomEvent<void>;\n}\n\n/**\n * A side navigation container that provides\n * quick access between views within an application.\n *\n * For non-relative positions (`start`, `end`, `top`, `bottom`) the drawer is\n * rendered as a native `<dialog>` element, providing modal semantics, automatic\n * focus trapping, and a backdrop. For the `relative` position it is rendered\n * inline as a `<nav>` landmark.\n *\n * When content is provided in the `mini` slot, a compact icon-only variant is\n * always displayed alongside the main drawer (hidden only while the full drawer\n * is open).\n *\n * The component integrates with the\n * [Invoker Commands API](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API):\n * an Ignite button or a native `<button>` with `command=\"--show\"` / `\"--hide\"` / `\"--toggle\"`\n * and `commandfor` pointing to this element will call the corresponding method\n * declaratively without any JavaScript.\n *\n * @element igc-nav-drawer\n *\n * @fires igcClosing - Emitted just before the drawer is closed by a user interaction. Cancelable —\n * call `event.preventDefault()` to abort the closing sequence.\n * @fires igcClosed - Emitted just after the drawer is closed by a user interaction.\n *\n * @slot - Renders the main navigation content of the drawer.\n * @slot mini - Renders the compact mini variant of the drawer.\n *\n * @csspart base - The base wrapper of the drawer.\n * @csspart main - The main content container of the drawer.\n * @csspart mini - The mini variant container of the drawer.\n */\nexport default class IgcNavDrawerComponent extends EventEmitterMixin<\n IgcNavDrawerComponentEventMap,\n Constructor<LitElement>\n>(LitElement) {\n public static readonly tagName = 'igc-nav-drawer';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcNavDrawerComponent,\n IgcNavDrawerHeaderItemComponent,\n IgcNavDrawerItemComponent\n );\n }\n\n //#region Internal state\n\n private readonly _dialogRef = createRef<HTMLDialogElement>();\n private readonly _miniRef = createRef<HTMLElement>();\n\n private readonly _slots = addSlotController(this, {\n slots: setSlots('mini'),\n onChange: this._handleMiniState,\n });\n\n private get _dialog(): HTMLDialogElement | undefined {\n return this._dialogRef.value;\n }\n\n private get _mini(): HTMLElement | undefined {\n return this._miniRef.value;\n }\n\n private get _hasMiniContent(): boolean {\n return this._slots.hasAssignedElements('mini');\n }\n\n private get _isRelative(): boolean {\n return this.position === 'relative';\n }\n\n //#endregion\n\n //#region Public properties\n\n /**\n * Sets the position of the drawer.\n *\n * - `start` — anchored to the inline-start edge (default).\n * - `end` — anchored to the inline-end edge.\n * - `top` — anchored to the block-start edge.\n * - `bottom` — anchored to the block-end edge.\n * - `relative` — rendered inline within the page flow; no modal backdrop.\n *\n * @attr position\n * @default 'start'\n */\n @property({ reflect: true })\n public position: NavDrawerPosition = 'start';\n\n /**\n * Whether the drawer is open.\n *\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Determines whether the drawer should remain open when the Escape key is pressed.\n *\n * This is only applicable when the drawer is in a non-relative position,\n * as the Escape key does not trigger the closing of relative drawers.\n *\n * @attr keep-open-on-escape\n * @default false\n */\n @property({ type: Boolean, attribute: 'keep-open-on-escape' })\n public keepOpenOnEscape = false;\n\n /**\n * Sets an accessible label for the drawer.\n *\n * In non-relative positions this label is applied to the modal `<dialog>` element.\n * In `relative` position it labels the `<nav>` landmark.\n *\n * When multiple navigation landmarks exist on the page each should receive a\n * distinct label so screen-reader users can differentiate between them.\n *\n * @attr label\n */\n @property()\n public label?: string;\n\n //#endregion\n\n //#region Lit Lifecycle\n\n constructor() {\n super();\n\n addThemingController(this, all);\n addCommandController(this)\n .set('--show', this.show)\n .set('--hide', this.hide)\n .set('--toggle', this.toggle);\n }\n\n protected override update(properties: PropertyValues<this>): void {\n if (properties.has('position') && this._isRelative) {\n this._dialog?.close();\n if (isPopoverOpen(this._mini)) {\n this._mini?.hidePopover();\n }\n }\n\n super.update(properties);\n }\n\n protected override updated(properties: PropertyValues<this>): void {\n if (properties.has('open') || properties.has('position')) {\n this._handleOpenState();\n this._handleMiniState();\n }\n }\n\n //#endregion\n\n //#region Event handlers\n\n private _handleOpenState(): void {\n if (this._isRelative) {\n return;\n }\n\n this.open ? this._dialog?.showModal() : this._dialog?.close();\n }\n\n private _handleMiniState(): void {\n if (this._isRelative) {\n return;\n }\n\n const mini = this._mini;\n if (!mini) {\n return;\n }\n\n const popOverOpen = isPopoverOpen(mini);\n\n if (!this._hasMiniContent || this.open) {\n if (popOverOpen) {\n mini.hidePopover();\n }\n } else if (!popOverOpen) {\n mini.showPopover();\n }\n }\n\n private _handleCancel(event: Event): void {\n event.preventDefault();\n\n if (!this.keepOpenOnEscape) {\n this._closeWithEvent();\n }\n }\n\n private _handleClose(): void {\n if (this.open) {\n this._dialog?.showModal();\n }\n }\n\n private _handleClick({ clientX, clientY, target }: PointerEvent): void {\n if (\n this._dialog === target &&\n !isPointInsideElement(this._dialog, clientX, clientY)\n ) {\n this._closeWithEvent();\n }\n }\n\n //#endregion\n\n //#region Internal API\n\n private _emitClosing(): boolean {\n return this.emitEvent('igcClosing', { cancelable: true });\n }\n\n private async _closeWithEvent(): Promise<boolean> {\n if (!(this.open && this._emitClosing())) {\n return false;\n }\n\n this.open = false;\n await this.updateComplete;\n\n this.emitEvent('igcClosed');\n return true;\n }\n\n //#endregion\n\n //#region Public API\n\n /** Opens the drawer. Returns `true` if the operation was successful, `false` if the drawer was already open. */\n public async show(): Promise<boolean> {\n if (this.open) {\n return false;\n }\n\n this.open = true;\n await this.updateComplete;\n\n return true;\n }\n\n /** Closes the drawer. Returns `true` if the operation was successful, `false` if the drawer was already closed. */\n public async hide(): Promise<boolean> {\n if (!this.open) {\n return false;\n }\n\n this.open = false;\n await this.updateComplete;\n\n return true;\n }\n\n /** Toggles the open state of the drawer. Delegates to `show()` or `hide()` depending on the current state. */\n public toggle(): Promise<boolean> {\n return this.open ? this.hide() : this.show();\n }\n\n //#endregion\n\n private _renderMiniVariant() {\n return html`\n <nav\n ${ref(this._miniRef)}\n aria-label=${ifDefined(this.label)}\n part=${partMap({\n mini: true,\n hidden: !this._hasMiniContent,\n })}\n .inert=${this.open || !this._hasMiniContent}\n .popover=${!this._isRelative ? 'manual' : null}\n >\n <slot name=\"mini\"></slot>\n </nav>\n `;\n }\n\n private _renderContent() {\n return html`\n <div part=\"main\">\n <slot></slot>\n </div>\n `;\n }\n\n private _renderDialog() {\n return html`\n <dialog\n ${ref(this._dialogRef)}\n part=\"base\"\n aria-modal=\"true\"\n aria-label=${ifDefined(this.label)}\n @click=${this._handleClick}\n @cancel=${this._handleCancel}\n @close=${bindIf(this.keepOpenOnEscape, this._handleClose)}\n >\n ${this._renderContent()}\n </dialog>\n ${this._renderMiniVariant()}\n `;\n }\n\n private _renderRelative() {\n return html`\n <nav part=\"base\" aria-label=${ifDefined(this.label)} .inert=${!this.open}>\n ${this._renderContent()}\n </nav>\n ${this._renderMiniVariant()}\n `;\n }\n\n protected override render() {\n return html`${cache(\n this._isRelative ? this._renderRelative() : this._renderDialog()\n )}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-nav-drawer': IgcNavDrawerComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"nav-drawer.js","sourceRoot":"","sources":["../../../src/components/nav-drawer/nav-drawer.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { addCommandController } from '#internals/controllers/command.js';\nimport { addSlotController, setSlots } from '#internals/controllers/slot.js';\nimport { addToggleController } from '#internals/controllers/toggle.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport type { Constructor } from '#internals/mixins/constructor.js';\nimport { EventEmitterMixin } from '#internals/mixins/event-emitter.js';\nimport { partMap } from '#internals/part-map.js';\nimport { isPointInsideElement, isPopoverOpen } from '#internals/utils/dom.js';\nimport { bindIf } from '#internals/utils/lit.js';\nimport { addThemingController } from '#theming/theming-controller.js';\nimport type { NavDrawerPosition } from '../types.js';\nimport IgcNavDrawerHeaderItemComponent from './nav-drawer-header-item.js';\nimport IgcNavDrawerItemComponent from './nav-drawer-item.js';\nimport { styles } from './themes/container.base.css.js';\nimport { all } from './themes/container.js';\nimport { styles as shared } from './themes/shared/container/nav-drawer.common.css.js';\n\nexport interface IgcNavDrawerComponentEventMap {\n igcClosing: CustomEvent<void>;\n igcClosed: CustomEvent<void>;\n}\n\n/**\n * A side navigation container that provides\n * quick access between views within an application.\n *\n * For non-relative positions (`start`, `end`, `top`, `bottom`) the drawer is\n * rendered as a native `<dialog>` element, providing modal semantics, automatic\n * focus trapping, and a backdrop. For the `relative` position it is rendered\n * inline as a `<nav>` landmark.\n *\n * When content is provided in the `mini` slot, a compact icon-only variant is\n * always displayed alongside the main drawer (hidden only while the full drawer\n * is open).\n *\n * The component integrates with the\n * [Invoker Commands API](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API):\n * an Ignite button or a native `<button>` with `command=\"--show\"` / `\"--hide\"` / `\"--toggle\"`\n * and `commandfor` pointing to this element will call the corresponding method\n * declaratively without any JavaScript.\n *\n * @element igc-nav-drawer\n *\n * @fires igcClosing - Emitted just before the drawer is closed by a user interaction. Cancelable -\n * call `event.preventDefault()` to abort the closing sequence.\n * @fires igcClosed - Emitted just after the drawer is closed by a user interaction.\n *\n * @slot - Renders the main navigation content of the drawer.\n * @slot mini - Renders the compact mini variant of the drawer.\n *\n * @csspart base - The base wrapper of the drawer.\n * @csspart main - The main content container of the drawer.\n * @csspart mini - The mini variant container of the drawer.\n */\nexport default class IgcNavDrawerComponent extends EventEmitterMixin<\n IgcNavDrawerComponentEventMap,\n Constructor<LitElement>\n>(LitElement) {\n public static readonly tagName = 'igc-nav-drawer';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcNavDrawerComponent,\n IgcNavDrawerHeaderItemComponent,\n IgcNavDrawerItemComponent\n );\n }\n\n //#region Internal state\n\n private readonly _dialogRef = createRef<HTMLDialogElement>();\n private readonly _miniRef = createRef<HTMLElement>();\n\n private readonly _toggleController = addToggleController(this, {\n transition: async (open) => {\n this.open = open;\n await this.updateComplete;\n return true;\n },\n });\n\n private readonly _slots = addSlotController(this, {\n slots: setSlots('mini'),\n onChange: this._handleMiniState,\n });\n\n private get _dialog(): HTMLDialogElement | undefined {\n return this._dialogRef.value;\n }\n\n private get _mini(): HTMLElement | undefined {\n return this._miniRef.value;\n }\n\n private get _hasMiniContent(): boolean {\n return this._slots.hasAssignedElements('mini');\n }\n\n private get _isRelative(): boolean {\n return this.position === 'relative';\n }\n\n //#endregion\n\n //#region Public properties\n\n /**\n * Sets the position of the drawer.\n *\n * - `start` - anchored to the inline-start edge (default).\n * - `end` - anchored to the inline-end edge.\n * - `top` - anchored to the block-start edge.\n * - `bottom` - anchored to the block-end edge.\n * - `relative` - rendered inline within the page flow; no modal backdrop.\n *\n * @attr position\n * @default 'start'\n */\n @property({ reflect: true })\n public position: NavDrawerPosition = 'start';\n\n /**\n * Whether the drawer is open.\n *\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Determines whether the drawer should remain open when the Escape key is pressed.\n *\n * This is only applicable when the drawer is in a non-relative position,\n * as the Escape key does not trigger the closing of relative drawers.\n *\n * @attr keep-open-on-escape\n * @default false\n */\n @property({ type: Boolean, attribute: 'keep-open-on-escape' })\n public keepOpenOnEscape = false;\n\n /**\n * Sets an accessible label for the drawer.\n *\n * In non-relative positions this label is applied to the modal `<dialog>` element.\n * In `relative` position it labels the `<nav>` landmark.\n *\n * When multiple navigation landmarks exist on the page each should receive a\n * distinct label so screen-reader users can differentiate between them.\n *\n * @attr label\n */\n @property()\n public label?: string;\n\n //#endregion\n\n //#region Lit Lifecycle\n\n constructor() {\n super();\n\n addThemingController(this, all);\n addCommandController(this)\n .set('--show', this.show)\n .set('--hide', this.hide)\n .set('--toggle', this.toggle);\n }\n\n protected override update(properties: PropertyValues<this>): void {\n if (properties.has('position') && this._isRelative) {\n this._dialog?.close();\n if (isPopoverOpen(this._mini)) {\n this._mini?.hidePopover();\n }\n }\n\n super.update(properties);\n }\n\n protected override updated(properties: PropertyValues<this>): void {\n if (properties.has('open') || properties.has('position')) {\n this._handleOpenState();\n this._handleMiniState();\n }\n }\n\n //#endregion\n\n //#region Event handlers\n\n private _handleOpenState(): void {\n if (this._isRelative) {\n return;\n }\n\n this.open ? this._dialog?.showModal() : this._dialog?.close();\n }\n\n private _handleMiniState(): void {\n if (this._isRelative) {\n return;\n }\n\n const mini = this._mini;\n if (!mini) {\n return;\n }\n\n const popOverOpen = isPopoverOpen(mini);\n\n if (!this._hasMiniContent || this.open) {\n if (popOverOpen) {\n mini.hidePopover();\n }\n } else if (!popOverOpen) {\n mini.showPopover();\n }\n }\n\n private _handleCancel(event: Event): void {\n event.preventDefault();\n\n if (!this.keepOpenOnEscape) {\n this._closeWithEvent();\n }\n }\n\n private _handleClose(): void {\n if (this.open) {\n this._dialog?.showModal();\n }\n }\n\n private _handleClick({ clientX, clientY, target }: PointerEvent): void {\n if (\n this._dialog === target &&\n !isPointInsideElement(this._dialog, clientX, clientY)\n ) {\n this._closeWithEvent();\n }\n }\n\n //#endregion\n\n //#region Internal API\n\n private async _closeWithEvent(): Promise<boolean> {\n return this._toggleController.hide(true);\n }\n\n //#endregion\n\n //#region Public API\n\n /** Opens the drawer. Returns `true` if the operation was successful, `false` if the drawer was already open. */\n public async show(): Promise<boolean> {\n return this._toggleController.show();\n }\n\n /** Closes the drawer. Returns `true` if the operation was successful, `false` if the drawer was already closed. */\n public async hide(): Promise<boolean> {\n return this._toggleController.hide();\n }\n\n /** Toggles the open state of the drawer. Delegates to `show()` or `hide()` depending on the current state. */\n public toggle(): Promise<boolean> {\n return this._toggleController.toggle();\n }\n\n //#endregion\n\n private _renderMiniVariant() {\n return html`\n <nav\n ${ref(this._miniRef)}\n aria-label=${ifDefined(this.label)}\n part=${partMap({\n mini: true,\n hidden: !this._hasMiniContent,\n })}\n .inert=${this.open || !this._hasMiniContent}\n .popover=${!this._isRelative ? 'manual' : null}\n >\n <slot name=\"mini\"></slot>\n </nav>\n `;\n }\n\n private _renderContent() {\n return html`\n <div part=\"main\">\n <slot></slot>\n </div>\n `;\n }\n\n private _renderDialog() {\n return html`\n <dialog\n ${ref(this._dialogRef)}\n part=\"base\"\n aria-modal=\"true\"\n aria-label=${ifDefined(this.label)}\n @click=${this._handleClick}\n @cancel=${this._handleCancel}\n @close=${bindIf(this.keepOpenOnEscape, this._handleClose)}\n >\n ${this._renderContent()}\n </dialog>\n ${this._renderMiniVariant()}\n `;\n }\n\n private _renderRelative() {\n return html`\n <nav part=\"base\" aria-label=${ifDefined(this.label)} .inert=${!this.open}>\n ${this._renderContent()}\n </nav>\n ${this._renderMiniVariant()}\n `;\n }\n\n protected override render() {\n return html`${cache(\n this._isRelative ? this._renderRelative() : this._renderDialog()\n )}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-nav-drawer': IgcNavDrawerComponent;\n }\n}\n"]}
@@ -1,9 +1,8 @@
1
- import { LitElement } from 'lit';
1
+ import { LitElement, type PropertyValues } from 'lit';
2
2
  import type { StyleInfo } from 'lit/directives/style-map.js';
3
3
  import type { SlotController } from '#internals/controllers/slot.js';
4
4
  import type { StyleVariant } from '../types.js';
5
5
  export declare abstract class IgcProgressBaseComponent extends LitElement {
6
- private readonly _internals;
7
6
  protected abstract _slots: SlotController<any>;
8
7
  protected _base: HTMLElement;
9
8
  protected _percentage: number;
@@ -48,11 +47,9 @@ export declare abstract class IgcProgressBaseComponent extends LitElement {
48
47
  * @attr label-format
49
48
  */
50
49
  labelFormat: string;
51
- protected _indeterminateChange(): void;
52
- protected _maxChange(): void;
53
- protected _valueChange(): void;
54
- protected updated(): void;
55
- private _updateARIA;
50
+ constructor();
51
+ protected willUpdate(changedProperties: PropertyValues<this>): void;
52
+ private get _labelText();
56
53
  private _updateProgress;
57
54
  protected _renderLabel(): import("lit-html").TemplateResult<1>;
58
55
  protected _renderLabelFormat(): string;
@@ -7,20 +7,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { html, LitElement, nothing } from 'lit';
8
8
  import { property, query, state } from 'lit/decorators.js';
9
9
  import { addInternalsController } from '#internals/controllers/internals.js';
10
- import { watch } from '#internals/decorators/watch.js';
11
10
  import { partMap } from '#internals/part-map.js';
12
11
  import { asPercent, clamp } from '#internals/utils/math.js';
13
12
  import { formatString } from '#internals/utils/strings.js';
14
13
  export class IgcProgressBaseComponent extends LitElement {
15
14
  constructor() {
16
- super(...arguments);
17
- this._internals = addInternalsController(this, {
18
- initialARIA: {
19
- role: 'progressbar',
20
- ariaValueMin: '0',
21
- ariaValueNow: '0',
22
- },
23
- });
15
+ super();
24
16
  this._percentage = 0;
25
17
  this._progress = 0;
26
18
  this._hasFraction = false;
@@ -36,39 +28,32 @@ export class IgcProgressBaseComponent extends LitElement {
36
28
  this.animationDuration = 500;
37
29
  this.indeterminate = false;
38
30
  this.hideLabel = false;
31
+ addInternalsController(this, {
32
+ initialARIA: {
33
+ role: 'progressbar',
34
+ ariaValueMin: '0',
35
+ ariaValueNow: '0',
36
+ },
37
+ aria: () => ({
38
+ ariaValueMax: this.max.toString(),
39
+ ariaValueNow: this.indeterminate ? null : this.value.toString(),
40
+ ariaValueText: this.indeterminate ? null : this._labelText,
41
+ }),
42
+ });
39
43
  }
40
- _indeterminateChange() {
41
- if (!this.indeterminate) {
42
- this._updateProgress();
43
- }
44
- }
45
- _maxChange() {
44
+ willUpdate(changedProperties) {
45
+ const progressChanged = changedProperties.has('animationDuration') ||
46
+ changedProperties.has('indeterminate') ||
47
+ changedProperties.has('max') ||
48
+ changedProperties.has('value');
46
49
  this.max = Math.max(0, this.max);
47
- if (this.value > this.max) {
48
- this.value = this.max;
49
- }
50
- if (!this.indeterminate) {
51
- this._updateProgress();
52
- }
53
- }
54
- _valueChange() {
55
50
  this.value = clamp(this.value, 0, this.max);
56
- if (!this.indeterminate) {
51
+ if (progressChanged && !this.indeterminate) {
57
52
  this._updateProgress();
58
53
  }
59
54
  }
60
- updated() {
61
- this._updateARIA();
62
- }
63
- _updateARIA() {
64
- const text = this.labelFormat
65
- ? this._renderLabelFormat()
66
- : `${this.value}%`;
67
- this._internals.setARIA({
68
- ariaValueMax: this.max.toString(),
69
- ariaValueNow: this.indeterminate ? null : this.value.toString(),
70
- ariaValueText: this.indeterminate ? null : text,
71
- });
55
+ get _labelText() {
56
+ return this.labelFormat ? this._renderLabelFormat() : `${this.value}%`;
72
57
  }
73
58
  _updateProgress() {
74
59
  const percentage = asPercent(this.value, Math.max(1, this.max));
@@ -140,13 +125,4 @@ __decorate([
140
125
  __decorate([
141
126
  property({ attribute: 'label-format' })
142
127
  ], IgcProgressBaseComponent.prototype, "labelFormat", void 0);
143
- __decorate([
144
- watch('indeterminate')
145
- ], IgcProgressBaseComponent.prototype, "_indeterminateChange", null);
146
- __decorate([
147
- watch('max')
148
- ], IgcProgressBaseComponent.prototype, "_maxChange", null);
149
- __decorate([
150
- watch('value')
151
- ], IgcProgressBaseComponent.prototype, "_valueChange", null);
152
128
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/components/progress/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport type { StyleInfo } from 'lit/directives/style-map.js';\nimport { addInternalsController } from '#internals/controllers/internals.js';\nimport type { SlotController } from '#internals/controllers/slot.js';\nimport { watch } from '#internals/decorators/watch.js';\nimport { partMap } from '#internals/part-map.js';\nimport { asPercent, clamp } from '#internals/utils/math.js';\nimport { formatString } from '#internals/utils/strings.js';\nimport type { StyleVariant } from '../types.js';\n\n/* omitModule */\nexport abstract class IgcProgressBaseComponent extends LitElement {\n private readonly _internals = addInternalsController(this, {\n initialARIA: {\n role: 'progressbar',\n ariaValueMin: '0',\n ariaValueNow: '0',\n },\n });\n\n protected abstract _slots: SlotController<any>;\n\n @query('[part=\"base\"]', true)\n protected _base!: HTMLElement;\n\n @state()\n protected _percentage = 0;\n\n @state()\n protected _progress = 0;\n\n @state()\n protected _hasFraction = false;\n\n @state()\n protected _styleInfo: StyleInfo = {\n '--_progress-whole': '0.00',\n '--_progress-integer': '0',\n '--_progress-fraction': '0',\n '--_transition-duration': '0ms',\n };\n\n /**\n * Maximum value of the control.\n * @attr\n */\n @property({ type: Number })\n public max = 100;\n\n /**\n * The value of the control.\n * @attr\n */\n @property({ type: Number })\n public value = 0;\n\n /**\n * The variant of the control.\n * @attr\n */\n @property({ reflect: true })\n public variant: StyleVariant = 'primary';\n\n /**\n * Animation duration in milliseconds.\n * @attr animation-duration\n */\n @property({ type: Number, attribute: 'animation-duration' })\n public animationDuration = 500;\n\n /**\n * The indeterminate state of the control.\n * @attr\n */\n @property({ type: Boolean, reflect: false })\n public indeterminate = false;\n\n /**\n * Shows/hides the label of the control.\n * @attr hide-label\n */\n @property({ type: Boolean, attribute: 'hide-label', reflect: false })\n public hideLabel = false;\n\n /**\n * Format string for the default label of the control.\n * Placeholders:\n * {0} - current value of the control.\n * {1} - max value of the control.\n * @attr label-format\n */\n @property({ attribute: 'label-format' })\n public labelFormat!: string;\n\n @watch('indeterminate')\n protected _indeterminateChange(): void {\n if (!this.indeterminate) {\n this._updateProgress();\n }\n }\n\n @watch('max')\n protected _maxChange(): void {\n this.max = Math.max(0, this.max);\n if (this.value > this.max) {\n this.value = this.max;\n }\n\n if (!this.indeterminate) {\n this._updateProgress();\n }\n }\n\n @watch('value')\n protected _valueChange(): void {\n this.value = clamp(this.value, 0, this.max);\n\n if (!this.indeterminate) {\n this._updateProgress();\n }\n }\n\n protected override updated(): void {\n this._updateARIA();\n }\n\n private _updateARIA(): void {\n const text = this.labelFormat\n ? this._renderLabelFormat()\n : `${this.value}%`;\n\n this._internals.setARIA({\n ariaValueMax: this.max.toString(),\n ariaValueNow: this.indeterminate ? null : this.value.toString(),\n ariaValueText: this.indeterminate ? null : text,\n });\n }\n\n private _updateProgress(): void {\n const percentage = asPercent(this.value, Math.max(1, this.max));\n const fractionValue = Math.round((percentage % 1) * 100);\n this._hasFraction = fractionValue > 0;\n\n this._styleInfo = {\n '--_progress-whole': percentage.toFixed(2),\n '--_progress-integer': Math.floor(percentage),\n '--_progress-fraction': fractionValue,\n '--_transition-duration': `${this.animationDuration}ms`,\n };\n }\n\n protected _renderLabel() {\n const parts = {\n label: true,\n value: true,\n fraction: this._hasFraction,\n };\n\n return this.labelFormat\n ? html`<span part=${partMap(parts)}>${this._renderLabelFormat()}</span>`\n : html`<span part=${partMap({ ...parts, counter: true })}></span>`;\n }\n\n protected _renderLabelFormat(): string {\n return formatString(this.labelFormat, this.value, this.max);\n }\n\n protected _renderDefaultSlot() {\n const hideDefaultLabel =\n this.indeterminate ||\n this.hideLabel ||\n this._slots.hasAssignedElements('[default]');\n\n return html`\n <slot part=\"label\"></slot>\n ${hideDefaultLabel ? nothing : this._renderLabel()}\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/components/progress/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport type { StyleInfo } from 'lit/directives/style-map.js';\nimport { addInternalsController } from '#internals/controllers/internals.js';\nimport type { SlotController } from '#internals/controllers/slot.js';\nimport { partMap } from '#internals/part-map.js';\nimport { asPercent, clamp } from '#internals/utils/math.js';\nimport { formatString } from '#internals/utils/strings.js';\nimport type { StyleVariant } from '../types.js';\n\n/* omitModule */\nexport abstract class IgcProgressBaseComponent extends LitElement {\n protected abstract _slots: SlotController<any>;\n\n @query('[part=\"base\"]', true)\n protected _base!: HTMLElement;\n\n @state()\n protected _percentage = 0;\n\n @state()\n protected _progress = 0;\n\n @state()\n protected _hasFraction = false;\n\n @state()\n protected _styleInfo: StyleInfo = {\n '--_progress-whole': '0.00',\n '--_progress-integer': '0',\n '--_progress-fraction': '0',\n '--_transition-duration': '0ms',\n };\n\n /**\n * Maximum value of the control.\n * @attr\n */\n @property({ type: Number })\n public max = 100;\n\n /**\n * The value of the control.\n * @attr\n */\n @property({ type: Number })\n public value = 0;\n\n /**\n * The variant of the control.\n * @attr\n */\n @property({ reflect: true })\n public variant: StyleVariant = 'primary';\n\n /**\n * Animation duration in milliseconds.\n * @attr animation-duration\n */\n @property({ type: Number, attribute: 'animation-duration' })\n public animationDuration = 500;\n\n /**\n * The indeterminate state of the control.\n * @attr\n */\n @property({ type: Boolean, reflect: false })\n public indeterminate = false;\n\n /**\n * Shows/hides the label of the control.\n * @attr hide-label\n */\n @property({ type: Boolean, attribute: 'hide-label', reflect: false })\n public hideLabel = false;\n\n /**\n * Format string for the default label of the control.\n * Placeholders:\n * {0} - current value of the control.\n * {1} - max value of the control.\n * @attr label-format\n */\n @property({ attribute: 'label-format' })\n public labelFormat!: string;\n\n constructor() {\n super();\n\n addInternalsController(this, {\n initialARIA: {\n role: 'progressbar',\n ariaValueMin: '0',\n ariaValueNow: '0',\n },\n aria: () => ({\n ariaValueMax: this.max.toString(),\n ariaValueNow: this.indeterminate ? null : this.value.toString(),\n ariaValueText: this.indeterminate ? null : this._labelText,\n }),\n });\n }\n\n protected override willUpdate(changedProperties: PropertyValues<this>): void {\n const progressChanged =\n changedProperties.has('animationDuration') ||\n changedProperties.has('indeterminate') ||\n changedProperties.has('max') ||\n changedProperties.has('value');\n\n // Both writes are idempotent, so they are applied unconditionally. A clamp\n // that does change a value lands it in `changedProperties` for this pass.\n this.max = Math.max(0, this.max);\n this.value = clamp(this.value, 0, this.max);\n\n if (progressChanged && !this.indeterminate) {\n this._updateProgress();\n }\n }\n\n private get _labelText(): string {\n return this.labelFormat ? this._renderLabelFormat() : `${this.value}%`;\n }\n\n private _updateProgress(): void {\n const percentage = asPercent(this.value, Math.max(1, this.max));\n const fractionValue = Math.round((percentage % 1) * 100);\n this._hasFraction = fractionValue > 0;\n\n this._styleInfo = {\n '--_progress-whole': percentage.toFixed(2),\n '--_progress-integer': Math.floor(percentage),\n '--_progress-fraction': fractionValue,\n '--_transition-duration': `${this.animationDuration}ms`,\n };\n }\n\n protected _renderLabel() {\n const parts = {\n label: true,\n value: true,\n fraction: this._hasFraction,\n };\n\n return this.labelFormat\n ? html`<span part=${partMap(parts)}>${this._renderLabelFormat()}</span>`\n : html`<span part=${partMap({ ...parts, counter: true })}></span>`;\n }\n\n protected _renderLabelFormat(): string {\n return formatString(this.labelFormat, this.value, this.max);\n }\n\n protected _renderDefaultSlot() {\n const hideDefaultLabel =\n this.indeterminate ||\n this.hideLabel ||\n this._slots.hasAssignedElements('[default]');\n\n return html`\n <slot part=\"label\"></slot>\n ${hideDefaultLabel ? nothing : this._renderLabel()}\n `;\n }\n}\n"]}
@@ -125,7 +125,7 @@ export default class IgcQrCodeComponent extends LitElement {
125
125
  private _pickErrorLevel;
126
126
  private _getErrorLevelAndArea;
127
127
  private _getMatrix;
128
- protected render(): import("lit-html").TemplateResult<1> | typeof nothing;
128
+ protected render(): typeof nothing | import("lit-html").TemplateResult<1>;
129
129
  }
130
130
  declare global {
131
131
  interface HTMLElementTagNameMap {
@@ -10,7 +10,7 @@ import { createAbortHandle } from '#internals/abort-handler.js';
10
10
  import { registerComponent } from '#internals/definitions/register.js';
11
11
  import { bindIf } from '#internals/utils/lit.js';
12
12
  import { clamp } from '#internals/utils/math.js';
13
- import { nanoid } from '#internals/utils/strings.js';
13
+ import { createIdGenerator } from '#internals/utils/strings.js';
14
14
  import { addThemingController } from '#theming/theming-controller.js';
15
15
  import { generateQRCodeMatrix } from './model/matrix.js';
16
16
  import { DEFAULT_SIZE_RATIO, MAX_SAFE_AREA, SAFE_AREAS, } from './renderer/constants.js';
@@ -20,6 +20,7 @@ import { renderQrMaskAndImage } from './renderer/image.js';
20
20
  import { styles } from './themes/qr-code.base.css.js';
21
21
  import { styles as shared } from './themes/shared/qr-code.common.css.js';
22
22
  import { all } from './themes/themes.js';
23
+ const nextMaskId = createIdGenerator('igc-qr-code-mask');
23
24
  export default class IgcQrCodeComponent extends LitElement {
24
25
  static { this.tagName = 'igc-qr-code'; }
25
26
  static { this.styles = [styles, shared]; }
@@ -29,7 +30,7 @@ export default class IgcQrCodeComponent extends LitElement {
29
30
  constructor() {
30
31
  super();
31
32
  this._abortHandle = createAbortHandle();
32
- this._maskId = nanoid(8);
33
+ this._maskId = nextMaskId();
33
34
  this._maskUrl = `url(#${this._maskId})`;
34
35
  this._logoAspectRatio = 1;
35
36
  this._logoLoadFailed = false;
@@ -1 +1 @@
1
- {"version":3,"file":"qr-code.js","sourceRoot":"","sources":["../../../src/components/qr-code/qr-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createAbortHandle } from '#internals/abort-handler.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport { bindIf } from '#internals/utils/lit.js';\nimport { clamp } from '#internals/utils/math.js';\nimport { nanoid } from '#internals/utils/strings.js';\nimport { addThemingController } from '#theming/theming-controller.js';\nimport type { QRCodeMatrixResult } from './model/matrix.js';\nimport { generateQRCodeMatrix } from './model/matrix.js';\nimport {\n DEFAULT_SIZE_RATIO,\n MAX_SAFE_AREA,\n SAFE_AREAS,\n} from './renderer/constants.js';\nimport { renderQrFinders } from './renderer/corner.js';\nimport { renderQrDots } from './renderer/dots.js';\nimport { renderQrMaskAndImage } from './renderer/image.js';\nimport { styles } from './themes/qr-code.base.css.js';\nimport { styles as shared } from './themes/shared/qr-code.common.css.js';\nimport { all } from './themes/themes.js';\nimport type {\n QrCornerSquareStyle,\n QrDotStyle,\n QrErrorCorrectionLevel,\n} from './types.js';\n\n/**\n *\n * Generates a QR code based on the provided value and options.\n * The component renders an SVG representation of the QR code, which can be customized using various properties.\n *\n * @element igc-qr-code\n *\n * @cssproperty --ig-qr-code-background - The background color of the QR code. Default is `white`.\n * @cssproperty --ig-qr-code-dark-color - The color of the data modules (dots), and the corner square/dot colors unless overridden below. Default is `black`.\n * @cssproperty --ig-qr-code-corner-square-color - The color of the outer finder-pattern corner squares. Defaults to `--ig-qr-code-dark-color`.\n * @cssproperty --ig-qr-code-corner-dot-color - The color of the inner finder-pattern corner dots. Defaults to `--ig-qr-code-dark-color`.\n *\n * @csspart background - The background rect of the QR code.\n * @csspart dots - The data modules (dots) of the QR code.\n * @csspart corner-square - The outer corner (finder-pattern) squares of the QR code.\n * @csspart corner-dot - The inner corner (finder-pattern) dots of the QR code.\n */\nexport default class IgcQrCodeComponent extends LitElement {\n public static readonly tagName = 'igc-qr-code';\n\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcQrCodeComponent);\n }\n\n private readonly _abortHandle = createAbortHandle();\n private readonly _maskId = nanoid(8);\n private readonly _maskUrl = `url(#${this._maskId})`;\n private _matrixCache?: {\n value: string;\n errorLevel: QrErrorCorrectionLevel;\n version?: number;\n result: QRCodeMatrixResult;\n };\n\n @state()\n private _logoAspectRatio = 1;\n\n @state()\n private _logoLoadFailed = false;\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n /**\n * The value to be encoded in the QR code. This can be any string, such as a URL, text, or other data.\n * When this property is set, the component will generate a QR code representing the provided value.\n *\n * @attr value\n */\n @property()\n public value?: string;\n\n /**\n * The version of the QR code to generate, which determines the size and data capacity of the QR code.\n * Valid values are integers from 1 to 40, where each version corresponds to a specific module size and data capacity.\n *\n * If not specified, the component will automatically select the smallest version that can accommodate the provided value.\n *\n * @attr version\n */\n @property({ type: Number })\n public version?: number;\n\n /**\n * The error correction level for the QR code, which determines the QR code's ability to be read if it is partially obscured or damaged.\n * Valid values are 'L', 'M', 'Q', and 'H', where 'L' provides the lowest level of error correction and 'H' provides the highest level.\n *\n * @attr error-level\n * @default 'M'\n */\n @property({ attribute: 'error-level' })\n public errorLevel?: QrErrorCorrectionLevel = 'M';\n\n /**\n * The size of the QR code in pixels. This determines the width and height of the generated QR code. The default value is 128 pixels.\n *\n * @attr size\n * @default 128\n */\n @property({ type: Number })\n public size = 128;\n\n /**\n * The margin (quiet zone) around the QR code, expressed as a number of QR code modules rather\n * than pixels. This is the blank border area surrounding the code, which helps ensure that it\n * can be properly scanned.\n *\n * @attr margin\n * @default 4\n */\n @property({ type: Number })\n public margin = 4;\n\n /**\n * The source URL of an optional logo image to be displayed at the center of the QR code. The logo can help with branding and recognition.\n * If provided, the component will attempt to render the logo within the QR code while maintaining scannability.\n *\n * @attr logo-src\n */\n @property({ attribute: 'logo-src' })\n public logoSrc?: string;\n\n /**\n * The size of the logo, as a ratio of the maximum area that can safely be obscured by a logo\n * while the QR code remains scannable (up to 9% of the code's area, at the highest error\n * correction level). The value should be a number between 0 and 1, where 0 means no logo and 1\n * means the logo will cover the full safe area (not the entire QR code).\n * The default value is 0.4, meaning the logo covers 40% of that safe area (~3.6% of the QR code).\n *\n * When `error-level` is not explicitly set, the smallest error correction level that can\n * accommodate the requested logo size is chosen automatically.\n *\n * @attr logo-size\n * @default 0.4\n */\n @property({ type: Number, attribute: 'logo-size' })\n public logoSize = 0.4;\n\n /**\n * The margin around the logo in pixels. This is the whitespace area surrounding the logo within the QR code,\n * which helps ensure that the logo does not interfere with the QR code's scannability.\n *\n * @attr logo-margin\n */\n @property({ type: Number, attribute: 'logo-margin' })\n public logoMargin?: number;\n\n /**\n * The style of the data modules (dots) in the QR code, and of the inner dot of each finder-pattern\n * corner. This can be 'square', 'circle', or 'rounded'.\n *\n * @attr dot-style\n * @default 'square'\n */\n @property({ attribute: 'dot-style' })\n public dotStyle: QrDotStyle = 'square';\n\n /**\n * The style of the corner squares in the QR code. This can be 'square', 'circle', or 'rounded'.\n *\n * @attr square-style\n * @default 'square'\n */\n @property({ attribute: 'square-style' })\n public squareStyle: QrCornerSquareStyle = 'square';\n\n /** @internal */\n protected override update(props: PropertyValues<this>): void {\n if (props.has('logoSrc')) {\n this._resolveAspectRatio();\n }\n\n super.update(props);\n }\n\n private _resolveAspectRatio(): void {\n this._abortHandle.abort();\n this._logoLoadFailed = false;\n this._logoAspectRatio = 1;\n\n if (!this._hasValidLogoSrc()) {\n return;\n }\n\n const signal = this._abortHandle.signal;\n const img = new Image();\n img.src = this.logoSrc!;\n\n if (img.complete) {\n if (img.naturalWidth && img.naturalHeight) {\n this._logoAspectRatio = img.naturalWidth / img.naturalHeight;\n } else {\n this._logoLoadFailed = true;\n }\n return;\n }\n\n img.addEventListener(\n 'load',\n () => {\n if (img.naturalWidth && img.naturalHeight) {\n this._logoAspectRatio = img.naturalWidth / img.naturalHeight;\n } else {\n this._logoLoadFailed = true;\n }\n },\n { once: true, signal }\n );\n\n img.addEventListener(\n 'error',\n () => {\n this._logoLoadFailed = true;\n },\n { once: true, signal }\n );\n }\n\n /**\n * Determines whether a valid logo source is provided.\n *\n * The method checks if the `logoSrc` property is set and if it does not start with potentially unsafe schemes like 'javascript:' or 'vbscript:'.\n * It also ensures that if the source is a data URI, it must be an image type.\n * This validation helps prevent security risks associated with rendering untrusted content in the QR code.\n */\n private _hasValidLogoSrc(): boolean {\n if (!this.logoSrc) return false;\n const s = this.logoSrc.trim().toLowerCase();\n if (s.startsWith('javascript:') || s.startsWith('vbscript:')) return false;\n if (s.startsWith('data:') && !s.startsWith('data:image/')) return false;\n return true;\n }\n\n private _pickErrorLevel(area: number): QrErrorCorrectionLevel {\n if (area <= SAFE_AREAS.L) return 'L';\n if (area <= SAFE_AREAS.M) return 'M';\n if (area <= SAFE_AREAS.Q) return 'Q';\n return 'H';\n }\n\n private _getErrorLevelAndArea(hasLogo: boolean) {\n const userErrorLevel = this.errorLevel;\n const size = this.logoSize;\n const sizeRatio = hasLogo ? clamp(size ?? DEFAULT_SIZE_RATIO, 0, 1) : 0;\n const targetArea = sizeRatio * MAX_SAFE_AREA;\n\n let errorLevel: QrErrorCorrectionLevel;\n let area: number;\n\n if (userErrorLevel) {\n errorLevel = userErrorLevel;\n area = Math.min(targetArea, SAFE_AREAS[userErrorLevel]);\n } else if (targetArea > 0) {\n errorLevel = this._pickErrorLevel(targetArea);\n area = targetArea;\n } else {\n errorLevel = 'M';\n area = 0;\n }\n\n return { errorLevel, area };\n }\n\n private _getMatrix(\n value: string,\n errorLevel: QrErrorCorrectionLevel\n ): QRCodeMatrixResult {\n const cached = this._matrixCache;\n if (\n cached &&\n cached.value === value &&\n cached.errorLevel === errorLevel &&\n cached.version === this.version\n ) {\n return cached.result;\n }\n\n const result = generateQRCodeMatrix(value, errorLevel, this.version);\n this._matrixCache = { value, errorLevel, version: this.version, result };\n return result;\n }\n\n protected override render() {\n if (!this.value) return nothing;\n\n const hasLogo = this._hasValidLogoSrc() && !this._logoLoadFailed;\n const { errorLevel, area } = this._getErrorLevelAndArea(hasLogo);\n\n const { matrix, size } = this._getMatrix(this.value, errorLevel);\n\n const totalModules = size + this.margin * 2;\n const moduleSize = size / totalModules;\n const marginPx = this.margin * moduleSize;\n const svgSize = moduleSize * (size + this.margin * 2);\n\n const { mask, image, shouldApplyMask } = renderQrMaskAndImage({\n hasLogo,\n src: this.logoSrc!,\n aspectRatio: this._logoAspectRatio,\n area,\n size: this.size,\n margin: this.logoMargin,\n svgSize,\n maskId: this._maskId,\n });\n\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n width=${this.size}\n height=${this.size}\n viewBox=\"0 0 ${svgSize} ${svgSize}\"\n >\n <title>${this.ariaLabel ?? `QR code: ${this.value}`}</title>\n\n <rect part=\"background\" width=${svgSize} height=${svgSize} />\n ${mask}\n <g mask=${bindIf(shouldApplyMask, this._maskUrl)}>\n ${renderQrDots({\n matrix,\n moduleSize,\n marginPx,\n dotStyle: this.dotStyle,\n })}\n ${renderQrFinders({\n size,\n moduleSize,\n marginPx,\n dotStyle: this.dotStyle,\n squareStyle: this.squareStyle,\n })}\n </g>\n ${image}\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-qr-code': IgcQrCodeComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"qr-code.js","sourceRoot":"","sources":["../../../src/components/qr-code/qr-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { createAbortHandle } from '#internals/abort-handler.js';\nimport { registerComponent } from '#internals/definitions/register.js';\nimport { bindIf } from '#internals/utils/lit.js';\nimport { clamp } from '#internals/utils/math.js';\nimport { createIdGenerator } from '#internals/utils/strings.js';\nimport { addThemingController } from '#theming/theming-controller.js';\nimport type { QRCodeMatrixResult } from './model/matrix.js';\nimport { generateQRCodeMatrix } from './model/matrix.js';\nimport {\n DEFAULT_SIZE_RATIO,\n MAX_SAFE_AREA,\n SAFE_AREAS,\n} from './renderer/constants.js';\nimport { renderQrFinders } from './renderer/corner.js';\nimport { renderQrDots } from './renderer/dots.js';\nimport { renderQrMaskAndImage } from './renderer/image.js';\nimport { styles } from './themes/qr-code.base.css.js';\nimport { styles as shared } from './themes/shared/qr-code.common.css.js';\nimport { all } from './themes/themes.js';\nimport type {\n QrCornerSquareStyle,\n QrDotStyle,\n QrErrorCorrectionLevel,\n} from './types.js';\n\nconst nextMaskId = createIdGenerator('igc-qr-code-mask');\n\n/**\n *\n * Generates a QR code based on the provided value and options.\n * The component renders an SVG representation of the QR code, which can be customized using various properties.\n *\n * @element igc-qr-code\n *\n * @cssproperty --ig-qr-code-background - The background color of the QR code. Default is `white`.\n * @cssproperty --ig-qr-code-dark-color - The color of the data modules (dots), and the corner square/dot colors unless overridden below. Default is `black`.\n * @cssproperty --ig-qr-code-corner-square-color - The color of the outer finder-pattern corner squares. Defaults to `--ig-qr-code-dark-color`.\n * @cssproperty --ig-qr-code-corner-dot-color - The color of the inner finder-pattern corner dots. Defaults to `--ig-qr-code-dark-color`.\n *\n * @csspart background - The background rect of the QR code.\n * @csspart dots - The data modules (dots) of the QR code.\n * @csspart corner-square - The outer corner (finder-pattern) squares of the QR code.\n * @csspart corner-dot - The inner corner (finder-pattern) dots of the QR code.\n */\nexport default class IgcQrCodeComponent extends LitElement {\n public static readonly tagName = 'igc-qr-code';\n\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcQrCodeComponent);\n }\n\n private readonly _abortHandle = createAbortHandle();\n private readonly _maskId = nextMaskId();\n private readonly _maskUrl = `url(#${this._maskId})`;\n private _matrixCache?: {\n value: string;\n errorLevel: QrErrorCorrectionLevel;\n version?: number;\n result: QRCodeMatrixResult;\n };\n\n @state()\n private _logoAspectRatio = 1;\n\n @state()\n private _logoLoadFailed = false;\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n /**\n * The value to be encoded in the QR code. This can be any string, such as a URL, text, or other data.\n * When this property is set, the component will generate a QR code representing the provided value.\n *\n * @attr value\n */\n @property()\n public value?: string;\n\n /**\n * The version of the QR code to generate, which determines the size and data capacity of the QR code.\n * Valid values are integers from 1 to 40, where each version corresponds to a specific module size and data capacity.\n *\n * If not specified, the component will automatically select the smallest version that can accommodate the provided value.\n *\n * @attr version\n */\n @property({ type: Number })\n public version?: number;\n\n /**\n * The error correction level for the QR code, which determines the QR code's ability to be read if it is partially obscured or damaged.\n * Valid values are 'L', 'M', 'Q', and 'H', where 'L' provides the lowest level of error correction and 'H' provides the highest level.\n *\n * @attr error-level\n * @default 'M'\n */\n @property({ attribute: 'error-level' })\n public errorLevel?: QrErrorCorrectionLevel = 'M';\n\n /**\n * The size of the QR code in pixels. This determines the width and height of the generated QR code. The default value is 128 pixels.\n *\n * @attr size\n * @default 128\n */\n @property({ type: Number })\n public size = 128;\n\n /**\n * The margin (quiet zone) around the QR code, expressed as a number of QR code modules rather\n * than pixels. This is the blank border area surrounding the code, which helps ensure that it\n * can be properly scanned.\n *\n * @attr margin\n * @default 4\n */\n @property({ type: Number })\n public margin = 4;\n\n /**\n * The source URL of an optional logo image to be displayed at the center of the QR code. The logo can help with branding and recognition.\n * If provided, the component will attempt to render the logo within the QR code while maintaining scannability.\n *\n * @attr logo-src\n */\n @property({ attribute: 'logo-src' })\n public logoSrc?: string;\n\n /**\n * The size of the logo, as a ratio of the maximum area that can safely be obscured by a logo\n * while the QR code remains scannable (up to 9% of the code's area, at the highest error\n * correction level). The value should be a number between 0 and 1, where 0 means no logo and 1\n * means the logo will cover the full safe area (not the entire QR code).\n * The default value is 0.4, meaning the logo covers 40% of that safe area (~3.6% of the QR code).\n *\n * When `error-level` is not explicitly set, the smallest error correction level that can\n * accommodate the requested logo size is chosen automatically.\n *\n * @attr logo-size\n * @default 0.4\n */\n @property({ type: Number, attribute: 'logo-size' })\n public logoSize = 0.4;\n\n /**\n * The margin around the logo in pixels. This is the whitespace area surrounding the logo within the QR code,\n * which helps ensure that the logo does not interfere with the QR code's scannability.\n *\n * @attr logo-margin\n */\n @property({ type: Number, attribute: 'logo-margin' })\n public logoMargin?: number;\n\n /**\n * The style of the data modules (dots) in the QR code, and of the inner dot of each finder-pattern\n * corner. This can be 'square', 'circle', or 'rounded'.\n *\n * @attr dot-style\n * @default 'square'\n */\n @property({ attribute: 'dot-style' })\n public dotStyle: QrDotStyle = 'square';\n\n /**\n * The style of the corner squares in the QR code. This can be 'square', 'circle', or 'rounded'.\n *\n * @attr square-style\n * @default 'square'\n */\n @property({ attribute: 'square-style' })\n public squareStyle: QrCornerSquareStyle = 'square';\n\n /** @internal */\n protected override update(props: PropertyValues<this>): void {\n if (props.has('logoSrc')) {\n this._resolveAspectRatio();\n }\n\n super.update(props);\n }\n\n private _resolveAspectRatio(): void {\n this._abortHandle.abort();\n this._logoLoadFailed = false;\n this._logoAspectRatio = 1;\n\n if (!this._hasValidLogoSrc()) {\n return;\n }\n\n const signal = this._abortHandle.signal;\n const img = new Image();\n img.src = this.logoSrc!;\n\n if (img.complete) {\n if (img.naturalWidth && img.naturalHeight) {\n this._logoAspectRatio = img.naturalWidth / img.naturalHeight;\n } else {\n this._logoLoadFailed = true;\n }\n return;\n }\n\n img.addEventListener(\n 'load',\n () => {\n if (img.naturalWidth && img.naturalHeight) {\n this._logoAspectRatio = img.naturalWidth / img.naturalHeight;\n } else {\n this._logoLoadFailed = true;\n }\n },\n { once: true, signal }\n );\n\n img.addEventListener(\n 'error',\n () => {\n this._logoLoadFailed = true;\n },\n { once: true, signal }\n );\n }\n\n /**\n * Determines whether a valid logo source is provided.\n *\n * The method checks if the `logoSrc` property is set and if it does not start with potentially unsafe schemes like 'javascript:' or 'vbscript:'.\n * It also ensures that if the source is a data URI, it must be an image type.\n * This validation helps prevent security risks associated with rendering untrusted content in the QR code.\n */\n private _hasValidLogoSrc(): boolean {\n if (!this.logoSrc) return false;\n const s = this.logoSrc.trim().toLowerCase();\n if (s.startsWith('javascript:') || s.startsWith('vbscript:')) return false;\n if (s.startsWith('data:') && !s.startsWith('data:image/')) return false;\n return true;\n }\n\n private _pickErrorLevel(area: number): QrErrorCorrectionLevel {\n if (area <= SAFE_AREAS.L) return 'L';\n if (area <= SAFE_AREAS.M) return 'M';\n if (area <= SAFE_AREAS.Q) return 'Q';\n return 'H';\n }\n\n private _getErrorLevelAndArea(hasLogo: boolean) {\n const userErrorLevel = this.errorLevel;\n const size = this.logoSize;\n const sizeRatio = hasLogo ? clamp(size ?? DEFAULT_SIZE_RATIO, 0, 1) : 0;\n const targetArea = sizeRatio * MAX_SAFE_AREA;\n\n let errorLevel: QrErrorCorrectionLevel;\n let area: number;\n\n if (userErrorLevel) {\n errorLevel = userErrorLevel;\n area = Math.min(targetArea, SAFE_AREAS[userErrorLevel]);\n } else if (targetArea > 0) {\n errorLevel = this._pickErrorLevel(targetArea);\n area = targetArea;\n } else {\n errorLevel = 'M';\n area = 0;\n }\n\n return { errorLevel, area };\n }\n\n private _getMatrix(\n value: string,\n errorLevel: QrErrorCorrectionLevel\n ): QRCodeMatrixResult {\n const cached = this._matrixCache;\n if (\n cached &&\n cached.value === value &&\n cached.errorLevel === errorLevel &&\n cached.version === this.version\n ) {\n return cached.result;\n }\n\n const result = generateQRCodeMatrix(value, errorLevel, this.version);\n this._matrixCache = { value, errorLevel, version: this.version, result };\n return result;\n }\n\n protected override render() {\n if (!this.value) return nothing;\n\n const hasLogo = this._hasValidLogoSrc() && !this._logoLoadFailed;\n const { errorLevel, area } = this._getErrorLevelAndArea(hasLogo);\n\n const { matrix, size } = this._getMatrix(this.value, errorLevel);\n\n const totalModules = size + this.margin * 2;\n const moduleSize = size / totalModules;\n const marginPx = this.margin * moduleSize;\n const svgSize = moduleSize * (size + this.margin * 2);\n\n const { mask, image, shouldApplyMask } = renderQrMaskAndImage({\n hasLogo,\n src: this.logoSrc!,\n aspectRatio: this._logoAspectRatio,\n area,\n size: this.size,\n margin: this.logoMargin,\n svgSize,\n maskId: this._maskId,\n });\n\n return html`\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n width=${this.size}\n height=${this.size}\n viewBox=\"0 0 ${svgSize} ${svgSize}\"\n >\n <title>${this.ariaLabel ?? `QR code: ${this.value}`}</title>\n\n <rect part=\"background\" width=${svgSize} height=${svgSize} />\n ${mask}\n <g mask=${bindIf(shouldApplyMask, this._maskUrl)}>\n ${renderQrDots({\n matrix,\n moduleSize,\n marginPx,\n dotStyle: this.dotStyle,\n })}\n ${renderQrFinders({\n size,\n moduleSize,\n marginPx,\n dotStyle: this.dotStyle,\n squareStyle: this.squareStyle,\n })}\n </g>\n ${image}\n </svg>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-qr-code': IgcQrCodeComponent;\n }\n}\n"]}
@@ -11,6 +11,6 @@ export type QrCornerSquareStyle = 'square' | 'circle' | 'rounded';
11
11
  export type QrErrorCorrectionLevel = 'L' | 'M' | 'Q' | 'H';
12
12
  /**
13
13
  * QR data encoding mode, selected automatically based on the input string.
14
- * - `numeric` digits only; `alphanumeric` digits + uppercase letters + a few symbols; `byte` arbitrary UTF-8.
14
+ * - `numeric` - digits only; `alphanumeric` - digits + uppercase letters + a few symbols; `byte` - arbitrary UTF-8.
15
15
  */
16
16
  export type QrEncodingMode = 'numeric' | 'alphanumeric' | 'byte';
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/qr-code/types.ts"],"names":[],"mappings":"","sourcesContent":["/** Shape of individual data modules in the QR code body. */\nexport type QrDotStyle = 'square' | 'circle' | 'rounded';\n\n/** Shape of the inner dot inside each finder-pattern corner. */\nexport type QrCornerDotStyle = 'square' | 'circle' | 'rounded';\n\n/** Shape of the outer square of each finder-pattern corner. */\nexport type QrCornerSquareStyle = 'square' | 'circle' | 'rounded';\n\n/**\n * QR error correction level. Higher levels recover more data but reduce capacity.\n * - `L` ~7%, `M` ~15%, `Q` ~25%, `H` ~30%.\n */\nexport type QrErrorCorrectionLevel = 'L' | 'M' | 'Q' | 'H';\n\n/**\n * QR data encoding mode, selected automatically based on the input string.\n * - `numeric` digits only; `alphanumeric` digits + uppercase letters + a few symbols; `byte` arbitrary UTF-8.\n */\nexport type QrEncodingMode = 'numeric' | 'alphanumeric' | 'byte';\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/qr-code/types.ts"],"names":[],"mappings":"","sourcesContent":["/** Shape of individual data modules in the QR code body. */\nexport type QrDotStyle = 'square' | 'circle' | 'rounded';\n\n/** Shape of the inner dot inside each finder-pattern corner. */\nexport type QrCornerDotStyle = 'square' | 'circle' | 'rounded';\n\n/** Shape of the outer square of each finder-pattern corner. */\nexport type QrCornerSquareStyle = 'square' | 'circle' | 'rounded';\n\n/**\n * QR error correction level. Higher levels recover more data but reduce capacity.\n * - `L` ~7%, `M` ~15%, `Q` ~25%, `H` ~30%.\n */\nexport type QrErrorCorrectionLevel = 'L' | 'M' | 'Q' | 'H';\n\n/**\n * QR data encoding mode, selected automatically based on the input string.\n * - `numeric` - digits only; `alphanumeric` - digits + uppercase letters + a few symbols; `byte` - arbitrary UTF-8.\n */\nexport type QrEncodingMode = 'numeric' | 'alphanumeric' | 'byte';\n"]}
@@ -1,34 +1,6 @@
1
- import type { ReactiveController } from 'lit';
1
+ import { type GroupMemberController } from '#internals/controllers/group.js';
2
2
  import type IgcRadioComponent from './radio.js';
3
- /** Keeps a radio in the group of its current root node and name. */
4
- declare class RadioGroupController implements ReactiveController {
5
- /** Gives each radio of the group the state that the group derives. */
6
- private static _sync;
7
- private readonly _host;
8
- private readonly _onSync;
9
- /** The root node the host is registered under, or null while it is not registered. */
10
- private _root;
11
- private _name;
12
- /** Whether the host still belongs to the group that holds its entry. */
13
- private get _isCurrent();
14
- private get _group();
15
- /** The radios of the host group, in DOM order. A radio with no group is on its own. */
16
- get members(): IgcRadioComponent[];
17
- constructor(host: IgcRadioComponent, onSync: (hasCheckedRadio: boolean) => void);
18
- /** @internal */
19
- hostConnected(): void;
20
- /** @internal */
21
- hostDisconnected(): void;
22
- /**
23
- * Moves the host to the group of its current root node and name. Does nothing while
24
- * both stay the same. If not, the group that the host joins and the group that it
25
- * leaves both update their state.
26
- */
27
- updateMembership(): void;
28
- /** Updates the state of the host group. */
29
- sync(): void;
30
- private _unregister;
31
- }
3
+ type RadioGroupController = GroupMemberController<IgcRadioComponent>;
32
4
  export type { RadioGroupController };
33
5
  export declare function addRadioGroupController(host: IgcRadioComponent, onSync: (hasCheckedRadio: boolean) => void): RadioGroupController;
34
6
  /** Returns the radios of the group of `member`, in DOM order. */
@@ -1,100 +1,14 @@
1
- import { isEmpty } from '#internals/utils/arrays.js';
1
+ import { createGroupRegistry, } from '#internals/controllers/group.js';
2
2
  import { getRoot } from '#internals/utils/dom.js';
3
- const registry = new WeakMap();
4
- const controllers = new WeakMap();
5
- function byDocumentOrder(a, b) {
6
- if (a === b) {
7
- return 0;
8
- }
9
- return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING
10
- ? -1
11
- : 1;
12
- }
13
- function groupOf(root, name) {
14
- const names = registry.get(root) ?? new Map();
15
- const group = names.get(name) ?? new Set();
16
- names.set(name, group);
17
- registry.set(root, names);
18
- return group;
19
- }
20
- class RadioGroupController {
21
- static _sync(group) {
22
- const members = Array.from(group);
23
- const hasCheckedRadio = members.some((member) => member._host.checked && !member._host.disabled);
24
- for (const member of members) {
25
- member._onSync(hasCheckedRadio);
26
- }
27
- }
28
- get _isCurrent() {
29
- return this._host.name === this._name && getRoot(this._host) === this._root;
30
- }
31
- get _group() {
32
- const entries = this._root
33
- ? Array.from(registry.get(this._root)?.get(this._name) ?? [])
34
- : [];
35
- const members = entries.filter((member) => member._isCurrent);
36
- return isEmpty(members)
37
- ? [this]
38
- : members.sort((a, b) => byDocumentOrder(a._host, b._host));
39
- }
40
- get members() {
41
- return this._group.map((member) => member._host);
42
- }
43
- constructor(host, onSync) {
44
- this._root = null;
45
- this._name = '';
46
- this._host = host;
47
- this._onSync = onSync;
48
- controllers.set(host, this);
49
- host.addController(this);
50
- }
51
- hostConnected() {
52
- this.updateMembership();
53
- }
54
- hostDisconnected() {
55
- this._unregister();
56
- }
57
- updateMembership() {
58
- const host = this._host;
59
- const root = host.isConnected ? getRoot(host) : null;
60
- const name = host.name || '';
61
- if (root === this._root && name === this._name) {
62
- return;
63
- }
64
- this._unregister();
65
- if (root && name) {
66
- this._root = root;
67
- this._name = name;
68
- groupOf(root, name).add(this);
69
- }
70
- this.sync();
71
- }
72
- sync() {
73
- RadioGroupController._sync(this._group);
74
- }
75
- _unregister() {
76
- const { _root: root, _name: name } = this;
77
- const names = root ? registry.get(root) : undefined;
78
- const group = names?.get(name);
79
- this._root = null;
80
- this._name = '';
81
- if (!group?.delete(this)) {
82
- return;
83
- }
84
- if (isEmpty(group)) {
85
- names?.delete(name);
86
- }
87
- else {
88
- RadioGroupController._sync(group);
89
- }
90
- }
91
- }
3
+ const radioGroups = createGroupRegistry({
4
+ keyOf: (radio) => radio.name || '',
5
+ scopeOf: (radio) => radio.form ?? getRoot(radio),
6
+ deriveState: (radios) => radios.some((radio) => radio.checked && !radio.disabled),
7
+ });
92
8
  export function addRadioGroupController(host, onSync) {
93
- return new RadioGroupController(host, onSync);
9
+ return radioGroups.attach(host, onSync);
94
10
  }
95
11
  export function getGroupMembers(member) {
96
- const controller = controllers.get(member);
97
- controller?.updateMembership();
98
- return controller?.members ?? [member];
12
+ return radioGroups.membersOf(member);
99
13
  }
100
14
  //# sourceMappingURL=controller.js.map