@vaadin/field-base 24.0.0-alpha1 → 24.0.0-alpha10

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 (55) hide show
  1. package/index.d.ts +0 -3
  2. package/index.js +0 -3
  3. package/package.json +3 -3
  4. package/src/checked-mixin.d.ts +2 -2
  5. package/src/checked-mixin.js +2 -2
  6. package/src/error-controller.d.ts +3 -8
  7. package/src/error-controller.js +54 -66
  8. package/src/field-aria-controller.d.ts +1 -1
  9. package/src/field-aria-controller.js +11 -11
  10. package/src/field-mixin.d.ts +1 -1
  11. package/src/field-mixin.js +24 -28
  12. package/src/helper-controller.d.ts +3 -5
  13. package/src/helper-controller.js +47 -147
  14. package/src/input-constraints-mixin.d.ts +2 -4
  15. package/src/input-constraints-mixin.js +2 -2
  16. package/src/input-control-mixin.d.ts +3 -3
  17. package/src/input-control-mixin.js +4 -4
  18. package/src/input-controller.d.ts +1 -1
  19. package/src/input-controller.js +5 -8
  20. package/src/input-field-mixin.d.ts +3 -3
  21. package/src/input-field-mixin.js +11 -10
  22. package/src/input-mixin.d.ts +3 -1
  23. package/src/input-mixin.js +26 -10
  24. package/src/label-controller.d.ts +3 -8
  25. package/src/label-controller.js +45 -149
  26. package/src/label-mixin.d.ts +1 -1
  27. package/src/label-mixin.js +14 -9
  28. package/src/labelled-input-controller.d.ts +1 -1
  29. package/src/labelled-input-controller.js +2 -2
  30. package/src/pattern-mixin.d.ts +3 -13
  31. package/src/pattern-mixin.js +2 -50
  32. package/src/slot-styles-mixin.d.ts +1 -1
  33. package/src/slot-styles-mixin.js +1 -1
  34. package/src/styles/clear-button-styles.d.ts +1 -1
  35. package/src/styles/clear-button-styles.js +1 -1
  36. package/src/styles/field-shared-styles.d.ts +1 -1
  37. package/src/styles/field-shared-styles.js +1 -1
  38. package/src/styles/input-field-container-styles.d.ts +1 -1
  39. package/src/styles/input-field-container-styles.js +1 -1
  40. package/src/styles/input-field-shared-styles.d.ts +1 -1
  41. package/src/styles/input-field-shared-styles.js +1 -1
  42. package/src/text-area-controller.d.ts +1 -1
  43. package/src/text-area-controller.js +5 -8
  44. package/src/validate-mixin.d.ts +1 -1
  45. package/src/validate-mixin.js +1 -1
  46. package/src/virtual-keyboard-controller.d.ts +1 -1
  47. package/src/virtual-keyboard-controller.js +1 -1
  48. package/src/delegate-focus-mixin.d.ts +0 -48
  49. package/src/delegate-focus-mixin.js +0 -228
  50. package/src/delegate-state-mixin.d.ts +0 -20
  51. package/src/delegate-state-mixin.js +0 -125
  52. package/src/shadow-focus-mixin.d.ts +0 -23
  53. package/src/shadow-focus-mixin.js +0 -97
  54. package/src/slot-target-controller.d.ts +0 -31
  55. package/src/slot-target-controller.js +0 -123
@@ -1,189 +1,89 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
6
+ import { SlotChildObserveController } from '@vaadin/component-base/src/slot-child-observe-controller.js';
7
7
 
8
8
  /**
9
9
  * A controller that manages the helper node content.
10
10
  */
11
- export class HelperController extends SlotController {
11
+ export class HelperController extends SlotChildObserveController {
12
12
  constructor(host) {
13
- // Do not provide slot factory, as only create helper lazily.
14
- super(host, 'helper', null, null, true);
15
- }
16
-
17
- get helperId() {
18
- return this.node && this.node.id;
19
- }
20
-
21
- /**
22
- * Override to initialize the newly added custom helper.
23
- *
24
- * @param {Node} helperNode
25
- * @protected
26
- * @override
27
- */
28
- initCustomNode(helperNode) {
29
- this.__updateHelperId(helperNode);
30
-
31
- this.__observeHelper(helperNode);
32
-
33
- const hasHelper = this.__hasHelper(helperNode);
34
- this.__toggleHasHelper(hasHelper);
35
- }
36
-
37
- /**
38
- * Override to cleanup helper node when it's removed.
39
- *
40
- * @param {Node} _node
41
- * @protected
42
- * @override
43
- */
44
- teardownNode(_node) {
45
- // The observer does not exist when the default helper is removed.
46
- if (this.__helperIdObserver) {
47
- this.__helperIdObserver.disconnect();
48
- }
49
-
50
- const helperNode = this.getSlotChild();
51
-
52
- // Custom node is added to helper slot
53
- if (helperNode && helperNode !== this.defaultNode) {
54
- const hasHelper = this.__hasHelper(helperNode);
55
- this.__toggleHasHelper(hasHelper);
56
- } else {
57
- // Restore default helper if needed
58
- this.__applyDefaultHelper(this.helperText, helperNode);
59
- }
13
+ // Do not provide tag name, as we create helper lazily.
14
+ super(host, 'helper', null);
60
15
  }
61
16
 
62
17
  /**
63
18
  * Set helper text based on corresponding host property.
19
+ *
64
20
  * @param {string} helperText
65
21
  */
66
22
  setHelperText(helperText) {
67
23
  this.helperText = helperText;
68
24
 
25
+ // Restore the default helper, if needed.
69
26
  const helperNode = this.getSlotChild();
70
- if (!helperNode || helperNode === this.defaultNode) {
71
- this.__applyDefaultHelper(helperText, helperNode);
72
- }
73
- }
74
-
75
- /**
76
- * @param {HTMLElement} helperNode
77
- * @return {boolean}
78
- * @private
79
- */
80
- __hasHelper(helperNode) {
81
27
  if (!helperNode) {
82
- return false;
28
+ this.restoreDefaultNode();
83
29
  }
84
30
 
85
- return (
86
- helperNode.children.length > 0 ||
87
- (helperNode.nodeType === Node.ELEMENT_NODE && customElements.get(helperNode.localName)) ||
88
- this.__isNotEmpty(helperNode.textContent)
89
- );
90
- }
91
-
92
- /**
93
- * @param {string} helperText
94
- * @private
95
- */
96
- __isNotEmpty(helperText) {
97
- return helperText && helperText.trim() !== '';
31
+ // When default helper is used, update it.
32
+ if (this.node === this.defaultNode) {
33
+ this.updateDefaultNode(this.node);
34
+ }
98
35
  }
99
36
 
100
37
  /**
101
- * @param {string} helperText
102
- * @param {Node} helperNode
103
- * @private
38
+ * Override method inherited from `SlotChildObserveController`
39
+ * to create the default helper element lazily as needed.
40
+ *
41
+ * @param {Node | undefined} node
42
+ * @protected
43
+ * @override
104
44
  */
105
- __applyDefaultHelper(helperText, helperNode) {
106
- const hasHelperText = this.__isNotEmpty(helperText);
45
+ restoreDefaultNode() {
46
+ const { helperText } = this;
107
47
 
108
- if (hasHelperText && !helperNode) {
109
- // Set slot factory lazily to only create helper node when needed.
110
- this.slotFactory = () => document.createElement('div');
48
+ // No helper yet, create one.
49
+ if (helperText && helperText.trim() !== '') {
50
+ this.tagName = 'div';
111
51
 
112
- helperNode = this.attachDefaultNode();
52
+ const helperNode = this.attachDefaultNode();
113
53
 
114
- this.__updateHelperId(helperNode);
115
- this.__observeHelper(helperNode);
54
+ // Observe the default node.
55
+ this.observeNode(helperNode);
116
56
  }
117
-
118
- if (helperNode) {
119
- helperNode.textContent = helperText;
120
- }
121
-
122
- this.__toggleHasHelper(hasHelperText);
123
57
  }
124
58
 
125
59
  /**
126
- * @param {HTMLElement} helperNode
127
- * @private
60
+ * Override method inherited from `SlotChildObserveController`
61
+ * to update the default helper element text content.
62
+ *
63
+ * @param {Node | undefined} node
64
+ * @protected
65
+ * @override
128
66
  */
129
- __observeHelper(helperNode) {
130
- this.__helperObserver = new MutationObserver((mutations) => {
131
- mutations.forEach((mutation) => {
132
- const target = mutation.target;
133
-
134
- // Ensure the mutation target is the currently connected helper
135
- // to ignore async mutations dispatched for removed element.
136
- const isHelperMutation = target === this.node;
137
-
138
- if (mutation.type === 'attributes') {
139
- // We use attributeFilter to only observe ID mutation,
140
- // no need to check for attribute name separately.
141
- if (isHelperMutation && target.id !== this.defaultId) {
142
- this.__updateHelperId(target);
143
- }
144
- } else if (isHelperMutation || target.parentElement === this.node) {
145
- // Update has-helper when textContent changes
146
- const hasHelper = this.__hasHelper(this.node);
147
- this.__toggleHasHelper(hasHelper);
148
- }
149
- });
150
- });
67
+ updateDefaultNode(node) {
68
+ if (node) {
69
+ node.textContent = this.helperText;
70
+ }
151
71
 
152
- // Observe changes to helper ID attribute, text content and children.
153
- this.__helperObserver.observe(helperNode, {
154
- attributes: true,
155
- attributeFilter: ['id'],
156
- childList: true,
157
- subtree: true,
158
- characterData: true,
159
- });
72
+ // Notify the host after update.
73
+ super.updateDefaultNode(node);
160
74
  }
161
75
 
162
76
  /**
163
- * @param {boolean} hasHelper
164
- * @private
77
+ * Override to observe the newly added custom node.
78
+ *
79
+ * @param {Node} node
80
+ * @protected
81
+ * @override
165
82
  */
166
- __toggleHasHelper(hasHelper) {
167
- this.host.toggleAttribute('has-helper', hasHelper);
168
-
169
- // Make it possible for other mixins to observe change
170
- this.dispatchEvent(
171
- new CustomEvent('helper-changed', {
172
- detail: {
173
- hasHelper,
174
- node: this.node,
175
- },
176
- }),
177
- );
178
- }
83
+ initCustomNode(node) {
84
+ // Notify the host about a custom slotted helper.
85
+ super.initCustomNode(node);
179
86
 
180
- /**
181
- * @param {HTMLElement} helperNode
182
- * @private
183
- */
184
- __updateHelperId(helperNode) {
185
- if (!helperNode.id) {
186
- helperNode.id = this.defaultId;
187
- }
87
+ this.observeNode(node);
188
88
  }
189
89
  }
@@ -1,11 +1,10 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
- import type { DisabledMixinClass } from '@vaadin/component-base/src/disabled-mixin.js';
8
- import type { DelegateStateMixinClass } from './delegate-state-mixin.js';
7
+ import type { DelegateStateMixinClass } from '@vaadin/component-base/src/delegate-state-mixin.js';
9
8
  import type { InputMixinClass } from './input-mixin.js';
10
9
  import type { ValidateMixinClass } from './validate-mixin.js';
11
10
 
@@ -15,7 +14,6 @@ import type { ValidateMixinClass } from './validate-mixin.js';
15
14
  export declare function InputConstraintsMixin<T extends Constructor<HTMLElement>>(
16
15
  base: T,
17
16
  ): Constructor<DelegateStateMixinClass> &
18
- Constructor<DisabledMixinClass> &
19
17
  Constructor<InputConstraintsMixinClass> &
20
18
  Constructor<InputMixinClass> &
21
19
  Constructor<ValidateMixinClass> &
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';
7
- import { DelegateStateMixin } from './delegate-state-mixin.js';
7
+ import { DelegateStateMixin } from '@vaadin/component-base/src/delegate-state-mixin.js';
8
8
  import { InputMixin } from './input-mixin.js';
9
9
  import { ValidateMixin } from './validate-mixin.js';
10
10
 
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
7
  import type { ControllerMixinClass } from '@vaadin/component-base/src/controller-mixin.js';
8
+ import type { DelegateFocusMixinClass } from '@vaadin/component-base/src/delegate-focus-mixin.js';
9
+ import type { DelegateStateMixinClass } from '@vaadin/component-base/src/delegate-state-mixin.js';
8
10
  import type { DisabledMixinClass } from '@vaadin/component-base/src/disabled-mixin.js';
9
11
  import type { FocusMixinClass } from '@vaadin/component-base/src/focus-mixin.js';
10
12
  import type { KeyboardMixinClass } from '@vaadin/component-base/src/keyboard-mixin.js';
11
- import type { DelegateFocusMixinClass } from './delegate-focus-mixin.js';
12
- import type { DelegateStateMixinClass } from './delegate-state-mixin.js';
13
13
  import type { FieldMixinClass } from './field-mixin.js';
14
14
  import type { InputConstraintsMixinClass } from './input-constraints-mixin.js';
15
15
  import type { InputMixinClass } from './input-mixin.js';
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { timeOut } from '@vaadin/component-base/src/async.js';
7
7
  import { Debouncer } from '@vaadin/component-base/src/debounce.js';
8
+ import { DelegateFocusMixin } from '@vaadin/component-base/src/delegate-focus-mixin.js';
8
9
  import { KeyboardMixin } from '@vaadin/component-base/src/keyboard-mixin.js';
9
- import { DelegateFocusMixin } from './delegate-focus-mixin.js';
10
10
  import { FieldMixin } from './field-mixin.js';
11
11
  import { InputConstraintsMixin } from './input-constraints-mixin.js';
12
12
  import { SlotStylesMixin } from './slot-styles-mixin.js';
@@ -315,8 +315,8 @@ export const InputControlMixin = (superclass) =>
315
315
  _allowedCharPatternChanged(charPattern) {
316
316
  if (charPattern) {
317
317
  try {
318
- this.__allowedCharRegExp = new RegExp(`^${charPattern}$`);
319
- this.__allowedTextRegExp = new RegExp(`^${charPattern}*$`);
318
+ this.__allowedCharRegExp = new RegExp(`^${charPattern}$`, 'u');
319
+ this.__allowedTextRegExp = new RegExp(`^${charPattern}*$`, 'u');
320
320
  } catch (e) {
321
321
  console.error(e);
322
322
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
@@ -10,11 +10,8 @@ import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
10
10
  */
11
11
  export class InputController extends SlotController {
12
12
  constructor(host, callback) {
13
- super(
14
- host,
15
- 'input',
16
- () => document.createElement('input'),
17
- (host, node) => {
13
+ super(host, 'input', 'input', {
14
+ initializer: (node, host) => {
18
15
  if (host.value) {
19
16
  node.setAttribute('value', host.value);
20
17
  }
@@ -29,7 +26,7 @@ export class InputController extends SlotController {
29
26
  callback(node);
30
27
  }
31
28
  },
32
- true,
33
- );
29
+ useUniqueId: true,
30
+ });
34
31
  }
35
32
  }
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
7
  import type { ControllerMixinClass } from '@vaadin/component-base/src/controller-mixin.js';
8
+ import type { DelegateFocusMixinClass } from '@vaadin/component-base/src/delegate-focus-mixin.js';
9
+ import type { DelegateStateMixinClass } from '@vaadin/component-base/src/delegate-state-mixin.js';
8
10
  import type { DisabledMixinClass } from '@vaadin/component-base/src/disabled-mixin.js';
9
11
  import type { FocusMixinClass } from '@vaadin/component-base/src/focus-mixin.js';
10
12
  import type { KeyboardMixinClass } from '@vaadin/component-base/src/keyboard-mixin.js';
11
- import type { DelegateFocusMixinClass } from './delegate-focus-mixin.js';
12
- import type { DelegateStateMixinClass } from './delegate-state-mixin.js';
13
13
  import type { FieldMixinClass } from './field-mixin.js';
14
14
  import type { InputConstraintsMixinClass } from './input-constraints-mixin.js';
15
15
  import type { InputControlMixinClass } from './input-control-mixin.js';
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { InputControlMixin } from './input-control-mixin.js';
@@ -46,6 +46,7 @@ export const InputFieldMixin = (superclass) =>
46
46
  */
47
47
  autocapitalize: {
48
48
  type: String,
49
+ reflectToAttribute: true,
49
50
  },
50
51
  };
51
52
  }
@@ -54,6 +55,15 @@ export const InputFieldMixin = (superclass) =>
54
55
  return [...super.delegateAttrs, 'autocapitalize', 'autocomplete', 'autocorrect'];
55
56
  }
56
57
 
58
+ // Workaround for https://github.com/Polymer/polymer/issues/5259
59
+ get __data() {
60
+ return this.__dataValue || {};
61
+ }
62
+
63
+ set __data(value) {
64
+ this.__dataValue = value;
65
+ }
66
+
57
67
  /**
58
68
  * @param {HTMLElement} input
59
69
  * @protected
@@ -75,15 +85,6 @@ export const InputFieldMixin = (superclass) =>
75
85
  }
76
86
  }
77
87
 
78
- // Workaround for https://github.com/Polymer/polymer/issues/5259
79
- get __data() {
80
- return this.__dataValue || {};
81
- }
82
-
83
- set __data(value) {
84
- this.__dataValue = value;
85
- }
86
-
87
88
  /**
88
89
  * Override an event listener from `FocusMixin`.
89
90
  * @param {boolean} focused
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
@@ -56,4 +56,6 @@ export declare class InputMixinClass {
56
56
  protected _toggleHasValue(hasValue: boolean): void;
57
57
 
58
58
  protected _valueChanged(value?: string, oldValue?: string): void;
59
+
60
+ protected _setHasInputValue(event: InputEvent): void;
59
61
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import { dedupingMixin } from '@polymer/polymer/lib/utils/mixin.js';
@@ -72,11 +72,27 @@ export const InputMixin = dedupingMixin(
72
72
  this._boundOnChange = this._onChange.bind(this);
73
73
  }
74
74
 
75
+ /**
76
+ * Indicates whether the value is different from the default one.
77
+ * Override if the `value` property has a type other than `string`.
78
+ *
79
+ * @protected
80
+ */
81
+ get _hasValue() {
82
+ return this.value != null && this.value !== '';
83
+ }
84
+
75
85
  /**
76
86
  * Clear the value of the field.
77
87
  */
78
88
  clear() {
79
89
  this.value = '';
90
+
91
+ // Clear the input immediately without waiting for the observer.
92
+ // Otherwise, when using Lit, the old value would be restored.
93
+ if (this.inputElement) {
94
+ this.inputElement.value = '';
95
+ }
80
96
  }
81
97
 
82
98
  /**
@@ -155,11 +171,7 @@ export const InputMixin = dedupingMixin(
155
171
  * @private
156
172
  */
157
173
  __onInput(event) {
158
- // In the case a custom web component is passed as `inputElement`,
159
- // the actual native input element, on which the event occurred,
160
- // can be inside shadow trees.
161
- const target = event.composedPath()[0];
162
- this._hasInputValue = target.value.length > 0;
174
+ this._setHasInputValue(event);
163
175
  this._onInput(event);
164
176
  }
165
177
 
@@ -222,13 +234,17 @@ export const InputMixin = dedupingMixin(
222
234
  }
223
235
 
224
236
  /**
225
- * Indicates whether the value is different from the default one.
226
- * Override if the `value` property has a type other than `string`.
237
+ * Sets the `_hasInputValue` property based on the `input` event.
227
238
  *
239
+ * @param {InputEvent} event
228
240
  * @protected
229
241
  */
230
- get _hasValue() {
231
- return this.value != null && this.value !== '';
242
+ _setHasInputValue(event) {
243
+ // In the case a custom web component is passed as `inputElement`,
244
+ // the actual native input element, on which the event occurred,
245
+ // can be inside shadow trees.
246
+ const target = event.composedPath()[0];
247
+ this._hasInputValue = target.value.length > 0;
232
248
  }
233
249
  },
234
250
  );
@@ -1,19 +1,14 @@
1
1
  /**
2
2
  * @license
3
- * Copyright (c) 2021 - 2022 Vaadin Ltd.
3
+ * Copyright (c) 2021 - 2023 Vaadin Ltd.
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
- import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
6
+ import { SlotChildObserveController } from '@vaadin/component-base/src/slot-child-observe-controller.js';
7
7
 
8
8
  /**
9
9
  * A controller to manage the label element.
10
10
  */
11
- export class LabelController extends SlotController {
12
- /**
13
- * ID attribute value set on the label element.
14
- */
15
- labelId: string;
16
-
11
+ export class LabelController extends SlotChildObserveController {
17
12
  /**
18
13
  * String used for the label.
19
14
  */