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.
Files changed (127) hide show
  1. package/README.md +102 -0
  2. package/dist/composite/Accordion.d.ts +13 -0
  3. package/dist/composite/Accordion.d.ts.map +1 -0
  4. package/dist/composite/Accordion.js +54 -0
  5. package/dist/composite/Accordion.js.map +1 -0
  6. package/dist/composite/Dialog.d.ts +18 -0
  7. package/dist/composite/Dialog.d.ts.map +1 -0
  8. package/dist/composite/Dialog.js +113 -0
  9. package/dist/composite/Dialog.js.map +1 -0
  10. package/dist/composite/Nav.d.ts +13 -0
  11. package/dist/composite/Nav.d.ts.map +1 -0
  12. package/dist/composite/Nav.js +142 -0
  13. package/dist/composite/Nav.js.map +1 -0
  14. package/dist/composite/Tabs.d.ts +24 -0
  15. package/dist/composite/Tabs.d.ts.map +1 -0
  16. package/dist/composite/Tabs.js +53 -0
  17. package/dist/composite/Tabs.js.map +1 -0
  18. package/dist/feedback/CopyButton.d.ts +6 -0
  19. package/dist/feedback/CopyButton.d.ts.map +1 -0
  20. package/dist/feedback/CopyButton.js +50 -0
  21. package/dist/feedback/CopyButton.js.map +1 -0
  22. package/dist/feedback/CountUp.d.ts +10 -0
  23. package/dist/feedback/CountUp.d.ts.map +1 -0
  24. package/dist/feedback/CountUp.js +35 -0
  25. package/dist/feedback/CountUp.js.map +1 -0
  26. package/dist/feedback/Toast.d.ts +14 -0
  27. package/dist/feedback/Toast.d.ts.map +1 -0
  28. package/dist/feedback/Toast.js +61 -0
  29. package/dist/feedback/Toast.js.map +1 -0
  30. package/dist/index.d.ts +31 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +31 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/lab/Pinfield.d.ts +9 -0
  35. package/dist/lab/Pinfield.d.ts.map +1 -0
  36. package/dist/lab/Pinfield.js +100 -0
  37. package/dist/lab/Pinfield.js.map +1 -0
  38. package/dist/lab/RippleSurface.d.ts +6 -0
  39. package/dist/lab/RippleSurface.d.ts.map +1 -0
  40. package/dist/lab/RippleSurface.js +102 -0
  41. package/dist/lab/RippleSurface.js.map +1 -0
  42. package/dist/lab/Signal.d.ts +8 -0
  43. package/dist/lab/Signal.d.ts.map +1 -0
  44. package/dist/lab/Signal.js +101 -0
  45. package/dist/lab/Signal.js.map +1 -0
  46. package/dist/lab/useCanvas.d.ts +3 -0
  47. package/dist/lab/useCanvas.d.ts.map +1 -0
  48. package/dist/lab/useCanvas.js +63 -0
  49. package/dist/lab/useCanvas.js.map +1 -0
  50. package/dist/motion/Magnetic.d.ts +8 -0
  51. package/dist/motion/Magnetic.d.ts.map +1 -0
  52. package/dist/motion/Magnetic.js +22 -0
  53. package/dist/motion/Magnetic.js.map +1 -0
  54. package/dist/motion/Marquee.d.ts +11 -0
  55. package/dist/motion/Marquee.d.ts.map +1 -0
  56. package/dist/motion/Marquee.js +14 -0
  57. package/dist/motion/Marquee.js.map +1 -0
  58. package/dist/motion/MaskLine.d.ts +9 -0
  59. package/dist/motion/MaskLine.d.ts.map +1 -0
  60. package/dist/motion/MaskLine.js +8 -0
  61. package/dist/motion/MaskLine.js.map +1 -0
  62. package/dist/motion/PageWipe.d.ts +10 -0
  63. package/dist/motion/PageWipe.d.ts.map +1 -0
  64. package/dist/motion/PageWipe.js +60 -0
  65. package/dist/motion/PageWipe.js.map +1 -0
  66. package/dist/motion/Reveal.d.ts +12 -0
  67. package/dist/motion/Reveal.d.ts.map +1 -0
  68. package/dist/motion/Reveal.js +8 -0
  69. package/dist/motion/Reveal.js.map +1 -0
  70. package/dist/motion/easings.d.ts +4 -0
  71. package/dist/motion/easings.d.ts.map +1 -0
  72. package/dist/motion/easings.js +4 -0
  73. package/dist/motion/easings.js.map +1 -0
  74. package/dist/type/GhostWord.d.ts +7 -0
  75. package/dist/type/GhostWord.d.ts.map +1 -0
  76. package/dist/type/GhostWord.js +5 -0
  77. package/dist/type/GhostWord.js.map +1 -0
  78. package/dist/type/SoftType.d.ts +11 -0
  79. package/dist/type/SoftType.d.ts.map +1 -0
  80. package/dist/type/SoftType.js +27 -0
  81. package/dist/type/SoftType.js.map +1 -0
  82. package/dist/type/Specimen.d.ts +13 -0
  83. package/dist/type/Specimen.d.ts.map +1 -0
  84. package/dist/type/Specimen.js +82 -0
  85. package/dist/type/Specimen.js.map +1 -0
  86. package/dist/type/WaveText.d.ts +10 -0
  87. package/dist/type/WaveText.d.ts.map +1 -0
  88. package/dist/type/WaveText.js +37 -0
  89. package/dist/type/WaveText.js.map +1 -0
  90. package/dist/ui/Badge.d.ts +10 -0
  91. package/dist/ui/Badge.d.ts.map +1 -0
  92. package/dist/ui/Badge.js +26 -0
  93. package/dist/ui/Badge.js.map +1 -0
  94. package/dist/ui/Button.d.ts +19 -0
  95. package/dist/ui/Button.d.ts.map +1 -0
  96. package/dist/ui/Button.js +47 -0
  97. package/dist/ui/Button.js.map +1 -0
  98. package/dist/ui/Frame.d.ts +9 -0
  99. package/dist/ui/Frame.d.ts.map +1 -0
  100. package/dist/ui/Frame.js +37 -0
  101. package/dist/ui/Frame.js.map +1 -0
  102. package/dist/ui/Mark.d.ts +9 -0
  103. package/dist/ui/Mark.d.ts.map +1 -0
  104. package/dist/ui/Mark.js +19 -0
  105. package/dist/ui/Mark.js.map +1 -0
  106. package/dist/ui/Rule.d.ts +8 -0
  107. package/dist/ui/Rule.d.ts.map +1 -0
  108. package/dist/ui/Rule.js +22 -0
  109. package/dist/ui/Rule.js.map +1 -0
  110. package/dist/ui/SectionTag.d.ts +10 -0
  111. package/dist/ui/SectionTag.d.ts.map +1 -0
  112. package/dist/ui/SectionTag.js +17 -0
  113. package/dist/ui/SectionTag.js.map +1 -0
  114. package/dist/ui/Slider.d.ts +13 -0
  115. package/dist/ui/Slider.d.ts.map +1 -0
  116. package/dist/ui/Slider.js +18 -0
  117. package/dist/ui/Slider.js.map +1 -0
  118. package/dist/ui/Spinner.d.ts +8 -0
  119. package/dist/ui/Spinner.d.ts.map +1 -0
  120. package/dist/ui/Spinner.js +9 -0
  121. package/dist/ui/Spinner.js.map +1 -0
  122. package/dist/ui/Tooltip.d.ts +9 -0
  123. package/dist/ui/Tooltip.d.ts.map +1 -0
  124. package/dist/ui/Tooltip.js +5 -0
  125. package/dist/ui/Tooltip.js.map +1 -0
  126. package/package.json +44 -0
  127. 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,3 @@
1
+ import { type RefObject } from "react";
2
+ export declare function useCanvasLoop(draw: (ctx: CanvasRenderingContext2D, w: number, h: number, t: number) => void): RefObject<HTMLCanvasElement | null>;
3
+ //# sourceMappingURL=useCanvas.d.ts.map
@@ -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":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,WAAW,GAAG,GAAG,CAAC;AAMxB,MAAM,eAAe,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAErE,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAA2B;IACpE,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAuC,IAAI,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE3B,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE;QACb,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE;gBACtB,OAAO,EAAE,CAAC;gBACV,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,CAAC,CAAC;YACF,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,MAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,aACtC,QAAQ,EACT,KAAC,eAAe,cACb,MAAM,IAAI,CACT,KAAC,MAAM,CAAC,GAAG,yBAGT,SAAS,EAAC,WAAW,EACrB,KAAK,EAAE;wBACL,QAAQ,EAAE,OAAO;wBACjB,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,oBAAoB;wBAC5B,UAAU,EAAE,mBAAmB;wBAC/B,WAAW,EAAE,8BAA8B;wBAC3C,OAAO,EAAE,MAAM;wBACf,UAAU,EAAE,QAAQ;wBACpB,cAAc,EAAE,QAAQ;wBACxB,aAAa,EAAE,MAAM;qBACtB,EACD,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EACvB,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACpB,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EACzD,mBAAmB,EAAE,MAAM,YAE1B,MAAM,CAAC,KAAK,IAAI,CACf,KAAC,MAAM,CAAC,IAAI,IACV,KAAK,EAAE;4BACL,UAAU,EAAE,uBAAuB;4BACnC,QAAQ,EAAE,EAAE;4BACZ,aAAa,EAAE,QAAQ;4BACvB,aAAa,EAAE,WAAW;4BAC1B,KAAK,EAAE,mBAAmB;4BAC1B,OAAO,EAAE,GAAG;yBACb,EACD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAC9B,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACxC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAElF,MAAM,CAAC,KAAK,GACD,CACf,IApCI,MAAM,CAAC,EAAE,CAqCH,CACd,GACe,IACO,CAC5B,CAAC;AACJ,CAAC"}
@@ -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,4 @@
1
+ export declare const EASE_EXPO: [number, number, number, number];
2
+ export declare const EASE_WIPE: [number, number, number, number];
3
+ export declare const EASE_SPRING: [number, number, number, number];
4
+ //# sourceMappingURL=easings.d.ts.map
@@ -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,4 @@
1
+ export const EASE_EXPO = [0.16, 1, 0.3, 1];
2
+ export const EASE_WIPE = [0.76, 0, 0.24, 1];
3
+ export const EASE_SPRING = [0.34, 1.56, 0.64, 1];
4
+ //# sourceMappingURL=easings.js.map
@@ -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,7 @@
1
+ export declare function GhostWord({ text, fill, className, style, }: {
2
+ text: string;
3
+ fill?: "accent" | "paper";
4
+ className?: string;
5
+ style?: React.CSSProperties;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=GhostWord.d.ts.map
@@ -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