@jirawatpyk/aura-react 5.24.0 → 5.26.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
@@ -236,6 +236,14 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
236
236
  density?: "comfortable" | "compact" | undefined;
237
237
  /** Table width in px below which rows render as stacked cards (phones). Try 640. It follows the table's own width, not the window. Since 4.20 the cards are the same markup as the grid, laid out by a container query, so any width is right before hydration and each row is in the HTML once. With `height` (virtual rows) the server can only send the first screenful; the rest of the cards arrive on hydration. */
238
238
  stackBelow?: number | undefined;
239
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
240
+ * card's full inner width — no side borders, no radius — keeping its header band and top rule; as the card's last
241
+ * content (no footer, nothing after it) it drops its bottom rule and the card's radius closes it. Below the Card's
242
+ * `flushBelow` width, and outside a Card, it does nothing. */
243
+ bleed?: boolean | undefined;
244
+ /** `false` drops the frame — border and radius — keeping the header band and the 24px gutter, for a table that sits
245
+ * in a section without bleeding (5.26). Default `true`. */
246
+ bordered?: boolean | undefined;
239
247
  className?: string | undefined;
240
248
  }
241
249
  /** An AURA icon name, or any icon element (e.g. `<Building />` from lucide-react). AURA sizes it and hides it from screen readers. */
@@ -300,7 +308,9 @@ export interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInpu
300
308
  hideLabel?: boolean | undefined;
301
309
  /** The visible label beside the box. */
302
310
  children?: React$1.ReactNode | undefined;
303
- /** Second line under the visible label, linked by `aria-describedby` after any id you pass there (5.11). */
311
+ /** Second line under the visible label, linked by `aria-describedby` after any id you pass there (5.11). Since 5.26
312
+ * it is not part of the name: the box is named by the visible label alone, or by your `aria-label` /
313
+ * `aria-labelledby` (Chamber-OS 125). */
304
314
  description?: React$1.ReactNode | undefined;
305
315
  onChange?: ((checked: boolean) => void) | undefined;
306
316
  disabled?: boolean | undefined;
@@ -468,6 +478,7 @@ export interface CommandItem {
468
478
  /** Items with the same group are listed together under its heading, in first-seen order. */
469
479
  group?: string | undefined;
470
480
  icon?: IconInput | undefined;
481
+ /** A second line; read after the item's name (label and shortcut), not as part of it (5.26). */
471
482
  description?: string | undefined;
472
483
  /** Extra words that find it ("invoice" → Billing). */
473
484
  keywords?: string[] | undefined;
@@ -542,6 +553,8 @@ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTM
542
553
  * readers keep the option's own text. */
543
554
  allLabel?: string | undefined;
544
555
  }
556
+ /** A RadioGroup option. `description` is a second line under the label; since 5.26 the radio is named by `label`
557
+ * alone and the description is read after it (`aria-describedby`), also when the option is disabled (Chamber-OS 125). */
545
558
  export type ChoiceOption = string | {
546
559
  value: string;
547
560
  label: string;
@@ -841,7 +854,7 @@ export interface DropdownMenuProps {
841
854
  export interface ComboboxOption {
842
855
  value: string;
843
856
  label: string;
844
- /** Second line in the list; also searched. */
857
+ /** Second line in the list; also searched. Read after the option's name, not as part of it (5.26). */
845
858
  description?: string | undefined;
846
859
  /** Extra search terms (English name, phone, code…). */
847
860
  keywords?: string[] | undefined;
@@ -1035,6 +1048,39 @@ export interface DateRange {
1035
1048
  start: ISODate | null;
1036
1049
  end: ISODate | null;
1037
1050
  }
1051
+ /** A FilterDateRange preset: a name and the range it sets (5.26). */
1052
+ export interface DateRangePreset {
1053
+ label: string;
1054
+ range: DateRange;
1055
+ }
1056
+ /** A compact date-range filter for FilterBar (5.26, Chamber-OS 128): "Submitted Any time ▾", one click to the range
1057
+ * calendar. Dates as DateRangePicker: `locale` / `calendar` from the provider (Thai shows Buddhist-era years), `min`,
1058
+ * `max`, `timeZone`, `weekStartsOn`. */
1059
+ export interface FilterDateRangeProps extends DateDisplayOptions, Pick<React$1.HTMLAttributes<HTMLButtonElement>, "style">, React$1.AriaAttributes, DataAttributes {
1060
+ /** The filter's name: first on the face ("Submitted"), the popover's name, and the start of the face's accessible
1061
+ * name ("Submitted: Any time"). */
1062
+ label: string;
1063
+ value?: DateRange | undefined;
1064
+ defaultValue?: DateRange | undefined;
1065
+ /** Runs once a range is complete, a preset is picked, or "Any time" clears it — never on a lone start day, and
1066
+ * not when the same range is picked again. There is no form field: write the range to the URL or state here. */
1067
+ onChange?: ((value: DateRange) => void) | undefined;
1068
+ /** Choices beside the calendar (Last 7 days, This month…), each setting a whole range; one that reaches past
1069
+ * `min` / `max` or onto an `isDateDisabled` day is shown disabled. */
1070
+ presets?: DateRangePreset[] | undefined;
1071
+ /** The empty value and the choice that clears it. Default "Any time" in the date locale. */
1072
+ anyLabel?: string | undefined;
1073
+ min?: ISODate | "today" | undefined;
1074
+ max?: ISODate | "today" | undefined;
1075
+ isDateDisabled?: ((iso: ISODate) => boolean) | undefined;
1076
+ weekStartsOn?: 0 | 1 | undefined;
1077
+ timeZone?: string | undefined;
1078
+ /** Today, given outright (ISO); wins over `timeZone`. */
1079
+ today?: ISODate | undefined;
1080
+ disabled?: boolean | undefined;
1081
+ id?: string | undefined;
1082
+ className?: string | undefined;
1083
+ }
1038
1084
  export interface DateRangePickerProps extends DateFieldProps {
1039
1085
  value?: DateRange | undefined;
1040
1086
  defaultValue?: DateRange | undefined;
@@ -1149,6 +1195,22 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1149
1195
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1150
1196
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1151
1197
  bordered?: boolean | undefined;
1198
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
1199
+ * card's full inner width — no side borders, no radius — keeping its header band and top rule, and its outer
1200
+ * cells' 24px padding keeps the text level with the card's content. As the card's last content it drops its
1201
+ * bottom rule and the card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does
1202
+ * nothing. With `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
+ bleed?: boolean | undefined;
1204
+ /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
+ * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
+ * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
1207
+ * scrolls sideways instead and its header can't pin to the page then: give it `maxHeight`. Inside your own scroll
1208
+ * container within an AppShell set `--aura-table-sticky-top: 0px` or use `maxHeight`. With `maxHeight` the box
1209
+ * scrolls both ways and the header pins to its top. One header row. Stacked rows (`stackBelow`) have no visible header, so it
1210
+ * does nothing there. Default off. */
1211
+ stickyHeader?: boolean | undefined;
1212
+ /** Caps the table's box (px, or any CSS length such as `60vh`); the rows scroll inside it. (5.26) */
1213
+ maxHeight?: number | string | undefined;
1152
1214
  /** How stacked rows look (5.15, Chamber-OS 85): `list` (default) — one frame, rows divided by rules; `cards` —
1153
1215
  * each row its own framed card, spaced like DataTable's cards, with no frame around them. From the `stackBelow`
1154
1216
  * width up the table is unchanged. The table then sits in one more `div` (`.aura-tbl-cards`). */
@@ -1350,6 +1412,10 @@ export interface TagProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onC
1350
1412
  selected?: boolean | undefined;
1351
1413
  onClick?: ((e: React$1.MouseEvent<HTMLButtonElement>) => void) | undefined;
1352
1414
  disabled?: boolean | undefined;
1415
+ /** A toggle chip (`selected` / `onClick`) at least 44px tall below 640px or wherever the primary pointer is coarse
1416
+ * — filter chips tapped with a finger (5.25, Chamber-OS 124); with a mouse from 640px up it keeps 32px, as Button's
1417
+ * `touchHeight`. A plain or removable Tag ignores it. */
1418
+ touchHeight?: boolean | undefined;
1353
1419
  }
1354
1420
  export interface ProgressProps {
1355
1421
  /** Omit for indeterminate. */
@@ -1417,6 +1483,7 @@ export interface PaginationProps {
1417
1483
  export interface AccordionItem {
1418
1484
  id: string;
1419
1485
  title: React$1.ReactNode;
1486
+ /** A second line under the title; read as the header button's description, not its name (5.26). */
1420
1487
  description?: React$1.ReactNode | undefined;
1421
1488
  content: React$1.ReactNode;
1422
1489
  icon?: IconInput | undefined;
@@ -1544,6 +1611,10 @@ export declare const Select: React$1.ForwardRefExoticComponent<SelectProps & Rea
1544
1611
  /** A compact filter for FilterBar (5.12): a small button reading "Status All ▾" that opens Select's list. The name
1545
1612
  * is the accessible name, the chosen option its value; forms, refs and the keyboard work as in Select. */
1546
1613
  export declare const FilterSelect: React$1.ForwardRefExoticComponent<FilterSelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1614
+ /** A compact date-range filter for FilterBar (5.26, Chamber-OS 128): a face like FilterSelect's — "Submitted Any
1615
+ * time ▾" — that opens the range calendar, with optional presets, in one click. `onChange` runs once a range is
1616
+ * complete, a preset is picked or the range is cleared; never on a lone start day. */
1617
+ export declare const FilterDateRange: React$1.ForwardRefExoticComponent<FilterDateRangeProps & React$1.RefAttributes<HTMLButtonElement>>;
1547
1618
  export declare const RadioGroup: React$1.ForwardRefExoticComponent<RadioGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
1548
1619
  export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.RefAttributes<HTMLButtonElement>>;
1549
1620
  /** One value, or with `multiple` any number (chips). Two call signatures so value/onChange are typed for each. */
@@ -1640,11 +1711,17 @@ export declare const Avatar: React$1.ForwardRefExoticComponent<AvatarProps & Rea
1640
1711
  export declare const Stack: React$1.ForwardRefExoticComponent<StackProps & React$1.RefAttributes<HTMLElement>>;
1641
1712
  /** Grid — equal columns. columns may be responsive ({ base: 1, md: 2, lg: 3 }), or use minItemWidth to fit as many as fit. */
1642
1713
  export declare const Grid: React$1.ForwardRefExoticComponent<GridProps & React$1.RefAttributes<HTMLElement>>;
1643
- /** Centred page column. */
1644
- export interface ContainerProps {
1714
+ /** Centred page column. To name it (`aria-label`), render a landmark with `as="section"` (or `main`, `nav`): a
1715
+ * plain `div` may not carry a name. */
1716
+ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
1645
1717
  /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
1646
1718
  size?: "default" | "narrow" | undefined;
1719
+ /** `start` puts the column at the start edge (left; right in RTL) instead of centring it — a form board beside
1720
+ * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
+ align?: "center" | "start" | undefined;
1647
1722
  as?: keyof React$1.JSX.IntrinsicElements | undefined;
1723
+ /** Utilities that set `max-width` or `margin` (e.g. `max-w-[672px] mx-0`) are supported with `styles.layer.css`,
1724
+ * where a utility beats `.aura-container` (5.26). */
1648
1725
  className?: string | undefined;
1649
1726
  style?: React$1.CSSProperties | undefined;
1650
1727
  children?: React$1.ReactNode | undefined;
package/dist/index.d.ts CHANGED
@@ -236,6 +236,14 @@ export interface DataTableProps<Row extends Record<string, any> = Record<string,
236
236
  density?: "comfortable" | "compact" | undefined;
237
237
  /** Table width in px below which rows render as stacked cards (phones). Try 640. It follows the table's own width, not the window. Since 4.20 the cards are the same markup as the grid, laid out by a container query, so any width is right before hydration and each row is in the HTML once. With `height` (virtual rows) the server can only send the first screenful; the rest of the cards arrive on hydration. */
238
238
  stackBelow?: number | undefined;
239
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
240
+ * card's full inner width — no side borders, no radius — keeping its header band and top rule; as the card's last
241
+ * content (no footer, nothing after it) it drops its bottom rule and the card's radius closes it. Below the Card's
242
+ * `flushBelow` width, and outside a Card, it does nothing. */
243
+ bleed?: boolean | undefined;
244
+ /** `false` drops the frame — border and radius — keeping the header band and the 24px gutter, for a table that sits
245
+ * in a section without bleeding (5.26). Default `true`. */
246
+ bordered?: boolean | undefined;
239
247
  className?: string | undefined;
240
248
  }
241
249
  /** An AURA icon name, or any icon element (e.g. `<Building />` from lucide-react). AURA sizes it and hides it from screen readers. */
@@ -300,7 +308,9 @@ export interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInpu
300
308
  hideLabel?: boolean | undefined;
301
309
  /** The visible label beside the box. */
302
310
  children?: React$1.ReactNode | undefined;
303
- /** Second line under the visible label, linked by `aria-describedby` after any id you pass there (5.11). */
311
+ /** Second line under the visible label, linked by `aria-describedby` after any id you pass there (5.11). Since 5.26
312
+ * it is not part of the name: the box is named by the visible label alone, or by your `aria-label` /
313
+ * `aria-labelledby` (Chamber-OS 125). */
304
314
  description?: React$1.ReactNode | undefined;
305
315
  onChange?: ((checked: boolean) => void) | undefined;
306
316
  disabled?: boolean | undefined;
@@ -468,6 +478,7 @@ export interface CommandItem {
468
478
  /** Items with the same group are listed together under its heading, in first-seen order. */
469
479
  group?: string | undefined;
470
480
  icon?: IconInput | undefined;
481
+ /** A second line; read after the item's name (label and shortcut), not as part of it (5.26). */
471
482
  description?: string | undefined;
472
483
  /** Extra words that find it ("invoice" → Billing). */
473
484
  keywords?: string[] | undefined;
@@ -542,6 +553,8 @@ export interface FilterSelectProps extends Omit<React$1.SelectHTMLAttributes<HTM
542
553
  * readers keep the option's own text. */
543
554
  allLabel?: string | undefined;
544
555
  }
556
+ /** A RadioGroup option. `description` is a second line under the label; since 5.26 the radio is named by `label`
557
+ * alone and the description is read after it (`aria-describedby`), also when the option is disabled (Chamber-OS 125). */
545
558
  export type ChoiceOption = string | {
546
559
  value: string;
547
560
  label: string;
@@ -841,7 +854,7 @@ export interface DropdownMenuProps {
841
854
  export interface ComboboxOption {
842
855
  value: string;
843
856
  label: string;
844
- /** Second line in the list; also searched. */
857
+ /** Second line in the list; also searched. Read after the option's name, not as part of it (5.26). */
845
858
  description?: string | undefined;
846
859
  /** Extra search terms (English name, phone, code…). */
847
860
  keywords?: string[] | undefined;
@@ -1035,6 +1048,39 @@ export interface DateRange {
1035
1048
  start: ISODate | null;
1036
1049
  end: ISODate | null;
1037
1050
  }
1051
+ /** A FilterDateRange preset: a name and the range it sets (5.26). */
1052
+ export interface DateRangePreset {
1053
+ label: string;
1054
+ range: DateRange;
1055
+ }
1056
+ /** A compact date-range filter for FilterBar (5.26, Chamber-OS 128): "Submitted Any time ▾", one click to the range
1057
+ * calendar. Dates as DateRangePicker: `locale` / `calendar` from the provider (Thai shows Buddhist-era years), `min`,
1058
+ * `max`, `timeZone`, `weekStartsOn`. */
1059
+ export interface FilterDateRangeProps extends DateDisplayOptions, Pick<React$1.HTMLAttributes<HTMLButtonElement>, "style">, React$1.AriaAttributes, DataAttributes {
1060
+ /** The filter's name: first on the face ("Submitted"), the popover's name, and the start of the face's accessible
1061
+ * name ("Submitted: Any time"). */
1062
+ label: string;
1063
+ value?: DateRange | undefined;
1064
+ defaultValue?: DateRange | undefined;
1065
+ /** Runs once a range is complete, a preset is picked, or "Any time" clears it — never on a lone start day, and
1066
+ * not when the same range is picked again. There is no form field: write the range to the URL or state here. */
1067
+ onChange?: ((value: DateRange) => void) | undefined;
1068
+ /** Choices beside the calendar (Last 7 days, This month…), each setting a whole range; one that reaches past
1069
+ * `min` / `max` or onto an `isDateDisabled` day is shown disabled. */
1070
+ presets?: DateRangePreset[] | undefined;
1071
+ /** The empty value and the choice that clears it. Default "Any time" in the date locale. */
1072
+ anyLabel?: string | undefined;
1073
+ min?: ISODate | "today" | undefined;
1074
+ max?: ISODate | "today" | undefined;
1075
+ isDateDisabled?: ((iso: ISODate) => boolean) | undefined;
1076
+ weekStartsOn?: 0 | 1 | undefined;
1077
+ timeZone?: string | undefined;
1078
+ /** Today, given outright (ISO); wins over `timeZone`. */
1079
+ today?: ISODate | undefined;
1080
+ disabled?: boolean | undefined;
1081
+ id?: string | undefined;
1082
+ className?: string | undefined;
1083
+ }
1038
1084
  export interface DateRangePickerProps extends DateFieldProps {
1039
1085
  value?: DateRange | undefined;
1040
1086
  defaultValue?: DateRange | undefined;
@@ -1149,6 +1195,22 @@ export interface TableProps extends Omit<React$1.TableHTMLAttributes<HTMLTableEl
1149
1195
  /** `false` (5.13) drops the frame — border, radius, background — and the outer cells' side padding, so the table
1150
1196
  * lines up with the content around it, e.g. flush inside a Card under its heading. Default `true`. */
1151
1197
  bordered?: boolean | undefined;
1198
+ /** Edge to edge inside a Card (5.26, Chamber-OS 127): as a direct child of a Card's content, the table spans the
1199
+ * card's full inner width — no side borders, no radius — keeping its header band and top rule, and its outer
1200
+ * cells' 24px padding keeps the text level with the card's content. As the card's last content it drops its
1201
+ * bottom rule and the card's radius closes it. Below the Card's `flushBelow` width, and outside a Card, it does
1202
+ * nothing. With `bordered={false}` too, the outer cells take the card's padding while it bleeds. */
1203
+ bleed?: boolean | undefined;
1204
+ /** Keep the header row in view while the rows scroll (5.26, Chamber-OS 129), with its band, its bottom rule and
1205
+ * above the body. Without `maxHeight` it pins to the page's scroll, under an AppShell's top bar
1206
+ * (`--aura-shell-bar-height`; set `--aura-table-sticky-top` for another offset). A table wider than its box
1207
+ * scrolls sideways instead and its header can't pin to the page then: give it `maxHeight`. Inside your own scroll
1208
+ * container within an AppShell set `--aura-table-sticky-top: 0px` or use `maxHeight`. With `maxHeight` the box
1209
+ * scrolls both ways and the header pins to its top. One header row. Stacked rows (`stackBelow`) have no visible header, so it
1210
+ * does nothing there. Default off. */
1211
+ stickyHeader?: boolean | undefined;
1212
+ /** Caps the table's box (px, or any CSS length such as `60vh`); the rows scroll inside it. (5.26) */
1213
+ maxHeight?: number | string | undefined;
1152
1214
  /** How stacked rows look (5.15, Chamber-OS 85): `list` (default) — one frame, rows divided by rules; `cards` —
1153
1215
  * each row its own framed card, spaced like DataTable's cards, with no frame around them. From the `stackBelow`
1154
1216
  * width up the table is unchanged. The table then sits in one more `div` (`.aura-tbl-cards`). */
@@ -1350,6 +1412,10 @@ export interface TagProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onC
1350
1412
  selected?: boolean | undefined;
1351
1413
  onClick?: ((e: React$1.MouseEvent<HTMLButtonElement>) => void) | undefined;
1352
1414
  disabled?: boolean | undefined;
1415
+ /** A toggle chip (`selected` / `onClick`) at least 44px tall below 640px or wherever the primary pointer is coarse
1416
+ * — filter chips tapped with a finger (5.25, Chamber-OS 124); with a mouse from 640px up it keeps 32px, as Button's
1417
+ * `touchHeight`. A plain or removable Tag ignores it. */
1418
+ touchHeight?: boolean | undefined;
1353
1419
  }
1354
1420
  export interface ProgressProps {
1355
1421
  /** Omit for indeterminate. */
@@ -1417,6 +1483,7 @@ export interface PaginationProps {
1417
1483
  export interface AccordionItem {
1418
1484
  id: string;
1419
1485
  title: React$1.ReactNode;
1486
+ /** A second line under the title; read as the header button's description, not its name (5.26). */
1420
1487
  description?: React$1.ReactNode | undefined;
1421
1488
  content: React$1.ReactNode;
1422
1489
  icon?: IconInput | undefined;
@@ -1544,6 +1611,10 @@ export declare const Select: React$1.ForwardRefExoticComponent<SelectProps & Rea
1544
1611
  /** A compact filter for FilterBar (5.12): a small button reading "Status All ▾" that opens Select's list. The name
1545
1612
  * is the accessible name, the chosen option its value; forms, refs and the keyboard work as in Select. */
1546
1613
  export declare const FilterSelect: React$1.ForwardRefExoticComponent<FilterSelectProps & React$1.RefAttributes<HTMLSelectElement>>;
1614
+ /** A compact date-range filter for FilterBar (5.26, Chamber-OS 128): a face like FilterSelect's — "Submitted Any
1615
+ * time ▾" — that opens the range calendar, with optional presets, in one click. `onChange` runs once a range is
1616
+ * complete, a preset is picked or the range is cleared; never on a lone start day. */
1617
+ export declare const FilterDateRange: React$1.ForwardRefExoticComponent<FilterDateRangeProps & React$1.RefAttributes<HTMLButtonElement>>;
1547
1618
  export declare const RadioGroup: React$1.ForwardRefExoticComponent<RadioGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
1548
1619
  export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & React$1.RefAttributes<HTMLButtonElement>>;
1549
1620
  /** One value, or with `multiple` any number (chips). Two call signatures so value/onChange are typed for each. */
@@ -1640,11 +1711,17 @@ export declare const Avatar: React$1.ForwardRefExoticComponent<AvatarProps & Rea
1640
1711
  export declare const Stack: React$1.ForwardRefExoticComponent<StackProps & React$1.RefAttributes<HTMLElement>>;
1641
1712
  /** Grid — equal columns. columns may be responsive ({ base: 1, md: 2, lg: 3 }), or use minItemWidth to fit as many as fit. */
1642
1713
  export declare const Grid: React$1.ForwardRefExoticComponent<GridProps & React$1.RefAttributes<HTMLElement>>;
1643
- /** Centred page column. */
1644
- export interface ContainerProps {
1714
+ /** Centred page column. To name it (`aria-label`), render a landmark with `as="section"` (or `main`, `nav`): a
1715
+ * plain `div` may not carry a name. */
1716
+ export interface ContainerProps extends Pick<React$1.HTMLAttributes<HTMLElement>, "id" | "lang" | "dir">, React$1.AriaAttributes, DataAttributes {
1645
1717
  /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
1646
1718
  size?: "default" | "narrow" | undefined;
1719
+ /** `start` puts the column at the start edge (left; right in RTL) instead of centring it — a form board beside
1720
+ * the page's start (5.26, Chamber-OS 126). Default `center`. */
1721
+ align?: "center" | "start" | undefined;
1647
1722
  as?: keyof React$1.JSX.IntrinsicElements | undefined;
1723
+ /** Utilities that set `max-width` or `margin` (e.g. `max-w-[672px] mx-0`) are supported with `styles.layer.css`,
1724
+ * where a utility beats `.aura-container` (5.26). */
1648
1725
  className?: string | undefined;
1649
1726
  style?: React$1.CSSProperties | undefined;
1650
1727
  children?: React$1.ReactNode | undefined;
package/dist/styles.css CHANGED
@@ -125,6 +125,7 @@ button.aura-btn--creative[aria-disabled='true']:hover { box-shadow: var(--aura-s
125
125
  .aura-table__row-link:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; border-radius: var(--aura-radius-xs); }
126
126
  /* Server mode refresh: the previous page stays, inactive, under a progress bar until the next one arrives */
127
127
  .aura-table.is-refreshing .aura-table__row { opacity: 0.6; pointer-events: none; }
128
+ .aura-table.aura-table--borderless { border: 0; border-radius: 0; } /* 5.26: bordered={false} */
128
129
  .aura-table__busy-bar {
129
130
  position: absolute; z-index: 6; top: calc(var(--aura-table-row-height) - 2px); left: 0; right: 0; height: 2px; overflow: hidden;
130
131
  border-radius: var(--aura-radius-full); pointer-events: none;
@@ -314,11 +315,12 @@ a.aura-icon-btn { text-decoration: none; }
314
315
  .aura-icon-btn:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: var(--aura-focus-ring-offset); }
315
316
  /* 5.15 (Chamber-OS 100): touchHeight — visibly 44px on phones, for buttons and icon buttons a phone design wants full size.
316
317
  * 5.24 (Chamber-OS 123): also wherever the primary pointer is coarse — a tablet at 768–1366px is a finger, not a mouse.
317
- * A mouse on a wide screen (pointer: fine) keeps the compact size. */
318
+ * A mouse on a wide screen (pointer: fine) keeps the compact size. 5.25 (Chamber-OS 124): toggle Tags too. */
318
319
  @media (max-width: 639.98px), (pointer: coarse) {
319
320
  .aura-btn.aura-btn--touch { height: var(--aura-touch-target); }
320
321
  .aura-btn.aura-btn--touch.aura-btn--full { height: auto; min-height: var(--aura-touch-target); }
321
322
  .aura-icon-btn.aura-icon-btn--touch { width: var(--aura-touch-target); height: var(--aura-touch-target); }
323
+ .aura-tag.aura-tag--touch { min-height: var(--aura-touch-target); }
322
324
  }
323
325
  /* Touch: same 32px look, a 44px hit area around it (WCAG 2.5.5). */
324
326
  @media (pointer: coarse) {
@@ -652,13 +654,33 @@ a.aura-icon-btn { text-decoration: none; }
652
654
  padding: var(--aura-card-padding); background: var(--aura-bg-surface); color: var(--aura-fg-primary);
653
655
  border: 1px solid var(--aura-border-default); border-radius: var(--aura-card-radius); box-shadow: var(--aura-shadow-enterprise);
654
656
  font-family: var(--font-sans); font-size: 14px;
657
+ --aura-card-bleed: var(--aura-card-padding); /* 5.26: how far a bleeding table reaches out; 0 where the card is flush */
655
658
  }
656
659
  .aura-card.is-interactive { cursor: pointer; transition: border-color var(--aura-duration-fast) var(--aura-ease); }
657
660
  .aura-card.is-interactive:hover { border-color: var(--aura-border-control); }
658
661
  /* 5.15 (Chamber-OS 93): frameless below a width — the rows inside become cards of their own. */
659
- @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; } }
660
- @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; } }
661
- @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; } }
662
+ @media (max-width: 639.98px) { .aura-card.aura-card--flush-below-sm, .aura-card.aura-card--flush-below-sm:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
663
+ @media (max-width: 767.98px) { .aura-card.aura-card--flush-below-md, .aura-card.aura-card--flush-below-md:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
664
+ @media (max-width: 1023.98px) { .aura-card.aura-card--flush-below-lg, .aura-card.aura-card--flush-below-lg:hover { border-color: transparent; background: transparent; box-shadow: none; --aura-card-bleed: 0px; } }
665
+ /* 5.26 (Chamber-OS 127): bleed — a table that is a direct child of a Card's content spans its inner width; the side
666
+ * borders and radius go (a 0px bleed — a flush card — keeps them: 1px - min(1px, 0) = 1px). As the card's last content
667
+ * it also drops its bottom rule and the card's radius closes it. */
668
+ /* Two classes deep so it beats a stackable Table's width: 100%. `* 1000` turns any bleed into a 0 radius; 0 keeps it. */
669
+ .aura-card .aura-card__body > .aura-bleed { margin-inline: calc(-1 * var(--aura-card-bleed)); width: auto; }
670
+ /* A Table with bordered={false} too: its outer cells take the bleed (0 where the card is flush, as before). */
671
+ .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child,
672
+ .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :first-child { padding-inline-start: var(--aura-card-bleed); }
673
+ .aura-card__body > .aura-bleed .aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child,
674
+ .aura-card__body > .aura-bleed.aura-tbl-wrap.is-flush > .aura-tbl > * > .aura-tbl__row > :last-child { padding-inline-end: var(--aura-card-bleed); }
675
+ .aura-card__body > .aura-bleed.aura-bleed-frame, .aura-card__body > .aura-bleed .aura-bleed-frame {
676
+ border-inline-width: calc(1px - min(1px, var(--aura-card-bleed))); border-radius: max(0px, var(--aura-card-radius) - var(--aura-card-bleed) * 1000);
677
+ }
678
+ .aura-card__body:last-child > .aura-bleed:last-child { margin-bottom: calc(-1 * var(--aura-card-bleed)); }
679
+ .aura-card__body:last-child > .aura-bleed:last-child.aura-bleed-frame, .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame {
680
+ border-bottom-width: calc(1px - min(1px, var(--aura-card-bleed)));
681
+ border-bottom-left-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
682
+ border-bottom-right-radius: calc(var(--aura-card-radius) - min(1px, var(--aura-card-bleed)));
683
+ }
662
684
  .aura-card--creative { border: 2px solid var(--aura-border-strong); box-shadow: var(--aura-card-shadow-creative); }
663
685
  .aura-card__head { display: flex; align-items: flex-start; gap: var(--aura-space-3); }
664
686
  .aura-card__heading { flex: 1; min-width: 0; }
@@ -959,6 +981,7 @@ a.aura-tab { text-decoration: none; }
959
981
  }
960
982
  .aura-container { box-sizing: border-box; width: 100%; max-width: var(--aura-container-max); margin: 0 auto; padding: 0 var(--aura-space-4); }
961
983
  .aura-container.is-narrow { max-width: var(--aura-container-narrow); }
984
+ .aura-container.is-start { margin-inline: 0; } /* 5.26 (Chamber-OS 126): align="start" */
962
985
  /* Breakpoints: sm 640 · md 768 · lg 1024 · xl 1280 (aura-bp-* tokens; media queries can't read variables) */
963
986
  @media (min-width: 640px) {
964
987
  .aura-stack { flex-direction: var(--aura-stack-dir-sm, var(--aura-stack-dir-base, column)); align-items: var(--aura-stack-align-sm, stretch); gap: var(--aura-stack-gap-sm, var(--aura-stack-gap-base, var(--aura-space-4))); }
@@ -1411,7 +1434,7 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1411
1434
  .aura-toaster { left: var(--aura-space-4); right: var(--aura-space-4); bottom: var(--aura-space-4); width: auto; }
1412
1435
  .aura-toaster.is-center { left: var(--aura-space-4); right: var(--aura-space-4); transform: none; }
1413
1436
  .aura-toaster.is-top { top: calc(var(--aura-toaster-offset, var(--aura-space-4)) + env(safe-area-inset-top, 0px)); }
1414
- .aura-card { padding: var(--aura-space-4); }
1437
+ .aura-card { padding: var(--aura-space-4); --aura-card-bleed: var(--aura-space-4); }
1415
1438
  .aura-stat { padding: var(--aura-space-4); }
1416
1439
  .aura-stat__value { font-size: 24px; }
1417
1440
  .aura-tabs__list { gap: var(--aura-space-4); }
@@ -1530,6 +1553,16 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1530
1553
  .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; }
1531
1554
  .aura-filterselect.is-disabled .aura-filterselect__native { cursor: not-allowed; }
1532
1555
  @media (forced-colors: active) { .aura-filterselect__face { border-color: ButtonText; } }
1556
+ /* 5.26 (Chamber-OS 128) FilterDateRange: presets beside the range calendar; above it on phones. */
1557
+ .aura-filterdate__pop { display: flex; gap: var(--aura-space-3); overflow-y: auto; }
1558
+ .aura-filterdate__presets { display: flex; flex-direction: column; gap: 2px; min-width: 8rem; padding-inline-end: var(--aura-space-3); border-inline-end: 1px solid var(--aura-border-subtle); }
1559
+ .aura-filterdate__preset { justify-content: flex-start; }
1560
+ .aura-filterdate__preset.is-selected { background: var(--aura-bg-selected); }
1561
+ @media (forced-colors: active) { .aura-filterdate__preset.is-selected { outline: 2px solid Highlight; outline-offset: -2px; } }
1562
+ @media (max-width: 639.98px) {
1563
+ .aura-filterdate__pop { flex-direction: column; }
1564
+ .aura-filterdate__presets { flex-direction: row; flex-wrap: wrap; min-width: 0; padding: 0 0 var(--aura-space-2); border: 0; border-bottom: 1px solid var(--aura-border-subtle); }
1565
+ }
1533
1566
 
1534
1567
  /* Command palette: a search field over a grouped list, above everything else (it can open from a Dialog) */
1535
1568
  .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); }
@@ -1697,6 +1730,22 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1697
1730
  .aura-tbl .is-end { text-align: right; }
1698
1731
  .aura-tbl .is-center { text-align: center; }
1699
1732
  .aura-tbl .is-numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
1733
+ /* 5.26 (Chamber-OS 129) stickyHeader. To the page: the box must not be a scroll container, so it clips sideways
1734
+ * instead (nothing overflows while it fits; JavaScript marks a table that doesn't, which scrolls as before). In a
1735
+ * maxHeight box: the box scrolls both ways and the header pins to its top. The rule under the band moves with it. */
1736
+ .aura-tbl-wrap.is-sticky-page:not(.is-wide) { overflow-x: clip; }
1737
+ .aura-tbl-wrap.has-max, .aura-tbl-cards > .aura-tbl-wrap.has-max { overflow: auto; box-sizing: border-box; }
1738
+ .aura-tbl-wrap.is-sticky-page > .aura-tbl > .aura-tbl__head .aura-tbl__th, .aura-tbl-wrap.is-sticky-box > .aura-tbl > .aura-tbl__head .aura-tbl__th {
1739
+ position: sticky; top: var(--aura-table-sticky-top, var(--aura-shell-bar-height, 0px)); z-index: 2;
1740
+ border-bottom-width: 0; box-shadow: inset 0 -1px 0 var(--aura-border-default); /* one rule, at rest and pinned */
1741
+ }
1742
+ /* Forced colours drop the shadow; a pseudo-element line moves with the pinned cell (a collapsed border doesn't). */
1743
+ @media (forced-colors: active) {
1744
+ .aura-tbl-wrap.is-sticky-page > .aura-tbl > .aura-tbl__head .aura-tbl__th::after, .aura-tbl-wrap.is-sticky-box > .aura-tbl > .aura-tbl__head .aura-tbl__th::after {
1745
+ content: ''; position: absolute; inset: auto 0 0 0; border-bottom: 1px solid CanvasText;
1746
+ }
1747
+ }
1748
+ .aura-tbl-wrap.is-sticky-box > .aura-tbl > .aura-tbl__head .aura-tbl__th { top: 0; }
1700
1749
  .aura-tbl-wrap:focus-visible { outline: var(--aura-focus-ring-width) solid var(--aura-focus-ring); outline-offset: 2px; }
1701
1750
  /* 5.13 (Chamber-OS 81): align="middle" centres body and footer cells on their row; bordered={false} drops the frame and
1702
1751
  * the outer cells' side padding, so the table lines up with what's around it (a Card's heading). */
@@ -1738,6 +1787,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1738
1787
  content: attr(data-label); content: attr(data-label) / '';
1739
1788
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1740
1789
  }
1790
+ /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1791
+ .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-md:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1741
1792
  }
1742
1793
  @container aura-tbl (width < 640px) {
1743
1794
  .aura-tbl--stack-sm, .aura-tbl--stack-sm > .aura-tbl__body, .aura-tbl--stack-sm > .aura-tbl__foot, .aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__th, .aura-tbl--stack-sm > * > .aura-tbl__row > .aura-tbl__td { display: block; }
@@ -1760,6 +1811,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1760
1811
  content: attr(data-label); content: attr(data-label) / '';
1761
1812
  display: block; margin-bottom: 2px; font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; color: var(--aura-fg-secondary);
1762
1813
  }
1814
+ /* 5.26: a bleeding list keeps its rows' text level with the Card's content (16px where it doesn't bleed). */
1815
+ .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--stack-sm:not(.aura-tbl--cards) > * > .aura-tbl__row { padding-inline: max(var(--aura-card-bleed), var(--aura-space-4) - var(--aura-card-bleed) * 1000); }
1763
1816
  }
1764
1817
 
1765
1818
  /* 5.15 (Chamber-OS 85): stackStyle="cards" — each stacked row its own card (DataTable's card spacing), no outer frame.
@@ -1767,6 +1820,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1767
1820
  .aura-tbl-cards { container: aura-tbl / inline-size; width: 100%; }
1768
1821
  @container aura-tbl (width < 768px) {
1769
1822
  .aura-tbl-cards--md > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1823
+ .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-inline: var(--aura-card-bleed); }
1824
+ .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-md { padding-bottom: var(--aura-card-bleed); }
1770
1825
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1771
1826
  .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-md > .aura-tbl__foot > .aura-tbl__row {
1772
1827
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1778,6 +1833,8 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1778
1833
  }
1779
1834
  @container aura-tbl (width < 640px) {
1780
1835
  .aura-tbl-cards--sm > .aura-tbl-wrap { border: 0; border-radius: 0; background: transparent; overflow: visible; }
1836
+ .aura-card__body > .aura-bleed.aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm, .aura-card__body > .aura-bleed > .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-inline: var(--aura-card-bleed); }
1837
+ .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame > .aura-tbl--cards.aura-tbl--stack-sm { padding-bottom: var(--aura-card-bleed); }
1781
1838
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__caption { padding: 0 0 var(--aura-space-3); }
1782
1839
  .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__body > .aura-tbl__row, .aura-tbl--cards.aura-tbl--stack-sm > .aura-tbl__foot > .aura-tbl__row {
1783
1840
  margin-bottom: var(--aura-space-2); padding: var(--aura-tbl-card-py, var(--aura-space-4)) var(--aura-space-4);
@@ -1807,6 +1864,9 @@ button.aura-stepper__step:hover .aura-stepper__label { text-decoration: underlin
1807
1864
  * screen readers; the labels are generated content with empty alt text, so they aren't read twice. */
1808
1865
  @container aura-stack (width < 9999.5px) {
1809
1866
  .aura-table { background: transparent; border: 0; border-radius: 0; overflow: visible; }
1867
+ /* 5.26: stacked cards inside a framed Card keep its padding (0 where the Card is flush). */
1868
+ .aura-card__body > .aura-bleed .aura-bleed-frame { padding-inline: var(--aura-card-bleed); }
1869
+ .aura-card__body:last-child > .aura-bleed:last-child .aura-bleed-frame { padding-bottom: var(--aura-card-bleed); }
1810
1870
  .aura-table__scroll { overflow: visible; height: auto; }
1811
1871
  .aura-table__busy-bar { top: 0; }
1812
1872
  .aura-table__picker { display: none; }