@jirawatpyk/aura-react 5.11.0 → 5.13.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/dist/index.d.cts CHANGED
@@ -89,6 +89,13 @@ export interface DataTableColumn<Row extends Record<string, any> = Record<string
89
89
  hideBelow?: number | "sm" | "md" | "lg" | "xl" | undefined;
90
90
  /** Row actions (a DropdownMenu or IconButton). In stacked cards it sits top-right instead of in the field list. Give it an empty label. */
91
91
  actions?: boolean | undefined;
92
+ /** Its place in a stacked card (5.13): `'hide'` leaves it out of the card (the grid keeps it), `'title'` / `'pill'`
93
+ * make it the card's title or the pill beside it (instead of the first column / first pill column), `'field'` a
94
+ * label/value field. Default: today's rule. */
95
+ card?: "hide" | "field" | "title" | "pill" | undefined;
96
+ /** The order of fields in a stacked card (5.13), lowest first; the grid's column order is unchanged. Fields
97
+ * without one sort by their column index (0-based). Screen readers and arrow keys follow the grid's order. */
98
+ cardOrder?: number | undefined;
92
99
  /** `end` right-aligns header and cells (amounts, counts) and uses tabular figures. Default `start`. */
93
100
  align?: "start" | "end" | undefined;
94
101
  }
@@ -178,6 +185,9 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
178
185
  onRowActivate?: RowCallback<void, Row> | undefined;
179
186
  /** Fixed height in px: sticky header, and only the rows in view are rendered. */
180
187
  height?: number | undefined;
188
+ /** Stacked cards (`stackBelow`) without the row checkboxes and the select-all box (5.13). The grid keeps them and
189
+ * the selection is kept; Space doesn't change it while the cards show. */
190
+ hideSelectionInCards?: boolean | undefined;
181
191
  /** `'auto'` (5.11): rows grow to fit content that wraps (two badges, a long name); cells stay vertically centred and
182
192
  * rows keep at least the density's row height. Needs every row in the DOM, so it is ignored with `height`
183
193
  * (virtualized rows are one fixed height). Default: one fixed-height line per row, long text ends in an ellipsis. */
@@ -387,6 +397,7 @@ export interface FilterBarProps {
387
397
  onSearchChange?: ((value: string) => void) | undefined;
388
398
  /** ms to wait after the last keystroke. Default 300. */
389
399
  searchDelay?: number | undefined;
400
+ /** The search field's name. Default "Search". */
390
401
  searchLabel?: string | undefined;
391
402
  searchPlaceholder?: string | undefined;
392
403
  /** Filter controls beside the search: Select, SegmentedControl, a Popover of options… */
@@ -401,6 +412,9 @@ export interface FilterBarProps {
401
412
  actions?: React$1.ReactNode | undefined;
402
413
  /** Accessible name of the region. Default "Filters". */
403
414
  label?: string | undefined;
415
+ /** The search takes all the room the controls leave in its row, instead of stopping at 360px with the count and
416
+ * actions pushed to the end (5.12). */
417
+ searchGrow?: boolean | undefined;
404
418
  className?: string | undefined;
405
419
  }
406
420
  /** One command in the palette. */
@@ -467,6 +481,20 @@ export interface SelectProps extends Omit<FieldProps, "label">, Omit<React$1.Sel
467
481
  placeholder?: string | undefined;
468
482
  icon?: IconInput | undefined;
469
483
  }
484
+ /** A compact filter for FilterBar (5.12): "Status All ▾", as wide as its words. */
485
+ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "onChange" | "value" | "defaultValue" | "multiple" | "size" | "placeholder" | "required" | "children"> {
486
+ /** The filter's name: shown first on the face ("Status") and its accessible name. */
487
+ label: string;
488
+ /** The choices; the first is the "all" choice. Or pass `<option>` children. */
489
+ options?: SelectOption[] | undefined;
490
+ children?: React$1.ReactNode | undefined;
491
+ value?: string | undefined;
492
+ defaultValue?: string | undefined;
493
+ onChange?: ((value: string) => void) | undefined;
494
+ /** A shorter word the face shows while the first option is chosen ("All" for "All statuses"). The list and screen
495
+ * readers keep the option's own text. */
496
+ allLabel?: string | undefined;
497
+ }
470
498
  export type ChoiceOption = string | {
471
499
  value: string;
472
500
  label: string;
@@ -979,7 +1007,7 @@ export interface SeparatorProps {
979
1007
  spacing?: 1 | 2 | 3 | 4 | 5 | 6 | 8 | undefined;
980
1008
  className?: string | undefined;
981
1009
  }
982
- export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableElement>, "className"> {
1010
+ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableElement>, "className" | "align"> {
983
1011
  /** The table's name (a `<caption>`). Give every table one; `captionHidden` keeps it for screen readers only. */
984
1012
  caption?: React$1.ReactNode | undefined;
985
1013
  captionHidden?: boolean | undefined;
@@ -989,6 +1017,11 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
989
1017
  * cell shows its column's header as a label: a `Td`'s `label`, else the text of the matching `Th` in `THead`.
990
1018
  * Done in CSS (a container query), so the server's HTML is already right; table semantics are kept. */
991
1019
  stackBelow?: "sm" | "md" | undefined;
1020
+ /** `middle` centres every body and footer cell on its row (5.13); default `top`, so wrapped text starts level. */
1021
+ align?: "top" | "middle" | undefined;
1022
+ /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1023
+ * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1024
+ bordered?: boolean | undefined;
992
1025
  className?: string | undefined;
993
1026
  children?: React$1.ReactNode | undefined;
994
1027
  }
@@ -1009,6 +1042,10 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1009
1042
  scope?: "col" | "row" | "colgroup" | "rowgroup" | undefined;
1010
1043
  /** The label this cell shows when its table is stacked (`stackBelow`, 5.8). Default: the matching header's text. */
1011
1044
  label?: string | undefined;
1045
+ /** Its place in a stacked row (5.13), on a Td or a row header (`Th scope="row"`). `title` takes the first line,
1046
+ * without a label; `action` sits at the end of that line at its natural size; `field` (default) is a labelled field,
1047
+ * two to a line under them. */
1048
+ card?: "title" | "action" | "field" | undefined;
1012
1049
  className?: string | undefined;
1013
1050
  }
1014
1051
  export interface ActionBarProps {
@@ -1184,7 +1221,7 @@ export interface SkeletonProps {
1184
1221
  size?: number | undefined;
1185
1222
  className?: string | undefined;
1186
1223
  }
1187
- export interface EmptyStateProps {
1224
+ export interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "children"> {
1188
1225
  title: React$1.ReactNode;
1189
1226
  description?: React$1.ReactNode | undefined;
1190
1227
  icon?: IconInput | undefined;
@@ -1192,6 +1229,9 @@ export interface EmptyStateProps {
1192
1229
  action?: React$1.ReactNode | undefined;
1193
1230
  size?: "sm" | "md" | undefined;
1194
1231
  bordered?: boolean | undefined;
1232
+ /** `danger` (5.13) for a failure — the data couldn't load: the danger tint, a danger-coloured icon, and a solid
1233
+ * danger frame with `bordered`. It stays quiet; pass `role="alert"` if it must interrupt. Default `neutral`. */
1234
+ tone?: "neutral" | "danger" | undefined;
1195
1235
  headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
1196
1236
  className?: string | undefined;
1197
1237
  }
@@ -1338,6 +1378,9 @@ export declare const TextField: React$1.ForwardRefExoticComponent<TextFieldProps
1338
1378
  export declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$1.RefAttributes<HTMLTextAreaElement>>;
1339
1379
  /** A select field: a button that opens an AURA list (5.3), over a real <select> that keeps forms, refs and events. */
1340
1380
  export declare const Select: React$1.ForwardRefExoticComponent<SelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1381
+ /** A compact filter for FilterBar (5.12): a small button reading "Status All ▾" that opens Select's list. The name
1382
+ * is the accessible name, the chosen option its value; forms, refs and the keyboard work as in Select. */
1383
+ export declare const FilterSelect: React$1.ForwardRefExoticComponent<FilterSelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1341
1384
  export declare const RadioGroup: React$1.ForwardRefExoticComponent<RadioGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
1342
1385
  export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.RefAttributes<HTMLButtonElement>>;
1343
1386
  /** One value, or with `multiple` any number (chips). Two call signatures so value/onChange are typed for each. */
package/dist/index.d.ts CHANGED
@@ -89,6 +89,13 @@ export interface DataTableColumn<Row extends Record<string, any> = Record<string
89
89
  hideBelow?: number | "sm" | "md" | "lg" | "xl" | undefined;
90
90
  /** Row actions (a DropdownMenu or IconButton). In stacked cards it sits top-right instead of in the field list. Give it an empty label. */
91
91
  actions?: boolean | undefined;
92
+ /** Its place in a stacked card (5.13): `'hide'` leaves it out of the card (the grid keeps it), `'title'` / `'pill'`
93
+ * make it the card's title or the pill beside it (instead of the first column / first pill column), `'field'` a
94
+ * label/value field. Default: today's rule. */
95
+ card?: "hide" | "field" | "title" | "pill" | undefined;
96
+ /** The order of fields in a stacked card (5.13), lowest first; the grid's column order is unchanged. Fields
97
+ * without one sort by their column index (0-based). Screen readers and arrow keys follow the grid's order. */
98
+ cardOrder?: number | undefined;
92
99
  /** `end` right-aligns header and cells (amounts, counts) and uses tabular figures. Default `start`. */
93
100
  align?: "start" | "end" | undefined;
94
101
  }
@@ -178,6 +185,9 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
178
185
  onRowActivate?: RowCallback<void, Row> | undefined;
179
186
  /** Fixed height in px: sticky header, and only the rows in view are rendered. */
180
187
  height?: number | undefined;
188
+ /** Stacked cards (`stackBelow`) without the row checkboxes and the select-all box (5.13). The grid keeps them and
189
+ * the selection is kept; Space doesn't change it while the cards show. */
190
+ hideSelectionInCards?: boolean | undefined;
181
191
  /** `'auto'` (5.11): rows grow to fit content that wraps (two badges, a long name); cells stay vertically centred and
182
192
  * rows keep at least the density's row height. Needs every row in the DOM, so it is ignored with `height`
183
193
  * (virtualized rows are one fixed height). Default: one fixed-height line per row, long text ends in an ellipsis. */
@@ -387,6 +397,7 @@ export interface FilterBarProps {
387
397
  onSearchChange?: ((value: string) => void) | undefined;
388
398
  /** ms to wait after the last keystroke. Default 300. */
389
399
  searchDelay?: number | undefined;
400
+ /** The search field's name. Default "Search". */
390
401
  searchLabel?: string | undefined;
391
402
  searchPlaceholder?: string | undefined;
392
403
  /** Filter controls beside the search: Select, SegmentedControl, a Popover of options… */
@@ -401,6 +412,9 @@ export interface FilterBarProps {
401
412
  actions?: React$1.ReactNode | undefined;
402
413
  /** Accessible name of the region. Default "Filters". */
403
414
  label?: string | undefined;
415
+ /** The search takes all the room the controls leave in its row, instead of stopping at 360px with the count and
416
+ * actions pushed to the end (5.12). */
417
+ searchGrow?: boolean | undefined;
404
418
  className?: string | undefined;
405
419
  }
406
420
  /** One command in the palette. */
@@ -467,6 +481,20 @@ export interface SelectProps extends Omit<FieldProps, "label">, Omit<React$1.Sel
467
481
  placeholder?: string | undefined;
468
482
  icon?: IconInput | undefined;
469
483
  }
484
+ /** A compact filter for FilterBar (5.12): "Status All ▾", as wide as its words. */
485
+ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "onChange" | "value" | "defaultValue" | "multiple" | "size" | "placeholder" | "required" | "children"> {
486
+ /** The filter's name: shown first on the face ("Status") and its accessible name. */
487
+ label: string;
488
+ /** The choices; the first is the "all" choice. Or pass `<option>` children. */
489
+ options?: SelectOption[] | undefined;
490
+ children?: React$1.ReactNode | undefined;
491
+ value?: string | undefined;
492
+ defaultValue?: string | undefined;
493
+ onChange?: ((value: string) => void) | undefined;
494
+ /** A shorter word the face shows while the first option is chosen ("All" for "All statuses"). The list and screen
495
+ * readers keep the option's own text. */
496
+ allLabel?: string | undefined;
497
+ }
470
498
  export type ChoiceOption = string | {
471
499
  value: string;
472
500
  label: string;
@@ -979,7 +1007,7 @@ export interface SeparatorProps {
979
1007
  spacing?: 1 | 2 | 3 | 4 | 5 | 6 | 8 | undefined;
980
1008
  className?: string | undefined;
981
1009
  }
982
- export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableElement>, "className"> {
1010
+ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableElement>, "className" | "align"> {
983
1011
  /** The table's name (a `<caption>`). Give every table one; `captionHidden` keeps it for screen readers only. */
984
1012
  caption?: React$1.ReactNode | undefined;
985
1013
  captionHidden?: boolean | undefined;
@@ -989,6 +1017,11 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
989
1017
  * cell shows its column's header as a label: a `Td`'s `label`, else the text of the matching `Th` in `THead`.
990
1018
  * Done in CSS (a container query), so the server's HTML is already right; table semantics are kept. */
991
1019
  stackBelow?: "sm" | "md" | undefined;
1020
+ /** `middle` centres every body and footer cell on its row (5.13); default `top`, so wrapped text starts level. */
1021
+ align?: "top" | "middle" | undefined;
1022
+ /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1023
+ * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1024
+ bordered?: boolean | undefined;
992
1025
  className?: string | undefined;
993
1026
  children?: React$1.ReactNode | undefined;
994
1027
  }
@@ -1009,6 +1042,10 @@ export interface TableCellProps extends Omit<React$1.TdHTMLAttributes<HTMLTableC
1009
1042
  scope?: "col" | "row" | "colgroup" | "rowgroup" | undefined;
1010
1043
  /** The label this cell shows when its table is stacked (`stackBelow`, 5.8). Default: the matching header's text. */
1011
1044
  label?: string | undefined;
1045
+ /** Its place in a stacked row (5.13), on a Td or a row header (`Th scope="row"`). `title` takes the first line,
1046
+ * without a label; `action` sits at the end of that line at its natural size; `field` (default) is a labelled field,
1047
+ * two to a line under them. */
1048
+ card?: "title" | "action" | "field" | undefined;
1012
1049
  className?: string | undefined;
1013
1050
  }
1014
1051
  export interface ActionBarProps {
@@ -1184,7 +1221,7 @@ export interface SkeletonProps {
1184
1221
  size?: number | undefined;
1185
1222
  className?: string | undefined;
1186
1223
  }
1187
- export interface EmptyStateProps {
1224
+ export interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "children"> {
1188
1225
  title: React$1.ReactNode;
1189
1226
  description?: React$1.ReactNode | undefined;
1190
1227
  icon?: IconInput | undefined;
@@ -1192,6 +1229,9 @@ export interface EmptyStateProps {
1192
1229
  action?: React$1.ReactNode | undefined;
1193
1230
  size?: "sm" | "md" | undefined;
1194
1231
  bordered?: boolean | undefined;
1232
+ /** `danger` (5.13) for a failure — the data couldn't load: the danger tint, a danger-coloured icon, and a solid
1233
+ * danger frame with `bordered`. It stays quiet; pass `role="alert"` if it must interrupt. Default `neutral`. */
1234
+ tone?: "neutral" | "danger" | undefined;
1195
1235
  headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
1196
1236
  className?: string | undefined;
1197
1237
  }
@@ -1338,6 +1378,9 @@ export declare const TextField: React$1.ForwardRefExoticComponent<TextFieldProps
1338
1378
  export declare const Textarea: React$1.ForwardRefExoticComponent<TextareaProps & React$1.RefAttributes<HTMLTextAreaElement>>;
1339
1379
  /** A select field: a button that opens an AURA list (5.3), over a real <select> that keeps forms, refs and events. */
1340
1380
  export declare const Select: React$1.ForwardRefExoticComponent<SelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1381
+ /** A compact filter for FilterBar (5.12): a small button reading "Status All ▾" that opens Select's list. The name
1382
+ * is the accessible name, the chosen option its value; forms, refs and the keyboard work as in Select. */
1383
+ export declare const FilterSelect: React$1.ForwardRefExoticComponent<FilterSelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1341
1384
  export declare const RadioGroup: React$1.ForwardRefExoticComponent<RadioGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
1342
1385
  export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.RefAttributes<HTMLButtonElement>>;
1343
1386
  /** One value, or with `multiple` any number (chips). Two call signatures so value/onChange are typed for each. */
@@ -1148,11 +1148,30 @@ function badgeElement(props, ref) {
1148
1148
  }
1149
1149
  function emptyStateElement(props, ref) {
1150
1150
  const HT = "h" + (props.headingLevel || 3);
1151
+ const rest = omit(props, [
1152
+ "title",
1153
+ "description",
1154
+ "icon",
1155
+ "action",
1156
+ "size",
1157
+ "bordered",
1158
+ "headingLevel",
1159
+ "tone",
1160
+ "className",
1161
+ "children"
1162
+ ]);
1151
1163
  return /* @__PURE__ */ React3.createElement(
1152
1164
  "div",
1153
1165
  {
1166
+ ...rest,
1154
1167
  ref,
1155
- className: cx("aura-empty", props.size === "sm" && "is-sm", props.bordered && "is-bordered", props.className)
1168
+ className: cx(
1169
+ "aura-empty",
1170
+ props.size === "sm" && "is-sm",
1171
+ props.bordered && "is-bordered",
1172
+ props.tone === "danger" && "is-danger",
1173
+ props.className
1174
+ )
1156
1175
  },
1157
1176
  /* @__PURE__ */ React3.createElement("span", { className: "aura-empty__icon", "aria-hidden": true }, /* @__PURE__ */ React3.createElement(Icon, { name: props.icon || /* @__PURE__ */ React3.createElement(IconInbox, null), size: props.size === "sm" ? "md" : "lg" })),
1158
1177
  /* @__PURE__ */ React3.createElement(HT, { className: "aura-empty__title" }, props.title),
@@ -96,7 +96,7 @@ export interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
96
96
  variant?: "soft" | "solid" | "outline" | undefined;
97
97
  icon?: IconInput | undefined;
98
98
  }
99
- export interface EmptyStateProps {
99
+ export interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "children"> {
100
100
  title: React$1.ReactNode;
101
101
  description?: React$1.ReactNode | undefined;
102
102
  icon?: IconInput | undefined;
@@ -104,6 +104,9 @@ export interface EmptyStateProps {
104
104
  action?: React$1.ReactNode | undefined;
105
105
  size?: "sm" | "md" | undefined;
106
106
  bordered?: boolean | undefined;
107
+ /** `danger` (5.13) for a failure — the data couldn't load: the danger tint, a danger-coloured icon, and a solid
108
+ * danger frame with `bordered`. It stays quiet; pass `role="alert"` if it must interrupt. Default `neutral`. */
109
+ tone?: "neutral" | "danger" | undefined;
107
110
  headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
108
111
  className?: string | undefined;
109
112
  }
@@ -96,7 +96,7 @@ export interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
96
96
  variant?: "soft" | "solid" | "outline" | undefined;
97
97
  icon?: IconInput | undefined;
98
98
  }
99
- export interface EmptyStateProps {
99
+ export interface EmptyStateProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "title" | "children"> {
100
100
  title: React$1.ReactNode;
101
101
  description?: React$1.ReactNode | undefined;
102
102
  icon?: IconInput | undefined;
@@ -104,6 +104,9 @@ export interface EmptyStateProps {
104
104
  action?: React$1.ReactNode | undefined;
105
105
  size?: "sm" | "md" | undefined;
106
106
  bordered?: boolean | undefined;
107
+ /** `danger` (5.13) for a failure — the data couldn't load: the danger tint, a danger-coloured icon, and a solid
108
+ * danger frame with `bordered`. It stays quiet; pass `role="alert"` if it must interrupt. Default `neutral`. */
109
+ tone?: "neutral" | "danger" | undefined;
107
110
  headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
108
111
  className?: string | undefined;
109
112
  }
@@ -1091,11 +1091,30 @@ function badgeElement(props, ref) {
1091
1091
  }
1092
1092
  function emptyStateElement(props, ref) {
1093
1093
  const HT = "h" + (props.headingLevel || 3);
1094
+ const rest = omit(props, [
1095
+ "title",
1096
+ "description",
1097
+ "icon",
1098
+ "action",
1099
+ "size",
1100
+ "bordered",
1101
+ "headingLevel",
1102
+ "tone",
1103
+ "className",
1104
+ "children"
1105
+ ]);
1094
1106
  return /* @__PURE__ */ React3.createElement(
1095
1107
  "div",
1096
1108
  {
1109
+ ...rest,
1097
1110
  ref,
1098
- className: cx("aura-empty", props.size === "sm" && "is-sm", props.bordered && "is-bordered", props.className)
1111
+ className: cx(
1112
+ "aura-empty",
1113
+ props.size === "sm" && "is-sm",
1114
+ props.bordered && "is-bordered",
1115
+ props.tone === "danger" && "is-danger",
1116
+ props.className
1117
+ )
1099
1118
  },
1100
1119
  /* @__PURE__ */ React3.createElement("span", { className: "aura-empty__icon", "aria-hidden": true }, /* @__PURE__ */ React3.createElement(Icon, { name: props.icon || /* @__PURE__ */ React3.createElement(IconInbox, null), size: props.size === "sm" ? "md" : "lg" })),
1101
1120
  /* @__PURE__ */ React3.createElement(HT, { className: "aura-empty__title" }, props.title),
package/dist/styles.css CHANGED
@@ -1083,6 +1083,10 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1083
1083
  .aura-empty__title { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
1084
1084
  .aura-empty__text { margin: 0; max-width: 44ch; font-size: 14px; line-height: 1.6; color: var(--aura-fg-secondary); }
1085
1085
  .aura-empty__action { margin-top: var(--aura-space-3); display: flex; gap: var(--aura-space-3); flex-wrap: wrap; justify-content: center; }
1086
+ /* 5.13 (Chamber-OS 82): tone="danger" — a load failure. */
1087
+ .aura-empty.is-danger { background: var(--aura-alert-danger-bg); border-radius: var(--aura-radius-lg); }
1088
+ .aura-empty.is-danger.is-bordered { border: 1px solid var(--aura-border-danger); }
1089
+ .aura-empty.is-danger .aura-empty__icon { background: var(--aura-bg-surface); color: var(--aura-fg-danger); }
1086
1090
 
1087
1091
  /* ---------- Pagination ---------- */
1088
1092
  .aura-pagination { display: flex; align-items: center; gap: var(--aura-space-1); font-family: var(--font-sans); font-size: 13px; }
@@ -1363,6 +1367,37 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1363
1367
  .aura-filterbar__search { flex-basis: 100%; max-width: none; }
1364
1368
  .aura-filterbar__spacer { display: none; }
1365
1369
  }
1370
+ /* 5.12 searchGrow: the search fills what the controls leave. */
1371
+ .aura-filterbar--grow .aura-filterbar__search { max-width: none; }
1372
+ .aura-filterbar--grow .aura-filterbar__search ~ .aura-filterbar__spacer { display: none; }
1373
+ /* Compact filters sit closer together than full fields. */
1374
+ .aura-filterbar__controls:has(> .aura-filterselect) { gap: var(--aura-space-2); }
1375
+
1376
+ /* 5.12 FilterSelect: a compact face — "Status All ▾" — as wide as its words, over Select's machinery and list. */
1377
+ .aura-filterselect { position: relative; display: inline-flex; width: fit-content; max-width: 100%; vertical-align: middle; font-family: var(--font-sans); }
1378
+ .aura-filterselect__face {
1379
+ box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--aura-space-1); width: auto; max-width: 100%;
1380
+ min-height: var(--aura-input-height); padding-block: 0; padding-inline: var(--aura-space-2) var(--aura-space-1);
1381
+ background: var(--aura-bg-input); color: var(--aura-fg-primary);
1382
+ border: 1px solid var(--aura-border-control); border-radius: var(--aura-radius-md);
1383
+ font: inherit; font-size: 13px; line-height: 18px; text-align: start; cursor: pointer;
1384
+ transition: border-color var(--aura-duration-fast) var(--aura-ease);
1385
+ }
1386
+ .aura-filterselect__face:hover { border-color: var(--aura-fg-secondary); }
1387
+ .aura-filterselect__name { flex: none; white-space: nowrap; color: var(--aura-fg-secondary); }
1388
+ .aura-filterselect__value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
1389
+ .aura-filterselect__chevron { flex: none; width: 14px; height: 14px; color: var(--aura-fg-secondary); }
1390
+ .aura-filterselect.is-open .aura-filterselect__chevron { transform: rotate(180deg); }
1391
+ .aura-filterselect__face:focus-visible, .aura-filterselect:has(.aura-filterselect__native:focus-visible) .aura-filterselect__face {
1392
+ outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; border-color: var(--aura-border-strong);
1393
+ }
1394
+ .aura-filterselect__face:focus { outline-style: none; }
1395
+ .aura-filterselect__face:focus-visible { outline-style: solid; }
1396
+ /* Before hydration: the real <select>, invisible, over the face (16px so iOS doesn't zoom when it opens). */
1397
+ .aura-filterselect__native { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0; border: 0; opacity: 0; font-size: 16px; cursor: pointer; appearance: none; }
1398
+ .aura-filterselect.is-disabled .aura-filterselect__face { background: var(--aura-bg-input-disabled); color: var(--aura-fg-secondary); border-color: var(--aura-border-default); cursor: not-allowed; }
1399
+ .aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
1400
+ @media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
1366
1401
 
1367
1402
  /* Command palette: a search field over a grouped list, above everything else (it can open from a Dialog) */
1368
1403
  .aura-dialog-layer.aura-command-layer { z-index: var(--aura-z-menu); align-items: flex-start; padding: 12vh var(--aura-space-4) var(--aura-space-4); }
@@ -1517,6 +1552,13 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1517
1552
  .aura-tbl .is-numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
1518
1553
  .aura-tbl-wrap[data-density='compact'] .aura-tbl__th, .aura-tbl-wrap[data-density='compact'] .aura-tbl__td { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1519
1554
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
1555
+ /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
1556
+ * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
1557
+ .aura-tbl--middle > .aura-tbl__body > .aura-tbl__row > *, .aura-tbl--middle > .aura-tbl__foot > .aura-tbl__row > * { vertical-align: middle; }
1558
+ .aura-tbl-wrap.is-flush { border: 0; border-radius: 0; background: transparent; }
1559
+ .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: 0; }
1560
+ .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: 0; }
1561
+ .aura-tbl-wrap.is-flush > .aura-tbl > .aura-tbl__caption { padding-inline: 0; }
1520
1562
  /* Stacked rows (5.8, Chamber-OS 67): below `stackBelow` (the table's own box: sm 640px, md 768px) each body row is a
1521
1563
  * card and each cell shows its column label. The column headers stay for screen readers (visually hidden) and the
1522
1564
  * table keeps explicit roles. The box is a size container, so it needs a width of its own. */
@@ -1531,6 +1573,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1531
1573
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1532
1574
  .aura-tbl--stack-md > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
1533
1575
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row > .aura-tbl__th { font-size: 14px; font-weight: 600; }
1576
+ /* 5.13 (Chamber-OS 84): a row with a title or action cell — title and action share the first line, fields two to a line under them. */
1577
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) { display: flex; flex-wrap: wrap; align-items: flex-start; column-gap: var(--aura-space-4); }
1578
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card])::after { content: ''; order: 3; flex: 0 0 100%; }
1579
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > * { order: 4; flex: 0 0 calc(50% - var(--aura-space-4) / 2); min-width: 0; margin-top: var(--aura-space-2); }
1580
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card] { margin-top: 0; }
1581
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='title'] { order: 1; flex: 1 1 0; font-size: 14px; font-weight: 600; }
1582
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='action'] { order: 2; flex: none; margin-inline-start: auto; }
1583
+ .aura-tbl-wrap.is-flush > .aura-tbl--stack-md > .aura-tbl__caption { padding-inline: var(--aura-space-4); }
1534
1584
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td[data-label]::before {
1535
1585
  content: attr(data-label); content: attr(data-label) / '';
1536
1586
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
@@ -1546,6 +1596,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1546
1596
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1547
1597
  .aura-tbl--stack-sm > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
1548
1598
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row > .aura-tbl__th { font-size: 14px; font-weight: 600; }
1599
+ /* 5.13 (Chamber-OS 84): a row with a title or action cell — title and action share the first line, fields two to a line under them. */
1600
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) { display: flex; flex-wrap: wrap; align-items: flex-start; column-gap: var(--aura-space-4); }
1601
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card])::after { content: ''; order: 3; flex: 0 0 100%; }
1602
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > * { order: 4; flex: 0 0 calc(50% - var(--aura-space-4) / 2); min-width: 0; margin-top: var(--aura-space-2); }
1603
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card] { margin-top: 0; }
1604
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='title'] { order: 1; flex: 1 1 0; font-size: 14px; font-weight: 600; }
1605
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='action'] { order: 2; flex: none; margin-inline-start: auto; }
1606
+ .aura-tbl-wrap.is-flush > .aura-tbl--stack-sm > .aura-tbl__caption { padding-inline: var(--aura-space-4); }
1549
1607
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td[data-label]::before {
1550
1608
  content: attr(data-label); content: attr(data-label) / '';
1551
1609
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
@@ -1598,6 +1656,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1598
1656
  padding: 0; line-height: normal;
1599
1657
  }
1600
1658
  .aura-table__td[data-hide], .aura-table__head > .aura-table__th[data-hide] { display: block; }
1659
+ /* 5.13 (Chamber-OS 80): card: 'hide' leaves a column out of the card; cardOrder orders the fields. */
1660
+ .aura-table__td[data-card='hide'], .aura-table__head > .aura-table__th[data-card='hide'],
1661
+ .aura-table__row--skeleton .aura-table__td[data-card='hide'] { display: none; }
1662
+ .aura-table__td[data-card='field'] { order: var(--aura-card-order, 5); }
1663
+ /* hideSelectionInCards: no row boxes, no select-all line. */
1664
+ .aura-table--cards-nosel .aura-table__row > .aura-table__sel { display: none; }
1665
+ .aura-table--cards-nosel .aura-table__head { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); }
1666
+ .aura-table--cards-nosel .aura-table__head > .aura-table__sel { display: none; }
1601
1667
  /* 5.11: rowHeight="auto" leaves cards as they are. */
1602
1668
  .aura-table__td--auto { display: block; white-space: nowrap; }
1603
1669
  .aura-table__td--auto .aura-table__cell > .aura-badge, .aura-table__td--auto .aura-table__cell > .aura-pill { margin: 0; }
@@ -1085,6 +1085,10 @@ a.aura-upload__name:focus-visible { outline: var(--aura-focus-ring-width) solid
1085
1085
  .aura-empty__title { margin: 0; font-size: 16px; line-height: 1.5; font-weight: 600; }
1086
1086
  .aura-empty__text { margin: 0; max-width: 44ch; font-size: 14px; line-height: 1.6; color: var(--aura-fg-secondary); }
1087
1087
  .aura-empty__action { margin-top: var(--aura-space-3); display: flex; gap: var(--aura-space-3); flex-wrap: wrap; justify-content: center; }
1088
+ /* 5.13 (Chamber-OS 82): tone="danger" — a load failure. */
1089
+ .aura-empty.is-danger { background: var(--aura-alert-danger-bg); border-radius: var(--aura-radius-lg); }
1090
+ .aura-empty.is-danger.is-bordered { border: 1px solid var(--aura-border-danger); }
1091
+ .aura-empty.is-danger .aura-empty__icon { background: var(--aura-bg-surface); color: var(--aura-fg-danger); }
1088
1092
 
1089
1093
  /* ---------- Pagination ---------- */
1090
1094
  .aura-pagination { display: flex; align-items: center; gap: var(--aura-space-1); font-family: var(--font-sans); font-size: 13px; }
@@ -1365,6 +1369,37 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1365
1369
  .aura-filterbar__search { flex-basis: 100%; max-width: none; }
1366
1370
  .aura-filterbar__spacer { display: none; }
1367
1371
  }
1372
+ /* 5.12 searchGrow: the search fills what the controls leave. */
1373
+ .aura-filterbar--grow .aura-filterbar__search { max-width: none; }
1374
+ .aura-filterbar--grow .aura-filterbar__search ~ .aura-filterbar__spacer { display: none; }
1375
+ /* Compact filters sit closer together than full fields. */
1376
+ .aura-filterbar__controls:has(> .aura-filterselect) { gap: var(--aura-space-2); }
1377
+
1378
+ /* 5.12 FilterSelect: a compact face — "Status All ▾" — as wide as its words, over Select's machinery and list. */
1379
+ .aura-filterselect { position: relative; display: inline-flex; width: fit-content; max-width: 100%; vertical-align: middle; font-family: var(--font-sans); }
1380
+ .aura-filterselect__face {
1381
+ box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--aura-space-1); width: auto; max-width: 100%;
1382
+ min-height: var(--aura-input-height); padding-block: 0; padding-inline: var(--aura-space-2) var(--aura-space-1);
1383
+ background: var(--aura-bg-input); color: var(--aura-fg-primary);
1384
+ border: 1px solid var(--aura-border-control); border-radius: var(--aura-radius-md);
1385
+ font: inherit; font-size: 13px; line-height: 18px; text-align: start; cursor: pointer;
1386
+ transition: border-color var(--aura-duration-fast) var(--aura-ease);
1387
+ }
1388
+ .aura-filterselect__face:hover { border-color: var(--aura-fg-secondary); }
1389
+ .aura-filterselect__name { flex: none; white-space: nowrap; color: var(--aura-fg-secondary); }
1390
+ .aura-filterselect__value { min-width: 0; font-weight: 500; overflow-wrap: anywhere; }
1391
+ .aura-filterselect__chevron { flex: none; width: 14px; height: 14px; color: var(--aura-fg-secondary); }
1392
+ .aura-filterselect.is-open .aura-filterselect__chevron { transform: rotate(180deg); }
1393
+ .aura-filterselect__face:focus-visible, .aura-filterselect:has(.aura-filterselect__native:focus-visible) .aura-filterselect__face {
1394
+ outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 1px; border-color: var(--aura-border-strong);
1395
+ }
1396
+ .aura-filterselect__face:focus { outline-style: none; }
1397
+ .aura-filterselect__face:focus-visible { outline-style: solid; }
1398
+ /* Before hydration: the real <select>, invisible, over the face (16px so iOS doesn't zoom when it opens). */
1399
+ .aura-filterselect__native { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0; border: 0; opacity: 0; font-size: 16px; cursor: pointer; appearance: none; }
1400
+ .aura-filterselect.is-disabled .aura-filterselect__face { background: var(--aura-bg-input-disabled); color: var(--aura-fg-secondary); border-color: var(--aura-border-default); cursor: not-allowed; }
1401
+ .aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
1402
+ @media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
1368
1403
 
1369
1404
  /* Command palette: a search field over a grouped list, above everything else (it can open from a Dialog) */
1370
1405
  .aura-dialog-layer.aura-command-layer { z-index: var(--aura-z-menu); align-items: flex-start; padding: 12vh var(--aura-space-4) var(--aura-space-4); }
@@ -1519,6 +1554,13 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1519
1554
  .aura-tbl .is-numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
1520
1555
  .aura-tbl-wrap[data-density='compact'] .aura-tbl__th, .aura-tbl-wrap[data-density='compact'] .aura-tbl__td { padding-top: var(--aura-space-2); padding-bottom: var(--aura-space-2); }
1521
1556
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
1557
+ /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
1558
+ * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
1559
+ .aura-tbl--middle > .aura-tbl__body > .aura-tbl__row > *, .aura-tbl--middle > .aura-tbl__foot > .aura-tbl__row > * { vertical-align: middle; }
1560
+ .aura-tbl-wrap.is-flush { border: 0; border-radius: 0; background: transparent; }
1561
+ .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: 0; }
1562
+ .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: 0; }
1563
+ .aura-tbl-wrap.is-flush > .aura-tbl > .aura-tbl__caption { padding-inline: 0; }
1522
1564
  /* Stacked rows (5.8, Chamber-OS 67): below `stackBelow` (the table's own box: sm 640px, md 768px) each body row is a
1523
1565
  * card and each cell shows its column label. The column headers stay for screen readers (visually hidden) and the
1524
1566
  * table keeps explicit roles. The box is a size container, so it needs a width of its own. */
@@ -1533,6 +1575,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1533
1575
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1534
1576
  .aura-tbl--stack-md > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
1535
1577
  .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row > .aura-tbl__th { font-size: 14px; font-weight: 600; }
1578
+ /* 5.13 (Chamber-OS 84): a row with a title or action cell — title and action share the first line, fields two to a line under them. */
1579
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) { display: flex; flex-wrap: wrap; align-items: flex-start; column-gap: var(--aura-space-4); }
1580
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card])::after { content: ''; order: 3; flex: 0 0 100%; }
1581
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > * { order: 4; flex: 0 0 calc(50% - var(--aura-space-4) / 2); min-width: 0; margin-top: var(--aura-space-2); }
1582
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card] { margin-top: 0; }
1583
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='title'] { order: 1; flex: 1 1 0; font-size: 14px; font-weight: 600; }
1584
+ .aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='action'] { order: 2; flex: none; margin-inline-start: auto; }
1585
+ .aura-tbl-wrap.is-flush > .aura-tbl--stack-md > .aura-tbl__caption { padding-inline: var(--aura-space-4); }
1536
1586
  .aura-tbl--stack-md > * > .aura-tbl__row > .aura-tbl__td[data-label]::before {
1537
1587
  content: attr(data-label); content: attr(data-label) / '';
1538
1588
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
@@ -1548,6 +1598,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1548
1598
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { padding: 0; border-top: 0; background: none; text-align: start; white-space: normal; }
1549
1599
  .aura-tbl--stack-sm > * > .aura-tbl__row > * + * { margin-top: var(--aura-space-2); }
1550
1600
  .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row > .aura-tbl__th { font-size: 14px; font-weight: 600; }
1601
+ /* 5.13 (Chamber-OS 84): a row with a title or action cell — title and action share the first line, fields two to a line under them. */
1602
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) { display: flex; flex-wrap: wrap; align-items: flex-start; column-gap: var(--aura-space-4); }
1603
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card])::after { content: ''; order: 3; flex: 0 0 100%; }
1604
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > * { order: 4; flex: 0 0 calc(50% - var(--aura-space-4) / 2); min-width: 0; margin-top: var(--aura-space-2); }
1605
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card] { margin-top: 0; }
1606
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='title'] { order: 1; flex: 1 1 0; font-size: 14px; font-weight: 600; }
1607
+ .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row:has(> [data-card]) > [data-card='action'] { order: 2; flex: none; margin-inline-start: auto; }
1608
+ .aura-tbl-wrap.is-flush > .aura-tbl--stack-sm > .aura-tbl__caption { padding-inline: var(--aura-space-4); }
1551
1609
  .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td[data-label]::before {
1552
1610
  content: attr(data-label); content: attr(data-label) / '';
1553
1611
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
@@ -1600,6 +1658,14 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1600
1658
  padding: 0; line-height: normal;
1601
1659
  }
1602
1660
  .aura-table__td[data-hide], .aura-table__head > .aura-table__th[data-hide] { display: block; }
1661
+ /* 5.13 (Chamber-OS 80): card: 'hide' leaves a column out of the card; cardOrder orders the fields. */
1662
+ .aura-table__td[data-card='hide'], .aura-table__head > .aura-table__th[data-card='hide'],
1663
+ .aura-table__row--skeleton .aura-table__td[data-card='hide'] { display: none; }
1664
+ .aura-table__td[data-card='field'] { order: var(--aura-card-order, 5); }
1665
+ /* hideSelectionInCards: no row boxes, no select-all line. */
1666
+ .aura-table--cards-nosel .aura-table__row > .aura-table__sel { display: none; }
1667
+ .aura-table--cards-nosel .aura-table__head { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); }
1668
+ .aura-table--cards-nosel .aura-table__head > .aura-table__sel { display: none; }
1603
1669
  /* 5.11: rowHeight="auto" leaves cards as they are. */
1604
1670
  .aura-table__td--auto { display: block; white-space: nowrap; }
1605
1671
  .aura-table__td--auto .aura-table__cell > .aura-badge, .aura-table__td--auto .aura-table__cell > .aura-pill { margin: 0; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jirawatpyk/aura-react",
3
- "version": "5.11.0",
3
+ "version": "5.13.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",