@playfast/reform-better-hub-ui-primitives 0.0.2
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/README.md +115 -0
- package/dist/components/agent-icon.d.ts +5 -0
- package/dist/components/agent-icon.d.ts.map +1 -0
- package/dist/components/agent-icon.js +5 -0
- package/dist/components/agent-icon.js.map +1 -0
- package/dist/components/badge.d.ts +11 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +28 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +12 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +34 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/combobox.d.ts +25 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +60 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command.d.ts +19 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +36 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/dialog.d.ts +16 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +38 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +17 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +35 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/github-background.d.ts +3 -0
- package/dist/components/github-background.d.ts.map +1 -0
- package/dist/components/github-background.js +51 -0
- package/dist/components/github-background.js.map +1 -0
- package/dist/components/halftone-background.d.ts +3 -0
- package/dist/components/halftone-background.d.ts.map +1 -0
- package/dist/components/halftone-background.js +248 -0
- package/dist/components/halftone-background.js.map +1 -0
- package/dist/components/input-group.d.ts +19 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +63 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +5 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +7 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/live-duration.d.ts +9 -0
- package/dist/components/live-duration.d.ts.map +1 -0
- package/dist/components/live-duration.js +55 -0
- package/dist/components/live-duration.js.map +1 -0
- package/dist/components/logo.d.ts +8 -0
- package/dist/components/logo.d.ts.map +1 -0
- package/dist/components/logo.js +9 -0
- package/dist/components/logo.js.map +1 -0
- package/dist/components/popover.d.ts +12 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +26 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/resize-handle.d.ts +15 -0
- package/dist/components/resize-handle.d.ts.map +1 -0
- package/dist/components/resize-handle.js +36 -0
- package/dist/components/resize-handle.js.map +1 -0
- package/dist/components/sheet.d.ts +18 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +44 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +7 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/time-ago.d.ts +8 -0
- package/dist/components/time-ago.d.ts.map +1 -0
- package/dist/components/time-ago.js +40 -0
- package/dist/components/time-ago.js.map +1 -0
- package/dist/components/tooltip.d.ts +10 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +25 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/foundation/cn.d.ts +7 -0
- package/dist/foundation/cn.d.ts.map +1 -0
- package/dist/foundation/cn.js +8 -0
- package/dist/foundation/cn.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
function createRng(seed) {
|
|
4
|
+
let s = seed;
|
|
5
|
+
return () => {
|
|
6
|
+
s = (s * 16807) % 2147483647;
|
|
7
|
+
return (s - 1) / 2147483646;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const LEVELS = [
|
|
11
|
+
"rgba(255,255,255,0.02)",
|
|
12
|
+
"rgba(255,255,255,0.10)",
|
|
13
|
+
"rgba(255,255,255,0.18)",
|
|
14
|
+
"rgba(255,255,255,0.28)",
|
|
15
|
+
"rgba(255,255,255,0.40)",
|
|
16
|
+
];
|
|
17
|
+
const CELL = 15;
|
|
18
|
+
export function GitHubBackground() {
|
|
19
|
+
const grid = useMemo(() => {
|
|
20
|
+
const rng = createRng(42);
|
|
21
|
+
const cells = [];
|
|
22
|
+
for (let w = 0; w < 52; w++) {
|
|
23
|
+
for (let d = 0; d < 7; d++) {
|
|
24
|
+
const r = rng();
|
|
25
|
+
const level = r < 0.3 ? 0 : r < 0.5 ? 1 : r < 0.7 ? 2 : r < 0.85 ? 3 : 4;
|
|
26
|
+
cells.push({ w, d, level });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return cells;
|
|
30
|
+
}, []);
|
|
31
|
+
return (_jsxs("div", { className: "absolute inset-0 pointer-events-none overflow-hidden", style: { zIndex: 2 }, children: [_jsxs("div", { className: "absolute inset-0", style: {
|
|
32
|
+
maskImage: "radial-gradient(ellipse 85% 75% at 45% 35%, black 15%, transparent 60%)",
|
|
33
|
+
WebkitMaskImage: "radial-gradient(ellipse 85% 75% at 45% 35%, black 15%, transparent 60%)",
|
|
34
|
+
}, children: [_jsx("div", { className: "absolute", style: {
|
|
35
|
+
top: "8%",
|
|
36
|
+
left: "50%",
|
|
37
|
+
transform: "translate(-50%, 0) perspective(500px) rotateX(30deg) rotateZ(-2deg) scale(1.3)",
|
|
38
|
+
transformOrigin: "center top",
|
|
39
|
+
opacity: 0.4,
|
|
40
|
+
}, children: _jsx("svg", { width: 52 * CELL, height: 7 * CELL, viewBox: `0 0 ${52 * CELL} ${7 * CELL}`, children: grid.map(({ w, d, level }, i) => (_jsx("rect", { x: w * CELL, y: d * CELL, width: 12, height: 12, rx: 2, fill: LEVELS[level], opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.5s", begin: `${w * 0.04 + d * 0.015}s`, fill: "freeze" }) }, i))) }) }), _jsxs("svg", { className: "absolute inset-0 w-full h-full", viewBox: "0 0 400 900", preserveAspectRatio: "xMidYMid slice", style: { opacity: 0.45 }, children: [_jsx("line", { x1: "200", y1: "0", x2: "200", y2: "900", stroke: "rgba(255,255,255,0.15)", strokeWidth: "2", pathLength: 1, className: "git-line-anim", style: { animationDelay: "0.3s" } }), _jsx("path", { d: "M 200 150 C 200 180, 280 200, 280 230 L 280 350 C 280 380, 200 395, 200 400", stroke: "rgba(255,255,255,0.12)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "0.8s" } }), _jsx("path", { d: "M 200 300 C 200 325, 130 340, 130 360 L 130 500 C 130 525, 200 540, 200 550", stroke: "rgba(255,255,255,0.10)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "1.3s" } }), _jsx("path", { d: "M 200 550 C 200 570, 260 580, 260 600 L 260 650 C 260 670, 200 680, 200 690", stroke: "rgba(255,255,255,0.08)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "1.8s" } }), _jsx("path", { d: "M 200 620 C 200 640, 110 660, 110 680 L 110 800 C 110 820, 200 835, 200 850", stroke: "rgba(255,255,255,0.07)", strokeWidth: "2", fill: "none", pathLength: 1, className: "git-line-anim", style: { animationDelay: "2.2s" } }), [80, 150, 230, 300, 400, 480, 550, 620, 690, 770, 850].map((y, i) => (_jsx("circle", { cx: 200, cy: y, r: 4, fill: "rgba(255,255,255,0.25)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${0.5 + i * 0.15}s`, fill: "freeze" }) }, `m${i}`))), [230, 280, 330].map((y, i) => (_jsx("circle", { cx: 280, cy: y, r: 3.5, fill: "rgba(255,255,255,0.20)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${1.0 + i * 0.2}s`, fill: "freeze" }) }, `f1${i}`))), [360, 420, 470].map((y, i) => (_jsx("circle", { cx: 130, cy: y, r: 3.5, fill: "rgba(255,255,255,0.18)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${1.5 + i * 0.2}s`, fill: "freeze" }) }, `f2${i}`))), [600, 630, 660].map((y, i) => (_jsx("circle", { cx: 260, cy: y, r: 3, fill: "rgba(255,255,255,0.15)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${2.0 + i * 0.2}s`, fill: "freeze" }) }, `hf${i}`))), [680, 730, 780].map((y, i) => (_jsx("circle", { cx: 110, cy: y, r: 3, fill: "rgba(255,255,255,0.12)", opacity: 0, children: _jsx("animate", { attributeName: "opacity", from: "0", to: "1", dur: "0.3s", begin: `${2.4 + i * 0.2}s`, fill: "freeze" }) }, `f3${i}`)))] })] }), _jsx("style", { children: `
|
|
41
|
+
.git-line-anim {
|
|
42
|
+
stroke-dasharray: 1;
|
|
43
|
+
stroke-dashoffset: 1;
|
|
44
|
+
animation: gitDraw 2.5s ease-out forwards;
|
|
45
|
+
}
|
|
46
|
+
@keyframes gitDraw {
|
|
47
|
+
to { stroke-dashoffset: 0; }
|
|
48
|
+
}
|
|
49
|
+
` })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=github-background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-background.js","sourceRoot":"","sources":["../../src/components/github-background.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"halftone-background.d.ts","sourceRoot":"","sources":["../../src/components/halftone-background.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AA8IpC,wBAAgB,kBAAkB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA+ItD"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
const VERTEX_SHADER = `
|
|
4
|
+
attribute vec2 a_position;
|
|
5
|
+
void main() {
|
|
6
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
7
|
+
}`;
|
|
8
|
+
const FRAGMENT_SHADER = `
|
|
9
|
+
precision highp float;
|
|
10
|
+
|
|
11
|
+
uniform float u_time;
|
|
12
|
+
uniform vec2 u_resolution;
|
|
13
|
+
uniform vec2 u_mouse;
|
|
14
|
+
uniform float u_click;
|
|
15
|
+
uniform vec2 u_clickPos;
|
|
16
|
+
|
|
17
|
+
vec3 mod289(vec3 x) { return x - floor(x * (1.0/289.0)) * 289.0; }
|
|
18
|
+
vec2 mod289(vec2 x) { return x - floor(x * (1.0/289.0)) * 289.0; }
|
|
19
|
+
vec3 permute(vec3 x) { return mod289(((x*34.0)+1.0)*x); }
|
|
20
|
+
|
|
21
|
+
float snoise(vec2 v) {
|
|
22
|
+
const vec4 C = vec4(
|
|
23
|
+
0.211324865405187,
|
|
24
|
+
0.366025403784439,
|
|
25
|
+
-0.577350269189626,
|
|
26
|
+
0.024390243902439
|
|
27
|
+
);
|
|
28
|
+
vec2 i = floor(v + dot(v, C.yy));
|
|
29
|
+
vec2 x0 = v - i + dot(i, C.xx);
|
|
30
|
+
vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
|
|
31
|
+
vec4 x12 = x0.xyxy + C.xxzz;
|
|
32
|
+
x12.xy -= i1;
|
|
33
|
+
i = mod289(i);
|
|
34
|
+
vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));
|
|
35
|
+
vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);
|
|
36
|
+
m = m*m;
|
|
37
|
+
m = m*m;
|
|
38
|
+
vec3 x = 2.0 * fract(p * C.www) - 1.0;
|
|
39
|
+
vec3 h = abs(x) - 0.5;
|
|
40
|
+
vec3 ox = floor(x + 0.5);
|
|
41
|
+
vec3 a0 = x - ox;
|
|
42
|
+
m *= 1.79284291400159 - 0.85373472095314 * (a0*a0 + h*h);
|
|
43
|
+
vec3 g;
|
|
44
|
+
g.x = a0.x * x0.x + h.x * x0.y;
|
|
45
|
+
g.yz = a0.yz * x12.xz + h.yz * x12.yw;
|
|
46
|
+
return 130.0 * dot(m, g);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
float fbm(vec2 p) {
|
|
50
|
+
float value = 0.0;
|
|
51
|
+
float amp = 0.5;
|
|
52
|
+
float freq = 1.0;
|
|
53
|
+
for (int i = 0; i < 6; i++) {
|
|
54
|
+
value += amp * snoise(p * freq);
|
|
55
|
+
freq *= 2.0;
|
|
56
|
+
amp *= 0.5;
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
float hash21(vec2 p) {
|
|
62
|
+
p = fract(p * vec2(233.34, 851.73));
|
|
63
|
+
p += dot(p, p + 23.45);
|
|
64
|
+
return fract(p.x * p.y);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void main() {
|
|
68
|
+
vec2 uv = gl_FragCoord.xy / u_resolution.xy;
|
|
69
|
+
float aspect = u_resolution.x / u_resolution.y;
|
|
70
|
+
float time = u_time;
|
|
71
|
+
float t = time * 0.04;
|
|
72
|
+
|
|
73
|
+
vec2 ap = vec2(uv.x * aspect, uv.y);
|
|
74
|
+
|
|
75
|
+
// ═══ SHARED MOUSE WARP ═══
|
|
76
|
+
vec2 scaledP = ap * 2.5;
|
|
77
|
+
vec2 mUV = u_mouse;
|
|
78
|
+
mUV.x *= aspect;
|
|
79
|
+
mUV *= 2.5;
|
|
80
|
+
vec2 mDiff = scaledP - mUV;
|
|
81
|
+
float mDist = length(mDiff);
|
|
82
|
+
vec2 warp = vec2(0.0);
|
|
83
|
+
if (u_mouse.x > 0.0 && mDist < 0.5) {
|
|
84
|
+
warp = normalize(mDiff) * smoothstep(0.5, 0.0, mDist) * 0.2;
|
|
85
|
+
}
|
|
86
|
+
if (u_click > 0.01) {
|
|
87
|
+
vec2 cUV = u_clickPos;
|
|
88
|
+
cUV.x *= aspect;
|
|
89
|
+
cUV *= 2.5;
|
|
90
|
+
vec2 cD = scaledP - cUV;
|
|
91
|
+
float cDist = length(cD);
|
|
92
|
+
warp += normalize(cD + 0.001) * sin(cDist * 12.0 - time * 8.0) * u_click * 0.4 * exp(-cDist * 2.0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ═══ NOISE LAYER ═══
|
|
96
|
+
vec2 np = scaledP + warp;
|
|
97
|
+
vec2 q = vec2(fbm(np + t * 0.3), fbm(np + vec2(5.2, 1.3) + t * 0.2));
|
|
98
|
+
vec2 r = vec2(
|
|
99
|
+
fbm(np + 4.0 * q + vec2(1.7, 9.2) + t * 0.15),
|
|
100
|
+
fbm(np + 4.0 * q + vec2(8.3, 2.8) + t * 0.12)
|
|
101
|
+
);
|
|
102
|
+
float f = fbm(np + 4.0 * r);
|
|
103
|
+
float noise = clamp(f*f*f + 0.6*f*f + 0.5*f, 0.0, 1.0) * 0.15;
|
|
104
|
+
|
|
105
|
+
// ═══ CONTRIBUTION GRID ═══
|
|
106
|
+
vec2 gp = ap;
|
|
107
|
+
gp += vec2(snoise(ap * 3.0 + t), snoise(ap * 3.0 + t + 50.0)) * 0.004;
|
|
108
|
+
gp += warp * 0.04;
|
|
109
|
+
gp += vec2(t * 0.2, t * 0.12);
|
|
110
|
+
|
|
111
|
+
float cellTotal = 0.025;
|
|
112
|
+
vec2 cellId = floor(gp / cellTotal);
|
|
113
|
+
vec2 cellUV = fract(gp / cellTotal);
|
|
114
|
+
|
|
115
|
+
float pad = 0.10;
|
|
116
|
+
float edge = 0.04;
|
|
117
|
+
float inX = smoothstep(pad - edge, pad + edge, cellUV.x)
|
|
118
|
+
* (1.0 - smoothstep(1.0 - pad - edge, 1.0 - pad + edge, cellUV.x));
|
|
119
|
+
float inY = smoothstep(pad - edge, pad + edge, cellUV.y)
|
|
120
|
+
* (1.0 - smoothstep(1.0 - pad - edge, 1.0 - pad + edge, cellUV.y));
|
|
121
|
+
float inSquare = inX * inY;
|
|
122
|
+
|
|
123
|
+
float hVal = hash21(cellId);
|
|
124
|
+
float level = hVal < 0.35 ? 0.0 : (hVal - 0.35) / 0.65;
|
|
125
|
+
level *= level;
|
|
126
|
+
|
|
127
|
+
vec2 fp = uv - vec2(0.45, 0.55);
|
|
128
|
+
float gFade = max(1.0 - smoothstep(0.15, 0.45, length(fp * vec2(1.3, 1.6))), 0.0);
|
|
129
|
+
|
|
130
|
+
float gridReveal = smoothstep(0.5, 3.0, time);
|
|
131
|
+
float grid = inSquare * level * gFade * gridReveal * 0.10;
|
|
132
|
+
|
|
133
|
+
// ═══ COMPOSE ═══
|
|
134
|
+
vec2 vc = uv - 0.5;
|
|
135
|
+
float vignette = 1.0 - dot(vc, vc) * 0.3;
|
|
136
|
+
|
|
137
|
+
float col = noise * vignette + grid;
|
|
138
|
+
gl_FragColor = vec4(vec3(col), 1.0);
|
|
139
|
+
}`;
|
|
140
|
+
export function HalftoneBackground() {
|
|
141
|
+
const canvasRef = useRef(null);
|
|
142
|
+
const wrapperRef = useRef(null);
|
|
143
|
+
const frameRef = useRef(0);
|
|
144
|
+
const mouseRef = useRef({ x: -1, y: -1 });
|
|
145
|
+
const smoothMouseRef = useRef({ x: -1, y: -1 });
|
|
146
|
+
const clickRef = useRef({ strength: 0, x: 0, y: 0 });
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
const canvas = canvasRef.current;
|
|
149
|
+
const wrapper = wrapperRef.current;
|
|
150
|
+
if (!canvas || !wrapper)
|
|
151
|
+
return;
|
|
152
|
+
const gl = canvas.getContext("webgl", {
|
|
153
|
+
alpha: false,
|
|
154
|
+
antialias: false,
|
|
155
|
+
preserveDrawingBuffer: false,
|
|
156
|
+
});
|
|
157
|
+
if (!gl)
|
|
158
|
+
return;
|
|
159
|
+
function createShader(type, source) {
|
|
160
|
+
const shader = gl.createShader(type);
|
|
161
|
+
gl.shaderSource(shader, source);
|
|
162
|
+
gl.compileShader(shader);
|
|
163
|
+
return shader;
|
|
164
|
+
}
|
|
165
|
+
const vs = createShader(gl.VERTEX_SHADER, VERTEX_SHADER);
|
|
166
|
+
const fs = createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
|
|
167
|
+
const program = gl.createProgram();
|
|
168
|
+
gl.attachShader(program, vs);
|
|
169
|
+
gl.attachShader(program, fs);
|
|
170
|
+
gl.linkProgram(program);
|
|
171
|
+
gl.useProgram(program);
|
|
172
|
+
const buffer = gl.createBuffer();
|
|
173
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
174
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW);
|
|
175
|
+
const aPosition = gl.getAttribLocation(program, "a_position");
|
|
176
|
+
gl.enableVertexAttribArray(aPosition);
|
|
177
|
+
gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);
|
|
178
|
+
const uTime = gl.getUniformLocation(program, "u_time");
|
|
179
|
+
const uResolution = gl.getUniformLocation(program, "u_resolution");
|
|
180
|
+
const uMouse = gl.getUniformLocation(program, "u_mouse");
|
|
181
|
+
const uClick = gl.getUniformLocation(program, "u_click");
|
|
182
|
+
const uClickPos = gl.getUniformLocation(program, "u_clickPos");
|
|
183
|
+
const startTime = performance.now();
|
|
184
|
+
const resize = () => {
|
|
185
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
186
|
+
const scale = 0.5 * dpr;
|
|
187
|
+
canvas.width = canvas.offsetWidth * scale;
|
|
188
|
+
canvas.height = canvas.offsetHeight * scale;
|
|
189
|
+
gl.viewport(0, 0, canvas.width, canvas.height);
|
|
190
|
+
};
|
|
191
|
+
resize();
|
|
192
|
+
window.addEventListener("resize", resize);
|
|
193
|
+
const onMouseMove = (e) => {
|
|
194
|
+
const rect = wrapper.getBoundingClientRect();
|
|
195
|
+
mouseRef.current.x = (e.clientX - rect.left) / rect.width;
|
|
196
|
+
mouseRef.current.y = 1.0 - (e.clientY - rect.top) / rect.height;
|
|
197
|
+
};
|
|
198
|
+
const onMouseLeave = () => {
|
|
199
|
+
mouseRef.current.x = -1;
|
|
200
|
+
mouseRef.current.y = -1;
|
|
201
|
+
};
|
|
202
|
+
const onClick = (e) => {
|
|
203
|
+
const rect = wrapper.getBoundingClientRect();
|
|
204
|
+
clickRef.current.x = (e.clientX - rect.left) / rect.width;
|
|
205
|
+
clickRef.current.y = 1.0 - (e.clientY - rect.top) / rect.height;
|
|
206
|
+
clickRef.current.strength = 1.0;
|
|
207
|
+
};
|
|
208
|
+
window.addEventListener("mousemove", onMouseMove, { passive: true });
|
|
209
|
+
wrapper.addEventListener("mouseleave", onMouseLeave);
|
|
210
|
+
wrapper.addEventListener("click", onClick);
|
|
211
|
+
const draw = () => {
|
|
212
|
+
const elapsed = (performance.now() - startTime) / 1000;
|
|
213
|
+
const lerp = 0.08;
|
|
214
|
+
const target = mouseRef.current;
|
|
215
|
+
const smooth = smoothMouseRef.current;
|
|
216
|
+
if (target.x < 0) {
|
|
217
|
+
smooth.x += (target.x - smooth.x) * 0.02;
|
|
218
|
+
smooth.y += (target.y - smooth.y) * 0.02;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
smooth.x += (target.x - smooth.x) * lerp;
|
|
222
|
+
smooth.y += (target.y - smooth.y) * lerp;
|
|
223
|
+
}
|
|
224
|
+
clickRef.current.strength *= 0.96;
|
|
225
|
+
gl.uniform1f(uTime, elapsed);
|
|
226
|
+
gl.uniform2f(uResolution, canvas.width, canvas.height);
|
|
227
|
+
gl.uniform2f(uMouse, smooth.x, smooth.y);
|
|
228
|
+
gl.uniform1f(uClick, clickRef.current.strength);
|
|
229
|
+
gl.uniform2f(uClickPos, clickRef.current.x, clickRef.current.y);
|
|
230
|
+
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
|
231
|
+
frameRef.current = requestAnimationFrame(draw);
|
|
232
|
+
};
|
|
233
|
+
frameRef.current = requestAnimationFrame(draw);
|
|
234
|
+
return () => {
|
|
235
|
+
cancelAnimationFrame(frameRef.current);
|
|
236
|
+
window.removeEventListener("resize", resize);
|
|
237
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
238
|
+
wrapper.removeEventListener("mouseleave", onMouseLeave);
|
|
239
|
+
wrapper.removeEventListener("click", onClick);
|
|
240
|
+
gl.deleteProgram(program);
|
|
241
|
+
gl.deleteShader(vs);
|
|
242
|
+
gl.deleteShader(fs);
|
|
243
|
+
gl.deleteBuffer(buffer);
|
|
244
|
+
};
|
|
245
|
+
}, []);
|
|
246
|
+
return (_jsx("div", { ref: wrapperRef, className: "absolute inset-0 overflow-hidden", style: { background: "var(--shader-bg)" }, "aria-hidden": "true", children: _jsx("canvas", { ref: canvasRef, className: "w-full h-full", style: { filter: "var(--shader-filter)" } }) }));
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=halftone-background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"halftone-background.js","sourceRoot":"","sources":["../../src/components/halftone-background.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ComponentProps } from "react";
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
import type { ClassProp } from "class-variance-authority/types";
|
|
5
|
+
import { Button } from "./button";
|
|
6
|
+
declare function InputGroup({ className, ...props }: ComponentProps<"div">): React.JSX.Element;
|
|
7
|
+
declare const inputGroupAddonVariants: (props?: ({
|
|
8
|
+
align?: "inline-start" | "inline-end" | "block-start" | "block-end" | null | undefined;
|
|
9
|
+
} & ClassProp) | undefined) => string;
|
|
10
|
+
declare function InputGroupAddon({ className, align, ...props }: ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
|
|
11
|
+
declare const inputGroupButtonVariants: (props?: ({
|
|
12
|
+
size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
|
|
13
|
+
} & ClassProp) | undefined) => string;
|
|
14
|
+
declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<ComponentProps<typeof Button>, "size"> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
|
|
15
|
+
declare function InputGroupText({ className, ...props }: ComponentProps<"span">): React.JSX.Element;
|
|
16
|
+
declare function InputGroupInput({ className, ...props }: ComponentProps<"input">): React.JSX.Element;
|
|
17
|
+
declare function InputGroupTextarea({ className, ...props }: ComponentProps<"textarea">): React.JSX.Element;
|
|
18
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
|
|
19
|
+
//# sourceMappingURL=input-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BrF;AAED,QAAA,MAAM,uBAAuB,EAAE,CAC9B,KAAK,CAAC,EACH,CAAC;IACD,KAAK,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;CACtF,GAAG,SAAS,CAAC,GACd,SAAS,KACR,MAmBJ,CAAC;AAEF,iBAAS,eAAe,CAAC,EACxB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACR,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgB1F;AAED,QAAA,MAAM,wBAAwB,EAAE,CAC/B,KAAK,CAAC,EACH,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;CAC7D,GAAG,SAAS,CAAC,GACd,SAAS,KACR,MAYH,CAAC;AAEH,iBAAS,gBAAgB,CAAC,EACzB,SAAS,EACT,IAAe,EACf,OAAiB,EACjB,IAAW,EACX,GAAG,KAAK,EACR,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,CAAC,GAC7C,YAAY,CAAC,OAAO,wBAAwB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAUjE;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAU1F;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAW5F;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWlG;AAED,OAAO,EACN,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GAClB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../foundation/cn";
|
|
4
|
+
import { Button } from "./button";
|
|
5
|
+
import { Input } from "./input";
|
|
6
|
+
import { Textarea } from "./textarea";
|
|
7
|
+
function InputGroup({ className, ...props }) {
|
|
8
|
+
return (_jsx("div", { "data-slot": "input-group", role: "group", className: cn("group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30", "h-9 min-w-0 has-[>textarea]:h-auto",
|
|
9
|
+
// Variants based on alignment.
|
|
10
|
+
"has-[>[data-align=inline-start]]:[&>input]:pl-2", "has-[>[data-align=inline-end]]:[&>input]:pr-2", "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3", "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
|
|
11
|
+
// Focus state.
|
|
12
|
+
"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50",
|
|
13
|
+
// Error state.
|
|
14
|
+
"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40", className), ...props }));
|
|
15
|
+
}
|
|
16
|
+
const inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4", {
|
|
17
|
+
variants: {
|
|
18
|
+
align: {
|
|
19
|
+
"inline-start": "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
|
|
20
|
+
"inline-end": "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
|
|
21
|
+
"block-start": "order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3",
|
|
22
|
+
"block-end": "order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
align: "inline-start",
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
function InputGroupAddon({ className, align = "inline-start", ...props }) {
|
|
30
|
+
return (_jsx("div", { role: "group", "data-slot": "input-group-addon", "data-align": align, className: cn(inputGroupAddonVariants({ align }), className), onClick: (e) => {
|
|
31
|
+
if (e.target.closest("button")) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
e.currentTarget.parentElement?.querySelector("input")?.focus();
|
|
35
|
+
}, ...props }));
|
|
36
|
+
}
|
|
37
|
+
const inputGroupButtonVariants = cva("flex items-center gap-2 text-sm shadow-none", {
|
|
38
|
+
variants: {
|
|
39
|
+
size: {
|
|
40
|
+
xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5",
|
|
41
|
+
sm: "h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5",
|
|
42
|
+
"icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
|
|
43
|
+
"icon-sm": "size-8 p-0 has-[>svg]:p-0",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
defaultVariants: {
|
|
47
|
+
size: "xs",
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
function InputGroupButton({ className, type = "button", variant = "ghost", size = "xs", ...props }) {
|
|
51
|
+
return (_jsx(Button, { type: type, "data-size": size, variant: variant, className: cn(inputGroupButtonVariants({ size }), className), ...props }));
|
|
52
|
+
}
|
|
53
|
+
function InputGroupText({ className, ...props }) {
|
|
54
|
+
return (_jsx("span", { className: cn("flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4", className), ...props }));
|
|
55
|
+
}
|
|
56
|
+
function InputGroupInput({ className, ...props }) {
|
|
57
|
+
return (_jsx(Input, { "data-slot": "input-group-control", className: cn("flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent", className), ...props }));
|
|
58
|
+
}
|
|
59
|
+
function InputGroupTextarea({ className, ...props }) {
|
|
60
|
+
return (_jsx(Textarea, { "data-slot": "input-group-control", className: cn("flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent", className), ...props }));
|
|
61
|
+
}
|
|
62
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, };
|
|
63
|
+
//# sourceMappingURL=input-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-group.js","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,iBAAS,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAcxF;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../foundation/cn';
|
|
3
|
+
function Input({ className, type, ...props }) {
|
|
4
|
+
return (_jsx("input", { type: type, "data-slot": "input", className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", className), ...props }));
|
|
5
|
+
}
|
|
6
|
+
export { Input };
|
|
7
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAA2B;IACpE,OAAO,CACN,gBACC,IAAI,EAAE,IAAI,eACA,OAAO,EACjB,SAAS,EAAE,EAAE,CACZ,4bAA4b,EAC5b,+EAA+E,EAC/E,wGAAwG,EACxG,SAAS,CACT,KACG,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
interface LiveDurationProps {
|
|
3
|
+
startedAt: string | null;
|
|
4
|
+
completedAt?: string | null;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function LiveDuration({ startedAt, completedAt, className }: LiveDurationProps): React.ReactNode;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=live-duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-duration.d.ts","sourceRoot":"","sources":["../../src/components/live-duration.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAyCpC,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAmBtG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
// Inlined from "@/lib/utils" (formatDuration) — only this helper is used here.
|
|
4
|
+
function formatDuration(startedAt, completedAt) {
|
|
5
|
+
if (!startedAt)
|
|
6
|
+
return "";
|
|
7
|
+
const start = new Date(startedAt);
|
|
8
|
+
const end = completedAt ? new Date(completedAt) : new Date();
|
|
9
|
+
const totalSeconds = Math.max(0, Math.floor((end.getTime() - start.getTime()) / 1000));
|
|
10
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
11
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
12
|
+
const seconds = totalSeconds % 60;
|
|
13
|
+
if (hours > 0)
|
|
14
|
+
return `${hours}h ${minutes}m`;
|
|
15
|
+
if (minutes > 0)
|
|
16
|
+
return `${minutes}m ${seconds}s`;
|
|
17
|
+
return `${seconds}s`;
|
|
18
|
+
}
|
|
19
|
+
// Inlined from "@/lib/live-tick".
|
|
20
|
+
// Shared tick for LiveDuration components. One interval drives all subscribers
|
|
21
|
+
// instead of each component running its own 1s interval.
|
|
22
|
+
const callbacks = new Set();
|
|
23
|
+
const tickState = {
|
|
24
|
+
intervalId: null,
|
|
25
|
+
};
|
|
26
|
+
function subscribeLiveTick(callback) {
|
|
27
|
+
callbacks.add(callback);
|
|
28
|
+
if (tickState.intervalId === null) {
|
|
29
|
+
tickState.intervalId = setInterval(() => {
|
|
30
|
+
callbacks.forEach((cb) => cb());
|
|
31
|
+
}, 1000);
|
|
32
|
+
}
|
|
33
|
+
return () => {
|
|
34
|
+
callbacks.delete(callback);
|
|
35
|
+
if (callbacks.size === 0 && tickState.intervalId !== null) {
|
|
36
|
+
clearInterval(tickState.intervalId);
|
|
37
|
+
tickState.intervalId = null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function LiveDuration({ startedAt, completedAt, className }) {
|
|
42
|
+
// tick forces re-renders when subscribeLiveTick fires; value is unused in render
|
|
43
|
+
const [, setTick] = useState(0);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!startedAt || completedAt != null)
|
|
46
|
+
return;
|
|
47
|
+
setTick(0);
|
|
48
|
+
return subscribeLiveTick(() => setTick((t) => t + 1));
|
|
49
|
+
}, [startedAt, completedAt]);
|
|
50
|
+
if (!startedAt)
|
|
51
|
+
return null;
|
|
52
|
+
const formatted = formatDuration(startedAt, completedAt ?? null);
|
|
53
|
+
return (_jsx("span", { className: className, suppressHydrationWarning: true, children: formatted }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=live-duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-duration.js","sourceRoot":"","sources":["../../src/components/live-duration.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export declare function Logo({ className }: {
|
|
3
|
+
className?: string;
|
|
4
|
+
}): React.JSX.Element;
|
|
5
|
+
export declare function LogoMark({ className }: {
|
|
6
|
+
className?: string;
|
|
7
|
+
}): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=logo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/components/logo.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAM7E;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAMjF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../foundation/cn';
|
|
3
|
+
export function Logo({ className }) {
|
|
4
|
+
return (_jsx("span", { className: cn("font-mono text-sm font-medium tracking-tight", className), children: "BETTER-HUB." }));
|
|
5
|
+
}
|
|
6
|
+
export function LogoMark({ className }) {
|
|
7
|
+
return (_jsx("span", { className: cn("font-mono text-sm font-bold tracking-tight", className), children: "b." }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/components/logo.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,MAAM,UAAU,IAAI,CAAC,EAAE,SAAS,EAA0B;IACzD,OAAO,CACN,eAAM,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,4BAEvE,CACP,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAA0B;IAC7D,OAAO,CACN,eAAM,SAAS,EAAE,EAAE,CAAC,4CAA4C,EAAE,SAAS,CAAC,mBAErE,CACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ComponentProps } from "react";
|
|
3
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
4
|
+
declare function Popover({ ...props }: ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
|
|
5
|
+
declare function PopoverTrigger({ ...props }: ComponentProps<typeof PopoverPrimitive.Trigger>): React.JSX.Element;
|
|
6
|
+
declare function PopoverContent({ className, align, sideOffset, ...props }: ComponentProps<typeof PopoverPrimitive.Content>): React.JSX.Element;
|
|
7
|
+
declare function PopoverAnchor({ ...props }: ComponentProps<typeof PopoverPrimitive.Anchor>): React.JSX.Element;
|
|
8
|
+
declare function PopoverHeader({ className, ...props }: ComponentProps<"div">): React.JSX.Element;
|
|
9
|
+
declare function PopoverTitle({ className, ...props }: ComponentProps<"h2">): React.JSX.Element;
|
|
10
|
+
declare function PopoverDescription({ className, ...props }: ComponentProps<"p">): React.JSX.Element;
|
|
11
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
|
|
12
|
+
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvD,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAE9F;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAExG;AAED,iBAAS,cAAc,CAAC,EACvB,SAAS,EACT,KAAgB,EAChB,UAAc,EACd,GAAG,KAAK,EACR,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAerE;AAED,iBAAS,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAEtG;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQxF;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQtF;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAQ3F;AAED,OAAO,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,GAClB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
3
|
+
import { cn } from "../foundation/cn";
|
|
4
|
+
function Popover({ ...props }) {
|
|
5
|
+
return _jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
|
|
6
|
+
}
|
|
7
|
+
function PopoverTrigger({ ...props }) {
|
|
8
|
+
return _jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
|
|
9
|
+
}
|
|
10
|
+
function PopoverContent({ className, align = "center", sideOffset = 4, ...props }) {
|
|
11
|
+
return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", align: align, sideOffset: sideOffset, className: cn("z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", className), ...props }) }));
|
|
12
|
+
}
|
|
13
|
+
function PopoverAnchor({ ...props }) {
|
|
14
|
+
return _jsx(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
|
|
15
|
+
}
|
|
16
|
+
function PopoverHeader({ className, ...props }) {
|
|
17
|
+
return (_jsx("div", { "data-slot": "popover-header", className: cn("flex flex-col gap-1 text-sm", className), ...props }));
|
|
18
|
+
}
|
|
19
|
+
function PopoverTitle({ className, ...props }) {
|
|
20
|
+
return (_jsx("div", { "data-slot": "popover-title", className: cn("font-medium", className), ...props }));
|
|
21
|
+
}
|
|
22
|
+
function PopoverDescription({ className, ...props }) {
|
|
23
|
+
return (_jsx("p", { "data-slot": "popover-description", className: cn("text-muted-foreground", className), ...props }));
|
|
24
|
+
}
|
|
25
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription, };
|
|
26
|
+
//# sourceMappingURL=popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAEtC,SAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAgD;IAC1E,OAAO,KAAC,gBAAgB,CAAC,IAAI,iBAAW,SAAS,KAAK,KAAK,GAAI,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAmD;IACpF,OAAO,KAAC,gBAAgB,CAAC,OAAO,iBAAW,iBAAiB,KAAK,KAAK,GAAI,CAAC;AAC5E,CAAC;AAED,SAAS,cAAc,CAAC,EACvB,SAAS,EACT,KAAK,GAAG,QAAQ,EAChB,UAAU,GAAG,CAAC,EACd,GAAG,KAAK,EACyC;IACjD,OAAO,CACN,KAAC,gBAAgB,CAAC,MAAM,cACvB,KAAC,gBAAgB,CAAC,OAAO,iBACd,iBAAiB,EAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,EAAE,CACZ,geAAge,EAChe,SAAS,CACT,KACG,KAAK,GACR,GACuB,CAC1B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,GAAG,KAAK,EAAkD;IAClF,OAAO,KAAC,gBAAgB,CAAC,MAAM,iBAAW,gBAAgB,KAAK,KAAK,GAAI,CAAC;AAC1E,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACpE,OAAO,CACN,2BACW,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,KACnD,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwB;IAClE,OAAO,CACN,2BACW,eAAe,EACzB,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,KACnC,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAuB;IACvE,OAAO,CACN,yBACW,qBAAqB,EAC/B,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,KAC7C,KAAK,GACR,CACF,CAAC;AACH,CAAC;AAED,OAAO,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,EACZ,kBAAkB,GAClB,CAAC"}
|