@viraui/react 2026.6.1 → 2026.6.3

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.
@@ -8,4 +8,4 @@ import { RadioGroup as RadioGroupPrimitive } from '@base-ui/react';
8
8
  * @default Base UI pass-through props keep upstream defaults.
9
9
  */
10
10
  export type RadioGroupProps<Value = string> = RadioGroupPrimitive.Props<Value>;
11
- export declare const RadioGroup: <Value>({ children, className, ...otherProps }: RadioGroupProps<Value>) => import("react").JSX.Element;
11
+ export declare const RadioGroup: <Value>({ children, className, ...otherProps }: RadioGroupProps<Value>) => import('react').JSX.Element;
@@ -39,6 +39,17 @@ Prefer opening via package export / that `dist/specs/` tree. The `version` attri
39
39
  3. Examples / stories — examples only; never API authority.
40
40
  4. Skills prose — routers and playbooks only; never a second encyclopedia of component API facts.
41
41
 
42
+ ## Compose with the system (mandatory)
43
+
44
+ Consumer agents build screens **with** ViraUI — public parts, compounds, and props from the units — not **around** it with immediate CSS overrides.
45
+
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. 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.
49
+ 4. 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
+ 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
+
42
53
  ## Forbidden discovery
43
54
 
44
55
  Do **not** `ls` / `rg` / `grep` `dist/components/**` or `*.d.ts` to discover Vira API **before** opening the index and target units. Types are for verification after units — open the specific `.d.ts` with Read if needed; do not shell-parse the tree.
@@ -9,7 +9,7 @@
9
9
  <forbid>Opening all props.xml files</forbid>
10
10
  </activity>
11
11
  <activity id="implement">
12
- <description>Implement UI with a chosen component.</description>
12
+ <description>Implement UI by composing with ViraUI parts and public props — not by restyling controls with custom CSS first.</description>
13
13
  <load>
14
14
  <step open="index.xml" />
15
15
  <step unit="meta" />
@@ -18,6 +18,8 @@
18
18
  <step unit="a11y" when="interactive or forms" />
19
19
  </load>
20
20
  <forbid>Opening every component props.xml in the package</forbid>
21
+ <forbid>Writing unsolicited className / CSS module / utility styles on a Vira root before opening that surface props.xml and usage.xml</forbid>
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>
21
23
  </activity>
22
24
  <activity id="foundation-attrs">
23
25
  <description>Mode, vibrancy, elevation, grow/shrink hooks.</description>
@@ -30,6 +32,15 @@
30
32
  </load>
31
33
  <forbid>Inventing data-* attributes not listed in foundation units</forbid>
32
34
  </activity>
35
+ <activity id="foundation-motion">
36
+ <description>Duration/easing tokens, functional vs evocative motion, reduced-motion, longer-than-slowest calc.</description>
37
+ <load>
38
+ <step open="index.xml" />
39
+ <step open="foundation/motion.xml" />
40
+ <step open="foundation/theme-topics.xml" when="retuning --duration-* / --easing-* on a theme" />
41
+ </load>
42
+ <forbid>Hardcoding ms/s/ease or inventing spring curves instead of --duration-* / --easing-*</forbid>
43
+ </activity>
33
44
  <activity id="bootstrap">
34
45
  <description>Install peers, theme/fonts/preflight import order, root providers.</description>
35
46
  <load>
@@ -10,7 +10,7 @@
10
10
  <do>Navigation that should look like Button — use ButtonLink (framework Link via `render`)</do>
11
11
  <dont>Using Button without children as icon-only — prefer IconButton</dont>
12
12
  <dont>Using Button with `render={&lt;a /&gt;}` for links — Base UI enforces button semantics; use ButtonLink</dont>
13
- <dont>Inventing `width: 100%` / `w-full` / `.fullWidth` / `flex: 1` CSS on Button when a parent Stack can own the fill</dont>
13
+ <dont>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / `.fullWidth` / size-fill `className` (e.g. `.Submit`) on Button when a parent Stack can own the fill</dont>
14
14
  <dont>Duplicating icon size on every addon slot — Button CSS sizes SVG descendants</dont>
15
15
  <dont>Mixing `pill` with custom border-radius overrides that fight `data-pill` styling</dont>
16
16
  <dont>Primary Chip addon inside a primary Button without `data-mode=&quot;inverted&quot;` — chip fill matches the button and disappears</dont>
@@ -12,5 +12,5 @@
12
12
  <dont>Using IconButton for persistent or temporal pressed state — use ToggleButton</dont>
13
13
  <dont>Using IconButton with `render={&lt;a /&gt;}` for links — use IconButtonLink</dont>
14
14
  <dont>Omitting both `aria-label` and `aria-labelledby`</dont>
15
- <dont>Inventing `width: 100%` / `w-full` CSS on IconButton when a parent Stack `fullWidth` / `expandChildren` can own the fill</dont>
15
+ <dont>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / size-fill `className` (e.g. `.Social`) on IconButton — it is intentionally square; Stack owns gap/align only</dont>
16
16
  </usage>
@@ -12,7 +12,7 @@
12
12
  <item>Cases where a single component already owns required flex chrome</item>
13
13
  <item>Expecting direct children to grow on the main axis without setting `expandChildren`</item>
14
14
  <item>Expecting this stack to fill parent inline size under non-stretch alignment without `fullWidth` (or an explicit `inlineSize`)</item>
15
- <item>Inventing `width: 100%` / `w-full` on content-sized children (Button, Chip, …) when this Stack can own fill via `fullWidth` / `expandChildren`</item>
15
+ <item>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / size-fill className on content-sized children (Button, Chip, …) when this Stack can own fill via `fullWidth` / `expandChildren` — or on fixed-size children (IconButton) where width CSS is useless</item>
16
16
  <item>Using `enableContainer` inside complex masonry-like layouts when you don&apos;t need container queries (inline-size containment can change nested layout)</item>
17
17
  </when_not_to_use>
18
18
  <prop name="columnGap" kind="react">
@@ -11,7 +11,7 @@
11
11
  <dont>Reaching for a plain wrapper `div` when Stack (optionally with `render` for a semantic tag) can own the box</dont>
12
12
  <dont>Assuming Stack expands direct children by default — pass `expandChildren` when children should grow on the flex main axis</dont>
13
13
  <dont>Using `expandChildren` to fill parent width under `hAlign=&quot;center&quot;` — that is `fullWidth` on the child Stack (self `inline-size`), not child flex-grow</dont>
14
- <dont>Inventing `width: 100%` / `w-full` / `.fullWidth` CSS on content-sized children when this Stack can own the fill</dont>
14
+ <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
15
  <dont>Inventing CSS `gap` / `padding` on this root when public spacing props cover it</dont>
16
16
  <dont>Putting `data-grow=&quot;false&quot;` on an ancestor to control nested `expandChildren` — set it on the child that should not grow</dont>
17
17
  <dont>Combining `fullWidth` with `inline` — prefer block flex when the root must fill parent inline size</dont>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <meta id="core" title="Core / preflight" category="foundation" shared_contract="core">
3
- <summary>Preflight CSS, consumer bootstrap, data-* hooks, core CSS toggles (polarity + effects), elevation helpers, and theme token topic map shipping with @viraui/react.</summary>
3
+ <summary>Preflight CSS, consumer bootstrap, data-* hooks, core CSS toggles (polarity + effects), elevation helpers, motion timing contract, and theme token topic map shipping with @viraui/react.</summary>
4
4
  <exports>
5
5
  <export name="getElevationProps" />
6
6
  </exports>
@@ -15,6 +15,7 @@
15
15
  <unit kind="toggles" href="toggles.xml" />
16
16
  <unit kind="theme-topics" href="theme-topics.xml" />
17
17
  <unit kind="elevation" href="elevation.xml" />
18
+ <unit kind="motion" href="motion.xml" />
18
19
  <unit kind="modules" href="modules.xml" />
19
20
  </units>
20
21
  </meta>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <modules>
3
- <summary>What @viraui/react/preflight.css provides at runtime. Capability map for consumers and agents — not a source-tree inventory. Full attr contracts: attributes.xml; elevation compose: elevation.xml; effect gates: toggles.xml; theme token groups: theme-topics.xml.</summary>
3
+ <summary>What @viraui/react/preflight.css provides at runtime. Capability map for consumers and agents — not a source-tree inventory. Full attr contracts: attributes.xml; elevation compose: elevation.xml; motion timing: motion.xml; effect gates: toggles.xml; theme token groups: theme-topics.xml.</summary>
4
4
 
5
5
  <distributed>
6
6
  <import>@viraui/react/preflight.css</import>
@@ -0,0 +1,99 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <motion>
3
+ <summary>Motion is animation with intent: shared --duration-* and --easing-* on the theme so @viraui/react and custom CSS share one timing contract. Components already follow the roles below; retune token values when the brand needs a different pace — screens keep the same motion roles without hand-tuning each transition.</summary>
4
+ <concept>
5
+ Everyday UI feedback is functional motion (short, assistive, familiar). Attention moments are evocative motion (toast, badge-in, celebration, hero). Both roles use the same principles and theme tokens. Motion never carries meaning alone — pair with copy, structure, chips, or live regions.
6
+ </concept>
7
+
8
+ <principles>
9
+ <principle id="discreet">Every animation earns its place without pulling attention from the task. Keep transitions fast and agile so nobody waits on motion to finish. Draw attention with animation only when that is the goal — alert, hero entrance, celebration.</principle>
10
+ <principle id="assistive">Motion supports the message; it never carries information alone. Use it to hint interactivity or give immediate feedback — copy and structure still communicate if the animation never runs.</principle>
11
+ <principle id="intuitive">Movement should recall how objects behave in the real world — acceleration, gravity, volume — so the result feels natural. Familiar open/close and settle patterns make the app easier to learn, especially on touch.</principle>
12
+ <principle id="playful">Animation can carry brand personality, but playful motion only fits when the tone allows it. Skip bounce and wiggle for serious or important news so the meaning stays clear.</principle>
13
+ </principles>
14
+
15
+ <roles>
16
+ <role id="functional">
17
+ Everyday UI feedback — hover and focus, expand and collapse, menus, dialogs, tabs. Discreet (short), assistive (confirms the action), intuitive (familiar settle). Prefer --duration-instant or --duration-fast with --easing-standard or --easing-entrance. In serious or dense contexts — errors, destructive actions, legal copy, data-heavy tables — stay in this lane. If someone asks for &quot;delight&quot; on a dense surface, prefer a quieter cue (chip + live region) instead of bounce.
18
+ </role>
19
+ <role id="evocative">
20
+ Attention is the goal: toast arriving, badge popping in, celebration, hero entrance. Same principles with a louder dial — earn the spotlight only for that rare moment; copy still carries the message; personality easings still read like spring and settle. Use longer timing (--duration-slow or --duration-slowest) and personality easings (--easing-elastic, --easing-wiggle) on purpose. A flourish on every card stops feeling special — reserve energy for moments people should notice.
21
+ </role>
22
+ </roles>
23
+
24
+ <tokens>
25
+ <duration name="--duration-instant">Press, menu/select popup, small nudges.</duration>
26
+ <duration name="--duration-fast">Default functional: hover, disclosure, tabs, most overlays.</duration>
27
+ <duration name="--duration-normal">Larger overlay travel (dialog sheet).</duration>
28
+ <duration name="--duration-slow">Evocative enter (toast) and other intentional attention timing.</duration>
29
+ <duration name="--duration-slowest">Decorative loops (shimmer) and rare long flourishes.</duration>
30
+ <easing name="--easing-standard">Default state change: hover, indicator, accordion, position.</easing>
31
+ <easing name="--easing-entrance">Incoming: modal, popover, menu, toast-in, user-triggered reveal.</easing>
32
+ <easing name="--easing-exit">Leaving: dismiss, collapse, close — pair with a shorter duration than enter.</easing>
33
+ <easing name="--easing-elastic">Playful overshoot: press, toast. Not errors or data tables.</easing>
34
+ <easing name="--easing-wiggle">Attention wiggle. Rare. Never looping on content.</easing>
35
+ </tokens>
36
+
37
+ <extend>
38
+ Prefer named --duration-* tokens first (--duration-slowest is the widest step). When the task needs a duration longer than --duration-slowest, do not invent raw ms/s. Multiply the slowest token so timing stays theme-linked: calc(var(--duration-slowest) * n) with n a positive number (e.g. 2, 3). Retuning --duration-slowest on the theme still scales those custom lengths. Same rule for JS/WAAPI: derive from the token (or getComputedStyle), never hardcode 180/200/480.
39
+ </extend>
40
+
41
+ <accessibility>
42
+ Avoid large sudden movements and multiple objects moving at once in different directions — people with epilepsy or vestibular disorders can be especially sensitive. Respect Reduce motion: every transition you add in custom CSS should include a prefers-reduced-motion: reduce fallback (or equivalent). Preflight already kills transition/animation on * under reduce; add extra reduced-motion rules only when final state must change (instant opacity/transform, hide decorative effects). Motion never carries meaning alone.
43
+ </accessibility>
44
+
45
+ <do>Use --duration-* and --easing-* for @viraui/react and custom consumer CSS alike.</do>
46
+ <do>Keep functional UI on instant/fast (+ standard/entrance/exit); reserve slow/slowest and elastic/wiggle for evocative moments.</do>
47
+ <do>Make exits shorter than enters for the same surface.</do>
48
+ <do>Include a prefers-reduced-motion path for every authored animation (or rely on preflight kill when final state needs no change).</do>
49
+ <do>When longer than --duration-slowest is required, use calc(var(--duration-slowest) * n) instead of inventing ms.</do>
50
+ <dont>Do not hardcode ms, s, ease, ease-in-out, or homemade cubic-bezier / --spring.</dont>
51
+ <dont>Do not use elastic/wiggle on errors, destructive actions, legal copy, or dense data tables.</dont>
52
+ <dont>Do not put showy evocative motion on every card or routine hover.</dont>
53
+ <dont>Do not let motion be the only signal for saved / new / error.</dont>
54
+ <dont>Do not skip custom CSS — &quot;Vira already animates&quot; is not an exemption for consumer chrome.</dont>
55
+
56
+ <css title="Functional overlay"><![CDATA[
57
+ .popup {
58
+ transition:
59
+ opacity var(--duration-instant) var(--easing-entrance),
60
+ transform var(--duration-instant) var(--easing-entrance);
61
+ }
62
+ .popup[data-ending-style] {
63
+ transition-duration: var(--duration-instant);
64
+ transition-timing-function: var(--easing-exit);
65
+ }
66
+ ]]></css>
67
+ <css title="Evocative enter"><![CDATA[
68
+ .banner {
69
+ transition:
70
+ transform var(--duration-slowest) var(--easing-elastic),
71
+ opacity var(--duration-slowest) var(--easing-elastic);
72
+ }
73
+ ]]></css>
74
+ <css title="Longer than slowest (theme-linked)"><![CDATA[
75
+ .hero-enter {
76
+ transition:
77
+ opacity calc(var(--duration-slowest) * 2) var(--easing-entrance),
78
+ transform calc(var(--duration-slowest) * 2) var(--easing-entrance);
79
+ }
80
+ @media (prefers-reduced-motion: reduce) {
81
+ .hero-enter {
82
+ transition: none;
83
+ }
84
+ }
85
+ ]]></css>
86
+
87
+ <prompt title="Speed up">Make everyday UI motion feel a bit snappier — hovers, menus, dialogs. Keep celebration and hero moments at their current pace.</prompt>
88
+ <prompt title="Hover + a11y">Add subtle hover motion with theme duration/easing tokens and a prefers-reduced-motion fallback.</prompt>
89
+ <prompt title="Celebration">Add a one-shot evocative entrance for this toast/badge — slow + elastic, not on every card.</prompt>
90
+ <prompt title="Long hero">Hero entrance needs longer than --duration-slowest — use calc(var(--duration-slowest) * n), not raw ms.</prompt>
91
+
92
+ <tune>
93
+ Retune pace by overriding --duration-* and --easing-* on a compatible theme sheet (or App Studio export). Built-in components and token-based custom CSS keep the same motion roles; only the timing changes. Theme group map: foundation/theme-topics.xml topic motion. Compose playbook: viraui-motion skill (hub + one ref).
94
+ </tune>
95
+ <related>
96
+ <ref id="foundation-theme-topics" />
97
+ <ref id="foundation-modules" />
98
+ </related>
99
+ </motion>
@@ -82,7 +82,7 @@
82
82
  <topic id="motion" surface="theme">
83
83
  <pattern>--duration-* | --easing-*</pattern>
84
84
  <summary>Duration and easing tokens for component motion.</summary>
85
- <agent>Theme motion primitives. Compose guidance: viraui-motion.</agent>
85
+ <agent>Theme motion primitives. Full roles/principles/a11y: foundation/motion.xml. Compose playbook: viraui-motion.</agent>
86
86
  </topic>
87
87
 
88
88
  <topic id="font-scale" surface="derived" set_by="preflight">
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <index package="@viraui/react" version="2026.6.1" generated="2026-09-25T10:16:02.350Z">
2
+ <index package="@viraui/react" version="2026.6.3" generated="2026-09-25T13:06:12.744Z">
3
3
  <categories>
4
4
  <category id="layout" />
5
5
  <category id="action" />
@@ -482,7 +482,7 @@
482
482
  </units>
483
483
  </entry>
484
484
  <entry id="core" category="foundation" title="Core / preflight">
485
- <summary>Preflight CSS, consumer bootstrap, data-* hooks, core CSS toggles (polarity + effects), elevation helpers, and theme token topic map shipping with @viraui/react.</summary>
485
+ <summary>Preflight CSS, consumer bootstrap, data-* hooks, core CSS toggles (polarity + effects), elevation helpers, motion timing contract, and theme token topic map shipping with @viraui/react.</summary>
486
486
  <units>
487
487
  <unit kind="meta" href="foundation/meta.xml" />
488
488
  <unit kind="bootstrap" href="foundation/bootstrap.xml" />
@@ -490,6 +490,7 @@
490
490
  <unit kind="toggles" href="foundation/toggles.xml" />
491
491
  <unit kind="theme-topics" href="foundation/theme-topics.xml" />
492
492
  <unit kind="elevation" href="foundation/elevation.xml" />
493
+ <unit kind="motion" href="foundation/motion.xml" />
493
494
  <unit kind="modules" href="foundation/modules.xml" />
494
495
  </units>
495
496
  </entry>
@@ -523,6 +524,12 @@
523
524
  <unit kind="foundation" href="foundation/elevation.xml" />
524
525
  </units>
525
526
  </entry>
527
+ <entry id="foundation-motion" category="foundation" title="Motion timing">
528
+ <summary>Duration/easing roles, functional vs evocative, reduced-motion, calc beyond --duration-slowest.</summary>
529
+ <units>
530
+ <unit kind="foundation" href="foundation/motion.xml" />
531
+ </units>
532
+ </entry>
526
533
  <entry id="foundation-modules" category="foundation" title="Preflight modules">
527
534
  <summary>Preflight CSS modules and related custom properties that compose preflight.css.</summary>
528
535
  <units>
@@ -9,8 +9,8 @@
9
9
  <ref id="masonry" units="meta,usage" />
10
10
  <ref id="bleed" units="meta,usage" />
11
11
  </uses>
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 and nest components; add custom CSS only when props cannot express size/scroll/basis. 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>
13
- <dont>Do not invent bare wrapper `div`s (or `display:flex` / `display:grid` / CSS `gap` / `padding` / border/radius chrome on raw tags) when `Stack` or another layout primitive / `Surface` covers it. Do not skip composition to reach for a one-off stylesheet.</dont>
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` prop 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.</dont>
14
14
  <tsx><![CDATA[
15
15
  {/* Flex row + panel chrome: one DOM node via Stack render={<Surface />} */}
16
16
  <Stack
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viraui/react",
3
- "version": "2026.6.1",
3
+ "version": "2026.6.3",
4
4
  "private": false,
5
5
  "files": [
6
6
  "dist"
@@ -27,17 +27,17 @@
27
27
  "registry": "https://registry.npmjs.org/"
28
28
  },
29
29
  "devDependencies": {
30
- "@base-ui/react": ">=1.7.0",
31
- "@viraui/foundation": "2026.6.1",
30
+ "@base-ui/react": ">=1.8.0",
31
+ "@viraui/foundation": "2026.6.3",
32
32
  "@viraui/icons": "2026.1.0",
33
33
  "@viraui/postcss-config": "2026.0.0",
34
34
  "@viraui/tsconfig": "2026.0.0",
35
- "postcss": "8.5.26",
36
- "postcss-cli": "11.0.1",
37
- "react": ">=19.2.8",
38
- "react-dom": ">=19.2.8",
39
- "unplugin-dts": "1.0.3",
40
- "vite": "8.2.2"
35
+ "postcss": "8.5.28",
36
+ "postcss-cli": "12.0.0",
37
+ "react": ">=19.3.0",
38
+ "react-dom": ">=19.3.0",
39
+ "unplugin-dts": "1.1.1",
40
+ "vite": "8.3.1"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "@base-ui/react": ">=1.6.0",