igniteui-webcomponents 6.1.2 → 6.2.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 (225) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +1 -1
  3. package/README.md +13 -1
  4. package/components/card/themes/content.js +7 -0
  5. package/components/card/themes/content.js.map +1 -1
  6. package/components/card/themes/shared/content/card.content.indigo.css.d.ts +1 -0
  7. package/components/card/themes/shared/content/card.content.indigo.css.js +3 -0
  8. package/components/card/themes/shared/content/card.content.indigo.css.js.map +1 -0
  9. package/components/carousel/carousel-indicator.d.ts +1 -1
  10. package/components/carousel/carousel-indicator.js.map +1 -1
  11. package/components/carousel/carousel-slide.d.ts +3 -3
  12. package/components/carousel/carousel-slide.js +7 -13
  13. package/components/carousel/carousel-slide.js.map +1 -1
  14. package/components/carousel/carousel.d.ts +39 -38
  15. package/components/carousel/carousel.js +160 -153
  16. package/components/carousel/carousel.js.map +1 -1
  17. package/components/checkbox/checkbox-base.d.ts +3 -5
  18. package/components/checkbox/checkbox-base.js +15 -21
  19. package/components/checkbox/checkbox-base.js.map +1 -1
  20. package/components/checkbox/checkbox.d.ts +3 -4
  21. package/components/checkbox/checkbox.js +18 -17
  22. package/components/checkbox/checkbox.js.map +1 -1
  23. package/components/checkbox/switch.d.ts +0 -1
  24. package/components/checkbox/switch.js +7 -10
  25. package/components/checkbox/switch.js.map +1 -1
  26. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js +1 -1
  27. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js.map +1 -1
  28. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js +1 -1
  29. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js.map +1 -1
  30. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
  31. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
  32. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js +1 -1
  33. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js.map +1 -1
  34. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
  35. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
  36. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js +1 -1
  37. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js.map +1 -1
  38. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js +1 -1
  39. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js.map +1 -1
  40. package/components/chip/chip.d.ts +11 -11
  41. package/components/chip/chip.js +61 -65
  42. package/components/chip/chip.js.map +1 -1
  43. package/components/combo/combo.d.ts +3 -3
  44. package/components/combo/combo.js +12 -6
  45. package/components/combo/combo.js.map +1 -1
  46. package/components/combo/themes/shared/combo.common.css.js +1 -1
  47. package/components/combo/themes/shared/combo.common.css.js.map +1 -1
  48. package/components/combo/themes/shared/combo.indigo.css.js +1 -1
  49. package/components/combo/themes/shared/combo.indigo.css.js.map +1 -1
  50. package/components/combo/themes/shared/combo.material.css.js +1 -1
  51. package/components/combo/themes/shared/combo.material.css.js.map +1 -1
  52. package/components/common/controllers/internals.d.ts +66 -2
  53. package/components/common/controllers/internals.js +21 -0
  54. package/components/common/controllers/internals.js.map +1 -1
  55. package/components/common/controllers/slot.d.ts +87 -0
  56. package/components/common/controllers/slot.js +75 -0
  57. package/components/common/controllers/slot.js.map +1 -0
  58. package/components/common/mixins/forms/associated.d.ts +1 -1
  59. package/components/common/mixins/forms/associated.js +91 -36
  60. package/components/common/mixins/forms/associated.js.map +1 -1
  61. package/components/common/mixins/forms/form-transformers.d.ts +21 -0
  62. package/components/common/mixins/forms/form-transformers.js +64 -0
  63. package/components/common/mixins/forms/form-transformers.js.map +1 -0
  64. package/components/common/mixins/forms/form-value.d.ts +7 -36
  65. package/components/common/mixins/forms/form-value.js +2 -64
  66. package/components/common/mixins/forms/form-value.js.map +1 -1
  67. package/components/common/mixins/forms/types.d.ts +19 -10
  68. package/components/common/mixins/forms/types.js +2 -1
  69. package/components/common/mixins/forms/types.js.map +1 -1
  70. package/components/common/util.d.ts +1 -0
  71. package/components/common/util.js +3 -0
  72. package/components/common/util.js.map +1 -1
  73. package/components/date-picker/date-picker.d.ts +1 -3
  74. package/components/date-picker/date-picker.js +11 -13
  75. package/components/date-picker/date-picker.js.map +1 -1
  76. package/components/date-picker/themes/dark/date-picker.indigo.css.js +1 -1
  77. package/components/date-picker/themes/dark/date-picker.indigo.css.js.map +1 -1
  78. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js +1 -1
  79. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js.map +1 -1
  80. package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
  81. package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
  82. package/components/date-picker/themes/shared/date-picker.fluent.css.js +1 -1
  83. package/components/date-picker/themes/shared/date-picker.fluent.css.js.map +1 -1
  84. package/components/date-picker/themes/shared/date-picker.indigo.css.js +1 -1
  85. package/components/date-picker/themes/shared/date-picker.indigo.css.js.map +1 -1
  86. package/components/date-picker/themes/shared/date-picker.material.css.js +1 -1
  87. package/components/date-picker/themes/shared/date-picker.material.css.js.map +1 -1
  88. package/components/date-range-picker/date-range-picker.d.ts +1 -3
  89. package/components/date-range-picker/date-range-picker.js +19 -26
  90. package/components/date-range-picker/date-range-picker.js.map +1 -1
  91. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js +1 -1
  92. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js.map +1 -1
  93. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +1 -1
  94. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -1
  95. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +1 -1
  96. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -1
  97. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js +1 -1
  98. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js.map +1 -1
  99. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js +1 -1
  100. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js.map +1 -1
  101. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js +1 -1
  102. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js.map +1 -1
  103. package/components/date-time-input/date-time-input.d.ts +1 -2
  104. package/components/date-time-input/date-time-input.js +7 -7
  105. package/components/date-time-input/date-time-input.js.map +1 -1
  106. package/components/dialog/dialog.d.ts +23 -25
  107. package/components/dialog/dialog.js +108 -115
  108. package/components/dialog/dialog.js.map +1 -1
  109. package/components/dialog/themes/dark/dialog.bootstrap.css.js +1 -1
  110. package/components/dialog/themes/dark/dialog.bootstrap.css.js.map +1 -1
  111. package/components/expansion-panel/expansion-panel.d.ts +12 -14
  112. package/components/expansion-panel/expansion-panel.js +43 -56
  113. package/components/expansion-panel/expansion-panel.js.map +1 -1
  114. package/components/file-input/file-input.d.ts +1 -3
  115. package/components/file-input/file-input.js +6 -11
  116. package/components/file-input/file-input.js.map +1 -1
  117. package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
  118. package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
  119. package/components/file-input/themes/shared/file-input.material.css.js +1 -1
  120. package/components/file-input/themes/shared/file-input.material.css.js.map +1 -1
  121. package/components/input/input.d.ts +1 -4
  122. package/components/input/input.js +7 -12
  123. package/components/input/input.js.map +1 -1
  124. package/components/input/themes/shared/input.bootstrap.css.js +1 -1
  125. package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
  126. package/components/input/themes/shared/input.common.css.js +1 -1
  127. package/components/input/themes/shared/input.common.css.js.map +1 -1
  128. package/components/input/themes/shared/input.fluent.css.js +1 -1
  129. package/components/input/themes/shared/input.fluent.css.js.map +1 -1
  130. package/components/input/themes/shared/input.indigo.css.js +1 -1
  131. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  132. package/components/input/themes/shared/input.material.css.js +1 -1
  133. package/components/input/themes/shared/input.material.css.js.map +1 -1
  134. package/components/mask-input/mask-input-base.js +1 -0
  135. package/components/mask-input/mask-input-base.js.map +1 -1
  136. package/components/mask-input/mask-input.d.ts +2 -3
  137. package/components/mask-input/mask-input.js +5 -8
  138. package/components/mask-input/mask-input.js.map +1 -1
  139. package/components/nav-drawer/nav-drawer-item.d.ts +3 -4
  140. package/components/nav-drawer/nav-drawer-item.js +15 -18
  141. package/components/nav-drawer/nav-drawer-item.js.map +1 -1
  142. package/components/nav-drawer/nav-drawer.d.ts +1 -2
  143. package/components/nav-drawer/nav-drawer.js +9 -11
  144. package/components/nav-drawer/nav-drawer.js.map +1 -1
  145. package/components/nav-drawer/themes/container.base.css.js +1 -1
  146. package/components/nav-drawer/themes/container.base.css.js.map +1 -1
  147. package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js +1 -1
  148. package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js.map +1 -1
  149. package/components/popover/popover.d.ts +17 -16
  150. package/components/popover/popover.js +81 -91
  151. package/components/popover/popover.js.map +1 -1
  152. package/components/progress/base.d.ts +8 -8
  153. package/components/progress/base.js +19 -23
  154. package/components/progress/base.js.map +1 -1
  155. package/components/progress/circular-gradient.js.map +1 -1
  156. package/components/progress/circular-progress.d.ts +3 -4
  157. package/components/progress/circular-progress.js +15 -18
  158. package/components/progress/circular-progress.js.map +1 -1
  159. package/components/progress/linear-progress.d.ts +1 -0
  160. package/components/progress/linear-progress.js +5 -1
  161. package/components/progress/linear-progress.js.map +1 -1
  162. package/components/radio/radio.d.ts +3 -5
  163. package/components/radio/radio.js +33 -31
  164. package/components/radio/radio.js.map +1 -1
  165. package/components/radio/themes/dark/radio.fluent.css.js +1 -1
  166. package/components/radio/themes/dark/radio.fluent.css.js.map +1 -1
  167. package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
  168. package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
  169. package/components/radio/themes/shared/radio.common.css.js +1 -1
  170. package/components/radio/themes/shared/radio.common.css.js.map +1 -1
  171. package/components/radio/themes/shared/radio.fluent.css.js +1 -1
  172. package/components/radio/themes/shared/radio.fluent.css.js.map +1 -1
  173. package/components/radio/themes/shared/radio.indigo.css.js +1 -1
  174. package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
  175. package/components/radio/themes/shared/radio.material.css.js +1 -1
  176. package/components/radio/themes/shared/radio.material.css.js.map +1 -1
  177. package/components/radio-group/radio-group.d.ts +4 -4
  178. package/components/radio-group/radio-group.js +24 -21
  179. package/components/radio-group/radio-group.js.map +1 -1
  180. package/components/rating/rating.d.ts +1 -2
  181. package/components/rating/rating.js +4 -3
  182. package/components/rating/rating.js.map +1 -1
  183. package/components/select/select.d.ts +35 -38
  184. package/components/select/select.js +138 -146
  185. package/components/select/select.js.map +1 -1
  186. package/components/select/themes/shared/select.bootstrap.css.js +1 -1
  187. package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
  188. package/components/select/themes/shared/select.common.css.js +1 -1
  189. package/components/select/themes/shared/select.common.css.js.map +1 -1
  190. package/components/select/themes/shared/select.fluent.css.js +1 -1
  191. package/components/select/themes/shared/select.fluent.css.js.map +1 -1
  192. package/components/select/themes/shared/select.indigo.css.js +1 -1
  193. package/components/select/themes/shared/select.indigo.css.js.map +1 -1
  194. package/components/select/themes/shared/select.material.css.js +1 -1
  195. package/components/select/themes/shared/select.material.css.js.map +1 -1
  196. package/components/slider/slider-label.js.map +1 -1
  197. package/components/slider/slider.d.ts +1 -2
  198. package/components/slider/slider.js +5 -2
  199. package/components/slider/slider.js.map +1 -1
  200. package/components/textarea/textarea.d.ts +13 -20
  201. package/components/textarea/textarea.js +66 -90
  202. package/components/textarea/textarea.js.map +1 -1
  203. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  204. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  205. package/components/textarea/themes/shared/textarea.common.css.js +1 -1
  206. package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
  207. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  208. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  209. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  210. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  211. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  212. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  213. package/components/tile-manager/position.js +2 -1
  214. package/components/tile-manager/position.js.map +1 -1
  215. package/components/tile-manager/tile.d.ts +8 -12
  216. package/components/tile-manager/tile.js +16 -37
  217. package/components/tile-manager/tile.js.map +1 -1
  218. package/components/validation-container/validation-container.d.ts +2 -1
  219. package/components/validation-container/validation-container.js +19 -14
  220. package/components/validation-container/validation-container.js.map +1 -1
  221. package/custom-elements.json +9346 -6470
  222. package/igniteui-webcomponents.css-data.json +1 -1
  223. package/igniteui-webcomponents.html-data.json +1 -1
  224. package/package.json +1 -1
  225. package/web-types.json +2 -2
@@ -6,9 +6,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { html, LitElement, nothing } from 'lit';
8
8
  import { property, state } from 'lit/decorators.js';
9
+ import { cache } from 'lit/directives/cache.js';
9
10
  import { ifDefined } from 'lit/directives/if-defined.js';
10
11
  import { addThemingController } from '../../theming/theming-controller.js';
12
+ import { createAbortHandle } from '../common/abort-handler.js';
11
13
  import { registerComponent } from '../common/definitions/register.js';
14
+ import { InternalInvalidEvent, InternalResetEvent, } from '../common/mixins/forms/types.js';
12
15
  import { partMap } from '../common/part-map.js';
13
16
  import { isEmpty, toKebabCase } from '../common/util.js';
14
17
  import IgcIconComponent from '../icon/icon.js';
@@ -17,22 +20,22 @@ import { all } from './themes/themes.js';
17
20
  import { styles } from './themes/validator.base.css.js';
18
21
  const VALIDATION_SLOTS_SELECTOR = 'slot:not([name="helper-text"])';
19
22
  const ALL_SLOTS_SELECTOR = 'slot';
23
+ const QUERY_CONFIG = { flatten: true };
20
24
  function getValidationSlots(element) {
21
25
  return element.renderRoot.querySelectorAll(VALIDATION_SLOTS_SELECTOR);
22
26
  }
23
27
  function hasProjection(element) {
24
28
  const allSlots = element.renderRoot.querySelectorAll(ALL_SLOTS_SELECTOR);
25
- return Array.from(allSlots).every((slot) => isEmpty(slot.assignedElements({ flatten: true })));
29
+ return Array.from(allSlots).every((slot) => isEmpty(slot.assignedElements(QUERY_CONFIG)));
26
30
  }
27
31
  function hasProjectedValidation(element, slotName) {
28
32
  const slots = Array.from(getValidationSlots(element));
29
- const config = { flatten: true };
30
33
  if (slotName) {
31
34
  return slots
32
35
  .filter((slot) => slot.name === slotName)
33
- .some((slot) => !isEmpty(slot.assignedElements(config)));
36
+ .some((slot) => !isEmpty(slot.assignedElements(QUERY_CONFIG)));
34
37
  }
35
- return slots.some((slot) => !isEmpty(slot.assignedElements(config)));
38
+ return slots.some((slot) => !isEmpty(slot.assignedElements(QUERY_CONFIG)));
36
39
  }
37
40
  class IgcValidationContainerComponent extends LitElement {
38
41
  static register() {
@@ -53,7 +56,7 @@ class IgcValidationContainerComponent extends LitElement {
53
56
  slot=${ifDefined(config.slot)}
54
57
  ?invalid=${host.invalid}
55
58
  .target=${host}
56
- exportparts="helper-text validation-message validation-icon"
59
+ exportparts="helper-text, validation-message, validation-icon"
57
60
  >
58
61
  ${helperText}${validationSlots}
59
62
  </igc-validator>
@@ -63,15 +66,18 @@ class IgcValidationContainerComponent extends LitElement {
63
66
  if (this._target === value) {
64
67
  return;
65
68
  }
66
- this._target?.removeEventListener('invalid', this);
69
+ this._abortHandle.abort();
70
+ const { signal } = this._abortHandle;
67
71
  this._target = value;
68
- this._target.addEventListener('invalid', this);
72
+ this._target.addEventListener(InternalInvalidEvent, this, { signal });
73
+ this._target.addEventListener(InternalResetEvent, this, { signal });
69
74
  }
70
75
  get target() {
71
76
  return this._target;
72
77
  }
73
78
  constructor() {
74
79
  super();
80
+ this._abortHandle = createAbortHandle();
75
81
  this._hasSlottedContent = false;
76
82
  this.invalid = false;
77
83
  addThemingController(this, all);
@@ -83,10 +89,11 @@ class IgcValidationContainerComponent extends LitElement {
83
89
  }
84
90
  handleEvent(event) {
85
91
  switch (event.type) {
86
- case 'invalid':
87
- if (!this.invalid) {
88
- this.invalid = true;
89
- }
92
+ case InternalInvalidEvent:
93
+ this.invalid = true;
94
+ break;
95
+ case InternalResetEvent:
96
+ this.invalid = false;
90
97
  break;
91
98
  case 'slotchange': {
92
99
  const newHasSlottedContent = hasProjectedValidation(this);
@@ -138,9 +145,7 @@ class IgcValidationContainerComponent extends LitElement {
138
145
  : html `<slot name="helper-text"></slot>`;
139
146
  }
140
147
  render() {
141
- const slots = this.invalid
142
- ? this._renderValidationSlots(this.target.validity)
143
- : nothing;
148
+ const slots = cache(this.invalid ? this._renderValidationSlots(this.target.validity) : nothing);
144
149
  return html `
145
150
  <div part=${partMap({ 'helper-text': true, empty: hasProjection(this) })}>
146
151
  ${slots}${this._renderHelper()}
@@ -1 +1 @@
1
- {"version":3,"file":"validation-container.js","sourceRoot":"","sources":["../../../src/components/validation-container/validation-container.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport type { IgcFormControl } from '../common/mixins/forms/types.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty, toKebabCase } from '../common/util.js';\nimport IgcIconComponent from '../icon/icon.js';\nimport { styles as shared } from './themes/shared/validator.common.css.js';\nimport { all } from './themes/themes.js';\nimport { styles } from './themes/validator.base.css.js';\n\n/** Configuration for the validation container. */\ninterface ValidationContainerConfig {\n /** The id attribute for the validation container. */\n id?: string;\n /** Project the validation container to the given slot inside the host shadow DOM. */\n slot?: string;\n /** Additional part(s) that should be bound to the validation container. */\n part?: string;\n /** Whether the validation container should expose a helper-text slot. */\n hasHelperText?: boolean;\n}\n\nconst VALIDATION_SLOTS_SELECTOR = 'slot:not([name=\"helper-text\"])';\nconst ALL_SLOTS_SELECTOR = 'slot';\n\nfunction getValidationSlots(\n element: IgcValidationContainerComponent\n): NodeListOf<HTMLSlotElement> {\n return element.renderRoot.querySelectorAll<HTMLSlotElement>(\n VALIDATION_SLOTS_SELECTOR\n );\n}\n\nfunction hasProjection(element: IgcValidationContainerComponent): boolean {\n const allSlots =\n element.renderRoot.querySelectorAll<HTMLSlotElement>(ALL_SLOTS_SELECTOR);\n return Array.from(allSlots).every((slot) =>\n isEmpty(slot.assignedElements({ flatten: true }))\n );\n}\n\nfunction hasProjectedValidation(\n element: IgcValidationContainerComponent,\n slotName?: string\n): boolean {\n const slots = Array.from(getValidationSlots(element));\n const config: AssignedNodesOptions = { flatten: true };\n\n if (slotName) {\n return slots\n .filter((slot) => slot.name === slotName)\n .some((slot) => !isEmpty(slot.assignedElements(config)));\n }\n\n return slots.some((slot) => !isEmpty(slot.assignedElements(config)));\n}\n\n/* blazorSuppress */\n/**\n * @element igc-validator\n *\n * @csspart helper-text - The base wrapper\n * @csspart validation-message - The validation error message container\n * @csspart validation-icon - The validation error icon\n */\nexport default class IgcValidationContainerComponent extends LitElement {\n public static readonly tagName = 'igc-validator';\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcValidationContainerComponent, IgcIconComponent);\n }\n\n public static create(\n host: IgcFormControl,\n config: ValidationContainerConfig = {\n id: 'helper-text',\n hasHelperText: true,\n }\n ): TemplateResult {\n const helperText = config.hasHelperText\n ? html`<slot name=\"helper-text\" slot=\"helper-text\"></slot>`\n : nothing;\n\n const validationSlots =\n IgcValidationContainerComponent.prototype._renderValidationSlots(\n host.validity,\n true\n );\n\n return html`\n <igc-validator\n id=${ifDefined(config.id)}\n part=${ifDefined(config.part)}\n slot=${ifDefined(config.slot)}\n ?invalid=${host.invalid}\n .target=${host}\n exportparts=\"helper-text validation-message validation-icon\"\n >\n ${helperText}${validationSlots}\n </igc-validator>\n `;\n }\n\n private _target!: IgcFormControl;\n\n @state()\n private _hasSlottedContent = false;\n\n @property({ type: Boolean })\n public invalid = false;\n\n @property({ attribute: false })\n public set target(value: IgcFormControl) {\n if (this._target === value) {\n return;\n }\n\n this._target?.removeEventListener('invalid', this);\n this._target = value;\n this._target.addEventListener('invalid', this);\n }\n\n public get target(): IgcFormControl {\n return this._target;\n }\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n protected override createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n root.addEventListener('slotchange', this);\n return root;\n }\n\n /** @internal */\n public handleEvent(event: Event): void {\n switch (event.type) {\n case 'invalid':\n if (!this.invalid) {\n this.invalid = true;\n }\n break;\n case 'slotchange': {\n const newHasSlottedContent = hasProjectedValidation(this);\n if (this._hasSlottedContent !== newHasSlottedContent) {\n this._hasSlottedContent = newHasSlottedContent;\n }\n break;\n }\n }\n\n this.requestUpdate();\n }\n\n protected _renderValidationMessage(slotName: string): TemplateResult {\n const hasProjectedIcon = hasProjectedValidation(this, slotName);\n const parts = { 'validation-message': true, empty: !hasProjectedIcon };\n const icon = hasProjectedIcon\n ? html`\n <igc-icon\n aria-hidden=\"true\"\n name=\"error\"\n part=\"validation-icon\"\n ></igc-icon>\n `\n : nothing;\n\n return html`\n <div part=${partMap(parts)}>\n ${icon}\n <slot name=${slotName}></slot>\n </div>\n `;\n }\n\n protected *_renderValidationSlots(\n validity: ValidityState,\n projected = false\n ): Generator<TemplateResult> {\n if (!validity.valid) {\n yield projected\n ? html`<slot name=\"invalid\" slot=\"invalid\"></slot>`\n : this._renderValidationMessage('invalid');\n }\n\n for (const key in validity) {\n if (key !== 'valid' && validity[key as keyof ValidityState]) {\n const name = toKebabCase(key);\n yield projected\n ? html`<slot name=${name} slot=${name}></slot>`\n : this._renderValidationMessage(name);\n }\n }\n }\n\n protected _renderHelper(): TemplateResult | typeof nothing {\n return this.invalid && this._hasSlottedContent\n ? nothing\n : html`<slot name=\"helper-text\"></slot>`;\n }\n\n protected override render(): TemplateResult {\n const slots = this.invalid\n ? this._renderValidationSlots(this.target.validity)\n : nothing;\n\n return html`\n <div part=${partMap({ 'helper-text': true, empty: hasProjection(this) })}>\n ${slots}${this._renderHelper()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-validator': IgcValidationContainerComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"validation-container.js","sourceRoot":"","sources":["../../../src/components/validation-container/validation-container.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport { createAbortHandle } from '../common/abort-handler.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n type IgcFormControl,\n InternalInvalidEvent,\n InternalResetEvent,\n} from '../common/mixins/forms/types.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty, toKebabCase } from '../common/util.js';\nimport IgcIconComponent from '../icon/icon.js';\nimport { styles as shared } from './themes/shared/validator.common.css.js';\nimport { all } from './themes/themes.js';\nimport { styles } from './themes/validator.base.css.js';\n\n/** Configuration for the validation container. */\ninterface ValidationContainerConfig {\n /** The id attribute for the validation container. */\n id?: string;\n /** Project the validation container to the given slot inside the host shadow DOM. */\n slot?: string;\n /** Additional part(s) that should be bound to the validation container. */\n part?: string;\n /** Whether the validation container should expose a helper-text slot. */\n hasHelperText?: boolean;\n}\n\nconst VALIDATION_SLOTS_SELECTOR = 'slot:not([name=\"helper-text\"])';\nconst ALL_SLOTS_SELECTOR = 'slot';\nconst QUERY_CONFIG: AssignedNodesOptions = { flatten: true };\n\nfunction getValidationSlots(\n element: IgcValidationContainerComponent\n): NodeListOf<HTMLSlotElement> {\n return element.renderRoot.querySelectorAll<HTMLSlotElement>(\n VALIDATION_SLOTS_SELECTOR\n );\n}\n\nfunction hasProjection(element: IgcValidationContainerComponent): boolean {\n const allSlots =\n element.renderRoot.querySelectorAll<HTMLSlotElement>(ALL_SLOTS_SELECTOR);\n return Array.from(allSlots).every((slot) =>\n isEmpty(slot.assignedElements(QUERY_CONFIG))\n );\n}\n\nfunction hasProjectedValidation(\n element: IgcValidationContainerComponent,\n slotName?: string\n): boolean {\n const slots = Array.from(getValidationSlots(element));\n\n if (slotName) {\n return slots\n .filter((slot) => slot.name === slotName)\n .some((slot) => !isEmpty(slot.assignedElements(QUERY_CONFIG)));\n }\n\n return slots.some((slot) => !isEmpty(slot.assignedElements(QUERY_CONFIG)));\n}\n\n/* blazorSuppress */\n/**\n * @element igc-validator\n *\n * @csspart helper-text - The base wrapper\n * @csspart validation-message - The validation error message container\n * @csspart validation-icon - The validation error icon\n */\nexport default class IgcValidationContainerComponent extends LitElement {\n public static readonly tagName = 'igc-validator';\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(IgcValidationContainerComponent, IgcIconComponent);\n }\n\n public static create(\n host: IgcFormControl,\n config: ValidationContainerConfig = {\n id: 'helper-text',\n hasHelperText: true,\n }\n ): TemplateResult {\n const helperText = config.hasHelperText\n ? html`<slot name=\"helper-text\" slot=\"helper-text\"></slot>`\n : nothing;\n\n const validationSlots =\n IgcValidationContainerComponent.prototype._renderValidationSlots(\n host.validity,\n true\n );\n\n return html`\n <igc-validator\n id=${ifDefined(config.id)}\n part=${ifDefined(config.part)}\n slot=${ifDefined(config.slot)}\n ?invalid=${host.invalid}\n .target=${host}\n exportparts=\"helper-text, validation-message, validation-icon\"\n >\n ${helperText}${validationSlots}\n </igc-validator>\n `;\n }\n\n private readonly _abortHandle = createAbortHandle();\n\n private _target!: IgcFormControl;\n\n @state()\n private _hasSlottedContent = false;\n\n @property({ type: Boolean })\n public invalid = false;\n\n @property({ attribute: false })\n public set target(value: IgcFormControl) {\n if (this._target === value) {\n return;\n }\n\n this._abortHandle.abort();\n const { signal } = this._abortHandle;\n\n this._target = value;\n this._target.addEventListener(InternalInvalidEvent, this, { signal });\n this._target.addEventListener(InternalResetEvent, this, { signal });\n }\n\n public get target(): IgcFormControl {\n return this._target;\n }\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n protected override createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n root.addEventListener('slotchange', this);\n return root;\n }\n\n /** @internal */\n public handleEvent(event: Event): void {\n switch (event.type) {\n case InternalInvalidEvent:\n this.invalid = true;\n break;\n case InternalResetEvent:\n this.invalid = false;\n break;\n case 'slotchange': {\n const newHasSlottedContent = hasProjectedValidation(this);\n if (this._hasSlottedContent !== newHasSlottedContent) {\n this._hasSlottedContent = newHasSlottedContent;\n }\n break;\n }\n }\n\n this.requestUpdate();\n }\n\n protected _renderValidationMessage(slotName: string): TemplateResult {\n const hasProjectedIcon = hasProjectedValidation(this, slotName);\n const parts = { 'validation-message': true, empty: !hasProjectedIcon };\n const icon = hasProjectedIcon\n ? html`\n <igc-icon\n aria-hidden=\"true\"\n name=\"error\"\n part=\"validation-icon\"\n ></igc-icon>\n `\n : nothing;\n\n return html`\n <div part=${partMap(parts)}>\n ${icon}\n <slot name=${slotName}></slot>\n </div>\n `;\n }\n\n protected *_renderValidationSlots(\n validity: ValidityState,\n projected = false\n ): Generator<TemplateResult> {\n if (!validity.valid) {\n yield projected\n ? html`<slot name=\"invalid\" slot=\"invalid\"></slot>`\n : this._renderValidationMessage('invalid');\n }\n\n for (const key in validity) {\n if (key !== 'valid' && validity[key as keyof ValidityState]) {\n const name = toKebabCase(key);\n yield projected\n ? html`<slot name=${name} slot=${name}></slot>`\n : this._renderValidationMessage(name);\n }\n }\n }\n\n protected _renderHelper(): TemplateResult | typeof nothing {\n return this.invalid && this._hasSlottedContent\n ? nothing\n : html`<slot name=\"helper-text\"></slot>`;\n }\n\n protected override render(): TemplateResult {\n const slots = cache(\n this.invalid ? this._renderValidationSlots(this.target.validity) : nothing\n );\n\n return html`\n <div part=${partMap({ 'helper-text': true, empty: hasProjection(this) })}>\n ${slots}${this._renderHelper()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-validator': IgcValidationContainerComponent;\n }\n}\n"]}