@jirawatpyk/aura-react 4.14.0 → 4.16.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.ts CHANGED
@@ -1,39 +1,45 @@
1
1
  import * as React$1 from 'react';
2
2
 
3
3
  /** Button look. */
4
- export type ButtonVariant = "primary" | "secondary" | "creative" | "danger" | "danger-secondary";
4
+ export type ButtonVariant = "primary" | "secondary" | "ghost" | "creative" | "danger" | "danger-secondary";
5
+ /** `md` 44px (default) · `sm` 32px for toolbars, table rows and card footers (still a 44px hit area on touch screens). */
6
+ export type ButtonSize = "sm" | "md";
5
7
  /** AURA pill button. Enterprise (`primary`, `secondary`) for product UI; `creative` for marketing moments only. */
6
8
  export interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
7
- /** Visual variant. Default `primary`. `danger` (filled) and `danger-secondary` (outline) are for irreversible or destructive actions only — typically the confirm button of a `Dialog role="alertdialog"`. */
8
- variant?: ButtonVariant;
9
+ /** Visual variant. Default `primary`. `ghost` has no fill or edge until hover (toolbars, rows, secondary actions beside a primary). `danger` (filled) and `danger-secondary` (outline) are for irreversible or destructive actions only — typically the confirm button of a `Dialog role="alertdialog"`. */
10
+ variant?: ButtonVariant | undefined;
9
11
  /** Label text — short, Title Case English or Thai. */
10
12
  children: React$1.ReactNode;
11
13
  /** Leading icon name (see `IconName`). Hidden while loading. */
12
- icon?: IconInput;
14
+ icon?: IconInput | undefined;
13
15
  /** Trailing icon name, e.g. `arrow-right` for forward actions. */
14
- iconRight?: IconInput;
16
+ iconRight?: IconInput | undefined;
15
17
  /** Shows a spinner in place of the leading icon, sets aria-busy and swallows clicks. Keeps the label and width. */
16
- loading?: boolean;
18
+ loading?: boolean | undefined;
17
19
  /** Fills its container and lets a long label wrap onto more lines (at least 44px tall) — phones, Thai and Swedish labels. */
18
- fullWidth?: boolean;
20
+ fullWidth?: boolean | undefined;
21
+ /** `sm` is 32px with tighter padding, for toolbars, table rows and card footers. Default `md` (44px). */
22
+ size?: ButtonSize | undefined;
19
23
  }
20
24
  /** A link that looks like a Button: give `Button` an `href` and it renders an `<a>` (navigation, not actions). */
21
25
  export interface ButtonLinkProps extends Omit<React$1.AnchorHTMLAttributes<HTMLAnchorElement>, "children"> {
22
26
  /** Where the link goes. With `href`, Button renders an `<a>` and its ref is the `<a>`. */
23
27
  href: string;
24
- /** Visual variant. Default `primary`. `danger` (filled) and `danger-secondary` (outline) are for irreversible or destructive actions only — typically the confirm button of a `Dialog role="alertdialog"`. */
25
- variant?: ButtonVariant;
28
+ /** Visual variant. Default `primary`. `ghost` has no fill or edge until hover (toolbars, rows, secondary actions beside a primary). `danger` (filled) and `danger-secondary` (outline) are for irreversible or destructive actions only — typically the confirm button of a `Dialog role="alertdialog"`. */
29
+ variant?: ButtonVariant | undefined;
26
30
  /** Label text — say where it goes ("View Orders"), not "Click here". */
27
31
  children: React$1.ReactNode;
28
- icon?: IconInput;
32
+ icon?: IconInput | undefined;
29
33
  /** Trailing icon, e.g. `arrow-right`, or `external-link` with `target="_blank"`. */
30
- iconRight?: IconInput;
34
+ iconRight?: IconInput | undefined;
31
35
  /** Looks unavailable and can't be followed: no href, `aria-disabled`, out of the Tab order. */
32
- disabled?: boolean;
36
+ disabled?: boolean | undefined;
33
37
  /** Fills its container and lets a long label wrap (at least 44px tall). */
34
- fullWidth?: boolean;
38
+ fullWidth?: boolean | undefined;
39
+ /** `sm` is 32px with tighter padding. Default `md` (44px). */
40
+ size?: ButtonSize | undefined;
35
41
  /** A router's link to render instead of `<a>`, e.g. `Link` from `next/link` (client-side navigation). It gets `href`, `className`, the children and the ref. */
36
- linkComponent?: React$1.ElementType;
42
+ linkComponent?: React$1.ElementType | undefined;
37
43
  }
38
44
  export interface DataTableColumn {
39
45
  /** Key into each row object. */
@@ -41,34 +47,34 @@ export interface DataTableColumn {
41
47
  /** Header label (source style: UPPERCASE). */
42
48
  label: string;
43
49
  /** Fixed width in px; the last column usually takes the rest. */
44
- width?: number;
50
+ width?: number | undefined;
45
51
  /** Render the cell in the mono face (IDs). */
46
- mono?: boolean;
52
+ mono?: boolean | undefined;
47
53
  /** Render the value as a StatusPill (tone picked from the word). */
48
- pill?: boolean;
54
+ pill?: boolean | undefined;
49
55
  /** Override the tone for specific values, e.g. `{ 'QA': 'progress' }`. */
50
- tones?: Record<string, StatusTone>;
56
+ tones?: Record<string, StatusTone> | undefined;
51
57
  /** Header becomes a button cycling asc → desc → unsorted. */
52
- sortable?: boolean;
58
+ sortable?: boolean | undefined;
53
59
  /** Value to sort by, when not the cell value (dates, amounts). */
54
- sortValue?: (row: Record<string, any>) => string | number | null;
60
+ sortValue?: ((row: Record<string, any>) => string | number | null) | undefined;
55
61
  /** Custom cell content. */
56
- render?: (row: Record<string, any>) => React$1.ReactNode;
62
+ render?: ((row: Record<string, any>) => React$1.ReactNode) | undefined;
57
63
  /** Set false to keep a sized column fixed when the table is `resizable`. */
58
- resizable?: boolean;
64
+ resizable?: boolean | undefined;
59
65
  /** Resize limits in px. Defaults 64 / 480. For the flexible column, minWidth defaults to 160. */
60
- minWidth?: number;
61
- maxWidth?: number;
66
+ minWidth?: number | undefined;
67
+ maxWidth?: number | undefined;
62
68
  /** Start pinned to the left (needs a width). */
63
- pinned?: boolean;
69
+ pinned?: boolean | undefined;
64
70
  /** Start hidden (show it from the columns button). */
65
- hidden?: boolean;
71
+ hidden?: boolean | undefined;
66
72
  /** Hide this column when the table is narrower than this (px, or a breakpoint name). For tablets: keep ID, name, date and status; drop the rest below `lg`. Not applied to stacked cards. */
67
- hideBelow?: number | "sm" | "md" | "lg" | "xl";
73
+ hideBelow?: number | "sm" | "md" | "lg" | "xl" | undefined;
68
74
  /** Row actions (a DropdownMenu or IconButton). In stacked cards it sits top-right instead of in the field list. Give it an empty label. */
69
- actions?: boolean;
75
+ actions?: boolean | undefined;
70
76
  /** `end` right-aligns header and cells (amounts, counts) and uses tabular figures. Default `start`. */
71
- align?: "start" | "end";
77
+ align?: "start" | "end" | undefined;
72
78
  }
73
79
  export interface DataTableSort {
74
80
  key: string;
@@ -76,121 +82,121 @@ export interface DataTableSort {
76
82
  }
77
83
  export interface DataTableEmpty {
78
84
  /** Default `inbox`; use `search` for "no matches". */
79
- icon?: IconInput;
85
+ icon?: IconInput | undefined;
80
86
  /** Default "Nothing here yet". */
81
- title?: string;
82
- description?: string;
87
+ title?: string | undefined;
88
+ description?: string | undefined;
83
89
  /** One action, usually a secondary Button. */
84
- action?: React$1.ReactNode;
90
+ action?: React$1.ReactNode | undefined;
85
91
  }
86
92
  /** Enterprise data table: 48px rows, hairline dividers, mono header band. */
87
93
  export interface DataTableProps {
88
94
  /** Defaults to ID · NAME · STATUS · OWNER (96 / 160 / 112 / auto px). */
89
- columns?: DataTableColumn[];
95
+ columns?: DataTableColumn[] | undefined;
90
96
  rows: Array<Record<string, React$1.ReactNode>>;
91
97
  /** Column key giving each row a unique React key. Default: the first column's key. */
92
- rowKey?: string;
98
+ rowKey?: string | undefined;
93
99
  /** Accessible name for the table. */
94
- label?: string;
100
+ label?: string | undefined;
95
101
  /** Controlled sort; pair with onSortChange. */
96
- sort?: DataTableSort | null;
102
+ sort?: DataTableSort | null | undefined;
97
103
  /** Initial sort when uncontrolled. */
98
- defaultSort?: DataTableSort | null;
99
- onSortChange?: (sort: DataTableSort | null) => void;
104
+ defaultSort?: DataTableSort | null | undefined;
105
+ onSortChange?: ((sort: DataTableSort | null) => void) | undefined;
100
106
  /** Adds a checkbox column. */
101
- selectable?: boolean;
107
+ selectable?: boolean | undefined;
102
108
  /** Controlled selection (row keys); pair with onSelectionChange. */
103
- selected?: Array<string | number>;
109
+ selected?: Array<string | number> | undefined;
104
110
  /** Initial selection when uncontrolled. */
105
- defaultSelected?: Array<string | number>;
106
- onSelectionChange?: (keys: Array<string | number>) => void;
111
+ defaultSelected?: Array<string | number> | undefined;
112
+ onSelectionChange?: ((keys: Array<string | number>) => void) | undefined;
107
113
  /** Shown when rows is empty. */
108
- empty?: DataTableEmpty;
114
+ empty?: DataTableEmpty | undefined;
109
115
  /** Rows per page; omit for no pagination. */
110
- pageSize?: number;
116
+ pageSize?: number | undefined;
111
117
  /** Controlled page (1-based); pair with onPageChange. */
112
- page?: number;
118
+ page?: number | undefined;
113
119
  /** Initial page when uncontrolled. Default 1. */
114
- defaultPage?: number;
115
- onPageChange?: (page: number) => void;
120
+ defaultPage?: number | undefined;
121
+ onPageChange?: ((page: number) => void) | undefined;
116
122
  /** Adds drag/keyboard resize handles to every column that has a width. */
117
- resizable?: boolean;
118
- onColumnResize?: (key: string, width: number) => void;
123
+ resizable?: boolean | undefined;
124
+ onColumnResize?: ((key: string, width: number) => void) | undefined;
119
125
  /** Shows skeleton rows and disables sorting, select-all and paging. With `manual` and rows already shown, the rows stay (dimmed, with a progress bar) while the next page loads. */
120
- loading?: boolean;
126
+ loading?: boolean | undefined;
121
127
  /** Server mode: `rows` is already the current page, sorted by the server. The table doesn't sort or slice; it reports
122
128
  * sort and page through onSortChange / onPageChange (or getPageHref links). Pair with `totalRows` and `pageSize`. */
123
- manual?: boolean;
129
+ manual?: boolean | undefined;
124
130
  /** manual: rows across all pages (drives the page count, "1–25 of 312" and aria-rowcount). */
125
- totalRows?: number;
131
+ totalRows?: number | undefined;
126
132
  /** Makes each row a link: the first column's content renders as the provider's linkComponent (or `<a>`), and a click
127
133
  * or Enter anywhere on the row follows it. Ctrl/⌘-click opens a new tab as usual. */
128
- getRowHref?: (row: Record<string, any>) => string;
134
+ getRowHref?: ((row: Record<string, any>) => string) | undefined;
129
135
  /** Pager arrows become links to these URLs (search-param paging). Without onPageChange the link navigates. */
130
- getPageHref?: (page: number) => string;
136
+ getPageHref?: ((page: number) => string) | undefined;
131
137
  /** Router link for getRowHref / getPageHref. Default: AuraProvider's linkComponent, else `<a>`. */
132
- linkComponent?: React$1.ElementType;
138
+ linkComponent?: React$1.ElementType | undefined;
133
139
  /** Skeleton row count when there is no pageSize. Default 5. */
134
- skeletonRows?: number;
140
+ skeletonRows?: number | undefined;
135
141
  /** Called on row click or Enter. */
136
- onRowActivate?: (row: Record<string, any>) => void;
142
+ onRowActivate?: ((row: Record<string, any>) => void) | undefined;
137
143
  /** Fixed height in px: sticky header, and only the rows in view are rendered. */
138
- height?: number;
144
+ height?: number | undefined;
139
145
  /** Column menu on every header, drag-to-reorder, and the show/hide columns button. */
140
- columnControls?: boolean;
146
+ columnControls?: boolean | undefined;
141
147
  /** Set false to keep column controls but turn off reordering. */
142
- reorderable?: boolean;
148
+ reorderable?: boolean | undefined;
143
149
  /** Controlled column order (keys); pair with onColumnOrderChange. */
144
- columnOrder?: string[];
145
- onColumnOrderChange?: (keys: string[]) => void;
150
+ columnOrder?: string[] | undefined;
151
+ onColumnOrderChange?: ((keys: string[]) => void) | undefined;
146
152
  /** Controlled hidden columns (keys); pair with onHiddenColumnsChange. */
147
- hiddenColumns?: string[];
148
- onHiddenColumnsChange?: (keys: string[]) => void;
153
+ hiddenColumns?: string[] | undefined;
154
+ onHiddenColumnsChange?: ((keys: string[]) => void) | undefined;
149
155
  /** Controlled pinned columns (keys); pair with onPinnedColumnsChange. */
150
- pinnedColumns?: string[];
151
- onPinnedColumnsChange?: (keys: string[]) => void;
156
+ pinnedColumns?: string[] | undefined;
157
+ onPinnedColumnsChange?: ((keys: string[]) => void) | undefined;
152
158
  /** `compact` = 40px rows (48px on touch screens). Default: the surrounding density. */
153
- density?: "comfortable" | "compact";
159
+ density?: "comfortable" | "compact" | undefined;
154
160
  /** Container width in px below which rows render as stacked cards (phones). Try 640. Measured with ResizeObserver, so it follows the container, not the window. */
155
- stackBelow?: number;
156
- className?: string;
161
+ stackBelow?: number | undefined;
162
+ className?: string | undefined;
157
163
  }
158
164
  /** An AURA icon name, or any icon element (e.g. `<Building />` from lucide-react). AURA sizes it and hides it from screen readers. */
159
165
  export type IconInput = IconName | React$1.ReactElement;
160
- export type IconName = "check" | "x" | "plus" | "minus" | "search" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-right" | "arrow-up-right" | "arrow-up-down" | "loader-circle" | "circle-alert" | "circle-check" | "info" | "triangle-alert" | "settings" | "user" | "users" | "filter" | "ellipsis" | "external-link" | "copy" | "trash-2" | "pencil" | "download" | "upload" | "calendar" | "bell" | "menu" | "eye" | "log-out" | "circle" | "circle-dot-dashed" | "ban" | "arrow-up" | "arrow-down" | "inbox" | "pin" | "pin-off" | "eye-off" | "columns-3" | "arrow-left" | "rotate-ccw" | "house" | "layout-dashboard" | "folder" | "chart-column" | "file-text" | "mail" | "lock" | "clock" | "trending-up" | "trending-down" | "image" | "paperclip" | "cloud-upload" | "file" | "sun" | "moon" | "monitor";
166
+ export type IconName = "check" | "x" | "plus" | "minus" | "search" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-right" | "arrow-up-right" | "arrow-up-down" | "loader-circle" | "circle-alert" | "circle-check" | "info" | "triangle-alert" | "settings" | "user" | "users" | "filter" | "ellipsis" | "external-link" | "copy" | "trash-2" | "pencil" | "download" | "upload" | "calendar" | "bell" | "menu" | "eye" | "log-out" | "circle" | "circle-dot-dashed" | "ban" | "arrow-up" | "arrow-down" | "inbox" | "pin" | "pin-off" | "eye-off" | "columns-3" | "arrow-left" | "rotate-ccw" | "house" | "layout-dashboard" | "folder" | "chart-column" | "file-text" | "mail" | "lock" | "clock" | "trending-up" | "trending-down" | "image" | "paperclip" | "cloud-upload" | "file" | "sun" | "moon" | "monitor" | "panel-left-close" | "panel-left-open";
161
167
  /** Lucide stroke icon drawn inline in currentColor. */
162
168
  export interface IconProps {
163
169
  /** A name from the set, or an icon element of your own (sized and styled the same way). */
164
170
  name: IconInput;
165
171
  /** `sm` 16 (default) · `md` 20 · `lg` 24, or a px number. */
166
- size?: "sm" | "md" | "lg" | number;
172
+ size?: "sm" | "md" | "lg" | number | undefined;
167
173
  /** Accessible name. Omit for decorative icons next to a text label (then aria-hidden). */
168
- label?: string;
174
+ label?: string | undefined;
169
175
  /** Default 2 (Lucide's). */
170
- strokeWidth?: number;
171
- className?: string;
176
+ strokeWidth?: number | undefined;
177
+ className?: string | undefined;
172
178
  }
173
179
  /** Creative surface with the AURA mesh and/or grain texture. Light in every theme; content in aura-on-texture. */
174
180
  export interface SurfaceProps extends React$1.HTMLAttributes<HTMLElement> {
175
181
  /** Default `mesh`. */
176
- texture?: "mesh" | "grain" | "mesh-grain";
182
+ texture?: "mesh" | "grain" | "mesh-grain" | undefined;
177
183
  /** Element to render. Default `div`. */
178
- as?: keyof React$1.JSX.IntrinsicElements;
179
- children?: React$1.ReactNode;
184
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
185
+ children?: React$1.ReactNode | undefined;
180
186
  }
181
187
  /** Sets the language of built-in labels (pagination, close buttons, empty states…) and the default date display for everything inside. */
182
188
  export interface AuraProviderProps {
183
189
  /** Built-in labels and date display. `sv` = Swedish labels, `sv-SE` dates, Monday weeks and the Gregorian calendar. Without a provider everything is English: labels, `en-GB` dates, Gregorian years. */
184
- locale?: "th" | "en" | "sv";
190
+ locale?: "th" | "en" | "sv" | undefined;
185
191
  /** Default calendar for DatePicker / DateRangePicker / Calendar / formatDate callers that read it. Unset: `buddhist` (พ.ศ.) for `th`, `gregory` for `en` and `sv`. */
186
- calendar?: "buddhist" | "gregory";
192
+ calendar?: "buddhist" | "gregory" | undefined;
187
193
  /** Override individual strings. */
188
- strings?: Partial<Record<string, string | ((...args: any[]) => string)>>;
194
+ strings?: Partial<Record<string, string | ((...args: any[]) => string)>> | undefined;
189
195
  /** `compact`: 36px fields and buttons, 40px table rows — dense admin screens. Touch screens keep 44px. Default: comfortable (or an ancestor's `data-density`). */
190
- density?: "comfortable" | "compact";
196
+ density?: "comfortable" | "compact" | undefined;
191
197
  /** Your router's link (e.g. `Link` from `next/link`), used by every AURA component that renders a link: Button with `href`, SideNav, Breadcrumb, Stat, Pagination, DataTable row links. It gets `href`, `className`, `aria-current`, the children and the ref. A component's own `linkComponent` wins. */
192
- linkComponent?: React$1.ElementType;
193
- children?: React$1.ReactNode;
198
+ linkComponent?: React$1.ElementType | undefined;
199
+ children?: React$1.ReactNode | undefined;
194
200
  }
195
201
  export type StatusTone = "neutral" | "progress" | "ready" | "blocked";
196
202
  /** Status pill: tone fill + icon + the status word. Tone comes from the word unless given. */
@@ -198,49 +204,49 @@ export interface StatusPillProps {
198
204
  /** The status word shown, e.g. "In Progress". */
199
205
  children: React$1.ReactNode;
200
206
  /** Force a tone. Default: matched from the word (Ready/Done → ready, In Progress/In Review → progress, Blocked/Failed → blocked, anything else → neutral). */
201
- tone?: StatusTone;
202
- className?: string;
207
+ tone?: StatusTone | undefined;
208
+ className?: string | undefined;
203
209
  }
204
210
  /** 16px checkbox with 4px corners; ink when checked, a dash when indeterminate. */
205
211
  export interface CheckboxProps extends Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "onChange" | "type" | "checked" | "defaultChecked"> {
206
212
  /** Controlled state; pair with onChange. Or use defaultChecked. */
207
- checked?: boolean;
208
- defaultChecked?: boolean;
209
- indeterminate?: boolean;
213
+ checked?: boolean | undefined;
214
+ defaultChecked?: boolean | undefined;
215
+ indeterminate?: boolean | undefined;
210
216
  /** Accessible name for a bare box (tables). Not needed when children give a visible label. */
211
- label?: string;
217
+ label?: string | undefined;
212
218
  /** Visible label beside the box (form use). */
213
- children?: React$1.ReactNode;
219
+ children?: React$1.ReactNode | undefined;
214
220
  /** Second line under the visible label (needs an id to be linked). */
215
- description?: React$1.ReactNode;
216
- onChange?: (checked: boolean) => void;
217
- disabled?: boolean;
218
- tabIndex?: number;
219
- className?: string;
221
+ description?: React$1.ReactNode | undefined;
222
+ onChange?: ((checked: boolean) => void) | undefined;
223
+ disabled?: boolean | undefined;
224
+ tabIndex?: number | undefined;
225
+ className?: string | undefined;
220
226
  }
221
227
  /** 32px round button holding one icon. */
222
228
  export interface IconButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
223
229
  icon: IconInput;
224
230
  /** `danger` colours the icon and hover for a destructive action (Delete, Revoke). */
225
- tone?: "neutral" | "danger";
231
+ tone?: "neutral" | "danger" | undefined;
226
232
  /** Accessible name and tooltip (required). */
227
233
  label: string;
228
234
  /** Icon size. Default `sm` (16). */
229
- size?: "sm" | "md";
235
+ size?: "sm" | "md" | undefined;
230
236
  }
231
237
  export interface MenuItem {
232
- label?: string;
233
- icon?: IconInput;
238
+ label?: string | undefined;
239
+ icon?: IconInput | undefined;
234
240
  /** Present = a checkable item (menuitemcheckbox). */
235
- checked?: boolean;
236
- disabled?: boolean;
241
+ checked?: boolean | undefined;
242
+ disabled?: boolean | undefined;
237
243
  /** Keep the menu open after choosing (checkbox lists). */
238
- keepOpen?: boolean;
244
+ keepOpen?: boolean | undefined;
239
245
  /** Short right-aligned hint, e.g. a shortcut. */
240
- hint?: string;
246
+ hint?: string | undefined;
241
247
  /** A divider instead of an item. */
242
- separator?: boolean;
243
- onSelect?: () => void;
248
+ separator?: boolean | undefined;
249
+ onSelect?: (() => void) | undefined;
244
250
  }
245
251
  /** Popover list anchored to an element, rendered in a portal. */
246
252
  export interface MenuProps {
@@ -252,30 +258,30 @@ export interface MenuProps {
252
258
  /** Called on choose, Escape, Tab or outside click. `restoreFocus` is true for keyboard closes. */
253
259
  onClose: (restoreFocus: boolean) => void;
254
260
  /** Focus the first item on open. Default true; turn off only for static demos. */
255
- autoFocus?: boolean;
261
+ autoFocus?: boolean | undefined;
256
262
  }
257
263
  export interface FieldProps {
258
264
  /** Visible label; also the accessible name. */
259
265
  label: string;
260
266
  /** Helper line under the field (caption, fg-secondary). */
261
- hint?: React$1.ReactNode;
267
+ hint?: React$1.ReactNode | undefined;
262
268
  /** Replaces the hint, turns the edge fg-danger and sets aria-invalid. Write it as the fix. */
263
- error?: React$1.ReactNode;
269
+ error?: React$1.ReactNode | undefined;
264
270
  /** Adds a red asterisk and the native required attribute. */
265
- required?: boolean;
271
+ required?: boolean | undefined;
266
272
  /** Adds "(optional)" after the label. */
267
- optional?: boolean;
273
+ optional?: boolean | undefined;
268
274
  }
269
275
  export interface TextFieldProps extends FieldProps, Omit<React$1.InputHTMLAttributes<HTMLInputElement>, "required"> {
270
276
  /** Leading icon inside the field. */
271
- icon?: IconInput;
277
+ icon?: IconInput | undefined;
272
278
  /** Trailing unit, e.g. "THB". */
273
- suffix?: React$1.ReactNode;
279
+ suffix?: React$1.ReactNode | undefined;
274
280
  }
275
281
  /** A password input with a show/hide button. All TextField props; `ref` reaches the input (react-hook-form `register`). */
276
282
  export interface PasswordFieldProps extends Omit<TextFieldProps, "type" | "suffix"> {
277
283
  /** Set false to hide the show/hide button. Default true. */
278
- toggle?: boolean;
284
+ toggle?: boolean | undefined;
279
285
  }
280
286
  /** One entry of a FormErrorSummary: the field's `id` (or `name`) and what to fix. */
281
287
  export interface FormErrorItem {
@@ -286,16 +292,16 @@ export interface FormErrorItem {
286
292
  export interface FormErrorSummaryProps {
287
293
  /** A list, or react-hook-form's `formState.errors` as is (`{ name: { message } }`). Empty → renders nothing. */
288
294
  errors: FormErrorItem[] | Record<string, {
289
- message?: React$1.ReactNode;
295
+ message?: React$1.ReactNode | undefined;
290
296
  } | undefined>;
291
297
  /** Default "Fix N fields to continue" in the provider's language. */
292
- title?: React$1.ReactNode;
298
+ title?: React$1.ReactNode | undefined;
293
299
  /** Called with the field when a link is followed, e.g. react-hook-form's `setFocus`. Default: focus the element whose id (or name) is the field. */
294
- onSelect?: (field: string) => void;
300
+ onSelect?: ((field: string) => void) | undefined;
295
301
  /** Change it on every submit (e.g. `formState.submitCount`) to move focus to the summary again. It also takes focus when errors first appear. */
296
302
  focusKey?: unknown;
297
- className?: string;
298
- id?: string;
303
+ className?: string | undefined;
304
+ id?: string | undefined;
299
305
  }
300
306
  /** An applied filter, shown as a removable chip. */
301
307
  export interface ActiveFilter {
@@ -306,26 +312,26 @@ export interface ActiveFilter {
306
312
  /** The row above a table: search, filter controls, applied-filter chips, result count and actions. Wraps below md. */
307
313
  export interface FilterBarProps {
308
314
  /** Search text (controlled). Omit `onSearchChange` to hide the search field. */
309
- search?: string;
315
+ search?: string | undefined;
310
316
  /** Called after typing pauses (`searchDelay`), and at once on Enter or clear — ready to write to the URL. */
311
- onSearchChange?: (value: string) => void;
317
+ onSearchChange?: ((value: string) => void) | undefined;
312
318
  /** ms to wait after the last keystroke. Default 300. */
313
- searchDelay?: number;
314
- searchLabel?: string;
315
- searchPlaceholder?: string;
319
+ searchDelay?: number | undefined;
320
+ searchLabel?: string | undefined;
321
+ searchPlaceholder?: string | undefined;
316
322
  /** Filter controls beside the search: Select, SegmentedControl, a Popover of options… */
317
- children?: React$1.ReactNode;
323
+ children?: React$1.ReactNode | undefined;
318
324
  /** Applied filters as chips, each with its own remove button. */
319
- filters?: ActiveFilter[];
325
+ filters?: ActiveFilter[] | undefined;
320
326
  /** Adds "Clear all" while any filter or search is set. */
321
- onClearAll?: () => void;
327
+ onClearAll?: (() => void) | undefined;
322
328
  /** A number ("312 results", announced politely) or your own node. */
323
- resultCount?: number | React$1.ReactNode;
329
+ resultCount?: number | React$1.ReactNode | undefined;
324
330
  /** Trailing slot: export, a New button… */
325
- actions?: React$1.ReactNode;
331
+ actions?: React$1.ReactNode | undefined;
326
332
  /** Accessible name of the region. Default "Filters". */
327
- label?: string;
328
- className?: string;
333
+ label?: string | undefined;
334
+ className?: string | undefined;
329
335
  }
330
336
  /** One command in the palette. */
331
337
  export interface CommandItem {
@@ -333,16 +339,16 @@ export interface CommandItem {
333
339
  /** Text shown and searched. */
334
340
  label: string;
335
341
  /** Items with the same group are listed together under its heading, in first-seen order. */
336
- group?: string;
337
- icon?: IconInput;
338
- description?: string;
342
+ group?: string | undefined;
343
+ icon?: IconInput | undefined;
344
+ description?: string | undefined;
339
345
  /** Extra words that find it ("invoice" → Billing). */
340
- keywords?: string[];
346
+ keywords?: string[] | undefined;
341
347
  /** A shortcut shown at the right, e.g. "G I". Display only. */
342
- shortcut?: string;
343
- disabled?: boolean;
348
+ shortcut?: string | undefined;
349
+ disabled?: boolean | undefined;
344
350
  /** Runs when chosen (Enter or click); the palette then closes. */
345
- onSelect?: () => void;
351
+ onSelect?: (() => void) | undefined;
346
352
  }
347
353
  /** A command palette: a modal search over commands and pages, grouped, fully keyboard-driven. */
348
354
  export interface CommandProps {
@@ -350,84 +356,84 @@ export interface CommandProps {
350
356
  onOpenChange: (open: boolean) => void;
351
357
  items: CommandItem[];
352
358
  /** Also called with the chosen item (after its own onSelect). */
353
- onSelect?: (item: CommandItem) => void;
359
+ onSelect?: ((item: CommandItem) => void) | undefined;
354
360
  /** Accessible name. Default "Command menu". */
355
- label?: string;
356
- placeholder?: string;
361
+ label?: string | undefined;
362
+ placeholder?: string | undefined;
357
363
  /** Default "No matches". */
358
- emptyText?: string;
364
+ emptyText?: string | undefined;
359
365
  /** ⌘K / Ctrl+K toggles the palette from anywhere on the page. Default true. */
360
- hotkey?: boolean;
366
+ hotkey?: boolean | undefined;
361
367
  /** Replace the Thai-aware default filter. */
362
- filter?: (item: CommandItem, query: string) => boolean;
363
- className?: string;
368
+ filter?: ((item: CommandItem, query: string) => boolean) | undefined;
369
+ className?: string | undefined;
364
370
  }
365
371
  export interface TextareaProps extends FieldProps, Omit<React$1.TextareaHTMLAttributes<HTMLTextAreaElement>, "required"> {
366
372
  }
367
373
  export type SelectOption = string | {
368
374
  value: string;
369
375
  label: string;
370
- disabled?: boolean;
376
+ disabled?: boolean | undefined;
371
377
  };
372
378
  export interface SelectProps extends FieldProps, Omit<React$1.SelectHTMLAttributes<HTMLSelectElement>, "required"> {
373
379
  options: SelectOption[];
374
380
  /** A disabled first option shown in fg-tertiary until something is chosen. */
375
- placeholder?: string;
376
- icon?: IconInput;
381
+ placeholder?: string | undefined;
382
+ icon?: IconInput | undefined;
377
383
  }
378
384
  export type ChoiceOption = string | {
379
385
  value: string;
380
386
  label: string;
381
- description?: string;
382
- disabled?: boolean;
387
+ description?: string | undefined;
388
+ disabled?: boolean | undefined;
383
389
  };
384
390
  export interface RadioGroupProps extends FieldProps {
385
391
  options: ChoiceOption[];
386
- value?: string;
387
- defaultValue?: string;
388
- onChange?: (value: string) => void;
389
- name?: string;
392
+ value?: string | undefined;
393
+ defaultValue?: string | undefined;
394
+ onChange?: ((value: string) => void) | undefined;
395
+ name?: string | undefined;
390
396
  /** Default `vertical`. */
391
- orientation?: "vertical" | "horizontal";
392
- disabled?: boolean;
393
- id?: string;
394
- className?: string;
397
+ orientation?: "vertical" | "horizontal" | undefined;
398
+ disabled?: boolean | undefined;
399
+ id?: string | undefined;
400
+ className?: string | undefined;
395
401
  }
396
402
  export interface SwitchProps {
397
- label?: string;
398
- description?: string;
399
- checked?: boolean;
400
- defaultChecked?: boolean;
401
- onChange?: (checked: boolean) => void;
402
- disabled?: boolean;
403
+ label?: string | undefined;
404
+ description?: string | undefined;
405
+ checked?: boolean | undefined;
406
+ defaultChecked?: boolean | undefined;
407
+ onChange?: ((checked: boolean) => void) | undefined;
408
+ disabled?: boolean | undefined;
403
409
  /** Required when there is no visible label. */
404
- "aria-label"?: string;
405
- id?: string;
406
- className?: string;
410
+ "aria-label"?: string | undefined;
411
+ id?: string | undefined;
412
+ className?: string | undefined;
407
413
  }
408
414
  export type FeedbackTone = "info" | "success" | "warning" | "danger";
409
415
  export interface AlertProps {
410
- tone?: FeedbackTone;
411
- title?: React$1.ReactNode;
412
- children?: React$1.ReactNode;
416
+ tone?: FeedbackTone | undefined;
417
+ title?: React$1.ReactNode | undefined;
418
+ children?: React$1.ReactNode | undefined;
413
419
  /** Usually a secondary Button. */
414
- action?: React$1.ReactNode;
420
+ action?: React$1.ReactNode | undefined;
415
421
  /** Adds a close button. */
416
- onDismiss?: () => void;
417
- className?: string;
422
+ onDismiss?: (() => void) | undefined;
423
+ className?: string | undefined;
418
424
  }
419
425
  export interface ToastOptions {
420
426
  title: string;
421
- description?: string;
422
- tone?: FeedbackTone;
427
+ description?: string | undefined;
428
+ tone?: FeedbackTone | undefined;
423
429
  action?: {
424
430
  label: string;
425
- onClick?: () => void;
426
- };
431
+ onClick?: (() => void) | undefined;
432
+ } | undefined;
427
433
  /** ms before it closes itself. Default 5000; Infinity keeps it until dismissed. */
428
- duration?: number;
434
+ duration?: number | undefined;
429
435
  /** Reuse an id to replace a toast in place (same position, timer restarts) — never a second toast. */
430
- id?: string;
436
+ id?: string | undefined;
431
437
  }
432
438
  /** Options for the shorthands (`toast.success(title, opts)` …): everything but the title and tone. */
433
439
  export type ToastShorthandOptions = Omit<ToastOptions, "title" | "tone">;
@@ -435,210 +441,219 @@ export interface TooltipProps {
435
441
  content: React$1.ReactNode;
436
442
  /** One focusable element. */
437
443
  children: React$1.ReactElement;
438
- side?: "top" | "bottom";
444
+ side?: "top" | "bottom" | undefined;
439
445
  /** Hover delay in ms. Default 400. */
440
- delay?: number;
446
+ delay?: number | undefined;
441
447
  /** Force open (demos, tests). */
442
- open?: boolean;
448
+ open?: boolean | undefined;
443
449
  }
444
450
  export interface FieldPropsPublic {
445
451
  label: string;
446
- hint?: React$1.ReactNode;
447
- error?: React$1.ReactNode;
448
- required?: boolean;
449
- optional?: boolean;
452
+ hint?: React$1.ReactNode | undefined;
453
+ error?: React$1.ReactNode | undefined;
454
+ required?: boolean | undefined;
455
+ optional?: boolean | undefined;
450
456
  }
451
457
  export interface DialogProps {
452
458
  open: boolean;
453
459
  onClose: () => void;
454
460
  title: React$1.ReactNode;
455
- description?: React$1.ReactNode;
456
- children?: React$1.ReactNode;
461
+ description?: React$1.ReactNode | undefined;
462
+ children?: React$1.ReactNode | undefined;
457
463
  /** Buttons, right-aligned: secondary Cancel, then the primary action. */
458
- footer?: React$1.ReactNode;
464
+ footer?: React$1.ReactNode | undefined;
459
465
  /** `sm` 400 · `md` 560 (default) · `lg` 720. */
460
- size?: "sm" | "md" | "lg";
466
+ size?: "sm" | "md" | "lg" | undefined;
461
467
  /** Default true. False hides the close button and ignores Escape and scrim clicks. */
462
- dismissible?: boolean;
468
+ dismissible?: boolean | undefined;
463
469
  /** Use `alertdialog` for destructive confirmations. */
464
- role?: "dialog" | "alertdialog";
470
+ role?: "dialog" | "alertdialog" | undefined;
465
471
  /** Default true. Turn off only for static demos. */
466
- autoFocus?: boolean;
467
- className?: string;
472
+ autoFocus?: boolean | undefined;
473
+ className?: string | undefined;
468
474
  }
469
475
  export interface CardProps {
470
- title?: React$1.ReactNode;
471
- description?: React$1.ReactNode;
476
+ title?: React$1.ReactNode | undefined;
477
+ description?: React$1.ReactNode | undefined;
472
478
  /** Top-right, usually an IconButton. */
473
- actions?: React$1.ReactNode;
474
- footer?: React$1.ReactNode;
475
- children?: React$1.ReactNode;
479
+ actions?: React$1.ReactNode | undefined;
480
+ footer?: React$1.ReactNode | undefined;
481
+ children?: React$1.ReactNode | undefined;
476
482
  /** Default `enterprise`. `creative` is for marketing and onboarding only. */
477
- variant?: "enterprise" | "creative";
483
+ variant?: "enterprise" | "creative" | undefined;
478
484
  /** Heading level of the title. Default 3 — use 2 when cards sit directly under the page h1. */
479
- headingLevel?: 2 | 3 | 4 | 5 | 6;
485
+ headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
480
486
  /** Hover edge for clickable cards. */
481
- interactive?: boolean;
482
- as?: keyof React$1.JSX.IntrinsicElements;
483
- className?: string;
487
+ interactive?: boolean | undefined;
488
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
489
+ className?: string | undefined;
484
490
  /** id for the title element; the card is then labelled by it (aria-labelledby). */
485
- titleId?: string;
491
+ titleId?: string | undefined;
486
492
  }
487
493
  export interface TabItem {
488
494
  id: string;
489
495
  label: string;
490
- icon?: IconInput;
491
- count?: number;
492
- disabled?: boolean;
493
- content?: React$1.ReactNode;
496
+ icon?: IconInput | undefined;
497
+ count?: number | undefined;
498
+ disabled?: boolean | undefined;
499
+ content?: React$1.ReactNode | undefined;
494
500
  }
495
501
  export interface TabsProps {
496
502
  tabs: TabItem[];
497
503
  /** Accessible name for the tab list. */
498
504
  label: string;
499
- value?: string;
500
- defaultValue?: string;
501
- onChange?: (id: string) => void;
502
- className?: string;
505
+ value?: string | undefined;
506
+ defaultValue?: string | undefined;
507
+ onChange?: ((id: string) => void) | undefined;
508
+ className?: string | undefined;
503
509
  }
504
510
  export interface NavItem {
505
511
  id: string;
506
512
  label: string;
507
- icon?: IconInput;
508
- count?: number;
513
+ icon?: IconInput | undefined;
514
+ count?: number | undefined;
509
515
  /** Anything beside the label, e.g. a status dot or a `Badge`. */
510
- badge?: React$1.ReactNode;
511
- href?: string;
516
+ badge?: React$1.ReactNode | undefined;
517
+ href?: string | undefined;
512
518
  /** Makes this item a collapsible group of links. The group header is a button, never a link. */
513
- children?: NavItem[];
519
+ children?: NavItem[] | undefined;
514
520
  /** Start open. A group also opens by itself when one of its items is the current one. */
515
- defaultOpen?: boolean;
521
+ defaultOpen?: boolean | undefined;
516
522
  }
517
523
  export interface SideNavProps {
518
524
  sections?: Array<{
519
- title?: string;
525
+ title?: string | undefined;
520
526
  items: NavItem[];
521
- }>;
522
- items?: NavItem[];
523
- value?: string;
524
- defaultValue?: string;
525
- onChange?: (id: string) => void;
526
- header?: React$1.ReactNode;
527
- footer?: React$1.ReactNode;
527
+ }> | undefined;
528
+ items?: NavItem[] | undefined;
529
+ value?: string | undefined;
530
+ defaultValue?: string | undefined;
531
+ onChange?: ((id: string) => void) | undefined;
532
+ header?: React$1.ReactNode | undefined;
533
+ footer?: React$1.ReactNode | undefined;
528
534
  /** Default "Main". */
529
- label?: string;
535
+ label?: string | undefined;
530
536
  /** Router link for items with `href`; defaults to the AuraProvider's `linkComponent`, then `<a>`. */
531
- linkComponent?: React$1.ElementType;
532
- className?: string;
537
+ linkComponent?: React$1.ElementType | undefined;
538
+ /** Icon-only rail (`aura-sidenav-rail-width`, 64px). Labels show as tooltips and stay the accessible names; a group
539
+ * expands the rail when clicked. Controlled; pair with `onCollapsedChange`. */
540
+ collapsed?: boolean | undefined;
541
+ /** Starting state when `collapsed` isn't controlled. Default false. */
542
+ defaultCollapsed?: boolean | undefined;
543
+ /** Called by the toggle button, and by a group clicked in the rail (with `false`). Save it to keep the choice. */
544
+ onCollapsedChange?: ((collapsed: boolean) => void) | undefined;
545
+ /** Adds a collapse / expand button at the bottom. AppShell hides it in its phone drawer. */
546
+ collapsible?: boolean | undefined;
547
+ className?: string | undefined;
533
548
  }
534
549
  export interface BreadcrumbProps {
535
550
  /** Root first; the last item is the current page. */
536
551
  items: Array<{
537
552
  label: string;
538
- href?: string;
539
- onClick?: () => void;
553
+ href?: string | undefined;
554
+ onClick?: (() => void) | undefined;
540
555
  }>;
541
- label?: string;
542
- className?: string;
556
+ label?: string | undefined;
557
+ className?: string | undefined;
543
558
  }
544
559
  export interface AvatarProps {
545
560
  /** Accessible name; also gives the initials and a stable colour. */
546
561
  name: string;
547
- src?: string;
562
+ src?: string | undefined;
548
563
  /** `sm` 24 · `md` 32 (default) · `lg` 40. */
549
- size?: "sm" | "md" | "lg";
550
- status?: "online";
551
- className?: string;
564
+ size?: "sm" | "md" | "lg" | undefined;
565
+ status?: "online" | undefined;
566
+ className?: string | undefined;
552
567
  }
553
568
  export interface DropdownMenuProps {
554
569
  /** One element — usually a Button or IconButton. It gets aria-haspopup, aria-expanded and the click handler. */
555
570
  trigger: React$1.ReactElement;
556
571
  items: MenuItem[];
557
572
  /** Accessible name for the menu. */
558
- label?: string;
573
+ label?: string | undefined;
559
574
  }
560
575
  export interface ComboboxOption {
561
576
  value: string;
562
577
  label: string;
563
578
  /** Second line in the list; also searched. */
564
- description?: string;
579
+ description?: string | undefined;
565
580
  /** Extra search terms (English name, phone, code…). */
566
- keywords?: string[];
567
- disabled?: boolean;
581
+ keywords?: string[] | undefined;
582
+ disabled?: boolean | undefined;
568
583
  /** Leading icon in the list. */
569
- icon?: IconInput;
584
+ icon?: IconInput | undefined;
570
585
  }
571
586
  /** Combobox with `multiple`: pick any number; the picks show as removable chips in the field. */
572
587
  export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "defaultValue" | "onChange" | "clearable"> {
573
588
  multiple: true;
574
589
  /** Selected option values, in the order they were picked (controlled). */
575
- value?: string[];
576
- defaultValue?: string[];
577
- onChange?: (value: string[]) => void;
590
+ value?: string[] | undefined;
591
+ defaultValue?: string[] | undefined;
592
+ onChange?: ((value: string[]) => void) | undefined;
578
593
  /** Clear-all button while anything is selected. Default true. */
579
- clearable?: boolean;
594
+ clearable?: boolean | undefined;
580
595
  /** Most picks allowed; further options are disabled. */
581
- max?: number;
596
+ max?: number | undefined;
582
597
  }
583
598
  export interface ComboboxProps extends FieldProps {
584
599
  options: Array<ComboboxOption | string>;
585
600
  /** Selected option value (controlled). */
586
- value?: string | null;
587
- defaultValue?: string | null;
588
- onChange?: (value: string | null) => void;
589
- id?: string;
590
- name?: string;
591
- placeholder?: string;
592
- disabled?: boolean;
593
- readOnly?: boolean;
601
+ value?: string | null | undefined;
602
+ defaultValue?: string | null | undefined;
603
+ onChange?: ((value: string | null) => void) | undefined;
604
+ id?: string | undefined;
605
+ name?: string | undefined;
606
+ placeholder?: string | undefined;
607
+ disabled?: boolean | undefined;
608
+ readOnly?: boolean | undefined;
594
609
  /** Leading icon. Default `search`. */
595
- icon?: IconInput;
610
+ icon?: IconInput | undefined;
596
611
  /** Clear button while a value is selected (Escape clears too). Default true. */
597
- clearable?: boolean;
612
+ clearable?: boolean | undefined;
598
613
  /** Server-side search: called with the typed text; the component stops filtering and shows `options` as given. */
599
- onSearch?: (query: string) => void;
600
- loading?: boolean;
601
- loadingText?: string;
602
- emptyText?: string;
614
+ onSearch?: ((query: string) => void) | undefined;
615
+ loading?: boolean | undefined;
616
+ loadingText?: string | undefined;
617
+ emptyText?: string | undefined;
603
618
  /** Max options rendered. Default 200 — narrow with typing beyond that. */
604
- limit?: number;
619
+ limit?: number | undefined;
605
620
  /** Replace the Thai-aware default filter (label, description, keywords). */
606
- filter?: (option: ComboboxOption, query: string) => boolean;
607
- className?: string;
621
+ filter?: ((option: ComboboxOption, query: string) => boolean) | undefined;
622
+ className?: string | undefined;
608
623
  }
609
624
  /** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
610
625
  export interface NumberFieldProps extends FieldProps {
611
626
  /** The number (controlled). `null` = empty. */
612
- value?: number | null;
613
- defaultValue?: number | null;
627
+ value?: number | null | undefined;
628
+ defaultValue?: number | null | undefined;
614
629
  /** Called with the parsed number (or null when emptied) as the person types, and with the clamped value on blur. */
615
- onChange?: (value: number | null) => void;
616
- min?: number;
617
- max?: number;
630
+ onChange?: ((value: number | null) => void) | undefined;
631
+ min?: number | undefined;
632
+ max?: number | undefined;
618
633
  /** Arrow keys and buttons move by this. Default 1. PageUp/PageDown move 10×. */
619
- step?: number;
634
+ step?: number | undefined;
620
635
  /** Decimal places shown and kept. Default: 0 when step is whole, else step's decimals. */
621
- decimals?: number;
636
+ decimals?: number | undefined;
622
637
  /** Text before the number, e.g. `฿`. */
623
- prefix?: React$1.ReactNode;
638
+ prefix?: React$1.ReactNode | undefined;
624
639
  /** Text after the number, e.g. `%` or `ชิ้น`. */
625
- suffix?: React$1.ReactNode;
640
+ suffix?: React$1.ReactNode | undefined;
626
641
  /** +/− buttons beside the number. Default true. */
627
- stepper?: boolean;
628
- id?: string;
629
- name?: string;
630
- placeholder?: string;
631
- disabled?: boolean;
632
- readOnly?: boolean;
633
- className?: string;
634
- onBlur?: React$1.FocusEventHandler<HTMLInputElement>;
642
+ stepper?: boolean | undefined;
643
+ id?: string | undefined;
644
+ name?: string | undefined;
645
+ placeholder?: string | undefined;
646
+ disabled?: boolean | undefined;
647
+ readOnly?: boolean | undefined;
648
+ className?: string | undefined;
649
+ onBlur?: React$1.FocusEventHandler<HTMLInputElement> | undefined;
635
650
  }
636
651
  /** One step of a Stepper. */
637
652
  export interface StepItem {
638
653
  id: string;
639
654
  label: React$1.ReactNode;
640
655
  /** Short line under the label, e.g. what the step asks for. */
641
- description?: React$1.ReactNode;
656
+ description?: React$1.ReactNode | undefined;
642
657
  }
643
658
  /** Progress through a multi-step flow (wizard, checkout, booking). */
644
659
  export interface StepperProps {
@@ -646,313 +661,313 @@ export interface StepperProps {
646
661
  /** id of the step the person is on. Steps before it are completed. */
647
662
  current: string;
648
663
  /** Accessible name of the list. Default: none (give one when the page has several). */
649
- label?: string;
664
+ label?: string | undefined;
650
665
  /** Makes completed steps buttons that go back to them. Upcoming steps never are. */
651
- onStepClick?: (id: string) => void;
666
+ onStepClick?: ((id: string) => void) | undefined;
652
667
  /** Default `horizontal`. Below `sm` a horizontal stepper shows only the current step ("Step 2 of 4"). */
653
- orientation?: "horizontal" | "vertical";
654
- className?: string;
668
+ orientation?: "horizontal" | "vertical" | undefined;
669
+ className?: string | undefined;
655
670
  }
656
671
  export interface SegmentedOption {
657
672
  value: string;
658
673
  label: string;
659
- icon?: IconInput;
674
+ icon?: IconInput | undefined;
660
675
  /** Show only the icon; `label` becomes its accessible name and tooltip. */
661
- iconOnly?: boolean;
662
- disabled?: boolean;
676
+ iconOnly?: boolean | undefined;
677
+ disabled?: boolean | undefined;
663
678
  }
664
679
  /** A row of 2–5 mutually exclusive choices that apply at once (view, period, unit). A radio group underneath. */
665
680
  export interface SegmentedControlProps {
666
681
  /** Accessible name of the group, e.g. "View". Required. */
667
682
  label: string;
668
683
  options: Array<SegmentedOption | string>;
669
- value?: string;
670
- defaultValue?: string;
671
- onChange?: (value: string) => void;
684
+ value?: string | undefined;
685
+ defaultValue?: string | undefined;
686
+ onChange?: ((value: string) => void) | undefined;
672
687
  /** `md` (default, 36px) or `sm` (28px) for toolbars. */
673
- size?: "sm" | "md";
688
+ size?: "sm" | "md" | undefined;
674
689
  /** Stretch across the container, segments equal width. */
675
- fullWidth?: boolean;
676
- disabled?: boolean;
677
- id?: string;
678
- className?: string;
690
+ fullWidth?: boolean | undefined;
691
+ disabled?: boolean | undefined;
692
+ id?: string | undefined;
693
+ className?: string | undefined;
679
694
  }
680
695
  /** ISO date string, `YYYY-MM-DD` (Gregorian — the era is display only). */
681
696
  export type ISODate = string;
682
697
  export interface DateDisplayOptions {
683
698
  /** Components: the AuraProvider's locale, else `en`. `formatDate()` (no provider to read): `th` unless given. */
684
- locale?: "th" | "en" | "sv";
699
+ locale?: "th" | "en" | "sv" | undefined;
685
700
  /** `buddhist` (พ.ศ.; default for th) or `gregory` (ค.ศ.; default for en and sv). */
686
- calendar?: "buddhist" | "gregory";
701
+ calendar?: "buddhist" | "gregory" | undefined;
687
702
  }
688
703
  export interface CalendarProps extends DateDisplayOptions {
689
- start?: ISODate | null;
690
- end?: ISODate | null;
691
- focus?: ISODate | null;
692
- range?: boolean;
693
- min?: ISODate;
694
- max?: ISODate;
695
- isDateDisabled?: (iso: ISODate) => boolean;
704
+ start?: ISODate | null | undefined;
705
+ end?: ISODate | null | undefined;
706
+ focus?: ISODate | null | undefined;
707
+ range?: boolean | undefined;
708
+ min?: ISODate | undefined;
709
+ max?: ISODate | undefined;
710
+ isDateDisabled?: ((iso: ISODate) => boolean) | undefined;
696
711
  /** 0 = Sunday (Thai default), 1 = Monday. */
697
- weekStartsOn?: 0 | 1;
698
- onSelect?: (iso: ISODate | null) => void;
712
+ weekStartsOn?: 0 | 1 | undefined;
713
+ onSelect?: ((iso: ISODate | null) => void) | undefined;
699
714
  /** Adds a Clear link to the footer. */
700
- onClear?: () => void;
715
+ onClear?: (() => void) | undefined;
701
716
  /** false hides the Today / Clear footer. */
702
- footer?: boolean;
717
+ footer?: boolean | undefined;
703
718
  /** Default true: focuses the selected (or today's) day on mount. */
704
- autoFocus?: boolean;
719
+ autoFocus?: boolean | undefined;
705
720
  }
706
721
  export interface DateFieldProps extends FieldProps, DateDisplayOptions {
707
- id?: string;
708
- name?: string;
709
- placeholder?: string;
710
- disabled?: boolean;
722
+ id?: string | undefined;
723
+ name?: string | undefined;
724
+ placeholder?: string | undefined;
725
+ disabled?: boolean | undefined;
711
726
  /** Clear button while there is a value. Default true. */
712
- clearable?: boolean;
713
- min?: ISODate;
714
- max?: ISODate;
715
- isDateDisabled?: (iso: ISODate) => boolean;
716
- weekStartsOn?: 0 | 1;
717
- className?: string;
727
+ clearable?: boolean | undefined;
728
+ min?: ISODate | undefined;
729
+ max?: ISODate | undefined;
730
+ isDateDisabled?: ((iso: ISODate) => boolean) | undefined;
731
+ weekStartsOn?: 0 | 1 | undefined;
732
+ className?: string | undefined;
718
733
  }
719
734
  export interface DatePickerProps extends DateFieldProps {
720
- value?: ISODate | null;
721
- defaultValue?: ISODate | null;
722
- onChange?: (value: ISODate | null) => void;
735
+ value?: ISODate | null | undefined;
736
+ defaultValue?: ISODate | null | undefined;
737
+ onChange?: ((value: ISODate | null) => void) | undefined;
723
738
  }
724
739
  export interface DateRange {
725
740
  start: ISODate | null;
726
741
  end: ISODate | null;
727
742
  }
728
743
  export interface DateRangePickerProps extends DateFieldProps {
729
- value?: DateRange;
730
- defaultValue?: DateRange;
731
- onChange?: (value: DateRange) => void;
744
+ value?: DateRange | undefined;
745
+ defaultValue?: DateRange | undefined;
746
+ onChange?: ((value: DateRange) => void) | undefined;
732
747
  }
733
748
  export interface DrawerProps {
734
749
  open: boolean;
735
750
  onClose: () => void;
736
751
  /** Default `right`. */
737
- side?: "right" | "left";
752
+ side?: "right" | "left" | undefined;
738
753
  /** sm 360 · md 480 (default) · lg 640 · nav = SideNav width. Full width below 640px. */
739
- size?: "sm" | "md" | "lg" | "nav";
740
- title?: string;
741
- description?: React$1.ReactNode;
742
- children?: React$1.ReactNode;
754
+ size?: "sm" | "md" | "lg" | "nav" | undefined;
755
+ title?: string | undefined;
756
+ description?: React$1.ReactNode | undefined;
757
+ children?: React$1.ReactNode | undefined;
743
758
  /** Buttons, right-aligned; stacked on phones. */
744
- footer?: React$1.ReactNode;
759
+ footer?: React$1.ReactNode | undefined;
745
760
  /** Scrim click and Escape close it. Default true. */
746
- dismissible?: boolean;
761
+ dismissible?: boolean | undefined;
747
762
  /** Default true: focus moves to the element with `data-autofocus`, else the first control in the body. False only for static demos. */
748
- autoFocus?: boolean;
763
+ autoFocus?: boolean | undefined;
749
764
  /** Needed when there is no title. */
750
- "aria-label"?: string;
751
- className?: string;
765
+ "aria-label"?: string | undefined;
766
+ className?: string | undefined;
752
767
  }
753
768
  export type Breakpoint = "base" | "sm" | "md" | "lg" | "xl";
754
769
  export type Responsive<T> = T | Partial<Record<Breakpoint, T>>;
755
770
  /** Spacing step (aura-space-N) or any CSS length. */
756
771
  export type Space = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | string;
757
772
  export interface StackProps {
758
- direction?: Responsive<"row" | "column">;
759
- gap?: Responsive<Space>;
773
+ direction?: Responsive<"row" | "column"> | undefined;
774
+ gap?: Responsive<Space> | undefined;
760
775
  /** Cross-axis alignment; responsive like direction ({ base: 'stretch', sm: 'flex-end' }). */
761
- align?: Responsive<React$1.CSSProperties["alignItems"]>;
762
- justify?: React$1.CSSProperties["justifyContent"];
763
- wrap?: boolean;
764
- as?: keyof React$1.JSX.IntrinsicElements;
765
- className?: string;
766
- style?: React$1.CSSProperties;
767
- children?: React$1.ReactNode;
776
+ align?: Responsive<React$1.CSSProperties["alignItems"]> | undefined;
777
+ justify?: React$1.CSSProperties["justifyContent"] | undefined;
778
+ wrap?: boolean | undefined;
779
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
780
+ className?: string | undefined;
781
+ style?: React$1.CSSProperties | undefined;
782
+ children?: React$1.ReactNode | undefined;
768
783
  }
769
784
  export interface GridProps {
770
- columns?: Responsive<number>;
785
+ columns?: Responsive<number> | undefined;
771
786
  /** Fit as many columns as there is room for, each at least this wide (px). Overrides columns. */
772
- minItemWidth?: number;
773
- gap?: Responsive<Space>;
774
- as?: keyof React$1.JSX.IntrinsicElements;
775
- className?: string;
776
- style?: React$1.CSSProperties;
777
- children?: React$1.ReactNode;
787
+ minItemWidth?: number | undefined;
788
+ gap?: Responsive<Space> | undefined;
789
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
790
+ className?: string | undefined;
791
+ style?: React$1.CSSProperties | undefined;
792
+ children?: React$1.ReactNode | undefined;
778
793
  }
779
794
  export interface AppShellProps {
780
795
  /** Usually a SideNav. Fixed from 1024px up; in a Drawer behind a menu button below. */
781
- nav?: React$1.ReactElement;
796
+ nav?: React$1.ReactElement | undefined;
782
797
  /** Top bar content (title, search, account menu). */
783
- header?: React$1.ReactNode;
784
- children?: React$1.ReactNode;
785
- navLabel?: string;
786
- menuLabel?: string;
798
+ header?: React$1.ReactNode | undefined;
799
+ children?: React$1.ReactNode | undefined;
800
+ navLabel?: string | undefined;
801
+ menuLabel?: string | undefined;
787
802
  /** id of `<main>`, for a skip link. Default `main`. */
788
- mainId?: string;
789
- className?: string;
803
+ mainId?: string | undefined;
804
+ className?: string | undefined;
790
805
  }
791
806
  export interface StatChange {
792
807
  /** Shown as written, e.g. "+12%" or "−3". */
793
808
  value: React$1.ReactNode;
794
- direction?: "up" | "down" | "flat";
809
+ direction?: "up" | "down" | "flat" | undefined;
795
810
  /** Default: up = positive, down = negative. Set it when a rise is bad (cancellations, wait time). */
796
- tone?: "positive" | "negative" | "neutral";
811
+ tone?: "positive" | "negative" | "neutral" | undefined;
797
812
  /** e.g. "vs last month". */
798
- label?: React$1.ReactNode;
813
+ label?: React$1.ReactNode | undefined;
799
814
  }
800
815
  export interface StatProps {
801
816
  label: React$1.ReactNode;
802
- value?: React$1.ReactNode;
817
+ value?: React$1.ReactNode | undefined;
803
818
  /** Small unit after the value ("งาน", "คน", "%"). */
804
- unit?: React$1.ReactNode;
805
- change?: StatChange;
806
- caption?: React$1.ReactNode;
807
- icon?: IconInput;
819
+ unit?: React$1.ReactNode | undefined;
820
+ change?: StatChange | undefined;
821
+ caption?: React$1.ReactNode | undefined;
822
+ icon?: IconInput | undefined;
808
823
  /** Skeleton in place of the value. */
809
- loading?: boolean;
824
+ loading?: boolean | undefined;
810
825
  /** Makes the whole card a link or a button (drill-down). */
811
- href?: string;
812
- onClick?: () => void;
813
- className?: string;
826
+ href?: string | undefined;
827
+ onClick?: (() => void) | undefined;
828
+ className?: string | undefined;
814
829
  }
815
830
  export interface TimePickerProps extends FieldProps {
816
831
  /** "HH:mm", 24-hour. */
817
- value?: string | null;
818
- defaultValue?: string | null;
819
- onChange?: (value: string | null) => void;
832
+ value?: string | null | undefined;
833
+ defaultValue?: string | null | undefined;
834
+ onChange?: ((value: string | null) => void) | undefined;
820
835
  /** Minutes between listed slots. Default 30. */
821
- step?: number;
836
+ step?: number | undefined;
822
837
  /** Earliest and latest allowed times, "HH:mm". Typed times outside them are refused with a message. */
823
- min?: string;
824
- max?: string;
825
- isTimeDisabled?: (time: string) => boolean;
838
+ min?: string | undefined;
839
+ max?: string | undefined;
840
+ isTimeDisabled?: ((time: string) => boolean) | undefined;
826
841
  /** Slot to scroll to when empty (e.g. "09:00"). Default: min. */
827
- suggest?: string;
842
+ suggest?: string | undefined;
828
843
  /** Clear button while there is a value. Default true. */
829
- clearable?: boolean;
830
- id?: string;
831
- name?: string;
832
- placeholder?: string;
833
- disabled?: boolean;
834
- readOnly?: boolean;
835
- className?: string;
844
+ clearable?: boolean | undefined;
845
+ id?: string | undefined;
846
+ name?: string | undefined;
847
+ placeholder?: string | undefined;
848
+ disabled?: boolean | undefined;
849
+ readOnly?: boolean | undefined;
850
+ className?: string | undefined;
836
851
  }
837
852
  export interface UploadItem {
838
853
  id: string;
839
854
  /** The browser File (absent for files already on the server). */
840
- file?: File;
855
+ file?: File | undefined;
841
856
  name: string;
842
- size?: number;
843
- type?: string;
857
+ size?: number | undefined;
858
+ type?: string | undefined;
844
859
  /** ready = picked, not sent yet. Set uploading/done yourself while sending. */
845
860
  status: "ready" | "uploading" | "done" | "error";
846
861
  /** 0–100 while uploading. */
847
- progress?: number;
848
- error?: string;
862
+ progress?: number | undefined;
863
+ error?: string | undefined;
849
864
  /** For files already stored (edit forms). */
850
- url?: string;
865
+ url?: string | undefined;
851
866
  }
852
867
  export interface FileUploadProps extends FieldProps {
853
- value?: UploadItem[];
854
- defaultValue?: UploadItem[];
855
- onChange?: (items: UploadItem[]) => void;
856
- onRemove?: (item: UploadItem) => void;
868
+ value?: UploadItem[] | undefined;
869
+ defaultValue?: UploadItem[] | undefined;
870
+ onChange?: ((items: UploadItem[]) => void) | undefined;
871
+ onRemove?: ((item: UploadItem) => void) | undefined;
857
872
  /** Same syntax as `<input accept>`: "image/*,.pdf". Checked on drop too. */
858
- accept?: string;
859
- multiple?: boolean;
873
+ accept?: string | undefined;
874
+ multiple?: boolean | undefined;
860
875
  /** Bytes per file. */
861
- maxSize?: number;
876
+ maxSize?: number | undefined;
862
877
  /** With multiple. */
863
- maxFiles?: number;
864
- id?: string;
865
- name?: string;
866
- disabled?: boolean;
867
- className?: string;
878
+ maxFiles?: number | undefined;
879
+ id?: string | undefined;
880
+ name?: string | undefined;
881
+ disabled?: boolean | undefined;
882
+ className?: string | undefined;
868
883
  }
869
884
  export type Tone = "neutral" | "accent" | "success" | "warning" | "danger";
870
885
  export interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
871
- tone?: Tone;
886
+ tone?: Tone | undefined;
872
887
  /** soft (default) · solid · outline */
873
- variant?: "soft" | "solid" | "outline";
874
- icon?: IconInput;
888
+ variant?: "soft" | "solid" | "outline" | undefined;
889
+ icon?: IconInput | undefined;
875
890
  }
876
891
  export interface TagProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onClick"> {
877
892
  children: React$1.ReactNode;
878
- icon?: IconInput;
893
+ icon?: IconInput | undefined;
879
894
  /** Adds a remove button (applied filters, chosen people). */
880
- onRemove?: () => void;
881
- removeLabel?: string;
895
+ onRemove?: (() => void) | undefined;
896
+ removeLabel?: string | undefined;
882
897
  /** Makes it a toggle chip (filter chips): renders a button with aria-pressed. */
883
- selected?: boolean;
884
- onClick?: (e: React$1.MouseEvent<HTMLButtonElement>) => void;
885
- disabled?: boolean;
898
+ selected?: boolean | undefined;
899
+ onClick?: ((e: React$1.MouseEvent<HTMLButtonElement>) => void) | undefined;
900
+ disabled?: boolean | undefined;
886
901
  }
887
902
  export interface ProgressProps {
888
903
  /** Omit for indeterminate. */
889
- value?: number;
890
- max?: number;
891
- label?: React$1.ReactNode;
892
- "aria-label"?: string;
893
- showValue?: boolean;
904
+ value?: number | undefined;
905
+ max?: number | undefined;
906
+ label?: React$1.ReactNode | undefined;
907
+ "aria-label"?: string | undefined;
908
+ showValue?: boolean | undefined;
894
909
  /** Replaces the % text, e.g. "3 of 5 files". Also read out as aria-valuetext. */
895
- valueLabel?: React$1.ReactNode;
896
- hint?: React$1.ReactNode;
897
- tone?: Tone;
898
- size?: "sm" | "md";
899
- id?: string;
900
- className?: string;
910
+ valueLabel?: React$1.ReactNode | undefined;
911
+ hint?: React$1.ReactNode | undefined;
912
+ tone?: Tone | undefined;
913
+ size?: "sm" | "md" | undefined;
914
+ id?: string | undefined;
915
+ className?: string | undefined;
901
916
  }
902
917
  export interface SkeletonProps {
903
- variant?: "text" | "rect" | "circle";
918
+ variant?: "text" | "rect" | "circle" | undefined;
904
919
  /** text only: number of lines (the last is shorter). */
905
- lines?: number;
906
- width?: number | string;
907
- height?: number | string;
920
+ lines?: number | undefined;
921
+ width?: number | string | undefined;
922
+ height?: number | string | undefined;
908
923
  /** circle diameter. */
909
- size?: number;
910
- className?: string;
924
+ size?: number | undefined;
925
+ className?: string | undefined;
911
926
  }
912
927
  export interface EmptyStateProps {
913
928
  title: React$1.ReactNode;
914
- description?: React$1.ReactNode;
915
- icon?: IconInput;
929
+ description?: React$1.ReactNode | undefined;
930
+ icon?: IconInput | undefined;
916
931
  /** One or two buttons. */
917
- action?: React$1.ReactNode;
918
- size?: "sm" | "md";
919
- bordered?: boolean;
920
- headingLevel?: 2 | 3 | 4 | 5 | 6;
921
- className?: string;
932
+ action?: React$1.ReactNode | undefined;
933
+ size?: "sm" | "md" | undefined;
934
+ bordered?: boolean | undefined;
935
+ headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
936
+ className?: string | undefined;
922
937
  }
923
938
  export interface PaginationProps {
924
939
  pageCount: number;
925
940
  /** 1-based, controlled; pair with onChange. Or defaultPage. */
926
- page?: number;
927
- defaultPage?: number;
928
- onChange?: (page: number) => void;
941
+ page?: number | undefined;
942
+ defaultPage?: number | undefined;
943
+ onChange?: ((page: number) => void) | undefined;
929
944
  /** Pages shown each side of the current one. Default 1. */
930
- siblingCount?: number;
945
+ siblingCount?: number | undefined;
931
946
  /** Render real links (SEO, open in new tab); onChange still runs for client routing. */
932
- getHref?: (page: number) => string;
933
- label?: string;
934
- className?: string;
947
+ getHref?: ((page: number) => string) | undefined;
948
+ label?: string | undefined;
949
+ className?: string | undefined;
935
950
  }
936
951
  export interface AccordionItem {
937
952
  id: string;
938
953
  title: React$1.ReactNode;
939
- description?: React$1.ReactNode;
954
+ description?: React$1.ReactNode | undefined;
940
955
  content: React$1.ReactNode;
941
- icon?: IconInput;
942
- disabled?: boolean;
956
+ icon?: IconInput | undefined;
957
+ disabled?: boolean | undefined;
943
958
  }
944
959
  export interface AccordionProps {
945
960
  items: AccordionItem[];
946
961
  /** single (default): one open at a time. multiple: any number. */
947
- type?: "single" | "multiple";
948
- value?: string | null | string[];
949
- defaultValue?: string | null | string[];
950
- onChange?: (value: any) => void;
962
+ type?: "single" | "multiple" | undefined;
963
+ value?: string | null | string[] | undefined;
964
+ defaultValue?: string | null | string[] | undefined;
965
+ onChange?: ((value: any) => void) | undefined;
951
966
  /** single only: false keeps one section always open. Default true. */
952
- collapsible?: boolean;
953
- headingLevel?: 2 | 3 | 4 | 5 | 6;
954
- id?: string;
955
- className?: string;
967
+ collapsible?: boolean | undefined;
968
+ headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
969
+ id?: string | undefined;
970
+ className?: string | undefined;
956
971
  }
957
972
  export interface PopoverProps {
958
973
  /** One element; it gets aria-haspopup, aria-expanded and the click toggle. */
@@ -960,27 +975,27 @@ export interface PopoverProps {
960
975
  children: React$1.ReactNode | ((api: {
961
976
  close: () => void;
962
977
  }) => React$1.ReactNode);
963
- title?: React$1.ReactNode;
978
+ title?: React$1.ReactNode | undefined;
964
979
  /** Accessible name when there is no title. */
965
- label?: string;
966
- open?: boolean;
967
- defaultOpen?: boolean;
968
- onOpenChange?: (open: boolean) => void;
969
- placement?: "bottom-start" | "bottom-end" | "bottom-center" | "top-start" | "top-end" | "top-center";
970
- width?: number | string;
980
+ label?: string | undefined;
981
+ open?: boolean | undefined;
982
+ defaultOpen?: boolean | undefined;
983
+ onOpenChange?: ((open: boolean) => void) | undefined;
984
+ placement?: "bottom-start" | "bottom-end" | "bottom-center" | "top-start" | "top-end" | "top-center" | undefined;
985
+ width?: number | string | undefined;
971
986
  /** Default true: focus moves to [data-autofocus] or the first control inside. */
972
- autoFocus?: boolean;
973
- id?: string;
974
- className?: string;
987
+ autoFocus?: boolean | undefined;
988
+ id?: string | undefined;
989
+ className?: string | undefined;
975
990
  }
976
991
  export interface ThemeOptions {
977
992
  /** The project's brand colour, #rgb or #rrggbb. Replaces AURA violet (links, focus ring, selection, info, progress, creative shadow in dark, mesh). */
978
993
  brand: string;
979
994
  /** Optional signal colour; replaces AURA lime in the accent dot and mesh only (success/ready stay green). */
980
- signal?: string;
995
+ signal?: string | undefined;
981
996
  /** ink (default): primary buttons stay zinc ink. brand: primary buttons use the brand colour. */
982
- primary?: "ink" | "brand";
983
- name?: string;
997
+ primary?: "ink" | "brand" | undefined;
998
+ name?: string | undefined;
984
999
  }
985
1000
  export interface ThemeCheck {
986
1001
  theme: "light" | "dark";
@@ -1013,7 +1028,7 @@ export declare const iconNames: IconName[];
1013
1028
  export interface ButtonComponent {
1014
1029
  (props: ButtonLinkProps & React$1.RefAttributes<HTMLAnchorElement>): React$1.ReactElement | null;
1015
1030
  (props: ButtonProps & React$1.RefAttributes<HTMLButtonElement>): React$1.ReactElement | null;
1016
- displayName?: string;
1031
+ displayName?: string | undefined;
1017
1032
  }
1018
1033
  /** AURA pill button. Enterprise (`primary`, `secondary`) for product UI; `creative` for marketing moments only.
1019
1034
  * With `href` it renders a link that looks the same (`<a>`, or your router's link via `linkComponent`). */
@@ -1030,15 +1045,15 @@ export declare const StatusPill: React$1.ForwardRefExoticComponent<StatusPillPro
1030
1045
  /** Field: label, required/optional marks, the control, then the hint or error line. Wrap a custom control in it. */
1031
1046
  export interface FieldComponentProps extends Omit<FieldPropsPublic, "label"> {
1032
1047
  /** Visible label. Omit only when the control is labelled another way. */
1033
- label?: React$1.ReactNode;
1048
+ label?: React$1.ReactNode | undefined;
1034
1049
  /** The control's id: the label points at it, and the hint/error ids derive from it. */
1035
- id?: string;
1036
- children?: React$1.ReactNode;
1050
+ id?: string | undefined;
1051
+ children?: React$1.ReactNode | undefined;
1037
1052
  /** Render the label as another element (e.g. `span` for a group of controls) with this id. */
1038
- labelAs?: string;
1039
- labelId?: string;
1040
- disabled?: boolean;
1041
- className?: string;
1053
+ labelAs?: string | undefined;
1054
+ labelId?: string | undefined;
1055
+ disabled?: boolean | undefined;
1056
+ className?: string | undefined;
1042
1057
  }
1043
1058
  export declare const Field: React$1.ForwardRefExoticComponent<FieldComponentProps & React$1.RefAttributes<HTMLDivElement>>;
1044
1059
  export declare const TextField: React$1.ForwardRefExoticComponent<TextFieldProps & React$1.RefAttributes<HTMLInputElement>>;
@@ -1050,7 +1065,7 @@ export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & Rea
1050
1065
  export interface ComboboxComponent {
1051
1066
  (props: ComboboxMultipleProps & React$1.RefAttributes<HTMLInputElement>): React$1.ReactElement | null;
1052
1067
  (props: ComboboxProps & React$1.RefAttributes<HTMLInputElement>): React$1.ReactElement | null;
1053
- displayName?: string;
1068
+ displayName?: string | undefined;
1054
1069
  }
1055
1070
  /** The Thai-aware default filter: label, description and keywords contain the query. */
1056
1071
  declare function defaultFilter(option: ComboboxOption, query: string): boolean;
@@ -1058,7 +1073,7 @@ declare function defaultFilter(option: ComboboxOption, query: string): boolean;
1058
1073
  export declare const Combobox: ComboboxComponent;
1059
1074
  /** Options for formatDate: locale/calendar plus a preset or any Intl.DateTimeFormat options. */
1060
1075
  export type FormatDateOptions = DateDisplayOptions & {
1061
- format?: "short" | "long" | "numeric" | Intl.DateTimeFormatOptions;
1076
+ format?: "short" | "long" | "numeric" | Intl.DateTimeFormatOptions | undefined;
1062
1077
  };
1063
1078
  /** Format an ISO date for display, e.g. "18 ก.ย. 2569" (th, Buddhist) or "18 Sept 2026" (en, Gregorian). */
1064
1079
  export declare function formatDate(iso: ISODate | null | undefined, opts?: FormatDateOptions): string;
@@ -1084,7 +1099,7 @@ export declare namespace toast {
1084
1099
  }
1085
1100
  export interface ToasterProps {
1086
1101
  /** Default `bottom`. */
1087
- position?: "bottom" | "top";
1102
+ position?: "bottom" | "top" | undefined;
1088
1103
  }
1089
1104
  export declare function Toaster(props: ToasterProps): React$1.ReactElement | null;
1090
1105
  export declare const PasswordField: React$1.ForwardRefExoticComponent<PasswordFieldProps & React$1.RefAttributes<HTMLInputElement>>;
@@ -1110,15 +1125,17 @@ export declare const Grid: React$1.ForwardRefExoticComponent<GridProps & React$1
1110
1125
  /** Centred page column. */
1111
1126
  export interface ContainerProps {
1112
1127
  /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
1113
- size?: "default" | "narrow";
1114
- as?: keyof React$1.JSX.IntrinsicElements;
1115
- className?: string;
1116
- style?: React$1.CSSProperties;
1117
- children?: React$1.ReactNode;
1128
+ size?: "default" | "narrow" | undefined;
1129
+ as?: keyof React$1.JSX.IntrinsicElements | undefined;
1130
+ className?: string | undefined;
1131
+ style?: React$1.CSSProperties | undefined;
1132
+ children?: React$1.ReactNode | undefined;
1118
1133
  }
1119
1134
  /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
1120
1135
  export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
1121
- /** AppShell — side navigation + top bar + content. The nav is fixed from lg (1024px) up and a Drawer below it. */
1136
+ /** AppShell — side navigation + top bar + content. The nav is fixed from lg (1024px) up and a Drawer below it.
1137
+ * Which one shows is decided in CSS (4.16), so the server's HTML is already right on a phone and nothing shifts on
1138
+ * hydration; JavaScript only opens and closes the drawer. */
1122
1139
  export declare const AppShell: React$1.ForwardRefExoticComponent<AppShellProps & React$1.RefAttributes<HTMLDivElement>>;
1123
1140
  /** Min-width breakpoints in px, mirroring the aura-bp-* tokens. */
1124
1141
  export declare const breakpoints: {
@@ -1151,6 +1168,8 @@ export interface AuraStrings {
1151
1168
  breadcrumb: string;
1152
1169
  navigation: string;
1153
1170
  openNav: string;
1171
+ collapseNav: string;
1172
+ expandNav: string;
1154
1173
  searching: string;
1155
1174
  noMatches: string;
1156
1175
  clear: (what?: string) => string;
@@ -1219,9 +1238,9 @@ export interface AuraLocaleValue {
1219
1238
  calendar: "buddhist" | "gregory" | null;
1220
1239
  strings: AuraStrings;
1221
1240
  /** The router link set on AuraProvider, if any. */
1222
- linkComponent?: React$1.ElementType | null;
1241
+ linkComponent?: React$1.ElementType | null | undefined;
1223
1242
  /** The density set on the nearest AuraProvider that sets one (null: none, i.e. comfortable unless an ancestor's data-density says otherwise). */
1224
- density?: "comfortable" | "compact" | null;
1243
+ density?: "comfortable" | "compact" | null | undefined;
1225
1244
  }
1226
1245
  /** Sets the language of built-in labels (and the default date locale) for everything inside. */
1227
1246
  export declare function AuraProvider(props: AuraProviderProps): React$1.ReactElement;
@@ -1247,23 +1266,23 @@ declare function scale(hex: string): Theme["brand"];
1247
1266
  export declare function createTheme(opts: ThemeOptions): Theme;
1248
1267
  export interface ThemeStyleProps extends ThemeOptions {
1249
1268
  /** Scope the theme to this selector instead of the whole page (multi-tenant). */
1250
- selector?: string;
1269
+ selector?: string | undefined;
1251
1270
  }
1252
1271
  export declare function ThemeStyle(props: ThemeStyleProps): React$1.ReactElement;
1253
1272
  /** `system` follows the operating system and changes with it. */
1254
1273
  export type ColorScheme = "light" | "dark" | "system";
1255
1274
  export interface ColorSchemeOptions {
1256
1275
  /** localStorage key for the choice. Default `aura-color-scheme`. */
1257
- storageKey?: string;
1276
+ storageKey?: string | undefined;
1258
1277
  /** Used when nothing is saved. Default `system`. */
1259
- defaultScheme?: ColorScheme;
1278
+ defaultScheme?: ColorScheme | undefined;
1260
1279
  }
1261
1280
  /** The script ColorSchemeScript renders, as a string — for frameworks that want it in a raw <head> template. */
1262
1281
  export declare function colorSchemeScript(options?: ColorSchemeOptions): string;
1263
1282
  /** Put in <head>: applies the saved colour scheme before the page paints. Server-rendering safe. */
1264
1283
  export declare function ColorSchemeScript(props: ColorSchemeOptions & {
1265
1284
  /** Nonce for a nonce-based Content-Security-Policy (script-src 'nonce-…'). */
1266
- nonce?: string;
1285
+ nonce?: string | undefined;
1267
1286
  }): React$1.ReactElement;
1268
1287
  /** Current colour scheme and a setter. `resolved` is what is on screen (system resolved to light or dark). */
1269
1288
  export interface ColorSchemeState {
@@ -1275,7 +1294,7 @@ export interface ColorSchemeState {
1275
1294
  export declare function useColorScheme(options?: ColorSchemeOptions): ColorSchemeState;
1276
1295
  export interface ColorSchemeToggleProps extends ColorSchemeOptions {
1277
1296
  /** Accessible name of the button. Default: the built-in "Colour scheme" label. */
1278
- label?: string;
1297
+ label?: string | undefined;
1279
1298
  }
1280
1299
  /** Icon button with a menu: Light, Dark, System. Shows a sun or a moon for what is on screen. */
1281
1300
  export declare function ColorSchemeToggle(props: ColorSchemeToggleProps): React$1.ReactElement;