@viraui/react 2026.0.21 → 2026.0.23

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/catalog.json CHANGED
@@ -5,7 +5,7 @@
5
5
  {
6
6
  "id": "accordion",
7
7
  "name": "Accordion",
8
- "summary": "Collapsible sections grouped into open/closed blocks with optional Surface wrapping, shared corner radius, and background on open items.",
8
+ "summary": "Collapsible sections grouped into open/closed blocks with optional Surface wrapping, shared corner radius, and optional Item color for open-block background.",
9
9
  "guidePath": "./components/accordion/accordion.guide.json"
10
10
  },
11
11
  {
@@ -98,6 +98,12 @@
98
98
  "summary": "Decorative pointer-driven border highlight on a transparent Surface shell (radius only). Put the visual card as children; a shared rAF tracker paints CSS variables without React re-renders.",
99
99
  "guidePath": "./components/glow/glow.guide.json"
100
100
  },
101
+ {
102
+ "id": "grid",
103
+ "name": "Grid",
104
+ "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).",
105
+ "guidePath": "./components/grid/grid.guide.json"
106
+ },
101
107
  {
102
108
  "id": "icon-button",
103
109
  "name": "IconButton",
@@ -24,7 +24,7 @@ export type AccordionItemProps = AccordionItem.Props & {
24
24
  */
25
25
  children?: React.ReactNode;
26
26
  /**
27
- * When `true`, wraps the item in `Surface` with border and open-block background.
27
+ * When `true`, wraps the item in `Surface` (optional open-block background via `color`).
28
28
  * When `false`, renders without `Surface` so consumers can insert `Separator` between items;
29
29
  * island styling is skipped for that item.
30
30
  *
@@ -49,10 +49,18 @@ export type AccordionItemProps = AccordionItem.Props & {
49
49
  * @default Built-in Minus chrome SVG at size 16
50
50
  */
51
51
  iconOpen?: React.ReactNode;
52
+ /**
53
+ * Contrast border side or axis forwarded to the wrapping `Surface` when `useSurface` is `true`.
54
+ * Omit for no border.
55
+ *
56
+ * @default No border.
57
+ */
58
+ border?: SurfaceProps['border'];
52
59
  /**
53
60
  * Resting background for the item card, forwarded to the wrapping `Surface` when `useSurface` is `true`.
61
+ * Omit for no background (`Surface` leaves `--vui-surface-background` as `none`).
54
62
  *
55
- * @default 1
63
+ * @default No background.
56
64
  */
57
65
  color?: SurfaceProps['color'];
58
66
  /**
@@ -8,7 +8,7 @@ import { Surface } from "../surface/surface.js";
8
8
  import { Accordion } from "@base-ui/react/accordion";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/components/accordion/accordion-item.tsx
11
- var AccordionItemComponent = ({ children, className, color = 1, iconClosed = /* @__PURE__ */ jsx(ChromePlus, { size: 16 }), iconOpen = /* @__PURE__ */ jsx(ChromeMinus, { size: 16 }), iconPosition = "end", radius, style, trigger, useSurface = true, ...otherProps }) => {
11
+ var AccordionItemComponent = ({ border, children, className, color, iconClosed = /* @__PURE__ */ jsx(ChromePlus, { size: 16 }), iconOpen = /* @__PURE__ */ jsx(ChromeMinus, { size: 16 }), iconPosition = "end", radius, style, trigger, useSurface = true, ...otherProps }) => {
12
12
  const iconAtStart = iconPosition === "start";
13
13
  const dynamicStyle = {
14
14
  ...radius != null && { "--vui-accordion-radius": resolveThemeValue(radius, "radius", "var(--radius-medium)") },
@@ -30,8 +30,8 @@ var AccordionItemComponent = ({ children, className, color = 1, iconClosed = /*
30
30
  "data-use-surface": useSurface ? "true" : "false",
31
31
  style: dynamicStyle,
32
32
  ...useSurface && { render: /* @__PURE__ */ jsx(Surface, {
33
- border: "all",
34
- color
33
+ border,
34
+ ...color !== void 0 && { color }
35
35
  }) },
36
36
  ...otherProps,
37
37
  children: [/* @__PURE__ */ jsx(Accordion.Header, {
@@ -2,7 +2,7 @@
2
2
  "name": "Accordion",
3
3
  "baseUIApi": "https://base-ui.com/react/components/accordion#api-reference",
4
4
  "structure": "<Accordion>\n <Accordion.Item trigger=\"…\">…</Accordion.Item>\n</Accordion>",
5
- "summary": "Collapsible sections grouped into open/closed blocks with optional Surface wrapping, shared corner radius, and background on open items.",
5
+ "summary": "Collapsible sections grouped into open/closed blocks with optional Surface wrapping, shared corner radius, and optional Item color for open-block background.",
6
6
  "whenToUse": [
7
7
  "Progressive disclosure for related content sections in one surface",
8
8
  "FAQ or settings groups where only one section may be open by default",
@@ -27,11 +27,14 @@
27
27
  "islands": {
28
28
  "description": "When `true`, open/closed blocks render as separated Surface islands with gap between them. When `false`, blocks stay attached with corner radius only on the first and last items. Applies only to items with `useSurface`."
29
29
  },
30
+ "Item.border": {
31
+ "description": "Contrast border side or axis forwarded to the wrapping `Surface` when `useSurface` is `true`. Omit for no border."
32
+ },
30
33
  "Item.children": {
31
34
  "description": "Panel content revealed when the item is open."
32
35
  },
33
36
  "Item.color": {
34
- "description": "Resting background for the item card, forwarded to the wrapping `Surface` when `useSurface` is `true`."
37
+ "description": "Resting background for the item card, forwarded to the wrapping `Surface` when `useSurface` is `true`. Omit for no background."
35
38
  },
36
39
  "Item.iconClosed": {
37
40
  "description": "Decorative icon shown when the item is closed."
@@ -50,7 +53,7 @@
50
53
  "description": "Visible trigger label rendered inside the accordion header button."
51
54
  },
52
55
  "Item.useSurface": {
53
- "description": "When `true`, wraps the item in `Surface` with border and open-block background. When `false`, renders without `Surface` so consumers can insert `Separator` between items; island styling is skipped for that item."
56
+ "description": "When `true`, wraps the item in `Surface` (optional open-block background via `color`). When `false`, renders without `Surface` so consumers can insert `Separator` between items; island styling is skipped for that item."
54
57
  }
55
58
  },
56
59
  "css": {
@@ -0,0 +1,62 @@
1
+ import { useRender } from '@base-ui/react/use-render';
2
+ import type * as React from 'react';
3
+ type GridItemSubgrid = boolean | 'column' | 'row';
4
+ /**
5
+ * Public Grid.Item props.
6
+ *
7
+ * Includes standard `div` attributes such as `id`, `role`, `title`, and event handlers,
8
+ * plus placement controls and Base UI `render` support for replacing the item root.
9
+ *
10
+ * @default Base UI pass-through props keep upstream defaults.
11
+ */
12
+ export type GridItemProps = React.ComponentPropsWithoutRef<'div'> & {
13
+ /**
14
+ * Replaces the default `div` root using Base UI render semantics.
15
+ *
16
+ * @default The item renders a `div` root.
17
+ */
18
+ render?: useRender.RenderProp;
19
+ /**
20
+ * Ref forwarded to the rendered item root element.
21
+ *
22
+ * @default No ref is attached.
23
+ */
24
+ ref?: React.Ref<HTMLElement>;
25
+ /**
26
+ * Spans the item across every column track (`grid-column: 1 / -1`).
27
+ * Wins over `column` when both are set.
28
+ *
29
+ * @default false
30
+ */
31
+ fullWidth?: boolean;
32
+ /**
33
+ * Spans the item across every row track (`grid-row: 1 / -1`).
34
+ * Wins over `row` when both are set.
35
+ *
36
+ * @default false
37
+ */
38
+ fullHeight?: boolean;
39
+ /**
40
+ * Sets explicit `grid-column` placement via `--vui-grid-item-column`.
41
+ *
42
+ * @default No explicit column placement.
43
+ */
44
+ column?: React.CSSProperties['gridColumn'];
45
+ /**
46
+ * Sets explicit `grid-row` placement via `--vui-grid-item-row`.
47
+ *
48
+ * @default No explicit row placement.
49
+ */
50
+ row?: React.CSSProperties['gridRow'];
51
+ /**
52
+ * Opts the item into a nested CSS grid that inherits parent tracks via `subgrid`.
53
+ * Sets `display: grid` and `grid-template-columns` and/or `grid-template-rows` to `subgrid`.
54
+ * Pass `true` for both axes, or `'column'` / `'row'` for one axis.
55
+ * Pair with `fullWidth` / `fullHeight` or a `column` / `row` span so the item covers the tracks to inherit.
56
+ *
57
+ * @default false
58
+ */
59
+ subgrid?: GridItemSubgrid;
60
+ };
61
+ export declare const GridItem: React.FC<GridItemProps>;
62
+ export {};
@@ -0,0 +1,32 @@
1
+ import { clsx } from "../../core/clsx.js";
2
+ import grid_module_default from "./grid.module.js";
3
+ import { useRender } from "@base-ui/react/use-render";
4
+ //#region src/components/grid/grid-item.tsx
5
+ var resolveSubgridAttr = (subgrid) => {
6
+ if (!subgrid) return void 0;
7
+ if (subgrid === true) return "both";
8
+ return subgrid;
9
+ };
10
+ var GridItem = ({ className, column, fullHeight = false, fullWidth = false, ref, render, row, style, subgrid = false, ...otherProps }) => {
11
+ const subgridAttr = resolveSubgridAttr(subgrid);
12
+ const dynamicStyle = {
13
+ ...column && { "--vui-grid-item-column": column },
14
+ ...row && { "--vui-grid-item-row": row },
15
+ ...style
16
+ };
17
+ return useRender({
18
+ defaultTagName: "div",
19
+ render,
20
+ ref,
21
+ props: {
22
+ ...otherProps,
23
+ ...fullWidth && { "data-grid-item-fullwidth": "true" },
24
+ ...fullHeight && { "data-grid-item-fullheight": "true" },
25
+ ...subgridAttr && { "data-grid-item-subgrid": subgridAttr },
26
+ className: clsx(grid_module_default.Item, className),
27
+ style: dynamicStyle
28
+ }
29
+ });
30
+ };
31
+ //#endregion
32
+ export { GridItem };
@@ -0,0 +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);min-inline-size:0;&[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}}}
@@ -0,0 +1,90 @@
1
+ import { useRender } from '@base-ui/react/use-render';
2
+ import { ThemeTypes } from '@viraui/foundation/vira/types';
3
+ import { GridItemProps } from './grid-item';
4
+ import type * as React from 'react';
5
+ type GridSpace = ThemeTypes['space'];
6
+ type GridAxisPadding = GridSpace | [GridSpace | 0, GridSpace | 0];
7
+ /**
8
+ * Public Grid props.
9
+ *
10
+ * Includes standard `div` attributes such as `id`, `role`, `title`, and event handlers,
11
+ * plus Vira-owned CSS Grid controls and Base UI `render` support for replacing the root element.
12
+ *
13
+ * @default Base UI pass-through props keep upstream defaults.
14
+ */
15
+ export type GridProps = React.ComponentPropsWithoutRef<'div'> & {
16
+ /**
17
+ * Replaces the default `div` root using Base UI render semantics.
18
+ *
19
+ * @default The grid renders a `div` root.
20
+ */
21
+ render?: useRender.RenderProp;
22
+ /**
23
+ * Ref forwarded to the rendered grid root element.
24
+ *
25
+ * @default No ref is attached.
26
+ */
27
+ ref?: React.Ref<HTMLElement>;
28
+ /**
29
+ * Fixes the number of column tracks. When set, `filling` is ignored and
30
+ * `data-grid-filling-type` is omitted.
31
+ *
32
+ * @default No fixed column count (uses `filling` auto tracks).
33
+ */
34
+ columns?: number;
35
+ /**
36
+ * Fixes the number of row tracks via `--vui-grid-rows`.
37
+ *
38
+ * @default No fixed row count.
39
+ */
40
+ rows?: number;
41
+ /**
42
+ * Sets the gap between grid rows using the Vira space token scale.
43
+ *
44
+ * @default No row gap (`0`).
45
+ */
46
+ rowGap?: GridSpace;
47
+ /**
48
+ * Sets the gap between grid columns using the Vira space token scale.
49
+ *
50
+ * @default No column gap (`0`).
51
+ */
52
+ columnGap?: GridSpace;
53
+ /**
54
+ * Controls `repeat(auto-fill|auto-fit, …)` when `columns` is unset.
55
+ * Pass `false` to skip the filling data attribute.
56
+ *
57
+ * @default 'fill'
58
+ */
59
+ filling?: 'fit' | 'fill' | false;
60
+ /**
61
+ * Minimum column track width for `filling` auto-fill/auto-fit tracks.
62
+ * Ignored when `columns` is set (fixed tracks use `minmax(0, 1fr)` so gaps fit).
63
+ *
64
+ * @default '10rem'
65
+ */
66
+ colMinWidth?: string;
67
+ /**
68
+ * Minimum row track size used when `rows` is set.
69
+ *
70
+ * @default '1fr'
71
+ */
72
+ rowMinHeight?: string;
73
+ /**
74
+ * Sets inline padding using one token for both sides or a `[start, end]` tuple.
75
+ *
76
+ * @default No inline padding.
77
+ */
78
+ hPadding?: GridAxisPadding;
79
+ /**
80
+ * Sets block padding using one token for both sides or a `[start, end]` tuple.
81
+ *
82
+ * @default No block padding.
83
+ */
84
+ vPadding?: GridAxisPadding;
85
+ };
86
+ export type { GridItemProps } from './grid-item';
87
+ type GridComponent = React.FC<GridProps> & {
88
+ Item: React.FC<GridItemProps>;
89
+ };
90
+ export declare const Grid: GridComponent;
@@ -0,0 +1,119 @@
1
+ {
2
+ "name": "Grid",
3
+ "structure": "<Grid>\n <Grid.Item>…</Grid.Item>\n</Grid>",
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
+ "whenToUse": [
6
+ "Responsive card or tile walls that need true CSS Grid tracks (auto-fill/fit or fixed columns)",
7
+ "Layouts where items must span full row or full column tracks",
8
+ "Token-spaced grids with optional axis padding without custom grid CSS"
9
+ ],
10
+ "whenNotToUse": [
11
+ "Uneven-height presentational walls where reading order can follow columns — prefer Masonry",
12
+ "Simple one-axis flex spacing — prefer Stack",
13
+ "Expecting Masonry-style React column packing instead of CSS Grid tracks"
14
+ ],
15
+ "accessibility": [
16
+ "Grid is presentational — choose render roots that preserve correct semantics (section, list, article)",
17
+ "DOM order follows source order; keep reading and keyboard order aligned with visual placement",
18
+ "Prefer Grid.Item render when list or article semantics matter for children"
19
+ ],
20
+ "antiPatterns": [
21
+ "Using Masonry when you need explicit row/column placement or full-width/full-height spans",
22
+ "Re-declaring grid-template and gap in app CSS when Grid can own the layout",
23
+ "Setting both fullWidth and column (or fullHeight and row) and expecting the explicit placement to win — full-* data attrs override"
24
+ ],
25
+ "related": ["Stack", "Masonry", "Surface"],
26
+ "properties": {
27
+ "react": {
28
+ "colMinWidth": {
29
+ "description": "Minimum column track width for `filling` auto-fill/auto-fit tracks. Ignored when `columns` is set (fixed tracks use `minmax(0, 1fr)` so gaps fit)."
30
+ },
31
+ "columnGap": {
32
+ "description": "Sets the gap between grid columns using the Vira space token scale."
33
+ },
34
+ "columns": {
35
+ "description": "Fixes the number of column tracks. When set, `filling` is ignored and `data-grid-filling-type` is omitted."
36
+ },
37
+ "filling": {
38
+ "description": "Controls `repeat(auto-fill|auto-fit, …)` when `columns` is unset. Pass `false` to skip the filling data attribute."
39
+ },
40
+ "hPadding": {
41
+ "description": "Sets inline padding using one token for both sides or a `[start, end]` tuple."
42
+ },
43
+ "Item.column": {
44
+ "description": "Sets explicit `grid-column` placement via `--vui-grid-item-column`."
45
+ },
46
+ "Item.fullHeight": {
47
+ "description": "Spans the item across every row track (`grid-row: 1 / -1`). Wins over `row` when both are set."
48
+ },
49
+ "Item.fullWidth": {
50
+ "description": "Spans the item across every column track (`grid-column: 1 / -1`). Wins over `column` when both are set."
51
+ },
52
+ "Item.ref": {
53
+ "description": "Ref forwarded to the rendered item root element."
54
+ },
55
+ "Item.render": {
56
+ "description": "Replaces the default `div` item root using Base UI render semantics."
57
+ },
58
+ "Item.row": {
59
+ "description": "Sets explicit `grid-row` placement via `--vui-grid-item-row`."
60
+ },
61
+ "Item.subgrid": {
62
+ "description": "Opts the item into a nested CSS grid that inherits parent tracks via `subgrid`. Sets `display: grid` and `grid-template-columns` and/or `grid-template-rows` to `subgrid`. Pass `true` for both axes, or `'column'` / `'row'` for one axis. Pair with `fullWidth` / `fullHeight` or a `column` / `row` span so the item covers the tracks to inherit."
63
+ },
64
+ "ref": {
65
+ "description": "Ref forwarded to the rendered grid root element."
66
+ },
67
+ "render": {
68
+ "description": "Replaces the default `div` root using Base UI render semantics."
69
+ },
70
+ "rowGap": {
71
+ "description": "Sets the gap between grid rows using the Vira space token scale."
72
+ },
73
+ "rowMinHeight": {
74
+ "description": "Minimum row track size used when `rows` is set."
75
+ },
76
+ "rows": {
77
+ "description": "Fixes the number of row tracks via `--vui-grid-rows`."
78
+ },
79
+ "vPadding": {
80
+ "description": "Sets block padding using one token for both sides or a `[start, end]` tuple."
81
+ }
82
+ },
83
+ "css": {
84
+ "column-gap": {
85
+ "description": "Grid column gap on the root."
86
+ },
87
+ "column-min-w": {
88
+ "description": "Minimum column track width for auto-fill/auto-fit track sizing."
89
+ },
90
+ "column-size": {
91
+ "description": "Resolved column track size (`minmax` formula) used by auto-fill/fit."
92
+ },
93
+ "columns": {
94
+ "description": "Fixed column track count when `columns` is set and filling is inactive; tracks size as `minmax(0, 1fr)`."
95
+ },
96
+ "padding-block-end": {
97
+ "description": "Block-end padding when padding is enabled."
98
+ },
99
+ "padding-block-start": {
100
+ "description": "Block-start padding when padding is enabled."
101
+ },
102
+ "padding-inline-end": {
103
+ "description": "Inline-end padding when padding is enabled."
104
+ },
105
+ "padding-inline-start": {
106
+ "description": "Inline-start padding when padding is enabled."
107
+ },
108
+ "row-gap": {
109
+ "description": "Grid row gap on the root."
110
+ },
111
+ "row-min-h": {
112
+ "description": "Minimum row track size when fixed rows are enabled."
113
+ },
114
+ "rows": {
115
+ "description": "Fixed row track count when `rows` is set."
116
+ }
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,38 @@
1
+ import './grid.css';
2
+ import { clsx } from "../../core/clsx.js";
3
+ import { resolveThemeValue } from "../../core/theme/resolve-theme-value.js";
4
+ import { resolveAxisPadding } from "../../core/styles/resolve-axis-padding.js";
5
+ import grid_module_default from "./grid.module.js";
6
+ import { GridItem } from "./grid-item.js";
7
+ import { useRender } from "@base-ui/react/use-render";
8
+ //#region src/components/grid/grid.tsx
9
+ var GridRoot = ({ className, colMinWidth = "10rem", columnGap, columns, filling = "fill", hPadding, ref, render, rowGap, rowMinHeight = "1fr", rows, style, vPadding, ...otherProps }) => {
10
+ const hasPadding = Boolean(hPadding || vPadding);
11
+ const dynamicStyle = {
12
+ "--vui-grid-row-gap": resolveThemeValue(rowGap, "space", 0),
13
+ "--vui-grid-column-gap": resolveThemeValue(columnGap, "space", 0),
14
+ "--vui-grid-column-min-w": colMinWidth,
15
+ "--vui-grid-row-min-h": rowMinHeight,
16
+ ...columns != null && { "--vui-grid-columns": columns },
17
+ ...rows != null && { "--vui-grid-rows": rows },
18
+ ...resolveAxisPadding(hPadding, "--vui-grid-padding-inline-start", "--vui-grid-padding-inline-end"),
19
+ ...resolveAxisPadding(vPadding, "--vui-grid-padding-block-start", "--vui-grid-padding-block-end"),
20
+ ...style
21
+ };
22
+ return useRender({
23
+ defaultTagName: "div",
24
+ render,
25
+ ref,
26
+ props: {
27
+ ...otherProps,
28
+ ...columns == null && filling && { "data-grid-filling-type": filling },
29
+ ...rows != null && { "data-grid-has-rows": "true" },
30
+ "data-grid-has-padding": hasPadding ? "true" : "false",
31
+ className: clsx(grid_module_default.Grid, className),
32
+ style: dynamicStyle
33
+ }
34
+ });
35
+ };
36
+ var Grid = Object.assign(GridRoot, { Item: GridItem });
37
+ //#endregion
38
+ export { Grid };
@@ -0,0 +1,9 @@
1
+ //#region src/components/grid/grid.module.css
2
+ var Grid = "viraui__grid-module__Grid_rTZor";
3
+ var Item = "viraui__grid-module__Item_vNnv3";
4
+ var grid_module_default = {
5
+ Grid,
6
+ Item
7
+ };
8
+ //#endregion
9
+ export { Grid, Item, grid_module_default as default };
@@ -0,0 +1,2 @@
1
+ export { Grid } from './grid';
2
+ export type { GridItemProps, GridProps } from './grid';
@@ -14,6 +14,7 @@ export * from './elevator';
14
14
  export * from './fieldset';
15
15
  export * from './fit-text';
16
16
  export * from './glow';
17
+ export * from './grid';
17
18
  export * from './icon-button';
18
19
  export * from './linear-progress';
19
20
  export * from './masonry';
@@ -11,7 +11,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
11
11
  import { Field } from "@base-ui/react/field";
12
12
  import { Slider } from "@base-ui/react/slider";
13
13
  //#region src/components/slider/slider.tsx
14
- var Slider$1 = ({ className, defaultValue, description, dirty, disabled, error, invalid, label, name, orientation = "horizontal", renderValue, thumbAriaLabel, touched, validate, validationDebounceTime, validationMode, value, ref, ...sliderRootProps }) => {
14
+ var Slider$1 = ({ className, defaultValue, description, dirty, disabled, error, invalid, label, name, orientation = "horizontal", renderValue, thumbAlignment = "edge", thumbAriaLabel, touched, validate, validationDebounceTime, validationMode, value, ref, ...sliderRootProps }) => {
15
15
  const isRange = isRangeSlider(value, defaultValue);
16
16
  const isVertical = orientation === "vertical";
17
17
  const showRenderedValue = renderValue === true || typeof renderValue === "function";
@@ -38,6 +38,7 @@ var Slider$1 = ({ className, defaultValue, description, dirty, disabled, error,
38
38
  name,
39
39
  orientation,
40
40
  value,
41
+ thumbAlignment,
41
42
  render: /* @__PURE__ */ jsx(Stack, {
42
43
  direction: "column",
43
44
  rowGap: "medium",
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ import { FitText } from "./components/fit-text/fit-text.js";
28
28
  import { Surface } from "./components/surface/surface.js";
29
29
  import { getGlowListenerCount, getGlowRegistrySize } from "./components/glow/glow-tracker.js";
30
30
  import { Glow } from "./components/glow/glow.js";
31
+ import { Grid } from "./components/grid/grid.js";
31
32
  import { IconButton } from "./components/icon-button/icon-button.js";
32
33
  import { IconButtonLink } from "./components/icon-button/icon-button-link.js";
33
34
  import { LinearProgress } from "./components/linear-progress/linear-progress.js";
@@ -65,4 +66,4 @@ import { ToggleGroup } from "./components/toggle-group/toggle-group.js";
65
66
  import { Typewriter } from "./components/typewriter/typewriter.js";
66
67
  import { TooltipContent } from "./components/tooltip/tooltip-content.js";
67
68
  import { Tooltip, TooltipProvider, TooltipTrigger } from "./components/tooltip/tooltip.js";
68
- export { Accordion, Annotate, Autocomplete, Avatar, AvatarGroup, Badge, Bleed, Button, ButtonLink, Checkbox, CheckboxGroup, Chip, ClampText, Dialog, DialogClose, DialogIndent, DialogIndentBackground, DialogSheet, DialogTrigger, ELEVATION_DEFAULTS, Elevator, Fieldset, FitText, Glow, IconButton, IconButtonLink, LinearProgress, Masonry, Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuLinkItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Meter, Popover, PopoverClose, PopoverDescription, PopoverSheet, PopoverTitle, PopoverTrigger, ProgressiveBlur, Radio, RadioGroup, Select, Separator, Shimmer, Skeleton, Slider, Spinner, Stack, StaticNoise, Surface, Switch, Tabs, Text, Textarea, Textfield, Title, Toast, ToggleButton, ToggleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Typewriter, getElevationProps, getGlowListenerCount, getGlowRegistrySize };
69
+ export { Accordion, Annotate, Autocomplete, Avatar, AvatarGroup, Badge, Bleed, Button, ButtonLink, Checkbox, CheckboxGroup, Chip, ClampText, Dialog, DialogClose, DialogIndent, DialogIndentBackground, DialogSheet, DialogTrigger, ELEVATION_DEFAULTS, Elevator, Fieldset, FitText, Glow, Grid, IconButton, IconButtonLink, LinearProgress, Masonry, Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuLinkItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Meter, Popover, PopoverClose, PopoverDescription, PopoverSheet, PopoverTitle, PopoverTrigger, ProgressiveBlur, Radio, RadioGroup, Select, Separator, Shimmer, Skeleton, Slider, Spinner, Stack, StaticNoise, Surface, Switch, Tabs, Text, Textarea, Textfield, Title, Toast, ToggleButton, ToggleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Typewriter, getElevationProps, getGlowListenerCount, getGlowRegistrySize };
@@ -59,7 +59,7 @@
59
59
  {
60
60
  "id": "color-primitives",
61
61
  "pattern": "--color-{palette}-{step}",
62
- "purpose": "Raw palette steps referenced by semantic aliases; not the primary consumer override API."
62
+ "purpose": "Raw palette steps 0–70 by tens referenced by semantic aliases; not the primary consumer override API."
63
63
  },
64
64
  {
65
65
  "id": "motion",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viraui/react",
3
- "version": "2026.0.21",
3
+ "version": "2026.0.23",
4
4
  "private": false,
5
5
  "files": [
6
6
  "dist"
@@ -35,7 +35,7 @@
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.21",
38
+ "@viraui/foundation": "2026.0.23",
39
39
  "@viraui/icons": "2026.0.0",
40
40
  "@viraui/postcss-config": "2026.0.0",
41
41
  "@viraui/tsconfig": "2026.0.0"