@alkimi.org/ui-kit 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.github.md +63 -11
  2. package/README.md +2 -33
  3. package/README.npm.md +2 -33
  4. package/dist/components/GlitchLink.d.mts +12 -0
  5. package/dist/components/GlitchLink.d.ts +12 -0
  6. package/dist/components/GlitchLink.js +74 -0
  7. package/dist/components/GlitchLink.js.map +1 -0
  8. package/dist/components/GlitchLink.mjs +44 -0
  9. package/dist/components/GlitchLink.mjs.map +1 -0
  10. package/dist/components/PixelLoad.d.mts +20 -0
  11. package/dist/components/PixelLoad.d.ts +20 -0
  12. package/dist/components/PixelLoad.js +182 -0
  13. package/dist/components/PixelLoad.js.map +1 -0
  14. package/dist/components/PixelLoad.mjs +148 -0
  15. package/dist/components/PixelLoad.mjs.map +1 -0
  16. package/dist/components/TextDecoder.d.mts +15 -0
  17. package/dist/components/TextDecoder.d.ts +15 -0
  18. package/dist/components/TextDecoder.js +293 -0
  19. package/dist/components/TextDecoder.js.map +1 -0
  20. package/dist/components/TextDecoder.mjs +265 -0
  21. package/dist/components/TextDecoder.mjs.map +1 -0
  22. package/dist/components/button.d.mts +16 -0
  23. package/dist/components/button.d.ts +16 -0
  24. package/dist/components/button.js +109 -0
  25. package/dist/components/button.js.map +1 -0
  26. package/dist/components/button.mjs +74 -0
  27. package/dist/components/button.mjs.map +1 -0
  28. package/dist/components/card.d.mts +10 -0
  29. package/dist/components/card.d.ts +10 -0
  30. package/dist/components/card.js +115 -0
  31. package/dist/components/card.js.map +1 -0
  32. package/dist/components/card.mjs +76 -0
  33. package/dist/components/card.mjs.map +1 -0
  34. package/dist/index.css +250 -11
  35. package/dist/index.css.map +1 -1
  36. package/dist/index.d.mts +16 -21
  37. package/dist/index.d.ts +16 -21
  38. package/dist/index.js +467 -52
  39. package/dist/index.js.map +1 -1
  40. package/dist/index.mjs +467 -47
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/lib/utils.d.mts +5 -0
  43. package/dist/lib/utils.d.ts +5 -0
  44. package/dist/lib/utils.js +36 -0
  45. package/dist/lib/utils.js.map +1 -0
  46. package/dist/lib/utils.mjs +12 -0
  47. package/dist/lib/utils.mjs.map +1 -0
  48. package/dist/styles.css +250 -11
  49. package/dist/styles.css.map +1 -1
  50. package/package.json +48 -12
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/button.tsx","../src/lib/utils.ts","../src/components/card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm 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 text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\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}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\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\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\n"],"mappings":";;;AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AACrB,SAAS,WAA8B;;;ACFvC,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADwCM;AAvCN,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAChE,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;AErDrB,YAAYA,YAAW;AAQrB,gBAAAC,YAAA;AAJF,IAAM,OAAa,kBAGjB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,KAAK,cAAc;AAEnB,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;AAEzB,IAAM,YAAkB,kBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,kBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA,KAAC,SAAI,KAAU,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAAO,CACjE;AACD,YAAY,cAAc;AAE1B,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,WAAW,cAAc;","names":["React","jsx"]}
1
+ {"version":3,"sources":["../src/components/button.tsx","../src/lib/utils.ts","../src/components/tabs.tsx","../src/components/TextDecoder.tsx","../src/components/GlitchLink.tsx","../src/components/PixelLoad.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-[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 React, {\n useState,\n useEffect,\n useMemo,\n useRef,\n Suspense,\n ReactNode,\n} from \"react\"\nimport { cn } from \"../lib/utils\"\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, symbols: 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 symbols?: string[] // Symbols to use for scrambling effect\n maxIterations?: number // How many times to scramble\n speed?: number // Speed in milliseconds between scrambles\n}\n\nconst TextDecoder = ({\n children,\n className,\n delay = 0,\n symbols = SYMBOLS,\n maxIterations = MAX_ITERATIONS,\n speed = SPEED,\n}: TextDecoderProps) => {\n const [displayContent, setDisplayContent] = useState<ReactNode>(null)\n const [hasAnimated, setHasAnimated] = useState(false)\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(\n () => scrambleText(fullText, symbols),\n [fullText, symbols]\n )\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 }\n }, [children, initialScrambled, hasAnimated, fullText])\n\n useEffect(() => {\n if (!fullText) {\n setDisplayContent(null)\n return\n }\n\n // If already animated, show the final content\n if (hasAnimated) {\n setDisplayContent(children)\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\n // 2. Set up the interval\n intervalId = setInterval(() => {\n iteration++\n\n if (iteration >= maxIterations) {\n // Stop scrambling and show the real content\n setDisplayContent(children)\n setHasAnimated(true)\n if (intervalId) clearInterval(intervalId)\n } else {\n // Continue scrambling\n const newScrambled = scrambleText(fullText, symbols)\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 }, [\n children,\n fullText,\n initialScrambled,\n hasAnimated,\n delay,\n symbols,\n maxIterations,\n speed,\n ])\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={className}\n >\n {displayContent}\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 { SuspenseDecodedText }\nexport default TextDecoder\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","jsx","React","jsx","React","textStartIndex","scrambledContent","useState","jsx","useEffect","useRef","useState","jsx","jsxs"]}
@@ -0,0 +1,5 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+
5
+ export { cn };
@@ -0,0 +1,5 @@
1
+ import { ClassValue } from 'clsx';
2
+
3
+ declare function cn(...inputs: ClassValue[]): string;
4
+
5
+ export { cn };
@@ -0,0 +1,36 @@
1
+ "use client"
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/lib/utils.ts
22
+ var utils_exports = {};
23
+ __export(utils_exports, {
24
+ cn: () => cn
25
+ });
26
+ module.exports = __toCommonJS(utils_exports);
27
+ var import_clsx = require("clsx");
28
+ var import_tailwind_merge = require("tailwind-merge");
29
+ function cn(...inputs) {
30
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
31
+ }
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ cn
35
+ });
36
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;","names":[]}
@@ -0,0 +1,12 @@
1
+ "use client"
2
+
3
+ // src/lib/utils.ts
4
+ import { clsx } from "clsx";
5
+ import { twMerge } from "tailwind-merge";
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ export {
10
+ cn
11
+ };
12
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
package/dist/styles.css CHANGED
@@ -361,6 +361,52 @@ body {
361
361
  background-color: hsl(var(--background));
362
362
  color: hsl(var(--foreground));
363
363
  }
364
+ .\!container {
365
+ width: 100% !important;
366
+ margin-right: auto !important;
367
+ margin-left: auto !important;
368
+ padding-right: 2rem !important;
369
+ padding-left: 2rem !important;
370
+ }
371
+ .container {
372
+ width: 100%;
373
+ margin-right: auto;
374
+ margin-left: auto;
375
+ padding-right: 2rem;
376
+ padding-left: 2rem;
377
+ }
378
+ @media (min-width: 1400px) {
379
+ .\!container {
380
+ max-width: 1400px !important;
381
+ }
382
+ .container {
383
+ max-width: 1400px;
384
+ }
385
+ }
386
+ .visible {
387
+ visibility: visible;
388
+ }
389
+ .absolute {
390
+ position: absolute;
391
+ }
392
+ .relative {
393
+ position: relative;
394
+ }
395
+ .left-0 {
396
+ left: 0px;
397
+ }
398
+ .top-0 {
399
+ top: 0px;
400
+ }
401
+ .z-\[1\] {
402
+ z-index: 1;
403
+ }
404
+ .mr-2 {
405
+ margin-right: 0.5rem;
406
+ }
407
+ .mt-2 {
408
+ margin-top: 0.5rem;
409
+ }
364
410
  .flex {
365
411
  display: flex;
366
412
  }
@@ -370,44 +416,117 @@ body {
370
416
  .h-10 {
371
417
  height: 2.5rem;
372
418
  }
373
- .h-11 {
374
- height: 2.75rem;
419
+ .h-4 {
420
+ height: 1rem;
421
+ }
422
+ .h-8 {
423
+ height: 2rem;
375
424
  }
376
425
  .h-9 {
377
426
  height: 2.25rem;
378
427
  }
379
- .w-10 {
380
- width: 2.5rem;
428
+ .h-\[150px\] {
429
+ height: 150px;
430
+ }
431
+ .h-\[300px\] {
432
+ height: 300px;
433
+ }
434
+ .h-\[400px\] {
435
+ height: 400px;
436
+ }
437
+ .h-full {
438
+ height: 100%;
439
+ }
440
+ .w-4 {
441
+ width: 1rem;
442
+ }
443
+ .w-9 {
444
+ width: 2.25rem;
445
+ }
446
+ .w-\[200px\] {
447
+ width: 200px;
448
+ }
449
+ .w-\[300px\] {
450
+ width: 300px;
451
+ }
452
+ .w-\[350px\] {
453
+ width: 350px;
454
+ }
455
+ .w-\[400px\] {
456
+ width: 400px;
457
+ }
458
+ .w-full {
459
+ width: 100%;
460
+ }
461
+ .max-w-md {
462
+ max-width: 28rem;
463
+ }
464
+ @keyframes spin {
465
+ to {
466
+ transform: rotate(360deg);
467
+ }
468
+ }
469
+ .animate-spin {
470
+ animation: spin 1s linear infinite;
381
471
  }
382
472
  .flex-col {
383
473
  flex-direction: column;
384
474
  }
475
+ .flex-wrap {
476
+ flex-wrap: wrap;
477
+ }
385
478
  .items-center {
386
479
  align-items: center;
387
480
  }
388
481
  .justify-center {
389
482
  justify-content: center;
390
483
  }
484
+ .gap-2 {
485
+ gap: 0.5rem;
486
+ }
487
+ .gap-4 {
488
+ gap: 1rem;
489
+ }
391
490
  .space-y-1\.5 > :not([hidden]) ~ :not([hidden]) {
392
491
  --tw-space-y-reverse: 0;
393
492
  margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));
394
493
  margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));
395
494
  }
495
+ .space-y-4 > :not([hidden]) ~ :not([hidden]) {
496
+ --tw-space-y-reverse: 0;
497
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
498
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
499
+ }
500
+ .overflow-hidden {
501
+ overflow: hidden;
502
+ }
396
503
  .whitespace-nowrap {
397
504
  white-space: nowrap;
398
505
  }
506
+ .rounded-\[3\.75rem\] {
507
+ border-radius: 3.75rem;
508
+ }
509
+ .rounded-full {
510
+ border-radius: 9999px;
511
+ }
399
512
  .rounded-lg {
400
513
  border-radius: var(--radius);
401
514
  }
402
- .rounded-md {
403
- border-radius: calc(var(--radius) - 2px);
404
- }
405
515
  .border {
406
516
  border-width: 1px;
407
517
  }
518
+ .border-\[1\.33px\] {
519
+ border-width: 1.33px;
520
+ }
408
521
  .border-input {
409
522
  border-color: hsl(var(--input));
410
523
  }
524
+ .border-primary-foreground {
525
+ border-color: hsl(var(--primary-foreground));
526
+ }
527
+ .border-t-transparent {
528
+ border-top-color: transparent;
529
+ }
411
530
  .bg-background {
412
531
  background-color: hsl(var(--background));
413
532
  }
@@ -417,11 +536,21 @@ body {
417
536
  .bg-destructive {
418
537
  background-color: hsl(var(--destructive));
419
538
  }
539
+ .bg-gray-100 {
540
+ --tw-bg-opacity: 1;
541
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1));
542
+ }
543
+ .bg-muted {
544
+ background-color: hsl(var(--muted));
545
+ }
420
546
  .bg-primary {
421
547
  background-color: hsl(var(--primary));
422
548
  }
423
- .bg-secondary {
424
- background-color: hsl(var(--secondary));
549
+ .bg-secondary\/80 {
550
+ background-color: hsl(var(--secondary) / 0.8);
551
+ }
552
+ .p-1 {
553
+ padding: 0.25rem;
425
554
  }
426
555
  .p-6 {
427
556
  padding: 1.5rem;
@@ -438,6 +567,10 @@ body {
438
567
  padding-left: 2rem;
439
568
  padding-right: 2rem;
440
569
  }
570
+ .py-1 {
571
+ padding-top: 0.25rem;
572
+ padding-bottom: 0.25rem;
573
+ }
441
574
  .py-2 {
442
575
  padding-top: 0.5rem;
443
576
  padding-bottom: 0.5rem;
@@ -445,32 +578,82 @@ body {
445
578
  .pt-0 {
446
579
  padding-top: 0px;
447
580
  }
581
+ .text-center {
582
+ text-align: center;
583
+ }
584
+ .font-mono {
585
+ font-family:
586
+ ui-monospace,
587
+ SFMono-Regular,
588
+ Menlo,
589
+ Monaco,
590
+ Consolas,
591
+ "Liberation Mono",
592
+ "Courier New",
593
+ monospace;
594
+ }
448
595
  .text-2xl {
449
596
  font-size: 1.5rem;
450
597
  line-height: 2rem;
451
598
  }
599
+ .text-3xl {
600
+ font-size: 1.875rem;
601
+ line-height: 2.25rem;
602
+ }
603
+ .text-4xl {
604
+ font-size: 2.25rem;
605
+ line-height: 2.5rem;
606
+ }
607
+ .text-\[0\.75rem\] {
608
+ font-size: 0.75rem;
609
+ }
610
+ .text-\[0\.875rem\] {
611
+ font-size: 0.875rem;
612
+ }
613
+ .text-lg {
614
+ font-size: 1.125rem;
615
+ line-height: 1.75rem;
616
+ }
452
617
  .text-sm {
453
618
  font-size: 0.875rem;
454
619
  line-height: 1.25rem;
455
620
  }
621
+ .text-xl {
622
+ font-size: 1.25rem;
623
+ line-height: 1.75rem;
624
+ }
625
+ .font-bold {
626
+ font-weight: 700;
627
+ }
456
628
  .font-medium {
457
629
  font-weight: 500;
458
630
  }
459
631
  .font-semibold {
460
632
  font-weight: 600;
461
633
  }
634
+ .italic {
635
+ font-style: italic;
636
+ }
462
637
  .leading-none {
463
638
  line-height: 1;
464
639
  }
465
640
  .tracking-tight {
466
641
  letter-spacing: -0.025em;
467
642
  }
643
+ .text-blue-600 {
644
+ --tw-text-opacity: 1;
645
+ color: rgb(37 99 235 / var(--tw-text-opacity, 1));
646
+ }
468
647
  .text-card-foreground {
469
648
  color: hsl(var(--card-foreground));
470
649
  }
471
650
  .text-destructive-foreground {
472
651
  color: hsl(var(--destructive-foreground));
473
652
  }
653
+ .text-green-500 {
654
+ --tw-text-opacity: 1;
655
+ color: rgb(34 197 94 / var(--tw-text-opacity, 1));
656
+ }
474
657
  .text-muted-foreground {
475
658
  color: hsl(var(--muted-foreground));
476
659
  }
@@ -480,12 +663,28 @@ body {
480
663
  .text-primary-foreground {
481
664
  color: hsl(var(--primary-foreground));
482
665
  }
666
+ .text-purple-600 {
667
+ --tw-text-opacity: 1;
668
+ color: rgb(147 51 234 / var(--tw-text-opacity, 1));
669
+ }
483
670
  .text-secondary-foreground {
484
671
  color: hsl(var(--secondary-foreground));
485
672
  }
673
+ .underline {
674
+ text-decoration-line: underline;
675
+ }
676
+ .no-underline {
677
+ text-decoration-line: none;
678
+ }
486
679
  .underline-offset-4 {
487
680
  text-underline-offset: 4px;
488
681
  }
682
+ .opacity-0 {
683
+ opacity: 0;
684
+ }
685
+ .opacity-100 {
686
+ opacity: 1;
687
+ }
489
688
  .shadow-sm {
490
689
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
491
690
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
@@ -500,6 +699,15 @@ body {
500
699
  .ring-offset-background {
501
700
  --tw-ring-offset-color: hsl(var(--background));
502
701
  }
702
+ .blur {
703
+ --tw-blur: blur(8px);
704
+ 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);
705
+ }
706
+ .transition-all {
707
+ transition-property: all;
708
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
709
+ transition-duration: 150ms;
710
+ }
503
711
  .transition-colors {
504
712
  transition-property:
505
713
  color,
@@ -511,6 +719,17 @@ body {
511
719
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
512
720
  transition-duration: 150ms;
513
721
  }
722
+ .transition-opacity {
723
+ transition-property: opacity;
724
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
725
+ transition-duration: 150ms;
726
+ }
727
+ .duration-150 {
728
+ transition-duration: 150ms;
729
+ }
730
+ .ease-out {
731
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
732
+ }
514
733
  @keyframes enter {
515
734
  from {
516
735
  opacity: var(--tw-enter-opacity, 1);
@@ -523,6 +742,12 @@ body {
523
742
  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));
524
743
  }
525
744
  }
745
+ .duration-150 {
746
+ animation-duration: 150ms;
747
+ }
748
+ .ease-out {
749
+ animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
750
+ }
526
751
  .hover\:bg-accent:hover {
527
752
  background-color: hsl(var(--accent));
528
753
  }
@@ -532,8 +757,8 @@ body {
532
757
  .hover\:bg-primary\/90:hover {
533
758
  background-color: hsl(var(--primary) / 0.9);
534
759
  }
535
- .hover\:bg-secondary\/80:hover {
536
- background-color: hsl(var(--secondary) / 0.8);
760
+ .hover\:bg-secondary:hover {
761
+ background-color: hsl(var(--secondary));
537
762
  }
538
763
  .hover\:text-accent-foreground:hover {
539
764
  color: hsl(var(--accent-foreground));
@@ -565,4 +790,18 @@ body {
565
790
  .disabled\:opacity-50:disabled {
566
791
  opacity: 0.5;
567
792
  }
793
+ .data-\[state\=active\]\:bg-background[data-state=active] {
794
+ background-color: hsl(var(--background));
795
+ }
796
+ .data-\[state\=active\]\:text-foreground[data-state=active] {
797
+ color: hsl(var(--foreground));
798
+ }
799
+ .data-\[state\=active\]\:shadow-sm[data-state=active] {
800
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
801
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
802
+ box-shadow:
803
+ var(--tw-ring-offset-shadow, 0 0 #0000),
804
+ var(--tw-ring-shadow, 0 0 #0000),
805
+ var(--tw-shadow);
806
+ }
568
807
  /*# sourceMappingURL=index.css.map */