mizu-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -0
- package/dist/composite/Accordion.d.ts +13 -0
- package/dist/composite/Accordion.d.ts.map +1 -0
- package/dist/composite/Accordion.js +54 -0
- package/dist/composite/Accordion.js.map +1 -0
- package/dist/composite/Dialog.d.ts +18 -0
- package/dist/composite/Dialog.d.ts.map +1 -0
- package/dist/composite/Dialog.js +113 -0
- package/dist/composite/Dialog.js.map +1 -0
- package/dist/composite/Nav.d.ts +13 -0
- package/dist/composite/Nav.d.ts.map +1 -0
- package/dist/composite/Nav.js +142 -0
- package/dist/composite/Nav.js.map +1 -0
- package/dist/composite/Tabs.d.ts +24 -0
- package/dist/composite/Tabs.d.ts.map +1 -0
- package/dist/composite/Tabs.js +53 -0
- package/dist/composite/Tabs.js.map +1 -0
- package/dist/feedback/CopyButton.d.ts +6 -0
- package/dist/feedback/CopyButton.d.ts.map +1 -0
- package/dist/feedback/CopyButton.js +50 -0
- package/dist/feedback/CopyButton.js.map +1 -0
- package/dist/feedback/CountUp.d.ts +10 -0
- package/dist/feedback/CountUp.d.ts.map +1 -0
- package/dist/feedback/CountUp.js +35 -0
- package/dist/feedback/CountUp.js.map +1 -0
- package/dist/feedback/Toast.d.ts +14 -0
- package/dist/feedback/Toast.d.ts.map +1 -0
- package/dist/feedback/Toast.js +61 -0
- package/dist/feedback/Toast.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/lab/Pinfield.d.ts +9 -0
- package/dist/lab/Pinfield.d.ts.map +1 -0
- package/dist/lab/Pinfield.js +100 -0
- package/dist/lab/Pinfield.js.map +1 -0
- package/dist/lab/RippleSurface.d.ts +6 -0
- package/dist/lab/RippleSurface.d.ts.map +1 -0
- package/dist/lab/RippleSurface.js +102 -0
- package/dist/lab/RippleSurface.js.map +1 -0
- package/dist/lab/Signal.d.ts +8 -0
- package/dist/lab/Signal.d.ts.map +1 -0
- package/dist/lab/Signal.js +101 -0
- package/dist/lab/Signal.js.map +1 -0
- package/dist/lab/useCanvas.d.ts +3 -0
- package/dist/lab/useCanvas.d.ts.map +1 -0
- package/dist/lab/useCanvas.js +63 -0
- package/dist/lab/useCanvas.js.map +1 -0
- package/dist/motion/Magnetic.d.ts +8 -0
- package/dist/motion/Magnetic.d.ts.map +1 -0
- package/dist/motion/Magnetic.js +22 -0
- package/dist/motion/Magnetic.js.map +1 -0
- package/dist/motion/Marquee.d.ts +11 -0
- package/dist/motion/Marquee.d.ts.map +1 -0
- package/dist/motion/Marquee.js +14 -0
- package/dist/motion/Marquee.js.map +1 -0
- package/dist/motion/MaskLine.d.ts +9 -0
- package/dist/motion/MaskLine.d.ts.map +1 -0
- package/dist/motion/MaskLine.js +8 -0
- package/dist/motion/MaskLine.js.map +1 -0
- package/dist/motion/PageWipe.d.ts +10 -0
- package/dist/motion/PageWipe.d.ts.map +1 -0
- package/dist/motion/PageWipe.js +60 -0
- package/dist/motion/PageWipe.js.map +1 -0
- package/dist/motion/Reveal.d.ts +12 -0
- package/dist/motion/Reveal.d.ts.map +1 -0
- package/dist/motion/Reveal.js +8 -0
- package/dist/motion/Reveal.js.map +1 -0
- package/dist/motion/easings.d.ts +4 -0
- package/dist/motion/easings.d.ts.map +1 -0
- package/dist/motion/easings.js +4 -0
- package/dist/motion/easings.js.map +1 -0
- package/dist/type/GhostWord.d.ts +7 -0
- package/dist/type/GhostWord.d.ts.map +1 -0
- package/dist/type/GhostWord.js +5 -0
- package/dist/type/GhostWord.js.map +1 -0
- package/dist/type/SoftType.d.ts +11 -0
- package/dist/type/SoftType.d.ts.map +1 -0
- package/dist/type/SoftType.js +27 -0
- package/dist/type/SoftType.js.map +1 -0
- package/dist/type/Specimen.d.ts +13 -0
- package/dist/type/Specimen.d.ts.map +1 -0
- package/dist/type/Specimen.js +82 -0
- package/dist/type/Specimen.js.map +1 -0
- package/dist/type/WaveText.d.ts +10 -0
- package/dist/type/WaveText.d.ts.map +1 -0
- package/dist/type/WaveText.js +37 -0
- package/dist/type/WaveText.js.map +1 -0
- package/dist/ui/Badge.d.ts +10 -0
- package/dist/ui/Badge.d.ts.map +1 -0
- package/dist/ui/Badge.js +26 -0
- package/dist/ui/Badge.js.map +1 -0
- package/dist/ui/Button.d.ts +19 -0
- package/dist/ui/Button.d.ts.map +1 -0
- package/dist/ui/Button.js +47 -0
- package/dist/ui/Button.js.map +1 -0
- package/dist/ui/Frame.d.ts +9 -0
- package/dist/ui/Frame.d.ts.map +1 -0
- package/dist/ui/Frame.js +37 -0
- package/dist/ui/Frame.js.map +1 -0
- package/dist/ui/Mark.d.ts +9 -0
- package/dist/ui/Mark.d.ts.map +1 -0
- package/dist/ui/Mark.js +19 -0
- package/dist/ui/Mark.js.map +1 -0
- package/dist/ui/Rule.d.ts +8 -0
- package/dist/ui/Rule.d.ts.map +1 -0
- package/dist/ui/Rule.js +22 -0
- package/dist/ui/Rule.js.map +1 -0
- package/dist/ui/SectionTag.d.ts +10 -0
- package/dist/ui/SectionTag.d.ts.map +1 -0
- package/dist/ui/SectionTag.js +17 -0
- package/dist/ui/SectionTag.js.map +1 -0
- package/dist/ui/Slider.d.ts +13 -0
- package/dist/ui/Slider.d.ts.map +1 -0
- package/dist/ui/Slider.js +18 -0
- package/dist/ui/Slider.js.map +1 -0
- package/dist/ui/Spinner.d.ts +8 -0
- package/dist/ui/Spinner.d.ts.map +1 -0
- package/dist/ui/Spinner.js +9 -0
- package/dist/ui/Spinner.js.map +1 -0
- package/dist/ui/Tooltip.d.ts +9 -0
- package/dist/ui/Tooltip.d.ts.map +1 -0
- package/dist/ui/Tooltip.js +5 -0
- package/dist/ui/Tooltip.js.map +1 -0
- package/package.json +44 -0
- package/styles.css +280 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { useReducedMotion } from "motion/react";
|
|
5
|
+
export function Signal({ density = 14, speed = 1, className = "", style, label = "Interactive signal visualisation. Drag horizontally to scrub the phase of the waveform.", }) {
|
|
6
|
+
const canvasRef = useRef(null);
|
|
7
|
+
const reduce = useReducedMotion();
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const canvas = canvasRef.current;
|
|
10
|
+
if (!canvas)
|
|
11
|
+
return;
|
|
12
|
+
const ctx = canvas.getContext("2d");
|
|
13
|
+
if (!ctx)
|
|
14
|
+
return;
|
|
15
|
+
let raf = 0;
|
|
16
|
+
let running = true;
|
|
17
|
+
let visible = true;
|
|
18
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
19
|
+
let w = 0;
|
|
20
|
+
let h = 0;
|
|
21
|
+
let phase = 0;
|
|
22
|
+
let dragging = false;
|
|
23
|
+
let lastX = 0;
|
|
24
|
+
const mouseX = { v: -9999 };
|
|
25
|
+
const resize = () => {
|
|
26
|
+
const r = canvas.getBoundingClientRect();
|
|
27
|
+
w = r.width;
|
|
28
|
+
h = r.height;
|
|
29
|
+
canvas.width = Math.round(w * dpr);
|
|
30
|
+
canvas.height = Math.round(h * dpr);
|
|
31
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
32
|
+
};
|
|
33
|
+
const io = new IntersectionObserver(([e]) => {
|
|
34
|
+
if (e)
|
|
35
|
+
visible = e.isIntersecting;
|
|
36
|
+
});
|
|
37
|
+
io.observe(canvas);
|
|
38
|
+
const down = (e) => {
|
|
39
|
+
dragging = true;
|
|
40
|
+
lastX = e.clientX;
|
|
41
|
+
canvas.setPointerCapture(e.pointerId);
|
|
42
|
+
};
|
|
43
|
+
const move = (e) => {
|
|
44
|
+
const r = canvas.getBoundingClientRect();
|
|
45
|
+
mouseX.v = e.clientX - r.left;
|
|
46
|
+
if (dragging) {
|
|
47
|
+
phase += (e.clientX - lastX) * 0.012;
|
|
48
|
+
lastX = e.clientX;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const up = () => {
|
|
52
|
+
dragging = false;
|
|
53
|
+
};
|
|
54
|
+
const frame = () => {
|
|
55
|
+
raf = requestAnimationFrame(frame);
|
|
56
|
+
if (!running || !visible || document.hidden)
|
|
57
|
+
return;
|
|
58
|
+
if (!reduce && !dragging)
|
|
59
|
+
phase += 0.0035 * speed;
|
|
60
|
+
ctx.clearRect(0, 0, w, h);
|
|
61
|
+
const n = Math.max(24, Math.floor(w / density));
|
|
62
|
+
const bw = w / n;
|
|
63
|
+
const mid = h * 0.55;
|
|
64
|
+
ctx.strokeStyle = "rgba(244, 240, 232, 0.14)";
|
|
65
|
+
ctx.lineWidth = 1;
|
|
66
|
+
ctx.beginPath();
|
|
67
|
+
ctx.moveTo(0, mid);
|
|
68
|
+
ctx.lineTo(w, mid);
|
|
69
|
+
ctx.stroke();
|
|
70
|
+
for (let i = 0; i < n; i++) {
|
|
71
|
+
const x = i * bw + bw / 2;
|
|
72
|
+
const v = Math.sin(i * 0.22 + phase) * 0.6 + Math.sin(i * 0.07 - phase * 0.6) * 0.4;
|
|
73
|
+
const bh = Math.abs(v) * h * 0.32 + 2;
|
|
74
|
+
const y = v > 0 ? mid - bh : mid;
|
|
75
|
+
const near = mouseX.v > 0 ? Math.max(0, 1 - Math.abs(mouseX.v - x) / 90) : 0;
|
|
76
|
+
ctx.fillStyle =
|
|
77
|
+
near > 0.04 ? `rgba(255,77,28,${0.35 + near * 0.65})` : "rgba(244, 240, 232, 0.3)";
|
|
78
|
+
ctx.fillRect(x - bw * 0.28, y, bw * 0.56, bh);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
resize();
|
|
82
|
+
window.addEventListener("resize", resize);
|
|
83
|
+
canvas.addEventListener("pointerdown", down);
|
|
84
|
+
canvas.addEventListener("pointermove", move);
|
|
85
|
+
canvas.addEventListener("pointerup", up);
|
|
86
|
+
canvas.addEventListener("pointerleave", up);
|
|
87
|
+
raf = requestAnimationFrame(frame);
|
|
88
|
+
return () => {
|
|
89
|
+
running = false;
|
|
90
|
+
cancelAnimationFrame(raf);
|
|
91
|
+
io.disconnect();
|
|
92
|
+
window.removeEventListener("resize", resize);
|
|
93
|
+
canvas.removeEventListener("pointerdown", down);
|
|
94
|
+
canvas.removeEventListener("pointermove", move);
|
|
95
|
+
canvas.removeEventListener("pointerup", up);
|
|
96
|
+
canvas.removeEventListener("pointerleave", up);
|
|
97
|
+
};
|
|
98
|
+
}, [reduce, density, speed]);
|
|
99
|
+
return (_jsx("canvas", { ref: canvasRef, className: `mizu-canvas-drag ${className}`, style: style, role: "img", "aria-label": label }));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=Signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Signal.js","sourceRoot":"","sources":["../../src/lab/Signal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvas.d.ts","sourceRoot":"","sources":["../../src/lab/useCanvas.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1D,wBAAgB,aAAa,CAC3B,IAAI,EAAE,CAAC,GAAG,EAAE,wBAAwB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,GAC7E,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAgErC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { useReducedMotion } from "motion/react";
|
|
4
|
+
export function useCanvasLoop(draw) {
|
|
5
|
+
const ref = useRef(null);
|
|
6
|
+
const drawRef = useRef(draw);
|
|
7
|
+
const reduce = useReducedMotion();
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
drawRef.current = draw;
|
|
10
|
+
});
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const canvas = ref.current;
|
|
13
|
+
if (!canvas)
|
|
14
|
+
return;
|
|
15
|
+
const ctx = canvas.getContext("2d");
|
|
16
|
+
if (!ctx)
|
|
17
|
+
return;
|
|
18
|
+
let raf = 0;
|
|
19
|
+
let running = true;
|
|
20
|
+
let visible = true;
|
|
21
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
22
|
+
const resize = () => {
|
|
23
|
+
const r = canvas.getBoundingClientRect();
|
|
24
|
+
canvas.width = Math.max(1, Math.round(r.width * dpr));
|
|
25
|
+
canvas.height = Math.max(1, Math.round(r.height * dpr));
|
|
26
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
27
|
+
};
|
|
28
|
+
const io = new IntersectionObserver(([e]) => {
|
|
29
|
+
if (e)
|
|
30
|
+
visible = e.isIntersecting;
|
|
31
|
+
});
|
|
32
|
+
io.observe(canvas);
|
|
33
|
+
resize();
|
|
34
|
+
window.addEventListener("resize", resize);
|
|
35
|
+
if (reduce) {
|
|
36
|
+
const r = canvas.getBoundingClientRect();
|
|
37
|
+
ctx.clearRect(0, 0, r.width, r.height);
|
|
38
|
+
drawRef.current(ctx, r.width, r.height, 1400);
|
|
39
|
+
return () => {
|
|
40
|
+
io.disconnect();
|
|
41
|
+
window.removeEventListener("resize", resize);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const start = performance.now();
|
|
45
|
+
const frame = (now) => {
|
|
46
|
+
raf = requestAnimationFrame(frame);
|
|
47
|
+
if (!running || !visible || document.hidden)
|
|
48
|
+
return;
|
|
49
|
+
const r = canvas.getBoundingClientRect();
|
|
50
|
+
ctx.clearRect(0, 0, r.width, r.height);
|
|
51
|
+
drawRef.current(ctx, r.width, r.height, now - start);
|
|
52
|
+
};
|
|
53
|
+
raf = requestAnimationFrame(frame);
|
|
54
|
+
return () => {
|
|
55
|
+
running = false;
|
|
56
|
+
cancelAnimationFrame(raf);
|
|
57
|
+
io.disconnect();
|
|
58
|
+
window.removeEventListener("resize", resize);
|
|
59
|
+
};
|
|
60
|
+
}, [reduce]);
|
|
61
|
+
return ref;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=useCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvas.js","sourceRoot":"","sources":["../../src/lab/useCanvas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export declare function Magnetic({ children, strength, className, style, }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
strength?: number;
|
|
5
|
+
className?: string;
|
|
6
|
+
style?: React.CSSProperties;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=Magnetic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Magnetic.d.ts","sourceRoot":"","sources":["../../src/motion/Magnetic.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG/C,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAe,EACf,SAAc,EACd,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BA0BA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { motion, useMotionValue, useSpring } from "motion/react";
|
|
5
|
+
export function Magnetic({ children, strength = 0.32, className = "", style, }) {
|
|
6
|
+
const ref = useRef(null);
|
|
7
|
+
const x = useMotionValue(0);
|
|
8
|
+
const y = useMotionValue(0);
|
|
9
|
+
const sx = useSpring(x, { stiffness: 160, damping: 14, mass: 0.4 });
|
|
10
|
+
const sy = useSpring(y, { stiffness: 160, damping: 14, mass: 0.4 });
|
|
11
|
+
return (_jsx(motion.div, { ref: ref, className: className, style: { ...style, x: sx, y: sy, display: "inline-block" }, onMouseMove: (e) => {
|
|
12
|
+
const r = ref.current?.getBoundingClientRect();
|
|
13
|
+
if (!r)
|
|
14
|
+
return;
|
|
15
|
+
x.set((e.clientX - (r.left + r.width / 2)) * strength);
|
|
16
|
+
y.set((e.clientY - (r.top + r.height / 2)) * strength);
|
|
17
|
+
}, onMouseLeave: () => {
|
|
18
|
+
x.set(0);
|
|
19
|
+
y.set(0);
|
|
20
|
+
}, children: children }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=Magnetic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Magnetic.js","sourceRoot":"","sources":["../../src/motion/Magnetic.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,EAAE,EACd,KAAK,GAMN;IACC,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpE,OAAO,CACL,KAAC,MAAM,CAAC,GAAG,IACT,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAC1D,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YACjB,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;YAC/C,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACvD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACzD,CAAC,EACD,YAAY,EAAE,GAAG,EAAE;YACjB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACX,CAAC,YAEA,QAAQ,GACE,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export declare function Marquee({ children, duration, pauseOnHover, separator, label, className, style, }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
duration?: number;
|
|
5
|
+
pauseOnHover?: boolean;
|
|
6
|
+
separator?: boolean;
|
|
7
|
+
label?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=Marquee.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Marquee.d.ts","sourceRoot":"","sources":["../../src/motion/Marquee.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjD,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,QAAa,EACb,YAAmB,EACnB,SAAgB,EAChB,KAAK,EACL,SAAc,EACd,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BAsCA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { motion, useReducedMotion } from "motion/react";
|
|
5
|
+
import { Mark } from "../ui/Mark";
|
|
6
|
+
export function Marquee({ children, duration = 42, pauseOnHover = true, separator = true, label, className = "", style, }) {
|
|
7
|
+
const reduce = useReducedMotion();
|
|
8
|
+
const [hover, setHover] = useState(false);
|
|
9
|
+
const row = (hidden) => (_jsxs("div", { "aria-hidden": hidden, style: { display: "flex", flexShrink: 0, alignItems: "center" }, children: [children, separator && (_jsx("span", { style: { display: "inline-flex", padding: "0 28px" }, children: _jsx(Mark, { size: 6 }) }))] }));
|
|
10
|
+
return (_jsx("div", { className: className, role: "marquee", "aria-label": label, style: { ...style, overflow: "hidden", display: "flex" }, onMouseEnter: () => setHover(true), onMouseLeave: () => setHover(false), children: _jsxs(motion.div, { style: { display: "flex", width: "max-content", willChange: "transform" }, animate: reduce
|
|
11
|
+
? { x: "0%" }
|
|
12
|
+
: { x: ["0%", "-50%"], animationPlayState: pauseOnHover && hover ? "paused" : "running" }, transition: reduce ? { duration: 0 } : { duration, repeat: Infinity, ease: "linear" }, children: [row(false), row(true)] }) }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Marquee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Marquee.js","sourceRoot":"","sources":["../../src/motion/Marquee.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,OAAO,CAAC,EACtB,QAAQ,EACR,QAAQ,GAAG,EAAE,EACb,YAAY,GAAG,IAAI,EACnB,SAAS,GAAG,IAAI,EAChB,KAAK,EACL,SAAS,GAAG,EAAE,EACd,KAAK,GASN;IACC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,CAC/B,8BAAkB,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,aACtF,QAAQ,EACR,SAAS,IAAI,CACZ,eAAM,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,YACxD,KAAC,IAAI,IAAC,IAAI,EAAE,CAAC,GAAI,GACZ,CACR,IACG,CACP,CAAC;IAEF,OAAO,CACL,cACE,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,SAAS,gBACF,KAAK,EACjB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EACxD,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAClC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,YAEnC,MAAC,MAAM,CAAC,GAAG,IACT,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,EACzE,OAAO,EACL,MAAM;gBACJ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;gBACb,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,kBAAkB,EAAE,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,EAE7F,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,aAEpF,GAAG,CAAC,KAAK,CAAC,EACV,GAAG,CAAC,IAAI,CAAC,IACC,GACT,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export declare function MaskLine({ children, delay, y, className, style, }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
delay?: number;
|
|
5
|
+
y?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=MaskLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaskLine.d.ts","sourceRoot":"","sources":["../../src/motion/MaskLine.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,KAAS,EACT,CAAU,EACV,SAAc,EACd,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BAgBA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "motion/react";
|
|
4
|
+
import { EASE_EXPO } from "./easings";
|
|
5
|
+
export function MaskLine({ children, delay = 0, y = "112%", className = "", style, }) {
|
|
6
|
+
return (_jsx("span", { className: `mizu-maskline ${className}`, style: { ...style, display: "block", overflow: "hidden" }, children: _jsx(motion.span, { style: { display: "block", willChange: "transform" }, initial: { y }, animate: { y: "0%" }, transition: { duration: 1.15, delay, ease: EASE_EXPO }, children: children }) }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=MaskLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaskLine.js","sourceRoot":"","sources":["../../src/motion/MaskLine.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,UAAU,QAAQ,CAAC,EACvB,QAAQ,EACR,KAAK,GAAG,CAAC,EACT,CAAC,GAAG,MAAM,EACV,SAAS,GAAG,EAAE,EACd,KAAK,GAON;IACC,OAAO,CACL,eACE,SAAS,EAAE,iBAAiB,SAAS,EAAE,EACvC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAEzD,KAAC,MAAM,CAAC,IAAI,IACV,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EACpD,OAAO,EAAE,EAAE,CAAC,EAAE,EACd,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACpB,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,YAErD,QAAQ,GACG,GACT,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
type WipeContextValue = {
|
|
3
|
+
wipe: (label?: string) => Promise<void>;
|
|
4
|
+
};
|
|
5
|
+
export declare function usePageWipe(): WipeContextValue;
|
|
6
|
+
export declare function PageWipeProvider({ children }: {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=PageWipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageWipe.d.ts","sourceRoot":"","sources":["../../src/motion/PageWipe.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAOf,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AAIF,wBAAgB,WAAW,IAAI,gBAAgB,CAI9C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BA8ErE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useCallback, useContext, useRef, useState, } from "react";
|
|
4
|
+
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
|
5
|
+
import { EASE_WIPE } from "./easings";
|
|
6
|
+
const WIPE_MS = 1050;
|
|
7
|
+
const MIDPOINT_MS = 500;
|
|
8
|
+
const PageWipeContext = createContext(null);
|
|
9
|
+
export function usePageWipe() {
|
|
10
|
+
const ctx = useContext(PageWipeContext);
|
|
11
|
+
if (!ctx)
|
|
12
|
+
throw new Error("usePageWipe must be used within <PageWipeProvider>");
|
|
13
|
+
return ctx;
|
|
14
|
+
}
|
|
15
|
+
export function PageWipeProvider({ children }) {
|
|
16
|
+
const reduce = useReducedMotion();
|
|
17
|
+
const [active, setActive] = useState(null);
|
|
18
|
+
const resolver = useRef(null);
|
|
19
|
+
const busy = useRef(false);
|
|
20
|
+
const wipe = useCallback((label = "") => {
|
|
21
|
+
if (reduce)
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
if (busy.current)
|
|
24
|
+
return new Promise(() => { });
|
|
25
|
+
busy.current = true;
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
resolver.current = () => {
|
|
28
|
+
resolve();
|
|
29
|
+
resolver.current = null;
|
|
30
|
+
};
|
|
31
|
+
setActive({ label, id: Date.now() });
|
|
32
|
+
window.setTimeout(() => resolver.current?.(), MIDPOINT_MS);
|
|
33
|
+
});
|
|
34
|
+
}, [reduce]);
|
|
35
|
+
const finish = useCallback(() => {
|
|
36
|
+
window.setTimeout(() => {
|
|
37
|
+
setActive(null);
|
|
38
|
+
busy.current = false;
|
|
39
|
+
}, 60);
|
|
40
|
+
}, []);
|
|
41
|
+
return (_jsxs(PageWipeContext.Provider, { value: { wipe }, children: [children, _jsx(AnimatePresence, { children: active && (_jsx(motion.div, { "aria-hidden": true, className: "mizu-wipe", style: {
|
|
42
|
+
position: "fixed",
|
|
43
|
+
inset: 0,
|
|
44
|
+
zIndex: "var(--mizu-z-wipe)",
|
|
45
|
+
background: "var(--mizu-ink-2)",
|
|
46
|
+
borderRight: "2px solid var(--mizu-accent)",
|
|
47
|
+
display: "flex",
|
|
48
|
+
alignItems: "center",
|
|
49
|
+
justifyContent: "center",
|
|
50
|
+
pointerEvents: "none",
|
|
51
|
+
}, initial: { x: "-101%" }, animate: { x: "101%" }, exit: { opacity: 0 }, transition: { duration: WIPE_MS / 1000, ease: EASE_WIPE }, onAnimationComplete: finish, children: active.label && (_jsx(motion.span, { style: {
|
|
52
|
+
fontFamily: "var(--mizu-font-mono)",
|
|
53
|
+
fontSize: 12,
|
|
54
|
+
letterSpacing: "0.45em",
|
|
55
|
+
textTransform: "uppercase",
|
|
56
|
+
color: "var(--mizu-paper)",
|
|
57
|
+
opacity: 0.7,
|
|
58
|
+
}, initial: { opacity: 0, y: 14 }, animate: { opacity: [0, 1, 1, 0], y: 0 }, transition: { duration: WIPE_MS / 1000, times: [0, 0.22, 0.72, 1], ease: "linear" }, children: active.label })) }, active.id)) })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=PageWipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageWipe.js","sourceRoot":"","sources":["../../src/motion/PageWipe.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export declare function Reveal({ children, delay, y, x, duration, once, className, style, }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
delay?: number;
|
|
5
|
+
y?: number;
|
|
6
|
+
x?: number;
|
|
7
|
+
duration?: number;
|
|
8
|
+
once?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=Reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reveal.d.ts","sourceRoot":"","sources":["../../src/motion/Reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,KAAS,EACT,CAAM,EACN,CAAK,EACL,QAAe,EACf,IAAW,EACX,SAAc,EACd,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BAaA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { motion } from "motion/react";
|
|
4
|
+
import { EASE_EXPO } from "./easings";
|
|
5
|
+
export function Reveal({ children, delay = 0, y = 32, x = 0, duration = 0.95, once = true, className = "", style, }) {
|
|
6
|
+
return (_jsx(motion.div, { className: className, style: style, initial: { opacity: 0, y, x }, whileInView: { opacity: 1, y: 0, x: 0 }, viewport: { once, margin: "-70px" }, transition: { duration, delay, ease: EASE_EXPO }, children: children }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=Reveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reveal.js","sourceRoot":"","sources":["../../src/motion/Reveal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,KAAK,GAAG,CAAC,EACT,CAAC,GAAG,EAAE,EACN,CAAC,GAAG,CAAC,EACL,QAAQ,GAAG,IAAI,EACf,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,EAAE,EACd,KAAK,GAUN;IACC,OAAO,CACL,KAAC,MAAM,CAAC,GAAG,IACT,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAC7B,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACvC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EACnC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,YAE/C,QAAQ,GACE,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easings.d.ts","sourceRoot":"","sources":["../../src/motion/easings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAqB,CAAC;AAC7E,eAAO,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAsB,CAAC;AAC9E,eAAO,MAAM,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easings.js","sourceRoot":"","sources":["../../src/motion/easings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAqC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAqC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAqC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostWord.d.ts","sourceRoot":"","sources":["../../src/type/GhostWord.tsx"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,IAAe,EACf,SAAc,EACd,KAAK,GACN,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,+BAMA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export function GhostWord({ text, fill = "accent", className = "", style, }) {
|
|
3
|
+
return (_jsx("span", { "aria-hidden": true, className: `mizu-ghost mizu-ghost--${fill} ${className}`, style: style, children: text }));
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=GhostWord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostWord.js","sourceRoot":"","sources":["../../src/type/GhostWord.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,EACJ,IAAI,GAAG,QAAQ,EACf,SAAS,GAAG,EAAE,EACd,KAAK,GAMN;IACC,OAAO,CACL,oCAAkB,SAAS,EAAE,0BAA0B,IAAI,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,YACrF,IAAI,GACA,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function SoftType({ text, mode, speed, min, max, className, style, label, }: {
|
|
2
|
+
text?: string;
|
|
3
|
+
mode?: "weight" | "width" | "both";
|
|
4
|
+
speed?: number;
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
label?: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=SoftType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftType.d.ts","sourceRoot":"","sources":["../../src/type/SoftType.tsx"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,EACvB,IAAW,EACX,IAAe,EACf,KAAS,EACT,GAAS,EACT,GAAS,EACT,SAAc,EACd,KAAK,EACL,KAAK,GACN,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,+BAmCA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback } from "react";
|
|
4
|
+
import { useCanvasLoop } from "../lab/useCanvas";
|
|
5
|
+
export function SoftType({ text = "Aa", mode = "weight", speed = 1, min = 100, max = 900, className = "", style, label, }) {
|
|
6
|
+
const draw = useCallback((ctx, w, h, t) => {
|
|
7
|
+
const osc = 0.5 + 0.5 * Math.sin(t * 0.0009 * speed);
|
|
8
|
+
const wght = Math.round(min + (max - min) * osc);
|
|
9
|
+
const wdth = Math.round(62 + (125 - 62) * (0.5 + 0.5 * Math.sin(t * 0.0006 * speed)));
|
|
10
|
+
const wghtV = mode === "width" ? 500 : wght;
|
|
11
|
+
const wdthV = mode === "weight" ? 100 : wdth;
|
|
12
|
+
const c = ctx;
|
|
13
|
+
c.fontVariationSettings = `"wght" ${wghtV}, "wdth" ${wdthV}`;
|
|
14
|
+
ctx.font = `500 ${Math.round(h * 0.52)}px "Archivo Variable", sans-serif`;
|
|
15
|
+
ctx.textAlign = "center";
|
|
16
|
+
ctx.textBaseline = "middle";
|
|
17
|
+
ctx.fillStyle = "rgba(244, 240, 232, 0.92)";
|
|
18
|
+
ctx.fillText(text, w / 2 + Math.sin(t * 0.0006 * speed) * 4, h / 2);
|
|
19
|
+
c.fontVariationSettings = "normal";
|
|
20
|
+
ctx.font = `500 ${Math.round(h * 0.07)}px "JetBrains Mono", monospace`;
|
|
21
|
+
ctx.fillStyle = "rgba(255, 77, 28, 0.9)";
|
|
22
|
+
ctx.fillText(`wght ${wghtV}`, w / 2, h * 0.86);
|
|
23
|
+
}, [text, mode, speed, min, max]);
|
|
24
|
+
const ref = useCanvasLoop(draw);
|
|
25
|
+
return (_jsx("canvas", { ref: ref, className: className, style: style, role: "img", "aria-label": label ?? `Variable type specimen displaying "${text}"` }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SoftType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftType.js","sourceRoot":"","sources":["../../src/type/SoftType.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,QAAQ,EACf,KAAK,GAAG,CAAC,EACT,GAAG,GAAG,GAAG,EACT,GAAG,GAAG,GAAG,EACT,SAAS,GAAG,EAAE,EACd,KAAK,EACL,KAAK,GAUN;IACC,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,GAA6B,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,EAAE;QACjE,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7C,MAAM,CAAC,GAAG,GAAmE,CAAC;QAC9E,CAAC,CAAC,qBAAqB,GAAG,UAAU,KAAK,YAAY,KAAK,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,mCAAmC,CAAC;QAC1E,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC5B,GAAG,CAAC,SAAS,GAAG,2BAA2B,CAAC;QAC5C,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,qBAAqB,GAAG,QAAQ,CAAC;QACnC,GAAG,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,gCAAgC,CAAC;QACvE,GAAG,CAAC,SAAS,GAAG,wBAAwB,CAAC;QACzC,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC,EACD,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAC9B,CAAC;IAEF,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO,CACL,iBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAC,KAAK,gBACE,KAAK,IAAI,sCAAsC,IAAI,GAAG,GAClE,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function Specimen({ text, onTextChange, size, onSizeChange, weight, onWeightChange, tracking, onTrackingChange, serif, onSerifChange, }: {
|
|
2
|
+
text?: string;
|
|
3
|
+
onTextChange?: (v: string) => void;
|
|
4
|
+
size?: number;
|
|
5
|
+
onSizeChange?: (v: number) => void;
|
|
6
|
+
weight?: number;
|
|
7
|
+
onWeightChange?: (v: number) => void;
|
|
8
|
+
tracking?: number;
|
|
9
|
+
onTrackingChange?: (v: number) => void;
|
|
10
|
+
serif?: boolean;
|
|
11
|
+
onSerifChange?: (v: boolean) => void;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=Specimen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Specimen.d.ts","sourceRoot":"","sources":["../../src/type/Specimen.tsx"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,KAAK,EACL,aAAa,GACd,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,+BAyJA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Slider } from "../ui/Slider";
|
|
5
|
+
export function Specimen({ text, onTextChange, size, onSizeChange, weight, onWeightChange, tracking, onTrackingChange, serif, onSerifChange, }) {
|
|
6
|
+
const [t, setT] = useState("Mizu");
|
|
7
|
+
const [s, setS] = useState(84);
|
|
8
|
+
const [w, setW] = useState(800);
|
|
9
|
+
const [tr, setTr] = useState(-2);
|
|
10
|
+
const [se, setSe] = useState(false);
|
|
11
|
+
const textV = text ?? t;
|
|
12
|
+
const sizeV = size ?? s;
|
|
13
|
+
const weightV = weight ?? w;
|
|
14
|
+
const trackingV = tracking ?? tr;
|
|
15
|
+
const serifV = serif ?? se;
|
|
16
|
+
const shown = textV.trim() === "" ? "Type" : textV;
|
|
17
|
+
return (_jsxs("div", { children: [_jsx("div", { style: {
|
|
18
|
+
display: "flex",
|
|
19
|
+
minHeight: 220,
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
justifyContent: "center",
|
|
22
|
+
overflow: "hidden",
|
|
23
|
+
border: "1px solid var(--mizu-line)",
|
|
24
|
+
background: "var(--mizu-ink-2)",
|
|
25
|
+
padding: "40px 24px",
|
|
26
|
+
}, className: "mizu-specimen-stage", children: _jsx("p", { style: {
|
|
27
|
+
maxWidth: "100%",
|
|
28
|
+
margin: 0,
|
|
29
|
+
textAlign: "center",
|
|
30
|
+
overflowWrap: "break-word",
|
|
31
|
+
lineHeight: 0.95,
|
|
32
|
+
transition: "font-size 150ms ease, letter-spacing 150ms ease",
|
|
33
|
+
fontFamily: serifV ? "var(--mizu-font-serif)" : "var(--mizu-font-display)",
|
|
34
|
+
fontStyle: serifV ? "italic" : "normal",
|
|
35
|
+
fontSize: sizeV,
|
|
36
|
+
fontWeight: serifV ? 400 : weightV,
|
|
37
|
+
letterSpacing: trackingV,
|
|
38
|
+
fontStretch: serifV ? "normal" : "100%",
|
|
39
|
+
}, children: shown }) }), _jsxs("div", { style: { display: "grid", gap: 20, marginTop: 28 }, children: [_jsxs("label", { style: {
|
|
40
|
+
display: "grid",
|
|
41
|
+
gridTemplateColumns: "104px 1fr 52px",
|
|
42
|
+
alignItems: "center",
|
|
43
|
+
gap: 16,
|
|
44
|
+
fontFamily: "var(--mizu-font-mono)",
|
|
45
|
+
fontSize: 10,
|
|
46
|
+
letterSpacing: "0.2em",
|
|
47
|
+
textTransform: "uppercase",
|
|
48
|
+
color: "var(--mizu-faint)",
|
|
49
|
+
}, children: ["Text", _jsx("input", { value: textV, onChange: (e) => onTextChange ? onTextChange(e.target.value) : setT(e.target.value), maxLength: 14, placeholder: "Type something", "aria-label": "Specimen text", style: {
|
|
50
|
+
width: "100%",
|
|
51
|
+
border: "1px solid var(--mizu-line)",
|
|
52
|
+
background: "var(--mizu-ink-2)",
|
|
53
|
+
padding: "10px 12px",
|
|
54
|
+
fontFamily: "var(--mizu-font-mono)",
|
|
55
|
+
fontSize: 12,
|
|
56
|
+
letterSpacing: "normal",
|
|
57
|
+
textTransform: "none",
|
|
58
|
+
color: "var(--mizu-paper)",
|
|
59
|
+
outline: "none",
|
|
60
|
+
}, className: "mizu-specimen-input" }), _jsx("span", {})] }), _jsx(Slider, { label: "Size", value: sizeV, min: 24, max: 140, onChange: (v) => onSizeChange ? onSizeChange(v) : setS(v) }), _jsx(Slider, { label: "Weight", value: weightV, min: 100, max: 900, step: 25, disabled: serifV, onChange: (v) => onWeightChange ? onWeightChange(v) : setW(v) }), _jsx(Slider, { label: "Tracking", value: trackingV, min: -8, max: 24, onChange: (v) => onTrackingChange ? onTrackingChange(v) : setTr(v) }), _jsxs("button", { type: "button", onClick: () => onSerifChange ? onSerifChange(!serifV) : setSe(!serifV), "aria-pressed": serifV, style: {
|
|
61
|
+
display: "flex",
|
|
62
|
+
alignItems: "center",
|
|
63
|
+
justifyContent: "space-between",
|
|
64
|
+
border: "1px solid var(--mizu-line)",
|
|
65
|
+
padding: "12px 16px",
|
|
66
|
+
background: "transparent",
|
|
67
|
+
fontFamily: "var(--mizu-font-mono)",
|
|
68
|
+
fontSize: 10,
|
|
69
|
+
letterSpacing: "0.2em",
|
|
70
|
+
textTransform: "uppercase",
|
|
71
|
+
color: "var(--mizu-muted)",
|
|
72
|
+
cursor: "pointer",
|
|
73
|
+
}, className: "mizu-specimen-toggle", children: ["Serif italic", _jsx("span", { style: { color: serifV ? "var(--mizu-accent)" : "var(--mizu-faint)" }, children: serifV ? "On" : "Off" })] })] }), _jsxs("p", { style: {
|
|
74
|
+
marginTop: 24,
|
|
75
|
+
fontFamily: "var(--mizu-font-mono)",
|
|
76
|
+
fontSize: 10,
|
|
77
|
+
lineHeight: 1.6,
|
|
78
|
+
letterSpacing: "0.08em",
|
|
79
|
+
color: "var(--mizu-faint)",
|
|
80
|
+
}, children: ["font: ", serifV ? "italic 400" : `${weightV} ${sizeV}px/0.95`, " ", serifV ? "Instrument Serif" : "Archivo Variable", "; \u00B7 letter-spacing: ", trackingV, "px; \u00B7 stretch:", " ", serifV ? "normal" : "100%"] })] }));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=Specimen.js.map
|