@viraui/react 2026.4.1 → 2026.5.0
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/accordion/accordion-item.js +8 -8
- package/dist/components/accordion/accordion.css +1 -1
- package/dist/components/annotate/annotate.css +1 -1
- package/dist/components/annotate/annotate.d.ts +2 -2
- package/dist/components/autocomplete/autocomplete-group.js +6 -6
- package/dist/components/autocomplete/autocomplete-item.js +5 -5
- package/dist/components/autocomplete/autocomplete.css +1 -1
- package/dist/components/autocomplete/autocomplete.js +6 -6
- package/dist/components/avatar/avatar.css +1 -1
- package/dist/components/avatar/avatar.d.ts +2 -2
- package/dist/components/avatar/avatar.js +5 -5
- package/dist/components/avatar-group/avatar-group.css +1 -1
- package/dist/components/avatar-group/avatar-group.d.ts +1 -1
- package/dist/components/avatar-group/avatar-group.js +2 -2
- package/dist/components/basic-input/basic-input.css +1 -1
- package/dist/components/basic-input/field-helper-copy.js +3 -3
- package/dist/components/basic-input/field-label.js +2 -2
- package/dist/components/basic-input/input-control-group.js +2 -2
- package/dist/components/beam/beam.css +1 -1
- package/dist/components/beam/beam.d.ts +3 -3
- package/dist/components/beam/beam.js +1 -1
- package/dist/components/button/button-link.d.ts +1 -1
- package/dist/components/button/button-link.js +2 -2
- package/dist/components/button/button.css +1 -3
- package/dist/components/button/button.d.ts +2 -2
- package/dist/components/button/button.js +2 -2
- package/dist/components/checkbox/checkbox-group.js +1 -1
- package/dist/components/checkbox/checkbox.css +1 -1
- package/dist/components/checkbox/checkbox.d.ts +2 -2
- package/dist/components/checkbox/checkbox.js +4 -4
- package/dist/components/chip/chip.css +1 -1
- package/dist/components/chip/chip.js +3 -3
- package/dist/components/dialog/dialog-sheet.js +8 -8
- package/dist/components/dialog/dialog.css +2 -2
- package/dist/components/fieldset/fieldset.js +2 -2
- package/dist/components/icon-button/icon-button-link.d.ts +1 -1
- package/dist/components/icon-button/icon-button-link.js +1 -1
- package/dist/components/icon-button/icon-button.d.ts +1 -1
- package/dist/components/icon-button/icon-button.js +1 -1
- package/dist/components/linear-progress/linear-progress.css +1 -1
- package/dist/components/linear-progress/linear-progress.js +5 -5
- package/dist/components/masonry/masonry.css +1 -1
- package/dist/components/masonry/masonry.d.ts +1 -1
- package/dist/components/masonry/masonry.js +2 -2
- package/dist/components/menu/menu-checkbox-item.d.ts +1 -1
- package/dist/components/menu/menu-group.js +6 -6
- package/dist/components/menu/menu-item-row.js +7 -7
- package/dist/components/menu/menu-item.d.ts +1 -1
- package/dist/components/menu/menu-link-item.d.ts +1 -1
- package/dist/components/menu/menu-popup.js +3 -3
- package/dist/components/menu/menu-radio-group.js +6 -6
- package/dist/components/menu/menu-radio-item.d.ts +1 -1
- package/dist/components/menu/menu-separator.js +2 -2
- package/dist/components/menu/menu.css +1 -1
- package/dist/components/meter/meter.css +1 -1
- package/dist/components/meter/meter.js +5 -5
- package/dist/components/popover/popover-sheet.js +9 -9
- package/dist/components/popover/popover.css +1 -1
- package/dist/components/radio/radio-group.js +1 -1
- package/dist/components/radio/radio.css +1 -1
- package/dist/components/radio/radio.d.ts +2 -2
- package/dist/components/radio/radio.js +4 -4
- package/dist/components/select/select-group.js +6 -6
- package/dist/components/select/select-option.js +6 -6
- package/dist/components/select/select-separator.js +2 -2
- package/dist/components/select/select.css +1 -1
- package/dist/components/select/select.js +10 -10
- package/dist/components/separator/separator.d.ts +2 -2
- package/dist/components/separator/separator.js +4 -4
- package/dist/components/shimmer/shimmer.css +1 -1
- package/dist/components/shimmer/shimmer.d.ts +1 -1
- package/dist/components/skeleton/skeleton-overlay.d.ts +1 -1
- package/dist/components/skeleton/skeleton-overlay.js +3 -3
- package/dist/components/skeleton/skeleton.css +1 -1
- package/dist/components/skeleton/skeleton.d.ts +1 -1
- package/dist/components/skeleton/skeleton.js +3 -3
- package/dist/components/slider/slider.css +1 -1
- package/dist/components/slider/slider.js +5 -5
- package/dist/components/spinner/spinner.css +1 -1
- package/dist/components/spinner/spinner.d.ts +2 -2
- package/dist/components/spinner/spinner.js +1 -1
- package/dist/components/surface/surface-radius-context.js +2 -2
- package/dist/components/switch/switch.css +1 -1
- package/dist/components/switch/switch.d.ts +2 -2
- package/dist/components/switch/switch.js +5 -5
- package/dist/components/tabs/tabs-list.js +2 -2
- package/dist/components/tabs/tabs.css +1 -1
- package/dist/components/text/text.css +2 -2
- package/dist/components/text/text.d.ts +4 -4
- package/dist/components/text/text.js +1 -1
- package/dist/components/textarea/textarea.css +1 -1
- package/dist/components/textarea/textarea.js +1 -1
- package/dist/components/textfield/textfield.css +1 -1
- package/dist/components/textfield/textfield.js +1 -1
- package/dist/components/title/title.css +2 -2
- package/dist/components/title/title.d.ts +2 -2
- package/dist/components/title/title.js +1 -1
- package/dist/components/toast/toast-banner.js +8 -8
- package/dist/components/toast/toast.css +2 -2
- package/dist/components/toggle-group/toggle-group.js +2 -2
- package/dist/components/tooltip/tooltip-content.js +3 -3
- package/dist/components/tooltip/tooltip.css +1 -1
- package/dist/core/theme/full-radius-style.d.ts +6 -0
- package/dist/core/theme/full-radius-style.js +13 -0
- package/dist/preflight.css +1 -1
- package/dist/specs/components/avatar/props.xml +1 -1
- package/dist/specs/components/avatar/usage.xml +1 -1
- package/dist/specs/components/button/props.xml +2 -2
- package/dist/specs/components/icon-button/props.xml +2 -2
- package/dist/specs/components/menu/props.xml +4 -4
- package/dist/specs/components/text/props.xml +3 -3
- package/dist/specs/components/text/usage.xml +1 -1
- package/dist/specs/components/title/props.xml +3 -3
- package/dist/specs/components/title/usage.xml +1 -1
- package/dist/specs/components/toggle-button/props.xml +1 -1
- package/dist/specs/foundation/modules.xml +5 -2
- package/dist/specs/foundation/theme-topics.xml +8 -4
- package/dist/specs/foundation/toggles.xml +5 -2
- package/dist/specs/index.xml +1 -1
- package/dist/specs/patterns/settings-row.xml +1 -1
- package/package.json +3 -3
- package/dist/core/theme/infinite-radius-style.d.ts +0 -6
- package/dist/core/theme/infinite-radius-style.js +0 -13
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type FullCornerShapeStyle = {
|
|
2
|
+
'--__corner-shape': 'round';
|
|
3
|
+
};
|
|
4
|
+
export declare const isFullRadiusValue: (value: string | number | null | undefined) => boolean;
|
|
5
|
+
/** Sets `--__corner-shape: round` when any value is the full radius token or CSS. */
|
|
6
|
+
export declare const fullCornerShapeStyle: (...values: Array<string | number | null | undefined>) => FullCornerShapeStyle | undefined;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/core/theme/full-radius-style.ts
|
|
2
|
+
var FULL_RADIUS_MARKER = /(?:--radius-full|\b1e5px\b)/;
|
|
3
|
+
var isFullRadiusValue = (value) => {
|
|
4
|
+
if (value === "full") return true;
|
|
5
|
+
if (typeof value !== "string" || value.length === 0) return false;
|
|
6
|
+
return FULL_RADIUS_MARKER.test(value);
|
|
7
|
+
};
|
|
8
|
+
/** Sets `--__corner-shape: round` when any value is the full radius token or CSS. */
|
|
9
|
+
var fullCornerShapeStyle = (...values) => {
|
|
10
|
+
if (values.some(isFullRadiusValue)) return { "--__corner-shape": "round" };
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { fullCornerShapeStyle, isFullRadiusValue };
|
package/dist/preflight.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.preflight{@property --scrollbar-thumb{syntax:"<color>";initial-value:#0000;inherits:true}@property --scrollbar-track{syntax:"<color>";initial-value:#0000;inherits:true}@property --outline-offset{syntax:"<length>";initial-value:2px;inherits:true}@property --outline-color{syntax:"<color>";initial-value:currentcolor;inherits:true}@property --outline{syntax:"*";initial-value:2px solid currentcolor;inherits:true}@property --is-light-mode{syntax:"<color>";initial-value:#000;inherits:true}@property --vira-flex-grow{syntax:"<number>";initial-value:1;inherits:false}@property --vira-flex-shrink{syntax:"<number>";initial-value:1;inherits:false}@property --__corner-shape{syntax:"*";inherits:false}}@layer viraui.preflight{html{--scrollbar-thumb:oklab(from var(--global-contrast) l a b / 0.3);--scrollbar-track:#0000;--outline-offset:2px;--outline-color:var(--global-outline);--outline:2px solid var(--outline-color);--is-light-mode:contrast-color(var(--global-background));font-size:var(--font-root-size);box-sizing:border-box;line-height:1.5;background-color:var(--global-background);color:var(--global-foreground);container:root/normal;scroll-behavior:smooth;@media (prefers-reduced-motion:reduce){scroll-behavior:auto}}*,:after,:before{margin:0;box-sizing:inherit;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);@container root not style(--effect-corner-shape: initial){corner-shape:var(--__corner-shape,var(--corner-shape))}@media (prefers-reduced-motion:reduce){animation:none!important;transition:none!important}}:focus-visible{outline:var(--outline);outline-offset:var(--outline-offset)}body{color:var(--global-foreground);margin:0;font-size:var(--font-scale-body-medium);font-optical-sizing:auto;font-family:var(--font-family-body),system-ui,sans-serif;font-variation-settings:"wght" 400;font-variant-numeric:tabular-nums;@container root not style(--effect-holofoil: initial){&:after{content:"";position:fixed;inset:0;z-index:999;background-color:#99ffd8;pointer-events:none;mix-blend-mode:multiply;contain:strict;isolation:isolate;opacity:25%;background-image:radial-gradient(at 79% 56%,#70ade6 0,#0000 50%),radial-gradient(at 61% 80%,#ee909e 0,#0000 50%),radial-gradient(at 0 63%,#fdbc68 0,#0000 50%),radial-gradient(at 6% 50%,#e5cb8a 0,#0000 50%),radial-gradient(at 23% 10%,#e5db8f 0,#0000 50%),radial-gradient(at 36% 91%,#a0eea8 0,#0000 50%),radial-gradient(at 2% 80%,#e3a47d 0,#0000 50%);@container root style(--is-light-mode: white){mix-blend-mode:color;opacity:15%}}}}::selection{background-color:var(--global-primary);color:contrast-color(var(--global-primary));text-shadow:none}img{display:block;inline-size:100%;max-inline-size:100%}svg{display:inline-flex;vertical-align:middle;&:not([fill]){fill:currentcolor}}ol ul,ul ol{font-size:medium}table{border-spacing:0;inline-size:100%;border-collapse:collapse}table[data-layout-fixed]{table-layout:fixed}table thead{box-shadow:inset 0 -3px 0 var(--base-2)}table[data-table-separators] tr+tr{border-top:1px solid var(--base-2)}table th{white-space:nowrap;font-variation-settings:"wght" 800}table :is(td,th){border:none;text-align:left;font-size:medium;padding:calc(var(--space-x-small) + var(--space-2x-small)) var(--space-small)}button,fieldset{padding:0;margin:0;border:0}button{appearance:none;background:none;font-size:inherit;font-family:inherit;display:inline-flex;cursor:pointer;color:inherit}}@layer viraui.preflight{@container root not style(--effect-shadows: initial){[data-elevation]{--shadow-direction:1;--shadow-opacity-factor:0.16;--extra-shadow:0 0 0 1px #0000;--shadow-color:oklch(0% 0 0);transition-property:box-shadow;transition-duration:var(--elevation-transition-duration,.16s);transition-timing-function:var(--elevation-transition-easing,ease)}[data-elevation]:where([data-elevation-direction=bottom],[data-elevation-direction=right]){--shadow-direction:1}[data-elevation]:where([data-elevation-direction=top],[data-elevation-direction=left]){--shadow-direction:-1}[data-elevation-hover="0"]:hover,[data-elevation="0"]{--y1:0px;--x1:0px;box-shadow:calc(var(--x1) * var(--shadow-direction)) calc(var(--y1) * var(--shadow-direction)) 0 oklch(from var(--shadow-color) l c h/var(--shadow-opacity-factor)),0 0 0 color-mix(in oklch,var(--shadow-color),#0000 calc(94% - var(--shadow-opacity-factor))),0 0 0 oklch(from var(--shadow-color) l c h/var(--shadow-opacity-factor)),var(--extra-shadow)}[data-elevation-hover="1"]:hover,[data-elevation-hover="2"]:hover,[data-elevation-hover="3"]:hover,[data-elevation-hover="4"]:hover,[data-elevation="1"],[data-elevation="2"],[data-elevation="3"],[data-elevation="4"]{box-shadow:calc(var(--x1) * var(--shadow-direction)) calc(var(--y1) * var(--shadow-direction)) var(--shadow-blur-1) oklab(from var(--shadow-color) l a b/.1),calc(var(--x2) * var(--shadow-direction)) calc(var(--y2) * var(--shadow-direction)) var(--shadow-blur-2) oklab(from var(--shadow-color) l a b/.09),calc(var(--x3) * var(--shadow-direction)) calc(var(--y3) * var(--shadow-direction)) var(--shadow-blur-3) oklab(from var(--shadow-color) l a b/.05),calc(var(--x4) * var(--shadow-direction)) calc(var(--y4) * var(--shadow-direction)) var(--shadow-blur-4) oklab(from var(--shadow-color) l a b/.01),var(--extra-shadow)}[data-elevation-hover="1"]:hover,[data-elevation="1"]{--y1:0px;--y2:2px;--y3:4px;--y4:7px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--shadow-blur-1:1px;--shadow-blur-2:2px;--shadow-blur-3:2px;--shadow-blur-4:3px}[data-elevation-hover="1"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="1"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--x1:0px;--x2:2px;--x3:4px;--x4:7px}[data-elevation-hover="2"]:hover,[data-elevation="2"]{--y1:1px;--y2:5px;--y3:11px;--y4:19px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--shadow-blur-1:3px;--shadow-blur-2:5px;--shadow-blur-3:6px;--shadow-blur-4:8px}[data-elevation-hover="2"]:where([data-elevation-direction=top],[data-elevation-direction=left]):hover,[data-elevation="2"]:where([data-elevation-direction=top],[data-elevation-direction=left]){--shadow-blur-3:7px}[data-elevation-hover="2"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="2"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--x1:1px;--x2:5px;--x3:11px;--x4:19px}[data-elevation-hover="2"]:where([data-elevation-direction=right]):hover,[data-elevation="2"]:where([data-elevation-direction=right]){--shadow-blur-3:6px}[data-elevation-hover="3"]:hover,[data-elevation="3"]{--y1:2px;--y2:7px;--y3:16px;--y4:29px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--shadow-blur-1:4px;--shadow-blur-2:7px;--shadow-blur-3:10px;--shadow-blur-4:12px}[data-elevation-hover="3"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="3"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--x1:2px;--x2:7px;--x3:16px;--x4:29px}[data-elevation-hover="3"]:where([data-elevation-direction=right]):hover,[data-elevation="3"]:where([data-elevation-direction=right]){--x2:10px;--x3:22px;--x4:39px;--shadow-blur-1:5px;--shadow-blur-2:10px;--shadow-blur-3:13px;--shadow-blur-4:15px}[data-elevation-hover="4"]:hover,[data-elevation="4"]{--y1:4px;--y2:14px;--y3:33px;--y4:58px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--shadow-blur-1:8px;--shadow-blur-2:14px;--shadow-blur-3:20px;--shadow-blur-4:23px}[data-elevation-hover="4"]:where([data-elevation-direction=top]):hover,[data-elevation="4"]:where([data-elevation-direction=top]){--y2:15px;--shadow-blur-2:15px}[data-elevation-hover="4"]:where([data-elevation-direction=left]):hover,[data-elevation="4"]:where([data-elevation-direction=left]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--x1:4px;--x2:15px;--x3:33px;--x4:58px;--shadow-blur-2:15px}[data-elevation-hover="4"]:where([data-elevation-direction=right]):hover,[data-elevation="4"]:where([data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--x1:4px;--x2:14px;--x3:33px;--x4:58px}}}@layer viraui.preflight{[data-grow=true]{--vira-flex-grow:1;flex-grow:1}[data-grow=false]{--vira-flex-grow:0;flex-grow:0}[data-shrink=true]{--vira-flex-shrink:1;flex-shrink:1}[data-shrink=false]{--vira-flex-shrink:0;flex-shrink:0}}@layer viraui.preflight{:where(p){line-height:1.5;min-block-size:.01vh;font-size:var(--font-scale-body-medium)}small{font-size:.7em}b,strong{font-variation-settings:"wght" 700}:where(a:any-link):not([data-no-link-style]){text-decoration:none;color:var(--global-interactive-text);word-break:break-word;&:not([class]){background:linear-gradient(currentcolor,currentcolor) no-repeat 0 100%;background-size:0 1px;transition:background-size var(--duration-fast) var(--easing-entrance);&:focus,&:hover{background-size:100% 1px}}}del{padding:0 .4em;margin:0 .2em;background-color:oklab(from var(--highlight-red) l a b/12%);color:var(--highlight-red);box-shadow:0 0 0 1px oklab(from var(--highlight-red) l a b/50%);border-radius:var(--radius-small)}ins{background-color:oklab(from var(--highlight-green) l a b/15%);color:var(--highlight-green);box-shadow:0 0 0 1px oklab(from var(--highlight-green) l a b/50%)}ins,mark{padding:0 .4em;margin:0 .2em;text-decoration:none;border-radius:var(--radius-small)}mark{background-color:oklab(from var(--highlight-yellow) l a b/15%);color:var(--highlight-yellow);box-shadow:0 0 0 1px oklab(from var(--highlight-yellow) l a b/50%)}address{font-style:normal;line-height:inherit}dt{font-variation-settings:"wght" 600}dd{margin:0;padding:0}ul{font-size:medium;padding-left:1rem;& li::marker{font-size:inherit;text-align:right;font-variation-settings:"wght" 400;min-inline-size:var(--space-x-large);color:oklab(from currentColor l a b/80%)}}ol{font-size:medium;& li::marker{font-size:inherit;font-variation-settings:"wght" 400;min-inline-size:var(--space-x-large);font-variant-numeric:tabular-nums;white-space:nowrap;color:oklab(from currentColor l a b/80%)}}kbd{padding:.2em .4em;border-radius:var(--radius-small);font-variation-settings:"wght" 600;box-shadow:var(--global-contrast);background:var(--global-contrast)}abbr{text-decoration:underline dashed var(--global-primary)}label,legend{font-size:inherit}code{font-size:1em;font-family:var(--font-family-mono);&:not(:where(pre &)){background-color:var(--global-contrast);border-radius:var(--radius-small);box-shadow:var(--global-contrast);padding:.2em .4em}}pre code{box-shadow:none}s{text-decoration:line-through;color:var(--global-disabled-foreground);text-decoration-color:oklab(from var(--global-foreground) l a b/50%)}:root{color-scheme:light dark}[data-mode=dark]{--is-light-mode:#fff;color:var(--global-foreground);color-scheme:dark}[data-mode=light]{--is-light-mode:#000;color:var(--global-foreground);color-scheme:light}}@layer viraui.preflight{[data-mode=inverted]{color:var(--global-foreground);@container root style(--is-light-mode: black){color-scheme:dark}@container root style(--is-light-mode: white){color-scheme:light}}}@layer viraui.preflight{@container root not style(--effect-vibrancy: initial){[data-vibrant]{backdrop-filter:brightness(var(--vibrancy-brightness)) blur(calc(var(--vibrancy-blur) * 1px)) saturate(150%);@container root style(--is-light-mode: black){backdrop-filter:brightness(100%) blur(calc(var(--vibrancy-blur) * 1px)) saturate(150%)}}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.preflight{@property --scrollbar-thumb{syntax:"<color>";initial-value:#0000;inherits:true}@property --scrollbar-track{syntax:"<color>";initial-value:#0000;inherits:true}@property --outline-offset{syntax:"<length>";initial-value:2px;inherits:true}@property --outline-color{syntax:"<color>";initial-value:currentcolor;inherits:true}@property --outline{syntax:"*";initial-value:2px solid currentcolor;inherits:true}@property --is-light-mode{syntax:"<color>";initial-value:#000;inherits:true}@property --vira-flex-grow{syntax:"<number>";initial-value:1;inherits:false}@property --vira-flex-shrink{syntax:"<number>";initial-value:1;inherits:false}@property --__corner-shape{syntax:"*";inherits:false}}@layer viraui.preflight{:root{--font-scale-body-xs:0.75rem;--font-scale-body-s:0.875rem;--font-scale-body-m:1rem;--font-scale-body-l:round(down, calc(1rem * pow(var(--font-body-typescale), 3)), 1px);--font-scale-body-xl:round(down, calc(1rem * pow(var(--font-body-typescale), 5)), 1px);--font-scale-h6:round(down, calc(1rem * pow(var(--font-heading-typescale), 1)), 1px);--font-scale-h5:round(down, calc(1rem * pow(var(--font-heading-typescale), 2)), 1px);--font-scale-h4:round(down, calc(1rem * pow(var(--font-heading-typescale), 3)), 1px);--font-scale-h3:round(down, calc(1rem * pow(var(--font-heading-typescale), 4)), 1px);--font-scale-h2:round(down, calc(1rem * pow(var(--font-heading-typescale), 5)), 1px);--font-scale-h1:round(down, calc(1rem * pow(var(--font-heading-typescale), 6)), 1px);--font-scale-display:round(down, calc(1rem * pow(var(--font-heading-typescale), 8)), 1px)}}@layer viraui.preflight{html{--scrollbar-thumb:oklab(from var(--global-contrast) l a b / 0.3);--scrollbar-track:#0000;--outline-offset:2px;--outline-color:var(--global-outline);--outline:2px solid var(--outline-color);--is-light-mode:contrast-color(var(--global-background));font-size:var(--font-root-size);box-sizing:border-box;line-height:1.5;background-color:var(--global-background);color:var(--global-foreground);container:root/normal;scroll-behavior:smooth;@media (prefers-reduced-motion:reduce){scroll-behavior:auto}}*,:after,:before{margin:0;box-sizing:inherit;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);@container root not style(--effect-corner-shape: initial){corner-shape:var(--__corner-shape,var(--corner-shape))}@media (prefers-reduced-motion:reduce){animation:none!important;transition:none!important}}:focus-visible{outline:var(--outline);outline-offset:var(--outline-offset)}body{color:var(--global-foreground);margin:0;font-size:var(--font-scale-body-m);font-optical-sizing:auto;font-family:var(--font-family-body),system-ui,sans-serif;font-variation-settings:"wght" 400;font-variant-numeric:tabular-nums;@container root not style(--effect-holofoil: initial){&:after{content:"";position:fixed;inset:0;z-index:999;background-color:#99ffd8;pointer-events:none;mix-blend-mode:multiply;contain:strict;isolation:isolate;opacity:25%;background-image:radial-gradient(at 79% 56%,#70ade6 0,#0000 50%),radial-gradient(at 61% 80%,#ee909e 0,#0000 50%),radial-gradient(at 0 63%,#fdbc68 0,#0000 50%),radial-gradient(at 6% 50%,#e5cb8a 0,#0000 50%),radial-gradient(at 23% 10%,#e5db8f 0,#0000 50%),radial-gradient(at 36% 91%,#a0eea8 0,#0000 50%),radial-gradient(at 2% 80%,#e3a47d 0,#0000 50%);@container root style(--is-light-mode: white){mix-blend-mode:color;opacity:15%}}}}::selection{background-color:var(--global-primary);color:contrast-color(var(--global-primary));text-shadow:none}img{display:block;inline-size:100%;max-inline-size:100%}svg{display:inline-flex;vertical-align:middle;&:not([fill]){fill:currentcolor}}ol ul,ul ol{font-size:medium}table{border-spacing:0;inline-size:100%;border-collapse:collapse}table[data-layout-fixed]{table-layout:fixed}table thead{box-shadow:inset 0 -3px 0 var(--base-2)}table[data-table-separators] tr+tr{border-top:1px solid var(--base-2)}table th{white-space:nowrap;font-variation-settings:"wght" 800}table :is(td,th){border:none;text-align:left;font-size:medium;padding:calc(var(--space-xs) + var(--space-2xs)) var(--space-s)}button,fieldset{padding:0;margin:0;border:0}button{appearance:none;background:none;font-size:inherit;font-family:inherit;display:inline-flex;cursor:pointer;color:inherit}}@layer viraui.preflight{@container root not style(--effect-shadows: initial){[data-elevation]{--shadow-direction:1;--shadow-opacity-factor:0.16;--extra-shadow:0 0 0 1px #0000;--shadow-color:oklch(0% 0 0);transition-property:box-shadow;transition-duration:var(--elevation-transition-duration,.16s);transition-timing-function:var(--elevation-transition-easing,ease)}[data-elevation]:where([data-elevation-direction=bottom],[data-elevation-direction=right]){--shadow-direction:1}[data-elevation]:where([data-elevation-direction=top],[data-elevation-direction=left]){--shadow-direction:-1}[data-elevation-hover="0"]:hover,[data-elevation="0"]{--y1:0px;--x1:0px;box-shadow:calc(var(--x1) * var(--shadow-direction)) calc(var(--y1) * var(--shadow-direction)) 0 oklch(from var(--shadow-color) l c h/var(--shadow-opacity-factor)),0 0 0 color-mix(in oklch,var(--shadow-color),#0000 calc(94% - var(--shadow-opacity-factor))),0 0 0 oklch(from var(--shadow-color) l c h/var(--shadow-opacity-factor)),var(--extra-shadow)}[data-elevation-hover="1"]:hover,[data-elevation-hover="2"]:hover,[data-elevation-hover="3"]:hover,[data-elevation-hover="4"]:hover,[data-elevation="1"],[data-elevation="2"],[data-elevation="3"],[data-elevation="4"]{box-shadow:calc(var(--x1) * var(--shadow-direction)) calc(var(--y1) * var(--shadow-direction)) var(--shadow-blur-1) oklab(from var(--shadow-color) l a b/.1),calc(var(--x2) * var(--shadow-direction)) calc(var(--y2) * var(--shadow-direction)) var(--shadow-blur-2) oklab(from var(--shadow-color) l a b/.08),calc(var(--x3) * var(--shadow-direction)) calc(var(--y3) * var(--shadow-direction)) var(--shadow-blur-3) oklab(from var(--shadow-color) l a b/.06),calc(var(--x4) * var(--shadow-direction)) calc(var(--y4) * var(--shadow-direction)) var(--shadow-blur-4) oklab(from var(--shadow-color) l a b/.04),calc(var(--x5) * var(--shadow-direction)) calc(var(--y5) * var(--shadow-direction)) var(--shadow-blur-5) oklab(from var(--shadow-color) l a b/.02),var(--extra-shadow)}[data-elevation-hover="1"]:hover,[data-elevation="1"]{--y1:0px;--y2:1px;--y3:1px;--y4:3px;--y5:4px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--x5:0px;--shadow-blur-1:0px;--shadow-blur-2:1px;--shadow-blur-3:1px;--shadow-blur-4:3px;--shadow-blur-5:4px}[data-elevation-hover="1"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="1"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--y5:0px;--x1:0px;--x2:1px;--x3:1px;--x4:3px;--x5:4px}[data-elevation-hover="2"]:hover,[data-elevation="2"]{--y1:0px;--y2:1px;--y3:3px;--y4:5px;--y5:8px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--x5:0px;--shadow-blur-1:0px;--shadow-blur-2:1px;--shadow-blur-3:3px;--shadow-blur-4:5px;--shadow-blur-5:8px}[data-elevation-hover="2"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="2"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--y5:0px;--x1:0px;--x2:1px;--x3:3px;--x4:5px;--x5:8px}[data-elevation-hover="3"]:hover,[data-elevation="3"]{--y1:1px;--y2:3px;--y3:6px;--y4:10px;--y5:16px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--x5:0px;--shadow-blur-1:1px;--shadow-blur-2:3px;--shadow-blur-3:6px;--shadow-blur-4:10px;--shadow-blur-5:16px}[data-elevation-hover="3"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="3"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--y5:0px;--x1:1px;--x2:3px;--x3:6px;--x4:10px;--x5:16px}[data-elevation-hover="4"]:hover,[data-elevation="4"]{--y1:1px;--y2:5px;--y3:12px;--y4:20px;--y5:32px;--x1:0px;--x2:0px;--x3:0px;--x4:0px;--x5:0px;--shadow-blur-1:1px;--shadow-blur-2:5px;--shadow-blur-3:12px;--shadow-blur-4:20px;--shadow-blur-5:32px}[data-elevation-hover="4"]:where([data-elevation-direction=left],[data-elevation-direction=right]):hover,[data-elevation="4"]:where([data-elevation-direction=left],[data-elevation-direction=right]){--y1:0px;--y2:0px;--y3:0px;--y4:0px;--y5:0px;--x1:1px;--x2:5px;--x3:12px;--x4:20px;--x5:32px}}}@layer viraui.preflight{[data-grow=true]{--vira-flex-grow:1;flex-grow:1}[data-grow=false]{--vira-flex-grow:0;flex-grow:0}[data-shrink=true]{--vira-flex-shrink:1;flex-shrink:1}[data-shrink=false]{--vira-flex-shrink:0;flex-shrink:0}}@layer viraui.preflight{:where(p){line-height:1.5;min-block-size:.01vh;font-size:var(--font-scale-body-m)}small{font-size:.7em}b,strong{font-variation-settings:"wght" 700}:where(a:any-link):not([data-no-link-style]){text-decoration:none;color:var(--global-interactive-text);word-break:break-word;&:not([class]){background:linear-gradient(currentcolor,currentcolor) no-repeat 0 100%;background-size:0 1px;transition:background-size var(--duration-fast) var(--easing-entrance);&:focus,&:hover{background-size:100% 1px}}}del{padding:0 .4em;margin:0 .2em;background-color:oklab(from var(--highlight-red) l a b/12%);color:var(--highlight-red);box-shadow:0 0 0 1px oklab(from var(--highlight-red) l a b/50%);border-radius:var(--radius-s)}ins{background-color:oklab(from var(--highlight-green) l a b/15%);color:var(--highlight-green);box-shadow:0 0 0 1px oklab(from var(--highlight-green) l a b/50%)}ins,mark{padding:0 .4em;margin:0 .2em;text-decoration:none;border-radius:var(--radius-s)}mark{background-color:oklab(from var(--highlight-yellow) l a b/15%);color:var(--highlight-yellow);box-shadow:0 0 0 1px oklab(from var(--highlight-yellow) l a b/50%)}address{font-style:normal;line-height:inherit}dt{font-variation-settings:"wght" 600}dd{margin:0;padding:0}ul{font-size:medium;padding-left:1rem;& li::marker{font-size:inherit;text-align:right;font-variation-settings:"wght" 400;min-inline-size:var(--space-xl);color:oklab(from currentColor l a b/80%)}}ol{font-size:medium;& li::marker{font-size:inherit;font-variation-settings:"wght" 400;min-inline-size:var(--space-xl);font-variant-numeric:tabular-nums;white-space:nowrap;color:oklab(from currentColor l a b/80%)}}kbd{padding:.2em .4em;border-radius:var(--radius-s);font-variation-settings:"wght" 600;box-shadow:var(--global-contrast);background:var(--global-contrast)}abbr{text-decoration:underline dashed var(--global-primary)}label,legend{font-size:inherit}code{font-size:1em;font-family:var(--font-family-mono);&:not(:where(pre &)){background-color:var(--global-contrast);border-radius:var(--radius-s);box-shadow:var(--global-contrast);padding:.2em .4em}}pre code{box-shadow:none}s{text-decoration:line-through;color:var(--global-disabled-foreground);text-decoration-color:oklab(from var(--global-foreground) l a b/50%)}:root{color-scheme:light dark}[data-mode=dark]{--is-light-mode:#fff;color:var(--global-foreground);color-scheme:dark}[data-mode=light]{--is-light-mode:#000;color:var(--global-foreground);color-scheme:light}}@layer viraui.preflight{[data-mode=inverted]{color:var(--global-foreground);@container root style(--is-light-mode: black){color-scheme:dark}@container root style(--is-light-mode: white){color-scheme:light}}}@layer viraui.preflight{@container root not style(--effect-vibrancy: initial){[data-vibrant]{backdrop-filter:brightness(var(--vibrancy-brightness)) blur(calc(var(--vibrancy-blur) * 1px)) saturate(150%);@container root style(--is-light-mode: black){backdrop-filter:brightness(100%) blur(calc(var(--vibrancy-blur) * 1px)) saturate(150%)}}}}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<props surface="avatar">
|
|
3
3
|
<when_to_use>
|
|
4
4
|
<item>Show a user or entity photo with text or image fallback</item>
|
|
5
|
-
<item>Display profile chips from
|
|
5
|
+
<item>Display profile chips from xs through large sizes</item>
|
|
6
6
|
</when_to_use>
|
|
7
7
|
<when_not_to_use>
|
|
8
8
|
<item>Interactive controls or navigation</item>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<usage surface="avatar">
|
|
3
3
|
<do>Show a user or entity photo with text or image fallback</do>
|
|
4
|
-
<do>Display profile chips from
|
|
4
|
+
<do>Display profile chips from xs through large sizes</do>
|
|
5
5
|
<dont>Relying on Avatar children for layout sizing</dont>
|
|
6
6
|
<dont>Omitting meaningful alt text when the image conveys identity</dont>
|
|
7
7
|
</usage>
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
<description>Horizontal padding inside the button.</description>
|
|
70
70
|
</css_var>
|
|
71
71
|
<css_var suffix="radius">
|
|
72
|
-
<description>Corner radius; pill sets
|
|
72
|
+
<description>Corner radius; pill sets full radius via data-pill.</description>
|
|
73
73
|
</css_var>
|
|
74
74
|
<css_var suffix="spinner-color">
|
|
75
75
|
<description>Loading spinner color on the root.</description>
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
<description>Horizontal padding inside the button. (button-link)</description>
|
|
94
94
|
</css_var>
|
|
95
95
|
<css_var suffix="radius">
|
|
96
|
-
<description>Corner radius; pill sets
|
|
96
|
+
<description>Corner radius; pill sets full radius via data-pill. (button-link)</description>
|
|
97
97
|
</css_var>
|
|
98
98
|
<css_var suffix="spinner-color">
|
|
99
99
|
<description>Loading spinner color on the root. (button-link)</description>
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
<description>Horizontal padding inside the button.</description>
|
|
64
64
|
</css_var>
|
|
65
65
|
<css_var suffix="radius">
|
|
66
|
-
<description>Corner radius; pill sets
|
|
66
|
+
<description>Corner radius; pill sets full radius via data-pill.</description>
|
|
67
67
|
</css_var>
|
|
68
68
|
<css_var suffix="spinner-color">
|
|
69
69
|
<description>Loading spinner color on the root.</description>
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
<description>Horizontal padding inside the button. (icon-button-link)</description>
|
|
88
88
|
</css_var>
|
|
89
89
|
<css_var suffix="radius">
|
|
90
|
-
<description>Corner radius; pill sets
|
|
90
|
+
<description>Corner radius; pill sets full radius via data-pill. (icon-button-link)</description>
|
|
91
91
|
</css_var>
|
|
92
92
|
<css_var suffix="spinner-color">
|
|
93
93
|
<description>Loading spinner color on the root. (icon-button-link)</description>
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<description>Decorative leading node rendered before the item label.</description>
|
|
20
20
|
</prop>
|
|
21
21
|
<prop name="CheckboxItem.note" kind="react">
|
|
22
|
-
<description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `
|
|
22
|
+
<description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `xs`.</description>
|
|
23
23
|
</prop>
|
|
24
24
|
<prop name="CheckboxItem.sentiment" kind="react">
|
|
25
25
|
<description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
<description>Decorative leading node rendered before the item label.</description>
|
|
32
32
|
</prop>
|
|
33
33
|
<prop name="Item.note" kind="react">
|
|
34
|
-
<description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `
|
|
34
|
+
<description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `xs`.</description>
|
|
35
35
|
</prop>
|
|
36
36
|
<prop name="Item.sentiment" kind="react">
|
|
37
37
|
<description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
<description>Decorative leading node rendered before the item label.</description>
|
|
41
41
|
</prop>
|
|
42
42
|
<prop name="LinkItem.note" kind="react">
|
|
43
|
-
<description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `
|
|
43
|
+
<description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `xs`.</description>
|
|
44
44
|
</prop>
|
|
45
45
|
<prop name="LinkItem.sentiment" kind="react">
|
|
46
46
|
<description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
<description>Decorative leading node rendered before the item label.</description>
|
|
59
59
|
</prop>
|
|
60
60
|
<prop name="RadioItem.note" kind="react">
|
|
61
|
-
<description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `
|
|
61
|
+
<description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `xs`.</description>
|
|
62
62
|
</prop>
|
|
63
63
|
<prop name="RadioItem.sentiment" kind="react">
|
|
64
64
|
<description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<when_to_use>
|
|
4
4
|
<item>Body copy with semantic tone (including brand `primary`) and token-backed typography</item>
|
|
5
5
|
<item>Helper, label, or inline copy inside other components</item>
|
|
6
|
-
<item>Mono or body family text with fluid clamp sizing</item>
|
|
6
|
+
<item>Mono or body family text with fluid clamp sizing (gated by --effect-fluid-typography; off → fixed at --font-scale-body-* for that size)</item>
|
|
7
7
|
</when_to_use>
|
|
8
8
|
<when_not_to_use>
|
|
9
9
|
<item>Headings or display typography — use Title</item>
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<description>Enables text selection on the rendered copy.</description>
|
|
47
47
|
</prop>
|
|
48
48
|
<prop name="size" kind="react">
|
|
49
|
-
<description>Selects a semantic body typography size from the active theme scale.</description>
|
|
49
|
+
<description>Selects a semantic body typography size from the active theme scale. Fluid clamp between prev step and this size’s --font-scale-body-* token is on when --effect-fluid-typography is empty; set the theme effect to initial to lock at that body scale token. size xs is always fixed.</description>
|
|
50
50
|
</prop>
|
|
51
51
|
<prop name="tone" kind="react">
|
|
52
52
|
<description>Sets the semantic text color role when no literal `color` override is used. `default` inherits; `primary` → `--global-primary`; `muted` → `--global-muted`; `interactive` → `--global-interactive-text`; `positive` / `informative` / `danger` / `warning` → `--highlight-green` / `--highlight-blue` / `--highlight-red` / `--highlight-yellow`.</description>
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
<description>Optical size axis on the root (variable fonts).</description>
|
|
83
83
|
</css_var>
|
|
84
84
|
<css_var suffix="font-size">
|
|
85
|
-
<description>Body font size; size prop presets via data attributes.</description>
|
|
85
|
+
<description>Body font size; size prop presets via data attributes. Defaults to the theme body scale token for that size; clamp (prev step→token) applies only when --effect-fluid-typography is on.</description>
|
|
86
86
|
</css_var>
|
|
87
87
|
<css_var suffix="font-weight">
|
|
88
88
|
<description>Font weight on the root; keyword presets or numeric via weight prop.</description>
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
<usage surface="text">
|
|
3
3
|
<do>Body copy with semantic tone (including brand `primary`) and token-backed typography</do>
|
|
4
4
|
<do>Helper, label, or inline copy inside other components</do>
|
|
5
|
-
<do>Mono or body family text with fluid clamp sizing</do>
|
|
5
|
+
<do>Mono or body family text with fluid clamp sizing (gated by --effect-fluid-typography; off → fixed at --font-scale-body-* for that size)</do>
|
|
6
6
|
<dont>Using Text for headings instead of Title</dont>
|
|
7
7
|
</usage>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<item>Headings and display text with title presets</item>
|
|
5
5
|
<item>Semantic heading tags chosen explicitly through render</item>
|
|
6
6
|
<item>Size and render paired together for most heading use cases</item>
|
|
7
|
-
<item>Fluid clamp sizing across title appearance presets</item>
|
|
7
|
+
<item>Fluid clamp sizing across title appearance presets (gated by --effect-fluid-typography; off → fixed at --font-scale-display / h-* for that size)</item>
|
|
8
8
|
</when_to_use>
|
|
9
9
|
<when_not_to_use>
|
|
10
10
|
<item>Body copy — use Text</item>
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
<description>Enables text selection on the rendered copy.</description>
|
|
45
45
|
</prop>
|
|
46
46
|
<prop name="size" kind="react">
|
|
47
|
-
<description>Selects a heading or display typography preset from the active theme scale. This controls only the visual preset. Semantic heading choice remains owned by `render`, because `Title` keeps a `span` root unless `render` replaces it.</description>
|
|
47
|
+
<description>Selects a heading or display typography preset from the active theme scale. This controls only the visual preset. Semantic heading choice remains owned by `render`, because `Title` keeps a `span` root unless `render` replaces it. Fluid clamp between prev step and this size’s --font-scale-display / --font-scale-h* token is on when --effect-fluid-typography is empty; set the theme effect to initial to lock at that scale token.</description>
|
|
48
48
|
</prop>
|
|
49
49
|
<prop name="tracking" kind="react">
|
|
50
50
|
<description>Sets letter spacing on the rendered copy. Overrides size preset letter-spacing when set.</description>
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
<description>Optical size axis on the root (variable fonts).</description>
|
|
78
78
|
</css_var>
|
|
79
79
|
<css_var suffix="font-size">
|
|
80
|
-
<description>Heading font size; size prop presets via data attributes.</description>
|
|
80
|
+
<description>Heading font size; size prop presets via data attributes. Defaults to the theme scale token for that size; clamp (prev step→token) applies only when --effect-fluid-typography is on.</description>
|
|
81
81
|
</css_var>
|
|
82
82
|
<css_var suffix="font-weight">
|
|
83
83
|
<description>Font weight on the root.</description>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<do>Headings and display text with title presets</do>
|
|
4
4
|
<do>Semantic heading tags chosen explicitly through render</do>
|
|
5
5
|
<do>Size and render paired together for most heading use cases</do>
|
|
6
|
-
<do>Fluid clamp sizing across title appearance presets</do>
|
|
6
|
+
<do>Fluid clamp sizing across title appearance presets (gated by --effect-fluid-typography; off → fixed at --font-scale-display / h-* for that size)</do>
|
|
7
7
|
<dont>Assuming size changes the HTML tag automatically</dont>
|
|
8
8
|
<dont>Letting size force the HTML tag instead of choosing render explicitly</dont>
|
|
9
9
|
<dont>Using Title for long body paragraphs</dont>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
<description>Horizontal padding inside the button.</description>
|
|
54
54
|
</css_var>
|
|
55
55
|
<css_var suffix="radius">
|
|
56
|
-
<description>Corner radius; pill sets
|
|
56
|
+
<description>Corner radius; pill sets full radius via data-pill.</description>
|
|
57
57
|
</css_var>
|
|
58
58
|
<css_var suffix="spinner-color">
|
|
59
59
|
<description>Loading spinner color on the root.</description>
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
<module id="core" file="core.css">
|
|
8
8
|
<purpose>Root baseline including html font-size from --font-root-size, --is-light-mode registration, global element defaults, and corner-shape gate via var(--__corner-shape, var(--corner-shape)).</purpose>
|
|
9
9
|
</module>
|
|
10
|
+
<module id="font-scale" file="font-scale.css">
|
|
11
|
+
<purpose>Derive --font-scale-* from --font-heading-typescale / --font-body-typescale with pow + round(down, …, 1px). Fixed body-xs/body-s; body-m = 1rem; display = heading n=8.</purpose>
|
|
12
|
+
</module>
|
|
10
13
|
<module id="typography" file="typography.css">
|
|
11
14
|
<purpose>Semantic HTML element typography and link styling opt-out.</purpose>
|
|
12
15
|
</module>
|
|
@@ -55,8 +58,8 @@
|
|
|
55
58
|
<set_by>data-shrink="true" or data-shrink="false"; registered in global-properties.css</set_by>
|
|
56
59
|
</custom_property>
|
|
57
60
|
<custom_property name="--__corner-shape">
|
|
58
|
-
<purpose>Internal override for the preflight corner-shape gate so
|
|
61
|
+
<purpose>Internal override for the preflight corner-shape gate so full radius keeps round pill arcs when --effect-corner-shape is on. Not a consumer data-* or public theme recipe. Consumers must disable corner-shape when using full radius.</purpose>
|
|
59
62
|
<default>guaranteed-invalid (no initial-value); inherits: false; preflight uses var(--__corner-shape, var(--corner-shape))</default>
|
|
60
|
-
<set_by>ViraUI components on the same element as
|
|
63
|
+
<set_by>ViraUI components on the same element as full / pill radius (CSS modules or React style); registered in global-properties.css</set_by>
|
|
61
64
|
</custom_property>
|
|
62
65
|
</modules>
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
<summary>App-facing foreground, background, primary, muted, interactive, disabled, and contrast colors.</summary>
|
|
15
15
|
</topic>
|
|
16
16
|
<topic id="effects">
|
|
17
|
-
<pattern>--effect-vibrancy | --effect-corner-shape | --effect-holofoil | --effect-shadows</pattern>
|
|
18
|
-
<summary>Optional effect toggles; empty/unset = on, initial = off. Brand holofoil defaults to initial (off); vibrancy, corner-shape, and
|
|
17
|
+
<pattern>--effect-vibrancy | --effect-corner-shape | --effect-holofoil | --effect-shadows | --effect-fluid-typography</pattern>
|
|
18
|
+
<summary>Optional effect toggles; empty/unset = on, initial = off. Brand holofoil defaults to initial (off); vibrancy, corner-shape, shadows, and fluid-typography default empty (on). Holofoil on paints a fixed body::after foil overlay; shadows off disables preflight data-elevation box-shadow stacks; fluid-typography off locks Text/Title to each size’s theme scale token.</summary>
|
|
19
19
|
</topic>
|
|
20
20
|
<topic id="vibrancy">
|
|
21
21
|
<pattern>--vibrancy-blur | --vibrancy-brightness</pattern>
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
</topic>
|
|
28
28
|
<topic id="radius">
|
|
29
29
|
<pattern>--radius-* | --corner-shape</pattern>
|
|
30
|
-
<summary>Semantic radius scale plus corner-shape value for component chrome.
|
|
30
|
+
<summary>Semantic radius scale plus corner-shape value for component chrome. Full/pill radius with --effect-corner-shape on can cap true pills; ViraUI sets internal --__corner-shape (preflight-owned, not a consumer data-*) beside full radius.</summary>
|
|
31
31
|
</topic>
|
|
32
32
|
<topic id="space">
|
|
33
33
|
<pattern>--space-*</pattern>
|
|
@@ -37,9 +37,13 @@
|
|
|
37
37
|
<pattern>--font-root-size</pattern>
|
|
38
38
|
<summary>Root html font-size as a percentage of the user-agent default; preflight applies it on html so rem-based scales inherit the brand baseline.</summary>
|
|
39
39
|
</topic>
|
|
40
|
+
<topic id="font-typescale">
|
|
41
|
+
<pattern>--font-heading-typescale | --font-body-typescale</pattern>
|
|
42
|
+
<summary>Editable modular ratios from theme CSS. Preflight derives --font-scale-* from these with pow + round(down). Override these (not baked sizes) for live typography scale changes.</summary>
|
|
43
|
+
</topic>
|
|
40
44
|
<topic id="font-scale">
|
|
41
45
|
<pattern>--font-scale-*</pattern>
|
|
42
|
-
<summary>Semantic typography sizes
|
|
46
|
+
<summary>Semantic typography sizes (display, headings, body steps) derived by preflight from typescale ratios — not theme source tokens. body-m is always 1rem; body-xs/body-s are fixed 12px/14px; display uses heading ratio at n=8. Text/Title fluid clamp between scale tokens is gated by --effect-fluid-typography (off → fixed at that size’s scale token).</summary>
|
|
43
47
|
</topic>
|
|
44
48
|
<topic id="font-family">
|
|
45
49
|
<pattern>--font-family-heading | --font-family-body | --font-family-mono</pattern>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<toggles>
|
|
3
|
-
<summary>Core polarity and theme effect gates shipped with preflight. Polarity: --is-light-mode is a <color> on the root container (black = light theme, white = dark theme); query it with @container root style(--is-light-mode: black|white). Effect toggles: empty/unset = on, initial = off; brand holofoil defaults to initial (off); vibrancy, corner-shape, and
|
|
3
|
+
<summary>Core polarity and theme effect gates shipped with preflight. Polarity: --is-light-mode is a <color> on the root container (black = light theme, white = dark theme); query it with @container root style(--is-light-mode: black|white). Effect toggles: empty/unset = on, initial = off; brand holofoil defaults to initial (off); vibrancy, corner-shape, shadows, and fluid-typography default empty (on). Gate effects with @container root not style(--effect-*: initial). Holofoil on paints a fixed body::after foil overlay; shadows off disables preflight data-elevation box-shadow stacks; fluid-typography off locks Text/Title font-size to each size’s theme scale token.</summary>
|
|
4
4
|
<toggle name="--is-light-mode">
|
|
5
5
|
<when>html registers polarity via contrast-color(var(--global-background)) so light backgrounds resolve to black and dark backgrounds to white; container name is root (see core.css).</when>
|
|
6
6
|
<when>data-mode="light" forces --is-light-mode: black and color-scheme: light; data-mode="dark" forces white and color-scheme: dark.</when>
|
|
@@ -19,7 +19,10 @@
|
|
|
19
19
|
<toggle name="--effect-holofoil">
|
|
20
20
|
<when>Brand default is initial (off). When on, paints a fixed body::after foil overlay gated by @container root not style(--effect-holofoil: initial); foil blend adjusts under @container root style(--is-light-mode: white). Do not invent alternate foil hooks.</when>
|
|
21
21
|
</toggle>
|
|
22
|
+
<toggle name="--effect-fluid-typography">
|
|
23
|
+
<when>Empty/unset enables Text/Title fluid clamp sizing (prev scale step→step via container progress); set to initial to lock each size at its theme scale token (--font-scale-body-* / --font-scale-display / --font-scale-h*). Text and Title module CSS gate with @container root not style(--effect-fluid-typography: initial). No React prop or data-* — theme root only. Text size xs stays fixed regardless. At full fluid progress, on and off resolve to the same token.</when>
|
|
24
|
+
</toggle>
|
|
22
25
|
<toggle name="--corner-shape">
|
|
23
|
-
<when>Theme corner shape token; preflight may set internal --__corner-shape beside
|
|
26
|
+
<when>Theme corner shape token; preflight may set internal --__corner-shape beside full radius. Not a consumer data-*.</when>
|
|
24
27
|
</toggle>
|
|
25
28
|
</toggles>
|
package/dist/specs/index.xml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<index package="@viraui/react" version="2026.
|
|
2
|
+
<index package="@viraui/react" version="2026.5.0" generated="2026-09-23T18:11:26.525Z">
|
|
3
3
|
<categories>
|
|
4
4
|
<category id="layout" />
|
|
5
5
|
<category id="action" />
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<tsx><![CDATA[
|
|
11
11
|
<Stack direction="row" vAlign="center" gap="3" fullWidth>
|
|
12
12
|
<Stack gap="1" expandChildren>
|
|
13
|
-
<Text weight="
|
|
13
|
+
<Text weight="m">Notifications</Text>
|
|
14
14
|
<Text size="sm" color="muted">Email digests for account activity</Text>
|
|
15
15
|
</Stack>
|
|
16
16
|
<Switch aria-label="Notifications" />
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraui/react",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@base-ui/react": ">=1.7.0",
|
|
31
|
-
"@viraui/foundation": "2026.
|
|
32
|
-
"@viraui/icons": "2026.0
|
|
31
|
+
"@viraui/foundation": "2026.5.0",
|
|
32
|
+
"@viraui/icons": "2026.1.0",
|
|
33
33
|
"@viraui/postcss-config": "2026.0.0",
|
|
34
34
|
"@viraui/tsconfig": "2026.0.0",
|
|
35
35
|
"postcss": "8.5.26",
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type InfiniteCornerShapeStyle = {
|
|
2
|
-
'--__corner-shape': 'round';
|
|
3
|
-
};
|
|
4
|
-
export declare const isInfiniteRadiusValue: (value: string | number | null | undefined) => boolean;
|
|
5
|
-
/** Sets `--__corner-shape: round` when any value is the infinite radius token or CSS. */
|
|
6
|
-
export declare const infiniteCornerShapeStyle: (...values: Array<string | number | null | undefined>) => InfiniteCornerShapeStyle | undefined;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region src/core/theme/infinite-radius-style.ts
|
|
2
|
-
var INFINITE_RADIUS_MARKER = /(?:--radius-infinite|\b1e5px\b)/;
|
|
3
|
-
var isInfiniteRadiusValue = (value) => {
|
|
4
|
-
if (value === "infinite") return true;
|
|
5
|
-
if (typeof value !== "string" || value.length === 0) return false;
|
|
6
|
-
return INFINITE_RADIUS_MARKER.test(value);
|
|
7
|
-
};
|
|
8
|
-
/** Sets `--__corner-shape: round` when any value is the infinite radius token or CSS. */
|
|
9
|
-
var infiniteCornerShapeStyle = (...values) => {
|
|
10
|
-
if (values.some(isInfiniteRadiusValue)) return { "--__corner-shape": "round" };
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { infiniteCornerShapeStyle, isInfiniteRadiusValue };
|