@viraui/react 2026.0.13 → 2026.0.15

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.
Files changed (57) hide show
  1. package/dist/components/accordion/accordion-item.js +0 -2
  2. package/dist/components/accordion/accordion.js +1 -2
  3. package/dist/components/autocomplete/autocomplete-group.js +0 -2
  4. package/dist/components/autocomplete/autocomplete-item.js +1 -1
  5. package/dist/components/autocomplete/autocomplete.d.ts +9 -1
  6. package/dist/components/autocomplete/autocomplete.guide.json +5 -1
  7. package/dist/components/autocomplete/autocomplete.js +44 -40
  8. package/dist/components/avatar-group/avatar-group.js +0 -1
  9. package/dist/components/basic-input/input-control-group.js +0 -3
  10. package/dist/components/checkbox/checkbox-group.js +1 -4
  11. package/dist/components/checkbox/checkbox.js +0 -2
  12. package/dist/components/chip/chip.js +0 -1
  13. package/dist/components/dialog/dialog-sheet.d.ts +9 -0
  14. package/dist/components/dialog/dialog-sheet.js +72 -67
  15. package/dist/components/dialog/dialog.guide.json +5 -1
  16. package/dist/components/fieldset/fieldset.js +1 -0
  17. package/dist/components/linear-progress/linear-progress.js +0 -2
  18. package/dist/components/masonry/masonry.js +0 -1
  19. package/dist/components/menu/menu-group.js +0 -2
  20. package/dist/components/menu/menu-indicator-slot.js +0 -2
  21. package/dist/components/menu/menu-item-row.js +1 -1
  22. package/dist/components/menu/menu-link-item.js +4 -1
  23. package/dist/components/menu/menu-popup.d.ts +9 -1
  24. package/dist/components/menu/menu-popup.js +21 -18
  25. package/dist/components/menu/menu-radio-group.js +0 -2
  26. package/dist/components/menu/menu.guide.json +5 -1
  27. package/dist/components/meter/meter.js +0 -2
  28. package/dist/components/popover/popover-sheet.d.ts +13 -3
  29. package/dist/components/popover/popover-sheet.js +62 -62
  30. package/dist/components/popover/popover.guide.json +5 -1
  31. package/dist/components/radio/radio-group.js +0 -1
  32. package/dist/components/radio/radio.js +0 -2
  33. package/dist/components/select/select-group.js +0 -2
  34. package/dist/components/select/select-indicator-slot.js +0 -2
  35. package/dist/components/select/select-option.js +2 -1
  36. package/dist/components/select/select.d.ts +10 -2
  37. package/dist/components/select/select.guide.json +5 -1
  38. package/dist/components/select/select.js +60 -58
  39. package/dist/components/separator/separator.js +0 -1
  40. package/dist/components/slider/slider-control.js +0 -1
  41. package/dist/components/slider/slider.js +1 -2
  42. package/dist/components/stack/stack.d.ts +1 -1
  43. package/dist/components/stack/stack.guide.json +3 -2
  44. package/dist/components/stack/stack.js +1 -1
  45. package/dist/components/switch/switch.js +0 -3
  46. package/dist/components/tabs/tabs-list.js +1 -0
  47. package/dist/components/tabs/tabs.js +0 -1
  48. package/dist/components/textarea/textarea.js +1 -0
  49. package/dist/components/textfield/textfield.js +1 -0
  50. package/dist/components/toast/toast-banner.js +0 -3
  51. package/dist/components/toast/toast.guide.json +5 -1
  52. package/dist/components/toggle-group/toggle-group.js +1 -4
  53. package/dist/components/tooltip/tooltip-content.d.ts +11 -2
  54. package/dist/components/tooltip/tooltip-content.js +23 -21
  55. package/dist/components/tooltip/tooltip.guide.json +7 -1
  56. package/dist/preflight-surface.json +24 -1
  57. package/package.json +2 -2
@@ -8,7 +8,6 @@ var MenuRadioGroup = ({ children, className, label, ...otherProps }) => /* @__PU
8
8
  className,
9
9
  render: /* @__PURE__ */ jsx(Stack, {
10
10
  direction: "column",
11
- fillChildren: false,
12
11
  rowGap: "2x-small",
13
12
  vPadding: "2x-small"
14
13
  }),
@@ -16,7 +15,6 @@ var MenuRadioGroup = ({ children, className, label, ...otherProps }) => /* @__PU
16
15
  render: /* @__PURE__ */ jsx(Stack, {
17
16
  columnGap: "small",
18
17
  direction: "row",
19
- fillChildren: false,
20
18
  hPadding: "small",
21
19
  vAlign: "center",
22
20
  vPadding: ["small", "small"]
@@ -8,7 +8,8 @@
8
8
  "Nested command lists with checkbox or radio options that stay open on toggle",
9
9
  "Link rows mixed with actions in one menu surface",
10
10
  "Detached or multi-trigger menus via `Menu.createHandle`",
11
- "Account / user widgets: `Menu.Trigger` as a Surface chip (avatar + name + email) opening a Popup with a static profile header plus action items"
11
+ "Account / user widgets: `Menu.Trigger` as a Surface chip (avatar + name + email) opening a Popup with a static profile header plus action items",
12
+ "Custom portal host (iframe preview, shadow root, or app overlay root) via `container` on the portal-owning public part"
12
13
  ],
13
14
  "whenNotToUse": [
14
15
  "Page-blocking modal flows (use Dialog)",
@@ -64,6 +65,9 @@
64
65
  "LinkItem.sentiment": {
65
66
  "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
66
67
  },
68
+ "Popup.container": {
69
+ "description": "Portal mount node (iframe body, shadow root, or app overlay root). Omit for Base UI default (`document.body` from the module window — iframe hosts must pass the iframe document body explicitly)."
70
+ },
67
71
  "RadioGroup.label": {
68
72
  "description": "Optional accessible group label rendered with `Menu.GroupLabel`."
69
73
  },
@@ -13,14 +13,12 @@ var Meter$1 = ({ className, description, label, showValue = false, value, ...oth
13
13
  value,
14
14
  render: /* @__PURE__ */ jsx(Stack, {
15
15
  direction: "column",
16
- fillChildren: false,
17
16
  rowGap: "small",
18
17
  columnGap: "x-small"
19
18
  }),
20
19
  children: [
21
20
  (label || showValue) && /* @__PURE__ */ jsxs(Stack, {
22
21
  direction: "row",
23
- fillChildren: false,
24
22
  columnGap: "small",
25
23
  vAlign: "center",
26
24
  hAlign: "space-between",
@@ -1,8 +1,18 @@
1
- import { PopoverPositioner } from '@base-ui/react/popover';
1
+ import { Popover as PrimitivePopover, PopoverPositioner } from '@base-ui/react/popover';
2
2
  import { StackProps } from '..';
3
3
  import type * as React from 'react';
4
4
  type PopoverSheetPositionerProps = Omit<PopoverPositioner.Props, 'className' | 'style' | 'render'>;
5
- type PopoverSheetStyledProps = PopoverSheetPositionerProps & {
5
+ type PopoverSheetContainerProps = {
6
+ /**
7
+ * Portal mount node (iframe body, shadow root, or app overlay root).
8
+ * Omit for Base UI default (`document.body` from the module window —
9
+ * iframe hosts must pass the iframe document body explicitly).
10
+ *
11
+ * @default Base UI FloatingPortal resolution
12
+ */
13
+ container?: React.ComponentProps<typeof PrimitivePopover.Portal>['container'];
14
+ };
15
+ type PopoverSheetStyledProps = PopoverSheetPositionerProps & PopoverSheetContainerProps & {
6
16
  /**
7
17
  * Whether to skip the built-in Surface, header, and close chrome and render
8
18
  * only the positioning/animation shell (Portal + Positioner + Popup + Viewport).
@@ -33,7 +43,7 @@ type PopoverSheetStyledProps = PopoverSheetPositionerProps & {
33
43
  */
34
44
  headerAlign?: Extract<StackProps['hAlign'], 'start' | 'center' | 'end'>;
35
45
  };
36
- type PopoverSheetUnstyledProps = PopoverSheetPositionerProps & {
46
+ type PopoverSheetUnstyledProps = PopoverSheetPositionerProps & PopoverSheetContainerProps & {
37
47
  /**
38
48
  * Renders only the positioning/animation shell; compose `Popover.Title`,
39
49
  * `Popover.Description`, and any chrome inside `children`.
@@ -8,72 +8,72 @@ import { Title } from "../title/title.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Popover } from "@base-ui/react/popover";
10
10
  //#region src/components/popover/popover-sheet.tsx
11
- var PopoverSheet = ({ unstyled, title, description, children, showCloseButton = false, headerAlign = "start", sideOffset = 8, ...positionerProps }) => /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Positioner, {
12
- className: popover_module_default.Sheet,
13
- sideOffset,
14
- ...positionerProps,
15
- children: unstyled ? /* @__PURE__ */ jsx(Popover.Popup, {
16
- className: popover_module_default.Popup,
17
- children: /* @__PURE__ */ jsx(Popover.Viewport, {
18
- className: popover_module_default.Viewport,
19
- "data-unstyled": "",
20
- children
21
- })
22
- }) : /* @__PURE__ */ jsx(Popover.Popup, {
23
- className: popover_module_default.Popup,
24
- render: /* @__PURE__ */ jsx(Surface, {
25
- color: 1,
26
- border: "all",
27
- radius: "large",
28
- "data-vibrant": "",
29
- render: /* @__PURE__ */ jsx(Stack, {
30
- rowGap: "medium",
31
- fillChildren: false
11
+ var PopoverSheet = ({ unstyled, title, description, children, showCloseButton = false, headerAlign = "start", sideOffset = 8, container, ...positionerProps }) => /* @__PURE__ */ jsx(Popover.Portal, {
12
+ container,
13
+ children: /* @__PURE__ */ jsx(Popover.Positioner, {
14
+ className: popover_module_default.Sheet,
15
+ sideOffset,
16
+ ...positionerProps,
17
+ children: unstyled ? /* @__PURE__ */ jsx(Popover.Popup, {
18
+ className: popover_module_default.Popup,
19
+ children: /* @__PURE__ */ jsx(Popover.Viewport, {
20
+ className: popover_module_default.Viewport,
21
+ "data-unstyled": "",
22
+ children
32
23
  })
33
- }),
34
- children: /* @__PURE__ */ jsxs(Popover.Viewport, {
35
- className: popover_module_default.Viewport,
36
- render: /* @__PURE__ */ jsx(Stack, {
37
- rowGap: "medium",
38
- vPadding: "medium",
39
- hPadding: "medium",
40
- fillChildren: false
24
+ }) : /* @__PURE__ */ jsx(Popover.Popup, {
25
+ className: popover_module_default.Popup,
26
+ render: /* @__PURE__ */ jsx(Surface, {
27
+ color: 1,
28
+ border: "all",
29
+ radius: "large",
30
+ "data-vibrant": "",
31
+ render: /* @__PURE__ */ jsx(Stack, { rowGap: "medium" })
41
32
  }),
42
- children: [
43
- /* @__PURE__ */ jsxs(Stack, {
44
- hAlign: headerAlign,
45
- rowGap: "small",
46
- vAlign: "start",
47
- vPadding: [0, children ? "medium" : 0],
48
- children: [/* @__PURE__ */ jsx(Popover.Title, {
49
- render: /* @__PURE__ */ jsx(Title, {
50
- align: headerAlign,
51
- size: "6",
52
- lineHeight: "x-small"
53
- }),
54
- children: title
55
- }), description && /* @__PURE__ */ jsx(Popover.Description, {
56
- render: /* @__PURE__ */ jsx(Text, {
57
- align: headerAlign,
58
- tone: "muted",
59
- render: /* @__PURE__ */ jsx("p", {})
60
- }),
61
- children: description
62
- })]
63
- }),
64
- showCloseButton && /* @__PURE__ */ jsx(Popover.Close, {
65
- className: popover_module_default.CloseButton,
66
- render: /* @__PURE__ */ jsx(IconButton, {
67
- "aria-label": "Close popover",
68
- icon: /* @__PURE__ */ jsx(ChromeXmark, {}),
69
- size: "small",
70
- variant: "flat"
71
- })
33
+ children: /* @__PURE__ */ jsxs(Popover.Viewport, {
34
+ className: popover_module_default.Viewport,
35
+ render: /* @__PURE__ */ jsx(Stack, {
36
+ rowGap: "medium",
37
+ vPadding: "medium",
38
+ hPadding: "medium"
72
39
  }),
73
- children
74
- ]
40
+ children: [
41
+ /* @__PURE__ */ jsxs(Stack, {
42
+ fillChildren: true,
43
+ hAlign: headerAlign,
44
+ rowGap: "small",
45
+ vAlign: "start",
46
+ vPadding: [0, children ? "medium" : 0],
47
+ children: [/* @__PURE__ */ jsx(Popover.Title, {
48
+ render: /* @__PURE__ */ jsx(Title, {
49
+ align: headerAlign,
50
+ size: "6",
51
+ lineHeight: "x-small"
52
+ }),
53
+ children: title
54
+ }), description && /* @__PURE__ */ jsx(Popover.Description, {
55
+ render: /* @__PURE__ */ jsx(Text, {
56
+ align: headerAlign,
57
+ tone: "muted",
58
+ render: /* @__PURE__ */ jsx("p", {})
59
+ }),
60
+ children: description
61
+ })]
62
+ }),
63
+ showCloseButton && /* @__PURE__ */ jsx(Popover.Close, {
64
+ className: popover_module_default.CloseButton,
65
+ render: /* @__PURE__ */ jsx(IconButton, {
66
+ "aria-label": "Close popover",
67
+ icon: /* @__PURE__ */ jsx(ChromeXmark, {}),
68
+ size: "small",
69
+ variant: "flat"
70
+ })
71
+ }),
72
+ children
73
+ ]
74
+ })
75
75
  })
76
76
  })
77
- }) });
77
+ });
78
78
  //#endregion
79
79
  export { PopoverSheet };
@@ -8,7 +8,8 @@
8
8
  "Lightweight forms or confirmations that float beside the trigger without blocking the page",
9
9
  "Multi-trigger panels that swap content with direction-aware animations using `Popover.createHandle` and trigger `payload`",
10
10
  "Hover-revealed hints via `openOnHover` with `delay` and `closeDelay`",
11
- "Fully custom popup chrome via `Sheet` `unstyled` composed with `Popover.Title` and `Popover.Description`"
11
+ "Fully custom popup chrome via `Sheet` `unstyled` composed with `Popover.Title` and `Popover.Description`",
12
+ "Custom portal host (iframe preview, shadow root, or app overlay root) via `container` on the portal-owning public part"
12
13
  ],
13
14
  "whenNotToUse": [
14
15
  "Modal tasks that must block the page and demand focused attention (use Dialog)",
@@ -29,6 +30,9 @@
29
30
  "related": ["Surface", "Button", "IconButton", "Stack", "Dialog", "Tabs"],
30
31
  "properties": {
31
32
  "react": {
33
+ "Sheet.container": {
34
+ "description": "Portal mount node (iframe body, shadow root, or app overlay root). Omit for Base UI default (`document.body` from the module window — iframe hosts must pass the iframe document body explicitly)."
35
+ },
32
36
  "Sheet.description": {
33
37
  "description": "Supporting copy announced with the title."
34
38
  },
@@ -7,7 +7,6 @@ var RadioGroup$1 = ({ children, className, ...otherProps }) => /* @__PURE__ */ j
7
7
  className,
8
8
  render: /* @__PURE__ */ jsx(Stack, {
9
9
  "data-radiogroup": true,
10
- fillChildren: false,
11
10
  rowGap: "small"
12
11
  }),
13
12
  children
@@ -15,7 +15,6 @@ var Radio$1 = ({ className, description, disabled, id, label, ref, size = "small
15
15
  children: /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(Stack, {
16
16
  direction: "row",
17
17
  columnGap: size === "small" ? "small" : "medium",
18
- fillChildren: false,
19
18
  vAlign: hasTextDescription ? "start" : "center",
20
19
  hPadding,
21
20
  vPadding,
@@ -33,7 +32,6 @@ var Radio$1 = ({ className, description, disabled, id, label, ref, size = "small
33
32
  })
34
33
  }), label || description ? /* @__PURE__ */ jsxs(Stack, {
35
34
  direction: "column",
36
- fillChildren: false,
37
35
  rowGap: "small",
38
36
  children: [label && /* @__PURE__ */ jsx(FieldLabel, {
39
37
  size: size === "small" ? "small" : "medium",
@@ -10,7 +10,6 @@ function SelectGroup({ children, className, label, ...groupProps }) {
10
10
  className,
11
11
  render: /* @__PURE__ */ jsx(Stack, {
12
12
  direction: "column",
13
- fillChildren: false,
14
13
  rowGap: "2x-small",
15
14
  vPadding: "2x-small"
16
15
  }),
@@ -18,7 +17,6 @@ function SelectGroup({ children, className, label, ...groupProps }) {
18
17
  render: /* @__PURE__ */ jsx(Stack, {
19
18
  columnGap: "small",
20
19
  direction: "row",
21
- fillChildren: false,
22
20
  hPadding: "small",
23
21
  vPadding: ["small", "x-small"],
24
22
  vAlign: "center"
@@ -4,7 +4,6 @@ import { jsx } from "react/jsx-runtime";
4
4
  import { Select } from "@base-ui/react/select";
5
5
  //#region src/components/select/select-indicator-slot.tsx
6
6
  var indicatorStackRender = /* @__PURE__ */ jsx(Stack, {
7
- fillChildren: false,
8
7
  hAlign: "center",
9
8
  inline: true,
10
9
  "data-shrink": "false",
@@ -22,7 +21,6 @@ function SelectIndicatorSlot({ children, interactive = false }) {
22
21
  "aria-hidden": true,
23
22
  className: select_module_default.Indicator,
24
23
  "data-grow": "false",
25
- fillChildren: false,
26
24
  hAlign: "center",
27
25
  inline: true,
28
26
  "data-shrink": "false",
@@ -16,6 +16,7 @@ function SelectOption({ addon, addonAlign = "center", children, className, indic
16
16
  className: clsx(select_module_default.Option, className),
17
17
  render: /* @__PURE__ */ jsx(Surface, { radius: "auto" }),
18
18
  children: /* @__PURE__ */ jsxs(Stack, {
19
+ fillChildren: true,
19
20
  columnGap: "medium",
20
21
  direction: "row",
21
22
  hPadding: "small",
@@ -25,8 +26,8 @@ function SelectOption({ addon, addonAlign = "center", children, className, indic
25
26
  direction: "row",
26
27
  columnGap: "small",
27
28
  vAlign: addonAlign,
28
- fillChildren: false,
29
29
  children: [addon && /* @__PURE__ */ jsx(Stack, {
30
+ fillChildren: true,
30
31
  "aria-hidden": "true",
31
32
  "data-grow": "false",
32
33
  "data-shrink": "false",
@@ -1,5 +1,5 @@
1
1
  import { FieldRoot } from '@base-ui/react/field';
2
- import { SelectRoot } from '@base-ui/react/select';
2
+ import { SelectRoot, Select as PrimitiveSelect } from '@base-ui/react/select';
3
3
  import { SelectGroup } from './select-group';
4
4
  import { SelectOption } from './select-option';
5
5
  import { SelectSeparator } from './select-separator';
@@ -59,8 +59,16 @@ export type SelectProps = SelectRoot.Props<string> & Omit<FieldRoot.Props, 'ref'
59
59
  * @default true
60
60
  */
61
61
  alignListWithTrigger?: boolean;
62
+ /**
63
+ * Portal mount node (iframe body, shadow root, or app overlay root).
64
+ * Omit for Base UI default (`document.body` from the module window —
65
+ * iframe hosts must pass the iframe document body explicitly).
66
+ *
67
+ * @default Base UI FloatingPortal resolution
68
+ */
69
+ container?: React.ComponentProps<typeof PrimitiveSelect.Portal>['container'];
62
70
  };
63
- declare function SelectRootComponent({ alignListWithTrigger, children, className, description, dirty, disabled, error, addon, invalid, label, name, placeholder, ref, touched, validate, validationDebounceTime, validationMode, ...selectRootProps }: SelectProps): React.JSX.Element;
71
+ declare function SelectRootComponent({ alignListWithTrigger, children, className, container, description, dirty, disabled, error, addon, invalid, label, name, placeholder, ref, touched, validate, validationDebounceTime, validationMode, ...selectRootProps }: SelectProps): React.JSX.Element;
64
72
  export declare const Select: typeof SelectRootComponent & {
65
73
  Option: typeof SelectOption;
66
74
  Group: typeof SelectGroup;
@@ -8,7 +8,8 @@
8
8
  "Grouped or separated option lists",
9
9
  "Rich option rows with a leading decorative addon and multi-line label content",
10
10
  "Trigger chrome aligned with Textfield control shell",
11
- "Select fields inside Fieldset when they share a section legend with other inputs"
11
+ "Select fields inside Fieldset when they share a section legend with other inputs",
12
+ "Custom portal host (iframe preview, shadow root, or app overlay root) via `container` on the portal-owning public part"
12
13
  ],
13
14
  "whenNotToUse": [
14
15
  "Multiple selection",
@@ -37,6 +38,9 @@
37
38
  "alignListWithTrigger": {
38
39
  "description": "When `true`, aligns the list popup width with the trigger via Base UI `alignItemWithTrigger`. Prefer `false` when options use a leading `addon`."
39
40
  },
41
+ "container": {
42
+ "description": "Portal mount node (iframe body, shadow root, or app overlay root). Omit for Base UI default (`document.body` from the module window — iframe hosts must pass the iframe document body explicitly)."
43
+ },
40
44
  "description": {
41
45
  "description": "Helper copy rendered with `Field.Description` and `Text` while the field is valid."
42
46
  },
@@ -18,7 +18,7 @@ import { Field } from "@base-ui/react/field";
18
18
  import { useId } from "react";
19
19
  import { Select } from "@base-ui/react/select";
20
20
  //#region src/components/select/select.tsx
21
- function SelectRootComponent({ alignListWithTrigger = true, children, className, description, dirty, disabled, error, addon = /* @__PURE__ */ jsx(ChromeChevronExpandY, { size: 16 }), invalid, label, name, placeholder, ref, touched, validate, validationDebounceTime, validationMode, ...selectRootProps }) {
21
+ function SelectRootComponent({ alignListWithTrigger = true, children, className, container, description, dirty, disabled, error, addon = /* @__PURE__ */ jsx(ChromeChevronExpandY, { size: 16 }), invalid, label, name, placeholder, ref, touched, validate, validationDebounceTime, validationMode, ...selectRootProps }) {
22
22
  const { "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, ...restSelectProps } = selectRootProps;
23
23
  const fieldLabelId = useId();
24
24
  const listAccessibleNameProps = {};
@@ -36,6 +36,7 @@ function SelectRootComponent({ alignListWithTrigger = true, children, className,
36
36
  validationDebounceTime,
37
37
  validationMode,
38
38
  render: /* @__PURE__ */ jsx(Stack, {
39
+ fillChildren: true,
39
40
  direction: "column",
40
41
  rowGap: "small"
41
42
  }),
@@ -56,6 +57,7 @@ function SelectRootComponent({ alignListWithTrigger = true, children, className,
56
57
  disabled,
57
58
  ref,
58
59
  render: /* @__PURE__ */ jsx(Stack, {
60
+ fillChildren: true,
59
61
  direction: "row",
60
62
  render: /* @__PURE__ */ jsx("button", { type: "button" }),
61
63
  columnGap: "x-small",
@@ -71,7 +73,6 @@ function SelectRootComponent({ alignListWithTrigger = true, children, className,
71
73
  className: select_module_default.Icon,
72
74
  "data-grow": "false",
73
75
  render: /* @__PURE__ */ jsx(Stack, {
74
- fillChildren: false,
75
76
  hAlign: "center",
76
77
  hPadding: "x-small",
77
78
  inline: true,
@@ -80,66 +81,67 @@ function SelectRootComponent({ alignListWithTrigger = true, children, className,
80
81
  }),
81
82
  children: addon
82
83
  })]
83
- }), /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsx(Select.Positioner, {
84
- alignItemWithTrigger: alignListWithTrigger,
85
- sideOffset: 2,
86
- children: /* @__PURE__ */ jsxs(Select.Popup, {
87
- className: select_module_default.SelectPopup,
88
- children: [
89
- /* @__PURE__ */ jsx(Select.ScrollUpArrow, {
90
- className: clsx(select_module_default.ScrollArrow, select_module_default.ScrollArrowUp),
91
- "data-vibrant": "",
92
- render: /* @__PURE__ */ jsx(Stack, {
93
- fillChildren: false,
94
- hAlign: "center",
95
- vAlign: "center"
96
- }),
97
- children: /* @__PURE__ */ jsx(IconButton, {
98
- "aria-label": "Scroll list up",
99
- className: select_module_default.ScrollButton,
100
- icon: /* @__PURE__ */ jsx(ChromeChevronUp, {}),
101
- size: "small",
102
- tabIndex: -1,
103
- variant: "flat"
104
- })
105
- }),
106
- /* @__PURE__ */ jsx(Elevator, {
107
- resting: 1,
108
- children: /* @__PURE__ */ jsx(Select.List, {
109
- ...listAccessibleNameProps,
110
- className: select_module_default.List,
111
- render: /* @__PURE__ */ jsx(Surface, {
112
- border: "all",
113
- color: 1,
114
- hPadding: "x-small",
115
- overflow: "auto",
116
- radius: "medium",
117
- vPadding: "x-small",
118
- "data-vibrant": ""
84
+ }), /* @__PURE__ */ jsx(Select.Portal, {
85
+ container,
86
+ children: /* @__PURE__ */ jsx(Select.Positioner, {
87
+ alignItemWithTrigger: alignListWithTrigger,
88
+ sideOffset: 2,
89
+ children: /* @__PURE__ */ jsxs(Select.Popup, {
90
+ className: select_module_default.SelectPopup,
91
+ children: [
92
+ /* @__PURE__ */ jsx(Select.ScrollUpArrow, {
93
+ className: clsx(select_module_default.ScrollArrow, select_module_default.ScrollArrowUp),
94
+ "data-vibrant": "",
95
+ render: /* @__PURE__ */ jsx(Stack, {
96
+ hAlign: "center",
97
+ vAlign: "center"
119
98
  }),
120
- children
121
- })
122
- }),
123
- /* @__PURE__ */ jsx(Select.ScrollDownArrow, {
124
- className: clsx(select_module_default.ScrollArrow, select_module_default.ScrollArrowDown),
125
- "data-vibrant": "",
126
- render: /* @__PURE__ */ jsx(Stack, {
127
- fillChildren: false,
128
- hAlign: "center",
129
- vAlign: "center"
99
+ children: /* @__PURE__ */ jsx(IconButton, {
100
+ "aria-label": "Scroll list up",
101
+ className: select_module_default.ScrollButton,
102
+ icon: /* @__PURE__ */ jsx(ChromeChevronUp, {}),
103
+ size: "small",
104
+ tabIndex: -1,
105
+ variant: "flat"
106
+ })
130
107
  }),
131
- children: /* @__PURE__ */ jsx(IconButton, {
132
- "aria-label": "Scroll list down",
133
- className: select_module_default.ScrollButton,
134
- icon: /* @__PURE__ */ jsx(ChromeChevronDown, {}),
135
- size: "small",
136
- tabIndex: -1,
137
- variant: "flat"
108
+ /* @__PURE__ */ jsx(Elevator, {
109
+ resting: 1,
110
+ children: /* @__PURE__ */ jsx(Select.List, {
111
+ ...listAccessibleNameProps,
112
+ className: select_module_default.List,
113
+ render: /* @__PURE__ */ jsx(Surface, {
114
+ border: "all",
115
+ color: 1,
116
+ hPadding: "x-small",
117
+ overflow: "auto",
118
+ radius: "medium",
119
+ vPadding: "x-small",
120
+ "data-vibrant": ""
121
+ }),
122
+ children
123
+ })
124
+ }),
125
+ /* @__PURE__ */ jsx(Select.ScrollDownArrow, {
126
+ className: clsx(select_module_default.ScrollArrow, select_module_default.ScrollArrowDown),
127
+ "data-vibrant": "",
128
+ render: /* @__PURE__ */ jsx(Stack, {
129
+ hAlign: "center",
130
+ vAlign: "center"
131
+ }),
132
+ children: /* @__PURE__ */ jsx(IconButton, {
133
+ "aria-label": "Scroll list down",
134
+ className: select_module_default.ScrollButton,
135
+ icon: /* @__PURE__ */ jsx(ChromeChevronDown, {}),
136
+ size: "small",
137
+ tabIndex: -1,
138
+ variant: "flat"
139
+ })
138
140
  })
139
- })
140
- ]
141
+ ]
142
+ })
141
143
  })
142
- }) })]
144
+ })]
143
145
  }),
144
146
  /* @__PURE__ */ jsx(FieldHelperCopy, {
145
147
  className: select_module_default.Description,
@@ -29,7 +29,6 @@ var Separator = ({ className, hPadding, orientation = "horizontal", ref, render,
29
29
  });
30
30
  return /* @__PURE__ */ jsx(Stack, {
31
31
  direction: orientation === "vertical" ? "row" : "column",
32
- fillChildren: false,
33
32
  hPadding,
34
33
  vAlign: orientation === "vertical" ? "stretch" : "initial",
35
34
  vPadding,
@@ -20,7 +20,6 @@ function SliderControl({ isRange, orientation = "horizontal", thumbAriaLabel })
20
20
  "data-orientation": orientation,
21
21
  render: /* @__PURE__ */ jsx(Stack, {
22
22
  direction: isVertical ? "column" : "row",
23
- fillChildren: false,
24
23
  hAlign: isVertical ? "center" : "initial",
25
24
  vAlign: isVertical ? "initial" : "center"
26
25
  }),
@@ -26,7 +26,6 @@ var Slider$1 = ({ className, defaultValue, description, dirty, disabled, error,
26
26
  validationMode,
27
27
  render: /* @__PURE__ */ jsx(Stack, {
28
28
  direction: "column",
29
- fillChildren: false,
30
29
  rowGap: "small"
31
30
  }),
32
31
  children: [/* @__PURE__ */ jsxs(Slider.Root, {
@@ -40,13 +39,13 @@ var Slider$1 = ({ className, defaultValue, description, dirty, disabled, error,
40
39
  value,
41
40
  render: /* @__PURE__ */ jsx(Stack, {
42
41
  direction: "column",
43
- fillChildren: false,
44
42
  rowGap: "medium",
45
43
  columnGap: "x-small",
46
44
  vAlign: isVertical ? "stretch" : "center",
47
45
  hAlign: isVertical ? "center" : "initial"
48
46
  }),
49
47
  children: [(label || showValue) && /* @__PURE__ */ jsxs(Stack, {
48
+ fillChildren: true,
50
49
  className: slider_module_default.SliderHeader,
51
50
  direction: isVertical ? "column" : "row",
52
51
  columnGap: "small",
@@ -46,7 +46,7 @@ export type StackProps = React.ComponentPropsWithoutRef<'div'> & {
46
46
  /**
47
47
  * Makes direct children grow to fill the available space within the stack.
48
48
  *
49
- * @default true
49
+ * @default false
50
50
  */
51
51
  fillChildren?: boolean;
52
52
  /**
@@ -10,7 +10,7 @@
10
10
  ],
11
11
  "whenNotToUse": [
12
12
  "Cases where a single component already owns required flex chrome",
13
- "Expecting the Stack root itself to grow via fillChildren",
13
+ "Expecting direct children to stretch without setting `fillChildren`",
14
14
  "Using `enableContainer` inside complex masonry-like layouts when you don't need container queries (size containment can change nested layout)"
15
15
  ],
16
16
  "accessibility": [
@@ -19,6 +19,7 @@
19
19
  "Do not use Stack alone to imply grouping; use landmarks or headings where needed"
20
20
  ],
21
21
  "antiPatterns": [
22
+ "Assuming Stack stretches direct children by default — pass `fillChildren` when children should grow along the flex main axis",
22
23
  "Re-declaring primitive flex container rules in app CSS when Stack can own the layout",
23
24
  "Using viewport media queries when @container stack queries against the rendered Stack size would match the design intent"
24
25
  ],
@@ -35,7 +36,7 @@
35
36
  "description": "Renders children across rows or columns using the chosen flex direction."
36
37
  },
37
38
  "fillChildren": {
38
- "description": "Makes direct children grow to fill the available space within the stack."
39
+ "description": "Makes direct children grow to fill the available space within the stack. Default `false`; opt in when layout needs equal flex growth on direct children."
39
40
  },
40
41
  "hAlign": {
41
42
  "description": "Aligns content on the horizontal axis from the consumer point of view."
@@ -5,7 +5,7 @@ import { resolveAxisPadding } from "../../core/styles/resolve-axis-padding.js";
5
5
  import stack_module_default from "./stack.module.js";
6
6
  import { useRender } from "@base-ui/react/use-render";
7
7
  //#region src/components/stack/stack.tsx
8
- var Stack = ({ className, direction = "column", fillChildren = true, hAlign = "initial", hPadding, inline = false, maxWidth, minWidth, enableContainer, ref, render, rowGap, columnGap, style, vAlign = "initial", vPadding, wrap = false, ...otherProps }) => {
8
+ var Stack = ({ className, direction = "column", fillChildren = false, hAlign = "initial", hPadding, inline = false, maxWidth, minWidth, enableContainer, ref, render, rowGap, columnGap, style, vAlign = "initial", vPadding, wrap = false, ...otherProps }) => {
9
9
  const hasPadding = Boolean(hPadding || vPadding);
10
10
  const dynamicStyle = {
11
11
  "--vui-stack-row-gap": resolveThemeValue(rowGap, "space", 0),
@@ -23,7 +23,6 @@ var Switch$1 = ({ className, description, dirty, disabled, error, invalid, label
23
23
  render: /* @__PURE__ */ jsx(Stack, {
24
24
  direction: "row",
25
25
  columnGap: size === "small" ? "small" : "medium",
26
- fillChildren: false,
27
26
  vAlign: hasTextDescription ? "start" : "center"
28
27
  }),
29
28
  children: /* @__PURE__ */ jsx(Field.Label, {
@@ -31,7 +30,6 @@ var Switch$1 = ({ className, description, dirty, disabled, error, invalid, label
31
30
  children: /* @__PURE__ */ jsxs(Stack, {
32
31
  direction: "row",
33
32
  columnGap: size === "small" ? "small" : "medium",
34
- fillChildren: false,
35
33
  vAlign: hasTextDescription ? "start" : "center",
36
34
  hPadding,
37
35
  vPadding,
@@ -46,7 +44,6 @@ var Switch$1 = ({ className, description, dirty, disabled, error, invalid, label
46
44
  children: /* @__PURE__ */ jsx(Switch.Thumb, { className: switch_module_default.Thumb })
47
45
  }), label || description || error ? /* @__PURE__ */ jsxs(Stack, {
48
46
  direction: "column",
49
- fillChildren: false,
50
47
  rowGap: "small",
51
48
  children: [label && /* @__PURE__ */ jsx(FieldLabel, {
52
49
  size: size === "small" ? "small" : "medium",
@@ -22,6 +22,7 @@ var TabsList = ({ children, className, activateOnFocus = true, ref, ...otherProp
22
22
  className: tabs_module_default.IndicatorLayer,
23
23
  children: /* @__PURE__ */ jsx(TabsIndicator, {})
24
24
  }), /* @__PURE__ */ jsx(Stack, {
25
+ fillChildren: true,
25
26
  direction: "row",
26
27
  columnGap: "small",
27
28
  hAlign: "start",