@alkimi.org/ui-kit 0.1.13 → 0.1.15

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 (76) hide show
  1. package/README.github.md +166 -100
  2. package/README.md +182 -97
  3. package/README.npm.md +182 -97
  4. package/dist/HelveticaNowDisplay-Medium-CXVMKHU3.ttf +0 -0
  5. package/dist/HelveticaNowDisplay-Regular-O4IVE4NP.ttf +0 -0
  6. package/dist/chunk-2XHWLYXD.mjs +3 -0
  7. package/dist/chunk-2XHWLYXD.mjs.map +1 -0
  8. package/dist/chunk-74PDRKS7.js +3 -0
  9. package/dist/chunk-74PDRKS7.js.map +1 -0
  10. package/dist/chunk-BCAQUOTY.mjs +3 -0
  11. package/dist/chunk-BCAQUOTY.mjs.map +1 -0
  12. package/dist/chunk-FUYXCJOQ.js +3 -0
  13. package/dist/chunk-FUYXCJOQ.js.map +1 -0
  14. package/dist/chunk-IK3C7KV5.mjs +3 -0
  15. package/dist/chunk-IK3C7KV5.mjs.map +1 -0
  16. package/dist/chunk-JNEIOQGF.js +3 -0
  17. package/dist/chunk-JNEIOQGF.js.map +1 -0
  18. package/dist/chunk-R74QDO2Z.js +3 -0
  19. package/dist/chunk-R74QDO2Z.js.map +1 -0
  20. package/dist/chunk-S5TKCF6T.mjs +3 -0
  21. package/dist/chunk-S5TKCF6T.mjs.map +1 -0
  22. package/dist/chunk-SVWC2KRP.js +3 -0
  23. package/dist/chunk-SVWC2KRP.js.map +1 -0
  24. package/dist/chunk-WF73K6X2.mjs +3 -0
  25. package/dist/chunk-WF73K6X2.mjs.map +1 -0
  26. package/dist/chunk-WJXJQZGO.js +3 -0
  27. package/dist/chunk-WJXJQZGO.js.map +1 -0
  28. package/dist/chunk-XNHJPYUV.mjs +3 -0
  29. package/dist/chunk-XNHJPYUV.mjs.map +1 -0
  30. package/dist/components/GlitchLink.js +2 -88
  31. package/dist/components/GlitchLink.js.map +1 -1
  32. package/dist/components/GlitchLink.mjs +1 -57
  33. package/dist/components/GlitchLink.mjs.map +1 -1
  34. package/dist/components/PixelLoad.js +2 -181
  35. package/dist/components/PixelLoad.js.map +1 -1
  36. package/dist/components/PixelLoad.mjs +1 -146
  37. package/dist/components/PixelLoad.mjs.map +1 -1
  38. package/dist/components/TextDecoder.js +2 -284
  39. package/dist/components/TextDecoder.js.map +1 -1
  40. package/dist/components/TextDecoder.mjs +1 -257
  41. package/dist/components/TextDecoder.mjs.map +1 -1
  42. package/dist/components/button.d.mts +1 -1
  43. package/dist/components/button.d.ts +1 -1
  44. package/dist/components/button.js +2 -108
  45. package/dist/components/button.js.map +1 -1
  46. package/dist/components/button.mjs +2 -73
  47. package/dist/components/button.mjs.map +1 -1
  48. package/dist/components/card.js +2 -114
  49. package/dist/components/card.js.map +1 -1
  50. package/dist/components/card.mjs +2 -75
  51. package/dist/components/card.mjs.map +1 -1
  52. package/dist/components/tabs.d.mts +9 -0
  53. package/dist/components/tabs.d.ts +9 -0
  54. package/dist/components/tabs.js +3 -0
  55. package/dist/components/tabs.js.map +1 -0
  56. package/dist/components/tabs.mjs +3 -0
  57. package/dist/components/tabs.mjs.map +1 -0
  58. package/dist/fonts/fonts/HelveticaNowDisplay-Medium.ttf +0 -0
  59. package/dist/fonts/fonts/HelveticaNowDisplay-Regular.ttf +0 -0
  60. package/dist/index.css +2 -807
  61. package/dist/index.css.map +1 -1
  62. package/dist/index.d.mts +6 -9
  63. package/dist/index.d.ts +6 -9
  64. package/dist/index.js +2 -598
  65. package/dist/index.js.map +1 -1
  66. package/dist/index.mjs +2 -563
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/styles.css +2 -807
  69. package/dist/styles.css.map +1 -1
  70. package/package.json +18 -40
  71. package/dist/lib/utils.d.mts +0 -5
  72. package/dist/lib/utils.d.ts +0 -5
  73. package/dist/lib/utils.js +0 -36
  74. package/dist/lib/utils.js.map +0 -1
  75. package/dist/lib/utils.mjs +0 -12
  76. package/dist/lib/utils.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,564 +1,3 @@
1
- "use client"
2
-
3
- // src/components/button.tsx
4
- import * as React from "react";
5
- import { Slot } from "@radix-ui/react-slot";
6
- import { cva } from "class-variance-authority";
7
-
8
- // src/lib/utils.ts
9
- import { clsx } from "clsx";
10
- import { twMerge } from "tailwind-merge";
11
- function cn(...inputs) {
12
- return twMerge(clsx(inputs));
13
- }
14
-
15
- // src/components/button.tsx
16
- import { jsx, jsxs } from "react/jsx-runtime";
17
- var buttonVariants = cva(
18
- "inline-flex items-center justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
19
- {
20
- variants: {
21
- variant: {
22
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
23
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
24
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
25
- secondary: "bg-secondary/80 text-secondary-foreground hover:bg-secondary",
26
- ghost: "hover:bg-accent hover:text-accent-foreground",
27
- link: "text-primary underline-offset-4 hover:underline"
28
- },
29
- size: {
30
- default: "h-9 px-4 py-2",
31
- sm: "h-8 text-sm px-3 py-2",
32
- lg: "h-10 px-8 py-2",
33
- icon: "h-9 w-9"
34
- }
35
- },
36
- defaultVariants: {
37
- variant: "default",
38
- size: "default"
39
- }
40
- }
41
- );
42
- var Button = React.forwardRef(
43
- ({
44
- className,
45
- variant,
46
- size,
47
- asChild = false,
48
- loading = false,
49
- icon,
50
- ...props
51
- }, ref) => {
52
- const Comp = asChild ? Slot : "button";
53
- return /* @__PURE__ */ jsxs(
54
- Comp,
55
- {
56
- className: cn(buttonVariants({ variant, size, className })),
57
- ref,
58
- disabled: loading || props.disabled,
59
- ...props,
60
- children: [
61
- loading && /* @__PURE__ */ jsx("div", { className: "mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent" }),
62
- !loading && icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: icon }),
63
- props.children
64
- ]
65
- }
66
- );
67
- }
68
- );
69
- Button.displayName = "Button";
70
-
71
- // src/components/tabs.tsx
72
- import * as React2 from "react";
73
- import * as TabsPrimitive from "@radix-ui/react-tabs";
74
- import { jsx as jsx2 } from "react/jsx-runtime";
75
- var Tabs = TabsPrimitive.Root;
76
- var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
77
- TabsPrimitive.List,
78
- {
79
- ref,
80
- className: cn(
81
- "inline-flex items-center justify-center rounded-3xl bg-muted p-1 text-muted-foreground",
82
- className
83
- ),
84
- ...props
85
- }
86
- ));
87
- TabsList.displayName = TabsPrimitive.List.displayName;
88
- var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
89
- TabsPrimitive.Trigger,
90
- {
91
- ref,
92
- className: cn(
93
- "inline-flex items-center justify-center whitespace-nowrap rounded-3xl px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
94
- className
95
- ),
96
- ...props
97
- }
98
- ));
99
- TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
100
- var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
101
- TabsPrimitive.Content,
102
- {
103
- ref,
104
- className: cn(
105
- "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
106
- className
107
- ),
108
- ...props
109
- }
110
- ));
111
- TabsContent.displayName = TabsPrimitive.Content.displayName;
112
-
113
- // src/components/TextDecoder.tsx
114
- import React3, {
115
- useState,
116
- useEffect,
117
- useMemo,
118
- useRef,
119
- Suspense
120
- } from "react";
121
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
122
- var SYMBOLS = ["\\", "-", "?", "/", "#", "!", "_", "+", "<", ">"];
123
- var MAX_ITERATIONS = 3;
124
- var SPEED = 400;
125
- var scrambleText = (input) => {
126
- if (!input) return "";
127
- return input.split(" ").map((word) => {
128
- if (!word) return "";
129
- const randomSymbol = SYMBOLS[Math.floor(Math.random() * SYMBOLS.length)];
130
- return randomSymbol.repeat(word.length);
131
- }).join(" ");
132
- };
133
- var extractText = (node) => {
134
- if (typeof node === "string" || typeof node === "number") {
135
- return String(node);
136
- }
137
- if (Array.isArray(node)) {
138
- return node.map(extractText).join("");
139
- }
140
- if (React3.isValidElement(node)) {
141
- const props = node.props;
142
- let result = "";
143
- if (typeof props.text === "string") {
144
- result += props.text;
145
- }
146
- if (typeof props.label === "string") {
147
- result += props.label;
148
- }
149
- if (typeof props.title === "string") {
150
- result += props.title;
151
- }
152
- if (props.children) {
153
- result += extractText(props.children);
154
- }
155
- return result;
156
- }
157
- return "";
158
- };
159
- var scrambleReactNode = (node, scrambledText, textStartIndex) => {
160
- if (typeof node === "string" || typeof node === "number") {
161
- const text = String(node);
162
- let scrambled = "";
163
- for (let i = 0; i < text.length; i++) {
164
- if (textStartIndex.current < scrambledText.length) {
165
- scrambled += scrambledText[textStartIndex.current];
166
- textStartIndex.current++;
167
- } else {
168
- scrambled += text[i];
169
- }
170
- }
171
- return scrambled;
172
- }
173
- if (Array.isArray(node)) {
174
- return node.map((child, index) => {
175
- const scrambledChild = scrambleReactNode(
176
- child,
177
- scrambledText,
178
- textStartIndex
179
- );
180
- if (React3.isValidElement(scrambledChild)) {
181
- const originalKey = React3.isValidElement(child) ? child.key : null;
182
- if (scrambledChild.key == null && originalKey == null) {
183
- return React3.cloneElement(scrambledChild, { key: `decoded-${index}` });
184
- }
185
- if (scrambledChild.key == null && originalKey != null) {
186
- return React3.cloneElement(scrambledChild, { key: originalKey });
187
- }
188
- }
189
- return scrambledChild;
190
- });
191
- }
192
- if (React3.isValidElement(node)) {
193
- const props = node.props;
194
- const newProps = { ...props };
195
- if (typeof props.text === "string") {
196
- const text = props.text;
197
- let scrambled = "";
198
- for (let i = 0; i < text.length; i++) {
199
- if (textStartIndex.current < scrambledText.length) {
200
- scrambled += scrambledText[textStartIndex.current];
201
- textStartIndex.current++;
202
- } else {
203
- scrambled += text[i];
204
- }
205
- }
206
- newProps.text = scrambled;
207
- }
208
- if (typeof props.label === "string") {
209
- const label = props.label;
210
- let scrambled = "";
211
- for (let i = 0; i < label.length; i++) {
212
- if (textStartIndex.current < scrambledText.length) {
213
- scrambled += scrambledText[textStartIndex.current];
214
- textStartIndex.current++;
215
- } else {
216
- scrambled += label[i];
217
- }
218
- }
219
- newProps.label = scrambled;
220
- }
221
- if (typeof props.title === "string") {
222
- const title = props.title;
223
- let scrambled = "";
224
- for (let i = 0; i < title.length; i++) {
225
- if (textStartIndex.current < scrambledText.length) {
226
- scrambled += scrambledText[textStartIndex.current];
227
- textStartIndex.current++;
228
- } else {
229
- scrambled += title[i];
230
- }
231
- }
232
- newProps.title = scrambled;
233
- }
234
- if (props.children) {
235
- newProps.children = scrambleReactNode(
236
- props.children,
237
- scrambledText,
238
- textStartIndex
239
- );
240
- }
241
- return React3.cloneElement(node, newProps);
242
- }
243
- return node;
244
- };
245
- var TextDecoder = ({ children, className, delay = 0 }) => {
246
- const [displayContent, setDisplayContent] = useState(null);
247
- const [hasAnimated, setHasAnimated] = useState(false);
248
- const [showDecoded, setShowDecoded] = useState(true);
249
- const elementRef = useRef(null);
250
- const fullText = useMemo(() => extractText(children), [children]);
251
- const initialScrambled = useMemo(() => scrambleText(fullText), [fullText]);
252
- useEffect(() => {
253
- if (!hasAnimated && fullText) {
254
- const textStartIndex = { current: 0 };
255
- const scrambledContent = scrambleReactNode(
256
- children,
257
- initialScrambled,
258
- textStartIndex
259
- );
260
- setDisplayContent(scrambledContent);
261
- setShowDecoded(true);
262
- }
263
- }, [children, initialScrambled, hasAnimated, fullText]);
264
- useEffect(() => {
265
- if (!fullText) {
266
- setDisplayContent(null);
267
- setShowDecoded(false);
268
- return;
269
- }
270
- if (hasAnimated) {
271
- setShowDecoded(false);
272
- return;
273
- }
274
- const element = elementRef.current;
275
- if (!element) return;
276
- let iteration = 0;
277
- let intervalId = null;
278
- let delayTimeoutId = null;
279
- const observer = new IntersectionObserver(
280
- (entries) => {
281
- const entry = entries[0];
282
- if (entry.isIntersecting && !hasAnimated) {
283
- delayTimeoutId = setTimeout(() => {
284
- const textStartIndex = { current: 0 };
285
- const scrambledContent = scrambleReactNode(
286
- children,
287
- initialScrambled,
288
- textStartIndex
289
- );
290
- setDisplayContent(scrambledContent);
291
- setShowDecoded(true);
292
- intervalId = setInterval(() => {
293
- iteration++;
294
- if (iteration >= MAX_ITERATIONS) {
295
- setHasAnimated(true);
296
- setShowDecoded(false);
297
- if (intervalId) clearInterval(intervalId);
298
- } else {
299
- const newScrambled = scrambleText(fullText);
300
- const textStartIndex2 = { current: 0 };
301
- const scrambledContent2 = scrambleReactNode(
302
- children,
303
- newScrambled,
304
- textStartIndex2
305
- );
306
- setDisplayContent(scrambledContent2);
307
- }
308
- }, SPEED);
309
- }, delay);
310
- observer.disconnect();
311
- }
312
- },
313
- {
314
- threshold: 0.1
315
- // Trigger when 10% of the element is visible
316
- }
317
- );
318
- observer.observe(element);
319
- return () => {
320
- observer.disconnect();
321
- if (intervalId) clearInterval(intervalId);
322
- if (delayTimeoutId) clearTimeout(delayTimeoutId);
323
- };
324
- }, [children, fullText, initialScrambled, hasAnimated, delay]);
325
- const ariaLabel = useMemo(() => extractText(children), [children]);
326
- return /* @__PURE__ */ jsxs2(
327
- "span",
328
- {
329
- ref: elementRef,
330
- "aria-label": ariaLabel,
331
- className: cn("inline-grid", className),
332
- children: [
333
- /* @__PURE__ */ jsx3(
334
- "span",
335
- {
336
- className: cn(
337
- "transition-opacity duration-300 col-start-1 row-start-1",
338
- hasAnimated ? "opacity-100" : "opacity-0"
339
- ),
340
- children
341
- }
342
- ),
343
- showDecoded && displayContent && /* @__PURE__ */ jsx3("span", { className: "transition-opacity duration-300 col-start-1 row-start-1", children: displayContent })
344
- ]
345
- }
346
- );
347
- };
348
- var SuspenseDecodedText = (props) => {
349
- return /* @__PURE__ */ jsx3(
350
- Suspense,
351
- {
352
- fallback: /* @__PURE__ */ jsx3("span", { className: cn("opacity-0", props.className), children: props.children }),
353
- children: /* @__PURE__ */ jsx3(TextDecoder, { ...props })
354
- }
355
- );
356
- };
357
- var TextDecoder_default = SuspenseDecodedText;
358
-
359
- // src/components/GlitchLink.tsx
360
- import Link from "next/link";
361
- import {
362
- useState as useState2,
363
- cloneElement,
364
- isValidElement
365
- } from "react";
366
- import { Slot as Slot2 } from "@radix-ui/react-slot";
367
- import { jsx as jsx4 } from "react/jsx-runtime";
368
- var DEFAULT_SYMBOLS = ["/", "#", "*"];
369
- var GlitchLink = ({
370
- href,
371
- children,
372
- symbols = DEFAULT_SYMBOLS,
373
- className,
374
- asChild = false,
375
- ...props
376
- }) => {
377
- const [isHovering, setIsHovering] = useState2(false);
378
- const getTextContent = (node) => {
379
- if (typeof node === "string") return node;
380
- if (isValidElement(node) && node.props.children) {
381
- return getTextContent(node.props.children);
382
- }
383
- return "";
384
- };
385
- const text = getTextContent(children);
386
- const getRandomGlitch = () => {
387
- if (!isHovering || !text) return text;
388
- return text.split(" ").map((word) => {
389
- const randomLetterIndex = Math.floor(Math.random() * word.length);
390
- return word.replace(
391
- word[randomLetterIndex],
392
- symbols[Math.floor(Math.random() * symbols.length)]
393
- );
394
- }).join(" ");
395
- };
396
- const commonProps = {
397
- className,
398
- onMouseEnter: () => setIsHovering(true),
399
- onMouseLeave: () => setIsHovering(false),
400
- ...props
401
- };
402
- if (asChild && isValidElement(children)) {
403
- const content2 = text ? isHovering ? getRandomGlitch() : text : children;
404
- return /* @__PURE__ */ jsx4(Slot2, { ...commonProps, children: cloneElement(children, {}, content2) });
405
- }
406
- const content = text ? isHovering ? getRandomGlitch() : children : children;
407
- return /* @__PURE__ */ jsx4(Link, { href: href || "#", ...commonProps, children: content });
408
- };
409
- var GlitchLink_default = GlitchLink;
410
-
411
- // src/components/PixelLoad.tsx
412
- import Image from "next/image";
413
- import { useCallback, useEffect as useEffect2, useRef as useRef2, useState as useState3 } from "react";
414
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
415
- function isStaticImageData(src) {
416
- return typeof src === "object" && "src" in src;
417
- }
418
- function getImageSrc(src) {
419
- return isStaticImageData(src) ? src.src : src;
420
- }
421
- function PixelLoad({
422
- src,
423
- alt,
424
- duration = 600,
425
- steps = 15,
426
- className,
427
- onAnimationComplete,
428
- priority,
429
- quality,
430
- placeholder = "empty",
431
- blurDataURL,
432
- objectFit = "cover"
433
- }) {
434
- const containerRef = useRef2(null);
435
- const canvasRef = useRef2(null);
436
- const [status, setStatus] = useState3("loading");
437
- const [dimensions, setDimensions] = useState3(null);
438
- const imageSrc = getImageSrc(src);
439
- const drawPixelated = useCallback(
440
- (ctx, img, pixelSize, w, h) => {
441
- ctx.imageSmoothingEnabled = false;
442
- const sw = Math.max(1, Math.floor(w / pixelSize));
443
- const sh = Math.max(1, Math.floor(h / pixelSize));
444
- ctx.clearRect(0, 0, w, h);
445
- ctx.drawImage(img, 0, 0, sw, sh);
446
- ctx.drawImage(canvasRef.current, 0, 0, sw, sh, 0, 0, w, h);
447
- },
448
- []
449
- );
450
- const runAnimation = useCallback(
451
- (ctx, img, w, h) => {
452
- const minPixelSize = Math.max(w, h) / 4;
453
- const intervalMs = duration / steps;
454
- let currentStep = 0;
455
- setStatus("animating");
456
- const animate = () => {
457
- const progress = currentStep / steps;
458
- const pixelSize = Math.max(1, Math.floor(minPixelSize * (1 - progress)));
459
- drawPixelated(ctx, img, pixelSize, w, h);
460
- currentStep++;
461
- if (currentStep <= steps) {
462
- window.setTimeout(animate, intervalMs);
463
- } else {
464
- setStatus("complete");
465
- onAnimationComplete?.();
466
- }
467
- };
468
- animate();
469
- },
470
- [duration, steps, drawPixelated, onAnimationComplete]
471
- );
472
- useEffect2(() => {
473
- const container = containerRef.current;
474
- if (!container) return;
475
- const updateDimensions = () => {
476
- const { width, height } = container.getBoundingClientRect();
477
- setDimensions({ width: Math.floor(width), height: Math.floor(height) });
478
- };
479
- const resizeObserver = new ResizeObserver(updateDimensions);
480
- resizeObserver.observe(container);
481
- updateDimensions();
482
- return () => {
483
- resizeObserver.disconnect();
484
- };
485
- }, []);
486
- useEffect2(() => {
487
- if (!dimensions) return;
488
- if (dimensions.width <= 0 || dimensions.height <= 0) return;
489
- const canvas = canvasRef.current;
490
- if (!canvas) return;
491
- const ctx = canvas.getContext("2d");
492
- if (!ctx) return;
493
- canvas.width = dimensions.width;
494
- canvas.height = dimensions.height;
495
- const img = new window.Image();
496
- img.crossOrigin = "anonymous";
497
- img.onload = () => {
498
- const minPixelSize = Math.max(dimensions.width, dimensions.height) / 4;
499
- drawPixelated(ctx, img, minPixelSize, dimensions.width, dimensions.height);
500
- runAnimation(ctx, img, dimensions.width, dimensions.height);
501
- };
502
- img.onerror = () => {
503
- console.error("PixelLoad: Failed to load image");
504
- };
505
- img.src = imageSrc;
506
- return () => {
507
- img.onload = null;
508
- img.onerror = null;
509
- };
510
- }, [imageSrc, dimensions, runAnimation, drawPixelated]);
511
- const isComplete = status === "complete";
512
- const isAnimating = status === "animating" || status === "loading";
513
- return /* @__PURE__ */ jsxs3(
514
- "div",
515
- {
516
- ref: containerRef,
517
- className: `relative w-full h-full ${className || ""}`,
518
- children: [
519
- /* @__PURE__ */ jsx5(
520
- "canvas",
521
- {
522
- ref: canvasRef,
523
- className: "absolute top-0 left-0 w-full h-full",
524
- style: {
525
- objectFit,
526
- opacity: isComplete ? 0 : 1,
527
- zIndex: isAnimating ? 2 : 1
528
- },
529
- "aria-hidden": isComplete
530
- }
531
- ),
532
- isComplete && /* @__PURE__ */ jsx5(
533
- Image,
534
- {
535
- src,
536
- alt,
537
- fill: true,
538
- priority,
539
- quality,
540
- placeholder,
541
- blurDataURL,
542
- className: "opacity-100 transition-opacity duration-150 ease-out z-[1]",
543
- style: {
544
- objectFit
545
- }
546
- }
547
- )
548
- ]
549
- }
550
- );
551
- }
552
- export {
553
- Button,
554
- GlitchLink_default as GlitchLink,
555
- PixelLoad,
556
- Tabs,
557
- TabsContent,
558
- TabsList,
559
- TabsTrigger,
560
- TextDecoder_default as TextDecoder,
561
- buttonVariants,
562
- cn
563
- };
1
+ "use client";
2
+ import{b as l}from"./chunk-IK3C7KV5.mjs";import{a as c}from"./chunk-WF73K6X2.mjs";import{a as s}from"./chunk-BCAQUOTY.mjs";import{a as r,b as e}from"./chunk-XNHJPYUV.mjs";import{a as i,b as o,c as a,d as n}from"./chunk-2XHWLYXD.mjs";import{a as t}from"./chunk-S5TKCF6T.mjs";export{e as Button,l as GlitchLink,c as PixelLoad,i as Tabs,n as TabsContent,o as TabsList,a as TabsTrigger,s as TextDecoder,r as buttonVariants,t as cn};
564
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/button.tsx","../src/lib/utils.ts","../src/components/tabs.tsx","../src/components/TextDecoder.tsx","../src/components/GlitchLink.tsx","../src/components/PixelLoad.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary/80 text-secondary-foreground hover:bg-secondary\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 text-sm px-3 py-2\",\n lg: \"h-10 px-8 py-2\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n icon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n icon,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={loading || props.disabled}\n {...props}\n >\n {loading && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent\" />\n )}\n {!loading && icon && <span className=\"mr-2\">{icon}</span>}\n {props.children}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center rounded-3xl bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-3xl px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\nimport { cn } from \"@/lib/utils\"\nimport React, {\n useState,\n useEffect,\n useMemo,\n useRef,\n Suspense,\n ReactNode,\n} from \"react\"\n\n// The symbols to use for the scrambling effect (moved outside to avoid recreation)\nconst SYMBOLS = [\"\\\\\", \"-\", \"?\", \"/\", \"#\", \"!\", \"_\", \"+\", \"<\", \">\"]\nconst MAX_ITERATIONS = 3 // How many times to scramble\nconst SPEED = 400 // Speed in milliseconds between scrambles\n\n// Helper function moved outside component to avoid recreation\nconst scrambleText = (input: string): string => {\n if (!input) return \"\"\n\n return input\n .split(\" \")\n .map((word: string) => {\n if (!word) return \"\"\n const randomSymbol = SYMBOLS[Math.floor(Math.random() * SYMBOLS.length)]\n return randomSymbol.repeat(word.length)\n })\n .join(\" \")\n}\n\n// Extract text content from React nodes recursively\n// Also checks common text props like 'text', 'label', 'title', etc.\nconst extractText = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node)\n }\n\n if (Array.isArray(node)) {\n return node.map(extractText).join(\"\")\n }\n\n if (React.isValidElement(node)) {\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n\n let result = \"\"\n\n // Extract text from props first (in order: text, label, title)\n if (typeof props.text === \"string\") {\n result += props.text\n }\n if (typeof props.label === \"string\") {\n result += props.label\n }\n if (typeof props.title === \"string\") {\n result += props.title\n }\n\n // Then extract from children\n if (props.children) {\n result += extractText(props.children)\n }\n\n return result\n }\n\n return \"\"\n}\n\n// Clone React nodes and replace text content with scrambled text\n// This function maps scrambled text back to the original structure\nconst scrambleReactNode = (\n node: ReactNode,\n scrambledText: string,\n textStartIndex: { current: number }\n): ReactNode => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const text = String(node)\n // For each character in the original text, take the corresponding scrambled character\n // This preserves the length and structure\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n // Fallback if scrambled text is shorter (shouldn't happen, but safety check)\n scrambled += text[i]\n }\n }\n return scrambled\n }\n\n if (Array.isArray(node)) {\n return node.map((child, index) => {\n const scrambledChild = scrambleReactNode(\n child,\n scrambledText,\n textStartIndex\n )\n // Preserve original key if it exists, otherwise add one for React elements\n if (React.isValidElement(scrambledChild)) {\n const originalKey = React.isValidElement(child) ? child.key : null\n if (scrambledChild.key == null && originalKey == null) {\n return React.cloneElement(scrambledChild, { key: `decoded-${index}` })\n }\n // If original had a key but scrambled doesn't, preserve it\n if (scrambledChild.key == null && originalKey != null) {\n return React.cloneElement(scrambledChild, { key: originalKey })\n }\n }\n return scrambledChild\n })\n }\n\n if (React.isValidElement(node)) {\n // Regular element handling - works for all components\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n const newProps = { ...props }\n\n // Handle text props in the same order as extraction (text, label, title)\n if (typeof props.text === \"string\") {\n const text = props.text\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += text[i]\n }\n }\n newProps.text = scrambled\n }\n\n if (typeof props.label === \"string\") {\n const label = props.label\n let scrambled = \"\"\n for (let i = 0; i < label.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += label[i]\n }\n }\n newProps.label = scrambled\n }\n\n if (typeof props.title === \"string\") {\n const title = props.title\n let scrambled = \"\"\n for (let i = 0; i < title.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += title[i]\n }\n }\n newProps.title = scrambled\n }\n\n // Handle children after props\n if (props.children) {\n newProps.children = scrambleReactNode(\n props.children,\n scrambledText,\n textStartIndex\n )\n }\n return React.cloneElement(node, newProps)\n }\n\n return node\n}\n\nexport interface TextDecoderProps {\n children: ReactNode\n className?: string\n delay?: number // Delay in milliseconds before starting animation\n}\n\nconst TextDecoder = ({ children, className, delay = 0 }: TextDecoderProps) => {\n const [displayContent, setDisplayContent] = useState<ReactNode>(null)\n const [hasAnimated, setHasAnimated] = useState(false)\n const [showDecoded, setShowDecoded] = useState(true)\n const elementRef = useRef<HTMLSpanElement>(null)\n\n // Extract full text for scrambling\n const fullText = useMemo(() => extractText(children), [children])\n\n // Memoize initial scrambled text\n const initialScrambled = useMemo(() => scrambleText(fullText), [fullText])\n\n // Initialize with scrambled content to prevent layout shift\n useEffect(() => {\n if (!hasAnimated && fullText) {\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n }\n }, [children, initialScrambled, hasAnimated, fullText])\n\n useEffect(() => {\n if (!fullText) {\n setDisplayContent(null)\n setShowDecoded(false)\n return\n }\n\n // If already animated, hide decoded and show children\n if (hasAnimated) {\n setShowDecoded(false)\n return\n }\n\n const element = elementRef.current\n if (!element) return\n\n let iteration = 0\n let intervalId: NodeJS.Timeout | null = null\n let delayTimeoutId: NodeJS.Timeout | null = null\n\n // Intersection Observer to detect when element is visible\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry.isIntersecting && !hasAnimated) {\n // Start animation after delay\n delayTimeoutId = setTimeout(() => {\n // 1. Initial scramble\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n\n // 2. Set up the interval\n intervalId = setInterval(() => {\n iteration++\n\n if (iteration >= MAX_ITERATIONS) {\n // Stop scrambling, fade out decoded and fade in children\n setHasAnimated(true)\n setShowDecoded(false)\n if (intervalId) clearInterval(intervalId)\n } else {\n // Continue scrambling\n const newScrambled = scrambleText(fullText)\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n newScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n }\n }, SPEED)\n }, delay)\n\n // Disconnect observer once animation starts\n observer.disconnect()\n }\n },\n {\n threshold: 0.1, // Trigger when 10% of the element is visible\n }\n )\n\n observer.observe(element)\n\n // Cleanup function\n return () => {\n observer.disconnect()\n if (intervalId) clearInterval(intervalId)\n if (delayTimeoutId) clearTimeout(delayTimeoutId)\n }\n }, [children, fullText, initialScrambled, hasAnimated, delay])\n\n const ariaLabel = useMemo(() => extractText(children), [children])\n\n return (\n <span\n ref={elementRef}\n aria-label={ariaLabel} // Accessibility: Screen readers read the real text\n className={cn(\"inline-grid\", className)}\n >\n {/* Both elements in the same grid cell - prevents width changes */}\n <span\n className={cn(\n \"transition-opacity duration-300 col-start-1 row-start-1\",\n hasAnimated ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n {children}\n </span>\n {/* Decoded animation overlay in the same grid cell */}\n {showDecoded && displayContent && (\n <span className=\"transition-opacity duration-300 col-start-1 row-start-1\">\n {displayContent}\n </span>\n )}\n </span>\n )\n}\n\nconst SuspenseDecodedText = (props: TextDecoderProps) => {\n return (\n <Suspense\n fallback={\n <span className={cn(\"opacity-0\", props.className)}>\n {props.children}\n </span>\n }\n >\n <TextDecoder {...props} />\n </Suspense>\n )\n}\n\nexport default SuspenseDecodedText\n","\"use client\"\nimport Link from \"next/link\"\nimport {\n RefAttributes,\n useState,\n ReactNode,\n cloneElement,\n isValidElement,\n} from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\n\nexport const DEFAULT_SYMBOLS = [\"/\", \"#\", \"*\"]\n\ntype GlitchLinkProps = RefAttributes<HTMLAnchorElement> & {\n href?: string\n children: ReactNode\n symbols?: string[]\n className?: string\n asChild?: boolean\n}\n\nconst GlitchLink = ({\n href,\n children,\n symbols = DEFAULT_SYMBOLS,\n className,\n asChild = false,\n ...props\n}: GlitchLinkProps) => {\n const [isHovering, setIsHovering] = useState(false)\n\n // Extract text from children - either direct string or from child element\n const getTextContent = (node: ReactNode): string => {\n if (typeof node === \"string\") return node\n if (isValidElement(node) && node.props.children) {\n return getTextContent(node.props.children)\n }\n return \"\"\n }\n\n const text = getTextContent(children)\n\n const getRandomGlitch = () => {\n if (!isHovering || !text) return text\n return text\n .split(\" \")\n .map((word: string) => {\n // take one random letter from the word\n const randomLetterIndex = Math.floor(Math.random() * word.length)\n\n // replace the letter with a random symbol\n return word.replace(\n word[randomLetterIndex],\n symbols[Math.floor(Math.random() * symbols.length)]\n )\n })\n .join(\" \")\n }\n\n const commonProps = {\n className,\n onMouseEnter: () => setIsHovering(true),\n onMouseLeave: () => setIsHovering(false),\n ...props,\n }\n\n if (asChild && isValidElement(children)) {\n const content = text ? (isHovering ? getRandomGlitch() : text) : children\n return (\n <Slot {...commonProps}>\n {cloneElement(children as React.ReactElement, {}, content)}\n </Slot>\n )\n }\n\n const content = text ? (isHovering ? getRandomGlitch() : children) : children\n\n return (\n <Link href={href || \"#\"} {...commonProps}>\n {content}\n </Link>\n )\n}\n\nexport default GlitchLink\n","\"use client\"\n\nimport Image, { type StaticImageData } from \"next/image\"\nimport { JSX, useCallback, useEffect, useRef, useState } from \"react\"\n\ntype PixelLoadStatus = \"loading\" | \"animating\" | \"complete\"\n\ntype ImageSrc = string | StaticImageData\n\nexport interface PixelLoadProps {\n src: ImageSrc\n alt: string\n duration?: number\n steps?: number\n className?: string\n onAnimationComplete?: () => void\n priority?: boolean\n quality?: number\n placeholder?: \"blur\" | \"empty\"\n blurDataURL?: string\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\"\n}\n\nfunction isStaticImageData(src: ImageSrc): src is StaticImageData {\n return typeof src === \"object\" && \"src\" in src\n}\n\nfunction getImageSrc(src: ImageSrc): string {\n return isStaticImageData(src) ? src.src : src\n}\n\nexport function PixelLoad({\n src,\n alt,\n duration = 600,\n steps = 15,\n className,\n onAnimationComplete,\n priority,\n quality,\n placeholder = \"empty\",\n blurDataURL,\n objectFit = \"cover\",\n}: PixelLoadProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [status, setStatus] = useState<PixelLoadStatus>(\"loading\")\n const [dimensions, setDimensions] = useState<{\n width: number\n height: number\n } | null>(null)\n\n const imageSrc = getImageSrc(src)\n\n const drawPixelated = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n pixelSize: number,\n w: number,\n h: number\n ): void => {\n ctx.imageSmoothingEnabled = false\n\n const sw = Math.max(1, Math.floor(w / pixelSize))\n const sh = Math.max(1, Math.floor(h / pixelSize))\n\n ctx.clearRect(0, 0, w, h)\n ctx.drawImage(img, 0, 0, sw, sh)\n ctx.drawImage(canvasRef.current!, 0, 0, sw, sh, 0, 0, w, h)\n },\n []\n )\n\n const runAnimation = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n w: number,\n h: number\n ): void => {\n const minPixelSize = Math.max(w, h) / 4\n const intervalMs = duration / steps\n let currentStep = 0\n\n setStatus(\"animating\")\n\n const animate = (): void => {\n const progress = currentStep / steps\n const pixelSize = Math.max(1, Math.floor(minPixelSize * (1 - progress)))\n\n drawPixelated(ctx, img, pixelSize, w, h)\n\n currentStep++\n\n if (currentStep <= steps) {\n window.setTimeout(animate, intervalMs)\n } else {\n setStatus(\"complete\")\n onAnimationComplete?.()\n }\n }\n\n animate()\n },\n [duration, steps, drawPixelated, onAnimationComplete]\n )\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const updateDimensions = (): void => {\n const { width, height } = container.getBoundingClientRect()\n setDimensions({ width: Math.floor(width), height: Math.floor(height) })\n }\n\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(container)\n updateDimensions()\n\n return (): void => {\n resizeObserver.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (!dimensions) return\n\n // Guard against invalid dimensions\n if (dimensions.width <= 0 || dimensions.height <= 0) return\n\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n // Set canvas dimensions immediately to ensure it covers the area\n canvas.width = dimensions.width\n canvas.height = dimensions.height\n\n const img = new window.Image()\n img.crossOrigin = \"anonymous\"\n\n img.onload = (): void => {\n // Draw first frame immediately to prevent original image from showing\n const minPixelSize = Math.max(dimensions.width, dimensions.height) / 4\n drawPixelated(ctx, img, minPixelSize, dimensions.width, dimensions.height)\n // Then start animation\n runAnimation(ctx, img, dimensions.width, dimensions.height)\n }\n\n img.onerror = (): void => {\n console.error(\"PixelLoad: Failed to load image\")\n }\n\n img.src = imageSrc\n\n return (): void => {\n img.onload = null\n img.onerror = null\n }\n }, [imageSrc, dimensions, runAnimation, drawPixelated])\n\n const isComplete = status === \"complete\"\n const isAnimating = status === \"animating\" || status === \"loading\"\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full h-full ${className || \"\"}`}\n >\n <canvas\n ref={canvasRef}\n className=\"absolute top-0 left-0 w-full h-full\"\n style={{\n objectFit,\n opacity: isComplete ? 0 : 1,\n zIndex: isAnimating ? 2 : 1,\n }}\n aria-hidden={isComplete}\n />\n {isComplete && (\n <Image\n src={src}\n alt={alt}\n fill\n priority={priority}\n quality={quality}\n placeholder={placeholder}\n blurDataURL={blurDataURL}\n className=\"opacity-100 transition-opacity duration-150 ease-out z-[1]\"\n style={{\n objectFit,\n }}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["React","jsx","React","jsx","jsxs","textStartIndex","scrambledContent","useState","Slot","jsx","content","useEffect","useRef","useState","jsx","jsxs"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}