@jirawatpyk/aura-react 5.67.0 → 5.68.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/README.md CHANGED
@@ -186,6 +186,11 @@ DataTable with sort and page in the URL (4.17): `onStateChange={({ sort, page })
186
186
  - **Time zone**: `timeZone` on AuraProvider, DatePicker, DateRangePicker and Calendar decides "today" (the marker, `min`/`max="today"`, the first month shown); or pass `today` as an ISO date. `todayIn('Asia/Bangkok')` is exported from the root and `/server`.
187
187
  - **Toasts** queue past three instead of dropping: six in a row all show, in order, three at a time.
188
188
 
189
+ ## 5.68 — Chamber-OS addendum 85 (#184)
190
+
191
+ - **A disabled group dims its legend:** `RadioGroup` and `CheckboxGroup` with `disabled` add `is-disabled` to the fieldset, so the legend takes the disabled colour (`fg-secondary`) a disabled `Field`'s label has — a form that disables its fields while submitting no longer shows group legends at full contrast over dimmed controls.
192
+ - **`errorLive` — an error line that announces:** on `CheckboxGroup`, `RadioGroup` and `Field`, `errorLive` gives the error line `aria-live="polite"` and keeps it in the page, empty and taking no room, while there is no error (the hint shows), so a message that appears as the user changes the field ("Choose at least one membership category" the moment the last box is unticked) is read once. Off by default: an error shown on submit, with focus moved to the field, is read already. Under a `Field`, your own control should still point at `{id}-error` in its `aria-describedby` while there is an error, so the message stays its description. Not on TextField and the other controls. Hand-written markup with an empty `.aura-field__error` placeholder is now hidden until it has content. Drop a hand-made `sr-only` `role="status"` beside the group.
193
+
189
194
  ## 5.67 — Chamber-OS addendum 84 (#183)
190
195
 
191
196
  - **`CheckboxGroup` — RadioGroup's many-choice twin:** one `fieldset` named by its `legend`, with RadioGroup's props — `label`, `hint`, `error`, `required` (the same `*` marker), `disabled` (every box), `orientation`, `touchHeight` (44px rows), `options` (`{ value, label, description?, disabled? }` or strings), `name` — and a set of values: `value: string[]` / `defaultValue` / `onChange(values)`, always in option order whatever order they were ticked in. The group is described by the hint, or by the error line, which also marks every box `aria-invalid` and edges the empty ones. `required` shows the `*` and adds a hidden "(required)" to the group's name (localised), since a group can't take `aria-required` and a native `required` on each box would demand all of them; "at least one" is yours to check (pass `error`, which each box then also points at). Values not among the options (archived, still loading) are kept, after the others. `focus()` on the ref lands on the first ticked enabled box. Replaces a hand-made fieldset of Checkboxes.
@@ -2081,12 +2081,19 @@ window.Aura = (() => {
2081
2081
  ) : null,
2082
2082
  hasAddon(props.labelAddon) ? /* @__PURE__ */ React13.createElement("div", { className: "aura-field__addon", id: props.id + "-addon" }, props.labelAddon) : null,
2083
2083
  props.children,
2084
- props.error ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: props.id + "-error" }, /* @__PURE__ */ React13.createElement(Icon, { name: /* @__PURE__ */ React13.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__hint", id: props.id + "-hint" }, props.hint) : null
2084
+ fieldNote(props.id, props.error, props.hint, props.errorLive)
2085
2085
  );
2086
2086
  });
2087
2087
  function describedBy(id, p) {
2088
2088
  return p.error ? id + "-error" : p.hint ? id + "-hint" : void 0;
2089
2089
  }
2090
+ function fieldNote(id, error, hint, live) {
2091
+ const err = error ? /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement(Icon, { name: /* @__PURE__ */ React13.createElement(IconCircleAlert, null), size: 14 }), error) : null;
2092
+ const hintLine = hint ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, hint) : null;
2093
+ if (!live)
2094
+ return err ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: id + "-error" }, err) : hintLine;
2095
+ return /* @__PURE__ */ React13.createElement(React13.Fragment, null, err ? null : hintLine, /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: id == null ? void 0 : id + "-error", "aria-live": "polite" }, err));
2096
+ }
2090
2097
  function hasAddon(n3) {
2091
2098
  return n3 != null && typeof n3 !== "boolean" && n3 !== "";
2092
2099
  }
@@ -3872,6 +3879,7 @@ window.Aura = (() => {
3872
3879
  className: cx(
3873
3880
  "aura-field aura-radio-group",
3874
3881
  props.error && "is-invalid",
3882
+ props.disabled && "is-disabled",
3875
3883
  touchClass(props.touchHeight),
3876
3884
  props.className
3877
3885
  ),
@@ -3901,7 +3909,7 @@ window.Aura = (() => {
3901
3909
  }
3902
3910
  ), /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__text" }, /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__label", id: oid ? oid + "-label" : void 0 }, v.label), v.description ? /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__desc", id: oid + "-desc" }, v.description) : null));
3903
3911
  })),
3904
- props.error ? /* @__PURE__ */ React20.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React20.createElement(Icon, { name: /* @__PURE__ */ React20.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React20.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
3912
+ fieldNote(id, props.error, props.hint, props.errorLive)
3905
3913
  );
3906
3914
  });
3907
3915
 
@@ -3936,6 +3944,7 @@ window.Aura = (() => {
3936
3944
  className: cx(
3937
3945
  "aura-field aura-radio-group aura-checkbox-group",
3938
3946
  props.error && "is-invalid",
3947
+ props.disabled && "is-disabled",
3939
3948
  touchClass(props.touchHeight),
3940
3949
  props.className
3941
3950
  ),
@@ -3973,7 +3982,7 @@ window.Aura = (() => {
3973
3982
  v.label
3974
3983
  );
3975
3984
  })),
3976
- props.error ? /* @__PURE__ */ React21.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React21.createElement(Icon, { name: /* @__PURE__ */ React21.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React21.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
3985
+ fieldNote(id, props.error, props.hint, props.errorLive)
3977
3986
  );
3978
3987
  }
3979
3988
  );
@@ -2063,12 +2063,19 @@ var Field = React13.forwardRef(function Field2(props, ref) {
2063
2063
  ) : null,
2064
2064
  hasAddon(props.labelAddon) ? /* @__PURE__ */ React13.createElement("div", { className: "aura-field__addon", id: props.id + "-addon" }, props.labelAddon) : null,
2065
2065
  props.children,
2066
- props.error ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: props.id + "-error" }, /* @__PURE__ */ React13.createElement(Icon, { name: /* @__PURE__ */ React13.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__hint", id: props.id + "-hint" }, props.hint) : null
2066
+ fieldNote(props.id, props.error, props.hint, props.errorLive)
2067
2067
  );
2068
2068
  });
2069
2069
  function describedBy(id, p) {
2070
2070
  return p.error ? id + "-error" : p.hint ? id + "-hint" : void 0;
2071
2071
  }
2072
+ function fieldNote(id, error, hint, live) {
2073
+ const err = error ? /* @__PURE__ */ React13.createElement(React13.Fragment, null, /* @__PURE__ */ React13.createElement(Icon, { name: /* @__PURE__ */ React13.createElement(IconCircleAlert, null), size: 14 }), error) : null;
2074
+ const hintLine = hint ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, hint) : null;
2075
+ if (!live)
2076
+ return err ? /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: id + "-error" }, err) : hintLine;
2077
+ return /* @__PURE__ */ React13.createElement(React13.Fragment, null, err ? null : hintLine, /* @__PURE__ */ React13.createElement("p", { className: "aura-field__error", id: id == null ? void 0 : id + "-error", "aria-live": "polite" }, err));
2078
+ }
2072
2079
  function hasAddon(n3) {
2073
2080
  return n3 != null && typeof n3 !== "boolean" && n3 !== "";
2074
2081
  }
@@ -3854,6 +3861,7 @@ var RadioGroup = React20.forwardRef(function RadioGroup2(props, ref) {
3854
3861
  className: cx(
3855
3862
  "aura-field aura-radio-group",
3856
3863
  props.error && "is-invalid",
3864
+ props.disabled && "is-disabled",
3857
3865
  touchClass(props.touchHeight),
3858
3866
  props.className
3859
3867
  ),
@@ -3883,7 +3891,7 @@ var RadioGroup = React20.forwardRef(function RadioGroup2(props, ref) {
3883
3891
  }
3884
3892
  ), /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__text" }, /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__label", id: oid ? oid + "-label" : void 0 }, v.label), v.description ? /* @__PURE__ */ React20.createElement("span", { className: "aura-choice__desc", id: oid + "-desc" }, v.description) : null));
3885
3893
  })),
3886
- props.error ? /* @__PURE__ */ React20.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React20.createElement(Icon, { name: /* @__PURE__ */ React20.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React20.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
3894
+ fieldNote(id, props.error, props.hint, props.errorLive)
3887
3895
  );
3888
3896
  });
3889
3897
 
@@ -3918,6 +3926,7 @@ var CheckboxGroup = React21.forwardRef(
3918
3926
  className: cx(
3919
3927
  "aura-field aura-radio-group aura-checkbox-group",
3920
3928
  props.error && "is-invalid",
3929
+ props.disabled && "is-disabled",
3921
3930
  touchClass(props.touchHeight),
3922
3931
  props.className
3923
3932
  ),
@@ -3955,7 +3964,7 @@ var CheckboxGroup = React21.forwardRef(
3955
3964
  v.label
3956
3965
  );
3957
3966
  })),
3958
- props.error ? /* @__PURE__ */ React21.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React21.createElement(Icon, { name: /* @__PURE__ */ React21.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React21.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
3967
+ fieldNote(id, props.error, props.hint, props.errorLive)
3959
3968
  );
3960
3969
  }
3961
3970
  );
@@ -1,11 +1,9 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
3
  import { Checkbox } from "./Checkbox.js";
4
- import { describedBy } from "./Field.js";
5
- import { Icon } from "./Icon.js";
4
+ import { describedBy, fieldNote } from "./Field.js";
6
5
  import { cx, touchClass, uid, useMaybeControlled } from "./internal.js";
7
6
  import { useStrings } from "./locale.js";
8
- import { IconCircleAlert } from "./icons.js";
9
7
  const CheckboxGroup = React.forwardRef(
10
8
  function CheckboxGroup2(props, ref) {
11
9
  const t = useStrings();
@@ -35,6 +33,7 @@ const CheckboxGroup = React.forwardRef(
35
33
  className: cx(
36
34
  "aura-field aura-radio-group aura-checkbox-group",
37
35
  props.error && "is-invalid",
36
+ props.disabled && "is-disabled",
38
37
  touchClass(props.touchHeight),
39
38
  props.className
40
39
  ),
@@ -72,7 +71,7 @@ const CheckboxGroup = React.forwardRef(
72
71
  v.label
73
72
  );
74
73
  })),
75
- props.error ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
74
+ fieldNote(id, props.error, props.hint, props.errorLive)
76
75
  );
77
76
  }
78
77
  );
package/dist/esm/Field.js CHANGED
@@ -27,12 +27,19 @@ const Field = React.forwardRef(function Field2(props, ref) {
27
27
  ) : null,
28
28
  hasAddon(props.labelAddon) ? /* @__PURE__ */ React.createElement("div", { className: "aura-field__addon", id: props.id + "-addon" }, props.labelAddon) : null,
29
29
  props.children,
30
- props.error ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__error", id: props.id + "-error" }, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__hint", id: props.id + "-hint" }, props.hint) : null
30
+ fieldNote(props.id, props.error, props.hint, props.errorLive)
31
31
  );
32
32
  });
33
33
  function describedBy(id, p) {
34
34
  return p.error ? id + "-error" : p.hint ? id + "-hint" : void 0;
35
35
  }
36
+ function fieldNote(id, error, hint, live) {
37
+ const err = error ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconCircleAlert, null), size: 14 }), error) : null;
38
+ const hintLine = hint ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, hint) : null;
39
+ if (!live)
40
+ return err ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__error", id: id + "-error" }, err) : hintLine;
41
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, err ? null : hintLine, /* @__PURE__ */ React.createElement("p", { className: "aura-field__error", id: id == null ? void 0 : id + "-error", "aria-live": "polite" }, err));
42
+ }
36
43
  function hasAddon(n) {
37
44
  return n != null && typeof n !== "boolean" && n !== "";
38
45
  }
@@ -68,6 +75,7 @@ export {
68
75
  FIELD_KEYS,
69
76
  Field,
70
77
  describedBy,
78
+ fieldNote,
71
79
  hasAddon,
72
80
  joinDescribedBy
73
81
  };
@@ -1,9 +1,7 @@
1
1
  'use client';
2
2
  import * as React from "react";
3
- import { describedBy } from "./Field.js";
4
- import { Icon } from "./Icon.js";
3
+ import { describedBy, fieldNote } from "./Field.js";
5
4
  import { cx, touchClass, uid, useMaybeControlled } from "./internal.js";
6
- import { IconCircleAlert } from "./icons.js";
7
5
  const RadioGroup = React.forwardRef(function RadioGroup2(props, ref) {
8
6
  const auto = uid(), id = props.id || auto;
9
7
  const st = useMaybeControlled(
@@ -31,6 +29,7 @@ const RadioGroup = React.forwardRef(function RadioGroup2(props, ref) {
31
29
  className: cx(
32
30
  "aura-field aura-radio-group",
33
31
  props.error && "is-invalid",
32
+ props.disabled && "is-disabled",
34
33
  touchClass(props.touchHeight),
35
34
  props.className
36
35
  ),
@@ -60,7 +59,7 @@ const RadioGroup = React.forwardRef(function RadioGroup2(props, ref) {
60
59
  }
61
60
  ), /* @__PURE__ */ React.createElement("span", { className: "aura-choice__text" }, /* @__PURE__ */ React.createElement("span", { className: "aura-choice__label", id: oid ? oid + "-label" : void 0 }, v.label), v.description ? /* @__PURE__ */ React.createElement("span", { className: "aura-choice__desc", id: oid + "-desc" }, v.description) : null));
62
61
  })),
63
- props.error ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__error", id: id + "-error" }, /* @__PURE__ */ React.createElement(Icon, { name: /* @__PURE__ */ React.createElement(IconCircleAlert, null), size: 14 }), props.error) : props.hint ? /* @__PURE__ */ React.createElement("p", { className: "aura-field__hint", id: id + "-hint" }, props.hint) : null
62
+ fieldNote(id, props.error, props.hint, props.errorLive)
64
63
  );
65
64
  });
66
65
  export {
package/dist/index.d.cts CHANGED
@@ -680,7 +680,12 @@ export interface RadioGroupProps extends FieldProps {
680
680
  name?: string | undefined;
681
681
  /** Default `vertical`. */
682
682
  orientation?: "vertical" | "horizontal" | undefined;
683
+ /** Disables every option and (5.68) dims the legend, as Field does its label. */
683
684
  disabled?: boolean | undefined;
685
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears (`aria-live="polite"`) — for an error shown as
686
+ * the user changes the group ("Choose at least one…" when the last box is unticked), not on submit. The error line
687
+ * stays in the page, empty, while there is none, so the first message is read too. Off by default. */
688
+ errorLive?: boolean | undefined;
684
689
  id?: string | undefined;
685
690
  className?: string | undefined;
686
691
  /** 44px rows (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a coarse pointer (touch
@@ -700,7 +705,12 @@ export interface CheckboxGroupProps extends FieldProps {
700
705
  name?: string | undefined;
701
706
  /** Default `vertical`. */
702
707
  orientation?: "vertical" | "horizontal" | undefined;
708
+ /** Disables every option and (5.68) dims the legend, as Field does its label. */
703
709
  disabled?: boolean | undefined;
710
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears (`aria-live="polite"`) — for an error shown as
711
+ * the user changes the group ("Choose at least one…" when the last box is unticked), not on submit. The error line
712
+ * stays in the page, empty, while there is none, so the first message is read too. Off by default. */
713
+ errorLive?: boolean | undefined;
704
714
  id?: string | undefined;
705
715
  className?: string | undefined;
706
716
  /** 44px rows, as RadioGroup: `true` below 640px or on a coarse pointer, `'always'` at every width. */
@@ -1927,6 +1937,12 @@ export interface FieldComponentProps extends Omit<FieldPropsPublic, "label"> {
1927
1937
  /** The control's id: the label points at it, and the hint/error ids derive from it. */
1928
1938
  id?: string | undefined;
1929
1939
  children?: React$1.ReactNode | undefined;
1940
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears — for an error shown as the user types or ticks,
1941
+ * not on submit. The error `<p>` gets `aria-live="polite"` and stays in the page, empty, while there is no error, so
1942
+ * the first message is read too. Off by default: an error shown on submit, with focus moved to the field, is read
1943
+ * already, and a live line would read it twice. Your control should still point at `{id}-error` in its
1944
+ * `aria-describedby` while there is an error (TextField and the others do), so the message stays its description. */
1945
+ errorLive?: boolean | undefined;
1930
1946
  /** 5.31 (Chamber-OS addendum 41): a node between the label and the control, in a `.aura-field__addon` box with the
1931
1947
  * id `{id}-addon`. TextField and Textarea add that id to the input's `aria-describedby`; a custom control should too. */
1932
1948
  labelAddon?: React$1.ReactNode | undefined;
package/dist/index.d.ts CHANGED
@@ -680,7 +680,12 @@ export interface RadioGroupProps extends FieldProps {
680
680
  name?: string | undefined;
681
681
  /** Default `vertical`. */
682
682
  orientation?: "vertical" | "horizontal" | undefined;
683
+ /** Disables every option and (5.68) dims the legend, as Field does its label. */
683
684
  disabled?: boolean | undefined;
685
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears (`aria-live="polite"`) — for an error shown as
686
+ * the user changes the group ("Choose at least one…" when the last box is unticked), not on submit. The error line
687
+ * stays in the page, empty, while there is none, so the first message is read too. Off by default. */
688
+ errorLive?: boolean | undefined;
684
689
  id?: string | undefined;
685
690
  className?: string | undefined;
686
691
  /** 44px rows (5.30, Chamber-OS 135), the one-line label centred: `true` below 640px or on a coarse pointer (touch
@@ -700,7 +705,12 @@ export interface CheckboxGroupProps extends FieldProps {
700
705
  name?: string | undefined;
701
706
  /** Default `vertical`. */
702
707
  orientation?: "vertical" | "horizontal" | undefined;
708
+ /** Disables every option and (5.68) dims the legend, as Field does its label. */
703
709
  disabled?: boolean | undefined;
710
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears (`aria-live="polite"`) — for an error shown as
711
+ * the user changes the group ("Choose at least one…" when the last box is unticked), not on submit. The error line
712
+ * stays in the page, empty, while there is none, so the first message is read too. Off by default. */
713
+ errorLive?: boolean | undefined;
704
714
  id?: string | undefined;
705
715
  className?: string | undefined;
706
716
  /** 44px rows, as RadioGroup: `true` below 640px or on a coarse pointer, `'always'` at every width. */
@@ -1927,6 +1937,12 @@ export interface FieldComponentProps extends Omit<FieldPropsPublic, "label"> {
1927
1937
  /** The control's id: the label points at it, and the hint/error ids derive from it. */
1928
1938
  id?: string | undefined;
1929
1939
  children?: React$1.ReactNode | undefined;
1940
+ /** 5.68 (Chamber-OS 184): announce the error line when it appears — for an error shown as the user types or ticks,
1941
+ * not on submit. The error `<p>` gets `aria-live="polite"` and stays in the page, empty, while there is no error, so
1942
+ * the first message is read too. Off by default: an error shown on submit, with focus moved to the field, is read
1943
+ * already, and a live line would read it twice. Your control should still point at `{id}-error` in its
1944
+ * `aria-describedby` while there is an error (TextField and the others do), so the message stays its description. */
1945
+ errorLive?: boolean | undefined;
1930
1946
  /** 5.31 (Chamber-OS addendum 41): a node between the label and the control, in a `.aura-field__addon` box with the
1931
1947
  * id `{id}-addon`. TextField and Textarea add that id to the input's `aria-describedby`; a custom control should too. */
1932
1948
  labelAddon?: React$1.ReactNode | undefined;
package/dist/styles.css CHANGED
@@ -525,6 +525,9 @@ a.aura-icon-btn { text-decoration: none; }
525
525
  .aura-field__hint, .aura-field__error { display: flex; align-items: flex-start; gap: var(--aura-space-1); margin: 0; font-size: max(12px, .75rem); line-height: 1.5; color: var(--aura-fg-secondary); }
526
526
  .aura-field__error { color: var(--aura-fg-danger); }
527
527
  .aura-field__error .aura-icon { margin-top: 2px; }
528
+ /* 5.68 (Chamber-OS 184): an `errorLive` error line waits in the page, empty, until there is an error. Out of the
529
+ * flow (an absolute child takes no gap) and clipped; the screen reader still has the live region. */
530
+ .aura-field__error:empty { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
528
531
  /* 5.31 (Chamber-OS addendum 41): TextField/Textarea `labelAddon`, between the label and the box, in the field's gap. */
529
532
  .aura-field__addon { min-width: 0; font-size: max(13px, .8125rem); line-height: 1.5; color: var(--aura-fg-primary); }
530
533
  .aura-field.is-disabled .aura-field__label { color: var(--aura-fg-secondary); }
@@ -527,6 +527,9 @@ a.aura-icon-btn { text-decoration: none; }
527
527
  .aura-field__hint, .aura-field__error { display: flex; align-items: flex-start; gap: var(--aura-space-1); margin: 0; font-size: max(12px, .75rem); line-height: 1.5; color: var(--aura-fg-secondary); }
528
528
  .aura-field__error { color: var(--aura-fg-danger); }
529
529
  .aura-field__error .aura-icon { margin-top: 2px; }
530
+ /* 5.68 (Chamber-OS 184): an `errorLive` error line waits in the page, empty, until there is an error. Out of the
531
+ * flow (an absolute child takes no gap) and clipped; the screen reader still has the live region. */
532
+ .aura-field__error:empty { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
530
533
  /* 5.31 (Chamber-OS addendum 41): TextField/Textarea `labelAddon`, between the label and the box, in the field's gap. */
531
534
  .aura-field__addon { min-width: 0; font-size: max(13px, .8125rem); line-height: 1.5; color: var(--aura-fg-primary); }
532
535
  .aura-field.is-disabled .aura-field__label { color: var(--aura-fg-secondary); }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.67.0",
3
+ "version": "5.68.0",
4
4
  "description": "AURA Design System — React components (Enterprise Standard, Human Creative). Thai-first: Buddhist-era dates, Thai collation.",
5
5
  "license": "MIT",
6
6
  "type": "module",