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,7 +11,7 @@ interface I18nControllerHost extends ReactiveControllerHost, HTMLElement {
11
11
  }
12
12
  type ResourceChangeCallback = (event: CustomEvent<IResourceChangeEventArgs>) => unknown;
13
13
  /** Configuration object for the I18nController. */
14
- type I18nControllerConfig<T extends object> = {
14
+ export type I18nControllerConfig<T extends object> = {
15
15
  /** The full default English resource strings object for the component. Should always come from igniteui-i18n-core. */
16
16
  defaultEN: T;
17
17
  /** @deprecated since 7.2.0. Optional name if component uses mixed resource strings. To be removed with deprecated resources. */
@@ -31,6 +31,8 @@ declare class I18nController<T extends object> implements ReactiveController {
31
31
  private readonly _resourceMapName?;
32
32
  private readonly _resourceChangeCallback?;
33
33
  private _locale?;
34
+ /** Resolved lazily, and again whenever the locale or the locale data changes. */
35
+ private _dateTimeFormats?;
34
36
  /** Cache of default resource strings coming from i18n Manager. */
35
37
  private _defaultResourceStrings;
36
38
  /** Collection containing only custom resource strings provided. Allows for partial override of resource strings. */
@@ -55,6 +57,13 @@ declare class I18nController<T extends object> implements ReactiveController {
55
57
  set resourceStrings(value: T | undefined);
56
58
  /** Get resolved resource strings for component */
57
59
  get resourceStrings(): T;
60
+ /** The locale-default format for displaying a date-time value. */
61
+ get localeDisplayFormat(): string;
62
+ /**
63
+ * The locale-default format for editing a date-time value - the display
64
+ * format with leading zeros forced, the shape a mask needs.
65
+ */
66
+ get localeInputFormat(): string;
58
67
  constructor(host: I18nControllerHost, config: I18nControllerConfig<T>);
59
68
  /** @internal */
60
69
  hostConnected(): void;
@@ -62,6 +71,11 @@ declare class I18nController<T extends object> implements ReactiveController {
62
71
  hostDisconnected(): void;
63
72
  /** @internal */
64
73
  handleEvent(event: CustomEvent<IResourceChangeEventArgs>): void;
74
+ /**
75
+ * Re-resolves the locale defaults and re-applies the custom overrides on top,
76
+ * so the merged strings never keep values resolved for a previous locale.
77
+ */
78
+ private _refreshResourceStrings;
65
79
  /**
66
80
  * Gets the current, locale-specific resource strings for the component.
67
81
  * The logic maps component keys (from defaultEN) to core library keys
@@ -70,10 +84,15 @@ declare class I18nController<T extends object> implements ReactiveController {
70
84
  * Result is truncated, containing only relevant locale strings.
71
85
  */
72
86
  private _getDefaultResourceStrings;
87
+ /**
88
+ * Deriving a format string from `Intl` is not free and the date editors
89
+ * consult these on every render, so they are cached against the resolved
90
+ * locale. A global resource change invalidates the cache, since the shared
91
+ * date formatter may have received new locale data.
92
+ */
93
+ private _getDateTimeFormats;
73
94
  private getMixedResourceStrings;
74
95
  }
75
- /** Returns the default date-time input format for a given locale */
76
- export declare function getDefaultDateTimeFormat(locale: string): string;
77
96
  /** Returns the date-time format string with the appropriate suffix if it's a predefined style */
78
97
  export declare function getDateTimeFormat(format?: string, suffix?: 'Date' | 'Time'): string | undefined;
79
98
  /**
@@ -4,7 +4,7 @@ class I18nController {
4
4
  set locale(value) {
5
5
  if (this._locale !== value) {
6
6
  this._locale = value;
7
- this._defaultResourceStrings = this._getDefaultResourceStrings();
7
+ this._refreshResourceStrings();
8
8
  this._host.requestUpdate();
9
9
  }
10
10
  }
@@ -29,6 +29,12 @@ class I18nController {
29
29
  get resourceStrings() {
30
30
  return this._resourceStrings ?? this._defaultResourceStrings;
31
31
  }
32
+ get localeDisplayFormat() {
33
+ return this._getDateTimeFormats().display;
34
+ }
35
+ get localeInputFormat() {
36
+ return this._getDateTimeFormats().input;
37
+ }
32
38
  constructor(host, config) {
33
39
  this._host = host;
34
40
  this._defaultEN = config.defaultEN;
@@ -40,17 +46,24 @@ class I18nController {
40
46
  }
41
47
  hostConnected() {
42
48
  getI18nManager().addEventListener('onResourceChange', this);
49
+ this._dateTimeFormats = undefined;
50
+ this._refreshResourceStrings();
51
+ this._host.requestUpdate();
43
52
  }
44
53
  hostDisconnected() {
45
54
  getI18nManager().removeEventListener('onResourceChange', this);
46
55
  }
47
56
  handleEvent(event) {
57
+ this._dateTimeFormats = undefined;
58
+ this._refreshResourceStrings();
59
+ this._resourceChangeCallback?.call(this._host, event);
60
+ this._host.requestUpdate();
61
+ }
62
+ _refreshResourceStrings() {
48
63
  this._defaultResourceStrings = this._getDefaultResourceStrings();
49
64
  if (this._customResourceStrings) {
50
65
  this._resourceStrings = Object.assign({}, this._defaultResourceStrings, this._customResourceStrings);
51
66
  }
52
- this._resourceChangeCallback?.call(this._host, event);
53
- this._host.requestUpdate();
54
67
  }
55
68
  _getDefaultResourceStrings() {
56
69
  const coreResourceStrings = getI18nManager().getCurrentResourceStrings(this.locale);
@@ -65,6 +78,18 @@ class I18nController {
65
78
  }
66
79
  return this.getMixedResourceStrings(normalizedResourceStrings);
67
80
  }
81
+ _getDateTimeFormats() {
82
+ const locale = this.locale;
83
+ if (this._dateTimeFormats?.locale !== locale) {
84
+ const formatter = getDateFormatter();
85
+ this._dateTimeFormats = {
86
+ locale,
87
+ display: formatter.getLocaleDateTimeFormat(locale),
88
+ input: formatter.getLocaleDateTimeFormat(locale, true),
89
+ };
90
+ }
91
+ return this._dateTimeFormats;
92
+ }
68
93
  getMixedResourceStrings(value) {
69
94
  if (this._resourceMapName) {
70
95
  return Object.assign({}, convertToCoreResource(value, this._resourceMapName), convertToIgcResource(value, this._resourceMapName));
@@ -76,9 +101,6 @@ const DATE_TIME_STYLES = new Set(['short', 'long', 'medium', 'full']);
76
101
  function extractStyle(format, suffix) {
77
102
  return format.toLowerCase().split(suffix)[0];
78
103
  }
79
- export function getDefaultDateTimeFormat(locale) {
80
- return getDateFormatter().getLocaleDateTimeFormat(locale, true);
81
- }
82
104
  export function getDateTimeFormat(format, suffix = 'Date') {
83
105
  return format && DATE_TIME_STYLES.has(format) ? `${format}${suffix}` : format;
84
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-controller.js","sourceRoot":"","sources":["../../../src/internals/i18n/i18n-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getCurrentI18n,\n getDateFormatter,\n getI18nManager,\n type IResourceChangeEventArgs,\n type IResourceStrings,\n} from 'igniteui-i18n-core';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport {\n convertToCoreResource,\n convertToIgcResource,\n type I18nResourceMapNames,\n} from './utils.js';\n\n/**\n * Defines the structure for the host element that will use this controller.\n * The host must be a Lit element (ReactiveControllerHost) and an HTMLElement.\n */\ninterface I18nControllerHost extends ReactiveControllerHost, HTMLElement {\n // Properties the host is expected to have/use, though they are managed by the controller.\n resourceStrings?: unknown;\n locale?: string;\n}\n\ntype ResourceChangeCallback = (\n event: CustomEvent<IResourceChangeEventArgs>\n) => unknown;\n\n/** Configuration object for the I18nController. */\ntype I18nControllerConfig<T extends object> = {\n /** The full default English resource strings object for the component. Should always come from igniteui-i18n-core. */\n defaultEN: T;\n /** @deprecated since 7.2.0. Optional name if component uses mixed resource strings. To be removed with deprecated resources. */\n resourceMapName?: I18nResourceMapNames;\n /** An optional callback to execute when the global locale changes. */\n onResourceChange?: ResourceChangeCallback;\n};\n\n/**\n * Manages localization (i18n) for a Lit web component.\n * It handles the current locale, component-specific resource overrides,\n * and updates when the global localization state changes.\n */\nclass I18nController<T extends object> implements ReactiveController {\n //#region Internal properties and state\n\n private readonly _host: I18nControllerHost;\n private readonly _defaultEN: T;\n /** @deprecated since 7.2.0. Resource name to use when converting new to old and vice versa resource objects. */\n private readonly _resourceMapName?: I18nResourceMapNames;\n private readonly _resourceChangeCallback?: ResourceChangeCallback;\n\n private _locale?: string;\n /** Cache of default resource strings coming from i18n Manager. */\n private _defaultResourceStrings: T;\n /** Collection containing only custom resource strings provided. Allows for partial override of resource strings. */\n private _customResourceStrings?: T;\n /** Merged collection of custom resource strings and default resource strings. */\n private _resourceStrings?: T;\n\n //#endregion\n\n //#region Public properties\n\n /**\n * Sets a custom locale that overrides the global one for this host component instance.\n * Setting a new locale triggers an update of the resource strings.\n */\n public set locale(value: string | undefined) {\n if (this._locale !== value) {\n this._locale = value;\n this._defaultResourceStrings = this._getDefaultResourceStrings();\n this._host.requestUpdate();\n }\n }\n\n /**\n * Gets the resolved locale for the host component.\n * This is the component's custom locale if set, otherwise it falls back to the\n * global locale.\n */\n public get locale(): string {\n return this._locale ?? getCurrentI18n();\n }\n\n /**\n * Sets custom resource string for component with this controller.\n * Gets the resolved resource string for component.\n */\n public set resourceStrings(value: T | undefined) {\n if (this._resourceStrings !== value) {\n if (value) {\n this._customResourceStrings = this._resourceMapName\n ? this.getMixedResourceStrings(value)\n : value;\n this._resourceStrings = Object.assign(\n {},\n this._defaultResourceStrings,\n this._customResourceStrings\n );\n } else {\n this._customResourceStrings = value;\n this._resourceStrings = value;\n }\n\n this._host.requestUpdate();\n }\n }\n\n /** Get resolved resource strings for component */\n public get resourceStrings(): T {\n return this._resourceStrings ?? this._defaultResourceStrings;\n }\n\n //#endregion\n\n //#region Life-cycle hooks and event listener\n\n constructor(host: I18nControllerHost, config: I18nControllerConfig<T>) {\n this._host = host;\n this._defaultEN = config.defaultEN;\n this._resourceMapName = config.resourceMapName;\n this._resourceChangeCallback = config.onResourceChange;\n\n this._defaultResourceStrings = this._getDefaultResourceStrings();\n getI18nManager().registerI18n(\n this._defaultEN,\n getI18nManager().defaultLocale\n );\n\n this._host.addController(this);\n }\n\n /** @internal */\n public hostConnected(): void {\n getI18nManager().addEventListener('onResourceChange', this);\n }\n\n /** @internal */\n public hostDisconnected(): void {\n getI18nManager().removeEventListener('onResourceChange', this);\n }\n\n /** @internal */\n public handleEvent(event: CustomEvent<IResourceChangeEventArgs>): void {\n this._defaultResourceStrings = this._getDefaultResourceStrings();\n if (this._customResourceStrings) {\n this._resourceStrings = Object.assign(\n {},\n this._defaultResourceStrings,\n this._customResourceStrings\n );\n }\n this._resourceChangeCallback?.call(this._host, event);\n this._host.requestUpdate();\n }\n\n //#endregion\n\n //#region Internal API\n\n /**\n * Gets the current, locale-specific resource strings for the component.\n * The logic maps component keys (from defaultEN) to core library keys\n * and retrieves the localized string from the i18n manager.\n *\n * Result is truncated, containing only relevant locale strings.\n */\n private _getDefaultResourceStrings(): T {\n const coreResourceStrings = getI18nManager().getCurrentResourceStrings(\n this.locale\n );\n\n // Get all related resources to the component, based on the default resources.\n const normalizedResourceStrings: T = {} as T;\n const defaultComponentKeys = Object.keys(this._defaultEN) as (keyof T)[];\n for (const key of defaultComponentKeys) {\n let resolvedValue: T[keyof T] = this._defaultEN[key];\n if (key in coreResourceStrings) {\n // For a mix of old and core resources.\n // Only for internal default resources. Users shouldn't mix them.\n resolvedValue = coreResourceStrings[\n key as keyof IResourceStrings\n ] as T[keyof T];\n }\n\n normalizedResourceStrings[key] = resolvedValue;\n }\n\n return this.getMixedResourceStrings(normalizedResourceStrings);\n }\n\n private getMixedResourceStrings(value: T): T {\n if (this._resourceMapName) {\n return Object.assign(\n {},\n convertToCoreResource(value, this._resourceMapName),\n convertToIgcResource(value, this._resourceMapName)\n ) as T;\n }\n return value;\n }\n\n //#endregion\n}\n\n/**\n * Formats a date for display based on the specified format and locale.\n */\ntype DateTimeStyle = 'short' | 'long' | 'medium' | 'full';\n\nconst DATE_TIME_STYLES = new Set<string>(['short', 'long', 'medium', 'full']);\n\nfunction extractStyle(format: string, suffix: string): DateTimeStyle {\n return format.toLowerCase().split(suffix)[0] as DateTimeStyle;\n}\n\n/** Returns the default date-time input format for a given locale */\nexport function getDefaultDateTimeFormat(locale: string): string {\n return getDateFormatter().getLocaleDateTimeFormat(locale, true);\n}\n\n/** Returns the date-time format string with the appropriate suffix if it's a predefined style */\nexport function getDateTimeFormat(\n format?: string,\n suffix: 'Date' | 'Time' = 'Date'\n): string | undefined {\n return format && DATE_TIME_STYLES.has(format) ? `${format}${suffix}` : format;\n}\n\n/**\n * Formats a date for display using the specified format.\n */\nexport function formatDisplayDate(\n value: Date,\n locale: string,\n displayFormat?: string\n): string {\n if (!displayFormat) {\n return getDateFormatter().formatDateTime(value, locale, {});\n }\n\n // Full date+time styles (short, long, medium, full)\n if (DATE_TIME_STYLES.has(displayFormat)) {\n const style = displayFormat as DateTimeStyle;\n return getDateFormatter().formatDateTime(value, locale, {\n dateStyle: style,\n timeStyle: style,\n });\n }\n\n // Date-only styles (shortDate, longDate, etc.)\n if (displayFormat.endsWith('Date')) {\n return getDateFormatter().formatDateTime(value, locale, {\n dateStyle: extractStyle(displayFormat, 'date'),\n });\n }\n\n // Time-only styles (shortTime, longTime, etc.)\n if (displayFormat.endsWith('Time')) {\n return getDateFormatter().formatDateTime(value, locale, {\n timeStyle: extractStyle(displayFormat, 'time'),\n });\n }\n\n // Custom format string\n return getDateFormatter().formatDateCustomFormat(value, displayFormat, {\n locale,\n });\n}\n\n/** Factory function to create and attach the I18nController to a host. */\nexport function addI18nController<T extends object>(\n host: I18nControllerHost,\n config: I18nControllerConfig<T>\n): I18nController<T> {\n return new I18nController<T>(host, config);\n}\n\nexport type { I18nController };\n"]}
1
+ {"version":3,"file":"i18n-controller.js","sourceRoot":"","sources":["../../../src/internals/i18n/i18n-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getCurrentI18n,\n getDateFormatter,\n getI18nManager,\n type IResourceChangeEventArgs,\n type IResourceStrings,\n} from 'igniteui-i18n-core';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport {\n convertToCoreResource,\n convertToIgcResource,\n type I18nResourceMapNames,\n} from './utils.js';\n\n/**\n * Defines the structure for the host element that will use this controller.\n * The host must be a Lit element (ReactiveControllerHost) and an HTMLElement.\n */\ninterface I18nControllerHost extends ReactiveControllerHost, HTMLElement {\n // Properties the host is expected to have/use, though they are managed by the controller.\n resourceStrings?: unknown;\n locale?: string;\n}\n\ntype ResourceChangeCallback = (\n event: CustomEvent<IResourceChangeEventArgs>\n) => unknown;\n\n/** The date-time formats a locale resolves to, cached against that locale. */\ntype LocaleDateTimeFormats = {\n locale: string;\n display: string;\n input: string;\n};\n\n/** Configuration object for the I18nController. */\nexport type I18nControllerConfig<T extends object> = {\n /** The full default English resource strings object for the component. Should always come from igniteui-i18n-core. */\n defaultEN: T;\n /** @deprecated since 7.2.0. Optional name if component uses mixed resource strings. To be removed with deprecated resources. */\n resourceMapName?: I18nResourceMapNames;\n /** An optional callback to execute when the global locale changes. */\n onResourceChange?: ResourceChangeCallback;\n};\n\n/**\n * Manages localization (i18n) for a Lit web component.\n * It handles the current locale, component-specific resource overrides,\n * and updates when the global localization state changes.\n */\nclass I18nController<T extends object> implements ReactiveController {\n //#region Internal properties and state\n\n private readonly _host: I18nControllerHost;\n private readonly _defaultEN: T;\n /** @deprecated since 7.2.0. Resource name to use when converting new to old and vice versa resource objects. */\n private readonly _resourceMapName?: I18nResourceMapNames;\n private readonly _resourceChangeCallback?: ResourceChangeCallback;\n\n private _locale?: string;\n /** Resolved lazily, and again whenever the locale or the locale data changes. */\n private _dateTimeFormats?: LocaleDateTimeFormats;\n /** Cache of default resource strings coming from i18n Manager. */\n private _defaultResourceStrings: T;\n /** Collection containing only custom resource strings provided. Allows for partial override of resource strings. */\n private _customResourceStrings?: T;\n /** Merged collection of custom resource strings and default resource strings. */\n private _resourceStrings?: T;\n\n //#endregion\n\n //#region Public properties\n\n /**\n * Sets a custom locale that overrides the global one for this host component instance.\n * Setting a new locale triggers an update of the resource strings.\n */\n public set locale(value: string | undefined) {\n if (this._locale !== value) {\n this._locale = value;\n this._refreshResourceStrings();\n this._host.requestUpdate();\n }\n }\n\n /**\n * Gets the resolved locale for the host component.\n * This is the component's custom locale if set, otherwise it falls back to the\n * global locale.\n */\n public get locale(): string {\n return this._locale ?? getCurrentI18n();\n }\n\n /**\n * Sets custom resource string for component with this controller.\n * Gets the resolved resource string for component.\n */\n public set resourceStrings(value: T | undefined) {\n if (this._resourceStrings !== value) {\n if (value) {\n this._customResourceStrings = this._resourceMapName\n ? this.getMixedResourceStrings(value)\n : value;\n this._resourceStrings = Object.assign(\n {},\n this._defaultResourceStrings,\n this._customResourceStrings\n );\n } else {\n this._customResourceStrings = value;\n this._resourceStrings = value;\n }\n\n this._host.requestUpdate();\n }\n }\n\n /** Get resolved resource strings for component */\n public get resourceStrings(): T {\n return this._resourceStrings ?? this._defaultResourceStrings;\n }\n\n /** The locale-default format for displaying a date-time value. */\n public get localeDisplayFormat(): string {\n return this._getDateTimeFormats().display;\n }\n\n /**\n * The locale-default format for editing a date-time value - the display\n * format with leading zeros forced, the shape a mask needs.\n */\n public get localeInputFormat(): string {\n return this._getDateTimeFormats().input;\n }\n\n //#endregion\n\n //#region Life-cycle hooks and event listener\n\n constructor(host: I18nControllerHost, config: I18nControllerConfig<T>) {\n this._host = host;\n this._defaultEN = config.defaultEN;\n this._resourceMapName = config.resourceMapName;\n this._resourceChangeCallback = config.onResourceChange;\n\n this._defaultResourceStrings = this._getDefaultResourceStrings();\n getI18nManager().registerI18n(\n this._defaultEN,\n getI18nManager().defaultLocale\n );\n\n this._host.addController(this);\n }\n\n /** @internal */\n public hostConnected(): void {\n getI18nManager().addEventListener('onResourceChange', this);\n\n // A global change while detached went unheard, so the resolved state can\n // be one of a locale that is no longer current.\n this._dateTimeFormats = undefined;\n this._refreshResourceStrings();\n this._host.requestUpdate();\n }\n\n /** @internal */\n public hostDisconnected(): void {\n getI18nManager().removeEventListener('onResourceChange', this);\n }\n\n /** @internal */\n public handleEvent(event: CustomEvent<IResourceChangeEventArgs>): void {\n this._dateTimeFormats = undefined;\n this._refreshResourceStrings();\n this._resourceChangeCallback?.call(this._host, event);\n this._host.requestUpdate();\n }\n\n //#endregion\n\n //#region Internal API\n\n /**\n * Re-resolves the locale defaults and re-applies the custom overrides on top,\n * so the merged strings never keep values resolved for a previous locale.\n */\n private _refreshResourceStrings(): void {\n this._defaultResourceStrings = this._getDefaultResourceStrings();\n\n if (this._customResourceStrings) {\n this._resourceStrings = Object.assign(\n {},\n this._defaultResourceStrings,\n this._customResourceStrings\n );\n }\n }\n\n /**\n * Gets the current, locale-specific resource strings for the component.\n * The logic maps component keys (from defaultEN) to core library keys\n * and retrieves the localized string from the i18n manager.\n *\n * Result is truncated, containing only relevant locale strings.\n */\n private _getDefaultResourceStrings(): T {\n const coreResourceStrings = getI18nManager().getCurrentResourceStrings(\n this.locale\n );\n\n // Get all related resources to the component, based on the default resources.\n const normalizedResourceStrings: T = {} as T;\n const defaultComponentKeys = Object.keys(this._defaultEN) as (keyof T)[];\n for (const key of defaultComponentKeys) {\n let resolvedValue: T[keyof T] = this._defaultEN[key];\n if (key in coreResourceStrings) {\n // For a mix of old and core resources.\n // Only for internal default resources. Users shouldn't mix them.\n resolvedValue = coreResourceStrings[\n key as keyof IResourceStrings\n ] as T[keyof T];\n }\n\n normalizedResourceStrings[key] = resolvedValue;\n }\n\n return this.getMixedResourceStrings(normalizedResourceStrings);\n }\n\n /**\n * Deriving a format string from `Intl` is not free and the date editors\n * consult these on every render, so they are cached against the resolved\n * locale. A global resource change invalidates the cache, since the shared\n * date formatter may have received new locale data.\n */\n private _getDateTimeFormats(): LocaleDateTimeFormats {\n const locale = this.locale;\n\n if (this._dateTimeFormats?.locale !== locale) {\n const formatter = getDateFormatter();\n this._dateTimeFormats = {\n locale,\n display: formatter.getLocaleDateTimeFormat(locale),\n input: formatter.getLocaleDateTimeFormat(locale, true),\n };\n }\n\n return this._dateTimeFormats;\n }\n\n private getMixedResourceStrings(value: T): T {\n if (this._resourceMapName) {\n return Object.assign(\n {},\n convertToCoreResource(value, this._resourceMapName),\n convertToIgcResource(value, this._resourceMapName)\n ) as T;\n }\n return value;\n }\n\n //#endregion\n}\n\n/**\n * Formats a date for display based on the specified format and locale.\n */\ntype DateTimeStyle = 'short' | 'long' | 'medium' | 'full';\n\nconst DATE_TIME_STYLES = new Set<string>(['short', 'long', 'medium', 'full']);\n\nfunction extractStyle(format: string, suffix: string): DateTimeStyle {\n return format.toLowerCase().split(suffix)[0] as DateTimeStyle;\n}\n\n/** Returns the date-time format string with the appropriate suffix if it's a predefined style */\nexport function getDateTimeFormat(\n format?: string,\n suffix: 'Date' | 'Time' = 'Date'\n): string | undefined {\n return format && DATE_TIME_STYLES.has(format) ? `${format}${suffix}` : format;\n}\n\n/**\n * Formats a date for display using the specified format.\n */\nexport function formatDisplayDate(\n value: Date,\n locale: string,\n displayFormat?: string\n): string {\n if (!displayFormat) {\n return getDateFormatter().formatDateTime(value, locale, {});\n }\n\n // Full date+time styles (short, long, medium, full)\n if (DATE_TIME_STYLES.has(displayFormat)) {\n const style = displayFormat as DateTimeStyle;\n return getDateFormatter().formatDateTime(value, locale, {\n dateStyle: style,\n timeStyle: style,\n });\n }\n\n // Date-only styles (shortDate, longDate, etc.)\n if (displayFormat.endsWith('Date')) {\n return getDateFormatter().formatDateTime(value, locale, {\n dateStyle: extractStyle(displayFormat, 'date'),\n });\n }\n\n // Time-only styles (shortTime, longTime, etc.)\n if (displayFormat.endsWith('Time')) {\n return getDateFormatter().formatDateTime(value, locale, {\n timeStyle: extractStyle(displayFormat, 'time'),\n });\n }\n\n // Custom format string\n return getDateFormatter().formatDateCustomFormat(value, displayFormat, {\n locale,\n });\n}\n\n/** Factory function to create and attach the I18nController to a host. */\nexport function addI18nController<T extends object>(\n host: I18nControllerHost,\n config: I18nControllerConfig<T>\n): I18nController<T> {\n return new I18nController<T>(host, config);\n}\n\nexport type { I18nController };\n"]}
@@ -2,7 +2,7 @@ import { LitElement, type PropertyValues } from 'lit';
2
2
  import type { AbsolutePosition, NotificationPositioning } from '../../components/types.js';
3
3
  export declare abstract class IgcBaseAlertLikeComponent extends LitElement {
4
4
  protected readonly _player: import("#animations/player.js").AnimationController;
5
- protected _autoHideTimeout?: ReturnType<typeof setTimeout>;
5
+ private readonly _autoHideTimer;
6
6
  /**
7
7
  * Whether the component is in shown state.
8
8
  *
@@ -10,11 +10,13 @@ import { addAnimationController } from '#animations/player.js';
10
10
  import { fadeIn, fadeOut } from '#animations/presets/fade/index.js';
11
11
  import { addCommandController } from '../controllers/command.js';
12
12
  import { addInternalsController } from '../controllers/internals.js';
13
+ import { createTimer } from '../timing.js';
13
14
  import { getVisibleAncestor, isPopoverOpen } from '../utils/dom.js';
14
15
  export class IgcBaseAlertLikeComponent extends LitElement {
15
16
  constructor() {
16
17
  super();
17
18
  this._player = addAnimationController(this);
19
+ this._autoHideTimer = createTimer(() => this.hide());
18
20
  this.open = false;
19
21
  this.displayTime = 4000;
20
22
  this.keepOpen = false;
@@ -78,16 +80,16 @@ export class IgcBaseAlertLikeComponent extends LitElement {
78
80
  this._setAutoHideTimer();
79
81
  return state;
80
82
  }
81
- clearTimeout(this._autoHideTimeout);
83
+ this._autoHideTimer.stop();
82
84
  const state = await this._player.playExclusive(fadeOut());
83
85
  this.hidePopover();
84
86
  this.open = false;
85
87
  return state;
86
88
  }
87
89
  _setAutoHideTimer() {
88
- clearTimeout(this._autoHideTimeout);
90
+ this._autoHideTimer.stop();
89
91
  if (this.open && this.displayTime > 0 && !this.keepOpen) {
90
- this._autoHideTimeout = setTimeout(() => this.hide(), this.displayTime);
92
+ this._autoHideTimer.start(this.displayTime);
91
93
  }
92
94
  }
93
95
  async show() {
@@ -1 +1 @@
1
- {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/internals/mixins/alert.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { addAnimationController } from '#animations/player.js';\nimport { fadeIn, fadeOut } from '#animations/presets/fade/index.js';\nimport type {\n AbsolutePosition,\n NotificationPositioning,\n} from '../../components/types.js';\nimport { addCommandController } from '../controllers/command.js';\nimport { addInternalsController } from '../controllers/internals.js';\nimport { getVisibleAncestor, isPopoverOpen } from '../utils/dom.js';\n\n/* omitModule */\nexport abstract class IgcBaseAlertLikeComponent extends LitElement {\n protected readonly _player = addAnimationController(this);\n\n protected _autoHideTimeout?: ReturnType<typeof setTimeout>;\n\n /**\n * Whether the component is in shown state.\n *\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Determines the duration in milliseconds in which the component will be visible.\n *\n * @attr display-time\n * @default 4000\n */\n @property({ type: Number, attribute: 'display-time' })\n public displayTime = 4000;\n\n /**\n * Determines whether the component should close after the `displayTime` is over.\n *\n * @attr keep-open\n * @default false\n */\n @property({ type: Boolean, reflect: true, attribute: 'keep-open' })\n public keepOpen = false;\n\n /**\n * Sets the position of the component in the viewport.\n *\n * `bottom` - positions the component at the bottom. This is the default.\n * `middle` - positions the component at the center.\n * `top` - positions the component at the top.\n *\n * @attr position\n * @default 'bottom'\n */\n @property({ reflect: true })\n public position: AbsolutePosition = 'bottom';\n\n /**\n * Sets the positioning strategy of the component.\n *\n * `viewport` - positions the component relative to the viewport, ignoring any ancestor elements. This is the default behavior.\n * `container` - positions the component relative to the nearest visible ancestor. In this mode, the component will be constrained within the bounding box of the ancestor and will be positioned according to the `position` attribute.\n *\n * @attr positioning\n * @default 'viewport'\n */\n @property({ reflect: true })\n public positioning: NotificationPositioning = 'viewport';\n\n constructor() {\n super();\n\n addCommandController(this)\n .set('--show', this.show)\n .set('--hide', this.hide)\n .set('--toggle', this.toggle);\n\n addInternalsController(this, {\n initialARIA: {\n role: 'status',\n ariaLive: 'polite',\n },\n });\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.popover = 'manual';\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('open')) {\n if (this.open && !isPopoverOpen(this)) {\n this._showPopover();\n } else if (!this.open && isPopoverOpen(this)) {\n this.hidePopover();\n }\n }\n\n if (this.open && (props.has('positioning') || props.has('position'))) {\n this.hidePopover();\n this._showPopover();\n }\n\n if (\n props.has('open') ||\n props.has('displayTime') ||\n props.has('keepOpen')\n ) {\n this._setAutoHideTimer();\n }\n\n super.update(props);\n }\n\n private _showPopover(): boolean {\n if (this.positioning !== 'container') {\n this.showPopover();\n return true;\n }\n\n const visibleAncestor = getVisibleAncestor(this);\n if (!visibleAncestor) {\n return false;\n }\n\n this.showPopover({ source: visibleAncestor });\n return true;\n }\n\n private async _setOpenState(open: boolean): Promise<boolean> {\n if (open) {\n this.open = true;\n\n if (!this._showPopover()) {\n this.open = false;\n return false;\n }\n\n const state = await this._player.playExclusive(fadeIn());\n this._setAutoHideTimer();\n return state;\n }\n\n clearTimeout(this._autoHideTimeout);\n const state = await this._player.playExclusive(fadeOut());\n this.hidePopover();\n this.open = false;\n return state;\n }\n\n private _setAutoHideTimer(): void {\n clearTimeout(this._autoHideTimeout);\n if (this.open && this.displayTime > 0 && !this.keepOpen) {\n this._autoHideTimeout = setTimeout(() => this.hide(), this.displayTime);\n }\n }\n\n /**\n * Opens the component.\n *\n * Returns a promise that resolves to `true` if the component was successfully opened, or `false`\n * if it was already open or could not be shown (e.g., in `container` positioning mode with no visible ancestors).\n */\n public async show(): Promise<boolean> {\n return this.open ? false : this._setOpenState(true);\n }\n\n /**\n * Closes the component.\n *\n * Returns a promise that resolves to `true` if the component was successfully closed, or `false`\n * if it was already closed.\n */\n public async hide(): Promise<boolean> {\n return this.open ? this._setOpenState(false) : false;\n }\n\n /**\n * Toggles the open state of the component.\n *\n * Returns a promise that resolves to `true` if the operation completed successfully, or `false`\n * if it was already in the desired state.\n */\n public async toggle(): Promise<boolean> {\n return this.open ? this.hide() : this.show();\n }\n}\n"]}
1
+ {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/internals/mixins/alert.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { addAnimationController } from '#animations/player.js';\nimport { fadeIn, fadeOut } from '#animations/presets/fade/index.js';\nimport type {\n AbsolutePosition,\n NotificationPositioning,\n} from '../../components/types.js';\nimport { addCommandController } from '../controllers/command.js';\nimport { addInternalsController } from '../controllers/internals.js';\nimport { createTimer } from '../timing.js';\nimport { getVisibleAncestor, isPopoverOpen } from '../utils/dom.js';\n\n/* omitModule */\nexport abstract class IgcBaseAlertLikeComponent extends LitElement {\n protected readonly _player = addAnimationController(this);\n\n private readonly _autoHideTimer = createTimer(() => this.hide());\n\n /**\n * Whether the component is in shown state.\n *\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n /**\n * Determines the duration in milliseconds in which the component will be visible.\n *\n * @attr display-time\n * @default 4000\n */\n @property({ type: Number, attribute: 'display-time' })\n public displayTime = 4000;\n\n /**\n * Determines whether the component should close after the `displayTime` is over.\n *\n * @attr keep-open\n * @default false\n */\n @property({ type: Boolean, reflect: true, attribute: 'keep-open' })\n public keepOpen = false;\n\n /**\n * Sets the position of the component in the viewport.\n *\n * `bottom` - positions the component at the bottom. This is the default.\n * `middle` - positions the component at the center.\n * `top` - positions the component at the top.\n *\n * @attr position\n * @default 'bottom'\n */\n @property({ reflect: true })\n public position: AbsolutePosition = 'bottom';\n\n /**\n * Sets the positioning strategy of the component.\n *\n * `viewport` - positions the component relative to the viewport, ignoring any ancestor elements. This is the default behavior.\n * `container` - positions the component relative to the nearest visible ancestor. In this mode, the component will be constrained within the bounding box of the ancestor and will be positioned according to the `position` attribute.\n *\n * @attr positioning\n * @default 'viewport'\n */\n @property({ reflect: true })\n public positioning: NotificationPositioning = 'viewport';\n\n constructor() {\n super();\n\n addCommandController(this)\n .set('--show', this.show)\n .set('--hide', this.hide)\n .set('--toggle', this.toggle);\n\n addInternalsController(this, {\n initialARIA: {\n role: 'status',\n ariaLive: 'polite',\n },\n });\n }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n this.popover = 'manual';\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('open')) {\n if (this.open && !isPopoverOpen(this)) {\n this._showPopover();\n } else if (!this.open && isPopoverOpen(this)) {\n this.hidePopover();\n }\n }\n\n if (this.open && (props.has('positioning') || props.has('position'))) {\n this.hidePopover();\n this._showPopover();\n }\n\n if (\n props.has('open') ||\n props.has('displayTime') ||\n props.has('keepOpen')\n ) {\n this._setAutoHideTimer();\n }\n\n super.update(props);\n }\n\n private _showPopover(): boolean {\n if (this.positioning !== 'container') {\n this.showPopover();\n return true;\n }\n\n const visibleAncestor = getVisibleAncestor(this);\n if (!visibleAncestor) {\n return false;\n }\n\n this.showPopover({ source: visibleAncestor });\n return true;\n }\n\n private async _setOpenState(open: boolean): Promise<boolean> {\n if (open) {\n this.open = true;\n\n if (!this._showPopover()) {\n this.open = false;\n return false;\n }\n\n const state = await this._player.playExclusive(fadeIn());\n this._setAutoHideTimer();\n return state;\n }\n\n this._autoHideTimer.stop();\n const state = await this._player.playExclusive(fadeOut());\n this.hidePopover();\n this.open = false;\n return state;\n }\n\n private _setAutoHideTimer(): void {\n this._autoHideTimer.stop();\n if (this.open && this.displayTime > 0 && !this.keepOpen) {\n this._autoHideTimer.start(this.displayTime);\n }\n }\n\n /**\n * Opens the component.\n *\n * Returns a promise that resolves to `true` if the component was successfully opened, or `false`\n * if it was already open or could not be shown (e.g., in `container` positioning mode with no visible ancestors).\n */\n public async show(): Promise<boolean> {\n return this.open ? false : this._setOpenState(true);\n }\n\n /**\n * Closes the component.\n *\n * Returns a promise that resolves to `true` if the component was successfully closed, or `false`\n * if it was already closed.\n */\n public async hide(): Promise<boolean> {\n return this.open ? this._setOpenState(false) : false;\n }\n\n /**\n * Toggles the open state of the component.\n *\n * Returns a promise that resolves to `true` if the operation completed successfully, or `false`\n * if it was already in the desired state.\n */\n public async toggle(): Promise<boolean> {\n return this.open ? this.hide() : this.show();\n }\n}\n"]}
@@ -1,25 +1,17 @@
1
1
  import { LitElement } from 'lit';
2
2
  import type { RootClickController } from '../controllers/root-click.js';
3
+ import { type ToggleEventMap } from '../controllers/toggle.js';
3
4
  import type { UnpackCustomEvent } from './event-emitter.js';
4
- interface IgcBaseComboBoxEventMap {
5
- igcOpening: CustomEvent<void>;
6
- igcOpened: CustomEvent<void>;
7
- igcClosing: CustomEvent<void>;
8
- igcClosed: CustomEvent<void>;
9
- }
10
5
  export declare abstract class IgcBaseComboBoxComponent extends LitElement {
11
- emitEvent: <K extends keyof IgcBaseComboBoxEventMap, D extends UnpackCustomEvent<IgcBaseComboBoxEventMap[K]>>(event: K, eventInitDict?: CustomEventInit<D>) => boolean;
6
+ emitEvent: <K extends keyof ToggleEventMap, D extends UnpackCustomEvent<ToggleEventMap[K]>>(event: K, eventInitDict?: CustomEventInit<D>) => boolean;
12
7
  protected abstract _rootClickController: RootClickController;
8
+ private readonly _toggleController;
13
9
  /**
14
10
  * Sets the open state of the component.
15
11
  * @attr open
16
12
  * @default false
17
13
  */
18
14
  open: boolean;
19
- protected _emitClosing(): boolean;
20
- protected _emitClosed(): boolean;
21
- protected _emitOpening(): boolean;
22
- protected _emitOpened(): boolean;
23
15
  protected _handleAnchorClick(): void;
24
16
  protected _hide(emitEvent?: boolean): Promise<boolean>;
25
17
  protected _show(emitEvent?: boolean): Promise<boolean>;
@@ -65,4 +57,3 @@ export declare function getPreviousActiveItem<T extends HTMLElement & {
65
57
  export declare function setInitialSelectionState<T extends HTMLElement & {
66
58
  selected: boolean;
67
59
  }>(items: T[]): T | null;
68
- export {};
@@ -6,49 +6,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { LitElement } from 'lit';
8
8
  import { property } from 'lit/decorators.js';
9
+ import { addToggleController, } from '../controllers/toggle.js';
9
10
  import { lastOf } from '../utils/arrays.js';
10
11
  import { iterNodes } from '../utils/dom.js';
11
12
  export class IgcBaseComboBoxComponent extends LitElement {
12
13
  constructor() {
13
14
  super(...arguments);
15
+ this._toggleController = addToggleController(this);
14
16
  this.open = false;
15
17
  }
16
- _emitClosing() {
17
- return this.emitEvent('igcClosing', { cancelable: true });
18
- }
19
- _emitClosed() {
20
- return this.emitEvent('igcClosed');
21
- }
22
- _emitOpening() {
23
- return this.emitEvent('igcOpening', { cancelable: true });
24
- }
25
- _emitOpened() {
26
- return this.emitEvent('igcOpened');
27
- }
28
18
  _handleAnchorClick() {
29
19
  this.open ? this._hide(true) : this._show(true);
30
20
  }
31
- async _hide(emitEvent = false) {
32
- if (!this.open || (emitEvent && !this._emitClosing())) {
33
- return false;
34
- }
35
- this.open = false;
36
- if (emitEvent) {
37
- await this.updateComplete;
38
- this._emitClosed();
39
- }
40
- return true;
21
+ _hide(emitEvent = false) {
22
+ return this._toggleController.hide(emitEvent);
41
23
  }
42
- async _show(emitEvent = false) {
43
- if (this.open || (emitEvent && !this._emitOpening())) {
44
- return false;
45
- }
46
- this.open = true;
47
- if (emitEvent) {
48
- await this.updateComplete;
49
- this._emitOpened();
50
- }
51
- return true;
24
+ _show(emitEvent = false) {
25
+ return this._toggleController.show(emitEvent);
52
26
  }
53
27
  async show() {
54
28
  return this._show();
@@ -1 +1 @@
1
- {"version":3,"file":"combo-box.js","sourceRoot":"","sources":["../../../src/internals/mixins/combo-box.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { RootClickController } from '../controllers/root-click.js';\nimport { lastOf } from '../utils/arrays.js';\nimport { iterNodes } from '../utils/dom.js';\nimport type { UnpackCustomEvent } from './event-emitter.js';\n\ninterface IgcBaseComboBoxEventMap {\n igcOpening: CustomEvent<void>;\n igcOpened: CustomEvent<void>;\n igcClosing: CustomEvent<void>;\n igcClosed: CustomEvent<void>;\n}\n\n/* blazorIndirectRender */\n/* omitModule */\nexport abstract class IgcBaseComboBoxComponent extends LitElement {\n /* blazorSuppress */\n declare public emitEvent: <\n K extends keyof IgcBaseComboBoxEventMap,\n D extends UnpackCustomEvent<IgcBaseComboBoxEventMap[K]>,\n >(\n event: K,\n eventInitDict?: CustomEventInit<D>\n ) => boolean;\n\n protected abstract _rootClickController: RootClickController;\n\n /**\n * Sets the open state of the component.\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n protected _emitClosing(): boolean {\n return this.emitEvent('igcClosing', { cancelable: true });\n }\n\n protected _emitClosed(): boolean {\n return this.emitEvent('igcClosed');\n }\n\n protected _emitOpening(): boolean {\n return this.emitEvent('igcOpening', { cancelable: true });\n }\n\n protected _emitOpened(): boolean {\n return this.emitEvent('igcOpened');\n }\n\n protected _handleAnchorClick(): void {\n this.open ? this._hide(true) : this._show(true);\n }\n\n protected async _hide(emitEvent = false): Promise<boolean> {\n if (!this.open || (emitEvent && !this._emitClosing())) {\n return false;\n }\n\n this.open = false;\n\n if (emitEvent) {\n await this.updateComplete;\n this._emitClosed();\n }\n\n return true;\n }\n\n protected async _show(emitEvent = false): Promise<boolean> {\n if (this.open || (emitEvent && !this._emitOpening())) {\n return false;\n }\n\n this.open = true;\n\n if (emitEvent) {\n await this.updateComplete;\n this._emitOpened();\n }\n\n return true;\n }\n\n /** Shows the component. */\n public async show(): Promise<boolean> {\n return this._show();\n }\n\n /** Hides the component. */\n public async hide(): Promise<boolean> {\n return this._hide();\n }\n\n /** Toggles the open state of the component. */\n public async toggle(): Promise<boolean> {\n return this.open ? this.hide() : this.show();\n }\n}\n\n/* blazorIndirectRender */\n/* omitModule */\nexport abstract class IgcComboBoxBaseLikeComponent extends IgcBaseComboBoxComponent {\n /**\n * Whether the component dropdown should be kept open on selection.\n * @attr keep-open-on-select\n * @default false\n */\n @property({ type: Boolean, reflect: true, attribute: 'keep-open-on-select' })\n public keepOpenOnSelect = false;\n\n /**\n * Whether the component dropdown should be kept open on clicking outside of it.\n * @attr keep-open-on-outside-click\n * @default false\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'keep-open-on-outside-click',\n })\n public keepOpenOnOutsideClick = false;\n}\n\nexport function getItems<T extends HTMLElement>(\n root: Node,\n tagName: string\n): Generator<T> {\n return iterNodes<T>(root, {\n show: 'SHOW_ELEMENT',\n filter: (item) => item.matches(tagName),\n });\n}\n\nexport function getActiveItems<T extends HTMLElement & { disabled: boolean }>(\n root: Node,\n tagName: string\n): Generator<T> {\n return iterNodes<T>(root, {\n show: 'SHOW_ELEMENT',\n filter: (item) => item.matches(tagName) && !item.disabled,\n });\n}\n\n/**\n * Both navigation helpers accept a missing or detached `from`, in which case\n * the search runs from the edge of the collection. They return `undefined` only\n * when there is nothing to navigate to at all.\n */\nfunction indexOfItem<T extends HTMLElement>(\n items: T[],\n from: T | null | undefined,\n fallback: number\n): number {\n const index = from ? items.indexOf(from) : -1;\n return index < 0 ? fallback : index;\n}\n\n/**\n * Returns the first non-disabled item after `from`, or `from` itself when it is\n * already the last one.\n */\nexport function getNextActiveItem<\n T extends HTMLElement & { disabled: boolean },\n>(items: T[], from?: T | null): T | undefined {\n const current = indexOfItem(items, from, -1);\n\n for (let i = current + 1; i < items.length; i++) {\n if (!items[i].disabled) {\n return items[i];\n }\n }\n\n return items[current];\n}\n\n/**\n * Returns the first non-disabled item before `from`, or `from` itself when it\n * is already the first one.\n */\nexport function getPreviousActiveItem<\n T extends HTMLElement & { disabled: boolean },\n>(items: T[], from?: T | null): T | undefined {\n const current = indexOfItem(items, from, items.length);\n\n for (let i = current - 1; i >= 0; i--) {\n if (!items[i].disabled) {\n return items[i];\n }\n }\n\n return items[current];\n}\n\nexport function setInitialSelectionState<\n T extends HTMLElement & { selected: boolean },\n>(items: T[]): T | null {\n const lastSelected = lastOf(items.filter((item) => item.selected));\n\n for (const item of items) {\n item.selected = item === lastSelected;\n }\n\n return lastSelected ?? null;\n}\n"]}
1
+ {"version":3,"file":"combo-box.js","sourceRoot":"","sources":["../../../src/internals/mixins/combo-box.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { RootClickController } from '../controllers/root-click.js';\nimport {\n addToggleController,\n type ToggleEventMap,\n} from '../controllers/toggle.js';\nimport { lastOf } from '../utils/arrays.js';\nimport { iterNodes } from '../utils/dom.js';\nimport type { UnpackCustomEvent } from './event-emitter.js';\n\n/* blazorIndirectRender */\n/* omitModule */\nexport abstract class IgcBaseComboBoxComponent extends LitElement {\n /* blazorSuppress */\n declare public emitEvent: <\n K extends keyof ToggleEventMap,\n D extends UnpackCustomEvent<ToggleEventMap[K]>,\n >(\n event: K,\n eventInitDict?: CustomEventInit<D>\n ) => boolean;\n\n protected abstract _rootClickController: RootClickController;\n private readonly _toggleController = addToggleController(this);\n\n /**\n * Sets the open state of the component.\n * @attr open\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public open = false;\n\n protected _handleAnchorClick(): void {\n this.open ? this._hide(true) : this._show(true);\n }\n\n protected _hide(emitEvent = false): Promise<boolean> {\n return this._toggleController.hide(emitEvent);\n }\n\n protected _show(emitEvent = false): Promise<boolean> {\n return this._toggleController.show(emitEvent);\n }\n\n /** Shows the component. */\n public async show(): Promise<boolean> {\n return this._show();\n }\n\n /** Hides the component. */\n public async hide(): Promise<boolean> {\n return this._hide();\n }\n\n /** Toggles the open state of the component. */\n public async toggle(): Promise<boolean> {\n return this.open ? this.hide() : this.show();\n }\n}\n\n/* blazorIndirectRender */\n/* omitModule */\nexport abstract class IgcComboBoxBaseLikeComponent extends IgcBaseComboBoxComponent {\n /**\n * Whether the component dropdown should be kept open on selection.\n * @attr keep-open-on-select\n * @default false\n */\n @property({ type: Boolean, reflect: true, attribute: 'keep-open-on-select' })\n public keepOpenOnSelect = false;\n\n /**\n * Whether the component dropdown should be kept open on clicking outside of it.\n * @attr keep-open-on-outside-click\n * @default false\n */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'keep-open-on-outside-click',\n })\n public keepOpenOnOutsideClick = false;\n}\n\nexport function getItems<T extends HTMLElement>(\n root: Node,\n tagName: string\n): Generator<T> {\n return iterNodes<T>(root, {\n show: 'SHOW_ELEMENT',\n filter: (item) => item.matches(tagName),\n });\n}\n\nexport function getActiveItems<T extends HTMLElement & { disabled: boolean }>(\n root: Node,\n tagName: string\n): Generator<T> {\n return iterNodes<T>(root, {\n show: 'SHOW_ELEMENT',\n filter: (item) => item.matches(tagName) && !item.disabled,\n });\n}\n\n/**\n * Both navigation helpers accept a missing or detached `from`, in which case\n * the search runs from the edge of the collection. They return `undefined` only\n * when there is nothing to navigate to at all.\n */\nfunction indexOfItem<T extends HTMLElement>(\n items: T[],\n from: T | null | undefined,\n fallback: number\n): number {\n const index = from ? items.indexOf(from) : -1;\n return index < 0 ? fallback : index;\n}\n\n/**\n * Returns the first non-disabled item after `from`, or `from` itself when it is\n * already the last one.\n */\nexport function getNextActiveItem<\n T extends HTMLElement & { disabled: boolean },\n>(items: T[], from?: T | null): T | undefined {\n const current = indexOfItem(items, from, -1);\n\n for (let i = current + 1; i < items.length; i++) {\n if (!items[i].disabled) {\n return items[i];\n }\n }\n\n return items[current];\n}\n\n/**\n * Returns the first non-disabled item before `from`, or `from` itself when it\n * is already the first one.\n */\nexport function getPreviousActiveItem<\n T extends HTMLElement & { disabled: boolean },\n>(items: T[], from?: T | null): T | undefined {\n const current = indexOfItem(items, from, items.length);\n\n for (let i = current - 1; i >= 0; i--) {\n if (!items[i].disabled) {\n return items[i];\n }\n }\n\n return items[current];\n}\n\nexport function setInitialSelectionState<\n T extends HTMLElement & { selected: boolean },\n>(items: T[]): T | null {\n const lastSelected = lastOf(items.filter((item) => item.selected));\n\n for (const item of items) {\n item.selected = item === lastSelected;\n }\n\n return lastSelected ?? null;\n}\n"]}
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { isServer } from 'lit';
8
8
  import { property } from 'lit/decorators.js';
9
+ import IgcValidationContainerComponent from '../../../components/validation-container/validation-container.js';
9
10
  import { addInternalsController } from '../../controllers/internals.js';
10
11
  import { enterKey } from '../../controllers/key-bindings.js';
11
12
  import { addSafeEventListener } from '../../utils/events.js';
@@ -158,6 +159,10 @@ function BaseFormAssociated(base) {
158
159
  _setTouchedState() {
159
160
  this._touched = true;
160
161
  }
162
+ _emitTouchedEvent(eventName, init) {
163
+ this._setTouchedState();
164
+ return this.emitEvent(eventName, init);
165
+ }
161
166
  _setDefaultValue(current) {
162
167
  this._formValue.defaultValue = current;
163
168
  }
@@ -171,6 +176,9 @@ function BaseFormAssociated(base) {
171
176
  this._internals.setFormValue(value, state);
172
177
  this._validate();
173
178
  }
179
+ _renderValidationContainer(config) {
180
+ return IgcValidationContainerComponent.create(this, config);
181
+ }
174
182
  formAssociatedCallback(_form) { }
175
183
  formDisabledCallback(state) {
176
184
  this._disabled = state;
@@ -236,6 +244,16 @@ export function FormAssociatedMixin(base) {
236
244
  super._restoreDefaultValue();
237
245
  }
238
246
  }
247
+ _commitValue(value, eventName) {
248
+ this._setTouchedState();
249
+ if ('value' in this) {
250
+ this.value = value;
251
+ return this.emitEvent(eventName, {
252
+ detail: this.value,
253
+ });
254
+ }
255
+ return false;
256
+ }
239
257
  attributeChangedCallback(name, prev, current) {
240
258
  super.attributeChangedCallback(name, prev, current);
241
259
  if (name === 'value') {
@@ -1 +1 @@
1
- {"version":3,"file":"associated.js","sourceRoot":"","sources":["../../../../src/internals/mixins/forms/associated.ts"],"names":[],"mappings":"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","sourcesContent":["import { isServer, type LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { addInternalsController } from '../../controllers/internals.js';\nimport { enterKey } from '../../controllers/key-bindings.js';\nimport { addSafeEventListener } from '../../utils/events.js';\nimport { isFunction, isString } from '../../utils/types.js';\nimport type { Validator } from '../../validators.js';\nimport type { Constructor } from '../constructor.js';\nimport type { FormValue } from './form-value.js';\nimport {\n type FormAssociatedCheckboxElementInterface,\n type FormAssociatedElementInterface,\n type FormRestoreMode,\n type FormValueType,\n InternalInvalidEvent,\n InternalResetEvent,\n} from './types.js';\n\nconst INVALID_STATE = 'ig-invalid';\n\nconst eventOptions = {\n bubbles: false,\n composed: false,\n};\n\nfunction emitFormInvalidEvent(host: LitElement): void {\n host.dispatchEvent(new CustomEvent(InternalInvalidEvent, eventOptions));\n}\n\nfunction emitFormResetEvent(host: LitElement): void {\n host.dispatchEvent(new CustomEvent(InternalResetEvent, eventOptions));\n}\n\nfunction BaseFormAssociated<T extends Constructor<LitElement>>(base: T) {\n class BaseFormAssociatedElement extends base {\n public static readonly formAssociated = true;\n\n //#region Internal state and properties\n\n protected readonly _internals = addInternalsController(this);\n protected readonly _formValue!: FormValue<unknown>;\n\n /**\n * Suppresses invalid styling for a programmatic validation cycle\n * (`checkValidity`/`_validate`). Scoped to the synchronous validity check:\n * set immediately before it and cleared immediately after, so it never\n * leaks into a later submission or user-interaction cycle.\n */\n private _isInternalValidation = false;\n private _touched = false;\n private _isExternalInvalid = false;\n\n private get _shouldApplyStyles(): boolean {\n if (this._isExternalInvalid) {\n return true;\n }\n\n // A disabled control is barred from constraint validation, so it never\n // carries invalid styling regardless of what its validators say.\n return (\n !this._disabled &&\n this._invalid &&\n this._touched &&\n !this._isInternalValidation\n );\n }\n\n protected _disabled = false;\n protected _invalid = false;\n protected _pristine = true;\n\n protected get __validators(): Validator[] {\n return [];\n }\n\n //#endregion\n\n //#region Public properties and attributes\n\n /**\n * The name of the control, submitted with the form data.\n * @attr\n */\n @property({ reflect: true })\n public name!: string;\n\n /**\n * The disabled state of the component.\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set disabled(value: boolean) {\n this._disabled = value;\n this.toggleAttribute('disabled', Boolean(this._disabled));\n if (this.hasUpdated) {\n this._setInvalidStyles();\n }\n }\n\n public get disabled(): boolean {\n return this._disabled;\n }\n\n /**\n * Sets the control into invalid state (visual state only).\n *\n * @remarks\n * The property is not reflected back to the attribute. Reading it returns\n * the effective visual state, so a touched control failing validation\n * reads `true` even after assigning `false`.\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set invalid(value: boolean) {\n this._isExternalInvalid = value;\n this._setInvalidStyles();\n }\n\n public get invalid(): boolean {\n return this._shouldApplyStyles;\n }\n\n /** Returns the HTMLFormElement associated with this element. */\n public get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n /**\n * Returns a ValidityState object which represents the different validity states\n * the element can be in, with respect to constraint validation.\n */\n public get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** A string containing the validation message of this element. */\n public get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /**\n * A boolean value which returns true if the element is a submittable element\n * that is a candidate for constraint validation.\n */\n public get willValidate(): boolean {\n return this._internals.willValidate;\n }\n //#endregion\n\n //#region Life-cycle hooks\n\n constructor(...args: any[]) {\n super(...args);\n addSafeEventListener(this, 'invalid', this._handleInvalid);\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n\n if (!this.hasUpdated) {\n this._pristine = true;\n this._touched = false;\n }\n\n this._validate();\n }\n\n //#endregion\n\n //#region Enter key submission handling\n\n protected _handleEnterKeydown(event: KeyboardEvent): void {\n if (event.key !== enterKey || event.repeat) {\n return;\n }\n\n this.form?.requestSubmit();\n }\n\n //#endregion\n\n //#region Form value and validation states\n\n private _handleInvalid(event: Event): void {\n event.preventDefault();\n this._invalid = true;\n\n if (this._isInternalValidation) {\n this._isInternalValidation = false;\n } else {\n // A failed submission counts as user interaction, and a lasting one: the\n // control was asked for a value it could not provide. Keeping it touched\n // is what makes `invalid` - and with it the validation messages the host\n // projects - survive any later re-render, rather than holding only for\n // the update the submission itself scheduled.\n this._setTouchedState();\n emitFormInvalidEvent(this);\n }\n\n this._setInvalidStyles();\n this.requestUpdate();\n }\n\n private _setInvalidStyles(): void {\n this._internals.setState(INVALID_STATE, this._shouldApplyStyles);\n }\n\n /**\n * Closes a programmatic validation cycle. If the control was invalid, the\n * synchronous `invalid` event already cleared the flag; if it was valid no\n * event fired, so clear it here to stop it leaking into a later submission\n * or user-interaction cycle.\n */\n private _resolveInternalValidation(): void {\n this._isInternalValidation = false;\n }\n\n private __runValidators(): {\n validity: ValidityStateFlags;\n message: string;\n } {\n let validity: ValidityStateFlags = {};\n let message = '';\n\n for (const validator of this.__validators) {\n const isValid = validator.isValid(this);\n\n validity[validator.key] = !isValid;\n\n if (!isValid) {\n message = isFunction(validator.message)\n ? validator.message(this)\n : validator.message;\n\n if (validator.key === 'valueMissing') {\n validity = { valueMissing: true };\n break;\n }\n }\n }\n\n return { validity, message };\n }\n\n /**\n * Executes the component validators and updates the internal validity state.\n */\n protected _validate(userMessage?: string): void {\n if (isServer) return;\n const { validity, message: validatorMessage } = this.__runValidators();\n const hasCustomError = this.validity.customError;\n let message = validatorMessage;\n\n if (hasCustomError && userMessage === undefined) {\n // Internal validation cycle after the user has called setCustomValidity()\n // with some message. Keep the customError flag and the passed in message.\n validity.customError = true;\n message = this.validationMessage;\n } else if (hasCustomError && userMessage === '') {\n // setCustomValidity with an empty message.\n validity.customError = false;\n } else if (userMessage && userMessage !== '') {\n // setCustomValidity with a message.\n validity.customError = true;\n message = userMessage;\n }\n\n this._internals.setValidity(validity, message);\n this._isInternalValidation = true;\n this._invalid = !this._internals.checkValidity();\n this._resolveInternalValidation();\n this._setInvalidStyles();\n }\n\n protected _handleBlur(): void {\n this._setTouchedState();\n this._validate();\n }\n\n protected _setTouchedState(): void {\n this._touched = true;\n }\n\n protected _setDefaultValue(current: string | null): void {\n this._formValue.defaultValue = current;\n }\n\n protected _restoreDefaultValue(): void {\n const value = this._formValue.value;\n this._formValue.setValueAndFormState(this._formValue.defaultValue);\n this.requestUpdate('value', value);\n }\n\n protected _setFormValue(value: FormValueType, state?: FormValueType): void {\n this._pristine = false;\n this._internals.setFormValue(value, state);\n this._validate();\n }\n\n //#endregion\n\n //#region Form associated callback hooks\n\n protected formAssociatedCallback(_form: HTMLFormElement): void {}\n\n protected formDisabledCallback(state: boolean): void {\n this._disabled = state;\n this._setInvalidStyles();\n this.requestUpdate();\n }\n\n protected formResetCallback(): void {\n this._restoreDefaultValue();\n this._pristine = true;\n this._touched = false;\n this._invalid = false;\n this._isExternalInvalid = false;\n this._setInvalidStyles();\n emitFormResetEvent(this);\n }\n\n /* c8 ignore next 4 */\n protected formStateRestoreCallback(\n _state: FormValueType,\n _mode: FormRestoreMode\n ): void {}\n\n //#endregion\n\n //#region Public API\n\n /** Checks for validity of the control and shows the browser message if it's invalid. */\n public reportValidity(): boolean {\n const state = this._internals.reportValidity();\n this._invalid = !state;\n return state;\n }\n\n /** Checks for validity of the control and emits the invalid event if it's invalid. */\n public checkValidity(): boolean {\n this._isInternalValidation = true;\n const state = this._internals.checkValidity();\n this._invalid = !state;\n this._resolveInternalValidation();\n return state;\n }\n\n /**\n * Sets a custom validation message for the control.\n * As long as `message` is not empty, the control is considered invalid.\n */\n public setCustomValidity(message: string): void {\n this._validate(message);\n this.requestUpdate();\n }\n\n //#endregion\n }\n return BaseFormAssociatedElement as Constructor<BaseFormAssociatedElement> &\n T;\n}\n\n/**\n * Mixes the passed in class and turns it into a form associated custom element.\n */\nexport function FormAssociatedMixin<T extends Constructor<LitElement>>(\n base: T\n) {\n class FormAssociatedElement extends BaseFormAssociated(base) {\n /* blazorCSSuppress */\n @property({ attribute: false })\n public set defaultValue(value: unknown) {\n this._formValue.defaultValue = value;\n\n if (this._pristine && 'value' in this) {\n this.value = this.defaultValue;\n this._pristine = true;\n this._validate();\n }\n }\n\n public get defaultValue(): unknown {\n return this._formValue.defaultValue;\n }\n\n /**\n * Restores the default value through the public `value` setter so any\n * clamping/normalization the component applies (slider bounds, rating max)\n * also applies on form reset, and the correct reactive property is\n * recorded for the update cycle.\n */\n protected override _restoreDefaultValue(): void {\n if ('value' in this) {\n this.value = this.defaultValue;\n } else {\n super._restoreDefaultValue();\n }\n }\n\n public override attributeChangedCallback(\n name: string,\n prev: string | null,\n current: string | null\n ): void {\n super.attributeChangedCallback(name, prev, current);\n if (name === 'value') {\n this._setDefaultValue(current);\n }\n }\n }\n\n return FormAssociatedElement as unknown as Constructor<FormAssociatedElementInterface> &\n T;\n}\n\n/**\n * Mixes the passed in class and turns it into a form associated custom element.\n */\nexport function FormAssociatedCheckboxMixin<T extends Constructor<LitElement>>(\n base: T\n) {\n class FormAssociatedCheckboxElement extends BaseFormAssociated(base) {\n /* blazorCSSuppress */\n @property({ attribute: false })\n public set defaultChecked(value: boolean) {\n this._formValue.defaultValue = value;\n\n if (this._pristine && 'checked' in this) {\n this.checked = this.defaultChecked;\n this._pristine = true;\n this._validate();\n }\n }\n\n public get defaultChecked(): boolean {\n return this._formValue.defaultValue as boolean;\n }\n\n /**\n * Restores the default checked state through the public `checked` setter\n * so the correct reactive property is recorded for the update cycle.\n */\n protected override _restoreDefaultValue(): void {\n if ('checked' in this) {\n this.checked = this.defaultChecked;\n } else {\n super._restoreDefaultValue();\n }\n }\n\n public override attributeChangedCallback(\n name: string,\n prev: string | null,\n current: string | null\n ): void {\n super.attributeChangedCallback(name, prev, current);\n if (name === 'checked') {\n this._setDefaultValue(isString(current) ? 'true' : null);\n }\n }\n }\n\n return FormAssociatedCheckboxElement as unknown as Constructor<FormAssociatedCheckboxElementInterface> &\n T;\n}\n"]}
1
+ {"version":3,"file":"associated.js","sourceRoot":"","sources":["../../../../src/internals/mixins/forms/associated.ts"],"names":[],"mappings":"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","sourcesContent":["import { isServer, type LitElement, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport IgcValidationContainerComponent, {\n type ValidationContainerConfig,\n} from '../../../components/validation-container/validation-container.js';\nimport { addInternalsController } from '../../controllers/internals.js';\nimport { enterKey } from '../../controllers/key-bindings.js';\nimport { addSafeEventListener } from '../../utils/events.js';\nimport { isFunction, isString } from '../../utils/types.js';\nimport type { Validator } from '../../validators.js';\nimport type { Constructor } from '../constructor.js';\nimport type { FormValue } from './form-value.js';\nimport {\n type FormAssociatedCheckboxElementInterface,\n type FormAssociatedElementInterface,\n type FormRestoreMode,\n type FormValueType,\n type IgcFormControl,\n InternalInvalidEvent,\n InternalResetEvent,\n} from './types.js';\n\nconst INVALID_STATE = 'ig-invalid';\n\n/**\n * Every form-associated component composes the event-emitter mixin somewhere in\n * its heritage, but this mixin cannot see it in its type chain - emits go through\n * a structural contract instead.\n */\ntype EventEmitterLike = {\n emitEvent(name: string, init?: CustomEventInit): boolean;\n};\n\nconst eventOptions = {\n bubbles: false,\n composed: false,\n};\n\nfunction emitFormInvalidEvent(host: LitElement): void {\n host.dispatchEvent(new CustomEvent(InternalInvalidEvent, eventOptions));\n}\n\nfunction emitFormResetEvent(host: LitElement): void {\n host.dispatchEvent(new CustomEvent(InternalResetEvent, eventOptions));\n}\n\nfunction BaseFormAssociated<T extends Constructor<LitElement>>(base: T) {\n class BaseFormAssociatedElement extends base {\n public static readonly formAssociated = true;\n\n //#region Internal state and properties\n\n protected readonly _internals = addInternalsController(this);\n protected readonly _formValue!: FormValue<unknown>;\n\n /**\n * Suppresses invalid styling for a programmatic validation cycle\n * (`checkValidity`/`_validate`). Scoped to the synchronous validity check:\n * set immediately before it and cleared immediately after, so it never\n * leaks into a later submission or user-interaction cycle.\n */\n private _isInternalValidation = false;\n private _touched = false;\n private _isExternalInvalid = false;\n\n private get _shouldApplyStyles(): boolean {\n if (this._isExternalInvalid) {\n return true;\n }\n\n // A disabled control is barred from constraint validation, so it never\n // carries invalid styling regardless of what its validators say.\n return (\n !this._disabled &&\n this._invalid &&\n this._touched &&\n !this._isInternalValidation\n );\n }\n\n protected _disabled = false;\n protected _invalid = false;\n protected _pristine = true;\n\n protected get __validators(): Validator[] {\n return [];\n }\n\n //#endregion\n\n //#region Public properties and attributes\n\n /**\n * The name of the control, submitted with the form data.\n * @attr\n */\n @property({ reflect: true })\n public name!: string;\n\n /**\n * The disabled state of the component.\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set disabled(value: boolean) {\n this._disabled = value;\n this.toggleAttribute('disabled', Boolean(this._disabled));\n if (this.hasUpdated) {\n this._setInvalidStyles();\n }\n }\n\n public get disabled(): boolean {\n return this._disabled;\n }\n\n /**\n * Sets the control into invalid state (visual state only).\n *\n * @remarks\n * The property is not reflected back to the attribute. Reading it returns\n * the effective visual state, so a touched control failing validation\n * reads `true` even after assigning `false`.\n * @attr\n * @default false\n */\n @property({ type: Boolean })\n public set invalid(value: boolean) {\n this._isExternalInvalid = value;\n this._setInvalidStyles();\n }\n\n public get invalid(): boolean {\n return this._shouldApplyStyles;\n }\n\n /** Returns the HTMLFormElement associated with this element. */\n public get form(): HTMLFormElement | null {\n return this._internals.form;\n }\n\n /**\n * Returns a ValidityState object which represents the different validity states\n * the element can be in, with respect to constraint validation.\n */\n public get validity(): ValidityState {\n return this._internals.validity;\n }\n\n /** A string containing the validation message of this element. */\n public get validationMessage(): string {\n return this._internals.validationMessage;\n }\n\n /**\n * A boolean value which returns true if the element is a submittable element\n * that is a candidate for constraint validation.\n */\n public get willValidate(): boolean {\n return this._internals.willValidate;\n }\n //#endregion\n\n //#region Life-cycle hooks\n\n constructor(...args: any[]) {\n super(...args);\n addSafeEventListener(this, 'invalid', this._handleInvalid);\n }\n\n /** @internal */\n public override connectedCallback(): void {\n super.connectedCallback();\n\n if (!this.hasUpdated) {\n this._pristine = true;\n this._touched = false;\n }\n\n this._validate();\n }\n\n //#endregion\n\n //#region Enter key submission handling\n\n protected _handleEnterKeydown(event: KeyboardEvent): void {\n if (event.key !== enterKey || event.repeat) {\n return;\n }\n\n this.form?.requestSubmit();\n }\n\n //#endregion\n\n //#region Form value and validation states\n\n private _handleInvalid(event: Event): void {\n event.preventDefault();\n this._invalid = true;\n\n if (this._isInternalValidation) {\n this._isInternalValidation = false;\n } else {\n // A failed submission counts as user interaction, and a lasting one: the\n // control was asked for a value it could not provide. Keeping it touched\n // is what makes `invalid` - and with it the validation messages the host\n // projects - survive any later re-render, rather than holding only for\n // the update the submission itself scheduled.\n this._setTouchedState();\n emitFormInvalidEvent(this);\n }\n\n this._setInvalidStyles();\n this.requestUpdate();\n }\n\n private _setInvalidStyles(): void {\n this._internals.setState(INVALID_STATE, this._shouldApplyStyles);\n }\n\n /**\n * Closes a programmatic validation cycle. If the control was invalid, the\n * synchronous `invalid` event already cleared the flag; if it was valid no\n * event fired, so clear it here to stop it leaking into a later submission\n * or user-interaction cycle.\n */\n private _resolveInternalValidation(): void {\n this._isInternalValidation = false;\n }\n\n private __runValidators(): {\n validity: ValidityStateFlags;\n message: string;\n } {\n let validity: ValidityStateFlags = {};\n let message = '';\n\n for (const validator of this.__validators) {\n const isValid = validator.isValid(this);\n\n validity[validator.key] = !isValid;\n\n if (!isValid) {\n message = isFunction(validator.message)\n ? validator.message(this)\n : validator.message;\n\n if (validator.key === 'valueMissing') {\n validity = { valueMissing: true };\n break;\n }\n }\n }\n\n return { validity, message };\n }\n\n /**\n * Executes the component validators and updates the internal validity state.\n */\n protected _validate(userMessage?: string): void {\n if (isServer) return;\n const { validity, message: validatorMessage } = this.__runValidators();\n const hasCustomError = this.validity.customError;\n let message = validatorMessage;\n\n if (hasCustomError && userMessage === undefined) {\n // Internal validation cycle after the user has called setCustomValidity()\n // with some message. Keep the customError flag and the passed in message.\n validity.customError = true;\n message = this.validationMessage;\n } else if (hasCustomError && userMessage === '') {\n // setCustomValidity with an empty message.\n validity.customError = false;\n } else if (userMessage && userMessage !== '') {\n // setCustomValidity with a message.\n validity.customError = true;\n message = userMessage;\n }\n\n this._internals.setValidity(validity, message);\n this._isInternalValidation = true;\n this._invalid = !this._internals.checkValidity();\n this._resolveInternalValidation();\n this._setInvalidStyles();\n }\n\n protected _handleBlur(): void {\n this._setTouchedState();\n this._validate();\n }\n\n protected _setTouchedState(): void {\n this._touched = true;\n }\n\n protected _emitTouchedEvent(\n eventName: string,\n init?: CustomEventInit\n ): boolean {\n this._setTouchedState();\n return (this as unknown as EventEmitterLike).emitEvent(eventName, init);\n }\n\n protected _setDefaultValue(current: string | null): void {\n this._formValue.defaultValue = current;\n }\n\n protected _restoreDefaultValue(): void {\n const value = this._formValue.value;\n this._formValue.setValueAndFormState(this._formValue.defaultValue);\n this.requestUpdate('value', value);\n }\n\n protected _setFormValue(value: FormValueType, state?: FormValueType): void {\n this._pristine = false;\n this._internals.setFormValue(value, state);\n this._validate();\n }\n\n protected _renderValidationContainer(\n config?: ValidationContainerConfig\n ): TemplateResult {\n return IgcValidationContainerComponent.create(\n this as unknown as IgcFormControl,\n config\n );\n }\n\n //#endregion\n\n //#region Form associated callback hooks\n\n protected formAssociatedCallback(_form: HTMLFormElement): void {}\n\n protected formDisabledCallback(state: boolean): void {\n this._disabled = state;\n this._setInvalidStyles();\n this.requestUpdate();\n }\n\n protected formResetCallback(): void {\n this._restoreDefaultValue();\n this._pristine = true;\n this._touched = false;\n this._invalid = false;\n this._isExternalInvalid = false;\n this._setInvalidStyles();\n emitFormResetEvent(this);\n }\n\n /* c8 ignore next 4 */\n protected formStateRestoreCallback(\n _state: FormValueType,\n _mode: FormRestoreMode\n ): void {}\n\n //#endregion\n\n //#region Public API\n\n /** Checks for validity of the control and shows the browser message if it's invalid. */\n public reportValidity(): boolean {\n const state = this._internals.reportValidity();\n this._invalid = !state;\n return state;\n }\n\n /** Checks for validity of the control and emits the invalid event if it's invalid. */\n public checkValidity(): boolean {\n this._isInternalValidation = true;\n const state = this._internals.checkValidity();\n this._invalid = !state;\n this._resolveInternalValidation();\n return state;\n }\n\n /**\n * Sets a custom validation message for the control.\n * As long as `message` is not empty, the control is considered invalid.\n */\n public setCustomValidity(message: string): void {\n this._validate(message);\n this.requestUpdate();\n }\n\n //#endregion\n }\n return BaseFormAssociatedElement as Constructor<BaseFormAssociatedElement> &\n T;\n}\n\n/**\n * Mixes the passed in class and turns it into a form associated custom element.\n */\nexport function FormAssociatedMixin<T extends Constructor<LitElement>>(\n base: T\n) {\n class FormAssociatedElement extends BaseFormAssociated(base) {\n /* blazorCSSuppress */\n @property({ attribute: false })\n public set defaultValue(value: unknown) {\n this._formValue.defaultValue = value;\n\n if (this._pristine && 'value' in this) {\n this.value = this.defaultValue;\n this._pristine = true;\n this._validate();\n }\n }\n\n public get defaultValue(): unknown {\n return this._formValue.defaultValue;\n }\n\n /**\n * Restores the default value through the public `value` setter so any\n * clamping/normalization the component applies (slider bounds, rating max)\n * also applies on form reset, and the correct reactive property is\n * recorded for the update cycle.\n */\n protected override _restoreDefaultValue(): void {\n if ('value' in this) {\n this.value = this.defaultValue;\n } else {\n super._restoreDefaultValue();\n }\n }\n\n /** Touched flips first, so the setter's validation cycle sees it. */\n protected _commitValue(value: unknown, eventName: string): boolean {\n this._setTouchedState();\n\n if ('value' in this) {\n this.value = value;\n return (this as unknown as EventEmitterLike).emitEvent(eventName, {\n detail: this.value,\n });\n }\n\n return false;\n }\n\n public override attributeChangedCallback(\n name: string,\n prev: string | null,\n current: string | null\n ): void {\n super.attributeChangedCallback(name, prev, current);\n if (name === 'value') {\n this._setDefaultValue(current);\n }\n }\n }\n\n return FormAssociatedElement as unknown as Constructor<FormAssociatedElementInterface> &\n T;\n}\n\n/**\n * Mixes the passed in class and turns it into a form associated custom element.\n */\nexport function FormAssociatedCheckboxMixin<T extends Constructor<LitElement>>(\n base: T\n) {\n class FormAssociatedCheckboxElement extends BaseFormAssociated(base) {\n /* blazorCSSuppress */\n @property({ attribute: false })\n public set defaultChecked(value: boolean) {\n this._formValue.defaultValue = value;\n\n if (this._pristine && 'checked' in this) {\n this.checked = this.defaultChecked;\n this._pristine = true;\n this._validate();\n }\n }\n\n public get defaultChecked(): boolean {\n return this._formValue.defaultValue as boolean;\n }\n\n /**\n * Restores the default checked state through the public `checked` setter\n * so the correct reactive property is recorded for the update cycle.\n */\n protected override _restoreDefaultValue(): void {\n if ('checked' in this) {\n this.checked = this.defaultChecked;\n } else {\n super._restoreDefaultValue();\n }\n }\n\n public override attributeChangedCallback(\n name: string,\n prev: string | null,\n current: string | null\n ): void {\n super.attributeChangedCallback(name, prev, current);\n if (name === 'checked') {\n this._setDefaultValue(isString(current) ? 'true' : null);\n }\n }\n }\n\n return FormAssociatedCheckboxElement as unknown as Constructor<FormAssociatedCheckboxElementInterface> &\n T;\n}\n"]}