@viraui/react 2026.6.3 → 2026.6.4
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/README.md +1 -3
- package/dist/components/tabs/tabs-tab.js +1 -0
- package/dist/components/typewriter/typewriter.css +1 -1
- package/dist/specs/PROTOCOL.md +4 -3
- package/dist/specs/activity-hints.xml +3 -1
- package/dist/specs/components/grid/props.xml +2 -2
- package/dist/specs/components/grid/usage.xml +1 -1
- package/dist/specs/components/stack/props.xml +2 -2
- package/dist/specs/components/stack/usage.xml +2 -1
- package/dist/specs/components/surface/props.xml +2 -2
- package/dist/specs/components/surface/usage.xml +1 -1
- package/dist/specs/components/text/props.xml +2 -2
- package/dist/specs/components/text/usage.xml +1 -1
- package/dist/specs/components/title/props.xml +2 -2
- package/dist/specs/components/title/usage.xml +1 -1
- package/dist/specs/components/typewriter/usage.xml +1 -0
- package/dist/specs/index.xml +1 -1
- package/dist/specs/patterns/compose-layout-first.xml +1 -1
- package/dist/specs/patterns/page-chrome.xml +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
<!-- PROJECT LOGO -->
|
|
2
2
|
<br />
|
|
3
3
|
<div align="center">
|
|
4
|
-
<
|
|
5
|
-
<img alt="ViraUI" src="https://viraui.dev/viraui-logo-midgray.png" height="30" draggable="false" />
|
|
6
|
-
</h3>
|
|
4
|
+
<h1 align="center">ViraUI</h1>
|
|
7
5
|
<br />
|
|
8
6
|
<h2 align="center" style="font-weight: 500;">
|
|
9
7
|
Ship real UI at the speed of thought.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-typewriter-caret-color{syntax:"<color>";inherits:true;initial-value:currentcolor}.viraui__typewriter-module__Typewriter_R3sbb{position:relative;isolation:isolate}.viraui__typewriter-module__Ghost_R-Yy-{visibility:hidden;white-space:pre-wrap}.viraui__typewriter-module__Typed_00NZ8{white-space:pre-wrap}.viraui__typewriter-module__Typewriter_R3sbb[data-preserve-space]>.viraui__typewriter-module__Typed_00NZ8{position:absolute;inset-inline
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-typewriter-caret-color{syntax:"<color>";inherits:true;initial-value:currentcolor}.viraui__typewriter-module__Typewriter_R3sbb{position:relative;isolation:isolate}.viraui__typewriter-module__Typewriter_R3sbb[data-preserve-space]{display:flex}.viraui__typewriter-module__Ghost_R-Yy-{visibility:hidden;white-space:pre-wrap}.viraui__typewriter-module__Typed_00NZ8{white-space:pre-wrap}.viraui__typewriter-module__Typewriter_R3sbb[data-preserve-space]>.viraui__typewriter-module__Typed_00NZ8{position:absolute;inset-inline:0;inset-block-start:0}.viraui__typewriter-module__Caret_96Yfs{display:inline-block;vertical-align:initial;color:var(--vui-typewriter-caret-color);animation:viraui__typewriter-module__typewriter-caret-blink_yLCpV 1.1s step-start infinite;&[data-type=block]{inline-size:.55em;block-size:.95em;margin-inline-start:.04em;background-color:var(--vui-typewriter-caret-color);transform:translateY(.08em)}&[data-type=pipe]:before{content:"|"}&[data-type=underscore]:before{content:"_"}}.viraui__typewriter-module__A11y_B-rjF{position:absolute;inset-block-start:0;inset-inline-start:0;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0;pointer-events:none}@keyframes viraui__typewriter-module__typewriter-caret-blink_yLCpV{50%{opacity:0}}}
|
package/dist/specs/PROTOCOL.md
CHANGED
|
@@ -44,9 +44,10 @@ Prefer opening via package export / that `dist/specs/` tree. The `version` attri
|
|
|
44
44
|
Consumer agents build screens **with** ViraUI — public parts, compounds, and props from the units — not **around** it with immediate CSS overrides.
|
|
45
45
|
|
|
46
46
|
1. Index → activity load → open `meta` / `props` / `usage` for every Vira surface you touch **before** JSX that invents classNames or a CSS module targeting those roots.
|
|
47
|
-
2. Prefer another Vira part or public prop over custom CSS (layout → `Stack`/`Grid`/`Masonry`/`Bleed`/`Surface`; fill → `fullWidth` / `expandChildren`; type → `Text`/`Title` props; chrome → `Surface` / `Elevator`).
|
|
48
|
-
3.
|
|
49
|
-
4.
|
|
47
|
+
2. Prefer another Vira part or public prop over custom CSS (layout → `Stack`/`Grid`/`Masonry`/`Bleed`/`Surface`; fill → `fullWidth` / `expandChildren`; one-sided inset → `hPadding`/`vPadding` `[start, end]` tuples — not `paddingBlock*`/`paddingInline*` style; type → `Text`/`Title` props; chrome → `Surface` / `Elevator`).
|
|
48
|
+
3. **Omit `render` when it restates the component’s default root.** Confirm the default in that surface’s `props`/`usage` (e.g. Stack → `div`). Do **not** write `render={<div />}` on Stack, or any other `render={<SameDefault />}` noop. Use `render` only to change the host (semantic tag, `Surface`, another component).
|
|
49
|
+
4. Custom CSS defaults to **app chrome the system does not own** (page backdrop image, document scrollport, one-off marketing layout). It is **not** a license to reshape Vira control geometry, reinvent owned props, or “fix” controls that already look correct under theme + preflight — **unless the consumer expressly requests** that override / personalization. A future override layer will own formal customization hooks; until then, still open `props`/`usage` first and apply only the asked CSS.
|
|
50
|
+
5. If `usage.xml` lists a **dont** against the CSS you are about to write and the consumer did **not** expressly override that guidance — stop. Do not ship it.
|
|
50
51
|
|
|
51
52
|
Opening a CSS module on a Vira root without having opened that surface’s `props.xml` + `usage.xml` is a protocol defect. Unsolicited reshape CSS (no consumer ask) is the same defect.
|
|
52
53
|
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
<forbid>Opening every component props.xml in the package</forbid>
|
|
21
21
|
<forbid>Writing unsolicited className / CSS module / utility styles on a Vira root before opening that surface props.xml and usage.xml</forbid>
|
|
22
22
|
<forbid>Treating Vira controls as raw HTML to reshape without an express consumer request for override / personalization — compose with public parts and props first</forbid>
|
|
23
|
+
<forbid>Passing render that restates the component default root (e.g. Stack render={<div />}; confirm default in props/usage) — omit render unless the host changes</forbid>
|
|
23
24
|
</activity>
|
|
24
25
|
<activity id="foundation-attrs">
|
|
25
26
|
<description>Mode, vibrancy, elevation, grow/shrink hooks.</description>
|
|
@@ -63,6 +64,7 @@
|
|
|
63
64
|
<step unit="usage" note="confirm stack/surface/grid (etc.) do/dont after pattern" />
|
|
64
65
|
<step unit="props" note="verify spacing / render / fullWidth names" />
|
|
65
66
|
</load>
|
|
66
|
-
<forbid>Inventing display:flex / display:grid / CSS gap/padding/border chrome when Stack, Grid, Masonry, Bleed, or Surface cover it</forbid>
|
|
67
|
+
<forbid>Inventing display:flex / display:grid / CSS gap/padding/paddingBlock*/paddingInline*/border chrome when Stack, Grid, Masonry, Bleed, or Surface cover it — one-sided inset → hPadding/vPadding [start, end] tuples</forbid>
|
|
68
|
+
<forbid>Passing render={<div />} (or any render that matches the component default root) — omit render; use it only for a different host</forbid>
|
|
67
69
|
</activity>
|
|
68
70
|
</activity_hints>
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<description>Controls `repeat(auto-fill|auto-fit, …)` when `columns` is unset. Pass `false` to skip the filling data attribute.</description>
|
|
25
25
|
</prop>
|
|
26
26
|
<prop name="hPadding" kind="react">
|
|
27
|
-
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
27
|
+
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingInline*` CSS when this prop covers it.</description>
|
|
28
28
|
</prop>
|
|
29
29
|
<prop name="Item.column" kind="react">
|
|
30
30
|
<description>Sets explicit `grid-column` placement via `--vui-grid-item-column`.</description>
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
<description>Fixes the number of row tracks via `--vui-grid-rows`.</description>
|
|
64
64
|
</prop>
|
|
65
65
|
<prop name="vPadding" kind="react">
|
|
66
|
-
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
66
|
+
<description>Sets block padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset (e.g. bottom only `vPadding={[0, 'l']}`) — never `style`/`paddingBlock*` CSS when this prop covers it.</description>
|
|
67
67
|
</prop>
|
|
68
68
|
<prop name="column-gap" kind="css">
|
|
69
69
|
<description>Grid column gap on the root.</description>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<do>Token-spaced grids with optional axis padding without custom grid CSS</do>
|
|
9
9
|
<dont>Using Masonry when you need explicit row/column placement or full-width/full-height spans</dont>
|
|
10
10
|
<dont>Re-declaring `grid-template` and `gap` in app CSS when Grid can own the layout</dont>
|
|
11
|
-
<dont>Inventing CSS `gap` / `padding`
|
|
11
|
+
<dont>Inventing CSS `gap` / `padding` / `paddingBlock*` / `paddingInline*` / side paddings (`style` or className) when public spacing props cover it — one-sided inset uses `hPadding`/`vPadding` `[start, end]` tuples</dont>
|
|
12
12
|
<dont>Setting both `fullWidth` and `column` (or `fullHeight` and `row`) and expecting the explicit placement to win — full-* data attrs override</dont>
|
|
13
13
|
<dont>Using Grid for simple one-axis flex spacing — prefer Stack</dont>
|
|
14
14
|
</usage>
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
<description>Aligns content on the horizontal axis from the consumer point of view.</description>
|
|
35
35
|
</prop>
|
|
36
36
|
<prop name="hPadding" kind="react">
|
|
37
|
-
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
37
|
+
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingInline*` CSS when this prop covers it.</description>
|
|
38
38
|
</prop>
|
|
39
39
|
<prop name="inline" kind="react">
|
|
40
40
|
<description>Displays the stack as `inline-flex` instead of `flex`.</description>
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
<description>Aligns content on the vertical axis from the consumer point of view.</description>
|
|
59
59
|
</prop>
|
|
60
60
|
<prop name="vPadding" kind="react">
|
|
61
|
-
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
61
|
+
<description>Sets block padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset (e.g. bottom only `vPadding={[0, 'l']}`) — never `style`/`paddingBlock*` CSS when this prop covers it.</description>
|
|
62
62
|
</prop>
|
|
63
63
|
<prop name="wrap" kind="react">
|
|
64
64
|
<description>Allows direct children to wrap onto additional lines when space is constrained.</description>
|
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
<do>Semantic/native roots via `render` (`header`, `main`, `nav`, `section`, …) while keeping Stack as the layout engine</do>
|
|
10
10
|
<do>Opt into `@container stack` with `enableContainer` when layout should follow this Stack's inline-size, not the viewport</do>
|
|
11
11
|
<dont>Reaching for a plain wrapper `div` when Stack (optionally with `render` for a semantic tag) can own the box</dont>
|
|
12
|
+
<dont>Passing `render={<div />}` (or any host that matches Stack's default root) — omit `render`; use it only for a different host (`header`, `Surface`, …)</dont>
|
|
12
13
|
<dont>Assuming Stack expands direct children by default — pass `expandChildren` when children should grow on the flex main axis</dont>
|
|
13
14
|
<dont>Using `expandChildren` to fill parent width under `hAlign="center"` — that is `fullWidth` on the child Stack (self `inline-size`), not child flex-grow</dont>
|
|
14
15
|
<dont>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / `.fullWidth` / size-fill `className` on content-sized children when this Stack can own the fill — or when children are intentionally fixed-size (e.g. IconButton)</dont>
|
|
15
|
-
<dont>Inventing CSS `gap` / `padding`
|
|
16
|
+
<dont>Inventing CSS `gap` / `padding` / `paddingBlock*` / `paddingInline*` / side paddings (`style` or className) when public spacing props cover it — one-sided inset uses `hPadding`/`vPadding` `[start, end]` tuples (e.g. `vPadding={[0, 'l']}`), not `paddingBlockEnd: '1rem'`</dont>
|
|
16
17
|
<dont>Putting `data-grow="false"` on an ancestor to control nested `expandChildren` — set it on the child that should not grow</dont>
|
|
17
18
|
<dont>Combining `fullWidth` with `inline` — prefer block flex when the root must fill parent inline size</dont>
|
|
18
19
|
<dont>Using viewport media queries when `@container stack` against this Stack's inline-size matches the design intent</dont>
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<description>Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`), a literal CSS value, or the named token `primary` (`data-surface-hover-color="primary"`; CSS owns light/dark opacity via `--global-primary`).</description>
|
|
34
34
|
</prop>
|
|
35
35
|
<prop name="hPadding" kind="react">
|
|
36
|
-
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
36
|
+
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingInline*` CSS when this prop covers it.</description>
|
|
37
37
|
</prop>
|
|
38
38
|
<prop name="overflow" kind="react">
|
|
39
39
|
<description>Sets root overflow through the `--vui-surface-overflow` custom property.</description>
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
<description>Replaces the default `div` root using Base UI render semantics.</description>
|
|
49
49
|
</prop>
|
|
50
50
|
<prop name="vPadding" kind="react">
|
|
51
|
-
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
51
|
+
<description>Sets block padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset (e.g. bottom only `vPadding={[0, 'l']}`) — never `style`/`paddingBlock*` CSS when this prop covers it.</description>
|
|
52
52
|
</prop>
|
|
53
53
|
<prop name="background" kind="css">
|
|
54
54
|
<description>Resting surface background on the root.</description>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<do>Inset content with `hPadding` / `vPadding` — nest Stack/Grid for child gaps</do>
|
|
10
10
|
<do>Set `radius` to a token (or four-value tuple) on the outermost Surface that needs rounded corners; `radius="auto"` on nested Surfaces for concentric corners</do>
|
|
11
11
|
<dont>Passing `elevation={…}` on Surface — wrap with Elevator / `getElevationProps`</dont>
|
|
12
|
-
<dont>Inventing CSS `padding` / `gap`
|
|
12
|
+
<dont>Inventing CSS `padding` / `paddingBlock*` / `paddingInline*` / `gap` (`style` or className) when public padding props (and nested Stack) cover it — one-sided inset uses `hPadding`/`vPadding` `[start, end]` tuples (e.g. `vPadding={[0, 'l']}`), not `paddingBlockEnd`</dont>
|
|
13
13
|
<dont>Inventing `width: 100%` on Surface when a parent Stack `fullWidth` can own the fill</dont>
|
|
14
14
|
<dont>Overwriting transition shorthand without composing box-shadow when `data-elevation` is present</dont>
|
|
15
15
|
<dont>Assuming `hoverColor` applies on touch devices</dont>
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
<description>Overrides font width as a percentage (100 = normal); maps to `font-stretch` and `wdth`.</description>
|
|
31
31
|
</prop>
|
|
32
32
|
<prop name="hPadding" kind="react">
|
|
33
|
-
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
33
|
+
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingInline*` CSS when this prop covers it.</description>
|
|
34
34
|
</prop>
|
|
35
35
|
<prop name="lineHeight" kind="react">
|
|
36
36
|
<description>Controls line height through foundation leading tokens.</description>
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
<description>Selects the `text-box` trim basis when `trim` is active.</description>
|
|
70
70
|
</prop>
|
|
71
71
|
<prop name="vPadding" kind="react">
|
|
72
|
-
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
72
|
+
<description>Sets block padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingBlock*` CSS when this prop covers it.</description>
|
|
73
73
|
</prop>
|
|
74
74
|
<prop name="weight" kind="react">
|
|
75
75
|
<description>Selects a semantic weight keyword or a numeric weight (`font-weight` + `wght` axis).</description>
|
|
@@ -9,6 +9,6 @@
|
|
|
9
9
|
<do>Ellipsis: ClampText `render={<Text … />}` — FitText when copy must scale to fill width instead of truncate</do>
|
|
10
10
|
<do>Letter-spacing via `tracking`; text-transform via `transform`; width via `maxWidth` or parent Stack `fullWidth`</do>
|
|
11
11
|
<dont>Using Text for headings — use Title (`render` for h1–h6)</dont>
|
|
12
|
-
<dont>Inventing CSS `letter-spacing` / `text-transform` / `width: 100%` when `tracking` / `transform` / Stack `fullWidth` cover it</dont>
|
|
12
|
+
<dont>Inventing CSS `letter-spacing` / `text-transform` / `width: 100%` / `paddingBlock*` / `paddingInline*` when `tracking` / `transform` / Stack `fullWidth` / `hPadding`/`vPadding` tuples cover it</dont>
|
|
13
13
|
<dont>Setting body color with raw `--global-*` when `tone` covers the role</dont>
|
|
14
14
|
</usage>
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
<description>Overrides font width as a percentage (100 = normal); maps to `font-stretch` and `wdth`.</description>
|
|
29
29
|
</prop>
|
|
30
30
|
<prop name="hPadding" kind="react">
|
|
31
|
-
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
31
|
+
<description>Sets inline padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingInline*` CSS when this prop covers it.</description>
|
|
32
32
|
</prop>
|
|
33
33
|
<prop name="lineHeight" kind="react">
|
|
34
34
|
<description>Controls line height through foundation leading tokens.</description>
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
<description>Selects the `text-box` trim basis when `trim` is active.</description>
|
|
65
65
|
</prop>
|
|
66
66
|
<prop name="vPadding" kind="react">
|
|
67
|
-
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
67
|
+
<description>Sets block padding using one token for both sides or a `[start, end]` tuple (`0` allowed). Prefer the tuple for one-sided inset — never `style`/`paddingBlock*` CSS when this prop covers it.</description>
|
|
68
68
|
</prop>
|
|
69
69
|
<prop name="weight" kind="react">
|
|
70
70
|
<description>Overrides the size preset weight (`font-weight` + `wght` axis).</description>
|
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
<do>Letter-spacing via `tracking`; text-transform via `transform`; width via `maxWidth` or parent Stack `fullWidth`</do>
|
|
10
10
|
<dont>Assuming `size` changes the HTML tag — choose `render` explicitly</dont>
|
|
11
11
|
<dont>Using Title for long body paragraphs — use Text</dont>
|
|
12
|
-
<dont>Inventing CSS `letter-spacing` / `text-transform` / `width: 100%` when props / Stack cover it</dont>
|
|
12
|
+
<dont>Inventing CSS `letter-spacing` / `text-transform` / `width: 100%` / `paddingBlock*` / `paddingInline*` when props / Stack / `hPadding`/`vPadding` tuples cover it</dont>
|
|
13
13
|
</usage>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
<usage surface="typewriter">
|
|
3
3
|
<do>Nest inside Title or Text so size/tone/heading `render` live on the parent — Typewriter stays decorative typed copy</do>
|
|
4
4
|
<do>Hero / marketing phrase cycles via `texts` + `preserveSpace` so layout holds through type/delete (see auth Title compose)</do>
|
|
5
|
+
<do>Wrapped `preserveSpace` copy: keep phrase lengths similar so reserved height stays honest across the cycle</do>
|
|
5
6
|
<do>Caret via `caret` / `caretColor`; timing via `speed` / `deleteSpeed` / `pause` / `delay` / `loop`</do>
|
|
6
7
|
<do>Loading shimmer on static copy is Shimmer inside Text/Title — Typewriter when progressive letter reveal is the intent</do>
|
|
7
8
|
<dont>Using Typewriter as the only source of critical status without a labeled surrounding region</dont>
|
package/dist/specs/index.xml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<index package="@viraui/react" version="2026.6.
|
|
2
|
+
<index package="@viraui/react" version="2026.6.4" generated="2026-10-01T09:52:11.032Z">
|
|
3
3
|
<categories>
|
|
4
4
|
<category id="layout" />
|
|
5
5
|
<category id="action" />
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<ref id="bleed" units="meta,usage" />
|
|
11
11
|
</uses>
|
|
12
12
|
<do>Prefer Vira layout roots (`Stack`, `Grid`, `Masonry`, `Bleed`, `Surface`) and their public props for every consumer layout. Treat `Stack` as the default box: an enriched `div` (flex + gap/padding/align/`fullWidth`/`render`/…) — prefer it over bare wrapper `div`s even for simple nesting. Compose **with** these parts; default custom CSS = **app chrome** the system does not own. Prefer another Vira component (e.g. `Surface` for border/fill/radius) or `render` merge over a CSS class for chrome the library already owns. Do not open a CSS module to reshape a Vira control unless the consumer **expressly asked** for that override (still read `props`/`usage` first; a future override layer will formalize hooks).</do>
|
|
13
|
-
<dont>Do not invent bare wrapper `div`s (or `display:flex` / `display:grid` / CSS `gap` / `padding` / `width` / `inline-size` / border/radius chrome on raw tags or Vira control roots) when `Stack` or another layout primitive / `Surface` / a public `fullWidth`
|
|
13
|
+
<dont>Do not invent bare wrapper `div`s (or `display:flex` / `display:grid` / CSS `gap` / `padding` / `paddingBlock*` / `paddingInline*` / `width` / `inline-size` / border/radius chrome on raw tags or Vira control roots) when `Stack` or another layout primitive / `Surface` / a public `fullWidth` or `hPadding`/`vPadding` tuple covers it. Do not skip composition to reach for a one-off stylesheet — including size-fill classNames that would do nothing on fixed-size controls. Do not pass `render` that restates a component's default root (e.g. Stack `render={<div />}`) — omit `render` unless the host changes.</dont>
|
|
14
14
|
<tsx><![CDATA[
|
|
15
15
|
{/* Flex row + panel chrome: one DOM node via Stack render={<Surface />} */}
|
|
16
16
|
<Stack
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<ref id="button" units="meta" />
|
|
7
7
|
</uses>
|
|
8
8
|
<do>Own page/section flex with Stack. Pick semantic tags (`header`, `main`, `nav`, `section`, …) via `render={<tag />}` — keep Stack as the layout engine. CSS modules may set min-block-size / scroll; never `display:flex`.</do>
|
|
9
|
-
<dont>Do not use raw `header`/`main`/`nav` + `display:flex` / CSS gap for jobs Stack owns. Tag choice ≠ layout engine.</dont>
|
|
9
|
+
<dont>Do not use raw `header`/`main`/`nav` + `display:flex` / CSS gap for jobs Stack owns. Tag choice ≠ layout engine. Do not pass `render={<div />}` — Stack already defaults to `div`; omit `render` unless the host changes.</dont>
|
|
10
10
|
<tsx><![CDATA[
|
|
11
11
|
<Stack rowGap="m" expandChildren>
|
|
12
12
|
<Stack
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraui/react",
|
|
3
|
-
"version": "2026.6.
|
|
3
|
+
"version": "2026.6.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@base-ui/react": ">=1.8.0",
|
|
31
|
-
"@viraui/foundation": "2026.6.
|
|
31
|
+
"@viraui/foundation": "2026.6.4",
|
|
32
32
|
"@viraui/icons": "2026.1.0",
|
|
33
33
|
"@viraui/postcss-config": "2026.0.0",
|
|
34
34
|
"@viraui/tsconfig": "2026.0.0",
|