@viraui/react 2026.6.5 → 2026.7.0-next.1
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 +24 -0
- package/dist/components/accordion/accordion-item.d.ts +10 -10
- package/dist/components/accordion/accordion.d.ts +2 -2
- package/dist/components/annotate/annotate.d.ts +15 -15
- package/dist/components/autocomplete/autocomplete-item.d.ts +3 -3
- package/dist/components/autocomplete/autocomplete.d.ts +12 -12
- package/dist/components/autocomplete/autocomplete.js +1 -1
- package/dist/components/avatar/avatar.d.ts +6 -6
- package/dist/components/avatar-group/avatar-group.d.ts +6 -6
- package/dist/components/badge/badge.d.ts +5 -5
- package/dist/components/basic-input/basic-input.d.ts +3 -2
- package/dist/components/basic-input/basic-input.js +7 -0
- package/dist/components/basic-input/input-control-group.d.ts +2 -2
- package/dist/components/beam/beam-pulse-driver.d.ts +1 -0
- package/dist/components/beam/beam-pulse-driver.js +2 -2
- package/dist/components/beam/beam.css +1 -1
- package/dist/components/beam/beam.d.ts +17 -14
- package/dist/components/beam/beam.js +31 -26
- package/dist/components/bleed/bleed.d.ts +3 -3
- package/dist/components/button/button-link.d.ts +1 -1
- package/dist/components/button/button.d.ts +1 -1
- package/dist/components/checkbox/checkbox-group.d.ts +1 -1
- package/dist/components/checkbox/checkbox.d.ts +7 -7
- package/dist/components/chip/chip.d.ts +6 -6
- package/dist/components/clamp-text/clamp-text.d.ts +5 -5
- package/dist/components/dialog/dialog-close.d.ts +1 -1
- package/dist/components/dialog/dialog-indent-background.d.ts +1 -1
- package/dist/components/dialog/dialog-indent.d.ts +1 -1
- package/dist/components/dialog/dialog-sheet.d.ts +10 -10
- package/dist/components/dialog/dialog-sheet.js +1 -1
- package/dist/components/dialog/dialog-trigger.d.ts +1 -1
- package/dist/components/dialog/dialog.d.ts +1 -1
- package/dist/components/disclosure/disclosure-panel.d.ts +12 -0
- package/dist/components/disclosure/disclosure-panel.js +13 -0
- package/dist/components/disclosure/disclosure-trigger.d.ts +46 -0
- package/dist/components/disclosure/disclosure-trigger.js +82 -0
- package/dist/components/disclosure/disclosure.css +1 -0
- package/dist/components/disclosure/disclosure.d.ts +25 -0
- package/dist/components/disclosure/disclosure.js +30 -0
- package/dist/components/disclosure/disclosure.module.js +15 -0
- package/dist/components/disclosure/index.d.ts +4 -0
- package/dist/components/elevator/elevator.d.ts +7 -7
- package/dist/components/fieldset/fieldset.d.ts +4 -4
- package/dist/components/fit-text/fit-text.d.ts +2 -2
- package/dist/components/glow/glow.d.ts +12 -12
- package/dist/components/grid/grid-item.d.ts +8 -8
- package/dist/components/grid/grid.d.ts +12 -12
- package/dist/components/icon-button/icon-button-link.d.ts +2 -2
- package/dist/components/icon-button/icon-button.d.ts +2 -2
- package/dist/components/index.d.ts +4 -0
- package/dist/components/linear-progress/linear-progress.d.ts +4 -4
- package/dist/components/masonry/masonry-item.d.ts +3 -3
- package/dist/components/masonry/masonry.d.ts +4 -4
- package/dist/components/menu/menu-checkbox-item.d.ts +4 -4
- package/dist/components/menu/menu-item.d.ts +4 -4
- package/dist/components/menu/menu-link-item.d.ts +4 -4
- package/dist/components/menu/menu-popup.d.ts +2 -2
- package/dist/components/menu/menu-popup.js +1 -1
- package/dist/components/menu/menu-radio-group.d.ts +2 -2
- package/dist/components/menu/menu-radio-item.d.ts +4 -4
- package/dist/components/menu/menu-separator.d.ts +1 -1
- package/dist/components/menu/menu-submenu-trigger.d.ts +3 -3
- package/dist/components/menu/menu.d.ts +3 -3
- package/dist/components/meter/meter.css +1 -1
- package/dist/components/meter/meter.d.ts +15 -5
- package/dist/components/meter/meter.js +2 -1
- package/dist/components/number-field/index.d.ts +2 -0
- package/dist/components/number-field/number-field.css +1 -0
- package/dist/components/number-field/number-field.d.ts +78 -0
- package/dist/components/number-field/number-field.js +120 -0
- package/dist/components/number-field/number-field.module.js +21 -0
- package/dist/components/otp-field/index.d.ts +4 -0
- package/dist/components/otp-field/otp-field-input.d.ts +12 -0
- package/dist/components/otp-field/otp-field-input.js +29 -0
- package/dist/components/otp-field/otp-field-separator.d.ts +13 -0
- package/dist/components/otp-field/otp-field-separator.js +20 -0
- package/dist/components/otp-field/otp-field.css +1 -0
- package/dist/components/otp-field/otp-field.d.ts +48 -0
- package/dist/components/otp-field/otp-field.js +78 -0
- package/dist/components/otp-field/otp-field.module.js +23 -0
- package/dist/components/popover/popover-sheet.d.ts +6 -6
- package/dist/components/popover/popover.d.ts +5 -5
- package/dist/components/progressive-blur/progressive-blur.d.ts +5 -5
- package/dist/components/prose/index.d.ts +2 -0
- package/dist/components/prose/prose.css +1 -0
- package/dist/components/prose/prose.d.ts +40 -0
- package/dist/components/prose/prose.js +27 -0
- package/dist/components/prose/prose.module.js +5 -0
- package/dist/components/radio/radio-group.d.ts +1 -1
- package/dist/components/radio/radio.d.ts +6 -6
- package/dist/components/select/select-indicator-slot.d.ts +1 -1
- package/dist/components/select/select-option.d.ts +4 -4
- package/dist/components/select/select-separator.d.ts +1 -1
- package/dist/components/select/select.d.ts +10 -10
- package/dist/components/select/select.js +1 -1
- package/dist/components/separator/separator.d.ts +15 -8
- package/dist/components/separator/separator.js +2 -1
- package/dist/components/shimmer/shimmer.d.ts +6 -6
- package/dist/components/skeleton/skeleton-overlay.d.ts +5 -5
- package/dist/components/skeleton/skeleton.d.ts +9 -9
- package/dist/components/slider/slider.d.ts +7 -7
- package/dist/components/spinner/spinner.d.ts +3 -3
- package/dist/components/stack/stack.d.ts +17 -17
- package/dist/components/static-noise/static-noise.d.ts +5 -5
- package/dist/components/surface/surface.d.ts +12 -12
- package/dist/components/switch/switch.d.ts +7 -7
- package/dist/components/tabs/tabs-list.d.ts +1 -1
- package/dist/components/tabs/tabs-panel.d.ts +1 -1
- package/dist/components/tabs/tabs-tab.d.ts +3 -3
- package/dist/components/tabs/tabs.d.ts +2 -2
- package/dist/components/text/text.css +1 -1
- package/dist/components/text/text.d.ts +24 -23
- package/dist/components/text/text.js +4 -2
- package/dist/components/textarea/textarea.d.ts +6 -6
- package/dist/components/textfield/textfield.css +1 -1
- package/dist/components/textfield/textfield.d.ts +19 -11
- package/dist/components/textfield/textfield.js +43 -39
- package/dist/components/textfield/textfield.module.js +3 -1
- package/dist/components/title/title.css +1 -1
- package/dist/components/title/title.d.ts +22 -21
- package/dist/components/title/title.js +4 -2
- package/dist/components/toast/toast-action.d.ts +1 -1
- package/dist/components/toast/toast-banner.d.ts +7 -7
- package/dist/components/toast/toast-banner.js +1 -1
- package/dist/components/toast/toast-viewport.d.ts +2 -2
- package/dist/components/toggle-button/toggle-button.d.ts +6 -6
- package/dist/components/toggle-group/toggle-group.d.ts +1 -1
- package/dist/components/tooltip/tooltip-content.d.ts +2 -2
- package/dist/components/typewriter/typewriter.d.ts +10 -10
- package/dist/index.js +7 -3
- package/dist/specs/components/accordion/usage.xml +1 -0
- package/dist/specs/components/beam/a11y.xml +3 -3
- package/dist/specs/components/beam/props.xml +22 -1
- package/dist/specs/components/beam/usage.xml +1 -0
- package/dist/specs/components/disclosure/a11y.xml +9 -0
- package/dist/specs/components/disclosure/meta.xml +20 -0
- package/dist/specs/components/disclosure/patterns.xml +55 -0
- package/dist/specs/components/disclosure/props.xml +54 -0
- package/dist/specs/components/disclosure/usage.xml +11 -0
- package/dist/specs/components/meter/patterns.xml +12 -0
- package/dist/specs/components/meter/props.xml +7 -0
- package/dist/specs/components/meter/usage.xml +2 -0
- package/dist/specs/components/number-field/a11y.xml +10 -0
- package/dist/specs/components/number-field/meta.xml +21 -0
- package/dist/specs/components/number-field/patterns.xml +43 -0
- package/dist/specs/components/number-field/props.xml +35 -0
- package/dist/specs/components/number-field/usage.xml +12 -0
- package/dist/specs/components/otp-field/a11y.xml +10 -0
- package/dist/specs/components/otp-field/meta.xml +20 -0
- package/dist/specs/components/otp-field/patterns.xml +66 -0
- package/dist/specs/components/otp-field/props.xml +29 -0
- package/dist/specs/components/otp-field/usage.xml +13 -0
- package/dist/specs/components/prose/a11y.xml +7 -0
- package/dist/specs/components/prose/meta.xml +18 -0
- package/dist/specs/components/prose/patterns.xml +59 -0
- package/dist/specs/components/prose/props.xml +37 -0
- package/dist/specs/components/prose/usage.xml +12 -0
- package/dist/specs/components/separator/props.xml +3 -0
- package/dist/specs/components/separator/usage.xml +1 -0
- package/dist/specs/components/text/props.xml +2 -2
- package/dist/specs/components/text/usage.xml +1 -0
- package/dist/specs/components/textfield/meta.xml +1 -0
- package/dist/specs/components/textfield/props.xml +6 -1
- package/dist/specs/components/textfield/usage.xml +2 -1
- package/dist/specs/components/title/props.xml +2 -2
- package/dist/specs/components/title/usage.xml +1 -0
- package/dist/specs/index.xml +41 -1
- package/package.json +2 -2
|
@@ -14,70 +14,70 @@ export type SurfaceBorder = 'all' | 'top' | 'right' | 'bottom' | 'left';
|
|
|
14
14
|
* Includes standard `div` attributes such as `id`, `role`, `title`, and event handlers,
|
|
15
15
|
* plus Vira-owned container styling controls and Base UI `render` support for replacing the root element.
|
|
16
16
|
*
|
|
17
|
-
* @
|
|
17
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
18
18
|
*/
|
|
19
19
|
export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'> & {
|
|
20
20
|
/**
|
|
21
21
|
* Replaces the default `div` root using Base UI render semantics.
|
|
22
22
|
*
|
|
23
|
-
* @
|
|
23
|
+
* @defaultValue The surface renders a `div` root.
|
|
24
24
|
*/
|
|
25
25
|
render?: useRender.RenderProp;
|
|
26
26
|
/**
|
|
27
27
|
* Ref forwarded to the rendered surface root element.
|
|
28
28
|
*
|
|
29
|
-
* @
|
|
29
|
+
* @defaultValue No ref is attached.
|
|
30
30
|
*/
|
|
31
31
|
ref?: React.Ref<HTMLElement>;
|
|
32
32
|
/**
|
|
33
33
|
* Sets the resting background using a base ramp layer (`1`–`3`), a literal CSS color value, or the named token
|
|
34
34
|
* `primary` (`data-surface-color="primary"`; CSS owns light/dark opacity via `--global-primary`).
|
|
35
35
|
*
|
|
36
|
-
* @
|
|
36
|
+
* @defaultValue No background.
|
|
37
37
|
*/
|
|
38
38
|
color?: SurfaceColor;
|
|
39
39
|
/**
|
|
40
40
|
* Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`), a literal CSS value, or the
|
|
41
41
|
* named token `primary` (`data-surface-hover-color="primary"`; CSS owns light/dark opacity via `--global-primary`).
|
|
42
42
|
*
|
|
43
|
-
* @
|
|
43
|
+
* @defaultValue No hover color override.
|
|
44
44
|
*/
|
|
45
45
|
hoverColor?: SurfaceColor;
|
|
46
46
|
/**
|
|
47
47
|
* Applies the shared contrast border on one or more sides (`'all'`, `'top'`, `'right'`, `'bottom'`, `'left'`).
|
|
48
48
|
* Pass a single side or a list (e.g. `['bottom', 'left']`). Omit for no border.
|
|
49
49
|
*
|
|
50
|
-
* @
|
|
50
|
+
* @defaultValue No border.
|
|
51
51
|
*/
|
|
52
52
|
border?: SurfaceBorder | readonly SurfaceBorder[];
|
|
53
53
|
/**
|
|
54
54
|
* Sets the CSS border style when `border` is set.
|
|
55
55
|
*
|
|
56
|
-
* @
|
|
56
|
+
* @defaultValue solid
|
|
57
57
|
*/
|
|
58
58
|
borderStyle?: 'solid' | 'dashed' | 'dotted' | 'double';
|
|
59
59
|
/**
|
|
60
60
|
* Sets corner radius from the Vira radius token scale, a per-corner `[top-left, top-right, bottom-right, bottom-left]` tuple (`0` for square corners), or `auto` for concentric radii from the nearest ancestor Surface.
|
|
61
61
|
*
|
|
62
|
-
* @
|
|
62
|
+
* @defaultValue No radius.
|
|
63
63
|
*/
|
|
64
64
|
radius?: SurfaceRadiusInput;
|
|
65
65
|
/**
|
|
66
66
|
* Sets inline padding using one token for both sides or a `[start, end]` tuple.
|
|
67
67
|
*
|
|
68
|
-
* @
|
|
68
|
+
* @defaultValue No inline padding.
|
|
69
69
|
*/
|
|
70
70
|
hPadding?: SurfacePadding;
|
|
71
71
|
/**
|
|
72
72
|
* Sets block padding using one token for both sides or a `[start, end]` tuple.
|
|
73
73
|
*
|
|
74
|
-
* @
|
|
74
|
+
* @defaultValue No block padding.
|
|
75
75
|
*/
|
|
76
76
|
vPadding?: SurfacePadding;
|
|
77
77
|
/**
|
|
78
78
|
* Sets root overflow through the `--vui-surface-overflow` custom property.
|
|
79
79
|
*
|
|
80
|
-
* @
|
|
80
|
+
* @defaultValue visible
|
|
81
81
|
*/
|
|
82
82
|
overflow?: React.CSSProperties['overflow'];
|
|
83
83
|
/**
|
|
@@ -89,7 +89,7 @@ export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'>
|
|
|
89
89
|
* Warning: inline-size containment can affect nested layout (e.g. cards inside Masonry).
|
|
90
90
|
* Use only when you need container queries against this specific Surface.
|
|
91
91
|
*
|
|
92
|
-
* @
|
|
92
|
+
* @defaultValue false
|
|
93
93
|
*/
|
|
94
94
|
enableContainer?: boolean;
|
|
95
95
|
};
|
|
@@ -9,44 +9,44 @@ import type * as React from 'react';
|
|
|
9
9
|
* and change handlers, plus optional field copy rendered with the shared Vira
|
|
10
10
|
* field label/helper pattern.
|
|
11
11
|
*
|
|
12
|
-
* @
|
|
12
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
13
13
|
*/
|
|
14
14
|
export type SwitchProps = SwitchRoot.Props & Omit<FieldRoot.Props, 'ref'> & {
|
|
15
15
|
/**
|
|
16
16
|
* Visible label rendered with shared internal `FieldLabel`.
|
|
17
17
|
*
|
|
18
|
-
* @
|
|
18
|
+
* @defaultValue No label is rendered.
|
|
19
19
|
*/
|
|
20
20
|
label?: React.ReactNode;
|
|
21
21
|
/**
|
|
22
22
|
* Helper copy rendered with `Field.Description` and `Text` while the field is valid.
|
|
23
23
|
*
|
|
24
|
-
* @
|
|
24
|
+
* @defaultValue No description is rendered.
|
|
25
25
|
*/
|
|
26
26
|
description?: React.ReactNode;
|
|
27
27
|
/**
|
|
28
28
|
* Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
|
|
29
29
|
* Replaces description while the field is invalid and dirty.
|
|
30
30
|
*
|
|
31
|
-
* @
|
|
31
|
+
* @defaultValue No static error copy is rendered.
|
|
32
32
|
*/
|
|
33
33
|
error?: React.ReactNode;
|
|
34
34
|
/**
|
|
35
35
|
* Controls the visual switch size.
|
|
36
36
|
*
|
|
37
|
-
* @
|
|
37
|
+
* @defaultValue 's'
|
|
38
38
|
*/
|
|
39
39
|
size?: 'm' | 's';
|
|
40
40
|
/**
|
|
41
41
|
* Sets block padding using one token for both sides or a `[start, end]` tuple.
|
|
42
42
|
*
|
|
43
|
-
* @
|
|
43
|
+
* @defaultValue No block padding.
|
|
44
44
|
*/
|
|
45
45
|
vPadding?: StackProps['vPadding'];
|
|
46
46
|
/**
|
|
47
47
|
* Sets inline padding using one token for both sides or a `[start, end]` tuple.
|
|
48
48
|
*
|
|
49
|
-
* @
|
|
49
|
+
* @defaultValue No inline padding.
|
|
50
50
|
*/
|
|
51
51
|
hPadding?: StackProps['hPadding'];
|
|
52
52
|
};
|
|
@@ -6,7 +6,7 @@ import type * as React from 'react';
|
|
|
6
6
|
* Wraps Base UI `Tabs.List` in a compact `Surface`, lays out items with `Stack`,
|
|
7
7
|
* and renders the active tab indicator internally.
|
|
8
8
|
*
|
|
9
|
-
* @
|
|
9
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
10
10
|
*/
|
|
11
11
|
export type TabsListProps = TabsListPrimitive.Props;
|
|
12
12
|
export declare const TabsList: React.FC<TabsListProps>;
|
|
@@ -5,7 +5,7 @@ import type * as React from 'react';
|
|
|
5
5
|
*
|
|
6
6
|
* Base UI `Tabs.Panel` with entry slide/fade animation.
|
|
7
7
|
*
|
|
8
|
-
* @
|
|
8
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
9
9
|
*/
|
|
10
10
|
export type TabsPanelProps = TabsPanelPrimitive.Props;
|
|
11
11
|
export declare const TabsPanel: React.FC<TabsPanelProps>;
|
|
@@ -5,19 +5,19 @@ import type * as React from 'react';
|
|
|
5
5
|
*
|
|
6
6
|
* Wraps Base UI `Tabs.Tab` with optional decorative addon layout.
|
|
7
7
|
*
|
|
8
|
-
* @
|
|
8
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
9
9
|
*/
|
|
10
10
|
export type TabsTabProps = TabsTabPrimitive.Props & {
|
|
11
11
|
/**
|
|
12
12
|
* Decorative addon rendered alongside the tab label.
|
|
13
13
|
*
|
|
14
|
-
* @
|
|
14
|
+
* @defaultValue No addon is rendered.
|
|
15
15
|
*/
|
|
16
16
|
addon?: React.ReactNode;
|
|
17
17
|
/**
|
|
18
18
|
* Controls whether the addon appears before or after the label.
|
|
19
19
|
*
|
|
20
|
-
* @
|
|
20
|
+
* @defaultValue 'start'
|
|
21
21
|
*/
|
|
22
22
|
addonPosition?: 'start' | 'end';
|
|
23
23
|
};
|
|
@@ -11,13 +11,13 @@ import * as React from 'react';
|
|
|
11
11
|
* Includes Base UI tabs root props such as `value`, `defaultValue`, `orientation`,
|
|
12
12
|
* and `onValueChange`.
|
|
13
13
|
*
|
|
14
|
-
* @
|
|
14
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
15
15
|
*/
|
|
16
16
|
export type TabsProps = TabsRoot.Props & {
|
|
17
17
|
/**
|
|
18
18
|
* Horizontal alignment of tab list within root Stack.
|
|
19
19
|
*
|
|
20
|
-
* @
|
|
20
|
+
* @defaultValue 'start'
|
|
21
21
|
*/
|
|
22
22
|
listAlignment?: Extract<StackProps['hAlign'], 'start' | 'center' | 'end' | 'stretch'>;
|
|
23
23
|
};
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
var(--__text-size-min),
|
|
3
3
|
calc(var(--__text-size-min) + (var(--__text-size-max) - var(--__text-size-min)) * var(--__text-fluid)),
|
|
4
4
|
var(--__text-size-max)
|
|
5
|
-
);--vui-text-font-family:var(--font-family-body);--vui-text-line-height:var(--font-leading-m);margin:0;max-inline-size:var(--vui-text-max-width);font-family:var(--vui-text-font-family);font-size:var(--vui-text-font-size);line-height:var(--vui-text-line-height);
|
|
5
|
+
);--vui-text-font-family:var(--font-family-body);--vui-text-line-height:var(--font-leading-m);margin:0;max-inline-size:var(--vui-text-max-width);font-family:var(--vui-text-font-family);font-size:var(--vui-text-font-size);line-height:var(--vui-text-line-height);letter-spacing:var(--vui-text-letter-spacing);text-transform:var(--vui-text-text-transform);white-space:var(--vui-text-white-space);word-break:break-word;font-weight:var(--vui-text-font-weight);font-stretch:calc(var(--vui-text-font-width) * 1%);font-optical-sizing:auto;font-variation-settings:"wght" var(--vui-text-font-weight),"wdth" var(--vui-text-font-width),"opsz" var(--vui-text-font-opsz);text-box:var(--vui-text-trim) var(--vui-text-trim-type);&[data-text-balanced=true]{text-wrap:balance}&[data-text-selection=false]{-webkit-user-select:none;user-select:none}&[data-text-has-align=true]{text-align:var(--vui-text-align)}&[data-text-has-padding=true]{padding:var(--vui-text-padding-block-start) var(--vui-text-padding-inline-end) var(--vui-text-padding-block-end) var(--vui-text-padding-inline-start)}&[data-text-family=mono]{--vui-text-font-family:var(--font-family-mono)}&[data-text-size="4xl"]{--__text-size-min:var(--font-scale-body-3xl);--__text-size-max:var(--font-scale-body-4xl)}&[data-text-size="3xl"]{--__text-size-min:var(--font-scale-body-2xl);--__text-size-max:var(--font-scale-body-3xl)}&[data-text-size="2xl"]{--__text-size-min:var(--font-scale-body-xl);--__text-size-max:var(--font-scale-body-2xl)}&[data-text-size=xl]{--__text-size-min:var(--font-scale-body-l);--__text-size-max:var(--font-scale-body-xl)}&[data-text-size=l]{--__text-size-min:var(--font-scale-body-m);--__text-size-max:var(--font-scale-body-l)}&[data-text-size=s]{--__text-size-max:var(--font-scale-body-s)}&[data-text-size=s],&[data-text-size=xs]{--__text-size-min:var(--font-scale-body-xs)}&[data-text-size=xs]{--__text-size-max:var(--font-scale-body-xs)}& .viraui__text-module__Text_bS8kv:not([data-text-size]){font-size:inherit}& .viraui__text-module__Text_bS8kv:not([data-text-line-height]){line-height:inherit}&[data-text-fluid=false]{--vui-text-font-size:var(--__text-size-max)}@container root style(--effect-fluid-typography: initial){--vui-text-font-size:var(--__text-size-max)}&[data-text-weight=light]{--vui-text-font-weight:200}&[data-text-weight=semibold]{--vui-text-font-weight:600}&[data-text-weight=bold]{--vui-text-font-weight:800}&[data-text-tone=primary]{color:var(--global-primary)}&[data-text-tone=muted]{color:var(--global-muted)}&[data-text-tone=interactive]{color:var(--global-interactive-text)}&[data-text-tone=positive]{color:var(--highlight-green)}&[data-text-tone=informative]{color:var(--highlight-blue)}&[data-text-tone=danger]{color:var(--highlight-red)}&[data-text-tone=warning]{color:var(--highlight-yellow)}&[data-text-has-literal-color=true]{color:var(--vui-text-literal-color)}&[data-text-line-height=none]{--vui-text-line-height:0}&[data-text-line-height=xs]{--vui-text-line-height:var(--font-leading-xs)}&[data-text-line-height=s]{--vui-text-line-height:var(--font-leading-s)}&[data-text-line-height=m]{--vui-text-line-height:var(--font-leading-m)}&[data-text-line-height=l]{--vui-text-line-height:var(--font-leading-l)}}}
|
|
@@ -9,19 +9,19 @@ type TextAxisPadding = TextSpace | [TextSpace | 0, TextSpace | 0];
|
|
|
9
9
|
* Includes standard inline text attributes such as `children`, `id`, `title`, and event handlers,
|
|
10
10
|
* plus Vira-owned body typography, color, and layout controls.
|
|
11
11
|
*
|
|
12
|
-
* @
|
|
12
|
+
* @defaultValue Base HTML pass-through props keep upstream defaults.
|
|
13
13
|
*/
|
|
14
14
|
export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
|
|
15
15
|
/**
|
|
16
16
|
* Replaces the default `span` root using Base UI render semantics.
|
|
17
17
|
*
|
|
18
|
-
* @
|
|
18
|
+
* @defaultValue The text renders a `span` root.
|
|
19
19
|
*/
|
|
20
20
|
render?: useRender.RenderProp;
|
|
21
21
|
/**
|
|
22
22
|
* Ref forwarded to the rendered text root element.
|
|
23
23
|
*
|
|
24
|
-
* @
|
|
24
|
+
* @defaultValue No ref is attached.
|
|
25
25
|
*/
|
|
26
26
|
ref?: React.Ref<HTMLElement>;
|
|
27
27
|
/**
|
|
@@ -29,19 +29,19 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
|
|
|
29
29
|
* (`4xl` | `3xl` | `2xl` | `xl` | `l` | `m` | `s` | `xs`).
|
|
30
30
|
* Omit when nested in Text so font-size inherits the outer Text size.
|
|
31
31
|
*
|
|
32
|
-
* @
|
|
32
|
+
* @defaultValue 'm' on root Text (CSS); inherit when nested and omitted
|
|
33
33
|
*/
|
|
34
34
|
size?: '4xl' | '3xl' | '2xl' | 'xl' | 'l' | 'm' | 's' | 'xs';
|
|
35
35
|
/**
|
|
36
36
|
* Selects the semantic font family for body copy and inline code-like text.
|
|
37
37
|
*
|
|
38
|
-
* @
|
|
38
|
+
* @defaultValue 'body'
|
|
39
39
|
*/
|
|
40
40
|
family?: 'body' | 'mono';
|
|
41
41
|
/**
|
|
42
42
|
* Selects a semantic weight keyword or a numeric weight (`font-weight` + `wght` axis).
|
|
43
43
|
*
|
|
44
|
-
* @
|
|
44
|
+
* @defaultValue 'regular'
|
|
45
45
|
*/
|
|
46
46
|
weight?: 'light' | 'regular' | 'semibold' | 'bold' | number;
|
|
47
47
|
/**
|
|
@@ -50,101 +50,102 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
|
|
|
50
50
|
* `interactive` → `--global-interactive-text`; `positive` / `informative` / `danger` / `warning`
|
|
51
51
|
* → `--highlight-green` / `--highlight-blue` / `--highlight-red` / `--highlight-yellow`.
|
|
52
52
|
*
|
|
53
|
-
* @
|
|
53
|
+
* @defaultValue No semantic tone override.
|
|
54
54
|
*/
|
|
55
55
|
tone?: 'default' | 'primary' | 'muted' | 'interactive' | 'positive' | 'informative' | 'danger' | 'warning';
|
|
56
56
|
/**
|
|
57
57
|
* Applies a custom color as an escape hatch when semantic `tone` is not used.
|
|
58
58
|
*
|
|
59
|
-
* @
|
|
59
|
+
* @defaultValue No literal color override.
|
|
60
60
|
*/
|
|
61
61
|
color?: string;
|
|
62
62
|
/**
|
|
63
63
|
* Controls line height through foundation leading tokens.
|
|
64
64
|
* Omit when nested in Text so line-height inherits the outer Text.
|
|
65
65
|
*
|
|
66
|
-
* @
|
|
66
|
+
* @defaultValue 'm' on root Text (CSS); inherit when nested and omitted
|
|
67
67
|
*/
|
|
68
68
|
lineHeight?: 'none' | 'xs' | 's' | 'm' | 'l';
|
|
69
69
|
/**
|
|
70
70
|
* Aligns text using logical alignment values.
|
|
71
|
+
* Omit so `text-align` inherits from the parent.
|
|
71
72
|
*
|
|
72
|
-
* @
|
|
73
|
+
* @defaultValue Inherits parent `text-align`.
|
|
73
74
|
*/
|
|
74
75
|
align?: React.CSSProperties['textAlign'];
|
|
75
76
|
/**
|
|
76
77
|
* Constrains the maximum inline size of the rendered text block.
|
|
77
78
|
*
|
|
78
|
-
* @
|
|
79
|
+
* @defaultValue No max width constraint.
|
|
79
80
|
*/
|
|
80
81
|
maxWidth?: string;
|
|
81
82
|
/**
|
|
82
83
|
* Controls white-space preservation and wrapping behavior.
|
|
83
84
|
*
|
|
84
|
-
* @
|
|
85
|
+
* @defaultValue 'normal'
|
|
85
86
|
*/
|
|
86
87
|
whiteSpace?: React.CSSProperties['whiteSpace'];
|
|
87
88
|
/**
|
|
88
89
|
* Sets letter-spacing on the rendered copy. Prefer this prop over CSS
|
|
89
90
|
* `letter-spacing` on the same Text root.
|
|
90
91
|
*
|
|
91
|
-
* @
|
|
92
|
+
* @defaultValue No letter-spacing override.
|
|
92
93
|
*/
|
|
93
94
|
tracking?: React.CSSProperties['letterSpacing'];
|
|
94
95
|
/**
|
|
95
96
|
* Applies `text-transform` on the rendered copy. Prefer this prop over CSS
|
|
96
97
|
* `text-transform` on the same Text root.
|
|
97
98
|
*
|
|
98
|
-
* @
|
|
99
|
+
* @defaultValue No text-transform override.
|
|
99
100
|
*/
|
|
100
101
|
transform?: React.CSSProperties['textTransform'];
|
|
101
102
|
/**
|
|
102
103
|
* Enables balanced wrapping for block-like copy.
|
|
103
104
|
*
|
|
104
|
-
* @
|
|
105
|
+
* @defaultValue false
|
|
105
106
|
*/
|
|
106
107
|
balanced?: boolean;
|
|
107
108
|
/**
|
|
108
109
|
* Enables text selection on the rendered copy.
|
|
109
110
|
*
|
|
110
|
-
* @
|
|
111
|
+
* @defaultValue true
|
|
111
112
|
*/
|
|
112
113
|
selection?: boolean;
|
|
113
114
|
/**
|
|
114
115
|
* Sets inline padding using one token for both sides or a `[start, end]` tuple.
|
|
115
116
|
*
|
|
116
|
-
* @
|
|
117
|
+
* @defaultValue No inline padding.
|
|
117
118
|
*/
|
|
118
119
|
hPadding?: TextAxisPadding;
|
|
119
120
|
/**
|
|
120
121
|
* Sets block padding using one token for both sides or a `[start, end]` tuple.
|
|
121
122
|
*
|
|
122
|
-
* @
|
|
123
|
+
* @defaultValue No block padding.
|
|
123
124
|
*/
|
|
124
125
|
vPadding?: TextAxisPadding;
|
|
125
126
|
/**
|
|
126
127
|
* Trims text box whitespace at the chosen edge when the browser supports `text-box`.
|
|
127
128
|
* Pass `false` to disable text-box trim.
|
|
128
129
|
*
|
|
129
|
-
* @
|
|
130
|
+
* @defaultValue 'both'
|
|
130
131
|
*/
|
|
131
132
|
trim?: 'start' | 'end' | 'both' | false;
|
|
132
133
|
/**
|
|
133
134
|
* Selects the `text-box` trim basis when `trim` is active.
|
|
134
135
|
*
|
|
135
|
-
* @
|
|
136
|
+
* @defaultValue 'cap alphabetic'
|
|
136
137
|
*/
|
|
137
138
|
trimType?: string;
|
|
138
139
|
/**
|
|
139
140
|
* Overrides font width as a percentage (100 = normal); maps to `font-stretch` and `wdth`.
|
|
140
141
|
*
|
|
141
|
-
* @
|
|
142
|
+
* @defaultValue No width override.
|
|
142
143
|
*/
|
|
143
144
|
fontWidth?: number;
|
|
144
145
|
/**
|
|
145
146
|
* Overrides the optical size (`opsz`) axis on variable fonts; static fonts keep `font-optical-sizing: auto`.
|
|
146
147
|
*
|
|
147
|
-
* @
|
|
148
|
+
* @defaultValue No optical size override.
|
|
148
149
|
*/
|
|
149
150
|
opticalSize?: number;
|
|
150
151
|
/**
|
|
@@ -152,7 +153,7 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
|
|
|
152
153
|
* Default locks at this size’s `--font-scale-body-*` token (UI chrome stays stable).
|
|
153
154
|
* Pass `true` for fluid page/body copy. Theme `--effect-fluid-typography: initial` still locks all Text globally.
|
|
154
155
|
*
|
|
155
|
-
* @
|
|
156
|
+
* @defaultValue false
|
|
156
157
|
*/
|
|
157
158
|
fluid?: boolean;
|
|
158
159
|
};
|
|
@@ -4,10 +4,11 @@ import { resolveAxisPadding } from "../../core/styles/resolve-axis-padding.js";
|
|
|
4
4
|
import text_module_default from "./text.module.js";
|
|
5
5
|
import { useRender } from "@base-ui/react/use-render";
|
|
6
6
|
//#region src/components/text/text.tsx
|
|
7
|
-
var Text = ({ align
|
|
7
|
+
var Text = ({ align, balanced = false, selection = true, className, color, family = "body", fluid = false, fontWidth, hPadding, lineHeight, maxWidth, opticalSize, ref, render, size, style, tone, tracking, transform, trim = "both", trimType = "cap alphabetic", vPadding, weight = "regular", whiteSpace = "normal", ...otherProps }) => {
|
|
8
|
+
const hasAlign = align !== void 0;
|
|
8
9
|
const hasPadding = Boolean(hPadding || vPadding);
|
|
9
10
|
const dynamicStyle = {
|
|
10
|
-
"--vui-text-align": align,
|
|
11
|
+
...hasAlign && { "--vui-text-align": align },
|
|
11
12
|
"--vui-text-max-width": maxWidth ?? "none",
|
|
12
13
|
"--vui-text-literal-color": color,
|
|
13
14
|
"--vui-text-white-space": whiteSpace,
|
|
@@ -36,6 +37,7 @@ var Text = ({ align = "start", balanced = false, selection = true, className, co
|
|
|
36
37
|
"data-text-balanced": balanced ? "true" : "false",
|
|
37
38
|
"data-text-selection": selection ? "true" : "false",
|
|
38
39
|
"data-text-fluid": fluid ? "true" : "false",
|
|
40
|
+
"data-text-has-align": hasAlign ? "true" : "false",
|
|
39
41
|
"data-text-has-padding": hasPadding ? "true" : "false",
|
|
40
42
|
"data-text-has-literal-color": color ? "true" : "false",
|
|
41
43
|
className: clsx(text_module_default.Text, className),
|
|
@@ -8,19 +8,19 @@ import type * as React from 'react';
|
|
|
8
8
|
* `rows`, and event handlers on `Field.Control` (`render={<textarea />}`), plus optional
|
|
9
9
|
* `label`, `description`, and `error` copy rendered with `Text` inside a `Stack` field layout.
|
|
10
10
|
*
|
|
11
|
-
* @
|
|
11
|
+
* @defaultValue Base UI `Field.Root` pass-through props keep upstream defaults.
|
|
12
12
|
*/
|
|
13
13
|
export type TextareaProps = React.ComponentPropsWithRef<'textarea'> & Omit<FieldRoot.Props, 'ref'> & {
|
|
14
14
|
/**
|
|
15
15
|
* Visible label rendered with shared internal `FieldLabel`.
|
|
16
16
|
*
|
|
17
|
-
* @
|
|
17
|
+
* @defaultValue No label is rendered.
|
|
18
18
|
*/
|
|
19
19
|
label?: React.ReactNode;
|
|
20
20
|
/**
|
|
21
21
|
* Helper copy rendered with `Field.Description` and `Text` while the field is valid.
|
|
22
22
|
*
|
|
23
|
-
* @
|
|
23
|
+
* @defaultValue No description is rendered.
|
|
24
24
|
*/
|
|
25
25
|
description?: React.ReactNode;
|
|
26
26
|
/**
|
|
@@ -28,7 +28,7 @@ export type TextareaProps = React.ComponentPropsWithRef<'textarea'> & Omit<Field
|
|
|
28
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
|
+
* @defaultValue No static error copy is rendered.
|
|
32
32
|
*/
|
|
33
33
|
error?: React.ReactNode;
|
|
34
34
|
/**
|
|
@@ -36,14 +36,14 @@ export type TextareaProps = React.ComponentPropsWithRef<'textarea'> & Omit<Field
|
|
|
36
36
|
* (`none`); accepts any valid `CSSProperties['resize']` value such as `"vertical"`, `"horizontal"`,
|
|
37
37
|
* or `"both"`.
|
|
38
38
|
*
|
|
39
|
-
* @
|
|
39
|
+
* @defaultValue undefined (no resize)
|
|
40
40
|
*/
|
|
41
41
|
resize?: React.CSSProperties['resize'];
|
|
42
42
|
/**
|
|
43
43
|
* When `true`, sets `field-sizing: content` so the control grows with its value.
|
|
44
44
|
* Still respects `min-block-size` and `resize`. Omitted / `false` keeps the browser fixed default.
|
|
45
45
|
*
|
|
46
|
-
* @
|
|
46
|
+
* @defaultValue undefined (browser fixed)
|
|
47
47
|
*/
|
|
48
48
|
fitContent?: BasicInputProps['fitContent'];
|
|
49
49
|
};
|
|
@@ -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-2xl);--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-m)
|
|
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__ControlOnly_22bXm,.viraui__textfield-module__Textfield_o-70A{--vui-textfield-input-height:var(--space-2xl);--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-m)}.viraui__textfield-module__Textfield_o-70A{--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:round(to-zero,var(--vui-textfield-input-height),2px);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),&:has(.viraui__textfield-module__CustomBasicInput_oHgtd:focus-visible),&:not(.viraui__textfield-module__ControlOnly_22bXm):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-xs)}&:has(.viraui__textfield-module__Addon_kK1ef[data-position=end])>.viraui__textfield-module__CustomBasicInput_oHgtd{padding-inline-end:var(--space-xs)}}.viraui__textfield-module__ControlOnly_22bXm{inline-size:max-content;min-inline-size:0}.viraui__textfield-module__Addon_kK1ef{min-inline-size:var(--space-xl)}.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;border-radius:inherit;&:not(:-webkit-autofill){box-shadow:none}&:focus,&:focus-visible{outline:none}}}
|
|
@@ -6,22 +6,22 @@ import type * as React from 'react';
|
|
|
6
6
|
* Public Textfield props.
|
|
7
7
|
*
|
|
8
8
|
* Includes Base UI input props such as `value`, `defaultValue`, `placeholder`, `disabled`,
|
|
9
|
-
* and event handlers, plus optional `label`, `description`, and `error` copy rendered with
|
|
10
|
-
* `Text` inside a `Stack` field layout.
|
|
9
|
+
* `size`, and event handlers, plus optional `label`, `description`, and `error` copy rendered with
|
|
10
|
+
* `Text` inside a `Stack` field layout. `controlOnly` skips Field chrome for compose inside another Field.
|
|
11
11
|
*
|
|
12
|
-
* @
|
|
12
|
+
* @defaultValue Base UI pass-through props keep upstream defaults.
|
|
13
13
|
*/
|
|
14
|
-
export type TextfieldProps = PrimitiveInput.Props & FieldRoot.Props & {
|
|
14
|
+
export type TextfieldProps = PrimitiveInput.Props & Omit<FieldRoot.Props, 'render' | keyof PrimitiveInput.Props> & {
|
|
15
15
|
/**
|
|
16
16
|
* Visible label rendered with shared internal `FieldLabel`.
|
|
17
17
|
*
|
|
18
|
-
* @
|
|
18
|
+
* @defaultValue No label is rendered.
|
|
19
19
|
*/
|
|
20
20
|
label?: React.ReactNode;
|
|
21
21
|
/**
|
|
22
22
|
* Helper copy rendered with `Field.Description` and `Text` while the field is valid.
|
|
23
23
|
*
|
|
24
|
-
* @
|
|
24
|
+
* @defaultValue No description is rendered.
|
|
25
25
|
*/
|
|
26
26
|
description?: React.ReactNode;
|
|
27
27
|
/**
|
|
@@ -29,34 +29,42 @@ export type TextfieldProps = PrimitiveInput.Props & FieldRoot.Props & {
|
|
|
29
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
|
+
* @defaultValue No static error copy is rendered.
|
|
33
33
|
*/
|
|
34
34
|
error?: React.ReactNode;
|
|
35
35
|
/**
|
|
36
36
|
* Leading decoration (prefix text, icon). Not a second field control.
|
|
37
37
|
*
|
|
38
|
-
* @
|
|
38
|
+
* @defaultValue No start addon is rendered.
|
|
39
39
|
*/
|
|
40
40
|
startAddon?: React.ReactNode;
|
|
41
41
|
/**
|
|
42
42
|
* Trailing decoration (icon, button). Buttons must use `type="button"`.
|
|
43
43
|
*
|
|
44
|
-
* @
|
|
44
|
+
* @defaultValue No end addon is rendered.
|
|
45
45
|
*/
|
|
46
46
|
endAddon?: React.ReactNode;
|
|
47
47
|
/**
|
|
48
48
|
* When `true`, sets `field-sizing: content` so the control grows inline with its value.
|
|
49
49
|
* Block chrome stays `var(--vui-textfield-input-height)`. Omitted / `false` keeps the browser fixed default.
|
|
50
50
|
*
|
|
51
|
-
* @
|
|
51
|
+
* @defaultValue undefined (browser fixed)
|
|
52
52
|
*/
|
|
53
53
|
fitContent?: BasicInputProps['fitContent'];
|
|
54
54
|
/**
|
|
55
55
|
* When `true`, root and control group take `inline-size: 100%`.
|
|
56
56
|
* Prefer this prop over CSS `width: 100%` / `w-full` on the Textfield root.
|
|
57
57
|
*
|
|
58
|
-
* @
|
|
58
|
+
* @defaultValue false
|
|
59
59
|
*/
|
|
60
60
|
fullWidth?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* When `true`, skip `Field.Root` / label / helper. Control group + input only.
|
|
63
|
+
* Use inside another Field (OTP slots). Native `size` and `fitContent` still apply.
|
|
64
|
+
* `label`, `description`, and `error` are ignored.
|
|
65
|
+
*
|
|
66
|
+
* @defaultValue false
|
|
67
|
+
*/
|
|
68
|
+
controlOnly?: boolean;
|
|
61
69
|
};
|
|
62
70
|
export declare const Textfield: React.FC<TextfieldProps>;
|