igniteui-webcomponents 7.3.1 → 7.4.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 (606) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/animations/easings.d.ts +21 -31
  3. package/animations/easings.js +21 -34
  4. package/animations/easings.js.map +1 -1
  5. package/animations/player.d.ts +8 -16
  6. package/animations/player.js +5 -8
  7. package/animations/player.js.map +1 -1
  8. package/animations/view-transition.d.ts +10 -10
  9. package/animations/view-transition.js +26 -37
  10. package/animations/view-transition.js.map +1 -1
  11. package/components/avatar/themes/avatar.base.css.js +1 -1
  12. package/components/avatar/themes/avatar.base.css.js.map +1 -1
  13. package/components/badge/themes/badge.base.css.js +1 -1
  14. package/components/badge/themes/badge.base.css.js.map +1 -1
  15. package/components/banner/themes/banner.base.css.js +1 -1
  16. package/components/banner/themes/banner.base.css.js.map +1 -1
  17. package/components/banner/themes/shared/banner.indigo.css.js +1 -1
  18. package/components/banner/themes/shared/banner.indigo.css.js.map +1 -1
  19. package/components/breadcrumb/breadcrumb.d.ts +74 -0
  20. package/components/breadcrumb/breadcrumb.js +107 -0
  21. package/components/breadcrumb/breadcrumb.js.map +1 -0
  22. package/components/breadcrumb/breadcrumbs.d.ts +60 -0
  23. package/components/breadcrumb/breadcrumbs.js +50 -0
  24. package/components/breadcrumb/breadcrumbs.js.map +1 -0
  25. package/components/breadcrumb/themes/breadcrumb.base.css.d.ts +1 -0
  26. package/components/breadcrumb/themes/breadcrumb.base.css.js +3 -0
  27. package/components/breadcrumb/themes/breadcrumb.base.css.js.map +1 -0
  28. package/components/breadcrumb/themes/breadcrumbs.base.css.d.ts +1 -0
  29. package/components/breadcrumb/themes/breadcrumbs.base.css.js +3 -0
  30. package/components/breadcrumb/themes/breadcrumbs.base.css.js.map +1 -0
  31. package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.d.ts +1 -0
  32. package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js +3 -0
  33. package/components/breadcrumb/themes/dark/breadcrumb.bootstrap.css.js.map +1 -0
  34. package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.d.ts +1 -0
  35. package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js +3 -0
  36. package/components/breadcrumb/themes/dark/breadcrumb.fluent.css.js.map +1 -0
  37. package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.d.ts +1 -0
  38. package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js +3 -0
  39. package/components/breadcrumb/themes/dark/breadcrumb.indigo.css.js.map +1 -0
  40. package/components/breadcrumb/themes/dark/breadcrumb.material.css.d.ts +1 -0
  41. package/components/breadcrumb/themes/dark/breadcrumb.material.css.js +3 -0
  42. package/components/breadcrumb/themes/dark/breadcrumb.material.css.js.map +1 -0
  43. package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.d.ts +1 -0
  44. package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js +3 -0
  45. package/components/breadcrumb/themes/light/breadcrumb.bootstrap.css.js.map +1 -0
  46. package/components/breadcrumb/themes/light/breadcrumb.fluent.css.d.ts +1 -0
  47. package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js +3 -0
  48. package/components/breadcrumb/themes/light/breadcrumb.fluent.css.js.map +1 -0
  49. package/components/breadcrumb/themes/light/breadcrumb.indigo.css.d.ts +1 -0
  50. package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js +3 -0
  51. package/components/breadcrumb/themes/light/breadcrumb.indigo.css.js.map +1 -0
  52. package/components/breadcrumb/themes/light/breadcrumb.material.css.d.ts +1 -0
  53. package/components/breadcrumb/themes/light/breadcrumb.material.css.js +3 -0
  54. package/components/breadcrumb/themes/light/breadcrumb.material.css.js.map +1 -0
  55. package/components/breadcrumb/themes/light/breadcrumb.shared.css.d.ts +1 -0
  56. package/components/breadcrumb/themes/light/breadcrumb.shared.css.js +3 -0
  57. package/components/breadcrumb/themes/light/breadcrumb.shared.css.js.map +1 -0
  58. package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.d.ts +1 -0
  59. package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js +3 -0
  60. package/components/breadcrumb/themes/shared/breadcrumb.bootstrap.css.js.map +1 -0
  61. package/components/breadcrumb/themes/shared/breadcrumb.common.css.d.ts +1 -0
  62. package/components/breadcrumb/themes/shared/breadcrumb.common.css.js +3 -0
  63. package/components/breadcrumb/themes/shared/breadcrumb.common.css.js.map +1 -0
  64. package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.d.ts +1 -0
  65. package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js +3 -0
  66. package/components/breadcrumb/themes/shared/breadcrumb.fluent.css.js.map +1 -0
  67. package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.d.ts +1 -0
  68. package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js +3 -0
  69. package/components/breadcrumb/themes/shared/breadcrumb.indigo.css.js.map +1 -0
  70. package/components/breadcrumb/themes/shared/breadcrumb.material.css.d.ts +1 -0
  71. package/components/breadcrumb/themes/shared/breadcrumb.material.css.js +3 -0
  72. package/components/breadcrumb/themes/shared/breadcrumb.material.css.js.map +1 -0
  73. package/components/breadcrumb/themes/themes.d.ts +2 -0
  74. package/components/breadcrumb/themes/themes.js +50 -0
  75. package/components/breadcrumb/themes/themes.js.map +1 -0
  76. package/components/button/button.d.ts +0 -2
  77. package/components/button/button.js.map +1 -1
  78. package/components/button-group/button-group.d.ts +42 -12
  79. package/components/button-group/button-group.js +82 -34
  80. package/components/button-group/button-group.js.map +1 -1
  81. package/components/button-group/toggle-button.d.ts +6 -1
  82. package/components/button-group/toggle-button.js +28 -2
  83. package/components/button-group/toggle-button.js.map +1 -1
  84. package/components/calendar/base.d.ts +7 -2
  85. package/components/calendar/base.js +10 -4
  86. package/components/calendar/base.js.map +1 -1
  87. package/components/calendar/calendar.d.ts +6 -3
  88. package/components/calendar/calendar.js +41 -14
  89. package/components/calendar/calendar.js.map +1 -1
  90. package/components/calendar/days-view/days-view.d.ts +5 -8
  91. package/components/calendar/days-view/days-view.js +7 -16
  92. package/components/calendar/days-view/days-view.js.map +1 -1
  93. package/components/calendar/helpers.d.ts +13 -0
  94. package/components/calendar/helpers.js +15 -0
  95. package/components/calendar/helpers.js.map +1 -1
  96. package/components/calendar/themes/calendar.base.css.js +1 -1
  97. package/components/calendar/themes/calendar.base.css.js.map +1 -1
  98. package/components/calendar/themes/days-view.base.css.js +1 -1
  99. package/components/calendar/themes/days-view.base.css.js.map +1 -1
  100. package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js +1 -1
  101. package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js.map +1 -1
  102. package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js +1 -1
  103. package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js.map +1 -1
  104. package/components/calendar/themes/shared/fluent/days-view.fluent.css.js +1 -1
  105. package/components/calendar/themes/shared/fluent/days-view.fluent.css.js.map +1 -1
  106. package/components/calendar/themes/shared/indigo/calendar.indigo.css.js +1 -1
  107. package/components/calendar/themes/shared/indigo/calendar.indigo.css.js.map +1 -1
  108. package/components/calendar/themes/shared/indigo/days-view.indigo.css.js +1 -1
  109. package/components/calendar/themes/shared/indigo/days-view.indigo.css.js.map +1 -1
  110. package/components/calendar/themes/shared/material/days-view.material.css.js +1 -1
  111. package/components/calendar/themes/shared/material/days-view.material.css.js.map +1 -1
  112. package/components/calendar/themes/year-month-view.base.css.js +1 -1
  113. package/components/calendar/themes/year-month-view.base.css.js.map +1 -1
  114. package/components/card/themes/container.base.css.js +1 -1
  115. package/components/card/themes/container.base.css.js.map +1 -1
  116. package/components/carousel/carousel-indicator.js +1 -0
  117. package/components/carousel/carousel-indicator.js.map +1 -1
  118. package/components/carousel/carousel-slide.d.ts +1 -1
  119. package/components/carousel/carousel-slide.js.map +1 -1
  120. package/components/carousel/carousel.d.ts +3 -3
  121. package/components/carousel/carousel.js.map +1 -1
  122. package/components/carousel/themes/carousel.base.css.js +1 -1
  123. package/components/carousel/themes/carousel.base.css.js.map +1 -1
  124. package/components/carousel/themes/shared/carousel.indigo.css.js +1 -1
  125. package/components/carousel/themes/shared/carousel.indigo.css.js.map +1 -1
  126. package/components/chat/chat-input.d.ts +1 -2
  127. package/components/chat/chat-input.js +1 -1
  128. package/components/chat/chat-input.js.map +1 -1
  129. package/components/chat/chat-state.d.ts +8 -9
  130. package/components/chat/chat-state.js.map +1 -1
  131. package/components/chat/chat.d.ts +1 -3
  132. package/components/chat/chat.js +2 -2
  133. package/components/chat/chat.js.map +1 -1
  134. package/components/chat/message-attachments.d.ts +6 -15
  135. package/components/chat/message-attachments.js.map +1 -1
  136. package/components/chat/themes/chat.base.css.js +1 -1
  137. package/components/chat/themes/chat.base.css.js.map +1 -1
  138. package/components/chat/themes/message.base.css.js +1 -1
  139. package/components/chat/themes/message.base.css.js.map +1 -1
  140. package/components/chat/utils.d.ts +0 -1
  141. package/components/chat/utils.js +1 -1
  142. package/components/chat/utils.js.map +1 -1
  143. package/components/checkbox/checkbox-base.d.ts +1 -1
  144. package/components/checkbox/checkbox.js +1 -1
  145. package/components/checkbox/checkbox.js.map +1 -1
  146. package/components/checkbox/themes/checkbox.base.css.js +1 -1
  147. package/components/checkbox/themes/checkbox.base.css.js.map +1 -1
  148. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
  149. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
  150. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
  151. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
  152. package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js +1 -1
  153. package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js.map +1 -1
  154. package/components/checkbox/themes/shared/switch/switch.fluent.css.js +1 -1
  155. package/components/checkbox/themes/shared/switch/switch.fluent.css.js.map +1 -1
  156. package/components/checkbox/themes/shared/switch/switch.indigo.css.js +1 -1
  157. package/components/checkbox/themes/shared/switch/switch.indigo.css.js.map +1 -1
  158. package/components/checkbox/themes/shared/switch/switch.material.css.js +1 -1
  159. package/components/checkbox/themes/shared/switch/switch.material.css.js.map +1 -1
  160. package/components/checkbox/themes/switch.base.css.js +1 -1
  161. package/components/checkbox/themes/switch.base.css.js.map +1 -1
  162. package/components/chip/chip.d.ts +2 -2
  163. package/components/chip/chip.js.map +1 -1
  164. package/components/color-picker/color-picker.d.ts +35 -34
  165. package/components/color-picker/color-picker.js +9 -4
  166. package/components/color-picker/color-picker.js.map +1 -1
  167. package/components/color-picker/common.d.ts +0 -2
  168. package/components/color-picker/common.js +2 -2
  169. package/components/color-picker/common.js.map +1 -1
  170. package/components/color-picker/converters.js.map +1 -1
  171. package/components/color-picker/picker-canvas.js.map +1 -1
  172. package/components/color-picker/themes/color-picker.base.css.js +1 -1
  173. package/components/color-picker/themes/color-picker.base.css.js.map +1 -1
  174. package/components/combo/combo.d.ts +18 -20
  175. package/components/combo/combo.js +8 -2
  176. package/components/combo/combo.js.map +1 -1
  177. package/components/combo/controllers/data.d.ts +7 -10
  178. package/components/combo/controllers/data.js.map +1 -1
  179. package/components/combo/themes/combo-item.base.css.js +1 -1
  180. package/components/combo/themes/combo-item.base.css.js.map +1 -1
  181. package/components/combo/themes/combo.base.css.js +1 -1
  182. package/components/combo/themes/combo.base.css.js.map +1 -1
  183. package/components/combo/themes/shared/combo.bootstrap.css.js +1 -1
  184. package/components/combo/themes/shared/combo.bootstrap.css.js.map +1 -1
  185. package/components/date-picker/date-picker.base.d.ts +33 -29
  186. package/components/date-picker/date-picker.base.js +15 -4
  187. package/components/date-picker/date-picker.base.js.map +1 -1
  188. package/components/date-picker/date-picker.d.ts +1 -1
  189. package/components/date-picker/date-picker.js +5 -3
  190. package/components/date-picker/date-picker.js.map +1 -1
  191. package/components/date-picker/themes/date-picker.base.css.js +1 -1
  192. package/components/date-picker/themes/date-picker.base.css.js.map +1 -1
  193. package/components/date-range-picker/date-range-input.d.ts +0 -2
  194. package/components/date-range-picker/date-range-input.js +0 -6
  195. package/components/date-range-picker/date-range-input.js.map +1 -1
  196. package/components/date-range-picker/date-range-picker.base.css.js +1 -1
  197. package/components/date-range-picker/date-range-picker.base.css.js.map +1 -1
  198. package/components/date-range-picker/date-range-picker.d.ts +22 -31
  199. package/components/date-range-picker/date-range-picker.js +7 -7
  200. package/components/date-range-picker/date-range-picker.js.map +1 -1
  201. package/components/date-range-picker/i18n.d.ts +21 -0
  202. package/components/date-range-picker/i18n.js +10 -0
  203. package/components/date-range-picker/i18n.js.map +1 -0
  204. package/components/date-range-picker/predefined-ranges-area.base.css.js +1 -1
  205. package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -1
  206. package/components/date-range-picker/predefined-ranges-area.d.ts +3 -3
  207. package/components/date-range-picker/predefined-ranges-area.js +2 -5
  208. package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
  209. package/components/date-range-picker/validators.d.ts +0 -4
  210. package/components/date-range-picker/validators.js +4 -4
  211. package/components/date-range-picker/validators.js.map +1 -1
  212. package/components/date-time-input/date-time-input.base.d.ts +39 -37
  213. package/components/date-time-input/date-time-input.base.js +6 -0
  214. package/components/date-time-input/date-time-input.base.js.map +1 -1
  215. package/components/date-time-input/date-time-input.d.ts +1 -11
  216. package/components/date-time-input/date-time-input.js +0 -6
  217. package/components/date-time-input/date-time-input.js.map +1 -1
  218. package/components/date-time-input/datetime-mask-parser.d.ts +0 -10
  219. package/components/date-time-input/datetime-mask-parser.js +1 -1
  220. package/components/date-time-input/datetime-mask-parser.js.map +1 -1
  221. package/components/dialog/dialog.js.map +1 -1
  222. package/components/divider/themes/divider.base.css.js +1 -1
  223. package/components/divider/themes/divider.base.css.js.map +1 -1
  224. package/components/dropdown/dropdown-group.d.ts +2 -10
  225. package/components/dropdown/dropdown-group.js +2 -27
  226. package/components/dropdown/dropdown-group.js.map +1 -1
  227. package/components/dropdown/dropdown.d.ts +17 -23
  228. package/components/dropdown/dropdown.js +5 -17
  229. package/components/dropdown/dropdown.js.map +1 -1
  230. package/components/dropdown/themes/dropdown-item.base.css.js +1 -1
  231. package/components/dropdown/themes/dropdown-item.base.css.js.map +1 -1
  232. package/components/dropdown/themes/dropdown.base.css.js +1 -1
  233. package/components/dropdown/themes/dropdown.base.css.js.map +1 -1
  234. package/components/file-input/file-input.d.ts +2 -2
  235. package/components/file-input/file-input.js.map +1 -1
  236. package/components/file-input/themes/file-input.base.css.js +1 -1
  237. package/components/file-input/themes/file-input.base.css.js.map +1 -1
  238. package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
  239. package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
  240. package/components/icon/icon.d.ts +1 -1
  241. package/components/icon/icon.registry.d.ts +6 -6
  242. package/components/icon/icon.registry.js.map +1 -1
  243. package/components/input/input.d.ts +3 -3
  244. package/components/input/input.js.map +1 -1
  245. package/components/input/themes/shared/input.indigo.css.js +1 -1
  246. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  247. package/components/input/themes/shared/input.material.css.js +1 -1
  248. package/components/input/themes/shared/input.material.css.js.map +1 -1
  249. package/components/list/themes/item.base.css.js +1 -1
  250. package/components/list/themes/item.base.css.js.map +1 -1
  251. package/components/mask-input/mask-history.d.ts +22 -18
  252. package/components/mask-input/mask-history.js.map +1 -1
  253. package/components/mask-input/mask-input.d.ts +1 -1
  254. package/components/mask-input/mask-parser.d.ts +11 -13
  255. package/components/mask-input/mask-parser.js.map +1 -1
  256. package/components/nav-drawer/themes/item.base.css.js +1 -1
  257. package/components/nav-drawer/themes/item.base.css.js.map +1 -1
  258. package/components/popover/popover.d.ts +45 -34
  259. package/components/popover/popover.js +54 -122
  260. package/components/popover/popover.js.map +1 -1
  261. package/components/popover/position/arrow.d.ts +19 -0
  262. package/components/popover/position/arrow.js +33 -0
  263. package/components/popover/position/arrow.js.map +1 -0
  264. package/components/popover/position/floating.d.ts +40 -0
  265. package/components/popover/position/floating.js +146 -0
  266. package/components/popover/position/floating.js.map +1 -0
  267. package/components/popover/position/native.d.ts +45 -0
  268. package/components/popover/position/native.js +158 -0
  269. package/components/popover/position/native.js.map +1 -0
  270. package/components/popover/position/strategy.d.ts +37 -0
  271. package/components/popover/position/strategy.js +21 -0
  272. package/components/popover/position/strategy.js.map +1 -0
  273. package/components/popover/position/types.d.ts +26 -0
  274. package/components/popover/position/types.js +15 -0
  275. package/components/popover/position/types.js.map +1 -0
  276. package/components/popover/themes/light/popover.base.css.js +1 -1
  277. package/components/popover/themes/light/popover.base.css.js.map +1 -1
  278. package/components/progress/circular-progress.d.ts +0 -5
  279. package/components/progress/circular-progress.js.map +1 -1
  280. package/components/progress/themes/linear/linear.progress.base.css.js +1 -1
  281. package/components/progress/themes/linear/linear.progress.base.css.js.map +1 -1
  282. package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.d.ts +1 -0
  283. package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js +3 -0
  284. package/components/progress/themes/linear/shared/linear.progress.bootstrap.css.js.map +1 -0
  285. package/components/progress/themes/linear/themes.js +3 -2
  286. package/components/progress/themes/linear/themes.js.map +1 -1
  287. package/components/qr-code/qr-code.d.ts +29 -2
  288. package/components/qr-code/qr-code.js +56 -13
  289. package/components/qr-code/qr-code.js.map +1 -1
  290. package/components/qr-code/renderer/export.d.ts +28 -0
  291. package/components/qr-code/renderer/export.js +120 -0
  292. package/components/qr-code/renderer/export.js.map +1 -0
  293. package/components/qr-code/types.d.ts +26 -0
  294. package/components/qr-code/types.js.map +1 -1
  295. package/components/radio/radio.d.ts +4 -4
  296. package/components/radio/radio.js +17 -14
  297. package/components/radio/radio.js.map +1 -1
  298. package/components/radio/themes/radio.base.css.js +1 -1
  299. package/components/radio/themes/radio.base.css.js.map +1 -1
  300. package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
  301. package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
  302. package/components/radio/themes/shared/radio.indigo.css.js +1 -1
  303. package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
  304. package/components/radio-group/radio-group.js.map +1 -1
  305. package/components/rating/rating.d.ts +6 -6
  306. package/components/rating/rating.js.map +1 -1
  307. package/components/select/select-group.d.ts +5 -10
  308. package/components/select/select-group.js +10 -34
  309. package/components/select/select-group.js.map +1 -1
  310. package/components/select/select.d.ts +12 -20
  311. package/components/select/select.js +4 -14
  312. package/components/select/select.js.map +1 -1
  313. package/components/select/themes/select.base.css.js +1 -1
  314. package/components/select/themes/select.base.css.js.map +1 -1
  315. package/components/select/themes/shared/select.bootstrap.css.js +1 -1
  316. package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
  317. package/components/slider/themes/shared/slider.material.css.js +1 -1
  318. package/components/slider/themes/shared/slider.material.css.js.map +1 -1
  319. package/components/slider/themes/slider.base.css.js +1 -1
  320. package/components/slider/themes/slider.base.css.js.map +1 -1
  321. package/components/snackbar/themes/snackbar.base.css.js +1 -1
  322. package/components/snackbar/themes/snackbar.base.css.js.map +1 -1
  323. package/components/splitter/splitter.d.ts +6 -6
  324. package/components/splitter/splitter.js.map +1 -1
  325. package/components/splitter/themes/splitter.base.css.js +1 -1
  326. package/components/splitter/themes/splitter.base.css.js.map +1 -1
  327. package/components/stepper/themes/step/step.base.css.js +1 -1
  328. package/components/stepper/themes/step/step.base.css.js.map +1 -1
  329. package/components/tabs/themes/shared/tab/tab.bootstrap.css.js +1 -1
  330. package/components/tabs/themes/shared/tab/tab.bootstrap.css.js.map +1 -1
  331. package/components/tabs/themes/shared/tab/tab.fluent.css.js +1 -1
  332. package/components/tabs/themes/shared/tab/tab.fluent.css.js.map +1 -1
  333. package/components/tabs/themes/shared/tab/tab.indigo.css.js +1 -1
  334. package/components/tabs/themes/shared/tab/tab.indigo.css.js.map +1 -1
  335. package/components/tabs/themes/shared/tab/tab.material.css.js +1 -1
  336. package/components/tabs/themes/shared/tab/tab.material.css.js.map +1 -1
  337. package/components/tabs/themes/shared/tabs/tabs.fluent.css.js +1 -1
  338. package/components/tabs/themes/shared/tabs/tabs.fluent.css.js.map +1 -1
  339. package/components/tabs/themes/shared/tabs/tabs.indigo.css.js +1 -1
  340. package/components/tabs/themes/shared/tabs/tabs.indigo.css.js.map +1 -1
  341. package/components/tabs/themes/shared/tabs/tabs.material.css.js +1 -1
  342. package/components/tabs/themes/shared/tabs/tabs.material.css.js.map +1 -1
  343. package/components/tabs/themes/tab.base.css.js +1 -1
  344. package/components/tabs/themes/tab.base.css.js.map +1 -1
  345. package/components/textarea/textarea.d.ts +1 -1
  346. package/components/textarea/textarea.js.map +1 -1
  347. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  348. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  349. package/components/textarea/themes/shared/textarea.common.css.js +1 -1
  350. package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
  351. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  352. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  353. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  354. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  355. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  356. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  357. package/components/tile-manager/themes/tile.base.css.js +1 -1
  358. package/components/tile-manager/themes/tile.base.css.js.map +1 -1
  359. package/components/tile-manager/tile-manager.d.ts +6 -7
  360. package/components/tile-manager/tile-manager.js.map +1 -1
  361. package/components/tile-manager/tile.d.ts +3 -3
  362. package/components/tile-manager/tile.js.map +1 -1
  363. package/components/toast/themes/toast.base.css.js +1 -1
  364. package/components/toast/themes/toast.base.css.js.map +1 -1
  365. package/components/toast/toast.d.ts +0 -2
  366. package/components/toast/toast.js.map +1 -1
  367. package/components/tooltip/controller.js.map +1 -1
  368. package/components/tooltip/service.js +4 -5
  369. package/components/tooltip/service.js.map +1 -1
  370. package/components/tooltip/themes/tooltip.base.css.js +1 -1
  371. package/components/tooltip/themes/tooltip.base.css.js.map +1 -1
  372. package/components/tooltip/tooltip.d.ts +34 -13
  373. package/components/tooltip/tooltip.js +8 -4
  374. package/components/tooltip/tooltip.js.map +1 -1
  375. package/components/tree/themes/item.base.css.js +1 -1
  376. package/components/tree/themes/item.base.css.js.map +1 -1
  377. package/components/tree/tree-item.d.ts +6 -6
  378. package/components/tree/tree-item.js.map +1 -1
  379. package/components/tree/tree.navigation.d.ts +5 -6
  380. package/components/tree/tree.navigation.js.map +1 -1
  381. package/components/tree/tree.selection.js.map +1 -1
  382. package/components/types.d.ts +1 -1
  383. package/components/types.js.map +1 -1
  384. package/components/validation-container/themes/validator.base.css.js +1 -1
  385. package/components/validation-container/themes/validator.base.css.js.map +1 -1
  386. package/components/validation-container/validation-container.d.ts +10 -12
  387. package/components/validation-container/validation-container.js +14 -17
  388. package/components/validation-container/validation-container.js.map +1 -1
  389. package/components/virtualization/engine.d.ts +5 -5
  390. package/components/virtualization/engine.js.map +1 -1
  391. package/components/virtualization/virtualization.d.ts +61 -63
  392. package/components/virtualization/virtualization.js +6 -5
  393. package/components/virtualization/virtualization.js.map +1 -1
  394. package/custom-elements.json +16769 -19698
  395. package/igniteui-webcomponents.css-data.json +2 -2
  396. package/igniteui-webcomponents.html-data.json +1 -1
  397. package/index.d.ts +3 -1
  398. package/index.js +2 -0
  399. package/index.js.map +1 -1
  400. package/internals/abort-handler.d.ts +13 -25
  401. package/internals/abort-handler.js +4 -6
  402. package/internals/abort-handler.js.map +1 -1
  403. package/internals/context.d.ts +13 -7
  404. package/internals/context.js +2 -1
  405. package/internals/context.js.map +1 -1
  406. package/internals/controllers/adopt-styles.d.ts +19 -20
  407. package/internals/controllers/adopt-styles.js +3 -8
  408. package/internals/controllers/adopt-styles.js.map +1 -1
  409. package/internals/controllers/aria-projection.d.ts +56 -55
  410. package/internals/controllers/aria-projection.js +14 -15
  411. package/internals/controllers/aria-projection.js.map +1 -1
  412. package/internals/controllers/async-consumer.js.map +1 -1
  413. package/internals/controllers/command.d.ts +15 -30
  414. package/internals/controllers/command.js +2 -7
  415. package/internals/controllers/command.js.map +1 -1
  416. package/internals/controllers/context-provider.d.ts +7 -13
  417. package/internals/controllers/context-provider.js.map +1 -1
  418. package/internals/controllers/focus-ring.d.ts +10 -30
  419. package/internals/controllers/focus-ring.js +6 -12
  420. package/internals/controllers/focus-ring.js.map +1 -1
  421. package/internals/controllers/fullscreen.d.ts +7 -23
  422. package/internals/controllers/fullscreen.js +3 -9
  423. package/internals/controllers/fullscreen.js.map +1 -1
  424. package/internals/controllers/gestures.d.ts +10 -29
  425. package/internals/controllers/gestures.js +1 -3
  426. package/internals/controllers/gestures.js.map +1 -1
  427. package/internals/controllers/group.d.ts +13 -30
  428. package/internals/controllers/group.js.map +1 -1
  429. package/internals/controllers/host-listeners.d.ts +28 -0
  430. package/internals/controllers/host-listeners.js +27 -0
  431. package/internals/controllers/host-listeners.js.map +1 -0
  432. package/internals/controllers/id-resolver.d.ts +8 -9
  433. package/internals/controllers/id-resolver.js +6 -14
  434. package/internals/controllers/id-resolver.js.map +1 -1
  435. package/internals/controllers/internals.d.ts +53 -104
  436. package/internals/controllers/internals.js +40 -13
  437. package/internals/controllers/internals.js.map +1 -1
  438. package/internals/controllers/key-bindings.d.ts +61 -158
  439. package/internals/controllers/key-bindings.js +68 -67
  440. package/internals/controllers/key-bindings.js.map +1 -1
  441. package/internals/controllers/keys.d.ts +32 -0
  442. package/internals/controllers/keys.js +20 -0
  443. package/internals/controllers/keys.js.map +1 -0
  444. package/internals/controllers/mutation-observer.d.ts +14 -37
  445. package/internals/controllers/mutation-observer.js +1 -1
  446. package/internals/controllers/mutation-observer.js.map +1 -1
  447. package/internals/controllers/resize-observer.d.ts +9 -19
  448. package/internals/controllers/resize-observer.js.map +1 -1
  449. package/internals/controllers/root-click.d.ts +11 -42
  450. package/internals/controllers/root-click.js +4 -6
  451. package/internals/controllers/root-click.js.map +1 -1
  452. package/internals/controllers/roving-focus.d.ts +16 -35
  453. package/internals/controllers/roving-focus.js.map +1 -1
  454. package/internals/controllers/slot.d.ts +25 -54
  455. package/internals/controllers/slot.js +6 -6
  456. package/internals/controllers/slot.js.map +1 -1
  457. package/internals/controllers/toggle.d.ts +44 -48
  458. package/internals/controllers/toggle.js.map +1 -1
  459. package/internals/date/compare.js.map +1 -1
  460. package/internals/date/converters.d.ts +10 -7
  461. package/internals/date/converters.js.map +1 -1
  462. package/internals/date/model.d.ts +9 -16
  463. package/internals/date/model.js +22 -25
  464. package/internals/date/model.js.map +1 -1
  465. package/internals/decorators/blazorAdditionalDependencies.d.ts +4 -2
  466. package/internals/decorators/blazorAdditionalDependencies.js.map +1 -1
  467. package/internals/decorators/blazorDeepImport.d.ts +1 -3
  468. package/internals/decorators/blazorDeepImport.js.map +1 -1
  469. package/internals/decorators/blazorInclude.d.ts +3 -2
  470. package/internals/decorators/blazorInclude.js.map +1 -1
  471. package/internals/decorators/blazorIndirectRender.d.ts +1 -3
  472. package/internals/decorators/blazorIndirectRender.js.map +1 -1
  473. package/internals/decorators/blazorSuppressComponent.d.ts +1 -3
  474. package/internals/decorators/blazorSuppressComponent.js.map +1 -1
  475. package/internals/decorators/coerced-property.d.ts +14 -20
  476. package/internals/decorators/coerced-property.js.map +1 -1
  477. package/internals/decorators/shadow-options.d.ts +2 -5
  478. package/internals/decorators/shadow-options.js.map +1 -1
  479. package/internals/definitions/defineAllComponents.js +6 -0
  480. package/internals/definitions/defineAllComponents.js.map +1 -1
  481. package/internals/directives/drag.d.ts +51 -81
  482. package/internals/directives/drag.js +27 -89
  483. package/internals/directives/drag.js.map +1 -1
  484. package/internals/directives/pointer-operation.d.ts +75 -0
  485. package/internals/directives/pointer-operation.js +92 -0
  486. package/internals/directives/pointer-operation.js.map +1 -0
  487. package/internals/directives/resize.d.ts +36 -64
  488. package/internals/directives/resize.js +18 -85
  489. package/internals/directives/resize.js.map +1 -1
  490. package/internals/i18n/EN/calendar.resources.d.ts +8 -2
  491. package/internals/i18n/EN/calendar.resources.js +2 -2
  492. package/internals/i18n/EN/calendar.resources.js.map +1 -1
  493. package/internals/i18n/EN/chat.resources.d.ts +8 -2
  494. package/internals/i18n/EN/chat.resources.js +3 -10
  495. package/internals/i18n/EN/chat.resources.js.map +1 -1
  496. package/internals/i18n/EN/date-picker.resources.d.ts +6 -4
  497. package/internals/i18n/EN/date-picker.resources.js +1 -7
  498. package/internals/i18n/EN/date-picker.resources.js.map +1 -1
  499. package/internals/i18n/EN/date-range-picker.resources.d.ts +9 -2
  500. package/internals/i18n/EN/date-range-picker.resources.js +2 -2
  501. package/internals/i18n/EN/date-range-picker.resources.js.map +1 -1
  502. package/internals/i18n/i18n-controller.d.ts +44 -46
  503. package/internals/i18n/i18n-controller.js +46 -33
  504. package/internals/i18n/i18n-controller.js.map +1 -1
  505. package/internals/i18n/utils.d.ts +9 -4
  506. package/internals/i18n/utils.js +4 -27
  507. package/internals/i18n/utils.js.map +1 -1
  508. package/internals/mixins/alert.d.ts +10 -25
  509. package/internals/mixins/alert.js.map +1 -1
  510. package/internals/mixins/combo-box.d.ts +21 -11
  511. package/internals/mixins/combo-box.js +16 -22
  512. package/internals/mixins/combo-box.js.map +1 -1
  513. package/internals/mixins/event-emitter.js +9 -11
  514. package/internals/mixins/event-emitter.js.map +1 -1
  515. package/internals/mixins/forms/associated-required.d.ts +4 -4
  516. package/internals/mixins/forms/associated-required.js.map +1 -1
  517. package/internals/mixins/forms/associated.d.ts +4 -2
  518. package/internals/mixins/forms/associated.js +8 -19
  519. package/internals/mixins/forms/associated.js.map +1 -1
  520. package/internals/mixins/forms/form-transformers.js.map +1 -1
  521. package/internals/mixins/forms/types.d.ts +24 -80
  522. package/internals/mixins/forms/types.js.map +1 -1
  523. package/internals/mixins/group.d.ts +18 -0
  524. package/internals/mixins/group.js +37 -0
  525. package/internals/mixins/group.js.map +1 -0
  526. package/internals/mixins/i18n.d.ts +10 -16
  527. package/internals/mixins/i18n.js.map +1 -1
  528. package/internals/mixins/mask-behavior.d.ts +8 -22
  529. package/internals/mixins/mask-behavior.js +1 -2
  530. package/internals/mixins/mask-behavior.js.map +1 -1
  531. package/internals/mixins/option.d.ts +1 -2
  532. package/internals/mixins/option.js +2 -1
  533. package/internals/mixins/option.js.map +1 -1
  534. package/internals/part-map.d.ts +4 -2
  535. package/internals/part-map.js +1 -1
  536. package/internals/part-map.js.map +1 -1
  537. package/internals/templates/input-shell.d.ts +8 -17
  538. package/internals/templates/input-shell.js +4 -1
  539. package/internals/templates/input-shell.js.map +1 -1
  540. package/internals/templates/masked-input.d.ts +7 -8
  541. package/internals/templates/masked-input.js.map +1 -1
  542. package/internals/templates/slotted-icon.d.ts +7 -12
  543. package/internals/templates/slotted-icon.js.map +1 -1
  544. package/internals/templates/toggle-shell.d.ts +6 -7
  545. package/internals/templates/toggle-shell.js.map +1 -1
  546. package/internals/timing.d.ts +5 -14
  547. package/internals/timing.js.map +1 -1
  548. package/internals/utils/arrays.d.ts +21 -21
  549. package/internals/utils/arrays.js +14 -0
  550. package/internals/utils/arrays.js.map +1 -1
  551. package/internals/utils/dom.d.ts +51 -39
  552. package/internals/utils/dom.js +1 -2
  553. package/internals/utils/dom.js.map +1 -1
  554. package/internals/utils/events.d.ts +29 -16
  555. package/internals/utils/events.js +9 -1
  556. package/internals/utils/events.js.map +1 -1
  557. package/internals/utils/lit.d.ts +5 -2
  558. package/internals/utils/lit.js.map +1 -1
  559. package/internals/utils/math.d.ts +8 -6
  560. package/internals/utils/math.js.map +1 -1
  561. package/internals/utils/objects.d.ts +3 -20
  562. package/internals/utils/objects.js +1 -39
  563. package/internals/utils/objects.js.map +1 -1
  564. package/internals/utils/strings.d.ts +9 -11
  565. package/internals/utils/strings.js.map +1 -1
  566. package/internals/utils/types.d.ts +16 -3
  567. package/internals/utils/types.js +3 -0
  568. package/internals/utils/types.js.map +1 -1
  569. package/internals/validators.d.ts +9 -8
  570. package/internals/validators.js +12 -6
  571. package/internals/validators.js.map +1 -1
  572. package/package.json +1 -1
  573. package/skills/README.md +3 -0
  574. package/skills/igniteui-wc-figma-to-app/SKILL.md +907 -0
  575. package/skills/igniteui-wc-figma-to-app/references/asset-extraction.md +363 -0
  576. package/skills/igniteui-wc-figma-to-app/references/design-token-bridge.md +407 -0
  577. package/skills/igniteui-wc-figma-to-app/references/figma-component-map.md +325 -0
  578. package/skills/igniteui-wc-figma-to-app/references/mcp-setup.md +409 -0
  579. package/skills/igniteui-wc-figma-to-app/references/validation-patterns.md +376 -0
  580. package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +21 -0
  581. package/skills/igniteui-wc-integrate-with-framework/SKILL.md +4 -3
  582. package/skills/igniteui-wc-integrate-with-framework/references/vanilla-js.md +14 -0
  583. package/skills/igniteui-wc-migrate-grid-lite-to-premium/SKILL.md +12 -2
  584. package/theming/config.d.ts +14 -5
  585. package/theming/config.js +38 -18
  586. package/theming/config.js.map +1 -1
  587. package/theming/context.d.ts +1 -23
  588. package/theming/context.js.map +1 -1
  589. package/theming/theming-controller.d.ts +2 -32
  590. package/theming/theming-controller.js +15 -21
  591. package/theming/theming-controller.js.map +1 -1
  592. package/theming/theming-event.d.ts +0 -7
  593. package/theming/theming-event.js +0 -13
  594. package/theming/theming-event.js.map +1 -1
  595. package/theming/types.d.ts +1 -8
  596. package/theming/types.js.map +1 -1
  597. package/web-types.json +3 -3
  598. package/animations/presets/slide/index.d.ts +0 -3
  599. package/animations/presets/slide/index.js +0 -16
  600. package/animations/presets/slide/index.js.map +0 -1
  601. package/internals/controllers/root-scroll.d.ts +0 -31
  602. package/internals/controllers/root-scroll.js +0 -71
  603. package/internals/controllers/root-scroll.js.map +0 -1
  604. package/theming/utils.d.ts +0 -11
  605. package/theming/utils.js +0 -20
  606. package/theming/utils.js.map +0 -1
@@ -0,0 +1,376 @@
1
+ # Playwright Visual Validation Patterns — Web Components
2
+
3
+ > **Part of the [`igniteui-wc-figma-to-app`](../SKILL.md) skill.**
4
+ >
5
+ > Use this file in Phase 5 for the measurement-driven validation loop. Read it in full
6
+ > before calling any Playwright tool.
7
+
8
+ ---
9
+
10
+ ## Core Philosophy
11
+
12
+ **Measure, don't eyeball.** The goal is not visual regression (did this change since last
13
+ week?) but design fidelity (does this match the Figma spec?). Screenshots give you the
14
+ gestalt; `playwright_browser_evaluate` gives you the numbers; numbers drive corrections.
15
+
16
+ **The Web Components twist:** almost everything you want to measure lives inside a shadow
17
+ root. `document.querySelector('igc-card .title')` returns `null` — not because the element
18
+ is missing, but because the selector cannot cross the boundary. Every snippet below is
19
+ shadow-aware. Use them instead of writing ad-hoc selectors.
20
+
21
+ ---
22
+
23
+ ## Phase 5 Tool Sequence
24
+
25
+ ```
26
+ 1. playwright_browser_navigate → open the app at the target route
27
+ 2. playwright_browser_console_messages → catch startup/registration errors
28
+ 3. playwright_browser_resize → match the Figma artboard dimensions
29
+ 4. playwright_browser_navigate → re-navigate after resize (required)
30
+ 5. playwright_browser_evaluate → registration + theme audit (fail fast)
31
+ 6. playwright_browser_take_screenshot → capture the full viewport
32
+ 7. [Visual comparison] → against the Phase 1c reference, section by section
33
+ 8. playwright_browser_evaluate → measure EVERY section in the Phase 1g Surfaces table
34
+ 9. [Surfaces audit] → assert background, radius, padding, border
35
+ 10. [Action controls audit] → count and name every control, shadow roots included
36
+ 11. [Input variant audit] → check `outlined` against the Phase 1d variant
37
+ 12. [Classify mismatches] → severity table
38
+ 13. [Apply fixes] → edit source files
39
+ 14. playwright_browser_navigate → reload after fixes
40
+ 15. Repeat 6–14 until no Critical/Major issues remain
41
+ 16. Do NOT advance to the next artboard until all checks pass on this one
42
+ 17. playwright_browser_snapshot → final accessibility check
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Known Pitfalls
48
+
49
+ ### 1. Viewport reset after resize
50
+
51
+ After `playwright_browser_resize`, the browser may navigate itself to `about:blank`, and
52
+ subsequent screenshots and measurements come back empty.
53
+
54
+ ```
55
+ playwright_browser_resize({ width: 1440, height: 900 })
56
+ playwright_browser_navigate({ url: "http://localhost:5173/dashboard" })
57
+ // NOW safe to screenshot and measure
58
+ ```
59
+
60
+ ### 2. `playwright_browser_evaluate` uses `function`, not `script`
61
+
62
+ Passing `script` fails with *"Invalid input: expected string, received undefined"*.
63
+
64
+ ```
65
+ // WRONG
66
+ playwright_browser_evaluate({ script: "return document.title;" })
67
+
68
+ // CORRECT
69
+ playwright_browser_evaluate({ function: "() => document.title" })
70
+ ```
71
+
72
+ ### 3. Measuring before the components have upgraded
73
+
74
+ Custom elements upgrade asynchronously, and Lit renders on a microtask. Measuring too early
75
+ returns pre-upgrade box metrics (often `height: 0`). Wait for definition and render:
76
+
77
+ ```
78
+ playwright_browser_evaluate({
79
+ function: "async () => { const tags = [...new Set([...document.querySelectorAll('*')].map(e => e.tagName.toLowerCase()).filter(t => t.startsWith('igc-')))]; await Promise.all(tags.map(t => customElements.whenDefined(t))); const els = [...document.querySelectorAll('*')].filter(e => e.tagName.startsWith('IGC-')); await Promise.all(els.map(e => e.updateComplete).filter(Boolean)); await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); return { upgraded: tags.length }; }"
80
+ })
81
+ ```
82
+
83
+ ### 4. An unregistered element fails silently
84
+
85
+ A missing `defineComponents(...)` produces **no console error** — the tag renders as an
86
+ empty inline box. Run the registration audit before blaming CSS.
87
+
88
+ ### 5. Dev server must be running
89
+
90
+ ```
91
+ playwright_browser_navigate({ url: "http://localhost:5173" })
92
+ playwright_browser_console_messages()
93
+ ```
94
+
95
+ `ERR_CONNECTION_REFUSED` or a blank page means the Vite dev server is not running — ask the
96
+ user to run `npm start`. Note the port: Vite defaults to **5173**.
97
+
98
+ ---
99
+
100
+ ## The Deep-Query Helper
101
+
102
+ Every measurement snippet below assumes this helper. It walks shadow roots, so a selector
103
+ like `igc-card >>> [part="header"]` resolves.
104
+
105
+ ```javascript
106
+ // Paste as the first statements of any evaluate() function.
107
+ const deepQuery = (path, root = document) =>
108
+ path.split('>>>').map(s => s.trim()).reduce(
109
+ (node, sel) => node && (node.shadowRoot || node).querySelector(sel),
110
+ root
111
+ );
112
+
113
+ const deepQueryAll = (sel, root = document) => {
114
+ const out = [];
115
+ const walk = (node) => {
116
+ if (!node) return;
117
+ out.push(...node.querySelectorAll(sel));
118
+ node.querySelectorAll('*').forEach(el => el.shadowRoot && walk(el.shadowRoot));
119
+ };
120
+ walk(root);
121
+ return out;
122
+ };
123
+ ```
124
+
125
+ Prefer measuring the **host element** (`igc-card`) for box metrics — width, height,
126
+ position, margin — and pierce only for internals that the design calls out (header height,
127
+ row padding). When you must pierce, target documented `::part(...)` names from `get_doc`,
128
+ never internal class names.
129
+
130
+ ---
131
+
132
+ ## Reusable Measurement Snippets
133
+
134
+ All snippets use the `function` parameter.
135
+
136
+ ### Registration + theme audit (run first, every page)
137
+
138
+ ```
139
+ playwright_browser_evaluate({
140
+ function: "() => { const tags = [...new Set(deepQueryAll('*').map(e => e.tagName.toLowerCase()).filter(t => t.startsWith('igc-')))]; const undefinedTags = tags.filter(t => !customElements.get(t)); const s = getComputedStyle(document.documentElement); return { tags, undefinedTags, theme: s.getPropertyValue('--ig-theme').trim(), variant: s.getPropertyValue('--ig-theme-variant').trim(), primary500: s.getPropertyValue('--ig-primary-500').trim(), surface500: s.getPropertyValue('--ig-surface-500').trim(), fontFamily: s.getPropertyValue('--ig-font-family').trim() }; }"
141
+ })
142
+ ```
143
+
144
+ Assert: `undefinedTags` is empty; `theme` and `variant` match the design system and variant
145
+ resolved in Phase 3. An empty `theme` means no theme CSS is loaded — components silently
146
+ fall back to `bootstrap` / `light`.
147
+
148
+ ### Measure a single element (shadow-aware)
149
+
150
+ ```
151
+ playwright_browser_evaluate({
152
+ function: "() => { const deepQuery = (path, root = document) => path.split('>>>').map(s => s.trim()).reduce((n, sel) => n && (n.shadowRoot || n).querySelector(sel), root); const el = deepQuery('<YOUR_SELECTOR_PATH>'); if (!el) return { error: 'element not found' }; const s = getComputedStyle(el); const r = el.getBoundingClientRect(); return { fontSize: s.fontSize, fontWeight: s.fontWeight, lineHeight: s.lineHeight, color: s.color, backgroundColor: s.backgroundColor, padding: s.padding, margin: s.margin, gap: s.gap, borderRadius: s.borderRadius, border: s.border, boxShadow: s.boxShadow, width: Math.round(r.width), height: Math.round(r.height), top: Math.round(r.top), left: Math.round(r.left) }; }"
153
+ })
154
+ ```
155
+
156
+ > A host element with `display: inline` (the Lit default) reports a misleading box. If width
157
+ > or height look wrong, check for a missing `:host { display: block }` before chasing padding.
158
+
159
+ ### Surfaces audit (mandatory — every page, every Phase 1g surface)
160
+
161
+ ```
162
+ playwright_browser_evaluate({
163
+ function: "() => { const sections = { /* fill from the Phase 1g Surfaces table */ sectionA: '.section-a', sectionB: '.section-b' }; const deepQuery = (path, root = document) => path.split('>>>').map(s => s.trim()).reduce((n, sel) => n && (n.shadowRoot || n).querySelector(sel), root); const out = {}; for (const [key, sel] of Object.entries(sections)) { const el = deepQuery(sel); if (!el) { out[key] = 'NOT FOUND'; continue; } const s = getComputedStyle(el); const r = el.getBoundingClientRect(); out[key] = { bg: s.backgroundColor, radius: s.borderRadius, padding: s.padding, border: s.border, shadow: s.boxShadow, w: Math.round(r.width), h: Math.round(r.height) }; } return out; }"
164
+ })
165
+ ```
166
+
167
+ **Assert for each entry:**
168
+
169
+ - Figma surface has a background → `bg !== 'rgba(0, 0, 0, 0)'`
170
+ - Figma section floats on the page background → `bg === 'rgba(0, 0, 0, 0)'` (do not over-surface)
171
+ - `radius`, `padding`, `border`, `shadow` match the Phase 1g values
172
+ - children shown inside the card in Figma are inside the card's bounding rect in the DOM
173
+
174
+ ### Action controls audit (mandatory, every page)
175
+
176
+ ```
177
+ playwright_browser_evaluate({
178
+ function: "() => { const out = []; const walk = (root) => { root.querySelectorAll('igc-button, igc-icon-button, button, [role=button]').forEach(b => { if (b.tagName === 'BUTTON' && b.getRootNode().host?.matches('igc-button, igc-icon-button')) return; out.push((b.textContent || '').trim().replace(/\\s+/g, ' ') || b.getAttribute('aria-label') || b.getAttribute('name') || '(unlabeled)'); }); root.querySelectorAll('*').forEach(el => el.shadowRoot && walk(el.shadowRoot)); }; walk(document); return { count: out.length, controls: out }; }"
179
+ })
180
+ ```
181
+
182
+ Compare against the Phase 1d inventory. Any control not in the design context output is
183
+ fabricated and must be removed. `(unlabeled)` entries are also an accessibility failure —
184
+ icon-only buttons need `aria-label`.
185
+
186
+ ### Input variant audit (every page with form controls)
187
+
188
+ ```
189
+ playwright_browser_evaluate({
190
+ function: "() => { const tags = ['igc-input','igc-textarea','igc-mask-input','igc-date-time-input','igc-file-input','igc-select','igc-combo','igc-date-picker','igc-date-range-picker']; const out = {}; tags.forEach(t => { const els = deepQueryAll(t); if (els.length) out[t] = { count: els.length, outlined: els.filter(e => e.hasAttribute('outlined')).length }; }); return out; }"
191
+ })
192
+ ```
193
+
194
+ Compare against the variant detected in Phase 1d. If the design uses border-style inputs
195
+ everywhere, every control should report `outlined === count`.
196
+
197
+ ### Property-binding audit (collection-bound charts, grids, combos)
198
+
199
+ ```
200
+ playwright_browser_evaluate({
201
+ function: "() => { const defs = [ ['igc-category-chart', ['dataSource', 'data']], ['igc-data-chart', ['dataSource', 'data']], ['igc-pie-chart', ['dataSource', 'data']], ['igc-doughnut-chart', ['dataSource', 'data']], ['igc-financial-chart', ['dataSource', 'data']], ['igc-sparkline', ['dataSource', 'data']], ['igc-treemap', ['dataSource', 'data']], ['igc-funnel-chart', ['dataSource', 'data']], ['igc-grid', ['data']], ['igc-grid-lite', ['data']], ['igc-combo', ['data']] ]; const out = {}; defs.forEach(([tag, dataProps]) => { deepQueryAll(tag).forEach((el, i) => { const dataProp = dataProps.find(prop => Array.isArray(el[prop])); const brushProps = ['brushes', 'outlines'].filter(prop => Array.isArray(el[prop])); out[tag + '#' + i] = { dataLength: dataProp ? el[dataProp].length : null, brushCollections: brushProps.length ? Object.fromEntries(brushProps.map(prop => [prop, el[prop]])) : null, height: Math.round(el.getBoundingClientRect().height) }; }); }); return out; }"
202
+ })
203
+ ```
204
+
205
+ `dataLength: null` means the collection was set as an attribute (or not at all) instead of
206
+ as a property. `brushCollections: null` on a chart means none of its documented
207
+ `brushes` / `outlines` arrays were assigned, so it is still using the default palette instead
208
+ of the Figma series colors. `height: 0` means the element or its grid track has no height.
209
+ Use this audit for the collection-bound host tags in the selected plan; gauges and maps need
210
+ their own host-specific validation once you know which properties the chosen component binds.
211
+
212
+ ### Measure the gap between two elements
213
+
214
+ ```
215
+ playwright_browser_evaluate({
216
+ function: "() => { const a = document.querySelector('<SELECTOR_A>'); const b = document.querySelector('<SELECTOR_B>'); if (!a || !b) return { error: 'one or both elements not found' }; const ra = a.getBoundingClientRect(); const rb = b.getBoundingClientRect(); return { gapBetween: Math.round(rb.top - ra.bottom), aHeight: Math.round(ra.height), bTop: Math.round(rb.top) }; }"
217
+ })
218
+ ```
219
+
220
+ ### Measure typography scale
221
+
222
+ ```
223
+ playwright_browser_evaluate({
224
+ function: "() => { const sels = ['h1','h2','h3','p','.subtitle','.caption']; const out = {}; sels.forEach(sel => { const el = document.querySelector(sel); if (el) { const s = getComputedStyle(el); out[sel] = { fontSize: s.fontSize, fontWeight: s.fontWeight, lineHeight: s.lineHeight, fontFamily: s.fontFamily }; } }); return out; }"
225
+ })
226
+ ```
227
+
228
+ ### Measure grid layout proportions
229
+
230
+ ```
231
+ playwright_browser_evaluate({
232
+ function: "() => { const el = document.querySelector('<LAYOUT_CONTAINER>'); if (!el) return { error: 'layout container not found' }; const s = getComputedStyle(el); return { display: s.display, gridTemplateColumns: s.gridTemplateColumns, gridTemplateRows: s.gridTemplateRows, gap: s.gap, width: Math.round(el.getBoundingClientRect().width) }; }"
233
+ })
234
+ ```
235
+
236
+ ### Inspect a component's parts (when a token override is not landing)
237
+
238
+ ```
239
+ playwright_browser_evaluate({
240
+ function: "() => { const host = document.querySelector('<igc-tag>'); if (!host || !host.shadowRoot) return { error: 'host or shadow root not found' }; return [...host.shadowRoot.querySelectorAll('[part]')].map(el => ({ part: el.getAttribute('part'), bg: getComputedStyle(el).backgroundColor, color: getComputedStyle(el).color })); }"
241
+ })
242
+ ```
243
+
244
+ Use the reported `part` names — they are the supported styling surface when a design token
245
+ does not exist for a detail the design requires.
246
+
247
+ ---
248
+
249
+ ## Mismatch Severity Classification
250
+
251
+ | Severity | Category | Decision rule | Action |
252
+ | ------------ | -------------------------- | ----------------------------------------------------------- | --------------------------- |
253
+ | **Critical** | Missing element | Present in Figma, absent from DOM | Auto-fix |
254
+ | **Critical** | Unregistered component | Tag present but `customElements.get()` is undefined | Auto-fix (add registration) |
255
+ | **Critical** | Broken layout | Overlapping elements, content outside bounds, zero-height | Auto-fix |
256
+ | **Critical** | Wrong design system active | `--ig-theme` does not match the Phase 3 resolution | Auto-fix (theme import) |
257
+ | **Major** | Wrong component | Figma shows a combo, code has a select | Auto-fix |
258
+ | **Major** | Wrong variant | `variant="flat"` when the design shows contained | Auto-fix |
259
+ | **Major** | Collection not bound | `data` / `dataSource` / `brushes` set as an attribute | Auto-fix |
260
+ | **Minor** | Spacing off by > 4px | `gap: 24px` measured, Figma shows `16px` | Auto-fix if a single property |
261
+ | **Minor** | Font size wrong by > 2px | `16px` measured, Figma shows `14px` | Auto-fix |
262
+ | **Cosmetic** | Color shade | `rgb(50,50,50)` vs `#333333` (perceptually identical) | Report only |
263
+ | **Cosmetic** | Spacing off by ≤ 4px | Rounding or sub-pixel difference | Report only |
264
+
265
+ ### Mismatch report format
266
+
267
+ ```
268
+ ISSUE: <concise description of the mismatch>
269
+ LOCATION: <component/section in the view>
270
+ FIGMA: <value from the design context>
271
+ RENDERED: <value measured by Playwright>
272
+ SEVERITY: <Critical | Major | Minor | Cosmetic>
273
+ FIX: <specific, one-line code change>
274
+ ```
275
+
276
+ Example:
277
+
278
+ ```
279
+ ISSUE: Card surface is transparent
280
+ LOCATION: igc-card in the "Budget Categories" section
281
+ FIGMA: background = #222222 (Surfaces table row 1)
282
+ RENDERED: backgroundColor = rgba(0, 0, 0, 0)
283
+ SEVERITY: Critical
284
+ FIX: create_component_theme("card", tokens: { background: "var(--ig-surface-100)" })
285
+ and apply the generated block — do not set background on a wrapper div.
286
+
287
+ ISSUE: Chart series colors are the default palette
288
+ LOCATION: igc-category-chart in the "Spending" panel
289
+ FIGMA: series = #9DE772, #6DB1FF
290
+ RENDERED: brushes = null
291
+ SEVERITY: Major
292
+ FIX: chart.brushes = ['#9DE772', '#6DB1FF'] assigned as a property after validating
293
+ with get_chart_series_colors({ customBrushes: [...] }).
294
+ ```
295
+
296
+ ---
297
+
298
+ ## Section-by-Section Comparison Checklist
299
+
300
+ | Section | What to check |
301
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------ |
302
+ | Top navigation | Height, background, slotted `start`/`end` content alignment, action icon positions |
303
+ | Sidebar / nav drawer | Width (`--menu-full-width`), `position="relative"` vs modal, item spacing, icon + label alignment, selected state |
304
+ | Page header | Typography size and weight, breadcrumb spacing, action button prominence |
305
+ | Data grid | Column widths (at least one fluid), header background, row height, cell padding, grid theme CSS actually loaded |
306
+ | Cards / panels | **Background** (must not be `rgba(0,0,0,0)` when Figma shows a surface), border, radius, shadow, padding |
307
+ | Surface containers | Every entry in the Phase 1g Surfaces table; children enclosed within the card's bounding rect |
308
+ | Form fields | `outlined` presence matching the Phase 1d variant; label placement; helper text slot |
309
+ | Action controls | Count and names vs the Phase 1d inventory; `aria-label` on icon-only buttons |
310
+ | Buttons | `variant` (flat/outlined/contained/fab), color, typography, padding |
311
+ | Charts | Chart type, **series colors** (explicit `brushes`), marker visibility, legend placement, non-zero height |
312
+ | Lists | Slot usage (`start`/`title`/`subtitle`/`end`), item height, divider treatment |
313
+ | Footer / paginator | Alignment, spacing, font size |
314
+
315
+ ---
316
+
317
+ ## Accessibility Snapshot Checks
318
+
319
+ After `playwright_browser_snapshot()`, verify:
320
+
321
+ | Check | What to look for |
322
+ | --------------------- | ------------------------------------------------------------------------ |
323
+ | Heading hierarchy | `h1` → `h2` → `h3` without skipping levels |
324
+ | Button labels | Every button has text or `aria-label` — icon-only buttons especially |
325
+ | Input labels | Inputs use the `label` attribute or an associated `<label>` |
326
+ | Navigation landmark | `<nav>` or `role="navigation"` wraps the main navigation |
327
+ | Main content landmark | `<main>` or `role="main"` wraps the primary content region |
328
+ | Image alt text | Meaningful `<img>` elements have non-empty `alt` |
329
+ | Drawer labelling | `igc-nav-drawer` has a `label` when more than one nav landmark exists |
330
+
331
+ ---
332
+
333
+ ## Common Fix Patterns
334
+
335
+ ### Style correction — in order of preference
336
+
337
+ 1. **Component design token** — `get_component_design_tokens` → `create_component_theme`
338
+ 2. **Documented `::part(...)`** — for details with no token
339
+ 3. **Slotted content you own** — style it in your own CSS
340
+ 4. Never internal class names; never attempts to reach into a shadow root from page CSS
341
+
342
+ ### Density and spacing
343
+
344
+ ```
345
+ set_size({ component: "calendar", size: "small", platform: "webcomponents" })
346
+ set_spacing({ component: "calendar", spacing: 0.75, platform: "webcomponents" })
347
+ set_size({ scope: ".compact-toolbar", size: "small", platform: "webcomponents" })
348
+ ```
349
+
350
+ Or directly:
351
+
352
+ ```css
353
+ igc-calendar {
354
+ --ig-size: var(--ig-size-small);
355
+ --ig-spacing: 0.75;
356
+ }
357
+ ```
358
+
359
+ Choose the multiplier by visual judgment — never by mapping a Figma pixel value.
360
+
361
+ ### Color correction
362
+
363
+ ```css
364
+ /* never a raw hex once a palette exists */
365
+ background: var(--ig-primary-500);
366
+ color: var(--ig-primary-500-contrast);
367
+ ```
368
+
369
+ Use `get_color({ color: "primary", variant: "500", contrast: true })` when unsure of the
370
+ exact variable name.
371
+
372
+ ### Missing element
373
+
374
+ If an element is in Figma but absent from the DOM, check in this order: registration
375
+ (`customElements.get`) → import path → the slot name it should occupy → then go back to
376
+ Phase 2 and re-read the component doc. A wrong slot name renders nothing and reports nothing.
@@ -134,6 +134,27 @@ For core UI component theming, prefer `create_component_theme` and apply the ret
134
134
  ### Grid theming is package-specific
135
135
  `igniteui-grid-lite` and the premium grid packages do not map to Angular's `igx-grid__*` internal class structure. Use `get_component_design_tokens("grid")`, the exact grid package docs, and exposed tokens or parts for the package present in the workspace.
136
136
 
137
+ ### `igniteui-webcomponents-grids` theme must be injected into the shadow root
138
+
139
+ A bare CSS import (`import '...material.css'`) lands in the document head and selector rules outside a Shadow root never reach inside it. When the grid is rendered inside a Shadow root, the theme must be injected there too — it targets the grid's internal structure and elements. Without it, internal grid elements render with broken dimensions; checkboxes can expand to 1,100 px wide and collapse the entire grid UI.
140
+
141
+ Import the theme as an inline string (requires bundler support for `?inline`, e.g. Vite) and inject it as a `<style>` tag inside the shadow root. The exact approach depends on the framework — for a LitElement component, render it at the top of `render()`:
142
+
143
+ ```typescript
144
+ import { html } from 'lit';
145
+ import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
146
+
147
+ // LitElement example — adapt to your Shadow DOM approach (Stencil, FAST, vanilla attachShadow, etc.)
148
+ render() {
149
+ return html`
150
+ <style>${gridTheme}</style>
151
+ <igc-grid ...></igc-grid>
152
+ `;
153
+ }
154
+ ```
155
+
156
+ Apply the same `?inline` + `<style>` approach for dark or other theme variants.
157
+
137
158
  ### Read luminance warnings from palette generation
138
159
  If palette generation returns a luminance warning for a generated surface, do not ignore it. If the design needs multiple surface depths, use `create_custom_palette` or define semantic CSS variables such as `--surface-1` and `--surface-2` in the main stylesheet instead of relying on a single generated surface color.
139
160
 
@@ -96,7 +96,8 @@ Before loading a reference, identify the target framework from the project conte
96
96
  - No major framework found in `package.json`
97
97
  - Plain `.html` files reference a `<script type="module">`
98
98
  - Entry point is a plain `.js` or `.ts` file with no framework imports
99
- - User explicitly asks for vanilla JS or HTML integration
99
+ - `package.json` contains "lit" — start with the vanilla JS reference; if using Shadow DOM, follow the Shadow root theming note for grids
100
+ - User explicitly asks for vanilla JS, HTML, or LitElement integration
100
101
 
101
102
  → **Load:** [vanilla-js.md](./references/vanilla-js.md)
102
103
 
@@ -106,7 +107,7 @@ Before loading a reference, identify the target framework from the project conte
106
107
 
107
108
  Ask the user directly:
108
109
 
109
- > "What framework or platform are you using? (React, Angular, Vue 3, or Vanilla JS / HTML)"
110
+ > "What framework or platform are you using? (React, Angular, Vue 3, Vanilla JS / HTML, or LitElement)"
110
111
 
111
112
  Then load the matching reference from the options above.
112
113
 
@@ -119,7 +120,7 @@ Then load the matching reference from the options above.
119
120
  | React | [react.md](./references/react.md) |
120
121
  | Angular | [angular.md](./references/angular.md) |
121
122
  | Vue 3 | [vue.md](./references/vue.md) |
122
- | Vanilla JS / HTML | [vanilla-js.md](./references/vanilla-js.md) |
123
+ | Vanilla JS / HTML / LitElement | [vanilla-js.md](./references/vanilla-js.md) |
123
124
 
124
125
  Each reference covers:
125
126
 
@@ -113,6 +113,20 @@ document.body.innerHTML = '<igc-button>Click</igc-button>';
113
113
 
114
114
  Ensure you import a theme CSS file in your entry point. Without it, components render unstyled.
115
115
 
116
+ **`igniteui-webcomponents-grids` inside a Shadow root:** A bare `import '...css'` lands in the document head and never reaches inside a Shadow root — the grid's internal structure and elements receive no styles and render with incorrect dimensions. Import the theme as an inline string and inject it as a `<style>` tag inside the shadow root (requires bundler support for `?inline`, e.g. Vite). For a LitElement component:
117
+
118
+ ```typescript
119
+ import { html } from 'lit';
120
+ import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
121
+
122
+ render() {
123
+ return html`
124
+ <style>${gridTheme}</style>
125
+ <igc-grid ...></igc-grid>
126
+ `;
127
+ }
128
+ ```
129
+
116
130
  ## Next Steps
117
131
 
118
132
  - [Optimize bundle size](../../igniteui-wc-optimize-bundle-size/SKILL.md) — import only the components you use
@@ -108,11 +108,21 @@ import {
108
108
  IgcNoopFilteringStrategy,
109
109
  } from 'igniteui-webcomponents-grids';
110
110
 
111
- // Theme - change to the grids-specific path
111
+ // Theme — import as an inline string so it can be injected into the shadow root (requires bundler support for ?inline, e.g. Vite)
112
112
  // Available: light|dark x bootstrap|material|fluent|indigo
113
- import 'igniteui-webcomponents-grids/grids/themes/light/bootstrap.css';
113
+ import gridTheme from 'igniteui-webcomponents-grids/grids/themes/light/material.css?inline';
114
114
  ```
115
115
 
116
+ > **Grid inside a Shadow root — required step:** A bare CSS import lands in the document head and never reaches inside a Shadow root — the grid's internal structure and elements get no styles. Inject the theme as a `<style>` tag inside the shadow root. For a LitElement component, at the top of `render()`:
117
+ > ```typescript
118
+ > render() {
119
+ > return html`
120
+ > <style>${gridTheme}</style>
121
+ > <igc-grid ...></igc-grid>
122
+ > `;
123
+ > }
124
+ > ```
125
+
116
126
  ## Step 3 - Update HTML Tags
117
127
 
118
128
  | Grid Lite | Premium Grid |
@@ -1,9 +1,17 @@
1
+ import { type ChangeThemeEventDetail } from './theming-event.js';
1
2
  import type { Theme, ThemeVariant } from './types.js';
2
- export declare function getTheme(): {
3
- theme: Theme;
4
- themeVariant: ThemeVariant;
5
- };
6
- export declare function setTheme(value: Theme, variant: ThemeVariant): void;
3
+ /**
4
+ * Relays "igc-change-theme" events from `window` to the theming controllers.
5
+ * It also syncs the module state from the event detail, so an event from another
6
+ * copy of the library changes the theme here too.
7
+ */
8
+ declare class ThemeChangedEmitter extends EventTarget {
9
+ constructor();
10
+ /** @internal */
11
+ handleEvent({ detail }: CustomEvent<ChangeThemeEventDetail>): void;
12
+ }
13
+ export declare const _themeChangedEmitter: ThemeChangedEmitter;
14
+ export declare function getTheme(): ChangeThemeEventDetail;
7
15
  /**
8
16
  * Allows the global configuration of the active theme.
9
17
  *
@@ -15,3 +23,4 @@ export declare function setTheme(value: Theme, variant: ThemeVariant): void;
15
23
  * ```
16
24
  */
17
25
  export declare function configureTheme(t: Theme, v?: ThemeVariant): void;
26
+ export {};
package/theming/config.js CHANGED
@@ -1,37 +1,57 @@
1
1
  import { isServer } from 'lit';
2
- import { CHANGE_THEME_EVENT, } from './theming-event.js';
3
- import { getAllCssVariables } from './utils.js';
2
+ import { CHANGE_THEME_EVENT, CHANGED_THEME_EVENT, } from './theming-event.js';
3
+ const THEMES = new Set(['bootstrap', 'material', 'indigo', 'fluent']);
4
+ const THEME_VARIANTS = new Set(['light', 'dark']);
4
5
  let theme;
5
6
  let themeVariant;
6
- function dispatchThemingEvent(detail) {
7
- if (!isServer) {
8
- globalThis.dispatchEvent(new CustomEvent(CHANGE_THEME_EVENT, { detail }));
9
- }
7
+ function isOfTypeTheme(value) {
8
+ return THEMES.has(value);
10
9
  }
11
- function isOfTypeTheme(theme) {
12
- return ['bootstrap', 'material', 'indigo', 'fluent'].includes(theme);
10
+ function isOfTypeThemeVariant(value) {
11
+ return THEME_VARIANTS.has(value);
13
12
  }
14
- function isOfTypeThemeVariant(variant) {
15
- return ['light', 'dark'].includes(variant);
13
+ function setTheme(value, variant) {
14
+ theme = value;
15
+ themeVariant = variant;
16
16
  }
17
+ class ThemeChangedEmitter extends EventTarget {
18
+ constructor() {
19
+ super();
20
+ if (!isServer) {
21
+ globalThis.addEventListener(CHANGE_THEME_EVENT, this);
22
+ }
23
+ }
24
+ handleEvent({ detail }) {
25
+ if (isOfTypeTheme(detail?.theme) &&
26
+ isOfTypeThemeVariant(detail?.themeVariant)) {
27
+ setTheme(detail.theme, detail.themeVariant);
28
+ this.dispatchEvent(new CustomEvent(CHANGED_THEME_EVENT));
29
+ }
30
+ }
31
+ }
32
+ export const _themeChangedEmitter = new ThemeChangedEmitter();
17
33
  export function getTheme() {
18
34
  if (!(theme && themeVariant)) {
19
- const cssVars = getAllCssVariables();
20
- const foundTheme = cssVars.igTheme;
21
- const foundVariant = cssVars.igThemeVariant;
35
+ const rootStyles = isServer
36
+ ? undefined
37
+ : getComputedStyle(document.documentElement);
38
+ const foundTheme = rootStyles?.getPropertyValue('--ig-theme').trim();
39
+ const foundVariant = rootStyles
40
+ ?.getPropertyValue('--ig-theme-variant')
41
+ .trim();
22
42
  theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';
23
43
  themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';
24
44
  }
25
45
  return { theme, themeVariant };
26
46
  }
27
- export function setTheme(value, variant) {
28
- theme = value;
29
- themeVariant = variant;
30
- }
31
47
  export function configureTheme(t, v = 'light') {
32
48
  if (isOfTypeTheme(t) && isOfTypeThemeVariant(v)) {
33
49
  setTheme(t, v);
34
- dispatchThemingEvent({ theme, themeVariant });
50
+ if (!isServer) {
51
+ globalThis.dispatchEvent(new CustomEvent(CHANGE_THEME_EVENT, {
52
+ detail: { theme, themeVariant },
53
+ }));
54
+ }
35
55
  }
36
56
  }
37
57
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/theming/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EACL,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,IAAI,KAAY,CAAC;AACjB,IAAI,YAA0B,CAAC;AAK/B,SAAS,oBAAoB,CAAC,MAA8B;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,UAAU,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;QAE5C,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY,EAAE,OAAqB;IAC1D,KAAK,GAAG,KAAK,CAAC;IACd,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAYD,MAAM,UAAU,cAAc,CAAC,CAAQ,EAAE,IAAkB,OAAO;IAChE,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,oBAAoB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC","sourcesContent":["import { isServer } from 'lit';\nimport {\n CHANGE_THEME_EVENT,\n type ChangeThemeEventDetail,\n} from './theming-event.js';\nimport type { Theme, ThemeVariant } from './types.js';\nimport { getAllCssVariables } from './utils.js';\n\nlet theme: Theme;\nlet themeVariant: ThemeVariant;\n\n/**\n * Dispatch an \"igc-change-theme\" event to `window` with the given detail.\n */\nfunction dispatchThemingEvent(detail: ChangeThemeEventDetail): void {\n if (!isServer) {\n globalThis.dispatchEvent(new CustomEvent(CHANGE_THEME_EVENT, { detail }));\n }\n}\n\nfunction isOfTypeTheme(theme: string): theme is Theme {\n return ['bootstrap', 'material', 'indigo', 'fluent'].includes(theme);\n}\n\nfunction isOfTypeThemeVariant(variant: string): variant is ThemeVariant {\n return ['light', 'dark'].includes(variant);\n}\n\nexport function getTheme() {\n if (!(theme && themeVariant)) {\n const cssVars = getAllCssVariables();\n const foundTheme = cssVars.igTheme;\n const foundVariant = cssVars.igThemeVariant;\n\n theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';\n themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';\n }\n\n return { theme, themeVariant };\n}\n\nexport function setTheme(value: Theme, variant: ThemeVariant): void {\n theme = value;\n themeVariant = variant;\n}\n\n/**\n * Allows the global configuration of the active theme.\n *\n * Usage:\n * ```ts\n * import { configureTheme } from 'igniteui-webcomponents';\n *\n * configureTheme('material', 'light');\n * ```\n */\nexport function configureTheme(t: Theme, v: ThemeVariant = 'light'): void {\n if (isOfTypeTheme(t) && isOfTypeThemeVariant(v)) {\n setTheme(t, v);\n dispatchThemingEvent({ theme, themeVariant });\n }\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/theming/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAU,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3D,IAAI,KAAY,CAAC;AACjB,IAAI,YAA0B,CAAC;AAE/B,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAY,EAAE,OAAqB;IACnD,KAAK,GAAG,KAAK,CAAC;IACd,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAOD,MAAM,mBAAoB,SAAQ,WAAW;IAC3C;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAGM,WAAW,CAAC,EAAE,MAAM,EAAuC;QAChE,IACE,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;YAC5B,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAE9D,MAAM,UAAU,QAAQ;IACtB,IAAI,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,QAAQ;YACzB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,MAAM,YAAY,GAAG,UAAU;YAC7B,EAAE,gBAAgB,CAAC,oBAAoB,CAAC;aACvC,IAAI,EAAE,CAAC;QAEV,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QAC7D,YAAY,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAYD,MAAM,UAAU,cAAc,CAAC,CAAQ,EAAE,IAAkB,OAAO;IAChE,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhD,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,UAAU,CAAC,aAAa,CACtB,IAAI,WAAW,CAAC,kBAAkB,EAAE;gBAClC,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE;aAChC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { isServer } from 'lit';\nimport {\n CHANGE_THEME_EVENT,\n CHANGED_THEME_EVENT,\n type ChangeThemeEventDetail,\n} from './theming-event.js';\nimport type { Theme, ThemeVariant } from './types.js';\n\nconst THEMES = new Set<unknown>(['bootstrap', 'material', 'indigo', 'fluent']);\nconst THEME_VARIANTS = new Set<unknown>(['light', 'dark']);\n\nlet theme: Theme;\nlet themeVariant: ThemeVariant;\n\nfunction isOfTypeTheme(value: unknown): value is Theme {\n return THEMES.has(value);\n}\n\nfunction isOfTypeThemeVariant(value: unknown): value is ThemeVariant {\n return THEME_VARIANTS.has(value);\n}\n\nfunction setTheme(value: Theme, variant: ThemeVariant): void {\n theme = value;\n themeVariant = variant;\n}\n\n/**\n * Relays \"igc-change-theme\" events from `window` to the theming controllers.\n * It also syncs the module state from the event detail, so an event from another\n * copy of the library changes the theme here too.\n */\nclass ThemeChangedEmitter extends EventTarget {\n constructor() {\n super();\n if (!isServer) {\n globalThis.addEventListener(CHANGE_THEME_EVENT, this);\n }\n }\n\n /** @internal */\n public handleEvent({ detail }: CustomEvent<ChangeThemeEventDetail>): void {\n if (\n isOfTypeTheme(detail?.theme) &&\n isOfTypeThemeVariant(detail?.themeVariant)\n ) {\n setTheme(detail.theme, detail.themeVariant);\n this.dispatchEvent(new CustomEvent(CHANGED_THEME_EVENT));\n }\n }\n}\n\nexport const _themeChangedEmitter = new ThemeChangedEmitter();\n\nexport function getTheme(): ChangeThemeEventDetail {\n if (!(theme && themeVariant)) {\n const rootStyles = isServer\n ? undefined\n : getComputedStyle(document.documentElement);\n const foundTheme = rootStyles?.getPropertyValue('--ig-theme').trim();\n const foundVariant = rootStyles\n ?.getPropertyValue('--ig-theme-variant')\n .trim();\n\n theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';\n themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';\n }\n\n return { theme, themeVariant };\n}\n\n/**\n * Allows the global configuration of the active theme.\n *\n * Usage:\n * ```ts\n * import { configureTheme } from 'igniteui-webcomponents';\n *\n * configureTheme('material', 'light');\n * ```\n */\nexport function configureTheme(t: Theme, v: ThemeVariant = 'light'): void {\n if (isOfTypeTheme(t) && isOfTypeThemeVariant(v)) {\n // Also set by the emitter's window listener, but that listener does not exist on the server.\n setTheme(t, v);\n\n if (!isServer) {\n globalThis.dispatchEvent(\n new CustomEvent(CHANGE_THEME_EVENT, {\n detail: { theme, themeVariant },\n })\n );\n }\n }\n}\n"]}
@@ -7,29 +7,7 @@ export interface ThemeContext {
7
7
  variant: ThemeVariant;
8
8
  }
9
9
  /**
10
- * Context for providing theme information to descendant components.
11
- *
12
- * Components can consume this context to receive theme information from a theme provider
13
- * instead of relying on global theming events.
14
- *
15
- * @example
16
- * ```ts
17
- * // In a component
18
- * import { ContextConsumer } from '@lit/context';
19
- * import { themeContext } from './context.js';
20
- *
21
- * class MyComponent extends LitElement {
22
- * private _themeConsumer = new ContextConsumer(this, {
23
- * context: themeContext,
24
- * subscribe: true
25
- * });
26
- *
27
- * render() {
28
- * const theme = this._themeConsumer.value;
29
- * // ...
30
- * }
31
- * }
32
- * ```
10
+ * Theme context provided by the theme provider component and consumed by the theming controller.
33
11
  */
34
12
  export declare const themeContext: {
35
13
  __context__: ThemeContext;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/theming/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAoC7C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAe,kBAAkB,CAAC,CAAC","sourcesContent":["import { createContext } from '@lit/context';\nimport type { Theme, ThemeVariant } from './types.js';\n\n/**\n * The theme context value.\n */\nexport interface ThemeContext {\n theme: Theme;\n variant: ThemeVariant;\n}\n\n/**\n * Context for providing theme information to descendant components.\n *\n * Components can consume this context to receive theme information from a theme provider\n * instead of relying on global theming events.\n *\n * @example\n * ```ts\n * // In a component\n * import { ContextConsumer } from '@lit/context';\n * import { themeContext } from './context.js';\n *\n * class MyComponent extends LitElement {\n * private _themeConsumer = new ContextConsumer(this, {\n * context: themeContext,\n * subscribe: true\n * });\n *\n * render() {\n * const theme = this._themeConsumer.value;\n * // ...\n * }\n * }\n * ```\n */\nexport const themeContext = createContext<ThemeContext>('ig-theme-context');\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/theming/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAe,kBAAkB,CAAC,CAAC","sourcesContent":["import { createContext } from '@lit/context';\nimport type { Theme, ThemeVariant } from './types.js';\n\n/**\n * The theme context value.\n */\nexport interface ThemeContext {\n theme: Theme;\n variant: ThemeVariant;\n}\n\n/**\n * Theme context provided by the theme provider component and consumed by the theming controller.\n */\nexport const themeContext = createContext<ThemeContext>('ig-theme-context');\n"]}