@zentauri-ui/zentauri-components 2.2.2 → 2.3.1

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 (194) hide show
  1. package/README.md +10 -6
  2. package/cli/props.json +526 -0
  3. package/cli/registry.json +11 -0
  4. package/dist/chunk-4U6PVVST.mjs +15 -0
  5. package/dist/chunk-4U6PVVST.mjs.map +1 -0
  6. package/dist/{chunk-DIAA5VH4.mjs → chunk-CIZQQ32L.mjs} +3 -3
  7. package/dist/chunk-CIZQQ32L.mjs.map +1 -0
  8. package/dist/chunk-EZNR7VLJ.js +65 -0
  9. package/dist/chunk-EZNR7VLJ.js.map +1 -0
  10. package/dist/{chunk-PQ2XTY3M.js → chunk-G36ZV446.js} +13 -13
  11. package/dist/{chunk-PQ2XTY3M.js.map → chunk-G36ZV446.js.map} +1 -1
  12. package/dist/{chunk-H3BJOK22.js → chunk-HNAUUCR5.js} +3 -3
  13. package/dist/chunk-HNAUUCR5.js.map +1 -0
  14. package/dist/{chunk-UZ6Y5CSV.js → chunk-K7UU3K54.js} +39 -18
  15. package/dist/chunk-K7UU3K54.js.map +1 -0
  16. package/dist/chunk-MY3DQVNF.js +19 -0
  17. package/dist/{chunk-ILPPXWR3.js.map → chunk-MY3DQVNF.js.map} +1 -1
  18. package/dist/{chunk-ATE5SCTR.mjs → chunk-N6Q4ZLQR.mjs} +3 -3
  19. package/dist/{chunk-ATE5SCTR.mjs.map → chunk-N6Q4ZLQR.mjs.map} +1 -1
  20. package/dist/{chunk-GFE6ZX5Y.mjs → chunk-PJATBFEK.mjs} +30 -9
  21. package/dist/chunk-PJATBFEK.mjs.map +1 -0
  22. package/dist/chunk-PVVYOIU2.js +38 -0
  23. package/dist/chunk-PVVYOIU2.js.map +1 -0
  24. package/dist/chunk-PWEZB53R.js +90 -0
  25. package/dist/chunk-PWEZB53R.js.map +1 -0
  26. package/dist/chunk-PWYEC3KY.mjs +30 -0
  27. package/dist/chunk-PWYEC3KY.mjs.map +1 -0
  28. package/dist/{chunk-5I4GAURE.js → chunk-RBNZNWYQ.js} +6 -6
  29. package/dist/{chunk-5I4GAURE.js.map → chunk-RBNZNWYQ.js.map} +1 -1
  30. package/dist/chunk-RDYR4DHG.mjs +62 -0
  31. package/dist/chunk-RDYR4DHG.mjs.map +1 -0
  32. package/dist/chunk-RWF3NVZP.mjs +29 -0
  33. package/dist/chunk-RWF3NVZP.mjs.map +1 -0
  34. package/dist/{chunk-NUV2I337.mjs → chunk-STWXN5EM.mjs} +3 -3
  35. package/dist/{chunk-NUV2I337.mjs.map → chunk-STWXN5EM.mjs.map} +1 -1
  36. package/dist/{chunk-W5MTZJPE.mjs → chunk-TTKTPERV.mjs} +3 -3
  37. package/dist/{chunk-W5MTZJPE.mjs.map → chunk-TTKTPERV.mjs.map} +1 -1
  38. package/dist/chunk-UBQY572I.mjs +81 -0
  39. package/dist/chunk-UBQY572I.mjs.map +1 -0
  40. package/dist/{chunk-IY72Z65Z.js → chunk-UN5RRNPV.js} +12 -12
  41. package/dist/{chunk-IY72Z65Z.js.map → chunk-UN5RRNPV.js.map} +1 -1
  42. package/dist/{chunk-N2G7IWHS.mjs → chunk-VMVG2RVZ.mjs} +4 -4
  43. package/dist/{chunk-N2G7IWHS.mjs.map → chunk-VMVG2RVZ.mjs.map} +1 -1
  44. package/dist/chunk-XUK5P37Y.js +19 -0
  45. package/dist/chunk-XUK5P37Y.js.map +1 -0
  46. package/dist/chunk-YRQN3AV4.js +38 -0
  47. package/dist/chunk-YRQN3AV4.js.map +1 -0
  48. package/dist/design-system/facade.js +12 -9
  49. package/dist/design-system/facade.js.map +1 -1
  50. package/dist/design-system/facade.mjs +11 -8
  51. package/dist/design-system/facade.mjs.map +1 -1
  52. package/dist/design-system/hash-generator.d.ts +15 -0
  53. package/dist/design-system/hash-generator.d.ts.map +1 -0
  54. package/dist/design-system/index.d.ts +3 -0
  55. package/dist/design-system/index.d.ts.map +1 -1
  56. package/dist/design-system/qr-code.d.ts +4 -0
  57. package/dist/design-system/qr-code.d.ts.map +1 -0
  58. package/dist/design-system/qr-scanner.d.ts +11 -0
  59. package/dist/design-system/qr-scanner.d.ts.map +1 -0
  60. package/dist/design-system/secret-reveal.d.ts +1 -1
  61. package/dist/design-system/secret-reveal.d.ts.map +1 -1
  62. package/dist/hooks/index.d.ts +1 -0
  63. package/dist/hooks/index.d.ts.map +1 -1
  64. package/dist/hooks/useHash/index.d.ts +2 -0
  65. package/dist/hooks/useHash/index.d.ts.map +1 -0
  66. package/dist/hooks/useHash/useHash.d.ts +20 -0
  67. package/dist/hooks/useHash/useHash.d.ts.map +1 -0
  68. package/dist/hooks/useHash.js +18 -0
  69. package/dist/hooks/useHash.js.map +1 -0
  70. package/dist/hooks/useHash.mjs +5 -0
  71. package/dist/hooks/useHash.mjs.map +1 -0
  72. package/dist/ui/buttons/animated.js +14 -11
  73. package/dist/ui/buttons/animated.js.map +1 -1
  74. package/dist/ui/buttons/animated.mjs +12 -9
  75. package/dist/ui/buttons/animated.mjs.map +1 -1
  76. package/dist/ui/buttons.js +15 -12
  77. package/dist/ui/buttons.mjs +13 -10
  78. package/dist/ui/data-table.js +24 -21
  79. package/dist/ui/data-table.js.map +1 -1
  80. package/dist/ui/data-table.mjs +14 -11
  81. package/dist/ui/data-table.mjs.map +1 -1
  82. package/dist/ui/dynamic-stepper.js +24 -21
  83. package/dist/ui/dynamic-stepper.js.map +1 -1
  84. package/dist/ui/dynamic-stepper.mjs +13 -10
  85. package/dist/ui/dynamic-stepper.mjs.map +1 -1
  86. package/dist/ui/hash-generator/hash-generator-base.d.ts +6 -0
  87. package/dist/ui/hash-generator/hash-generator-base.d.ts.map +1 -0
  88. package/dist/ui/hash-generator/hash-generator.d.ts +2 -0
  89. package/dist/ui/hash-generator/hash-generator.d.ts.map +1 -0
  90. package/dist/ui/hash-generator/index.d.ts +5 -0
  91. package/dist/ui/hash-generator/index.d.ts.map +1 -0
  92. package/dist/ui/hash-generator/types.d.ts +17 -0
  93. package/dist/ui/hash-generator/types.d.ts.map +1 -0
  94. package/dist/ui/hash-generator/variants.d.ts +10 -0
  95. package/dist/ui/hash-generator/variants.d.ts.map +1 -0
  96. package/dist/ui/hash-generator.js +126 -0
  97. package/dist/ui/hash-generator.js.map +1 -0
  98. package/dist/ui/hash-generator.mjs +117 -0
  99. package/dist/ui/hash-generator.mjs.map +1 -0
  100. package/dist/ui/pagination.js +16 -13
  101. package/dist/ui/pagination.mjs +13 -10
  102. package/dist/ui/qr-code/animated/animations.d.ts +8 -0
  103. package/dist/ui/qr-code/animated/animations.d.ts.map +1 -0
  104. package/dist/ui/qr-code/animated/index.d.ts +4 -0
  105. package/dist/ui/qr-code/animated/index.d.ts.map +1 -0
  106. package/dist/ui/qr-code/animated/qr-code-animated.d.ts +6 -0
  107. package/dist/ui/qr-code/animated/qr-code-animated.d.ts.map +1 -0
  108. package/dist/ui/qr-code/animated/types.d.ts +9 -0
  109. package/dist/ui/qr-code/animated/types.d.ts.map +1 -0
  110. package/dist/ui/qr-code/animated.js +156 -0
  111. package/dist/ui/qr-code/animated.js.map +1 -0
  112. package/dist/ui/qr-code/animated.mjs +149 -0
  113. package/dist/ui/qr-code/animated.mjs.map +1 -0
  114. package/dist/ui/qr-code/index.d.ts +5 -0
  115. package/dist/ui/qr-code/index.d.ts.map +1 -0
  116. package/dist/ui/qr-code/qr-code-base.d.ts +47 -0
  117. package/dist/ui/qr-code/qr-code-base.d.ts.map +1 -0
  118. package/dist/ui/qr-code/qr-code.d.ts +2 -0
  119. package/dist/ui/qr-code/qr-code.d.ts.map +1 -0
  120. package/dist/ui/qr-code/types.d.ts +14 -0
  121. package/dist/ui/qr-code/types.d.ts.map +1 -0
  122. package/dist/ui/qr-code/variants.d.ts +4 -0
  123. package/dist/ui/qr-code/variants.d.ts.map +1 -0
  124. package/dist/ui/qr-code.js +35 -0
  125. package/dist/ui/qr-code.js.map +1 -0
  126. package/dist/ui/qr-code.mjs +17 -0
  127. package/dist/ui/qr-code.mjs.map +1 -0
  128. package/dist/ui/qr-scanner/index.d.ts +4 -0
  129. package/dist/ui/qr-scanner/index.d.ts.map +1 -0
  130. package/dist/ui/qr-scanner/qr-scanner-base.d.ts +62 -0
  131. package/dist/ui/qr-scanner/qr-scanner-base.d.ts.map +1 -0
  132. package/dist/ui/qr-scanner/qr-scanner.d.ts +2 -0
  133. package/dist/ui/qr-scanner/qr-scanner.d.ts.map +1 -0
  134. package/dist/ui/qr-scanner/types.d.ts +28 -0
  135. package/dist/ui/qr-scanner/types.d.ts.map +1 -0
  136. package/dist/ui/qr-scanner/variants.d.ts +9 -0
  137. package/dist/ui/qr-scanner/variants.d.ts.map +1 -0
  138. package/dist/ui/qr-scanner.js +316 -0
  139. package/dist/ui/qr-scanner.js.map +1 -0
  140. package/dist/ui/qr-scanner.mjs +308 -0
  141. package/dist/ui/qr-scanner.mjs.map +1 -0
  142. package/dist/ui/secret-reveal/animated/secret-reveal-animated.d.ts.map +1 -1
  143. package/dist/ui/secret-reveal/animated.js +10 -7
  144. package/dist/ui/secret-reveal/animated.js.map +1 -1
  145. package/dist/ui/secret-reveal/animated.mjs +6 -3
  146. package/dist/ui/secret-reveal/animated.mjs.map +1 -1
  147. package/dist/ui/secret-reveal/secret-reveal-base.d.ts.map +1 -1
  148. package/dist/ui/secret-reveal.js +14 -11
  149. package/dist/ui/secret-reveal.js.map +1 -1
  150. package/dist/ui/secret-reveal.mjs +7 -4
  151. package/dist/ui/secret-reveal.mjs.map +1 -1
  152. package/dist/ui/split-button.js +26 -23
  153. package/dist/ui/split-button.js.map +1 -1
  154. package/dist/ui/split-button.mjs +13 -10
  155. package/dist/ui/split-button.mjs.map +1 -1
  156. package/package.json +5 -2
  157. package/src/design-system/hash-generator.ts +34 -0
  158. package/src/design-system/index.ts +3 -0
  159. package/src/design-system/qr-code.ts +13 -0
  160. package/src/design-system/qr-scanner.ts +32 -0
  161. package/src/design-system/secret-reveal.ts +1 -1
  162. package/src/hooks/index.ts +6 -0
  163. package/src/hooks/useHash/index.ts +6 -0
  164. package/src/hooks/useHash/useHash.test.ts +77 -0
  165. package/src/hooks/useHash/useHash.ts +89 -0
  166. package/src/ui/hash-generator/hash-generator-base.tsx +106 -0
  167. package/src/ui/hash-generator/hash-generator.test.tsx +73 -0
  168. package/src/ui/hash-generator/hash-generator.tsx +1 -0
  169. package/src/ui/hash-generator/index.ts +18 -0
  170. package/src/ui/hash-generator/types.ts +29 -0
  171. package/src/ui/hash-generator/variants.ts +31 -0
  172. package/src/ui/qr-code/animated/animations.ts +51 -0
  173. package/src/ui/qr-code/animated/index.ts +5 -0
  174. package/src/ui/qr-code/animated/qr-code-animated.tsx +111 -0
  175. package/src/ui/qr-code/animated/types.ts +10 -0
  176. package/src/ui/qr-code/index.ts +10 -0
  177. package/src/ui/qr-code/qr-code-base.tsx +149 -0
  178. package/src/ui/qr-code/qr-code.test.tsx +58 -0
  179. package/src/ui/qr-code/qr-code.tsx +2 -0
  180. package/src/ui/qr-code/types.ts +22 -0
  181. package/src/ui/qr-code/variants.ts +11 -0
  182. package/src/ui/qr-scanner/index.ts +17 -0
  183. package/src/ui/qr-scanner/qr-scanner-base.tsx +568 -0
  184. package/src/ui/qr-scanner/qr-scanner.test.tsx +61 -0
  185. package/src/ui/qr-scanner/qr-scanner.tsx +2 -0
  186. package/src/ui/qr-scanner/types.ts +32 -0
  187. package/src/ui/qr-scanner/variants.ts +26 -0
  188. package/src/ui/secret-reveal/animated/secret-reveal-animated.tsx +4 -1
  189. package/src/ui/secret-reveal/secret-reveal-base.tsx +4 -1
  190. package/dist/chunk-DIAA5VH4.mjs.map +0 -1
  191. package/dist/chunk-GFE6ZX5Y.mjs.map +0 -1
  192. package/dist/chunk-H3BJOK22.js.map +0 -1
  193. package/dist/chunk-ILPPXWR3.js +0 -19
  194. package/dist/chunk-UZ6Y5CSV.js.map +0 -1
@@ -0,0 +1,308 @@
1
+ "use client";
2
+ import { zuiQrScannerBase, zuiQrScannerAppearances, zuiQrScannerVideo, zuiQrScannerOverlay, zuiQrScannerViewfinder, zuiQrScannerStatusBase, zuiQrScannerFallbackBase } from '../chunk-PWYEC3KY.mjs';
3
+ import { cn } from '../chunk-4D54YOL6.mjs';
4
+ import '../chunk-J5LGTIGS.mjs';
5
+ import { useRef, useState, useEffect, useCallback, useImperativeHandle } from 'react';
6
+ import { cva } from 'class-variance-authority';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var qrScannerVariants = cva(zuiQrScannerBase, {
10
+ variants: {
11
+ appearance: zuiQrScannerAppearances
12
+ },
13
+ defaultVariants: {
14
+ appearance: "default"
15
+ }
16
+ });
17
+ var qrScannerVideoVariants = cva(zuiQrScannerVideo);
18
+ var qrScannerOverlayVariants = cva(zuiQrScannerOverlay);
19
+ var qrScannerViewfinderVariants = cva(zuiQrScannerViewfinder);
20
+ var qrScannerStatusVariants = cva(zuiQrScannerStatusBase);
21
+ var qrScannerFallbackVariants = cva(zuiQrScannerFallbackBase);
22
+ var cachedJsQR = null;
23
+ async function getJsqr() {
24
+ if (!cachedJsQR) {
25
+ const { default: m } = await import('jsqr');
26
+ cachedJsQR = m;
27
+ }
28
+ return cachedJsQR;
29
+ }
30
+ function QrScannerBase({
31
+ onResult,
32
+ onError,
33
+ onStart,
34
+ onStop,
35
+ facingMode = "environment",
36
+ constraints,
37
+ scanDelay = 500,
38
+ continuous = false,
39
+ fallbackText = "Camera not available",
40
+ loadingText = "Starting camera...",
41
+ noCameraText = "No camera detected",
42
+ appearance,
43
+ autoStart = true,
44
+ className,
45
+ ref,
46
+ ...rest
47
+ }) {
48
+ const videoRef = useRef(null);
49
+ const canvasRef = useRef(null);
50
+ const streamRef = useRef(null);
51
+ const scanningRef = useRef(false);
52
+ const lastScanRef = useRef(0);
53
+ const rafRef = useRef(0);
54
+ const mountedRef = useRef(true);
55
+ const playPromiseRef = useRef(null);
56
+ const onResultRef = useRef(onResult);
57
+ const onErrorRef = useRef(onError);
58
+ const onStartRef = useRef(onStart);
59
+ const onStopRef = useRef(onStop);
60
+ onResultRef.current = onResult;
61
+ onErrorRef.current = onError;
62
+ onStartRef.current = onStart;
63
+ onStopRef.current = onStop;
64
+ const [scanning, setScanning] = useState(false);
65
+ const [status, setStatus] = useState("idle");
66
+ const [error, setError] = useState(null);
67
+ useEffect(() => {
68
+ mountedRef.current = true;
69
+ return () => {
70
+ mountedRef.current = false;
71
+ };
72
+ }, []);
73
+ const stopCamera = useCallback(() => {
74
+ scanningRef.current = false;
75
+ setScanning(false);
76
+ setStatus("idle");
77
+ cancelAnimationFrame(rafRef.current);
78
+ const streamToStop = streamRef.current;
79
+ const doStop = () => {
80
+ if (videoRef.current && videoRef.current.srcObject === streamToStop) {
81
+ videoRef.current.pause();
82
+ videoRef.current.srcObject = null;
83
+ }
84
+ if (streamToStop) {
85
+ streamToStop.getTracks().forEach((track) => track.stop());
86
+ }
87
+ if (streamRef.current === streamToStop) {
88
+ streamRef.current = null;
89
+ }
90
+ onStopRef.current?.();
91
+ };
92
+ if (playPromiseRef.current) {
93
+ playPromiseRef.current.then(doStop, doStop);
94
+ playPromiseRef.current = null;
95
+ } else {
96
+ doStop();
97
+ }
98
+ }, []);
99
+ const scanFrame = useCallback(async () => {
100
+ if (!scanningRef.current || !mountedRef.current) return;
101
+ const video = videoRef.current;
102
+ const canvas = canvasRef.current;
103
+ if (!video || !canvas || video.readyState < video.HAVE_ENOUGH_DATA) {
104
+ rafRef.current = requestAnimationFrame(scanFrame);
105
+ return;
106
+ }
107
+ const now = Date.now();
108
+ if (now - lastScanRef.current < scanDelay) {
109
+ rafRef.current = requestAnimationFrame(scanFrame);
110
+ return;
111
+ }
112
+ lastScanRef.current = now;
113
+ const ctx = canvas.getContext("2d");
114
+ if (!ctx) {
115
+ rafRef.current = requestAnimationFrame(scanFrame);
116
+ return;
117
+ }
118
+ canvas.width = video.videoWidth;
119
+ canvas.height = video.videoHeight;
120
+ ctx.drawImage(video, 0, 0);
121
+ try {
122
+ const jsqr = await getJsqr();
123
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
124
+ const code = jsqr(imageData.data, imageData.width, imageData.height);
125
+ if (code) {
126
+ onResultRef.current(code.data);
127
+ if (!continuous) {
128
+ scanningRef.current = false;
129
+ setScanning(false);
130
+ stopCamera();
131
+ return;
132
+ }
133
+ }
134
+ } catch {
135
+ }
136
+ if (mountedRef.current) {
137
+ rafRef.current = requestAnimationFrame(scanFrame);
138
+ }
139
+ }, [scanDelay, continuous, stopCamera]);
140
+ const startCamera = useCallback(async () => {
141
+ if (!mountedRef.current) return;
142
+ if (!navigator.mediaDevices?.getUserMedia) {
143
+ setStatus("no-camera");
144
+ setError("Camera API not available in this context");
145
+ onErrorRef.current?.(new Error("getUserMedia is not available"));
146
+ return;
147
+ }
148
+ setStatus("starting");
149
+ setError(null);
150
+ try {
151
+ const stream = await navigator.mediaDevices.getUserMedia({
152
+ video: {
153
+ facingMode,
154
+ ...constraints
155
+ }
156
+ });
157
+ if (!mountedRef.current) {
158
+ stream.getTracks().forEach((track) => track.stop());
159
+ return;
160
+ }
161
+ streamRef.current = stream;
162
+ if (videoRef.current) {
163
+ videoRef.current.srcObject = stream;
164
+ playPromiseRef.current = videoRef.current.play();
165
+ await playPromiseRef.current;
166
+ playPromiseRef.current = null;
167
+ }
168
+ if (!mountedRef.current) {
169
+ stopCamera();
170
+ return;
171
+ }
172
+ scanningRef.current = true;
173
+ setScanning(true);
174
+ setStatus("scanning");
175
+ onStartRef.current?.();
176
+ rafRef.current = requestAnimationFrame(scanFrame);
177
+ } catch (err) {
178
+ if (!mountedRef.current) return;
179
+ if (err instanceof DOMException && err.name === "AbortError") return;
180
+ const isNoCamera = err instanceof DOMException && (err.name === "NotFoundError" || err.name === "NotAllowedError" || err.name === "NotReadableError");
181
+ setStatus(isNoCamera ? "no-camera" : "error");
182
+ setError(err instanceof Error ? err.message : String(err));
183
+ onErrorRef.current?.(err);
184
+ }
185
+ }, [facingMode, constraints, scanFrame, stopCamera]);
186
+ useEffect(() => {
187
+ const video = videoRef.current;
188
+ if (autoStart) {
189
+ startCamera();
190
+ }
191
+ return () => {
192
+ scanningRef.current = false;
193
+ cancelAnimationFrame(rafRef.current);
194
+ const streamToStop = streamRef.current;
195
+ const doCleanup = () => {
196
+ if (video && video.srcObject === streamToStop) {
197
+ video.pause();
198
+ video.srcObject = null;
199
+ }
200
+ if (streamToStop) {
201
+ streamToStop.getTracks().forEach((track) => track.stop());
202
+ }
203
+ };
204
+ if (playPromiseRef.current) {
205
+ playPromiseRef.current.then(doCleanup, doCleanup);
206
+ playPromiseRef.current = null;
207
+ } else {
208
+ doCleanup();
209
+ }
210
+ };
211
+ }, [autoStart, startCamera]);
212
+ useImperativeHandle(
213
+ ref,
214
+ () => ({
215
+ start: startCamera,
216
+ stop: stopCamera,
217
+ scanImage: async (file) => {
218
+ let bitmap = null;
219
+ try {
220
+ bitmap = await createImageBitmap(file);
221
+ const tempCanvas = document.createElement("canvas");
222
+ tempCanvas.width = bitmap.width;
223
+ tempCanvas.height = bitmap.height;
224
+ const ctx = tempCanvas.getContext("2d");
225
+ if (!ctx) return null;
226
+ ctx.drawImage(bitmap, 0, 0);
227
+ const imageData = ctx.getImageData(
228
+ 0,
229
+ 0,
230
+ tempCanvas.width,
231
+ tempCanvas.height
232
+ );
233
+ const jsqr = await getJsqr();
234
+ const code = jsqr(imageData.data, imageData.width, imageData.height);
235
+ return code?.data ?? null;
236
+ } catch {
237
+ return null;
238
+ } finally {
239
+ bitmap?.close();
240
+ }
241
+ },
242
+ isScanning: scanning
243
+ }),
244
+ [startCamera, stopCamera, scanning]
245
+ );
246
+ const renderStatus = () => {
247
+ if (status === "starting") {
248
+ return /* @__PURE__ */ jsx("span", { className: qrScannerStatusVariants(), children: loadingText });
249
+ }
250
+ if (status === "error" && error) {
251
+ return /* @__PURE__ */ jsx("span", { className: qrScannerStatusVariants(), children: error });
252
+ }
253
+ if (status === "no-camera") {
254
+ return /* @__PURE__ */ jsx("span", { className: qrScannerStatusVariants(), children: noCameraText });
255
+ }
256
+ return null;
257
+ };
258
+ if (status === "no-camera" || status === "error") {
259
+ return /* @__PURE__ */ jsx(
260
+ "div",
261
+ {
262
+ "data-slot": "qr-scanner",
263
+ className: cn(qrScannerVariants({ appearance }), className),
264
+ ...rest,
265
+ children: /* @__PURE__ */ jsxs("div", { className: qrScannerFallbackVariants(), children: [
266
+ fallbackText,
267
+ renderStatus()
268
+ ] })
269
+ }
270
+ );
271
+ }
272
+ return /* @__PURE__ */ jsxs(
273
+ "div",
274
+ {
275
+ "data-slot": "qr-scanner",
276
+ className: cn(qrScannerVariants({ appearance }), className),
277
+ ...rest,
278
+ children: [
279
+ /* @__PURE__ */ jsx(
280
+ "video",
281
+ {
282
+ ref: videoRef,
283
+ "data-slot": "qr-scanner-video",
284
+ className: qrScannerVideoVariants(),
285
+ playsInline: true,
286
+ muted: true,
287
+ autoPlay: true
288
+ }
289
+ ),
290
+ /* @__PURE__ */ jsx(
291
+ "canvas",
292
+ {
293
+ ref: canvasRef,
294
+ className: "hidden",
295
+ "data-slot": "qr-scanner-canvas"
296
+ }
297
+ ),
298
+ /* @__PURE__ */ jsx("div", { className: qrScannerOverlayVariants(), children: /* @__PURE__ */ jsx("div", { className: qrScannerViewfinderVariants() }) }),
299
+ renderStatus()
300
+ ]
301
+ }
302
+ );
303
+ }
304
+ QrScannerBase.displayName = "QrScanner";
305
+
306
+ export { QrScannerBase as QrScanner, qrScannerFallbackVariants, qrScannerOverlayVariants, qrScannerStatusVariants, qrScannerVariants, qrScannerVideoVariants, qrScannerViewfinderVariants };
307
+ //# sourceMappingURL=qr-scanner.mjs.map
308
+ //# sourceMappingURL=qr-scanner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/qr-scanner/variants.ts","../../src/ui/qr-scanner/qr-scanner-base.tsx"],"names":[],"mappings":"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","file":"qr-scanner.mjs","sourcesContent":["import { cva } from \"class-variance-authority\";\n\nimport {\n zuiQrScannerAppearances,\n zuiQrScannerBase,\n zuiQrScannerFallbackBase,\n zuiQrScannerOverlay,\n zuiQrScannerStatusBase,\n zuiQrScannerViewfinder,\n zuiQrScannerVideo,\n} from \"../../design-system/qr-scanner\";\n\nexport const qrScannerVariants = cva(zuiQrScannerBase, {\n variants: {\n appearance: zuiQrScannerAppearances,\n },\n defaultVariants: {\n appearance: \"default\",\n },\n});\n\nexport const qrScannerVideoVariants = cva(zuiQrScannerVideo);\nexport const qrScannerOverlayVariants = cva(zuiQrScannerOverlay);\nexport const qrScannerViewfinderVariants = cva(zuiQrScannerViewfinder);\nexport const qrScannerStatusVariants = cva(zuiQrScannerStatusBase);\nexport const qrScannerFallbackVariants = cva(zuiQrScannerFallbackBase);\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport type { QrScannerBaseProps } from \"./types\";\nimport {\n qrScannerFallbackVariants,\n qrScannerOverlayVariants,\n qrScannerStatusVariants,\n qrScannerVariants,\n qrScannerVideoVariants,\n qrScannerViewfinderVariants,\n} from \"./variants\";\n\n/**\n * Module-level cache for the `jsQR` decoder library.\n *\n * `jsqr` is dynamically imported on first use (both from `scanFrame` and\n * `scanImage`) and stored here so subsequent frame scans don't re-fetch the\n * module from the network. The import returns an ESM default export, which\n * we extract and cache as a plain function.\n *\n * The `any` type is used because `jsqr`'s published types have a complex\n * overloaded signature (Uint8ClampedArray vs Uint8Array) that doesn't map\n * cleanly to the runtime ImageData we pass. The runtime behaviour is correct\n * regardless.\n */\nlet cachedJsQR: any = null;\n\n/** Lazy-loader that returns the cached jsQR decoder, importing it once. */\nasync function getJsqr() {\n if (!cachedJsQR) {\n const { default: m } = await import(\"jsqr\");\n cachedJsQR = m;\n }\n return cachedJsQR;\n}\n\n/**\n * QrScannerBase uses the device camera (via `getUserMedia`) to decode QR\n * codes in real time. It provides an imperative handle (`ref`) so parents\n * can control the camera lifecycle and scan images without camera access.\n *\n * --- Architecture overview ---\n *\n * The component has three main async loops:\n *\n * 1. **Camera startup** (`startCamera`) — calls `getUserMedia`, attaches\n * the stream to a `<video>` element, calls `video.play()`, then\n * kicks off the scan loop via `requestAnimationFrame`.\n *\n * 2. **Scan loop** (`scanFrame`) — scheduled with `requestAnimationFrame`.\n * Each frame draws the current video frame to an off-screen `<canvas>`,\n * calls `jsQR` on the pixel data, and fires `onResult` when a QR code\n * is detected. Respects `scanDelay` to avoid thrashing.\n *\n * 3. **Image scanning** (`scanImage` on the imperative handle) — decodes a\n * QR code from a static `File` (e.g. an uploaded screenshot) without\n * involving the camera at all.\n *\n * --- Race-condition guards ---\n *\n * Camera start/stop is inherently racy because `video.play()` returns a\n * Promise that resolves asynchronously. If `stopCamera()` (or the\n * `useEffect` cleanup) runs while `play()` is still pending, we must not\n * operate on the new stream that may have been set up in the meantime.\n *\n * Both `stopCamera` and the effect cleanup capture `streamRef.current` into\n * a local `streamToStop` variable at the time they are called. The actual\n * stop/cleanup logic (which may run later via `playPromise.then(...)`)\n * checks `video.srcObject === streamToStop` before pausing, ensuring it\n * only affects the stream that was active at the time of the request.\n *\n * --- Callback ref pattern ---\n *\n * `onResult`, `onError`, `onStart`, `onStop` are stored in refs and kept\n * current in the render body. The `useCallback` hooks for `scanFrame`,\n * `startCamera`, and `stopCamera` read from these refs instead of listing\n * the callbacks in their dependency arrays. This prevents the camera from\n * restarting every time the parent passes a new inline function reference.\n *\n * --- Error classification ---\n *\n * `getUserMedia` throws `DOMException` with specific names:\n * - `NotFoundError` → no camera hardware detected\n * - `NotAllowedError` → user denied permission\n * - `NotReadableError` → camera is busy (another app)\n * - `AbortError` → `play()` was interrupted by unmount\n *\n * The first three set `status` to `\"no-camera\"` and render a fallback UI.\n * `AbortError` is silently swallowed because it's a normal consequence of\n * unmounting during startup. All other errors set `status` to `\"error\"` and\n * display the error message.\n */\nexport function QrScannerBase({\n onResult,\n onError,\n onStart,\n onStop,\n facingMode = \"environment\",\n constraints,\n scanDelay = 500,\n continuous = false,\n fallbackText = \"Camera not available\",\n loadingText = \"Starting camera...\",\n noCameraText = \"No camera detected\",\n appearance,\n autoStart = true,\n className,\n ref,\n ...rest\n}: QrScannerBaseProps) {\n // ---- Refs ----\n\n /** The `<video>` element that plays the camera stream. */\n const videoRef = useRef<HTMLVideoElement>(null);\n\n /** The hidden `<canvas>` used to grab frames for jsQR decoding. */\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n /** The active `MediaStream`, or `null` when the camera is stopped. */\n const streamRef = useRef<MediaStream | null>(null);\n\n /**\n * Boolean ref that tracks whether the scan loop should keep running.\n * Checked at the top of `scanFrame`. Set to `false` by `stopCamera`.\n */\n const scanningRef = useRef(false);\n\n /**\n * Timestamp (ms) of the last attempted frame scan. Used to implement\n * `scanDelay` — frame processing is skipped if frames arrive before the\n * delay elapses, regardless of whether jsQR finds a code.\n */\n const lastScanRef = useRef(0);\n\n /** The current `requestAnimationFrame` ID, used for cancellation. */\n const rafRef = useRef(0);\n\n /** Set to `true` on mount, `false` on unmount. Guards async callbacks. */\n const mountedRef = useRef(true);\n\n /**\n * Stores the pending `play()` promise so that `stopCamera` and the effect\n * cleanup can chain `.then()` on it. Without this, stopping the camera\n * while `play()` is in flight causes the browser warning:\n * \"The play() request was interrupted because the media was removed\"\n */\n const playPromiseRef = useRef<Promise<void> | null>(null);\n\n // ---- Callback refs (keep current without causing re-renders) ----\n\n const onResultRef = useRef(onResult);\n const onErrorRef = useRef(onError);\n const onStartRef = useRef(onStart);\n const onStopRef = useRef(onStop);\n onResultRef.current = onResult;\n onErrorRef.current = onError;\n onStartRef.current = onStart;\n onStopRef.current = onStop;\n\n // ---- State ----\n\n /** Whether the camera is actively scanning (used by `isScanning` on the imperative handle). */\n const [scanning, setScanning] = useState(false);\n\n /**\n * High-level lifecycle status, used to decide which UI to render:\n * - `\"idle\"` — Camera not yet requested.\n * - `\"starting\"` -- `getUserMedia` or `play()` in progress.\n * - `\"scanning\"` -- Camera is live and frames are being analysed.\n * - `\"error\"` -- `getUserMedia` threw a non-camera error.\n * - `\"no-camera\"` -- Camera not found, permission denied, or busy.\n */\n const [status, setStatus] = useState<\n \"idle\" | \"starting\" | \"scanning\" | \"error\" | \"no-camera\"\n >(\"idle\");\n\n /** The error message to display when `status === \"error\"`. */\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Tracks the mount lifecycle. The cleanup sets `mountedRef.current = false`,\n * which is checked by `startCamera` after each `await` point so it can bail\n * early if the component unmounted mid-startup.\n */\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // ---- Camera control ----\n\n /**\n * Stops the camera: cancels the animation frame, pauses the video, stops\n * all tracks on the captured stream, and nulls out refs.\n *\n * **Race-condition handling:**\n * Captures `streamRef.current` into `streamToStop` at call time. If `play()`\n * is pending, the actual stop logic is deferred to a `.then()` callback.\n * That callback checks `video.srcObject === streamToStop` so it only shuts\n * down the stream that was active when `stopCamera` was called, not a\n * newer stream that may have been started in the meantime.\n */\n const stopCamera = useCallback(() => {\n scanningRef.current = false;\n setScanning(false);\n setStatus(\"idle\");\n cancelAnimationFrame(rafRef.current);\n\n const streamToStop = streamRef.current;\n\n const doStop = () => {\n if (videoRef.current && videoRef.current.srcObject === streamToStop) {\n videoRef.current.pause();\n videoRef.current.srcObject = null;\n }\n if (streamToStop) {\n streamToStop.getTracks().forEach((track) => track.stop());\n }\n if (streamRef.current === streamToStop) {\n streamRef.current = null;\n }\n onStopRef.current?.();\n };\n\n if (playPromiseRef.current) {\n playPromiseRef.current.then(doStop, doStop);\n playPromiseRef.current = null;\n } else {\n doStop();\n }\n }, []);\n\n /**\n * The per-frame scan logic, scheduled via `requestAnimationFrame`.\n *\n * 1. Guards: exits early if scanning was cancelled, the component unmounted,\n * or the video doesn't have enough data yet.\n * 2. Throttle: skips frames that arrive before `scanDelay` ms have elapsed\n * since the last decode.\n * 3. Captures the current video frame onto the off-screen canvas.\n * 4. Runs jsQR on the canvas pixel data.\n * 5. On a match: fires `onResultRef.current`. If `continuous` is `false`,\n * stops the camera immediately (single-scan mode).\n * 6. Re-schedules itself unless scanning was stopped.\n *\n * Frame processing errors (e.g. a corrupted frame) are silently caught and\n * the loop continues.\n */\n const scanFrame = useCallback(async () => {\n if (!scanningRef.current || !mountedRef.current) return;\n const video = videoRef.current;\n const canvas = canvasRef.current;\n if (!video || !canvas || video.readyState < video.HAVE_ENOUGH_DATA) {\n rafRef.current = requestAnimationFrame(scanFrame);\n return;\n }\n\n const now = Date.now();\n if (now - lastScanRef.current < scanDelay) {\n rafRef.current = requestAnimationFrame(scanFrame);\n return;\n }\n lastScanRef.current = now;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n rafRef.current = requestAnimationFrame(scanFrame);\n return;\n }\n\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n ctx.drawImage(video, 0, 0);\n\n try {\n const jsqr = await getJsqr();\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const code = jsqr(imageData.data, imageData.width, imageData.height);\n\n if (code) {\n onResultRef.current(code.data);\n if (!continuous) {\n scanningRef.current = false;\n setScanning(false);\n stopCamera();\n return;\n }\n }\n } catch {\n // Frame processing error, continue scanning\n }\n\n if (mountedRef.current) {\n rafRef.current = requestAnimationFrame(scanFrame);\n }\n }, [scanDelay, continuous, stopCamera]);\n\n /**\n * Starts the camera: requests a `MediaStream`, attaches it to the video\n * element, waits for playback to settle, then begins the scan loop.\n *\n * Steps:\n * 1. Guard: skip if unmounted or `getUserMedia` is unavailable.\n * 2. Call `getUserMedia` with the configured `facingMode` and\n * `constraints`.\n * 3. Guard: if unmounted during the await, stop the freshly-acquired\n * stream and bail.\n * 4. Assign the stream to `streamRef.current` and the video element.\n * 5. Save the `play()` promise to `playPromiseRef` so it can be awaited\n * by `stopCamera` / cleanup.\n * 6. Guard: if unmounted after play settles, call `stopCamera()` and\n * bail.\n * 7. Mark scanning as active and schedule the first `scanFrame`.\n *\n * The `onStart` callback (via ref) is fired once scanning begins.\n *\n * `getUserMedia` availability is checked upfront because it only exists\n * in secure contexts (HTTPS or localhost). Without the check the call\n * would throw a confusing `TypeError` instead of a user-friendly message.\n */\n const startCamera = useCallback(async () => {\n if (!mountedRef.current) return;\n\n if (!navigator.mediaDevices?.getUserMedia) {\n setStatus(\"no-camera\");\n setError(\"Camera API not available in this context\");\n onErrorRef.current?.(new Error(\"getUserMedia is not available\"));\n return;\n }\n\n setStatus(\"starting\");\n setError(null);\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: {\n facingMode,\n ...constraints,\n },\n });\n\n if (!mountedRef.current) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n\n streamRef.current = stream;\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n playPromiseRef.current = videoRef.current.play();\n await playPromiseRef.current;\n playPromiseRef.current = null;\n }\n\n if (!mountedRef.current) {\n stopCamera();\n return;\n }\n\n scanningRef.current = true;\n setScanning(true);\n setStatus(\"scanning\");\n onStartRef.current?.();\n rafRef.current = requestAnimationFrame(scanFrame);\n } catch (err) {\n if (!mountedRef.current) return;\n if (err instanceof DOMException && err.name === \"AbortError\") return;\n\n const isNoCamera =\n err instanceof DOMException &&\n (err.name === \"NotFoundError\" ||\n err.name === \"NotAllowedError\" ||\n err.name === \"NotReadableError\");\n\n setStatus(isNoCamera ? \"no-camera\" : \"error\");\n setError(err instanceof Error ? err.message : String(err));\n onErrorRef.current?.(err);\n }\n }, [facingMode, constraints, scanFrame, stopCamera]);\n\n /**\n * Main lifecycle effect: starts the camera on mount (if `autoStart` is\n * true), and stops it on unmount.\n *\n * Captures `videoRef.current` at effect time to satisfy React's ref-stability\n * lint rule. The cleanup follows the same race-condition-safe pattern as\n * `stopCamera`: captures `streamRef.current` into `streamToStop` and guards\n * the `doCleanup` callback with `video.srcObject === streamToStop`.\n */\n useEffect(() => {\n const video = videoRef.current;\n if (autoStart) {\n startCamera();\n }\n return () => {\n scanningRef.current = false;\n cancelAnimationFrame(rafRef.current);\n\n const streamToStop = streamRef.current;\n\n const doCleanup = () => {\n if (video && video.srcObject === streamToStop) {\n video.pause();\n video.srcObject = null;\n }\n if (streamToStop) {\n streamToStop.getTracks().forEach((track) => track.stop());\n }\n };\n\n if (playPromiseRef.current) {\n playPromiseRef.current.then(doCleanup, doCleanup);\n playPromiseRef.current = null;\n } else {\n doCleanup();\n }\n };\n }, [autoStart, startCamera]);\n\n // ---- Imperative handle ----\n\n /**\n * Exposes `start`, `stop`, `scanImage`, and `isScanning` to the parent\n * via the `ref` prop.\n *\n * `scanImage` decodes a QR code from a static image file without involving\n * the camera. It renders the file to an off-screen canvas via\n * `createImageBitmap` + `ctx.drawImage`, then runs jsQR on the pixel data.\n *\n * The `ImageBitmap` is always closed in the `finally` block to prevent\n * memory leaks (an `ImageBitmap` holds a reference to the underlying\n * `ArrayBuffer` until explicitly closed).\n */\n useImperativeHandle(\n ref,\n () => ({\n start: startCamera,\n stop: stopCamera,\n scanImage: async (file: File): Promise<string | null> => {\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(file);\n const tempCanvas = document.createElement(\"canvas\");\n tempCanvas.width = bitmap.width;\n tempCanvas.height = bitmap.height;\n const ctx = tempCanvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.drawImage(bitmap, 0, 0);\n const imageData = ctx.getImageData(\n 0,\n 0,\n tempCanvas.width,\n tempCanvas.height,\n );\n const jsqr = await getJsqr();\n const code = jsqr(imageData.data, imageData.width, imageData.height);\n return code?.data ?? null;\n } catch {\n return null;\n } finally {\n bitmap?.close();\n }\n },\n isScanning: scanning,\n }),\n [startCamera, stopCamera, scanning],\n );\n\n // ---- Status renderer ----\n\n /**\n * Returns a status `<span>` based on the current `status` value, or `null`\n * when no status overlay is needed (i.e. the camera is working and the\n * video feed is visible).\n *\n * The status text is customisable via the `loadingText`, `noCameraText`,\n * and `fallbackText` props. Error messages come from the `error` state,\n * which is set to `err.message` from the caught exception.\n */\n const renderStatus = () => {\n if (status === \"starting\") {\n return <span className={qrScannerStatusVariants()}>{loadingText}</span>;\n }\n if (status === \"error\" && error) {\n return <span className={qrScannerStatusVariants()}>{error}</span>;\n }\n if (status === \"no-camera\") {\n return <span className={qrScannerStatusVariants()}>{noCameraText}</span>;\n }\n return null;\n };\n\n // ---- Render branches ----\n\n /**\n * Fallback UI shown when the camera is unavailable or an error occurred.\n *\n * The outer `<div>` still carries the same `data-slot` and variant classes\n * as the normal UI so that layout consistency is maintained.\n */\n if (status === \"no-camera\" || status === \"error\") {\n return (\n <div\n data-slot=\"qr-scanner\"\n className={cn(qrScannerVariants({ appearance }), className)}\n {...rest}\n >\n <div className={qrScannerFallbackVariants()}>\n {fallbackText}\n {renderStatus()}\n </div>\n </div>\n );\n }\n\n /**\n * Normal UI: video feed with a viewfinder overlay and optional status text.\n *\n * Nested structure:\n * <div data-slot=\"qr-scanner\"> ← root (className, appearance, ...rest)\n * <video /> ← camera feed (playsInline, muted, autoPlay)\n * <canvas className=\"hidden\" /> ← off-screen canvas for frame capture\n * <div> ← overlay container\n * <div /> ← viewfinder corners\n * </div>\n * {renderStatus()} ← \"Starting camera...\" overlay text\n * </div>\n */\n return (\n <div\n data-slot=\"qr-scanner\"\n className={cn(qrScannerVariants({ appearance }), className)}\n {...rest}\n >\n <video\n ref={videoRef}\n data-slot=\"qr-scanner-video\"\n className={qrScannerVideoVariants()}\n playsInline\n muted\n autoPlay\n />\n <canvas\n ref={canvasRef}\n className=\"hidden\"\n data-slot=\"qr-scanner-canvas\"\n />\n <div className={qrScannerOverlayVariants()}>\n <div className={qrScannerViewfinderVariants()} />\n </div>\n {renderStatus()}\n </div>\n );\n}\n\nQrScannerBase.displayName = \"QrScanner\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secret-reveal-animated.d.ts","sourceRoot":"","sources":["../../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAQzD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,iBAAyB,EACzB,kBAAkB,EAClB,SAAkB,EAClB,QAAc,EACd,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,yBAAyB,2CAmG3B;yBAjHe,oBAAoB"}
1
+ {"version":3,"file":"secret-reveal-animated.d.ts","sourceRoot":"","sources":["../../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAQzD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,iBAAyB,EACzB,kBAAkB,EAClB,SAAkB,EAClB,QAAc,EACd,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,yBAAyB,2CAsG3B;yBApHe,oBAAoB"}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkPQ2XTY3M_js = require('../../chunk-PQ2XTY3M.js');
5
- require('../../chunk-H3BJOK22.js');
4
+ var chunkG36ZV446_js = require('../../chunk-G36ZV446.js');
5
+ require('../../chunk-HNAUUCR5.js');
6
6
  var chunkZS5756ZC_js = require('../../chunk-ZS5756ZC.js');
7
7
  require('../../chunk-PZ5AY32C.js');
8
8
  var framerMotion = require('framer-motion');
@@ -95,14 +95,14 @@ function SecretRevealAnimated({
95
95
  {
96
96
  ref,
97
97
  "data-slot": "secret-reveal",
98
- className: chunkZS5756ZC_js.cn(chunkPQ2XTY3M_js.secretRevealVariants({ appearance, size }), className),
98
+ className: chunkZS5756ZC_js.cn(chunkG36ZV446_js.secretRevealVariants({ appearance, size }), className),
99
99
  ...rest,
100
100
  children: [
101
101
  label && labelPosition === "top" && /* @__PURE__ */ jsxRuntime.jsx(
102
102
  "span",
103
103
  {
104
104
  "data-slot": "secret-reveal-label",
105
- className: chunkPQ2XTY3M_js.secretRevealLabelVariants({ size }),
105
+ className: chunkG36ZV446_js.secretRevealLabelVariants({ size }),
106
106
  children: label
107
107
  }
108
108
  ),
@@ -111,7 +111,7 @@ function SecretRevealAnimated({
111
111
  "span",
112
112
  {
113
113
  "data-slot": "secret-reveal-label",
114
- className: chunkPQ2XTY3M_js.secretRevealLabelVariants({ size }),
114
+ className: chunkG36ZV446_js.secretRevealLabelVariants({ size }),
115
115
  children: label
116
116
  }
117
117
  ),
@@ -119,7 +119,10 @@ function SecretRevealAnimated({
119
119
  "span",
120
120
  {
121
121
  "data-slot": "secret-reveal-value",
122
- className: chunkZS5756ZC_js.cn(chunkPQ2XTY3M_js.secretRevealValueVariants({ size }), "flex-1 truncate"),
122
+ className: chunkZS5756ZC_js.cn(
123
+ chunkG36ZV446_js.secretRevealValueVariants({ size }),
124
+ "flex-1 min-w-0 truncate"
125
+ ),
123
126
  children: /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
124
127
  framerMotion.motion.span,
125
128
  {
@@ -140,7 +143,7 @@ function SecretRevealAnimated({
140
143
  {
141
144
  type: "button",
142
145
  "data-slot": "secret-reveal-toggle",
143
- className: chunkPQ2XTY3M_js.secretRevealToggleVariants({ size, appearance }),
146
+ className: chunkG36ZV446_js.secretRevealToggleVariants({ size, appearance }),
144
147
  onClick: toggle,
145
148
  "aria-label": revealed ? "Hide secret" : "Reveal secret",
146
149
  children: revealed ? /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/secret-reveal/animated/animations.ts","../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":["useState","useCallback","jsxs","cn","secretRevealVariants","jsx","secretRevealLabelVariants","secretRevealValueVariants","AnimatePresence","motion","secretRevealToggleVariants"],"mappings":"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","file":"animated.js","sourcesContent":["import type { Transition, Variants } from \"framer-motion\";\n\nexport type SecretRevealAnimation =\n | \"none\"\n | \"fade\"\n | \"slide-up\"\n | \"scale\"\n | \"flip\";\n\nexport type SecretRevealAnimationPresets = Record<\n SecretRevealAnimation,\n {\n transition: Transition;\n variants: Variants;\n }\n>;\n\nexport const secretRevealAnimationPresets: SecretRevealAnimationPresets = {\n none: {\n transition: { duration: 0 },\n variants: {\n initial: { opacity: 1 },\n animate: { opacity: 1 },\n exit: { opacity: 1 },\n },\n },\n fade: {\n transition: { duration: 0.25, ease: \"easeInOut\" },\n variants: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n },\n \"slide-up\": {\n transition: {\n type: \"spring\",\n stiffness: 300,\n damping: 25,\n mass: 0.5,\n },\n variants: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -8 },\n },\n },\n scale: {\n transition: {\n type: \"spring\",\n stiffness: 400,\n damping: 20,\n mass: 0.4,\n },\n variants: {\n initial: { opacity: 0, scale: 0.9 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.9 },\n },\n },\n flip: {\n transition: {\n type: \"spring\",\n stiffness: 200,\n damping: 18,\n mass: 0.6,\n },\n variants: {\n initial: { opacity: 0, rotateX: 90 },\n animate: { opacity: 1, rotateX: 0 },\n exit: { opacity: 0, rotateX: -90 },\n },\n },\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nimport { secretRevealAnimationPresets } from \"./animations\";\nimport type { SecretRevealAnimatedProps } from \"./types\";\nimport {\n secretRevealLabelVariants,\n secretRevealToggleVariants,\n secretRevealValueVariants,\n secretRevealVariants,\n} from \"../variants\";\n\nexport function SecretRevealAnimated({\n appearance,\n size,\n value,\n children,\n label,\n labelPosition = \"top\",\n initiallyRevealed = false,\n onVisibilityChange,\n animation = \"fade\",\n muteChar = \"•\",\n className,\n ref,\n ...rest\n}: SecretRevealAnimatedProps) {\n const [revealed, setRevealed] = useState(initiallyRevealed);\n\n const toggle = useCallback(() => {\n const next = !revealed;\n setRevealed(next);\n onVisibilityChange?.(next);\n }, [onVisibilityChange, revealed]);\n\n const preset = secretRevealAnimationPresets[animation];\n const displayText = value ?? (typeof children === \"string\" ? children : \"\");\n\n return (\n <div\n ref={ref}\n data-slot=\"secret-reveal\"\n className={cn(secretRevealVariants({ appearance, size }), className)}\n {...rest}\n >\n {label && labelPosition === \"top\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {label && labelPosition === \"side\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span\n data-slot=\"secret-reveal-value\"\n className={cn(secretRevealValueVariants({ size }), \"flex-1 truncate\")}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={revealed ? \"revealed\" : \"hidden\"}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={preset.variants}\n transition={preset.transition}\n className=\"inline-block\"\n >\n {revealed\n ? (value ?? children)\n : muteChar.repeat(displayText.length || 8)}\n </motion.span>\n </AnimatePresence>\n </span>\n <button\n type=\"button\"\n data-slot=\"secret-reveal-toggle\"\n className={secretRevealToggleVariants({ size, appearance })}\n onClick={toggle}\n aria-label={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </span>\n </div>\n );\n}\n\nSecretRevealAnimated.displayName = \"SecretRevealAnimated\";\n"]}
1
+ {"version":3,"sources":["../../../src/ui/secret-reveal/animated/animations.ts","../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":["useState","useCallback","jsxs","cn","secretRevealVariants","jsx","secretRevealLabelVariants","secretRevealValueVariants","AnimatePresence","motion","secretRevealToggleVariants"],"mappings":";;;;;;;;;;;AAiBO,IAAM,4BAAA,GAA6D;AAAA,EACxE,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,EAAE,QAAA,EAAU,CAAA,EAAE;AAAA,IAC1B,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAAE;AACrB,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,WAAA,EAAY;AAAA,IAChD,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,MACtB,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA;AAAE;AACrB,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,OAAA,EAAS,EAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MAC5B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA;AAAG;AAC5B,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,OAAA,EAAS,EAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,MAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,MAChC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA;AAAI;AACjC,GACF;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,OAAA,EAAS,EAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,EAAA,EAAG;AAAA,MACnC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,MAClC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,GAAA;AAAI;AACnC;AAEJ;ACzDO,SAAS,oBAAA,CAAqB;AAAA,EACnC,UAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,iBAAA,GAAoB,KAAA;AAAA,EACpB,kBAAA;AAAA,EACA,SAAA,GAAY,MAAA;AAAA,EACZ,QAAA,GAAW,QAAA;AAAA,EACX,SAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,iBAAiB,CAAA;AAE1D,EAAA,MAAM,MAAA,GAASC,kBAAY,MAAM;AAC/B,IAAA,MAAM,OAAO,CAAC,QAAA;AACd,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,kBAAA,GAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAAS,6BAA6B,SAAS,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,KAAA,KAAU,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,EAAA,CAAA;AAExE,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAWC,oBAAGC,qCAAA,CAAqB,EAAE,YAAY,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,MAClE,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,KAAA,IAAS,kBAAkB,KAAA,oBAC1BC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,qBAAA;AAAA,YACV,SAAA,EAAWC,0CAAA,CAA0B,EAAE,IAAA,EAAM,CAAA;AAAA,YAE5C,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAEFJ,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,IAAS,kBAAkB,MAAA,oBAC1BG,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,qBAAA;AAAA,cACV,SAAA,EAAWC,0CAAA,CAA0B,EAAE,IAAA,EAAM,CAAA;AAAA,cAE5C,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BAEFD,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAU,qBAAA;AAAA,cACV,SAAA,EAAWF,mBAAA;AAAA,gBACTI,0CAAA,CAA0B,EAAE,IAAA,EAAM,CAAA;AAAA,gBAClC;AAAA,eACF;AAAA,cAEA,QAAA,kBAAAF,cAAA,CAACG,4BAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EACpB,QAAA,kBAAAH,cAAA;AAAA,gBAACI,mBAAA,CAAO,IAAA;AAAA,gBAAP;AAAA,kBAEC,OAAA,EAAQ,SAAA;AAAA,kBACR,OAAA,EAAQ,SAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBACL,UAAU,MAAA,CAAO,QAAA;AAAA,kBACjB,YAAY,MAAA,CAAO,UAAA;AAAA,kBACnB,SAAA,EAAU,cAAA;AAAA,kBAET,qBACI,KAAA,IAAS,QAAA,GACV,SAAS,MAAA,CAAO,WAAA,CAAY,UAAU,CAAC;AAAA,iBAAA;AAAA,gBAVtC,WAAW,UAAA,GAAa;AAAA,eAW/B,EACF;AAAA;AAAA,WACF;AAAA,0BACAJ,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,WAAA,EAAU,sBAAA;AAAA,cACV,SAAA,EAAWK,2CAAA,CAA2B,EAAE,IAAA,EAAM,YAAY,CAAA;AAAA,cAC1D,OAAA,EAAS,MAAA;AAAA,cACT,YAAA,EAAY,WAAW,aAAA,GAAgB,eAAA;AAAA,cAEtC,QAAA,EAAA,QAAA,mBACCR,eAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,4BAAA;AAAA,kBACN,KAAA,EAAM,IAAA;AAAA,kBACN,MAAA,EAAO,IAAA;AAAA,kBACP,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,GAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe,OAAA;AAAA,kBAEf,QAAA,EAAA;AAAA,oCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,iFAAA,EAAkF,CAAA;AAAA,oCAC1FA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wEAAA,EAAyE,CAAA;AAAA,oCACjFA,cAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AAAA,eACtC,mBAEAH,eAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,4BAAA;AAAA,kBACN,KAAA,EAAM,IAAA;AAAA,kBACN,MAAA,EAAO,IAAA;AAAA,kBACP,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,GAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe,OAAA;AAAA,kBAEf,QAAA,EAAA;AAAA,oCAAAG,cAAA,CAAC,MAAA,EAAA,EAAK,GAAE,8CAAA,EAA+C,CAAA;AAAA,mDACtD,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA;AAAA;AAAA;AAChC;AAAA;AAEJ,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,oBAAA,CAAqB,WAAA,GAAc,sBAAA","file":"animated.js","sourcesContent":["import type { Transition, Variants } from \"framer-motion\";\n\nexport type SecretRevealAnimation =\n | \"none\"\n | \"fade\"\n | \"slide-up\"\n | \"scale\"\n | \"flip\";\n\nexport type SecretRevealAnimationPresets = Record<\n SecretRevealAnimation,\n {\n transition: Transition;\n variants: Variants;\n }\n>;\n\nexport const secretRevealAnimationPresets: SecretRevealAnimationPresets = {\n none: {\n transition: { duration: 0 },\n variants: {\n initial: { opacity: 1 },\n animate: { opacity: 1 },\n exit: { opacity: 1 },\n },\n },\n fade: {\n transition: { duration: 0.25, ease: \"easeInOut\" },\n variants: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n },\n \"slide-up\": {\n transition: {\n type: \"spring\",\n stiffness: 300,\n damping: 25,\n mass: 0.5,\n },\n variants: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -8 },\n },\n },\n scale: {\n transition: {\n type: \"spring\",\n stiffness: 400,\n damping: 20,\n mass: 0.4,\n },\n variants: {\n initial: { opacity: 0, scale: 0.9 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.9 },\n },\n },\n flip: {\n transition: {\n type: \"spring\",\n stiffness: 200,\n damping: 18,\n mass: 0.6,\n },\n variants: {\n initial: { opacity: 0, rotateX: 90 },\n animate: { opacity: 1, rotateX: 0 },\n exit: { opacity: 0, rotateX: -90 },\n },\n },\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nimport { secretRevealAnimationPresets } from \"./animations\";\nimport type { SecretRevealAnimatedProps } from \"./types\";\nimport {\n secretRevealLabelVariants,\n secretRevealToggleVariants,\n secretRevealValueVariants,\n secretRevealVariants,\n} from \"../variants\";\n\nexport function SecretRevealAnimated({\n appearance,\n size,\n value,\n children,\n label,\n labelPosition = \"top\",\n initiallyRevealed = false,\n onVisibilityChange,\n animation = \"fade\",\n muteChar = \"•\",\n className,\n ref,\n ...rest\n}: SecretRevealAnimatedProps) {\n const [revealed, setRevealed] = useState(initiallyRevealed);\n\n const toggle = useCallback(() => {\n const next = !revealed;\n setRevealed(next);\n onVisibilityChange?.(next);\n }, [onVisibilityChange, revealed]);\n\n const preset = secretRevealAnimationPresets[animation];\n const displayText = value ?? (typeof children === \"string\" ? children : \"\");\n\n return (\n <div\n ref={ref}\n data-slot=\"secret-reveal\"\n className={cn(secretRevealVariants({ appearance, size }), className)}\n {...rest}\n >\n {label && labelPosition === \"top\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {label && labelPosition === \"side\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span\n data-slot=\"secret-reveal-value\"\n className={cn(\n secretRevealValueVariants({ size }),\n \"flex-1 min-w-0 truncate\",\n )}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={revealed ? \"revealed\" : \"hidden\"}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={preset.variants}\n transition={preset.transition}\n className=\"inline-block\"\n >\n {revealed\n ? (value ?? children)\n : muteChar.repeat(displayText.length || 8)}\n </motion.span>\n </AnimatePresence>\n </span>\n <button\n type=\"button\"\n data-slot=\"secret-reveal-toggle\"\n className={secretRevealToggleVariants({ size, appearance })}\n onClick={toggle}\n aria-label={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </span>\n </div>\n );\n}\n\nSecretRevealAnimated.displayName = \"SecretRevealAnimated\";\n"]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { secretRevealLabelVariants, secretRevealValueVariants, secretRevealToggleVariants, secretRevealVariants } from '../../chunk-ATE5SCTR.mjs';
3
- import '../../chunk-DIAA5VH4.mjs';
2
+ import { secretRevealLabelVariants, secretRevealValueVariants, secretRevealToggleVariants, secretRevealVariants } from '../../chunk-N6Q4ZLQR.mjs';
3
+ import '../../chunk-CIZQQ32L.mjs';
4
4
  import { cn } from '../../chunk-4D54YOL6.mjs';
5
5
  import '../../chunk-J5LGTIGS.mjs';
6
6
  import { AnimatePresence, motion } from 'framer-motion';
@@ -117,7 +117,10 @@ function SecretRevealAnimated({
117
117
  "span",
118
118
  {
119
119
  "data-slot": "secret-reveal-value",
120
- className: cn(secretRevealValueVariants({ size }), "flex-1 truncate"),
120
+ className: cn(
121
+ secretRevealValueVariants({ size }),
122
+ "flex-1 min-w-0 truncate"
123
+ ),
121
124
  children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
122
125
  motion.span,
123
126
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/secret-reveal/animated/animations.ts","../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":[],"mappings":"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","file":"animated.mjs","sourcesContent":["import type { Transition, Variants } from \"framer-motion\";\n\nexport type SecretRevealAnimation =\n | \"none\"\n | \"fade\"\n | \"slide-up\"\n | \"scale\"\n | \"flip\";\n\nexport type SecretRevealAnimationPresets = Record<\n SecretRevealAnimation,\n {\n transition: Transition;\n variants: Variants;\n }\n>;\n\nexport const secretRevealAnimationPresets: SecretRevealAnimationPresets = {\n none: {\n transition: { duration: 0 },\n variants: {\n initial: { opacity: 1 },\n animate: { opacity: 1 },\n exit: { opacity: 1 },\n },\n },\n fade: {\n transition: { duration: 0.25, ease: \"easeInOut\" },\n variants: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n },\n \"slide-up\": {\n transition: {\n type: \"spring\",\n stiffness: 300,\n damping: 25,\n mass: 0.5,\n },\n variants: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -8 },\n },\n },\n scale: {\n transition: {\n type: \"spring\",\n stiffness: 400,\n damping: 20,\n mass: 0.4,\n },\n variants: {\n initial: { opacity: 0, scale: 0.9 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.9 },\n },\n },\n flip: {\n transition: {\n type: \"spring\",\n stiffness: 200,\n damping: 18,\n mass: 0.6,\n },\n variants: {\n initial: { opacity: 0, rotateX: 90 },\n animate: { opacity: 1, rotateX: 0 },\n exit: { opacity: 0, rotateX: -90 },\n },\n },\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nimport { secretRevealAnimationPresets } from \"./animations\";\nimport type { SecretRevealAnimatedProps } from \"./types\";\nimport {\n secretRevealLabelVariants,\n secretRevealToggleVariants,\n secretRevealValueVariants,\n secretRevealVariants,\n} from \"../variants\";\n\nexport function SecretRevealAnimated({\n appearance,\n size,\n value,\n children,\n label,\n labelPosition = \"top\",\n initiallyRevealed = false,\n onVisibilityChange,\n animation = \"fade\",\n muteChar = \"•\",\n className,\n ref,\n ...rest\n}: SecretRevealAnimatedProps) {\n const [revealed, setRevealed] = useState(initiallyRevealed);\n\n const toggle = useCallback(() => {\n const next = !revealed;\n setRevealed(next);\n onVisibilityChange?.(next);\n }, [onVisibilityChange, revealed]);\n\n const preset = secretRevealAnimationPresets[animation];\n const displayText = value ?? (typeof children === \"string\" ? children : \"\");\n\n return (\n <div\n ref={ref}\n data-slot=\"secret-reveal\"\n className={cn(secretRevealVariants({ appearance, size }), className)}\n {...rest}\n >\n {label && labelPosition === \"top\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {label && labelPosition === \"side\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span\n data-slot=\"secret-reveal-value\"\n className={cn(secretRevealValueVariants({ size }), \"flex-1 truncate\")}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={revealed ? \"revealed\" : \"hidden\"}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={preset.variants}\n transition={preset.transition}\n className=\"inline-block\"\n >\n {revealed\n ? (value ?? children)\n : muteChar.repeat(displayText.length || 8)}\n </motion.span>\n </AnimatePresence>\n </span>\n <button\n type=\"button\"\n data-slot=\"secret-reveal-toggle\"\n className={secretRevealToggleVariants({ size, appearance })}\n onClick={toggle}\n aria-label={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </span>\n </div>\n );\n}\n\nSecretRevealAnimated.displayName = \"SecretRevealAnimated\";\n"]}
1
+ {"version":3,"sources":["../../../src/ui/secret-reveal/animated/animations.ts","../../../src/ui/secret-reveal/animated/secret-reveal-animated.tsx"],"names":[],"mappings":"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","file":"animated.mjs","sourcesContent":["import type { Transition, Variants } from \"framer-motion\";\n\nexport type SecretRevealAnimation =\n | \"none\"\n | \"fade\"\n | \"slide-up\"\n | \"scale\"\n | \"flip\";\n\nexport type SecretRevealAnimationPresets = Record<\n SecretRevealAnimation,\n {\n transition: Transition;\n variants: Variants;\n }\n>;\n\nexport const secretRevealAnimationPresets: SecretRevealAnimationPresets = {\n none: {\n transition: { duration: 0 },\n variants: {\n initial: { opacity: 1 },\n animate: { opacity: 1 },\n exit: { opacity: 1 },\n },\n },\n fade: {\n transition: { duration: 0.25, ease: \"easeInOut\" },\n variants: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n },\n },\n \"slide-up\": {\n transition: {\n type: \"spring\",\n stiffness: 300,\n damping: 25,\n mass: 0.5,\n },\n variants: {\n initial: { opacity: 0, y: 8 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -8 },\n },\n },\n scale: {\n transition: {\n type: \"spring\",\n stiffness: 400,\n damping: 20,\n mass: 0.4,\n },\n variants: {\n initial: { opacity: 0, scale: 0.9 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.9 },\n },\n },\n flip: {\n transition: {\n type: \"spring\",\n stiffness: 200,\n damping: 18,\n mass: 0.6,\n },\n variants: {\n initial: { opacity: 0, rotateX: 90 },\n animate: { opacity: 1, rotateX: 0 },\n exit: { opacity: 0, rotateX: -90 },\n },\n },\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { useCallback, useState } from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\n\nimport { secretRevealAnimationPresets } from \"./animations\";\nimport type { SecretRevealAnimatedProps } from \"./types\";\nimport {\n secretRevealLabelVariants,\n secretRevealToggleVariants,\n secretRevealValueVariants,\n secretRevealVariants,\n} from \"../variants\";\n\nexport function SecretRevealAnimated({\n appearance,\n size,\n value,\n children,\n label,\n labelPosition = \"top\",\n initiallyRevealed = false,\n onVisibilityChange,\n animation = \"fade\",\n muteChar = \"•\",\n className,\n ref,\n ...rest\n}: SecretRevealAnimatedProps) {\n const [revealed, setRevealed] = useState(initiallyRevealed);\n\n const toggle = useCallback(() => {\n const next = !revealed;\n setRevealed(next);\n onVisibilityChange?.(next);\n }, [onVisibilityChange, revealed]);\n\n const preset = secretRevealAnimationPresets[animation];\n const displayText = value ?? (typeof children === \"string\" ? children : \"\");\n\n return (\n <div\n ref={ref}\n data-slot=\"secret-reveal\"\n className={cn(secretRevealVariants({ appearance, size }), className)}\n {...rest}\n >\n {label && labelPosition === \"top\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span className=\"flex items-center gap-2 flex-1 min-w-0\">\n {label && labelPosition === \"side\" && (\n <span\n data-slot=\"secret-reveal-label\"\n className={secretRevealLabelVariants({ size })}\n >\n {label}\n </span>\n )}\n <span\n data-slot=\"secret-reveal-value\"\n className={cn(\n secretRevealValueVariants({ size }),\n \"flex-1 min-w-0 truncate\",\n )}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={revealed ? \"revealed\" : \"hidden\"}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={preset.variants}\n transition={preset.transition}\n className=\"inline-block\"\n >\n {revealed\n ? (value ?? children)\n : muteChar.repeat(displayText.length || 8)}\n </motion.span>\n </AnimatePresence>\n </span>\n <button\n type=\"button\"\n data-slot=\"secret-reveal-toggle\"\n className={secretRevealToggleVariants({ size, appearance })}\n onClick={toggle}\n aria-label={revealed ? \"Hide secret\" : \"Reveal secret\"}\n >\n {revealed ? (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </button>\n </span>\n </div>\n );\n}\n\nSecretRevealAnimated.displayName = \"SecretRevealAnimated\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secret-reveal-base.d.ts","sourceRoot":"","sources":["../../../src/ui/secret-reveal/secret-reveal-base.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAQrD,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,iBAAyB,EACzB,kBAAkB,EAClB,QAAc,EACd,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,qBAAqB,2CAsFvB;yBAnGe,gBAAgB"}
1
+ {"version":3,"file":"secret-reveal-base.d.ts","sourceRoot":"","sources":["../../../src/ui/secret-reveal/secret-reveal-base.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAQrD,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAqB,EACrB,iBAAyB,EACzB,kBAAkB,EAClB,QAAc,EACd,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,qBAAqB,2CAyFvB;yBAtGe,gBAAgB"}