@viraui/react 2026.2.4 → 2026.2.6
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/autocomplete/autocomplete.css +1 -1
- package/dist/components/autocomplete/autocomplete.d.ts +1 -1
- package/dist/components/autocomplete/autocomplete.guide.json +1 -1
- package/dist/components/basic-input/basic-input.css +1 -1
- package/dist/components/basic-input/basic-input.js +1 -3
- package/dist/components/basic-input/field-helper-copy.d.ts +4 -3
- package/dist/components/basic-input/field-helper-copy.js +39 -34
- package/dist/components/select/select.d.ts +1 -1
- package/dist/components/select/select.guide.json +1 -1
- package/dist/components/switch/switch.d.ts +1 -1
- package/dist/components/switch/switch.guide.json +1 -1
- package/dist/components/textarea/textarea.css +1 -1
- package/dist/components/textarea/textarea.d.ts +1 -1
- package/dist/components/textarea/textarea.guide.json +1 -1
- package/dist/components/textfield/textfield.css +1 -1
- package/dist/components/textfield/textfield.d.ts +1 -1
- package/dist/components/textfield/textfield.guide.json +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-autocomplete-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-autocomplete-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-autocomplete-list-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-autocomplete-list-padding{syntax:"<length>";inherits:true;initial-value:0}@property --__autocomplete-list-appear-offset{syntax:"<length>";inherits:false;initial-value:8px}.viraui__autocomplete-module__Autocomplete_WfXkD{--vui-autocomplete-input-height:var(--space-2x-large);--vui-autocomplete-control-group-background:var(--base-1);--vui-autocomplete-control-group-color:var(--global-foreground);--vui-autocomplete-control-group-border-color:var(--global-contrast);--vui-autocomplete-control-group-border-radius:var(--radius-medium);--vui-field-label-padding-inline:calc(var(--vui-autocomplete-control-group-border-radius) / 2);inline-size:100%;&:has([required]) .viraui__autocomplete-module__Label_aOSjz:after{content:" *";color:var(--highlight-red)}}.viraui__autocomplete-module__ControlGroup_AUq7O{box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--vui-autocomplete-input-height);background:var(--vui-autocomplete-control-group-background);color:var(--vui-autocomplete-control-group-color);border:1px solid var(--vui-autocomplete-control-group-border-color);border-radius:var(--vui-autocomplete-control-group-border-radius);&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4:focus-visible),&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-focused]){outline:var(--outline);outline-offset:var(--outline-offset)}&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-invalid]){--vui-autocomplete-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4:disabled),&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-disabled]){--vui-autocomplete-control-group-background:var(--global-disabled-background);--vui-autocomplete-control-group-border-color:#0000;--vui-autocomplete-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}&:has(.viraui__autocomplete-module__Addon_6ajrr[data-position=start])>.viraui__autocomplete-module__CustomBasicInput_k7dx4{padding-inline-start:var(--space-x-small)}&:has(.viraui__autocomplete-module__Addon_6ajrr[data-position=end])>.viraui__autocomplete-module__CustomBasicInput_k7dx4{padding-inline-end:var(--space-x-small)}}.viraui__autocomplete-module__Addon_6ajrr{min-inline-size:var(--space-x-large)}.viraui__autocomplete-module__Description_cr8U6{padding-inline:calc(var(--vui-autocomplete-control-group-border-radius) / 2)}.viraui__autocomplete-module__AutocompletePopup_nF49j{--vui-autocomplete-list-border-radius:var(--radius-medium);--vui-autocomplete-list-padding:var(--space-x-small);box-sizing:border-box;min-inline-size:var(--anchor-width);overflow:visible;color:var(--global-foreground);outline:none;position:relative;transform-origin:var(--transform-origin);transition:opacity var(--duration-instant) var(--easing-entrance),scale var(--duration-instant) var(--easing-entrance),translate var(--duration-instant) var(--easing-entrance);&[data-ending-style],&[data-starting-style]{opacity:0;scale:.96}&[data-side=bottom][data-ending-style],&[data-side=bottom][data-starting-style]{translate:0 calc(var(--__autocomplete-list-appear-offset) * -1)}&[data-side=top][data-ending-style],&[data-side=top][data-starting-style]{translate:0 var(--__autocomplete-list-appear-offset)}&[data-side=inline-start][data-ending-style],&[data-side=inline-start][data-starting-style],&[data-side=left][data-ending-style],&[data-side=left][data-starting-style]{translate:var(--__autocomplete-list-appear-offset) 0}&[data-side=inline-end][data-ending-style],&[data-side=inline-end][data-starting-style],&[data-side=right][data-ending-style],&[data-side=right][data-starting-style]{translate:calc(var(--__autocomplete-list-appear-offset) * -1) 0}}.viraui__autocomplete-module__PopupChrome_573fy{box-sizing:border-box;max-block-size:var(--available-height);overscroll-behavior:contain}.viraui__autocomplete-module__List_Tl5j1{box-sizing:border-box;inline-size:100%;scroll-padding-block:var(--vui-autocomplete-list-padding);&:focus,&:focus-visible{outline:none}}.viraui__autocomplete-module__Empty_Xa34u:not(:empty),.viraui__autocomplete-module__Status_XLDvE:not(:empty){padding-inline:var(--space-small);padding-block:var(--space-small)}.viraui__autocomplete-module__ItemRow_ab22I{min-block-size:var(--space-x-large)}}@layer viraui.overrides{.viraui__autocomplete-module__CustomBasicInput_k7dx4{flex:1 1 auto;block-size:100%;line-height:1.2;background:#0000;box-shadow:none;border-radius:inherit;&:focus-visible{outline:none}}.viraui__autocomplete-module__Item_TmEz2{cursor:pointer;&:focus{outline:none}&:focus-visible{outline:none;box-shadow:none}&:not([data-disabled]):hover,&:not([data-disabled])[data-highlighted]{background:var(--global-contrast);@container root not style(--effect-vibrancy: initial){background:oklab(from var(--global-contrast) l a b/12%)}}&[data-disabled]{color:var(--global-disabled-foreground);cursor:not-allowed}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-autocomplete-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-autocomplete-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-autocomplete-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-autocomplete-list-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-autocomplete-list-padding{syntax:"<length>";inherits:true;initial-value:0}@property --__autocomplete-list-appear-offset{syntax:"<length>";inherits:false;initial-value:8px}.viraui__autocomplete-module__Autocomplete_WfXkD{--vui-autocomplete-input-height:var(--space-2x-large);--vui-autocomplete-control-group-background:var(--base-1);--vui-autocomplete-control-group-color:var(--global-foreground);--vui-autocomplete-control-group-border-color:var(--global-contrast);--vui-autocomplete-control-group-border-radius:var(--radius-medium);--vui-field-label-padding-inline:calc(var(--vui-autocomplete-control-group-border-radius) / 2);inline-size:100%;&:has([required]) .viraui__autocomplete-module__Label_aOSjz:after{content:" *";color:var(--highlight-red)}}.viraui__autocomplete-module__ControlGroup_AUq7O{box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--vui-autocomplete-input-height);background:var(--vui-autocomplete-control-group-background);color:var(--vui-autocomplete-control-group-color);border:1px solid var(--vui-autocomplete-control-group-border-color);border-radius:var(--vui-autocomplete-control-group-border-radius);&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4:focus-visible),&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-focused]){outline:var(--outline);outline-offset:var(--outline-offset)}&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-invalid][data-dirty]){--vui-autocomplete-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4:disabled),&:has(.viraui__autocomplete-module__CustomBasicInput_k7dx4[data-disabled]){--vui-autocomplete-control-group-background:var(--global-disabled-background);--vui-autocomplete-control-group-border-color:#0000;--vui-autocomplete-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}&:has(.viraui__autocomplete-module__Addon_6ajrr[data-position=start])>.viraui__autocomplete-module__CustomBasicInput_k7dx4{padding-inline-start:var(--space-x-small)}&:has(.viraui__autocomplete-module__Addon_6ajrr[data-position=end])>.viraui__autocomplete-module__CustomBasicInput_k7dx4{padding-inline-end:var(--space-x-small)}}.viraui__autocomplete-module__Addon_6ajrr{min-inline-size:var(--space-x-large)}.viraui__autocomplete-module__Description_cr8U6{padding-inline:calc(var(--vui-autocomplete-control-group-border-radius) / 2)}.viraui__autocomplete-module__AutocompletePopup_nF49j{--vui-autocomplete-list-border-radius:var(--radius-medium);--vui-autocomplete-list-padding:var(--space-x-small);box-sizing:border-box;min-inline-size:var(--anchor-width);overflow:visible;color:var(--global-foreground);outline:none;position:relative;transform-origin:var(--transform-origin);transition:opacity var(--duration-instant) var(--easing-entrance),scale var(--duration-instant) var(--easing-entrance),translate var(--duration-instant) var(--easing-entrance);&[data-ending-style],&[data-starting-style]{opacity:0;scale:.96}&[data-side=bottom][data-ending-style],&[data-side=bottom][data-starting-style]{translate:0 calc(var(--__autocomplete-list-appear-offset) * -1)}&[data-side=top][data-ending-style],&[data-side=top][data-starting-style]{translate:0 var(--__autocomplete-list-appear-offset)}&[data-side=inline-start][data-ending-style],&[data-side=inline-start][data-starting-style],&[data-side=left][data-ending-style],&[data-side=left][data-starting-style]{translate:var(--__autocomplete-list-appear-offset) 0}&[data-side=inline-end][data-ending-style],&[data-side=inline-end][data-starting-style],&[data-side=right][data-ending-style],&[data-side=right][data-starting-style]{translate:calc(var(--__autocomplete-list-appear-offset) * -1) 0}}.viraui__autocomplete-module__PopupChrome_573fy{box-sizing:border-box;max-block-size:var(--available-height);overscroll-behavior:contain}.viraui__autocomplete-module__List_Tl5j1{box-sizing:border-box;inline-size:100%;scroll-padding-block:var(--vui-autocomplete-list-padding);&:focus,&:focus-visible{outline:none}}.viraui__autocomplete-module__Empty_Xa34u:not(:empty),.viraui__autocomplete-module__Status_XLDvE:not(:empty){padding-inline:var(--space-small);padding-block:var(--space-small)}.viraui__autocomplete-module__ItemRow_ab22I{min-block-size:var(--space-x-large)}}@layer viraui.overrides{.viraui__autocomplete-module__CustomBasicInput_k7dx4{flex:1 1 auto;block-size:100%;line-height:1.2;background:#0000;box-shadow:none;border-radius:inherit;&:focus-visible{outline:none}}.viraui__autocomplete-module__Item_TmEz2{cursor:pointer;&:focus{outline:none}&:focus-visible{outline:none;box-shadow:none}&:not([data-disabled]):hover,&:not([data-disabled])[data-highlighted]{background:var(--global-contrast);@container root not style(--effect-vibrancy: initial){background:oklab(from var(--global-contrast) l a b/12%)}}&[data-disabled]{color:var(--global-disabled-foreground);cursor:not-allowed}}}
|
|
@@ -28,7 +28,7 @@ export type AutocompleteProps = Omit<AutocompleteRoot.Props<any>, 'children'> &
|
|
|
28
28
|
description?: React.ReactNode;
|
|
29
29
|
/**
|
|
30
30
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
31
|
-
* Replaces description while the field is invalid.
|
|
31
|
+
* Replaces description while the field is invalid and dirty.
|
|
32
32
|
*
|
|
33
33
|
* @default No static error copy is rendered.
|
|
34
34
|
*/
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"description": "Trailing decoration (icon, button). Buttons must use `type=\"button\"`."
|
|
45
45
|
},
|
|
46
46
|
"error": {
|
|
47
|
-
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid."
|
|
47
|
+
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty."
|
|
48
48
|
},
|
|
49
49
|
"fitContent": {
|
|
50
50
|
"description": "When `true`, sets `field-sizing: content` so the control grows inline with its value. Block chrome stays `var(--vui-autocomplete-input-height)`. Omitted / `false` keeps the browser fixed default.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-basic-input-background{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-basic-input-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-basic-input-color{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-basic-input-font-size{syntax:"<length>";inherits:false;initial-value:1rem}@property --vui-basic-input-padding-inline{syntax:"<length>";inherits:false;initial-value:0}@property --vui-basic-input-placeholder-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-field-label-padding-inline{syntax:"<length>";inherits:true;initial-value:0}.viraui__basic-input-module__BasicInput_5uE64{--vui-basic-input-background:var(--base-1);--vui-basic-input-color:var(--global-foreground);--vui-basic-input-placeholder-color:var(--global-disabled-foreground);--vui-basic-input-padding-inline:calc(var(--space-small) + var(--space-x-small));--vui-basic-input-font-size:var(--font-scale-body-small);--vui-basic-input-border-radius:var(--radius-medium);box-sizing:border-box;margin:0;inline-size:100%;min-inline-size:0;padding-inline:var(--vui-basic-input-padding-inline);font-family:inherit;font-size:var(--vui-basic-input-font-size);font-variation-settings:"wght" 400;color:var(--vui-basic-input-color);background:var(--vui-basic-input-background);border:none;border-radius:var(--vui-basic-input-border-radius);appearance:none;&::-webkit-contacts-auto-fill-button{background-color:var(--vui-basic-input-color)}&::placeholder{color:var(--vui-basic-input-placeholder-color)}&:disabled{--vui-basic-input-background:var(--global-disabled-background);--vui-basic-input-color:var(--global-disabled-foreground);--vui-basic-input-placeholder-color:var(--global-disabled-foreground);cursor:not-allowed}&[data-invalid]{outline-color:oklab(from var(--highlight-red) l a b/.3)}&[data-sizing=content]{field-sizing:content}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-basic-input-background{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-basic-input-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-basic-input-color{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-basic-input-font-size{syntax:"<length>";inherits:false;initial-value:1rem}@property --vui-basic-input-padding-inline{syntax:"<length>";inherits:false;initial-value:0}@property --vui-basic-input-placeholder-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-field-label-padding-inline{syntax:"<length>";inherits:true;initial-value:0}.viraui__basic-input-module__BasicInput_5uE64{--vui-basic-input-background:var(--base-1);--vui-basic-input-color:var(--global-foreground);--vui-basic-input-placeholder-color:var(--global-disabled-foreground);--vui-basic-input-padding-inline:calc(var(--space-small) + var(--space-x-small));--vui-basic-input-font-size:var(--font-scale-body-small);--vui-basic-input-border-radius:var(--radius-medium);box-sizing:border-box;margin:0;inline-size:100%;min-inline-size:0;padding-inline:var(--vui-basic-input-padding-inline);font-family:inherit;font-size:var(--vui-basic-input-font-size);font-variation-settings:"wght" 400;color:var(--vui-basic-input-color);background:var(--vui-basic-input-background);border:none;border-radius:var(--vui-basic-input-border-radius);appearance:none;&::-webkit-contacts-auto-fill-button{background-color:var(--vui-basic-input-color)}&:-webkit-autofill,&:-webkit-autofill:active,&:-webkit-autofill:focus,&:-webkit-autofill:hover{-webkit-text-fill-color:var(--vui-basic-input-color);box-shadow:0 0 0 100px var(--vui-basic-input-background) inset,0 0 0 100px var(--vui-basic-input-background) inset}&::placeholder{color:var(--vui-basic-input-placeholder-color)}&:disabled{--vui-basic-input-background:var(--global-disabled-background);--vui-basic-input-color:var(--global-disabled-foreground);--vui-basic-input-placeholder-color:var(--global-disabled-foreground);cursor:not-allowed}&[data-invalid][data-dirty]{outline-color:oklab(from var(--highlight-red) l a b/.3)}&[data-sizing=content]{field-sizing:content}}}
|
|
@@ -6,9 +6,7 @@ import { Field } from "@base-ui/react/field";
|
|
|
6
6
|
import { Input } from "@base-ui/react/input";
|
|
7
7
|
import * as React from "react";
|
|
8
8
|
//#region src/components/basic-input/basic-input.tsx
|
|
9
|
-
|
|
10
|
-
return React.isValidElement(render) && render.type === Input;
|
|
11
|
-
}
|
|
9
|
+
var usesInputPrimitiveRender = (render) => React.isValidElement(render) && render.type === Input;
|
|
12
10
|
var BasicInput = React.forwardRef(function BasicInput({ className, render, fitContent, ...otherProps }, ref) {
|
|
13
11
|
const mergedClassName = clsx(basic_input_module_default.BasicInput, className);
|
|
14
12
|
const sizingProps = { ...fitContent && { "data-sizing": "content" } };
|
|
@@ -6,9 +6,10 @@ type FieldHelperCopyProps = {
|
|
|
6
6
|
};
|
|
7
7
|
/**
|
|
8
8
|
* Renders field helper copy in the shared `Description` slot via `Field.Validity`.
|
|
9
|
-
* Static `error` replaces `description` only while invalid and `error` is set.
|
|
10
|
-
* `description` stays visible when invalid if `error` is omitted.
|
|
11
|
-
* `validate` / native messages render through `Field.Error` when there is no `description
|
|
9
|
+
* Static `error` replaces `description` only while invalid, dirty, and `error` is set.
|
|
10
|
+
* `description` stays visible when invalid if `error` is omitted or the field is not dirty.
|
|
11
|
+
* `validate` / native messages render through `Field.Error` when there is no `description`
|
|
12
|
+
* and the field is invalid and dirty.
|
|
12
13
|
*/
|
|
13
14
|
export declare const FieldHelperCopy: React.FC<FieldHelperCopyProps>;
|
|
14
15
|
export {};
|
|
@@ -1,43 +1,48 @@
|
|
|
1
1
|
import { Text } from "../text/text.js";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { Field } from "@base-ui/react/field";
|
|
4
|
+
import { useFieldRootContext } from "@base-ui/react/internals/field-root-context";
|
|
4
5
|
//#region src/components/basic-input/field-helper-copy.tsx
|
|
5
6
|
/**
|
|
6
7
|
* Renders field helper copy in the shared `Description` slot via `Field.Validity`.
|
|
7
|
-
* Static `error` replaces `description` only while invalid and `error` is set.
|
|
8
|
-
* `description` stays visible when invalid if `error` is omitted.
|
|
9
|
-
* `validate` / native messages render through `Field.Error` when there is no `description
|
|
8
|
+
* Static `error` replaces `description` only while invalid, dirty, and `error` is set.
|
|
9
|
+
* `description` stays visible when invalid if `error` is omitted or the field is not dirty.
|
|
10
|
+
* `validate` / native messages render through `Field.Error` when there is no `description`
|
|
11
|
+
* and the field is invalid and dirty.
|
|
10
12
|
*/
|
|
11
|
-
var FieldHelperCopy = ({ className, description, error }) =>
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
13
|
+
var FieldHelperCopy = ({ className, description, error }) => {
|
|
14
|
+
const { state } = useFieldRootContext(false);
|
|
15
|
+
return /* @__PURE__ */ jsx(Field.Validity, { children: (validity) => {
|
|
16
|
+
const isInvalid = validity.validity.valid === false && state.dirty;
|
|
17
|
+
if (isInvalid && error) return /* @__PURE__ */ jsx(Field.Error, {
|
|
18
|
+
className,
|
|
19
|
+
match: true,
|
|
20
|
+
render: /* @__PURE__ */ jsx(Text, {
|
|
21
|
+
selection: false,
|
|
22
|
+
size: "small",
|
|
23
|
+
tone: "danger"
|
|
24
|
+
}),
|
|
25
|
+
children: error
|
|
26
|
+
});
|
|
27
|
+
if (description) return /* @__PURE__ */ jsx(Field.Description, {
|
|
28
|
+
className,
|
|
29
|
+
render: /* @__PURE__ */ jsx(Text, {
|
|
30
|
+
selection: false,
|
|
31
|
+
size: "small",
|
|
32
|
+
tone: "muted"
|
|
33
|
+
}),
|
|
34
|
+
children: description
|
|
35
|
+
});
|
|
36
|
+
if (isInvalid) return /* @__PURE__ */ jsx(Field.Error, {
|
|
37
|
+
className,
|
|
38
|
+
render: /* @__PURE__ */ jsx(Text, {
|
|
39
|
+
selection: false,
|
|
40
|
+
size: "small",
|
|
41
|
+
tone: "danger"
|
|
42
|
+
})
|
|
43
|
+
});
|
|
44
|
+
return null;
|
|
45
|
+
} });
|
|
46
|
+
};
|
|
42
47
|
//#endregion
|
|
43
48
|
export { FieldHelperCopy };
|
|
@@ -28,7 +28,7 @@ export type SelectProps = SelectRoot.Props<string> & Omit<FieldRoot.Props, 'ref'
|
|
|
28
28
|
description?: React.ReactNode;
|
|
29
29
|
/**
|
|
30
30
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
31
|
-
* Replaces description while the field is invalid.
|
|
31
|
+
* Replaces description while the field is invalid and dirty.
|
|
32
32
|
*
|
|
33
33
|
* @default No static error copy is rendered.
|
|
34
34
|
*/
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"description": "Helper copy rendered with `Field.Description` and `Text` while the field is valid."
|
|
46
46
|
},
|
|
47
47
|
"error": {
|
|
48
|
-
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid."
|
|
48
|
+
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty."
|
|
49
49
|
},
|
|
50
50
|
"Group.label": {
|
|
51
51
|
"description": "Accessible group label rendered with `Select.GroupLabel`."
|
|
@@ -26,7 +26,7 @@ export type SwitchProps = SwitchRoot.Props & Omit<FieldRoot.Props, 'ref'> & {
|
|
|
26
26
|
description?: React.ReactNode;
|
|
27
27
|
/**
|
|
28
28
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
29
|
-
* Replaces description while the field is invalid.
|
|
29
|
+
* Replaces description while the field is invalid and dirty.
|
|
30
30
|
*
|
|
31
31
|
* @default No static error copy is rendered.
|
|
32
32
|
*/
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"description": "Helper copy rendered with `Field.Description` and `Text` while the field is valid."
|
|
29
29
|
},
|
|
30
30
|
"error": {
|
|
31
|
-
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid."
|
|
31
|
+
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty."
|
|
32
32
|
},
|
|
33
33
|
"hPadding": {
|
|
34
34
|
"description": "Sets inline padding using one token for both sides or a `[start, end]` tuple."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-textarea-min-block-size{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textarea-padding-block{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textarea-input-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}.viraui__textarea-module__Textarea_mtOUG{--vui-textarea-min-block-size:calc(var(--space-x-large) * 2);--vui-textarea-padding-block:var(--space-small);--vui-textarea-input-border-radius:var(--radius-small);--vui-field-label-padding-inline:calc(var(--vui-textarea-input-border-radius) / 2);inline-size:100%;&:not(:has([data-sizing=content])){max-block-size:min-content}&:has([required]) .viraui__textarea-module__Label_5dOso:after{content:" *";color:var(--highlight-red)}}.viraui__textarea-module__Description_er3zI{padding-inline:var(--vui-field-label-padding-inline)}}@layer viraui.overrides{.viraui__textarea-module__CustomBasicInput_Ce7yA{--vui-basic-input-border-radius:var(--vui-textarea-input-border-radius);border:1px solid var(--global-contrast);min-block-size:var(--vui-textarea-min-block-size);padding-block:var(--vui-textarea-padding-block);line-height:1.4;resize:none;&[data-resize=vertical]{resize:vertical}&[data-resize=horizontal]{resize:horizontal}&[data-resize=both]{resize:both}&[data-resize=block]{resize:block}&[data-resize=inline]{resize:inline}&[data-invalid]{border-color:var(--highlight-red)}&:disabled,&[data-disabled]{border-color:#0000}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-textarea-min-block-size{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textarea-padding-block{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textarea-input-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}.viraui__textarea-module__Textarea_mtOUG{--vui-textarea-min-block-size:calc(var(--space-x-large) * 2);--vui-textarea-padding-block:var(--space-small);--vui-textarea-input-border-radius:var(--radius-small);--vui-field-label-padding-inline:calc(var(--vui-textarea-input-border-radius) / 2);inline-size:100%;&:not(:has([data-sizing=content])){max-block-size:min-content}&:has([required]) .viraui__textarea-module__Label_5dOso:after{content:" *";color:var(--highlight-red)}}.viraui__textarea-module__Description_er3zI{padding-inline:var(--vui-field-label-padding-inline)}}@layer viraui.overrides{.viraui__textarea-module__CustomBasicInput_Ce7yA{--vui-basic-input-border-radius:var(--vui-textarea-input-border-radius);border:1px solid var(--global-contrast);min-block-size:var(--vui-textarea-min-block-size);padding-block:var(--vui-textarea-padding-block);line-height:1.4;resize:none;&[data-resize=vertical]{resize:vertical}&[data-resize=horizontal]{resize:horizontal}&[data-resize=both]{resize:both}&[data-resize=block]{resize:block}&[data-resize=inline]{resize:inline}&[data-invalid][data-dirty]{border-color:var(--highlight-red)}&:disabled,&[data-disabled]{border-color:#0000}}}
|
|
@@ -25,7 +25,7 @@ export type TextareaProps = React.ComponentPropsWithRef<'textarea'> & Omit<Field
|
|
|
25
25
|
description?: React.ReactNode;
|
|
26
26
|
/**
|
|
27
27
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
28
|
-
* Replaces description while the field is invalid. Validation messages from `validate`
|
|
28
|
+
* Replaces description while the field is invalid and dirty. Validation messages from `validate`
|
|
29
29
|
* are shown by `Field.Error` even when this prop is omitted.
|
|
30
30
|
*
|
|
31
31
|
* @default No static error copy is rendered.
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"description": "Helper copy rendered with `Field.Description` and `Text` while the field is valid."
|
|
29
29
|
},
|
|
30
30
|
"error": {
|
|
31
|
-
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid. Validation messages from `validate` are shown by `Field.Error` even when this prop is omitted."
|
|
31
|
+
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty. Validation messages from `validate` are shown by `Field.Error` even when this prop is omitted (also requires dirty)."
|
|
32
32
|
},
|
|
33
33
|
"fitContent": {
|
|
34
34
|
"description": "When `true`, sets `field-sizing: content` so the control grows with its value. Still respects `min-block-size` and `resize`. Omitted / `false` keeps the browser fixed default."
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-textfield-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textfield-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}.viraui__textfield-module__Textfield_o-70A{--vui-textfield-input-height:var(--space-2x-large);--vui-textfield-control-group-background:var(--base-1);--vui-textfield-control-group-color:var(--global-foreground);--vui-textfield-control-group-border-color:var(--global-contrast);--vui-textfield-control-group-border-radius:var(--radius-medium);--vui-field-label-padding-inline:calc(var(--vui-textfield-control-group-border-radius) / 2);max-block-size:min-content;&[data-fullwidth=true]{inline-size:100%}&:has([required]) .viraui__textfield-module__Label_5rjr0:after{content:" *";color:var(--highlight-red)}}.viraui__textfield-module__ControlGroup_2W-OC{box-sizing:border-box;inline-size:100%;block-size:var(--vui-textfield-input-height);background:var(--vui-textfield-control-group-background);color:var(--vui-textfield-control-group-color);border:1px solid var(--vui-textfield-control-group-border-color);border-radius:var(--vui-textfield-control-group-border-radius);&:has(.viraui__textfield-module__CustomBasicInput_oHgtd:focus-visible),&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-focused]){outline:var(--outline);outline-offset:var(--outline-offset)}&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-invalid]){--vui-textfield-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}&:has(.viraui__textfield-module__CustomBasicInput_oHgtd:disabled),&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-disabled]){--vui-textfield-control-group-background:var(--global-disabled-background);--vui-textfield-control-group-border-color:#0000;--vui-textfield-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}&:has(.viraui__textfield-module__Addon_kK1ef[data-position=start])>.viraui__textfield-module__CustomBasicInput_oHgtd{padding-inline-start:var(--space-x-small)}&:has(.viraui__textfield-module__Addon_kK1ef[data-position=end])>.viraui__textfield-module__CustomBasicInput_oHgtd{padding-inline-end:var(--space-x-small)}}.viraui__textfield-module__Addon_kK1ef{min-inline-size:var(--space-x-large)}.viraui__textfield-module__Description_8Qxot{padding-inline:calc(var(--vui-textfield-control-group-border-radius) / 2)}}@layer viraui.overrides{.viraui__textfield-module__CustomBasicInput_oHgtd{flex:1 1 auto;block-size:100%;line-height:1.2;background:#0000;box-shadow:none;border-radius:inherit;&:focus-visible{outline:none}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-textfield-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-textfield-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-textfield-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}.viraui__textfield-module__Textfield_o-70A{--vui-textfield-input-height:var(--space-2x-large);--vui-textfield-control-group-background:var(--base-1);--vui-textfield-control-group-color:var(--global-foreground);--vui-textfield-control-group-border-color:var(--global-contrast);--vui-textfield-control-group-border-radius:var(--radius-medium);--vui-field-label-padding-inline:calc(var(--vui-textfield-control-group-border-radius) / 2);max-block-size:min-content;&[data-fullwidth=true]{inline-size:100%}&:has([required]) .viraui__textfield-module__Label_5rjr0:after{content:" *";color:var(--highlight-red)}}.viraui__textfield-module__ControlGroup_2W-OC{box-sizing:border-box;inline-size:100%;block-size:var(--vui-textfield-input-height);background:var(--vui-textfield-control-group-background);color:var(--vui-textfield-control-group-color);border:1px solid var(--vui-textfield-control-group-border-color);border-radius:var(--vui-textfield-control-group-border-radius);&:has(.viraui__textfield-module__CustomBasicInput_oHgtd:focus-visible),&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-focused]){outline:var(--outline);outline-offset:var(--outline-offset)}&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-invalid][data-dirty]){--vui-textfield-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}&:has(.viraui__textfield-module__CustomBasicInput_oHgtd:disabled),&:has(.viraui__textfield-module__CustomBasicInput_oHgtd[data-disabled]){--vui-textfield-control-group-background:var(--global-disabled-background);--vui-textfield-control-group-border-color:#0000;--vui-textfield-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}&:has(.viraui__textfield-module__Addon_kK1ef[data-position=start])>.viraui__textfield-module__CustomBasicInput_oHgtd{padding-inline-start:var(--space-x-small)}&:has(.viraui__textfield-module__Addon_kK1ef[data-position=end])>.viraui__textfield-module__CustomBasicInput_oHgtd{padding-inline-end:var(--space-x-small)}}.viraui__textfield-module__Addon_kK1ef{min-inline-size:var(--space-x-large)}.viraui__textfield-module__Description_8Qxot{padding-inline:calc(var(--vui-textfield-control-group-border-radius) / 2)}}@layer viraui.overrides{.viraui__textfield-module__CustomBasicInput_oHgtd{flex:1 1 auto;block-size:100%;line-height:1.2;background:#0000;box-shadow:none;border-radius:inherit;&:focus-visible{outline:none}}}
|
|
@@ -26,7 +26,7 @@ export type TextfieldProps = PrimitiveInput.Props & FieldRoot.Props & {
|
|
|
26
26
|
description?: React.ReactNode;
|
|
27
27
|
/**
|
|
28
28
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
29
|
-
* Replaces description while the field is invalid. Validation messages from `validate`
|
|
29
|
+
* Replaces description while the field is invalid and dirty. Validation messages from `validate`
|
|
30
30
|
* are shown by `Field.Error` even when this prop is omitted.
|
|
31
31
|
*
|
|
32
32
|
* @default No static error copy is rendered.
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"description": "Trailing decoration (icon, button). Buttons must use `type=\"button\"`."
|
|
35
35
|
},
|
|
36
36
|
"error": {
|
|
37
|
-
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid. Validation messages from `validate` are shown by `Field.Error` even when this prop is omitted."
|
|
37
|
+
"description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty. Validation messages from `validate` are shown by `Field.Error` even when this prop is omitted (also requires dirty)."
|
|
38
38
|
},
|
|
39
39
|
"fitContent": {
|
|
40
40
|
"description": "When `true`, sets `field-sizing: content` so the control grows inline with its value. Block chrome stays `var(--vui-textfield-input-height)`. Omitted / `false` keeps the browser fixed default."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraui/react",
|
|
3
|
-
"version": "2026.2.
|
|
3
|
+
"version": "2026.2.6",
|
|
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.2.2",
|
|
37
37
|
"vite-plugin-static-copy": "4.1.1",
|
|
38
|
-
"@viraui/foundation": "2026.2.
|
|
38
|
+
"@viraui/foundation": "2026.2.6",
|
|
39
39
|
"@viraui/icons": "2026.0.2",
|
|
40
40
|
"@viraui/postcss-config": "2026.0.0",
|
|
41
41
|
"@viraui/tsconfig": "2026.0.0"
|