@viraui/react 2026.0.37 → 2026.0.39
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/components/grid/grid.css +1 -1
- package/dist/components/grid/grid.d.ts +7 -1
- package/dist/components/grid/grid.guide.json +5 -4
- package/dist/components/grid/grid.js +4 -2
- package/dist/components/separator/separator.css +1 -1
- package/dist/components/slider/slider.css +1 -1
- package/dist/components/stack/stack.css +1 -1
- package/dist/components/stack/stack.d.ts +3 -3
- package/dist/components/stack/stack.guide.json +4 -4
- package/dist/components/surface/surface.css +1 -1
- package/dist/components/surface/surface.d.ts +3 -3
- package/dist/components/surface/surface.guide.json +3 -3
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-grid-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-columns{syntax:"<integer>";inherits:false;initial-value:1}@property --vui-grid-rows{syntax:"<integer>";inherits:false;initial-value:1}@property --vui-grid-column-min-w{syntax:"*";inherits:false;initial-value:10rem}@property --vui-grid-row-min-h{syntax:"*";inherits:false;initial-value:1fr}@property --vui-grid-column-size{syntax:"*";inherits:false;initial-value:auto}@property --vui-grid-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-item-column{syntax:"*";inherits:false;initial-value:auto}@property --vui-grid-item-row{syntax:"*";inherits:false;initial-value:auto}.viraui__grid-module__Grid_rTZor{--vui-grid-column-size:minmax(min(var(--vui-grid-column-min-w),100%),1fr);display:grid;inline-size:100%;max-inline-size:100%;box-sizing:border-box;gap:var(--vui-grid-row-gap) var(--vui-grid-column-gap);grid-template-columns:repeat(var(--vui-grid-columns),minmax(0,1fr));&[data-grid-filling-type=fill]{grid-template-columns:repeat(auto-fill,var(--vui-grid-column-size))}&[data-grid-filling-type=fit]{grid-template-columns:repeat(auto-fit,var(--vui-grid-column-size))}&[data-grid-has-rows=true]{grid-template-rows:repeat(var(--vui-grid-rows),var(--vui-grid-row-min-h))}&:where([data-grid-has-padding=true]){padding:var(--vui-grid-padding-block-start) var(--vui-grid-padding-inline-end) var(--vui-grid-padding-block-end) var(--vui-grid-padding-inline-start)}}.viraui__grid-module__Item_vNnv3{display:block;grid-column:var(--vui-grid-item-column);grid-row:var(--vui-grid-item-row)
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-grid-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-columns{syntax:"<integer>";inherits:false;initial-value:1}@property --vui-grid-rows{syntax:"<integer>";inherits:false;initial-value:1}@property --vui-grid-column-min-w{syntax:"*";inherits:false;initial-value:10rem}@property --vui-grid-row-min-h{syntax:"*";inherits:false;initial-value:1fr}@property --vui-grid-column-size{syntax:"*";inherits:false;initial-value:auto}@property --vui-grid-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-grid-item-column{syntax:"*";inherits:false;initial-value:auto}@property --vui-grid-item-row{syntax:"*";inherits:false;initial-value:auto}.viraui__grid-module__Grid_rTZor{--vui-grid-column-size:minmax(min(var(--vui-grid-column-min-w),100%),1fr);display:grid;inline-size:100%;max-inline-size:100%;box-sizing:border-box;gap:var(--vui-grid-row-gap) var(--vui-grid-column-gap);grid-template-columns:repeat(var(--vui-grid-columns),minmax(0,1fr));&[data-grid-filling-type=fill]{grid-template-columns:repeat(auto-fill,var(--vui-grid-column-size))}&[data-grid-filling-type=fit]{grid-template-columns:repeat(auto-fit,var(--vui-grid-column-size))}&[data-grid-fixed-breadth=true]{inline-size:max-content;max-inline-size:none;grid-template-columns:repeat(var(--vui-grid-columns),var(--vui-grid-column-min-w))}&[data-grid-has-rows=true]{grid-template-rows:repeat(var(--vui-grid-rows),var(--vui-grid-row-min-h))}&:where([data-grid-has-padding=true]){padding:var(--vui-grid-padding-block-start) var(--vui-grid-padding-inline-end) var(--vui-grid-padding-block-end) var(--vui-grid-padding-inline-start)}}.viraui__grid-module__Item_vNnv3{display:block;grid-column:var(--vui-grid-item-column);grid-row:var(--vui-grid-item-row);&[data-grid-item-fullwidth=true]{grid-column:1/-1}&[data-grid-item-fullheight=true]{grid-row:1/-1}&[data-grid-item-subgrid]{display:grid}&[data-grid-item-subgrid=both],&[data-grid-item-subgrid=column]{grid-template-columns:subgrid}&[data-grid-item-subgrid=both],&[data-grid-item-subgrid=row]{grid-template-rows:subgrid}}}
|
|
@@ -29,6 +29,10 @@ export type GridProps = React.ComponentPropsWithoutRef<'div'> & {
|
|
|
29
29
|
* Fixes the number of column tracks. When set, `filling` is ignored and
|
|
30
30
|
* `data-grid-filling-type` is omitted.
|
|
31
31
|
*
|
|
32
|
+
* Bare `columns={N}` uses fluid `repeat(N, minmax(0, 1fr))` tracks. Pass an
|
|
33
|
+
* explicit `colMinWidth` as well for fixed-breadth tracks and
|
|
34
|
+
* `data-grid-fixed-breadth="true"` (`inline-size: max-content`).
|
|
35
|
+
*
|
|
32
36
|
* @default No fixed column count (uses `filling` auto tracks).
|
|
33
37
|
*/
|
|
34
38
|
columns?: number;
|
|
@@ -59,7 +63,9 @@ export type GridProps = React.ComponentPropsWithoutRef<'div'> & {
|
|
|
59
63
|
filling?: 'fit' | 'fill' | false;
|
|
60
64
|
/**
|
|
61
65
|
* Minimum column track width for `filling` auto-fill/auto-fit tracks.
|
|
62
|
-
*
|
|
66
|
+
* When `columns` is also set, an explicit value opts into fixed-breadth
|
|
67
|
+
* tracks (`repeat(N, var(--vui-grid-column-min-w))`) and sets
|
|
68
|
+
* `data-grid-fixed-breadth`; omit this prop to keep fluid `1fr` tracks.
|
|
63
69
|
*
|
|
64
70
|
* @default '10rem'
|
|
65
71
|
*/
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"summary": "CSS Grid layout primitive for auto-fill/fit or fixed track layouts with token gaps, Stack-aligned padding, and item placement (`fullWidth` / `fullHeight` / column / row).",
|
|
5
5
|
"whenToUse": [
|
|
6
6
|
"Responsive card or tile walls that need true CSS Grid tracks (auto-fill/fit or fixed columns)",
|
|
7
|
+
"Fixed-count columns that keep a given track breadth — pair `columns` with an explicit `colMinWidth` so a parent with `overflow: auto` can scroll",
|
|
7
8
|
"Layouts where items must span full row or full column tracks",
|
|
8
9
|
"Token-spaced grids with optional axis padding without custom grid CSS"
|
|
9
10
|
],
|
|
@@ -26,13 +27,13 @@
|
|
|
26
27
|
"properties": {
|
|
27
28
|
"react": {
|
|
28
29
|
"colMinWidth": {
|
|
29
|
-
"description": "Minimum column track width for `filling` auto-fill/auto-fit tracks.
|
|
30
|
+
"description": "Minimum column track width for `filling` auto-fill/auto-fit tracks. When `columns` is also set, an explicit value opts into fixed-breadth tracks (`repeat(N, var(--vui-grid-column-min-w))`) and sets `data-grid-fixed-breadth`; omit this prop to keep fluid `1fr` tracks."
|
|
30
31
|
},
|
|
31
32
|
"columnGap": {
|
|
32
33
|
"description": "Sets the gap between grid columns using the Vira space token scale."
|
|
33
34
|
},
|
|
34
35
|
"columns": {
|
|
35
|
-
"description": "Fixes the number of column tracks. When set, `filling` is ignored and `data-grid-filling-type` is omitted."
|
|
36
|
+
"description": "Fixes the number of column tracks. When set, `filling` is ignored and `data-grid-filling-type` is omitted. Bare `columns={N}` uses fluid `repeat(N, minmax(0, 1fr))` tracks. Pass an explicit `colMinWidth` as well for fixed-breadth tracks and `data-grid-fixed-breadth=\"true\"` (`inline-size: max-content`)."
|
|
36
37
|
},
|
|
37
38
|
"filling": {
|
|
38
39
|
"description": "Controls `repeat(auto-fill|auto-fit, …)` when `columns` is unset. Pass `false` to skip the filling data attribute."
|
|
@@ -85,13 +86,13 @@
|
|
|
85
86
|
"description": "Grid column gap on the root."
|
|
86
87
|
},
|
|
87
88
|
"column-min-w": {
|
|
88
|
-
"description": "Minimum column track width for auto-fill/auto-fit track sizing
|
|
89
|
+
"description": "Minimum column track width for auto-fill/auto-fit track sizing, and the fixed track breadth when `columns` is set with an explicit `colMinWidth`."
|
|
89
90
|
},
|
|
90
91
|
"column-size": {
|
|
91
92
|
"description": "Resolved column track size (`minmax` formula) used by auto-fill/fit."
|
|
92
93
|
},
|
|
93
94
|
"columns": {
|
|
94
|
-
"description": "Fixed column track count when `columns` is set and filling is inactive; tracks
|
|
95
|
+
"description": "Fixed column track count when `columns` is set and filling is inactive; bare `columns` sizes tracks as `minmax(0, 1fr)`; with explicit `colMinWidth`, tracks use `var(--vui-grid-column-min-w)` under `data-grid-fixed-breadth`."
|
|
95
96
|
},
|
|
96
97
|
"padding-block-end": {
|
|
97
98
|
"description": "Block-end padding when padding is enabled."
|
|
@@ -6,12 +6,13 @@ import grid_module_default from "./grid.module.js";
|
|
|
6
6
|
import { GridItem } from "./grid-item.js";
|
|
7
7
|
import { useRender } from "@base-ui/react/use-render";
|
|
8
8
|
//#region src/components/grid/grid.tsx
|
|
9
|
-
var GridRoot = ({ className, colMinWidth
|
|
9
|
+
var GridRoot = ({ className, colMinWidth, columnGap, columns, filling = "fill", hPadding, ref, render, rowGap, rowMinHeight = "1fr", rows, style, vPadding, ...otherProps }) => {
|
|
10
10
|
const hasPadding = Boolean(hPadding || vPadding);
|
|
11
|
+
const hasFixedColumnBreadth = columns != null && colMinWidth != null;
|
|
11
12
|
const dynamicStyle = {
|
|
12
13
|
"--vui-grid-row-gap": resolveThemeValue(rowGap, "space", 0),
|
|
13
14
|
"--vui-grid-column-gap": resolveThemeValue(columnGap, "space", 0),
|
|
14
|
-
"--vui-grid-column-min-w": colMinWidth,
|
|
15
|
+
"--vui-grid-column-min-w": colMinWidth ?? "10rem",
|
|
15
16
|
"--vui-grid-row-min-h": rowMinHeight,
|
|
16
17
|
...columns != null && { "--vui-grid-columns": columns },
|
|
17
18
|
...rows != null && { "--vui-grid-rows": rows },
|
|
@@ -26,6 +27,7 @@ var GridRoot = ({ className, colMinWidth = "10rem", columnGap, columns, filling
|
|
|
26
27
|
props: {
|
|
27
28
|
...otherProps,
|
|
28
29
|
...columns == null && filling && { "data-grid-filling-type": filling },
|
|
30
|
+
...hasFixedColumnBreadth && { "data-grid-fixed-breadth": "true" },
|
|
29
31
|
...rows != null && { "data-grid-has-rows": "true" },
|
|
30
32
|
"data-grid-has-padding": hasPadding ? "true" : "false",
|
|
31
33
|
className: clsx(grid_module_default.Grid, className),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-separator-size{syntax:"<length>";inherits:false;initial-value:1px}.viraui__separator-module__Line_xXOe9{border:0;margin:0;background:
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-separator-size{syntax:"<length>";inherits:false;initial-value:1px}.viraui__separator-module__Line_xXOe9{border:0;margin:0;background:var(--global-contrast);&[data-separator-orientation=horizontal]{inline-size:100%;block-size:var(--vui-separator-size)}&[data-separator-orientation=vertical]{inline-size:var(--vui-separator-size);block-size:100%}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-slider-track-size{syntax:"<length>";inherits:true;initial-value:0}@property --vui-slider-thumb-size{syntax:"<length>";inherits:true;initial-value:0}@property --__slider-thumb-spacer{syntax:"<length>";inherits:true;initial-value:0}@property --__slider-indicator-gap{syntax:"<length>";inherits:true;initial-value:0}@property --vui-slider-track-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-slider-progress-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-slider-thumb-background{syntax:"<color>";inherits:true;initial-value:#0000}.viraui__slider-module__Slider_vDNlm{--vui-slider-track-size:var(--space-medium);--vui-slider-thumb-size:var(--space-2x-small);--vui-slider-track-background:var(--global-contrast);--vui-slider-progress-background:var(--global-primary);--vui-slider-thumb-background:contrast-color(var(--global-primary));--__slider-thumb-spacer:0.75rem;inline-size:100%;block-size:100%;max-block-size:min-content;min-inline-size:0;min-block-size:0;&:has([required]) .viraui__slider-module__Label_eQQHf:after{content:" *";color:var(--highlight-red)}&[data-invalid]{--vui-slider-progress-background:var(--highlight-red)}&:has(.viraui__slider-module__SliderRoot_4JScw[data-disabled]),&[data-disabled]{--vui-slider-track-background:var(--global-disabled-background);--vui-slider-progress-background:var(--global-disabled-foreground);--vui-slider-thumb-background:var(--global-background);cursor:not-allowed}}.viraui__slider-module__SliderRoot_4JScw{inline-size:100%;block-size:100%;min-inline-size:0;min-block-size:0}.viraui__slider-module__SliderHeader_gOy9k{inline-size:100%;min-inline-size:0}.viraui__slider-module__Value_FaY9i{flex-shrink:0}.viraui__slider-module__SliderControl_FQd5-{position:relative;flex:1 1 auto;-webkit-user-select:none;user-select:none;touch-action:none;inline-size:100%;block-size:var(--vui-slider-track-size);min-inline-size:0;min-block-size:0;&[data-orientation=vertical]{inline-size:var(--vui-slider-track-size);block-size:100%;>.viraui__slider-module__Track_wvLEH{inline-size:var(--vui-slider-track-size);block-size:100%}}}.viraui__slider-module__Track_wvLEH{position:relative;overflow:hidden;inline-size:100%;block-size:var(--vui-slider-track-size);background:var(--vui-slider-track-background);border-radius:var(--radius-x-small)}.viraui__slider-module__Indicator_y3JyJ{--__slider-indicator-gap:calc(var(--__slider-thumb-spacer) / 2);background:var(--vui-slider-progress-background);box-sizing:initial;position:relative;padding-inline-end:var(--__slider-indicator-gap);&[data-orientation=vertical]{padding-inline-end:0;padding-block-start:var(--__slider-indicator-gap)}.viraui__slider-module__Track_wvLEH:has(.viraui__slider-module__Thumb_S-uLF~.viraui__slider-module__Thumb_S-uLF) &{margin-inline-start:calc(var(--__slider-indicator-gap) * -1);padding-inline-end:calc(var(--__slider-indicator-gap) * 2);&[data-orientation=vertical]{margin-inline-start:0;padding-inline-end:0;margin-block-end:calc(var(--__slider-indicator-gap) * -1);padding-block-start:calc(var(--__slider-indicator-gap) * 2)}}}.viraui__slider-module__Thumb_S-uLF{box-sizing:border-box;inline-size:var(--__slider-thumb-spacer);block-size:
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-slider-track-size{syntax:"<length>";inherits:true;initial-value:0}@property --vui-slider-thumb-size{syntax:"<length>";inherits:true;initial-value:0}@property --__slider-thumb-spacer{syntax:"<length>";inherits:true;initial-value:0}@property --__slider-indicator-gap{syntax:"<length>";inherits:true;initial-value:0}@property --vui-slider-track-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-slider-progress-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-slider-thumb-background{syntax:"<color>";inherits:true;initial-value:#0000}.viraui__slider-module__Slider_vDNlm{--vui-slider-track-size:var(--space-medium);--vui-slider-thumb-size:var(--space-2x-small);--vui-slider-track-background:var(--global-contrast);--vui-slider-progress-background:var(--global-primary);--vui-slider-thumb-background:contrast-color(var(--global-primary));--__slider-thumb-spacer:0.75rem;inline-size:100%;block-size:100%;max-block-size:min-content;min-inline-size:0;min-block-size:0;&:has([required]) .viraui__slider-module__Label_eQQHf:after{content:" *";color:var(--highlight-red)}&[data-invalid]{--vui-slider-progress-background:var(--highlight-red)}&:has(.viraui__slider-module__SliderRoot_4JScw[data-disabled]),&[data-disabled]{--vui-slider-track-background:var(--global-disabled-background);--vui-slider-progress-background:var(--global-disabled-foreground);--vui-slider-thumb-background:var(--global-background);cursor:not-allowed}}.viraui__slider-module__SliderRoot_4JScw{inline-size:100%;block-size:100%;min-inline-size:0;min-block-size:0}.viraui__slider-module__SliderHeader_gOy9k{inline-size:100%;min-inline-size:0}.viraui__slider-module__Value_FaY9i{flex-shrink:0}.viraui__slider-module__SliderControl_FQd5-{position:relative;flex:1 1 auto;-webkit-user-select:none;user-select:none;touch-action:none;inline-size:100%;block-size:var(--vui-slider-track-size);min-inline-size:0;min-block-size:0;&[data-orientation=vertical]{inline-size:var(--vui-slider-track-size);block-size:100%;>.viraui__slider-module__Track_wvLEH{inline-size:var(--vui-slider-track-size);block-size:100%}}}.viraui__slider-module__Track_wvLEH{position:relative;overflow:hidden;inline-size:100%;block-size:var(--vui-slider-track-size);background:var(--vui-slider-track-background);border-radius:var(--radius-x-small)}.viraui__slider-module__Indicator_y3JyJ{--__slider-indicator-gap:calc(var(--__slider-thumb-spacer) / 2);background:var(--vui-slider-progress-background);box-sizing:initial;position:relative;padding-inline-end:var(--__slider-indicator-gap);&[data-orientation=vertical]{padding-inline-end:0;padding-block-start:var(--__slider-indicator-gap)}.viraui__slider-module__Track_wvLEH:has(.viraui__slider-module__Thumb_S-uLF~.viraui__slider-module__Thumb_S-uLF) &{margin-inline-start:calc(var(--__slider-indicator-gap) * -1);padding-inline-end:calc(var(--__slider-indicator-gap) * 2);&[data-orientation=vertical]{margin-inline-start:0;padding-inline-end:0;margin-block-end:calc(var(--__slider-indicator-gap) * -1);padding-block-start:calc(var(--__slider-indicator-gap) * 2)}}}.viraui__slider-module__Thumb_S-uLF{box-sizing:border-box;inline-size:var(--__slider-thumb-spacer);block-size:50%;appearance:none;&:after{content:"";position:absolute;inset-block:0;inset-inline-start:50%;translate:-50% 0;box-sizing:border-box;inline-size:.125rem;block-size:100%;background:var(--vui-slider-thumb-background);border-radius:var(--radius-infinite)}&[data-orientation=vertical]{inline-size:calc(100% - 8px);block-size:var(--__slider-thumb-spacer);&:after{inset-inline:0;inset-block-start:50%;inset-block-end:auto;translate:0 -50%;inline-size:100%;block-size:var(--vui-slider-thumb-size)}}&:not(:disabled,[data-disabled]){cursor:grab}&:not(:disabled,[data-disabled]):active,&:not(:disabled,[data-disabled]):has(>input:active),&:not(:disabled,[data-disabled])[data-dragging]:has(>input:focus){cursor:grabbing}&:has(>input:focus-visible):after{outline:var(--outline);outline-offset:var(--outline-offset)}>input:focus-visible{outline:none}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-stack-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-h-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-v-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-max-width{syntax:"*";inherits:false;initial-value:none}@property --vui-stack-min-width{syntax:"*";inherits:false;initial-value:none}.viraui__stack-module__Stack_NR-Ey{display:flex;gap:var(--vui-stack-row-gap) var(--vui-stack-column-gap);flex-direction:column;align-items:var(--vui-stack-h-align);justify-content:var(--vui-stack-v-align);max-inline-size:var(--vui-stack-max-width);min-inline-size:var(--vui-stack-min-width);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--vui-stack-v-align);justify-content:var(--vui-stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--vui-stack-padding-block-start) var(--vui-stack-padding-inline-end) var(--vui-stack-padding-block-end) var(--vui-stack-padding-inline-start)}:where(&[data-stack-fill-children=true]>*){flex-grow:var(--vira-flex-grow,1)}&[data-stack-container=true]{container:stack/size}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-stack-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-h-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-v-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-max-width{syntax:"*";inherits:false;initial-value:none}@property --vui-stack-min-width{syntax:"*";inherits:false;initial-value:none}.viraui__stack-module__Stack_NR-Ey{display:flex;gap:var(--vui-stack-row-gap) var(--vui-stack-column-gap);flex-direction:column;align-items:var(--vui-stack-h-align);justify-content:var(--vui-stack-v-align);max-inline-size:var(--vui-stack-max-width);min-inline-size:var(--vui-stack-min-width);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--vui-stack-v-align);justify-content:var(--vui-stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--vui-stack-padding-block-start) var(--vui-stack-padding-inline-end) var(--vui-stack-padding-block-end) var(--vui-stack-padding-inline-start)}:where(&[data-stack-fill-children=true]>*){flex-grow:var(--vira-flex-grow,1)}&[data-stack-container=true]{container:stack/inline-size}}}
|
|
@@ -100,10 +100,10 @@ export type StackProps = React.ComponentPropsWithoutRef<'div'> & {
|
|
|
100
100
|
/**
|
|
101
101
|
* Opt-in named CSS container query context for this Stack.
|
|
102
102
|
*
|
|
103
|
-
* Enables `container: stack / size` on the rendered root (via `data-stack-container="true"`),
|
|
104
|
-
* so descendants can use `@container stack (min-width
|
|
103
|
+
* Enables `container: stack / inline-size` on the rendered root (via `data-stack-container="true"`),
|
|
104
|
+
* so descendants can use `@container stack (min-width: ...)` against this Stack inline-size.
|
|
105
105
|
*
|
|
106
|
-
* Warning:
|
|
106
|
+
* Warning: inline-size containment can affect nested layout (e.g. cards inside Masonry).
|
|
107
107
|
* Use only when you need container queries against this specific Stack.
|
|
108
108
|
*
|
|
109
109
|
* @default false
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"Column or row layouts with token gap and alignment",
|
|
7
7
|
"Composing screens and component internals without custom flex CSS",
|
|
8
8
|
"Custom native root through render while keeping data-stack hooks",
|
|
9
|
-
"Style descendants with `@container stack` queries when layout, gap, or typography should respond to the Stack's own inline-size
|
|
9
|
+
"Style descendants with `@container stack` queries when layout, gap, or typography should respond to the Stack's own inline-size instead of the viewport (set `enableContainer` on the Stack you're querying)"
|
|
10
10
|
],
|
|
11
11
|
"whenNotToUse": [
|
|
12
12
|
"Cases where a single component already owns required flex chrome",
|
|
13
13
|
"Expecting direct children to stretch without setting `fillChildren`",
|
|
14
|
-
"Using `enableContainer` inside complex masonry-like layouts when you don't need container queries (size containment can change nested layout)"
|
|
14
|
+
"Using `enableContainer` inside complex masonry-like layouts when you don't need container queries (inline-size containment can change nested layout)"
|
|
15
15
|
],
|
|
16
16
|
"accessibility": [
|
|
17
17
|
"Stack is presentational — choose render roots that preserve correct semantics (button, list, heading)",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"antiPatterns": [
|
|
22
22
|
"Assuming Stack stretches direct children by default — pass `fillChildren` when children should grow along the flex main axis",
|
|
23
23
|
"Re-declaring primitive flex container rules in app CSS when Stack can own the layout",
|
|
24
|
-
"Using viewport media queries when @container stack queries against the rendered Stack size would match the design intent"
|
|
24
|
+
"Using viewport media queries when @container stack queries against the rendered Stack inline-size would match the design intent"
|
|
25
25
|
],
|
|
26
26
|
"related": ["Surface", "Text", "Button"],
|
|
27
27
|
"properties": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"description": "Sets the gap between flex columns using the Vira space token scale."
|
|
31
31
|
},
|
|
32
32
|
"enableContainer": {
|
|
33
|
-
"description": "Opt-in named CSS container query context for this Stack (enables `container: stack / size` on the root via `data-stack-container`). Required for `@container stack (min-width
|
|
33
|
+
"description": "Opt-in named CSS container query context for this Stack (enables `container: stack / inline-size` on the root via `data-stack-container`). Required for `@container stack (min-width: ...)` rules to react to this Stack inline-size. Warning: inline-size containment can affect nested layout (e.g. cards inside Masonry). Use only when you need container queries against this specific Stack."
|
|
34
34
|
},
|
|
35
35
|
"direction": {
|
|
36
36
|
"description": "Renders children across rows or columns using the chosen flex direction."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-surface-background{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-background-hover{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-border-style{syntax:"<custom-ident>";inherits:false;initial-value:solid}@property --vui-surface-overflow{syntax:"<custom-ident>";inherits:false;initial-value:visible}@property --vui-surface-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}.viraui__surface-module__Surface_slEYq{--vui-surface-border-radius-top-left:var(--vui-surface-border-radius);--vui-surface-border-radius-top-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-left:var(--vui-surface-border-radius);--vui-surface-background-hover:var(--vui-surface-background);position:relative;overflow:var(--vui-surface-overflow);box-sizing:border-box;background:var(--vui-surface-background);border-radius:var(--vui-surface-border-radius-top-left) var(--vui-surface-border-radius-top-right) var(--vui-surface-border-radius-bottom-right) var(--vui-surface-border-radius-bottom-left);border:0;&[data-surface-color=primary]{--vui-surface-background:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}&[data-surface-hover-color=primary]{--vui-surface-background-hover:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}@container root not style(--effect-vibrancy: initial){&[data-vibrant]{background:light-dark(oklab(from var(--vui-surface-background) l a b/60%),oklab(from var(--vui-surface-background) l a b/80%))}}&[data-surface-has-padding=true]{padding:var(--vui-surface-padding-block-start) var(--vui-surface-padding-inline-end) var(--vui-surface-padding-block-end) var(--vui-surface-padding-inline-start)}&[data-surface-border]{border-style:var(--vui-surface-border-style);border-color:var(--global-contrast)}&[data-surface-border=all]{border-width:1px}&[data-surface-border=top]{border-width:1px 0 0}&[data-surface-border=right]{border-width:0 1px 0 0}&[data-surface-border=bottom]{border-width:0 0 1px}&[data-surface-border=left]{border-width:0 0 0 1px}&[data-surface-border=x]{border-width:0 1px}&[data-surface-border=y]{border-width:1px 0}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--vui-surface-background-hover)}}&[data-surface-container=true]{container:surface/size}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-surface-background{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-background-hover{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-border-style{syntax:"<custom-ident>";inherits:false;initial-value:solid}@property --vui-surface-overflow{syntax:"<custom-ident>";inherits:false;initial-value:visible}@property --vui-surface-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}.viraui__surface-module__Surface_slEYq{--vui-surface-border-radius-top-left:var(--vui-surface-border-radius);--vui-surface-border-radius-top-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-left:var(--vui-surface-border-radius);--vui-surface-background-hover:var(--vui-surface-background);position:relative;overflow:var(--vui-surface-overflow);box-sizing:border-box;background:var(--vui-surface-background);border-radius:var(--vui-surface-border-radius-top-left) var(--vui-surface-border-radius-top-right) var(--vui-surface-border-radius-bottom-right) var(--vui-surface-border-radius-bottom-left);border:0;&[data-surface-color=primary]{--vui-surface-background:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}&[data-surface-hover-color=primary]{--vui-surface-background-hover:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}@container root not style(--effect-vibrancy: initial){&[data-vibrant]{background:light-dark(oklab(from var(--vui-surface-background) l a b/60%),oklab(from var(--vui-surface-background) l a b/80%))}}&[data-surface-has-padding=true]{padding:var(--vui-surface-padding-block-start) var(--vui-surface-padding-inline-end) var(--vui-surface-padding-block-end) var(--vui-surface-padding-inline-start)}&[data-surface-border]{border-style:var(--vui-surface-border-style);border-color:var(--global-contrast)}&[data-surface-border=all]{border-width:1px}&[data-surface-border=top]{border-width:1px 0 0}&[data-surface-border=right]{border-width:0 1px 0 0}&[data-surface-border=bottom]{border-width:0 0 1px}&[data-surface-border=left]{border-width:0 0 0 1px}&[data-surface-border=x]{border-width:0 1px}&[data-surface-border=y]{border-width:1px 0}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--vui-surface-background-hover)}}&[data-surface-container=true]{container:surface/inline-size}}}
|
|
@@ -80,10 +80,10 @@ export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'>
|
|
|
80
80
|
/**
|
|
81
81
|
* Opt-in named CSS container query context for this Surface.
|
|
82
82
|
*
|
|
83
|
-
* Enables `container: surface / size` on the rendered root (via `data-surface-container="true"`),
|
|
84
|
-
* so descendants can use `@container surface (min-width
|
|
83
|
+
* Enables `container: surface / inline-size` on the rendered root (via `data-surface-container="true"`),
|
|
84
|
+
* so descendants can use `@container surface (min-width: ...)` against this Surface inline-size.
|
|
85
85
|
*
|
|
86
|
-
* Warning:
|
|
86
|
+
* Warning: inline-size containment can affect nested layout (e.g. cards inside Masonry).
|
|
87
87
|
* Use only when you need container queries against this specific Surface.
|
|
88
88
|
*
|
|
89
89
|
* @default false
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"Set radius=\"auto\" on a nested Surface when its parent Surface has a radius so each corner subtracts the nearest ancestor padding and stays concentric",
|
|
12
12
|
"Stack nested auto-radius Surfaces recursively; context still resolves through wrapper layout such as Stack",
|
|
13
13
|
"Set overflow=\"hidden\" (or scroll/auto) when Surface must clip or scroll inner content with radius or padding",
|
|
14
|
-
"Style descendants with `@container surface` queries when layout or typography should respond to the Surface's own inline-size
|
|
14
|
+
"Style descendants with `@container surface` queries when layout or typography should respond to the Surface's own inline-size instead of the viewport (set `enableContainer` on the Surface you're querying)"
|
|
15
15
|
],
|
|
16
16
|
"whenNotToUse": [
|
|
17
17
|
"Interactive control semantics without an appropriate render root",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"Assuming hoverColor applies on touch devices",
|
|
29
29
|
"Reusing the parent token radius on nested Surfaces instead of radius=\"auto\" when concentric corners are required",
|
|
30
30
|
"Expecting radius=\"auto\" to inherit a token when the nearest ancestor Surface has no radius set",
|
|
31
|
-
"Using viewport media queries when @container surface queries against the rendered Surface size would match the design intent"
|
|
31
|
+
"Using viewport media queries when @container surface queries against the rendered Surface inline-size would match the design intent"
|
|
32
32
|
],
|
|
33
33
|
"related": ["Elevator", "Stack"],
|
|
34
34
|
"properties": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"description": "Applies the shared contrast border on the chosen side or axis. Omit for no border."
|
|
38
38
|
},
|
|
39
39
|
"enableContainer": {
|
|
40
|
-
"description": "Opt-in named CSS container query context for this Surface (enables `container: surface / size` on the root). Required for `@container surface (min-width
|
|
40
|
+
"description": "Opt-in named CSS container query context for this Surface (enables `container: surface / inline-size` on the root). Required for `@container surface (min-width: ...)` rules to react to this Surface inline-size. Warning: inline-size containment can affect nested layout (e.g. cards inside Masonry). Use only when you need container queries against this specific Surface."
|
|
41
41
|
},
|
|
42
42
|
"borderStyle": {
|
|
43
43
|
"description": "Sets the CSS border style when `border` is set."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraui/react",
|
|
3
|
-
"version": "2026.0.
|
|
3
|
+
"version": "2026.0.39",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"unplugin-dts": "1.0.3",
|
|
36
36
|
"vite": "8.1.4",
|
|
37
37
|
"vite-plugin-static-copy": "4.1.1",
|
|
38
|
-
"@viraui/foundation": "2026.0.
|
|
38
|
+
"@viraui/foundation": "2026.0.39",
|
|
39
39
|
"@viraui/icons": "2026.0.1",
|
|
40
|
-
"@viraui/
|
|
41
|
-
"@viraui/
|
|
40
|
+
"@viraui/postcss-config": "2026.0.0",
|
|
41
|
+
"@viraui/tsconfig": "2026.0.0"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"@base-ui/react": ">=1.6.0",
|