@alkimi.org/ui-kit 0.1.12 → 0.1.13
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 +45 -74
- package/README.md +45 -43
- package/README.npm.md +45 -43
- package/dist/components/GlitchLink.d.mts +5 -3
- package/dist/components/GlitchLink.d.ts +5 -3
- package/dist/components/GlitchLink.js +29 -14
- package/dist/components/GlitchLink.js.map +1 -1
- package/dist/components/GlitchLink.mjs +30 -15
- package/dist/components/GlitchLink.mjs.map +1 -1
- package/dist/components/TextDecoder.js +3 -3
- package/dist/components/TextDecoder.js.map +1 -1
- package/dist/components/TextDecoder.mjs +3 -3
- package/dist/components/TextDecoder.mjs.map +1 -1
- package/dist/components/button.js +3 -3
- package/dist/components/button.js.map +1 -1
- package/dist/components/button.mjs +3 -3
- package/dist/components/button.mjs.map +1 -1
- package/dist/index.css +57 -68
- package/dist/index.css.map +1 -1
- package/dist/index.js +32 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +37 -23
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +57 -68
- package/dist/styles.css.map +1 -1
- package/package.json +1 -1
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n :root {\n /* Light Mode Theme\n * Override these variables in your own CSS to customize the theme\n * Format: H S% L% (Hue Saturation% Lightness%)\n */\n\n /* Background colors */\n --background: 0 0% 100%; /* Main background */\n --foreground: 222.2 84% 4.9%; /* Main text color */\n\n /* Card component */\n --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%;\n\n /* Popover component */\n --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%;\n\n /* Primary button (default variant) */\n --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%;\n\n /* Secondary button variant */\n --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%;\n\n /* Muted backgrounds and text */\n --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%;\n\n /* Accent colors (used in hover states) */\n --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%;\n\n /* Destructive button variant */\n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%;\n\n /* Border and input colors */\n --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%;\n\n /* Focus ring color */\n --ring: 222.2 84% 4.9%;\n\n /* Border radius */\n --radius: 0.625rem;\n }\n * {\n border-color: hsl(var(--border));\n}\n body {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n}\n.\\!container {\n width: 100% !important;\n margin-right: auto !important;\n margin-left: auto !important;\n padding-right: 2rem !important;\n padding-left: 2rem !important;\n}\n.container {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 2rem;\n padding-left: 2rem;\n}\n@media (min-width: 1400px) {\n\n .\\!container {\n max-width: 1400px !important;\n }\n\n .container {\n max-width: 1400px;\n }\n}\n.visible {\n visibility: visible;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.inset-0 {\n inset: 0px;\n}\n.left-0 {\n left: 0px;\n}\n.top-0 {\n top: 0px;\n}\n.z-\\[1\\] {\n z-index: 1;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.block {\n display: block;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-\\[150px\\] {\n height: 150px;\n}\n.h-\\[300px\\] {\n height: 300px;\n}\n.h-\\[400px\\] {\n height: 400px;\n}\n.h-full {\n height: 100%;\n}\n.w-4 {\n width: 1rem;\n}\n.w-9 {\n width: 2.25rem;\n}\n.w-\\[200px\\] {\n width: 200px;\n}\n.w-\\[300px\\] {\n width: 300px;\n}\n.w-\\[350px\\] {\n width: 350px;\n}\n.w-\\[400px\\] {\n width: 400px;\n}\n.w-full {\n width: 100%;\n}\n.max-w-md {\n max-width: 28rem;\n}\n@keyframes spin {\n\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.gap-2 {\n gap: 0.5rem;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded-\\[3\\.75rem\\] {\n border-radius: 3.75rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: var(--radius);\n}\n.border {\n border-width: 1px;\n}\n.border-\\[1\\.33px\\] {\n border-width: 1.33px;\n}\n.border-input {\n border-color: hsl(var(--input));\n}\n.border-primary-foreground {\n border-color: hsl(var(--primary-foreground));\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-background {\n background-color: hsl(var(--background));\n}\n.bg-card {\n background-color: hsl(var(--card));\n}\n.bg-destructive {\n background-color: hsl(var(--destructive));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-muted {\n background-color: hsl(var(--muted));\n}\n.bg-primary {\n background-color: hsl(var(--primary));\n}\n.bg-secondary\\/80 {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.text-center {\n text-align: center;\n}\n.font-mono {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-3xl {\n font-size: 1.875rem;\n line-height: 2.25rem;\n}\n.text-4xl {\n font-size: 2.25rem;\n line-height: 2.5rem;\n}\n.text-\\[0\\.75rem\\] {\n font-size: 0.75rem;\n}\n.text-\\[0\\.875rem\\] {\n font-size: 0.875rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.italic {\n font-style: italic;\n}\n.leading-none {\n line-height: 1;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\n}\n.text-card-foreground {\n color: hsl(var(--card-foreground));\n}\n.text-destructive-foreground {\n color: hsl(var(--destructive-foreground));\n}\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgb(34 197 94 / var(--tw-text-opacity, 1));\n}\n.text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.text-primary {\n color: hsl(var(--primary));\n}\n.text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.text-purple-600 {\n --tw-text-opacity: 1;\n color: rgb(147 51 234 / var(--tw-text-opacity, 1));\n}\n.text-secondary-foreground {\n color: hsl(var(--secondary-foreground));\n}\n.underline {\n text-decoration-line: underline;\n}\n.no-underline {\n text-decoration-line: none;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.duration-150 {\n animation-duration: 150ms;\n}\n.duration-300 {\n animation-duration: 300ms;\n}\n.ease-out {\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n\n.hover\\:bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n\n.hover\\:bg-secondary:hover {\n background-color: hsl(var(--secondary));\n}\n\n.hover\\:text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-color: hsl(var(--ring));\n}\n\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n\n.data-\\[state\\=active\\]\\:bg-background[data-state=\"active\"] {\n background-color: hsl(var(--background));\n}\n\n.data-\\[state\\=active\\]\\:text-foreground[data-state=\"active\"] {\n color: hsl(var(--foreground));\n}\n\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=\"active\"] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n"],"mappings":";AAAA;AAAG;AAAU;AACX,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAEA;AACE,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAOA;AACA;AACA;AACE,cAAY;AACZ,gBAAc;AACd,gBAAc;AACd,gBAAc;AAChB;AAEA;AACA;AACE,gBAAc;AAChB;AAYA;AACA;AACE,eAAa;AACb,4BAA0B;AAC1B,iBAAe;AACf,eAAa;AACV,YAAU;AACb;AAAA,IAAa,aAAa;AAAA,IAAE,SAAS;AAAA,IAAE,UAAU;AAAA,IAAE,mBAAmB;AAAA,IAAE,gBAAgB;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC7G,yBAAuB;AACvB,2B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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgb(59 130 246 / 0.5);\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-ring-shadow: 0 0 #0000;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-colored: 0 0 #0000;\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}/*\n! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com\n*//*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: #e5e7eb; /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n -moz-tab-size: 4; /* 3 */\n -o-tab-size: 4;\n tab-size: 4; /* 3 */\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"; /* 4 */\n font-feature-settings: normal; /* 5 */\n font-variation-settings: normal; /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0; /* 1 */\n line-height: inherit; /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; /* 1 */\n font-feature-settings: normal; /* 2 */\n font-variation-settings: normal; /* 3 */\n font-size: 1em; /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n font-size: 100%; /* 1 */\n font-weight: inherit; /* 1 */\n line-height: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button; /* 1 */\n background-color: transparent; /* 2 */\n background-image: none; /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1; /* 1 */\n color: #9ca3af; /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n :root {\n /* Dark Mode Theme (Default)\n * Override these variables in your own CSS to customize the theme\n * Format: H S% L% (Hue Saturation% Lightness%)\n */\n\n /* Background colors */\n --background: 240 10% 4%; /* Dark background */\n --foreground: 144 100% 97%; /* Light text */\n\n /* Card component */\n --card: 0 0% 3.5%;\n --card-foreground: 140 100% 97.1%;\n\n /* Popover component */\n --popover: 0 0% 3.5%;\n --popover-foreground: 140 100% 97.1%;\n\n /* Primary button (default variant) */\n --primary: 140 100% 97.1%;\n --primary-foreground: 240 6% 10%;\n\n /* Secondary button variant */\n --secondary: 240 4% 16%;\n --secondary-foreground: 140 100% 97.1%;\n\n /* Muted backgrounds and text */\n --muted: 240 4% 16%;\n --muted-foreground: 144 4.3% 54.9%;\n\n /* Accent colors (used in hover states) */\n --accent: 0 0% 15.3%;\n --accent-foreground: 140 100% 97.1%;\n\n /* Destructive button variant */\n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 140 100% 97.1%;\n\n /* Border and input colors */\n --border: 240 3.7% 27.6%;\n --input: 240 3.7% 27.6%;\n\n /* Focus ring color */\n --ring: 140 100% 97.1%;\n\n /* Border radius */\n --radius: 0.625rem;\n }\n\n /* .light {\n /* Light Mode Theme\n * Add the 'light' class to enable light mode\n */\n\n /* Background colors */\n /* --background: 0 0% 100%; /* Main background */\n /* --foreground: 222.2 84% 4.9%; /* Main text color */\n\n /* Card component */\n /* --card: 0 0% 100%;\n --card-foreground: 222.2 84% 4.9%; */\n\n /* Popover component */\n /* --popover: 0 0% 100%;\n --popover-foreground: 222.2 84% 4.9%; */\n\n /* Primary button (default variant) */\n /* --primary: 222.2 47.4% 11.2%;\n --primary-foreground: 210 40% 98%; */\n\n /* Secondary button variant */\n /* --secondary: 210 40% 96.1%;\n --secondary-foreground: 222.2 47.4% 11.2%; */\n\n /* Muted backgrounds and text */\n /* --muted: 210 40% 96.1%;\n --muted-foreground: 215.4 16.3% 46.9%; */\n\n /* Accent colors (used in hover states) */\n /* --accent: 210 40% 96.1%;\n --accent-foreground: 222.2 47.4% 11.2%; */\n\n /* Destructive button variant */\n /* --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 40% 98%; */\n\n /* Border and input colors */\n /* --border: 214.3 31.8% 91.4%;\n --input: 214.3 31.8% 91.4%; */\n\n /* Focus ring color */\n /* --ring: 222.2 84% 4.9%; */\n /* } */\n * {\n border-color: hsl(var(--border));\n}\n body {\n background-color: hsl(var(--background));\n color: hsl(var(--foreground));\n font-size: 14px;\n}\n.\\!container {\n width: 100% !important;\n margin-right: auto !important;\n margin-left: auto !important;\n padding-right: 2rem !important;\n padding-left: 2rem !important;\n}\n.container {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 2rem;\n padding-left: 2rem;\n}\n@media (min-width: 1400px) {\n\n .\\!container {\n max-width: 1400px !important;\n }\n\n .container {\n max-width: 1400px;\n }\n}\n.visible {\n visibility: visible;\n}\n.absolute {\n position: absolute;\n}\n.relative {\n position: relative;\n}\n.left-0 {\n left: 0px;\n}\n.top-0 {\n top: 0px;\n}\n.z-\\[1\\] {\n z-index: 1;\n}\n.col-start-1 {\n grid-column-start: 1;\n}\n.row-start-1 {\n grid-row-start: 1;\n}\n.mr-2 {\n margin-right: 0.5rem;\n}\n.mt-2 {\n margin-top: 0.5rem;\n}\n.flex {\n display: flex;\n}\n.inline-flex {\n display: inline-flex;\n}\n.grid {\n display: grid;\n}\n.inline-grid {\n display: inline-grid;\n}\n.h-10 {\n height: 2.5rem;\n}\n.h-4 {\n height: 1rem;\n}\n.h-8 {\n height: 2rem;\n}\n.h-9 {\n height: 2.25rem;\n}\n.h-\\[150px\\] {\n height: 150px;\n}\n.h-\\[300px\\] {\n height: 300px;\n}\n.h-\\[400px\\] {\n height: 400px;\n}\n.h-full {\n height: 100%;\n}\n.w-4 {\n width: 1rem;\n}\n.w-9 {\n width: 2.25rem;\n}\n.w-\\[200px\\] {\n width: 200px;\n}\n.w-\\[300px\\] {\n width: 300px;\n}\n.w-\\[400px\\] {\n width: 400px;\n}\n.w-\\[500px\\] {\n width: 500px;\n}\n.w-full {\n width: 100%;\n}\n.max-w-md {\n max-width: 28rem;\n}\n@keyframes spin {\n\n to {\n transform: rotate(360deg);\n }\n}\n.animate-spin {\n animation: spin 1s linear infinite;\n}\n.cursor-pointer {\n cursor: pointer;\n}\n.grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.flex-col {\n flex-direction: column;\n}\n.flex-wrap {\n flex-wrap: wrap;\n}\n.items-center {\n align-items: center;\n}\n.justify-center {\n justify-content: center;\n}\n.gap-4 {\n gap: 1rem;\n}\n.space-y-1\\.5 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));\n}\n.space-y-2 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));\n}\n.space-y-4 > :not([hidden]) ~ :not([hidden]) {\n --tw-space-y-reverse: 0;\n margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));\n margin-bottom: calc(1rem * var(--tw-space-y-reverse));\n}\n.overflow-hidden {\n overflow: hidden;\n}\n.whitespace-nowrap {\n white-space: nowrap;\n}\n.rounded-3xl {\n border-radius: 3.75rem;\n}\n.rounded-full {\n border-radius: 9999px;\n}\n.rounded-lg {\n border-radius: calc(var(--radius) + 2px);\n}\n.border {\n border-width: 1px;\n}\n.border-border {\n border-color: hsl(var(--border));\n}\n.border-input {\n border-color: hsl(var(--input));\n}\n.border-primary-foreground {\n border-color: hsl(var(--primary-foreground));\n}\n.border-t-transparent {\n border-top-color: transparent;\n}\n.bg-background {\n background-color: hsl(var(--background));\n}\n.bg-card {\n background-color: hsl(var(--card));\n}\n.bg-destructive {\n background-color: hsl(var(--destructive));\n}\n.bg-gray-100 {\n --tw-bg-opacity: 1;\n background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));\n}\n.bg-muted {\n background-color: hsl(var(--muted));\n}\n.bg-primary {\n background-color: hsl(var(--primary));\n}\n.bg-secondary\\/80 {\n background-color: hsl(var(--secondary) / 0.8);\n}\n.p-1 {\n padding: 0.25rem;\n}\n.p-4 {\n padding: 1rem;\n}\n.p-6 {\n padding: 1.5rem;\n}\n.px-3 {\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n}\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n.px-8 {\n padding-left: 2rem;\n padding-right: 2rem;\n}\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n.py-2 {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n.pt-0 {\n padding-top: 0px;\n}\n.text-center {\n text-align: center;\n}\n.text-2xl {\n font-size: 1.5rem;\n line-height: 2rem;\n}\n.text-4xl {\n font-size: 2.25rem;\n line-height: 2.5rem;\n}\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n.text-sm {\n font-size: 12px;\n line-height: 1.25rem;\n}\n.text-xl {\n font-size: 1.25rem;\n line-height: 1.75rem;\n}\n.font-bold {\n font-weight: 700;\n}\n.font-medium {\n font-weight: 500;\n}\n.font-semibold {\n font-weight: 600;\n}\n.italic {\n font-style: italic;\n}\n.leading-none {\n line-height: 1;\n}\n.tracking-tight {\n letter-spacing: -0.025em;\n}\n.text-blue-600 {\n --tw-text-opacity: 1;\n color: rgb(37 99 235 / var(--tw-text-opacity, 1));\n}\n.text-card-foreground {\n color: hsl(var(--card-foreground));\n}\n.text-destructive-foreground {\n color: hsl(var(--destructive-foreground));\n}\n.text-muted-foreground {\n color: hsl(var(--muted-foreground));\n}\n.text-primary {\n color: hsl(var(--primary));\n}\n.text-primary-foreground {\n color: hsl(var(--primary-foreground));\n}\n.text-secondary-foreground {\n color: hsl(var(--secondary-foreground));\n}\n.no-underline {\n text-decoration-line: none;\n}\n.underline-offset-4 {\n text-underline-offset: 4px;\n}\n.opacity-0 {\n opacity: 0;\n}\n.opacity-100 {\n opacity: 1;\n}\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n.outline {\n outline-style: solid;\n}\n.ring-offset-background {\n --tw-ring-offset-color: hsl(var(--background));\n}\n.blur {\n --tw-blur: blur(8px);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n.transition-all {\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-colors {\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.transition-opacity {\n transition-property: opacity;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.duration-150 {\n transition-duration: 150ms;\n}\n.duration-300 {\n transition-duration: 300ms;\n}\n.ease-out {\n transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n@keyframes enter {\n\n from {\n opacity: var(--tw-enter-opacity, 1);\n transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));\n }\n}\n@keyframes exit {\n\n to {\n opacity: var(--tw-exit-opacity, 1);\n transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));\n }\n}\n.duration-150 {\n animation-duration: 150ms;\n}\n.duration-300 {\n animation-duration: 300ms;\n}\n.ease-out {\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n}\n\n.hover\\:bg-accent:hover {\n background-color: hsl(var(--accent));\n}\n\n.hover\\:bg-destructive\\/90:hover {\n background-color: hsl(var(--destructive) / 0.9);\n}\n\n.hover\\:bg-primary\\/90:hover {\n background-color: hsl(var(--primary) / 0.9);\n}\n\n.hover\\:bg-secondary:hover {\n background-color: hsl(var(--secondary));\n}\n\n.hover\\:text-accent-foreground:hover {\n color: hsl(var(--accent-foreground));\n}\n\n.hover\\:underline:hover {\n text-decoration-line: underline;\n}\n\n.focus-visible\\:outline-none:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus-visible\\:ring-2:focus-visible {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);\n}\n\n.focus-visible\\:ring-ring:focus-visible {\n --tw-ring-color: hsl(var(--ring));\n}\n\n.focus-visible\\:ring-offset-2:focus-visible {\n --tw-ring-offset-width: 2px;\n}\n\n.disabled\\:pointer-events-none:disabled {\n pointer-events: none;\n}\n\n.disabled\\:opacity-50:disabled {\n opacity: 0.5;\n}\n\n.data-\\[state\\=active\\]\\:bg-background[data-state=\"active\"] {\n background-color: hsl(var(--background));\n}\n\n.data-\\[state\\=active\\]\\:text-foreground[data-state=\"active\"] {\n color: hsl(var(--foreground));\n}\n\n.data-\\[state\\=active\\]\\:shadow-sm[data-state=\"active\"] {\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n"],"mappings":";AAAA;AAAG;AAAU;AACX,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAEA;AACE,yBAAuB;AACvB,yBAAuB;AACvB,oBAAkB;AAClB,oBAAkB;AAClB,eAAa;AACb,eAAa;AACb,eAAa;AACb,gBAAc;AACd,gBAAc;AACd;AACA;AACA;AACA,+BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAwB;AACxB,0BAAwB;AACxB,mBAAiB,IAAI,GAAG,IAAI,IAAI,EAAE;AAClC,2BAAyB,EAAE,EAAE;AAC7B,oBAAkB,EAAE,EAAE;AACtB,eAAa,EAAE,EAAE;AACjB,uBAAqB,EAAE,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF;AAOA;AACA;AACA;AACE,cAAY;AACZ,gBAAc;AACd,gBAAc;AACd,gBAAc;AAChB;AAEA;AACA;AACE,gBAAc;AAChB;AAYA;AACA;AACE,eAAa;AACb,4BAA0B;AAC1B,iBAAe;AACf,eAAa;AACV,YAAU;AACb;AAAA,IAAa,aAAa;AAAA,IAAE,SAAS;AAAA,IAAE,UAAU;AAAA,IAAE,mBAAmB;AAAA,IAAE,gBAAgB;AAAA,IAAE,iBAAiB;AAAA,IAAE;AAC7G,yBAAuB;AACvB,2B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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ function cn(...inputs) {
|
|
|
59
59
|
// src/components/button.tsx
|
|
60
60
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
61
61
|
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
62
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
62
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
63
63
|
{
|
|
64
64
|
variants: {
|
|
65
65
|
variant: {
|
|
@@ -72,7 +72,7 @@ var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
|
72
72
|
},
|
|
73
73
|
size: {
|
|
74
74
|
default: "h-9 px-4 py-2",
|
|
75
|
-
sm: "h-8 text-
|
|
75
|
+
sm: "h-8 text-sm px-3 py-2",
|
|
76
76
|
lg: "h-10 px-8 py-2",
|
|
77
77
|
icon: "h-9 w-9"
|
|
78
78
|
}
|
|
@@ -102,7 +102,7 @@ var Button = React.forwardRef(
|
|
|
102
102
|
disabled: loading || props.disabled,
|
|
103
103
|
...props,
|
|
104
104
|
children: [
|
|
105
|
-
loading && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mr-2 h-4 w-4 animate-spin rounded-full border
|
|
105
|
+
loading && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent" }),
|
|
106
106
|
!loading && icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "mr-2", children: icon }),
|
|
107
107
|
props.children
|
|
108
108
|
]
|
|
@@ -122,7 +122,7 @@ var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
122
122
|
{
|
|
123
123
|
ref,
|
|
124
124
|
className: cn(
|
|
125
|
-
"inline-flex items-center justify-center rounded-
|
|
125
|
+
"inline-flex items-center justify-center rounded-3xl bg-muted p-1 text-muted-foreground",
|
|
126
126
|
className
|
|
127
127
|
),
|
|
128
128
|
...props
|
|
@@ -134,7 +134,7 @@ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
134
134
|
{
|
|
135
135
|
ref,
|
|
136
136
|
className: cn(
|
|
137
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
137
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-3xl px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
|
|
138
138
|
className
|
|
139
139
|
),
|
|
140
140
|
...props
|
|
@@ -366,19 +366,19 @@ var TextDecoder = ({ children, className, delay = 0 }) => {
|
|
|
366
366
|
{
|
|
367
367
|
ref: elementRef,
|
|
368
368
|
"aria-label": ariaLabel,
|
|
369
|
-
className: cn("
|
|
369
|
+
className: cn("inline-grid", className),
|
|
370
370
|
children: [
|
|
371
371
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
372
372
|
"span",
|
|
373
373
|
{
|
|
374
374
|
className: cn(
|
|
375
|
-
"transition-opacity duration-300",
|
|
375
|
+
"transition-opacity duration-300 col-start-1 row-start-1",
|
|
376
376
|
hasAnimated ? "opacity-100" : "opacity-0"
|
|
377
377
|
),
|
|
378
378
|
children
|
|
379
379
|
}
|
|
380
380
|
),
|
|
381
|
-
showDecoded && displayContent && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "
|
|
381
|
+
showDecoded && displayContent && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "transition-opacity duration-300 col-start-1 row-start-1", children: displayContent })
|
|
382
382
|
]
|
|
383
383
|
}
|
|
384
384
|
);
|
|
@@ -397,19 +397,28 @@ var TextDecoder_default = SuspenseDecodedText;
|
|
|
397
397
|
// src/components/GlitchLink.tsx
|
|
398
398
|
var import_link = __toESM(require("next/link"));
|
|
399
399
|
var import_react2 = require("react");
|
|
400
|
+
var import_react_slot2 = require("@radix-ui/react-slot");
|
|
400
401
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
401
402
|
var DEFAULT_SYMBOLS = ["/", "#", "*"];
|
|
402
403
|
var GlitchLink = ({
|
|
403
404
|
href,
|
|
404
405
|
children,
|
|
405
406
|
symbols = DEFAULT_SYMBOLS,
|
|
406
|
-
className
|
|
407
|
+
className,
|
|
408
|
+
asChild = false,
|
|
407
409
|
...props
|
|
408
410
|
}) => {
|
|
409
411
|
const [isHovering, setIsHovering] = (0, import_react2.useState)(false);
|
|
410
|
-
const
|
|
412
|
+
const getTextContent = (node) => {
|
|
413
|
+
if (typeof node === "string") return node;
|
|
414
|
+
if ((0, import_react2.isValidElement)(node) && node.props.children) {
|
|
415
|
+
return getTextContent(node.props.children);
|
|
416
|
+
}
|
|
417
|
+
return "";
|
|
418
|
+
};
|
|
419
|
+
const text = getTextContent(children);
|
|
411
420
|
const getRandomGlitch = () => {
|
|
412
|
-
if (!isHovering || !text) return
|
|
421
|
+
if (!isHovering || !text) return text;
|
|
413
422
|
return text.split(" ").map((word) => {
|
|
414
423
|
const randomLetterIndex = Math.floor(Math.random() * word.length);
|
|
415
424
|
return word.replace(
|
|
@@ -418,17 +427,18 @@ var GlitchLink = ({
|
|
|
418
427
|
);
|
|
419
428
|
}).join(" ");
|
|
420
429
|
};
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
);
|
|
430
|
+
const commonProps = {
|
|
431
|
+
className,
|
|
432
|
+
onMouseEnter: () => setIsHovering(true),
|
|
433
|
+
onMouseLeave: () => setIsHovering(false),
|
|
434
|
+
...props
|
|
435
|
+
};
|
|
436
|
+
if (asChild && (0, import_react2.isValidElement)(children)) {
|
|
437
|
+
const content2 = text ? isHovering ? getRandomGlitch() : text : children;
|
|
438
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_slot2.Slot, { ...commonProps, children: (0, import_react2.cloneElement)(children, {}, content2) });
|
|
439
|
+
}
|
|
440
|
+
const content = text ? isHovering ? getRandomGlitch() : children : children;
|
|
441
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_link.default, { href: href || "#", ...commonProps, children: content });
|
|
432
442
|
};
|
|
433
443
|
var GlitchLink_default = GlitchLink;
|
|
434
444
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/button.tsx","../src/lib/utils.ts","../src/components/tabs.tsx","../src/components/TextDecoder.tsx","../src/components/GlitchLink.tsx","../src/components/PixelLoad.tsx"],"sourcesContent":["// Export styles\nimport \"./styles.css\"\n\n// Export components\nexport { Button, buttonVariants, type ButtonProps } from \"./components/button\"\nexport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./components/tabs\"\nexport { default as TextDecoder } from \"./components/TextDecoder\"\nexport type { TextDecoderProps } from \"./components/TextDecoder\"\nexport { default as GlitchLink } from \"./components/GlitchLink\"\nexport { PixelLoad } from \"./components/PixelLoad\"\nexport type { PixelLoadProps } from \"./components/PixelLoad\"\n\n// Export utilities\nexport { cn } from \"./lib/utils\"\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-[3.75rem] text-[0.875rem] font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary/80 text-secondary-foreground hover:bg-secondary\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 text-[0.75rem] px-3 py-2\",\n lg: \"h-10 px-8 py-2\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n icon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n icon,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={loading || props.disabled}\n {...props}\n >\n {loading && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-[1.33px] border-primary-foreground border-t-transparent\" />\n )}\n {!loading && icon && <span className=\"mr-2\">{icon}</span>}\n {props.children}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center rounded-[3.75rem] bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-[3.75rem] px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\nimport { cn } from \"@/lib/utils\"\nimport React, {\n useState,\n useEffect,\n useMemo,\n useRef,\n Suspense,\n ReactNode,\n} from \"react\"\n\n// The symbols to use for the scrambling effect (moved outside to avoid recreation)\nconst SYMBOLS = [\"\\\\\", \"-\", \"?\", \"/\", \"#\", \"!\", \"_\", \"+\", \"<\", \">\"]\nconst MAX_ITERATIONS = 3 // How many times to scramble\nconst SPEED = 400 // Speed in milliseconds between scrambles\n\n// Helper function moved outside component to avoid recreation\nconst scrambleText = (input: string): string => {\n if (!input) return \"\"\n\n return input\n .split(\" \")\n .map((word: string) => {\n if (!word) return \"\"\n const randomSymbol = SYMBOLS[Math.floor(Math.random() * SYMBOLS.length)]\n return randomSymbol.repeat(word.length)\n })\n .join(\" \")\n}\n\n// Extract text content from React nodes recursively\n// Also checks common text props like 'text', 'label', 'title', etc.\nconst extractText = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node)\n }\n\n if (Array.isArray(node)) {\n return node.map(extractText).join(\"\")\n }\n\n if (React.isValidElement(node)) {\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n\n let result = \"\"\n\n // Extract text from props first (in order: text, label, title)\n if (typeof props.text === \"string\") {\n result += props.text\n }\n if (typeof props.label === \"string\") {\n result += props.label\n }\n if (typeof props.title === \"string\") {\n result += props.title\n }\n\n // Then extract from children\n if (props.children) {\n result += extractText(props.children)\n }\n\n return result\n }\n\n return \"\"\n}\n\n// Clone React nodes and replace text content with scrambled text\n// This function maps scrambled text back to the original structure\nconst scrambleReactNode = (\n node: ReactNode,\n scrambledText: string,\n textStartIndex: { current: number }\n): ReactNode => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const text = String(node)\n // For each character in the original text, take the corresponding scrambled character\n // This preserves the length and structure\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n // Fallback if scrambled text is shorter (shouldn't happen, but safety check)\n scrambled += text[i]\n }\n }\n return scrambled\n }\n\n if (Array.isArray(node)) {\n return node.map((child, index) => {\n const scrambledChild = scrambleReactNode(\n child,\n scrambledText,\n textStartIndex\n )\n // Preserve original key if it exists, otherwise add one for React elements\n if (React.isValidElement(scrambledChild)) {\n const originalKey = React.isValidElement(child) ? child.key : null\n if (scrambledChild.key == null && originalKey == null) {\n return React.cloneElement(scrambledChild, { key: `decoded-${index}` })\n }\n // If original had a key but scrambled doesn't, preserve it\n if (scrambledChild.key == null && originalKey != null) {\n return React.cloneElement(scrambledChild, { key: originalKey })\n }\n }\n return scrambledChild\n })\n }\n\n if (React.isValidElement(node)) {\n // Regular element handling - works for all components\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n const newProps = { ...props }\n\n // Handle text props in the same order as extraction (text, label, title)\n if (typeof props.text === \"string\") {\n const text = props.text\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += text[i]\n }\n }\n newProps.text = scrambled\n }\n\n if (typeof props.label === \"string\") {\n const label = props.label\n let scrambled = \"\"\n for (let i = 0; i < label.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += label[i]\n }\n }\n newProps.label = scrambled\n }\n\n if (typeof props.title === \"string\") {\n const title = props.title\n let scrambled = \"\"\n for (let i = 0; i < title.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += title[i]\n }\n }\n newProps.title = scrambled\n }\n\n // Handle children after props\n if (props.children) {\n newProps.children = scrambleReactNode(\n props.children,\n scrambledText,\n textStartIndex\n )\n }\n return React.cloneElement(node, newProps)\n }\n\n return node\n}\n\nexport interface TextDecoderProps {\n children: ReactNode\n className?: string\n delay?: number // Delay in milliseconds before starting animation\n}\n\nconst TextDecoder = ({ children, className, delay = 0 }: TextDecoderProps) => {\n const [displayContent, setDisplayContent] = useState<ReactNode>(null)\n const [hasAnimated, setHasAnimated] = useState(false)\n const [showDecoded, setShowDecoded] = useState(true)\n const elementRef = useRef<HTMLSpanElement>(null)\n\n // Extract full text for scrambling\n const fullText = useMemo(() => extractText(children), [children])\n\n // Memoize initial scrambled text\n const initialScrambled = useMemo(() => scrambleText(fullText), [fullText])\n\n // Initialize with scrambled content to prevent layout shift\n useEffect(() => {\n if (!hasAnimated && fullText) {\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n }\n }, [children, initialScrambled, hasAnimated, fullText])\n\n useEffect(() => {\n if (!fullText) {\n setDisplayContent(null)\n setShowDecoded(false)\n return\n }\n\n // If already animated, hide decoded and show children\n if (hasAnimated) {\n setShowDecoded(false)\n return\n }\n\n const element = elementRef.current\n if (!element) return\n\n let iteration = 0\n let intervalId: NodeJS.Timeout | null = null\n let delayTimeoutId: NodeJS.Timeout | null = null\n\n // Intersection Observer to detect when element is visible\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry.isIntersecting && !hasAnimated) {\n // Start animation after delay\n delayTimeoutId = setTimeout(() => {\n // 1. Initial scramble\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n\n // 2. Set up the interval\n intervalId = setInterval(() => {\n iteration++\n\n if (iteration >= MAX_ITERATIONS) {\n // Stop scrambling, fade out decoded and fade in children\n setHasAnimated(true)\n setShowDecoded(false)\n if (intervalId) clearInterval(intervalId)\n } else {\n // Continue scrambling\n const newScrambled = scrambleText(fullText)\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n newScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n }\n }, SPEED)\n }, delay)\n\n // Disconnect observer once animation starts\n observer.disconnect()\n }\n },\n {\n threshold: 0.1, // Trigger when 10% of the element is visible\n }\n )\n\n observer.observe(element)\n\n // Cleanup function\n return () => {\n observer.disconnect()\n if (intervalId) clearInterval(intervalId)\n if (delayTimeoutId) clearTimeout(delayTimeoutId)\n }\n }, [children, fullText, initialScrambled, hasAnimated, delay])\n\n const ariaLabel = useMemo(() => extractText(children), [children])\n\n return (\n <span\n ref={elementRef}\n aria-label={ariaLabel} // Accessibility: Screen readers read the real text\n className={cn(\"relative block\", className)}\n >\n {/* Children always rendered but with opacity-0 initially */}\n <span\n className={cn(\n \"transition-opacity duration-300\",\n hasAnimated ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n {children}\n </span>\n {/* Decoded animation overlay */}\n {showDecoded && displayContent && (\n <span className=\"absolute inset-0 transition-opacity duration-300\">\n {displayContent}\n </span>\n )}\n </span>\n )\n}\n\nconst SuspenseDecodedText = (props: TextDecoderProps) => {\n return (\n <Suspense\n fallback={\n <span className={cn(\"opacity-0\", props.className)}>\n {props.children}\n </span>\n }\n >\n <TextDecoder {...props} />\n </Suspense>\n )\n}\n\nexport default SuspenseDecodedText\n","\"use client\"\nimport Link from \"next/link\"\nimport { RefAttributes, useState, ReactNode } from \"react\"\n\ntype GlitchLinkProps = RefAttributes<HTMLAnchorElement> & {\n href: string\n children: ReactNode\n symbols?: string[]\n className?: string\n}\n\nconst DEFAULT_SYMBOLS = [\"/\", \"#\", \"*\"]\n\nconst GlitchLink = ({\n href,\n children,\n symbols = DEFAULT_SYMBOLS,\n className = \"underline\",\n ...props\n}: GlitchLinkProps) => {\n const [isHovering, setIsHovering] = useState(false)\n\n const text = typeof children === \"string\" ? children : \"\"\n\n const getRandomGlitch = () => {\n if (!isHovering || !text) return children\n return text\n .split(\" \")\n .map((word: string) => {\n // take one random letter from the word\n const randomLetterIndex = Math.floor(Math.random() * word.length)\n\n // replace the letter with a random symbol\n return word.replace(\n word[randomLetterIndex],\n symbols[Math.floor(Math.random() * symbols.length)]\n )\n })\n .join(\" \")\n }\n\n return (\n <Link\n href={href}\n className={className}\n onMouseEnter={() => setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n {...props}\n >\n {text ? (isHovering ? getRandomGlitch() : children) : children}\n </Link>\n )\n}\n\nexport default GlitchLink\n","\"use client\"\n\nimport Image, { type StaticImageData } from \"next/image\"\nimport { JSX, useCallback, useEffect, useRef, useState } from \"react\"\n\ntype PixelLoadStatus = \"loading\" | \"animating\" | \"complete\"\n\ntype ImageSrc = string | StaticImageData\n\nexport interface PixelLoadProps {\n src: ImageSrc\n alt: string\n duration?: number\n steps?: number\n className?: string\n onAnimationComplete?: () => void\n priority?: boolean\n quality?: number\n placeholder?: \"blur\" | \"empty\"\n blurDataURL?: string\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\"\n}\n\nfunction isStaticImageData(src: ImageSrc): src is StaticImageData {\n return typeof src === \"object\" && \"src\" in src\n}\n\nfunction getImageSrc(src: ImageSrc): string {\n return isStaticImageData(src) ? src.src : src\n}\n\nexport function PixelLoad({\n src,\n alt,\n duration = 600,\n steps = 15,\n className,\n onAnimationComplete,\n priority,\n quality,\n placeholder = \"empty\",\n blurDataURL,\n objectFit = \"cover\",\n}: PixelLoadProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [status, setStatus] = useState<PixelLoadStatus>(\"loading\")\n const [dimensions, setDimensions] = useState<{\n width: number\n height: number\n } | null>(null)\n\n const imageSrc = getImageSrc(src)\n\n const drawPixelated = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n pixelSize: number,\n w: number,\n h: number\n ): void => {\n ctx.imageSmoothingEnabled = false\n\n const sw = Math.max(1, Math.floor(w / pixelSize))\n const sh = Math.max(1, Math.floor(h / pixelSize))\n\n ctx.clearRect(0, 0, w, h)\n ctx.drawImage(img, 0, 0, sw, sh)\n ctx.drawImage(canvasRef.current!, 0, 0, sw, sh, 0, 0, w, h)\n },\n []\n )\n\n const runAnimation = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n w: number,\n h: number\n ): void => {\n const minPixelSize = Math.max(w, h) / 4\n const intervalMs = duration / steps\n let currentStep = 0\n\n setStatus(\"animating\")\n\n const animate = (): void => {\n const progress = currentStep / steps\n const pixelSize = Math.max(1, Math.floor(minPixelSize * (1 - progress)))\n\n drawPixelated(ctx, img, pixelSize, w, h)\n\n currentStep++\n\n if (currentStep <= steps) {\n window.setTimeout(animate, intervalMs)\n } else {\n setStatus(\"complete\")\n onAnimationComplete?.()\n }\n }\n\n animate()\n },\n [duration, steps, drawPixelated, onAnimationComplete]\n )\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const updateDimensions = (): void => {\n const { width, height } = container.getBoundingClientRect()\n setDimensions({ width: Math.floor(width), height: Math.floor(height) })\n }\n\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(container)\n updateDimensions()\n\n return (): void => {\n resizeObserver.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (!dimensions) return\n\n // Guard against invalid dimensions\n if (dimensions.width <= 0 || dimensions.height <= 0) return\n\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n // Set canvas dimensions immediately to ensure it covers the area\n canvas.width = dimensions.width\n canvas.height = dimensions.height\n\n const img = new window.Image()\n img.crossOrigin = \"anonymous\"\n\n img.onload = (): void => {\n // Draw first frame immediately to prevent original image from showing\n const minPixelSize = Math.max(dimensions.width, dimensions.height) / 4\n drawPixelated(ctx, img, minPixelSize, dimensions.width, dimensions.height)\n // Then start animation\n runAnimation(ctx, img, dimensions.width, dimensions.height)\n }\n\n img.onerror = (): void => {\n console.error(\"PixelLoad: Failed to load image\")\n }\n\n img.src = imageSrc\n\n return (): void => {\n img.onload = null\n img.onerror = null\n }\n }, [imageSrc, dimensions, runAnimation, drawPixelated])\n\n const isComplete = status === \"complete\"\n const isAnimating = status === \"animating\" || status === \"loading\"\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full h-full ${className || \"\"}`}\n >\n <canvas\n ref={canvasRef}\n className=\"absolute top-0 left-0 w-full h-full\"\n style={{\n objectFit,\n opacity: isComplete ? 0 : 1,\n zIndex: isAnimating ? 2 : 1,\n }}\n aria-hidden={isComplete}\n />\n {isComplete && (\n <Image\n src={src}\n alt={alt}\n fill\n priority={priority}\n quality={quality}\n placeholder={placeholder}\n blurDataURL={blurDataURL}\n className=\"opacity-100 transition-opacity duration-150 ease-out z-[1]\"\n style={{\n objectFit,\n }}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["React","import_jsx_runtime","import_jsx_runtime","React","textStartIndex","scrambledContent","import_react","import_jsx_runtime","Link","import_react","import_jsx_runtime","Image"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/button.tsx","../src/lib/utils.ts","../src/components/tabs.tsx","../src/components/TextDecoder.tsx","../src/components/GlitchLink.tsx","../src/components/PixelLoad.tsx"],"sourcesContent":["// Export styles\nimport \"./styles.css\"\n\n// Export components\nexport { Button, buttonVariants, type ButtonProps } from \"./components/button\"\nexport { Tabs, TabsList, TabsTrigger, TabsContent } from \"./components/tabs\"\nexport { default as TextDecoder } from \"./components/TextDecoder\"\nexport type { TextDecoderProps } from \"./components/TextDecoder\"\nexport { default as GlitchLink } from \"./components/GlitchLink\"\nexport { PixelLoad } from \"./components/PixelLoad\"\nexport type { PixelLoadProps } from \"./components/PixelLoad\"\n\n// Export utilities\nexport { cn } from \"./lib/utils\"\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary/80 text-secondary-foreground hover:bg-secondary\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 text-sm px-3 py-2\",\n lg: \"h-10 px-8 py-2\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n icon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n asChild = false,\n loading = false,\n icon,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={loading || props.disabled}\n {...props}\n >\n {loading && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent\" />\n )}\n {!loading && icon && <span className=\"mr-2\">{icon}</span>}\n {props.children}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center rounded-3xl bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-3xl px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\nimport { cn } from \"@/lib/utils\"\nimport React, {\n useState,\n useEffect,\n useMemo,\n useRef,\n Suspense,\n ReactNode,\n} from \"react\"\n\n// The symbols to use for the scrambling effect (moved outside to avoid recreation)\nconst SYMBOLS = [\"\\\\\", \"-\", \"?\", \"/\", \"#\", \"!\", \"_\", \"+\", \"<\", \">\"]\nconst MAX_ITERATIONS = 3 // How many times to scramble\nconst SPEED = 400 // Speed in milliseconds between scrambles\n\n// Helper function moved outside component to avoid recreation\nconst scrambleText = (input: string): string => {\n if (!input) return \"\"\n\n return input\n .split(\" \")\n .map((word: string) => {\n if (!word) return \"\"\n const randomSymbol = SYMBOLS[Math.floor(Math.random() * SYMBOLS.length)]\n return randomSymbol.repeat(word.length)\n })\n .join(\" \")\n}\n\n// Extract text content from React nodes recursively\n// Also checks common text props like 'text', 'label', 'title', etc.\nconst extractText = (node: ReactNode): string => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node)\n }\n\n if (Array.isArray(node)) {\n return node.map(extractText).join(\"\")\n }\n\n if (React.isValidElement(node)) {\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n\n let result = \"\"\n\n // Extract text from props first (in order: text, label, title)\n if (typeof props.text === \"string\") {\n result += props.text\n }\n if (typeof props.label === \"string\") {\n result += props.label\n }\n if (typeof props.title === \"string\") {\n result += props.title\n }\n\n // Then extract from children\n if (props.children) {\n result += extractText(props.children)\n }\n\n return result\n }\n\n return \"\"\n}\n\n// Clone React nodes and replace text content with scrambled text\n// This function maps scrambled text back to the original structure\nconst scrambleReactNode = (\n node: ReactNode,\n scrambledText: string,\n textStartIndex: { current: number }\n): ReactNode => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n const text = String(node)\n // For each character in the original text, take the corresponding scrambled character\n // This preserves the length and structure\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n // Fallback if scrambled text is shorter (shouldn't happen, but safety check)\n scrambled += text[i]\n }\n }\n return scrambled\n }\n\n if (Array.isArray(node)) {\n return node.map((child, index) => {\n const scrambledChild = scrambleReactNode(\n child,\n scrambledText,\n textStartIndex\n )\n // Preserve original key if it exists, otherwise add one for React elements\n if (React.isValidElement(scrambledChild)) {\n const originalKey = React.isValidElement(child) ? child.key : null\n if (scrambledChild.key == null && originalKey == null) {\n return React.cloneElement(scrambledChild, { key: `decoded-${index}` })\n }\n // If original had a key but scrambled doesn't, preserve it\n if (scrambledChild.key == null && originalKey != null) {\n return React.cloneElement(scrambledChild, { key: originalKey })\n }\n }\n return scrambledChild\n })\n }\n\n if (React.isValidElement(node)) {\n // Regular element handling - works for all components\n const props = node.props as {\n children?: ReactNode\n text?: string\n label?: string\n title?: string\n [key: string]: unknown\n }\n const newProps = { ...props }\n\n // Handle text props in the same order as extraction (text, label, title)\n if (typeof props.text === \"string\") {\n const text = props.text\n let scrambled = \"\"\n for (let i = 0; i < text.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += text[i]\n }\n }\n newProps.text = scrambled\n }\n\n if (typeof props.label === \"string\") {\n const label = props.label\n let scrambled = \"\"\n for (let i = 0; i < label.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += label[i]\n }\n }\n newProps.label = scrambled\n }\n\n if (typeof props.title === \"string\") {\n const title = props.title\n let scrambled = \"\"\n for (let i = 0; i < title.length; i++) {\n if (textStartIndex.current < scrambledText.length) {\n scrambled += scrambledText[textStartIndex.current]\n textStartIndex.current++\n } else {\n scrambled += title[i]\n }\n }\n newProps.title = scrambled\n }\n\n // Handle children after props\n if (props.children) {\n newProps.children = scrambleReactNode(\n props.children,\n scrambledText,\n textStartIndex\n )\n }\n return React.cloneElement(node, newProps)\n }\n\n return node\n}\n\nexport interface TextDecoderProps {\n children: ReactNode\n className?: string\n delay?: number // Delay in milliseconds before starting animation\n}\n\nconst TextDecoder = ({ children, className, delay = 0 }: TextDecoderProps) => {\n const [displayContent, setDisplayContent] = useState<ReactNode>(null)\n const [hasAnimated, setHasAnimated] = useState(false)\n const [showDecoded, setShowDecoded] = useState(true)\n const elementRef = useRef<HTMLSpanElement>(null)\n\n // Extract full text for scrambling\n const fullText = useMemo(() => extractText(children), [children])\n\n // Memoize initial scrambled text\n const initialScrambled = useMemo(() => scrambleText(fullText), [fullText])\n\n // Initialize with scrambled content to prevent layout shift\n useEffect(() => {\n if (!hasAnimated && fullText) {\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n }\n }, [children, initialScrambled, hasAnimated, fullText])\n\n useEffect(() => {\n if (!fullText) {\n setDisplayContent(null)\n setShowDecoded(false)\n return\n }\n\n // If already animated, hide decoded and show children\n if (hasAnimated) {\n setShowDecoded(false)\n return\n }\n\n const element = elementRef.current\n if (!element) return\n\n let iteration = 0\n let intervalId: NodeJS.Timeout | null = null\n let delayTimeoutId: NodeJS.Timeout | null = null\n\n // Intersection Observer to detect when element is visible\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry.isIntersecting && !hasAnimated) {\n // Start animation after delay\n delayTimeoutId = setTimeout(() => {\n // 1. Initial scramble\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n initialScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n setShowDecoded(true)\n\n // 2. Set up the interval\n intervalId = setInterval(() => {\n iteration++\n\n if (iteration >= MAX_ITERATIONS) {\n // Stop scrambling, fade out decoded and fade in children\n setHasAnimated(true)\n setShowDecoded(false)\n if (intervalId) clearInterval(intervalId)\n } else {\n // Continue scrambling\n const newScrambled = scrambleText(fullText)\n const textStartIndex = { current: 0 }\n const scrambledContent = scrambleReactNode(\n children,\n newScrambled,\n textStartIndex\n )\n setDisplayContent(scrambledContent)\n }\n }, SPEED)\n }, delay)\n\n // Disconnect observer once animation starts\n observer.disconnect()\n }\n },\n {\n threshold: 0.1, // Trigger when 10% of the element is visible\n }\n )\n\n observer.observe(element)\n\n // Cleanup function\n return () => {\n observer.disconnect()\n if (intervalId) clearInterval(intervalId)\n if (delayTimeoutId) clearTimeout(delayTimeoutId)\n }\n }, [children, fullText, initialScrambled, hasAnimated, delay])\n\n const ariaLabel = useMemo(() => extractText(children), [children])\n\n return (\n <span\n ref={elementRef}\n aria-label={ariaLabel} // Accessibility: Screen readers read the real text\n className={cn(\"inline-grid\", className)}\n >\n {/* Both elements in the same grid cell - prevents width changes */}\n <span\n className={cn(\n \"transition-opacity duration-300 col-start-1 row-start-1\",\n hasAnimated ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n {children}\n </span>\n {/* Decoded animation overlay in the same grid cell */}\n {showDecoded && displayContent && (\n <span className=\"transition-opacity duration-300 col-start-1 row-start-1\">\n {displayContent}\n </span>\n )}\n </span>\n )\n}\n\nconst SuspenseDecodedText = (props: TextDecoderProps) => {\n return (\n <Suspense\n fallback={\n <span className={cn(\"opacity-0\", props.className)}>\n {props.children}\n </span>\n }\n >\n <TextDecoder {...props} />\n </Suspense>\n )\n}\n\nexport default SuspenseDecodedText\n","\"use client\"\nimport Link from \"next/link\"\nimport {\n RefAttributes,\n useState,\n ReactNode,\n cloneElement,\n isValidElement,\n} from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\n\nexport const DEFAULT_SYMBOLS = [\"/\", \"#\", \"*\"]\n\ntype GlitchLinkProps = RefAttributes<HTMLAnchorElement> & {\n href?: string\n children: ReactNode\n symbols?: string[]\n className?: string\n asChild?: boolean\n}\n\nconst GlitchLink = ({\n href,\n children,\n symbols = DEFAULT_SYMBOLS,\n className,\n asChild = false,\n ...props\n}: GlitchLinkProps) => {\n const [isHovering, setIsHovering] = useState(false)\n\n // Extract text from children - either direct string or from child element\n const getTextContent = (node: ReactNode): string => {\n if (typeof node === \"string\") return node\n if (isValidElement(node) && node.props.children) {\n return getTextContent(node.props.children)\n }\n return \"\"\n }\n\n const text = getTextContent(children)\n\n const getRandomGlitch = () => {\n if (!isHovering || !text) return text\n return text\n .split(\" \")\n .map((word: string) => {\n // take one random letter from the word\n const randomLetterIndex = Math.floor(Math.random() * word.length)\n\n // replace the letter with a random symbol\n return word.replace(\n word[randomLetterIndex],\n symbols[Math.floor(Math.random() * symbols.length)]\n )\n })\n .join(\" \")\n }\n\n const commonProps = {\n className,\n onMouseEnter: () => setIsHovering(true),\n onMouseLeave: () => setIsHovering(false),\n ...props,\n }\n\n if (asChild && isValidElement(children)) {\n const content = text ? (isHovering ? getRandomGlitch() : text) : children\n return (\n <Slot {...commonProps}>\n {cloneElement(children as React.ReactElement, {}, content)}\n </Slot>\n )\n }\n\n const content = text ? (isHovering ? getRandomGlitch() : children) : children\n\n return (\n <Link href={href || \"#\"} {...commonProps}>\n {content}\n </Link>\n )\n}\n\nexport default GlitchLink\n","\"use client\"\n\nimport Image, { type StaticImageData } from \"next/image\"\nimport { JSX, useCallback, useEffect, useRef, useState } from \"react\"\n\ntype PixelLoadStatus = \"loading\" | \"animating\" | \"complete\"\n\ntype ImageSrc = string | StaticImageData\n\nexport interface PixelLoadProps {\n src: ImageSrc\n alt: string\n duration?: number\n steps?: number\n className?: string\n onAnimationComplete?: () => void\n priority?: boolean\n quality?: number\n placeholder?: \"blur\" | \"empty\"\n blurDataURL?: string\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\"\n}\n\nfunction isStaticImageData(src: ImageSrc): src is StaticImageData {\n return typeof src === \"object\" && \"src\" in src\n}\n\nfunction getImageSrc(src: ImageSrc): string {\n return isStaticImageData(src) ? src.src : src\n}\n\nexport function PixelLoad({\n src,\n alt,\n duration = 600,\n steps = 15,\n className,\n onAnimationComplete,\n priority,\n quality,\n placeholder = \"empty\",\n blurDataURL,\n objectFit = \"cover\",\n}: PixelLoadProps): JSX.Element {\n const containerRef = useRef<HTMLDivElement>(null)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const [status, setStatus] = useState<PixelLoadStatus>(\"loading\")\n const [dimensions, setDimensions] = useState<{\n width: number\n height: number\n } | null>(null)\n\n const imageSrc = getImageSrc(src)\n\n const drawPixelated = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n pixelSize: number,\n w: number,\n h: number\n ): void => {\n ctx.imageSmoothingEnabled = false\n\n const sw = Math.max(1, Math.floor(w / pixelSize))\n const sh = Math.max(1, Math.floor(h / pixelSize))\n\n ctx.clearRect(0, 0, w, h)\n ctx.drawImage(img, 0, 0, sw, sh)\n ctx.drawImage(canvasRef.current!, 0, 0, sw, sh, 0, 0, w, h)\n },\n []\n )\n\n const runAnimation = useCallback(\n (\n ctx: CanvasRenderingContext2D,\n img: HTMLImageElement,\n w: number,\n h: number\n ): void => {\n const minPixelSize = Math.max(w, h) / 4\n const intervalMs = duration / steps\n let currentStep = 0\n\n setStatus(\"animating\")\n\n const animate = (): void => {\n const progress = currentStep / steps\n const pixelSize = Math.max(1, Math.floor(minPixelSize * (1 - progress)))\n\n drawPixelated(ctx, img, pixelSize, w, h)\n\n currentStep++\n\n if (currentStep <= steps) {\n window.setTimeout(animate, intervalMs)\n } else {\n setStatus(\"complete\")\n onAnimationComplete?.()\n }\n }\n\n animate()\n },\n [duration, steps, drawPixelated, onAnimationComplete]\n )\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const updateDimensions = (): void => {\n const { width, height } = container.getBoundingClientRect()\n setDimensions({ width: Math.floor(width), height: Math.floor(height) })\n }\n\n const resizeObserver = new ResizeObserver(updateDimensions)\n resizeObserver.observe(container)\n updateDimensions()\n\n return (): void => {\n resizeObserver.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (!dimensions) return\n\n // Guard against invalid dimensions\n if (dimensions.width <= 0 || dimensions.height <= 0) return\n\n const canvas = canvasRef.current\n if (!canvas) return\n\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return\n\n // Set canvas dimensions immediately to ensure it covers the area\n canvas.width = dimensions.width\n canvas.height = dimensions.height\n\n const img = new window.Image()\n img.crossOrigin = \"anonymous\"\n\n img.onload = (): void => {\n // Draw first frame immediately to prevent original image from showing\n const minPixelSize = Math.max(dimensions.width, dimensions.height) / 4\n drawPixelated(ctx, img, minPixelSize, dimensions.width, dimensions.height)\n // Then start animation\n runAnimation(ctx, img, dimensions.width, dimensions.height)\n }\n\n img.onerror = (): void => {\n console.error(\"PixelLoad: Failed to load image\")\n }\n\n img.src = imageSrc\n\n return (): void => {\n img.onload = null\n img.onerror = null\n }\n }, [imageSrc, dimensions, runAnimation, drawPixelated])\n\n const isComplete = status === \"complete\"\n const isAnimating = status === \"animating\" || status === \"loading\"\n\n return (\n <div\n ref={containerRef}\n className={`relative w-full h-full ${className || \"\"}`}\n >\n <canvas\n ref={canvasRef}\n className=\"absolute top-0 left-0 w-full h-full\"\n style={{\n objectFit,\n opacity: isComplete ? 0 : 1,\n zIndex: isAnimating ? 2 : 1,\n }}\n aria-hidden={isComplete}\n />\n {isComplete && (\n <Image\n src={src}\n alt={alt}\n fill\n priority={priority}\n quality={quality}\n placeholder={placeholder}\n blurDataURL={blurDataURL}\n className=\"opacity-100 transition-opacity duration-150 ease-out z-[1]\"\n style={{\n objectFit,\n }}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["React","import_jsx_runtime","import_jsx_runtime","React","textStartIndex","scrambledContent","import_react","import_react_slot","import_jsx_runtime","content","Link","import_react","import_jsx_runtime","Image"]}
|
package/dist/index.mjs
CHANGED
|
@@ -15,7 +15,7 @@ function cn(...inputs) {
|
|
|
15
15
|
// src/components/button.tsx
|
|
16
16
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
17
|
var buttonVariants = cva(
|
|
18
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
18
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
19
19
|
{
|
|
20
20
|
variants: {
|
|
21
21
|
variant: {
|
|
@@ -28,7 +28,7 @@ var buttonVariants = cva(
|
|
|
28
28
|
},
|
|
29
29
|
size: {
|
|
30
30
|
default: "h-9 px-4 py-2",
|
|
31
|
-
sm: "h-8 text-
|
|
31
|
+
sm: "h-8 text-sm px-3 py-2",
|
|
32
32
|
lg: "h-10 px-8 py-2",
|
|
33
33
|
icon: "h-9 w-9"
|
|
34
34
|
}
|
|
@@ -58,7 +58,7 @@ var Button = React.forwardRef(
|
|
|
58
58
|
disabled: loading || props.disabled,
|
|
59
59
|
...props,
|
|
60
60
|
children: [
|
|
61
|
-
loading && /* @__PURE__ */ jsx("div", { className: "mr-2 h-4 w-4 animate-spin rounded-full border
|
|
61
|
+
loading && /* @__PURE__ */ jsx("div", { className: "mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent" }),
|
|
62
62
|
!loading && icon && /* @__PURE__ */ jsx("span", { className: "mr-2", children: icon }),
|
|
63
63
|
props.children
|
|
64
64
|
]
|
|
@@ -78,7 +78,7 @@ var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
78
78
|
{
|
|
79
79
|
ref,
|
|
80
80
|
className: cn(
|
|
81
|
-
"inline-flex items-center justify-center rounded-
|
|
81
|
+
"inline-flex items-center justify-center rounded-3xl bg-muted p-1 text-muted-foreground",
|
|
82
82
|
className
|
|
83
83
|
),
|
|
84
84
|
...props
|
|
@@ -90,7 +90,7 @@ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
90
90
|
{
|
|
91
91
|
ref,
|
|
92
92
|
className: cn(
|
|
93
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-
|
|
93
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-3xl px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
|
|
94
94
|
className
|
|
95
95
|
),
|
|
96
96
|
...props
|
|
@@ -328,19 +328,19 @@ var TextDecoder = ({ children, className, delay = 0 }) => {
|
|
|
328
328
|
{
|
|
329
329
|
ref: elementRef,
|
|
330
330
|
"aria-label": ariaLabel,
|
|
331
|
-
className: cn("
|
|
331
|
+
className: cn("inline-grid", className),
|
|
332
332
|
children: [
|
|
333
333
|
/* @__PURE__ */ jsx3(
|
|
334
334
|
"span",
|
|
335
335
|
{
|
|
336
336
|
className: cn(
|
|
337
|
-
"transition-opacity duration-300",
|
|
337
|
+
"transition-opacity duration-300 col-start-1 row-start-1",
|
|
338
338
|
hasAnimated ? "opacity-100" : "opacity-0"
|
|
339
339
|
),
|
|
340
340
|
children
|
|
341
341
|
}
|
|
342
342
|
),
|
|
343
|
-
showDecoded && displayContent && /* @__PURE__ */ jsx3("span", { className: "
|
|
343
|
+
showDecoded && displayContent && /* @__PURE__ */ jsx3("span", { className: "transition-opacity duration-300 col-start-1 row-start-1", children: displayContent })
|
|
344
344
|
]
|
|
345
345
|
}
|
|
346
346
|
);
|
|
@@ -358,20 +358,33 @@ var TextDecoder_default = SuspenseDecodedText;
|
|
|
358
358
|
|
|
359
359
|
// src/components/GlitchLink.tsx
|
|
360
360
|
import Link from "next/link";
|
|
361
|
-
import {
|
|
361
|
+
import {
|
|
362
|
+
useState as useState2,
|
|
363
|
+
cloneElement,
|
|
364
|
+
isValidElement
|
|
365
|
+
} from "react";
|
|
366
|
+
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
362
367
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
363
368
|
var DEFAULT_SYMBOLS = ["/", "#", "*"];
|
|
364
369
|
var GlitchLink = ({
|
|
365
370
|
href,
|
|
366
371
|
children,
|
|
367
372
|
symbols = DEFAULT_SYMBOLS,
|
|
368
|
-
className
|
|
373
|
+
className,
|
|
374
|
+
asChild = false,
|
|
369
375
|
...props
|
|
370
376
|
}) => {
|
|
371
377
|
const [isHovering, setIsHovering] = useState2(false);
|
|
372
|
-
const
|
|
378
|
+
const getTextContent = (node) => {
|
|
379
|
+
if (typeof node === "string") return node;
|
|
380
|
+
if (isValidElement(node) && node.props.children) {
|
|
381
|
+
return getTextContent(node.props.children);
|
|
382
|
+
}
|
|
383
|
+
return "";
|
|
384
|
+
};
|
|
385
|
+
const text = getTextContent(children);
|
|
373
386
|
const getRandomGlitch = () => {
|
|
374
|
-
if (!isHovering || !text) return
|
|
387
|
+
if (!isHovering || !text) return text;
|
|
375
388
|
return text.split(" ").map((word) => {
|
|
376
389
|
const randomLetterIndex = Math.floor(Math.random() * word.length);
|
|
377
390
|
return word.replace(
|
|
@@ -380,17 +393,18 @@ var GlitchLink = ({
|
|
|
380
393
|
);
|
|
381
394
|
}).join(" ");
|
|
382
395
|
};
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
);
|
|
396
|
+
const commonProps = {
|
|
397
|
+
className,
|
|
398
|
+
onMouseEnter: () => setIsHovering(true),
|
|
399
|
+
onMouseLeave: () => setIsHovering(false),
|
|
400
|
+
...props
|
|
401
|
+
};
|
|
402
|
+
if (asChild && isValidElement(children)) {
|
|
403
|
+
const content2 = text ? isHovering ? getRandomGlitch() : text : children;
|
|
404
|
+
return /* @__PURE__ */ jsx4(Slot2, { ...commonProps, children: cloneElement(children, {}, content2) });
|
|
405
|
+
}
|
|
406
|
+
const content = text ? isHovering ? getRandomGlitch() : children : children;
|
|
407
|
+
return /* @__PURE__ */ jsx4(Link, { href: href || "#", ...commonProps, children: content });
|
|
394
408
|
};
|
|
395
409
|
var GlitchLink_default = GlitchLink;
|
|
396
410
|
|