@jirawatpyk/aura-react 4.15.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,84 +82,84 @@ 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;
@@ -163,34 +169,34 @@ 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,219 +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;
537
+ linkComponent?: React$1.ElementType | undefined;
532
538
  /** Icon-only rail (`aura-sidenav-rail-width`, 64px). Labels show as tooltips and stay the accessible names; a group
533
539
  * expands the rail when clicked. Controlled; pair with `onCollapsedChange`. */
534
- collapsed?: boolean;
540
+ collapsed?: boolean | undefined;
535
541
  /** Starting state when `collapsed` isn't controlled. Default false. */
536
- defaultCollapsed?: boolean;
542
+ defaultCollapsed?: boolean | undefined;
537
543
  /** Called by the toggle button, and by a group clicked in the rail (with `false`). Save it to keep the choice. */
538
- onCollapsedChange?: (collapsed: boolean) => void;
544
+ onCollapsedChange?: ((collapsed: boolean) => void) | undefined;
539
545
  /** Adds a collapse / expand button at the bottom. AppShell hides it in its phone drawer. */
540
- collapsible?: boolean;
541
- className?: string;
546
+ collapsible?: boolean | undefined;
547
+ className?: string | undefined;
542
548
  }
543
549
  export interface BreadcrumbProps {
544
550
  /** Root first; the last item is the current page. */
545
551
  items: Array<{
546
552
  label: string;
547
- href?: string;
548
- onClick?: () => void;
553
+ href?: string | undefined;
554
+ onClick?: (() => void) | undefined;
549
555
  }>;
550
- label?: string;
551
- className?: string;
556
+ label?: string | undefined;
557
+ className?: string | undefined;
552
558
  }
553
559
  export interface AvatarProps {
554
560
  /** Accessible name; also gives the initials and a stable colour. */
555
561
  name: string;
556
- src?: string;
562
+ src?: string | undefined;
557
563
  /** `sm` 24 · `md` 32 (default) · `lg` 40. */
558
- size?: "sm" | "md" | "lg";
559
- status?: "online";
560
- className?: string;
564
+ size?: "sm" | "md" | "lg" | undefined;
565
+ status?: "online" | undefined;
566
+ className?: string | undefined;
561
567
  }
562
568
  export interface DropdownMenuProps {
563
569
  /** One element — usually a Button or IconButton. It gets aria-haspopup, aria-expanded and the click handler. */
564
570
  trigger: React$1.ReactElement;
565
571
  items: MenuItem[];
566
572
  /** Accessible name for the menu. */
567
- label?: string;
573
+ label?: string | undefined;
568
574
  }
569
575
  export interface ComboboxOption {
570
576
  value: string;
571
577
  label: string;
572
578
  /** Second line in the list; also searched. */
573
- description?: string;
579
+ description?: string | undefined;
574
580
  /** Extra search terms (English name, phone, code…). */
575
- keywords?: string[];
576
- disabled?: boolean;
581
+ keywords?: string[] | undefined;
582
+ disabled?: boolean | undefined;
577
583
  /** Leading icon in the list. */
578
- icon?: IconInput;
584
+ icon?: IconInput | undefined;
579
585
  }
580
586
  /** Combobox with `multiple`: pick any number; the picks show as removable chips in the field. */
581
587
  export interface ComboboxMultipleProps extends Omit<ComboboxProps, "value" | "defaultValue" | "onChange" | "clearable"> {
582
588
  multiple: true;
583
589
  /** Selected option values, in the order they were picked (controlled). */
584
- value?: string[];
585
- defaultValue?: string[];
586
- onChange?: (value: string[]) => void;
590
+ value?: string[] | undefined;
591
+ defaultValue?: string[] | undefined;
592
+ onChange?: ((value: string[]) => void) | undefined;
587
593
  /** Clear-all button while anything is selected. Default true. */
588
- clearable?: boolean;
594
+ clearable?: boolean | undefined;
589
595
  /** Most picks allowed; further options are disabled. */
590
- max?: number;
596
+ max?: number | undefined;
591
597
  }
592
598
  export interface ComboboxProps extends FieldProps {
593
599
  options: Array<ComboboxOption | string>;
594
600
  /** Selected option value (controlled). */
595
- value?: string | null;
596
- defaultValue?: string | null;
597
- onChange?: (value: string | null) => void;
598
- id?: string;
599
- name?: string;
600
- placeholder?: string;
601
- disabled?: boolean;
602
- 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;
603
609
  /** Leading icon. Default `search`. */
604
- icon?: IconInput;
610
+ icon?: IconInput | undefined;
605
611
  /** Clear button while a value is selected (Escape clears too). Default true. */
606
- clearable?: boolean;
612
+ clearable?: boolean | undefined;
607
613
  /** Server-side search: called with the typed text; the component stops filtering and shows `options` as given. */
608
- onSearch?: (query: string) => void;
609
- loading?: boolean;
610
- loadingText?: string;
611
- emptyText?: string;
614
+ onSearch?: ((query: string) => void) | undefined;
615
+ loading?: boolean | undefined;
616
+ loadingText?: string | undefined;
617
+ emptyText?: string | undefined;
612
618
  /** Max options rendered. Default 200 — narrow with typing beyond that. */
613
- limit?: number;
619
+ limit?: number | undefined;
614
620
  /** Replace the Thai-aware default filter (label, description, keywords). */
615
- filter?: (option: ComboboxOption, query: string) => boolean;
616
- className?: string;
621
+ filter?: ((option: ComboboxOption, query: string) => boolean) | undefined;
622
+ className?: string | undefined;
617
623
  }
618
624
  /** Number input: thousands separators, +/− buttons, arrow keys, min/max/step, prefix/suffix (฿, %). */
619
625
  export interface NumberFieldProps extends FieldProps {
620
626
  /** The number (controlled). `null` = empty. */
621
- value?: number | null;
622
- defaultValue?: number | null;
627
+ value?: number | null | undefined;
628
+ defaultValue?: number | null | undefined;
623
629
  /** Called with the parsed number (or null when emptied) as the person types, and with the clamped value on blur. */
624
- onChange?: (value: number | null) => void;
625
- min?: number;
626
- max?: number;
630
+ onChange?: ((value: number | null) => void) | undefined;
631
+ min?: number | undefined;
632
+ max?: number | undefined;
627
633
  /** Arrow keys and buttons move by this. Default 1. PageUp/PageDown move 10×. */
628
- step?: number;
634
+ step?: number | undefined;
629
635
  /** Decimal places shown and kept. Default: 0 when step is whole, else step's decimals. */
630
- decimals?: number;
636
+ decimals?: number | undefined;
631
637
  /** Text before the number, e.g. `฿`. */
632
- prefix?: React$1.ReactNode;
638
+ prefix?: React$1.ReactNode | undefined;
633
639
  /** Text after the number, e.g. `%` or `ชิ้น`. */
634
- suffix?: React$1.ReactNode;
640
+ suffix?: React$1.ReactNode | undefined;
635
641
  /** +/− buttons beside the number. Default true. */
636
- stepper?: boolean;
637
- id?: string;
638
- name?: string;
639
- placeholder?: string;
640
- disabled?: boolean;
641
- readOnly?: boolean;
642
- className?: string;
643
- 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;
644
650
  }
645
651
  /** One step of a Stepper. */
646
652
  export interface StepItem {
647
653
  id: string;
648
654
  label: React$1.ReactNode;
649
655
  /** Short line under the label, e.g. what the step asks for. */
650
- description?: React$1.ReactNode;
656
+ description?: React$1.ReactNode | undefined;
651
657
  }
652
658
  /** Progress through a multi-step flow (wizard, checkout, booking). */
653
659
  export interface StepperProps {
@@ -655,313 +661,313 @@ export interface StepperProps {
655
661
  /** id of the step the person is on. Steps before it are completed. */
656
662
  current: string;
657
663
  /** Accessible name of the list. Default: none (give one when the page has several). */
658
- label?: string;
664
+ label?: string | undefined;
659
665
  /** Makes completed steps buttons that go back to them. Upcoming steps never are. */
660
- onStepClick?: (id: string) => void;
666
+ onStepClick?: ((id: string) => void) | undefined;
661
667
  /** Default `horizontal`. Below `sm` a horizontal stepper shows only the current step ("Step 2 of 4"). */
662
- orientation?: "horizontal" | "vertical";
663
- className?: string;
668
+ orientation?: "horizontal" | "vertical" | undefined;
669
+ className?: string | undefined;
664
670
  }
665
671
  export interface SegmentedOption {
666
672
  value: string;
667
673
  label: string;
668
- icon?: IconInput;
674
+ icon?: IconInput | undefined;
669
675
  /** Show only the icon; `label` becomes its accessible name and tooltip. */
670
- iconOnly?: boolean;
671
- disabled?: boolean;
676
+ iconOnly?: boolean | undefined;
677
+ disabled?: boolean | undefined;
672
678
  }
673
679
  /** A row of 2–5 mutually exclusive choices that apply at once (view, period, unit). A radio group underneath. */
674
680
  export interface SegmentedControlProps {
675
681
  /** Accessible name of the group, e.g. "View". Required. */
676
682
  label: string;
677
683
  options: Array<SegmentedOption | string>;
678
- value?: string;
679
- defaultValue?: string;
680
- onChange?: (value: string) => void;
684
+ value?: string | undefined;
685
+ defaultValue?: string | undefined;
686
+ onChange?: ((value: string) => void) | undefined;
681
687
  /** `md` (default, 36px) or `sm` (28px) for toolbars. */
682
- size?: "sm" | "md";
688
+ size?: "sm" | "md" | undefined;
683
689
  /** Stretch across the container, segments equal width. */
684
- fullWidth?: boolean;
685
- disabled?: boolean;
686
- id?: string;
687
- className?: string;
690
+ fullWidth?: boolean | undefined;
691
+ disabled?: boolean | undefined;
692
+ id?: string | undefined;
693
+ className?: string | undefined;
688
694
  }
689
695
  /** ISO date string, `YYYY-MM-DD` (Gregorian — the era is display only). */
690
696
  export type ISODate = string;
691
697
  export interface DateDisplayOptions {
692
698
  /** Components: the AuraProvider's locale, else `en`. `formatDate()` (no provider to read): `th` unless given. */
693
- locale?: "th" | "en" | "sv";
699
+ locale?: "th" | "en" | "sv" | undefined;
694
700
  /** `buddhist` (พ.ศ.; default for th) or `gregory` (ค.ศ.; default for en and sv). */
695
- calendar?: "buddhist" | "gregory";
701
+ calendar?: "buddhist" | "gregory" | undefined;
696
702
  }
697
703
  export interface CalendarProps extends DateDisplayOptions {
698
- start?: ISODate | null;
699
- end?: ISODate | null;
700
- focus?: ISODate | null;
701
- range?: boolean;
702
- min?: ISODate;
703
- max?: ISODate;
704
- 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;
705
711
  /** 0 = Sunday (Thai default), 1 = Monday. */
706
- weekStartsOn?: 0 | 1;
707
- onSelect?: (iso: ISODate | null) => void;
712
+ weekStartsOn?: 0 | 1 | undefined;
713
+ onSelect?: ((iso: ISODate | null) => void) | undefined;
708
714
  /** Adds a Clear link to the footer. */
709
- onClear?: () => void;
715
+ onClear?: (() => void) | undefined;
710
716
  /** false hides the Today / Clear footer. */
711
- footer?: boolean;
717
+ footer?: boolean | undefined;
712
718
  /** Default true: focuses the selected (or today's) day on mount. */
713
- autoFocus?: boolean;
719
+ autoFocus?: boolean | undefined;
714
720
  }
715
721
  export interface DateFieldProps extends FieldProps, DateDisplayOptions {
716
- id?: string;
717
- name?: string;
718
- placeholder?: string;
719
- disabled?: boolean;
722
+ id?: string | undefined;
723
+ name?: string | undefined;
724
+ placeholder?: string | undefined;
725
+ disabled?: boolean | undefined;
720
726
  /** Clear button while there is a value. Default true. */
721
- clearable?: boolean;
722
- min?: ISODate;
723
- max?: ISODate;
724
- isDateDisabled?: (iso: ISODate) => boolean;
725
- weekStartsOn?: 0 | 1;
726
- 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;
727
733
  }
728
734
  export interface DatePickerProps extends DateFieldProps {
729
- value?: ISODate | null;
730
- defaultValue?: ISODate | null;
731
- onChange?: (value: ISODate | null) => void;
735
+ value?: ISODate | null | undefined;
736
+ defaultValue?: ISODate | null | undefined;
737
+ onChange?: ((value: ISODate | null) => void) | undefined;
732
738
  }
733
739
  export interface DateRange {
734
740
  start: ISODate | null;
735
741
  end: ISODate | null;
736
742
  }
737
743
  export interface DateRangePickerProps extends DateFieldProps {
738
- value?: DateRange;
739
- defaultValue?: DateRange;
740
- onChange?: (value: DateRange) => void;
744
+ value?: DateRange | undefined;
745
+ defaultValue?: DateRange | undefined;
746
+ onChange?: ((value: DateRange) => void) | undefined;
741
747
  }
742
748
  export interface DrawerProps {
743
749
  open: boolean;
744
750
  onClose: () => void;
745
751
  /** Default `right`. */
746
- side?: "right" | "left";
752
+ side?: "right" | "left" | undefined;
747
753
  /** sm 360 · md 480 (default) · lg 640 · nav = SideNav width. Full width below 640px. */
748
- size?: "sm" | "md" | "lg" | "nav";
749
- title?: string;
750
- description?: React$1.ReactNode;
751
- 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;
752
758
  /** Buttons, right-aligned; stacked on phones. */
753
- footer?: React$1.ReactNode;
759
+ footer?: React$1.ReactNode | undefined;
754
760
  /** Scrim click and Escape close it. Default true. */
755
- dismissible?: boolean;
761
+ dismissible?: boolean | undefined;
756
762
  /** Default true: focus moves to the element with `data-autofocus`, else the first control in the body. False only for static demos. */
757
- autoFocus?: boolean;
763
+ autoFocus?: boolean | undefined;
758
764
  /** Needed when there is no title. */
759
- "aria-label"?: string;
760
- className?: string;
765
+ "aria-label"?: string | undefined;
766
+ className?: string | undefined;
761
767
  }
762
768
  export type Breakpoint = "base" | "sm" | "md" | "lg" | "xl";
763
769
  export type Responsive<T> = T | Partial<Record<Breakpoint, T>>;
764
770
  /** Spacing step (aura-space-N) or any CSS length. */
765
771
  export type Space = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | string;
766
772
  export interface StackProps {
767
- direction?: Responsive<"row" | "column">;
768
- gap?: Responsive<Space>;
773
+ direction?: Responsive<"row" | "column"> | undefined;
774
+ gap?: Responsive<Space> | undefined;
769
775
  /** Cross-axis alignment; responsive like direction ({ base: 'stretch', sm: 'flex-end' }). */
770
- align?: Responsive<React$1.CSSProperties["alignItems"]>;
771
- justify?: React$1.CSSProperties["justifyContent"];
772
- wrap?: boolean;
773
- as?: keyof React$1.JSX.IntrinsicElements;
774
- className?: string;
775
- style?: React$1.CSSProperties;
776
- 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;
777
783
  }
778
784
  export interface GridProps {
779
- columns?: Responsive<number>;
785
+ columns?: Responsive<number> | undefined;
780
786
  /** Fit as many columns as there is room for, each at least this wide (px). Overrides columns. */
781
- minItemWidth?: number;
782
- gap?: Responsive<Space>;
783
- as?: keyof React$1.JSX.IntrinsicElements;
784
- className?: string;
785
- style?: React$1.CSSProperties;
786
- 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;
787
793
  }
788
794
  export interface AppShellProps {
789
795
  /** Usually a SideNav. Fixed from 1024px up; in a Drawer behind a menu button below. */
790
- nav?: React$1.ReactElement;
796
+ nav?: React$1.ReactElement | undefined;
791
797
  /** Top bar content (title, search, account menu). */
792
- header?: React$1.ReactNode;
793
- children?: React$1.ReactNode;
794
- navLabel?: string;
795
- menuLabel?: string;
798
+ header?: React$1.ReactNode | undefined;
799
+ children?: React$1.ReactNode | undefined;
800
+ navLabel?: string | undefined;
801
+ menuLabel?: string | undefined;
796
802
  /** id of `<main>`, for a skip link. Default `main`. */
797
- mainId?: string;
798
- className?: string;
803
+ mainId?: string | undefined;
804
+ className?: string | undefined;
799
805
  }
800
806
  export interface StatChange {
801
807
  /** Shown as written, e.g. "+12%" or "−3". */
802
808
  value: React$1.ReactNode;
803
- direction?: "up" | "down" | "flat";
809
+ direction?: "up" | "down" | "flat" | undefined;
804
810
  /** Default: up = positive, down = negative. Set it when a rise is bad (cancellations, wait time). */
805
- tone?: "positive" | "negative" | "neutral";
811
+ tone?: "positive" | "negative" | "neutral" | undefined;
806
812
  /** e.g. "vs last month". */
807
- label?: React$1.ReactNode;
813
+ label?: React$1.ReactNode | undefined;
808
814
  }
809
815
  export interface StatProps {
810
816
  label: React$1.ReactNode;
811
- value?: React$1.ReactNode;
817
+ value?: React$1.ReactNode | undefined;
812
818
  /** Small unit after the value ("งาน", "คน", "%"). */
813
- unit?: React$1.ReactNode;
814
- change?: StatChange;
815
- caption?: React$1.ReactNode;
816
- icon?: IconInput;
819
+ unit?: React$1.ReactNode | undefined;
820
+ change?: StatChange | undefined;
821
+ caption?: React$1.ReactNode | undefined;
822
+ icon?: IconInput | undefined;
817
823
  /** Skeleton in place of the value. */
818
- loading?: boolean;
824
+ loading?: boolean | undefined;
819
825
  /** Makes the whole card a link or a button (drill-down). */
820
- href?: string;
821
- onClick?: () => void;
822
- className?: string;
826
+ href?: string | undefined;
827
+ onClick?: (() => void) | undefined;
828
+ className?: string | undefined;
823
829
  }
824
830
  export interface TimePickerProps extends FieldProps {
825
831
  /** "HH:mm", 24-hour. */
826
- value?: string | null;
827
- defaultValue?: string | null;
828
- onChange?: (value: string | null) => void;
832
+ value?: string | null | undefined;
833
+ defaultValue?: string | null | undefined;
834
+ onChange?: ((value: string | null) => void) | undefined;
829
835
  /** Minutes between listed slots. Default 30. */
830
- step?: number;
836
+ step?: number | undefined;
831
837
  /** Earliest and latest allowed times, "HH:mm". Typed times outside them are refused with a message. */
832
- min?: string;
833
- max?: string;
834
- isTimeDisabled?: (time: string) => boolean;
838
+ min?: string | undefined;
839
+ max?: string | undefined;
840
+ isTimeDisabled?: ((time: string) => boolean) | undefined;
835
841
  /** Slot to scroll to when empty (e.g. "09:00"). Default: min. */
836
- suggest?: string;
842
+ suggest?: string | undefined;
837
843
  /** Clear button while there is a value. Default true. */
838
- clearable?: boolean;
839
- id?: string;
840
- name?: string;
841
- placeholder?: string;
842
- disabled?: boolean;
843
- readOnly?: boolean;
844
- 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;
845
851
  }
846
852
  export interface UploadItem {
847
853
  id: string;
848
854
  /** The browser File (absent for files already on the server). */
849
- file?: File;
855
+ file?: File | undefined;
850
856
  name: string;
851
- size?: number;
852
- type?: string;
857
+ size?: number | undefined;
858
+ type?: string | undefined;
853
859
  /** ready = picked, not sent yet. Set uploading/done yourself while sending. */
854
860
  status: "ready" | "uploading" | "done" | "error";
855
861
  /** 0–100 while uploading. */
856
- progress?: number;
857
- error?: string;
862
+ progress?: number | undefined;
863
+ error?: string | undefined;
858
864
  /** For files already stored (edit forms). */
859
- url?: string;
865
+ url?: string | undefined;
860
866
  }
861
867
  export interface FileUploadProps extends FieldProps {
862
- value?: UploadItem[];
863
- defaultValue?: UploadItem[];
864
- onChange?: (items: UploadItem[]) => void;
865
- onRemove?: (item: UploadItem) => void;
868
+ value?: UploadItem[] | undefined;
869
+ defaultValue?: UploadItem[] | undefined;
870
+ onChange?: ((items: UploadItem[]) => void) | undefined;
871
+ onRemove?: ((item: UploadItem) => void) | undefined;
866
872
  /** Same syntax as `<input accept>`: "image/*,.pdf". Checked on drop too. */
867
- accept?: string;
868
- multiple?: boolean;
873
+ accept?: string | undefined;
874
+ multiple?: boolean | undefined;
869
875
  /** Bytes per file. */
870
- maxSize?: number;
876
+ maxSize?: number | undefined;
871
877
  /** With multiple. */
872
- maxFiles?: number;
873
- id?: string;
874
- name?: string;
875
- disabled?: boolean;
876
- className?: string;
878
+ maxFiles?: number | undefined;
879
+ id?: string | undefined;
880
+ name?: string | undefined;
881
+ disabled?: boolean | undefined;
882
+ className?: string | undefined;
877
883
  }
878
884
  export type Tone = "neutral" | "accent" | "success" | "warning" | "danger";
879
885
  export interface BadgeProps extends React$1.HTMLAttributes<HTMLSpanElement> {
880
- tone?: Tone;
886
+ tone?: Tone | undefined;
881
887
  /** soft (default) · solid · outline */
882
- variant?: "soft" | "solid" | "outline";
883
- icon?: IconInput;
888
+ variant?: "soft" | "solid" | "outline" | undefined;
889
+ icon?: IconInput | undefined;
884
890
  }
885
891
  export interface TagProps extends Omit<React$1.HTMLAttributes<HTMLElement>, "onClick"> {
886
892
  children: React$1.ReactNode;
887
- icon?: IconInput;
893
+ icon?: IconInput | undefined;
888
894
  /** Adds a remove button (applied filters, chosen people). */
889
- onRemove?: () => void;
890
- removeLabel?: string;
895
+ onRemove?: (() => void) | undefined;
896
+ removeLabel?: string | undefined;
891
897
  /** Makes it a toggle chip (filter chips): renders a button with aria-pressed. */
892
- selected?: boolean;
893
- onClick?: (e: React$1.MouseEvent<HTMLButtonElement>) => void;
894
- disabled?: boolean;
898
+ selected?: boolean | undefined;
899
+ onClick?: ((e: React$1.MouseEvent<HTMLButtonElement>) => void) | undefined;
900
+ disabled?: boolean | undefined;
895
901
  }
896
902
  export interface ProgressProps {
897
903
  /** Omit for indeterminate. */
898
- value?: number;
899
- max?: number;
900
- label?: React$1.ReactNode;
901
- "aria-label"?: string;
902
- 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;
903
909
  /** Replaces the % text, e.g. "3 of 5 files". Also read out as aria-valuetext. */
904
- valueLabel?: React$1.ReactNode;
905
- hint?: React$1.ReactNode;
906
- tone?: Tone;
907
- size?: "sm" | "md";
908
- id?: string;
909
- 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;
910
916
  }
911
917
  export interface SkeletonProps {
912
- variant?: "text" | "rect" | "circle";
918
+ variant?: "text" | "rect" | "circle" | undefined;
913
919
  /** text only: number of lines (the last is shorter). */
914
- lines?: number;
915
- width?: number | string;
916
- height?: number | string;
920
+ lines?: number | undefined;
921
+ width?: number | string | undefined;
922
+ height?: number | string | undefined;
917
923
  /** circle diameter. */
918
- size?: number;
919
- className?: string;
924
+ size?: number | undefined;
925
+ className?: string | undefined;
920
926
  }
921
927
  export interface EmptyStateProps {
922
928
  title: React$1.ReactNode;
923
- description?: React$1.ReactNode;
924
- icon?: IconInput;
929
+ description?: React$1.ReactNode | undefined;
930
+ icon?: IconInput | undefined;
925
931
  /** One or two buttons. */
926
- action?: React$1.ReactNode;
927
- size?: "sm" | "md";
928
- bordered?: boolean;
929
- headingLevel?: 2 | 3 | 4 | 5 | 6;
930
- 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;
931
937
  }
932
938
  export interface PaginationProps {
933
939
  pageCount: number;
934
940
  /** 1-based, controlled; pair with onChange. Or defaultPage. */
935
- page?: number;
936
- defaultPage?: number;
937
- onChange?: (page: number) => void;
941
+ page?: number | undefined;
942
+ defaultPage?: number | undefined;
943
+ onChange?: ((page: number) => void) | undefined;
938
944
  /** Pages shown each side of the current one. Default 1. */
939
- siblingCount?: number;
945
+ siblingCount?: number | undefined;
940
946
  /** Render real links (SEO, open in new tab); onChange still runs for client routing. */
941
- getHref?: (page: number) => string;
942
- label?: string;
943
- className?: string;
947
+ getHref?: ((page: number) => string) | undefined;
948
+ label?: string | undefined;
949
+ className?: string | undefined;
944
950
  }
945
951
  export interface AccordionItem {
946
952
  id: string;
947
953
  title: React$1.ReactNode;
948
- description?: React$1.ReactNode;
954
+ description?: React$1.ReactNode | undefined;
949
955
  content: React$1.ReactNode;
950
- icon?: IconInput;
951
- disabled?: boolean;
956
+ icon?: IconInput | undefined;
957
+ disabled?: boolean | undefined;
952
958
  }
953
959
  export interface AccordionProps {
954
960
  items: AccordionItem[];
955
961
  /** single (default): one open at a time. multiple: any number. */
956
- type?: "single" | "multiple";
957
- value?: string | null | string[];
958
- defaultValue?: string | null | string[];
959
- 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;
960
966
  /** single only: false keeps one section always open. Default true. */
961
- collapsible?: boolean;
962
- headingLevel?: 2 | 3 | 4 | 5 | 6;
963
- id?: string;
964
- className?: string;
967
+ collapsible?: boolean | undefined;
968
+ headingLevel?: 2 | 3 | 4 | 5 | 6 | undefined;
969
+ id?: string | undefined;
970
+ className?: string | undefined;
965
971
  }
966
972
  export interface PopoverProps {
967
973
  /** One element; it gets aria-haspopup, aria-expanded and the click toggle. */
@@ -969,27 +975,27 @@ export interface PopoverProps {
969
975
  children: React$1.ReactNode | ((api: {
970
976
  close: () => void;
971
977
  }) => React$1.ReactNode);
972
- title?: React$1.ReactNode;
978
+ title?: React$1.ReactNode | undefined;
973
979
  /** Accessible name when there is no title. */
974
- label?: string;
975
- open?: boolean;
976
- defaultOpen?: boolean;
977
- onOpenChange?: (open: boolean) => void;
978
- placement?: "bottom-start" | "bottom-end" | "bottom-center" | "top-start" | "top-end" | "top-center";
979
- 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;
980
986
  /** Default true: focus moves to [data-autofocus] or the first control inside. */
981
- autoFocus?: boolean;
982
- id?: string;
983
- className?: string;
987
+ autoFocus?: boolean | undefined;
988
+ id?: string | undefined;
989
+ className?: string | undefined;
984
990
  }
985
991
  export interface ThemeOptions {
986
992
  /** The project's brand colour, #rgb or #rrggbb. Replaces AURA violet (links, focus ring, selection, info, progress, creative shadow in dark, mesh). */
987
993
  brand: string;
988
994
  /** Optional signal colour; replaces AURA lime in the accent dot and mesh only (success/ready stay green). */
989
- signal?: string;
995
+ signal?: string | undefined;
990
996
  /** ink (default): primary buttons stay zinc ink. brand: primary buttons use the brand colour. */
991
- primary?: "ink" | "brand";
992
- name?: string;
997
+ primary?: "ink" | "brand" | undefined;
998
+ name?: string | undefined;
993
999
  }
994
1000
  export interface ThemeCheck {
995
1001
  theme: "light" | "dark";
@@ -1022,7 +1028,7 @@ export declare const iconNames: IconName[];
1022
1028
  export interface ButtonComponent {
1023
1029
  (props: ButtonLinkProps & React$1.RefAttributes<HTMLAnchorElement>): React$1.ReactElement | null;
1024
1030
  (props: ButtonProps & React$1.RefAttributes<HTMLButtonElement>): React$1.ReactElement | null;
1025
- displayName?: string;
1031
+ displayName?: string | undefined;
1026
1032
  }
1027
1033
  /** AURA pill button. Enterprise (`primary`, `secondary`) for product UI; `creative` for marketing moments only.
1028
1034
  * With `href` it renders a link that looks the same (`<a>`, or your router's link via `linkComponent`). */
@@ -1039,15 +1045,15 @@ export declare const StatusPill: React$1.ForwardRefExoticComponent<StatusPillPro
1039
1045
  /** Field: label, required/optional marks, the control, then the hint or error line. Wrap a custom control in it. */
1040
1046
  export interface FieldComponentProps extends Omit<FieldPropsPublic, "label"> {
1041
1047
  /** Visible label. Omit only when the control is labelled another way. */
1042
- label?: React$1.ReactNode;
1048
+ label?: React$1.ReactNode | undefined;
1043
1049
  /** The control's id: the label points at it, and the hint/error ids derive from it. */
1044
- id?: string;
1045
- children?: React$1.ReactNode;
1050
+ id?: string | undefined;
1051
+ children?: React$1.ReactNode | undefined;
1046
1052
  /** Render the label as another element (e.g. `span` for a group of controls) with this id. */
1047
- labelAs?: string;
1048
- labelId?: string;
1049
- disabled?: boolean;
1050
- className?: string;
1053
+ labelAs?: string | undefined;
1054
+ labelId?: string | undefined;
1055
+ disabled?: boolean | undefined;
1056
+ className?: string | undefined;
1051
1057
  }
1052
1058
  export declare const Field: React$1.ForwardRefExoticComponent<FieldComponentProps & React$1.RefAttributes<HTMLDivElement>>;
1053
1059
  export declare const TextField: React$1.ForwardRefExoticComponent<TextFieldProps & React$1.RefAttributes<HTMLInputElement>>;
@@ -1059,7 +1065,7 @@ export declare const Switch: React$1.ForwardRefExoticComponent<SwitchProps & Rea
1059
1065
  export interface ComboboxComponent {
1060
1066
  (props: ComboboxMultipleProps & React$1.RefAttributes<HTMLInputElement>): React$1.ReactElement | null;
1061
1067
  (props: ComboboxProps & React$1.RefAttributes<HTMLInputElement>): React$1.ReactElement | null;
1062
- displayName?: string;
1068
+ displayName?: string | undefined;
1063
1069
  }
1064
1070
  /** The Thai-aware default filter: label, description and keywords contain the query. */
1065
1071
  declare function defaultFilter(option: ComboboxOption, query: string): boolean;
@@ -1067,7 +1073,7 @@ declare function defaultFilter(option: ComboboxOption, query: string): boolean;
1067
1073
  export declare const Combobox: ComboboxComponent;
1068
1074
  /** Options for formatDate: locale/calendar plus a preset or any Intl.DateTimeFormat options. */
1069
1075
  export type FormatDateOptions = DateDisplayOptions & {
1070
- format?: "short" | "long" | "numeric" | Intl.DateTimeFormatOptions;
1076
+ format?: "short" | "long" | "numeric" | Intl.DateTimeFormatOptions | undefined;
1071
1077
  };
1072
1078
  /** Format an ISO date for display, e.g. "18 ก.ย. 2569" (th, Buddhist) or "18 Sept 2026" (en, Gregorian). */
1073
1079
  export declare function formatDate(iso: ISODate | null | undefined, opts?: FormatDateOptions): string;
@@ -1093,7 +1099,7 @@ export declare namespace toast {
1093
1099
  }
1094
1100
  export interface ToasterProps {
1095
1101
  /** Default `bottom`. */
1096
- position?: "bottom" | "top";
1102
+ position?: "bottom" | "top" | undefined;
1097
1103
  }
1098
1104
  export declare function Toaster(props: ToasterProps): React$1.ReactElement | null;
1099
1105
  export declare const PasswordField: React$1.ForwardRefExoticComponent<PasswordFieldProps & React$1.RefAttributes<HTMLInputElement>>;
@@ -1119,15 +1125,17 @@ export declare const Grid: React$1.ForwardRefExoticComponent<GridProps & React$1
1119
1125
  /** Centred page column. */
1120
1126
  export interface ContainerProps {
1121
1127
  /** `narrow` caps it at aura-container-narrow (720px). Default `default` (1280px). */
1122
- size?: "default" | "narrow";
1123
- as?: keyof React$1.JSX.IntrinsicElements;
1124
- className?: string;
1125
- style?: React$1.CSSProperties;
1126
- 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;
1127
1133
  }
1128
1134
  /** Container — centres content up to aura-container-max (1280px) with responsive side padding. */
1129
1135
  export declare const Container: React$1.ForwardRefExoticComponent<ContainerProps & React$1.RefAttributes<HTMLElement>>;
1130
- /** 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. */
1131
1139
  export declare const AppShell: React$1.ForwardRefExoticComponent<AppShellProps & React$1.RefAttributes<HTMLDivElement>>;
1132
1140
  /** Min-width breakpoints in px, mirroring the aura-bp-* tokens. */
1133
1141
  export declare const breakpoints: {
@@ -1230,9 +1238,9 @@ export interface AuraLocaleValue {
1230
1238
  calendar: "buddhist" | "gregory" | null;
1231
1239
  strings: AuraStrings;
1232
1240
  /** The router link set on AuraProvider, if any. */
1233
- linkComponent?: React$1.ElementType | null;
1241
+ linkComponent?: React$1.ElementType | null | undefined;
1234
1242
  /** The density set on the nearest AuraProvider that sets one (null: none, i.e. comfortable unless an ancestor's data-density says otherwise). */
1235
- density?: "comfortable" | "compact" | null;
1243
+ density?: "comfortable" | "compact" | null | undefined;
1236
1244
  }
1237
1245
  /** Sets the language of built-in labels (and the default date locale) for everything inside. */
1238
1246
  export declare function AuraProvider(props: AuraProviderProps): React$1.ReactElement;
@@ -1258,23 +1266,23 @@ declare function scale(hex: string): Theme["brand"];
1258
1266
  export declare function createTheme(opts: ThemeOptions): Theme;
1259
1267
  export interface ThemeStyleProps extends ThemeOptions {
1260
1268
  /** Scope the theme to this selector instead of the whole page (multi-tenant). */
1261
- selector?: string;
1269
+ selector?: string | undefined;
1262
1270
  }
1263
1271
  export declare function ThemeStyle(props: ThemeStyleProps): React$1.ReactElement;
1264
1272
  /** `system` follows the operating system and changes with it. */
1265
1273
  export type ColorScheme = "light" | "dark" | "system";
1266
1274
  export interface ColorSchemeOptions {
1267
1275
  /** localStorage key for the choice. Default `aura-color-scheme`. */
1268
- storageKey?: string;
1276
+ storageKey?: string | undefined;
1269
1277
  /** Used when nothing is saved. Default `system`. */
1270
- defaultScheme?: ColorScheme;
1278
+ defaultScheme?: ColorScheme | undefined;
1271
1279
  }
1272
1280
  /** The script ColorSchemeScript renders, as a string — for frameworks that want it in a raw <head> template. */
1273
1281
  export declare function colorSchemeScript(options?: ColorSchemeOptions): string;
1274
1282
  /** Put in <head>: applies the saved colour scheme before the page paints. Server-rendering safe. */
1275
1283
  export declare function ColorSchemeScript(props: ColorSchemeOptions & {
1276
1284
  /** Nonce for a nonce-based Content-Security-Policy (script-src 'nonce-…'). */
1277
- nonce?: string;
1285
+ nonce?: string | undefined;
1278
1286
  }): React$1.ReactElement;
1279
1287
  /** Current colour scheme and a setter. `resolved` is what is on screen (system resolved to light or dark). */
1280
1288
  export interface ColorSchemeState {
@@ -1286,7 +1294,7 @@ export interface ColorSchemeState {
1286
1294
  export declare function useColorScheme(options?: ColorSchemeOptions): ColorSchemeState;
1287
1295
  export interface ColorSchemeToggleProps extends ColorSchemeOptions {
1288
1296
  /** Accessible name of the button. Default: the built-in "Colour scheme" label. */
1289
- label?: string;
1297
+ label?: string | undefined;
1290
1298
  }
1291
1299
  /** Icon button with a menu: Light, Dark, System. Shows a sun or a moon for what is on screen. */
1292
1300
  export declare function ColorSchemeToggle(props: ColorSchemeToggleProps): React$1.ReactElement;