@backbay/glia 0.2.0-alpha.6 → 0.2.0-alpha.8
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/audio/index.js +1145 -5
- package/dist/audio/index.js.map +1 -1
- package/dist/components/index.js +3187 -10
- package/dist/components/index.js.map +1 -1
- package/dist/core.js +19714 -12
- package/dist/core.js.map +1 -1
- package/dist/emotion/index.js +1 -1
- package/dist/emotion/index.js.map +1 -1
- package/dist/hooks/index.js +941 -6
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.js +31841 -183
- package/dist/index.js.map +1 -1
- package/dist/primitives/index.js +21111 -57
- package/dist/primitives/index.js.map +1 -1
- package/dist/protocol/index.js +360 -2
- package/dist/protocol/index.js.map +1 -1
- package/dist/speakeasy/index.js +2786 -38
- package/dist/speakeasy/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme/index.js +1150 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/vision/index.js +370 -2
- package/dist/vision/index.js.map +1 -1
- package/dist/workspace/index.js +16824 -2
- package/dist/workspace/index.js.map +1 -1
- package/package.json +16 -10
- package/dist/AuroraBackground-AP6ZHVFA.js +0 -6
- package/dist/AuroraBackground-AP6ZHVFA.js.map +0 -1
- package/dist/BentoGrid-CDARICNM.js +0 -6
- package/dist/BentoGrid-CDARICNM.js.map +0 -1
- package/dist/CommandPalette-JCWJKRBY.js +0 -6
- package/dist/CommandPalette-JCWJKRBY.js.map +0 -1
- package/dist/Glass-H4X4ZI4P.js +0 -7
- package/dist/Glass-H4X4ZI4P.js.map +0 -1
- package/dist/GlitchText-KLQ57PPY.js +0 -6
- package/dist/GlitchText-KLQ57PPY.js.map +0 -1
- package/dist/GlowButton-VGBPMZO7.js +0 -6
- package/dist/GlowButton-VGBPMZO7.js.map +0 -1
- package/dist/Graph3D-GO7N2EZQ.js +0 -540
- package/dist/Graph3D-GO7N2EZQ.js.map +0 -1
- package/dist/HUDProgressRing-N6C5NAEV.js +0 -6
- package/dist/HUDProgressRing-N6C5NAEV.js.map +0 -1
- package/dist/KPIStat-PBQK27ZB.js +0 -6
- package/dist/KPIStat-PBQK27ZB.js.map +0 -1
- package/dist/NeonToast-W5F7MU3U.js +0 -6
- package/dist/NeonToast-W5F7MU3U.js.map +0 -1
- package/dist/ParticleField-WK6CNHWU.js +0 -51
- package/dist/ParticleField-WK6CNHWU.js.map +0 -1
- package/dist/TextGenerateEffect-EUCEIIUJ.js +0 -6
- package/dist/TextGenerateEffect-EUCEIIUJ.js.map +0 -1
- package/dist/ThreeDCard-VH5I3SSY.js +0 -6
- package/dist/ThreeDCard-VH5I3SSY.js.map +0 -1
- package/dist/TypingAnimation-GIWOHPIX.js +0 -6
- package/dist/TypingAnimation-GIWOHPIX.js.map +0 -1
- package/dist/alert-dialog-QOSYBIIE.js +0 -19
- package/dist/alert-dialog-QOSYBIIE.js.map +0 -1
- package/dist/avatar-N5R37PCU.js +0 -10
- package/dist/avatar-N5R37PCU.js.map +0 -1
- package/dist/badge-GTVIIGPY.js +0 -8
- package/dist/badge-GTVIIGPY.js.map +0 -1
- package/dist/button-D7IMSV2D.js +0 -8
- package/dist/button-D7IMSV2D.js.map +0 -1
- package/dist/chunk-3CMPQOMY.js +0 -69
- package/dist/chunk-3CMPQOMY.js.map +0 -1
- package/dist/chunk-3OQT6IYR.js +0 -41
- package/dist/chunk-3OQT6IYR.js.map +0 -1
- package/dist/chunk-43B2WVLS.js +0 -85
- package/dist/chunk-43B2WVLS.js.map +0 -1
- package/dist/chunk-4SRFO5W3.js +0 -121
- package/dist/chunk-4SRFO5W3.js.map +0 -1
- package/dist/chunk-5IZELOOU.js +0 -362
- package/dist/chunk-5IZELOOU.js.map +0 -1
- package/dist/chunk-6DM4ACSS.js +0 -154
- package/dist/chunk-6DM4ACSS.js.map +0 -1
- package/dist/chunk-6IGT34PC.js +0 -50
- package/dist/chunk-6IGT34PC.js.map +0 -1
- package/dist/chunk-6RKBCJHN.js +0 -194
- package/dist/chunk-6RKBCJHN.js.map +0 -1
- package/dist/chunk-6RX2WGCO.js +0 -108
- package/dist/chunk-6RX2WGCO.js.map +0 -1
- package/dist/chunk-7K4WZM3U.js +0 -189
- package/dist/chunk-7K4WZM3U.js.map +0 -1
- package/dist/chunk-7MDBHJPT.js +0 -407
- package/dist/chunk-7MDBHJPT.js.map +0 -1
- package/dist/chunk-7UQD6ROV.js +0 -9
- package/dist/chunk-7UQD6ROV.js.map +0 -1
- package/dist/chunk-AFNIVLZP.js +0 -1069
- package/dist/chunk-AFNIVLZP.js.map +0 -1
- package/dist/chunk-ANWYRO6A.js +0 -407
- package/dist/chunk-ANWYRO6A.js.map +0 -1
- package/dist/chunk-DIXPOHDO.js +0 -71
- package/dist/chunk-DIXPOHDO.js.map +0 -1
- package/dist/chunk-DWYMKYPI.js +0 -3
- package/dist/chunk-DWYMKYPI.js.map +0 -1
- package/dist/chunk-E3NVDCZG.js +0 -280
- package/dist/chunk-E3NVDCZG.js.map +0 -1
- package/dist/chunk-EBM7YBKL.js +0 -399
- package/dist/chunk-EBM7YBKL.js.map +0 -1
- package/dist/chunk-EPAM7IWW.js +0 -294
- package/dist/chunk-EPAM7IWW.js.map +0 -1
- package/dist/chunk-EXQ7GYRS.js +0 -134
- package/dist/chunk-EXQ7GYRS.js.map +0 -1
- package/dist/chunk-F4QTUZ3C.js +0 -136
- package/dist/chunk-F4QTUZ3C.js.map +0 -1
- package/dist/chunk-FEW533R2.js +0 -105
- package/dist/chunk-FEW533R2.js.map +0 -1
- package/dist/chunk-FFZLJKC7.js +0 -270
- package/dist/chunk-FFZLJKC7.js.map +0 -1
- package/dist/chunk-GEAMOBF7.js +0 -8486
- package/dist/chunk-GEAMOBF7.js.map +0 -1
- package/dist/chunk-GRTRSCTD.js +0 -74
- package/dist/chunk-GRTRSCTD.js.map +0 -1
- package/dist/chunk-IKGYOGLK.js +0 -16
- package/dist/chunk-IKGYOGLK.js.map +0 -1
- package/dist/chunk-IQ7WYWVJ.js +0 -73
- package/dist/chunk-IQ7WYWVJ.js.map +0 -1
- package/dist/chunk-IXIVWQLF.js +0 -543
- package/dist/chunk-IXIVWQLF.js.map +0 -1
- package/dist/chunk-JCJU57RC.js +0 -115
- package/dist/chunk-JCJU57RC.js.map +0 -1
- package/dist/chunk-KORSTBU4.js +0 -117
- package/dist/chunk-KORSTBU4.js.map +0 -1
- package/dist/chunk-KSEZ6UM2.js +0 -235
- package/dist/chunk-KSEZ6UM2.js.map +0 -1
- package/dist/chunk-MHPF7R3O.js +0 -1376
- package/dist/chunk-MHPF7R3O.js.map +0 -1
- package/dist/chunk-MPC5IH7E.js +0 -81
- package/dist/chunk-MPC5IH7E.js.map +0 -1
- package/dist/chunk-MQIU2NYA.js +0 -114
- package/dist/chunk-MQIU2NYA.js.map +0 -1
- package/dist/chunk-NYMBJOGR.js +0 -2192
- package/dist/chunk-NYMBJOGR.js.map +0 -1
- package/dist/chunk-OBZD2M3C.js +0 -169
- package/dist/chunk-OBZD2M3C.js.map +0 -1
- package/dist/chunk-ODM2AG6G.js +0 -176
- package/dist/chunk-ODM2AG6G.js.map +0 -1
- package/dist/chunk-ONDKF5LP.js +0 -53
- package/dist/chunk-ONDKF5LP.js.map +0 -1
- package/dist/chunk-P25YCWQB.js +0 -41
- package/dist/chunk-P25YCWQB.js.map +0 -1
- package/dist/chunk-PFYVNM6H.js +0 -14
- package/dist/chunk-PFYVNM6H.js.map +0 -1
- package/dist/chunk-PWNNSGFL.js +0 -20
- package/dist/chunk-PWNNSGFL.js.map +0 -1
- package/dist/chunk-Q2PGZVOT.js +0 -36
- package/dist/chunk-Q2PGZVOT.js.map +0 -1
- package/dist/chunk-Q2XDMV7U.js +0 -76
- package/dist/chunk-Q2XDMV7U.js.map +0 -1
- package/dist/chunk-QG7FH2FI.js +0 -45
- package/dist/chunk-QG7FH2FI.js.map +0 -1
- package/dist/chunk-R7HUOK2D.js +0 -1914
- package/dist/chunk-R7HUOK2D.js.map +0 -1
- package/dist/chunk-REUYY7G5.js +0 -773
- package/dist/chunk-REUYY7G5.js.map +0 -1
- package/dist/chunk-RHC2Z2HT.js +0 -199
- package/dist/chunk-RHC2Z2HT.js.map +0 -1
- package/dist/chunk-RMCVLIFE.js +0 -23
- package/dist/chunk-RMCVLIFE.js.map +0 -1
- package/dist/chunk-ROZLTXGR.js +0 -234
- package/dist/chunk-ROZLTXGR.js.map +0 -1
- package/dist/chunk-RSS2C2O3.js +0 -17
- package/dist/chunk-RSS2C2O3.js.map +0 -1
- package/dist/chunk-SAGCG5SH.js +0 -355
- package/dist/chunk-SAGCG5SH.js.map +0 -1
- package/dist/chunk-TM6AOUSD.js +0 -40
- package/dist/chunk-TM6AOUSD.js.map +0 -1
- package/dist/chunk-TPK4BYCO.js +0 -970
- package/dist/chunk-TPK4BYCO.js.map +0 -1
- package/dist/chunk-UNQIL4K2.js +0 -34
- package/dist/chunk-UNQIL4K2.js.map +0 -1
- package/dist/chunk-UUG6L75Y.js +0 -47
- package/dist/chunk-UUG6L75Y.js.map +0 -1
- package/dist/chunk-V2SYMV4W.js +0 -114
- package/dist/chunk-V2SYMV4W.js.map +0 -1
- package/dist/chunk-V7EN5CTH.js +0 -130
- package/dist/chunk-V7EN5CTH.js.map +0 -1
- package/dist/chunk-VITKG2HL.js +0 -1125
- package/dist/chunk-VITKG2HL.js.map +0 -1
- package/dist/chunk-VYEWU5LO.js +0 -2631
- package/dist/chunk-VYEWU5LO.js.map +0 -1
- package/dist/chunk-W67QAGSH.js +0 -178
- package/dist/chunk-W67QAGSH.js.map +0 -1
- package/dist/chunk-WWBIN6KV.js +0 -1353
- package/dist/chunk-WWBIN6KV.js.map +0 -1
- package/dist/chunk-X77Z4PFB.js +0 -224
- package/dist/chunk-X77Z4PFB.js.map +0 -1
- package/dist/chunk-X7VG7OTT.js +0 -8
- package/dist/chunk-X7VG7OTT.js.map +0 -1
- package/dist/chunk-XE4K2SGI.js +0 -74
- package/dist/chunk-XE4K2SGI.js.map +0 -1
- package/dist/chunk-YIUG7IJK.js +0 -628
- package/dist/chunk-YIUG7IJK.js.map +0 -1
- package/dist/chunk-YNVN3V4Y.js +0 -13
- package/dist/chunk-YNVN3V4Y.js.map +0 -1
- package/dist/chunk-Z2S54IZX.js +0 -198
- package/dist/chunk-Z2S54IZX.js.map +0 -1
- package/dist/chunk-ZR6AH25Z.js +0 -17
- package/dist/chunk-ZR6AH25Z.js.map +0 -1
- package/dist/dialog-SPM3DTTI.js +0 -17
- package/dist/dialog-SPM3DTTI.js.map +0 -1
- package/dist/dropdown-menu-HMTWKWGK.js +0 -21
- package/dist/dropdown-menu-HMTWKWGK.js.map +0 -1
- package/dist/input-BH4P4S26.js +0 -6
- package/dist/input-BH4P4S26.js.map +0 -1
- package/dist/label-5Z4Q6VER.js +0 -8
- package/dist/label-5Z4Q6VER.js.map +0 -1
- package/dist/popover-IFOUXYLI.js +0 -18
- package/dist/popover-IFOUXYLI.js.map +0 -1
- package/dist/scroll-area-DJXNW6QX.js +0 -14
- package/dist/scroll-area-DJXNW6QX.js.map +0 -1
- package/dist/select-FZ277C3G.js +0 -22
- package/dist/select-FZ277C3G.js.map +0 -1
- package/dist/separator-BTMLN4NB.js +0 -8
- package/dist/separator-BTMLN4NB.js.map +0 -1
- package/dist/skeleton-DXIWBH4W.js +0 -6
- package/dist/skeleton-DXIWBH4W.js.map +0 -1
- package/dist/switch-4MCXIZBY.js +0 -13
- package/dist/switch-4MCXIZBY.js.map +0 -1
- package/dist/tabs-O7AW3APK.js +0 -17
- package/dist/tabs-O7AW3APK.js.map +0 -1
- package/dist/textarea-IB5WAFDO.js +0 -6
- package/dist/textarea-IB5WAFDO.js.map +0 -1
- package/dist/toggle-XVPPG6P4.js +0 -10
- package/dist/toggle-XVPPG6P4.js.map +0 -1
- package/dist/tooltip-JICZTD4F.js +0 -18
- package/dist/tooltip-JICZTD4F.js.map +0 -1
package/dist/chunk-E3NVDCZG.js
DELETED
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
import { useGlassTokens, useElevationTokens, useMotionTokens, getGlassMaterial, getReducedTransparencyStyles, buildBackdropFilter } from './chunk-VITKG2HL.js';
|
|
2
|
-
import { cn } from './chunk-6RX2WGCO.js';
|
|
3
|
-
import { usePrefersReducedTransparency } from './chunk-3CMPQOMY.js';
|
|
4
|
-
import { cva } from 'class-variance-authority';
|
|
5
|
-
import { motion } from 'framer-motion';
|
|
6
|
-
import * as React2 from 'react';
|
|
7
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
-
|
|
9
|
-
// src/lib/noise.ts
|
|
10
|
-
var DEFAULTS = {
|
|
11
|
-
baseFrequency: 0.8,
|
|
12
|
-
numOctaves: 3,
|
|
13
|
-
opacity: 0.04,
|
|
14
|
-
size: 200,
|
|
15
|
-
seed: 2
|
|
16
|
-
};
|
|
17
|
-
function generateNoiseDataUrl(config) {
|
|
18
|
-
const {
|
|
19
|
-
baseFrequency,
|
|
20
|
-
numOctaves,
|
|
21
|
-
opacity,
|
|
22
|
-
size,
|
|
23
|
-
seed
|
|
24
|
-
} = { ...DEFAULTS, ...config };
|
|
25
|
-
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><filter id="n"><feTurbulence type="fractalNoise" baseFrequency="${baseFrequency}" numOctaves="${numOctaves}" seed="${seed}" stitchTiles="stitch"/><feColorMatrix type="saturate" values="0"/></filter><rect width="${size}" height="${size}" filter="url(#n)" opacity="${opacity}"/></svg>`;
|
|
26
|
-
return `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
|
27
|
-
}
|
|
28
|
-
var NOISE_PRESETS = {
|
|
29
|
-
/** Subtle grain for glass panels. opacity: 0.03, freq: 0.8 */
|
|
30
|
-
glass: generateNoiseDataUrl({ opacity: 0.03, baseFrequency: 0.8 }),
|
|
31
|
-
/** Medium grain for cards/sections. opacity: 0.05, freq: 0.7 */
|
|
32
|
-
card: generateNoiseDataUrl({ opacity: 0.05, baseFrequency: 0.7 }),
|
|
33
|
-
/** Heavy grain for film/retro effects. opacity: 0.12, freq: 0.9 */
|
|
34
|
-
heavy: generateNoiseDataUrl({ opacity: 0.12, baseFrequency: 0.9 }),
|
|
35
|
-
/** Fine grain for subtle texture. opacity: 0.02, freq: 1.2 */
|
|
36
|
-
fine: generateNoiseDataUrl({ opacity: 0.02, baseFrequency: 1.2 })
|
|
37
|
-
};
|
|
38
|
-
var NoiseOverlay = React2.memo(function NoiseOverlay2({
|
|
39
|
-
preset = "glass",
|
|
40
|
-
config,
|
|
41
|
-
opacity,
|
|
42
|
-
blendMode = "overlay",
|
|
43
|
-
className,
|
|
44
|
-
style
|
|
45
|
-
}) {
|
|
46
|
-
const noiseUrl = React2.useMemo(
|
|
47
|
-
() => config ? generateNoiseDataUrl(config) : NOISE_PRESETS[preset],
|
|
48
|
-
[config, preset]
|
|
49
|
-
);
|
|
50
|
-
return /* @__PURE__ */ jsx(
|
|
51
|
-
"div",
|
|
52
|
-
{
|
|
53
|
-
className,
|
|
54
|
-
"aria-hidden": "true",
|
|
55
|
-
style: {
|
|
56
|
-
position: "absolute",
|
|
57
|
-
inset: 0,
|
|
58
|
-
pointerEvents: "none",
|
|
59
|
-
backgroundImage: `url("${noiseUrl}")`,
|
|
60
|
-
backgroundRepeat: "repeat",
|
|
61
|
-
backgroundSize: `${config?.size ?? 200}px ${config?.size ?? 200}px`,
|
|
62
|
-
mixBlendMode: blendMode,
|
|
63
|
-
opacity: opacity ?? config?.opacity ?? void 0,
|
|
64
|
-
borderRadius: "inherit",
|
|
65
|
-
zIndex: 1,
|
|
66
|
-
...style
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
);
|
|
70
|
-
});
|
|
71
|
-
var glassPanelVariants = cva("relative overflow-hidden", {
|
|
72
|
-
variants: {
|
|
73
|
-
variant: {
|
|
74
|
-
/** Standard panel surface */
|
|
75
|
-
default: "rounded-xl",
|
|
76
|
-
/** Larger, more prominent panel */
|
|
77
|
-
prominent: "rounded-2xl",
|
|
78
|
-
/** Subtle card within a panel */
|
|
79
|
-
card: "rounded-lg",
|
|
80
|
-
/** Full-bleed panel (no rounding) */
|
|
81
|
-
flush: "rounded-none"
|
|
82
|
-
},
|
|
83
|
-
elevation: {
|
|
84
|
-
/** Flat, no shadow */
|
|
85
|
-
none: "",
|
|
86
|
-
/** Subtle drop shadow */
|
|
87
|
-
soft: "",
|
|
88
|
-
/** HUD panel shadow */
|
|
89
|
-
hud: "",
|
|
90
|
-
/** Modal/overlay shadow */
|
|
91
|
-
modal: ""
|
|
92
|
-
},
|
|
93
|
-
interactive: {
|
|
94
|
-
true: "cursor-pointer",
|
|
95
|
-
false: ""
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
defaultVariants: {
|
|
99
|
-
variant: "default",
|
|
100
|
-
elevation: "soft",
|
|
101
|
-
interactive: false
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
function HoverGlow({ isHovered, intensity = "subtle", color }) {
|
|
105
|
-
const motionTokens = useMotionTokens();
|
|
106
|
-
const glassTokens = useGlassTokens();
|
|
107
|
-
const opacityMax = intensity === "subtle" ? 0.35 : 0.5;
|
|
108
|
-
return /* @__PURE__ */ jsx(
|
|
109
|
-
motion.div,
|
|
110
|
-
{
|
|
111
|
-
initial: false,
|
|
112
|
-
animate: {
|
|
113
|
-
opacity: isHovered ? opacityMax : 0,
|
|
114
|
-
scale: isHovered ? 1.05 : 0.95
|
|
115
|
-
},
|
|
116
|
-
transition: motionTokens.normal,
|
|
117
|
-
className: "pointer-events-none absolute inset-0 -z-10 blur-3xl",
|
|
118
|
-
style: {
|
|
119
|
-
background: `radial-gradient(ellipse at center, ${color ?? glassTokens.hoverBg}, transparent 70%)`
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
var GlassPanel = React2.forwardRef(function GlassPanel2({
|
|
125
|
-
children,
|
|
126
|
-
className,
|
|
127
|
-
variant,
|
|
128
|
-
elevation,
|
|
129
|
-
interactive,
|
|
130
|
-
showHoverGlow = false,
|
|
131
|
-
isActive = false,
|
|
132
|
-
disableAnimations = false,
|
|
133
|
-
background,
|
|
134
|
-
border,
|
|
135
|
-
style,
|
|
136
|
-
as: Component = "div",
|
|
137
|
-
material,
|
|
138
|
-
showNoise,
|
|
139
|
-
noiseOpacity,
|
|
140
|
-
forceReducedTransparency,
|
|
141
|
-
onMouseEnter,
|
|
142
|
-
onMouseLeave,
|
|
143
|
-
...props
|
|
144
|
-
}, ref) {
|
|
145
|
-
const glassTokens = useGlassTokens();
|
|
146
|
-
const elevationTokens = useElevationTokens();
|
|
147
|
-
const motionTokens = useMotionTokens();
|
|
148
|
-
const [isHovered, setIsHovered] = React2.useState(false);
|
|
149
|
-
const reducedTransparency = usePrefersReducedTransparency();
|
|
150
|
-
const isReducedTransparency = forceReducedTransparency ?? reducedTransparency;
|
|
151
|
-
const mat = material != null ? getGlassMaterial(material) : null;
|
|
152
|
-
const rtOverrides = mat && isReducedTransparency ? getReducedTransparencyStyles(mat) : null;
|
|
153
|
-
const defaultBlur = `blur(${glassTokens.panelBlur ?? "24px"})`;
|
|
154
|
-
const effectiveBackdropFilter = mat ? rtOverrides ? rtOverrides.backdropFilter : buildBackdropFilter(mat) : isReducedTransparency ? "none" : defaultBlur;
|
|
155
|
-
const effectiveBackground = background ?? glassTokens.panelBg;
|
|
156
|
-
const effectiveShowNoise = showNoise ?? (rtOverrides ? rtOverrides.showNoise : mat?.showNoise ?? false);
|
|
157
|
-
const effectiveNoiseOpacity = noiseOpacity ?? mat?.noiseOpacity ?? 0.03;
|
|
158
|
-
const shadowMap = {
|
|
159
|
-
none: "none",
|
|
160
|
-
soft: elevationTokens.softDrop,
|
|
161
|
-
hud: elevationTokens.hudPanel,
|
|
162
|
-
modal: elevationTokens.modal
|
|
163
|
-
};
|
|
164
|
-
const handleMouseEnter = (e) => {
|
|
165
|
-
setIsHovered(true);
|
|
166
|
-
onMouseEnter?.(e);
|
|
167
|
-
};
|
|
168
|
-
const handleMouseLeave = (e) => {
|
|
169
|
-
setIsHovered(false);
|
|
170
|
-
onMouseLeave?.(e);
|
|
171
|
-
};
|
|
172
|
-
const motionTags = {
|
|
173
|
-
div: motion.div,
|
|
174
|
-
section: motion.section,
|
|
175
|
-
article: motion.article,
|
|
176
|
-
aside: motion.aside,
|
|
177
|
-
nav: motion.nav
|
|
178
|
-
};
|
|
179
|
-
const MotionComponent = motionTags[Component];
|
|
180
|
-
return /* @__PURE__ */ jsxs(
|
|
181
|
-
MotionComponent,
|
|
182
|
-
{
|
|
183
|
-
ref,
|
|
184
|
-
className: cn(glassPanelVariants({ variant, elevation, interactive }), className),
|
|
185
|
-
style: {
|
|
186
|
-
backdropFilter: effectiveBackdropFilter,
|
|
187
|
-
WebkitBackdropFilter: effectiveBackdropFilter,
|
|
188
|
-
background: effectiveBackground,
|
|
189
|
-
borderWidth: 1,
|
|
190
|
-
borderStyle: "solid",
|
|
191
|
-
borderColor: isActive ? glassTokens.activeBorder : border ?? glassTokens.panelBorder,
|
|
192
|
-
boxShadow: isActive ? glassTokens.activeShadow : shadowMap[elevation ?? "soft"],
|
|
193
|
-
...style
|
|
194
|
-
},
|
|
195
|
-
onMouseEnter: handleMouseEnter,
|
|
196
|
-
onMouseLeave: handleMouseLeave,
|
|
197
|
-
whileHover: interactive && !disableAnimations ? {
|
|
198
|
-
borderColor: glassTokens.activeBorder,
|
|
199
|
-
transition: motionTokens.fast
|
|
200
|
-
} : void 0,
|
|
201
|
-
...props,
|
|
202
|
-
children: [
|
|
203
|
-
effectiveShowNoise && /* @__PURE__ */ jsx(
|
|
204
|
-
NoiseOverlay,
|
|
205
|
-
{
|
|
206
|
-
preset: mat?.noisePreset ?? "glass",
|
|
207
|
-
opacity: effectiveNoiseOpacity
|
|
208
|
-
}
|
|
209
|
-
),
|
|
210
|
-
showHoverGlow && /* @__PURE__ */ jsx(HoverGlow, { isHovered }),
|
|
211
|
-
children
|
|
212
|
-
]
|
|
213
|
-
}
|
|
214
|
-
);
|
|
215
|
-
});
|
|
216
|
-
function GlassHeader({ children, className, style, ...props }) {
|
|
217
|
-
const glassTokens = useGlassTokens();
|
|
218
|
-
return /* @__PURE__ */ jsx(
|
|
219
|
-
"div",
|
|
220
|
-
{
|
|
221
|
-
className: cn("relative flex items-center justify-between px-4 py-3", "border-b", className),
|
|
222
|
-
style: {
|
|
223
|
-
background: glassTokens.headerGradient,
|
|
224
|
-
borderColor: glassTokens.cardBorder,
|
|
225
|
-
...style
|
|
226
|
-
},
|
|
227
|
-
...props,
|
|
228
|
-
children
|
|
229
|
-
}
|
|
230
|
-
);
|
|
231
|
-
}
|
|
232
|
-
var GlassCard = React2.forwardRef(function GlassCard2({ children, className, interactive = false, isActive = false, style, ...props }, ref) {
|
|
233
|
-
const glassTokens = useGlassTokens();
|
|
234
|
-
const elevationTokens = useElevationTokens();
|
|
235
|
-
const motionTokens = useMotionTokens();
|
|
236
|
-
const [isHovered, setIsHovered] = React2.useState(false);
|
|
237
|
-
return /* @__PURE__ */ jsxs(
|
|
238
|
-
motion.div,
|
|
239
|
-
{
|
|
240
|
-
ref,
|
|
241
|
-
className: cn("relative rounded-xl p-3", interactive && "cursor-pointer", className),
|
|
242
|
-
style: {
|
|
243
|
-
background: glassTokens.cardBg,
|
|
244
|
-
borderWidth: 1,
|
|
245
|
-
borderStyle: "solid",
|
|
246
|
-
borderColor: isActive ? glassTokens.activeBorder : glassTokens.cardBorder,
|
|
247
|
-
boxShadow: isActive ? glassTokens.activeShadow : elevationTokens.softDrop,
|
|
248
|
-
...style
|
|
249
|
-
},
|
|
250
|
-
onMouseEnter: () => setIsHovered(true),
|
|
251
|
-
onMouseLeave: () => setIsHovered(false),
|
|
252
|
-
whileHover: interactive ? {
|
|
253
|
-
borderColor: glassTokens.activeBorder,
|
|
254
|
-
boxShadow: `0 4px 20px ${glassTokens.hoverBg}`,
|
|
255
|
-
transition: motionTokens.fast
|
|
256
|
-
} : void 0,
|
|
257
|
-
...props,
|
|
258
|
-
children: [
|
|
259
|
-
interactive && /* @__PURE__ */ jsx(HoverGlow, { isHovered, intensity: "subtle" }),
|
|
260
|
-
children
|
|
261
|
-
]
|
|
262
|
-
}
|
|
263
|
-
);
|
|
264
|
-
});
|
|
265
|
-
function GlassSection({
|
|
266
|
-
children,
|
|
267
|
-
title,
|
|
268
|
-
compact = false,
|
|
269
|
-
className,
|
|
270
|
-
...props
|
|
271
|
-
}) {
|
|
272
|
-
return /* @__PURE__ */ jsxs("div", { className: cn(compact ? "p-2" : "p-4", "space-y-2", className), ...props, children: [
|
|
273
|
-
title && /* @__PURE__ */ jsx("h4", { className: "text-[10px] font-mono uppercase tracking-[0.12em] text-[var(--glia-color-text-soft,#64748B)] px-1", children: title }),
|
|
274
|
-
children
|
|
275
|
-
] });
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
export { GlassCard, GlassHeader, GlassPanel, GlassSection, NOISE_PRESETS, NoiseOverlay, generateNoiseDataUrl };
|
|
279
|
-
//# sourceMappingURL=chunk-E3NVDCZG.js.map
|
|
280
|
-
//# sourceMappingURL=chunk-E3NVDCZG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/noise.ts","../src/primitives/organisms/Glass/NoiseOverlay.tsx","../src/primitives/organisms/Glass/GlassPanel.tsx"],"names":["React","NoiseOverlay","jsx","GlassPanel","GlassCard"],"mappings":"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","file":"chunk-E3NVDCZG.js","sourcesContent":["/**\n * Noise texture utilities for glassmorphism effects.\n *\n * Generates SVG-based noise textures as data URLs for use\n * as background overlays on glass surfaces.\n */\n\nexport interface NoiseConfig {\n /** Base frequency for fractal noise (0.1-2.0). Higher = finer grain. Default: 0.8 */\n baseFrequency?: number;\n /** Number of octaves (1-5). More octaves = more detail. Default: 3 */\n numOctaves?: number;\n /** Noise opacity (0-1). Default: 0.04 */\n opacity?: number;\n /** Tile size in pixels. Default: 200 */\n size?: number;\n /** Random seed. Default: 2 */\n seed?: number;\n}\n\nconst DEFAULTS: Required<NoiseConfig> = {\n baseFrequency: 0.8,\n numOctaves: 3,\n opacity: 0.04,\n size: 200,\n seed: 2,\n};\n\n/**\n * Generate a noise texture SVG data URL with the given config.\n */\nexport function generateNoiseDataUrl(config?: NoiseConfig): string {\n const {\n baseFrequency,\n numOctaves,\n opacity,\n size,\n seed,\n } = { ...DEFAULTS, ...config };\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\"><filter id=\"n\"><feTurbulence type=\"fractalNoise\" baseFrequency=\"${baseFrequency}\" numOctaves=\"${numOctaves}\" seed=\"${seed}\" stitchTiles=\"stitch\"/><feColorMatrix type=\"saturate\" values=\"0\"/></filter><rect width=\"${size}\" height=\"${size}\" filter=\"url(#n)\" opacity=\"${opacity}\"/></svg>`;\n\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n\n/** Pre-generated noise textures for common use cases */\nexport const NOISE_PRESETS = {\n /** Subtle grain for glass panels. opacity: 0.03, freq: 0.8 */\n glass: generateNoiseDataUrl({ opacity: 0.03, baseFrequency: 0.8 }),\n /** Medium grain for cards/sections. opacity: 0.05, freq: 0.7 */\n card: generateNoiseDataUrl({ opacity: 0.05, baseFrequency: 0.7 }),\n /** Heavy grain for film/retro effects. opacity: 0.12, freq: 0.9 */\n heavy: generateNoiseDataUrl({ opacity: 0.12, baseFrequency: 0.9 }),\n /** Fine grain for subtle texture. opacity: 0.02, freq: 1.2 */\n fine: generateNoiseDataUrl({ opacity: 0.02, baseFrequency: 1.2 }),\n} as const;\n\nexport type NoisePreset = keyof typeof NOISE_PRESETS;\n","\"use client\";\n\n/**\n * NoiseOverlay -- SVG grain texture overlay for glass surfaces.\n *\n * Renders an absolutely-positioned, pointer-events-none div with\n * a tiling SVG noise pattern as background-image.\n *\n * @example\n * <div style={{ position: 'relative' }}>\n * <NoiseOverlay preset=\"glass\" />\n * {children}\n * </div>\n */\n\nimport * as React from \"react\";\nimport {\n NOISE_PRESETS,\n generateNoiseDataUrl,\n type NoisePreset,\n type NoiseConfig,\n} from \"../../../lib/noise\";\n\nexport interface NoiseOverlayProps {\n /** Use a preset noise configuration */\n preset?: NoisePreset;\n /** Custom noise config (overrides preset) */\n config?: NoiseConfig;\n /** Override opacity (0-1). Overrides both preset and config opacity. */\n opacity?: number;\n /** Blend mode. Default: 'overlay' */\n blendMode?: React.CSSProperties[\"mixBlendMode\"];\n /** Additional className */\n className?: string;\n /** Additional styles */\n style?: React.CSSProperties;\n}\n\nexport const NoiseOverlay = React.memo(function NoiseOverlay({\n preset = \"glass\",\n config,\n opacity,\n blendMode = \"overlay\",\n className,\n style,\n}: NoiseOverlayProps) {\n const noiseUrl = React.useMemo(\n () => (config ? generateNoiseDataUrl(config) : NOISE_PRESETS[preset]),\n [config, preset],\n );\n\n return (\n <div\n className={className}\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n backgroundImage: `url(\"${noiseUrl}\")`,\n backgroundRepeat: \"repeat\",\n backgroundSize: `${config?.size ?? 200}px ${config?.size ?? 200}px`,\n mixBlendMode: blendMode,\n opacity: opacity ?? config?.opacity ?? undefined,\n borderRadius: \"inherit\",\n zIndex: 1,\n ...style,\n }}\n />\n );\n});\n","\"use client\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { motion, type HTMLMotionProps } from \"framer-motion\";\nimport * as React from \"react\";\nimport { usePrefersReducedTransparency } from \"../../../lib/accessibility\";\nimport { useElevationTokens, useGlassTokens, useMotionTokens } from \"../../../theme\";\nimport {\n getGlassMaterial,\n buildBackdropFilter,\n getReducedTransparencyStyles,\n type GlassMaterialId,\n} from \"../../../theme/materials\";\nimport { NoiseOverlay } from \"./NoiseOverlay\";\n\n// ============================================================================\n// GLASS PANEL VARIANTS\n// ============================================================================\n\nconst glassPanelVariants = cva(\"relative overflow-hidden\", {\n variants: {\n variant: {\n /** Standard panel surface */\n default: \"rounded-xl\",\n /** Larger, more prominent panel */\n prominent: \"rounded-2xl\",\n /** Subtle card within a panel */\n card: \"rounded-lg\",\n /** Full-bleed panel (no rounding) */\n flush: \"rounded-none\",\n },\n elevation: {\n /** Flat, no shadow */\n none: \"\",\n /** Subtle drop shadow */\n soft: \"\",\n /** HUD panel shadow */\n hud: \"\",\n /** Modal/overlay shadow */\n modal: \"\",\n },\n interactive: {\n true: \"cursor-pointer\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n elevation: \"soft\",\n interactive: false,\n },\n});\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface GlassPanelProps\n extends Omit<HTMLMotionProps<\"div\">, \"children\">, VariantProps<typeof glassPanelVariants> {\n children: React.ReactNode;\n /** Show hover glow effect */\n showHoverGlow?: boolean;\n /** Show active state styling */\n isActive?: boolean;\n /** Disable animations */\n disableAnimations?: boolean;\n /** Custom background override */\n background?: string;\n /** Custom border override */\n border?: string;\n /** As container element */\n as?: \"div\" | \"section\" | \"article\" | \"aside\" | \"nav\";\n /** Glass material preset. Controls blur, opacity, noise, saturate, brightness. */\n material?: GlassMaterialId;\n /** Show noise texture overlay. Defaults to material's setting. */\n showNoise?: boolean;\n /** Noise opacity override (0-1) */\n noiseOpacity?: number;\n /** Force reduced transparency mode (overrides system preference) */\n forceReducedTransparency?: boolean;\n}\n\n// ============================================================================\n// HOVER GLOW COMPONENT\n// ============================================================================\n\ninterface HoverGlowProps {\n isHovered: boolean;\n intensity?: \"subtle\" | \"medium\";\n color?: string;\n}\n\nfunction HoverGlow({ isHovered, intensity = \"subtle\", color }: HoverGlowProps) {\n const motionTokens = useMotionTokens();\n const glassTokens = useGlassTokens();\n const opacityMax = intensity === \"subtle\" ? 0.35 : 0.5;\n\n return (\n <motion.div\n initial={false}\n animate={{\n opacity: isHovered ? opacityMax : 0,\n scale: isHovered ? 1.05 : 0.95,\n }}\n transition={motionTokens.normal}\n className=\"pointer-events-none absolute inset-0 -z-10 blur-3xl\"\n style={{\n background: `radial-gradient(ellipse at center, ${\n color ?? glassTokens.hoverBg\n }, transparent 70%)`,\n }}\n />\n );\n}\n\n// ============================================================================\n// GLASS PANEL\n// ============================================================================\n\nexport const GlassPanel = React.forwardRef<HTMLDivElement, GlassPanelProps>(function GlassPanel(\n {\n children,\n className,\n variant,\n elevation,\n interactive,\n showHoverGlow = false,\n isActive = false,\n disableAnimations = false,\n background,\n border,\n style,\n as: Component = \"div\",\n material,\n showNoise,\n noiseOpacity,\n forceReducedTransparency,\n onMouseEnter,\n onMouseLeave,\n ...props\n },\n ref\n) {\n const glassTokens = useGlassTokens();\n const elevationTokens = useElevationTokens();\n const motionTokens = useMotionTokens();\n const [isHovered, setIsHovered] = React.useState(false);\n\n const reducedTransparency = usePrefersReducedTransparency();\n const isReducedTransparency = forceReducedTransparency ?? reducedTransparency;\n\n // Material system: only active when `material` prop is explicitly set\n const mat = material != null ? getGlassMaterial(material) : null;\n const rtOverrides = mat && isReducedTransparency ? getReducedTransparencyStyles(mat) : null;\n\n // Compute backdrop filter\n const defaultBlur = `blur(${glassTokens.panelBlur ?? \"24px\"})`;\n const effectiveBackdropFilter = mat\n ? rtOverrides\n ? rtOverrides.backdropFilter\n : buildBackdropFilter(mat)\n : isReducedTransparency\n ? \"none\"\n : defaultBlur;\n\n // Compute background (when material is set and no explicit background override)\n const effectiveBackground = background ?? glassTokens.panelBg;\n\n // Compute noise visibility\n const effectiveShowNoise = showNoise ?? (rtOverrides ? rtOverrides.showNoise : mat?.showNoise ?? false);\n const effectiveNoiseOpacity = noiseOpacity ?? mat?.noiseOpacity ?? 0.03;\n\n // Map elevation to shadow\n const shadowMap = {\n none: \"none\",\n soft: elevationTokens.softDrop,\n hud: elevationTokens.hudPanel,\n modal: elevationTokens.modal,\n };\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {\n setIsHovered(true);\n onMouseEnter?.(e);\n };\n\n const handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {\n setIsHovered(false);\n onMouseLeave?.(e);\n };\n\n const motionTags = {\n div: motion.div,\n section: motion.section,\n article: motion.article,\n aside: motion.aside,\n nav: motion.nav,\n } as const;\n const MotionComponent = motionTags[Component];\n\n return (\n <MotionComponent\n ref={ref}\n className={cn(glassPanelVariants({ variant, elevation, interactive }), className)}\n style={{\n backdropFilter: effectiveBackdropFilter,\n WebkitBackdropFilter: effectiveBackdropFilter,\n background: effectiveBackground,\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: isActive ? glassTokens.activeBorder : (border ?? glassTokens.panelBorder),\n boxShadow: isActive ? glassTokens.activeShadow : shadowMap[elevation ?? \"soft\"],\n ...style,\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n whileHover={\n interactive && !disableAnimations\n ? {\n borderColor: glassTokens.activeBorder,\n transition: motionTokens.fast,\n }\n : undefined\n }\n {...props}\n >\n {effectiveShowNoise && (\n <NoiseOverlay\n preset={mat?.noisePreset ?? \"glass\"}\n opacity={effectiveNoiseOpacity}\n />\n )}\n {showHoverGlow && <HoverGlow isHovered={isHovered} />}\n {children}\n </MotionComponent>\n );\n});\n\n// ============================================================================\n// GLASS HEADER\n// ============================================================================\n\nexport interface GlassHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport function GlassHeader({ children, className, style, ...props }: GlassHeaderProps) {\n const glassTokens = useGlassTokens();\n\n return (\n <div\n className={cn(\"relative flex items-center justify-between px-4 py-3\", \"border-b\", className)}\n style={{\n background: glassTokens.headerGradient,\n borderColor: glassTokens.cardBorder,\n ...style,\n }}\n {...props}\n >\n {children}\n </div>\n );\n}\n\n// ============================================================================\n// GLASS CARD\n// ============================================================================\n\nexport interface GlassCardProps extends Omit<HTMLMotionProps<\"div\">, \"children\"> {\n children: React.ReactNode;\n /** Show hover effects */\n interactive?: boolean;\n /** Currently active/selected */\n isActive?: boolean;\n}\n\nexport const GlassCard = React.forwardRef<HTMLDivElement, GlassCardProps>(function GlassCard(\n { children, className, interactive = false, isActive = false, style, ...props },\n ref\n) {\n const glassTokens = useGlassTokens();\n const elevationTokens = useElevationTokens();\n const motionTokens = useMotionTokens();\n const [isHovered, setIsHovered] = React.useState(false);\n\n return (\n <motion.div\n ref={ref}\n className={cn(\"relative rounded-xl p-3\", interactive && \"cursor-pointer\", className)}\n style={{\n background: glassTokens.cardBg,\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: isActive ? glassTokens.activeBorder : glassTokens.cardBorder,\n boxShadow: isActive ? glassTokens.activeShadow : elevationTokens.softDrop,\n ...style,\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n whileHover={\n interactive\n ? {\n borderColor: glassTokens.activeBorder,\n boxShadow: `0 4px 20px ${glassTokens.hoverBg}`,\n transition: motionTokens.fast,\n }\n : undefined\n }\n {...props}\n >\n {interactive && <HoverGlow isHovered={isHovered} intensity=\"subtle\" />}\n {children}\n </motion.div>\n );\n});\n\n// ============================================================================\n// GLASS SECTION\n// ============================================================================\n\nexport interface GlassSectionProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Section title */\n title?: string;\n /** Compact padding */\n compact?: boolean;\n}\n\nexport function GlassSection({\n children,\n title,\n compact = false,\n className,\n ...props\n}: GlassSectionProps) {\n return (\n <div className={cn(compact ? \"p-2\" : \"p-4\", \"space-y-2\", className)} {...props}>\n {title && (\n <h4 className=\"text-[10px] font-mono uppercase tracking-[0.12em] text-[var(--glia-color-text-soft,#64748B)] px-1\">\n {title}\n </h4>\n )}\n {children}\n </div>\n );\n}\n"]}
|