@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.
- package/README.github.md +147 -1
- package/dist/chunk-HGY6TDJ2.js +3 -0
- package/dist/chunk-HGY6TDJ2.js.map +1 -0
- package/dist/chunk-KPAOPUY2.mjs +3 -0
- package/dist/chunk-KPAOPUY2.mjs.map +1 -0
- package/dist/chunk-MLULTZDS.js +3 -0
- package/dist/chunk-MLULTZDS.js.map +1 -0
- package/dist/chunk-NLKTP7EJ.mjs +3 -0
- package/dist/chunk-NLKTP7EJ.mjs.map +1 -0
- package/dist/chunk-NZDJHFEG.js +3 -0
- package/dist/chunk-NZDJHFEG.js.map +1 -0
- package/dist/chunk-P7ACUHYG.mjs +3 -0
- package/dist/chunk-P7ACUHYG.mjs.map +1 -0
- package/dist/chunk-RTHCEJYC.mjs +3 -0
- package/dist/chunk-RTHCEJYC.mjs.map +1 -0
- package/dist/chunk-XYO4VLMF.js +3 -0
- package/dist/chunk-XYO4VLMF.js.map +1 -0
- package/dist/components/GeometricFluidGrid.d.mts +5 -0
- package/dist/components/GeometricFluidGrid.d.ts +5 -0
- package/dist/components/GeometricFluidGrid.js +3 -0
- package/dist/components/GeometricFluidGrid.js.map +1 -0
- package/dist/components/GeometricFluidGrid.mjs +3 -0
- package/dist/components/GeometricFluidGrid.mjs.map +1 -0
- package/dist/components/GlitchLink.d.mts +6 -5
- package/dist/components/GlitchLink.d.ts +6 -5
- package/dist/components/GlitchLink.js +1 -1
- package/dist/components/GlitchLink.js.map +1 -1
- package/dist/components/GlitchLink.mjs +1 -1
- package/dist/components/PixelLoad.js +1 -1
- package/dist/components/PixelLoad.js.map +1 -1
- package/dist/components/PixelLoad.mjs +1 -1
- package/dist/components/TextDecoder.d.mts +3 -1
- package/dist/components/TextDecoder.d.ts +3 -1
- package/dist/components/TextDecoder.js +1 -1
- package/dist/components/TextDecoder.js.map +1 -1
- package/dist/components/TextDecoder.mjs +1 -1
- package/dist/components/button.d.mts +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/button.js.map +1 -1
- package/dist/components/button.mjs +1 -1
- package/dist/components/card.js +1 -1
- package/dist/components/card.js.map +1 -1
- package/dist/components/card.mjs +1 -1
- package/dist/components/card.mjs.map +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/tabs.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-5CDUAMIG.js +0 -3
- package/dist/chunk-5CDUAMIG.js.map +0 -1
- package/dist/chunk-AXL7HSZW.mjs +0 -3
- package/dist/chunk-AXL7HSZW.mjs.map +0 -1
- package/dist/chunk-IK3C7KV5.mjs +0 -3
- package/dist/chunk-IK3C7KV5.mjs.map +0 -1
- package/dist/chunk-JNEIOQGF.js +0 -3
- 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
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
3
|
|
|
4
|
-
declare const DEFAULT_SYMBOLS
|
|
5
|
-
type GlitchLinkProps =
|
|
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 {
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
3
|
|
|
4
|
-
declare const DEFAULT_SYMBOLS
|
|
5
|
-
type GlitchLinkProps =
|
|
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
|
|
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-
|
|
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"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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"}
|