@ekoru/ui 0.1.2 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","className","variant","size","fullWidth","isLoading","leftIcon","rightIcon","children","disabled","props","ref","MotionButton","motion","jsxs","AnimatePresence","jsx"],"mappings":"2NAUO,SAASA,KAAMC,CAAAA,CAAsB,CAC1C,OAAOC,OAAAA,CAAQC,KAAKF,CAAM,CAAC,CAC7B,CCPA,IAAMG,CAAAA,CAAiBC,GAAAA,CACrB,qOACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CACE,kGAAA,CACF,SAAA,CACE,gGAAA,CACF,QACE,2GAAA,CACF,KAAA,CAAO,mDAAA,CACP,OAAA,CACE,mGACF,OAAA,CACE,kGAAA,CACF,KAAA,CACE,0FACJ,EACA,IAAA,CAAM,CACJ,EAAA,CAAI,2BAAA,CACJ,GAAI,gCAAA,CACJ,EAAA,CAAI,4BACN,CAAA,CACA,UAAW,CACT,IAAA,CAAM,QACR,CACF,EACA,eAAA,CAAiB,CACf,OAAA,CAAS,SAAA,CACT,KAAM,IACR,CACF,CACF,CAAA,CA2BMC,EAAe,CAAA,CAAA,UAAA,CACnB,CACE,CACE,SAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CACAC,IACG,CACH,IAAMC,CAAAA,CAAeC,MAAAA,CAAO,OAE5B,OACEC,IAAAA,CAACF,CAAAA,CAAA,CACC,UAAWlB,CAAAA,CAAGI,CAAAA,CAAe,CAAE,OAAA,CAAAI,EAAS,IAAA,CAAAC,CAAAA,CAAM,SAAA,CAAAC,CAAAA,CAAW,UAAAH,CAAU,CAAC,CAAC,CAAA,CACrE,IAAKU,CAAAA,CACL,QAAA,CAAUF,CAAAA,EAAYJ,CAAAA,CACtB,WAAY,CAAE,KAAA,CAAO,IAAA,CAAM,CAAA,CAAG,EAAG,CAAA,CACjC,QAAA,CAAU,CAAE,KAAA,CAAO,IAAM,CAAA,CAAG,CAAE,CAAA,CAC9B,UAAA,CAAY,CAAE,IAAA,CAAM,QAAA,CAAU,SAAA,CAAW,GAAA,CAAK,QAAS,EAAG,CAAA,CACzD,GAAGK,CAAAA,CAEJ,UAAAI,IAAAA,CAACC,eAAAA,CAAA,CAAgB,IAAA,CAAK,OACnB,QAAA,CAAA,CAAAV,CAAAA,EACCS,IAAAA,CAACD,MAAAA,CAAO,IAAP,CAEC,OAAA,CAAS,CAAE,OAAA,CAAS,EAAG,KAAA,CAAO,EAAI,CAAA,CAClC,OAAA,CAAS,CAAE,OAAA,CAAS,CAAA,CAAG,KAAA,CAAO,CAAE,EAChC,IAAA,CAAM,CAAE,OAAA,CAAS,CAAA,CAAG,MAAO,EAAI,CAAA,CAC/B,UAAA,CAAY,CAAE,SAAU,EAAI,CAAA,CAC5B,SAAA,CAAU,2BAAA,CACV,MAAM,4BAAA,CACN,IAAA,CAAK,MAAA,CACL,OAAA,CAAQ,YAER,QAAA,CAAA,CAAAG,GAAAA,CAAC,QAAA,CAAA,CACC,SAAA,CAAU,aACV,EAAA,CAAG,IAAA,CACH,EAAA,CAAG,IAAA,CACH,EAAE,IAAA,CACF,MAAA,CAAO,cAAA,CACP,WAAA,CAAY,IACd,CAAA,CACAA,GAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,aACV,IAAA,CAAK,cAAA,CACL,CAAA,CAAE,iHAAA,CACJ,IAtBI,SAuBN,CAAA,CAED,CAACX,CAAAA,EAAaC,GACbU,GAAAA,CAACH,MAAAA,CAAO,IAAA,CAAP,CAEC,QAAS,CAAE,OAAA,CAAS,CAAA,CAAG,KAAA,CAAO,EAAI,CAAA,CAClC,OAAA,CAAS,CAAE,OAAA,CAAS,EAAG,KAAA,CAAO,CAAE,CAAA,CAChC,IAAA,CAAM,CAAE,OAAA,CAAS,CAAA,CAAG,KAAA,CAAO,EAAI,EAC/B,UAAA,CAAY,CAAE,QAAA,CAAU,EAAI,EAC5B,SAAA,CAAU,4DAAA,CAET,QAAA,CAAM,CAAA,CAAA,cAAA,CAAeP,CAAQ,CAAA,CAC1BA,CAAAA,CACM,CAAA,CAAA,aAAA,CAAcA,CAAAA,CAA+B,CACjD,IAAA,CAAM,EAAA,CACN,SAAA,CAAW,eACb,CAAC,CAAA,CAAA,CAZD,UAaN,CAAA,CAAA,CAEJ,CAAA,CACCE,EACA,CAACH,CAAAA,EAAaE,CAAAA,EACbS,GAAAA,CAAC,QAAK,SAAA,CAAU,4DAAA,CACb,QAAA,CAAM,CAAA,CAAA,cAAA,CAAeT,CAAS,CAAA,CAC3BA,CAAAA,CACM,CAAA,CAAA,aAAA,CAAcA,CAAAA,CAAgC,CAClD,IAAA,CAAM,EAAA,CACN,SAAA,CAAW,eACb,CAAC,CAAA,CACP,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAP,EAAO,WAAA,CAAc,QAAA","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx for conditional classes and twMerge for proper Tailwind merging\n * \n * @example\n * cn('px-2 py-1', condition && 'bg-blue-500', 'hover:bg-blue-600')\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/utils/cn';\nimport { motion, AnimatePresence } from 'motion/react';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center rounded-lg font-medium 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',\n {\n variants: {\n variant: {\n primary:\n 'border-2 border-primary bg-primary text-white hover:bg-primary/90 active:bg-primary/80 shadow-md',\n secondary:\n 'border-2 border-secondary bg-secondary text-white hover:bg-secondary/90 active:bg-secondary/80',\n outline:\n 'border-2 border-primary text-primary hover:bg-primary/5 hover:text-accent-foreground active:bg-primary/10',\n ghost: 'hover:bg-muted active:bg-muted/80 text-foreground',\n success:\n 'border-2 border-success bg-success text-white hover:bg-success/90 active:bg-success/80 shadow-md',\n warning:\n 'border-2 border-warning bg-warning text-white hover:bg-warning/90 active:bg-warning/80 shadow-md',\n error:\n 'border-2 border-error bg-error text-white hover:bg-error/90 active:bg-error/80 shadow-md',\n },\n size: {\n sm: 'min-h-9 px-3 py-2 text-sm',\n md: 'min-h-11 px-6 py-2.5 text-base',\n lg: 'min-h-14 px-8 py-3 text-lg',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\nexport interface ButtonProps\n extends\n Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n | 'onDrag'\n | 'onDragEnd'\n | 'onDragStart'\n | 'onAnimationStart'\n | 'onAnimationEnd'\n >,\n VariantProps<typeof buttonVariants> {\n /**\n * If true, the button will show a loading spinner\n */\n isLoading?: boolean;\n /**\n * Icon to display before the button text (can be a lucide-react component or JSX element)\n */\n leftIcon?: React.ElementType | React.ReactElement;\n /**\n * Icon to display after the button text (can be a lucide-react component or JSX element)\n */\n rightIcon?: React.ElementType | React.ReactElement;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n fullWidth,\n isLoading,\n leftIcon,\n rightIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const MotionButton = motion.button;\n\n return (\n <MotionButton\n className={cn(buttonVariants({ variant, size, fullWidth, className }))}\n ref={ref}\n disabled={disabled || isLoading}\n whileHover={{ scale: 1.02, y: -2 }}\n whileTap={{ scale: 0.96, y: 0 }}\n transition={{ type: 'spring', stiffness: 400, damping: 17 }}\n {...props}\n >\n <AnimatePresence mode=\"wait\">\n {isLoading && (\n <motion.svg\n key=\"spinner\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.2 }}\n className=\"mr-2 h-4 w-4 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </motion.svg>\n )}\n {!isLoading && leftIcon && (\n <motion.span\n key=\"leftIcon\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.2 }}\n className=\"mr-2 inline-flex items-center justify-center flex-shrink-0\"\n >\n {React.isValidElement(leftIcon)\n ? leftIcon\n : React.createElement(leftIcon as React.ElementType, {\n size: 18,\n className: 'flex-shrink-0',\n })}\n </motion.span>\n )}\n </AnimatePresence>\n {children}\n {!isLoading && rightIcon && (\n <span className=\"ml-2 inline-flex items-center justify-center flex-shrink-0\">\n {React.isValidElement(rightIcon)\n ? rightIcon\n : React.createElement(rightIcon as React.ElementType, {\n size: 18,\n className: 'flex-shrink-0',\n })}\n </span>\n )}\n </MotionButton>\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n"]}
1
+ {"version":3,"sources":["../src/utils/cn.ts","../src/components/AdBanner/AdBanner.tsx","../src/components/Banner/Banner.tsx","../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Modal/Modal.tsx","../src/components/EnvironmentalImpactModal/EnvironmentalImpactModal.tsx","../src/components/Footer/Footer.tsx","../src/components/Navigation/Navigation.tsx","../src/components/Select/Select.tsx","../src/components/Pagination/Pagination.tsx","../src/components/ProductCard/FrontSide.tsx","../src/components/ProductCard/BackSide.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/StatsCard/StatsCard.tsx","../src/components/Text/Text.tsx","../src/components/Textarea/Textarea.tsx","../src/components/TextInput/TextInput.tsx","../src/components/Title/Title.tsx"],"names":["cn","inputs","twMerge","clsx","adBannerVariants","cva","AdBanner","Fe","icon","title","description","cta","variant","animated","className","props","ref","MotionDiv","motion","Icon","jsx","jsxs","AdBanner_default","bannerVariants","dotVariants","Banner","ze","showDots","buttonVariants","Button","U","size","fullWidth","isLoading","leftIcon","rightIcon","children","disabled","loadingText","MotionButton","AnimatePresence","Loader2","Card","image","hasBadge","badgeText","badgeColor","textColor","Image","checkboxVariants","Checkbox","ue","label","errorMessage","checked","onCheckedChange","onChange","id","name","iconSizes","handleChange","e","newChecked","reactId","generatedId","Check","modalVariants","Modal","isOpen","onClose","showCloseButton","closeOnOverlayClick","closeOnEscape","useEffect","handleEscape","originalOverflow","createPortal","X","EnvironmentalImpactModal","environmentalImpact","co2SavingsTitle","waterSavingsTitle","weightLabel","co2SavingsLabel","waterSavingsLabel","materialBreakdownLabel","carDistanceLabel","showerCountLabel","co2EquivalenceLabel","waterEquivalenceLabel","infoText","formatNumber","num","Leaf","Droplets","Info","material","index","Footer","brand","socialLinks","exploreItems","exploreLabel","communityItems","communityLabel","legalItems","legalLabel","copyRightText","item","Navbar","navigationIcons","navigationLinks","searchPlaceholder","onSearch","mobileMenuContent","searchEnabled","sideMenuTitle","navbarAriaLabel","userActionsAriaLabel","toggleMobileMenuAriaLabel","closeMobileMenuAriaLabel","mobileMenuTitleAriaLabel","isMobileMenuOpen","setIsMobileMenuOpen","useState","searchQuery","setSearchQuery","closeMobileMenu","handleSearchChange","handleSearchSubmit","handleKeyDown","event","Fragment","Search","Menu","selectVariants","Select","LeftIcon","value","options","width","readOnly","showColorIcon","renderOption","dropdownDirection","placeholder","noResultsText","isFocused","setIsFocused","setIsOpen","search","setSearch","highlightedIndex","setHighlightedIndex","dropdownPosition","setDropdownPosition","mounted","setMounted","containerRef","buttonRef","dropdownRef","listboxId","selectedOption","o","filteredOptions","widthClass","computedHasError","updateDropdownPosition","rect","handleClickOutside","handleFocus","handleBlur","renderLabel","option","Circle","i","dropdownContent","idx","node","ChevronDown","paginationButtonVariants","Pagination","tt","currentPage","totalPages","onPageChange","itemsPerPage","onItemsPerPageChange","previousLabel","nextLabel","rowsLabel","previousAriaLabel","nextAriaLabel","showItemsPerPage","itemsPerPageOptions","showPageInfo","pageInfoTemplate","showIcons","rowsOptions","pageInfo","handlePrevious","handleNext","ChevronLeft","ChevronRight","CardFrontSide","isFlipped","setIsFlipped","onCardClick","productImage","fallbackImage","productCondition","price","color","isExchangeable","isStoreProduct","hasOffer","offerPrice","onAddToCart","onExchange","addToCartAriaLabel","exchangeAriaLabel","offerLabel","localeString","addToCartLabel","exchangeLabel","interests","conditionColorMap","getConditionColor","condition","RotateCcw","interest","ShoppingCart","IterationCw","CardBackSide","setShowImpactModal","sellerName","sellerPhone","sellerAddress","impactLabel","materialsLabel","viewMoreLabel","sellerLabel","co2Label","waterLabel","calculateImpactLevel","co2","normalizedImpact","materialBreakdown","m","mm","materialType","percentage","weightKG","co2SavingsKG","waterSavingsLT","totalCo2SavingsKG","s","totalWaterSavingsLT","impactLevel","UserRound","Phone","MapPin","ProductCard","product","showImpactModal","images","seller","storeHasOffer","storeOfferPrice","envImpactModal","backImpact","StatsCard","mainText","textVariants","Text","dt","weight","align","as","htmlFor","textareaVariants","Textarea","ne","textSize","showCharCount","maxLength","currentLength","inputVariants","TextInput","de","hasError","type","onFocus","onBlur","showPassword","setShowPassword","isPassword","inputType","togglePasswordVisibility","prev","EyeOff","Eye","titleVariants","Title","ut","level"],"mappings":"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","file":"index.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx for conditional classes and twMerge for proper Tailwind merging\n * \n * @example\n * cn('px-2 py-1', condition && 'bg-blue-500', 'hover:bg-blue-600')\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { type LucideIcon } from 'lucide-react';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion } from 'motion/react';\r\n\r\nconst adBannerVariants = cva(\r\n 'w-full border-t border-b overflow-hidden rounded-none',\r\n {\r\n variants: {\r\n variant: {\r\n primary:\r\n 'bg-gradient-to-r from-primary-dark via-primary to-primary-dark text-white',\r\n secondary:\r\n 'bg-gradient-to-r from-secondary-dark via-secondary to-secondary-dark text-white',\r\n outlined: 'bg-background border border-primary text-foreground',\r\n ghost: 'bg-white/50 text-foreground',\r\n },\r\n animated: {\r\n true: '',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'primary',\r\n animated: true,\r\n },\r\n }\r\n);\r\n\r\nexport interface AdBannerProps\r\n extends\r\n Omit<\r\n React.HTMLAttributes<HTMLElement>,\r\n | 'onDrag'\r\n | 'onDragEnd'\r\n | 'onDragStart'\r\n | 'onAnimationStart'\r\n | 'onAnimationEnd'\r\n >,\r\n VariantProps<typeof adBannerVariants> {\r\n icon?: LucideIcon;\r\n title?: string;\r\n description?: string;\r\n cta: React.ReactNode;\r\n}\r\n\r\nconst AdBanner = React.forwardRef<HTMLDivElement, AdBannerProps>(\r\n (\r\n { icon, title, description, cta, variant, animated, className, ...props },\r\n ref\r\n ) => {\r\n const MotionDiv = motion.div;\r\n const Icon = icon as LucideIcon | undefined;\r\n\r\n return (\r\n <MotionDiv\r\n ref={ref}\r\n initial={{ opacity: 0, y: -8 }}\r\n whileInView={{ opacity: 1, y: 0 }}\r\n viewport={{ once: true }}\r\n transition={{ duration: 0.45 }}\r\n className={cn(\r\n adBannerVariants({ variant, animated }),\r\n 'p-4 md:p-5',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <motion.div\r\n className={cn(\r\n 'flex flex-col sm:flex-row',\r\n 'items-center',\r\n 'gap-4 py-2 px-2',\r\n 'justify-between'\r\n )}\r\n >\r\n <motion.div\r\n className={cn(\r\n 'flex flex-col',\r\n 'items-center sm:items-start',\r\n 'justify-center'\r\n )}\r\n >\r\n {Icon && (\r\n <motion.div\r\n className={cn(\r\n 'w-20 h-20',\r\n 'flex items-center justify-center',\r\n 'rounded-lg',\r\n 'mb-2',\r\n {\r\n 'bg-white/10':\r\n variant === 'primary' || variant === 'secondary',\r\n 'bg-primary/10':\r\n variant === 'outlined' || variant === 'ghost',\r\n }\r\n )}\r\n >\r\n <Icon\r\n className={cn('w-10 h-10', {\r\n 'text-white':\r\n variant === 'primary' || variant === 'secondary',\r\n 'text-primary':\r\n variant === 'outlined' || variant === 'ghost',\r\n })}\r\n />\r\n </motion.div>\r\n )}\r\n\r\n {title && (\r\n <motion.h3\r\n className={cn(\r\n 'text-lg font-bold',\r\n 'text-center sm:text-left',\r\n 'mb-1'\r\n )}\r\n >\r\n {title}\r\n </motion.h3>\r\n )}\r\n\r\n {description && (\r\n <motion.p\r\n className={cn(\r\n 'text-sm text-center sm:text-left',\r\n 'text-muted',\r\n 'mb-0'\r\n )}\r\n >\r\n {description}\r\n </motion.p>\r\n )}\r\n </motion.div>\r\n\r\n <motion.div className={cn('flex items-center justify-center')}>\r\n {cta}\r\n </motion.div>\r\n </motion.div>\r\n </MotionDiv>\r\n );\r\n }\r\n);\r\n\r\nAdBanner.displayName = 'AdBanner';\r\n\r\nexport default AdBanner;\r\nexport { adBannerVariants };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion } from 'motion/react';\r\n\r\nconst bannerVariants = cva(\r\n 'p-4 md:p-5 rounded-xl w-[95%] mx-auto overflow-hidden relative',\r\n {\r\n variants: {\r\n variant: {\r\n primary:\r\n 'border-2 border-transparent bg-gradient-to-r from-primary-dark via-primary to-primary-dark text-white shadow-lg',\r\n secondary:\r\n 'border-2 border-transparent bg-gradient-to-r from-secondary-dark via-secondary to-secondary-dark text-white shadow-lg',\r\n outlined:\r\n 'border-2 border-primary shadow-lg bg-background backdrop-blur',\r\n ghost: 'border-2 border-transparent bg-white/50 backdrop-blur',\r\n },\r\n animated: {\r\n true: '',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'primary',\r\n animated: true,\r\n },\r\n }\r\n);\r\n\r\nconst dotVariants = cva('w-3 h-3 rounded-full inline-block', {\r\n variants: {\r\n variant: {\r\n primary: 'bg-white shadow-lg shadow-white/50',\r\n secondary: 'bg-white',\r\n outlined: 'bg-primary',\r\n ghost: 'bg-gray-600',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'primary',\r\n },\r\n});\r\n\r\nexport interface BannerProps\r\n extends\r\n Omit<\r\n React.HTMLAttributes<HTMLDivElement>,\r\n | 'onDrag'\r\n | 'onDragEnd'\r\n | 'onDragStart'\r\n | 'onAnimationStart'\r\n | 'onAnimationEnd'\r\n >,\r\n VariantProps<typeof bannerVariants> {\r\n /**\r\n * The main title text of the banner\r\n */\r\n title: string;\r\n /**\r\n * The description text of the banner\r\n */\r\n description: string;\r\n /**\r\n * Whether to show decorative dots around the title\r\n */\r\n showDots?: boolean;\r\n}\r\n\r\nconst Banner = React.forwardRef<HTMLDivElement, BannerProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n animated,\r\n title,\r\n description,\r\n showDots = true,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const MotionDiv = motion.div;\r\n\r\n return (\r\n <MotionDiv\r\n ref={ref}\r\n initial={{ opacity: 0, y: -20 }}\r\n whileInView={{ opacity: 1, y: 0 }}\r\n viewport={{ once: true }}\r\n transition={{ duration: 0.6 }}\r\n className={cn(bannerVariants({ variant, animated, className }))}\r\n {...props}\r\n >\r\n {/* Subtle animated background for primary variant */}\r\n {animated && variant === 'primary' && (\r\n <motion.div\r\n animate={{\r\n x: ['-100%', '100%'],\r\n }}\r\n transition={{\r\n duration: 15,\r\n repeat: Infinity,\r\n ease: 'linear',\r\n }}\r\n className={cn(\r\n 'absolute inset-0',\r\n 'bg-gradient-to-r from-transparent via-white/10 to-transparent'\r\n )}\r\n />\r\n )}\r\n\r\n <motion.div className=\"relative z-10\">\r\n <motion.div\r\n className={cn(\r\n 'flex flex-1 justify-center items-center',\r\n 'gap-2 md:gap-3',\r\n 'mb-3'\r\n )}\r\n >\r\n {showDots && (\r\n <motion.span\r\n initial={{ scale: 0 }}\r\n whileInView={{ scale: 1 }}\r\n viewport={{ once: true }}\r\n transition={{ delay: 0.2, type: 'spring' }}\r\n className={cn(dotVariants({ variant }))}\r\n />\r\n )}\r\n <motion.h2\r\n initial={{ opacity: 0 }}\r\n whileInView={{ opacity: 1 }}\r\n viewport={{ once: true }}\r\n transition={{ delay: 0.3 }}\r\n className={cn(\r\n 'text-base sm:text-lg md:text-2xl',\r\n 'font-bold',\r\n 'text-center',\r\n 'tracking-tight'\r\n )}\r\n >\r\n {title}\r\n </motion.h2>\r\n {showDots && (\r\n <motion.span\r\n initial={{ scale: 0 }}\r\n whileInView={{ scale: 1 }}\r\n viewport={{ once: true }}\r\n transition={{ delay: 0.4, type: 'spring' }}\r\n className={cn(dotVariants({ variant }))}\r\n />\r\n )}\r\n </motion.div>\r\n <motion.p\r\n initial={{ opacity: 0, y: 10 }}\r\n whileInView={{ opacity: 1, y: 0 }}\r\n viewport={{ once: true }}\r\n transition={{ delay: 0.5 }}\r\n className={cn(\r\n 'text-sm sm:text-base md:text-lg',\r\n 'text-center',\r\n 'leading-snug md:leading-normal',\r\n 'font-light'\r\n )}\r\n >\r\n {description}\r\n </motion.p>\r\n </motion.div>\r\n </MotionDiv>\r\n );\r\n }\r\n);\r\n\r\nBanner.displayName = 'Banner';\r\n\r\nexport { Banner, bannerVariants };\r\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/utils/cn';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { Loader2 } from 'lucide-react';\n\nconst buttonVariants = cva(\n 'btn disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n primary:\n 'border-2 border-primary bg-primary text-white hover:bg-primary/90 active:bg-primary/80 shadow-md',\n secondary:\n 'border-2 border-secondary bg-secondary text-white hover:bg-secondary/90 active:bg-secondary/80',\n secondary_outline:\n 'border-2 border-secondary bg-white text-secondary hover:bg-white/90 active:bg-white/80',\n outline:\n 'border-2 border-primary text-primary hover:bg-primary/5 hover:text-accent-foreground active:bg-primary/10',\n ghost: 'hover:bg-muted active:bg-muted/80 text-foreground',\n success:\n 'border-2 border-success bg-success text-white hover:bg-success/90 active:bg-success/80 shadow-md',\n warning:\n 'border-2 border-warning bg-warning text-white hover:bg-warning/90 active:bg-warning/80 shadow-md',\n error:\n 'border-2 border-error bg-error text-white hover:bg-error/90 active:bg-error/80 shadow-md',\n },\n size: {\n sm: 'min-h-[36px] px-2 py-2 text-sm',\n md: 'min-h-[44px] px-6 py-2.5 text-base',\n lg: 'min-h-[56px] px-8 py-3 text-lg',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n },\n }\n);\n\nexport interface ButtonProps\n extends\n Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n | 'onDrag'\n | 'onDragEnd'\n | 'onDragStart'\n | 'onAnimationStart'\n | 'onAnimationEnd'\n >,\n VariantProps<typeof buttonVariants> {\n /**\n * If true, the button will show a loading spinner\n */\n isLoading?: boolean;\n loadingText?: string;\n /**\n * Icon to display before the button text (can be a lucide-react component or JSX element)\n */\n leftIcon?: React.ElementType | React.ReactElement;\n /**\n * Icon to display after the button text (can be a lucide-react component or JSX element)\n */\n rightIcon?: React.ElementType | React.ReactElement;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n fullWidth,\n isLoading,\n leftIcon,\n rightIcon,\n children,\n disabled,\n loadingText = 'Loading...',\n ...props\n },\n ref\n ) => {\n const MotionButton = motion.button;\n\n return (\n <MotionButton\n className={cn(buttonVariants({ variant, size, fullWidth, className }))}\n ref={ref}\n disabled={disabled || isLoading}\n whileHover={{ scale: 1.02, y: -2 }}\n whileTap={{ scale: 0.96, y: 0 }}\n transition={{ type: 'spring', stiffness: 400, damping: 17 }}\n {...props}\n >\n <AnimatePresence mode=\"wait\">\n {isLoading && (\n <motion.div\n key=\"loading\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"flex items-center space-x-2\"\n >\n <Loader2 className=\"w-5 h-5 animate-spin mr-2\" />\n </motion.div>\n )}\n {!isLoading && leftIcon && (\n <motion.span\n key=\"leftIcon\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.2 }}\n className=\"mr-2 inline-flex items-center justify-center flex-shrink-0\"\n >\n {React.isValidElement(leftIcon)\n ? leftIcon\n : React.createElement(leftIcon as React.ElementType, {\n size: 18,\n className: 'flex-shrink-0',\n })}\n </motion.span>\n )}\n </AnimatePresence>\n {isLoading ? loadingText : children}\n {!isLoading && rightIcon && (\n <span className=\"ml-2 inline-flex items-center justify-center flex-shrink-0\">\n {React.isValidElement(rightIcon)\n ? rightIcon\n : React.createElement(rightIcon as React.ElementType, {\n size: 18,\n className: 'flex-shrink-0',\n })}\n </span>\n )}\n </MotionButton>\n );\n }\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import { cn } from '@/utils';\r\nimport { Image } from 'lucide-react';\r\nimport { motion } from 'motion/react';\r\nexport interface CardProps {\r\n title: string;\r\n description?: string;\r\n cta?: React.ReactNode;\r\n image?: React.ReactNode;\r\n hasBadge?: boolean;\r\n badgeText?: string;\r\n badgeColor?: string;\r\n textColor?: string;\r\n}\r\n\r\nexport default function Card({\r\n image,\r\n title,\r\n description,\r\n cta,\r\n hasBadge,\r\n badgeText,\r\n badgeColor = 'bg-primary',\r\n textColor = 'text-white',\r\n}: CardProps) {\r\n return (\r\n <motion.article\r\n className={cn(\r\n 'w-64',\r\n 'bg-white',\r\n 'rounded-lg',\r\n 'overflow-hidden',\r\n 'shadow-md',\r\n 'relative'\r\n )}\r\n >\r\n <motion.div className=\"h-40 w-full overflow-hidden\">\r\n {image ? (\r\n image\r\n ) : (\r\n <motion.div\r\n className={cn(\r\n 'h-40 w-full',\r\n 'bg-gray-200',\r\n 'flex items-center justify-center'\r\n )}\r\n >\r\n <motion.span className=\"text-gray-500\">\r\n <Image />\r\n </motion.span>\r\n </motion.div>\r\n )}\r\n </motion.div>\r\n {hasBadge && badgeText && (\r\n <motion.div\r\n className={cn(\r\n 'absolute top-2 left-2',\r\n 'text-xs',\r\n 'font-semibold',\r\n 'px-4 py-1',\r\n 'rounded-lg',\r\n 'shadow-md',\r\n badgeColor,\r\n textColor\r\n )}\r\n >\r\n {badgeText}\r\n </motion.div>\r\n )}\r\n <motion.div className=\"p-4\">\r\n <motion.h3\r\n className={cn(\r\n 'text-lg',\r\n 'font-semibold',\r\n 'text-gray-900',\r\n 'dark:text-stone-100'\r\n )}\r\n >\r\n {title}\r\n </motion.h3>\r\n {description && (\r\n <motion.p\r\n className={cn(\r\n 'text-sm',\r\n 'text-gray-600',\r\n 'dark:text-stone-400',\r\n 'mt-2'\r\n )}\r\n >\r\n {description}\r\n </motion.p>\r\n )}\r\n {cta && <motion.div className=\"mt-2\">{cta}</motion.div>}\r\n </motion.div>\r\n </motion.article>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion } from 'motion/react';\r\nimport { Check } from 'lucide-react';\r\n\r\nconst checkboxVariants = cva(\r\n 'relative rounded-md border-2 flex items-center justify-center transition-all duration-200 cursor-pointer',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'border-input-border hover:border-primary/50',\r\n filled: 'border-transparent bg-background-secondary',\r\n outline: 'border-primary bg-transparent',\r\n },\r\n size: {\r\n sm: 'w-4 h-4',\r\n md: 'w-5 h-5',\r\n lg: 'w-6 h-6',\r\n },\r\n checked: {\r\n true: 'bg-primary border-primary',\r\n false: '',\r\n },\r\n disabled: {\r\n true: 'opacity-50 cursor-not-allowed',\r\n false: '',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'md',\r\n checked: false,\r\n disabled: false,\r\n },\r\n }\r\n);\r\n\r\ntype CheckboxVariantProps = VariantProps<typeof checkboxVariants>;\r\n\r\nexport interface CheckboxProps\r\n extends\r\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\r\n Omit<CheckboxVariantProps, 'checked' | 'disabled'> {\r\n /**\r\n * Checkbox label text\r\n */\r\n label?: string;\r\n /**\r\n * Optional description text below the label\r\n */\r\n description?: string;\r\n /**\r\n * Error message to display\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Whether the checkbox is checked\r\n */\r\n checked?: boolean;\r\n /**\r\n * Callback when checkbox state changes\r\n */\r\n onCheckedChange?: (checked: boolean) => void;\r\n}\r\n\r\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n size = 'md',\r\n label,\r\n description,\r\n errorMessage,\r\n checked = false,\r\n disabled = false,\r\n onCheckedChange,\r\n onChange,\r\n id,\r\n name,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const iconSizes = {\r\n sm: 12,\r\n md: 16,\r\n lg: 20,\r\n };\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newChecked = e.target.checked;\r\n onCheckedChange?.(newChecked);\r\n onChange?.(e);\r\n };\r\n\r\n const reactId = React.useId();\r\n const generatedId = id || name || `checkbox-${reactId}`;\r\n\r\n return (\r\n <motion.div className=\"space-y-1\">\r\n <motion.div className=\"flex items-start space-x-3\">\r\n <motion.div className=\"relative\">\r\n <motion.button\r\n type=\"button\"\r\n onClick={() => !disabled && onCheckedChange?.(!checked)}\r\n disabled={disabled}\r\n className={cn(\r\n checkboxVariants({\r\n variant,\r\n size,\r\n checked,\r\n disabled,\r\n className,\r\n })\r\n )}\r\n whileTap={!disabled ? { scale: 0.95 } : {}}\r\n >\r\n <motion.div\r\n initial={{ opacity: 0, scale: 0.5 }}\r\n animate={{\r\n opacity: checked ? 1 : 0,\r\n scale: checked ? 1 : 0.5,\r\n }}\r\n transition={{ duration: 0.2 }}\r\n >\r\n <Check size={iconSizes[size || 'md']} className=\"text-white\" />\r\n </motion.div>\r\n </motion.button>\r\n <input\r\n ref={ref}\r\n id={generatedId}\r\n name={name}\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={handleChange}\r\n disabled={disabled}\r\n className=\"sr-only\"\r\n {...props}\r\n />\r\n </motion.div>\r\n {label && (\r\n <motion.div className=\"flex-1\">\r\n <motion.label\r\n htmlFor={generatedId}\r\n className={cn(\r\n 'text-sm font-medium cursor-pointer',\r\n disabled\r\n ? 'text-foreground-tertiary cursor-not-allowed'\r\n : 'text-foreground',\r\n errorMessage && 'text-error'\r\n )}\r\n >\r\n {label}\r\n </motion.label>\r\n {description && (\r\n <motion.p className=\"text-sm text-foreground-tertiary mt-1\">\r\n {description}\r\n </motion.p>\r\n )}\r\n </motion.div>\r\n )}\r\n </motion.div>\r\n {errorMessage && (\r\n <motion.p\r\n initial={{ opacity: 0, y: -5 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"text-xs text-error ml-8\"\r\n >\r\n {errorMessage}\r\n </motion.p>\r\n )}\r\n </motion.div>\r\n );\r\n }\r\n);\r\n\r\nCheckbox.displayName = 'Checkbox';\r\n\r\nexport { Checkbox, checkboxVariants };\r\n","import { useEffect } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { motion, AnimatePresence } from 'motion/react';\r\nimport { X } from 'lucide-react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils';\r\n\r\nconst modalVariants = cva(\r\n 'relative w-full max-h-[90vh] rounded-lg shadow-2xl overflow-hidden z-10',\r\n {\r\n variants: {\r\n size: {\r\n sm: 'max-w-md',\r\n md: 'max-w-lg',\r\n lg: 'max-w-2xl',\r\n xl: 'max-w-4xl',\r\n full: 'max-w-7xl',\r\n },\r\n },\r\n defaultVariants: {\r\n size: 'md',\r\n },\r\n }\r\n);\r\n\r\nexport interface ModalProps extends VariantProps<typeof modalVariants> {\r\n isOpen?: boolean;\r\n onClose?: () => void;\r\n children: React.ReactNode;\r\n title?: string;\r\n showCloseButton?: boolean;\r\n closeOnOverlayClick?: boolean;\r\n closeOnEscape?: boolean;\r\n className?: string;\r\n}\r\n\r\nexport default function Modal({\r\n isOpen,\r\n onClose,\r\n children,\r\n title,\r\n size = 'md',\r\n showCloseButton = true,\r\n closeOnOverlayClick = true,\r\n closeOnEscape = true,\r\n className,\r\n}: ModalProps) {\r\n // Close modal on escape key and handle body scroll\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && closeOnEscape) {\r\n onClose?.();\r\n }\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener('keydown', handleEscape);\r\n // Store original overflow\r\n const originalOverflow = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleEscape);\r\n document.body.style.overflow = originalOverflow || 'unset';\r\n };\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n }, [isOpen, onClose, closeOnEscape]);\r\n\r\n // Don't render anything if not open\r\n if (!isOpen) return null;\r\n\r\n // Create portal to render modal at document body level\r\n return createPortal(\r\n <AnimatePresence mode=\"wait\" initial={false}>\r\n {isOpen && (\r\n <motion.div\r\n key=\"modal\"\r\n transition={{ duration: 0.2 }}\r\n className={cn(\r\n 'fixed inset-0 z-[9999]',\r\n 'flex items-center justify-center',\r\n 'p-4'\r\n )}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={title ? 'modal-title' : undefined}\r\n >\r\n {/* Backdrop */}\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n className={cn(\r\n 'absolute inset-0',\r\n 'bg-black/60',\r\n 'backdrop-blur-sm'\r\n )}\r\n onClick={closeOnOverlayClick ? onClose : undefined}\r\n aria-label=\"Close modal\"\r\n />\r\n\r\n {/* Modal Content */}\r\n <motion.div\r\n initial={{ scale: 0.9, opacity: 0, y: 30 }}\r\n animate={{ scale: 1, opacity: 1, y: 0 }}\r\n exit={{ scale: 0.9, opacity: 0, y: 30 }}\r\n transition={{\r\n type: 'spring',\r\n damping: 25,\r\n stiffness: 300,\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n className={cn(\r\n modalVariants({ size }),\r\n 'bg-surface border border-border',\r\n className\r\n )}\r\n >\r\n {/* Header */}\r\n {(title || showCloseButton) && (\r\n <div\r\n className={cn(\r\n 'flex items-center justify-between',\r\n 'p-6',\r\n 'border-b border-border'\r\n )}\r\n >\r\n {title && (\r\n <h3\r\n id=\"modal-title\"\r\n className=\"font-semibold text-lg text-foreground\"\r\n >\r\n {title}\r\n </h3>\r\n )}\r\n {showCloseButton && (\r\n <button\r\n onClick={onClose}\r\n className={cn(\r\n 'p-1 rounded-lg text-foreground-secondary',\r\n 'hover:text-foreground hover:bg-background-secondary',\r\n 'transition-colors'\r\n )}\r\n aria-label=\"Close modal\"\r\n >\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Body */}\r\n <div\r\n className={cn(\r\n 'p-6',\r\n 'overflow-y-auto',\r\n 'max-h-[calc(90vh-8rem)]',\r\n 'scrollbar-hide',\r\n 'text-foreground'\r\n )}\r\n >\r\n {children}\r\n </div>\r\n </motion.div>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>,\r\n document.body\r\n );\r\n}\r\n","import { Droplets, Leaf, Info } from 'lucide-react';\r\nimport { Modal } from '../Modal';\r\nimport { cn } from '@/utils';\r\n\r\nexport interface EnvironmentalImpactModalProps {\r\n isOpen?: boolean;\r\n onClose?: () => void;\r\n environmentalImpact: {\r\n totalCo2SavingsKG: number;\r\n totalWaterSavingsLT: number;\r\n materialBreakdown: Array<{\r\n materialType: string;\r\n percentage: number;\r\n weightKG: number;\r\n co2SavingsKG: number;\r\n waterSavingsLT: number;\r\n }>;\r\n };\r\n\r\n // Labels\r\n co2SavingsTitle?: string;\r\n waterSavingsTitle?: string;\r\n weightLabel?: string;\r\n co2SavingsLabel?: string;\r\n waterSavingsLabel?: string;\r\n materialBreakdownLabel?: string;\r\n co2EquivalenceLabel?: string;\r\n waterEquivalenceLabel?: string;\r\n infoText?: string;\r\n carDistanceLabel?: string;\r\n showerCountLabel?: string;\r\n}\r\n\r\nexport default function EnvironmentalImpactModal({\r\n isOpen,\r\n onClose,\r\n environmentalImpact,\r\n\r\n // Labels\r\n co2SavingsTitle = 'CO₂ Savings',\r\n waterSavingsTitle = 'Water Savings',\r\n weightLabel = 'Weight',\r\n co2SavingsLabel = 'CO₂ Saved',\r\n waterSavingsLabel = 'Water Saved',\r\n materialBreakdownLabel = 'Material Breakdown',\r\n carDistanceLabel = ' by car',\r\n showerCountLabel = ' showers',\r\n co2EquivalenceLabel = 'Equivalent to',\r\n waterEquivalenceLabel = 'Equivalent to',\r\n infoText = 'These values are estimates based on the savings generated by reusing products instead of manufacturing new ones. The calculations consider the average impact of producing each material.',\r\n}: EnvironmentalImpactModalProps) {\r\n const formatNumber = (num: number) => {\r\n return new Intl.NumberFormat('es-CL', {\r\n minimumFractionDigits: 1,\r\n maximumFractionDigits: 1,\r\n }).format(num);\r\n };\r\n\r\n return (\r\n <Modal\r\n isOpen={isOpen}\r\n onClose={onClose}\r\n title=\"Impacto Ambiental Detallado\"\r\n size=\"md\"\r\n >\r\n <div className=\"space-y-6\">\r\n {/* Environmental Savings Summary */}\r\n <div className={cn('flex flex-col md:flex-row', 'gap-4 md:gap-6')}>\r\n <div\r\n className={cn(\r\n 'bg-success/10 dark:bg-success/20',\r\n 'rounded-lg',\r\n 'p-4',\r\n 'flex-1'\r\n )}\r\n >\r\n <div className={cn('flex items-center', 'gap-2', 'mb-2')}>\r\n <Leaf className=\"w-5 h-5 text-success\" />\r\n <span\r\n className={cn(\r\n 'text-sm font-medium text-text-muted',\r\n 'dark:text-stone-400'\r\n )}\r\n >\r\n {co2SavingsTitle}\r\n </span>\r\n </div>\r\n <p className={cn('text-2xl font-bold text-success')}>\r\n {formatNumber(environmentalImpact.totalCo2SavingsKG)} kg\r\n </p>\r\n <p\r\n className={cn(\r\n 'text-xs text-text-muted',\r\n 'dark:text-stone-400',\r\n 'mt-1'\r\n )}\r\n >\r\n {co2EquivalenceLabel}{' '}\r\n {formatNumber(environmentalImpact.totalCo2SavingsKG * 4.5)} km\r\n {carDistanceLabel}\r\n </p>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n 'bg-info/10',\r\n 'dark:bg-info/20',\r\n 'rounded-lg',\r\n 'p-4',\r\n 'flex-1'\r\n )}\r\n >\r\n <div className={cn('flex', 'items-center', 'gap-2', 'mb-2')}>\r\n <Droplets className=\"w-5 h-5 text-info\" />\r\n <span\r\n className={cn(\r\n 'text-sm',\r\n 'font-medium',\r\n 'text-text-muted',\r\n 'dark:text-stone-400'\r\n )}\r\n >\r\n {waterSavingsTitle}\r\n </span>\r\n </div>\r\n <p className={cn('text-2xl', 'font-bold', 'text-info')}>\r\n {formatNumber(environmentalImpact.totalWaterSavingsLT)} L\r\n </p>\r\n <p\r\n className={cn(\r\n 'text-xs',\r\n 'text-text-muted',\r\n 'dark:text-stone-400',\r\n 'mt-1'\r\n )}\r\n >\r\n {waterEquivalenceLabel}{' '}\r\n {formatNumber(environmentalImpact.totalWaterSavingsLT / 8)}{' '}\r\n {showerCountLabel}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Material Breakdown */}\r\n {environmentalImpact.materialBreakdown.length > 0 && (\r\n <div>\r\n <h3\r\n className={cn(\r\n 'text-lg',\r\n 'font-bold',\r\n 'text-text-primary',\r\n 'dark:text-stone-100',\r\n 'mb-4',\r\n 'flex',\r\n 'items-center',\r\n 'gap-2'\r\n )}\r\n >\r\n <Info className=\"w-5 h-5\" />\r\n {materialBreakdownLabel}\r\n </h3>\r\n\r\n <div className={cn('space-y-3')}>\r\n {environmentalImpact.materialBreakdown.map((material, index) => (\r\n <div\r\n key={index}\r\n className={cn(\r\n 'border',\r\n 'border-neutral/20',\r\n 'dark:border-stone-700',\r\n 'rounded-lg',\r\n 'p-4',\r\n 'hover:bg-neutral/5',\r\n 'dark:hover:bg-stone-800/50',\r\n 'transition-colors'\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-between',\r\n 'mb-3'\r\n )}\r\n >\r\n <h4\r\n className={cn(\r\n 'font-semibold',\r\n 'text-text-primary',\r\n 'dark:text-stone-100'\r\n )}\r\n >\r\n {material.materialType}\r\n </h4>\r\n <span\r\n className={cn('text-lg', 'font-bold', 'text-primary')}\r\n >\r\n {material.percentage.toFixed(1)}%\r\n </span>\r\n </div>\r\n\r\n <div\r\n className={cn('grid', 'grid-cols-3', 'gap-3', 'text-sm')}\r\n >\r\n <div>\r\n <p\r\n className={cn(\r\n 'text-xs',\r\n 'text-text-muted',\r\n 'dark:text-stone-400',\r\n 'mb-1'\r\n )}\r\n >\r\n {weightLabel}\r\n </p>\r\n <p\r\n className={cn(\r\n 'font-semibold',\r\n 'text-text-secondary',\r\n 'dark:text-stone-300'\r\n )}\r\n >\r\n {formatNumber(material.weightKG)} kg\r\n </p>\r\n </div>\r\n <div>\r\n <p\r\n className={cn(\r\n 'text-xs',\r\n 'text-text-muted',\r\n 'dark:text-stone-400',\r\n 'mb-1'\r\n )}\r\n >\r\n {co2SavingsLabel}\r\n </p>\r\n <p className={cn('font-semibold', 'text-success')}>\r\n {formatNumber(material.co2SavingsKG)} kg\r\n </p>\r\n </div>\r\n <div>\r\n <p\r\n className={cn(\r\n 'text-xs',\r\n 'text-text-muted',\r\n 'dark:text-stone-400',\r\n 'mb-1'\r\n )}\r\n >\r\n {waterSavingsLabel}\r\n </p>\r\n <p className={cn('font-semibold', 'text-info')}>\r\n {formatNumber(material.waterSavingsLT)} L\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Progress bar for percentage */}\r\n <div\r\n className={cn(\r\n 'mt-3',\r\n 'h-2',\r\n 'bg-neutral/10',\r\n 'dark:bg-stone-700',\r\n 'rounded-full',\r\n 'overflow-hidden'\r\n )}\r\n >\r\n <div\r\n className=\"h-full bg-primary rounded-full transition-all duration-500\"\r\n style={{ width: `${material.percentage}%` }}\r\n />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Info Footer */}\r\n <div\r\n className={cn(\r\n 'bg-primary/5',\r\n 'dark:bg-primary/10',\r\n 'rounded-lg',\r\n 'p-4',\r\n 'text-sm',\r\n 'text-text-secondary',\r\n 'dark:text-stone-300'\r\n )}\r\n >\r\n <p className={cn('flex', 'items-start', 'gap-2')}>\r\n <Info\r\n className={cn(\r\n 'w-4',\r\n 'h-4',\r\n 'mt-0.5',\r\n 'text-primary',\r\n 'flex-shrink-0'\r\n )}\r\n />\r\n <span>{infoText}</span>\r\n </p>\r\n </div>\r\n </div>\r\n </Modal>\r\n );\r\n}\r\n","import { cn } from '@/utils';\r\nimport { motion } from 'motion/react';\r\nexport interface FooterProps {\r\n brand?: React.ReactNode;\r\n socialLinks?: Array<React.ReactNode>;\r\n description?: string;\r\n exploreLabel?: string;\r\n communityLabel?: string;\r\n legalLabel?: string;\r\n exploreItems?: Array<React.ReactNode>;\r\n communityItems?: Array<React.ReactNode>;\r\n legalItems?: Array<React.ReactNode>;\r\n copyRightText?: string;\r\n}\r\n\r\nexport default function Footer({\r\n brand,\r\n socialLinks,\r\n description,\r\n exploreItems,\r\n exploreLabel = 'Explore',\r\n communityItems,\r\n communityLabel = 'Community',\r\n legalItems,\r\n legalLabel = 'Legal',\r\n copyRightText = `All rights reserved.`,\r\n}: FooterProps) {\r\n return (\r\n <motion.footer\r\n className={cn(\r\n 'bg-gradient-to-r from-primary-dark via-primary to-primary-dark'\r\n )}\r\n >\r\n <motion.div className=\"max-w-7xl mx-auto px-6 py-12\">\r\n <motion.div className=\"grid grid-cols-1 md:grid-cols-4 gap-8\">\r\n {/* Brand Section */}\r\n <motion.div className=\"space-y-4 flex flex-col\">\r\n {brand}\r\n <motion.p className=\"text-sm text-white leading-relaxed\">\r\n {description}\r\n </motion.p>\r\n {/* Social Icons */}\r\n {socialLinks && (\r\n <motion.div className={cn('flex items-center gap-3')}>\r\n {socialLinks}\r\n </motion.div>\r\n )}\r\n </motion.div>\r\n\r\n {/* Explorar */}\r\n {exploreItems && (\r\n <motion.div>\r\n <motion.h3 className=\"font-semibold text-white mb-4\">\r\n {exploreLabel}\r\n </motion.h3>\r\n <motion.ul className=\"space-y-3\">\r\n {exploreItems &&\r\n exploreItems.map((item, index) => (\r\n <motion.li key={index}>{item}</motion.li>\r\n ))}\r\n </motion.ul>\r\n </motion.div>\r\n )}\r\n\r\n {/* Comunidad */}\r\n {communityItems && (\r\n <motion.div>\r\n <motion.h3 className=\"font-semibold text-white mb-4\">\r\n {communityLabel}\r\n </motion.h3>\r\n <motion.ul className=\"space-y-3\">\r\n {communityItems &&\r\n communityItems.map((item, index) => (\r\n <motion.li key={index}>{item}</motion.li>\r\n ))}\r\n </motion.ul>\r\n </motion.div>\r\n )}\r\n\r\n {/* Legal */}\r\n {legalItems && (\r\n <motion.div>\r\n <motion.h3 className=\"font-semibold text-white mb-4\">\r\n {legalLabel}\r\n </motion.h3>\r\n <motion.ul className=\"space-y-3\">\r\n {legalItems &&\r\n legalItems.map((item, index) => (\r\n <motion.li key={index}>{item}</motion.li>\r\n ))}\r\n </motion.ul>\r\n </motion.div>\r\n )}\r\n </motion.div>\r\n\r\n {/* Copyright */}\r\n <motion.div className=\"mt-12 pt-8 border-t border-gray-200 dark:border-stone-800\">\r\n <motion.p className=\"text-sm text-center text-white\">\r\n © {new Date().getFullYear()} EKORU. {copyRightText}\r\n </motion.p>\r\n </motion.div>\r\n </motion.div>\r\n </motion.footer>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { motion, AnimatePresence } from 'motion/react';\r\nimport { Menu, Search, X } from 'lucide-react';\r\nimport { cn } from '@/utils';\r\n\r\nexport interface NavbarProps {\r\n brand?: React.ReactNode;\r\n navigationIcons?: Array<React.ReactNode>;\r\n navigationLinks?: Array<React.ReactNode>;\r\n searchPlaceholder?: string;\r\n onSearch?: (query: string) => void;\r\n mobileMenuContent?: React.ReactNode;\r\n className?: string;\r\n searchEnabled?: boolean;\r\n sideMenuTitle?: string;\r\n\r\n // Aria labels and other accessibility props can be added as needed\r\n navbarAriaLabel?: string;\r\n userActionsAriaLabel?: string;\r\n toggleMobileMenuAriaLabel?: string;\r\n closeMobileMenuAriaLabel?: string;\r\n mobileMenuTitleAriaLabel?: string;\r\n}\r\n\r\nexport default function Navbar({\r\n navigationIcons,\r\n navigationLinks,\r\n brand,\r\n searchPlaceholder = 'Search...',\r\n onSearch,\r\n mobileMenuContent,\r\n className = '',\r\n searchEnabled = true,\r\n sideMenuTitle = 'Menu',\r\n\r\n // aria labels and other accessibility props can be added as needed\r\n navbarAriaLabel = 'Main navigation',\r\n userActionsAriaLabel = 'User actions',\r\n toggleMobileMenuAriaLabel = 'Toggle mobile menu',\r\n closeMobileMenuAriaLabel = 'Close mobile menu',\r\n mobileMenuTitleAriaLabel = 'Mobile menu',\r\n}: NavbarProps) {\r\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState<boolean>(false);\r\n const [searchQuery, setSearchQuery] = useState<string>('');\r\n\r\n const closeMobileMenu = () => setIsMobileMenuOpen(false);\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setSearchQuery(e.target.value);\r\n };\r\n\r\n const handleSearchSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n onSearch?.(searchQuery);\r\n };\r\n\r\n // Handle escape key to close mobile menu\r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.key === 'Escape' && isMobileMenuOpen) {\r\n setIsMobileMenuOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <header\r\n className={`navbar-container ${className}`}\r\n onKeyDown={handleKeyDown}\r\n >\r\n <nav\r\n className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\"\r\n role=\"navigation\"\r\n aria-label={navbarAriaLabel}\r\n >\r\n {/* Main Navigation */}\r\n <div className=\"flex justify-between items-center h-16\">\r\n {/* Logo */}\r\n <div className=\"flex-shrink-0\">\r\n {brand ? (\r\n brand\r\n ) : (\r\n <span className=\"text-xl font-bold text-white\">EKORU</span>\r\n )}\r\n </div>\r\n\r\n {/* Search Bar - Desktop */}\r\n {searchEnabled && (\r\n <div\r\n className=\"hidden md:flex flex-1 max-w-2xl mx-8\"\r\n role=\"search\"\r\n >\r\n <form\r\n onSubmit={handleSearchSubmit}\r\n className=\"w-full flex items-center relative\"\r\n >\r\n <input\r\n id=\"search-desktop\"\r\n name=\"search-desktop\"\r\n type=\"search\"\r\n value={searchQuery}\r\n onChange={handleSearchChange}\r\n placeholder={searchPlaceholder}\r\n className={cn(\r\n 'w-full px-4 py-2',\r\n 'rounded-lg',\r\n 'border border-input-border',\r\n 'bg-input-bg',\r\n 'text-foreground',\r\n 'placeholder:text-foreground-tertiary',\r\n 'focus:outline-none',\r\n 'focus:ring-2',\r\n 'focus:ring-primary',\r\n 'focus:border-transparent'\r\n )}\r\n />\r\n <Search className=\"h-5 w-5 text-primary absolute right-4\" />\r\n </form>\r\n </div>\r\n )}\r\n\r\n {/* User Actions */}\r\n <div\r\n className=\"flex items-center space-x-2\"\r\n role=\"toolbar\"\r\n aria-label={userActionsAriaLabel}\r\n >\r\n {/* Navigation Icons */}\r\n {navigationIcons}\r\n\r\n {/* Navigation Links - Desktop */}\r\n <div className=\"hidden lg:flex items-center space-x-2\">\r\n {navigationLinks}\r\n </div>\r\n\r\n {/* Mobile Menu Button */}\r\n <button\r\n onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\r\n className={cn(\r\n 'p-2',\r\n 'rounded-lg',\r\n 'text-white',\r\n 'hover:bg-primary/30',\r\n 'transition-colors',\r\n 'lg:hidden'\r\n )}\r\n aria-label={toggleMobileMenuAriaLabel}\r\n aria-expanded={isMobileMenuOpen}\r\n >\r\n <Menu className=\"h-6 w-6\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Mobile Search Bar */}\r\n {searchEnabled && (\r\n <div className=\"md:hidden pb-4\" role=\"search\">\r\n <form\r\n onSubmit={handleSearchSubmit}\r\n className=\"w-full flex items-center relative\"\r\n >\r\n <input\r\n id=\"search-mobile\"\r\n name=\"search-mobile\"\r\n type=\"search\"\r\n value={searchQuery}\r\n onChange={handleSearchChange}\r\n placeholder={searchPlaceholder}\r\n className={cn(\r\n 'w-full',\r\n 'px-4 py-2',\r\n 'rounded-lg',\r\n 'border border-input-border',\r\n 'bg-input-bg',\r\n 'text-foreground',\r\n 'placeholder:text-foreground-tertiary',\r\n 'focus:outline-none',\r\n 'focus:ring-2',\r\n 'focus:ring-primary',\r\n 'focus:border-transparent'\r\n )}\r\n />\r\n <Search className=\"h-5 w-5 text-primary absolute right-4\" />\r\n </form>\r\n </div>\r\n )}\r\n </nav>\r\n </header>\r\n\r\n {/* Mobile Navigation Overlay */}\r\n <AnimatePresence>\r\n {isMobileMenuOpen && (\r\n <div\r\n className=\"lg:hidden fixed inset-0 z-50 flex justify-end\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={mobileMenuTitleAriaLabel}\r\n >\r\n {/* Overlay Background */}\r\n <motion.div\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n transition={{ duration: 0.3 }}\r\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\r\n onClick={() => setIsMobileMenuOpen(false)}\r\n aria-label={closeMobileMenuAriaLabel}\r\n />\r\n\r\n {/* Slide-in Menu */}\r\n <motion.div\r\n initial={{ x: '100%' }}\r\n animate={{ x: 0 }}\r\n exit={{ x: '100%' }}\r\n transition={{ type: 'tween', duration: 0.3 }}\r\n className={cn(\r\n 'relative',\r\n 'w-full',\r\n 'max-w-sm',\r\n 'bg-background',\r\n 'shadow-xl',\r\n 'h-full',\r\n 'overflow-y-auto'\r\n )}\r\n >\r\n <div className=\"p-6\">\r\n {/* Menu Header */}\r\n <div className=\"flex items-center justify-between mb-6\">\r\n <h2\r\n id=\"mobile-menu-title\"\r\n className=\"text-xl font-semibold text-foreground\"\r\n >\r\n {sideMenuTitle}\r\n </h2>\r\n <button\r\n onClick={closeMobileMenu}\r\n className={cn(\r\n 'p-2',\r\n 'rounded-lg',\r\n 'text-foreground',\r\n 'hover:bg-background-secondary',\r\n 'transition-colors'\r\n )}\r\n aria-label=\"Close mobile menu\"\r\n >\r\n <X className=\"h-6 w-6\" />\r\n </button>\r\n </div>\r\n\r\n {/* Navigation Links */}\r\n <nav className=\"space-y-2\">{navigationLinks}</nav>\r\n\r\n {/* Custom Mobile Menu Content */}\r\n {mobileMenuContent && (\r\n <div className=\"mt-6 pt-6 border-t border-surface-active\">\r\n {mobileMenuContent}\r\n </div>\r\n )}\r\n </div>\r\n </motion.div>\r\n </div>\r\n )}\r\n </AnimatePresence>\r\n </>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion, AnimatePresence } from 'motion/react';\r\nimport { ChevronDown, Circle, type LucideIcon } from 'lucide-react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nconst selectVariants = cva(\r\n 'w-full rounded-lg font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 placeholder:text-input-placeholder text-left',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-input-bg border-2 border-input-border hover:border-input-border-hover focus:border-input-border-focus focus:ring-primary/20',\r\n filled:\r\n 'bg-background border-2 border-transparent hover:bg-background focus:bg-input-bg focus:border-input-border-focus focus:ring-primary/20',\r\n outline:\r\n 'bg-transparent border-2 border-primary text-foreground hover:bg-primary/5 focus:bg-primary/5 focus:border-primary-active focus:ring-primary/20',\r\n },\r\n size: {\r\n sm: 'h-9 text-sm',\r\n md: 'h-11 text-base',\r\n lg: 'h-14 text-lg',\r\n },\r\n hasError: {\r\n true: 'border-error focus:border-error focus:ring-error/20',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'md',\r\n hasError: false,\r\n },\r\n }\r\n);\r\n\r\ntype SelectVariantProps = VariantProps<typeof selectVariants>;\r\n\r\nexport type Option = {\r\n label: string;\r\n value: string | number;\r\n iconColor?: string;\r\n};\r\n\r\nexport interface SelectProps extends Omit<SelectVariantProps, 'hasError'> {\r\n /**\r\n * Array of options to display in the dropdown\r\n */\r\n options?: Option[];\r\n /**\r\n * Label text displayed above the select\r\n */\r\n label?: string;\r\n /**\r\n * Icon component to display on the left side\r\n */\r\n leftIcon?: LucideIcon;\r\n /**\r\n * Error message to display below the select\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Selected value\r\n */\r\n value?: string | number;\r\n /**\r\n * Name attribute for form handling\r\n */\r\n name?: string;\r\n /**\r\n * Placeholder text when no value is selected\r\n */\r\n placeholder?: string;\r\n /**\r\n * Callback when selection changes\r\n */\r\n onChange?: (value: string | number) => void;\r\n /**\r\n * Width variant of the select container\r\n */\r\n width?: 'sm' | 'md' | 'lg' | 'full';\r\n /**\r\n * Whether the select is disabled\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Whether the select is read-only\r\n */\r\n readOnly?: boolean;\r\n /**\r\n * Whether to show color circles for options\r\n */\r\n showColorIcon?: boolean;\r\n /**\r\n * Custom render function for options\r\n */\r\n renderOption?: (option: Option, selected: boolean) => React.ReactNode;\r\n /**\r\n * Whether to enable search/filter functionality\r\n */\r\n searchEnabled?: boolean;\r\n /**\r\n * Direction for dropdown expansion\r\n */\r\n dropdownDirection?: 'up' | 'down';\r\n /**\r\n * Additional CSS classes\r\n */\r\n className?: string;\r\n /**\r\n * No results text\r\n */\r\n noResultsText?: string;\r\n}\r\n\r\nconst Select = React.forwardRef<HTMLButtonElement, SelectProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n size,\r\n label,\r\n leftIcon: LeftIcon,\r\n errorMessage,\r\n value,\r\n onChange,\r\n options = [],\r\n width = 'full',\r\n disabled = false,\r\n readOnly = false,\r\n showColorIcon = false,\r\n renderOption,\r\n searchEnabled = true,\r\n dropdownDirection = 'down',\r\n placeholder = 'Select...',\r\n name,\r\n noResultsText = 'No results found',\r\n },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const [isOpen, setIsOpen] = React.useState(false);\r\n const [search, setSearch] = React.useState('');\r\n const [highlightedIndex, setHighlightedIndex] = React.useState<number>(-1);\r\n const [dropdownPosition, setDropdownPosition] = React.useState({\r\n top: 0,\r\n left: 0,\r\n width: 0,\r\n });\r\n const [mounted, setMounted] = React.useState(false);\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const buttonRef = React.useRef<HTMLButtonElement>(null);\r\n const dropdownRef = React.useRef<HTMLDivElement>(null);\r\n const listboxId = `${name}-listbox`;\r\n\r\n const selectedOption = options.find((o) => o.value === value);\r\n const filteredOptions = options.filter((o) =>\r\n o.label.toLowerCase().includes(search.toLowerCase())\r\n );\r\n\r\n const widthClass = {\r\n sm: 'w-1/3',\r\n md: 'w-1/2',\r\n lg: 'w-2/3',\r\n full: 'w-full',\r\n }[width];\r\n\r\n const computedHasError = !!errorMessage;\r\n\r\n React.useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n // Calcula la posición del dropdown\r\n const updateDropdownPosition = React.useCallback(() => {\r\n if (buttonRef.current) {\r\n const rect = buttonRef.current.getBoundingClientRect();\r\n setDropdownPosition({\r\n top: dropdownDirection === 'down' ? rect.bottom + 4 : rect.top - 4,\r\n left: rect.left,\r\n width: rect.width,\r\n });\r\n }\r\n }, [dropdownDirection]);\r\n\r\n React.useEffect(() => {\r\n if (isOpen) {\r\n updateDropdownPosition();\r\n window.addEventListener('scroll', updateDropdownPosition, true);\r\n window.addEventListener('resize', updateDropdownPosition);\r\n }\r\n return () => {\r\n window.removeEventListener('scroll', updateDropdownPosition, true);\r\n window.removeEventListener('resize', updateDropdownPosition);\r\n };\r\n }, [isOpen, updateDropdownPosition]);\r\n\r\n React.useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node) &&\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(e.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n setSearch('');\r\n }\r\n };\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () =>\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n if (isOpen) setHighlightedIndex(0);\r\n }, [isOpen, search]);\r\n\r\n const handleFocus = () => {\r\n setIsFocused(true);\r\n };\r\n\r\n const handleBlur = () => {\r\n setIsFocused(false);\r\n };\r\n\r\n const renderLabel = (option?: Option) => (\r\n <span className=\"flex items-center gap-2\">\r\n {showColorIcon && option?.iconColor && (\r\n <Circle\r\n size={18}\r\n style={{\r\n color: option.iconColor,\r\n fill: option.iconColor,\r\n }}\r\n className={cn('rounded-full', {\r\n 'border border-gray-400': option.iconColor === '#FFFFFF',\r\n })}\r\n />\r\n )}\r\n {option?.label || placeholder}\r\n </span>\r\n );\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (!isOpen) {\r\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\r\n setIsOpen(true);\r\n e.preventDefault();\r\n }\r\n return;\r\n }\r\n if (e.key === 'ArrowDown') {\r\n setHighlightedIndex((i) => Math.min(i + 1, filteredOptions.length - 1));\r\n e.preventDefault();\r\n } else if (e.key === 'ArrowUp') {\r\n setHighlightedIndex((i) => Math.max(i - 1, 0));\r\n e.preventDefault();\r\n } else if (e.key === 'Enter') {\r\n if (filteredOptions[highlightedIndex]) {\r\n onChange?.(filteredOptions[highlightedIndex].value);\r\n setIsOpen(false);\r\n setSearch('');\r\n }\r\n e.preventDefault();\r\n } else if (e.key === 'Escape') {\r\n setIsOpen(false);\r\n setSearch('');\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n const dropdownContent = (\r\n <AnimatePresence>\r\n {isOpen && (\r\n <motion.div\r\n ref={dropdownRef}\r\n key=\"dropdown\"\r\n initial={{\r\n opacity: 0,\r\n y: dropdownDirection === 'down' ? -10 : 10,\r\n }}\r\n animate={{ opacity: 1, y: 0 }}\r\n exit={{\r\n opacity: 0,\r\n y: dropdownDirection === 'down' ? -10 : 10,\r\n }}\r\n transition={{ duration: 0.15, ease: 'easeOut' }}\r\n id={listboxId}\r\n role=\"listbox\"\r\n aria-activedescendant={\r\n highlightedIndex >= 0 && filteredOptions[highlightedIndex]\r\n ? `${name}-option-${filteredOptions[highlightedIndex].value}`\r\n : undefined\r\n }\r\n tabIndex={-1}\r\n style={{\r\n position: 'fixed',\r\n top:\r\n dropdownDirection === 'down'\r\n ? `${dropdownPosition.top}px`\r\n : 'auto',\r\n bottom:\r\n dropdownDirection === 'up'\r\n ? `${window.innerHeight - dropdownPosition.top}px`\r\n : 'auto',\r\n left: `${dropdownPosition.left}px`,\r\n width: `${dropdownPosition.width}px`,\r\n zIndex: 9999,\r\n }}\r\n className={cn(\r\n 'bg-surface-elevated',\r\n 'border-2 border-primary rounded-lg shadow-2xl overflow-hidden'\r\n )}\r\n >\r\n {searchEnabled && (\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n className=\"w-full px-4 py-2 border-b border-input-border outline-none bg-surface-elevated text-foreground\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n aria-label=\"Search options\"\r\n onClick={(e) => e.stopPropagation()}\r\n />\r\n )}\r\n <ul className=\"max-h-60 overflow-y-auto w-full bg-surface-elevated\">\r\n {filteredOptions.length > 0 ? (\r\n filteredOptions.map((option, idx) => (\r\n <li\r\n key={option.value}\r\n id={`${name}-option-${option.value}`}\r\n role=\"option\"\r\n aria-selected={option.value === value}\r\n tabIndex={0}\r\n onClick={() => {\r\n onChange?.(option.value);\r\n setIsOpen(false);\r\n setSearch('');\r\n }}\r\n onMouseEnter={() => setHighlightedIndex(idx)}\r\n className={cn(\r\n 'px-4 py-2 w-full cursor-pointer hover:bg-primary/10 flex items-center gap-2 transition-colors',\r\n option.value === value && 'bg-primary/10 font-semibold',\r\n highlightedIndex === idx && 'bg-primary/20'\r\n )}\r\n >\r\n {renderOption\r\n ? renderOption(option, option.value === value)\r\n : renderLabel(option)}\r\n </li>\r\n ))\r\n ) : (\r\n <li className=\"px-4 py-2 text-sm text-foreground-tertiary italic\">\r\n {noResultsText}\r\n </li>\r\n )}\r\n </ul>\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n );\r\n\r\n return (\r\n <>\r\n <div className={cn('space-y-2', widthClass)} ref={containerRef}>\r\n {label && (\r\n <label\r\n htmlFor={name}\r\n className=\"block text-sm font-medium text-foreground\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"relative\">\r\n <motion.div\r\n initial={false}\r\n animate={{ scale: isFocused ? 1.002 : 1 }}\r\n transition={{ type: 'spring', stiffness: 400, damping: 17 }}\r\n className=\"relative\"\r\n >\r\n {LeftIcon && (\r\n <LeftIcon\r\n className={cn(\r\n 'absolute left-3 top-1/2 transform -translate-y-1/2 w-5 h-5 transition-colors duration-200 pointer-events-none',\r\n isFocused ? 'text-primary' : 'text-foreground-tertiary',\r\n computedHasError && 'text-error'\r\n )}\r\n />\r\n )}\r\n <button\r\n type=\"button\"\r\n ref={(node) => {\r\n buttonRef.current = node;\r\n if (typeof ref === 'function') {\r\n ref(node);\r\n } else if (ref) {\r\n ref.current = node;\r\n }\r\n }}\r\n id={name}\r\n name={name}\r\n disabled={disabled || readOnly}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={isOpen}\r\n aria-controls={listboxId}\r\n onClick={() => !readOnly && setIsOpen(!isOpen)}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n selectVariants({\r\n variant,\r\n size,\r\n hasError: computedHasError,\r\n className,\r\n }),\r\n {\r\n 'pl-3': !LeftIcon,\r\n 'pl-10': LeftIcon,\r\n 'pr-10': true,\r\n }\r\n )}\r\n >\r\n {renderLabel(selectedOption)}\r\n <ChevronDown\r\n size={18}\r\n className={cn(\r\n 'absolute right-3 top-1/2 transform -translate-y-1/2 transition-all duration-200 pointer-events-none',\r\n isOpen && 'rotate-180',\r\n isFocused ? 'text-primary' : 'text-foreground-tertiary',\r\n computedHasError && 'text-error'\r\n )}\r\n />\r\n </button>\r\n </motion.div>\r\n {errorMessage && (\r\n <motion.p\r\n initial={{ opacity: 0, y: -5 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"mt-1 text-xs text-error\"\r\n >\r\n {errorMessage}\r\n </motion.p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Portal para el dropdown */}\r\n {mounted && createPortal(dropdownContent, document.body)}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nSelect.displayName = 'Select';\r\n\r\nexport { Select, selectVariants };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { Select } from '../Select';\r\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\r\n\r\nconst paginationButtonVariants = cva(\r\n 'flex items-center justify-center min-w-[120px] rounded-lg font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-background-secondary text-foreground hover:bg-background border-2 border-transparent focus:border-primary focus:ring-primary/20',\r\n primary:\r\n 'bg-primary text-white hover:bg-primary-hover focus:ring-primary/20',\r\n outline:\r\n 'bg-transparent border-2 border-primary text-foreground hover:bg-primary/5 focus:ring-primary/20',\r\n },\r\n size: {\r\n sm: 'h-8 px-2 text-sm gap-1',\r\n md: 'h-10 px-2.5 text-base gap-2',\r\n lg: 'h-12 px-3 text-lg gap-2',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'md',\r\n },\r\n }\r\n);\r\n\r\ntype PaginationVariantProps = VariantProps<typeof paginationButtonVariants>;\r\n\r\nexport interface PaginationProps extends PaginationVariantProps {\r\n /**\r\n * Current active page (1-indexed)\r\n */\r\n currentPage: number;\r\n /**\r\n * Total number of pages\r\n */\r\n totalPages: number;\r\n /**\r\n * Callback when page changes\r\n */\r\n onPageChange: (page: number) => void;\r\n /**\r\n * Items per page value\r\n */\r\n itemsPerPage?: number;\r\n /**\r\n * Callback when items per page changes\r\n */\r\n onItemsPerPageChange?: (pageSize: number) => void;\r\n /**\r\n * Label for the previous button\r\n */\r\n previousLabel?: string;\r\n /**\r\n * Label for the next button\r\n */\r\n nextLabel?: string;\r\n /**\r\n * Show items per page selector\r\n */\r\n showItemsPerPage?: boolean;\r\n /**\r\n * Available items per page options\r\n */\r\n itemsPerPageOptions?: number[];\r\n /**\r\n * Show page info text\r\n */\r\n showPageInfo?: boolean;\r\n /**\r\n * Custom page info text template\r\n */\r\n pageInfoTemplate?: string;\r\n /**\r\n * Show icons in buttons\r\n */\r\n showIcons?: boolean;\r\n /**\r\n * Additional CSS classes\r\n */\r\n className?: string;\r\n rowsLabel?: string;\r\n previousAriaLabel?: string;\r\n nextAriaLabel?: string;\r\n}\r\n\r\nconst Pagination = React.forwardRef<HTMLDivElement, PaginationProps>(\r\n (\r\n {\r\n currentPage,\r\n totalPages,\r\n onPageChange,\r\n itemsPerPage = 10,\r\n onItemsPerPageChange,\r\n previousLabel = 'Previous',\r\n nextLabel = 'Next',\r\n rowsLabel = 'Rows:',\r\n previousAriaLabel = 'Go to previous page',\r\n nextAriaLabel = 'Go to next page',\r\n showItemsPerPage = true,\r\n itemsPerPageOptions = [10, 25, 50, 100],\r\n showPageInfo = true,\r\n pageInfoTemplate = 'Page {current} of {total}',\r\n showIcons = true,\r\n variant,\r\n size,\r\n className,\r\n },\r\n ref\r\n ) => {\r\n const rowsOptions = itemsPerPageOptions.map((num) => ({\r\n label: num.toString(),\r\n value: num,\r\n }));\r\n\r\n const pageInfo = pageInfoTemplate\r\n .replace('{current}', currentPage.toString())\r\n .replace('{total}', totalPages.toString());\r\n\r\n const handlePrevious = () => {\r\n if (currentPage > 1) {\r\n onPageChange(currentPage - 1);\r\n }\r\n };\r\n\r\n const handleNext = () => {\r\n if (currentPage < totalPages) {\r\n onPageChange(currentPage + 1);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'flex flex-col items-center justify-between gap-4 md:flex-row',\r\n className\r\n )}\r\n >\r\n {showPageInfo && (\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {pageInfo}\r\n </span>\r\n )}\r\n <div className=\"flex items-center gap-4\">\r\n {showItemsPerPage && onItemsPerPageChange && (\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-medium text-foreground\">\r\n {rowsLabel}\r\n </span>\r\n <Select\r\n value={itemsPerPage}\r\n onChange={(value) => onItemsPerPageChange(value as number)}\r\n options={rowsOptions}\r\n size={size}\r\n variant={\r\n variant === 'primary' || variant === null\r\n ? 'default'\r\n : variant\r\n }\r\n dropdownDirection=\"up\"\r\n searchEnabled={false}\r\n width=\"lg\"\r\n />\r\n </div>\r\n )}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n onClick={handlePrevious}\r\n disabled={currentPage === 1}\r\n className={cn(paginationButtonVariants({ variant, size }))}\r\n aria-label={previousAriaLabel}\r\n >\r\n {showIcons && <ChevronLeft size={16} />}\r\n {previousLabel}\r\n </button>\r\n <button\r\n onClick={handleNext}\r\n disabled={currentPage === totalPages}\r\n className={cn(paginationButtonVariants({ variant, size }))}\r\n aria-label={nextAriaLabel}\r\n >\r\n {nextLabel}\r\n {showIcons && <ChevronRight size={16} />}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nPagination.displayName = 'Pagination';\r\n\r\nexport { Pagination, paginationButtonVariants };\r\n","import { IterationCw, RotateCcw, ShoppingCart } from 'lucide-react';\r\nimport { ProductCondition } from '@/types/enums';\r\nimport { Button } from '../Button';\r\nimport { cn } from '@/utils';\r\n\r\nexport interface FrontSideProps {\r\n isFlipped: boolean;\r\n setIsFlipped: (flipped: boolean) => void;\r\n onCardClick: () => void;\r\n productImage?: React.ReactNode;\r\n fallbackImage?: React.ReactNode;\r\n productCondition?: string;\r\n brand?: string;\r\n name?: string;\r\n description?: string;\r\n price?: number;\r\n color?: string;\r\n isExchangeable?: boolean;\r\n isStoreProduct?: boolean;\r\n interests?: string[];\r\n hasOffer?: boolean;\r\n offerLabel?: string;\r\n offerPrice?: number;\r\n localeString?: string;\r\n onAddToCart?: () => void;\r\n onExchange?: () => void;\r\n addToCartAriaLabel?: string;\r\n exchangeAriaLabel?: string;\r\n addToCartLabel?: string;\r\n exchangeLabel?: string;\r\n}\r\n\r\nexport default function CardFrontSide({\r\n isFlipped,\r\n setIsFlipped,\r\n onCardClick,\r\n productImage,\r\n fallbackImage,\r\n productCondition,\r\n brand,\r\n name,\r\n description,\r\n price,\r\n color,\r\n isExchangeable,\r\n isStoreProduct,\r\n hasOffer,\r\n offerPrice,\r\n onAddToCart,\r\n onExchange,\r\n addToCartAriaLabel = 'Add to cart',\r\n exchangeAriaLabel = 'Exchange product',\r\n offerLabel = 'Price Drop',\r\n localeString = 'es-CL',\r\n addToCartLabel = 'Agregar al carrito',\r\n exchangeLabel = 'Intercambiar',\r\n interests = [\r\n 'exchange interest1',\r\n 'exchange interest2',\r\n 'exchange interest3',\r\n ],\r\n}: FrontSideProps) {\r\n // Color mapping for product conditions\r\n const conditionColorMap: Record<ProductCondition, string> = {\r\n [ProductCondition.NEW]: 'bg-green-500 text-white',\r\n [ProductCondition.OPEN_BOX]: 'bg-blue-400 text-white',\r\n [ProductCondition.LIKE_NEW]: 'bg-emerald-400 text-white',\r\n [ProductCondition.FAIR]: 'bg-yellow-400 text-gray-900',\r\n [ProductCondition.POOR]: 'bg-red-500 text-white',\r\n [ProductCondition.FOR_PARTS]: 'bg-gray-500 text-white',\r\n [ProductCondition.REFURBISHED]: 'bg-purple-500 text-white',\r\n };\r\n\r\n // Get color for condition\r\n const getConditionColor = (condition?: string) => {\r\n if (!condition) return 'bg-gray-300 text-gray-700';\r\n const key = condition as ProductCondition;\r\n return conditionColorMap[key] || 'bg-gray-300 text-gray-700';\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n // CSS Global Classes\r\n 'card-flip-front',\r\n // Colors and Styles\r\n 'bg-white dark:bg-stone-800',\r\n 'rounded-xl shadow-md',\r\n 'border border-gray-200/60 dark:border-stone-700/60',\r\n 'overflow-hidden',\r\n // Hover Effects\r\n 'hover:shadow-xl',\r\n 'hover:border-primary/40',\r\n 'dark:hover:border-primary/50',\r\n // Transitions\r\n 'transition-all duration-300',\r\n 'group'\r\n )}\r\n >\r\n {/* Image Container */}\r\n <figure\r\n className={cn(\r\n 'relative',\r\n 'aspect-[4/3]',\r\n 'bg-gradient-to-br from-gray-100 to-gray-50',\r\n 'dark:from-stone-700 dark:to-stone-800',\r\n 'overflow-hidden'\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'absolute inset-0',\r\n 'opacity-0',\r\n 'group-hover:opacity-100',\r\n 'bg-gradient-to-t from-black/20 to-transparent',\r\n 'transition-opacity',\r\n 'duration-300',\r\n 'pointer-events-none',\r\n 'z-[1]'\r\n )}\r\n />\r\n\r\n <div\r\n className={cn(\r\n 'relative',\r\n 'w-full',\r\n 'h-full',\r\n 'group-hover:scale-105',\r\n 'transition-transform',\r\n 'duration-500'\r\n )}\r\n >\r\n {productImage ? productImage : fallbackImage}\r\n </div>\r\n\r\n {/* Condition / Offer Badge */}\r\n {isStoreProduct ? (\r\n hasOffer ? (\r\n <span\r\n className={cn(\r\n 'absolute',\r\n 'bottom-2',\r\n 'left-2',\r\n 'bg-red-500',\r\n 'text-white',\r\n 'backdrop-blur-md',\r\n 'text-[10px]',\r\n 'font-semibold',\r\n 'px-2.5',\r\n 'py-1',\r\n 'rounded-lg',\r\n 'shadow-md',\r\n 'border',\r\n 'border-white/50',\r\n 'dark:border-stone-700/50'\r\n )}\r\n >\r\n {offerLabel}\r\n </span>\r\n ) : null\r\n ) : (\r\n <span\r\n className={cn(\r\n 'absolute',\r\n 'bottom-2',\r\n 'left-2',\r\n getConditionColor(productCondition),\r\n 'backdrop-blur-md',\r\n 'text-[10px]',\r\n 'font-semibold',\r\n 'px-2.5',\r\n 'py-1',\r\n 'rounded-lg',\r\n 'capitalize',\r\n 'shadow-md',\r\n 'border',\r\n 'border-white/50',\r\n 'dark:border-stone-700/50'\r\n )}\r\n >\r\n {productCondition}\r\n </span>\r\n )}\r\n\r\n {/* Flip Button - Compacto */}\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsFlipped(!isFlipped);\r\n }}\r\n className={cn(\r\n 'absolute',\r\n 'top-2',\r\n 'right-2',\r\n 'bg-white/90',\r\n 'dark:bg-stone-800/90',\r\n 'hover:bg-primary',\r\n 'dark:hover:bg-primary',\r\n 'text-gray-700',\r\n 'dark:text-stone-200',\r\n 'hover:text-white',\r\n 'p-1.5',\r\n 'rounded-lg',\r\n 'shadow-lg',\r\n 'transition-all',\r\n 'duration-200',\r\n 'hover:scale-110',\r\n 'backdrop-blur-sm',\r\n 'border',\r\n 'border-gray-200/50',\r\n 'dark:border-stone-600/50',\r\n 'z-[2]'\r\n )}\r\n aria-label=\"Ver impacto ambiental\"\r\n >\r\n <RotateCcw className=\"w-3.5 h-3.5\" />\r\n </button>\r\n </figure>\r\n\r\n {/* Content - Compacto y limpio */}\r\n <div className=\"p-3.5\" onClick={onCardClick}>\r\n {/* Header */}\r\n <header\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'justify-between',\r\n 'gap-2',\r\n 'mb-2'\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n 'text-gray-500',\r\n 'dark:text-stone-400',\r\n 'text-[10px]',\r\n 'font-medium',\r\n 'uppercase',\r\n 'tracking-wide',\r\n 'truncate'\r\n )}\r\n >\r\n {brand}\r\n </span>\r\n {color && (\r\n <span\r\n className={cn(\r\n 'text-gray-400',\r\n 'dark:text-stone-500',\r\n 'text-[10px]',\r\n 'font-medium',\r\n 'truncate',\r\n 'max-w-[60px]'\r\n )}\r\n >\r\n {color}\r\n </span>\r\n )}\r\n </header>\r\n\r\n {/* Product Name */}\r\n <h3\r\n className={cn(\r\n 'font-semibold',\r\n 'text-sm',\r\n 'text-gray-900',\r\n 'dark:text-stone-50',\r\n 'line-clamp-1',\r\n 'mb-1.5',\r\n 'group-hover:text-primary',\r\n 'dark:group-hover:text-primary-hover',\r\n 'transition-colors',\r\n 'duration-200'\r\n )}\r\n >\r\n {name}\r\n </h3>\r\n\r\n {/* Description */}\r\n <p\r\n className={cn(\r\n 'text-gray-600',\r\n 'dark:text-stone-400',\r\n 'text-xs',\r\n 'line-clamp-1',\r\n 'mb-3',\r\n 'leading-relaxed'\r\n )}\r\n >\r\n {description}\r\n </p>\r\n\r\n {/* Footer */}\r\n <footer\r\n className={cn(\r\n 'flex',\r\n 'flex-col',\r\n 'items-start',\r\n 'justify-between',\r\n 'gap-2'\r\n )}\r\n >\r\n {isStoreProduct && hasOffer && !isExchangeable && (\r\n <div className=\"flex items-center justify-center gap-1\">\r\n <span className=\"text-primary dark:text-primary-hover font-bold text-xl\">\r\n ${offerPrice?.toLocaleString(localeString)}\r\n </span>\r\n <span className=\"text-sm text-gray-500 line-through\">\r\n ${price?.toLocaleString(localeString)}\r\n </span>\r\n </div>\r\n )}{' '}\r\n {(!isStoreProduct || !hasOffer) && !isExchangeable && (\r\n <p className=\"text-primary dark:text-primary-hover font-bold text-xl\">\r\n ${price?.toLocaleString(localeString)}\r\n </p>\r\n )}\r\n {isExchangeable && interests && (\r\n <div\r\n className={cn(\r\n 'flex',\r\n 'items-center',\r\n 'gap-2',\r\n 'mb-2',\r\n 'overflow-x-auto',\r\n 'scroll-smooth',\r\n 'snap-x',\r\n 'snap-mandatory',\r\n 'px-3',\r\n 'flex-nowrap',\r\n 'w-full',\r\n 'scrollbar-hide'\r\n )}\r\n style={{ WebkitOverflowScrolling: 'touch' }}\r\n tabIndex={0}\r\n role=\"list\"\r\n aria-label=\"Interests\"\r\n >\r\n {interests.map((interest, index) => (\r\n <span\r\n key={index}\r\n role=\"listitem\"\r\n className={cn(\r\n 'inline-flex',\r\n 'items-center',\r\n 'flex-shrink-0',\r\n 'snap-start',\r\n 'text-[10px]',\r\n 'whitespace-nowrap',\r\n 'px-2',\r\n 'py-1',\r\n 'rounded-full',\r\n 'bg-gray-100',\r\n 'dark:bg-stone-700',\r\n 'text-gray-800',\r\n 'dark:text-stone-100',\r\n 'font-medium'\r\n )}\r\n >\r\n {interest}\r\n </span>\r\n ))}\r\n </div>\r\n )}\r\n {/* If store product: only show add-to-cart. Marketplace: show exchange if exchangeable, otherwise add-to-cart */}\r\n {isStoreProduct && !isExchangeable && (\r\n <Button\r\n variant=\"primary\"\r\n size=\"sm\"\r\n fullWidth\r\n aria-label={addToCartAriaLabel}\r\n rightIcon={ShoppingCart}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddToCart?.();\r\n }}\r\n >\r\n {addToCartLabel}\r\n </Button>\r\n )}\r\n {isExchangeable && (\r\n <Button\r\n variant=\"primary\"\r\n size=\"sm\"\r\n fullWidth\r\n aria-label={exchangeAriaLabel}\r\n rightIcon={IterationCw}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onExchange?.();\r\n }}\r\n >\r\n {exchangeLabel}\r\n </Button>\r\n )}{' '}\r\n {!isExchangeable && !isStoreProduct && (\r\n <Button\r\n variant=\"primary\"\r\n size=\"sm\"\r\n fullWidth\r\n aria-label={addToCartAriaLabel}\r\n rightIcon={ShoppingCart}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onAddToCart?.();\r\n }}\r\n >\r\n {addToCartLabel}\r\n </Button>\r\n )}\r\n </footer>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type {\r\n ProductCategoryMaterial,\r\n StoreProductMaterial,\r\n} from '@/types/product';\r\nimport type { EnvironmentalImpactModalProps } from '../EnvironmentalImpactModal';\r\nimport {\r\n Droplets,\r\n Leaf,\r\n MapPin,\r\n Phone,\r\n RotateCcw,\r\n UserRound,\r\n ChevronRight,\r\n} from 'lucide-react';\r\nimport { cn } from '@/utils';\r\n\r\nexport interface BackSideProps {\r\n isFlipped: boolean;\r\n setIsFlipped: (flipped: boolean) => void;\r\n setShowImpactModal: (show: boolean) => void;\r\n sellerName?: string;\r\n sellerPhone?: string;\r\n sellerAddress?: string;\r\n environmentalImpact?:\r\n | ProductCategoryMaterial[]\r\n | StoreProductMaterial[]\r\n | EnvironmentalImpactModalProps['environmentalImpact'];\r\n impactLabel?: string;\r\n materialsLabel?: string;\r\n viewMoreLabel?: string;\r\n sellerLabel?: string;\r\n co2Label?: string;\r\n waterLabel?: string;\r\n}\r\n\r\nexport default function CardBackSide({\r\n isFlipped,\r\n setIsFlipped,\r\n setShowImpactModal,\r\n environmentalImpact,\r\n sellerName,\r\n sellerPhone,\r\n sellerAddress,\r\n impactLabel = 'Environmental Impact',\r\n materialsLabel = 'Materials:',\r\n viewMoreLabel = 'View Full Impact',\r\n sellerLabel = 'Seller Information',\r\n co2Label = 'CO₂ Saved',\r\n waterLabel = 'Water Saved',\r\n}: BackSideProps) {\r\n const calculateImpactLevel = (co2: number) => {\r\n if (co2 > 50) return { level: 'High', color: 'success', width: '100%' };\r\n if (co2 > 20) return { level: 'Medium', color: 'warning', width: '66%' };\r\n return { level: 'Low', color: 'info', width: '33%' };\r\n };\r\n // Normalize environmentalImpact to the modal shape { totalCo2SavingsKG, totalWaterSavingsLT, materialBreakdown }\r\n const normalizedImpact = (() => {\r\n if (!environmentalImpact) return undefined;\r\n if (Array.isArray(environmentalImpact)) {\r\n type MaterialCandidate = {\r\n material?: {\r\n materialType?: string;\r\n percentage?: number;\r\n estimatedCo2SavingsKG?: number;\r\n estimatedWaterSavingsLT?: number;\r\n };\r\n materialType?: string;\r\n percentage?: number;\r\n quantity?: number;\r\n weightKG?: number;\r\n co2SavingsKG?: number;\r\n waterSavingsLT?: number;\r\n };\r\n\r\n const materialBreakdown = environmentalImpact.map(\r\n (m: MaterialCandidate) => {\r\n const mm = m as MaterialCandidate;\r\n const materialType =\r\n mm.material?.materialType ?? mm.materialType ?? 'Material';\r\n const percentage = mm.material?.percentage ?? mm.percentage ?? 0;\r\n const weightKG = mm.quantity ?? mm.weightKG ?? 0;\r\n const co2SavingsKG =\r\n mm.material?.estimatedCo2SavingsKG ?? mm.co2SavingsKG ?? 0;\r\n const waterSavingsLT =\r\n mm.material?.estimatedWaterSavingsLT ?? mm.waterSavingsLT ?? 0;\r\n return {\r\n materialType,\r\n percentage,\r\n weightKG,\r\n co2SavingsKG,\r\n waterSavingsLT,\r\n };\r\n }\r\n );\r\n\r\n const totalCo2SavingsKG = materialBreakdown.reduce(\r\n (s, m) => s + (m.co2SavingsKG || 0),\r\n 0\r\n );\r\n const totalWaterSavingsLT = materialBreakdown.reduce(\r\n (s, m) => s + (m.waterSavingsLT || 0),\r\n 0\r\n );\r\n\r\n return { totalCo2SavingsKG, totalWaterSavingsLT, materialBreakdown };\r\n }\r\n return environmentalImpact as EnvironmentalImpactModalProps['environmentalImpact'];\r\n })();\r\n\r\n const impactLevel = normalizedImpact\r\n ? calculateImpactLevel(normalizedImpact.totalCo2SavingsKG)\r\n : null;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'card-flip-back',\r\n 'bg-gradient-to-br from-white via-emerald-50/20 to-white',\r\n 'dark:from-stone-800 dark:via-stone-850 dark:to-stone-900',\r\n 'border-2 border-gray-200/60',\r\n 'dark:border-stone-700/50'\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'py-4',\r\n 'px-4',\r\n 'w-full',\r\n 'h-full',\r\n 'flex',\r\n 'flex-col',\r\n 'overflow-y-auto',\r\n 'scrollbar-hide',\r\n 'relative'\r\n )}\r\n >\r\n {/* Flip Button */}\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setIsFlipped(!isFlipped);\r\n }}\r\n className={cn(\r\n 'absolute top-2 right-2',\r\n 'bg-white/90',\r\n 'dark:bg-stone-800/90',\r\n 'hover:bg-primary',\r\n 'dark:hover:bg-primary',\r\n 'backdrop-blur-md',\r\n 'text-gray-700',\r\n 'dark:text-stone-200',\r\n 'hover:text-white',\r\n 'p-1.5',\r\n 'rounded-lg',\r\n 'shadow-lg',\r\n 'transition-all',\r\n 'duration-200',\r\n 'hover:scale-110',\r\n 'z-10',\r\n 'border',\r\n 'border-gray-200/50',\r\n 'dark:border-stone-600/50'\r\n )}\r\n aria-label=\"Ver producto\"\r\n >\r\n <RotateCcw className=\"w-3.5 h-3.5\" />\r\n </button>\r\n\r\n {/* Environmental Impact Section */}\r\n {environmentalImpact && (\r\n <div className=\"mb-4\">\r\n <div className=\"flex items-center justify-between mb-0.5\">\r\n <h4\r\n className={cn(\r\n 'font-bold',\r\n 'text-gray-900',\r\n 'dark:text-stone-100',\r\n 'text-xs',\r\n 'flex',\r\n 'items-center',\r\n 'gap-1.5'\r\n )}\r\n >\r\n <Leaf className=\"w-3.5 h-3.5 text-success\" />\r\n {impactLabel}\r\n </h4>\r\n </div>\r\n <div className=\"mb-3\">\r\n {impactLevel && (\r\n <span\r\n className={cn(\r\n 'text-[9px]',\r\n 'font-semibold',\r\n 'px-2',\r\n 'py-0.5',\r\n 'rounded-full',\r\n `bg-${impactLevel.color}/15`,\r\n `text-${impactLevel.color}`,\r\n `border`,\r\n `border-${impactLevel.color}/30`\r\n )}\r\n >\r\n {impactLevel.level}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Impact Progress Bar - Delgado */}\r\n <div\r\n className={cn(\r\n 'mb-2.5',\r\n 'bg-gray-200/60',\r\n 'dark:bg-stone-700/50',\r\n 'rounded-full',\r\n 'h-1',\r\n 'overflow-hidden'\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'h-full',\r\n 'bg-gradient-to-r from-success to-success/70',\r\n 'rounded-full',\r\n 'transition-all',\r\n 'duration-1000'\r\n )}\r\n style={{ width: impactLevel?.width || '0%' }}\r\n />\r\n </div>\r\n\r\n {/* Impact Stats - Grid compacto */}\r\n <div className=\"grid grid-cols-2 gap-2 mb-2.5\">\r\n <div\r\n className={cn(\r\n 'bg-gradient-to-br from-success/8 to-transparent',\r\n 'dark:from-success/15 dark:to-transparent',\r\n 'rounded-lg',\r\n 'p-1.5',\r\n 'border',\r\n 'border-success/20',\r\n 'dark:border-success/30'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-1 mb-0.5\">\r\n <Leaf className=\"w-3 h-3 text-success\" />\r\n <span className=\"text-[9px] text-gray-600 dark:text-stone-400 font-medium\">\r\n {co2Label}\r\n </span>\r\n </div>\r\n <p className=\"text-sm font-bold text-success\">\r\n {normalizedImpact?.totalCo2SavingsKG} kg\r\n </p>\r\n </div>\r\n\r\n <div\r\n className={cn(\r\n 'bg-gradient-to-br from-info/8 to-transparent',\r\n 'dark:from-info/15 dark:to-transparent',\r\n 'rounded-lg',\r\n 'p-1.5',\r\n 'border',\r\n 'border-info/20',\r\n 'dark:border-info/30'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-1 mb-0.5\">\r\n <Droplets className=\"w-3 h-3 text-info\" />\r\n <span className=\"text-[9px] text-gray-600 dark:text-stone-400 font-medium\">\r\n {waterLabel}\r\n </span>\r\n </div>\r\n <p className=\"text-sm font-bold text-info\">\r\n {normalizedImpact?.totalWaterSavingsLT} L\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Material Breakdown - Compacto */}\r\n {normalizedImpact &&\r\n normalizedImpact.materialBreakdown.length > 0 && (\r\n <div\r\n className={cn(\r\n 'bg-gray-50/80',\r\n 'dark:bg-stone-800/50',\r\n 'rounded-lg',\r\n 'p-2.5',\r\n 'border',\r\n 'border-gray-200/50',\r\n 'dark:border-stone-700/50'\r\n )}\r\n >\r\n <p className=\"text-[9px] font-semibold text-gray-700 dark:text-stone-300 mb-2\">\r\n {materialsLabel}\r\n </p>\r\n <div className=\"space-y-2\">\r\n {normalizedImpact.materialBreakdown\r\n .slice(0, 2)\r\n .map((material, index) => (\r\n <div key={index} className=\"space-y-1\">\r\n <div className=\"flex items-center justify-between text-[9px]\">\r\n <span className=\"text-gray-700 dark:text-stone-300 font-medium truncate\">\r\n {material.materialType}\r\n </span>\r\n <span className=\"font-bold text-primary dark:text-primary ml-1\">\r\n {material.percentage.toFixed(1)}%\r\n </span>\r\n </div>\r\n <div className=\"bg-gray-200 dark:bg-stone-700 rounded-full h-1 overflow-hidden\">\r\n <div\r\n className={cn(\r\n 'h-full',\r\n 'bg-gradient-to-r from-primary to-primary-hover',\r\n 'rounded-full',\r\n 'transition-all',\r\n 'duration-500'\r\n )}\r\n style={{ width: `${material.percentage}%` }}\r\n />\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* View More Button - Compacto */}\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setShowImpactModal(true);\r\n }}\r\n className={cn(\r\n 'w-full',\r\n 'mt-2.5',\r\n 'py-1.5',\r\n 'px-3',\r\n 'bg-primary/5',\r\n 'hover:bg-primary/10',\r\n 'dark:bg-primary/10',\r\n 'dark:hover:bg-primary/15',\r\n 'text-primary',\r\n 'dark:text-primary-hover',\r\n 'rounded-lg',\r\n 'text-[9px]',\r\n 'font-semibold',\r\n 'transition-all',\r\n 'duration-200',\r\n 'flex',\r\n 'items-center',\r\n 'justify-center',\r\n 'gap-1',\r\n 'border',\r\n 'border-primary/20',\r\n 'hover:border-primary/30',\r\n 'group/viewmore'\r\n )}\r\n >\r\n {viewMoreLabel}\r\n <ChevronRight className=\"w-3 h-3 group-hover/viewmore:translate-x-0.5 transition-transform duration-200\" />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Seller Information - Compacto */}\r\n <div className=\"mt-auto pt-3 border-t border-gray-200/60 dark:border-stone-700/50\">\r\n <div className=\"flex items-center gap-1.5 mb-2\">\r\n <UserRound className=\"w-3.5 h-3.5 text-primary\" />\r\n <h4 className=\"font-bold text-gray-900 dark:text-stone-100 text-xs\">\r\n {sellerLabel}\r\n </h4>\r\n </div>\r\n <div\r\n className={cn(\r\n 'space-y-1.5',\r\n 'bg-gray-50/80',\r\n 'dark:bg-stone-800/50',\r\n 'rounded-lg',\r\n 'p-2.5',\r\n 'border',\r\n 'border-gray-200/50',\r\n 'dark:border-stone-700/50'\r\n )}\r\n >\r\n {sellerName && (\r\n <div className=\"flex items-center gap-2 text-gray-700 dark:text-stone-300 text-[9px] font-medium\">\r\n <UserRound className=\"w-3 h-3 flex-shrink-0 text-gray-400 dark:text-stone-500\" />\r\n <span className=\"truncate\">{sellerName}</span>\r\n </div>\r\n )}\r\n {sellerPhone && (\r\n <div className=\"flex items-center gap-2 text-gray-700 dark:text-stone-300 text-[9px] font-medium\">\r\n <Phone className=\"w-3 h-3 flex-shrink-0 text-gray-400 dark:text-stone-500\" />\r\n <span className=\"truncate\">{sellerPhone}</span>\r\n </div>\r\n )}\r\n {sellerAddress && (\r\n <div className=\"flex items-center gap-2 text-gray-700 dark:text-stone-300 text-[9px] font-medium\">\r\n <MapPin className=\"w-3 h-3 flex-shrink-0 text-gray-400 dark:text-stone-500\" />\r\n <span className=\"truncate\">{sellerAddress}</span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport CardFrontSide from './FrontSide';\r\nimport CardBackSide from './BackSide';\r\nimport { EnvironmentalImpactModal } from '../EnvironmentalImpactModal';\r\nimport type { EnvironmentalImpactModalProps } from '../EnvironmentalImpactModal';\r\nimport {\r\n type StoreProduct,\r\n type MarketplaceProduct,\r\n type ProductCategoryMaterial,\r\n type StoreProductMaterial,\r\n} from '@/types/product';\r\nimport { type PersonProfile } from '@/types/seller';\r\nimport { cn } from '@/utils';\r\n\r\nexport interface ProductCardProps {\r\n product: Partial<MarketplaceProduct> | Partial<StoreProduct>;\r\n}\r\n\r\nexport default function ProductCard({ product }: ProductCardProps) {\r\n const [isFlipped, setIsFlipped] = useState(false);\r\n const [showImpactModal, setShowImpactModal] = useState(false);\r\n\r\n const { images, price, name, brand, color, description, seller } = product;\r\n\r\n // Determine if this is a store product (hasOffer is specific to StoreProduct)\r\n const isStoreProduct = 'hasOffer' in product;\r\n const storeHasOffer = Boolean((product as Partial<StoreProduct>).hasOffer);\r\n const storeOfferPrice = (product as Partial<StoreProduct>).offerPrice;\r\n\r\n // prepare environmental impact sources\r\n const envImpactModal = (\r\n product as unknown as {\r\n environmentalImpact?: EnvironmentalImpactModalProps['environmentalImpact'];\r\n }\r\n ).environmentalImpact;\r\n const backImpact = (product as Partial<MarketplaceProduct>).productCategory\r\n ?.materials as\r\n | ProductCategoryMaterial[]\r\n | StoreProductMaterial[]\r\n | undefined;\r\n\r\n return (\r\n <article\r\n className={cn(\r\n 'flex-shrink-0',\r\n 'w-[220px]',\r\n 'h-[350px]',\r\n 'card-flip-perspective'\r\n )}\r\n >\r\n <div\r\n className={cn('card-flip-inner', isFlipped ? 'card-flip-flipped' : '')}\r\n >\r\n {/* Front Side - Product Info */}\r\n <CardFrontSide\r\n isFlipped={isFlipped}\r\n setIsFlipped={setIsFlipped}\r\n productImage={\r\n images && images.length > 0 ? (\r\n <img src={images[0]} alt={name} />\r\n ) : null\r\n }\r\n price={price}\r\n name={name}\r\n brand={brand}\r\n productCondition={(product as Partial<MarketplaceProduct>).condition}\r\n color={color}\r\n description={description}\r\n isExchangeable={\r\n // only marketplace products support exchange\r\n !isStoreProduct &&\r\n (product as Partial<MarketplaceProduct>).isExchangeable\r\n }\r\n // store-specific\r\n isStoreProduct={isStoreProduct}\r\n hasOffer={storeHasOffer}\r\n offerPrice={storeOfferPrice}\r\n fallbackImage=\"https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?w=800&q=60&auto=format&fit=crop\"\r\n onCardClick={() => {}}\r\n onAddToCart={() => {}}\r\n onExchange={() => {}}\r\n />\r\n\r\n {/* Back Side - Environmental Impact & Seller Info */}\r\n <CardBackSide\r\n isFlipped={isFlipped}\r\n setIsFlipped={setIsFlipped}\r\n setShowImpactModal={setShowImpactModal}\r\n environmentalImpact={envImpactModal ?? backImpact}\r\n sellerName={(seller?.profile as PersonProfile)?.firstName}\r\n sellerPhone={seller?.phone}\r\n sellerAddress={seller?.address}\r\n />\r\n </div>\r\n\r\n {/* Environmental Impact Modal - Rendered outside card */}\r\n {envImpactModal && (\r\n <EnvironmentalImpactModal\r\n isOpen={showImpactModal}\r\n onClose={() => setShowImpactModal(false)}\r\n environmentalImpact={envImpactModal}\r\n />\r\n )}\r\n </article>\r\n );\r\n}\r\n","import { type LucideIcon } from 'lucide-react';\r\n\r\nexport interface StatsCardProps {\r\n icon: LucideIcon;\r\n mainText: string | number;\r\n description: string;\r\n}\r\n\r\nexport default function StatsCard({\r\n icon: Icon,\r\n mainText,\r\n description,\r\n}: StatsCardProps) {\r\n return (\r\n <article className=\"inline-flex p-4 shadow-md flex-col items-center justify-center min-w-40 rounded-lg bg-white dark:bg-stone-900\">\r\n <div className=\"flex flex-col items-center\">\r\n <div className=\"flex items-center justify-center w-10 h-10 rounded-lg bg-primary/10 text-primary mb-4\">\r\n <Icon className=\"w-5 h-5\" />\r\n </div>\r\n <h3 className=\"text-2xl font-bold text-gray-900 dark:text-stone-100 mb-1\">\r\n {mainText}\r\n </h3>\r\n <p className=\"text-sm text-gray-600 dark:text-stone-400 text-center\">\r\n {description}\r\n </p>\r\n </div>\r\n </article>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\n\r\nconst textVariants = cva('transition-colors', {\r\n variants: {\r\n variant: {\r\n p: 'block',\r\n span: 'inline',\r\n label: 'block font-medium cursor-pointer',\r\n blockquote: 'block border-l-4 border-primary pl-4 italic',\r\n small: 'block text-sm',\r\n code: 'inline-block font-mono bg-background-secondary px-1.5 py-0.5 rounded text-sm',\r\n },\r\n size: {\r\n xs: 'text-xs',\r\n sm: 'text-sm',\r\n base: 'text-base',\r\n lg: 'text-lg',\r\n xl: 'text-xl',\r\n },\r\n weight: {\r\n normal: 'font-normal',\r\n medium: 'font-medium',\r\n semibold: 'font-semibold',\r\n bold: 'font-bold',\r\n },\r\n color: {\r\n default: 'text-foreground',\r\n primary: 'text-primary',\r\n secondary: 'text-foreground-secondary',\r\n tertiary: 'text-foreground-tertiary',\r\n error: 'text-error',\r\n success: 'text-success',\r\n warning: 'text-warning',\r\n muted: 'text-muted',\r\n },\r\n align: {\r\n left: 'text-left',\r\n center: 'text-center',\r\n right: 'text-right',\r\n justify: 'text-justify',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'p',\r\n size: 'base',\r\n weight: 'normal',\r\n color: 'default',\r\n align: 'left',\r\n },\r\n});\r\n\r\ntype TextVariantProps = VariantProps<typeof textVariants>;\r\n\r\nexport interface TextProps\r\n extends Omit<React.HTMLAttributes<HTMLElement>, 'color'>, TextVariantProps {\r\n /**\r\n * The HTML element to render\r\n */\r\n variant?: 'p' | 'span' | 'label' | 'blockquote' | 'small' | 'code';\r\n /**\r\n * Content to display\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * For label variant - associates label with input\r\n */\r\n htmlFor?: string;\r\n /**\r\n * Render as a different element while maintaining variant styling\r\n */\r\n as?: 'p' | 'span' | 'label' | 'blockquote' | 'small' | 'div' | 'code';\r\n}\r\n\r\nconst Text = React.forwardRef<HTMLElement, TextProps>(\r\n (\r\n {\r\n className,\r\n variant = 'p',\r\n size,\r\n weight,\r\n color,\r\n align,\r\n as,\r\n htmlFor,\r\n children,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const Component = (as || variant) as React.ElementType;\r\n\r\n return (\r\n <Component\r\n ref={ref}\r\n htmlFor={variant === 'label' || as === 'label' ? htmlFor : undefined}\r\n className={cn(\r\n textVariants({ variant, size, weight, color, align, className })\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Component>\r\n );\r\n }\r\n);\r\n\r\nText.displayName = 'Text';\r\n\r\nexport { Text, textVariants };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion } from 'motion/react';\r\n\r\nconst textareaVariants = cva(\r\n 'w-full rounded-lg font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 placeholder:text-input-placeholder resize-none',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-input-bg border-2 border-input-border hover:border-input-border-hover focus:border-input-border-focus focus:ring-primary/20',\r\n filled:\r\n 'bg-background-secondary border-2 border-transparent hover:bg-background focus:bg-input-bg focus:border-input-border-focus focus:ring-primary/20',\r\n outline:\r\n 'bg-transparent border-2 border-primary text-foreground hover:bg-primary/5 focus:bg-primary/5 focus:border-primary-active focus:ring-primary/20',\r\n },\r\n textSize: {\r\n sm: 'text-sm py-2 px-3 min-h-[80px]',\r\n md: 'text-base py-3 px-3 min-h-[120px]',\r\n lg: 'text-lg py-4 px-4 min-h-[160px]',\r\n },\r\n hasError: {\r\n true: 'border-error focus:border-error focus:ring-error/20',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n textSize: 'md',\r\n hasError: false,\r\n },\r\n }\r\n);\r\n\r\ntype TextareaVariantProps = VariantProps<typeof textareaVariants>;\r\n\r\nexport interface TextareaProps\r\n extends\r\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>,\r\n Omit<TextareaVariantProps, 'hasError'> {\r\n /**\r\n * Label text displayed above the textarea\r\n */\r\n label?: string;\r\n /**\r\n * Error message to display below the textarea\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Whether to show character count\r\n */\r\n showCharCount?: boolean;\r\n /**\r\n * Width variant of the textarea container\r\n */\r\n width?: 'sm' | 'md' | 'lg' | 'full';\r\n}\r\n\r\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n textSize,\r\n label,\r\n errorMessage,\r\n showCharCount = false,\r\n width = 'full',\r\n disabled = false,\r\n readOnly = false,\r\n maxLength,\r\n value = '',\r\n name,\r\n id,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const computedHasError = !!errorMessage;\r\n const currentLength = String(value).length;\r\n\r\n const widthClass = {\r\n sm: 'w-1/3',\r\n md: 'w-1/2',\r\n lg: 'w-2/3',\r\n full: 'w-full',\r\n }[width];\r\n\r\n const reactId = React.useId();\r\n const generatedId = id || name || `textarea-${reactId}`;\r\n\r\n return (\r\n <div className={cn('space-y-2', widthClass)}>\r\n {label && (\r\n <label\r\n htmlFor={generatedId}\r\n className=\"block text-sm font-medium text-foreground\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"relative\">\r\n <motion.div\r\n initial={false}\r\n animate={{ scale: isFocused ? 1.002 : 1 }}\r\n transition={{ type: 'spring', stiffness: 400, damping: 17 }}\r\n className=\"relative\"\r\n >\r\n <textarea\r\n ref={ref}\r\n id={generatedId}\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n readOnly={readOnly}\r\n maxLength={maxLength}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n className={cn(\r\n textareaVariants({\r\n variant,\r\n textSize,\r\n hasError: computedHasError,\r\n className,\r\n })\r\n )}\r\n {...props}\r\n />\r\n </motion.div>\r\n {showCharCount && maxLength && (\r\n <div className=\"mt-1 text-xs text-foreground-tertiary text-right\">\r\n {currentLength} / {maxLength}\r\n </div>\r\n )}\r\n </div>\r\n {errorMessage && (\r\n <motion.p\r\n initial={{ opacity: 0, y: -5 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"text-xs text-error\"\r\n >\r\n {errorMessage}\r\n </motion.p>\r\n )}\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextarea.displayName = 'Textarea';\r\n\r\nexport { Textarea, textareaVariants };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\nimport { motion, AnimatePresence } from 'motion/react';\r\nimport { type LucideIcon, Eye, EyeOff } from 'lucide-react';\r\n\r\nconst inputVariants = cva(\r\n 'w-full rounded-lg font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 placeholder:text-input-placeholder',\r\n {\r\n variants: {\r\n variant: {\r\n default:\r\n 'bg-input-bg border-2 border-input-border hover:border-input-border-hover focus:border-input-border-focus focus:ring-primary/20',\r\n filled:\r\n 'bg-background-secondary border-2 border-transparent hover:bg-background-tertiary focus:bg-input-bg focus:border-input-border-focus focus:ring-primary/20',\r\n outline:\r\n 'bg-transparent border-2 border-primary text-foreground hover:bg-primary/5 focus:bg-primary/5 focus:border-primary-active focus:ring-primary/20',\r\n },\r\n size: {\r\n sm: 'h-9 text-sm',\r\n md: 'h-11 text-base',\r\n lg: 'h-14 text-lg',\r\n },\r\n hasError: {\r\n true: 'border-error focus:border-error focus:ring-error/20',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'md',\r\n hasError: false,\r\n },\r\n }\r\n);\r\n\r\nexport interface TextInputProps\r\n extends\r\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'onChange'>,\r\n VariantProps<typeof inputVariants> {\r\n /**\r\n * Label text displayed above the input\r\n */\r\n label?: string;\r\n /**\r\n * Icon component to display on the left side\r\n */\r\n leftIcon?: LucideIcon;\r\n /**\r\n * Error message to display below the input\r\n */\r\n errorMessage?: string;\r\n /**\r\n * Callback function when input value changes\r\n */\r\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n /**\r\n * Width variant of the input container\r\n */\r\n width?: 'sm' | 'md' | 'lg' | 'full';\r\n}\r\n\r\nconst TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\r\n (\r\n {\r\n className,\r\n variant,\r\n size,\r\n hasError,\r\n label,\r\n leftIcon: LeftIcon,\r\n errorMessage,\r\n type = 'text',\r\n width = 'full',\r\n id,\r\n name,\r\n disabled,\r\n onFocus,\r\n onBlur,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const [showPassword, setShowPassword] = React.useState(false);\r\n\r\n const widthClass = {\r\n sm: 'w-1/3',\r\n md: 'w-1/2',\r\n lg: 'w-2/3',\r\n full: 'w-full',\r\n }[width];\r\n\r\n const isPassword = type === 'password';\r\n const inputType = isPassword && showPassword ? 'text' : type;\r\n const computedHasError = hasError || !!errorMessage;\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n setIsFocused(true);\r\n onFocus?.(e);\r\n };\r\n\r\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\r\n setIsFocused(false);\r\n onBlur?.(e);\r\n };\r\n\r\n const togglePasswordVisibility = () => {\r\n setShowPassword((prev) => !prev);\r\n };\r\n\r\n return (\r\n <div className={cn('space-y-2', widthClass)}>\r\n {label && (\r\n <label\r\n htmlFor={id || name}\r\n className=\"block text-sm font-medium text-foreground\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"relative\">\r\n <motion.div\r\n initial={false}\r\n animate={{ scale: isFocused ? 1.002 : 1 }}\r\n transition={{ type: 'spring', stiffness: 400, damping: 17 }}\r\n className=\"relative\"\r\n >\r\n {LeftIcon && (\r\n <LeftIcon\r\n className={cn(\r\n 'absolute left-3 top-1/2 transform -translate-y-1/2 w-5 h-5 transition-colors duration-200',\r\n isFocused ? 'text-primary' : 'text-foreground-tertiary',\r\n computedHasError && 'text-error'\r\n )}\r\n />\r\n )}\r\n <input\r\n ref={ref}\r\n id={id || name}\r\n name={name}\r\n type={inputType}\r\n disabled={disabled}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n className={cn(\r\n inputVariants({\r\n variant,\r\n size,\r\n hasError: computedHasError,\r\n className,\r\n }),\r\n {\r\n 'pl-3': !LeftIcon,\r\n 'pl-10': LeftIcon,\r\n 'pr-10': isPassword,\r\n 'pr-3': !isPassword,\r\n }\r\n )}\r\n {...props}\r\n />\r\n {isPassword && (\r\n <button\r\n type=\"button\"\r\n onClick={togglePasswordVisibility}\r\n disabled={disabled}\r\n className={cn(\r\n 'absolute right-3 top-1/2',\r\n 'transform',\r\n '-translate-y-1/2',\r\n 'text-foreground-tertiary',\r\n 'hover:text-foreground-secondary',\r\n 'transition-colors',\r\n 'duration-200',\r\n 'disabled:opacity-50',\r\n 'disabled:cursor-not-allowed'\r\n )}\r\n tabIndex={-1}\r\n >\r\n <AnimatePresence mode=\"wait\">\r\n {showPassword ? (\r\n <motion.div\r\n key=\"eye-off\"\r\n initial={{ opacity: 0, scale: 0.8 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.8 }}\r\n transition={{ duration: 0.15 }}\r\n >\r\n <EyeOff className=\"w-5 h-5\" />\r\n </motion.div>\r\n ) : (\r\n <motion.div\r\n key=\"eye\"\r\n initial={{ opacity: 0, scale: 0.8 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n exit={{ opacity: 0, scale: 0.8 }}\r\n transition={{ duration: 0.15 }}\r\n >\r\n <Eye className=\"w-5 h-5\" />\r\n </motion.div>\r\n )}\r\n </AnimatePresence>\r\n </button>\r\n )}\r\n </motion.div>\r\n {errorMessage && (\r\n <motion.p\r\n initial={{ opacity: 0, y: -5 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ duration: 0.2 }}\r\n className=\"mt-1 text-xs text-error\"\r\n >\r\n {errorMessage}\r\n </motion.p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nTextInput.displayName = 'TextInput';\r\n\r\nexport { TextInput, inputVariants };\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\nimport { cn } from '@/utils/cn';\r\n\r\nconst titleVariants = cva('font-bold tracking-tight transition-colors', {\r\n variants: {\r\n level: {\r\n h1: 'text-5xl md:text-6xl lg:text-7xl',\r\n h2: 'text-4xl md:text-5xl lg:text-6xl',\r\n h3: 'text-3xl md:text-4xl lg:text-5xl',\r\n h4: 'text-2xl md:text-3xl lg:text-4xl',\r\n h5: 'text-xl md:text-2xl lg:text-3xl',\r\n h6: 'text-lg md:text-xl lg:text-2xl',\r\n },\r\n weight: {\r\n normal: 'font-normal',\r\n medium: 'font-medium',\r\n semibold: 'font-semibold',\r\n bold: 'font-bold',\r\n extrabold: 'font-extrabold',\r\n },\r\n color: {\r\n default: 'text-foreground',\r\n primary: 'text-primary',\r\n secondary: 'text-foreground-secondary',\r\n tertiary: 'text-foreground-tertiary',\r\n error: 'text-error',\r\n success: 'text-success',\r\n warning: 'text-warning',\r\n },\r\n align: {\r\n left: 'text-left',\r\n center: 'text-center',\r\n right: 'text-right',\r\n },\r\n },\r\n defaultVariants: {\r\n level: 'h1',\r\n weight: 'bold',\r\n color: 'default',\r\n align: 'left',\r\n },\r\n});\r\n\r\ntype TitleVariantProps = VariantProps<typeof titleVariants>;\r\n\r\nexport interface TitleProps\r\n extends\r\n Omit<React.HTMLAttributes<HTMLHeadingElement>, 'color'>,\r\n TitleVariantProps {\r\n /**\r\n * The semantic heading level to render\r\n */\r\n level?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n /**\r\n * Content to display\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * Whether to render as a different heading level for styling while maintaining semantic meaning\r\n */\r\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n}\r\n\r\nconst Title = React.forwardRef<HTMLHeadingElement, TitleProps>(\r\n (\r\n { className, level = 'h1', weight, color, align, as, children, ...props },\r\n ref\r\n ) => {\r\n const Component = as || level;\r\n\r\n return (\r\n <Component\r\n ref={ref}\r\n className={cn(\r\n titleVariants({ level, weight, color, align, className })\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n </Component>\r\n );\r\n }\r\n);\r\n\r\nTitle.displayName = 'Title';\r\n\r\nexport { Title, titleVariants };\r\n"]}