twico-ui 1.46.0 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1636,6 +1636,34 @@ interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "o
1636
1636
  label?: React.ReactNode;
1637
1637
  /** Helper text shown below when there is no error. */
1638
1638
  hint?: React.ReactNode;
1639
+ /**
1640
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
1641
+ * same height as one that has a `hint`, an `error` or a counter.
1642
+ *
1643
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
1644
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
1645
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
1646
+ * controls part company as soon as one label wraps at a narrow width.
1647
+ *
1648
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
1649
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
1650
+ * misalignment straight back:
1651
+ *
1652
+ * ```jsx
1653
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
1654
+ * <Select label="Filter" … />
1655
+ * <Select label="Comparison" hint="Matches the whole value." … />
1656
+ * <Input label="Value" … />
1657
+ * </Stack>
1658
+ * ```
1659
+ *
1660
+ * The lane is held open by generated content, so it matches the real footer by construction -
1661
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
1662
+ * It adds no text to the accessibility tree.
1663
+ *
1664
+ * @default false
1665
+ */
1666
+ reserveFooter?: boolean;
1639
1667
  /** Error message — turns the field red and replaces the hint. */
1640
1668
  error?: React.ReactNode;
1641
1669
  /** Marks the field required (adds an asterisk to the label). @default false */
@@ -1696,6 +1724,34 @@ interface OptionGroup {
1696
1724
  interface ComboboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "value" | "defaultValue" | "onChange"> {
1697
1725
  label?: React.ReactNode;
1698
1726
  hint?: React.ReactNode;
1727
+ /**
1728
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
1729
+ * same height as one that has a `hint`, an `error` or a counter.
1730
+ *
1731
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
1732
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
1733
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
1734
+ * controls part company as soon as one label wraps at a narrow width.
1735
+ *
1736
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
1737
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
1738
+ * misalignment straight back:
1739
+ *
1740
+ * ```jsx
1741
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
1742
+ * <Select label="Filter" … />
1743
+ * <Select label="Comparison" hint="Matches the whole value." … />
1744
+ * <Input label="Value" … />
1745
+ * </Stack>
1746
+ * ```
1747
+ *
1748
+ * The lane is held open by generated content, so it matches the real footer by construction -
1749
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
1750
+ * It adds no text to the accessibility tree.
1751
+ *
1752
+ * @default false
1753
+ */
1754
+ reserveFooter?: boolean;
1699
1755
  error?: React.ReactNode;
1700
1756
  required?: boolean;
1701
1757
  size?: "sm" | "md" | "lg";
@@ -1825,6 +1881,34 @@ interface CurrencyProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>
1825
1881
  label?: React.ReactNode;
1826
1882
  /** Helper text below the field; linked to the input via aria-describedby. */
1827
1883
  hint?: React.ReactNode;
1884
+ /**
1885
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
1886
+ * same height as one that has a `hint`, an `error` or a counter.
1887
+ *
1888
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
1889
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
1890
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
1891
+ * controls part company as soon as one label wraps at a narrow width.
1892
+ *
1893
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
1894
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
1895
+ * misalignment straight back:
1896
+ *
1897
+ * ```jsx
1898
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
1899
+ * <Select label="Filter" … />
1900
+ * <Select label="Comparison" hint="Matches the whole value." … />
1901
+ * <Input label="Value" … />
1902
+ * </Stack>
1903
+ * ```
1904
+ *
1905
+ * The lane is held open by generated content, so it matches the real footer by construction -
1906
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
1907
+ * It adds no text to the accessibility tree.
1908
+ *
1909
+ * @default false
1910
+ */
1911
+ reserveFooter?: boolean;
1828
1912
  /** Error text below the field; sets aria-invalid and is linked via aria-describedby (takes precedence over hint). */
1829
1913
  error?: React.ReactNode;
1830
1914
  /** Intercepted to render the label asterisk, and forwarded to the native input as `required`. @default false */
@@ -1865,6 +1949,34 @@ interface CurrencyFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputEle
1865
1949
  label?: React.ReactNode;
1866
1950
  /** Helper text below the field; linked to the input via aria-describedby. */
1867
1951
  hint?: React.ReactNode;
1952
+ /**
1953
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
1954
+ * same height as one that has a `hint`, an `error` or a counter.
1955
+ *
1956
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
1957
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
1958
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
1959
+ * controls part company as soon as one label wraps at a narrow width.
1960
+ *
1961
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
1962
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
1963
+ * misalignment straight back:
1964
+ *
1965
+ * ```jsx
1966
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
1967
+ * <Select label="Filter" … />
1968
+ * <Select label="Comparison" hint="Matches the whole value." … />
1969
+ * <Input label="Value" … />
1970
+ * </Stack>
1971
+ * ```
1972
+ *
1973
+ * The lane is held open by generated content, so it matches the real footer by construction -
1974
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
1975
+ * It adds no text to the accessibility tree.
1976
+ *
1977
+ * @default false
1978
+ */
1979
+ reserveFooter?: boolean;
1868
1980
  /** Error text below the field; sets aria-invalid and is linked via aria-describedby (takes precedence over hint). */
1869
1981
  error?: React.ReactNode;
1870
1982
  /** Intercepted to render the label asterisk, and forwarded to the native input as `required`. @default false */
@@ -2038,6 +2150,31 @@ interface DatatableProps<T = any> extends Omit<React.HTMLAttributes<HTMLDivEleme
2038
2150
  * `tr.twc-dt__row.my-row .twc-dt__td`. You are then choosing to cover the hover cue on those rows.
2039
2151
  */
2040
2152
  getRowClassName?: (row: T, index: number) => string | undefined;
2153
+ /**
2154
+ * Default vertical alignment for every body cell, as `data-valign`. Only visible once rows vary
2155
+ * in height - a `wrapText` column, a multi-line `renderCell`, or a drag-resized row; with
2156
+ * single-line rows every value looks the same.
2157
+ *
2158
+ * **Precedence, lowest first: this → {@link getRowVerticalAlign} → the column's
2159
+ * `verticalAlign`.** It is resolved in one place and emitted as a single `data-valign` on the
2160
+ * cell, rather than as three competing CSS rules, so the order is readable in the code and an
2161
+ * unrelated stylesheet edit cannot reorder it.
2162
+ *
2163
+ * @default unset — cells keep the browser's `middle`, except `wrapText` cells, which sit `top`
2164
+ */
2165
+ verticalAlign?: "top" | "middle" | "bottom";
2166
+ /**
2167
+ * Vertical alignment for one row's cells, called `(row, index)` like {@link getRowStyle}. Return
2168
+ * `undefined` to leave a row on the table default.
2169
+ *
2170
+ * Overrides {@link verticalAlign} but **not** a column's own `verticalAlign`: an explicit column
2171
+ * value is a property of that column's content type and is almost always a deliberate exemption
2172
+ * (the actions column stays centred while the rest of the row moves). If you need a row to move
2173
+ * every cell, leave the columns' values unset.
2174
+ *
2175
+ * `index` is page-relative, the same as {@link getRowStyle}.
2176
+ */
2177
+ getRowVerticalAlign?: (row: T, index: number) => "top" | "middle" | "bottom" | undefined;
2041
2178
  /** Restrict the toolbar quick-search to these column `field`s (client mode); defaults to every
2042
2179
  * visible column. Mirrors `runDatatableQuery`'s `options.searchFields`. */
2043
2180
  searchFields?: string[];
@@ -2557,6 +2694,20 @@ interface DatatableColumn<T = any> {
2557
2694
  align?: "left" | "center" | "right";
2558
2695
  /** Header-cell alignment, when it should differ from the body `align`. @default the column's `align` */
2559
2696
  headerAlign?: "left" | "center" | "right";
2697
+ /**
2698
+ * Vertical alignment of this column's body cells, as `data-valign`. The transpose of `align`:
2699
+ * `align` decides where content sits across the column's width, this decides where it sits down
2700
+ * the row's height. Only visible once rows vary in height - a `wrapText` column, a multi-line
2701
+ * `renderCell`, or a drag-resized row.
2702
+ *
2703
+ * **Wins over the row and table values.** A per-column setting is a statement about this column's
2704
+ * content type - an actions column or a status badge that should stay centred however tall the
2705
+ * row gets - so it survives a row-level or table-wide sweep. To move a whole row including this
2706
+ * column, leave the column's value unset.
2707
+ *
2708
+ * @default `"top"` for `wrapText` columns, otherwise the table's `verticalAlign`
2709
+ */
2710
+ verticalAlign?: "top" | "middle" | "bottom";
2560
2711
  /** Allow sorting this column. @default true */
2561
2712
  sortable?: boolean;
2562
2713
  /** Allow filtering this column. @default true */
@@ -3053,6 +3204,34 @@ interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "on
3053
3204
  label?: React.ReactNode;
3054
3205
  /** Helper text shown below when there is no error. */
3055
3206
  hint?: React.ReactNode;
3207
+ /**
3208
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3209
+ * same height as one that has a `hint`, an `error` or a counter.
3210
+ *
3211
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3212
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3213
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3214
+ * controls part company as soon as one label wraps at a narrow width.
3215
+ *
3216
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3217
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3218
+ * misalignment straight back:
3219
+ *
3220
+ * ```jsx
3221
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3222
+ * <Select label="Filter" … />
3223
+ * <Select label="Comparison" hint="Matches the whole value." … />
3224
+ * <Input label="Value" … />
3225
+ * </Stack>
3226
+ * ```
3227
+ *
3228
+ * The lane is held open by generated content, so it matches the real footer by construction -
3229
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3230
+ * It adds no text to the accessibility tree.
3231
+ *
3232
+ * @default false
3233
+ */
3234
+ reserveFooter?: boolean;
3056
3235
  /** Error message — turns the field red and replaces the hint. */
3057
3236
  error?: React.ReactNode;
3058
3237
  /** Marks the field required (adds an asterisk to the label). @default false */
@@ -3106,6 +3285,34 @@ interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>
3106
3285
  label?: React.ReactNode;
3107
3286
  /** Helper text shown below when there is no error. */
3108
3287
  hint?: React.ReactNode;
3288
+ /**
3289
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3290
+ * same height as one that has a `hint`, an `error` or a counter.
3291
+ *
3292
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3293
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3294
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3295
+ * controls part company as soon as one label wraps at a narrow width.
3296
+ *
3297
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3298
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3299
+ * misalignment straight back:
3300
+ *
3301
+ * ```jsx
3302
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3303
+ * <Select label="Filter" … />
3304
+ * <Select label="Comparison" hint="Matches the whole value." … />
3305
+ * <Input label="Value" … />
3306
+ * </Stack>
3307
+ * ```
3308
+ *
3309
+ * The lane is held open by generated content, so it matches the real footer by construction -
3310
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3311
+ * It adds no text to the accessibility tree.
3312
+ *
3313
+ * @default false
3314
+ */
3315
+ reserveFooter?: boolean;
3109
3316
  /** Error message — turns the field red and replaces the hint. */
3110
3317
  error?: React.ReactNode;
3111
3318
  /** Marks the field required (adds an asterisk to the label). @default false */
@@ -3163,6 +3370,34 @@ interface TimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "on
3163
3370
  label?: React.ReactNode;
3164
3371
  /** Helper text shown below when there is no error. */
3165
3372
  hint?: React.ReactNode;
3373
+ /**
3374
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3375
+ * same height as one that has a `hint`, an `error` or a counter.
3376
+ *
3377
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3378
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3379
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3380
+ * controls part company as soon as one label wraps at a narrow width.
3381
+ *
3382
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3383
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3384
+ * misalignment straight back:
3385
+ *
3386
+ * ```jsx
3387
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3388
+ * <Select label="Filter" … />
3389
+ * <Select label="Comparison" hint="Matches the whole value." … />
3390
+ * <Input label="Value" … />
3391
+ * </Stack>
3392
+ * ```
3393
+ *
3394
+ * The lane is held open by generated content, so it matches the real footer by construction -
3395
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3396
+ * It adds no text to the accessibility tree.
3397
+ *
3398
+ * @default false
3399
+ */
3400
+ reserveFooter?: boolean;
3166
3401
  /** Error message — turns the field red and replaces the hint. */
3167
3402
  error?: React.ReactNode;
3168
3403
  /** Marks the field required (adds an asterisk to the label). @default false */
@@ -3218,6 +3453,34 @@ interface DateTimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
3218
3453
  label?: React.ReactNode;
3219
3454
  /** Helper text shown below when there is no error. */
3220
3455
  hint?: React.ReactNode;
3456
+ /**
3457
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3458
+ * same height as one that has a `hint`, an `error` or a counter.
3459
+ *
3460
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3461
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3462
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3463
+ * controls part company as soon as one label wraps at a narrow width.
3464
+ *
3465
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3466
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3467
+ * misalignment straight back:
3468
+ *
3469
+ * ```jsx
3470
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3471
+ * <Select label="Filter" … />
3472
+ * <Select label="Comparison" hint="Matches the whole value." … />
3473
+ * <Input label="Value" … />
3474
+ * </Stack>
3475
+ * ```
3476
+ *
3477
+ * The lane is held open by generated content, so it matches the real footer by construction -
3478
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3479
+ * It adds no text to the accessibility tree.
3480
+ *
3481
+ * @default false
3482
+ */
3483
+ reserveFooter?: boolean;
3221
3484
  /** Error message — recolors both controls and replaces the hint. */
3222
3485
  error?: React.ReactNode;
3223
3486
  /** Marks the field required (adds an asterisk to the label). @default false */
@@ -3275,6 +3538,34 @@ declare function DateTimePicker(props: DateTimePickerProps): React.JSX.Element;
3275
3538
  interface MultiSelectProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "value" | "defaultValue" | "onChange"> {
3276
3539
  label?: React.ReactNode;
3277
3540
  hint?: React.ReactNode;
3541
+ /**
3542
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3543
+ * same height as one that has a `hint`, an `error` or a counter.
3544
+ *
3545
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3546
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3547
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3548
+ * controls part company as soon as one label wraps at a narrow width.
3549
+ *
3550
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3551
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3552
+ * misalignment straight back:
3553
+ *
3554
+ * ```jsx
3555
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3556
+ * <Select label="Filter" … />
3557
+ * <Select label="Comparison" hint="Matches the whole value." … />
3558
+ * <Input label="Value" … />
3559
+ * </Stack>
3560
+ * ```
3561
+ *
3562
+ * The lane is held open by generated content, so it matches the real footer by construction -
3563
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3564
+ * It adds no text to the accessibility tree.
3565
+ *
3566
+ * @default false
3567
+ */
3568
+ reserveFooter?: boolean;
3278
3569
  error?: React.ReactNode;
3279
3570
  required?: boolean;
3280
3571
  /** Control height preset, matching Select/Combobox. @default "md" */
@@ -3540,6 +3831,34 @@ interface FieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "id"> {
3540
3831
  label?: React.ReactNode;
3541
3832
  /** Helper text shown below when there is no error. */
3542
3833
  hint?: React.ReactNode;
3834
+ /**
3835
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
3836
+ * same height as one that has a `hint`, an `error` or a counter.
3837
+ *
3838
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
3839
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
3840
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
3841
+ * controls part company as soon as one label wraps at a narrow width.
3842
+ *
3843
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
3844
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
3845
+ * misalignment straight back:
3846
+ *
3847
+ * ```jsx
3848
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
3849
+ * <Select label="Filter" … />
3850
+ * <Select label="Comparison" hint="Matches the whole value." … />
3851
+ * <Input label="Value" … />
3852
+ * </Stack>
3853
+ * ```
3854
+ *
3855
+ * The lane is held open by generated content, so it matches the real footer by construction -
3856
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
3857
+ * It adds no text to the accessibility tree.
3858
+ *
3859
+ * @default false
3860
+ */
3861
+ reserveFooter?: boolean;
3543
3862
  /** Error message — replaces the hint and renders in the danger color. */
3544
3863
  error?: React.ReactNode;
3545
3864
  /** Marks the field required (adds an asterisk after the label). @default false */
@@ -3728,6 +4047,34 @@ interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "
3728
4047
  label?: React.ReactNode;
3729
4048
  /** Helper text shown below when there is no error. */
3730
4049
  hint?: React.ReactNode;
4050
+ /**
4051
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
4052
+ * same height as one that has a `hint`, an `error` or a counter.
4053
+ *
4054
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
4055
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
4056
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
4057
+ * controls part company as soon as one label wraps at a narrow width.
4058
+ *
4059
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
4060
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
4061
+ * misalignment straight back:
4062
+ *
4063
+ * ```jsx
4064
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
4065
+ * <Select label="Filter" … />
4066
+ * <Select label="Comparison" hint="Matches the whole value." … />
4067
+ * <Input label="Value" … />
4068
+ * </Stack>
4069
+ * ```
4070
+ *
4071
+ * The lane is held open by generated content, so it matches the real footer by construction -
4072
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
4073
+ * It adds no text to the accessibility tree.
4074
+ *
4075
+ * @default false
4076
+ */
4077
+ reserveFooter?: boolean;
3731
4078
  /** Error message — turns the field red and replaces the hint. */
3732
4079
  error?: React.ReactNode;
3733
4080
  /** Marks the field required (adds an asterisk and forwards to the native input). */
@@ -4036,6 +4383,34 @@ interface RadioGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "on
4036
4383
  label?: React.ReactNode;
4037
4384
  /** Helper text below the group. */
4038
4385
  hint?: React.ReactNode;
4386
+ /**
4387
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
4388
+ * same height as one that has a `hint`, an `error` or a counter.
4389
+ *
4390
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
4391
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
4392
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
4393
+ * controls part company as soon as one label wraps at a narrow width.
4394
+ *
4395
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
4396
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
4397
+ * misalignment straight back:
4398
+ *
4399
+ * ```jsx
4400
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
4401
+ * <Select label="Filter" … />
4402
+ * <Select label="Comparison" hint="Matches the whole value." … />
4403
+ * <Input label="Value" … />
4404
+ * </Stack>
4405
+ * ```
4406
+ *
4407
+ * The lane is held open by generated content, so it matches the real footer by construction -
4408
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
4409
+ * It adds no text to the accessibility tree.
4410
+ *
4411
+ * @default false
4412
+ */
4413
+ reserveFooter?: boolean;
4039
4414
  /** Error text below the group; sets `aria-invalid` and is announced once for the whole group. */
4040
4415
  error?: React.ReactNode;
4041
4416
  /** Lay the radios in a column or a wrapping row. @default "vertical" */
@@ -4098,6 +4473,34 @@ declare function Rating(props: RatingProps): React.JSX.Element;
4098
4473
  interface SelectProps extends Omit<React.HTMLAttributes<HTMLButtonElement>, "onChange" | "defaultValue"> {
4099
4474
  label?: React.ReactNode;
4100
4475
  hint?: React.ReactNode;
4476
+ /**
4477
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
4478
+ * same height as one that has a `hint`, an `error` or a counter.
4479
+ *
4480
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
4481
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
4482
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
4483
+ * controls part company as soon as one label wraps at a narrow width.
4484
+ *
4485
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
4486
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
4487
+ * misalignment straight back:
4488
+ *
4489
+ * ```jsx
4490
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
4491
+ * <Select label="Filter" … />
4492
+ * <Select label="Comparison" hint="Matches the whole value." … />
4493
+ * <Input label="Value" … />
4494
+ * </Stack>
4495
+ * ```
4496
+ *
4497
+ * The lane is held open by generated content, so it matches the real footer by construction -
4498
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
4499
+ * It adds no text to the accessibility tree.
4500
+ *
4501
+ * @default false
4502
+ */
4503
+ reserveFooter?: boolean;
4101
4504
  error?: React.ReactNode;
4102
4505
  required?: boolean;
4103
4506
  size?: "sm" | "md" | "lg";
@@ -4535,6 +4938,34 @@ interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement
4535
4938
  label?: React.ReactNode;
4536
4939
  /** Helper text shown below when there is no error. */
4537
4940
  hint?: React.ReactNode;
4941
+ /**
4942
+ * #494: always render the footer lane, empty when there is nothing to say, so this field is the
4943
+ * same height as one that has a `hint`, an `error` or a counter.
4944
+ *
4945
+ * A row of fields aligned with `align="flex-end"` splits onto two lines the moment ONE of them
4946
+ * has a hint: that field grows a footer, the others do not, and the caption ends up moving a
4947
+ * *different* control. `align` cannot fix it - `flex-start` lines up the labels instead, so the
4948
+ * controls part company as soon as one label wraps at a narrow width.
4949
+ *
4950
+ * Set it per field, or once on any ancestor for everything inside, which is the safer habit in a
4951
+ * row - with a per-field prop alone, adding a field later and forgetting it brings the
4952
+ * misalignment straight back:
4953
+ *
4954
+ * ```jsx
4955
+ * <Stack direction="row" align="flex-end" data-reserve-footer>
4956
+ * <Select label="Filter" … />
4957
+ * <Select label="Comparison" hint="Matches the whole value." … />
4958
+ * <Input label="Value" … />
4959
+ * </Stack>
4960
+ * ```
4961
+ *
4962
+ * The lane is held open by generated content, so it matches the real footer by construction -
4963
+ * same font metrics, same flex gap - rather than by a height that drifts when a token changes.
4964
+ * It adds no text to the accessibility tree.
4965
+ *
4966
+ * @default false
4967
+ */
4968
+ reserveFooter?: boolean;
4538
4969
  /** Error message — turns the field red and replaces the hint. */
4539
4970
  error?: React.ReactNode;
4540
4971
  /** Marks the field required (adds an asterisk and forwards to the native textarea). */
@@ -5251,4 +5682,5 @@ declare function useFilePicker(options?: UseFilePickerOptions): {
5251
5682
  getInputProps: () => React.InputHTMLAttributes<HTMLInputElement> & { ref: React.RefObject<HTMLInputElement | null> };
5252
5683
  };
5253
5684
 
5254
- export { Accordion, type AccordionItem, type AccordionProps, type ActionTone, Alert, type AlertProps, Anchor, type AnchorProps, AppShell, type AppShellProps, Avatar, AvatarMenu, type AvatarMenuProps, type AvatarProps, Badge, type BadgeProps, type BarTone, Box, type BoxOwnProps, type BoxProps, Boxplot, type BoxplotDatum, type BoxplotProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, BubbleChart, type BubbleChartProps, Button, type ButtonProps, Candlestick, type CandlestickDatum, type CandlestickProps, Card, CardGrid, type CardGridBatchAction, type CardGridBatchActionContext, type CardGridFilter, type CardGridProps, type CardGridQuery, type CardGridSort, type CardGridSortOption, type CardProps, Carousel, type CarouselProps, Chart, type ChartDatum, type ChartProps, Checkbox, type CheckboxProps, Code, type CodeProps, ColorPicker, type ColorPickerProps, ColorSchemeScript, type ColorSchemeScriptOptions, type ColorSchemeScriptProps, Combobox, type ComboboxGroup, type ComboboxOption, type ComboboxProps, type Command, CommandPalette, type CommandPaletteProps, Container, type ContainerOwnProps, type ContainerProps, Currency, CurrencyField, type CurrencyFieldProps, type CurrencyOption, type CurrencyProps, Datatable, type DatatableBatchAction, type DatatableBatchActionContext, type DatatableBatchUpdateDetail, type DatatableColumn, type DatatableFilter, type DatatableFilterOp, type DatatableNumberOp, type DatatableProps, type DatatableQuery, type DatatableRowAction, type DatatableState, type DatatableStringOp, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, DateTimePicker, type DateTimePickerProps, Dialog, type DialogProps, type DiffOp, DiffTable, type DiffTableColumn, type DiffTableProps, Divider, type DividerProps, DonutChart, type DonutChartDatum, type DonutChartProps, Drawer, type DrawerProps, EmptyState, type EmptyStateProps, Field, type FieldProps, FileUpload, type FileUploadProps, FilterBar, type FilterBarProps, type FilterClause, type FilterField, type FilterFieldType, type FilterValues, Form, type FormProps, FunnelChart, type FunnelChartProps, type FunnelDatum, Gauge, type GaugeProps, type GaugeSeries, Grid, type GridOwnProps, type GridProps, Heading, type HeadingOwnProps, type HeadingProps, type HeadingSize, Heatmap, type HeatmapDatum, type HeatmapProps, IconButton, type IconButtonProps, Image, type ImageProps, ImageViewer, type ImageViewerControlsApi, type ImageViewerProps, type ImageViewerState, Input, type InputProps, Kanban, type KanbanCard, type KanbanColumn, type KanbanProps, Kbd, type KbdProps, Label, type LabelProps, List, type ListItemData, type ListProps, Menu, type MenuItemDef, type MenuProps, MultiSelect, type MultiSelectGroup, type MultiSelectOption, type MultiSelectProps, Navbar, type NavbarLink, type NavbarProps, type Option, type OptionGroup, Pagination, type PaginationProps, PieChart, type PieChartDatum, type PieChartProps, PolarAreaChart, type PolarAreaChartProps, type PolarAreaDatum, type PolymorphicAs, type PolymorphicComponent, type PolymorphicProps, type PolymorphicPropsWithRef, type PolymorphicRef, Popover, type PopoverProps, Portal, type PortalProps, Pre, type PreProps, Progress, type ProgressProps, RadarChart, type RadarChartProps, type RadarDatum, Radio, RadioGroup, type RadioGroupOption, type RadioGroupProps, type RadioProps, RangeChart, type RangeChartProps, type RangeDatum, Rating, type RatingProps, type ResponsiveColumns, ScatterChart, type ScatterChartProps, type ScatterPoint, type ScatterSeries, Select, type SelectGroup, type SelectOption, type SelectProps, Sidebar, type SidebarItem, type SidebarProps, Skeleton, type SkeletonProps, Slider, type SliderProps, Sparkline, type SparklineDatum, type SparklineProps, Spinner, type SpinnerProps, Stack, type StackOwnProps, type StackProps, Stat, type StatProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type Sx, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextOwnProps, type TextProps, type TextTone, Textarea, type TextareaProps, type Theme, ThemeProvider, type ThemeProviderProps, type ThemeTokens, TimePicker, type TimePickerProps, Timeline, type TimelineItem, type TimelineProps, Toast, type ToastApi, type ToastOptions, type ToastProps, ToastProvider, type ToastProviderProps, type ToastTone, ToastViewport, type ToastViewportProps, ToggleGroup, type ToggleGroupItem, type ToggleGroupProps, type Tone, Tooltip, type TooltipProps, type TreeNode, TreeView, type TreeViewProps, Treemap, type TreemapDatum, type TreemapProps, TwicoProvider, type TwicoProviderProps, type UseColorSchemeOptions, type UseFilePickerOptions, type UseFocusTrapOptions, type UseKeyPressOptions, type UseLocalStorageOptions, type UseMediaQueryOptions, type UseWindowSizeOptions, VisuallyHidden, type VisuallyHiddenProps, type WithSx, createTheme, getColorSchemeScript, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFilePicker, useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal, usePrefersReducedMotion, usePrevious, useScrollLock, useTimeout, useToast, useToggle, useWindowSize };
5685
+ export { Accordion, Alert, Anchor, AppShell, Avatar, AvatarMenu, Badge, Box, Boxplot, Breadcrumb, BubbleChart, Button, Candlestick, Card, CardGrid, Carousel, Chart, Checkbox, Code, ColorPicker, ColorSchemeScript, Combobox, CommandPalette, Container, Currency, CurrencyField, Datatable, DatePicker, DateRangePicker, DateTimePicker, Dialog, DiffTable, Divider, DonutChart, Drawer, EmptyState, Field, FileUpload, FilterBar, Form, FunnelChart, Gauge, Grid, Heading, Heatmap, IconButton, Image, ImageViewer, Input, Kanban, Kbd, Label, List, Menu, MultiSelect, Navbar, Pagination, PieChart, PolarAreaChart, Popover, Portal, Pre, Progress, RadarChart, Radio, RadioGroup, RangeChart, Rating, ScatterChart, Select, Sidebar, Skeleton, Slider, Sparkline, Spinner, Stack, Stat, Stepper, Switch, Table, Tabs, Tag, Text, Textarea, ThemeProvider, TimePicker, Timeline, Toast, ToastProvider, ToastViewport, ToggleGroup, Tooltip, TreeView, Treemap, TwicoProvider, VisuallyHidden, createTheme, getColorSchemeScript, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFilePicker, useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal, usePrefersReducedMotion, usePrevious, useScrollLock, useTimeout, useToast, useToggle, useWindowSize };
5686
+ export type { AccordionItem, AccordionProps, ActionTone, AlertProps, AnchorProps, AppShellProps, AvatarMenuProps, AvatarProps, BadgeProps, BarTone, BoxOwnProps, BoxProps, BoxplotDatum, BoxplotProps, BreadcrumbItem, BreadcrumbProps, BubbleChartProps, ButtonProps, CandlestickDatum, CandlestickProps, CardGridBatchAction, CardGridBatchActionContext, CardGridFilter, CardGridProps, CardGridQuery, CardGridSort, CardGridSortOption, CardProps, CarouselProps, ChartDatum, ChartProps, CheckboxProps, CodeProps, ColorPickerProps, ColorSchemeScriptOptions, ColorSchemeScriptProps, ComboboxGroup, ComboboxOption, ComboboxProps, Command, CommandPaletteProps, ContainerOwnProps, ContainerProps, CurrencyFieldProps, CurrencyOption, CurrencyProps, DatatableBatchAction, DatatableBatchActionContext, DatatableBatchUpdateDetail, DatatableColumn, DatatableFilter, DatatableFilterOp, DatatableNumberOp, DatatableProps, DatatableQuery, DatatableRowAction, DatatableState, DatatableStringOp, DatePickerProps, DateRange, DateRangePickerProps, DateTimePickerProps, DialogProps, DiffOp, DiffTableColumn, DiffTableProps, DividerProps, DonutChartDatum, DonutChartProps, DrawerProps, EmptyStateProps, FieldProps, FileUploadProps, FilterBarProps, FilterClause, FilterField, FilterFieldType, FilterValues, FormProps, FunnelChartProps, FunnelDatum, GaugeProps, GaugeSeries, GridOwnProps, GridProps, HeadingOwnProps, HeadingProps, HeadingSize, HeatmapDatum, HeatmapProps, IconButtonProps, ImageProps, ImageViewerControlsApi, ImageViewerProps, ImageViewerState, InputProps, KanbanCard, KanbanColumn, KanbanProps, KbdProps, LabelProps, ListItemData, ListProps, MenuItemDef, MenuProps, MultiSelectGroup, MultiSelectOption, MultiSelectProps, NavbarLink, NavbarProps, Option, OptionGroup, PaginationProps, PieChartDatum, PieChartProps, PolarAreaChartProps, PolarAreaDatum, PolymorphicAs, PolymorphicComponent, PolymorphicProps, PolymorphicPropsWithRef, PolymorphicRef, PopoverProps, PortalProps, PreProps, ProgressProps, RadarChartProps, RadarDatum, RadioGroupOption, RadioGroupProps, RadioProps, RangeChartProps, RangeDatum, RatingProps, ResponsiveColumns, ScatterChartProps, ScatterPoint, ScatterSeries, SelectGroup, SelectOption, SelectProps, SidebarItem, SidebarProps, SkeletonProps, SliderProps, SparklineDatum, SparklineProps, SpinnerProps, StackOwnProps, StackProps, StatProps, Step, StepperProps, SwitchProps, Sx, TabItem, TableColumn, TableProps, TabsProps, TagProps, TextOwnProps, TextProps, TextTone, TextareaProps, Theme, ThemeProviderProps, ThemeTokens, TimePickerProps, TimelineItem, TimelineProps, ToastApi, ToastOptions, ToastProps, ToastProviderProps, ToastTone, ToastViewportProps, ToggleGroupItem, ToggleGroupProps, Tone, TooltipProps, TreeNode, TreeViewProps, TreemapDatum, TreemapProps, TwicoProviderProps, UseColorSchemeOptions, UseFilePickerOptions, UseFocusTrapOptions, UseKeyPressOptions, UseLocalStorageOptions, UseMediaQueryOptions, UseWindowSizeOptions, VisuallyHiddenProps, WithSx };