@alkimi.org/ui-kit 0.1.18 → 0.1.20

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 (66) hide show
  1. package/README.github.md +147 -1
  2. package/dist/chunk-HGY6TDJ2.js +3 -0
  3. package/dist/chunk-HGY6TDJ2.js.map +1 -0
  4. package/dist/chunk-KPAOPUY2.mjs +3 -0
  5. package/dist/chunk-KPAOPUY2.mjs.map +1 -0
  6. package/dist/chunk-MLULTZDS.js +3 -0
  7. package/dist/chunk-MLULTZDS.js.map +1 -0
  8. package/dist/chunk-NLKTP7EJ.mjs +3 -0
  9. package/dist/chunk-NLKTP7EJ.mjs.map +1 -0
  10. package/dist/chunk-NZDJHFEG.js +3 -0
  11. package/dist/chunk-NZDJHFEG.js.map +1 -0
  12. package/dist/chunk-P7ACUHYG.mjs +3 -0
  13. package/dist/chunk-P7ACUHYG.mjs.map +1 -0
  14. package/dist/chunk-RTHCEJYC.mjs +3 -0
  15. package/dist/chunk-RTHCEJYC.mjs.map +1 -0
  16. package/dist/chunk-XYO4VLMF.js +3 -0
  17. package/dist/chunk-XYO4VLMF.js.map +1 -0
  18. package/dist/components/GeometricFluidGrid.d.mts +5 -0
  19. package/dist/components/GeometricFluidGrid.d.ts +5 -0
  20. package/dist/components/GeometricFluidGrid.js +3 -0
  21. package/dist/components/GeometricFluidGrid.js.map +1 -0
  22. package/dist/components/GeometricFluidGrid.mjs +3 -0
  23. package/dist/components/GeometricFluidGrid.mjs.map +1 -0
  24. package/dist/components/GlitchLink.d.mts +6 -5
  25. package/dist/components/GlitchLink.d.ts +6 -5
  26. package/dist/components/GlitchLink.js +1 -1
  27. package/dist/components/GlitchLink.js.map +1 -1
  28. package/dist/components/GlitchLink.mjs +1 -1
  29. package/dist/components/PixelLoad.js +1 -1
  30. package/dist/components/PixelLoad.js.map +1 -1
  31. package/dist/components/PixelLoad.mjs +1 -1
  32. package/dist/components/TextDecoder.d.mts +3 -1
  33. package/dist/components/TextDecoder.d.ts +3 -1
  34. package/dist/components/TextDecoder.js +1 -1
  35. package/dist/components/TextDecoder.js.map +1 -1
  36. package/dist/components/TextDecoder.mjs +1 -1
  37. package/dist/components/button.d.mts +1 -1
  38. package/dist/components/button.d.ts +1 -1
  39. package/dist/components/button.js +1 -1
  40. package/dist/components/button.js.map +1 -1
  41. package/dist/components/button.mjs +1 -1
  42. package/dist/components/card.js +1 -1
  43. package/dist/components/card.js.map +1 -1
  44. package/dist/components/card.mjs +1 -1
  45. package/dist/components/card.mjs.map +1 -1
  46. package/dist/components/tabs.js +1 -1
  47. package/dist/components/tabs.js.map +1 -1
  48. package/dist/components/tabs.mjs +1 -1
  49. package/dist/index.css +1 -1
  50. package/dist/index.css.map +1 -1
  51. package/dist/index.d.mts +1 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/index.mjs +1 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/styles.css.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/chunk-5CDUAMIG.js +0 -3
  60. package/dist/chunk-5CDUAMIG.js.map +0 -1
  61. package/dist/chunk-AXL7HSZW.mjs +0 -3
  62. package/dist/chunk-AXL7HSZW.mjs.map +0 -1
  63. package/dist/chunk-IK3C7KV5.mjs +0 -3
  64. package/dist/chunk-IK3C7KV5.mjs.map +0 -1
  65. package/dist/chunk-JNEIOQGF.js +0 -3
  66. package/dist/chunk-JNEIOQGF.js.map +0 -1
package/README.github.md CHANGED
@@ -294,7 +294,153 @@ import {
294
294
  import { cn } from "@alkimi.org/ui-kit/utils"
295
295
  ```
296
296
 
297
- **Note**: Both import methods require installing the full `@alkimi.org/ui-kit` package. The individual imports help optimize your production bundle size (only used components are included), but don't reduce installation size.
297
+ ## Adding More Components
298
+
299
+ To add more shadcn/ui components to this library:
300
+
301
+ 1. Use the shadcn CLI to add components:
302
+
303
+ ```bash
304
+ npx shadcn-ui@latest add [component-name]
305
+ ```
306
+
307
+ 2. Export the new component in [src/index.ts](src/index.ts):
308
+
309
+ ```tsx
310
+ export { ComponentName } from "./components/component-name"
311
+ ```
312
+
313
+ 3. Create a story file in the `stories/` folder:
314
+
315
+ ```tsx
316
+ // stories/ComponentName.stories.tsx
317
+ import type { Meta, StoryObj } from "@storybook/react"
318
+ import { ComponentName } from "../src/components/component-name"
319
+
320
+ const meta = {
321
+ title: "Components/ComponentName",
322
+ component: ComponentName,
323
+ parameters: {
324
+ layout: "centered",
325
+ },
326
+ tags: ["autodocs"],
327
+ } satisfies Meta<typeof ComponentName>
328
+
329
+ export default meta
330
+ type Story = StoryObj<typeof meta>
331
+
332
+ export const Default: Story = {
333
+ args: {
334
+ // your component props
335
+ },
336
+ }
337
+ ```
338
+
339
+ 4. Test locally with Storybook:
340
+
341
+ ```bash
342
+ npm run storybook
343
+ ```
344
+
345
+ 5. Commit and push to main:
346
+
347
+ ```bash
348
+ git add .
349
+ git commit -m "feat: add ComponentName"
350
+ git push
351
+ ```
352
+
353
+ 6. Update the Storybook deployment:
354
+
355
+ ```bash
356
+ git checkout storybook
357
+ git merge main
358
+ git push
359
+ ```
360
+
361
+ Vercel will automatically rebuild and deploy the updated Storybook.
362
+
363
+ 7. (Optional) Publish to npm:
364
+ ```bash
365
+ git checkout main
366
+ # Update version in package.json
367
+ npm run build
368
+ npm publish
369
+ ```
370
+
371
+ ## Development
372
+
373
+ ### Running the Demo
374
+
375
+ To see the components in action, run the demo application:
376
+
377
+ ```bash
378
+ cd demo
379
+ pnpm install
380
+ pnpm run dev
381
+ ```
382
+
383
+ Then open [http://localhost:3000](http://localhost:3000) in your browser.
384
+
385
+ The demo showcases all available components with interactive examples, including:
386
+
387
+ - All button variants and sizes
388
+ - Card layouts and compositions
389
+ - Dark mode toggle
390
+ - Interactive component states
391
+
392
+ ### Build
393
+
394
+ Build the library for production:
395
+
396
+ ```bash
397
+ npm run build
398
+ ```
399
+
400
+ ### Watch Mode
401
+
402
+ Build the library in watch mode during development:
403
+
404
+ ```bash
405
+ npm run dev
406
+ ```
407
+
408
+ ### Type Check
409
+
410
+ Run TypeScript type checking:
411
+
412
+ ```bash
413
+ npm run type-check
414
+ ```
415
+
416
+ ### Storybook
417
+
418
+ View and develop components in isolation using Storybook:
419
+
420
+ ```bash
421
+ npm run storybook
422
+ ```
423
+
424
+ This will start Storybook on [http://localhost:6006](http://localhost:6006).
425
+
426
+ #### Building Storybook for Deployment
427
+
428
+ To build a static version of Storybook for deployment:
429
+
430
+ ```bash
431
+ npm run build-storybook
432
+ ```
433
+
434
+ This will generate a static site in the `storybook-static` directory that you can deploy to any static hosting service.
435
+
436
+ ## Publishing to npm
437
+
438
+ 1. Update the version number in [package.json](package.json) (e.g., from `0.1.3` to `0.1.4`)
439
+ 2. Build the library: `npm run build`
440
+ 3. Login to npm (if not already logged in): `npm login`
441
+ 4. Publish: `npm publish`
442
+
443
+ **Note:** Make sure to bump the version in [package.json](package.json) before publishing any changes to avoid conflicts with existing versions on npm.
298
444
 
299
445
  ## License
300
446
 
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use client";
2
+ var _chunkFUYXCJOQjs = require('./chunk-FUYXCJOQ.js');var _link = require('next/link'); var _link2 = _interopRequireDefault(_link);var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _reactslot = require('@radix-ui/react-slot');var _jsxruntime = require('react/jsx-runtime');var C="!<>-_\\/[]{}\u2014=+*^?#________",G=({href:L,children:a,symbols:u=C,className:N,asChild:R=!1,duration:m=40,...A})=>{let[i,l]=_react.useState.call(void 0, !1),[f,c]=_react.useState.call(void 0, 0),r=_react.useRef.call(void 0, ),p=_react.useRef.call(void 0, []),h=e=>typeof e=="string"||typeof e=="number"?String(e):_react.isValidElement.call(void 0, e)&&e.props.children?h(e.props.children):"",o=_react.useMemo.call(void 0, ()=>h(a),[a]),F=()=>{let e=[];for(let t=0;t<o.length;t++){let n=o[t],y=Math.floor(Math.random()*(m*.5)),S=y+Math.floor(Math.random()*(m*.5));e.push({to:n,start:y,end:S})}p.current=e,c(0)};_react.useEffect.call(void 0, ()=>{if(i&&o){F();let e=()=>{c(t=>t+1),r.current=requestAnimationFrame(e)};r.current=requestAnimationFrame(e)}else r.current&&cancelAnimationFrame(r.current),c(0);return()=>{r.current&&cancelAnimationFrame(r.current)}},[i,o]);let g=()=>o.split("").map((e,t)=>{let n=p.current[t];return!i||!n||f>=n.end?_jsxruntime.jsx.call(void 0, "span",{children:e},t):f>=n.start?((!n.char||Math.random()<.28)&&(n.char=u[Math.floor(Math.random()*u.length)]),_jsxruntime.jsxs.call(void 0, "span",{className:"relative inline-block",children:[_jsxruntime.jsx.call(void 0, "span",{className:"invisible opacity-0","aria-hidden":"true",children:e===" "?"\xA0":e}),_jsxruntime.jsx.call(void 0, "span",{className:"absolute inset-0 flex items-center justify-center font-mono opacity-50",children:n.char})]},t)):_jsxruntime.jsx.call(void 0, "span",{children:e},t)}),d={className:_chunkFUYXCJOQjs.a.call(void 0, "inline-flex items-center justify-center whitespace-nowrap",N),onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),...A};return R&&_react.isValidElement.call(void 0, a)?_jsxruntime.jsx.call(void 0, _reactslot.Slot,{...d,children:_react2.default.cloneElement(a,{},g())}):_jsxruntime.jsx.call(void 0, _link2.default,{href:L||"#",...d,children:g()})},D= exports.b =G;exports.a = C; exports.b = D;
3
+ //# sourceMappingURL=chunk-HGY6TDJ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-HGY6TDJ2.js","../src/components/GlitchLink.tsx"],"names":["DEFAULT_SYMBOLS","GlitchLink","href","children","symbols","className","asChild","duration","props","isHovering","setIsHovering","useState","frame","setFrame","rafRef","useRef","queueRef","getTextContent","node","isValidElement","originalText","useMemo","setupQueue","newQueue","i","to","start","end","useEffect","update","prev","renderContent","char","item","jsx","jsxs","commonProps","cn","Slot","React","Link","GlitchLink_default"],"mappings":"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","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-HGY6TDJ2.js","sourcesContent":[null,"\"use client\"\nimport Link from \"next/link\"\nimport React, {\n useState,\n useEffect,\n useRef,\n ReactNode,\n isValidElement,\n useMemo,\n} from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cn } from \"@/lib/utils\"\n\nexport const DEFAULT_SYMBOLS = \"!<>-_\\\\/[]{}—=+*^?#________\"\n\ntype GlitchLinkProps = {\n href?: string\n children: ReactNode\n symbols?: string\n className?: string\n asChild?: boolean\n duration?: number\n}\n\nconst GlitchLink = ({\n href,\n children,\n symbols = DEFAULT_SYMBOLS,\n className,\n asChild = false,\n duration = 40,\n ...props\n}: GlitchLinkProps) => {\n const [isHovering, setIsHovering] = useState(false)\n const [frame, setFrame] = useState(0)\n const rafRef = useRef<number>()\n const queueRef = useRef<\n { to: string; start: number; end: number; char?: string }[]\n >([])\n\n const getTextContent = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\")\n return String(node)\n if (isValidElement(node) && node.props.children)\n return getTextContent(node.props.children)\n return \"\"\n }\n\n const originalText = useMemo(() => getTextContent(children), [children])\n\n const setupQueue = () => {\n const newQueue = []\n for (let i = 0; i < originalText.length; i++) {\n const to = originalText[i]\n const start = Math.floor(Math.random() * (duration * 0.5))\n const end = start + Math.floor(Math.random() * (duration * 0.5))\n newQueue.push({ to, start, end })\n }\n queueRef.current = newQueue\n setFrame(0)\n }\n\n useEffect(() => {\n if (isHovering && originalText) {\n setupQueue()\n const update = () => {\n setFrame((prev) => prev + 1)\n rafRef.current = requestAnimationFrame(update)\n }\n rafRef.current = requestAnimationFrame(update)\n } else {\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n setFrame(0)\n }\n return () => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n }\n }, [isHovering, originalText])\n\n const renderContent = () => {\n return originalText.split(\"\").map((char, i) => {\n const item = queueRef.current[i]\n\n // If not hovering, or animation for this char hasn't started, or it's finished\n if (!isHovering || !item || frame >= item.end) {\n return <span key={i}>{char}</span>\n }\n\n // If we are in the scrambling phase for this specific character\n if (frame >= item.start) {\n if (!item.char || Math.random() < 0.28) {\n item.char = symbols[Math.floor(Math.random() * symbols.length)]\n }\n return (\n <span key={i} className=\"relative inline-block\">\n {/* The invisible real character preserves the exact width */}\n <span className=\"invisible opacity-0\" aria-hidden=\"true\">\n {char === \" \" ? \"\\u00A0\" : char}\n </span>\n {/* The absolute symbol sits exactly on top of that width */}\n <span className=\"absolute inset-0 flex items-center justify-center font-mono opacity-50\">\n {item.char}\n </span>\n </span>\n )\n }\n\n // Default: show original character\n return <span key={i}>{char}</span>\n })\n }\n\n const commonProps = {\n className: cn(\n \"inline-flex items-center justify-center whitespace-nowrap\",\n className\n ),\n onMouseEnter: () => setIsHovering(true),\n onMouseLeave: () => setIsHovering(false),\n ...props,\n }\n\n if (asChild && isValidElement(children)) {\n return (\n <Slot {...commonProps}>\n {React.cloneElement(children as any, {}, renderContent())}\n </Slot>\n )\n }\n\n return (\n <Link href={href || \"#\"} {...commonProps}>\n {renderContent()}\n </Link>\n )\n}\n\nexport default GlitchLink\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ var d=Object.defineProperty;var e=(b,a,c)=>a in b?d(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c;var f=(b,a,c)=>e(b,typeof a!="symbol"?a+"":a,c);export{f as a};
3
+ //# sourceMappingURL=chunk-KPAOPUY2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+ var _chunkXYO4VLMFjs = require('./chunk-XYO4VLMF.js');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');var x=14,S=1,F=5,$=(b,t)=>{if(b<t){let e=1-b/t;return e*e*(3-2*e)}return 0},v=class{constructor(t){_chunkXYO4VLMFjs.a.call(void 0, this,"x",0);_chunkXYO4VLMFjs.a.call(void 0, this,"y",0);_chunkXYO4VLMFjs.a.call(void 0, this,"anchorX",0);_chunkXYO4VLMFjs.a.call(void 0, this,"anchorY",0);_chunkXYO4VLMFjs.a.call(void 0, this,"vx",0);_chunkXYO4VLMFjs.a.call(void 0, this,"vy",0);_chunkXYO4VLMFjs.a.call(void 0, this,"nodes",[]);_chunkXYO4VLMFjs.a.call(void 0, this,"opacity",0);_chunkXYO4VLMFjs.a.call(void 0, this,"glitchZones",[]);_chunkXYO4VLMFjs.a.call(void 0, this,"maxReach",180);this.anchorX=t.x,this.anchorY=t.y,this.x=this.anchorX,this.y=this.anchorY,this.init()}init(){this.nodes=[];let t=3+Math.floor(Math.random()*3);for(let e=0;e<t;e++){let d=15+Math.random()*25,h=(Math.random()-.5)*60,u=(Math.random()-.5)*60;this.nodes.push({offsetX:h,offsetY:u,vx:(Math.random()-.5)*.1,vy:(Math.random()-.5)*.1,radius:d,t:Math.random()*100})}this.opacity=1}update(){let t=this.anchorX-this.x,e=this.anchorY-this.y,d=5e-4,h=t*d,u=e*d,a=(Math.random()-.5)*.01,Y=(Math.random()-.5)*.01;if(this.vx+=h+a,this.vy+=u+Y,this.vx*=.96,this.vy*=.96,this.x+=this.vx,this.y+=this.vy,this.nodes.forEach(s=>{s.t+=.005,s.offsetX+=Math.sin(s.t)*.1+s.vx,s.offsetY+=Math.cos(s.t*.9)*.1+s.vy;let m=70;(s.offsetX>m||s.offsetX<-m)&&(s.vx*=-1),(s.offsetY>m||s.offsetY<-m)&&(s.vy*=-1),s.radius+=Math.sin(s.t*2)*.1}),this.glitchZones=this.glitchZones.filter(s=>s.life>0),this.glitchZones.forEach(s=>s.life--),Math.random()<.03){let m=f=>Math.round((f-x/2)/x)*x+x/2,p=this.x+(Math.random()-.5)*80,w=this.y+(Math.random()-.5)*80,i=m(p),c=m(w);if((Math.random()>.6?"line":"dot")==="line"){let f=Math.random()>.5,n=40+Math.random()*80,l=2;this.glitchZones.push({x:f?i-l/2:i-n/2,y:f?c-n/2:c-l/2,w:f?l:n,h:f?n:l,life:8+Math.random()*12})}else this.glitchZones.push({x:i-4/2,y:c-4/2,w:4,h:4,life:6+Math.random()*10})}}},B=class{constructor(t,e){_chunkXYO4VLMFjs.a.call(void 0, this,"x");_chunkXYO4VLMFjs.a.call(void 0, this,"y");_chunkXYO4VLMFjs.a.call(void 0, this,"opacity");_chunkXYO4VLMFjs.a.call(void 0, this,"decay");_chunkXYO4VLMFjs.a.call(void 0, this,"nodes");_chunkXYO4VLMFjs.a.call(void 0, this,"maxReach",60);this.x=t,this.y=e,this.opacity=.8,this.decay=.03,this.nodes=[];let d=2;for(let h=0;h<d;h++)this.nodes.push({offsetX:(Math.random()-.5)*10,offsetY:(Math.random()-.5)*10,vx:(Math.random()-.5)*1,vy:(Math.random()-.5)*1,radius:5+Math.random()*10,t:0})}update(){this.opacity-=this.decay,this.nodes.forEach(t=>{t.offsetX+=t.vx,t.offsetY+=t.vy,t.radius*=.95})}},q=()=>{let b=_react.useRef.call(void 0, null);return _react.useEffect.call(void 0, ()=>{let t=b.current;if(!t)return;let e=t.getContext("2d");if(!e)return;let d,h=[],u=[],a={x:-1e3,y:-1e3,lastX:-1e3,lastY:-1e3},Y=()=>{h=[];let i=t.width,c=t.height;h.push(new v({x:i-i*.15,y:c*.15})),h.push(new v({x:i*.4,y:c*.4})),h.push(new v({x:i*.05+50,y:c-c*.15})),h.push(new v({x:i-i*.05-50,y:c-c*.05-50}))},s=()=>{let i=t.getBoundingClientRect();t.width=i.width,t.height=i.height,Y()},m=i=>{let c=t.getBoundingClientRect();a.x=i.clientX-c.left,a.y=i.clientY-c.top,a.lastX===-1e3&&(a.lastX=a.x,a.lastY=a.y);let M=a.x-a.lastX,f=a.y-a.lastY;Math.sqrt(M*M+f*f)>20&&(u.push(new B(a.x,a.y)),a.lastX=a.x,a.lastY=a.y)},p=()=>{s()},w=()=>{let i=t.width,c=t.height;h.forEach(n=>n.update());for(let n=u.length-1;n>=0;n--)u[n].update(),u[n].opacity<=0&&u.splice(n,1);e.fillStyle="#050505",e.fillRect(0,0,i,c);let M=[...h,...u],f=[];h.forEach(n=>f.push(...n.glitchZones));for(let n=x/2;n<i;n+=x)for(let l=x/2;l<c;l+=x){let C=!1;for(let o of f)if(n>=o.x&&n<=o.x+o.w&&l>=o.y&&l<=o.y+o.h){C=!0;break}if(C){if(e.fillStyle="rgba(182, 243, 191, 0.95)",Math.random()>.1){let o=Math.random()>.5?F*.7:S*2;e.beginPath(),e.arc(n,l,o/2,0,Math.PI*2),e.fill()}continue}let y=0,I=!1;for(let o of M)if(Math.abs(n-o.x)<o.maxReach&&Math.abs(l-o.y)<o.maxReach){I=!0;break}if(!I){e.fillStyle="rgba(255, 255, 255, 0.03)",e.fillRect(n-.5,l-.5,1,1);continue}for(let o of M){let E=n-o.x,G=l-o.y;if(Math.abs(E)>o.maxReach||Math.abs(G)>o.maxReach)continue;let g=0;for(let R of o.nodes){let z=E-R.offsetX,X=G-R.offsetY,Z=Math.sqrt(z*z+X*X);g+=$(Z,R.radius)}g>1&&(g=1),y+=g*o.opacity}if(y>1&&(y=1),y>.01){let X=Math.floor(255+-73*y),Z=Math.floor(255+-12*y),L=Math.floor(255+-64*y),A=y*.5,P=S+y*(F-S);e.fillStyle=`rgba(${X}, ${Z}, ${L}, ${A})`,e.beginPath(),e.arc(n,l,P/2,0,Math.PI*2),e.fill()}else e.fillStyle="rgba(255, 255, 255, 0.03)",e.fillRect(n-.5,l-.5,1,1)}d=requestAnimationFrame(w)};return window.addEventListener("resize",p),window.addEventListener("mousemove",m),s(),w(),()=>{window.removeEventListener("resize",p),window.removeEventListener("mousemove",m),cancelAnimationFrame(d)}},[]),_jsxruntime.jsx.call(void 0, "canvas",{ref:b,className:"fixed inset-0 -z-10 w-full h-full pointer-events-none"})},T= exports.a =q;exports.a = T;
3
+ //# sourceMappingURL=chunk-MLULTZDS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-MLULTZDS.js","../src/components/GeometricFluidGrid.tsx"],"names":["GAP","BASE_SIZE","MAX_SIZE","getFalloff","dist","radius","val","AnchoredBlob","anchorConfig","__publicField","nodeCount","i","r","ox","oy","dx","dy","k","ax","ay","wx","wy","node","maxDist","g","snap","v","rawCx","rawCy","cx","cy","isVert","len","thickness","TrailBlob","x","y","count","GeometricFluidGrid","canvasRef","useRef","useEffect","canvas","ctx","animationFrameId","orbs","trail","mouse","initWorld","w","h","resize","rect","handleMouseMove","e","handleResize","draw","orb","renderList","allGlitches","o","isGlitching","size","totalInfluence","nearby","entity","localInf","nx","ny","b","alpha","jsx","GeometricFluidGrid_default"],"mappings":"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","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-MLULTZDS.js","sourcesContent":[null,"\"use client\"\nimport React, { useEffect, useRef } from \"react\"\n\n// --- CONFIGURATION ---\nconst GAP = 14\nconst BASE_SIZE = 1\nconst MAX_SIZE = 5\n\n// --- TYPES ---\ninterface Node {\n offsetX: number\n offsetY: number\n vx: number\n vy: number\n radius: number\n t: number\n}\n\ninterface GlitchZone {\n x: number\n y: number\n w: number\n h: number\n life: number\n}\n\ninterface MouseState {\n x: number\n y: number\n lastX: number\n lastY: number\n}\n\n// --- MATH HELPERS ---\nconst getFalloff = (dist: number, radius: number): number => {\n if (dist < radius) {\n const val = 1 - dist / radius\n return val * val * (3 - 2 * val)\n }\n return 0\n}\n\n// --- CLASSES ---\nclass AnchoredBlob {\n // Current Position\n x: number = 0\n y: number = 0\n\n // Anchor Position (Home base)\n anchorX: number = 0\n anchorY: number = 0\n\n // Movement\n vx: number = 0\n vy: number = 0\n\n // Appearance\n nodes: Node[] = []\n opacity: number = 0\n\n // Glitch State\n glitchZones: GlitchZone[] = []\n maxReach: number = 180\n\n constructor(anchorConfig: { x: number; y: number }) {\n this.anchorX = anchorConfig.x\n this.anchorY = anchorConfig.y\n this.x = this.anchorX\n this.y = this.anchorY\n this.init()\n }\n\n init() {\n // 1. Create Internal Nodes (The \"Blob\" composition)\n this.nodes = []\n const nodeCount = 3 + Math.floor(Math.random() * 3) // 3 to 5 nodes\n\n for (let i = 0; i < nodeCount; i++) {\n // Significantly smaller radius (15-40px) to reduce central bulk\n const r = 15 + Math.random() * 25\n // Wider initial spread\n const ox = (Math.random() - 0.5) * 60\n const oy = (Math.random() - 0.5) * 60\n\n this.nodes.push({\n offsetX: ox,\n offsetY: oy,\n vx: (Math.random() - 0.5) * 0.1, // Slower internal movement (was 0.4)\n vy: (Math.random() - 0.5) * 0.1,\n radius: r,\n t: Math.random() * 100,\n })\n }\n\n this.opacity = 1\n }\n\n update() {\n // --- 1. Tethered Movement Logic ---\n const dx = this.anchorX - this.x\n const dy = this.anchorY - this.y\n\n // Spring constant (very loose)\n const k = 0.0005\n const ax = dx * k\n const ay = dy * k\n\n // Random wandering force - Reduced significantly for slower drift\n const wx = (Math.random() - 0.5) * 0.01 // was 0.05\n const wy = (Math.random() - 0.5) * 0.01 // was 0.05\n\n this.vx += ax + wx\n this.vy += ay + wy\n\n this.vx *= 0.96\n this.vy *= 0.96\n\n this.x += this.vx\n this.y += this.vy\n\n // --- 2. Internal Node Animation ---\n this.nodes.forEach((node) => {\n // Slow down time step\n node.t += 0.005 // was 0.02\n\n // Slower oscillation and movement\n node.offsetX += Math.sin(node.t) * 0.1 + node.vx // amp was 0.4\n node.offsetY += Math.cos(node.t * 0.9) * 0.1 + node.vy\n\n // Constrain to \"nucleus\"\n const maxDist = 70\n if (node.offsetX > maxDist || node.offsetX < -maxDist) node.vx *= -1\n if (node.offsetY > maxDist || node.offsetY < -maxDist) node.vy *= -1\n\n // Pulse size\n node.radius += Math.sin(node.t * 2) * 0.1\n })\n\n // --- 3. Manage Glitch Zones ---\n // Remove dead glitches\n this.glitchZones = this.glitchZones.filter((g) => g.life > 0)\n this.glitchZones.forEach((g) => g.life--)\n\n // Randomly spawn new glitches\n if (Math.random() < 0.03) {\n // 3% chance per frame\n const spread = 80\n\n // Snap random positions to exact grid points to ensure clean lines\n const snap = (v: number) =>\n Math.round((v - GAP / 2) / GAP) * GAP + GAP / 2\n\n const rawCx = this.x + (Math.random() - 0.5) * spread\n const rawCy = this.y + (Math.random() - 0.5) * spread\n\n const cx = snap(rawCx)\n const cy = snap(rawCy)\n\n const type = Math.random() > 0.6 ? \"line\" : \"dot\"\n\n if (type === \"line\") {\n const isVert = Math.random() > 0.5\n // Medium length: 40-120px\n const len = 40 + Math.random() * 80\n\n // Thickness is essentially zero (just a sliver) centered on the grid line\n // to guarantee we only pick up exactly one row/column of dots\n const thickness = 2\n\n this.glitchZones.push({\n x: isVert ? cx - thickness / 2 : cx - len / 2,\n y: isVert ? cy - len / 2 : cy - thickness / 2,\n w: isVert ? thickness : len,\n h: isVert ? len : thickness,\n life: 8 + Math.random() * 12,\n })\n } else {\n // Single dot\n // Box just large enough to catch one grid point\n const size = 4\n\n this.glitchZones.push({\n x: cx - size / 2,\n y: cy - size / 2,\n w: size,\n h: size,\n life: 6 + Math.random() * 10,\n })\n }\n }\n }\n}\n\nclass TrailBlob {\n x: number\n y: number\n opacity: number\n decay: number\n nodes: Node[]\n maxReach: number = 60\n\n constructor(x: number, y: number) {\n this.x = x\n this.y = y\n this.opacity = 0.8\n this.decay = 0.03\n\n this.nodes = []\n const count = 2\n for (let i = 0; i < count; i++) {\n this.nodes.push({\n offsetX: (Math.random() - 0.5) * 10,\n offsetY: (Math.random() - 0.5) * 10,\n vx: (Math.random() - 0.5) * 1,\n vy: (Math.random() - 0.5) * 1,\n radius: 5 + Math.random() * 10,\n t: 0,\n })\n }\n }\n\n update() {\n this.opacity -= this.decay\n this.nodes.forEach((node) => {\n node.offsetX += node.vx\n node.offsetY += node.vy\n node.radius *= 0.95\n })\n }\n}\n\nconst GeometricFluidGrid: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n let animationFrameId: number\n let orbs: AnchoredBlob[] = []\n let trail: TrailBlob[] = []\n let mouse: MouseState = { x: -1000, y: -1000, lastX: -1000, lastY: -1000 }\n\n const initWorld = () => {\n orbs = []\n const w = canvas.width\n const h = canvas.height\n\n // 1. Top Right\n orbs.push(\n new AnchoredBlob({\n x: w - w * 0.15,\n y: h * 0.15,\n })\n )\n\n // 2. ~40% from top and ~40% from left\n orbs.push(\n new AnchoredBlob({\n x: w * 0.4,\n y: h * 0.4,\n })\n )\n\n // 3. Bottom Left\n orbs.push(\n new AnchoredBlob({\n x: w * 0.05 + 50,\n y: h - h * 0.15,\n })\n )\n\n // 4. Bottom Right\n orbs.push(\n new AnchoredBlob({\n x: w - w * 0.05 - 50,\n y: h - h * 0.05 - 50,\n })\n )\n }\n\n const resize = () => {\n const rect = canvas.getBoundingClientRect()\n canvas.width = rect.width\n canvas.height = rect.height\n initWorld()\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect()\n mouse.x = e.clientX - rect.left\n mouse.y = e.clientY - rect.top\n\n if (mouse.lastX === -1000) {\n mouse.lastX = mouse.x\n mouse.lastY = mouse.y\n }\n\n const dx = mouse.x - mouse.lastX\n const dy = mouse.y - mouse.lastY\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > 20) {\n trail.push(new TrailBlob(mouse.x, mouse.y))\n mouse.lastX = mouse.x\n mouse.lastY = mouse.y\n }\n }\n\n const handleResize = () => {\n resize()\n }\n\n const draw = () => {\n const w = canvas.width\n const h = canvas.height\n\n // Update Logic\n orbs.forEach((orb) => orb.update())\n for (let i = trail.length - 1; i >= 0; i--) {\n trail[i].update()\n if (trail[i].opacity <= 0) trail.splice(i, 1)\n }\n\n // Clear Screen\n ctx.fillStyle = \"#050505\"\n ctx.fillRect(0, 0, w, h)\n\n const renderList = [...orbs, ...trail]\n\n // Collect all glitch zones for easier checking inside the loop\n // We flat map them to a simple array to iterate quickly\n const allGlitches: GlitchZone[] = []\n orbs.forEach((o) => allGlitches.push(...o.glitchZones))\n\n for (let x = GAP / 2; x < w; x += GAP) {\n for (let y = GAP / 2; y < h; y += GAP) {\n // --- GLITCH CHECK ---\n // Check if this specific grid dot is inside a glitch zone\n let isGlitching = false\n for (const g of allGlitches) {\n // Simple AABB check\n if (x >= g.x && x <= g.x + g.w && y >= g.y && y <= g.y + g.h) {\n isGlitching = true\n break\n }\n }\n\n if (isGlitching) {\n // Glitched Dot: Bright\n // We use the grid itself to manifest the glitch\n ctx.fillStyle = \"rgba(182, 243, 191, 0.95)\"\n\n // Randomly skip some dots in the glitch line for a \"broken\" look\n if (Math.random() > 0.1) {\n const size = Math.random() > 0.5 ? MAX_SIZE * 0.7 : BASE_SIZE * 2\n ctx.beginPath()\n ctx.arc(x, y, size / 2, 0, Math.PI * 2)\n ctx.fill()\n }\n continue // Skip standard influence calculation for this dot\n }\n\n // --- STANDARD INFLUENCE CHECK ---\n let totalInfluence = 0\n\n // Optimization: Is near blob?\n let nearby = false\n for (const entity of renderList) {\n if (\n Math.abs(x - entity.x) < entity.maxReach &&\n Math.abs(y - entity.y) < entity.maxReach\n ) {\n nearby = true\n break\n }\n }\n\n if (!nearby) {\n // Passive Background Dot\n ctx.fillStyle = \"rgba(255, 255, 255, 0.03)\"\n ctx.fillRect(x - 0.5, y - 0.5, 1, 1)\n continue\n }\n\n // Calculate Influence\n for (const entity of renderList) {\n const dx = x - entity.x\n const dy = y - entity.y\n\n if (\n Math.abs(dx) > entity.maxReach ||\n Math.abs(dy) > entity.maxReach\n )\n continue\n\n let localInf = 0\n for (const node of entity.nodes) {\n const nx = dx - node.offsetX\n const ny = dy - node.offsetY\n const dist = Math.sqrt(nx * nx + ny * ny)\n localInf += getFalloff(dist, node.radius)\n }\n if (localInf > 1) localInf = 1\n totalInfluence += localInf * entity.opacity\n }\n\n if (totalInfluence > 1) totalInfluence = 1\n\n // Draw Cell\n if (totalInfluence > 0.01) {\n // Gradient: White (Edge) to Green (#B6F3BF - Center)\n const edgeR = 255,\n centerR = 182\n const edgeG = 255,\n centerG = 243\n const edgeB = 255,\n centerB = 191\n\n // Interpolate from White (0 influence) to Green (1 influence)\n const r = Math.floor(edgeR + (centerR - edgeR) * totalInfluence)\n const g = Math.floor(edgeG + (centerG - edgeG) * totalInfluence)\n const b = Math.floor(edgeB + (centerB - edgeB) * totalInfluence)\n\n const alpha = totalInfluence * 0.5\n const size = BASE_SIZE + totalInfluence * (MAX_SIZE - BASE_SIZE)\n\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha})`\n ctx.beginPath()\n ctx.arc(x, y, size / 2, 0, Math.PI * 2)\n ctx.fill()\n } else {\n ctx.fillStyle = \"rgba(255, 255, 255, 0.03)\"\n ctx.fillRect(x - 0.5, y - 0.5, 1, 1)\n }\n }\n }\n\n animationFrameId = requestAnimationFrame(draw)\n }\n\n window.addEventListener(\"resize\", handleResize)\n window.addEventListener(\"mousemove\", handleMouseMove)\n\n resize()\n draw()\n\n return () => {\n window.removeEventListener(\"resize\", handleResize)\n window.removeEventListener(\"mousemove\", handleMouseMove)\n cancelAnimationFrame(animationFrameId)\n }\n }, [])\n\n return (\n <canvas\n ref={canvasRef}\n className=\"fixed inset-0 -z-10 w-full h-full pointer-events-none\"\n />\n )\n}\n\nexport default GeometricFluidGrid\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{a as T}from"./chunk-S5TKCF6T.mjs";import b,{useState as M,useEffect as v,useMemo as w,useRef as d,Suspense as D}from"react";import{jsx as i,jsxs as F}from"react/jsx-runtime";var E="!<>-_\\/[]{}\u2014=+*^?#________",I=e=>e[Math.floor(Math.random()*e.length)],y=e=>{if(typeof e=="string"||typeof e=="number")return String(e);if(Array.isArray(e))return e.map(y).join("");if(b.isValidElement(e)){let r=e.props;return(r.text||"")+(r.label||"")+(r.title||"")+y(r.children)}return""},R=(e,r,c)=>{if(typeof e=="string"||typeof e=="number"){let n=String(e),o=[];for(let p=0;p<n.length;p++)o.push(r[c.current]||""),c.current++;return o}if(Array.isArray(e))return e.map(n=>R(n,r,c));if(b.isValidElement(e)){let n=e.props,o={...n,key:n.key||`node-${c.current}`};return n.children&&(o.children=R(n.children,r,c)),b.cloneElement(e,o)}return e},P=({children:e,className:r,duration:c=40,symbols:n=E,delay:o=0})=>{let[p,_]=M(null),[A,x]=M(!1),g=d(null),l=d(0),m=d([]),f=d(),N=w(()=>y(e),[e]),k=()=>{let a=[];for(let s=0;s<N.length;s++){let h=N[s],u=Math.floor(Math.random()*(c*.5)),t=u+Math.floor(Math.random()*(c*.5));a.push({to:h,start:u,end:t})}m.current=a,l.current=0,x(!1)},S=()=>{let a=0,s=[];for(let u=0;u<m.current.length;u++){let t=m.current[u];l.current>=t.end?(a++,s.push(t.to)):(l.current>=t.start&&(!t.char||Math.random()<.28)&&(t.char=I(n)),s.push(F("span",{className:"relative inline-block",children:[i("span",{className:"invisible select-none","aria-hidden":"true",children:t.to===" "?"\xA0":t.to}),l.current>=t.start&&i("span",{className:"absolute inset-0 flex items-center justify-center opacity-50 font-mono text-[1em] leading-none",children:t.char})]},u)))}_(R(e,s,{current:0})),a===m.current.length?x(!0):(l.current++,f.current=requestAnimationFrame(S))};return v(()=>{let a=new IntersectionObserver(s=>{if(s[0].isIntersecting){let h=setTimeout(()=>{k(),f.current=requestAnimationFrame(S)},o);return()=>clearTimeout(h)}},{threshold:.1});return g.current&&a.observe(g.current),()=>{a.disconnect(),f.current&&cancelAnimationFrame(f.current)}},[N,o]),i("span",{ref:g,className:T("inline-block whitespace-pre-wrap",r),children:A?e:p})};function q(e){return i(D,{fallback:i("span",{className:"invisible",children:e.children}),children:i(P,{...e})})}export{q as a};
3
+ //# sourceMappingURL=chunk-NLKTP7EJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/TextDecoder.tsx"],"sourcesContent":["\"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\nconst SYMBOLS = \"!<>-_\\\\/[]{}—=+*^?#________\"\n\nconst randomChar = (symbols: string) =>\n symbols[Math.floor(Math.random() * symbols.length)]\n\nconst extractText = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node)\n if (Array.isArray(node)) return node.map(extractText).join(\"\")\n if (React.isValidElement(node)) {\n const props = node.props as any\n return (\n (props.text || \"\") +\n (props.label || \"\") +\n (props.title || \"\") +\n extractText(props.children)\n )\n }\n return \"\"\n}\n\nconst injectScrambledText = (\n node: ReactNode,\n scrambledChars: (string | ReactNode)[],\n indexObj: { current: number }\n): ReactNode => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const text = String(node)\n const result: (string | ReactNode)[] = []\n for (let i = 0; i < text.length; i++) {\n result.push(scrambledChars[indexObj.current] || \"\")\n indexObj.current++\n }\n return result\n }\n\n if (Array.isArray(node)) {\n return node.map((child) =>\n injectScrambledText(child, scrambledChars, indexObj)\n )\n }\n\n if (React.isValidElement(node)) {\n const props = node.props as any\n const newProps = { ...props, key: props.key || `node-${indexObj.current}` }\n\n if (props.children) {\n newProps.children = injectScrambledText(\n props.children,\n scrambledChars,\n indexObj\n )\n }\n return React.cloneElement(node, newProps)\n }\n return node\n}\n\nexport interface TextDecoderProps {\n children: ReactNode\n className?: string\n duration?: number\n symbols?: string\n delay?: number\n}\n\nconst TextDecoder = ({\n children,\n className,\n duration = 40,\n symbols = SYMBOLS,\n delay = 0,\n}: TextDecoderProps) => {\n const [outputNodes, setOutputNodes] = useState<ReactNode>(null)\n const [isComplete, setIsComplete] = useState(false)\n const elementRef = useRef<HTMLSpanElement>(null)\n const frameRef = useRef(0)\n const queueRef = useRef<\n { to: string; start: number; end: number; char?: string }[]\n >([])\n const rafRef = useRef<number>()\n\n const fullText = useMemo(() => extractText(children), [children])\n\n const setupQueue = () => {\n const newQueue = []\n for (let i = 0; i < fullText.length; i++) {\n const to = fullText[i]\n // Every character starts within the first 50% of duration\n // and resolves within the second 50%\n const start = Math.floor(Math.random() * (duration * 0.5))\n const end = start + Math.floor(Math.random() * (duration * 0.5))\n newQueue.push({ to, start, end })\n }\n queueRef.current = newQueue\n frameRef.current = 0\n setIsComplete(false)\n }\n\n const update = () => {\n let complete = 0\n const currentScrambledChars: (string | ReactNode)[] = []\n\n for (let i = 0; i < queueRef.current.length; i++) {\n const item = queueRef.current[i]\n\n if (frameRef.current >= item.end) {\n // Animation finished for this letter\n complete++\n currentScrambledChars.push(item.to)\n } else {\n // Character is either waiting (invisible ghost) or scrambling\n if (frameRef.current >= item.start) {\n if (!item.char || Math.random() < 0.28) {\n item.char = randomChar(symbols)\n }\n }\n\n currentScrambledChars.push(\n <span key={i} className=\"relative inline-block\">\n {/* The Ghost: Locks the exact width/height of the specific character */}\n <span className=\"invisible select-none\" aria-hidden=\"true\">\n {item.to === \" \" ? \"\\u00A0\" : item.to}\n </span>\n {/* The Scramble: Overlays the ghost without affecting document flow */}\n {frameRef.current >= item.start && (\n <span className=\"absolute inset-0 flex items-center justify-center opacity-50 font-mono text-[1em] leading-none\">\n {item.char}\n </span>\n )}\n </span>\n )\n }\n }\n\n const indexObj = { current: 0 }\n setOutputNodes(\n injectScrambledText(children, currentScrambledChars, indexObj)\n )\n\n if (complete === queueRef.current.length) {\n setIsComplete(true)\n } else {\n frameRef.current++\n rafRef.current = requestAnimationFrame(update)\n }\n }\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n const timeoutId = setTimeout(() => {\n setupQueue()\n rafRef.current = requestAnimationFrame(update)\n }, delay)\n return () => clearTimeout(timeoutId)\n }\n },\n { threshold: 0.1 }\n )\n\n if (elementRef.current) observer.observe(elementRef.current)\n\n return () => {\n observer.disconnect()\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n }\n }, [fullText, delay])\n\n return (\n <span\n ref={elementRef}\n className={cn(\"inline-block whitespace-pre-wrap\", className)}\n >\n {isComplete ? children : outputNodes}\n </span>\n )\n}\n\nexport default function SuspenseDecodedText(props: TextDecoderProps) {\n return (\n <Suspense fallback={<span className=\"invisible\">{props.children}</span>}>\n <TextDecoder {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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","names":["React","useState","useEffect","useMemo","useRef","Suspense","jsx","jsxs","SYMBOLS","randomChar","symbols","extractText","node","props","injectScrambledText","scrambledChars","indexObj","text","result","i","child","newProps","TextDecoder","children","className","duration","delay","outputNodes","setOutputNodes","isComplete","setIsComplete","elementRef","frameRef","queueRef","rafRef","fullText","setupQueue","newQueue","to","start","end","update","complete","currentScrambledChars","item","observer","entries","timeoutId","cn","SuspenseDecodedText"]}
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use client";
2
+ var _chunkFUYXCJOQjs = require('./chunk-FUYXCJOQ.js');var _react = require('react'); var _react2 = _interopRequireDefault(_react);var _jsxruntime = require('react/jsx-runtime');var E="!<>-_\\/[]{}\u2014=+*^?#________",I=e=>e[Math.floor(Math.random()*e.length)],y=e=>{if(typeof e=="string"||typeof e=="number")return String(e);if(Array.isArray(e))return e.map(y).join("");if(_react2.default.isValidElement(e)){let r=e.props;return(r.text||"")+(r.label||"")+(r.title||"")+y(r.children)}return""},R=(e,r,c)=>{if(typeof e=="string"||typeof e=="number"){let n=String(e),o=[];for(let p=0;p<n.length;p++)o.push(r[c.current]||""),c.current++;return o}if(Array.isArray(e))return e.map(n=>R(n,r,c));if(_react2.default.isValidElement(e)){let n=e.props,o={...n,key:n.key||`node-${c.current}`};return n.children&&(o.children=R(n.children,r,c)),_react2.default.cloneElement(e,o)}return e},P=({children:e,className:r,duration:c=40,symbols:n=E,delay:o=0})=>{let[p,_]=_react.useState.call(void 0, null),[A,x]=_react.useState.call(void 0, !1),g=_react.useRef.call(void 0, null),l=_react.useRef.call(void 0, 0),m=_react.useRef.call(void 0, []),f=_react.useRef.call(void 0, ),N=_react.useMemo.call(void 0, ()=>y(e),[e]),k=()=>{let a=[];for(let s=0;s<N.length;s++){let h=N[s],u=Math.floor(Math.random()*(c*.5)),t=u+Math.floor(Math.random()*(c*.5));a.push({to:h,start:u,end:t})}m.current=a,l.current=0,x(!1)},S=()=>{let a=0,s=[];for(let u=0;u<m.current.length;u++){let t=m.current[u];l.current>=t.end?(a++,s.push(t.to)):(l.current>=t.start&&(!t.char||Math.random()<.28)&&(t.char=I(n)),s.push(_jsxruntime.jsxs.call(void 0, "span",{className:"relative inline-block",children:[_jsxruntime.jsx.call(void 0, "span",{className:"invisible select-none","aria-hidden":"true",children:t.to===" "?"\xA0":t.to}),l.current>=t.start&&_jsxruntime.jsx.call(void 0, "span",{className:"absolute inset-0 flex items-center justify-center opacity-50 font-mono text-[1em] leading-none",children:t.char})]},u)))}_(R(e,s,{current:0})),a===m.current.length?x(!0):(l.current++,f.current=requestAnimationFrame(S))};return _react.useEffect.call(void 0, ()=>{let a=new IntersectionObserver(s=>{if(s[0].isIntersecting){let h=setTimeout(()=>{k(),f.current=requestAnimationFrame(S)},o);return()=>clearTimeout(h)}},{threshold:.1});return g.current&&a.observe(g.current),()=>{a.disconnect(),f.current&&cancelAnimationFrame(f.current)}},[N,o]),_jsxruntime.jsx.call(void 0, "span",{ref:g,className:_chunkFUYXCJOQjs.a.call(void 0, "inline-block whitespace-pre-wrap",r),children:A?e:p})};function q(e){return _jsxruntime.jsx.call(void 0, _react.Suspense,{fallback:_jsxruntime.jsx.call(void 0, "span",{className:"invisible",children:e.children}),children:_jsxruntime.jsx.call(void 0, P,{...e})})}exports.a = q;
3
+ //# sourceMappingURL=chunk-NZDJHFEG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-NZDJHFEG.js","../src/components/TextDecoder.tsx"],"names":["SYMBOLS","randomChar","symbols","extractText","node","React","props","injectScrambledText","scrambledChars","indexObj","text","result","i","child","newProps"],"mappings":"AAAA,qLAAY;AACZ,sDAAuC,4ECQhC,+CAwHG,IAtHJA,CAAAA,CAAU,kCAAA,CAEVC,CAAAA,CAAcC,CAAAA,EAClBA,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,CAAA,CAAIA,CAAAA,CAAQ,MAAM,CAAC,CAAA,CAE9CC,CAAAA,CAAeC,CAAAA,EAA4B,CAC/C,EAAA,CAAI,OAAOA,CAAAA,EAAS,QAAA,EAAY,OAAOA,CAAAA,EAAS,QAAA,CAAU,OAAO,MAAA,CAAOA,CAAI,CAAA,CAC5E,EAAA,CAAI,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,CAAG,OAAOA,CAAAA,CAAK,GAAA,CAAID,CAAW,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAC7D,EAAA,CAAIE,eAAAA,CAAM,cAAA,CAAeD,CAAI,CAAA,CAAG,CAC9B,IAAME,CAAAA,CAAQF,CAAAA,CAAK,KAAA,CACnB,MAAA,CACGE,CAAAA,CAAM,IAAA,EAAQ,EAAA,CAAA,CAAA,CACdA,CAAAA,CAAM,KAAA,EAAS,EAAA,CAAA,CAAA,CACfA,CAAAA,CAAM,KAAA,EAAS,EAAA,CAAA,CAChBH,CAAAA,CAAYG,CAAAA,CAAM,QAAQ,CAE9B,CACA,MAAO,EACT,CAAA,CAEMC,CAAAA,CAAsB,CAC1BH,CAAAA,CACAI,CAAAA,CACAC,CAAAA,CAAAA,EACc,CACd,EAAA,CAAI,OAAOL,CAAAA,EAAS,QAAA,EAAY,OAAOA,CAAAA,EAAS,QAAA,CAAU,CACxD,IAAMM,CAAAA,CAAO,MAAA,CAAON,CAAI,CAAA,CAClBO,CAAAA,CAAiC,CAAC,CAAA,CACxC,GAAA,CAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAK,MAAA,CAAQE,CAAAA,EAAAA,CAC/BD,CAAAA,CAAO,IAAA,CAAKH,CAAAA,CAAeC,CAAAA,CAAS,OAAO,CAAA,EAAK,EAAE,CAAA,CAClDA,CAAAA,CAAS,OAAA,EAAA,CAEX,OAAOE,CACT,CAEA,EAAA,CAAI,KAAA,CAAM,OAAA,CAAQP,CAAI,CAAA,CACpB,OAAOA,CAAAA,CAAK,GAAA,CAAKS,CAAAA,EACfN,CAAAA,CAAoBM,CAAAA,CAAOL,CAAAA,CAAgBC,CAAQ,CACrD,CAAA,CAGF,EAAA,CAAIJ,eAAAA,CAAM,cAAA,CAAeD,CAAI,CAAA,CAAG,CAC9B,IAAME,CAAAA,CAAQF,CAAAA,CAAK,KAAA,CACbU,CAAAA,CAAW,CAAE,GAAGR,CAAAA,CAAO,GAAA,CAAKA,CAAAA,CAAM,GAAA,EAAO,CAAA,KAAA,EAAQG,CAAAA,CAAS,OAAO,CAAA,CAAA","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-NZDJHFEG.js","sourcesContent":[null,"\"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\nconst SYMBOLS = \"!<>-_\\\\/[]{}—=+*^?#________\"\n\nconst randomChar = (symbols: string) =>\n symbols[Math.floor(Math.random() * symbols.length)]\n\nconst extractText = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node)\n if (Array.isArray(node)) return node.map(extractText).join(\"\")\n if (React.isValidElement(node)) {\n const props = node.props as any\n return (\n (props.text || \"\") +\n (props.label || \"\") +\n (props.title || \"\") +\n extractText(props.children)\n )\n }\n return \"\"\n}\n\nconst injectScrambledText = (\n node: ReactNode,\n scrambledChars: (string | ReactNode)[],\n indexObj: { current: number }\n): ReactNode => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const text = String(node)\n const result: (string | ReactNode)[] = []\n for (let i = 0; i < text.length; i++) {\n result.push(scrambledChars[indexObj.current] || \"\")\n indexObj.current++\n }\n return result\n }\n\n if (Array.isArray(node)) {\n return node.map((child) =>\n injectScrambledText(child, scrambledChars, indexObj)\n )\n }\n\n if (React.isValidElement(node)) {\n const props = node.props as any\n const newProps = { ...props, key: props.key || `node-${indexObj.current}` }\n\n if (props.children) {\n newProps.children = injectScrambledText(\n props.children,\n scrambledChars,\n indexObj\n )\n }\n return React.cloneElement(node, newProps)\n }\n return node\n}\n\nexport interface TextDecoderProps {\n children: ReactNode\n className?: string\n duration?: number\n symbols?: string\n delay?: number\n}\n\nconst TextDecoder = ({\n children,\n className,\n duration = 40,\n symbols = SYMBOLS,\n delay = 0,\n}: TextDecoderProps) => {\n const [outputNodes, setOutputNodes] = useState<ReactNode>(null)\n const [isComplete, setIsComplete] = useState(false)\n const elementRef = useRef<HTMLSpanElement>(null)\n const frameRef = useRef(0)\n const queueRef = useRef<\n { to: string; start: number; end: number; char?: string }[]\n >([])\n const rafRef = useRef<number>()\n\n const fullText = useMemo(() => extractText(children), [children])\n\n const setupQueue = () => {\n const newQueue = []\n for (let i = 0; i < fullText.length; i++) {\n const to = fullText[i]\n // Every character starts within the first 50% of duration\n // and resolves within the second 50%\n const start = Math.floor(Math.random() * (duration * 0.5))\n const end = start + Math.floor(Math.random() * (duration * 0.5))\n newQueue.push({ to, start, end })\n }\n queueRef.current = newQueue\n frameRef.current = 0\n setIsComplete(false)\n }\n\n const update = () => {\n let complete = 0\n const currentScrambledChars: (string | ReactNode)[] = []\n\n for (let i = 0; i < queueRef.current.length; i++) {\n const item = queueRef.current[i]\n\n if (frameRef.current >= item.end) {\n // Animation finished for this letter\n complete++\n currentScrambledChars.push(item.to)\n } else {\n // Character is either waiting (invisible ghost) or scrambling\n if (frameRef.current >= item.start) {\n if (!item.char || Math.random() < 0.28) {\n item.char = randomChar(symbols)\n }\n }\n\n currentScrambledChars.push(\n <span key={i} className=\"relative inline-block\">\n {/* The Ghost: Locks the exact width/height of the specific character */}\n <span className=\"invisible select-none\" aria-hidden=\"true\">\n {item.to === \" \" ? \"\\u00A0\" : item.to}\n </span>\n {/* The Scramble: Overlays the ghost without affecting document flow */}\n {frameRef.current >= item.start && (\n <span className=\"absolute inset-0 flex items-center justify-center opacity-50 font-mono text-[1em] leading-none\">\n {item.char}\n </span>\n )}\n </span>\n )\n }\n }\n\n const indexObj = { current: 0 }\n setOutputNodes(\n injectScrambledText(children, currentScrambledChars, indexObj)\n )\n\n if (complete === queueRef.current.length) {\n setIsComplete(true)\n } else {\n frameRef.current++\n rafRef.current = requestAnimationFrame(update)\n }\n }\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n const timeoutId = setTimeout(() => {\n setupQueue()\n rafRef.current = requestAnimationFrame(update)\n }, delay)\n return () => clearTimeout(timeoutId)\n }\n },\n { threshold: 0.1 }\n )\n\n if (elementRef.current) observer.observe(elementRef.current)\n\n return () => {\n observer.disconnect()\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n }\n }, [fullText, delay])\n\n return (\n <span\n ref={elementRef}\n className={cn(\"inline-block whitespace-pre-wrap\", className)}\n >\n {isComplete ? children : outputNodes}\n </span>\n )\n}\n\nexport default function SuspenseDecodedText(props: TextDecoderProps) {\n return (\n <Suspense fallback={<span className=\"invisible\">{props.children}</span>}>\n <TextDecoder {...props} />\n </Suspense>\n )\n}\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{a as M}from"./chunk-S5TKCF6T.mjs";import v from"next/link";import x,{useState as _,useEffect as E,useRef as b,isValidElement as k,useMemo as q}from"react";import{Slot as w}from"@radix-ui/react-slot";import{jsx as s,jsxs as P}from"react/jsx-runtime";var C="!<>-_\\/[]{}\u2014=+*^?#________",G=({href:L,children:a,symbols:u=C,className:N,asChild:R=!1,duration:m=40,...A})=>{let[i,l]=_(!1),[f,c]=_(0),r=b(),p=b([]),h=e=>typeof e=="string"||typeof e=="number"?String(e):k(e)&&e.props.children?h(e.props.children):"",o=q(()=>h(a),[a]),F=()=>{let e=[];for(let t=0;t<o.length;t++){let n=o[t],y=Math.floor(Math.random()*(m*.5)),S=y+Math.floor(Math.random()*(m*.5));e.push({to:n,start:y,end:S})}p.current=e,c(0)};E(()=>{if(i&&o){F();let e=()=>{c(t=>t+1),r.current=requestAnimationFrame(e)};r.current=requestAnimationFrame(e)}else r.current&&cancelAnimationFrame(r.current),c(0);return()=>{r.current&&cancelAnimationFrame(r.current)}},[i,o]);let g=()=>o.split("").map((e,t)=>{let n=p.current[t];return!i||!n||f>=n.end?s("span",{children:e},t):f>=n.start?((!n.char||Math.random()<.28)&&(n.char=u[Math.floor(Math.random()*u.length)]),P("span",{className:"relative inline-block",children:[s("span",{className:"invisible opacity-0","aria-hidden":"true",children:e===" "?"\xA0":e}),s("span",{className:"absolute inset-0 flex items-center justify-center font-mono opacity-50",children:n.char})]},t)):s("span",{children:e},t)}),d={className:M("inline-flex items-center justify-center whitespace-nowrap",N),onMouseEnter:()=>l(!0),onMouseLeave:()=>l(!1),...A};return R&&k(a)?s(w,{...d,children:x.cloneElement(a,{},g())}):s(v,{href:L||"#",...d,children:g()})},D=G;export{C as a,D as b};
3
+ //# sourceMappingURL=chunk-P7ACUHYG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/GlitchLink.tsx"],"sourcesContent":["\"use client\"\nimport Link from \"next/link\"\nimport React, {\n useState,\n useEffect,\n useRef,\n ReactNode,\n isValidElement,\n useMemo,\n} from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cn } from \"@/lib/utils\"\n\nexport const DEFAULT_SYMBOLS = \"!<>-_\\\\/[]{}—=+*^?#________\"\n\ntype GlitchLinkProps = {\n href?: string\n children: ReactNode\n symbols?: string\n className?: string\n asChild?: boolean\n duration?: number\n}\n\nconst GlitchLink = ({\n href,\n children,\n symbols = DEFAULT_SYMBOLS,\n className,\n asChild = false,\n duration = 40,\n ...props\n}: GlitchLinkProps) => {\n const [isHovering, setIsHovering] = useState(false)\n const [frame, setFrame] = useState(0)\n const rafRef = useRef<number>()\n const queueRef = useRef<\n { to: string; start: number; end: number; char?: string }[]\n >([])\n\n const getTextContent = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\")\n return String(node)\n if (isValidElement(node) && node.props.children)\n return getTextContent(node.props.children)\n return \"\"\n }\n\n const originalText = useMemo(() => getTextContent(children), [children])\n\n const setupQueue = () => {\n const newQueue = []\n for (let i = 0; i < originalText.length; i++) {\n const to = originalText[i]\n const start = Math.floor(Math.random() * (duration * 0.5))\n const end = start + Math.floor(Math.random() * (duration * 0.5))\n newQueue.push({ to, start, end })\n }\n queueRef.current = newQueue\n setFrame(0)\n }\n\n useEffect(() => {\n if (isHovering && originalText) {\n setupQueue()\n const update = () => {\n setFrame((prev) => prev + 1)\n rafRef.current = requestAnimationFrame(update)\n }\n rafRef.current = requestAnimationFrame(update)\n } else {\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n setFrame(0)\n }\n return () => {\n if (rafRef.current) cancelAnimationFrame(rafRef.current)\n }\n }, [isHovering, originalText])\n\n const renderContent = () => {\n return originalText.split(\"\").map((char, i) => {\n const item = queueRef.current[i]\n\n // If not hovering, or animation for this char hasn't started, or it's finished\n if (!isHovering || !item || frame >= item.end) {\n return <span key={i}>{char}</span>\n }\n\n // If we are in the scrambling phase for this specific character\n if (frame >= item.start) {\n if (!item.char || Math.random() < 0.28) {\n item.char = symbols[Math.floor(Math.random() * symbols.length)]\n }\n return (\n <span key={i} className=\"relative inline-block\">\n {/* The invisible real character preserves the exact width */}\n <span className=\"invisible opacity-0\" aria-hidden=\"true\">\n {char === \" \" ? \"\\u00A0\" : char}\n </span>\n {/* The absolute symbol sits exactly on top of that width */}\n <span className=\"absolute inset-0 flex items-center justify-center font-mono opacity-50\">\n {item.char}\n </span>\n </span>\n )\n }\n\n // Default: show original character\n return <span key={i}>{char}</span>\n })\n }\n\n const commonProps = {\n className: cn(\n \"inline-flex items-center justify-center whitespace-nowrap\",\n className\n ),\n onMouseEnter: () => setIsHovering(true),\n onMouseLeave: () => setIsHovering(false),\n ...props,\n }\n\n if (asChild && isValidElement(children)) {\n return (\n <Slot {...commonProps}>\n {React.cloneElement(children as any, {}, renderContent())}\n </Slot>\n )\n }\n\n return (\n <Link href={href || \"#\"} {...commonProps}>\n {renderContent()}\n </Link>\n )\n}\n\nexport default GlitchLink\n"],"mappings":"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","names":["Link","React","useState","useEffect","useRef","isValidElement","useMemo","Slot","jsx","jsxs","DEFAULT_SYMBOLS","GlitchLink","href","children","symbols","className","asChild","duration","props","isHovering","setIsHovering","useState","frame","setFrame","rafRef","useRef","queueRef","getTextContent","node","isValidElement","originalText","useMemo","setupQueue","newQueue","i","to","start","end","useEffect","update","prev","renderContent","char","item","commonProps","cn","Slot","React","Link","GlitchLink_default"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{a as r}from"./chunk-KPAOPUY2.mjs";import{useEffect as k,useRef as N}from"react";import{jsx as _}from"react/jsx-runtime";var x=14,S=1,F=5,$=(b,t)=>{if(b<t){let e=1-b/t;return e*e*(3-2*e)}return 0},v=class{constructor(t){r(this,"x",0);r(this,"y",0);r(this,"anchorX",0);r(this,"anchorY",0);r(this,"vx",0);r(this,"vy",0);r(this,"nodes",[]);r(this,"opacity",0);r(this,"glitchZones",[]);r(this,"maxReach",180);this.anchorX=t.x,this.anchorY=t.y,this.x=this.anchorX,this.y=this.anchorY,this.init()}init(){this.nodes=[];let t=3+Math.floor(Math.random()*3);for(let e=0;e<t;e++){let d=15+Math.random()*25,h=(Math.random()-.5)*60,u=(Math.random()-.5)*60;this.nodes.push({offsetX:h,offsetY:u,vx:(Math.random()-.5)*.1,vy:(Math.random()-.5)*.1,radius:d,t:Math.random()*100})}this.opacity=1}update(){let t=this.anchorX-this.x,e=this.anchorY-this.y,d=5e-4,h=t*d,u=e*d,a=(Math.random()-.5)*.01,Y=(Math.random()-.5)*.01;if(this.vx+=h+a,this.vy+=u+Y,this.vx*=.96,this.vy*=.96,this.x+=this.vx,this.y+=this.vy,this.nodes.forEach(s=>{s.t+=.005,s.offsetX+=Math.sin(s.t)*.1+s.vx,s.offsetY+=Math.cos(s.t*.9)*.1+s.vy;let m=70;(s.offsetX>m||s.offsetX<-m)&&(s.vx*=-1),(s.offsetY>m||s.offsetY<-m)&&(s.vy*=-1),s.radius+=Math.sin(s.t*2)*.1}),this.glitchZones=this.glitchZones.filter(s=>s.life>0),this.glitchZones.forEach(s=>s.life--),Math.random()<.03){let m=f=>Math.round((f-x/2)/x)*x+x/2,p=this.x+(Math.random()-.5)*80,w=this.y+(Math.random()-.5)*80,i=m(p),c=m(w);if((Math.random()>.6?"line":"dot")==="line"){let f=Math.random()>.5,n=40+Math.random()*80,l=2;this.glitchZones.push({x:f?i-l/2:i-n/2,y:f?c-n/2:c-l/2,w:f?l:n,h:f?n:l,life:8+Math.random()*12})}else this.glitchZones.push({x:i-4/2,y:c-4/2,w:4,h:4,life:6+Math.random()*10})}}},B=class{constructor(t,e){r(this,"x");r(this,"y");r(this,"opacity");r(this,"decay");r(this,"nodes");r(this,"maxReach",60);this.x=t,this.y=e,this.opacity=.8,this.decay=.03,this.nodes=[];let d=2;for(let h=0;h<d;h++)this.nodes.push({offsetX:(Math.random()-.5)*10,offsetY:(Math.random()-.5)*10,vx:(Math.random()-.5)*1,vy:(Math.random()-.5)*1,radius:5+Math.random()*10,t:0})}update(){this.opacity-=this.decay,this.nodes.forEach(t=>{t.offsetX+=t.vx,t.offsetY+=t.vy,t.radius*=.95})}},q=()=>{let b=N(null);return k(()=>{let t=b.current;if(!t)return;let e=t.getContext("2d");if(!e)return;let d,h=[],u=[],a={x:-1e3,y:-1e3,lastX:-1e3,lastY:-1e3},Y=()=>{h=[];let i=t.width,c=t.height;h.push(new v({x:i-i*.15,y:c*.15})),h.push(new v({x:i*.4,y:c*.4})),h.push(new v({x:i*.05+50,y:c-c*.15})),h.push(new v({x:i-i*.05-50,y:c-c*.05-50}))},s=()=>{let i=t.getBoundingClientRect();t.width=i.width,t.height=i.height,Y()},m=i=>{let c=t.getBoundingClientRect();a.x=i.clientX-c.left,a.y=i.clientY-c.top,a.lastX===-1e3&&(a.lastX=a.x,a.lastY=a.y);let M=a.x-a.lastX,f=a.y-a.lastY;Math.sqrt(M*M+f*f)>20&&(u.push(new B(a.x,a.y)),a.lastX=a.x,a.lastY=a.y)},p=()=>{s()},w=()=>{let i=t.width,c=t.height;h.forEach(n=>n.update());for(let n=u.length-1;n>=0;n--)u[n].update(),u[n].opacity<=0&&u.splice(n,1);e.fillStyle="#050505",e.fillRect(0,0,i,c);let M=[...h,...u],f=[];h.forEach(n=>f.push(...n.glitchZones));for(let n=x/2;n<i;n+=x)for(let l=x/2;l<c;l+=x){let C=!1;for(let o of f)if(n>=o.x&&n<=o.x+o.w&&l>=o.y&&l<=o.y+o.h){C=!0;break}if(C){if(e.fillStyle="rgba(182, 243, 191, 0.95)",Math.random()>.1){let o=Math.random()>.5?F*.7:S*2;e.beginPath(),e.arc(n,l,o/2,0,Math.PI*2),e.fill()}continue}let y=0,I=!1;for(let o of M)if(Math.abs(n-o.x)<o.maxReach&&Math.abs(l-o.y)<o.maxReach){I=!0;break}if(!I){e.fillStyle="rgba(255, 255, 255, 0.03)",e.fillRect(n-.5,l-.5,1,1);continue}for(let o of M){let E=n-o.x,G=l-o.y;if(Math.abs(E)>o.maxReach||Math.abs(G)>o.maxReach)continue;let g=0;for(let R of o.nodes){let z=E-R.offsetX,X=G-R.offsetY,Z=Math.sqrt(z*z+X*X);g+=$(Z,R.radius)}g>1&&(g=1),y+=g*o.opacity}if(y>1&&(y=1),y>.01){let X=Math.floor(255+-73*y),Z=Math.floor(255+-12*y),L=Math.floor(255+-64*y),A=y*.5,P=S+y*(F-S);e.fillStyle=`rgba(${X}, ${Z}, ${L}, ${A})`,e.beginPath(),e.arc(n,l,P/2,0,Math.PI*2),e.fill()}else e.fillStyle="rgba(255, 255, 255, 0.03)",e.fillRect(n-.5,l-.5,1,1)}d=requestAnimationFrame(w)};return window.addEventListener("resize",p),window.addEventListener("mousemove",m),s(),w(),()=>{window.removeEventListener("resize",p),window.removeEventListener("mousemove",m),cancelAnimationFrame(d)}},[]),_("canvas",{ref:b,className:"fixed inset-0 -z-10 w-full h-full pointer-events-none"})},T=q;export{T as a};
3
+ //# sourceMappingURL=chunk-RTHCEJYC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/GeometricFluidGrid.tsx"],"sourcesContent":["\"use client\"\nimport React, { useEffect, useRef } from \"react\"\n\n// --- CONFIGURATION ---\nconst GAP = 14\nconst BASE_SIZE = 1\nconst MAX_SIZE = 5\n\n// --- TYPES ---\ninterface Node {\n offsetX: number\n offsetY: number\n vx: number\n vy: number\n radius: number\n t: number\n}\n\ninterface GlitchZone {\n x: number\n y: number\n w: number\n h: number\n life: number\n}\n\ninterface MouseState {\n x: number\n y: number\n lastX: number\n lastY: number\n}\n\n// --- MATH HELPERS ---\nconst getFalloff = (dist: number, radius: number): number => {\n if (dist < radius) {\n const val = 1 - dist / radius\n return val * val * (3 - 2 * val)\n }\n return 0\n}\n\n// --- CLASSES ---\nclass AnchoredBlob {\n // Current Position\n x: number = 0\n y: number = 0\n\n // Anchor Position (Home base)\n anchorX: number = 0\n anchorY: number = 0\n\n // Movement\n vx: number = 0\n vy: number = 0\n\n // Appearance\n nodes: Node[] = []\n opacity: number = 0\n\n // Glitch State\n glitchZones: GlitchZone[] = []\n maxReach: number = 180\n\n constructor(anchorConfig: { x: number; y: number }) {\n this.anchorX = anchorConfig.x\n this.anchorY = anchorConfig.y\n this.x = this.anchorX\n this.y = this.anchorY\n this.init()\n }\n\n init() {\n // 1. Create Internal Nodes (The \"Blob\" composition)\n this.nodes = []\n const nodeCount = 3 + Math.floor(Math.random() * 3) // 3 to 5 nodes\n\n for (let i = 0; i < nodeCount; i++) {\n // Significantly smaller radius (15-40px) to reduce central bulk\n const r = 15 + Math.random() * 25\n // Wider initial spread\n const ox = (Math.random() - 0.5) * 60\n const oy = (Math.random() - 0.5) * 60\n\n this.nodes.push({\n offsetX: ox,\n offsetY: oy,\n vx: (Math.random() - 0.5) * 0.1, // Slower internal movement (was 0.4)\n vy: (Math.random() - 0.5) * 0.1,\n radius: r,\n t: Math.random() * 100,\n })\n }\n\n this.opacity = 1\n }\n\n update() {\n // --- 1. Tethered Movement Logic ---\n const dx = this.anchorX - this.x\n const dy = this.anchorY - this.y\n\n // Spring constant (very loose)\n const k = 0.0005\n const ax = dx * k\n const ay = dy * k\n\n // Random wandering force - Reduced significantly for slower drift\n const wx = (Math.random() - 0.5) * 0.01 // was 0.05\n const wy = (Math.random() - 0.5) * 0.01 // was 0.05\n\n this.vx += ax + wx\n this.vy += ay + wy\n\n this.vx *= 0.96\n this.vy *= 0.96\n\n this.x += this.vx\n this.y += this.vy\n\n // --- 2. Internal Node Animation ---\n this.nodes.forEach((node) => {\n // Slow down time step\n node.t += 0.005 // was 0.02\n\n // Slower oscillation and movement\n node.offsetX += Math.sin(node.t) * 0.1 + node.vx // amp was 0.4\n node.offsetY += Math.cos(node.t * 0.9) * 0.1 + node.vy\n\n // Constrain to \"nucleus\"\n const maxDist = 70\n if (node.offsetX > maxDist || node.offsetX < -maxDist) node.vx *= -1\n if (node.offsetY > maxDist || node.offsetY < -maxDist) node.vy *= -1\n\n // Pulse size\n node.radius += Math.sin(node.t * 2) * 0.1\n })\n\n // --- 3. Manage Glitch Zones ---\n // Remove dead glitches\n this.glitchZones = this.glitchZones.filter((g) => g.life > 0)\n this.glitchZones.forEach((g) => g.life--)\n\n // Randomly spawn new glitches\n if (Math.random() < 0.03) {\n // 3% chance per frame\n const spread = 80\n\n // Snap random positions to exact grid points to ensure clean lines\n const snap = (v: number) =>\n Math.round((v - GAP / 2) / GAP) * GAP + GAP / 2\n\n const rawCx = this.x + (Math.random() - 0.5) * spread\n const rawCy = this.y + (Math.random() - 0.5) * spread\n\n const cx = snap(rawCx)\n const cy = snap(rawCy)\n\n const type = Math.random() > 0.6 ? \"line\" : \"dot\"\n\n if (type === \"line\") {\n const isVert = Math.random() > 0.5\n // Medium length: 40-120px\n const len = 40 + Math.random() * 80\n\n // Thickness is essentially zero (just a sliver) centered on the grid line\n // to guarantee we only pick up exactly one row/column of dots\n const thickness = 2\n\n this.glitchZones.push({\n x: isVert ? cx - thickness / 2 : cx - len / 2,\n y: isVert ? cy - len / 2 : cy - thickness / 2,\n w: isVert ? thickness : len,\n h: isVert ? len : thickness,\n life: 8 + Math.random() * 12,\n })\n } else {\n // Single dot\n // Box just large enough to catch one grid point\n const size = 4\n\n this.glitchZones.push({\n x: cx - size / 2,\n y: cy - size / 2,\n w: size,\n h: size,\n life: 6 + Math.random() * 10,\n })\n }\n }\n }\n}\n\nclass TrailBlob {\n x: number\n y: number\n opacity: number\n decay: number\n nodes: Node[]\n maxReach: number = 60\n\n constructor(x: number, y: number) {\n this.x = x\n this.y = y\n this.opacity = 0.8\n this.decay = 0.03\n\n this.nodes = []\n const count = 2\n for (let i = 0; i < count; i++) {\n this.nodes.push({\n offsetX: (Math.random() - 0.5) * 10,\n offsetY: (Math.random() - 0.5) * 10,\n vx: (Math.random() - 0.5) * 1,\n vy: (Math.random() - 0.5) * 1,\n radius: 5 + Math.random() * 10,\n t: 0,\n })\n }\n }\n\n update() {\n this.opacity -= this.decay\n this.nodes.forEach((node) => {\n node.offsetX += node.vx\n node.offsetY += node.vy\n node.radius *= 0.95\n })\n }\n}\n\nconst GeometricFluidGrid: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n let animationFrameId: number\n let orbs: AnchoredBlob[] = []\n let trail: TrailBlob[] = []\n let mouse: MouseState = { x: -1000, y: -1000, lastX: -1000, lastY: -1000 }\n\n const initWorld = () => {\n orbs = []\n const w = canvas.width\n const h = canvas.height\n\n // 1. Top Right\n orbs.push(\n new AnchoredBlob({\n x: w - w * 0.15,\n y: h * 0.15,\n })\n )\n\n // 2. ~40% from top and ~40% from left\n orbs.push(\n new AnchoredBlob({\n x: w * 0.4,\n y: h * 0.4,\n })\n )\n\n // 3. Bottom Left\n orbs.push(\n new AnchoredBlob({\n x: w * 0.05 + 50,\n y: h - h * 0.15,\n })\n )\n\n // 4. Bottom Right\n orbs.push(\n new AnchoredBlob({\n x: w - w * 0.05 - 50,\n y: h - h * 0.05 - 50,\n })\n )\n }\n\n const resize = () => {\n const rect = canvas.getBoundingClientRect()\n canvas.width = rect.width\n canvas.height = rect.height\n initWorld()\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = canvas.getBoundingClientRect()\n mouse.x = e.clientX - rect.left\n mouse.y = e.clientY - rect.top\n\n if (mouse.lastX === -1000) {\n mouse.lastX = mouse.x\n mouse.lastY = mouse.y\n }\n\n const dx = mouse.x - mouse.lastX\n const dy = mouse.y - mouse.lastY\n const dist = Math.sqrt(dx * dx + dy * dy)\n\n if (dist > 20) {\n trail.push(new TrailBlob(mouse.x, mouse.y))\n mouse.lastX = mouse.x\n mouse.lastY = mouse.y\n }\n }\n\n const handleResize = () => {\n resize()\n }\n\n const draw = () => {\n const w = canvas.width\n const h = canvas.height\n\n // Update Logic\n orbs.forEach((orb) => orb.update())\n for (let i = trail.length - 1; i >= 0; i--) {\n trail[i].update()\n if (trail[i].opacity <= 0) trail.splice(i, 1)\n }\n\n // Clear Screen\n ctx.fillStyle = \"#050505\"\n ctx.fillRect(0, 0, w, h)\n\n const renderList = [...orbs, ...trail]\n\n // Collect all glitch zones for easier checking inside the loop\n // We flat map them to a simple array to iterate quickly\n const allGlitches: GlitchZone[] = []\n orbs.forEach((o) => allGlitches.push(...o.glitchZones))\n\n for (let x = GAP / 2; x < w; x += GAP) {\n for (let y = GAP / 2; y < h; y += GAP) {\n // --- GLITCH CHECK ---\n // Check if this specific grid dot is inside a glitch zone\n let isGlitching = false\n for (const g of allGlitches) {\n // Simple AABB check\n if (x >= g.x && x <= g.x + g.w && y >= g.y && y <= g.y + g.h) {\n isGlitching = true\n break\n }\n }\n\n if (isGlitching) {\n // Glitched Dot: Bright\n // We use the grid itself to manifest the glitch\n ctx.fillStyle = \"rgba(182, 243, 191, 0.95)\"\n\n // Randomly skip some dots in the glitch line for a \"broken\" look\n if (Math.random() > 0.1) {\n const size = Math.random() > 0.5 ? MAX_SIZE * 0.7 : BASE_SIZE * 2\n ctx.beginPath()\n ctx.arc(x, y, size / 2, 0, Math.PI * 2)\n ctx.fill()\n }\n continue // Skip standard influence calculation for this dot\n }\n\n // --- STANDARD INFLUENCE CHECK ---\n let totalInfluence = 0\n\n // Optimization: Is near blob?\n let nearby = false\n for (const entity of renderList) {\n if (\n Math.abs(x - entity.x) < entity.maxReach &&\n Math.abs(y - entity.y) < entity.maxReach\n ) {\n nearby = true\n break\n }\n }\n\n if (!nearby) {\n // Passive Background Dot\n ctx.fillStyle = \"rgba(255, 255, 255, 0.03)\"\n ctx.fillRect(x - 0.5, y - 0.5, 1, 1)\n continue\n }\n\n // Calculate Influence\n for (const entity of renderList) {\n const dx = x - entity.x\n const dy = y - entity.y\n\n if (\n Math.abs(dx) > entity.maxReach ||\n Math.abs(dy) > entity.maxReach\n )\n continue\n\n let localInf = 0\n for (const node of entity.nodes) {\n const nx = dx - node.offsetX\n const ny = dy - node.offsetY\n const dist = Math.sqrt(nx * nx + ny * ny)\n localInf += getFalloff(dist, node.radius)\n }\n if (localInf > 1) localInf = 1\n totalInfluence += localInf * entity.opacity\n }\n\n if (totalInfluence > 1) totalInfluence = 1\n\n // Draw Cell\n if (totalInfluence > 0.01) {\n // Gradient: White (Edge) to Green (#B6F3BF - Center)\n const edgeR = 255,\n centerR = 182\n const edgeG = 255,\n centerG = 243\n const edgeB = 255,\n centerB = 191\n\n // Interpolate from White (0 influence) to Green (1 influence)\n const r = Math.floor(edgeR + (centerR - edgeR) * totalInfluence)\n const g = Math.floor(edgeG + (centerG - edgeG) * totalInfluence)\n const b = Math.floor(edgeB + (centerB - edgeB) * totalInfluence)\n\n const alpha = totalInfluence * 0.5\n const size = BASE_SIZE + totalInfluence * (MAX_SIZE - BASE_SIZE)\n\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha})`\n ctx.beginPath()\n ctx.arc(x, y, size / 2, 0, Math.PI * 2)\n ctx.fill()\n } else {\n ctx.fillStyle = \"rgba(255, 255, 255, 0.03)\"\n ctx.fillRect(x - 0.5, y - 0.5, 1, 1)\n }\n }\n }\n\n animationFrameId = requestAnimationFrame(draw)\n }\n\n window.addEventListener(\"resize\", handleResize)\n window.addEventListener(\"mousemove\", handleMouseMove)\n\n resize()\n draw()\n\n return () => {\n window.removeEventListener(\"resize\", handleResize)\n window.removeEventListener(\"mousemove\", handleMouseMove)\n cancelAnimationFrame(animationFrameId)\n }\n }, [])\n\n return (\n <canvas\n ref={canvasRef}\n className=\"fixed inset-0 -z-10 w-full h-full pointer-events-none\"\n />\n )\n}\n\nexport default GeometricFluidGrid\n"],"mappings":"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","names":["useEffect","useRef","jsx","GAP","BASE_SIZE","MAX_SIZE","getFalloff","dist","radius","val","AnchoredBlob","anchorConfig","__publicField","nodeCount","i","r","ox","oy","dx","dy","k","ax","ay","wx","wy","node","maxDist","g","snap","v","rawCx","rawCy","cx","cy","isVert","len","thickness","TrailBlob","x","y","count","GeometricFluidGrid","canvasRef","useRef","useEffect","canvas","ctx","animationFrameId","orbs","trail","mouse","initWorld","w","h","resize","rect","handleMouseMove","e","handleResize","draw","orb","renderList","allGlitches","o","isGlitching","size","totalInfluence","nearby","entity","localInf","nx","ny","b","alpha","GeometricFluidGrid_default"]}
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+ var d=Object.defineProperty;var e=(b,a,c)=>a in b?d(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c;var f=(b,a,c)=>e(b,typeof a!="symbol"?a+"":a,c);exports.a = f;
3
+ //# sourceMappingURL=chunk-XYO4VLMF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-XYO4VLMF.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-XYO4VLMF.js"}
@@ -0,0 +1,5 @@
1
+ import React__default from 'react';
2
+
3
+ declare const GeometricFluidGrid: React__default.FC;
4
+
5
+ export { GeometricFluidGrid as default };
@@ -0,0 +1,5 @@
1
+ import React__default from 'react';
2
+
3
+ declare const GeometricFluidGrid: React__default.FC;
4
+
5
+ export { GeometricFluidGrid as default };
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+ "use client";var _chunkMLULTZDSjs = require('../chunk-MLULTZDS.js');require('../chunk-XYO4VLMF.js');exports.default = _chunkMLULTZDSjs.a;
3
+ //# sourceMappingURL=GeometricFluidGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GeometricFluidGrid.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAmC,gCAA6B,qCAAqB","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GeometricFluidGrid.js"}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ "use client";import{a}from"../chunk-RTHCEJYC.mjs";import"../chunk-KPAOPUY2.mjs";export{a as default};
3
+ //# sourceMappingURL=GeometricFluidGrid.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,14 +1,15 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { RefAttributes, ReactNode } from 'react';
2
+ import { ReactNode } from 'react';
3
3
 
4
- declare const DEFAULT_SYMBOLS: string[];
5
- type GlitchLinkProps = RefAttributes<HTMLAnchorElement> & {
4
+ declare const DEFAULT_SYMBOLS = "!<>-_\\/[]{}\u2014=+*^?#________";
5
+ type GlitchLinkProps = {
6
6
  href?: string;
7
7
  children: ReactNode;
8
- symbols?: string[];
8
+ symbols?: string;
9
9
  className?: string;
10
10
  asChild?: boolean;
11
+ duration?: number;
11
12
  };
12
- declare const GlitchLink: ({ href, children, symbols, className, asChild, ...props }: GlitchLinkProps) => react_jsx_runtime.JSX.Element;
13
+ declare const GlitchLink: ({ href, children, symbols, className, asChild, duration, ...props }: GlitchLinkProps) => react_jsx_runtime.JSX.Element;
13
14
 
14
15
  export { DEFAULT_SYMBOLS, GlitchLink as default };
@@ -1,14 +1,15 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { RefAttributes, ReactNode } from 'react';
2
+ import { ReactNode } from 'react';
3
3
 
4
- declare const DEFAULT_SYMBOLS: string[];
5
- type GlitchLinkProps = RefAttributes<HTMLAnchorElement> & {
4
+ declare const DEFAULT_SYMBOLS = "!<>-_\\/[]{}\u2014=+*^?#________";
5
+ type GlitchLinkProps = {
6
6
  href?: string;
7
7
  children: ReactNode;
8
- symbols?: string[];
8
+ symbols?: string;
9
9
  className?: string;
10
10
  asChild?: boolean;
11
+ duration?: number;
11
12
  };
12
- declare const GlitchLink: ({ href, children, symbols, className, asChild, ...props }: GlitchLinkProps) => react_jsx_runtime.JSX.Element;
13
+ declare const GlitchLink: ({ href, children, symbols, className, asChild, duration, ...props }: GlitchLinkProps) => react_jsx_runtime.JSX.Element;
13
14
 
14
15
  export { DEFAULT_SYMBOLS, GlitchLink as default };
@@ -1,3 +1,3 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- "use client";var _chunkJNEIOQGFjs = require('../chunk-JNEIOQGF.js');exports.DEFAULT_SYMBOLS = _chunkJNEIOQGFjs.a; exports.default = _chunkJNEIOQGFjs.b;
2
+ "use client";var _chunkHGY6TDJ2js = require('../chunk-HGY6TDJ2.js');require('../chunk-FUYXCJOQ.js');require('../chunk-XYO4VLMF.js');exports.DEFAULT_SYMBOLS = _chunkHGY6TDJ2js.a; exports.default = _chunkHGY6TDJ2js.b;
3
3
  //# sourceMappingURL=GlitchLink.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GlitchLink.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAqC,mFAA0C","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GlitchLink.js"}
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GlitchLink.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAqC,gCAA6B,gCAA6B,mFAA0C","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/GlitchLink.js"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- "use client";import{a,b}from"../chunk-IK3C7KV5.mjs";export{a as DEFAULT_SYMBOLS,b as default};
2
+ "use client";import{a,b}from"../chunk-P7ACUHYG.mjs";import"../chunk-S5TKCF6T.mjs";import"../chunk-KPAOPUY2.mjs";export{a as DEFAULT_SYMBOLS,b as default};
3
3
  //# sourceMappingURL=GlitchLink.mjs.map
@@ -1,3 +1,3 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- "use client";var _chunkR74QDO2Zjs = require('../chunk-R74QDO2Z.js');exports.PixelLoad = _chunkR74QDO2Zjs.a;
2
+ "use client";var _chunkR74QDO2Zjs = require('../chunk-R74QDO2Z.js');require('../chunk-XYO4VLMF.js');exports.PixelLoad = _chunkR74QDO2Zjs.a;
3
3
  //# sourceMappingURL=PixelLoad.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/PixelLoad.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAmC,uCAAuB","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/PixelLoad.js"}
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/PixelLoad.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAmC,gCAA6B,uCAAuB","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/PixelLoad.js"}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- "use client";import{a}from"../chunk-WF73K6X2.mjs";export{a as PixelLoad};
2
+ "use client";import{a}from"../chunk-WF73K6X2.mjs";import"../chunk-KPAOPUY2.mjs";export{a as PixelLoad};
3
3
  //# sourceMappingURL=PixelLoad.mjs.map
@@ -4,8 +4,10 @@ import { ReactNode } from 'react';
4
4
  interface TextDecoderProps {
5
5
  children: ReactNode;
6
6
  className?: string;
7
+ duration?: number;
8
+ symbols?: string;
7
9
  delay?: number;
8
10
  }
9
- declare const SuspenseDecodedText: (props: TextDecoderProps) => react_jsx_runtime.JSX.Element;
11
+ declare function SuspenseDecodedText(props: TextDecoderProps): react_jsx_runtime.JSX.Element;
10
12
 
11
13
  export { type TextDecoderProps, SuspenseDecodedText as default };
@@ -4,8 +4,10 @@ import { ReactNode } from 'react';
4
4
  interface TextDecoderProps {
5
5
  children: ReactNode;
6
6
  className?: string;
7
+ duration?: number;
8
+ symbols?: string;
7
9
  delay?: number;
8
10
  }
9
- declare const SuspenseDecodedText: (props: TextDecoderProps) => react_jsx_runtime.JSX.Element;
11
+ declare function SuspenseDecodedText(props: TextDecoderProps): react_jsx_runtime.JSX.Element;
10
12
 
11
13
  export { type TextDecoderProps, SuspenseDecodedText as default };
@@ -1,3 +1,3 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
- "use client";var _chunk5CDUAMIGjs = require('../chunk-5CDUAMIG.js');require('../chunk-FUYXCJOQ.js');exports.default = _chunk5CDUAMIGjs.a;
2
+ "use client";var _chunkNZDJHFEGjs = require('../chunk-NZDJHFEG.js');require('../chunk-FUYXCJOQ.js');require('../chunk-XYO4VLMF.js');exports.default = _chunkNZDJHFEGjs.a;
3
3
  //# sourceMappingURL=TextDecoder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/TextDecoder.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAmC,gCAA6B,qCAAqB","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/TextDecoder.js"}
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/TextDecoder.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY,CAAC,uDAAmC,gCAA6B,gCAA6B,qCAAqB","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/components/TextDecoder.js"}