@aurodesignsystem-dev/auro-formkit 0.0.0-pr1611.0 → 0.0.0-pr1613.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.
- package/components/checkbox/demo/accessibility.md +15 -4
- package/components/checkbox/demo/api.md +4 -3
- package/components/checkbox/demo/customize.md +2 -1
- package/components/checkbox/demo/customize.min.js +100 -18
- package/components/checkbox/demo/getting-started.min.js +100 -18
- package/components/checkbox/demo/index.min.js +100 -18
- package/components/checkbox/dist/auro-checkbox-group.d.ts +24 -0
- package/components/checkbox/dist/index.js +100 -18
- package/components/checkbox/dist/registered.js +100 -18
- package/components/combobox/demo/customize.min.js +3 -3
- package/components/combobox/demo/getting-started.min.js +3 -3
- package/components/combobox/demo/index.min.js +3 -3
- package/components/combobox/dist/index.js +3 -3
- package/components/combobox/dist/registered.js +3 -3
- package/components/counter/demo/customize.min.js +2 -2
- package/components/counter/demo/getting-started.min.js +2 -2
- package/components/counter/demo/index.min.js +2 -2
- package/components/counter/dist/index.js +2 -2
- package/components/counter/dist/registered.js +2 -2
- package/components/datepicker/demo/customize.min.js +3 -3
- package/components/datepicker/demo/getting-started.min.js +3 -3
- package/components/datepicker/demo/index.min.js +3 -3
- package/components/datepicker/dist/index.js +3 -3
- package/components/datepicker/dist/registered.js +3 -3
- package/components/dropdown/demo/customize.min.js +1 -1
- package/components/dropdown/demo/getting-started.min.js +2 -2
- package/components/dropdown/demo/index.min.js +1 -1
- package/components/dropdown/dist/index.js +1 -1
- package/components/dropdown/dist/registered.js +1 -1
- package/components/form/demo/customize.min.js +208 -50
- package/components/form/demo/getting-started.min.js +208 -50
- package/components/form/demo/index.min.js +208 -50
- package/components/form/demo/registerDemoDeps.min.js +208 -50
- package/components/input/demo/customize.min.js +1 -1
- package/components/input/demo/getting-started.min.js +1 -1
- package/components/input/demo/index.min.js +1 -1
- package/components/input/dist/index.js +1 -1
- package/components/input/dist/registered.js +1 -1
- package/components/radio/demo/accessibility.md +15 -4
- package/components/radio/demo/customize.min.js +93 -17
- package/components/radio/demo/getting-started.min.js +93 -17
- package/components/radio/demo/index.min.js +93 -17
- package/components/radio/dist/auro-radio-group.d.ts +22 -0
- package/components/radio/dist/index.js +93 -17
- package/components/radio/dist/registered.js +93 -17
- package/components/select/demo/customize.min.js +2 -2
- package/components/select/demo/getting-started.min.js +2 -2
- package/components/select/demo/index.min.js +2 -2
- package/components/select/dist/index.js +2 -2
- package/components/select/dist/registered.js +2 -2
- package/custom-elements.json +1554 -1504
- package/package.json +1 -1
|
@@ -8,12 +8,13 @@ For keyboard interaction details, see the <auro-hyperlink href="keyboard-behavio
|
|
|
8
8
|
|
|
9
9
|
<auro-header level="2" id="ariaRolesAndAttributes">ARIA Roles and Attributes</auro-header>
|
|
10
10
|
<auro-header level="3" id="checkboxGroup">Checkbox Group</auro-header>
|
|
11
|
-
The `<auro-checkbox-group>` element uses a `<fieldset>` with a `<legend>` internally, providing native grouping semantics:
|
|
11
|
+
The `<auro-checkbox-group>` element uses a `<fieldset>` with a `<legend>` internally, providing native grouping semantics. These attributes are applied to that shadow-DOM `<fieldset>`, **not** to the `<auro-checkbox-group>` host element:
|
|
12
12
|
|
|
13
13
|
| Attribute | Value | Description |
|
|
14
14
|
|---|---|---|
|
|
15
|
-
| `role` | `group` (implicit via `fieldset`) | Groups related checkboxes together. |
|
|
16
|
-
| `aria-invalid` | `true`
|
|
15
|
+
| `role` | `group` (implicit via `fieldset`) | Groups related checkboxes together. There is no ARIA `checkboxgroup` role, so the `<fieldset>`'s implicit `group` role is used as-is. |
|
|
16
|
+
| `aria-invalid` | `true` | Present only while the group is in an invalid state. The attribute is **omitted entirely** when the group is valid — it is never set to `false`. |
|
|
17
|
+
| `aria-describedby` | id reference | Points at the `id` of the group's help-text/error element, so assistive technology can associate the message with the group on demand rather than relying only on the one-time live-region announcement. |
|
|
17
18
|
|
|
18
19
|
<auro-header level="3" id="checkboxElement">Checkbox</auro-header>
|
|
19
20
|
Each `<auro-checkbox>` renders a native `<input type="checkbox">` inside its shadow DOM:
|
|
@@ -23,12 +24,22 @@ Each `<auro-checkbox>` renders a native `<input type="checkbox">` inside its sha
|
|
|
23
24
|
| `type` | `checkbox` | Native checkbox input type. |
|
|
24
25
|
| `aria-checked` | `true` / `false` | Reflects the checked state of the checkbox. |
|
|
25
26
|
| `aria-disabled` | `true` / `false` | Indicates whether the checkbox is disabled. |
|
|
27
|
+
| `aria-invalid` | `true` | Mirrored onto each checkbox from the group while the group is invalid, and removed when it becomes valid. Omitted rather than set to `false`. |
|
|
28
|
+
|
|
29
|
+
<auro-header level="4" id="invalidStatePlacement">Why the invalid state appears twice</auro-header>
|
|
30
|
+
While the group is invalid, `aria-invalid` is set on both the `<fieldset>` and every individual `<auro-checkbox>`. This is intentional: some assistive-technology and browser combinations announce a container's invalid state only when focus first enters the group, so mirroring the state onto each checkbox keeps it conveyed as focus moves through the options.
|
|
31
|
+
|
|
32
|
+
The `checkbox` role is in `aria-invalid`'s supported-role list in every ARIA version, so the per-checkbox placement is unambiguous. The group-level placement is worth one note: `aria-invalid` is a global attribute in ARIA 1.1, applicable to any role including `group`, but ARIA 1.2 deprecates that global use in favor of a supported-role list that does not include `group`. Keeping it on the `<fieldset>` is a deliberate choice — it is not a *prohibited* attribute for `group`, current axe-core resolves it as global and reports no violation, and it gives the group a real invalid signal that would otherwise be lost. This is covered by an automated axe assertion in the component's test suite so that a future change in tooling surfaces here rather than in a consumer's audit.
|
|
33
|
+
|
|
34
|
+
<auro-header level="4" id="attributePlacementNote">Attribute placement</auro-header>
|
|
35
|
+
`aria-invalid` is applied to the internal `<fieldset>`, not to the `<auro-checkbox-group>` host element. Do not write CSS selectors or test assertions against `auro-checkbox-group[aria-invalid]`; target the `part="checkbox-group"` fieldset or read the `validity` property instead.
|
|
26
36
|
|
|
27
37
|
<auro-header level="2" id="screenReaderAnnouncements">Screen Reader Announcements</auro-header>
|
|
28
38
|
- **Focus** — When focus moves to a checkbox, the screen reader announces the checkbox label, its checked/unchecked state, and role ("checkbox").
|
|
29
39
|
- **State change** — Toggling the checkbox announces the new state ("checked" or "unchecked").
|
|
30
40
|
- **Group context** — The legend text provides group context when navigating between groups.
|
|
31
|
-
- **Error** — When validation fails, the error message is announced
|
|
41
|
+
- **Error** — When validation fails, the error message is announced immediately via the help text's `role="alert"` live region, and stays discoverable afterward through the group's `aria-describedby` association.
|
|
42
|
+
- **Invalid state** — While the group is invalid, entering it or moving between its checkboxes conveys the invalid state.
|
|
32
43
|
|
|
33
44
|
<auro-header level="2" id="accessibleLabels">Accessible Labels</auro-header>
|
|
34
45
|
- The `legend` slot content provides the accessible group label via the native `<legend>` element.
|
|
@@ -46,9 +46,10 @@ The `auro-checkbox-group` element is a wrapper for `auro-checkbox` elements..
|
|
|
46
46
|
|
|
47
47
|
## CSS Shadow Parts
|
|
48
48
|
|
|
49
|
-
| Part
|
|
50
|
-
|
|
51
|
-
| `
|
|
49
|
+
| Part | Description |
|
|
50
|
+
|------------------|--------------------------------------------------|
|
|
51
|
+
| `checkbox-group` | Apply css to the fieldset element in the shadow DOM |
|
|
52
|
+
| `helpText` | Apply css to the help text element that displays helper or error messages. |
|
|
52
53
|
|
|
53
54
|
# auro-checkbox
|
|
54
55
|
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
<auro-header level="3" id="cssParts">CSS Shadow Parts</auro-header>
|
|
161
161
|
<!-- AURO-GENERATED-CONTENT:START (FILE:src=./../docs/partials/customize/css-parts.md) -->
|
|
162
162
|
<!-- The below content is automatically added from ./../docs/partials/customize/css-parts.md -->
|
|
163
|
-
<p>CSS Shadow Parts allow you to style elements inside a web component's shadow DOM using the <code>::part()</code> pseudo-element. The following parts are exposed by <code><auro-checkbox></code>.</p>
|
|
163
|
+
<p>CSS Shadow Parts allow you to style elements inside a web component's shadow DOM using the <code>::part()</code> pseudo-element. The following parts are exposed by <code><auro-checkbox-group></code> and <code><auro-checkbox></code>.</p>
|
|
164
164
|
<table class="auro_table">
|
|
165
165
|
<thead>
|
|
166
166
|
<tr>
|
|
@@ -169,6 +169,7 @@
|
|
|
169
169
|
</tr>
|
|
170
170
|
</thead>
|
|
171
171
|
<tbody>
|
|
172
|
+
<tr><td><code>checkbox-group</code></td><td>The fieldset element in the <code><auro-checkbox-group></code> shadow DOM. Use this to style the group container, and to query the element that carries the group's <code>aria-invalid</code> state.</td></tr>
|
|
172
173
|
<tr><td><code>checkbox</code></td><td>The checkbox container element.</td></tr>
|
|
173
174
|
<tr><td><code>checkbox-input</code></td><td>The checkbox input element.</td></tr>
|
|
174
175
|
<tr><td><code>checkbox-label</code></td><td>The checkbox label element.</td></tr>
|
|
@@ -1046,6 +1046,48 @@ class AuroDependencyVersioning {
|
|
|
1046
1046
|
}
|
|
1047
1047
|
}
|
|
1048
1048
|
|
|
1049
|
+
/**
|
|
1050
|
+
* Generates a v4 UUID with a three-tier fallback for insecure contexts.
|
|
1051
|
+
*
|
|
1052
|
+
* Tier 1 (secure contexts): crypto.randomUUID() — native, fully random.
|
|
1053
|
+
* Tier 2 (insecure contexts): crypto.getRandomValues() — available on all
|
|
1054
|
+
* modern browsers regardless of secure-context status.
|
|
1055
|
+
* Tier 3 (last resort, no crypto API): new Date().getTime() — lower entropy,
|
|
1056
|
+
* but sufficient for element IDs where collision risk is negligible.
|
|
1057
|
+
*
|
|
1058
|
+
* See: https://w3c.github.io/webcrypto/#dom-crypto-randomuuid (secure-context restriction)
|
|
1059
|
+
*/
|
|
1060
|
+
function generateUUID() {
|
|
1061
|
+
let uuid;
|
|
1062
|
+
|
|
1063
|
+
if (
|
|
1064
|
+
typeof crypto !== "undefined" &&
|
|
1065
|
+
typeof crypto.randomUUID === "function"
|
|
1066
|
+
) {
|
|
1067
|
+
uuid = crypto.randomUUID();
|
|
1068
|
+
} else if (
|
|
1069
|
+
typeof crypto !== "undefined" &&
|
|
1070
|
+
typeof crypto.getRandomValues === "function"
|
|
1071
|
+
) {
|
|
1072
|
+
const bytes = new Uint8Array(16);
|
|
1073
|
+
crypto.getRandomValues(bytes);
|
|
1074
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
1075
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
1076
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0"));
|
|
1077
|
+
uuid = `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
1078
|
+
} else {
|
|
1079
|
+
let d = new Date().getTime();
|
|
1080
|
+
uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
1081
|
+
const r = (d % 16) | 0;
|
|
1082
|
+
d = (d - r) / 16 || new Date().getTime();
|
|
1083
|
+
return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// CSS selectors require IDs starting with a letter; replace a leading digit with 'a'.
|
|
1088
|
+
return /^[0-9]/.test(uuid) ? `a${uuid.slice(1)}` : uuid;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1049
1091
|
var styleCss$1 = i$5`:host{display:block;padding-bottom:var(--ds-size-150, 0.75rem)}.displayFlex legend+slot{display:flex;white-space:nowrap}fieldset{all:unset}legend{margin-bottom:var(--ds-size-150, 0.75rem)}[auro-helptext]{margin-top:var(--ds-size-150, 0.75rem)}`;
|
|
1050
1092
|
|
|
1051
1093
|
var colorCss$1 = i$5`:host{color:var(--ds-auro-checkbox-group-text-color)}:host([disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host([onDark]),:host([appearance=inverse]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([onDark][disabled]),:host([appearance=inverse][disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse-disabled, #7e8894)}`;
|
|
@@ -1284,7 +1326,7 @@ class AuroHelpText extends i$2 {
|
|
|
1284
1326
|
}
|
|
1285
1327
|
}
|
|
1286
1328
|
|
|
1287
|
-
var formkitVersion = '
|
|
1329
|
+
var formkitVersion = '202609082147';
|
|
1288
1330
|
|
|
1289
1331
|
// Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
|
|
1290
1332
|
// See LICENSE in the project root for license information.
|
|
@@ -1294,6 +1336,7 @@ var formkitVersion = '202609050113';
|
|
|
1294
1336
|
* The `auro-checkbox-group` element is a wrapper for `auro-checkbox` elements.
|
|
1295
1337
|
* @customElement auro-checkbox-group
|
|
1296
1338
|
*
|
|
1339
|
+
* @csspart checkbox-group - Apply css to the fieldset element in the shadow DOM
|
|
1297
1340
|
* @csspart helpText - Apply css to the help text element that displays helper or error messages.
|
|
1298
1341
|
*
|
|
1299
1342
|
* @slot legend - Allows for the legend to be overridden.
|
|
@@ -1361,6 +1404,11 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1361
1404
|
* @private
|
|
1362
1405
|
*/
|
|
1363
1406
|
this.helpTextTag = versioning.generateTag('auro-formkit-checkbox-helptext', formkitVersion, AuroHelpText);
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* @private
|
|
1410
|
+
*/
|
|
1411
|
+
this.uniqueId = generateUUID();
|
|
1364
1412
|
}
|
|
1365
1413
|
|
|
1366
1414
|
static get styles() {
|
|
@@ -1612,6 +1660,47 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1612
1660
|
this.handlePreselectedItems();
|
|
1613
1661
|
|
|
1614
1662
|
this.validate();
|
|
1663
|
+
this.syncCheckboxValidity();
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
/**
|
|
1667
|
+
* Whether the group is currently in an invalid state.
|
|
1668
|
+
* `validity` — not `error` — is the authoritative source: `validate()` resolves the
|
|
1669
|
+
* `error` attribute to `validity = 'customError'`, so `error` is already covered here.
|
|
1670
|
+
* Single definition of "invalid" for the whole component, consumed by `render()` and
|
|
1671
|
+
* `syncCheckboxValidity()` so the fieldset and its children can never disagree.
|
|
1672
|
+
* @private
|
|
1673
|
+
* @returns {boolean}
|
|
1674
|
+
*/
|
|
1675
|
+
get isInvalid() {
|
|
1676
|
+
return Boolean(this.validity && this.validity !== 'valid');
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
/**
|
|
1680
|
+
* Method for mirroring the group's invalid state onto each checkbox.
|
|
1681
|
+
* Has to be re-applied from `handleItems()` as well, because a slot change can happen
|
|
1682
|
+
* without `validity` itself changing — a checkbox slotted into an already-invalid
|
|
1683
|
+
* group would otherwise be missed.
|
|
1684
|
+
* @private
|
|
1685
|
+
* @returns {void}
|
|
1686
|
+
*/
|
|
1687
|
+
syncCheckboxValidity() {
|
|
1688
|
+
const invalid = this.isInvalid;
|
|
1689
|
+
|
|
1690
|
+
this.checkboxes.forEach((el) => {
|
|
1691
|
+
if (invalid) {
|
|
1692
|
+
el.setAttribute('error', true);
|
|
1693
|
+
el.setAttribute('aria-invalid', 'true');
|
|
1694
|
+
} else {
|
|
1695
|
+
// Group state is authoritative: an `error` set directly on an individual
|
|
1696
|
+
// checkbox by a consumer is cleared here, and because this method also runs
|
|
1697
|
+
// from `handleItems()` that now happens on every slot change, not just on a
|
|
1698
|
+
// validity change. Matches auro-radio-group. See docs/post-mortem/1636704.md,
|
|
1699
|
+
// "Breaking Change Assessment", for why this is not treated as a breaker.
|
|
1700
|
+
el.removeAttribute('error');
|
|
1701
|
+
el.removeAttribute('aria-invalid');
|
|
1702
|
+
}
|
|
1703
|
+
});
|
|
1615
1704
|
}
|
|
1616
1705
|
|
|
1617
1706
|
/**
|
|
@@ -1643,13 +1732,7 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1643
1732
|
}
|
|
1644
1733
|
|
|
1645
1734
|
if (changedProperties.has('validity')) {
|
|
1646
|
-
this.
|
|
1647
|
-
if (this.validity && this.validity !== 'valid') {
|
|
1648
|
-
el.setAttribute('error', true);
|
|
1649
|
-
} else {
|
|
1650
|
-
el.removeAttribute('error');
|
|
1651
|
-
}
|
|
1652
|
-
});
|
|
1735
|
+
this.syncCheckboxValidity();
|
|
1653
1736
|
}
|
|
1654
1737
|
|
|
1655
1738
|
if (changedProperties.has('required')) {
|
|
@@ -1673,12 +1756,6 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1673
1756
|
}
|
|
1674
1757
|
|
|
1675
1758
|
if (changedProperties.has('error')) {
|
|
1676
|
-
if (this.error) {
|
|
1677
|
-
this.setAttribute('aria-invalid', true);
|
|
1678
|
-
} else {
|
|
1679
|
-
this.removeAttribute('aria-invalid');
|
|
1680
|
-
}
|
|
1681
|
-
|
|
1682
1759
|
this.validate(true);
|
|
1683
1760
|
}
|
|
1684
1761
|
}
|
|
@@ -1697,7 +1774,12 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1697
1774
|
};
|
|
1698
1775
|
|
|
1699
1776
|
return u`
|
|
1700
|
-
<fieldset
|
|
1777
|
+
<fieldset
|
|
1778
|
+
class="${e(groupClasses)}"
|
|
1779
|
+
part="checkbox-group"
|
|
1780
|
+
aria-invalid="${o$1(this.isInvalid ? 'true' : undefined)}"
|
|
1781
|
+
aria-describedby="${this.uniqueId}"
|
|
1782
|
+
>
|
|
1701
1783
|
<legend>
|
|
1702
1784
|
<slot name="legend"></slot>
|
|
1703
1785
|
${this.required ? undefined : u`<slot name="optionalLabel"> (optional)</slot>`}
|
|
@@ -1705,13 +1787,13 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1705
1787
|
<slot @slotchange=${this.handleItems}></slot>
|
|
1706
1788
|
</fieldset>
|
|
1707
1789
|
|
|
1708
|
-
${!this.
|
|
1790
|
+
${!this.isInvalid
|
|
1709
1791
|
? u`
|
|
1710
|
-
<${this.helpTextTag} part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1792
|
+
<${this.helpTextTag} id="${this.uniqueId}" part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1711
1793
|
<slot name="helpText"></slot>
|
|
1712
1794
|
</${this.helpTextTag}>`
|
|
1713
1795
|
: u`
|
|
1714
|
-
<${this.helpTextTag} error appearance="${this.onDark ? 'inverse' : this.appearance}"
|
|
1796
|
+
<${this.helpTextTag} id="${this.uniqueId}" error appearance="${this.onDark ? 'inverse' : this.appearance}" role="alert" aria-live="assertive" part="helpText">
|
|
1715
1797
|
${this.errorMessage}
|
|
1716
1798
|
</${this.helpTextTag}>`
|
|
1717
1799
|
}
|
|
@@ -1046,6 +1046,48 @@ class AuroDependencyVersioning {
|
|
|
1046
1046
|
}
|
|
1047
1047
|
}
|
|
1048
1048
|
|
|
1049
|
+
/**
|
|
1050
|
+
* Generates a v4 UUID with a three-tier fallback for insecure contexts.
|
|
1051
|
+
*
|
|
1052
|
+
* Tier 1 (secure contexts): crypto.randomUUID() — native, fully random.
|
|
1053
|
+
* Tier 2 (insecure contexts): crypto.getRandomValues() — available on all
|
|
1054
|
+
* modern browsers regardless of secure-context status.
|
|
1055
|
+
* Tier 3 (last resort, no crypto API): new Date().getTime() — lower entropy,
|
|
1056
|
+
* but sufficient for element IDs where collision risk is negligible.
|
|
1057
|
+
*
|
|
1058
|
+
* See: https://w3c.github.io/webcrypto/#dom-crypto-randomuuid (secure-context restriction)
|
|
1059
|
+
*/
|
|
1060
|
+
function generateUUID() {
|
|
1061
|
+
let uuid;
|
|
1062
|
+
|
|
1063
|
+
if (
|
|
1064
|
+
typeof crypto !== "undefined" &&
|
|
1065
|
+
typeof crypto.randomUUID === "function"
|
|
1066
|
+
) {
|
|
1067
|
+
uuid = crypto.randomUUID();
|
|
1068
|
+
} else if (
|
|
1069
|
+
typeof crypto !== "undefined" &&
|
|
1070
|
+
typeof crypto.getRandomValues === "function"
|
|
1071
|
+
) {
|
|
1072
|
+
const bytes = new Uint8Array(16);
|
|
1073
|
+
crypto.getRandomValues(bytes);
|
|
1074
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
1075
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
1076
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0"));
|
|
1077
|
+
uuid = `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
1078
|
+
} else {
|
|
1079
|
+
let d = new Date().getTime();
|
|
1080
|
+
uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
1081
|
+
const r = (d % 16) | 0;
|
|
1082
|
+
d = (d - r) / 16 || new Date().getTime();
|
|
1083
|
+
return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// CSS selectors require IDs starting with a letter; replace a leading digit with 'a'.
|
|
1088
|
+
return /^[0-9]/.test(uuid) ? `a${uuid.slice(1)}` : uuid;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1049
1091
|
var styleCss$1 = i$5`:host{display:block;padding-bottom:var(--ds-size-150, 0.75rem)}.displayFlex legend+slot{display:flex;white-space:nowrap}fieldset{all:unset}legend{margin-bottom:var(--ds-size-150, 0.75rem)}[auro-helptext]{margin-top:var(--ds-size-150, 0.75rem)}`;
|
|
1050
1092
|
|
|
1051
1093
|
var colorCss$1 = i$5`:host{color:var(--ds-auro-checkbox-group-text-color)}:host([disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host([onDark]),:host([appearance=inverse]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([onDark][disabled]),:host([appearance=inverse][disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse-disabled, #7e8894)}`;
|
|
@@ -1284,7 +1326,7 @@ class AuroHelpText extends i$2 {
|
|
|
1284
1326
|
}
|
|
1285
1327
|
}
|
|
1286
1328
|
|
|
1287
|
-
var formkitVersion = '
|
|
1329
|
+
var formkitVersion = '202609082147';
|
|
1288
1330
|
|
|
1289
1331
|
// Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
|
|
1290
1332
|
// See LICENSE in the project root for license information.
|
|
@@ -1294,6 +1336,7 @@ var formkitVersion = '202609050113';
|
|
|
1294
1336
|
* The `auro-checkbox-group` element is a wrapper for `auro-checkbox` elements.
|
|
1295
1337
|
* @customElement auro-checkbox-group
|
|
1296
1338
|
*
|
|
1339
|
+
* @csspart checkbox-group - Apply css to the fieldset element in the shadow DOM
|
|
1297
1340
|
* @csspart helpText - Apply css to the help text element that displays helper or error messages.
|
|
1298
1341
|
*
|
|
1299
1342
|
* @slot legend - Allows for the legend to be overridden.
|
|
@@ -1361,6 +1404,11 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1361
1404
|
* @private
|
|
1362
1405
|
*/
|
|
1363
1406
|
this.helpTextTag = versioning.generateTag('auro-formkit-checkbox-helptext', formkitVersion, AuroHelpText);
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* @private
|
|
1410
|
+
*/
|
|
1411
|
+
this.uniqueId = generateUUID();
|
|
1364
1412
|
}
|
|
1365
1413
|
|
|
1366
1414
|
static get styles() {
|
|
@@ -1612,6 +1660,47 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1612
1660
|
this.handlePreselectedItems();
|
|
1613
1661
|
|
|
1614
1662
|
this.validate();
|
|
1663
|
+
this.syncCheckboxValidity();
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
/**
|
|
1667
|
+
* Whether the group is currently in an invalid state.
|
|
1668
|
+
* `validity` — not `error` — is the authoritative source: `validate()` resolves the
|
|
1669
|
+
* `error` attribute to `validity = 'customError'`, so `error` is already covered here.
|
|
1670
|
+
* Single definition of "invalid" for the whole component, consumed by `render()` and
|
|
1671
|
+
* `syncCheckboxValidity()` so the fieldset and its children can never disagree.
|
|
1672
|
+
* @private
|
|
1673
|
+
* @returns {boolean}
|
|
1674
|
+
*/
|
|
1675
|
+
get isInvalid() {
|
|
1676
|
+
return Boolean(this.validity && this.validity !== 'valid');
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
/**
|
|
1680
|
+
* Method for mirroring the group's invalid state onto each checkbox.
|
|
1681
|
+
* Has to be re-applied from `handleItems()` as well, because a slot change can happen
|
|
1682
|
+
* without `validity` itself changing — a checkbox slotted into an already-invalid
|
|
1683
|
+
* group would otherwise be missed.
|
|
1684
|
+
* @private
|
|
1685
|
+
* @returns {void}
|
|
1686
|
+
*/
|
|
1687
|
+
syncCheckboxValidity() {
|
|
1688
|
+
const invalid = this.isInvalid;
|
|
1689
|
+
|
|
1690
|
+
this.checkboxes.forEach((el) => {
|
|
1691
|
+
if (invalid) {
|
|
1692
|
+
el.setAttribute('error', true);
|
|
1693
|
+
el.setAttribute('aria-invalid', 'true');
|
|
1694
|
+
} else {
|
|
1695
|
+
// Group state is authoritative: an `error` set directly on an individual
|
|
1696
|
+
// checkbox by a consumer is cleared here, and because this method also runs
|
|
1697
|
+
// from `handleItems()` that now happens on every slot change, not just on a
|
|
1698
|
+
// validity change. Matches auro-radio-group. See docs/post-mortem/1636704.md,
|
|
1699
|
+
// "Breaking Change Assessment", for why this is not treated as a breaker.
|
|
1700
|
+
el.removeAttribute('error');
|
|
1701
|
+
el.removeAttribute('aria-invalid');
|
|
1702
|
+
}
|
|
1703
|
+
});
|
|
1615
1704
|
}
|
|
1616
1705
|
|
|
1617
1706
|
/**
|
|
@@ -1643,13 +1732,7 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1643
1732
|
}
|
|
1644
1733
|
|
|
1645
1734
|
if (changedProperties.has('validity')) {
|
|
1646
|
-
this.
|
|
1647
|
-
if (this.validity && this.validity !== 'valid') {
|
|
1648
|
-
el.setAttribute('error', true);
|
|
1649
|
-
} else {
|
|
1650
|
-
el.removeAttribute('error');
|
|
1651
|
-
}
|
|
1652
|
-
});
|
|
1735
|
+
this.syncCheckboxValidity();
|
|
1653
1736
|
}
|
|
1654
1737
|
|
|
1655
1738
|
if (changedProperties.has('required')) {
|
|
@@ -1673,12 +1756,6 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1673
1756
|
}
|
|
1674
1757
|
|
|
1675
1758
|
if (changedProperties.has('error')) {
|
|
1676
|
-
if (this.error) {
|
|
1677
|
-
this.setAttribute('aria-invalid', true);
|
|
1678
|
-
} else {
|
|
1679
|
-
this.removeAttribute('aria-invalid');
|
|
1680
|
-
}
|
|
1681
|
-
|
|
1682
1759
|
this.validate(true);
|
|
1683
1760
|
}
|
|
1684
1761
|
}
|
|
@@ -1697,7 +1774,12 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1697
1774
|
};
|
|
1698
1775
|
|
|
1699
1776
|
return u`
|
|
1700
|
-
<fieldset
|
|
1777
|
+
<fieldset
|
|
1778
|
+
class="${e(groupClasses)}"
|
|
1779
|
+
part="checkbox-group"
|
|
1780
|
+
aria-invalid="${o$1(this.isInvalid ? 'true' : undefined)}"
|
|
1781
|
+
aria-describedby="${this.uniqueId}"
|
|
1782
|
+
>
|
|
1701
1783
|
<legend>
|
|
1702
1784
|
<slot name="legend"></slot>
|
|
1703
1785
|
${this.required ? undefined : u`<slot name="optionalLabel"> (optional)</slot>`}
|
|
@@ -1705,13 +1787,13 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1705
1787
|
<slot @slotchange=${this.handleItems}></slot>
|
|
1706
1788
|
</fieldset>
|
|
1707
1789
|
|
|
1708
|
-
${!this.
|
|
1790
|
+
${!this.isInvalid
|
|
1709
1791
|
? u`
|
|
1710
|
-
<${this.helpTextTag} part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1792
|
+
<${this.helpTextTag} id="${this.uniqueId}" part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1711
1793
|
<slot name="helpText"></slot>
|
|
1712
1794
|
</${this.helpTextTag}>`
|
|
1713
1795
|
: u`
|
|
1714
|
-
<${this.helpTextTag} error appearance="${this.onDark ? 'inverse' : this.appearance}"
|
|
1796
|
+
<${this.helpTextTag} id="${this.uniqueId}" error appearance="${this.onDark ? 'inverse' : this.appearance}" role="alert" aria-live="assertive" part="helpText">
|
|
1715
1797
|
${this.errorMessage}
|
|
1716
1798
|
</${this.helpTextTag}>`
|
|
1717
1799
|
}
|
|
@@ -1046,6 +1046,48 @@ class AuroDependencyVersioning {
|
|
|
1046
1046
|
}
|
|
1047
1047
|
}
|
|
1048
1048
|
|
|
1049
|
+
/**
|
|
1050
|
+
* Generates a v4 UUID with a three-tier fallback for insecure contexts.
|
|
1051
|
+
*
|
|
1052
|
+
* Tier 1 (secure contexts): crypto.randomUUID() — native, fully random.
|
|
1053
|
+
* Tier 2 (insecure contexts): crypto.getRandomValues() — available on all
|
|
1054
|
+
* modern browsers regardless of secure-context status.
|
|
1055
|
+
* Tier 3 (last resort, no crypto API): new Date().getTime() — lower entropy,
|
|
1056
|
+
* but sufficient for element IDs where collision risk is negligible.
|
|
1057
|
+
*
|
|
1058
|
+
* See: https://w3c.github.io/webcrypto/#dom-crypto-randomuuid (secure-context restriction)
|
|
1059
|
+
*/
|
|
1060
|
+
function generateUUID() {
|
|
1061
|
+
let uuid;
|
|
1062
|
+
|
|
1063
|
+
if (
|
|
1064
|
+
typeof crypto !== "undefined" &&
|
|
1065
|
+
typeof crypto.randomUUID === "function"
|
|
1066
|
+
) {
|
|
1067
|
+
uuid = crypto.randomUUID();
|
|
1068
|
+
} else if (
|
|
1069
|
+
typeof crypto !== "undefined" &&
|
|
1070
|
+
typeof crypto.getRandomValues === "function"
|
|
1071
|
+
) {
|
|
1072
|
+
const bytes = new Uint8Array(16);
|
|
1073
|
+
crypto.getRandomValues(bytes);
|
|
1074
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
1075
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
1076
|
+
const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0"));
|
|
1077
|
+
uuid = `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
1078
|
+
} else {
|
|
1079
|
+
let d = new Date().getTime();
|
|
1080
|
+
uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
1081
|
+
const r = (d % 16) | 0;
|
|
1082
|
+
d = (d - r) / 16 || new Date().getTime();
|
|
1083
|
+
return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// CSS selectors require IDs starting with a letter; replace a leading digit with 'a'.
|
|
1088
|
+
return /^[0-9]/.test(uuid) ? `a${uuid.slice(1)}` : uuid;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1049
1091
|
var styleCss$1 = i$5`:host{display:block;padding-bottom:var(--ds-size-150, 0.75rem)}.displayFlex legend+slot{display:flex;white-space:nowrap}fieldset{all:unset}legend{margin-bottom:var(--ds-size-150, 0.75rem)}[auro-helptext]{margin-top:var(--ds-size-150, 0.75rem)}`;
|
|
1050
1092
|
|
|
1051
1093
|
var colorCss$1 = i$5`:host{color:var(--ds-auro-checkbox-group-text-color)}:host([disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-disabled, #d0d0d0)}:host([onDark]),:host([appearance=inverse]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse, #ffffff)}:host([onDark][disabled]),:host([appearance=inverse][disabled]){--ds-auro-checkbox-group-text-color: var(--ds-basic-color-texticon-inverse-disabled, #7e8894)}`;
|
|
@@ -1284,7 +1326,7 @@ class AuroHelpText extends i$2 {
|
|
|
1284
1326
|
}
|
|
1285
1327
|
}
|
|
1286
1328
|
|
|
1287
|
-
var formkitVersion = '
|
|
1329
|
+
var formkitVersion = '202609082147';
|
|
1288
1330
|
|
|
1289
1331
|
// Copyright (c) 2026 Alaska Airlines. All rights reserved. Licensed under the Apache-2.0 license
|
|
1290
1332
|
// See LICENSE in the project root for license information.
|
|
@@ -1294,6 +1336,7 @@ var formkitVersion = '202609050113';
|
|
|
1294
1336
|
* The `auro-checkbox-group` element is a wrapper for `auro-checkbox` elements.
|
|
1295
1337
|
* @customElement auro-checkbox-group
|
|
1296
1338
|
*
|
|
1339
|
+
* @csspart checkbox-group - Apply css to the fieldset element in the shadow DOM
|
|
1297
1340
|
* @csspart helpText - Apply css to the help text element that displays helper or error messages.
|
|
1298
1341
|
*
|
|
1299
1342
|
* @slot legend - Allows for the legend to be overridden.
|
|
@@ -1361,6 +1404,11 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1361
1404
|
* @private
|
|
1362
1405
|
*/
|
|
1363
1406
|
this.helpTextTag = versioning.generateTag('auro-formkit-checkbox-helptext', formkitVersion, AuroHelpText);
|
|
1407
|
+
|
|
1408
|
+
/**
|
|
1409
|
+
* @private
|
|
1410
|
+
*/
|
|
1411
|
+
this.uniqueId = generateUUID();
|
|
1364
1412
|
}
|
|
1365
1413
|
|
|
1366
1414
|
static get styles() {
|
|
@@ -1612,6 +1660,47 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1612
1660
|
this.handlePreselectedItems();
|
|
1613
1661
|
|
|
1614
1662
|
this.validate();
|
|
1663
|
+
this.syncCheckboxValidity();
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
/**
|
|
1667
|
+
* Whether the group is currently in an invalid state.
|
|
1668
|
+
* `validity` — not `error` — is the authoritative source: `validate()` resolves the
|
|
1669
|
+
* `error` attribute to `validity = 'customError'`, so `error` is already covered here.
|
|
1670
|
+
* Single definition of "invalid" for the whole component, consumed by `render()` and
|
|
1671
|
+
* `syncCheckboxValidity()` so the fieldset and its children can never disagree.
|
|
1672
|
+
* @private
|
|
1673
|
+
* @returns {boolean}
|
|
1674
|
+
*/
|
|
1675
|
+
get isInvalid() {
|
|
1676
|
+
return Boolean(this.validity && this.validity !== 'valid');
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
/**
|
|
1680
|
+
* Method for mirroring the group's invalid state onto each checkbox.
|
|
1681
|
+
* Has to be re-applied from `handleItems()` as well, because a slot change can happen
|
|
1682
|
+
* without `validity` itself changing — a checkbox slotted into an already-invalid
|
|
1683
|
+
* group would otherwise be missed.
|
|
1684
|
+
* @private
|
|
1685
|
+
* @returns {void}
|
|
1686
|
+
*/
|
|
1687
|
+
syncCheckboxValidity() {
|
|
1688
|
+
const invalid = this.isInvalid;
|
|
1689
|
+
|
|
1690
|
+
this.checkboxes.forEach((el) => {
|
|
1691
|
+
if (invalid) {
|
|
1692
|
+
el.setAttribute('error', true);
|
|
1693
|
+
el.setAttribute('aria-invalid', 'true');
|
|
1694
|
+
} else {
|
|
1695
|
+
// Group state is authoritative: an `error` set directly on an individual
|
|
1696
|
+
// checkbox by a consumer is cleared here, and because this method also runs
|
|
1697
|
+
// from `handleItems()` that now happens on every slot change, not just on a
|
|
1698
|
+
// validity change. Matches auro-radio-group. See docs/post-mortem/1636704.md,
|
|
1699
|
+
// "Breaking Change Assessment", for why this is not treated as a breaker.
|
|
1700
|
+
el.removeAttribute('error');
|
|
1701
|
+
el.removeAttribute('aria-invalid');
|
|
1702
|
+
}
|
|
1703
|
+
});
|
|
1615
1704
|
}
|
|
1616
1705
|
|
|
1617
1706
|
/**
|
|
@@ -1643,13 +1732,7 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1643
1732
|
}
|
|
1644
1733
|
|
|
1645
1734
|
if (changedProperties.has('validity')) {
|
|
1646
|
-
this.
|
|
1647
|
-
if (this.validity && this.validity !== 'valid') {
|
|
1648
|
-
el.setAttribute('error', true);
|
|
1649
|
-
} else {
|
|
1650
|
-
el.removeAttribute('error');
|
|
1651
|
-
}
|
|
1652
|
-
});
|
|
1735
|
+
this.syncCheckboxValidity();
|
|
1653
1736
|
}
|
|
1654
1737
|
|
|
1655
1738
|
if (changedProperties.has('required')) {
|
|
@@ -1673,12 +1756,6 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1673
1756
|
}
|
|
1674
1757
|
|
|
1675
1758
|
if (changedProperties.has('error')) {
|
|
1676
|
-
if (this.error) {
|
|
1677
|
-
this.setAttribute('aria-invalid', true);
|
|
1678
|
-
} else {
|
|
1679
|
-
this.removeAttribute('aria-invalid');
|
|
1680
|
-
}
|
|
1681
|
-
|
|
1682
1759
|
this.validate(true);
|
|
1683
1760
|
}
|
|
1684
1761
|
}
|
|
@@ -1697,7 +1774,12 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1697
1774
|
};
|
|
1698
1775
|
|
|
1699
1776
|
return u`
|
|
1700
|
-
<fieldset
|
|
1777
|
+
<fieldset
|
|
1778
|
+
class="${e(groupClasses)}"
|
|
1779
|
+
part="checkbox-group"
|
|
1780
|
+
aria-invalid="${o$1(this.isInvalid ? 'true' : undefined)}"
|
|
1781
|
+
aria-describedby="${this.uniqueId}"
|
|
1782
|
+
>
|
|
1701
1783
|
<legend>
|
|
1702
1784
|
<slot name="legend"></slot>
|
|
1703
1785
|
${this.required ? undefined : u`<slot name="optionalLabel"> (optional)</slot>`}
|
|
@@ -1705,13 +1787,13 @@ class AuroCheckboxGroup extends i$2 {
|
|
|
1705
1787
|
<slot @slotchange=${this.handleItems}></slot>
|
|
1706
1788
|
</fieldset>
|
|
1707
1789
|
|
|
1708
|
-
${!this.
|
|
1790
|
+
${!this.isInvalid
|
|
1709
1791
|
? u`
|
|
1710
|
-
<${this.helpTextTag} part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1792
|
+
<${this.helpTextTag} id="${this.uniqueId}" part="helpText" appearance="${this.onDark ? 'inverse' : this.appearance}">
|
|
1711
1793
|
<slot name="helpText"></slot>
|
|
1712
1794
|
</${this.helpTextTag}>`
|
|
1713
1795
|
: u`
|
|
1714
|
-
<${this.helpTextTag} error appearance="${this.onDark ? 'inverse' : this.appearance}"
|
|
1796
|
+
<${this.helpTextTag} id="${this.uniqueId}" error appearance="${this.onDark ? 'inverse' : this.appearance}" role="alert" aria-live="assertive" part="helpText">
|
|
1715
1797
|
${this.errorMessage}
|
|
1716
1798
|
</${this.helpTextTag}>`
|
|
1717
1799
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* The `auro-checkbox-group` element is a wrapper for `auro-checkbox` elements.
|
|
3
3
|
* @customElement auro-checkbox-group
|
|
4
4
|
*
|
|
5
|
+
* @csspart checkbox-group - Apply css to the fieldset element in the shadow DOM
|
|
5
6
|
* @csspart helpText - Apply css to the help text element that displays helper or error messages.
|
|
6
7
|
*
|
|
7
8
|
* @slot legend - Allows for the legend to be overridden.
|
|
@@ -141,6 +142,10 @@ export class AuroCheckboxGroup extends LitElement {
|
|
|
141
142
|
* @private
|
|
142
143
|
*/
|
|
143
144
|
private helpTextTag;
|
|
145
|
+
/**
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
private uniqueId;
|
|
144
149
|
/**
|
|
145
150
|
* Helper method to handle checkbox value changing.
|
|
146
151
|
* @private
|
|
@@ -164,6 +169,25 @@ export class AuroCheckboxGroup extends LitElement {
|
|
|
164
169
|
*/
|
|
165
170
|
private handleItems;
|
|
166
171
|
checkboxes: Element[] | undefined;
|
|
172
|
+
/**
|
|
173
|
+
* Whether the group is currently in an invalid state.
|
|
174
|
+
* `validity` — not `error` — is the authoritative source: `validate()` resolves the
|
|
175
|
+
* `error` attribute to `validity = 'customError'`, so `error` is already covered here.
|
|
176
|
+
* Single definition of "invalid" for the whole component, consumed by `render()` and
|
|
177
|
+
* `syncCheckboxValidity()` so the fieldset and its children can never disagree.
|
|
178
|
+
* @private
|
|
179
|
+
* @returns {boolean}
|
|
180
|
+
*/
|
|
181
|
+
private get isInvalid();
|
|
182
|
+
/**
|
|
183
|
+
* Method for mirroring the group's invalid state onto each checkbox.
|
|
184
|
+
* Has to be re-applied from `handleItems()` as well, because a slot change can happen
|
|
185
|
+
* without `validity` itself changing — a checkbox slotted into an already-invalid
|
|
186
|
+
* group would otherwise be missed.
|
|
187
|
+
* @private
|
|
188
|
+
* @returns {void}
|
|
189
|
+
*/
|
|
190
|
+
private syncCheckboxValidity;
|
|
167
191
|
/**
|
|
168
192
|
* Resets component to initial state.
|
|
169
193
|
* @returns {void}
|