@viraui/react 2026.0.4 → 2026.0.5
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 +6 -0
- package/dist/components/dialog/dialog-sheet.js +1 -1
- package/dist/components/fit-text/fit-text.css +1 -1
- package/dist/components/glow/glow-tracker.d.ts +19 -0
- package/dist/components/glow/glow-tracker.js +87 -0
- package/dist/components/glow/glow.css +1 -0
- package/dist/components/glow/glow.d.ts +97 -0
- package/dist/components/glow/glow.guide.json +117 -0
- package/dist/components/glow/glow.js +67 -0
- package/dist/components/glow/glow.module.js +8 -0
- package/dist/components/glow/index.d.ts +3 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/popover/popover-sheet.js +1 -1
- package/dist/components/select/select.js +1 -1
- package/dist/components/surface/surface.css +1 -1
- package/dist/components/surface/surface.d.ts +7 -3
- package/dist/components/surface/surface.guide.json +2 -2
- package/dist/components/surface/surface.js +5 -2
- package/dist/index.js +4 -2
- package/package.json +2 -2
package/dist/catalog.json
CHANGED
|
@@ -92,6 +92,12 @@
|
|
|
92
92
|
"summary": "CSS-only fit-to-width wrapper that scales children to fill available inline space.",
|
|
93
93
|
"guidePath": "./components/fit-text/fit-text.guide.json"
|
|
94
94
|
},
|
|
95
|
+
{
|
|
96
|
+
"id": "glow",
|
|
97
|
+
"name": "Glow",
|
|
98
|
+
"summary": "Decorative pointer-driven border highlight on a transparent Surface shell (radius only). Put the visual card as children; a shared rAF tracker paints CSS variables without React re-renders.",
|
|
99
|
+
"guidePath": "./components/glow/glow.guide.json"
|
|
100
|
+
},
|
|
95
101
|
{
|
|
96
102
|
"id": "icon-button",
|
|
97
103
|
"name": "IconButton",
|
|
@@ -3,8 +3,8 @@ import { Text } from "../text/text.js";
|
|
|
3
3
|
import { Stack } from "../stack/stack.js";
|
|
4
4
|
import dialog_module_default from "./dialog.module.js";
|
|
5
5
|
import { Elevator } from "../elevator/elevator.js";
|
|
6
|
-
import { IconButton } from "../icon-button/icon-button.js";
|
|
7
6
|
import { Surface } from "../surface/surface.js";
|
|
7
|
+
import { IconButton } from "../icon-button/icon-button.js";
|
|
8
8
|
import { Title } from "../title/title.js";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import { Drawer } from "@base-ui/react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --__fit-text-captured-length{syntax:"<length>";inherits:true;initial-value:0}@property --vui-fit-text-max-font-size{syntax:"<length>";inherits:true;initial-value:calc(infinity * 1px)}@property --__fit-text-available-space{syntax:"<length>";inherits:true;initial-value:0}@property --__fit-text-ratio{syntax:"<number>";inherits:false;initial-value:1}.viraui__fit-text-module__FitText_CdAvq{--__fit-text-captured-length:initial;display:flex;container-type:inline-size;.viraui__fit-text-module__Container_bawpR{--__fit-text-captured-length:100cqi;--__fit-text-available-space:var(--__fit-text-captured-length);flex-grow:1;container-type:inline-size}.viraui__fit-text-module__Display_Hraif{--__fit-text-captured-length:100cqi;--__fit-text-ratio:tan(atan2(var(--__fit-text-available-space),var(--__fit-text-available-space) - var(--__fit-text-captured-length)));inline-size:var(--__fit-text-available-space);font-size:clamp(0px,1em * var(--__fit-text-ratio),var(--vui-fit-text-max-font-size));>*{font-size:1em;max-inline-size:none}}.viraui__fit-text-module__Reference_6wCx7{visibility:hidden;>*{font-size:inherit;max-inline-size:none}}}}
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --__fit-text-captured-length{syntax:"<length>";inherits:true;initial-value:0}@property --vui-fit-text-max-font-size{syntax:"<length>";inherits:true;initial-value:calc(infinity * 1px)}@property --__fit-text-available-space{syntax:"<length>";inherits:true;initial-value:0}@property --__fit-text-ratio{syntax:"<number>";inherits:false;initial-value:1}.viraui__fit-text-module__FitText_CdAvq{--__fit-text-captured-length:initial;display:flex;container-type:inline-size;.viraui__fit-text-module__Container_bawpR{--__fit-text-captured-length:100cqi;--__fit-text-available-space:var(--__fit-text-captured-length);flex-grow:1;container-type:inline-size}.viraui__fit-text-module__Display_Hraif{--__fit-text-captured-length:100cqi;--__fit-text-ratio:tan(atan2(var(--__fit-text-available-space),var(--__fit-text-available-space) - var(--__fit-text-captured-length)));inline-size:var(--__fit-text-available-space);font-size:clamp(0px,1em * var(--__fit-text-ratio),var(--vui-fit-text-max-font-size));overflow:clip;>*{font-size:1em;max-inline-size:none;display:block}}.viraui__fit-text-module__Reference_6wCx7{visibility:hidden;>*{font-size:inherit;max-inline-size:none}}}}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type GlowTrackerEntry = {
|
|
2
|
+
el: HTMLElement;
|
|
3
|
+
proximity: number;
|
|
4
|
+
restingOpacity: number;
|
|
5
|
+
/** Unwrapped continuous angle written to `--vui-glow-starting-angle`. */
|
|
6
|
+
lastAngle?: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Advance `lastAngle` toward `rawDegrees` along the shortest arc so CSS
|
|
10
|
+
* transitions never interpolate the long way across the 0° seam.
|
|
11
|
+
*/
|
|
12
|
+
export declare const unwrapGlowAngle: (lastAngle: number | undefined, rawDegrees: number) => number;
|
|
13
|
+
export declare const registerGlow: (entry: GlowTrackerEntry) => void;
|
|
14
|
+
export declare const updateGlow: (entry: GlowTrackerEntry) => void;
|
|
15
|
+
export declare const unregisterGlow: (el: HTMLElement) => void;
|
|
16
|
+
/** Story / test helper: current document listener attach count (`0` or `1`). */
|
|
17
|
+
export declare const getGlowListenerCount: () => number;
|
|
18
|
+
/** Story / test helper: registered glow root count. */
|
|
19
|
+
export declare const getGlowRegistrySize: () => number;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
//#region src/components/glow/glow-tracker.ts
|
|
2
|
+
var entries = /* @__PURE__ */ new Map();
|
|
3
|
+
var listenerCount = 0;
|
|
4
|
+
var rafId = null;
|
|
5
|
+
var pendingEvent = null;
|
|
6
|
+
var POINTER_QUERY = "(hover: hover) and (pointer: fine)";
|
|
7
|
+
var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
|
|
8
|
+
var canTrackPointer = () => {
|
|
9
|
+
if (typeof window === "undefined" || typeof matchMedia !== "function") return false;
|
|
10
|
+
return matchMedia(POINTER_QUERY).matches && !matchMedia(REDUCED_MOTION_QUERY).matches;
|
|
11
|
+
};
|
|
12
|
+
/** Normalize degrees into `[0, 360)`. */
|
|
13
|
+
var normalizeAngle = (degrees) => (degrees % 360 + 360) % 360;
|
|
14
|
+
/**
|
|
15
|
+
* Advance `lastAngle` toward `rawDegrees` along the shortest arc so CSS
|
|
16
|
+
* transitions never interpolate the long way across the 0° seam.
|
|
17
|
+
*/
|
|
18
|
+
var unwrapGlowAngle = (lastAngle, rawDegrees) => {
|
|
19
|
+
const target = normalizeAngle(rawDegrees);
|
|
20
|
+
if (lastAngle === void 0) return target;
|
|
21
|
+
let delta = target - normalizeAngle(lastAngle);
|
|
22
|
+
if (delta > 180) delta -= 360;
|
|
23
|
+
else if (delta < -180) delta += 360;
|
|
24
|
+
return lastAngle + delta;
|
|
25
|
+
};
|
|
26
|
+
var paintEntry = (entry, event) => {
|
|
27
|
+
const bounds = entry.el.getBoundingClientRect();
|
|
28
|
+
const pointerX = event.clientX;
|
|
29
|
+
const pointerY = event.clientY;
|
|
30
|
+
const activeOpacity = pointerX > bounds.left - entry.proximity && pointerX < bounds.left + bounds.width + entry.proximity && pointerY > bounds.top - entry.proximity && pointerY < bounds.top + bounds.height + entry.proximity ? 1 : entry.restingOpacity;
|
|
31
|
+
const centerX = bounds.left + bounds.width * .5;
|
|
32
|
+
const centerY = bounds.top + bounds.height * .5;
|
|
33
|
+
let angle = Math.atan2(pointerY - centerY, pointerX - centerX) * 180 / Math.PI;
|
|
34
|
+
if (angle < 0) angle += 360;
|
|
35
|
+
const lastAngle = unwrapGlowAngle(entry.lastAngle, angle + 90);
|
|
36
|
+
entries.set(entry.el, {
|
|
37
|
+
...entry,
|
|
38
|
+
lastAngle
|
|
39
|
+
});
|
|
40
|
+
entry.el.style.setProperty("--vui-glow-starting-angle", String(lastAngle));
|
|
41
|
+
entry.el.style.setProperty("--vui-glow-active-opacity", String(activeOpacity));
|
|
42
|
+
};
|
|
43
|
+
var flushPaint = () => {
|
|
44
|
+
rafId = null;
|
|
45
|
+
const event = pendingEvent;
|
|
46
|
+
pendingEvent = null;
|
|
47
|
+
if (!event) return;
|
|
48
|
+
for (const entry of entries.values()) paintEntry(entry, event);
|
|
49
|
+
};
|
|
50
|
+
var onPointerMove = (event) => {
|
|
51
|
+
pendingEvent = event;
|
|
52
|
+
if (rafId !== null) return;
|
|
53
|
+
rafId = requestAnimationFrame(flushPaint);
|
|
54
|
+
};
|
|
55
|
+
var attachListener = () => {
|
|
56
|
+
if (listenerCount > 0 || !canTrackPointer()) return;
|
|
57
|
+
document.addEventListener("pointermove", onPointerMove);
|
|
58
|
+
listenerCount = 1;
|
|
59
|
+
};
|
|
60
|
+
var detachListener = () => {
|
|
61
|
+
if (listenerCount === 0 || entries.size > 0) return;
|
|
62
|
+
document.removeEventListener("pointermove", onPointerMove);
|
|
63
|
+
listenerCount = 0;
|
|
64
|
+
if (rafId !== null) {
|
|
65
|
+
cancelAnimationFrame(rafId);
|
|
66
|
+
rafId = null;
|
|
67
|
+
}
|
|
68
|
+
pendingEvent = null;
|
|
69
|
+
};
|
|
70
|
+
var registerGlow = (entry) => {
|
|
71
|
+
const existing = entries.get(entry.el);
|
|
72
|
+
entries.set(entry.el, {
|
|
73
|
+
...entry,
|
|
74
|
+
...existing?.lastAngle !== void 0 && { lastAngle: existing.lastAngle }
|
|
75
|
+
});
|
|
76
|
+
attachListener();
|
|
77
|
+
};
|
|
78
|
+
var unregisterGlow = (el) => {
|
|
79
|
+
entries.delete(el);
|
|
80
|
+
detachListener();
|
|
81
|
+
};
|
|
82
|
+
/** Story / test helper: current document listener attach count (`0` or `1`). */
|
|
83
|
+
var getGlowListenerCount = () => listenerCount;
|
|
84
|
+
/** Story / test helper: registered glow root count. */
|
|
85
|
+
var getGlowRegistrySize = () => entries.size;
|
|
86
|
+
//#endregion
|
|
87
|
+
export { getGlowListenerCount, getGlowRegistrySize, registerGlow, unregisterGlow, unwrapGlowAngle };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-glow-starting-angle{syntax:"<number>";inherits:true;initial-value:0}@property --vui-glow-angle-lag{syntax:"<time>";inherits:true;initial-value:80ms}@property --vui-glow-auto-rotate-speed{syntax:"<time>";inherits:true;initial-value:4s}@property --vui-glow-active-opacity{syntax:"<number>";inherits:true;initial-value:0}@property --vui-glow-spread{syntax:"<number>";inherits:true;initial-value:250}@property --vui-glow-border-width{syntax:"<length>";inherits:true;initial-value:2px}@property --vui-glow-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-glow-border-offset{syntax:"<length>";inherits:true;initial-value:5px}@property --vui-glow-color{syntax:"*";inherits:true;initial-value:#0000}@property --__glow-radius-tl{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --__glow-radius-tr{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --__glow-radius-br{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --__glow-radius-bl{syntax:"<length-percentage>";inherits:true;initial-value:0}@keyframes viraui__glow-module__vui-glow-auto-rotate_Zh-hL{0%{--vui-glow-starting-angle:0}to{--vui-glow-starting-angle:360}}.viraui__glow-module__Glow_7394e{--vui-glow-border-color:var(--global-contrast);--vui-glow-color:conic-gradient(from 180deg at 50% 70%,#0000,var(--global-primary),#0000);--__glow-radius-tl:var(--vui-surface-border-radius-top-left);--__glow-radius-tr:var(--vui-surface-border-radius-top-right);--__glow-radius-br:var(--vui-surface-border-radius-bottom-right);--__glow-radius-bl:var(--vui-surface-border-radius-bottom-left);position:relative;z-index:0;transition:--vui-glow-starting-angle var(--vui-glow-angle-lag) ease-out;&[data-glow-fit-content=true]{max-width:fit-content}&[data-glow-rainbow=true]{--vui-glow-color:conic-gradient(from 180deg at 50% 50%,var(--highlight-cyan),var(--highlight-blue),var(--highlight-green),var(--highlight-purple),var(--highlight-red),var(--highlight-indigo),var(--highlight-yellow),var(--highlight-salmon),var(--highlight-magenta),var(--highlight-cyan))}&[data-glow-auto-rotate=true]{--vui-glow-active-opacity:1;transition:none;animation:viraui__glow-module__vui-glow-auto-rotate_Zh-hL var(--vui-glow-auto-rotate-speed) linear infinite;@media (prefers-reduced-motion:reduce){animation:none}}&:after,&:before{content:"";position:absolute;z-index:1;pointer-events:none;inset:calc(var(--vui-glow-border-offset) * -1);opacity:var(--vui-glow-active-opacity);border:var(--vui-glow-border-width) solid #0000;border-radius:calc(var(--vui-glow-border-offset) + var(--__glow-radius-tl)) calc(var(--vui-glow-border-offset) + var(--__glow-radius-tr)) calc(var(--vui-glow-border-offset) + var(--__glow-radius-br)) calc(var(--vui-glow-border-offset) + var(--__glow-radius-bl));transition:opacity 1s;@media (prefers-reduced-motion:reduce){display:none}}&:not([data-glow-auto-rotate=true]){&:after,&:before{@media (hover:none),(pointer:coarse){display:none}}}&:before{background:var(--vui-glow-border-color);mask:linear-gradient(#0000,#0000),conic-gradient(from calc(((var(--vui-glow-starting-angle) + (var(--vui-glow-spread) * .25)) - (var(--vui-glow-spread) * 1.5)) * 1deg),oklch(100% 0 0deg/15%) 0deg,#fff,oklch(100% 0 0deg/15%) calc(var(--vui-glow-spread) * 2.5deg));mask-clip:padding-box,border-box;mask-composite:intersect}&:after{background:var(--vui-glow-color);filter:brightness(1.5);mask:linear-gradient(#0000,#0000),conic-gradient(from calc(((var(--vui-glow-starting-angle) + (var(--vui-glow-spread) * .25)) - (var(--vui-glow-spread) * .5)) * 1deg),#0000 0deg,#fff,#0000 calc(var(--vui-glow-spread) * .5deg));mask-clip:padding-box,border-box;mask-composite:intersect;background-size:calc(100% + var(--vui-glow-border-width) * 2) calc(100% + var(--vui-glow-border-width) * 2);background-position:calc(var(--vui-glow-border-width) * -1) calc(var(--vui-glow-border-width) * -1)}&[data-glow-global=true]:after{background-attachment:fixed}}}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { SurfaceProps } from '../surface';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Public Glow props.
|
|
5
|
+
*
|
|
6
|
+
* Glow root is a transparent Surface shell that exposes only `radius` (token, per-corner
|
|
7
|
+
* tuple, or `auto`). Put the visual card as children (typically `Surface` with `radius="auto"`).
|
|
8
|
+
*
|
|
9
|
+
* @default Glow-owned props use the defaults below; `radius` keeps Surface defaults when omitted.
|
|
10
|
+
*/
|
|
11
|
+
export type GlowProps = React.ComponentProps<'div'> & Pick<SurfaceProps, 'radius'> & {
|
|
12
|
+
/**
|
|
13
|
+
* Distance from the surface edge where the glow becomes fully active.
|
|
14
|
+
*
|
|
15
|
+
* @default 170
|
|
16
|
+
*/
|
|
17
|
+
proximity?: number;
|
|
18
|
+
/**
|
|
19
|
+
* Angular width of the highlighted arc (degrees, used as a unitless CSS number).
|
|
20
|
+
*
|
|
21
|
+
* @default 250
|
|
22
|
+
*/
|
|
23
|
+
spread?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Resting opacity of the glow when the pointer is outside proximity.
|
|
26
|
+
*
|
|
27
|
+
* @default 0
|
|
28
|
+
*/
|
|
29
|
+
opacity?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Shrinks the root to fit its content (`max-width: fit-content`).
|
|
32
|
+
*
|
|
33
|
+
* @default false
|
|
34
|
+
*/
|
|
35
|
+
fitContent?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Width of the masked glow border ring.
|
|
38
|
+
*
|
|
39
|
+
* @default 2
|
|
40
|
+
*/
|
|
41
|
+
borderWidth?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Color of the masked border ring under the highlight.
|
|
44
|
+
*
|
|
45
|
+
* @default var(--global-contrast)
|
|
46
|
+
*/
|
|
47
|
+
borderColor?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Offset of the glow ring from the surface edge. Negative values place the ring outside.
|
|
50
|
+
*
|
|
51
|
+
* @default 5
|
|
52
|
+
*/
|
|
53
|
+
borderOffset?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Overrides the glow gradient with a solid color or custom background value.
|
|
56
|
+
* Ignored when `rainbowColors` is true.
|
|
57
|
+
*
|
|
58
|
+
* @default Theme highlight conic gradient
|
|
59
|
+
*/
|
|
60
|
+
glowColor?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Shares the highlight gradient across cards via `background-attachment: fixed`.
|
|
63
|
+
* Forced off when `rainbowColors` is true.
|
|
64
|
+
*
|
|
65
|
+
* @default true
|
|
66
|
+
*/
|
|
67
|
+
globalHighlight?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Uses the multi-stop rainbow highlight gradient and disables global highlight attachment.
|
|
70
|
+
*
|
|
71
|
+
* @default false
|
|
72
|
+
*/
|
|
73
|
+
rainbowColors?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* CSS transition duration (ms) for `--vui-glow-starting-angle`. Soft follow by default;
|
|
76
|
+
* set `0` for instant snap. Tracker writes an unwrapped continuous angle so the
|
|
77
|
+
* transition does not take the long way across the 0° seam.
|
|
78
|
+
* Ignored when `autoRotate` is true.
|
|
79
|
+
*
|
|
80
|
+
* @default 80
|
|
81
|
+
*/
|
|
82
|
+
angleLag?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Continuously rotates the highlight with a linear CSS animation and ignores the pointer.
|
|
85
|
+
* Always visible (including coarse pointers); still hidden under `prefers-reduced-motion`.
|
|
86
|
+
*
|
|
87
|
+
* @default false
|
|
88
|
+
*/
|
|
89
|
+
autoRotate?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Full-turn duration in seconds when `autoRotate` is true.
|
|
92
|
+
*
|
|
93
|
+
* @default 2
|
|
94
|
+
*/
|
|
95
|
+
autoRotateSpeed?: number;
|
|
96
|
+
};
|
|
97
|
+
export declare const Glow: React.FC<GlowProps>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Glow",
|
|
3
|
+
"structure": "<Glow>{children}</Glow>",
|
|
4
|
+
"summary": "Decorative pointer-driven border highlight on a transparent Surface shell (radius only). Put the visual card as children; a shared rAF tracker paints CSS variables without React re-renders.",
|
|
5
|
+
"whenToUse": [
|
|
6
|
+
"Wrap a Surface (or other content) that should highlight toward the pointer",
|
|
7
|
+
"Grid of glow shells that share one pointer highlight path",
|
|
8
|
+
"Nested glow inside a padded Surface using radius=\"auto\"",
|
|
9
|
+
"Decorative continuous spin with autoRotate (no pointer)"
|
|
10
|
+
],
|
|
11
|
+
"whenNotToUse": [
|
|
12
|
+
"Static borders with no pointer interaction — use Surface border instead",
|
|
13
|
+
"Accessible status or focus indication — glow is decorative only",
|
|
14
|
+
"As a replacement for Surface color/padding — compose Surface as children"
|
|
15
|
+
],
|
|
16
|
+
"accessibility": [
|
|
17
|
+
"Root stays in the accessibility tree; highlight is decorative CSS only",
|
|
18
|
+
"Glow is not a focus or status indicator — consumer owns accessible names and state",
|
|
19
|
+
"Pointer mode hides under coarse pointer / no-hover; autoRotate stays visible; both hide under prefers-reduced-motion"
|
|
20
|
+
],
|
|
21
|
+
"antiPatterns": [
|
|
22
|
+
"Relying on Glow for keyboard focus visibility",
|
|
23
|
+
"Treating Glow as the visual card (color/padding) instead of composing Surface children",
|
|
24
|
+
"Setting overflow:hidden on an ancestor Surface when outer glow must remain visible",
|
|
25
|
+
"Expecting soft bloom Light layer — Glow is border-ring only"
|
|
26
|
+
],
|
|
27
|
+
"related": ["Surface", "Shimmer", "ProgressiveBlur"],
|
|
28
|
+
"properties": {
|
|
29
|
+
"react": {
|
|
30
|
+
"radius": {
|
|
31
|
+
"description": "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."
|
|
32
|
+
},
|
|
33
|
+
"proximity": {
|
|
34
|
+
"description": "Distance from the surface edge where the glow becomes fully active."
|
|
35
|
+
},
|
|
36
|
+
"spread": {
|
|
37
|
+
"description": "Angular width of the highlighted arc (degrees, used as a unitless CSS number).",
|
|
38
|
+
"refCss": "spread"
|
|
39
|
+
},
|
|
40
|
+
"opacity": {
|
|
41
|
+
"description": "Resting opacity of the glow when the pointer is outside proximity."
|
|
42
|
+
},
|
|
43
|
+
"fitContent": {
|
|
44
|
+
"description": "Shrinks the root to fit its content (`max-width: fit-content`)."
|
|
45
|
+
},
|
|
46
|
+
"borderWidth": {
|
|
47
|
+
"description": "Width of the masked glow border ring.",
|
|
48
|
+
"refCss": "border-width"
|
|
49
|
+
},
|
|
50
|
+
"borderColor": {
|
|
51
|
+
"description": "Color of the masked border ring under the highlight.",
|
|
52
|
+
"refCss": "border-color"
|
|
53
|
+
},
|
|
54
|
+
"borderOffset": {
|
|
55
|
+
"description": "Offset of the glow ring from the surface edge. Negative values place the ring outside.",
|
|
56
|
+
"refCss": "border-offset"
|
|
57
|
+
},
|
|
58
|
+
"glowColor": {
|
|
59
|
+
"description": "Overrides the glow gradient with a solid color or custom background value. Ignored when `rainbowColors` is true.",
|
|
60
|
+
"refCss": "color"
|
|
61
|
+
},
|
|
62
|
+
"globalHighlight": {
|
|
63
|
+
"description": "Shares the highlight gradient across cards via `background-attachment: fixed`. Forced off when `rainbowColors` is true."
|
|
64
|
+
},
|
|
65
|
+
"rainbowColors": {
|
|
66
|
+
"description": "Uses the multi-stop rainbow highlight gradient and disables global highlight attachment."
|
|
67
|
+
},
|
|
68
|
+
"angleLag": {
|
|
69
|
+
"description": "CSS transition duration in milliseconds for the pointer-driven starting angle. Soft follow by default; set 0 for instant snap. Ignored when autoRotate is true.",
|
|
70
|
+
"refCss": "angle-lag"
|
|
71
|
+
},
|
|
72
|
+
"autoRotate": {
|
|
73
|
+
"description": "Continuously rotates the highlight with a linear CSS animation and ignores the pointer. Always visible including on coarse pointers; still hidden under prefers-reduced-motion."
|
|
74
|
+
},
|
|
75
|
+
"autoRotateSpeed": {
|
|
76
|
+
"description": "Full-turn duration in seconds when autoRotate is true.",
|
|
77
|
+
"refCss": "auto-rotate-speed"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"css": {
|
|
81
|
+
"starting-angle": {
|
|
82
|
+
"description": "Conic gradient start angle in degrees (unitless number). Pointer tracker writes a continuous unwrapped value; autoRotate animates 0→360."
|
|
83
|
+
},
|
|
84
|
+
"angle-lag": {
|
|
85
|
+
"description": "Transition duration for `--vui-glow-starting-angle` (pointer mode).",
|
|
86
|
+
"refReact": "angleLag"
|
|
87
|
+
},
|
|
88
|
+
"auto-rotate-speed": {
|
|
89
|
+
"description": "Duration of one full auto-rotate turn.",
|
|
90
|
+
"refReact": "autoRotateSpeed"
|
|
91
|
+
},
|
|
92
|
+
"active-opacity": {
|
|
93
|
+
"description": "Current glow opacity from proximity tracking. Written by the shared tracker."
|
|
94
|
+
},
|
|
95
|
+
"spread": {
|
|
96
|
+
"description": "Angular width of the highlighted arc.",
|
|
97
|
+
"refReact": "spread"
|
|
98
|
+
},
|
|
99
|
+
"border-width": {
|
|
100
|
+
"description": "Masked glow border ring width.",
|
|
101
|
+
"refReact": "borderWidth"
|
|
102
|
+
},
|
|
103
|
+
"border-color": {
|
|
104
|
+
"description": "Masked border ring color under the highlight.",
|
|
105
|
+
"refReact": "borderColor"
|
|
106
|
+
},
|
|
107
|
+
"border-offset": {
|
|
108
|
+
"description": "Glow ring offset from the surface edge.",
|
|
109
|
+
"refReact": "borderOffset"
|
|
110
|
+
},
|
|
111
|
+
"color": {
|
|
112
|
+
"description": "Glow fill (solid color or gradient).",
|
|
113
|
+
"refReact": "glowColor"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import './glow.css';
|
|
3
|
+
import { clsx } from "../../core/clsx.js";
|
|
4
|
+
import { Surface } from "../surface/surface.js";
|
|
5
|
+
import { registerGlow, unregisterGlow } from "./glow-tracker.js";
|
|
6
|
+
import glow_module_default from "./glow.module.js";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { useEffect, useRef } from "react";
|
|
9
|
+
//#region src/components/glow/glow.tsx
|
|
10
|
+
var assignRef = (ref, value) => {
|
|
11
|
+
if (typeof ref === "function") {
|
|
12
|
+
ref(value);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (ref) Reflect.set(ref, "current", value);
|
|
16
|
+
};
|
|
17
|
+
var glowGlobalAttr = (rainbowColors, globalHighlight) => {
|
|
18
|
+
if (rainbowColors) return "false";
|
|
19
|
+
return globalHighlight ? "true" : "false";
|
|
20
|
+
};
|
|
21
|
+
var Glow = ({ angleLag = 80, autoRotate = false, autoRotateSpeed = 4, borderColor = "var(--global-contrast)", borderOffset = 5, borderWidth = 2, children, className, fitContent = false, globalHighlight = true, glowColor, opacity = 0, proximity = 170, rainbowColors = false, ref, spread = 250, style, radius, ...otherProps }) => {
|
|
22
|
+
const rootRef = useRef(null);
|
|
23
|
+
const setRootRef = (node) => {
|
|
24
|
+
rootRef.current = node;
|
|
25
|
+
assignRef(ref, node);
|
|
26
|
+
};
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const el = rootRef.current;
|
|
29
|
+
if (!el || autoRotate) return;
|
|
30
|
+
registerGlow({
|
|
31
|
+
el,
|
|
32
|
+
proximity,
|
|
33
|
+
restingOpacity: opacity
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
unregisterGlow(el);
|
|
37
|
+
};
|
|
38
|
+
}, [
|
|
39
|
+
autoRotate,
|
|
40
|
+
proximity,
|
|
41
|
+
opacity
|
|
42
|
+
]);
|
|
43
|
+
const dynamicStyle = {
|
|
44
|
+
"--vui-glow-spread": spread,
|
|
45
|
+
"--vui-glow-border-width": `${borderWidth}px`,
|
|
46
|
+
"--vui-glow-border-color": borderColor,
|
|
47
|
+
"--vui-glow-border-offset": `${borderOffset}px`,
|
|
48
|
+
"--vui-glow-angle-lag": `${angleLag}ms`,
|
|
49
|
+
"--vui-glow-auto-rotate-speed": `${autoRotateSpeed}s`,
|
|
50
|
+
...glowColor && !rainbowColors && { "--vui-glow-color": glowColor },
|
|
51
|
+
...style
|
|
52
|
+
};
|
|
53
|
+
return /* @__PURE__ */ jsx(Surface, {
|
|
54
|
+
...otherProps,
|
|
55
|
+
ref: setRootRef,
|
|
56
|
+
className: clsx(glow_module_default.Glow, className),
|
|
57
|
+
style: dynamicStyle,
|
|
58
|
+
radius,
|
|
59
|
+
"data-glow-fit-content": fitContent ? "true" : "false",
|
|
60
|
+
"data-glow-global": glowGlobalAttr(rainbowColors, globalHighlight),
|
|
61
|
+
"data-glow-rainbow": rainbowColors ? "true" : "false",
|
|
62
|
+
"data-glow-auto-rotate": autoRotate ? "true" : "false",
|
|
63
|
+
children
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
//#endregion
|
|
67
|
+
export { Glow };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/components/glow/glow.module.css
|
|
2
|
+
var Glow = "viraui__glow-module__Glow_7394e";
|
|
3
|
+
var glow_module_default = {
|
|
4
|
+
Glow,
|
|
5
|
+
"vui-glow-auto-rotate": "viraui__glow-module__vui-glow-auto-rotate_Zh-hL"
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { Glow, glow_module_default as default };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ChromeXmark } from "../../internal/chrome-icons/chrome-icons.js";
|
|
2
2
|
import { Text } from "../text/text.js";
|
|
3
3
|
import { Stack } from "../stack/stack.js";
|
|
4
|
-
import { IconButton } from "../icon-button/icon-button.js";
|
|
5
4
|
import { Surface } from "../surface/surface.js";
|
|
5
|
+
import { IconButton } from "../icon-button/icon-button.js";
|
|
6
6
|
import popover_module_default from "./popover.module.js";
|
|
7
7
|
import { Title } from "../title/title.js";
|
|
8
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -7,8 +7,8 @@ import { FieldHelperCopy } from "../basic-input/field-helper-copy.js";
|
|
|
7
7
|
import { FieldLabel } from "../basic-input/field-label.js";
|
|
8
8
|
import { Stack } from "../stack/stack.js";
|
|
9
9
|
import { Elevator } from "../elevator/elevator.js";
|
|
10
|
-
import { IconButton } from "../icon-button/icon-button.js";
|
|
11
10
|
import { Surface } from "../surface/surface.js";
|
|
11
|
+
import { IconButton } from "../icon-button/icon-button.js";
|
|
12
12
|
import select_module_default from "./select.module.js";
|
|
13
13
|
import { SelectGroup } from "./select-group.js";
|
|
14
14
|
import { SelectOption } from "./select-option.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-surface-background{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-background-hover{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-border-style{syntax:"<custom-ident>";inherits:false;initial-value:solid}@property --vui-surface-overflow{syntax:"<custom-ident>";inherits:false;initial-value:visible}@property --vui-surface-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}.viraui__surface-module__Surface_slEYq{--vui-surface-border-radius-top-left:var(--vui-surface-border-radius);--vui-surface-border-radius-top-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-left:var(--vui-surface-border-radius);--vui-surface-background-hover:var(--vui-surface-background);position:relative;overflow:var(--vui-surface-overflow);box-sizing:border-box;background:var(--vui-surface-background);border-radius:var(--vui-surface-border-radius-top-left) var(--vui-surface-border-radius-top-right) var(--vui-surface-border-radius-bottom-right) var(--vui-surface-border-radius-bottom-left);border:0
|
|
1
|
+
@layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-surface-background{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-background-hover{syntax:"*";inherits:false;initial-value:none}@property --vui-surface-border-style{syntax:"<custom-ident>";inherits:false;initial-value:solid}@property --vui-surface-overflow{syntax:"<custom-ident>";inherits:false;initial-value:visible}@property --vui-surface-border-radius{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-top-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-right{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-border-radius-bottom-left{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-surface-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}.viraui__surface-module__Surface_slEYq{--vui-surface-border-radius-top-left:var(--vui-surface-border-radius);--vui-surface-border-radius-top-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-right:var(--vui-surface-border-radius);--vui-surface-border-radius-bottom-left:var(--vui-surface-border-radius);--vui-surface-background-hover:var(--vui-surface-background);position:relative;overflow:var(--vui-surface-overflow);box-sizing:border-box;background:var(--vui-surface-background);border-radius:var(--vui-surface-border-radius-top-left) var(--vui-surface-border-radius-top-right) var(--vui-surface-border-radius-bottom-right) var(--vui-surface-border-radius-bottom-left);border:0;&[data-surface-color=primary]{--vui-surface-background:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}&[data-surface-hover-color=primary]{--vui-surface-background-hover:light-dark(oklab(from var(--global-primary) l a b/20%),oklab(from var(--global-primary) l a b/10%))}@container root not style(--vibrancy-enable: initial){&[data-vibrant]{background:light-dark(oklab(from var(--vui-surface-background) l a b/60%),oklab(from var(--vui-surface-background) l a b/80%))}}&[data-surface-has-padding=true]{padding:var(--vui-surface-padding-block-start) var(--vui-surface-padding-inline-end) var(--vui-surface-padding-block-end) var(--vui-surface-padding-inline-start)}&[data-surface-border]{border-style:var(--vui-surface-border-style);border-color:var(--global-contrast)}&[data-surface-border=all]{border-width:1px}&[data-surface-border=top]{border-width:1px 0 0}&[data-surface-border=right]{border-width:0 1px 0 0}&[data-surface-border=bottom]{border-width:0 0 1px}&[data-surface-border=left]{border-width:0 0 0 1px}&[data-surface-border=x]{border-width:0 1px}&[data-surface-border=y]{border-width:1px 0}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--vui-surface-background-hover)}}}}
|
|
@@ -3,7 +3,9 @@ import { SurfacePadding, SurfaceRadiusInput } from './surface-radius-context';
|
|
|
3
3
|
import type * as React from 'react';
|
|
4
4
|
/** Base ramp layer for nested surfaces; clamped to 1–3 at runtime. */
|
|
5
5
|
type SurfaceBaseLevel = 1 | 2 | 3;
|
|
6
|
-
|
|
6
|
+
/** Named surface color tokens resolved via `data-surface-color` / `data-surface-hover-color` CSS hooks. */
|
|
7
|
+
type SurfaceColorToken = 'primary';
|
|
8
|
+
type SurfaceColor = string | SurfaceBaseLevel | SurfaceColorToken;
|
|
7
9
|
/**
|
|
8
10
|
* Public Surface props.
|
|
9
11
|
*
|
|
@@ -26,13 +28,15 @@ export type SurfaceProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'color'>
|
|
|
26
28
|
*/
|
|
27
29
|
ref?: React.Ref<HTMLElement>;
|
|
28
30
|
/**
|
|
29
|
-
* Sets the resting background using a base ramp layer (`1`–`3`)
|
|
31
|
+
* Sets the resting background using a base ramp layer (`1`–`3`), a literal CSS color value, or the named token
|
|
32
|
+
* `primary` (`data-surface-color="primary"`; CSS owns light/dark opacity via `--global-primary`).
|
|
30
33
|
*
|
|
31
34
|
* @default No background.
|
|
32
35
|
*/
|
|
33
36
|
color?: SurfaceColor;
|
|
34
37
|
/**
|
|
35
|
-
* Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`)
|
|
38
|
+
* Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`), a literal CSS value, or the
|
|
39
|
+
* named token `primary` (`data-surface-hover-color="primary"`; CSS owns light/dark opacity via `--global-primary`).
|
|
36
40
|
*
|
|
37
41
|
* @default No hover color override.
|
|
38
42
|
*/
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"description": "Sets the CSS border style when `border` is set."
|
|
41
41
|
},
|
|
42
42
|
"color": {
|
|
43
|
-
"description": "Sets the resting background using a base ramp layer (`1`–`3`)
|
|
43
|
+
"description": "Sets the resting background using a base ramp layer (`1`–`3`), a literal CSS color value, or the named token `primary` (`data-surface-color=\"primary\"`; CSS owns light/dark opacity via `--global-primary`)."
|
|
44
44
|
},
|
|
45
45
|
"hoverColor": {
|
|
46
|
-
"description": "Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`)
|
|
46
|
+
"description": "Sets the hover background on hover-capable pointers using a base ramp layer (`1`–`3`), a literal CSS value, or the named token `primary` (`data-surface-hover-color=\"primary\"`; CSS owns light/dark opacity via `--global-primary`)."
|
|
47
47
|
},
|
|
48
48
|
"hPadding": {
|
|
49
49
|
"description": "Sets inline padding using one token for both sides or a `[start, end]` tuple."
|
|
@@ -7,6 +7,7 @@ import surface_module_default from "./surface.module.js";
|
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
8
|
import { useRender } from "@base-ui/react/use-render";
|
|
9
9
|
//#region src/components/surface/surface.tsx
|
|
10
|
+
var isSurfaceColorToken = (value) => value === "primary";
|
|
10
11
|
var clampSurfaceBaseLevel = (value) => {
|
|
11
12
|
if (value <= 1) return 1;
|
|
12
13
|
if (value >= 3) return 3;
|
|
@@ -30,8 +31,8 @@ var Surface = ({ border, borderStyle = "solid", className, color, hPadding, hove
|
|
|
30
31
|
vPadding
|
|
31
32
|
});
|
|
32
33
|
const dynamicStyle = {
|
|
33
|
-
"--vui-surface-background": toSurfaceColor(color ?? "none"),
|
|
34
|
-
...hasHoverColor && { "--vui-surface-background-hover": toSurfaceColor(hoverColor) },
|
|
34
|
+
...!isSurfaceColorToken(color) && { "--vui-surface-background": toSurfaceColor(color ?? "none") },
|
|
35
|
+
...hasHoverColor && !isSurfaceColorToken(hoverColor) && { "--vui-surface-background-hover": toSurfaceColor(hoverColor) },
|
|
35
36
|
...border && { "--vui-surface-border-style": borderStyle },
|
|
36
37
|
...overflow && { "--vui-surface-overflow": overflow },
|
|
37
38
|
...radiusStyle,
|
|
@@ -47,6 +48,8 @@ var Surface = ({ border, borderStyle = "solid", className, color, hPadding, hove
|
|
|
47
48
|
...otherProps,
|
|
48
49
|
...border && { "data-surface-border": border },
|
|
49
50
|
...hasAutoRadius && { "data-surface-radius": "auto" },
|
|
51
|
+
...isSurfaceColorToken(color) && { "data-surface-color": color },
|
|
52
|
+
...isSurfaceColorToken(hoverColor) && { "data-surface-hover-color": hoverColor },
|
|
50
53
|
"data-surface-has-hover-color": hasHoverColor ? "true" : "false",
|
|
51
54
|
"data-surface-has-padding": hasPadding ? "true" : "false",
|
|
52
55
|
className: clsx(surface_module_default.Surface, className),
|
package/dist/index.js
CHANGED
|
@@ -25,11 +25,13 @@ import { getElevationProps } from "./core/elevation/get-elevation-props.js";
|
|
|
25
25
|
import { Elevator } from "./components/elevator/elevator.js";
|
|
26
26
|
import { Fieldset } from "./components/fieldset/fieldset.js";
|
|
27
27
|
import { FitText } from "./components/fit-text/fit-text.js";
|
|
28
|
+
import { Surface } from "./components/surface/surface.js";
|
|
29
|
+
import { getGlowListenerCount, getGlowRegistrySize } from "./components/glow/glow-tracker.js";
|
|
30
|
+
import { Glow } from "./components/glow/glow.js";
|
|
28
31
|
import { IconButton } from "./components/icon-button/icon-button.js";
|
|
29
32
|
import { IconButtonLink } from "./components/icon-button/icon-button-link.js";
|
|
30
33
|
import { LinearProgress } from "./components/linear-progress/linear-progress.js";
|
|
31
34
|
import { Masonry } from "./components/masonry/masonry.js";
|
|
32
|
-
import { Surface } from "./components/surface/surface.js";
|
|
33
35
|
import { MenuCheckboxItem } from "./components/menu/menu-checkbox-item.js";
|
|
34
36
|
import { MenuGroup } from "./components/menu/menu-group.js";
|
|
35
37
|
import { MenuItem } from "./components/menu/menu-item.js";
|
|
@@ -63,4 +65,4 @@ import { ToggleGroup } from "./components/toggle-group/toggle-group.js";
|
|
|
63
65
|
import { Typewriter } from "./components/typewriter/typewriter.js";
|
|
64
66
|
import { TooltipContent } from "./components/tooltip/tooltip-content.js";
|
|
65
67
|
import { Tooltip, TooltipProvider, TooltipTrigger } from "./components/tooltip/tooltip.js";
|
|
66
|
-
export { Accordion, Annotate, Autocomplete, Avatar, AvatarGroup, Badge, Bleed, Button, ButtonLink, Checkbox, CheckboxGroup, Chip, ClampText, Dialog, DialogClose, DialogIndent, DialogIndentBackground, DialogSheet, DialogTrigger, ELEVATION_DEFAULTS, Elevator, Fieldset, FitText, IconButton, IconButtonLink, LinearProgress, Masonry, Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuLinkItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Meter, Popover, PopoverClose, PopoverDescription, PopoverSheet, PopoverTitle, PopoverTrigger, ProgressiveBlur, Radio, RadioGroup, Select, Separator, Shimmer, Skeleton, Slider, Spinner, Stack, StaticNoise, Surface, Switch, Tabs, Text, Textarea, Textfield, Title, Toast, ToggleButton, ToggleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Typewriter, getElevationProps };
|
|
68
|
+
export { Accordion, Annotate, Autocomplete, Avatar, AvatarGroup, Badge, Bleed, Button, ButtonLink, Checkbox, CheckboxGroup, Chip, ClampText, Dialog, DialogClose, DialogIndent, DialogIndentBackground, DialogSheet, DialogTrigger, ELEVATION_DEFAULTS, Elevator, Fieldset, FitText, Glow, IconButton, IconButtonLink, LinearProgress, Masonry, Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuLinkItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger, Meter, Popover, PopoverClose, PopoverDescription, PopoverSheet, PopoverTitle, PopoverTrigger, ProgressiveBlur, Radio, RadioGroup, Select, Separator, Shimmer, Skeleton, Slider, Spinner, Stack, StaticNoise, Surface, Switch, Tabs, Text, Textarea, Textfield, Title, Toast, ToggleButton, ToggleGroup, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Typewriter, getElevationProps, getGlowListenerCount, getGlowRegistrySize };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viraui/react",
|
|
3
|
-
"version": "2026.0.
|
|
3
|
+
"version": "2026.0.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"unplugin-dts": "1.0.3",
|
|
36
36
|
"vite": "8.1.4",
|
|
37
37
|
"vite-plugin-static-copy": "4.1.1",
|
|
38
|
-
"@viraui/foundation": "2026.0.
|
|
38
|
+
"@viraui/foundation": "2026.0.5",
|
|
39
39
|
"@viraui/icons": "2026.0.0",
|
|
40
40
|
"@viraui/postcss-config": "2026.0.0",
|
|
41
41
|
"@viraui/tsconfig": "2026.0.0"
|