igniteui-webcomponents 7.1.0 → 7.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +13 -11
  3. package/animations/easings.d.ts +1 -1
  4. package/animations/easings.js +1 -1
  5. package/animations/easings.js.map +1 -1
  6. package/components/badge/themes/dark/badge.indigo.css.js +1 -1
  7. package/components/badge/themes/dark/badge.indigo.css.js.map +1 -1
  8. package/components/button/themes/button/light/button.indigo.css.js +1 -1
  9. package/components/button/themes/button/light/button.indigo.css.js.map +1 -1
  10. package/components/button/themes/icon-button/dark/icon-button.indigo.css.js +1 -1
  11. package/components/button/themes/icon-button/dark/icon-button.indigo.css.js.map +1 -1
  12. package/components/button-group/button-group.js +2 -2
  13. package/components/button-group/button-group.js.map +1 -1
  14. package/components/button-group/themes/dark/button-group.bootstrap.css.js +1 -1
  15. package/components/button-group/themes/dark/button-group.bootstrap.css.js.map +1 -1
  16. package/components/button-group/themes/dark/button-group.fluent.css.js +1 -1
  17. package/components/button-group/themes/dark/button-group.fluent.css.js.map +1 -1
  18. package/components/button-group/themes/dark/button-group.indigo.css.js +1 -1
  19. package/components/button-group/themes/dark/button-group.indigo.css.js.map +1 -1
  20. package/components/button-group/themes/dark/button-group.material.css.js +1 -1
  21. package/components/button-group/themes/dark/button-group.material.css.js.map +1 -1
  22. package/components/button-group/themes/dark/button-group.shared.css.js +1 -1
  23. package/components/button-group/themes/dark/button-group.shared.css.js.map +1 -1
  24. package/components/button-group/themes/light/button-group.bootstrap.css.js +1 -1
  25. package/components/button-group/themes/light/button-group.bootstrap.css.js.map +1 -1
  26. package/components/button-group/themes/light/button-group.fluent.css.js +1 -1
  27. package/components/button-group/themes/light/button-group.fluent.css.js.map +1 -1
  28. package/components/button-group/themes/light/button-group.indigo.css.js +1 -1
  29. package/components/button-group/themes/light/button-group.indigo.css.js.map +1 -1
  30. package/components/button-group/themes/light/button-group.material.css.js +1 -1
  31. package/components/button-group/themes/light/button-group.material.css.js.map +1 -1
  32. package/components/button-group/themes/light/button-group.shared.css.js +1 -1
  33. package/components/button-group/themes/light/button-group.shared.css.js.map +1 -1
  34. package/components/button-group/themes/shared/button/button.bootstrap.css.js +1 -1
  35. package/components/button-group/themes/shared/button/button.bootstrap.css.js.map +1 -1
  36. package/components/button-group/themes/shared/button/button.common.css.js +1 -1
  37. package/components/button-group/themes/shared/button/button.common.css.js.map +1 -1
  38. package/components/button-group/themes/shared/button/button.fluent.css.js +1 -1
  39. package/components/button-group/themes/shared/button/button.fluent.css.js.map +1 -1
  40. package/components/button-group/themes/shared/button/button.indigo.css.js +1 -1
  41. package/components/button-group/themes/shared/button/button.indigo.css.js.map +1 -1
  42. package/components/button-group/themes/shared/button/button.material.css.js +1 -1
  43. package/components/button-group/themes/shared/button/button.material.css.js.map +1 -1
  44. package/components/calendar/calendar.js +3 -3
  45. package/components/calendar/calendar.js.map +1 -1
  46. package/components/calendar/days-view/days-view.js +13 -11
  47. package/components/calendar/days-view/days-view.js.map +1 -1
  48. package/components/calendar/helpers.js +2 -2
  49. package/components/calendar/helpers.js.map +1 -1
  50. package/components/calendar/themes/dark/calendar.indigo.css.js +1 -1
  51. package/components/calendar/themes/dark/calendar.indigo.css.js.map +1 -1
  52. package/components/card/themes/dark/card.indigo.css.js +1 -1
  53. package/components/card/themes/dark/card.indigo.css.js.map +1 -1
  54. package/components/carousel/carousel.js +2 -2
  55. package/components/carousel/carousel.js.map +1 -1
  56. package/components/chat/chat-message.js +1 -0
  57. package/components/chat/chat-message.js.map +1 -1
  58. package/components/chat/themes/dark/chat.bootstrap.css.js +1 -1
  59. package/components/chat/themes/dark/chat.bootstrap.css.js.map +1 -1
  60. package/components/chat/themes/dark/chat.fluent.css.js +1 -1
  61. package/components/chat/themes/dark/chat.fluent.css.js.map +1 -1
  62. package/components/chat/themes/dark/chat.indigo.css.js +1 -1
  63. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -1
  64. package/components/chat/themes/dark/chat.material.css.js +1 -1
  65. package/components/chat/themes/dark/chat.material.css.js.map +1 -1
  66. package/components/chat/themes/light/chat.bootstrap.css.js +1 -1
  67. package/components/chat/themes/light/chat.bootstrap.css.js.map +1 -1
  68. package/components/chat/themes/light/chat.fluent.css.js +1 -1
  69. package/components/chat/themes/light/chat.fluent.css.js.map +1 -1
  70. package/components/chat/themes/light/chat.indigo.css.js +1 -1
  71. package/components/chat/themes/light/chat.indigo.css.js.map +1 -1
  72. package/components/chat/themes/light/chat.material.css.js +1 -1
  73. package/components/chat/themes/light/chat.material.css.js.map +1 -1
  74. package/components/chat/themes/light/chat.shared.css.js +1 -1
  75. package/components/chat/themes/light/chat.shared.css.js.map +1 -1
  76. package/components/chat/themes/message.base.css.js +1 -1
  77. package/components/chat/themes/message.base.css.js.map +1 -1
  78. package/components/chat/themes/message.js +0 -14
  79. package/components/chat/themes/message.js.map +1 -1
  80. package/components/chat/themes/shared/chat-message/chat-message.common.css.js +1 -1
  81. package/components/chat/themes/shared/chat-message/chat-message.common.css.js.map +1 -1
  82. package/components/chat/themes/shared/chat-message/chat-message.indigo.css.js +1 -1
  83. package/components/chat/themes/shared/chat-message/chat-message.indigo.css.js.map +1 -1
  84. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js +1 -1
  85. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js.map +1 -1
  86. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js +1 -1
  87. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js.map +1 -1
  88. package/components/checkbox/themes/dark/checkbox/checkbox.indigo.css.js +1 -1
  89. package/components/checkbox/themes/dark/checkbox/checkbox.indigo.css.js.map +1 -1
  90. package/components/checkbox/themes/dark/checkbox/checkbox.material.css.js +1 -1
  91. package/components/checkbox/themes/dark/checkbox/checkbox.material.css.js.map +1 -1
  92. package/components/checkbox/themes/light/checkbox/checkbox.bootstrap.css.js +1 -1
  93. package/components/checkbox/themes/light/checkbox/checkbox.bootstrap.css.js.map +1 -1
  94. package/components/checkbox/themes/light/checkbox/checkbox.fluent.css.js +1 -1
  95. package/components/checkbox/themes/light/checkbox/checkbox.fluent.css.js.map +1 -1
  96. package/components/checkbox/themes/light/checkbox/checkbox.indigo.css.js +1 -1
  97. package/components/checkbox/themes/light/checkbox/checkbox.indigo.css.js.map +1 -1
  98. package/components/checkbox/themes/light/checkbox/checkbox.material.css.js +1 -1
  99. package/components/checkbox/themes/light/checkbox/checkbox.material.css.js.map +1 -1
  100. package/components/checkbox/themes/light/checkbox/checkbox.shared.css.js +1 -1
  101. package/components/checkbox/themes/light/checkbox/checkbox.shared.css.js.map +1 -1
  102. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
  103. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
  104. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js +1 -1
  105. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js.map +1 -1
  106. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
  107. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
  108. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js +1 -1
  109. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js.map +1 -1
  110. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js +1 -1
  111. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js.map +1 -1
  112. package/components/chip/chip.d.ts +1 -0
  113. package/components/chip/chip.js +3 -1
  114. package/components/chip/chip.js.map +1 -1
  115. package/components/chip/themes/chip.base.css.js +1 -1
  116. package/components/chip/themes/chip.base.css.js.map +1 -1
  117. package/components/chip/themes/dark/chip.indigo.css.js +1 -1
  118. package/components/chip/themes/dark/chip.indigo.css.js.map +1 -1
  119. package/components/chip/themes/shared/chip.common.css.js +1 -1
  120. package/components/chip/themes/shared/chip.common.css.js.map +1 -1
  121. package/components/combo/combo-header.js.map +1 -1
  122. package/components/combo/combo-item.d.ts +7 -3
  123. package/components/combo/combo-item.js +5 -4
  124. package/components/combo/combo-item.js.map +1 -1
  125. package/components/combo/combo-list.js.map +1 -1
  126. package/components/combo/combo.d.ts +92 -81
  127. package/components/combo/combo.js +327 -281
  128. package/components/combo/combo.js.map +1 -1
  129. package/components/combo/controllers/data.d.ts +50 -13
  130. package/components/combo/controllers/data.js +49 -28
  131. package/components/combo/controllers/data.js.map +1 -1
  132. package/components/combo/controllers/navigation.d.ts +19 -18
  133. package/components/combo/controllers/navigation.js +73 -90
  134. package/components/combo/controllers/navigation.js.map +1 -1
  135. package/components/combo/operations/filter.d.ts +2 -2
  136. package/components/combo/operations/filter.js.map +1 -1
  137. package/components/combo/operations/group.d.ts +2 -2
  138. package/components/combo/operations/group.js.map +1 -1
  139. package/components/combo/themes/dark/combo.indigo.css.js +1 -1
  140. package/components/combo/themes/dark/combo.indigo.css.js.map +1 -1
  141. package/components/common/context.d.ts +1 -1
  142. package/components/common/context.js +1 -1
  143. package/components/common/context.js.map +1 -1
  144. package/components/common/controllers/drag.js +2 -2
  145. package/components/common/controllers/drag.js.map +1 -1
  146. package/components/common/controllers/key-bindings.d.ts +100 -18
  147. package/components/common/controllers/key-bindings.js +54 -47
  148. package/components/common/controllers/key-bindings.js.map +1 -1
  149. package/components/common/controllers/root-click.js +3 -3
  150. package/components/common/controllers/root-click.js.map +1 -1
  151. package/components/common/controllers/slot.d.ts +1 -1
  152. package/components/common/controllers/slot.js.map +1 -1
  153. package/components/common/mixins/combo-box.d.ts +24 -19
  154. package/components/common/mixins/combo-box.js +26 -23
  155. package/components/common/mixins/combo-box.js.map +1 -1
  156. package/components/common/util.d.ts +45 -18
  157. package/components/common/util.js +13 -27
  158. package/components/common/util.js.map +1 -1
  159. package/components/date-picker/date-picker.d.ts +3 -3
  160. package/components/date-picker/date-picker.js +10 -10
  161. package/components/date-picker/date-picker.js.map +1 -1
  162. package/components/date-picker/themes/dark/date-picker.indigo.css.js +1 -1
  163. package/components/date-picker/themes/dark/date-picker.indigo.css.js.map +1 -1
  164. package/components/date-range-picker/date-range-picker.d.ts +3 -4
  165. package/components/date-range-picker/date-range-picker.js +11 -11
  166. package/components/date-range-picker/date-range-picker.js.map +1 -1
  167. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js +1 -1
  168. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js.map +1 -1
  169. package/components/date-time-input/date-time-input.js +1 -1
  170. package/components/date-time-input/date-time-input.js.map +1 -1
  171. package/components/date-time-input/datetime-mask-parser.d.ts +1 -2
  172. package/components/date-time-input/datetime-mask-parser.js +1 -2
  173. package/components/date-time-input/datetime-mask-parser.js.map +1 -1
  174. package/components/dialog/themes/dark/dialog.indigo.css.js +1 -1
  175. package/components/dialog/themes/dark/dialog.indigo.css.js.map +1 -1
  176. package/components/dropdown/dropdown.d.ts +2 -2
  177. package/components/dropdown/dropdown.js +6 -6
  178. package/components/dropdown/dropdown.js.map +1 -1
  179. package/components/dropdown/themes/dark/dropdown.indigo.css.js +1 -1
  180. package/components/dropdown/themes/dark/dropdown.indigo.css.js.map +1 -1
  181. package/components/dropdown/themes/shared/item/dropdown-item.common.css.js +1 -1
  182. package/components/dropdown/themes/shared/item/dropdown-item.common.css.js.map +1 -1
  183. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js +1 -1
  184. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js.map +1 -1
  185. package/components/highlight/service.js +1 -1
  186. package/components/highlight/service.js.map +1 -1
  187. package/components/input/themes/shared/input.material.css.js +1 -1
  188. package/components/input/themes/shared/input.material.css.js.map +1 -1
  189. package/components/list/themes/dark/container/list.bootstrap.css.js +1 -1
  190. package/components/list/themes/dark/container/list.bootstrap.css.js.map +1 -1
  191. package/components/nav-drawer/themes/container.base.css.js +1 -1
  192. package/components/nav-drawer/themes/container.base.css.js.map +1 -1
  193. package/components/navbar/themes/dark/navbar.indigo.css.js +1 -1
  194. package/components/navbar/themes/dark/navbar.indigo.css.js.map +1 -1
  195. package/components/progress/themes/circular/dark/circular.progress.indigo.css.js +1 -1
  196. package/components/progress/themes/circular/dark/circular.progress.indigo.css.js.map +1 -1
  197. package/components/progress/themes/circular/dark/circular.progress.shared.css.js +1 -1
  198. package/components/progress/themes/circular/dark/circular.progress.shared.css.js.map +1 -1
  199. package/components/progress/themes/circular/light/circular.progress.indigo.css.js +1 -1
  200. package/components/progress/themes/circular/light/circular.progress.indigo.css.js.map +1 -1
  201. package/components/progress/themes/circular/light/circular.progress.shared.css.js +1 -1
  202. package/components/progress/themes/circular/light/circular.progress.shared.css.js.map +1 -1
  203. package/components/progress/themes/circular/shared/circular.progress.common.css.js +1 -1
  204. package/components/progress/themes/circular/shared/circular.progress.common.css.js.map +1 -1
  205. package/components/progress/themes/linear/dark/linear.progress.indigo.css.js +1 -1
  206. package/components/progress/themes/linear/dark/linear.progress.indigo.css.js.map +1 -1
  207. package/components/progress/themes/linear/linear.progress.base.css.js +1 -1
  208. package/components/progress/themes/linear/linear.progress.base.css.js.map +1 -1
  209. package/components/radio/radio.js +1 -1
  210. package/components/radio/radio.js.map +1 -1
  211. package/components/rating/rating.d.ts +57 -28
  212. package/components/rating/rating.js +123 -120
  213. package/components/rating/rating.js.map +1 -1
  214. package/components/resize-container/resize-controller.js +2 -2
  215. package/components/resize-container/resize-controller.js.map +1 -1
  216. package/components/select/select.d.ts +3 -3
  217. package/components/select/select.js +10 -10
  218. package/components/select/select.js.map +1 -1
  219. package/components/select/themes/dark/select.indigo.css.js +1 -1
  220. package/components/select/themes/dark/select.indigo.css.js.map +1 -1
  221. package/components/snackbar/themes/dark/snackbar.indigo.css.js +1 -1
  222. package/components/snackbar/themes/dark/snackbar.indigo.css.js.map +1 -1
  223. package/components/splitter/splitter.d.ts +2 -2
  224. package/components/splitter/splitter.js.map +1 -1
  225. package/components/splitter/types.d.ts +11 -5
  226. package/components/splitter/types.js.map +1 -1
  227. package/components/stepper/common/state.d.ts +1 -1
  228. package/components/stepper/common/state.js.map +1 -1
  229. package/components/stepper/stepper.js +3 -3
  230. package/components/stepper/stepper.js.map +1 -1
  231. package/components/stepper/themes/step/dark/step.bootstrap.css.js +1 -1
  232. package/components/stepper/themes/step/dark/step.bootstrap.css.js.map +1 -1
  233. package/components/stepper/themes/step/dark/step.indigo.css.js +1 -1
  234. package/components/stepper/themes/step/dark/step.indigo.css.js.map +1 -1
  235. package/components/stepper/themes/step/dark/step.material.css.js +1 -1
  236. package/components/stepper/themes/step/dark/step.material.css.js.map +1 -1
  237. package/components/tabs/tab.d.ts +0 -1
  238. package/components/tabs/tab.js +2 -3
  239. package/components/tabs/tab.js.map +1 -1
  240. package/components/tabs/tabs.js +3 -3
  241. package/components/tabs/tabs.js.map +1 -1
  242. package/components/tile-manager/themes/dark/tile-manager.indigo.css.js +1 -1
  243. package/components/tile-manager/themes/dark/tile-manager.indigo.css.js.map +1 -1
  244. package/components/tile-manager/tile.js +2 -2
  245. package/components/tile-manager/tile.js.map +1 -1
  246. package/components/toast/themes/dark/toast.indigo.css.js +1 -1
  247. package/components/toast/themes/dark/toast.indigo.css.js.map +1 -1
  248. package/components/tree/themes/dark/container.bootstrap.css.js +1 -1
  249. package/components/tree/themes/dark/container.bootstrap.css.js.map +1 -1
  250. package/components/tree/themes/dark/container.indigo.css.js +1 -1
  251. package/components/tree/themes/dark/container.indigo.css.js.map +1 -1
  252. package/components/tree/themes/shared/item.indigo.css.js +1 -1
  253. package/components/tree/themes/shared/item.indigo.css.js.map +1 -1
  254. package/components/tree/tree-item.js +2 -3
  255. package/components/tree/tree-item.js.map +1 -1
  256. package/custom-elements.json +1726 -983
  257. package/igniteui-webcomponents.css-data.json +1 -1
  258. package/igniteui-webcomponents.html-data.json +1 -1
  259. package/index.d.ts +1 -1
  260. package/index.js.map +1 -1
  261. package/package.json +1 -1
  262. package/skills/README.md +3 -0
  263. package/skills/igniteui-wc-choose-components/SKILL.md +53 -0
  264. package/skills/igniteui-wc-generate-from-image-design/SKILL.md +228 -0
  265. package/skills/igniteui-wc-generate-from-image-design/references/component-mapping.md +130 -0
  266. package/skills/igniteui-wc-generate-from-image-design/references/gotchas.md +147 -0
  267. package/skills/igniteui-wc-integrate-with-framework/SKILL.md +22 -1
  268. package/skills/igniteui-wc-integrate-with-framework/references/angular.md +2 -0
  269. package/skills/igniteui-wc-integrate-with-framework/references/react.md +2 -0
  270. package/skills/igniteui-wc-integrate-with-framework/references/vanilla-js.md +2 -0
  271. package/skills/igniteui-wc-integrate-with-framework/references/vue.md +2 -0
  272. package/web-types.json +2 -2
  273. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.d.ts +0 -1
  274. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.js +0 -3
  275. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.js.map +0 -1
  276. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.d.ts +0 -1
  277. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.js +0 -3
  278. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.js.map +0 -1
  279. package/components/combo/controllers/selection.d.ts +0 -33
  280. package/components/combo/controllers/selection.js +0 -169
  281. package/components/combo/controllers/selection.js.map +0 -1
@@ -1,17 +1,47 @@
1
1
  import { LitElement } from 'lit';
2
2
  import type { Constructor } from '../common/mixins/constructor.js';
3
- import IgcRatingSymbolComponent from './rating-symbol.js';
4
3
  export interface IgcRatingComponentEventMap {
5
4
  igcChange: CustomEvent<number>;
6
5
  igcHover: CustomEvent<number>;
7
6
  }
8
7
  declare const IgcRatingComponent_base: Constructor<import("../common/mixins/forms/types.js").FormAssociatedElementInterface> & Constructor<import("../common/mixins/event-emitter.js").EventEmitterInterface<IgcRatingComponentEventMap>> & Constructor<LitElement>;
9
8
  /**
10
- * Rating provides insight regarding others' opinions and experiences,
11
- * and can allow the user to submit a rating of their own
9
+ * A rating component that allows users to view and provide ratings using customizable symbols.
10
+ * It supports fractional values, hover previews, keyboard navigation, single-selection mode,
11
+ * and integrates with forms as a number input.
12
+ *
13
+ * @example
14
+ * ```html
15
+ * <!-- Basic rating -->
16
+ * <igc-rating value="3" max="5" label="Rate this product"></igc-rating>
17
+ * ```
18
+ *
19
+ * @example
20
+ * ```html
21
+ * <!-- Half-star rating with hover preview -->
22
+ * <igc-rating step="0.5" hover-preview value-format="{0} out of {1} stars"></igc-rating>
23
+ * ```
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <!-- Custom symbols via projected rating symbols -->
28
+ * <igc-rating>
29
+ * <igc-rating-symbol>
30
+ * <igc-icon name="heart_filled" collection="default"></igc-icon>
31
+ * <igc-icon name="heart_outlined" collection="default" slot="empty"></igc-icon>
32
+ * </igc-rating-symbol>
33
+ * <igc-rating-symbol>
34
+ * <igc-icon name="heart_filled" collection="default"></igc-icon>
35
+ * <igc-icon name="heart_outlined" collection="default" slot="empty"></igc-icon>
36
+ * </igc-rating-symbol>
37
+ * </igc-rating>
38
+ * ```
12
39
  *
13
40
  * @element igc-rating
14
41
  *
42
+ * @slot symbol - Slot for projecting custom `igc-rating-symbol` elements. When used, the number of symbols determines the `max` value.
43
+ * @slot value-label - Slot for custom content displayed alongside the rating value.
44
+ *
15
45
  * @fires igcChange - Emitted when the value of the control changes.
16
46
  * @fires igcHover - Emitted when hover is enabled and the user mouses over a symbol of the rating.
17
47
  *
@@ -33,18 +63,18 @@ export default class IgcRatingComponent extends IgcRatingComponent_base {
33
63
  static readonly tagName = "igc-rating";
34
64
  static styles: import("lit").CSSResult[];
35
65
  static register(): void;
66
+ protected readonly _slots: import("../common/controllers/slot.js").SlotController<"symbol" | "[default]" | "value-label">;
36
67
  protected readonly _formValue: import("../common/mixins/forms/form-value.js").FormValue<number>;
37
68
  private _max;
38
69
  private _step;
39
70
  private _single;
40
- protected ratingSymbols: IgcRatingSymbolComponent[];
41
- protected container: HTMLElement;
42
- protected valueLabel: Node[];
43
- protected hoverValue: number;
44
- protected hoverState: boolean;
45
- protected get isInteractive(): boolean;
46
- protected get hasProjectedSymbols(): boolean;
47
- protected get valueText(): string;
71
+ private _symbols;
72
+ private _container?;
73
+ private _hoverValue;
74
+ private _hoverState;
75
+ private get _isInteractive();
76
+ private get _hasProjectedSymbols();
77
+ private get _valueText();
48
78
  /**
49
79
  * The maximum value for the rating.
50
80
  *
@@ -68,7 +98,7 @@ export default class IgcRatingComponent extends IgcRatingComponent_base {
68
98
  * The label of the control.
69
99
  * @attr label
70
100
  */
71
- label: string;
101
+ label?: string;
72
102
  /**
73
103
  * A format string which sets aria-valuetext. Instances of '{0}' will be replaced
74
104
  * with the current value of the control and instances of '{1}' with the maximum value for the control.
@@ -76,7 +106,7 @@ export default class IgcRatingComponent extends IgcRatingComponent_base {
76
106
  * Important for screen-readers and useful for localization.
77
107
  * @attr value-format
78
108
  */
79
- valueFormat: string;
109
+ valueFormat?: string;
80
110
  /**
81
111
  * The current value of the component
82
112
  * @attr value
@@ -104,22 +134,22 @@ export default class IgcRatingComponent extends IgcRatingComponent_base {
104
134
  /**
105
135
  * Whether to reset the rating when the user selects the same value.
106
136
  * @attr allow-reset
137
+ * @default false
107
138
  */
108
139
  allowReset: boolean;
109
140
  constructor();
110
- protected firstUpdated(): Promise<void>;
111
- protected handleClick({ clientX }: PointerEvent): void;
112
- protected handlePointerMove({ clientX }: PointerEvent): void;
113
- protected emitValueUpdate(value: number): void;
114
- protected handleSlotChange(): void;
115
- protected handleHoverEnabled(): void;
116
- protected handleHoverDisabled(): void;
117
- protected calcNewValue(x: number): number;
118
- protected round(value: number): number;
119
- protected clipSymbol(index: number, isLTR?: boolean): {
120
- backward: string;
121
- forward: string;
122
- };
141
+ protected firstUpdated(): void;
142
+ protected updated(): void;
143
+ private _handleClick;
144
+ private _handlePointerMove;
145
+ private _handleSlotChange;
146
+ private _handleHoverEnabled;
147
+ private _handleHoverDisabled;
148
+ private _emitValueUpdate;
149
+ private _calcNewValue;
150
+ private _round;
151
+ private _updateProjectedSymbols;
152
+ private _clipSymbol;
123
153
  /**
124
154
  * Increments the value of the control by `n` steps multiplied by the
125
155
  * step factor.
@@ -130,8 +160,7 @@ export default class IgcRatingComponent extends IgcRatingComponent_base {
130
160
  * the step factor.
131
161
  */
132
162
  stepDown(n?: number): void;
133
- protected renderSymbols(): Generator<import("lit-html").TemplateResult<1>, void, unknown>;
134
- protected clipProjected(): void;
163
+ private _renderSymbols;
135
164
  protected render(): import("lit-html").TemplateResult<1>;
136
165
  }
137
166
  declare global {
@@ -5,44 +5,46 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { html, LitElement, nothing } from 'lit';
8
- import { property, query, queryAssignedElements, queryAssignedNodes, state, } from 'lit/decorators.js';
9
- import { guard } from 'lit/directives/guard.js';
10
- import { ifDefined } from 'lit/directives/if-defined.js';
8
+ import { property, query, state } from 'lit/decorators.js';
9
+ import { range } from 'lit/directives/range.js';
10
+ import { repeat } from 'lit/directives/repeat.js';
11
11
  import { styleMap } from 'lit/directives/style-map.js';
12
12
  import { addThemingController } from '../../theming/theming-controller.js';
13
13
  import { addKeybindings, arrowDown, arrowLeft, arrowRight, arrowUp, endKey, homeKey, } from '../common/controllers/key-bindings.js';
14
+ import { addSlotController, setSlots, } from '../common/controllers/slot.js';
14
15
  import { registerComponent } from '../common/definitions/register.js';
15
16
  import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
16
17
  import { FormAssociatedMixin } from '../common/mixins/forms/associated.js';
17
18
  import { FormValueNumberTransformers } from '../common/mixins/forms/form-transformers.js';
18
19
  import { createFormValueState } from '../common/mixins/forms/form-value.js';
19
- import { asNumber, clamp, formatString, isEmpty, isLTR, numberOfDecimals, roundPrecise, } from '../common/util.js';
20
+ import { asNumber, bindIf, clamp, formatString, isLTR, numberOfDecimals, roundPrecise, } from '../common/util.js';
20
21
  import IgcIconComponent from '../icon/icon.js';
21
22
  import IgcRatingSymbolComponent from './rating-symbol.js';
22
23
  import { styles } from './themes/rating.base.css.js';
23
24
  import { styles as shared } from './themes/shared/rating.common.css.js';
24
25
  import { all } from './themes/themes.js';
26
+ const Slots = setSlots('symbol', 'value-label');
25
27
  export default class IgcRatingComponent extends FormAssociatedMixin(EventEmitterMixin(LitElement)) {
26
28
  static { this.tagName = 'igc-rating'; }
27
29
  static { this.styles = [styles, shared]; }
28
30
  static register() {
29
31
  registerComponent(IgcRatingComponent, IgcIconComponent, IgcRatingSymbolComponent);
30
32
  }
31
- get isInteractive() {
33
+ get _isInteractive() {
32
34
  return !(this.readOnly || this.disabled);
33
35
  }
34
- get hasProjectedSymbols() {
35
- return this.ratingSymbols.length > 0;
36
+ get _hasProjectedSymbols() {
37
+ return this._symbols.length > 0;
36
38
  }
37
- get valueText() {
38
- const value = this.round(this.value);
39
+ get _valueText() {
40
+ const value = this._round(this.value);
39
41
  return this.valueFormat
40
42
  ? formatString(this.valueFormat, value, this.max)
41
43
  : `${value} of ${this.max}`;
42
44
  }
43
45
  set max(value) {
44
- this._max = this.hasProjectedSymbols
45
- ? this.ratingSymbols.length
46
+ this._max = this._hasProjectedSymbols
47
+ ? this._symbols.length
46
48
  : Math.max(0, value);
47
49
  if (this._max < this.value) {
48
50
  this.value = this._max;
@@ -78,6 +80,10 @@ export default class IgcRatingComponent extends FormAssociatedMixin(EventEmitter
78
80
  }
79
81
  constructor() {
80
82
  super();
83
+ this._slots = addSlotController(this, {
84
+ slots: Slots,
85
+ onChange: this._handleSlotChange,
86
+ });
81
87
  this._formValue = createFormValueState(this, {
82
88
  initialValue: 0,
83
89
  transformers: FormValueNumberTransformers,
@@ -85,76 +91,103 @@ export default class IgcRatingComponent extends FormAssociatedMixin(EventEmitter
85
91
  this._max = 5;
86
92
  this._step = 1;
87
93
  this._single = false;
88
- this.hoverValue = -1;
89
- this.hoverState = false;
94
+ this._symbols = [];
95
+ this._hoverValue = -1;
96
+ this._hoverState = false;
90
97
  this.hoverPreview = false;
91
98
  this.readOnly = false;
92
99
  this.allowReset = false;
93
100
  addThemingController(this, all);
94
101
  addKeybindings(this, {
95
- skip: () => !this.isInteractive,
102
+ skip: () => !this._isInteractive,
103
+ bindingDefaults: { repeat: true },
96
104
  })
97
- .set(arrowUp, () => this.emitValueUpdate(this.value + this.step))
98
- .set(arrowRight, () => this.emitValueUpdate(isLTR(this) ? this.value + this.step : this.value - this.step))
99
- .set(arrowDown, () => this.emitValueUpdate(this.value - this.step))
100
- .set(arrowLeft, () => this.emitValueUpdate(isLTR(this) ? this.value - this.step : this.value + this.step))
101
- .set(homeKey, () => this.emitValueUpdate(this.step))
102
- .set(endKey, () => this.emitValueUpdate(this.max));
105
+ .set(arrowUp, () => this._emitValueUpdate(this.value + this.step))
106
+ .set(arrowRight, () => this._emitValueUpdate(isLTR(this) ? this.value + this.step : this.value - this.step))
107
+ .set(arrowDown, () => this._emitValueUpdate(this.value - this.step))
108
+ .set(arrowLeft, () => this._emitValueUpdate(isLTR(this) ? this.value - this.step : this.value + this.step))
109
+ .set(homeKey, () => this._emitValueUpdate(this.step))
110
+ .set(endKey, () => this._emitValueUpdate(this.max));
103
111
  }
104
- async firstUpdated() {
105
- await this.updateComplete;
112
+ firstUpdated() {
106
113
  this._formValue.setValueAndFormState(clamp(this.value, 0, this.max));
107
114
  this._pristine = true;
108
115
  }
109
- handleClick({ clientX }) {
110
- const value = this.calcNewValue(clientX);
116
+ updated() {
117
+ if (this._hasProjectedSymbols) {
118
+ this._updateProjectedSymbols();
119
+ }
120
+ }
121
+ _handleClick({ clientX }) {
122
+ const value = this._calcNewValue(clientX);
111
123
  const sameValue = this.value === value;
112
124
  if (this.allowReset && sameValue) {
113
- this.emitValueUpdate(0);
125
+ this._emitValueUpdate(0);
114
126
  }
115
127
  else if (!sameValue) {
116
- this.emitValueUpdate(value);
128
+ this._emitValueUpdate(value);
117
129
  }
118
130
  }
119
- handlePointerMove({ clientX }) {
120
- const value = this.calcNewValue(clientX);
121
- if (this.hoverValue !== value) {
122
- this.hoverValue = value;
123
- this.emitEvent('igcHover', { detail: this.hoverValue });
131
+ _handlePointerMove({ clientX }) {
132
+ const value = this._calcNewValue(clientX);
133
+ if (this._hoverValue !== value) {
134
+ this._hoverValue = value;
135
+ this.emitEvent('igcHover', { detail: this._hoverValue });
124
136
  }
125
137
  }
126
- emitValueUpdate(value) {
127
- this._setTouchedState();
128
- this.value = clamp(value, 0, this.max);
129
- if (value === this.value) {
130
- this.emitEvent('igcChange', { detail: this.value });
138
+ _handleSlotChange({ slot, }) {
139
+ if (slot === 'symbol') {
140
+ this._symbols = this._slots.getAssignedElements('symbol', {
141
+ selector: IgcRatingSymbolComponent.tagName,
142
+ });
143
+ if (this._hasProjectedSymbols) {
144
+ this.max = this._symbols.length;
145
+ }
131
146
  }
132
147
  }
133
- handleSlotChange() {
134
- if (this.hasProjectedSymbols) {
135
- this.max = this.ratingSymbols.length;
136
- this.requestUpdate();
137
- }
148
+ _handleHoverEnabled() {
149
+ this._hoverState = true;
138
150
  }
139
- handleHoverEnabled() {
140
- this.hoverState = true;
151
+ _handleHoverDisabled() {
152
+ this._hoverState = false;
141
153
  }
142
- handleHoverDisabled() {
143
- this.hoverState = false;
154
+ _emitValueUpdate(next) {
155
+ this._setTouchedState();
156
+ const clamped = clamp(next, 0, this.max);
157
+ if (clamped !== this.value) {
158
+ this.value = clamped;
159
+ this.emitEvent('igcChange', { detail: this.value });
160
+ }
144
161
  }
145
- calcNewValue(x) {
146
- const { width, left, right } = this.container.getBoundingClientRect();
162
+ _calcNewValue(x) {
163
+ const { width, left, right } = this._container?.getBoundingClientRect() ?? new DOMRect(1, 1, 1, 1);
147
164
  const percent = isLTR(this) ? (x - left) / width : (right - x) / width;
148
- const value = this.round(this.max * percent);
165
+ const value = this._round(this.max * percent);
149
166
  return clamp(value, this.step, this.max);
150
167
  }
151
- round(value) {
168
+ _round(value) {
152
169
  return roundPrecise(Math.ceil(value / this.step) * this.step, numberOfDecimals(this.step));
153
170
  }
154
- clipSymbol(index, isLTR = true) {
155
- const value = this.hoverState ? this.hoverValue : this.value;
171
+ _updateProjectedSymbols() {
172
+ const ltr = isLTR(this);
173
+ const partFull = '[part="symbol full"]';
174
+ const partEmpty = '[part="symbol empty"]';
175
+ for (const [i, symbol] of this._symbols.entries()) {
176
+ const full = symbol.renderRoot.querySelector(partFull);
177
+ const empty = symbol.renderRoot.querySelector(partEmpty);
178
+ const { forward, backward } = this._clipSymbol(i, ltr);
179
+ if (full) {
180
+ full.style.clipPath = forward;
181
+ }
182
+ if (empty) {
183
+ empty.style.clipPath = backward;
184
+ }
185
+ }
186
+ }
187
+ _clipSymbol(index, isLTR = true) {
188
+ const value = this._hoverState ? this._hoverValue : this.value;
156
189
  const progress = index + 1 - value;
157
- const exclusive = progress === 0 || this.value === index + 1 ? 0 : 1;
190
+ const exclusive = progress === 0 || value === index + 1 ? 0 : 1;
158
191
  const selection = this.single ? exclusive : progress;
159
192
  const activate = (p) => clamp(p * 100, 0, 100);
160
193
  const forward = `inset(0 ${activate(isLTR ? selection : 1 - selection)}% 0 0)`;
@@ -165,57 +198,37 @@ export default class IgcRatingComponent extends FormAssociatedMixin(EventEmitter
165
198
  };
166
199
  }
167
200
  stepUp(n = 1) {
168
- this.value += this.round(n * this.step);
201
+ this.value += this._round(n * this.step);
169
202
  }
170
203
  stepDown(n = 1) {
171
- this.value -= this.round(n * this.step);
172
- }
173
- *renderSymbols() {
174
- const ltr = isLTR(this);
175
- for (let i = 0; i < this.max; i++) {
176
- const { forward, backward } = this.clipSymbol(i, ltr);
177
- yield html `<igc-rating-symbol exportparts="symbol, full, empty">
178
- <igc-icon
179
- collection="default"
180
- name="star_filled"
181
- style=${styleMap({ clipPath: forward })}
182
- ></igc-icon>
183
- <igc-icon
184
- collection="default"
185
- name="star_outlined"
186
- style=${styleMap({ clipPath: backward })}
187
- slot="empty"
188
- ></igc-icon>
189
- </igc-rating-symbol>`;
190
- }
204
+ this.value -= this._round(n * this.step);
191
205
  }
192
- clipProjected() {
206
+ _renderSymbols() {
193
207
  const ltr = isLTR(this);
194
- const partFull = '[part="symbol full"]';
195
- const partEmpty = '[part="symbol empty"]';
196
- for (const [i, symbol] of this.ratingSymbols.entries()) {
197
- const full = symbol.renderRoot.querySelector(partFull);
198
- const empty = symbol.renderRoot.querySelector(partEmpty);
199
- const { forward, backward } = this.clipSymbol(i, ltr);
200
- if (full) {
201
- full.style.clipPath = forward;
202
- }
203
- if (empty) {
204
- empty.style.clipPath = backward;
205
- }
206
- }
208
+ return html `
209
+ ${repeat(range(this.max), (i) => i, (i) => {
210
+ const { forward, backward } = this._clipSymbol(i, ltr);
211
+ return html `
212
+ <igc-rating-symbol exportparts="symbol, full, empty">
213
+ <igc-icon
214
+ collection="default"
215
+ name="star_filled"
216
+ style=${styleMap({ clipPath: forward })}
217
+ ></igc-icon>
218
+ <igc-icon
219
+ collection="default"
220
+ name="star_outlined"
221
+ style=${styleMap({ clipPath: backward })}
222
+ slot="empty"
223
+ ></igc-icon>
224
+ </igc-rating-symbol>
225
+ `;
226
+ })}
227
+ `;
207
228
  }
208
229
  render() {
209
- const props = [
210
- this.value,
211
- this.hoverValue,
212
- this.max,
213
- this.step,
214
- this.single,
215
- this.hoverState,
216
- this.ratingSymbols,
217
- ];
218
- const hoverActive = this.hoverPreview && this.isInteractive;
230
+ const hoverActive = this.hoverPreview && this._isInteractive;
231
+ const valueLabelHidden = !this._slots.hasAssignedNodes('value-label', true);
219
232
  return html `
220
233
  <label part="label" id="rating-label" ?hidden=${!this.label}
221
234
  >${this.label}</label
@@ -223,52 +236,42 @@ export default class IgcRatingComponent extends FormAssociatedMixin(EventEmitter
223
236
  <div
224
237
  part="base"
225
238
  role="slider"
226
- tabindex=${ifDefined(this.disabled ? undefined : 0)}
239
+ tabindex=${this.disabled ? -1 : 0}
227
240
  aria-labelledby="rating-label"
228
241
  aria-valuemin="0"
229
242
  aria-valuenow=${this.value}
230
243
  aria-valuemax=${this.max}
231
- aria-valuetext=${this.valueText}
244
+ aria-valuetext=${this._valueText}
232
245
  >
233
246
  <div
234
247
  aria-hidden="true"
235
248
  part="symbols"
236
- @click=${this.isInteractive ? this.handleClick : nothing}
237
- @pointerenter=${hoverActive ? this.handleHoverEnabled : nothing}
238
- @pointerleave=${hoverActive ? this.handleHoverDisabled : nothing}
239
- @pointermove=${hoverActive ? this.handlePointerMove : nothing}
249
+ @click=${bindIf(this._isInteractive, this._handleClick)}
250
+ @pointerenter=${bindIf(hoverActive, this._handleHoverEnabled)}
251
+ @pointerleave=${bindIf(hoverActive, this._handleHoverDisabled)}
252
+ @pointercancel=${bindIf(hoverActive, this._handleHoverDisabled)}
253
+ @pointermove=${bindIf(hoverActive, this._handlePointerMove)}
240
254
  >
241
- <slot name="symbol" @slotchange=${this.handleSlotChange}>
242
- ${guard(props, () => this.hasProjectedSymbols
243
- ? this.clipProjected()
244
- : this.renderSymbols())}
255
+ <slot name="symbol">
256
+ ${this._hasProjectedSymbols ? nothing : this._renderSymbols()}
245
257
  </slot>
246
258
  </div>
247
- <label part="value-label" ?hidden=${isEmpty(this.valueLabel)}>
259
+ <label part="value-label" ?hidden=${valueLabelHidden}>
248
260
  <slot name="value-label"></slot>
249
261
  </label>
250
262
  </div>
251
263
  `;
252
264
  }
253
265
  }
254
- __decorate([
255
- queryAssignedElements({
256
- selector: IgcRatingSymbolComponent.tagName,
257
- slot: 'symbol',
258
- })
259
- ], IgcRatingComponent.prototype, "ratingSymbols", void 0);
260
266
  __decorate([
261
267
  query('[part="symbols"]', true)
262
- ], IgcRatingComponent.prototype, "container", void 0);
263
- __decorate([
264
- queryAssignedNodes({ slot: 'value-label', flatten: true })
265
- ], IgcRatingComponent.prototype, "valueLabel", void 0);
268
+ ], IgcRatingComponent.prototype, "_container", void 0);
266
269
  __decorate([
267
270
  state()
268
- ], IgcRatingComponent.prototype, "hoverValue", void 0);
271
+ ], IgcRatingComponent.prototype, "_hoverValue", void 0);
269
272
  __decorate([
270
273
  state()
271
- ], IgcRatingComponent.prototype, "hoverState", void 0);
274
+ ], IgcRatingComponent.prototype, "_hoverState", void 0);
272
275
  __decorate([
273
276
  property({ type: Number })
274
277
  ], IgcRatingComponent.prototype, "max", null);
@@ -1 +1 @@
1
- {"version":3,"file":"rating.js","sourceRoot":"","sources":["../../../src/components/rating/rating.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport {\n property,\n query,\n queryAssignedElements,\n queryAssignedNodes,\n state,\n} from 'lit/decorators.js';\nimport { guard } from 'lit/directives/guard.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport {\n addKeybindings,\n arrowDown,\n arrowLeft,\n arrowRight,\n arrowUp,\n endKey,\n homeKey,\n} from '../common/controllers/key-bindings.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport type { Constructor } from '../common/mixins/constructor.js';\nimport { EventEmitterMixin } from '../common/mixins/event-emitter.js';\nimport { FormAssociatedMixin } from '../common/mixins/forms/associated.js';\nimport { FormValueNumberTransformers } from '../common/mixins/forms/form-transformers.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport {\n asNumber,\n clamp,\n formatString,\n isEmpty,\n isLTR,\n numberOfDecimals,\n roundPrecise,\n} from '../common/util.js';\nimport IgcIconComponent from '../icon/icon.js';\nimport IgcRatingSymbolComponent from './rating-symbol.js';\nimport { styles } from './themes/rating.base.css.js';\nimport { styles as shared } from './themes/shared/rating.common.css.js';\nimport { all } from './themes/themes.js';\n\nexport interface IgcRatingComponentEventMap {\n igcChange: CustomEvent<number>;\n igcHover: CustomEvent<number>;\n}\n\n/**\n * Rating provides insight regarding others' opinions and experiences,\n * and can allow the user to submit a rating of their own\n *\n * @element igc-rating\n *\n * @fires igcChange - Emitted when the value of the control changes.\n * @fires igcHover - Emitted when hover is enabled and the user mouses over a symbol of the rating.\n *\n * @csspart base - The main wrapper which holds all of the rating elements.\n * @csspart label - The label part.\n * @csspart value-label - The value label part.\n * @csspart symbols - A wrapper for all rating symbols.\n * @csspart symbol - The part of the encapsulated default symbol.\n * @csspart full - The part of the encapsulated full symbols.\n * @csspart empty - The part of the encapsulated empty symbols.\n *\n * @cssproperty --symbol-size - The size of the symbols.\n * @cssproperty --symbol-full-color - The color of the filled symbol.\n * @cssproperty --symbol-empty-color - The color of the empty symbol.\n * @cssproperty --symbol-full-filter - The filter(s) used for the filled symbol.\n * @cssproperty --symbol-empty-filter - The filter(s) used for the empty symbol.\n */\nexport default class IgcRatingComponent extends FormAssociatedMixin(\n EventEmitterMixin<IgcRatingComponentEventMap, Constructor<LitElement>>(\n LitElement\n )\n) {\n public static readonly tagName = 'igc-rating';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register() {\n registerComponent(\n IgcRatingComponent,\n IgcIconComponent,\n IgcRatingSymbolComponent\n );\n }\n\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: 0,\n transformers: FormValueNumberTransformers,\n });\n\n private _max = 5;\n private _step = 1;\n private _single = false;\n\n @queryAssignedElements({\n selector: IgcRatingSymbolComponent.tagName,\n slot: 'symbol',\n })\n protected ratingSymbols!: IgcRatingSymbolComponent[];\n\n @query('[part=\"symbols\"]', true)\n protected container!: HTMLElement;\n\n @queryAssignedNodes({ slot: 'value-label', flatten: true })\n protected valueLabel!: Node[];\n\n @state()\n protected hoverValue = -1;\n\n @state()\n protected hoverState = false;\n\n protected get isInteractive() {\n return !(this.readOnly || this.disabled);\n }\n\n protected get hasProjectedSymbols() {\n return this.ratingSymbols.length > 0;\n }\n\n protected get valueText() {\n // Skip IEEE 754 representation for screen readers\n const value = this.round(this.value);\n return this.valueFormat\n ? formatString(this.valueFormat, value, this.max)\n : `${value} of ${this.max}`;\n }\n\n /**\n * The maximum value for the rating.\n *\n * If there are projected symbols, the maximum value will be resolved\n * based on the number of symbols.\n * @attr max\n * @default 5\n */\n @property({ type: Number })\n public set max(value: number) {\n this._max = this.hasProjectedSymbols\n ? this.ratingSymbols.length\n : Math.max(0, value);\n\n if (this._max < this.value) {\n this.value = this._max;\n }\n }\n\n public get max(): number {\n return this._max;\n }\n\n /**\n * The minimum value change allowed.\n *\n * Valid values are in the interval between 0 and 1 inclusive.\n * @attr step\n * @default 1\n */\n @property({ type: Number })\n public set step(value: number) {\n this._step = this.single ? 1 : clamp(value, 0.001, 1);\n }\n\n public get step(): number {\n return this._step;\n }\n\n /**\n * The label of the control.\n * @attr label\n */\n @property()\n public label!: string;\n\n /**\n * A format string which sets aria-valuetext. Instances of '{0}' will be replaced\n * with the current value of the control and instances of '{1}' with the maximum value for the control.\n *\n * Important for screen-readers and useful for localization.\n * @attr value-format\n */\n @property({ attribute: 'value-format' })\n public valueFormat!: string;\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n /**\n * The current value of the component\n * @attr value\n * @default 0\n */\n @property({ type: Number })\n public set value(number: number) {\n const value = this.hasUpdated\n ? clamp(asNumber(number), 0, this.max)\n : Math.max(asNumber(number), 0);\n this._formValue.setValueAndFormState(value);\n }\n\n public get value(): number {\n return this._formValue.value;\n }\n\n /**\n * Sets hover preview behavior for the component\n * @attr hover-preview\n */\n @property({ type: Boolean, reflect: true, attribute: 'hover-preview' })\n public hoverPreview = false;\n\n /**\n * Makes the control a readonly field.\n * @attr readonly\n */\n @property({ type: Boolean, reflect: true, attribute: 'readonly' })\n public readOnly = false;\n\n /**\n * Toggles single selection visual mode.\n * @attr single\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public set single(value: boolean) {\n this._single = Boolean(value);\n\n if (this._single) {\n this.step = 1;\n this.value = Math.ceil(this.value);\n }\n }\n\n public get single(): boolean {\n return this._single;\n }\n\n /**\n * Whether to reset the rating when the user selects the same value.\n * @attr allow-reset\n */\n @property({ type: Boolean, reflect: true, attribute: 'allow-reset' })\n public allowReset = false;\n\n constructor() {\n super();\n\n addThemingController(this, all);\n\n addKeybindings(this, {\n skip: () => !this.isInteractive,\n })\n .set(arrowUp, () => this.emitValueUpdate(this.value + this.step))\n .set(arrowRight, () =>\n this.emitValueUpdate(\n isLTR(this) ? this.value + this.step : this.value - this.step\n )\n )\n .set(arrowDown, () => this.emitValueUpdate(this.value - this.step))\n .set(arrowLeft, () =>\n this.emitValueUpdate(\n isLTR(this) ? this.value - this.step : this.value + this.step\n )\n )\n .set(homeKey, () => this.emitValueUpdate(this.step))\n .set(endKey, () => this.emitValueUpdate(this.max));\n }\n\n protected override async firstUpdated() {\n await this.updateComplete;\n this._formValue.setValueAndFormState(clamp(this.value, 0, this.max));\n this._pristine = true;\n }\n\n protected handleClick({ clientX }: PointerEvent) {\n const value = this.calcNewValue(clientX);\n const sameValue = this.value === value;\n\n if (this.allowReset && sameValue) {\n this.emitValueUpdate(0);\n } else if (!sameValue) {\n this.emitValueUpdate(value);\n }\n }\n\n protected handlePointerMove({ clientX }: PointerEvent) {\n const value = this.calcNewValue(clientX);\n\n if (this.hoverValue !== value) {\n // Since pointermove spams a lot, only emit on a value change\n this.hoverValue = value;\n this.emitEvent('igcHover', { detail: this.hoverValue });\n }\n }\n\n protected emitValueUpdate(value: number) {\n this._setTouchedState();\n this.value = clamp(value, 0, this.max);\n if (value === this.value) {\n this.emitEvent('igcChange', { detail: this.value });\n }\n }\n\n protected handleSlotChange() {\n if (this.hasProjectedSymbols) {\n this.max = this.ratingSymbols.length;\n this.requestUpdate();\n }\n }\n\n protected handleHoverEnabled() {\n this.hoverState = true;\n }\n\n protected handleHoverDisabled() {\n this.hoverState = false;\n }\n\n protected calcNewValue(x: number) {\n const { width, left, right } = this.container.getBoundingClientRect();\n const percent = isLTR(this) ? (x - left) / width : (right - x) / width;\n const value = this.round(this.max * percent);\n\n return clamp(value, this.step, this.max);\n }\n\n protected round(value: number) {\n return roundPrecise(\n Math.ceil(value / this.step) * this.step,\n numberOfDecimals(this.step)\n );\n }\n\n protected clipSymbol(index: number, isLTR = true) {\n const value = this.hoverState ? this.hoverValue : this.value;\n const progress = index + 1 - value;\n const exclusive = progress === 0 || this.value === index + 1 ? 0 : 1;\n const selection = this.single ? exclusive : progress;\n const activate = (p: number) => clamp(p * 100, 0, 100);\n\n const forward = `inset(0 ${activate(\n isLTR ? selection : 1 - selection\n )}% 0 0)`;\n const backward = `inset(0 0 0 ${activate(\n isLTR ? 1 - selection : selection\n )}%)`;\n\n return {\n backward: isLTR ? backward : forward,\n forward: isLTR ? forward : backward,\n };\n }\n\n /**\n * Increments the value of the control by `n` steps multiplied by the\n * step factor.\n */\n public stepUp(n = 1) {\n this.value += this.round(n * this.step);\n }\n\n /**\n * Decrements the value of the control by `n` steps multiplied by\n * the step factor.\n */\n public stepDown(n = 1) {\n this.value -= this.round(n * this.step);\n }\n\n protected *renderSymbols() {\n const ltr = isLTR(this);\n for (let i = 0; i < this.max; i++) {\n const { forward, backward } = this.clipSymbol(i, ltr);\n yield html`<igc-rating-symbol exportparts=\"symbol, full, empty\">\n <igc-icon\n collection=\"default\"\n name=\"star_filled\"\n style=${styleMap({ clipPath: forward })}\n ></igc-icon>\n <igc-icon\n collection=\"default\"\n name=\"star_outlined\"\n style=${styleMap({ clipPath: backward })}\n slot=\"empty\"\n ></igc-icon>\n </igc-rating-symbol>`;\n }\n }\n\n protected clipProjected() {\n const ltr = isLTR(this);\n const partFull = '[part=\"symbol full\"]';\n const partEmpty = '[part=\"symbol empty\"]';\n\n for (const [i, symbol] of this.ratingSymbols.entries()) {\n const full = symbol.renderRoot.querySelector<HTMLElement>(partFull);\n const empty = symbol.renderRoot.querySelector<HTMLElement>(partEmpty);\n const { forward, backward } = this.clipSymbol(i, ltr);\n\n if (full) {\n full.style.clipPath = forward;\n }\n\n if (empty) {\n empty.style.clipPath = backward;\n }\n }\n }\n\n protected override render() {\n const props = [\n this.value,\n this.hoverValue,\n this.max,\n this.step,\n this.single,\n this.hoverState,\n this.ratingSymbols,\n ];\n\n const hoverActive = this.hoverPreview && this.isInteractive;\n\n return html`\n <label part=\"label\" id=\"rating-label\" ?hidden=${!this.label}\n >${this.label}</label\n >\n <div\n part=\"base\"\n role=\"slider\"\n tabindex=${ifDefined(this.disabled ? undefined : 0)}\n aria-labelledby=\"rating-label\"\n aria-valuemin=\"0\"\n aria-valuenow=${this.value}\n aria-valuemax=${this.max}\n aria-valuetext=${this.valueText}\n >\n <div\n aria-hidden=\"true\"\n part=\"symbols\"\n @click=${this.isInteractive ? this.handleClick : nothing}\n @pointerenter=${hoverActive ? this.handleHoverEnabled : nothing}\n @pointerleave=${hoverActive ? this.handleHoverDisabled : nothing}\n @pointermove=${hoverActive ? this.handlePointerMove : nothing}\n >\n <slot name=\"symbol\" @slotchange=${this.handleSlotChange}>\n ${guard(props, () =>\n this.hasProjectedSymbols\n ? this.clipProjected()\n : this.renderSymbols()\n )}\n </slot>\n </div>\n <label part=\"value-label\" ?hidden=${isEmpty(this.valueLabel)}>\n <slot name=\"value-label\"></slot>\n </label>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-rating': IgcRatingComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"rating.js","sourceRoot":"","sources":["../../../src/components/rating/rating.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { range } from 'lit/directives/range.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport {\n addKeybindings,\n arrowDown,\n arrowLeft,\n arrowRight,\n arrowUp,\n endKey,\n homeKey,\n} from '../common/controllers/key-bindings.js';\nimport {\n addSlotController,\n type InferSlotNames,\n type SlotChangeCallbackParameters,\n setSlots,\n} from '../common/controllers/slot.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport type { Constructor } from '../common/mixins/constructor.js';\nimport { EventEmitterMixin } from '../common/mixins/event-emitter.js';\nimport { FormAssociatedMixin } from '../common/mixins/forms/associated.js';\nimport { FormValueNumberTransformers } from '../common/mixins/forms/form-transformers.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport {\n asNumber,\n bindIf,\n clamp,\n formatString,\n isLTR,\n numberOfDecimals,\n roundPrecise,\n} from '../common/util.js';\nimport IgcIconComponent from '../icon/icon.js';\nimport IgcRatingSymbolComponent from './rating-symbol.js';\nimport { styles } from './themes/rating.base.css.js';\nimport { styles as shared } from './themes/shared/rating.common.css.js';\nimport { all } from './themes/themes.js';\n\nexport interface IgcRatingComponentEventMap {\n igcChange: CustomEvent<number>;\n igcHover: CustomEvent<number>;\n}\n\nconst Slots = setSlots('symbol', 'value-label');\n\n/**\n * A rating component that allows users to view and provide ratings using customizable symbols.\n * It supports fractional values, hover previews, keyboard navigation, single-selection mode,\n * and integrates with forms as a number input.\n *\n * @example\n * ```html\n * <!-- Basic rating -->\n * <igc-rating value=\"3\" max=\"5\" label=\"Rate this product\"></igc-rating>\n * ```\n *\n * @example\n * ```html\n * <!-- Half-star rating with hover preview -->\n * <igc-rating step=\"0.5\" hover-preview value-format=\"{0} out of {1} stars\"></igc-rating>\n * ```\n *\n * @example\n * ```html\n * <!-- Custom symbols via projected rating symbols -->\n * <igc-rating>\n * <igc-rating-symbol>\n * <igc-icon name=\"heart_filled\" collection=\"default\"></igc-icon>\n * <igc-icon name=\"heart_outlined\" collection=\"default\" slot=\"empty\"></igc-icon>\n * </igc-rating-symbol>\n * <igc-rating-symbol>\n * <igc-icon name=\"heart_filled\" collection=\"default\"></igc-icon>\n * <igc-icon name=\"heart_outlined\" collection=\"default\" slot=\"empty\"></igc-icon>\n * </igc-rating-symbol>\n * </igc-rating>\n * ```\n *\n * @element igc-rating\n *\n * @slot symbol - Slot for projecting custom `igc-rating-symbol` elements. When used, the number of symbols determines the `max` value.\n * @slot value-label - Slot for custom content displayed alongside the rating value.\n *\n * @fires igcChange - Emitted when the value of the control changes.\n * @fires igcHover - Emitted when hover is enabled and the user mouses over a symbol of the rating.\n *\n * @csspart base - The main wrapper which holds all of the rating elements.\n * @csspart label - The label part.\n * @csspart value-label - The value label part.\n * @csspart symbols - A wrapper for all rating symbols.\n * @csspart symbol - The part of the encapsulated default symbol.\n * @csspart full - The part of the encapsulated full symbols.\n * @csspart empty - The part of the encapsulated empty symbols.\n *\n * @cssproperty --symbol-size - The size of the symbols.\n * @cssproperty --symbol-full-color - The color of the filled symbol.\n * @cssproperty --symbol-empty-color - The color of the empty symbol.\n * @cssproperty --symbol-full-filter - The filter(s) used for the filled symbol.\n * @cssproperty --symbol-empty-filter - The filter(s) used for the empty symbol.\n */\nexport default class IgcRatingComponent extends FormAssociatedMixin(\n EventEmitterMixin<IgcRatingComponentEventMap, Constructor<LitElement>>(\n LitElement\n )\n) {\n public static readonly tagName = 'igc-rating';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcRatingComponent,\n IgcIconComponent,\n IgcRatingSymbolComponent\n );\n }\n\n //#region Internal state and properties\n\n protected readonly _slots = addSlotController(this, {\n slots: Slots,\n onChange: this._handleSlotChange,\n });\n\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: 0,\n transformers: FormValueNumberTransformers,\n });\n\n private _max = 5;\n private _step = 1;\n private _single = false;\n private _symbols: IgcRatingSymbolComponent[] = [];\n\n @query('[part=\"symbols\"]', true)\n private _container?: HTMLElement;\n\n @state()\n private _hoverValue = -1;\n\n @state()\n private _hoverState = false;\n\n private get _isInteractive(): boolean {\n return !(this.readOnly || this.disabled);\n }\n\n private get _hasProjectedSymbols(): boolean {\n return this._symbols.length > 0;\n }\n\n private get _valueText(): string {\n // Skip IEEE 754 representation for screen readers\n const value = this._round(this.value);\n return this.valueFormat\n ? formatString(this.valueFormat, value, this.max)\n : `${value} of ${this.max}`;\n }\n\n //#endregion\n\n //#region Public attributes and properties\n\n /**\n * The maximum value for the rating.\n *\n * If there are projected symbols, the maximum value will be resolved\n * based on the number of symbols.\n * @attr max\n * @default 5\n */\n @property({ type: Number })\n public set max(value: number) {\n this._max = this._hasProjectedSymbols\n ? this._symbols.length\n : Math.max(0, value);\n\n if (this._max < this.value) {\n this.value = this._max;\n }\n }\n\n public get max(): number {\n return this._max;\n }\n\n /**\n * The minimum value change allowed.\n *\n * Valid values are in the interval between 0 and 1 inclusive.\n * @attr step\n * @default 1\n */\n @property({ type: Number })\n public set step(value: number) {\n this._step = this.single ? 1 : clamp(value, 0.001, 1);\n }\n\n public get step(): number {\n return this._step;\n }\n\n /**\n * The label of the control.\n * @attr label\n */\n @property()\n public label?: string;\n\n /**\n * A format string which sets aria-valuetext. Instances of '{0}' will be replaced\n * with the current value of the control and instances of '{1}' with the maximum value for the control.\n *\n * Important for screen-readers and useful for localization.\n * @attr value-format\n */\n @property({ attribute: 'value-format' })\n public valueFormat?: string;\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n /**\n * The current value of the component\n * @attr value\n * @default 0\n */\n @property({ type: Number })\n public set value(number: number) {\n const value = this.hasUpdated\n ? clamp(asNumber(number), 0, this.max)\n : Math.max(asNumber(number), 0);\n this._formValue.setValueAndFormState(value);\n }\n\n public get value(): number {\n return this._formValue.value;\n }\n\n /**\n * Sets hover preview behavior for the component\n * @attr hover-preview\n */\n @property({ type: Boolean, reflect: true, attribute: 'hover-preview' })\n public hoverPreview = false;\n\n /**\n * Makes the control a readonly field.\n * @attr readonly\n */\n @property({ type: Boolean, reflect: true, attribute: 'readonly' })\n public readOnly = false;\n\n /**\n * Toggles single selection visual mode.\n * @attr single\n * @default false\n */\n @property({ type: Boolean, reflect: true })\n public set single(value: boolean) {\n this._single = Boolean(value);\n\n if (this._single) {\n this.step = 1;\n this.value = Math.ceil(this.value);\n }\n }\n\n public get single(): boolean {\n return this._single;\n }\n\n /**\n * Whether to reset the rating when the user selects the same value.\n * @attr allow-reset\n * @default false\n */\n @property({ type: Boolean, reflect: true, attribute: 'allow-reset' })\n public allowReset = false;\n\n //#endregion\n\n //#region Lit lifecycle hooks\n\n constructor() {\n super();\n\n addThemingController(this, all);\n\n addKeybindings(this, {\n skip: () => !this._isInteractive,\n bindingDefaults: { repeat: true },\n })\n .set(arrowUp, () => this._emitValueUpdate(this.value + this.step))\n .set(arrowRight, () =>\n this._emitValueUpdate(\n isLTR(this) ? this.value + this.step : this.value - this.step\n )\n )\n .set(arrowDown, () => this._emitValueUpdate(this.value - this.step))\n .set(arrowLeft, () =>\n this._emitValueUpdate(\n isLTR(this) ? this.value - this.step : this.value + this.step\n )\n )\n .set(homeKey, () => this._emitValueUpdate(this.step))\n .set(endKey, () => this._emitValueUpdate(this.max));\n }\n\n protected override firstUpdated(): void {\n this._formValue.setValueAndFormState(clamp(this.value, 0, this.max));\n this._pristine = true;\n }\n\n protected override updated(): void {\n if (this._hasProjectedSymbols) {\n this._updateProjectedSymbols();\n }\n }\n\n //#endregion\n\n //#region Event handlers\n\n private _handleClick({ clientX }: PointerEvent): void {\n const value = this._calcNewValue(clientX);\n const sameValue = this.value === value;\n\n if (this.allowReset && sameValue) {\n this._emitValueUpdate(0);\n } else if (!sameValue) {\n this._emitValueUpdate(value);\n }\n }\n\n private _handlePointerMove({ clientX }: PointerEvent): void {\n const value = this._calcNewValue(clientX);\n\n if (this._hoverValue !== value) {\n // Since pointermove spams a lot, only emit on a value change\n this._hoverValue = value;\n this.emitEvent('igcHover', { detail: this._hoverValue });\n }\n }\n\n private _handleSlotChange({\n slot,\n }: SlotChangeCallbackParameters<InferSlotNames<typeof Slots>>): void {\n if (slot === 'symbol') {\n this._symbols = this._slots.getAssignedElements('symbol', {\n selector: IgcRatingSymbolComponent.tagName,\n });\n\n if (this._hasProjectedSymbols) {\n this.max = this._symbols.length;\n }\n }\n }\n\n private _handleHoverEnabled(): void {\n this._hoverState = true;\n }\n\n private _handleHoverDisabled(): void {\n this._hoverState = false;\n }\n\n //#endregion\n\n //#region Private methods\n\n private _emitValueUpdate(next: number): void {\n this._setTouchedState();\n\n const clamped = clamp(next, 0, this.max);\n if (clamped !== this.value) {\n this.value = clamped;\n this.emitEvent('igcChange', { detail: this.value });\n }\n }\n\n private _calcNewValue(x: number): number {\n const { width, left, right } =\n this._container?.getBoundingClientRect() ?? new DOMRect(1, 1, 1, 1);\n const percent = isLTR(this) ? (x - left) / width : (right - x) / width;\n const value = this._round(this.max * percent);\n\n return clamp(value, this.step, this.max);\n }\n\n private _round(value: number): number {\n return roundPrecise(\n Math.ceil(value / this.step) * this.step,\n numberOfDecimals(this.step)\n );\n }\n\n private _updateProjectedSymbols(): void {\n const ltr = isLTR(this);\n const partFull = '[part=\"symbol full\"]';\n const partEmpty = '[part=\"symbol empty\"]';\n\n for (const [i, symbol] of this._symbols.entries()) {\n const full = symbol.renderRoot.querySelector<HTMLElement>(partFull);\n const empty = symbol.renderRoot.querySelector<HTMLElement>(partEmpty);\n const { forward, backward } = this._clipSymbol(i, ltr);\n\n if (full) {\n full.style.clipPath = forward;\n }\n\n if (empty) {\n empty.style.clipPath = backward;\n }\n }\n }\n\n private _clipSymbol(index: number, isLTR = true) {\n const value = this._hoverState ? this._hoverValue : this.value;\n const progress = index + 1 - value;\n const exclusive = progress === 0 || value === index + 1 ? 0 : 1;\n const selection = this.single ? exclusive : progress;\n const activate = (p: number) => clamp(p * 100, 0, 100);\n\n const forward = `inset(0 ${activate(\n isLTR ? selection : 1 - selection\n )}% 0 0)`;\n const backward = `inset(0 0 0 ${activate(\n isLTR ? 1 - selection : selection\n )}%)`;\n\n return {\n backward: isLTR ? backward : forward,\n forward: isLTR ? forward : backward,\n };\n }\n\n //#endregion\n\n //#region Public methods\n\n /**\n * Increments the value of the control by `n` steps multiplied by the\n * step factor.\n */\n public stepUp(n = 1): void {\n this.value += this._round(n * this.step);\n }\n\n /**\n * Decrements the value of the control by `n` steps multiplied by\n * the step factor.\n */\n public stepDown(n = 1): void {\n this.value -= this._round(n * this.step);\n }\n\n //#endregion\n\n private _renderSymbols() {\n const ltr = isLTR(this);\n\n return html`\n ${repeat(\n range(this.max),\n (i) => i,\n (i) => {\n const { forward, backward } = this._clipSymbol(i, ltr);\n return html`\n <igc-rating-symbol exportparts=\"symbol, full, empty\">\n <igc-icon\n collection=\"default\"\n name=\"star_filled\"\n style=${styleMap({ clipPath: forward })}\n ></igc-icon>\n <igc-icon\n collection=\"default\"\n name=\"star_outlined\"\n style=${styleMap({ clipPath: backward })}\n slot=\"empty\"\n ></igc-icon>\n </igc-rating-symbol>\n `;\n }\n )}\n `;\n }\n\n protected override render() {\n const hoverActive = this.hoverPreview && this._isInteractive;\n const valueLabelHidden = !this._slots.hasAssignedNodes('value-label', true);\n\n return html`\n <label part=\"label\" id=\"rating-label\" ?hidden=${!this.label}\n >${this.label}</label\n >\n <div\n part=\"base\"\n role=\"slider\"\n tabindex=${this.disabled ? -1 : 0}\n aria-labelledby=\"rating-label\"\n aria-valuemin=\"0\"\n aria-valuenow=${this.value}\n aria-valuemax=${this.max}\n aria-valuetext=${this._valueText}\n >\n <div\n aria-hidden=\"true\"\n part=\"symbols\"\n @click=${bindIf(this._isInteractive, this._handleClick)}\n @pointerenter=${bindIf(hoverActive, this._handleHoverEnabled)}\n @pointerleave=${bindIf(hoverActive, this._handleHoverDisabled)}\n @pointercancel=${bindIf(hoverActive, this._handleHoverDisabled)}\n @pointermove=${bindIf(hoverActive, this._handlePointerMove)}\n >\n <slot name=\"symbol\">\n ${this._hasProjectedSymbols ? nothing : this._renderSymbols()}\n </slot>\n </div>\n <label part=\"value-label\" ?hidden=${valueLabelHidden}>\n <slot name=\"value-label\"></slot>\n </label>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-rating': IgcRatingComponent;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { createAbortHandle } from '../common/abort-handler.js';
2
- import { findElementFromEventPath } from '../common/util.js';
2
+ import { getElementFromPath } from '../common/util.js';
3
3
  import { createDefaultGhostElement, getDefaultLayer } from './default-ghost.js';
4
4
  const additionalEvents = [
5
5
  'pointermove',
@@ -134,7 +134,7 @@ class ResizeController {
134
134
  _setActiveRef(event) {
135
135
  const refs = this._options.ref?.map(({ value }) => value) ?? [this._host];
136
136
  this._activeRef =
137
- findElementFromEventPath((e) => refs.includes(e), event) ?? null;
137
+ getElementFromPath((e) => refs.includes(e), event) ?? null;
138
138
  }
139
139
  _setResizeState(enabled = true) {
140
140
  this._hasPointerCapture = enabled;