@thorprovider/blocks 0.1.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +107 -0
- package/README.md +73 -29
- package/docs/standards/data-contracts.md +13 -2
- package/package.json +26 -10
- package/scripts/fix-esm-extensions.mjs +40 -0
- package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +122 -0
- package/src/blocks/e-commerce/product-categories/category-card.test.tsx +68 -0
- package/src/blocks/e-commerce/product-categories/category-card.tsx +172 -0
- package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +67 -0
- package/src/blocks/e-commerce/product-categories/category-shared.tsx +109 -0
- package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +170 -0
- package/src/blocks/e-commerce/product-categories/product-category.test.tsx +266 -0
- package/src/blocks/e-commerce/product-categories/product-category.tsx +462 -0
- package/src/blocks/e-commerce/product-list/product-card.test.tsx +263 -0
- package/src/blocks/e-commerce/product-list/product-card.tsx +424 -0
- package/src/blocks/e-commerce/product-list/product-grid.test.tsx +162 -0
- package/src/blocks/e-commerce/product-list/product-grid.tsx +114 -0
- package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +71 -0
- package/src/blocks/e-commerce/product-overview/{product-overview-5-lightbox-tab.tsx → product-overview-lightbox-tab.tsx} +35 -23
- package/src/blocks/e-commerce/product-overview/{product-overview-5-reviews-tab.tsx → product-overview-reviews-tab.tsx} +40 -17
- package/src/blocks/e-commerce/product-overview/{product-overview-5-tabs.tsx → product-overview-tabs.tsx} +8 -7
- package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +283 -0
- package/src/blocks/e-commerce/product-overview/product-overview.tsx +1186 -0
- package/src/blocks/e-commerce/reviews/review-rating-2.tsx +5 -6
- package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +399 -0
- package/src/blocks/e-commerce/shopping-carts/{shopping-cart-4.tsx → shopping-cart.tsx} +119 -85
- package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +412 -0
- package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +1283 -0
- package/src/blocks/marketing/features/feature.test.tsx +153 -0
- package/src/blocks/marketing/features/feature.tsx +195 -0
- package/src/blocks/marketing/navbars/navbar-4-account-menu.test.tsx +27 -9
- package/src/blocks/marketing/navbars/navbar-4.test.tsx +33 -2
- package/src/blocks/marketing/navbars/navbar-4.tsx +29 -11
- package/src/index.ts +77 -48
- package/src/lib/contracts-curated.test.ts +42 -24
- package/src/lib/contracts.test.ts +143 -2
- package/src/lib/contracts.ts +346 -14
- package/src/ui/button-group.tsx +1 -1
- package/src/ui/carousel.tsx +1 -1
- package/src/ui/dialog.tsx +1 -1
- package/src/ui/field.tsx +2 -2
- package/src/ui/input-group.tsx +3 -3
- package/src/ui/pagination.tsx +1 -1
- package/src/ui/sidebar.tsx +7 -7
- package/src/ui/toggle-group.tsx +1 -1
- package/tsconfig.build.json +12 -0
- package/tsup.config.ts +11 -7
- package/.turbo/turbo-build.log +0 -24
- package/.turbo/turbo-test.log +0 -47
- package/.turbo/turbo-type-check.log +0 -0
- package/dist/.tsbuildinfo +0 -1
- package/dist/contracts.d.mts +0 -1732
- package/dist/contracts.d.ts +0 -1732
- package/dist/contracts.js +0 -423
- package/dist/contracts.js.map +0 -1
- package/dist/contracts.mjs +0 -365
- package/dist/contracts.mjs.map +0 -1
- package/dist/index.d.mts +0 -3068
- package/dist/index.d.ts +0 -3068
- package/dist/index.js +0 -17834
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -17740
- package/dist/index.mjs.map +0 -1
- package/src/blocks/e-commerce/product-categories/avatar-group.tsx +0 -86
- package/src/blocks/e-commerce/product-categories/product-category-1.tsx +0 -126
- package/src/blocks/e-commerce/product-categories/product-category-2.test.tsx +0 -51
- package/src/blocks/e-commerce/product-categories/product-category-2.tsx +0 -120
- package/src/blocks/e-commerce/product-categories/product-category-4.tsx +0 -129
- package/src/blocks/e-commerce/product-categories/product-category-5.tsx +0 -218
- package/src/blocks/e-commerce/product-list/product-card-1.test.tsx +0 -88
- package/src/blocks/e-commerce/product-list/product-card-1.tsx +0 -192
- package/src/blocks/e-commerce/product-list/product-card-2.tsx +0 -71
- package/src/blocks/e-commerce/product-list/product-card-3-reaction-toggle.tsx +0 -166
- package/src/blocks/e-commerce/product-list/product-card-3.tsx +0 -215
- package/src/blocks/e-commerce/product-list/product-card-5-checkbox-check.tsx +0 -98
- package/src/blocks/e-commerce/product-list/product-card-5-reaction-toggle.tsx +0 -171
- package/src/blocks/e-commerce/product-list/product-card-5.tsx +0 -367
- package/src/blocks/e-commerce/product-overview/product-overview-1.test.tsx +0 -182
- package/src/blocks/e-commerce/product-overview/product-overview-1.tsx +0 -370
- package/src/blocks/e-commerce/product-overview/product-overview-2.tsx +0 -272
- package/src/blocks/e-commerce/product-overview/product-overview-5-gallery.tsx +0 -59
- package/src/blocks/e-commerce/product-overview/product-overview-5.tsx +0 -274
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-1-spinning-counter.tsx +0 -142
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-1.tsx +0 -291
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-item-row.tsx +0 -110
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-recommendations.tsx +0 -51
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-spinning-counter.tsx +0 -146
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-2.tsx +0 -295
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-3-spinning-counter.tsx +0 -142
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-3.tsx +0 -342
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-4-spinning-counter.tsx +0 -146
- package/src/blocks/e-commerce/shopping-carts/shopping-cart-4.test.tsx +0 -229
- package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.test.tsx +0 -72
- package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.tsx +0 -263
- package/src/blocks/e-commerce/storefront-hero/storefront-hero-2.tsx +0 -283
- package/src/blocks/e-commerce/storefront-hero/storefront-hero-5.tsx +0 -318
- package/src/blocks/e-commerce/storefront-hero/storefront-hero-6.tsx +0 -205
- package/src/blocks/marketing/features/feature-1.tsx +0 -97
- package/src/blocks/marketing/features/feature-2.tsx +0 -82
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/ui/badge.tsx","../src/ui/button.tsx","../src/ui/avatar.tsx","../src/ui/card.tsx","../src/blocks/marketing/navbars/navbar-1.tsx","../src/ui/separator.tsx","../src/ui/sheet.tsx","../src/blocks/marketing/navbars/navbar-2.tsx","../src/ui/accordion.tsx","../src/ui/navigation-menu.tsx","../src/blocks/marketing/navbars/navbar-3.tsx","../src/blocks/marketing/navbars/navbar-4.tsx","../src/blocks/marketing/navbars/navbar-4-account-menu.tsx","../src/ui/dropdown-menu.tsx","../src/blocks/marketing/navbars/navbar-4-cart-sheet.tsx","../src/ui/empty.tsx","../src/lib/money.ts","../src/blocks/marketing/navbars/navbar-4-search-bar.tsx","../src/ui/input-group.tsx","../src/ui/input.tsx","../src/ui/textarea.tsx","../src/blocks/e-commerce/navigation/mega-menu.tsx","../src/lib/types/menu.ts","../src/blocks/e-commerce/navigation/category-icon.tsx","../src/blocks/e-commerce/navigation/mobile-category-drawer.tsx","../src/blocks/marketing/banners/banner-1.tsx","../src/blocks/marketing/banners/avatar-group.tsx","../src/blocks/marketing/hero-sections/avatar-group.tsx","../src/blocks/marketing/hero-sections/hero-section-1.tsx","../src/blocks/marketing/cta/cta-section-1.tsx","../src/blocks/marketing/features/feature-1.tsx","../src/blocks/marketing/features/feature-2.tsx","../src/blocks/marketing/testimonials/testimonial-1.tsx","../src/ui/carousel.tsx","../src/blocks/marketing/testimonials/testimonial-2.tsx","../src/blocks/marketing/faq/faq-block-1.tsx","../src/blocks/marketing/pricing/pricing-section-1.tsx","../src/ui/progress.tsx","../src/blocks/marketing/statistics/statistic-1.tsx","../src/blocks/marketing/logo-clouds/logo-cloud-1.tsx","../src/ui/skeleton.tsx","../src/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.tsx","../src/blocks/marketing/footers/footer-section-1.tsx","../src/blocks/marketing/footers/footer-section-3.tsx","../src/blocks/marketing/footers/footer-section-4.tsx","../src/blocks/e-commerce/product-list/product-card-1.tsx","../src/blocks/e-commerce/product-list/product-card-2.tsx","../src/blocks/e-commerce/product-list/product-card-3.tsx","../src/blocks/e-commerce/product-list/product-card-3-reaction-toggle.tsx","../src/blocks/e-commerce/product-list/product-card-5.tsx","../src/blocks/e-commerce/product-list/product-card-5-checkbox-check.tsx","../src/ui/table.tsx","../src/ui/select.tsx","../src/blocks/e-commerce/product-list/product-card-5-reaction-toggle.tsx","../src/blocks/e-commerce/product-list/product-showcase-1.tsx","../src/blocks/e-commerce/product-overview/product-overview-1.tsx","../src/lib/contracts.ts","../src/lib/cart.ts","../src/blocks/shared/reaction-toggle.tsx","../src/blocks/e-commerce/product-overview/product-overview-2.tsx","../src/blocks/e-commerce/product-overview/product-overview-5.tsx","../src/blocks/e-commerce/product-overview/product-overview-5-gallery.tsx","../src/blocks/e-commerce/product-overview/product-overview-5-lightbox-tab.tsx","../src/ui/dialog.tsx","../src/blocks/e-commerce/product-overview/product-overview-5-reviews-tab.tsx","../src/blocks/e-commerce/product-overview/product-overview-5-tabs.tsx","../src/blocks/e-commerce/product-overview/product-quick-view.tsx","../src/blocks/e-commerce/product-overview/product-quick-view-card.tsx","../src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx","../src/ui/button-group.tsx","../src/ui/toggle-group.tsx","../src/ui/toggle.tsx","../src/blocks/e-commerce/reviews/review-rating-1.tsx","../src/ui/pagination.tsx","../src/blocks/e-commerce/reviews/review-rating-1-review-form.tsx","../src/ui/label.tsx","../src/blocks/e-commerce/reviews/review-rating-2.tsx","../src/blocks/e-commerce/product-categories/product-category-1.tsx","../src/blocks/e-commerce/product-categories/product-category-2.tsx","../src/blocks/e-commerce/product-categories/product-category-4.tsx","../src/blocks/e-commerce/product-categories/avatar-group.tsx","../src/blocks/e-commerce/product-categories/product-category-5.tsx","../src/blocks/e-commerce/navigation/breadcrumb.tsx","../src/ui/breadcrumb.tsx","../src/blocks/e-commerce/navigation/skip-to-content.tsx","../src/blocks/e-commerce/navigation/back-to-top.tsx","../src/blocks/e-commerce/navigation/mobile-bottom-nav.tsx","../src/blocks/e-commerce/category-filters/category-filter-1.tsx","../src/blocks/e-commerce/category-filters/category-filter-2.tsx","../src/blocks/e-commerce/category-filters/category-filter-2-filter-panel.tsx","../src/blocks/e-commerce/checkout-forms/checkbox-check.tsx","../src/blocks/e-commerce/category-filters/category-filter-4.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-chip-rail.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-drawer.tsx","../src/ui/drawer.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-fields.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-sidebar.tsx","../src/ui/radio-group.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-sort-sheet.tsx","../src/blocks/e-commerce/category-filters/category-filter-4-state.ts","../src/blocks/e-commerce/shopping-carts/shopping-cart-1.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-1-spinning-counter.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-2.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-2-item-row.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-2-recommendations.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-2-spinning-counter.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-4.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-3.tsx","../src/blocks/e-commerce/shopping-carts/shopping-cart-3-spinning-counter.tsx","../src/blocks/e-commerce/store-containers/store-container-1.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1.tsx","../src/ui/field.tsx","../src/blocks/e-commerce/checkout-forms/checkout-field-feedback.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-contact-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-country-field.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-shipping-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-payment-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-order-summary.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-1-progress.tsx","../src/blocks/e-commerce/checkout-forms/card-formatting.ts","../src/blocks/e-commerce/checkout-forms/checkout-form-2.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-2-order-summary.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-2-payment-card.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-2-shipping-card.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-information-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-order-summary.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-payment-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-progress.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-review-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-form-3-shipping-step.tsx","../src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx","../src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx","../src/ui/tabs.tsx","../src/blocks/e-commerce/order-history/order-history-1.tsx","../src/blocks/e-commerce/order-history/order-history-2.tsx","../src/blocks/e-commerce/storefront-hero/storefront-hero-1.tsx","../src/blocks/e-commerce/storefront-hero/storefront-hero-2.tsx","../src/blocks/e-commerce/storefront-hero/storefront-hero-5.tsx","../src/blocks/e-commerce/storefront-hero/storefront-hero-6.tsx","../src/blocks/application/app-shells/app-shell-1.tsx","../src/ui/sidebar.tsx","../src/hooks/use-mobile.ts","../src/ui/tooltip.tsx","../src/blocks/application/app-shells/app-shell-1-sidebar.tsx","../src/blocks/application/login-forms/login-page-1.tsx","../src/blocks/application/login-forms/login-page-2.tsx","../src/blocks/application/signup-forms/signup-page-1.tsx","../src/blocks/application/password-recovery/forgot-password-page-1.tsx","../src/ui/input-otp.tsx","../src/blocks/application/password-recovery/forgot-password-page-1-brand-mark.tsx","../src/blocks/application/verification/verify-1.tsx","../src/blocks/application/verification/verify-confetti.tsx"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Merge Tailwind CSS class names safely.\n * Deduplicates conflicting utilities (e.g. `p-4` vs `p-2` → keeps last).\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Slot } from \"radix-ui\"\n\nconst badgeVariants = cva(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90\",\n outline:\n \"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n ghost: \"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 [a&]:hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Slot } from \"radix-ui\"\n\nconst buttonVariants = cva(\n \"inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarBadge,\n AvatarGroup,\n AvatarGroupCount,\n}\n","import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"flex flex-col gap-6 rounded-xl border bg-card py-6 text-card-foreground shadow-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { motion, useReducedMotion } from 'motion/react'\nimport { Menu, ShoppingCart } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '../../../ui/sheet'\nimport { cn } from '../../../lib/utils'\nimport type { CTA } from '../../../lib/types'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface Navbar1Props {\n navLinks: NavLink[]\n logoText: string\n logoHref?: string\n currentPath?: string\n signIn?: CTA\n cta?: CTA\n /** Number of items in the cart. When provided, a cart button with badge is shown. */\n cartCount?: number\n /** Fired when the user opens the cart. */\n onOpenCart?: () => void\n}\n\nfunction Logo({ text, href }: { text: string; href?: string }) {\n const className =\n 'focus-visible:ring-ring flex items-center gap-2 rounded-sm focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none'\n\n const content = (\n <>\n <svg viewBox='0 0 32 32' aria-hidden='true' className='text-primary size-7' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n </svg>\n <span className='text-base font-semibold tracking-tight'>{text}</span>\n </>\n )\n\n if (!href) {\n return <span className={className}>{content}</span>\n }\n\n return (\n <a href={href} className={className}>\n {content}\n </a>\n )\n}\n\nfunction CartButton({\n count,\n onClick,\n label,\n}: {\n count: number\n onClick?: () => void\n label: string\n}) {\n const reduceMotion = useReducedMotion()\n\n return (\n <Button\n variant='ghost'\n size='icon'\n aria-label={`${label} (${count} artículos)`}\n className='relative cursor-pointer'\n onClick={onClick}\n >\n <ShoppingCart />\n {count > 0 && (\n <motion.span\n key={count}\n initial={reduceMotion ? false : { scale: 0.4, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 420, damping: 22 }}\n className='bg-primary text-primary-foreground absolute -top-1 -right-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-semibold'\n >\n {count}\n </motion.span>\n )}\n </Button>\n )\n}\n\nexport function Navbar1({\n navLinks,\n logoText,\n logoHref,\n currentPath,\n signIn,\n cta,\n cartCount,\n onOpenCart,\n}: Navbar1Props) {\n const [open, setOpen] = useState(false)\n\n return (\n <header className='border-border bg-background w-full border-b'>\n <div className='mx-auto flex h-16 w-full max-w-7xl items-center justify-between gap-4 px-4 sm:px-6 lg:px-8'>\n <Logo text={logoText} href={logoHref} />\n\n <nav aria-label='Main' className='hidden lg:block'>\n <ul className='flex items-center gap-1'>\n {navLinks.map(link => {\n const isActive = link.href !== undefined && link.href === currentPath\n const className = cn(\n 'hover:text-foreground focus-visible:ring-ring rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )\n\n return (\n <li key={link.label}>\n {link.href ? (\n <a href={link.href} aria-current={isActive ? 'page' : undefined} className={className}>\n {link.label}\n </a>\n ) : (\n <span className={className}>{link.label}</span>\n )}\n </li>\n )\n })}\n </ul>\n </nav>\n\n <div className='hidden items-center gap-2 lg:flex'>\n {signIn &&\n (signIn.href ? (\n <Button variant='ghost' size='sm' asChild>\n <a href={signIn.href}>{signIn.label}</a>\n </Button>\n ) : (\n <Button variant='ghost' size='sm'>\n {signIn.label}\n </Button>\n ))}\n {cta &&\n (cta.href ? (\n <Button size='sm' asChild>\n <a href={cta.href}>{cta.label}</a>\n </Button>\n ) : (\n <Button size='sm'>{cta.label}</Button>\n ))}\n {cartCount !== undefined && onOpenCart && (\n <CartButton count={cartCount} onClick={onOpenCart} label='Carrito' />\n )}\n </div>\n\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant='ghost' size='icon' aria-label='Open menu' className='lg:hidden'>\n <Menu />\n </Button>\n </SheetTrigger>\n <SheetContent side='right' className='w-full max-w-xs p-0'>\n <SheetHeader className='border-border border-b'>\n <SheetTitle className='text-left text-base'>Menu</SheetTitle>\n </SheetHeader>\n\n <nav aria-label='Mobile' className='flex flex-col px-2 py-2'>\n {navLinks.map(link => {\n const isActive = link.href !== undefined && link.href === currentPath\n const className = cn(\n 'hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring rounded-md px-3 py-3 text-base font-medium transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )\n\n return (\n <SheetClose key={link.label} asChild>\n {link.href ? (\n <a href={link.href} aria-current={isActive ? 'page' : undefined} className={className}>\n {link.label}\n </a>\n ) : (\n <button type='button' className={className}>\n {link.label}\n </button>\n )}\n </SheetClose>\n )\n })}\n </nav>\n\n <div className='mt-auto flex flex-col gap-4 p-4'>\n <Separator />\n <div className='flex flex-col gap-2'>\n {signIn &&\n (signIn.href ? (\n <SheetClose asChild>\n <Button variant='outline' className='w-full' asChild>\n <a href={signIn.href}>{signIn.label}</a>\n </Button>\n </SheetClose>\n ) : (\n <SheetClose asChild>\n <Button variant='outline' className='w-full'>\n {signIn.label}\n </Button>\n </SheetClose>\n ))}\n {cta &&\n (cta.href ? (\n <SheetClose asChild>\n <Button className='w-full' asChild>\n <a href={cta.href}>{cta.label}</a>\n </Button>\n </SheetClose>\n ) : (\n <SheetClose asChild>\n <Button className='w-full'>{cta.label}</Button>\n </SheetClose>\n ))}\n {cartCount !== undefined && onOpenCart && (\n <SheetClose asChild>\n <Button variant='outline' className='w-full' onClick={onOpenCart}>\n <ShoppingCart />\n Carrito\n {cartCount > 0 ? ` (${cartCount})` : ''}\n </Button>\n </SheetClose>\n )}\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </div>\n </header>\n )\n}\n\nexport default Navbar1","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500\",\n side === \"right\" &&\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n side === \"left\" &&\n \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n side === \"top\" &&\n \"inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n side === \"bottom\" &&\n \"inset-x-0 bottom-0 h-auto border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { ArrowRight, Menu, type LucideIcon } from 'lucide-react'\n\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../../../ui/accordion'\nimport { Button } from '../../../ui/button'\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from '../../../ui/navigation-menu'\nimport { Separator } from '../../../ui/separator'\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '../../../ui/sheet'\nimport { cn } from '../../../lib/utils'\nimport type { CTA } from '../../../lib/types'\n\nexport interface MenuItem {\n /** Icon rendered inside the item tile. */\n icon: LucideIcon\n label: string\n description: string\n href: string\n}\n\nexport interface MenuGroup {\n trigger: string\n /** Two columns at `lg` when `items.length > 4`, single column otherwise. */\n items: MenuItem[]\n}\n\nexport interface FeaturedLink {\n eyebrow: string\n title: string\n description: string\n href: string\n linkLabel: string\n /** Featured image URL. */\n image: string\n imageAlt: string\n}\n\nexport interface NavLink {\n label: string\n href: string\n}\n\nexport interface Navbar2Props {\n /** Grouped menu entries rendered as flyout panels on desktop and accordions on mobile. */\n menuGroups: MenuGroup[]\n logoText: string\n logoHref?: string\n /** Simple top-level links rendered after the menu groups. */\n plainLinks?: NavLink[]\n /** Optional sign-in entry. Rendered as a link when `href` is set, otherwise as a button. */\n signIn?: CTA\n /** Optional primary call to action. Rendered as a link when `href` is set, otherwise as a button. */\n cta?: CTA\n /** Promo card shown on the right of wide flyout panels (groups with more than four items). */\n featured?: FeaturedLink\n}\n\nfunction Logo({ text, href }: { text: string; href?: string }) {\n const className =\n 'focus-visible:ring-ring flex items-center gap-2 rounded-sm focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none'\n\n const content = (\n <>\n <svg viewBox='0 0 32 32' aria-hidden='true' className='text-primary size-7' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n </svg>\n <span className='text-base font-semibold tracking-tight'>{text}</span>\n </>\n )\n\n if (!href) {\n return <span className={className}>{content}</span>\n }\n\n return (\n <a href={href} className={className}>\n {content}\n </a>\n )\n}\n\nfunction FeaturedCard({ featured }: { featured: FeaturedLink }) {\n return (\n <a\n href={featured.href}\n className='border-border focus-visible:ring-ring group relative flex h-full min-h-56 flex-col justify-end overflow-hidden rounded-md border focus-visible:ring-2 focus-visible:outline-none'\n >\n <img\n src={featured.image || undefined}\n alt={featured.imageAlt}\n className='absolute inset-0 size-full object-cover transition-transform duration-500 ease-out group-hover:scale-105'\n />\n {/* Soft top sheen + deep bottom scrim so copy stays readable on the product shot. */}\n <div\n aria-hidden='true'\n className='absolute inset-0 bg-gradient-to-t from-black/90 via-black/55 to-black/20'\n />\n <div\n aria-hidden='true'\n className='absolute inset-0 bg-gradient-to-br from-white/15 via-transparent to-transparent opacity-80'\n />\n <div className='relative z-10 flex flex-col p-4'>\n <p className='text-xs font-semibold tracking-wide text-white/70 uppercase'>\n {featured.eyebrow}\n </p>\n <p className='mt-1 text-sm font-medium text-white'>{featured.title}</p>\n <p className='mt-1 text-sm text-white/75'>{featured.description}</p>\n <span className='mt-3 inline-flex items-center gap-1 text-sm font-medium text-white'>\n {featured.linkLabel}\n <ArrowRight className='size-3.5 transition-transform duration-200 ease-out group-hover:translate-x-0.5' />\n </span>\n </div>\n </a>\n )\n}\n\nexport function Navbar2({\n menuGroups,\n logoText,\n logoHref,\n plainLinks = [],\n signIn,\n cta,\n featured,\n}: Navbar2Props) {\n const [open, setOpen] = useState(false)\n\n return (\n <header className='border-border bg-background w-full border-b'>\n <div className='mx-auto flex h-16 w-full max-w-7xl items-center justify-between gap-4 px-4 sm:px-6 lg:px-8'>\n <div className='flex items-center gap-6'>\n <Logo text={logoText} href={logoHref} />\n\n <NavigationMenu className='hidden lg:flex' aria-label='Main'>\n <NavigationMenuList>\n {menuGroups.map(group => {\n const isWide = group.items.length > 4\n\n return (\n <NavigationMenuItem key={group.trigger}>\n <NavigationMenuTrigger>{group.trigger}</NavigationMenuTrigger>\n <NavigationMenuContent>\n <div\n className={cn(\n isWide ? 'grid w-[760px] grid-cols-[1fr_248px] gap-3 p-2' : 'w-[360px] p-2'\n )}\n >\n <ul className={isWide ? 'grid grid-cols-2 gap-1' : 'grid gap-1'}>\n {group.items.map(item => (\n <li key={item.href}>\n <NavigationMenuLink href={item.href} className='items-start gap-3 p-3'>\n <span\n aria-hidden='true'\n className='bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-md'\n >\n <item.icon className='size-4' />\n </span>\n <span className='flex flex-col gap-0.5'>\n <span className='text-sm font-medium'>{item.label}</span>\n <span className='text-muted-foreground line-clamp-2 text-sm leading-5'>\n {item.description}\n </span>\n </span>\n </NavigationMenuLink>\n </li>\n ))}\n </ul>\n {isWide && featured ? <FeaturedCard featured={featured} /> : null}\n </div>\n </NavigationMenuContent>\n </NavigationMenuItem>\n )\n })}\n\n {plainLinks.map(link => (\n <NavigationMenuItem key={link.href}>\n <NavigationMenuLink href={link.href} className={navigationMenuTriggerStyle()}>\n {link.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n ))}\n </NavigationMenuList>\n </NavigationMenu>\n </div>\n\n <div className='hidden items-center gap-2 lg:flex'>\n {signIn &&\n (signIn.href ? (\n <Button variant='ghost' size='sm' asChild>\n <a href={signIn.href}>{signIn.label}</a>\n </Button>\n ) : (\n <Button variant='ghost' size='sm'>\n {signIn.label}\n </Button>\n ))}\n {cta &&\n (cta.href ? (\n <Button size='sm' asChild>\n <a href={cta.href}>{cta.label}</a>\n </Button>\n ) : (\n <Button size='sm'>{cta.label}</Button>\n ))}\n </div>\n\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant='ghost' size='icon' aria-label='Open menu' className='lg:hidden'>\n <Menu />\n </Button>\n </SheetTrigger>\n <SheetContent side='right' className='w-full max-w-sm gap-0 overflow-y-auto p-0'>\n <SheetHeader className='border-border border-b'>\n <SheetTitle className='text-left text-base'>Menu</SheetTitle>\n </SheetHeader>\n\n {/* Every flyout destination stays reachable on mobile — groups become accordions\n rather than being dropped. */}\n <nav aria-label='Mobile' className='px-2 py-2'>\n <Accordion type='multiple'>\n {menuGroups.map(group => (\n <AccordionItem key={group.trigger} value={group.trigger} className='border-none'>\n <AccordionTrigger className='px-3 py-3 text-base font-medium hover:no-underline'>\n {group.trigger}\n </AccordionTrigger>\n <AccordionContent className='pb-1'>\n <ul className='flex flex-col'>\n {group.items.map(item => (\n <li key={item.href}>\n <SheetClose asChild>\n <a\n href={item.href}\n className='hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring flex items-start gap-3 rounded-md px-3 py-3 transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none'\n >\n <span\n aria-hidden='true'\n className='bg-muted text-foreground flex size-8 shrink-0 items-center justify-center rounded-md'\n >\n <item.icon className='size-4' />\n </span>\n <span className='flex flex-col gap-0.5'>\n <span className='text-sm font-medium'>{item.label}</span>\n <span className='text-muted-foreground text-sm'>\n {item.description}\n </span>\n </span>\n </a>\n </SheetClose>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n\n {plainLinks.length > 0 && (\n <div className='mt-1 flex flex-col'>\n {plainLinks.map(link => (\n <SheetClose key={link.href} asChild>\n <a\n href={link.href}\n className='text-muted-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring rounded-md px-3 py-3 text-base font-medium transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none'\n >\n {link.label}\n </a>\n </SheetClose>\n ))}\n </div>\n )}\n </nav>\n\n <div className='mt-auto flex flex-col gap-4 p-4'>\n <Separator />\n <div className='flex flex-col gap-2'>\n {signIn &&\n (signIn.href ? (\n <SheetClose asChild>\n <Button variant='outline' className='w-full' asChild>\n <a href={signIn.href}>{signIn.label}</a>\n </Button>\n </SheetClose>\n ) : (\n <SheetClose asChild>\n <Button variant='outline' className='w-full'>\n {signIn.label}\n </Button>\n </SheetClose>\n ))}\n {cta &&\n (cta.href ? (\n <SheetClose asChild>\n <Button className='w-full' asChild>\n <a href={cta.href}>{cta.label}</a>\n </Button>\n </SheetClose>\n ) : (\n <SheetClose asChild>\n <Button className='w-full'>{cta.label}</Button>\n </SheetClose>\n ))}\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </div>\n </header>\n )\n}\n\nexport default Navbar2","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon } from \"lucide-react\"\nimport { NavigationMenu as NavigationMenuPrimitive } from \"radix-ui\"\n\nfunction NavigationMenu({\n className,\n children,\n viewport = true,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {\n viewport?: boolean\n}) {\n return (\n <NavigationMenuPrimitive.Root\n data-slot=\"navigation-menu\"\n data-viewport={viewport}\n className={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n {viewport && <NavigationMenuViewport />}\n </NavigationMenuPrimitive.Root>\n )\n}\n\nfunction NavigationMenuList({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {\n return (\n <NavigationMenuPrimitive.List\n data-slot=\"navigation-menu-list\"\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-1\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuItem({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {\n return (\n <NavigationMenuPrimitive.Item\n data-slot=\"navigation-menu-item\"\n className={cn(\"relative\", className)}\n {...props}\n />\n )\n}\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-[color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent/50 data-[state=open]:text-accent-foreground data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent\"\n)\n\nfunction NavigationMenuTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {\n return (\n <NavigationMenuPrimitive.Trigger\n data-slot=\"navigation-menu-trigger\"\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\" \"}\n <ChevronDownIcon\n className=\"relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n )\n}\n\nfunction NavigationMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {\n return (\n <NavigationMenuPrimitive.Content\n data-slot=\"navigation-menu-content\"\n className={cn(\n \"top-0 left-0 w-full p-2 pr-2.5 data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 data-[motion^=from-]:animate-in data-[motion^=from-]:fade-in data-[motion^=to-]:animate-out data-[motion^=to-]:fade-out md:absolute md:w-auto\",\n \"group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuViewport({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {\n return (\n <div\n className={cn(\n \"absolute top-full left-0 isolate z-50 flex justify-center\"\n )}\n >\n <NavigationMenuPrimitive.Viewport\n data-slot=\"navigation-menu-viewport\"\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction NavigationMenuLink({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {\n return (\n <NavigationMenuPrimitive.Link\n data-slot=\"navigation-menu-link\"\n className={cn(\n \"flex flex-col gap-1 rounded-sm p-2 text-sm transition-all outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 data-[active=true]:bg-accent/50 data-[active=true]:text-accent-foreground data-[active=true]:hover:bg-accent data-[active=true]:focus:bg-accent [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction NavigationMenuIndicator({\n className,\n ...props\n}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {\n return (\n <NavigationMenuPrimitive.Indicator\n data-slot=\"navigation-menu-indicator\"\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:animate-in data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n </NavigationMenuPrimitive.Indicator>\n )\n}\n\nexport {\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n navigationMenuTriggerStyle,\n}\n","'use client'\n\nimport { useEffect, useRef, useState, type ComponentProps, type Ref } from 'react'\nimport { Menu } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '../../../ui/sheet'\nimport { cn } from '../../../lib/utils'\nimport type { CTA } from '../../../lib/types'\n\nexport interface NavLink {\n label: string\n href?: string\n}\n\nexport interface Navbar3Props {\n navLinks: NavLink[]\n /** Brand text shown next to the logo mark. */\n logoText: string\n logoHref?: string\n /** Current path used to highlight the active nav link. */\n currentPath?: string\n /** Sign-in action. Rendered as a link when `href` is set, otherwise as a button. */\n signIn?: CTA\n /** Primary call-to-action. Rendered as a link when `href` is set, otherwise as a button. */\n cta?: CTA\n /**\n * When `true` (default), the header condenses into a floating rounded pill once scrolled.\n * Set to `false` for a plain solid bar instead of the condensing pill.\n */\n floatingPill?: boolean\n /** Fired when the sign-in button (no `href`) is clicked. */\n onSignIn?: () => void\n /** Fired when the CTA button (no `href`) is clicked. */\n onCtaClick?: () => void\n}\n\n/**\n * Composition contract\n * --------------------\n * The header is `fixed`, so the first section of the page must clear it with `pt-16`,\n * and `html { scroll-padding-top: 4rem }` keeps in-page anchors from landing underneath it.\n *\n * Set `floatingPill` to false for a plain solid bar on scroll instead of the condensing pill.\n */\nfunction Logo({ text, href }: { text: string; href?: string }) {\n const className =\n 'focus-visible:ring-ring flex items-center gap-2 rounded-sm focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none'\n\n const content = (\n <>\n <svg viewBox='0 0 32 32' aria-hidden='true' className='text-primary size-7' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n </svg>\n <span className='text-base font-semibold tracking-tight'>{text}</span>\n </>\n )\n\n if (!href) {\n return <span className={className}>{content}</span>\n }\n\n return (\n <a href={href} className={className}>\n {content}\n </a>\n )\n}\n\nfunction ActionButton({\n cta,\n onClick,\n variant,\n className,\n rounded,\n ref,\n}: {\n cta: CTA\n onClick?: () => void\n variant?: ComponentProps<typeof Button>['variant']\n className?: string\n rounded?: boolean\n ref?: Ref<HTMLButtonElement>\n}) {\n const classes = cn(rounded && 'rounded-full', className)\n\n if (cta.href && !onClick) {\n return (\n <Button variant={variant} size='sm' className={classes} asChild ref={ref}>\n <a href={cta.href}>{cta.label}</a>\n </Button>\n )\n }\n\n return (\n <Button variant={variant} size='sm' className={classes} onClick={onClick} ref={ref}>\n {cta.label}\n </Button>\n )\n}\n\nexport function Navbar3({\n navLinks,\n logoText,\n logoHref,\n currentPath,\n signIn,\n cta,\n floatingPill = true,\n onSignIn,\n onCtaClick,\n}: Navbar3Props) {\n const sentinelRef = useRef<HTMLDivElement>(null)\n const [scrolled, setScrolled] = useState(false)\n const [open, setOpen] = useState(false)\n\n /**\n * Scroll detection:\n * - Inside the store preview the scroller is an overflow ancestor (not the viewport).\n * IntersectionObserver + an out-of-flow sentinel is unreliable there, so use scrollTop.\n * - On a normal page, an IntersectionObserver on the 8px sentinel gives hysteresis without\n * flickering at a hard `scrollY > 8` threshold.\n */\n useEffect(() => {\n const sentinel = sentinelRef.current\n if (!sentinel) {\n return\n }\n\n let scrollParent: HTMLElement | null = null\n let ancestor: HTMLElement | null = sentinel.parentElement\n while (ancestor) {\n const { overflowY } = getComputedStyle(ancestor)\n if (\n (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') &&\n ancestor.scrollHeight > ancestor.clientHeight + 1\n ) {\n scrollParent = ancestor\n break\n }\n ancestor = ancestor.parentElement\n }\n\n if (scrollParent) {\n const scroller = scrollParent\n const update = () => setScrolled(scroller.scrollTop > 8)\n update()\n scroller.addEventListener('scroll', update, { passive: true })\n return () => scroller.removeEventListener('scroll', update)\n }\n\n const observer = new IntersectionObserver(([entry]) => setScrolled(!entry.isIntersecting), {\n threshold: 0,\n })\n\n observer.observe(sentinel)\n return () => observer.disconnect()\n }, [])\n\n return (\n <>\n {/*\n Absolute + out of flow: keeps an 8px hysteresis target for the observer\n without painting a blank strip under the transparent (unscrolled) header.\n */}\n <div\n ref={sentinelRef}\n aria-hidden='true'\n className='pointer-events-none absolute inset-x-0 top-0 h-2'\n />\n\n <header className='fixed inset-x-0 top-0 z-50'>\n <div\n className={cn(\n 'mx-auto flex h-14 items-center justify-between gap-4 transition-all duration-300 ease-out motion-reduce:transition-none',\n scrolled\n ? floatingPill\n ? 'border-border/60 bg-background/80 mt-3 max-w-5xl rounded-full border px-4 shadow-sm backdrop-blur-md sm:px-5'\n : 'border-border/60 bg-background/90 max-w-full border-b px-4 backdrop-blur-md sm:px-6 lg:px-8'\n : 'max-w-7xl border border-transparent px-4 sm:px-6 lg:px-8'\n )}\n >\n <Logo text={logoText} href={logoHref} />\n\n <nav aria-label='Main' className='hidden lg:block'>\n <ul className='flex items-center gap-1'>\n {navLinks.map(link => {\n const isActive = link.href !== undefined && link.href === currentPath\n const className = cn(\n 'hover:text-foreground focus-visible:ring-ring rounded-full px-3 py-2 text-sm font-medium transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )\n\n return (\n <li key={link.label}>\n {link.href ? (\n <a href={link.href} aria-current={isActive ? 'page' : undefined} className={className}>\n {link.label}\n </a>\n ) : (\n <span className={className}>{link.label}</span>\n )}\n </li>\n )\n })}\n </ul>\n </nav>\n\n <div className='hidden items-center gap-2 lg:flex'>\n {signIn && <ActionButton cta={signIn} onClick={onSignIn} variant='ghost' />}\n {cta && <ActionButton cta={cta} onClick={onCtaClick} rounded={floatingPill} />}\n </div>\n\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant='ghost' size='icon' aria-label='Open menu' className='lg:hidden'>\n <Menu />\n </Button>\n </SheetTrigger>\n <SheetContent side='right' className='w-full max-w-xs p-0'>\n <SheetHeader className='border-border border-b'>\n <SheetTitle className='text-left text-base'>Menu</SheetTitle>\n </SheetHeader>\n\n <nav aria-label='Mobile' className='flex flex-col px-2 py-2'>\n {navLinks.map(link => {\n const isActive = link.href !== undefined && link.href === currentPath\n const className = cn(\n 'hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring rounded-md px-3 py-3 text-base font-medium transition-colors duration-150 ease-out focus-visible:ring-2 focus-visible:outline-none',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )\n\n return (\n <SheetClose key={link.label} asChild>\n {link.href ? (\n <a href={link.href} aria-current={isActive ? 'page' : undefined} className={className}>\n {link.label}\n </a>\n ) : (\n <button type='button' className={className}>\n {link.label}\n </button>\n )}\n </SheetClose>\n )\n })}\n </nav>\n\n <div className='mt-auto flex flex-col gap-4 p-4'>\n <Separator />\n <div className='flex flex-col gap-2'>\n {signIn && (\n <SheetClose asChild>\n <ActionButton cta={signIn} onClick={onSignIn} variant='outline' className='w-full' />\n </SheetClose>\n )}\n {cta && (\n <SheetClose asChild>\n <ActionButton cta={cta} onClick={onCtaClick} className='w-full' />\n </SheetClose>\n )}\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </div>\n </header>\n </>\n )\n}\n\nexport default Navbar3","'use client'\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react'\nimport { Menu, Search, ShoppingBag, UserRound, RotateCcw, X } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '../../../ui/sheet'\nimport { cn } from '../../../lib/utils'\n\nimport { Navbar4AccountMenu, type AccountMenuItem, type StoreUser } from './navbar-4-account-menu'\nimport { Navbar4CartSheet, type CartItem, type CartSheetState } from './navbar-4-cart-sheet'\nimport type { UtilityLink } from './navbar-4-mobile-nav'\nimport { Navbar4SearchBar } from './navbar-4-search-bar'\nimport { MegaMenu } from '../../e-commerce/navigation/mega-menu'\nimport { MobileCategoryDrawer } from '../../e-commerce/navigation/mobile-category-drawer'\nimport type { MenuItem } from '../../../lib/types/menu'\nimport type { Money } from '@thorprovider/types'\nimport type { StoreCategory } from '../../../lib/contracts'\n\nfunction toMenuItem(category: StoreCategory): MenuItem {\n return {\n id: category.href,\n label: category.label,\n href: category.href,\n children: category.children?.map(toMenuItem),\n }\n}\n\n/**\n * Drawer entries come from three sources (categories, utility links, account\n * link). Hosts may reuse the same href across sources (e.g. a placeholder\n * href), which would produce duplicate React keys if passed through as-is.\n * Dedupe by href so every rendered item gets a unique id.\n */\nfunction uniqueById<T extends { id: string }>(items: T[]): T[] {\n const seen = new Set<string>()\n return items.filter((item) => {\n if (seen.has(item.id)) return false\n seen.add(item.id)\n return true\n })\n}\n\nexport interface LogoAccent {\n /** Trailing segment of `logoText` to render with the accent styling. */\n text: string\n /** Consumer-supplied classes for the accent span (e.g. a brand color token). */\n className?: string\n}\n\nfunction Logo({ text, href, accent }: { text: string; href?: string; accent?: LogoAccent }) {\n const className =\n 'focus-visible:ring-ring flex items-center gap-2 rounded-sm focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none'\n\n const accentText = accent?.text ?? ''\n const hasAccent = accentText.length > 0 && text.endsWith(accentText)\n const baseText = hasAccent ? text.slice(0, text.length - accentText.length) : text\n\n const content = (\n <>\n <svg viewBox='0 0 32 32' aria-hidden='true' className='text-primary size-7' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' strokeWidth='1.5' strokeLinecap='round' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' strokeWidth='1.2' />\n </svg>\n <span className='text-base font-semibold tracking-tight'>\n {baseText}\n {hasAccent ? <span className={accent?.className}>{accentText}</span> : null}\n </span>\n </>\n )\n\n if (!href) {\n return <span className={className}>{content}</span>\n }\n\n return (\n <a href={href} className={className}>\n {content}\n </a>\n )\n}\n\ntype CartBadgeProps = {\n count: number\n}\n\n/**\n * Transitions.dev `notification-badge`: diagonal slide + spring pop when the\n * count appears or changes. Positioned outside the bag so it never covers the icon.\n */\nfunction CartBadge({ count }: CartBadgeProps) {\n const reduceMotion = useReducedMotion()\n\n return (\n <AnimatePresence>\n {count > 0 ? (\n <motion.span\n key='badge-shell'\n className='bg-foreground text-background pointer-events-none absolute -top-2.5 -end-3.5 flex size-[1.125rem] items-center justify-center overflow-hidden rounded-full text-[10px] font-medium tabular-nums shadow-sm ring-2 ring-background'\n initial={\n reduceMotion\n ? false\n : { scale: 0, x: -8.2, y: 12.4, opacity: 0, filter: 'blur(2px)' }\n }\n animate={{ scale: 1, x: 0, y: 0, opacity: 1, filter: 'blur(0px)' }}\n exit={\n reduceMotion\n ? { opacity: 0 }\n : {\n scale: 0,\n opacity: 0,\n filter: 'blur(2px)',\n transition: { duration: 0.18, ease: [0.4, 0, 0.2, 1] },\n }\n }\n transition={\n reduceMotion\n ? { duration: 0 }\n : { type: 'spring', stiffness: 520, damping: 18, mass: 0.6 }\n }\n style={{ willChange: 'transform, opacity, filter' }}\n >\n <AnimatePresence mode='popLayout' initial={false}>\n <motion.span\n key={count}\n className='block'\n initial={reduceMotion ? false : { y: 8, opacity: 0, filter: 'blur(2px)' }}\n animate={{ y: 0, opacity: 1, filter: 'blur(0px)' }}\n exit={reduceMotion ? undefined : { y: -8, opacity: 0, filter: 'blur(2px)' }}\n transition={{ duration: 0.22, ease: [0.22, 1, 0.36, 1] }}\n >\n {count > 99 ? '99+' : count}\n </motion.span>\n </AnimatePresence>\n </motion.span>\n ) : null}\n </AnimatePresence>\n )\n}\n\nexport interface Navbar4Props {\n storeCategories: StoreCategory[]\n /**\n * Optional note shown in the desktop utility strip. When omitted (or empty)\n * and there are no `utilityLinks`, the strip is not rendered at all, so a\n * block with no optional content paints no empty decorative chrome.\n */\n shippingNote?: string\n utilityLinks: UtilityLink[]\n logoText: string\n logoHref?: string\n /**\n * Optional accent for a trailing segment of `logoText` (e.g. the \"Cuba\" in\n * \"ElectroCuba\"). When omitted, or when `text` is not a trailing segment of\n * `logoText`, the wordmark renders unchanged.\n */\n logoAccent?: LogoAccent\n /** Account destination for anonymous shoppers on every viewport. */\n accountHref?: string\n /**\n * When `false`, no search control is rendered at all — neither the desktop\n * input, the mobile trigger, nor the mobile panel. Defaults to `true` so\n * legacy consumers keep the existing self-contained search. The generated\n * storefront passes `false` while no verified global search contract exists\n * (E2 task 5.4), so no global search is presented as working.\n */\n /**\n * The storefront's current route path. When it matches a destination the link\n * is marked as the current page (accessibly, beyond color alone).\n */\n currentPath?: string\n showSearch?: boolean\n searchQuery?: string\n onSearchChange?: (value: string) => void\n items?: CartItem[]\n /**\n * Quantity DELTA for a backend cart line-item id. The boundary converts the\n * delta into an absolute quantity against the authoritative current line\n * quantity before mutating the cart.\n */\n onQtyChange?: (id: string, delta: number) => void\n /** Remove the backend cart line-item id. */\n onRemove?: (id: string) => void\n /** Authoritative backend subtotal for the mini-cart. */\n subtotal?: Money\n /** Shown when an authoritative subtotal is supplied but absent/malformed. */\n subtotalUnavailableLabel?: string\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n user?: StoreUser\n accountMenuItems?: AccountMenuItem[]\n onHelp?: () => void\n onSignOut?: () => void\n accountPending?: boolean\n accountUnavailable?: boolean\n onAccountRetry?: () => void\n onCheckout?: () => void\n onViewCart?: () => void\n /**\n * Controlled visibility for the cart sheet. When provided, the sheet opens\n * and closes from this value and `onCartOpenChange` instead of internal\n * state, so a host can share one cart surface across the navbar trigger and\n * successful add-to-cart. Omit both to keep the legacy uncontrolled sheet.\n */\n cartOpen?: boolean\n /** Change handler paired with `cartOpen` for a controlled sheet. */\n onCartOpenChange?: (open: boolean) => void\n /**\n * Backend-authoritative cart rendering for the sheet. When `true`, line\n * amounts use each item's canonical `lineTotal` Money and never fall back to\n * numeric `price * qty`. Omit for the legacy numeric rendering.\n */\n canonicalCart?: boolean\n /** Cart read/mutation lifecycle for the sheet. */\n cartState?: CartSheetState\n /** Message shown when `cartState` is `error`. */\n cartErrorLabel?: string\n /** Recovery action label for the error state. */\n cartRetryLabel?: string\n /** Recovery action invoked from the error state. */\n onCartRetry?: () => void\n /** When `true`, the sheet's checkout action is suppressed (checkout not installed). */\n checkoutUnavailable?: boolean\n /** When `true`, the sheet's checkout action is disabled (cart not ready). */\n checkoutDisabled?: boolean\n /** When `true`, the sheet's review action is suppressed (cart view not installed). */\n viewCartUnavailable?: boolean\n /**\n * Consumer-supplied classes merged onto the outer `<header>` as the final\n * argument, so a semantic surface such as `bg-brand-nav\n * text-brand-nav-foreground` overrides the default `bg-background`. Purely\n * presentational: no layout, structure, or behavior changes.\n */\n className?: string\n}\n\nexport function Navbar4({\n storeCategories,\n shippingNote = '',\n utilityLinks,\n logoText,\n logoHref,\n logoAccent,\n accountHref,\n currentPath,\n showSearch = true,\n searchQuery: searchQueryProp,\n onSearchChange,\n items: itemsProp,\n onQtyChange: onQtyChangeProp,\n onRemove: onRemoveProp,\n subtotal,\n subtotalUnavailableLabel,\n formatMoney,\n user,\n accountMenuItems,\n onHelp,\n onSignOut,\n accountPending = false,\n accountUnavailable = false,\n onAccountRetry,\n onCheckout,\n onViewCart,\n cartOpen,\n onCartOpenChange,\n canonicalCart,\n cartState,\n cartErrorLabel,\n cartRetryLabel,\n onCartRetry,\n checkoutUnavailable,\n checkoutDisabled,\n viewCartUnavailable,\n className,\n}: Navbar4Props) {\n /**\n * Integration seam\n * ----------------\n * Pass cart + search from your storefront, or leave uncontrolled for a\n * self-contained demo. Controlled props win when provided.\n */\n const [internalItems, setInternalItems] = useState<CartItem[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [searchOpen, setSearchOpen] = useState(false)\n const [menuOpen, setMenuOpen] = useState(false)\n const searchTriggerRef = useRef<HTMLButtonElement>(null)\n\n const items = itemsProp ?? internalItems\n const searchQuery = searchQueryProp ?? internalSearch\n\n const setSearchQuery = (value: string) => {\n onSearchChange?.(value)\n if (searchQueryProp === undefined) {\n setInternalSearch(value)\n }\n }\n\n const changeQty =\n onQtyChangeProp ??\n ((id: string, delta: number) =>\n setInternalItems(current =>\n current.flatMap(item => {\n if (item.id !== id) {\n return item\n }\n\n const qty = item.qty + delta\n return qty <= 0 ? [] : [{ ...item, qty }]\n }),\n ))\n\n const removeItem =\n onRemoveProp ?? ((id: string) => setInternalItems(current => current.filter(item => item.id !== id)))\n\n const count = useMemo(() => items.reduce((total, item) => total + item.qty, 0), [items])\n\n useEffect(() => {\n if (!showSearch || !searchOpen) {\n return\n }\n\n document.getElementById('store-search-mobile')?.focus()\n }, [searchOpen, showSearch])\n\n const dismissSearch = () => {\n setSearchOpen(false)\n searchTriggerRef.current?.focus()\n }\n\n // When the consumer overrides the header surface via `className`, the nav\n // links inherit its text color and need an explicit hover foreground so\n // `hover:bg-muted` never paints white-on-light; otherwise they keep the\n // default foreground (and the default hover surface).\n const navLinkColor =\n className !== undefined ? 'text-inherit hover:text-foreground' : 'text-foreground'\n // The current page is marked beyond color: an accessible current state plus a\n // visible weight/underline, and nothing when no destination matches.\n const isCurrent = (href?: string) => href !== undefined && href === currentPath\n\n // The desktop utility strip is decorative chrome: it is painted only when it\n // has content (a non-empty note or at least one utility link), never empty.\n const hasUtilityContent = shippingNote.trim().length > 0 || utilityLinks.length > 0\n\n return (\n <header\n className={cn(\n 'border-border sticky top-0 z-40 w-full border-b backdrop-blur-md',\n className ?? 'bg-background/95 supports-backdrop-filter:bg-background/80',\n )}\n >\n {hasUtilityContent ? (\n <div className='bg-foreground text-background hidden lg:block'>\n <div className='mx-auto flex h-9 w-full max-w-7xl items-center justify-between px-4 text-xs tracking-wide sm:px-6 lg:px-8'>\n <p className='text-background/80'>{shippingNote}</p>\n <ul className='flex items-center gap-5'>\n {utilityLinks.map(link => (\n <li key={`${link.href}:${link.label}`}>\n <a\n href={link.href}\n className='text-background/80 hover:text-background transition-colors duration-150'\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </div>\n ) : null}\n\n <div className='mx-auto flex h-16 w-full max-w-7xl items-center gap-3 px-4 sm:px-6 lg:px-8'>\n <Button\n variant='ghost'\n size='icon'\n className='lg:hidden'\n aria-label='Open menu'\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(open => !open)}\n >\n <Menu />\n </Button>\n\n <MobileCategoryDrawer\n categories={uniqueById([\n ...storeCategories.map(toMenuItem),\n ...utilityLinks.map(link => ({ id: link.href, label: link.label, href: link.href })),\n ...(accountHref ? [{ id: accountHref, label: 'Account', href: accountHref }] : []),\n ])}\n collections={[]}\n open={menuOpen}\n onClose={() => setMenuOpen(false)}\n viewAllHref=''\n />\n\n <div className='flex-1 lg:flex-none'>\n <Logo text={logoText} href={logoHref} accent={logoAccent} />\n </div>\n\n <nav aria-label='Store' className='hidden flex-1 lg:block'>\n <ul className='flex items-center gap-0.5'>\n {storeCategories.map(category =>\n category.children && category.children.length > 0 ? (\n <li key={category.href} className='group relative'>\n <a\n href={category.href}\n aria-current={isCurrent(category.href) ? 'page' : undefined}\n className={cn(\n 'hover:bg-muted focus-visible:ring-ring rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none',\n category.emphasis ? 'text-destructive' : navLinkColor,\n isCurrent(category.href) && 'font-semibold underline underline-offset-4',\n )}\n >\n {category.label}\n </a>\n <div className='invisible absolute left-0 top-full z-50 pt-2 opacity-0 transition-opacity duration-150 group-hover:visible group-hover:opacity-100'>\n <MegaMenu\n categories={[toMenuItem(category)]}\n collections={[]}\n collectionsHref=''\n categoryColumnTitle={category.label}\n />\n </div>\n </li>\n ) : (\n <li key={category.href}>\n <a\n href={category.href}\n aria-current={isCurrent(category.href) ? 'page' : undefined}\n className={cn(\n 'hover:bg-muted focus-visible:ring-ring rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none',\n category.emphasis ? 'text-destructive' : navLinkColor,\n isCurrent(category.href) && 'font-semibold underline underline-offset-4',\n )}\n >\n {category.label}\n </a>\n </li>\n ),\n )}\n </ul>\n </nav>\n\n <div className='flex items-center gap-1.5'>\n {showSearch ? (\n <>\n <div className='hidden lg:block lg:w-64'>\n <Navbar4SearchBar\n id='store-search'\n value={searchQuery}\n onValueChange={setSearchQuery}\n />\n </div>\n\n <Button\n ref={searchTriggerRef}\n variant='ghost'\n size='icon'\n className='lg:hidden'\n aria-label='Search products'\n aria-expanded={searchOpen}\n onClick={() => setSearchOpen(open => !open)}\n >\n {searchOpen ? <X /> : <Search />}\n </Button>\n </>\n ) : null}\n\n {accountUnavailable ? (\n <Button\n variant='ghost'\n size='icon'\n className='size-11'\n disabled={accountPending || !onAccountRetry}\n aria-label='Retry account session'\n title='Account session unavailable'\n onClick={onAccountRetry}\n >\n <RotateCcw aria-hidden='true' />\n </Button>\n ) : user ? (\n <Navbar4AccountMenu\n user={user}\n items={accountMenuItems}\n onHelp={onHelp}\n onSignOut={onSignOut}\n pending={accountPending}\n />\n ) : accountHref ? (\n accountPending ? (\n <Button variant='ghost' size='icon' className='size-11' disabled aria-label='Loading account session'>\n <UserRound aria-hidden='true' />\n </Button>\n ) : (\n <Button variant='ghost' size='icon' className='size-11' asChild>\n <a href={accountHref} aria-label='Account' aria-current={isCurrent(accountHref) ? 'page' : undefined}>\n <UserRound aria-hidden='true' />\n </a>\n </Button>\n )\n ) : null}\n\n <Sheet\n {...(cartOpen !== undefined ? { open: cartOpen, onOpenChange: onCartOpenChange } : {})}\n >\n <SheetTrigger asChild>\n <Button\n variant='ghost'\n size='icon'\n className='relative overflow-visible'\n aria-label={`Cart, ${count} ${count === 1 ? 'item' : 'items'}`}\n >\n <ShoppingBag className='size-5' />\n <CartBadge count={count} />\n </Button>\n </SheetTrigger>\n <SheetContent side='right' className='flex w-full max-w-sm flex-col gap-0 p-0'>\n <SheetHeader className='border-border border-b'>\n <SheetTitle className='text-left text-base'>\n Cart{count > 0 ? ` (${count})` : ''}\n </SheetTitle>\n </SheetHeader>\n <Navbar4CartSheet\n items={items}\n onQtyChange={changeQty}\n onRemove={removeItem}\n subtotal={subtotal}\n subtotalUnavailableLabel={subtotalUnavailableLabel}\n formatMoney={formatMoney}\n onCheckout={onCheckout}\n onViewCart={onViewCart}\n canonical={canonicalCart}\n state={cartState}\n errorLabel={cartErrorLabel}\n retryLabel={cartRetryLabel}\n onRetry={onCartRetry}\n checkoutUnavailable={checkoutUnavailable}\n checkoutDisabled={checkoutDisabled}\n viewCartUnavailable={viewCartUnavailable}\n />\n </SheetContent>\n </Sheet>\n </div>\n </div>\n\n <p aria-live='polite' className='sr-only'>\n {`Cart contains ${count} ${count === 1 ? 'item' : 'items'}`}\n </p>\n\n {showSearch && searchOpen ? (\n <div className='border-border flex flex-col gap-0 border-t p-4 lg:hidden'>\n <Navbar4SearchBar\n id='store-search-mobile'\n value={searchQuery}\n onValueChange={setSearchQuery}\n onDismiss={dismissSearch}\n />\n </div>\n ) : null}\n </header>\n )\n}\n\nexport default Navbar4\n","import { Heart, HelpCircle, LogOut, MapPin, Package, Settings } from 'lucide-react'\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Button } from '../../../ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui/dropdown-menu'\n\nexport interface StoreUser {\n name: string\n email: string\n avatar?: string\n initials: string\n}\n\nexport interface AccountMenuItem {\n label: string\n href: string\n description?: string\n icon?: 'orders' | 'wishlist' | 'addresses' | 'settings'\n}\n\nexport interface Navbar4AccountMenuProps {\n /** Signed-in user. When omitted, the menu is not rendered. */\n user?: StoreUser\n /** Account links shown below the user header. Defaults to `[]`. */\n items?: AccountMenuItem[]\n onHelp?: () => void\n onSignOut?: () => void\n pending?: boolean\n}\n\nconst accountIcons = {\n orders: Package,\n wishlist: Heart,\n addresses: MapPin,\n settings: Settings,\n} as const\n\nexport function Navbar4AccountMenu({\n user,\n items = [],\n onHelp,\n onSignOut,\n pending = false,\n}: Navbar4AccountMenuProps) {\n if (!user) {\n return null\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant='ghost'\n size='icon'\n className='size-11 rounded-full'\n disabled={pending}\n aria-label={`Account menu for ${user.name}`}\n >\n <Avatar size='sm' className='pointer-events-none size-8'>\n <AvatarImage src={user.avatar || undefined} alt='' />\n <AvatarFallback>{user.initials}</AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align='end'\n sideOffset={8}\n className='w-64 origin-(--transform-origin) p-1.5 duration-[250ms] data-closed:duration-150'\n >\n <DropdownMenuGroup>\n <DropdownMenuLabel className='px-2 py-2 font-normal'>\n <div className='flex items-center gap-3'>\n <Avatar size='sm' className='pointer-events-none'>\n <AvatarImage src={user.avatar || undefined} alt='' />\n <AvatarFallback>{user.initials}</AvatarFallback>\n </Avatar>\n <div className='min-w-0'>\n <p className='text-foreground truncate text-sm font-medium'>{user.name}</p>\n <p className='text-muted-foreground truncate text-xs'>{user.email}</p>\n </div>\n </div>\n </DropdownMenuLabel>\n {items.length > 0 ? <DropdownMenuSeparator /> : null}\n {items.map(item => {\n const Icon = item.icon ? accountIcons[item.icon] : Package\n return (\n <DropdownMenuItem key={item.href} asChild disabled={pending} className='gap-2.5 px-2 py-2'>\n <a href={item.href}>\n <Icon className='text-muted-foreground size-4' />\n <span className='flex min-w-0 flex-col'>\n <span className='text-sm'>{item.label}</span>\n {item.description ? (\n <span className='text-muted-foreground text-xs font-normal'>{item.description}</span>\n ) : null}\n </span>\n </a>\n </DropdownMenuItem>\n )\n })}\n {onHelp || onSignOut ? <DropdownMenuSeparator /> : null}\n {onHelp ? (\n <DropdownMenuItem\n disabled={pending}\n className='gap-2.5 px-2 py-2'\n onSelect={() => { if (!pending) onHelp() }}\n >\n <HelpCircle className='text-muted-foreground size-4' />\n Help & support\n </DropdownMenuItem>\n ) : null}\n {onSignOut ? (\n <DropdownMenuItem\n disabled={pending}\n variant='destructive'\n className='gap-2.5 px-2 py-2'\n onSelect={() => { if (!pending) onSignOut() }}\n >\n <LogOut className='size-4' />\n Sign out\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react'\nimport { Minus, Plus, ShoppingBag } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from '../../../ui/empty'\nimport { Separator } from '../../../ui/separator'\nimport { SheetClose } from '../../../ui/sheet'\nimport type { Money } from '@thorprovider/types'\nimport { formatMoney } from '../../../lib/money'\n\nexport interface CartItem {\n /** Backend cart line-item id — the stable identity for update/removal. */\n id: string\n name: string\n variant?: string\n price: number\n qty: number\n /** Optional; an absent image is omitted rather than serialized as `\"\"`. */\n image?: string\n /**\n * Canonical backend line amount. Required for truthful rendering in\n * `canonical` mode; when absent/invalid the line shows the unavailable\n * label rather than a numeric fallback.\n */\n lineTotal?: Money\n}\n\nexport type CartSheetState = 'idle' | 'pending' | 'error'\n\nexport interface Navbar4CartSheetProps {\n items: CartItem[]\n /**\n * Quantity DELTA for a backend cart line-item id. The boundary converts the\n * delta into an absolute quantity against the authoritative current line\n * quantity before mutating the cart.\n */\n onQtyChange: (id: string, delta: number) => void\n /** Remove the backend cart line-item id. */\n onRemove: (id: string) => void\n /** Authoritative backend subtotal. Preferred over any local line math. */\n subtotal?: Money\n /** Shown when an authoritative subtotal is supplied but absent/malformed. */\n subtotalUnavailableLabel?: string\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n /** @deprecated legacy numeric formatter; ignored when `subtotal` is supplied. */\n formatPrice?: (value: number) => string\n onCheckout?: () => void\n onViewCart?: () => void\n /**\n * Backend-authoritative rendering. When `true`, each line amount comes from\n * the item's canonical `lineTotal` Money and the sheet never recomputes\n * `price * qty`. When omitted/false, legacy numeric rendering is preserved\n * for standalone consumers.\n */\n canonical?: boolean\n /** Shown in `canonical` mode when a line amount is missing or malformed. */\n lineUnavailableLabel?: string\n /** Cart read/mutation lifecycle. Pending retains confirmed lines; error is recoverable. */\n state?: CartSheetState\n /** Message shown when `state` is `error`. */\n errorLabel?: string\n /** Label for the recovery action in the error state. */\n retryLabel?: string\n /** Recovery action invoked from the error state. */\n onRetry?: () => void\n /** Label shown while `state` is `pending`. */\n pendingLabel?: string\n /** When `true`, the checkout action is suppressed (checkout not installed). */\n checkoutUnavailable?: boolean\n /** When `true`, the checkout action is disabled (cart not ready / invalid amounts). */\n checkoutDisabled?: boolean\n /** When `true`, the review action is suppressed (cart view not installed). */\n viewCartUnavailable?: boolean\n}\n\nconst usdFormatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' })\n\n/** Approximate Transitions.dev `delete-with-smoky-dissolve` for list rows (Pro effect). */\nconst smokyExit = {\n opacity: 0,\n y: 10,\n scale: 0.96,\n filter: 'blur(8px)',\n transition: { duration: 0.35, ease: [0.4, 0, 0.2, 1] as const },\n}\n\n/**\n * Transitions.dev `texts-reveal`: lines rise from below with blur, staggered.\n * Exit is a quiet in-place fade — no Y return, no reverse stagger.\n */\nconst revealEase = [0.22, 1, 0.36, 1] as const\nconst revealHidden = { opacity: 0, y: 12, filter: 'blur(3px)' }\nconst revealShown = { opacity: 1, y: 0, filter: 'blur(0px)' }\nconst revealExit = { opacity: 0, y: 0, filter: 'blur(0px)', transition: { duration: 0.2, ease: 'easeOut' as const } }\n\nexport function Navbar4CartSheet({\n items,\n onQtyChange,\n onRemove,\n subtotal: subtotalProp,\n subtotalUnavailableLabel = '—',\n formatMoney: formatMoneyProp,\n formatPrice,\n onCheckout,\n onViewCart,\n canonical = false,\n lineUnavailableLabel = '—',\n state = 'idle',\n errorLabel = 'No se pudo actualizar el carrito.',\n retryLabel = 'Reintentar',\n onRetry,\n pendingLabel = 'Actualizando el carrito…',\n checkoutUnavailable = false,\n checkoutDisabled = false,\n viewCartUnavailable = false,\n}: Navbar4CartSheetProps) {\n const reduceMotion = useReducedMotion()\n const format = formatPrice ?? (value => usdFormatter.format(value))\n const localSubtotal = items.reduce((total, item) => total + item.price * item.qty, 0)\n const authoritativeSubtotal = subtotalProp !== undefined ? formatMoney(subtotalProp, formatMoneyProp) : null\n const isEmpty = items.length === 0\n const isPending = state === 'pending'\n const isError = state === 'error'\n /** Wait for the last cart row's exit before revealing empty copy. */\n const [showEmpty, setShowEmpty] = useState(isEmpty)\n\n useEffect(() => {\n if (!isEmpty) {\n setShowEmpty(false)\n }\n }, [isEmpty])\n\n const lineAmount = (item: CartItem): string => {\n if (canonical) {\n if (item.lineTotal === undefined) {\n return lineUnavailableLabel\n }\n return formatMoney(item.lineTotal, formatMoneyProp) ?? lineUnavailableLabel\n }\n return format(item.price * item.qty)\n }\n\n // A confirmed empty cart is only claimed when no read/mutation is in flight\n // and no read error is outstanding; otherwise the sheet shows loading/error.\n const showConfirmedEmpty = showEmpty && !isPending && !isError\n const mutationsDisabled = isPending\n\n return (\n <>\n <div className='relative flex min-h-0 flex-1 flex-col overflow-hidden'>\n {isPending ? (\n <p\n role='status'\n aria-live='polite'\n className='border-border text-muted-foreground border-b px-4 py-2 text-sm'\n >\n {pendingLabel}\n </p>\n ) : null}\n {isError ? (\n <div\n role='alert'\n className='border-border flex items-center justify-between gap-2 border-b px-4 py-2 text-sm'\n >\n <span className='text-destructive'>{errorLabel}</span>\n {onRetry ? (\n <Button variant='ghost' size='sm' onClick={onRetry}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n ) : null}\n <ul className='flex-1 overflow-y-auto px-4'>\n <AnimatePresence\n initial={false}\n mode='popLayout'\n onExitComplete={() => {\n if (items.length === 0) {\n setShowEmpty(true)\n }\n }}\n >\n {items.map(item => (\n <motion.li\n key={item.id}\n layout={!reduceMotion}\n initial={reduceMotion ? false : { opacity: 0, y: 8, filter: 'blur(4px)' }}\n animate={{ opacity: 1, y: 0, filter: 'blur(0px)' }}\n exit={reduceMotion ? { opacity: 0 } : smokyExit}\n transition={{ duration: 0.28, ease: [0.22, 1, 0.36, 1] }}\n className='border-border flex gap-4 border-b py-4 last:border-b-0'\n style={{ willChange: 'transform, opacity, filter' }}\n >\n {item.image ? (\n <img\n src={item.image || undefined}\n alt=''\n width={80}\n height={96}\n className='bg-muted size-20 shrink-0 rounded-md object-cover'\n />\n ) : (\n <div aria-hidden='true' className='bg-muted size-20 shrink-0 rounded-md' />\n )}\n <div className='flex min-w-0 flex-1 flex-col'>\n <div className='flex items-start justify-between gap-2'>\n <div className='min-w-0'>\n <p className='truncate text-sm font-medium'>{item.name}</p>\n {item.variant ? (\n <p className='text-muted-foreground text-sm'>{item.variant}</p>\n ) : null}\n </div>\n <p className='text-sm font-medium'>{lineAmount(item)}</p>\n </div>\n\n <div className='mt-auto flex items-center justify-between pt-2'>\n <div className='border-border flex items-center rounded-md border'>\n <Button\n variant='ghost'\n size='icon'\n className='size-8 rounded-r-none'\n aria-label={`Decrease quantity, ${item.name}`}\n disabled={mutationsDisabled}\n onClick={() => onQtyChange(item.id, -1)}\n >\n <Minus />\n </Button>\n <span className='w-8 text-center text-sm tabular-nums'>{item.qty}</span>\n <Button\n variant='ghost'\n size='icon'\n className='size-8 rounded-l-none'\n aria-label={`Increase quantity, ${item.name}`}\n disabled={mutationsDisabled}\n onClick={() => onQtyChange(item.id, 1)}\n >\n <Plus />\n </Button>\n </div>\n <Button\n variant='ghost'\n size='sm'\n className='text-muted-foreground hover:text-foreground'\n aria-label={`Remove ${item.name} from cart`}\n disabled={mutationsDisabled}\n onClick={() => onRemove(item.id)}\n >\n Remove\n </Button>\n </div>\n </div>\n </motion.li>\n ))}\n </AnimatePresence>\n </ul>\n\n <AnimatePresence>\n {showConfirmedEmpty ? (\n <motion.div\n key='empty'\n initial={false}\n exit={reduceMotion ? { opacity: 0 } : revealExit}\n className='absolute inset-0'\n >\n <Empty className='h-full border-0'>\n <EmptyHeader>\n <motion.div\n initial={reduceMotion ? false : revealHidden}\n animate={revealShown}\n transition={\n reduceMotion\n ? { duration: 0 }\n : { duration: 0.5, ease: revealEase, delay: 0 }\n }\n style={{ willChange: 'transform, opacity, filter' }}\n >\n <EmptyMedia variant='icon'>\n <ShoppingBag aria-hidden='true' />\n </EmptyMedia>\n </motion.div>\n <motion.div\n initial={reduceMotion ? false : revealHidden}\n animate={revealShown}\n transition={\n reduceMotion\n ? { duration: 0 }\n : { duration: 0.5, ease: revealEase, delay: 0.04 }\n }\n style={{ willChange: 'transform, opacity, filter' }}\n >\n <EmptyTitle>Your cart is empty</EmptyTitle>\n </motion.div>\n <motion.div\n initial={reduceMotion ? false : revealHidden}\n animate={revealShown}\n transition={\n reduceMotion\n ? { duration: 0 }\n : { duration: 0.5, ease: revealEase, delay: 0.08 }\n }\n style={{ willChange: 'transform, opacity, filter' }}\n >\n <EmptyDescription>Once you add something it will show up here.</EmptyDescription>\n </motion.div>\n </EmptyHeader>\n <motion.div\n initial={reduceMotion ? false : revealHidden}\n animate={revealShown}\n transition={\n reduceMotion\n ? { duration: 0 }\n : { duration: 0.5, ease: revealEase, delay: 0.12 }\n }\n style={{ willChange: 'transform, opacity, filter' }}\n >\n <EmptyContent>\n <SheetClose asChild>\n <Button>Continue shopping</Button>\n </SheetClose>\n </EmptyContent>\n </motion.div>\n </Empty>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n\n {!isEmpty ? (\n <div className='flex flex-col gap-4 p-4'>\n <Separator />\n <div className='flex items-center justify-between text-sm'>\n <span className='text-muted-foreground'>Subtotal</span>\n <span className='font-medium tabular-nums'>\n {canonical || subtotalProp !== undefined\n ? authoritativeSubtotal ?? subtotalUnavailableLabel\n : format(localSubtotal)}\n </span>\n </div>\n <p className='text-muted-foreground text-xs'>Shipping and taxes are calculated at checkout.</p>\n <div className='flex flex-col gap-2'>\n {checkoutUnavailable ? null : (\n <Button\n className='w-full'\n disabled={checkoutDisabled || isPending}\n onClick={onCheckout}\n >\n Checkout\n </Button>\n )}\n {viewCartUnavailable ? null : (\n <Button variant='ghost' className='w-full' onClick={onViewCart}>\n View cart\n </Button>\n )}\n </div>\n </div>\n ) : null}\n </>\n )\n}","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\n \"flex max-w-sm flex-col items-center gap-2 text-center\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n )\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\"text-lg font-medium tracking-tight\", className)}\n {...props}\n />\n )\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Empty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n}\n","import type { Money } from '@thorprovider/types'\n\n/**\n * Pure monetary helpers shared by the curated commerce blocks.\n *\n * Canonical `Money` (`@thorprovider/types`) carries a decimal string in major\n * units (e.g. `\"69.99\"`) — never cents. A missing, invalid, or unresolved\n * amount is *unavailable*, which is a different state from a legitimate `\"0\"`.\n * These helpers keep that distinction in the presentation layer: they validate\n * a complete finite decimal before any display conversion, and they never\n * invent a currency.\n */\n\nconst COMPLETE_FINITE_DECIMAL = /^-?(?:\\d+)(?:\\.\\d+)?$/\n\n/**\n * True only for a complete, finite decimal string (`\"0\"`, `\"69.99\"`, `\"-3.5\"`).\n * Rejects `\"\"`, `\" \"`, `\"1.\"`, `\".5\"`, `\"1e3\"`, `\"abc\"`, and non-strings.\n */\nexport function isCompleteFiniteDecimal(value: unknown): value is string {\n if (typeof value !== 'string') return false\n const trimmed = value.trim()\n if (trimmed === '' || !COMPLETE_FINITE_DECIMAL.test(trimmed)) return false\n return Number.isFinite(Number(trimmed))\n}\n\n/**\n * True when a `Money` value is safe to display and price a purchase with: a\n * complete finite decimal amount and a non-empty currency code. A valid zero\n * (`{ amount: '0', currencyCode: 'USD' }`) is available — zero alone does not\n * make a price unavailable.\n */\nexport function isAvailableMoney(money: Money | null | undefined): money is Money {\n return (\n !!money &&\n typeof money.currencyCode === 'string' &&\n money.currencyCode.trim() !== '' &&\n isCompleteFiniteDecimal(money.amount)\n )\n}\n\n/**\n * Formats a `Money` for display, or `null` when the value is unavailable.\n *\n * This is the safety gate the whole curated surface relies on: an absent or\n * malformed amount (`\"\"`, `\" \"`, `\"abc\"`, a non-string, a missing currency)\n * MUST NOT reach `Intl.NumberFormat`, because `Number(\"\")` is `0` and would\n * render a fake `$0.00` for missing data. A backend-resolved valid zero\n * (`{ amount: \"0\", currencyCode: \"USD\" }`) is available and formats as zero.\n *\n * When no `formatter` is supplied the currency comes from\n * `money.currencyCode`, so no currency is hardcoded. Callers render their own\n * unavailable/pending/recovery state when this returns `null`.\n */\nexport function formatMoney(\n money: Money | null | undefined,\n formatter?: (money: Money) => string,\n): string | null {\n if (!isAvailableMoney(money)) return null\n if (formatter) return formatter(money)\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: money.currencyCode,\n }).format(Number(money.amount))\n}\n","import { Search } from 'lucide-react'\n\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ui/input-group'\n\nexport interface Navbar4SearchBarProps {\n value: string\n onValueChange: (value: string) => void\n onDismiss?: () => void\n id?: string\n}\n\nexport function Navbar4SearchBar({\n value,\n onValueChange,\n onDismiss,\n id = 'store-search',\n}: Navbar4SearchBarProps) {\n return (\n <form\n role='search'\n onSubmit={event => event.preventDefault()}\n className='w-full'\n onKeyDown={event => {\n if (event.key === 'Escape') {\n if (value) {\n onValueChange('')\n return\n }\n onDismiss?.()\n }\n }}\n >\n <label htmlFor={id} className='sr-only'>\n Search products\n </label>\n <InputGroup className='bg-muted/40 h-9 w-full rounded-full border-transparent shadow-none has-[[data-slot=input-group-control]:focus-visible]:bg-background'>\n <InputGroupAddon>\n <Search aria-hidden='true' className='text-muted-foreground size-4' />\n </InputGroupAddon>\n <InputGroupInput\n id={id}\n type='search'\n autoComplete='off'\n placeholder='Search products'\n value={value}\n onChange={event => onValueChange(event.target.value)}\n className='rounded-full'\n />\n </InputGroup>\n </form>\n )\n}","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@/ui/button\"\nimport { Input } from \"@/ui/input\"\nimport { Textarea } from \"@/ui/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30\",\n \"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","'use client'\n\nimport { ChevronRight } from 'lucide-react'\nimport { useState } from 'react'\nimport { z } from 'zod'\n\nimport {\n collectionItemSchema,\n menuItemSchema,\n type MenuItem,\n} from '../../../lib/types/menu'\nimport { cn } from '../../../lib/utils'\nimport { CategoryIcon, categoryIconNameSchema } from './category-icon'\n\n/**\n * Three-level category flyout: L1 categories, L2 subcategories, L3 sub-sub\n * categories, plus a right panel with a featured image and collection links.\n *\n * Framework-agnostic and prop-driven: plain anchors replace router links,\n * `loading=\"lazy\"` images replace next/image, and Spanish copy/hrefs are\n * optional props with ES defaults. `onNavigate` lets the tenant close the\n * flyout on navigation; `collectionsHref` controls the \"view all\" link\n * (pass `''` to hide it).\n *\n * Ported from the legacy `@thorprovider/components` navigation library\n * (source: branch `feat/storefronts`).\n */\n\nexport const megaMenuPropsSchema = z.object({\n categories: z.array(menuItemSchema),\n collections: z.array(collectionItemSchema),\n onNavigate: z.custom<() => void>().optional(),\n categoryColumnTitle: z.string().optional(),\n collectionsTitle: z.string().optional(),\n viewAllLabel: z.string().optional(),\n collectionsHref: z.string().optional(),\n ariaLabel: z.string().optional(),\n})\n\nexport type MegaMenuProps = z.infer<typeof megaMenuPropsSchema>\n\nfunction MegaMenuColumn({\n title,\n items,\n activeId,\n onHover,\n onNavigate,\n level,\n scrollable = false,\n}: {\n title?: string\n items: MenuItem[]\n activeId?: string\n onHover?: (item: MenuItem) => void\n onNavigate?: () => void\n level: 1 | 2 | 3\n scrollable?: boolean\n}) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {title ? (\n <p className=\"shrink-0 px-3 pb-1 pt-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground\">\n {title}\n </p>\n ) : null}\n <ul\n className={cn('flex-1 py-1', scrollable ? 'overflow-y-auto' : '')}\n role=\"list\"\n >\n {items.map((item) => {\n const isActive = item.id === activeId\n const hasChildren = Boolean(item.children && item.children.length > 0)\n const parsedIcon = categoryIconNameSchema.safeParse(item.icon)\n const iconName = parsedIcon.success ? parsedIcon.data : undefined\n return (\n <li key={item.id}>\n <a\n href={item.href ?? '#'}\n className={cn(\n 'group/item flex items-center gap-2.5 px-3 py-2 text-sm transition-colors',\n isActive\n ? 'bg-secondary font-semibold text-primary'\n : 'text-foreground hover:bg-secondary/60',\n )}\n onMouseEnter={() => onHover?.(item)}\n onClick={() => {\n onHover?.(item)\n onNavigate?.()\n }}\n aria-current={isActive ? 'true' : undefined}\n >\n {level === 1 ? (\n item.image ? (\n <img\n src={item.image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-7 shrink-0 rounded object-cover\"\n />\n ) : (\n <CategoryIcon\n name={iconName}\n className=\"size-4 shrink-0 text-muted-foreground group-hover/item:text-primary\"\n />\n )\n ) : null}\n {level === 2 && item.image ? (\n <img\n src={item.image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-6 shrink-0 rounded object-cover\"\n />\n ) : null}\n <span className=\"flex-1 leading-tight\">{item.label}</span>\n {item.badge ? (\n <span className=\"rounded bg-primary px-1.5 py-0.5 text-[10px] font-bold text-primary-foreground\">\n {item.badge}\n </span>\n ) : null}\n {hasChildren ? (\n <ChevronRight\n className={cn(\n 'size-3.5 shrink-0 transition-transform',\n isActive ? 'text-primary' : 'text-muted-foreground',\n )}\n />\n ) : null}\n </a>\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nexport function MegaMenu({\n categories,\n collections,\n onNavigate,\n categoryColumnTitle = 'Comprar por categorías',\n collectionsTitle = 'Colecciones',\n viewAllLabel = 'Ver todas las colecciones',\n collectionsHref = '/colecciones',\n ariaLabel = 'Menú de categorías',\n}: MegaMenuProps) {\n const [activeL1, setActiveL1] = useState<MenuItem>(categories[0])\n const [activeL2, setActiveL2] = useState<MenuItem | undefined>(\n categories[0]?.children?.[0],\n )\n\n const handleL1Hover = (item: MenuItem) => {\n setActiveL1(item)\n setActiveL2(item.children?.[0])\n }\n\n const l2Items = activeL1?.children ?? []\n const l3Items = activeL2?.children ?? []\n\n const featuredImage = activeL2?.image ?? activeL1?.image\n\n return (\n <div\n className=\"flex h-[520px] overflow-hidden rounded-b-lg border border-t-0 bg-card shadow-xl\"\n role=\"dialog\"\n aria-label={ariaLabel}\n >\n <div className=\"flex w-56 min-w-0 shrink-0 flex-col overflow-hidden border-r\">\n <MegaMenuColumn\n title={categoryColumnTitle}\n items={categories}\n activeId={activeL1?.id}\n onHover={handleL1Hover}\n onNavigate={onNavigate}\n level={1}\n scrollable\n />\n </div>\n\n {l2Items.length > 0 ? (\n <div className=\"flex w-56 min-w-0 shrink-0 flex-col overflow-hidden border-r\">\n <MegaMenuColumn\n title={activeL1?.label}\n items={l2Items}\n activeId={activeL2?.id}\n onHover={(item) => setActiveL2(item)}\n onNavigate={onNavigate}\n level={2}\n scrollable\n />\n </div>\n ) : null}\n\n {l3Items.length > 0 ? (\n <div className=\"flex w-52 min-w-0 shrink-0 flex-col overflow-hidden border-r\">\n <MegaMenuColumn\n title={activeL2?.label}\n items={l3Items}\n onNavigate={onNavigate}\n level={3}\n scrollable\n />\n </div>\n ) : null}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {featuredImage ? (\n <a\n href={activeL2?.href ?? activeL1?.href ?? '#'}\n onClick={onNavigate}\n className=\"group relative block h-44 shrink-0 overflow-hidden\"\n >\n <img\n src={featuredImage || undefined}\n alt={activeL2?.label ?? activeL1?.label ?? ''}\n loading=\"lazy\"\n className=\"size-full object-cover transition-transform duration-300 group-hover:scale-105\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/70 to-transparent\" />\n <p className=\"absolute bottom-2 left-3 right-3 text-xs font-bold leading-tight text-white\">\n {activeL2?.label ?? activeL1?.label}\n </p>\n </a>\n ) : null}\n\n <div className=\"flex flex-1 flex-col overflow-y-auto\">\n <p className=\"shrink-0 px-3 pb-2 pt-3 text-[10px] font-bold uppercase tracking-widest text-muted-foreground\">\n {collectionsTitle}\n </p>\n <div className=\"flex flex-col gap-1 px-3 pb-3\">\n {collections.map((col) => (\n <a\n key={col.id}\n href={col.href}\n className=\"group flex items-center gap-3 rounded-md p-1.5 transition-colors hover:bg-secondary/60\"\n >\n <img\n src={col.image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-12 shrink-0 rounded-md object-cover transition-transform duration-300 group-hover:scale-105\"\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-xs font-semibold leading-tight text-foreground\">\n {col.label}\n </p>\n {col.description ? (\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {col.description}\n </p>\n ) : null}\n </div>\n </a>\n ))}\n </div>\n </div>\n {collectionsHref ? (\n <div className=\"border-t p-3\">\n <a\n href={collectionsHref}\n className=\"block rounded-md bg-secondary px-3 py-2.5 text-center text-xs font-bold text-foreground hover:bg-secondary/70\"\n >\n {viewAllLabel}\n </a>\n </div>\n ) : null}\n </div>\n </div>\n )\n}","import { z } from 'zod'\n\n/**\n * Canonical navigation types: recursive menu item and collection item.\n *\n * Ported from the legacy `@thorprovider/components` navigation library\n * (source: branch `feat/storefronts`) into the blocks catalog so any\n * consumer can feed a multi-level category tree to the navigation blocks.\n */\n\nexport const menuItemSchema: z.ZodType<{\n id: string\n label: string\n icon?: string\n image?: string\n href?: string\n badge?: string\n featured?: boolean\n children?: MenuItem[]\n}> = z.lazy(() =>\n z.object({\n id: z.string(),\n label: z.string(),\n icon: z.string().optional(),\n image: z.string().optional(),\n href: z.string().optional(),\n badge: z.string().optional(),\n featured: z.boolean().optional(),\n children: z.array(menuItemSchema).optional(),\n }),\n)\n\nexport type MenuItem = z.infer<typeof menuItemSchema>\n\nexport const collectionItemSchema = z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n image: z.string().optional(),\n href: z.string().optional(),\n})\n\nexport type CollectionItem = z.infer<typeof collectionItemSchema>","import {\n Bolt,\n Boxes,\n Car,\n ChefHat,\n Droplet,\n HardHat,\n Home,\n Refrigerator,\n Shield,\n Sofa,\n Store,\n Sun,\n Tractor,\n Trees,\n Utensils,\n Wind,\n Wrench,\n Zap,\n type LucideIcon,\n} from 'lucide-react'\nimport { z } from 'zod'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * The explicit vocabulary of known category icon names. Kept as a Zod enum so\n * the union type derives from the schema and never drifts.\n */\nexport const categoryIconNameSchema = z.enum([\n 'wrench',\n 'bolt',\n 'tree',\n 'refrigerator',\n 'wind',\n 'droplet',\n 'zap',\n 'hard-hat',\n 'car',\n 'utensils',\n 'boxes',\n 'sofa',\n 'shield',\n 'sun',\n 'chef-hat',\n 'tractor',\n 'store',\n 'home',\n])\n\nexport type CategoryIconName = z.infer<typeof categoryIconNameSchema>\n\nexport const categoryIconPropsSchema = z.object({\n name: categoryIconNameSchema.optional(),\n className: z.string().optional(),\n})\n\nexport type CategoryIconProps = z.infer<typeof categoryIconPropsSchema>\n\nconst iconMap: Record<CategoryIconName, LucideIcon> = {\n wrench: Wrench,\n bolt: Bolt,\n tree: Trees,\n refrigerator: Refrigerator,\n wind: Wind,\n droplet: Droplet,\n zap: Zap,\n 'hard-hat': HardHat,\n car: Car,\n utensils: Utensils,\n boxes: Boxes,\n sofa: Sofa,\n shield: Shield,\n sun: Sun,\n 'chef-hat': ChefHat,\n tractor: Tractor,\n store: Store,\n home: Home,\n}\n\n/**\n * Category icon by name: maps a string icon-name to a Lucide icon.\n *\n * Framework-agnostic and prop-driven. Unknown or absent names render null\n * (graceful fallback); the schema validates names at the boundary, so a\n * non-vocabulary value fails `parse` but the component still renders null\n * instead of throwing.\n */\nexport function CategoryIcon({ name, className }: CategoryIconProps) {\n if (!name) return null\n const Icon = iconMap[name]\n if (!Icon) return null\n return <Icon className={cn('size-4', className)} aria-hidden=\"true\" />\n}","'use client'\n\nimport { ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { useEffect, useState } from 'react'\nimport { z } from 'zod'\n\nimport {\n collectionItemSchema,\n menuItemSchema,\n type CollectionItem,\n type MenuItem,\n} from '../../../lib/types/menu'\nimport { cn } from '../../../lib/utils'\nimport { type CategoryIconName, CategoryIcon } from './category-icon'\n\ntype Level = {\n items: MenuItem[]\n title: string\n image?: string\n href?: string\n}\n\n/**\n * Slide-in drill-down category drawer: a stack-based menu where selecting a\n * category with children pushes a new level, and a back control pops it.\n *\n * Framework-agnostic: plain anchors (no router), `<img>` (no image\n * optimization), copy + hrefs as optional props with ES defaults. The drawer\n * stays MOUNTED while closed and slides in/out with a 200ms transform\n * (reproducing the original behavior); the backdrop renders only while open.\n * Locks body scroll while open. No focus trap (out of scope).\n *\n * Ported from the legacy `@thorprovider/components` navigation library\n * (source: branch `feat/storefronts`).\n */\nexport const mobileCategoryDrawerPropsSchema = z.object({\n categories: z.array(menuItemSchema),\n collections: z.array(collectionItemSchema),\n open: z.boolean(),\n onClose: z.function().returns(z.void()),\n rootTitle: z.string().optional(),\n collectionsTitle: z.string().optional(),\n viewAllLabel: z.string().optional(),\n viewAllHref: z.string().optional(),\n closeAriaLabel: z.string().optional(),\n backAriaLabel: z.string().optional(),\n menuAriaLabel: z.string().optional(),\n})\n\nexport type MobileCategoryDrawerProps = z.infer<\n typeof mobileCategoryDrawerPropsSchema\n>\n\nexport function MobileCategoryDrawer({\n categories,\n collections,\n open,\n onClose,\n rootTitle = 'Categorías',\n collectionsTitle = 'Colecciones',\n viewAllLabel = 'Ver todas',\n viewAllHref,\n closeAriaLabel = 'Cerrar menú',\n backAriaLabel = 'Volver',\n menuAriaLabel = 'Menú de categorías',\n}: MobileCategoryDrawerProps) {\n const root: Level = { items: categories, title: rootTitle }\n const [stack, setStack] = useState<Level[]>([root])\n const current = stack[stack.length - 1]\n\n useEffect(() => {\n if (!open) return\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [open])\n\n const push = (item: MenuItem) => {\n if (item.children?.length) {\n setStack((levels) => [\n ...levels,\n {\n items: item.children!,\n title: item.label,\n image: item.image ?? current.image,\n href: item.href,\n },\n ])\n }\n }\n\n const handleClose = () => {\n setStack([root])\n onClose()\n }\n\n return (\n <>\n {open ? (\n <button\n type=\"button\"\n className=\"fixed inset-0 z-40 bg-foreground/50 backdrop-blur-sm\"\n aria-label={closeAriaLabel}\n onClick={handleClose}\n />\n ) : null}\n <div\n role=\"dialog\"\n aria-label={menuAriaLabel}\n aria-modal=\"true\"\n aria-hidden={!open}\n className={cn(\n 'fixed inset-y-0 left-0 z-50 flex w-full max-w-sm flex-col overflow-hidden bg-card text-foreground shadow-2xl transition-transform duration-200',\n open ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <div className=\"flex min-h-14 shrink-0 items-center gap-2 border-b bg-primary px-3 text-primary-foreground\">\n {stack.length > 1 && (\n <button\n onClick={() => setStack((levels) => levels.slice(0, -1))}\n aria-label={backAriaLabel}\n className=\"rounded-md p-2 hover:bg-primary-foreground/10\"\n >\n <ChevronLeft className=\"size-5\" />\n </button>\n )}\n <span className=\"flex-1 truncate text-sm font-bold\">\n {current.title}\n </span>\n <button\n onClick={handleClose}\n aria-label={closeAriaLabel}\n className=\"rounded-md p-2 hover:bg-primary-foreground/10\"\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n {current.image && (\n <div className=\"relative h-28 shrink-0\">\n <img\n src={current.image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n <div className=\"absolute inset-0 bg-foreground/35\" />\n <p className=\"absolute inset-x-4 bottom-3 text-base font-black text-primary-foreground\">\n {current.title}\n </p>\n </div>\n )}\n\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n {current.href && (\n <a\n href={current.href}\n onClick={handleClose}\n className=\"mx-4 mt-3 flex h-11 items-center justify-between rounded-md bg-primary px-4 text-sm font-bold text-primary-foreground\"\n >\n Ver todos en {current.title}\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n </a>\n )}\n <ul className=\"py-2\" role=\"list\">\n {current.items.map((item) => {\n const hasChildren = Boolean(item.children?.length)\n const image = item.image ?? current.image\n const content = (\n <>\n {image ? (\n <span className=\"relative size-12 shrink-0 overflow-hidden rounded-md\">\n <img\n src={image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n </span>\n ) : (\n <span className=\"flex size-12 shrink-0 items-center justify-center rounded-md bg-secondary\">\n <CategoryIcon\n name={item.icon as CategoryIconName}\n className=\"size-5 text-muted-foreground\"\n />\n </span>\n )}\n <span className=\"min-w-0 flex-1 text-pretty font-semibold leading-snug\">\n {item.label}\n </span>\n {item.badge && (\n <span className=\"rounded bg-primary px-1.5 py-0.5 text-[10px] font-bold text-primary-foreground\">\n {item.badge}\n </span>\n )}\n {hasChildren && (\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n )}\n </>\n )\n return (\n <li key={`${item.id}:${item.label}`}>\n {hasChildren ? (\n <button\n onClick={() => push(item)}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-left text-sm hover:bg-secondary\"\n >\n {content}\n </button>\n ) : (\n <a\n href={item.href ?? '#'}\n onClick={handleClose}\n className=\"flex items-center gap-3 px-4 py-2.5 text-sm hover:bg-secondary\"\n >\n {content}\n </a>\n )}\n </li>\n )\n })}\n </ul>\n\n {stack.length === 1 && (\n <section\n className=\"border-t px-4 py-4\"\n aria-labelledby=\"mobile-collections-title\"\n >\n <div className=\"mb-3 flex items-center justify-between gap-3\">\n <h2\n id=\"mobile-collections-title\"\n className=\"text-xs font-black uppercase tracking-wider text-muted-foreground\"\n >\n {collectionsTitle}\n </h2>\n {viewAllHref && viewAllHref.trim() ? (\n <a\n href={viewAllHref}\n onClick={handleClose}\n className=\"text-xs font-bold text-primary\"\n >\n {viewAllLabel}\n </a>\n ) : null}\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n {collections.map((collection) => (\n <a\n key={`${collection.id}:${collection.label}`}\n href={collection.href}\n onClick={handleClose}\n className=\"group overflow-hidden rounded-lg border bg-background\"\n >\n <div className=\"relative aspect-square\">\n <img\n src={collection.image || undefined}\n alt=\"\"\n loading=\"lazy\"\n className=\"absolute inset-0 h-full w-full object-cover transition-transform group-hover:scale-105\"\n />\n </div>\n <div className=\"p-2\">\n <p className=\"text-pretty text-xs font-bold leading-snug\">\n {collection.label}\n </p>\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n </div>\n </>\n )\n}","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { motion, useReducedMotion } from 'motion/react'\nimport { ArrowRight, X } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { AvatarGroup } from './avatar-group'\n\nexport type Banner1Shape = 'bar' | 'pill'\n\nexport interface Banner1Props {\n /**\n * 'bar' — full-width strip above the header (the default).\n * 'pill' — floating rounded card pinned to the bottom of the viewport, with an avatar stack.\n */\n shape?: Banner1Shape\n badge?: string\n message: string\n href: string\n linkLabel: string\n /** Used by the 'pill' shape only; decorative avatars of the announcement's authors. */\n avatars?: string[]\n /**\n * 'bar' only. When true, the inner content spans the full width of its parent\n * (skips the centered `max-w-7xl` container) so badge/message/CTA reach the edges.\n */\n fullWidth?: boolean\n /** Fired when the user clicks the banner CTA. When provided, the CTA renders as a button instead of a link. */\n onCtaClick?: () => void\n /** Fired when the user dismisses the banner. */\n onDismiss?: () => void\n}\n\ntype Visibility = 'visible' | 'closing' | 'closed'\n\nexport function Banner1({\n shape = 'bar',\n badge,\n message,\n href,\n linkLabel,\n avatars,\n fullWidth,\n onCtaClick,\n onDismiss,\n}: Banner1Props) {\n const [visibility, setVisibility] = useState<Visibility>('visible')\n const reduceMotion = useReducedMotion()\n\n useEffect(() => {\n if (visibility !== 'closing') {\n return\n }\n\n const timer = window.setTimeout(() => setVisibility('closed'), 200)\n return () => window.clearTimeout(timer)\n }, [visibility])\n\n const dismiss = () => {\n onDismiss?.()\n setVisibility(reduceMotion ? 'closed' : 'closing')\n }\n\n if (visibility === 'closed') {\n return null\n }\n\n const closing = visibility === 'closing'\n\n if (shape === 'pill') {\n return (\n <div\n className={`fixed inset-x-4 bottom-4 z-50 transition-all duration-200 ease-out motion-reduce:transition-none sm:inset-x-auto sm:left-1/2 sm:-translate-x-1/2 ${\n closing ? 'translate-y-2 opacity-0' : 'opacity-100'\n }`}\n >\n <div className='bg-background/95 border-border flex items-center gap-3 rounded-full border py-2 pr-2 pl-3 shadow-lg backdrop-blur sm:pl-4'>\n {avatars && avatars.length > 0 && (\n <AvatarGroup aria-hidden='true'>\n {avatars.map(src => (\n <Avatar key={src} className='ring-background size-6 ring-2'>\n <AvatarImage src={src || undefined} alt='' />\n <AvatarFallback />\n </Avatar>\n ))}\n </AvatarGroup>\n )}\n <p className='truncate text-sm'>{message}</p>\n <a\n href={href}\n className='hover:text-foreground text-muted-foreground focus-visible:ring-ring hidden shrink-0 items-center gap-1 rounded-sm text-sm font-medium transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none sm:inline-flex'\n >\n {linkLabel}\n <ArrowRight className='size-3.5' />\n </a>\n <Button\n variant='ghost'\n size='icon'\n className='size-8 shrink-0 rounded-full'\n aria-label='Dismiss announcement'\n onClick={dismiss}\n >\n <X className='size-4' />\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={`grid transition-all duration-200 ease-out motion-reduce:transition-none ${\n closing ? 'grid-rows-[0fr] opacity-0' : 'grid-rows-[1fr] opacity-100'\n }`}\n >\n <div className='overflow-hidden'>\n <div className='bg-primary text-primary-foreground'>\n <div\n className={`flex w-full items-center gap-3 px-4 py-2.5 sm:px-6 lg:px-8 ${\n fullWidth ? '' : 'mx-auto max-w-7xl'\n }`}\n >\n {badge ? (\n <Badge\n variant='secondary'\n className='hidden shrink-0 rounded-full px-2 py-0 text-xs font-semibold sm:inline-flex'\n >\n {badge}\n </Badge>\n ) : null}\n\n <p className='min-w-0 flex-1 truncate text-sm'>{message}</p>\n\n {onCtaClick ? (\n <span className='relative inline-flex'>\n <motion.span\n aria-hidden='true'\n className='pointer-events-none absolute inset-0 rounded-md ring-2 ring-background/70'\n initial={{ scale: 1, opacity: 0.7 }}\n animate={\n reduceMotion\n ? { scale: 1, opacity: 0 }\n : { scale: [1, 1.35], opacity: [0.7, 0] }\n }\n transition={{ duration: 1.8, repeat: Infinity, ease: 'easeOut', repeatDelay: 0.4 }}\n />\n <Button\n type='button'\n variant='secondary'\n size='sm'\n onClick={onCtaClick}\n className='shrink-0'\n >\n <span className='hidden sm:inline'>{linkLabel}</span>\n <span className='sr-only sm:hidden'>{linkLabel}</span>\n <ArrowRight className='size-3.5' aria-hidden='true' />\n </Button>\n </span>\n ) : (\n <a\n href={href}\n className='focus-visible:ring-ring inline-flex shrink-0 items-center gap-1 rounded-sm text-sm font-medium underline-offset-4 transition-opacity duration-150 hover:opacity-80 hover:underline focus-visible:ring-2 focus-visible:outline-none'\n >\n <span className='hidden sm:inline'>{linkLabel}</span>\n <span className='sr-only sm:hidden'>{linkLabel}</span>\n <ArrowRight className='size-3.5' aria-hidden='true' />\n </a>\n )}\n\n <Button\n variant='ghost'\n size='icon'\n className='hover:bg-primary-foreground/10 hover:text-primary-foreground size-8 shrink-0'\n aria-label='Dismiss announcement'\n onClick={dismiss}\n >\n <X className='size-4' />\n </Button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default Banner1","'use client'\n\nimport * as React from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\nconst LIFT = -4\nconst FALLOFF = 0.45\nconst ACTIVE_SCALE = 1.05\nconst DURATION = 320\nconst EASE_IN = 'cubic-bezier(0.22, 1, 0.36, 1)'\nconst EASE_OUT = 'cubic-bezier(0.34, 3.85, 0.64, 1)'\n\nexport function AvatarGroup({\n children,\n className,\n overlap = '-ml-2',\n}: {\n children: React.ReactNode\n className?: string\n overlap?: string\n}) {\n const items = React.Children.toArray(children)\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n const [reducedMotion, setReducedMotion] = useState(false)\n\n useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n const sync = () => setReducedMotion(query.matches)\n\n sync()\n query.addEventListener('change', sync)\n return () => query.removeEventListener('change', sync)\n }, [])\n\n const itemStyle = (index: number): React.CSSProperties | undefined => {\n if (reducedMotion) {\n return undefined\n }\n\n const isActive = index === activeIndex\n const shift = activeIndex === null ? 0 : LIFT * FALLOFF ** Math.abs(index - activeIndex)\n\n return {\n transform: `translateY(${shift.toFixed(3)}px) scale(${isActive ? ACTIVE_SCALE : 1})`,\n transition: `transform ${DURATION}ms ${activeIndex === null ? EASE_OUT : EASE_IN}`,\n willChange: 'transform',\n zIndex: isActive ? 1 : undefined,\n }\n }\n\n return (\n <div className={cn('flex', className)} onMouseLeave={() => setActiveIndex(null)}>\n {items.map((child, index) => (\n <div\n key={index}\n className={cn('relative', index > 0 && overlap)}\n style={itemStyle(index)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport default AvatarGroup","'use client'\n\nimport * as React from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * @title Avatar group\n * @description Overlapping avatar stack whose neighbours lift with a distance falloff on hover.\n *\n * Adapted from Transitions.dev \"Avatar group hover\".\n *\n * A dock, not a switch. Lifting only the hovered item makes the row twitch — one element jumps\n * while the rest sit rigid — so the response falls off with distance: the neighbour rises about\n * half as far, the next barely at all. The falloff is what makes the row read as one soft object.\n *\n * The return is deliberately springier than the approach: a strong overshoot curve on the way back\n * reads as elastic rather than mechanical.\n */\nconst LIFT = -4\nconst FALLOFF = 0.45\nconst ACTIVE_SCALE = 1.05\nconst DURATION = 320\nconst EASE_IN = 'cubic-bezier(0.22, 1, 0.36, 1)'\nconst EASE_OUT = 'cubic-bezier(0.34, 3.85, 0.64, 1)'\n\nexport function AvatarGroup({\n children,\n className,\n overlap = '-ml-2',\n}: {\n children: React.ReactNode\n className?: string\n /** Negative margin applied to every item but the first. Set to `''` for a non-overlapping row. */\n overlap?: string\n}) {\n const items = React.Children.toArray(children)\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n const [reducedMotion, setReducedMotion] = useState(false)\n\n useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n const sync = () => setReducedMotion(query.matches)\n\n sync()\n query.addEventListener('change', sync)\n return () => query.removeEventListener('change', sync)\n }, [])\n\n const itemStyle = (index: number): React.CSSProperties | undefined => {\n if (reducedMotion) {\n return undefined\n }\n\n const isActive = index === activeIndex\n const shift = activeIndex === null ? 0 : LIFT * FALLOFF ** Math.abs(index - activeIndex)\n\n return {\n // translateY before scale, so scaling never amplifies the lift distance.\n transform: `translateY(${shift.toFixed(3)}px) scale(${isActive ? ACTIVE_SCALE : 1})`,\n transition: `transform ${DURATION}ms ${activeIndex === null ? EASE_OUT : EASE_IN}`,\n willChange: 'transform',\n // A lifted item has to sit above the neighbour overlapping it, or the lift happens underneath.\n zIndex: isActive ? 1 : undefined,\n }\n }\n\n return (\n <div className={cn('flex', className)} onMouseLeave={() => setActiveIndex(null)}>\n {items.map((child, index) => (\n <div\n // eslint-disable-next-line react/no-array-index-key -- position is the identity here\n key={index}\n className={cn('relative', index > 0 && overlap)}\n style={itemStyle(index)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport default AvatarGroup","import { Button } from '../../../ui/button'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Badge } from '../../../ui/badge'\nimport { AvatarGroup } from './avatar-group'\nimport { Star } from 'lucide-react'\nimport type { CTA } from '../../../lib/types'\n\ninterface AvatarItem {\n id: string | number\n avatarUrl: string\n fallback: string\n alt?: string\n}\n\ninterface Rating {\n value: number\n count: number\n}\n\ninterface HeroSection1Props {\n title: string\n description: string\n badge?: string\n cta?: CTA\n reviewers?: AvatarItem[]\n rating?: Rating\n trustedBy?: string\n image?: { src: string; alt: string }\n}\n\nexport function HeroSection1({\n title,\n description,\n badge,\n cta,\n reviewers,\n rating,\n trustedBy,\n image,\n}: HeroSection1Props) {\n return (\n <section className='w-full py-12 lg:py-20'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid items-center gap-8 lg:grid-cols-2 lg:gap-12'>\n <div className='flex flex-col gap-8 text-center lg:text-start'>\n <header className='flex flex-col gap-4'>\n {badge && (\n <Badge variant='outline' className='h-auto font-semibold rounded-md text-muted-foreground px-3.5 py-1 self-center lg:self-start'>\n {badge}\n </Badge>\n )}\n <h1 className='text-4xl font-bold tracking-tight text-balance md:text-5xl'>{title}</h1>\n <p className='text-muted-foreground text-balance md:text-lg'>\n {description}\n </p>\n </header>\n\n {cta &&\n (cta.href ? (\n <Button\n asChild\n size='lg'\n className='h-10 px-8 cursor-pointer text-base w-fit self-center lg:self-start'\n >\n <a href={cta.href}>{cta.label}</a>\n </Button>\n ) : (\n <Button\n size='lg'\n className='h-10 px-8 cursor-pointer text-base w-fit self-center lg:self-start'\n >\n {cta.label}\n </Button>\n ))}\n\n {(reviewers || rating || trustedBy) && (\n <div className='flex flex-col items-center gap-4 sm:flex-row sm:justify-center lg:justify-start'>\n {reviewers && (\n <AvatarGroup overlap='-ml-3'>\n {reviewers.map(reviewer => (\n <Avatar\n key={reviewer.id}\n className='ring-background bg-muted size-10 ring-2'\n >\n <AvatarImage\n src={reviewer.avatarUrl || undefined}\n alt={reviewer.alt ?? `User ${reviewer.id}`}\n />\n <AvatarFallback className='text-xs'>{reviewer.fallback}</AvatarFallback>\n </Avatar>\n ))}\n <div className='border-background bg-accent relative -ms-1.5 flex size-10 items-center justify-center rounded-full border-2'>\n <span className='text-xs font-medium'>+{reviewers.length}</span>\n </div>\n </AvatarGroup>\n )}\n\n {(rating || trustedBy) && (\n <div className='flex flex-col gap-0.5'>\n {rating && (\n <div className='flex items-center justify-center gap-1 lg:justify-start'>\n {Array.from({ length: 5 }).map((_, i) => (\n <Star\n key={i}\n className={`size-4 ${i < Math.round(rating.value) ? 'fill-foreground' : ''}`}\n />\n ))}\n <span className='ms-2 text-sm font-medium'>({rating.count})</span>\n </div>\n )}\n {trustedBy && <p className='text-muted-foreground text-sm'>{trustedBy}</p>}\n </div>\n )}\n </div>\n )}\n </div>\n\n {image && (\n <div className='aspect-[4/3] overflow-hidden rounded-xl border'>\n <img\n src={image.src || undefined}\n alt={image.alt}\n className='size-full object-cover'\n width={800}\n height={600}\n />\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport default HeroSection1","import { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { ArrowRight, Phone, Radio } from 'lucide-react'\nimport type { CTA } from '../../../lib/types'\n\nexport interface CtaSection1Props {\n badgeText?: string\n title?: string\n description?: string\n primaryCta?: CTA\n secondaryCta?: CTA\n onPrimaryClick?: () => void\n onSecondaryClick?: () => void\n}\n\nconst HEADING_ID = 'cta-section-1-heading'\n\nexport function CtaSection1({\n badgeText,\n title,\n description,\n primaryCta,\n secondaryCta,\n onPrimaryClick,\n onSecondaryClick,\n}: CtaSection1Props) {\n return (\n <section\n className='bg-background relative w-full overflow-hidden py-24'\n aria-labelledby={title ? HEADING_ID : undefined}\n >\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='relative mx-auto max-w-4xl text-center'>\n {badgeText && (\n <Badge\n variant='secondary'\n className='mb-6 h-auto rounded-md px-2.5 py-0.5 text-sm font-medium'\n >\n <Radio className='!size-5' aria-hidden='true' />\n {badgeText}\n </Badge>\n )}\n\n {title && (\n <h1\n id={HEADING_ID}\n className='mb-6 text-4xl font-bold tracking-tight text-balance sm:text-5xl lg:text-6xl'\n >\n {title}\n </h1>\n )}\n\n {description && (\n <p className='text-muted-foreground mx-auto mb-10 max-w-2xl text-lg text-balance'>\n {description}\n </p>\n )}\n\n {(primaryCta || secondaryCta) && (\n <div className='flex flex-wrap items-center justify-center gap-4'>\n {primaryCta &&\n (primaryCta.href ? (\n <Button asChild size='lg' className='h-10 cursor-pointer px-6 w-fit'>\n <a href={primaryCta.href}>\n {primaryCta.label}\n <ArrowRight />\n </a>\n </Button>\n ) : (\n <Button\n size='lg'\n className='h-10 cursor-pointer px-6 w-fit'\n onClick={onPrimaryClick}\n >\n {primaryCta.label}\n <ArrowRight />\n </Button>\n ))}\n\n {secondaryCta &&\n (secondaryCta.href ? (\n <Button\n asChild\n variant='outline'\n size='lg'\n className='h-10 cursor-pointer px-6 w-fit'\n >\n <a href={secondaryCta.href}>\n <Phone />\n {secondaryCta.label}\n </a>\n </Button>\n ) : (\n <Button\n variant='outline'\n size='lg'\n className='h-10 cursor-pointer px-6 w-fit'\n onClick={onSecondaryClick}\n >\n <Phone />\n {secondaryCta.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport default CtaSection1","import { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { ArrowRight } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\nexport interface Feature1Item {\n id: string\n title: string\n description: string\n icon: LucideIcon\n}\n\nexport interface Feature1Props {\n items: Feature1Item[]\n badge?: string\n title?: string\n description?: string\n learnMoreLabel?: string\n ctaLabel?: string\n onCtaClick?: () => void\n onLearnMore?: (item: Feature1Item) => void\n}\n\nexport function Feature1({\n items,\n badge,\n title,\n description,\n learnMoreLabel,\n ctaLabel,\n onCtaClick,\n onLearnMore,\n}: Feature1Props) {\n return (\n <section className='mx-auto w-full max-w-7xl px-4 py-12 sm:px-6 md:py-16 lg:px-8'>\n {(badge || title || description) && (\n <header className='mx-auto mb-12 max-w-2xl text-center'>\n {badge && (\n <Badge variant='secondary' className='h-auto mb-4 rounded-full px-4 py-1 font-medium'>\n {badge}\n </Badge>\n )}\n {title && (\n <h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>{title}</h2>\n )}\n {description && (\n <p className='text-muted-foreground text-pretty'>{description}</p>\n )}\n </header>\n )}\n\n <div className='grid gap-4 sm:grid-cols-2 sm:gap-6 md:grid-cols-3'>\n {items.map(feature => (\n <article key={feature.id} className='group'>\n <Card className='relative h-full overflow-hidden transition-all hover:shadow-md'>\n <CardContent className='px-6'>\n <div className='bg-secondary text-secondary-foreground mb-4 inline-flex size-12 items-center justify-center rounded-xl'>\n <feature.icon className='size-5' aria-hidden='true' />\n </div>\n <h3 className='mb-2 text-lg font-semibold'>{feature.title}</h3>\n <p className='text-muted-foreground mb-4 text-sm'>{feature.description}</p>\n\n {learnMoreLabel && (\n <Button\n variant='link'\n size='sm'\n className='h-8 px-3 text-xs text-muted-foreground hover:text-foreground h-auto cursor-pointer !p-0 text-sm'\n onClick={onLearnMore ? () => onLearnMore(feature) : undefined}\n >\n {learnMoreLabel}\n <ArrowRight />\n </Button>\n )}\n </CardContent>\n </Card>\n </article>\n ))}\n </div>\n\n {ctaLabel && (\n <div className='mt-12 text-center'>\n <Button\n size='lg'\n className='h-10 cursor-pointer rounded-lg !px-8'\n onClick={onCtaClick}\n >\n {ctaLabel}\n <ArrowRight />\n </Button>\n </div>\n )}\n </section>\n )\n}\n\nexport default Feature1","import { cn } from '../../../lib/utils'\nimport type { LucideIcon } from 'lucide-react'\n\nexport interface Feature2Item {\n id: string\n title: string\n description: string\n icon: LucideIcon\n}\n\nexport interface Feature2Props {\n items: Feature2Item[]\n title?: string\n description?: string\n image?: { src: string; alt: string }\n className?: string\n}\n\nexport function Feature2({\n items,\n title,\n description,\n image,\n className,\n}: Feature2Props) {\n return (\n <section\n className={cn('mx-auto w-full max-w-7xl px-4 py-12 sm:px-6 md:py-16 lg:px-8', className)}\n >\n <div className='grid gap-12 lg:grid-cols-2 lg:gap-16'>\n <div className='flex flex-col gap-10'>\n {(title || description) && (\n <header className='flex flex-col gap-4'>\n {title && (\n <h2 className='text-3xl font-bold tracking-tight text-balance sm:text-4xl lg:text-5xl'>\n {title}\n </h2>\n )}\n {description && (\n <p className='text-muted-foreground text-base text-pretty md:text-lg'>\n {description}\n </p>\n )}\n </header>\n )}\n\n <div className='grid gap-6 sm:grid-cols-2 sm:gap-8'>\n {items.map(item => (\n <div key={item.id} className='group flex flex-col items-start gap-3 rounded-lg'>\n <div className='bg-secondary text-secondary-foreground inline-flex size-10 items-center justify-center rounded-full'>\n <item.icon className='size-5' aria-hidden='true' />\n </div>\n <div className='flex flex-col gap-1.5'>\n <h3 className='text-foreground text-base font-semibold md:text-lg'>{item.title}</h3>\n <p className='text-muted-foreground text-sm text-balance'>{item.description}</p>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {image && (\n <div className='relative'>\n <div className='bg-muted relative z-10 overflow-hidden rounded-lg shadow-sm transition-all duration-300 hover:shadow-md'>\n <div className='aspect-[4/3] w-full'>\n <img\n src={image.src || undefined}\n alt={image.alt}\n className='size-full object-cover grayscale'\n loading='lazy'\n decoding='async'\n />\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n )\n}\n\nexport default Feature2","'use client'\n\nimport * as React from 'react'\nimport { Star } from 'lucide-react'\nimport { cn } from '../../../lib/utils'\nimport { Card, CardContent, CardHeader, CardFooter, CardTitle } from '../../../ui/card'\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n type CarouselApi,\n} from '../../../ui/carousel'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Button } from '../../../ui/button'\n\nexport interface Testimonial1Item {\n id: string\n name: string\n role: string\n avatar: string\n content: string\n rating: number\n}\n\nexport interface Testimonial1Props {\n items: Testimonial1Item[]\n title?: string\n prevLabel?: string\n nextLabel?: string\n slideAriaLabel?: string\n}\n\nfunction RatingStars({ rating }: { rating: number }) {\n return (\n <div className='flex items-center gap-1'>\n {[...Array(5)].map((_, index) => (\n <Star\n key={index}\n className={cn('size-4', index < Math.floor(rating) ? 'fill-foreground' : 'fill-none')}\n />\n ))}\n <span className='text-muted-foreground ms-2 text-sm'>({rating})</span>\n </div>\n )\n}\n\nexport function Testimonial1({\n items,\n title = 'Lo que dicen nuestros clientes',\n prevLabel = 'Anterior',\n nextLabel = 'Siguiente',\n slideAriaLabel = 'Ir a la diapositiva {n}',\n}: Testimonial1Props) {\n const [api, setApi] = React.useState<CarouselApi | null>(null)\n const [current, setCurrent] = React.useState(0)\n\n React.useEffect(() => {\n if (!api) return\n\n const onSelect = () => {\n setCurrent(api.selectedScrollSnap())\n }\n\n api.on('select', onSelect)\n return () => {\n api.off('select', onSelect)\n }\n }, [api])\n\n return (\n <section className='py-12 lg:py-20'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <header className='mb-16 text-center'>\n <h2 className='text-3xl font-bold text-balance md:text-4xl'>{title}</h2>\n </header>\n\n <Carousel className='w-full' setApi={setApi} opts={{ align: 'start', loop: true }}>\n <CarouselContent className='-ml-1'>\n {items.map(testimonial => (\n <CarouselItem\n key={testimonial.id}\n className='basis-full px-4 last:pe-0 sm:basis-1/2 lg:basis-1/3'\n >\n <Card className='h-full overflow-hidden border border-border py-6'>\n <CardHeader className='gap-0 px-6'>\n <div className='flex items-center gap-4'>\n <Avatar className='bg-muted size-12'>\n <AvatarImage src={testimonial.avatar || undefined} alt={testimonial.name} className='size-12' />\n <AvatarFallback className='bg-card'>{testimonial.name[0]}</AvatarFallback>\n </Avatar>\n <div>\n <CardTitle className='text-foreground font-semibold'>{testimonial.name}</CardTitle>\n <p className='text-muted-foreground text-sm'>{testimonial.role}</p>\n </div>\n </div>\n </CardHeader>\n <CardContent className='px-6'>\n <p className='text-muted-foreground text-base'>{testimonial.content}</p>\n </CardContent>\n <CardFooter className='bg-transparent border-t-0 px-6 pb-6'>\n <RatingStars rating={testimonial.rating} />\n </CardFooter>\n </Card>\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious\n variant='outline'\n className='hidden cursor-pointer lg:flex'\n aria-label={prevLabel}\n />\n <CarouselNext\n variant='outline'\n className='hidden cursor-pointer lg:flex'\n aria-label={nextLabel}\n />\n <div className='mt-8 flex items-center justify-center gap-2'>\n {items.map((_, index) => (\n <Button\n variant='ghost'\n key={index}\n onClick={() => api?.scrollTo(index)}\n className={cn(\n 'h-9 px-4 py-2',\n 'size-2 cursor-pointer rounded-full !p-0 transition-all',\n current === index ? 'bg-foreground w-6' : 'bg-muted',\n )}\n aria-label={slideAriaLabel.replace('{n}', String(index + 1))}\n aria-current={current === index ? 'true' : 'false'}\n />\n ))}\n </div>\n </Carousel>\n </div>\n </section>\n )\n}\n\nexport default Testimonial1","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\n\nimport { Button } from \"@/ui/button\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nfunction Carousel({\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) return\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) return\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<\"div\">) {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div\n ref={carouselRef}\n className=\"overflow-hidden\"\n data-slot=\"carousel-content\"\n >\n <div\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel()\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -left-12 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n}\n\nfunction CarouselNext({\n className,\n variant = \"outline\",\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n \"absolute size-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"top-1/2 -right-12 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n}\n","import { Quote } from 'lucide-react'\nimport { Card, CardContent, CardHeader } from '../../../ui/card'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\n\nexport interface Testimonial2Item {\n id: string\n name: string\n role: string\n avatar: string\n content: string\n}\n\nexport interface Testimonial2Props {\n items: Testimonial2Item[]\n title?: string\n description?: string\n}\n\nconst bentoGridClasses = [\n 'grid grid-rows-[auto_1fr] gap-8 ring-1 ring-foreground/10 sm:p-6 md:col-span-2 lg:col-span-2 lg:row-span-2 shadow-sm',\n 'ring-1 ring-foreground/10 md:col-span-2 lg:col-span-2 py-6 shadow-sm',\n 'pt-0 ring-1 ring-foreground/10 lg:col-span-1 shadow-sm',\n 'pt-0 ring-1 ring-foreground/10 lg:col-span-1 shadow-sm',\n]\n\nconst contentClasses = [\n '',\n 'h-full px-6',\n 'h-full pt-6 px-6',\n 'h-full pt-6 px-6',\n]\n\nconst textClasses = [\n 'text-xl text-balance',\n 'text-base text-balance',\n 'text-base text-balance',\n 'text-base text-balance',\n]\n\nfunction initials(name: string) {\n return name\n .split(' ')\n .map(n => n[0])\n .join('')\n}\n\nexport function Testimonial2({\n items,\n title = 'Con la confianza de quienes construyen',\n description,\n}: Testimonial2Props) {\n /** El diseño bento consume exactamente 4 tarjetas: la primera ocupa la celda\n * grande (lg:row-span-2) y las tres restantes completan la cuadrícula. */\n const bentoItems = items.slice(0, 4)\n\n return (\n <section className='py-12 md:py-16'>\n <div className='mx-auto w-full max-w-7xl flex flex-col gap-8 px-4 sm:px-6 lg:px-8 md:gap-16'>\n <div className='relative z-10 mx-auto max-w-4xl flex flex-col gap-6 text-center md:gap-12'>\n <h2 className='text-4xl font-medium max-lg:text-balance lg:text-5xl'>{title}</h2>\n {description && (\n <p className='text-muted-foreground mx-auto max-w-2xl max-lg:text-balance'>\n {description}\n </p>\n )}\n </div>\n\n <div className='grid gap-4 md:grid-cols-2 lg:grid-cols-4 lg:grid-rows-2'>\n {bentoItems.map((testimonial, index) => (\n <Card key={testimonial.id} className={bentoGridClasses[index]}>\n {index === 0 && (\n <CardHeader className='pb-6'>\n <div className='flex items-center justify-start'>\n <Quote className='text-muted-foreground/30 size-16 rotate-180' />\n </div>\n </CardHeader>\n )}\n <CardContent className={contentClasses[index]}>\n <blockquote className='grid h-full grid-rows-[1fr_auto] gap-6'>\n <p className={textClasses[index]}>{testimonial.content}</p>\n\n <div className='grid grid-cols-[auto_1fr] items-center gap-3'>\n <Avatar className='bg-muted size-12'>\n <AvatarImage\n src={testimonial.avatar || undefined}\n alt={testimonial.name}\n height='400'\n width='400'\n loading='lazy'\n />\n <AvatarFallback>{initials(testimonial.name)}</AvatarFallback>\n </Avatar>\n <div>\n <cite className='text-sm font-medium not-italic'>{testimonial.name}</cite>\n <span className='text-muted-foreground block text-sm'>{testimonial.role}</span>\n </div>\n </div>\n </blockquote>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport default Testimonial2","import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../../../ui/accordion'\n\nexport interface FaqItem {\n value: string\n question: string\n answer: string\n}\n\nexport interface FaqBlock1Props {\n /** Preguntas y respuestas del bloque. Cada item necesita un `value` único. */\n items: FaqItem[]\n title?: string\n description?: string\n /** Permite abrir varios items a la vez (`'multiple'`) o solo uno (`'single'`). */\n accordionType?: 'single' | 'multiple'\n}\n\nexport function FaqBlock1({\n items,\n title = 'Preguntas frecuentes',\n description,\n accordionType = 'multiple',\n}: FaqBlock1Props) {\n return (\n <div className='w-full py-16'>\n <div className='mx-auto w-full max-w-4xl px-4 sm:px-6 lg:px-8'>\n <div className='mb-12 text-center'>\n <h2 className='mb-4 text-4xl font-bold'>{title}</h2>\n {description && <p className='text-muted-foreground'>{description}</p>}\n </div>\n\n <Accordion type={accordionType} className='flex flex-col gap-4'>\n {items.map(item => (\n <AccordionItem key={item.value} value={item.value} className='rounded-md !border'>\n <AccordionTrigger className='cursor-pointer px-4 py-4'>{item.question}</AccordionTrigger>\n <AccordionContent className='text-muted-foreground px-4'>{item.answer}</AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n </div>\n )\n}\n\nexport default FaqBlock1","import { ArrowRight, Check } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport { Badge } from '../../../ui/badge'\n\nexport interface PricingTier {\n id: string\n name: string\n description: string\n /** Precio sin símbolo de moneda; el símbolo se pasa aparte en `currencySymbol`. */\n price: string\n /** Frecuencia de facturación, p. ej. '/mes'. */\n frequency: string\n features: string[]\n popular?: boolean\n}\n\nexport interface PricingSection1Props {\n tiers: PricingTier[]\n currencySymbol?: string\n sectionTitle?: string\n sectionLabel?: string\n popularBadgeLabel?: string\n getStartedLabel?: string\n onSelectTier?: (tier: PricingTier) => void\n}\n\nexport function PricingSection1({\n tiers,\n currencySymbol = '$',\n sectionTitle = 'El plan perfecto para tu negocio',\n sectionLabel = 'Nuestros precios',\n popularBadgeLabel = 'Popular',\n getStartedLabel = 'Empezar',\n onSelectTier,\n}: PricingSection1Props) {\n return (\n <section className='py-16' id='pricing'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <header className='mb-12 text-center'>\n <p className='text-muted-foreground mb-2 text-sm font-medium'>{sectionLabel}</p>\n <h2 className='text-3xl font-bold text-balance lg:text-5xl'>{sectionTitle}</h2>\n </header>\n\n <div className='grid gap-6 lg:grid-cols-3 lg:gap-8'>\n {tiers.map(tier => (\n <Card key={tier.id} className={cn('overflow-hidden py-6', { 'shadow-lg': tier.popular })}>\n <CardHeader className='px-6'>\n <div className='flex items-center justify-between gap-4'>\n <CardTitle className='text-xl font-bold lg:text-2xl'>{tier.name}</CardTitle>\n {tier.popular && (\n <Badge className='px-2.5 py-0.5 font-semibold rounded-full'>{popularBadgeLabel}</Badge>\n )}\n </div>\n <p className='text-muted-foreground text-sm'>{tier.description}</p>\n </CardHeader>\n <CardContent className='flex flex-col flex-1 px-6'>\n <div className='mb-6 flex items-baseline gap-2'>\n <span className='text-3xl font-bold lg:text-5xl'>\n {currencySymbol}\n {tier.price}\n </span>\n <span className='text-muted-foreground text-sm'>{tier.frequency}</span>\n </div>\n <ul className='flex flex-col gap-3'>\n {tier.features.map(feature => (\n <li key={feature} className='flex items-center gap-2'>\n <Check className='size-4 shrink-0' />\n <span className='text-muted-foreground text-sm'>{feature}</span>\n </li>\n ))}\n </ul>\n </CardContent>\n <CardFooter className='border-0 bg-transparent px-6 pb-6'>\n <Button\n className='h-10 px-8 w-full cursor-pointer gap-2'\n size='lg'\n variant={tier.popular ? 'default' : 'outline'}\n aria-label={`${getStartedLabel} con ${tier.name}`}\n onClick={onSelectTier ? () => onSelectTier(tier) : undefined}\n >\n {getStartedLabel} <ArrowRight />\n </Button>\n </CardFooter>\n </Card>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport default PricingSection1","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Progress as ProgressPrimitive } from \"radix-ui\"\n\nfunction Progress({\n className,\n value,\n ...props\n}: React.ComponentProps<typeof ProgressPrimitive.Root>) {\n return (\n <ProgressPrimitive.Root\n data-slot=\"progress\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n )\n}\n\nexport { Progress }\n","import { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Badge } from '../../../ui/badge'\nimport { Progress } from '../../../ui/progress'\nimport { BarChart3 } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\nexport interface StatisticItem {\n id: string\n title: string\n value: string\n description: string\n progress: number\n progressLabel: string\n icon: LucideIcon\n}\n\nexport interface Statistic1Props {\n items: StatisticItem[]\n badge?: string\n title?: string\n description?: string\n}\n\nexport function Statistic1({ items, badge, title, description }: Statistic1Props) {\n return (\n <section className='py-16 md:py-20'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='flex flex-col gap-16'>\n {(badge || title || description) && (\n <div className='flex flex-col gap-6 text-center'>\n {badge && (\n <Badge\n variant='outline'\n className='h-auto [&>svg]:size-4! rounded-md inline-flex items-center gap-2 px-4 py-2 text-sm font-medium self-center'\n >\n <BarChart3 />\n {badge}\n </Badge>\n )}\n {title && (\n <h2 className='text-4xl font-bold tracking-tight text-balance lg:text-5xl'>\n {title}\n </h2>\n )}\n {description && (\n <p className='text-muted-foreground mx-auto max-w-2xl text-lg leading-relaxed'>\n {description}\n </p>\n )}\n </div>\n )}\n\n <div className='grid gap-6 sm:grid-cols-2 md:grid-cols-3'>\n {items.map(item => (\n <Card\n key={item.id}\n className='group relative gap-2 overflow-hidden py-6 transition-all duration-300 hover:shadow-lg'\n >\n <CardHeader className='px-6'>\n <div className='flex items-start justify-between'>\n <div className='flex-1'>\n <CardTitle className='text-muted-foreground text-sm font-medium text-balance'>\n {item.title}\n </CardTitle>\n <div className='mt-2'>\n <div className='text-2xl font-bold'>{item.value}</div>\n </div>\n </div>\n <div className='bg-muted rounded-xl p-3'>\n <item.icon className='text-muted-foreground size-6' />\n </div>\n </div>\n <p className='text-muted-foreground mt-1 text-xs'>{item.description}</p>\n </CardHeader>\n <CardContent className='pt-0 px-6'>\n <div className='flex flex-col gap-2'>\n <div className='flex items-center justify-between text-xs'>\n <span className='text-muted-foreground'>{item.progressLabel}</span>\n <span className='font-medium'>{item.progress}%</span>\n </div>\n <Progress value={item.progress} className='h-2' />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport default Statistic1","import { Sparkles } from 'lucide-react'\n\nimport { LogoCloud1LogoIcon } from './logo-cloud-1-logo-icon'\n\nexport interface LogoCloud1Platform {\n name: string\n id: string\n}\n\nexport interface LogoCloud1Props {\n platforms: LogoCloud1Platform[]\n title?: string\n description?: string\n moreLabel?: string\n}\n\nexport function LogoCloud1({ platforms, title, description, moreLabel }: LogoCloud1Props) {\n return (\n <section className='relative w-full py-12 md:py-16'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='mx-auto max-w-7xl'>\n {(title || description) && (\n <div className='mb-12 flex flex-col gap-4 text-center'>\n {title && (\n <div className='flex items-center justify-center gap-2'>\n <Sparkles className='text-primary size-5' aria-hidden='true' />\n <span className='text-primary text-sm font-medium'>{title}</span>\n </div>\n )}\n {description && <p className='text-muted-foreground'>{description}</p>}\n </div>\n )}\n\n <div className='relative overflow-hidden'>\n <div className='flex flex-wrap items-center justify-center gap-8 md:gap-12'>\n {platforms.map(platform => (\n <div key={platform.id} className='flex items-center gap-2 opacity-85'>\n <LogoCloud1LogoIcon iconSlug={platform.id} size={22} />\n <span className='text-md font-medium'>{platform.name}</span>\n </div>\n ))}\n </div>\n </div>\n\n {moreLabel && (\n <div className='mt-12 text-center'>\n <p className='text-muted-foreground text-sm'>{moreLabel}</p>\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport default LogoCloud1","import { cn } from \"cn\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-accent\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","import { Skeleton } from '../../../ui/skeleton'\nimport { cn } from '../../../lib/utils'\n\nconst iconMap = {\n nextdotjs:\n 'M18.665 21.978C16.758 23.255 14.465 24 12 24 5.377 24 0 18.623 0 12S5.377 0 12 0s12 5.377 12 12c0 3.583-1.574 6.801-4.067 9.001L9.219 7.2H7.2v9.596h1.615V9.251l9.85 12.727Zm-3.332-8.533 1.6 2.061V7.2h-1.6v6.245Z',\n typescript:\n 'M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75c.612 0 1.154.037 1.627.111a6.38 6.38 0 0 1 1.306.34v2.458a3.95 3.95 0 0 0-.643-.361 5.093 5.093 0 0 0-.717-.26 5.453 5.453 0 0 0-1.426-.2c-.3 0-.573.028-.819.086a2.1 2.1 0 0 0-.623.242c-.17.104-.3.229-.393.374a.888.888 0 0 0-.14.49c0 .196.053.373.156.529.104.156.252.304.443.444s.423.276.696.41c.273.135.582.274.926.416.47.197.892.407 1.266.628.374.222.695.473.963.753.268.279.472.598.614.957.142.359.214.776.214 1.253 0 .657-.125 1.21-.373 1.656a3.033 3.033 0 0 1-1.012 1.085 4.38 4.38 0 0 1-1.487.596c-.566.12-1.163.18-1.79.18a9.916 9.916 0 0 1-1.84-.164 5.544 5.544 0 0 1-1.512-.493v-2.63a5.033 5.033 0 0 0 3.237 1.2c.333 0 .624-.03.872-.09.249-.06.456-.144.623-.25.166-.108.29-.234.373-.38a1.023 1.023 0 0 0-.074-1.089 2.12 2.12 0 0 0-.537-.5 5.597 5.597 0 0 0-.807-.444 27.72 27.72 0 0 0-1.007-.436c-.918-.383-1.602-.852-2.053-1.405-.45-.553-.676-1.222-.676-2.005 0-.614.123-1.141.369-1.582.246-.441.58-.804 1.004-1.089a4.494 4.494 0 0 1 1.47-.629 7.536 7.536 0 0 1 1.77-.201zm-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z',\n tailwindcss:\n 'M12.001,4.8c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 C13.666,10.618,15.027,12,18.001,12c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C16.337,6.182,14.976,4.8,12.001,4.8z M6.001,12c-3.2,0-5.2,1.6-6,4.8c1.2-1.6,2.6-2.2,4.2-1.8c0.913,0.228,1.565,0.89,2.288,1.624 c1.177,1.194,2.538,2.576,5.512,2.576c3.2,0,5.2-1.6,6-4.8c-1.2,1.6-2.6,2.2-4.2,1.8c-0.913-0.228-1.565-0.89-2.288-1.624 C10.337,13.382,8.976,12,6.001,12z',\n react:\n 'M14.23 12.004a2.236 2.236 0 0 1-2.235 2.236 2.236 2.236 0 0 1-2.236-2.236 2.236 2.236 0 0 1 2.235-2.236 2.236 2.236 0 0 1 2.236 2.236zm2.648-10.69c-1.346 0-3.107.96-4.888 2.622-1.78-1.653-3.542-2.602-4.887-2.602-.41 0-.783.093-1.106.278-1.375.793-1.683 3.264-.973 6.365C1.98 8.917 0 10.42 0 12.004c0 1.59 1.99 3.097 5.043 4.03-.704 3.113-.39 5.588.988 6.38.32.187.69.275 1.102.275 1.345 0 3.107-.96 4.888-2.624 1.78 1.654 3.542 2.603 4.887 2.603.41 0 .783-.09 1.106-.275 1.374-.792 1.683-3.263.973-6.365C22.02 15.096 24 13.59 24 12.004c0-1.59-1.99-3.097-5.043-4.032.704-3.11.39-5.587-.988-6.38-.318-.184-.688-.277-1.092-.278zm-.005 1.09v.006c.225 0 .406.044.558.127.666.382.955 1.835.73 3.704-.054.46-.142.945-.25 1.44-.96-.236-2.006-.417-3.107-.534-.66-.905-1.345-1.727-2.035-2.447 1.592-1.48 3.087-2.292 4.105-2.295zm-9.77.02c1.012 0 2.514.808 4.11 2.28-.686.72-1.37 1.537-2.02 2.442-1.107.117-2.154.298-3.113.538-.112-.49-.195-.964-.254-1.42-.23-1.868.054-3.32.714-3.707.19-.09.4-.127.563-.132zm4.882 3.05c.455.468.91.992 1.36 1.564-.44-.02-.89-.034-1.345-.034-.46 0-.915.01-1.36.034.44-.572.895-1.096 1.345-1.565zM12 8.1c.74 0 1.477.034 2.202.093.406.582.802 1.203 1.183 1.86.372.64.71 1.29 1.018 1.946-.308.655-.646 1.31-1.013 1.95-.38.66-.773 1.288-1.18 1.87-.728.063-1.466.098-2.21.098-.74 0-1.477-.035-2.202-.093-.406-.582-.802-1.204-1.183-1.86-.372-.64-.71-1.29-1.018-1.946.303-.657.646-1.313 1.013-1.954.38-.66.773-1.286 1.18-1.868.728-.064 1.466-.098 2.21-.098zm-3.635.254c-.24.377-.48.763-.704 1.16-.225.39-.435.782-.635 1.174-.265-.656-.49-1.31-.676-1.947.64-.15 1.315-.283 2.015-.386zm7.26 0c.695.103 1.365.23 2.006.387-.18.632-.405 1.282-.66 1.933-.2-.39-.41-.783-.64-1.174-.225-.392-.465-.774-.705-1.146zm3.063.675c.484.15.944.317 1.375.498 1.732.74 2.852 1.708 2.852 2.476-.005.768-1.125 1.74-2.857 2.475-.42.18-.88.342-1.355.493-.28-.958-.646-1.956-1.1-2.98.45-1.017.81-2.01 1.085-2.964zm-13.395.004c.278.96.645 1.957 1.1 2.98-.45 1.017-.812 2.01-1.086 2.964-.484-.15-.944-.318-1.37-.5-1.732-.737-2.852-1.706-2.852-2.474 0-.768 1.12-1.742 2.852-2.476.42-.18.88-.342 1.356-.494zm11.678 4.28c.265.657.49 1.312.676 1.948-.64.157-1.316.29-2.016.39.24-.375.48-.762.705-1.158.225-.39.435-.788.636-1.18zm-9.945.02c.2.392.41.783.64 1.175.23.39.465.772.705 1.143-.695-.102-1.365-.23-2.006-.386.18-.63.406-1.282.66-1.933zM17.92 16.32c.112.493.2.968.254 1.423.23 1.868-.054 3.32-.714 3.708-.147.09-.338.128-.563.128-1.012 0-2.514-.807-4.11-2.28.686-.72 1.37-1.536 2.02-2.44 1.107-.118 2.154-.3 3.113-.54zm-11.83.01c.96.234 2.006.415 3.107.532.66.905 1.345 1.727 2.035 2.446-1.595 1.483-3.092 2.295-4.11 2.295-.22-.005-.406-.05-.553-.132-.666-.38-.955-1.834-.73-3.703.054-.46.142-.944.25-1.438zm4.56.64c.44.02.89.034 1.345.034.46 0 .915-.01 1.36-.034-.44.572-.895 1.095-1.345 1.565-.455-.47-.91-.993-1.36-1.565z',\n prisma:\n 'M21.8068 18.2848L13.5528.7565c-.207-.4382-.639-.7273-1.1286-.7541-.5023-.0293-.9523.213-1.2062.6253L2.266 15.1271c-.2773.4518-.2718 1.0091.0158 1.4555l4.3759 6.7786c.2608.4046.7127.6388 1.1823.6388.1332 0 .267-.0188.3987-.0577l12.7019-3.7568c.3891-.1151.7072-.3904.8737-.7553s.1633-.7828-.0075-1.1454zm-1.8481.7519L9.1814 22.2242c-.3292.0975-.6448-.1873-.5756-.5194l3.8501-18.4386c.072-.3448.5486-.3996.699-.0803l7.1288 15.138c.1344.2856-.019.6224-.325.7128z',\n github:\n 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12',\n vercel: 'm12 1.608 12 20.784H0Z',\n stripe:\n 'M13.976 9.15c-2.172-.806-3.356-1.426-3.356-2.409 0-.831.683-1.305 1.901-1.305 2.227 0 4.515.858 6.09 1.631l.89-5.494C18.252.975 15.697 0 12.165 0 9.667 0 7.589.654 6.104 1.872 4.56 3.147 3.757 4.992 3.757 7.218c0 4.039 2.467 5.76 6.476 7.219 2.585.92 3.445 1.574 3.445 2.583 0 .98-.84 1.545-2.354 1.545-1.875 0-4.965-.921-6.99-2.109l-.9 5.555C5.175 22.99 8.385 24 11.714 24c2.641 0 4.843-.624 6.328-1.813 1.664-1.305 2.525-3.236 2.525-5.732 0-4.128-2.524-5.851-6.594-7.305h.003z',\n figma:\n 'M15.852 8.981h-4.588V0h4.588c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.491-4.49 4.491zM12.735 7.51h3.117c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-3.117V7.51zm0 1.471H8.148c-2.476 0-4.49-2.014-4.49-4.49S5.672 0 8.148 0h4.588v8.981zm-4.587-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.354 3.02 3.019 3.02h3.117V1.471H8.148zm4.587 15.019H8.148c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.98zM8.148 8.981c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V8.981H8.148zM8.172 24c-2.489 0-4.515-2.014-4.515-4.49s2.014-4.49 4.49-4.49h4.588v4.441c0 2.503-2.047 4.539-4.563 4.539zm-.024-7.51a3.023 3.023 0 0 0-3.019 3.019c0 1.665 1.365 3.019 3.044 3.019 1.705 0 3.093-1.376 3.093-3.068v-2.97H8.148zm7.704 0h-.098c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h.098c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.49-4.49 4.49zm-.097-7.509c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h.098c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-.098z',\n} as const\n\nexport type LogoCloud1LogoSlug = keyof typeof iconMap\n\nexport function LogoCloud1LogoIcon({\n iconSlug,\n size = 24,\n className,\n}: {\n iconSlug: string\n size?: number\n className?: string\n}) {\n const iconPath = iconMap[iconSlug as LogoCloud1LogoSlug]\n\n if (!iconPath) {\n return <Skeleton className={cn('rounded-sm', className)} style={{ width: size, height: size }} />\n }\n\n return (\n <svg\n role='img'\n viewBox='0 0 24 24'\n className={cn('fill-foreground', className)}\n style={{ width: size, height: size }}\n aria-hidden='true'\n >\n <path d={iconPath} />\n </svg>\n )\n}\n","'use client'\n\nimport { Input } from '../../../ui/input'\nimport { Button } from '../../../ui/button'\nimport { ArrowRight } from 'lucide-react'\nimport { cn } from '../../../lib/utils'\n\nexport interface FooterLink {\n label: string\n href?: string\n}\n\nexport interface FooterLinkColumn {\n title: string\n links: FooterLink[]\n}\n\nexport interface FooterNewsletter {\n placeholder?: string\n buttonLabel: string\n /**\n * Submit handler. The interactive form (input + submit button) renders only\n * when this is supplied. A newsletter without `onSubmit` renders no form,\n * input, or button — never a fake form.\n */\n onSubmit?: (email: string) => void\n}\n\nexport interface BrandAccent {\n /** Trailing segment of `brandName` to render with the accent styling. */\n text: string\n /** Consumer-supplied classes for the accent span (e.g. a brand color token). */\n className?: string\n}\n\nexport interface FooterSection1Props {\n brandName: string\n /**\n * Optional accent for a trailing segment of `brandName` (e.g. the \"Cuba\" in\n * \"ElectroCuba\"). When omitted, or when `text` is not a trailing segment of\n * `brandName`, the brand name renders unchanged.\n */\n brandAccent?: BrandAccent\n brandDescription?: string\n linkColumns: FooterLinkColumn[]\n newsletter?: FooterNewsletter\n /**\n * Consumer-supplied classes merged onto the outer `<footer>` as the final\n * argument, so a semantic surface such as `bg-brand-nav\n * text-brand-nav-foreground` overrides the default `bg-secondary`. Purely\n * presentational: no layout, structure, or behavior changes.\n */\n className?: string\n}\n\nexport function FooterSection1({\n brandName,\n brandAccent,\n brandDescription,\n linkColumns,\n newsletter,\n className,\n}: FooterSection1Props) {\n const accentText = brandAccent?.text ?? ''\n const hasAccent = accentText.length > 0 && brandName.endsWith(accentText)\n const baseName = hasAccent ? brandName.slice(0, brandName.length - accentText.length) : brandName\n const newsletterSubmit = newsletter?.onSubmit\n\n return (\n <footer\n className={cn('bg-secondary w-full py-16', className)}\n aria-label='Pie de página'\n >\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-8 lg:grid-cols-12'>\n {/* Left Section */}\n <div className='me-8 md:col-span-5'>\n <div className='mb-6 flex items-center gap-2'>\n <svg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n <span className='text-xl font-semibold'>\n {baseName}\n {hasAccent ? <span className={brandAccent?.className}>{accentText}</span> : null}\n </span>\n </div>\n {brandDescription && (\n <p className='text-muted-foreground mb-8 max-w-sm text-sm leading-relaxed text-balance'>\n {brandDescription}\n </p>\n )}\n {newsletter && newsletterSubmit ? (\n <form\n className='relative'\n onSubmit={e => {\n e.preventDefault()\n const email = new FormData(e.currentTarget).get('email')\n if (typeof email === 'string') {\n newsletterSubmit(email)\n }\n }}\n >\n <Input\n type='email'\n name='email'\n placeholder={newsletter.placeholder}\n className='border-muted-foreground/20 bg-background/80 h-12 pe-32'\n aria-label='Correo electrónico'\n />\n <Button\n type='submit'\n variant='default'\n className='absolute end-1 top-1 h-10 cursor-pointer px-4'\n aria-label='Suscribirse a la newsletter'\n >\n {newsletter.buttonLabel}\n <ArrowRight />\n </Button>\n </form>\n ) : null}\n </div>\n\n {/* Right Section */}\n <div className='md:col-span-7'>\n <div className='grid grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3'>\n {linkColumns.map(column => (\n <div key={column.title}>\n <h3 className='mb-4 text-lg font-medium'>{column.title}</h3>\n <ul className='flex flex-col gap-3'>\n {column.links.map(link => (\n <li key={link.label}>\n {link.href ? (\n <a\n href={link.href}\n className='text-muted-foreground hover:text-primary text-sm transition-colors'\n >\n {link.label}\n </a>\n ) : (\n <span className='text-muted-foreground text-sm'>{link.label}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport default FooterSection1","import { Input } from '../../../ui/input'\nimport { Button } from '../../../ui/button'\nimport { ArrowRight, type LucideIcon } from 'lucide-react'\n\nexport interface FooterLink {\n label: string\n href?: string\n}\n\nexport interface FooterLinkColumn {\n title: string\n links: FooterLink[]\n}\n\nexport interface SocialLink {\n label: string\n href?: string\n icon: LucideIcon\n}\n\nexport interface FooterSection3Props {\n /** Texto del logo (identidad del bloque). Requerido. */\n logoText: string\n /** Descripción corta de la marca. Requerida. */\n description: string\n /** Columnas de enlaces (máximo recomendado 4). Requerido. */\n linkColumns: FooterLinkColumn[]\n /** Enlaces legales de la barra inferior. Por defecto []. */\n legalLinks?: FooterLink[]\n /** Redes sociales (cada una con su icono lucide). Por defecto []. */\n socialLinks?: SocialLink[]\n /** Título del bloque newsletter. Por defecto 'Suscríbete a nuestro boletín'. */\n newsletterTitle?: string\n /** Placeholder del input de email. Por defecto 'Tu correo electrónico'. */\n newsletterPlaceholder?: string\n /** aria-label del botón de envío (icon-only). Por defecto 'Suscribirse'. */\n newsletterLabel?: string\n /** Callback al enviar el formulario newsletter. Recibe el email. */\n onSubscribe?: (email: string) => void\n}\n\nexport function FooterSection3({\n logoText,\n description,\n linkColumns,\n legalLinks = [],\n socialLinks = [],\n newsletterTitle = 'Suscríbete a nuestro boletín',\n newsletterPlaceholder = 'Tu correo electrónico',\n newsletterLabel = 'Suscribirse',\n onSubscribe,\n}: FooterSection3Props) {\n return (\n <footer className='w-full py-16' aria-label='Pie de página'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {/* Logo y branding */}\n <div className='mb-8 flex items-center gap-2'>\n <svg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n <span className='text-2xl font-semibold'>{logoText}</span>\n </div>\n\n <p className='text-muted-foreground mb-8 max-w-lg text-sm'>{description}</p>\n\n {/* Grid principal */}\n <div className='grid grid-cols-2 gap-x-8 gap-y-12 md:grid-cols-4 lg:grid-cols-6'>\n {/* Columna newsletter */}\n <div className='col-span-2 me-8 flex flex-col gap-4 md:col-span-4 lg:col-span-2'>\n <h4 className='text-foreground text-base font-medium'>{newsletterTitle}</h4>\n <form\n className='relative'\n onSubmit={e => {\n e.preventDefault()\n if (onSubscribe) {\n const email = new FormData(e.currentTarget).get('email')\n if (typeof email === 'string') {\n onSubscribe(email)\n }\n }\n }}\n >\n <Input\n type='email'\n name='email'\n placeholder={newsletterPlaceholder}\n className='border-muted-foreground/20 h-10 bg-transparent pe-12'\n aria-label={newsletterPlaceholder}\n />\n <Button\n type='submit'\n variant='outline'\n size='icon'\n className='absolute end-1 top-1 size-8 cursor-pointer p-0'\n aria-label={newsletterLabel}\n >\n <ArrowRight className='size-4' />\n </Button>\n </form>\n </div>\n\n {/* Columnas de enlaces */}\n {linkColumns.map(column => (\n <div key={column.title} className='flex flex-col gap-4'>\n <h4 className='text-foreground text-base font-medium'>{column.title}</h4>\n <div className='flex flex-col gap-4'>\n {column.links.map(link => (\n <span\n key={link.label}\n className='text-muted-foreground hover:text-foreground w-fit text-sm transition-colors'\n >\n <span className='group relative inline-flex items-center'>\n {link.label}\n <span className='bg-primary absolute start-0 -bottom-0.5 h-px w-0 transition-all duration-300 ease-out group-hover:w-full' />\n </span>\n </span>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Barra inferior */}\n <div className='border-muted-foreground/20 mt-16 flex flex-col items-center justify-between gap-6 border-t pt-8 md:flex-row'>\n {/* Enlaces legales */}\n <div className='flex gap-4'>\n {legalLinks.map(link => (\n <span\n key={link.label}\n className='text-muted-foreground hover:text-foreground w-fit text-sm transition-colors'\n >\n <span className='group relative inline-flex items-center'>\n {link.label}\n <span className='bg-primary absolute start-0 -bottom-0.5 h-px w-0 transition-all duration-300 ease-out group-hover:w-full' />\n </span>\n </span>\n ))}\n </div>\n\n {/* Iconos de redes sociales */}\n <div className='flex gap-4'>\n {socialLinks.map(({ label, href, icon: Icon }) =>\n href ? (\n <a\n key={label}\n href={href}\n className='bg-muted/50 text-muted-foreground hover:text-primary rounded-full p-2 transition-colors'\n aria-label={label}\n >\n <Icon className='size-4' />\n </a>\n ) : (\n <span\n key={label}\n className='bg-muted/50 text-muted-foreground rounded-full p-2'\n aria-hidden='true'\n >\n <Icon className='size-4' />\n </span>\n )\n )}\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport default FooterSection3","import type { ReactElement, ReactNode, SVGProps } from 'react'\nimport { Input } from '../../../ui/input'\nimport { Button } from '../../../ui/button'\nimport { ArrowRight, Mail, MapPin, Phone } from 'lucide-react'\n\nexport type FooterSection4SocialIcon = 'facebook' | 'twitter' | 'instagram'\n\nexport interface FooterSection4Link {\n label: string\n href?: string\n}\n\nexport interface FooterSection4LinkColumn {\n title: string\n links: FooterSection4Link[]\n}\n\nexport interface FooterSection4Contact {\n /** Título de la columna de contacto. Requerido. */\n heading: string\n /** Dirección del negocio. Por defecto undefined. */\n address?: string\n /** href del enlace de dirección. Por defecto undefined. */\n addressHref?: string\n /** Teléfono de contacto. Por defecto undefined. */\n phone?: string\n /** href del enlace de teléfono (p. ej. tel:). Por defecto undefined. */\n phoneHref?: string\n /** Email de contacto. Por defecto undefined. */\n email?: string\n /** href del enlace de email (p. ej. mailto:). Por defecto undefined. */\n emailHref?: string\n}\n\nexport interface FooterSection4SocialLink {\n label: string\n href?: string\n icon: FooterSection4SocialIcon\n}\n\nexport interface FooterSection4Props {\n /** Nombre de la marca mostrado junto al logo. Requerido. */\n brandName: string\n /** Descripción corta de la marca bajo el logo. Requerida. */\n tagline: string\n /** Placeholder del input de email del newsletter. Por defecto 'Tu correo electrónico'. */\n newsletterPlaceholder?: string\n /** Texto del botón de suscripción. Por defecto 'Suscribirse'. */\n newsletterSubmitLabel?: string\n /** Datos de la columna de contacto (dirección, teléfono, email). Requerido. */\n contact: FooterSection4Contact\n /** Columnas de enlaces (Quick Links, Resources, Legal...). Requerido. */\n linkColumns: FooterSection4LinkColumn[]\n /** Texto de copyright de la barra inferior (incluye año). Requerido. */\n copyright: string\n /** Redes sociales con su icono serializable por nombre. Por defecto []. */\n socialLinks?: FooterSection4SocialLink[]\n /** Logo personalizado; si se omite se usa el SVG interno del bloque. Por defecto undefined. */\n logo?: ReactNode\n /** Callback al enviar el formulario newsletter. Recibe el email. */\n onNewsletterSubmit?: (email: string) => void\n /** Callback al hacer clic en un enlace de columna o contacto. Recibe el enlace. */\n onLinkClick?: (link: FooterSection4Link) => void\n /** Callback al hacer clic en una red social. Recibe el label. */\n onSocialClick?: (label: string) => void\n}\n\nconst socialIconPaths: Record<\n FooterSection4SocialIcon,\n (props: SVGProps<SVGSVGElement>) => ReactElement\n> = {\n facebook: props => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'\n {...props}\n >\n <path d='M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z' />\n </svg>\n ),\n twitter: props => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'\n {...props}\n >\n <path d='M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z' />\n </svg>\n ),\n instagram: props => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n width='24'\n height='24'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'\n {...props}\n >\n <rect width='20' height='20' x='2' y='2' rx='5' ry='5' />\n <path d='M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z' />\n <line x1='17.5' y1='6.5' x2='17.51' y2='6.5' />\n </svg>\n ),\n}\n\nconst DefaultLogo = (\n <svg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n)\n\nconst contactItems = (contact: FooterSection4Contact, onLinkClick?: FooterSection4Props['onLinkClick']) => {\n const items: { key: string; icon: ReactElement; href?: string; text?: string }[] = []\n if (contact.address) {\n items.push({\n key: 'address',\n icon: <MapPin className='mt-0.5 size-4 shrink-0' aria-hidden />,\n href: contact.addressHref,\n text: contact.address,\n })\n }\n if (contact.phone) {\n items.push({\n key: 'phone',\n icon: <Phone className='size-4 shrink-0' aria-hidden />,\n href: contact.phoneHref,\n text: contact.phone,\n })\n }\n if (contact.email) {\n items.push({\n key: 'email',\n icon: <Mail className='size-4 shrink-0' aria-hidden />,\n href: contact.emailHref,\n text: contact.email,\n })\n }\n return items\n}\n\nexport function FooterSection4({\n brandName,\n tagline,\n newsletterPlaceholder = 'Tu correo electrónico',\n newsletterSubmitLabel = 'Suscribirse',\n contact,\n linkColumns,\n copyright,\n socialLinks = [],\n logo,\n onNewsletterSubmit,\n onLinkClick,\n onSocialClick,\n}: FooterSection4Props) {\n const logoMark = logo ?? DefaultLogo\n return (\n <footer className='from-background to-muted/50 w-full bg-linear-to-b py-16'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {/* Top Section with Logo and Newsletter */}\n <section className='mb-16 flex flex-col items-start justify-between gap-8 md:flex-row md:items-center'>\n <div className='max-w-sm flex flex-col gap-4'>\n <div className='flex items-center gap-2'>\n {logoMark}\n <h2 className='text-2xl font-bold text-balance'>{brandName}</h2>\n </div>\n <p className='text-muted-foreground text-sm leading-relaxed text-balance'>{tagline}</p>\n </div>\n\n <div className='w-full md:w-auto'>\n <form\n className='relative'\n onSubmit={e => {\n e.preventDefault()\n if (onNewsletterSubmit) {\n const email = new FormData(e.currentTarget).get('email')\n if (typeof email === 'string') {\n onNewsletterSubmit(email)\n }\n }\n }}\n >\n <Input\n type='email'\n name='email'\n placeholder={newsletterPlaceholder}\n className='border-muted bg-background/50 h-12 w-full ps-4 pe-32 backdrop-blur-xs md:w-[400px]'\n aria-label={newsletterPlaceholder}\n />\n <Button\n type='submit'\n className='bg-primary hover:bg-primary/90 absolute end-1 top-1 h-10 cursor-pointer px-4'\n aria-label={newsletterSubmitLabel}\n >\n {newsletterSubmitLabel}\n <ArrowRight />\n </Button>\n </form>\n </div>\n </section>\n\n {/* Middle Section with Contact Info and Links */}\n <div className='mb-16 grid grid-cols-1 gap-12 md:grid-cols-2 lg:grid-cols-5'>\n {/* Contact Information */}\n <address className='not-italic lg:col-span-2'>\n <h3 className='mb-6 text-lg font-semibold text-balance'>{contact.heading}</h3>\n <ul className='flex flex-col gap-4'>\n {contactItems(contact, onLinkClick).map(item => (\n <li key={item.key} className='text-muted-foreground flex items-start gap-3 text-sm'>\n {item.icon}\n {item.href ? (\n <a\n href={item.href}\n onClick={e => {\n if (!onLinkClick) {\n e.preventDefault()\n } else {\n onLinkClick({ label: item.text ?? '' })\n }\n }}\n className='hover:text-foreground transition-colors'\n >\n {item.text}\n </a>\n ) : (\n <span>{item.text}</span>\n )}\n </li>\n ))}\n </ul>\n </address>\n\n {/* Link columns */}\n {linkColumns.map(column => (\n <nav key={column.title} aria-label={column.title}>\n <h3 className='mb-6 text-lg font-semibold text-balance'>{column.title}</h3>\n <ul className='grid grid-cols-1 gap-3'>\n {column.links.map(link => (\n <li key={link.label}>\n {link.href ? (\n <a\n href={link.href}\n onClick={e => {\n if (!onLinkClick) {\n e.preventDefault()\n } else {\n onLinkClick(link)\n }\n }}\n className='group text-muted-foreground hover:text-foreground focus-visible:ring-ring relative inline-block rounded-sm text-sm transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden'\n >\n {link.label}\n </a>\n ) : (\n <span className='text-muted-foreground relative inline-block text-sm'>\n {link.label}\n </span>\n )}\n </li>\n ))}\n </ul>\n </nav>\n ))}\n </div>\n\n {/* Bottom Section */}\n <div className='border-muted-foreground/20 flex flex-col items-center justify-between border-t pt-8 md:flex-row'>\n <p className='text-muted-foreground mb-4 text-sm md:mb-0'>{copyright}</p>\n\n <nav aria-label='Social media'>\n <ul className='flex gap-4'>\n {socialLinks.map(({ label, href, icon }) => {\n const Icon = socialIconPaths[icon]\n const element = (\n <>\n <Icon className='size-5' aria-hidden />\n <span className='sr-only'>{label}</span>\n </>\n )\n const classes =\n 'bg-accent text-muted-foreground hover:text-foreground focus-visible:ring-ring inline-flex size-10 items-center justify-center rounded-full p-2 transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden'\n return (\n <li key={label}>\n {href ? (\n <a\n href={href}\n onClick={e => {\n if (!onSocialClick) {\n e.preventDefault()\n } else {\n onSocialClick(label)\n }\n }}\n className={classes}\n aria-label={`Seguir en ${label}`}\n >\n {element}\n </a>\n ) : (\n <span className={classes} aria-hidden='true'>\n {element}\n </span>\n )}\n </li>\n )\n })}\n </ul>\n </nav>\n </div>\n </div>\n </footer>\n )\n}\n\nexport default FooterSection4","'use client'\n\nimport { Star } from 'lucide-react'\nimport { motion, useReducedMotion } from 'motion/react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardFooter } from '../../../ui/card'\nimport { formatMoney } from '../../../lib/money'\nimport type { ProductPresentation } from '../../../lib/contracts'\n\nexport interface Product {\n id: string | number\n title: string\n price: number\n originalPrice?: number\n image: string\n badge?: string\n}\n\n/**\n * A card entry is either the legacy numeric-price product or the canonical\n * `Money`-price presentation. The block renders both without breaking legacy\n * consumers: a numeric `price` keeps the legacy `$` output unchanged, while a\n * canonical `Money` price is formatted in its own currency and locale.\n */\nexport type ProductCard1Product = Product | ProductPresentation\n\nexport interface ProductCard1Props {\n products: ProductCard1Product[]\n heading?: string\n maxItems?: number\n onAddToCart?: (product: ProductCard1Product) => void\n onProductClick?: (product: ProductCard1Product) => void\n addToCartLabel?: string\n /** Shown when a canonical price is present but unavailable (never `$0`). */\n unavailablePriceLabel?: string\n}\n\nfunction isPresentation(product: ProductCard1Product): product is ProductPresentation {\n return typeof product.price === 'object'\n}\n\nfunction priceText(product: ProductCard1Product, unavailablePriceLabel: string): string {\n if (isPresentation(product)) {\n return formatMoney(product.price) ?? unavailablePriceLabel\n }\n return `$${product.price.toFixed(2)}`\n}\n\nfunction compareAtText(product: ProductCard1Product): string | undefined {\n if (isPresentation(product)) {\n const compareAt = product.compareAtPrice\n if (!compareAt) return undefined\n const formatted = formatMoney(compareAt)\n const price = formatMoney(product.price)\n // Render the comparison price only when both are valid and it is higher.\n if (!formatted || !price) return undefined\n if (Number(compareAt.amount) <= Number(product.price.amount)) return undefined\n return formatted\n }\n // Legacy behavior is unchanged: truthiness only.\n return product.originalPrice ? `$${product.originalPrice.toFixed(2)}` : undefined\n}\n\nfunction imageAlt(product: ProductCard1Product): string {\n return isPresentation(product) ? (product.imageAlt ?? product.title) : product.title\n}\n\nfunction rating(product: ProductCard1Product): number | undefined {\n if (!isPresentation(product)) return undefined\n return typeof product.rating === 'number' && Number.isFinite(product.rating)\n ? product.rating\n : undefined\n}\n\nexport function ProductCard1({\n products,\n heading,\n maxItems = 6,\n onAddToCart,\n onProductClick,\n addToCartLabel = 'Agregar al carrito',\n unavailablePriceLabel = 'Precio no disponible',\n}: ProductCard1Props) {\n const reduceMotion = useReducedMotion()\n const displayedProducts = products.slice(0, maxItems)\n\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {heading && (\n <h2 className='mb-8 text-center text-2xl font-bold text-balance md:text-3xl'>{heading}</h2>\n )}\n\n <div className='grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:gap-6'>\n {displayedProducts.map((product, index) => {\n const compareAt = compareAtText(product)\n const ratingValue = rating(product)\n return (\n <motion.div\n key={product.id}\n initial={reduceMotion ? false : { opacity: 0, y: 16 }}\n whileInView={{ opacity: 1, y: 0 }}\n viewport={{ once: true, margin: '-40px' }}\n whileHover={reduceMotion ? undefined : { y: -4 }}\n transition={{\n duration: 0.35,\n delay: reduceMotion ? 0 : index * 0.05,\n ease: 'easeOut',\n }}\n >\n <Card\n className={`flex h-full flex-col gap-4 overflow-hidden rounded-lg py-4 shadow-none transition-shadow duration-300 hover:shadow-md ${\n onProductClick ? 'cursor-pointer' : ''\n }`}\n onClick={onProductClick ? () => onProductClick(product) : undefined}\n >\n <CardContent className='flex flex-1 flex-col gap-4 px-4 '>\n <div className='relative aspect-square overflow-hidden rounded-md'>\n {product.badge && (\n <span className='bg-destructive text-destructive-foreground absolute top-2 left-2 z-10 rounded-full px-2 py-0.5 text-xs font-semibold'>\n {product.badge}\n </span>\n )}\n <img\n src={product.image || undefined}\n alt={imageAlt(product)}\n className='size-full rounded-md object-contain'\n loading='lazy'\n width={400}\n height={400}\n />\n </div>\n\n <div className='flex flex-1 flex-col'>\n <h2 className='mb-1 font-medium text-balance'>\n {onProductClick ? (\n <button\n type='button'\n onClick={(e) => {\n e.stopPropagation()\n onProductClick(product)\n }}\n className='hover:text-primary cursor-pointer text-left transition-colors'\n >\n {product.title}\n </button>\n ) : (\n product.title\n )}\n </h2>\n {ratingValue !== undefined && (\n <div className='text-muted-foreground mb-1 flex items-center gap-1 text-xs'>\n <Star className='size-3.5 fill-current' aria-hidden='true' />\n <span>{ratingValue.toFixed(1)}</span>\n </div>\n )}\n <div className='mt-auto flex items-baseline gap-2'>\n <p className='font-semibold'>{priceText(product, unavailablePriceLabel)}</p>\n {compareAt && (\n <p className='text-muted-foreground text-sm line-through md:text-base xl:text-sm 2xl:text-base'>\n {compareAt}\n </p>\n )}\n </div>\n </div>\n </CardContent>\n\n <CardFooter className='bg-transparent px-3 pt-0 border-t-0 md:px-4'>\n <Button\n variant='outline'\n size='sm'\n className='h-8 w-full cursor-pointer px-3 text-sm text-xs'\n onClick={(e) => {\n e.stopPropagation()\n onAddToCart?.(product)\n }}\n >\n {addToCartLabel}\n </Button>\n </CardFooter>\n </Card>\n </motion.div>\n )\n })}\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCard1\n","import { Star } from 'lucide-react'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\n\nexport interface ProductCard2Product {\n id: string | number\n title: string\n image: string\n price: number\n rating: number\n}\n\nexport interface ProductCard2Props {\n products: ProductCard2Product[]\n heading?: string\n description?: string\n}\n\nexport function ProductCard2({ products, heading, description }: ProductCard2Props) {\n return (\n <section className='py-12'>\n <div className='mx-auto flex w-full max-w-7xl flex-col gap-8 px-4 sm:px-6 lg:px-8'>\n {heading || description ? (\n <header className='flex flex-col gap-2'>\n {heading && <h2 className='text-3xl font-bold text-balance sm:text-4xl'>{heading}</h2>}\n {description && (\n <p className='text-muted-foreground max-w-[60ch] text-balance'>{description}</p>\n )}\n </header>\n ) : null}\n\n <div className='grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3'>\n {products.map(product => (\n <Card key={product.id} className='group overflow-hidden transition-all hover:shadow-lg'>\n <CardContent className='flex flex-col gap-4'>\n <div className='overflow-hidden rounded-md'>\n <img\n src={product.image || undefined}\n alt={product.title}\n width={400}\n height={400}\n className='aspect-square w-full object-cover transition-transform duration-300 group-hover:scale-105'\n />\n </div>\n\n <div className='flex flex-col gap-2'>\n <CardTitle className='line-clamp-1 text-lg font-semibold text-balance sm:text-xl'>\n {product.title}\n </CardTitle>\n\n <div\n className='flex items-center gap-0.5'\n aria-label={`${product.rating} out of 5 stars`}\n role='img'\n >\n {Array.from({ length: product.rating }).map((_, i) => (\n <Star key={i} className='fill-foreground text-foreground size-4 sm:size-5' />\n ))}\n </div>\n\n <p className='text-lg font-semibold sm:text-xl'>${product.price.toFixed(2)}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCard2","'use client'\n\nimport { useState, type JSX } from 'react'\nimport { Heart, Star, Sparkles, Flame, Trophy, GalleryHorizontalEnd } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { ProductCard3ReactionToggle } from './product-card-3-reaction-toggle'\n\nexport interface ProductCard3Product {\n id: string | number\n title: string\n subtitle: string\n image: string\n price: number\n originalPrice: number\n rating: number\n reviewCount: number\n discountPercentage: number\n isLowStock?: boolean\n badge?: {\n text: string\n variant: 'trending' | 'bestseller' | 'new'\n }\n}\n\nexport interface ProductCard3Props {\n products: ProductCard3Product[]\n currencySymbol?: string\n onViewSimilar?: (product: ProductCard3Product) => void\n onToggleWishlist?: (product: ProductCard3Product) => void\n onProductClick?: (product: ProductCard3Product) => void\n}\n\ninterface BadgeStyle {\n bg: string\n icon: JSX.Element | null\n}\n\nconst badgeStyles: Record<string, BadgeStyle> = {\n trending: {\n bg: 'bg-black',\n icon: <Flame className='size-3' />,\n },\n bestseller: {\n bg: 'bg-black',\n icon: <Trophy className='size-3' />,\n },\n new: {\n bg: 'bg-black',\n icon: <Sparkles className='size-3' />,\n },\n}\n\ninterface ProductCardProps {\n product: ProductCard3Product\n className?: string\n currencySymbol?: string\n onViewSimilar?: (product: ProductCard3Product) => void\n onToggleWishlist?: (product: ProductCard3Product) => void\n onProductClick?: (product: ProductCard3Product) => void\n}\n\nfunction ProductCard({\n product,\n className,\n currencySymbol = '$',\n onViewSimilar,\n onToggleWishlist,\n onProductClick,\n}: ProductCardProps) {\n const [isWishlisted, setIsWishlisted] = useState(false)\n\n const badgeStyle = product.badge ? badgeStyles[product.badge.variant] || badgeStyles.new : null\n\n /**\n * The heart stays in uncontrolled per-card state only when no callback is\n * given; with onToggleWishlist the parent owns the wishlist state.\n */\n const handleToggleWishlist = () => {\n if (onToggleWishlist) {\n onToggleWishlist(product)\n return\n }\n setIsWishlisted(prev => !prev)\n }\n\n return (\n <Card\n className={cn(\n 'relative overflow-hidden rounded-md py-0 shadow-none transition-all hover:shadow-md',\n onProductClick && 'cursor-pointer',\n className,\n )}\n onClick={onProductClick ? () => onProductClick(product) : undefined}\n >\n <CardContent className='px-0'>\n <div className='relative aspect-square w-full overflow-hidden'>\n <img src={product.image || undefined} alt={product.title} className='size-full object-cover' loading='lazy' />\n\n {product.badge && badgeStyle && (\n <div className='absolute start-2 top-2 z-20'>\n <Badge className={cn('h-auto font-semibold flex items-center gap-1 px-2 py-1 text-white backdrop-blur-xs', badgeStyle.bg)}>\n {badgeStyle.icon}\n <span className='text-xs font-medium'>{product.badge.text}</span>\n </Badge>\n </div>\n )}\n\n {product.rating > 0 && (\n <div className='bg-background/80 absolute start-2 bottom-2 z-10 flex items-center gap-1 rounded-md border px-2 py-1 text-sm backdrop-blur-xs'>\n <Star className='fill-foreground text-foreground size-4' />\n <span>{product.rating}</span>\n {product.reviewCount > 0 && (\n <span className='text-muted-foreground'>\n | {product.reviewCount >= 1000 ? `${(product.reviewCount / 1000).toFixed(1)}k` : product.reviewCount}\n </span>\n )}\n </div>\n )}\n\n <div className='absolute end-2 bottom-2 z-10'>\n <Button\n variant='ghost'\n size='sm'\n className=\"h-8 px-3 text-xs group bg-background/80 hover:bg-background size-8 cursor-pointer overflow-hidden rounded-full p-0 shadow-xs backdrop-blur-xs transition-all duration-200 hover:w-[130px]\"\n aria-label='Ver productos similares'\n onClick={\n onViewSimilar\n ? (e) => {\n e.stopPropagation()\n onViewSimilar(product)\n }\n : undefined\n }\n >\n <GalleryHorizontalEnd className='absolute start-2 size-4 shrink-0' />\n <span className='ms-6 text-xs whitespace-nowrap opacity-0 group-hover:opacity-100'>Ver similares</span>\n </Button>\n </div>\n\n <Button\n variant='ghost'\n size='icon'\n className=\"bg-background/80 absolute end-2 top-2 z-20 size-8 cursor-pointer rounded-full p-0 backdrop-blur-xs\"\n onClick={(e) => {\n e.stopPropagation()\n handleToggleWishlist()\n }}\n aria-label={isWishlisted ? 'Quitar de favoritos' : 'Añadir a favoritos'}\n >\n <ProductCard3ReactionToggle\n active={isWishlisted}\n icon={Heart}\n iconClassName={cn('size-4', !isWishlisted && 'text-muted-foreground hover:text-destructive')}\n activeColorClassName='text-destructive'\n />\n </Button>\n </div>\n\n <div className='p-4'>\n <div className='flex flex-col gap-2'>\n <h3 className='font-medium text-balance'>{product.title}</h3>\n <p className='text-muted-foreground text-sm text-balance'>{product.subtitle}</p>\n </div>\n\n <div className='flex items-center gap-2'>\n <span className='font-semibold'>\n {currencySymbol}\n {product.price}\n </span>\n <span className='text-muted-foreground text-sm line-through'>\n {currencySymbol}\n {product.originalPrice}\n </span>\n <span className='text-sm'>({product.discountPercentage}% OFF)</span>\n </div>\n\n {product.isLowStock && <p className='text-sm text-destructive'>¡Solo quedan pocas unidades!</p>}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport function ProductCard3({\n products,\n currencySymbol = '$',\n onViewSimilar,\n onToggleWishlist,\n onProductClick,\n}: ProductCard3Props) {\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3'>\n {products.map(product => (\n <ProductCard\n key={product.id}\n product={product}\n currencySymbol={currencySymbol}\n onViewSimilar={onViewSimilar}\n onToggleWishlist={onToggleWishlist}\n onProductClick={onProductClick}\n />\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCard3","'use client'\n\nimport { useEffect, useRef, useState, type ComponentType } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\nconst PARTICLE_COUNT = 8\n\n/**\n * The pop/burst keyframes travel with the component instead of living in the\n * app's stylesheet, so this file is self-contained: drop it in and the\n * animation works with no Tailwind config or global CSS to copy over.\n * Injected once per page, guarded by the marker attribute.\n */\nconst STYLE_MARKER = 'data-reaction-toggle-keyframes'\nconst STYLES = `\n@keyframes reaction-toggle-pop {\n 0% { transform: scale(1); }\n 30% { transform: scale(0.82); }\n 100% { transform: scale(1); }\n}\n@keyframes reaction-toggle-burst {\n 0% { opacity: 0; transform: translate(0, 0) scale(0.4); }\n 20% { opacity: 1; transform: translate(calc(var(--rx) * 0.25), calc(var(--ry) * 0.25)) scale(1); }\n 100% { opacity: 0; transform: translate(var(--rx), var(--ry)) scale(0.6); }\n}\n.reaction-toggle-pop {\n animation: reaction-toggle-pop 350ms cubic-bezier(0.34, 1.96, 0.64, 1);\n}\n.reaction-toggle-burst {\n animation-name: reaction-toggle-burst;\n animation-timing-function: ease-out;\n animation-fill-mode: forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n .reaction-toggle-pop,\n .reaction-toggle-burst { animation: none !important; }\n}\n`\n\nfunction useReactionToggleStyles() {\n useEffect(() => {\n if (document.head.querySelector(`[${STYLE_MARKER}]`)) return\n\n const style = document.createElement('style')\n style.setAttribute(STYLE_MARKER, '')\n style.textContent = STYLES\n document.head.append(style)\n }, [])\n}\n\ntype ReactionIconProps = {\n className?: string\n}\n\ntype Particle = {\n rx: number\n ry: number\n duration: number\n delay: number\n size: number\n}\n\nfunction buildParticles(): Particle[] {\n return Array.from({ length: PARTICLE_COUNT }, (_, i) => {\n const angle = (Math.PI * 2 * i) / PARTICLE_COUNT + (Math.random() - 0.5) * 0.4\n const dist = 16 + Math.random() * 10\n\n return {\n rx: Math.round(Math.cos(angle) * dist * 10) / 10,\n ry: Math.round(Math.sin(angle) * dist * 10) / 10,\n duration: Math.round(500 + Math.random() * 200),\n delay: Math.round(Math.random() * 60),\n size: Math.round((0.7 + Math.random() * 0.8) * 100) / 100,\n }\n })\n}\n\ntype ReactionToggleProps = {\n /** Whether the reaction is currently active (liked/helpful/etc). */\n active: boolean\n /** Icon component to render, e.g. `Heart` or `ThumbsUp` from lucide-react. */\n icon: ComponentType<ReactionIconProps>\n /** Wrapper class - sizing/positioning of the whole control. */\n className?: string\n /** Class applied to the icon itself (e.g. `size-5`). */\n iconClassName?: string\n /**\n * Tailwind color class (e.g. `text-primary`, `text-destructive`) applied to the\n * icon and particles while active. Drives `fill-current`/`bg-current`, so it\n * stays in sync with the design system instead of a hardcoded brand color.\n */\n activeColorClassName?: string\n}\n\n/**\n * Heart/thumbs-up style reaction control: the icon pops with an overshoot scale\n * and sprinkles 8 particles outward the moment it becomes active.\n */\nexport function ProductCard3ReactionToggle({\n active,\n icon: Icon,\n className,\n iconClassName,\n activeColorClassName = 'text-primary',\n}: ReactionToggleProps) {\n const [isBursting, setIsBursting] = useState(false)\n const wasActive = useRef(active)\n const particlesRef = useRef<Particle[]>(buildParticles())\n\n useReactionToggleStyles()\n\n useEffect(() => {\n if (active && !wasActive.current) {\n particlesRef.current = buildParticles()\n setIsBursting(true)\n const timeout = setTimeout(() => setIsBursting(false), 700)\n wasActive.current = active\n return () => clearTimeout(timeout)\n }\n\n wasActive.current = active\n }, [active])\n\n return (\n <span className={cn('relative inline-flex', className)}>\n <span className={cn('inline-flex', active && 'reaction-toggle-pop')}>\n <Icon\n className={cn(\n 'transition-[fill,stroke,color] duration-150 ease-[cubic-bezier(0.22,1,0.36,1)]',\n active ? cn('fill-current', activeColorClassName) : 'fill-transparent',\n iconClassName\n )}\n />\n </span>\n\n {isBursting && (\n <span\n aria-hidden='true'\n className={cn('pointer-events-none absolute top-1/2 left-1/2 size-0', activeColorClassName)}\n >\n {particlesRef.current.map((particle, index) => (\n <i\n key={index}\n className='reaction-toggle-burst absolute rounded-full bg-current opacity-0'\n style={\n {\n '--rx': `${particle.rx}px`,\n '--ry': `${particle.ry}px`,\n animationDuration: `${particle.duration}ms`,\n animationDelay: `${particle.delay}ms`,\n width: `${2.5 * particle.size}px`,\n height: `${2.5 * particle.size}px`,\n left: `${-1.25 * particle.size}px`,\n top: `${-1.25 * particle.size}px`,\n } as React.CSSProperties\n }\n />\n ))}\n </span>\n )}\n </span>\n )\n}\n\nexport default ProductCard3ReactionToggle","'use client'\n\nimport { useState } from 'react'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { CheckboxCheck } from './product-card-5-checkbox-check'\nimport { InputGroup, InputGroupAddon, InputGroupInput } from '../../../ui/input-group'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../../../ui/table'\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select'\nimport { Heart, ShoppingCart, Star, Search, Filter, Eye, ArrowUpDown, GitCompare } from 'lucide-react'\nimport { cn } from '../../../lib/utils'\nimport { ProductCard5ReactionToggle } from './product-card-5-reaction-toggle'\n\nexport interface ProductCard5Product {\n id: string\n name: string\n category: string\n price: number\n rating: number\n reviews: number\n image: string\n stock: string\n specifications: string\n brand: string\n}\n\nexport interface ProductCard5Props {\n products: ProductCard5Product[]\n onToggleWishlist?: (product: ProductCard5Product) => void\n onAddToCart?: (product: ProductCard5Product) => void\n onQuickView?: (product: ProductCard5Product) => void\n onCompare?: (products: ProductCard5Product[]) => void\n onExport?: (products: ProductCard5Product[]) => void\n}\n\n/**\n * Stock state as a Badge variant rather than a hand-mixed palette.\n *\n * These used to be literal `bg-green-100 … dark:bg-green-900/20` triples, which is the one thing\n * a themed design system cannot absorb: they ignored the customizer entirely and needed a manual\n * `dark:` for every value. `secondary` and `destructive` are the tokens that already mean\n * \"fine\" and \"not fine\", and the label carries the meaning in words either way.\n */\nconst stockVariants: Record<string, 'secondary' | 'outline' | 'destructive'> = {\n 'In Stock': 'secondary',\n 'Low Stock': 'outline',\n 'Out of Stock': 'destructive',\n}\n\nexport function ProductCard5({\n products,\n onToggleWishlist,\n onAddToCart,\n onQuickView,\n onCompare,\n onExport,\n}: ProductCard5Props) {\n const [searchQuery, setSearchQuery] = useState('')\n const [categoryFilter, setCategoryFilter] = useState('all')\n const [selectedProducts, setSelectedProducts] = useState<string[]>([])\n const [sortBy, setSortBy] = useState<'name' | 'price' | 'rating'>('name')\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc')\n const [wishlisted, setWishlisted] = useState<string[]>([])\n\n const filteredProducts = products\n .filter(product => {\n const matchesSearch =\n product.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n product.brand.toLowerCase().includes(searchQuery.toLowerCase())\n const matchesCategory = categoryFilter === 'all' || product.category === categoryFilter\n return matchesSearch && matchesCategory\n })\n .sort((a, b) => {\n let aValue: string | number = a[sortBy]\n let bValue: string | number = b[sortBy]\n\n if (sortOrder === 'asc') {\n return aValue < bValue ? -1 : aValue > bValue ? 1 : 0\n } else {\n return aValue > bValue ? -1 : aValue < bValue ? 1 : 0\n }\n })\n\n const categories = [...new Set(products.map(p => p.category))]\n\n const selectedProductObjects = products.filter(p => selectedProducts.includes(p.id))\n\n const handleSort = (field: 'name' | 'price' | 'rating') => {\n if (sortBy === field) {\n setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')\n } else {\n setSortBy(field)\n setSortOrder('asc')\n }\n }\n\n const toggleProductSelection = (productId: string) => {\n setSelectedProducts(prev => (prev.includes(productId) ? prev.filter(id => id !== productId) : [...prev, productId]))\n }\n\n const toggleWishlist = (product: ProductCard5Product) => {\n setWishlisted(prev => (prev.includes(product.id) ? prev.filter(id => id !== product.id) : [...prev, product.id]))\n onToggleWishlist?.(product)\n }\n\n const renderStars = (rating: number) => {\n return Array.from({ length: 5 }, (_, i) => (\n <Star\n key={i}\n aria-hidden='true'\n className={cn(\n 'size-3',\n i < Math.floor(rating) ? 'fill-foreground text-foreground' : i < rating ? 'text-foreground' : ''\n )}\n />\n ))\n }\n\n return (\n <section className='py-8'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <Card>\n <CardHeader>\n <div className='flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between'>\n <div>\n <CardTitle className='text-2xl text-balance'>Comparación de productos</CardTitle>\n <p className='text-muted-foreground'>Compara productos lado a lado para tomar la mejor decisión</p>\n </div>\n {/*\n No height, padding or cursor overrides on top of the variant: the default size\n already is `h-9 px-4`, and re-stating it by class is how a button drifts out of\n step with every other button the moment the design system moves.\n */}\n {selectedProducts.length > 0 && (\n <Button onClick={onCompare ? () => onCompare(selectedProductObjects) : undefined}>\n <GitCompare data-icon='inline-start' aria-hidden='true' />\n Comparar {selectedProducts.length} productos\n </Button>\n )}\n </div>\n </CardHeader>\n <CardContent>\n {/* Filters */}\n <div className='mb-6 flex flex-col gap-4 sm:flex-row sm:items-center'>\n {/*\n An InputGroup rather than a relative div with an absolutely positioned icon and\n a hand-picked `ps-9` to clear it. The group owns that offset, so the icon and the\n text cannot drift apart when the radius or the input's height changes.\n */}\n <InputGroup className='max-w-md flex-1'>\n <InputGroupAddon>\n <Search />\n </InputGroupAddon>\n <InputGroupInput\n placeholder='Buscar productos o marcas...'\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n aria-label='Buscar productos o marcas'\n />\n </InputGroup>\n <Select value={categoryFilter} onValueChange={value => value && setCategoryFilter(value)}>\n <SelectTrigger className='w-[180px]' aria-label='Filtrar por categoría'>\n <Filter className='me-2 size-4' />\n <SelectValue>{categoryFilter === 'all' ? 'Todas las categorías' : categoryFilter}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {/* Items belong in a group — the list is one set, not loose children. */}\n <SelectGroup>\n <SelectItem value='all'>Todas las categorías</SelectItem>\n {categories.map(category => (\n <SelectItem key={category} value={category}>\n {category}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n\n {/* Products Table */}\n <div className='overflow-x-auto rounded-md border'>\n <Table className='min-w-full table-fixed'>\n <TableHeader>\n <TableRow>\n <TableHead className='w-12 ps-4'>\n <CheckboxCheck\n checked={selectedProducts.length === filteredProducts.length && filteredProducts.length > 0}\n onCheckedChange={checked => {\n if (checked) {\n setSelectedProducts(filteredProducts.map(p => p.id))\n } else {\n setSelectedProducts([])\n }\n }}\n />\n </TableHead>\n <TableHead className='w-56 min-w-[200px]'>Producto</TableHead>\n {/*\n A Button inside the header, not an onClick on the cell.\n\n A `<th>` with a click handler is invisible to the keyboard and announces\n nothing: there was no way to sort this table without a mouse, and a screen\n reader was never told the column was sortable or which way it currently\n runs. `aria-sort` on the header states the direction, and the button is the\n thing that takes focus.\n */}\n {([\n { field: 'name', label: 'Detalles', width: 'w-52 min-w-[180px]' },\n { field: 'price', label: 'Precio', width: 'w-32 min-w-[100px]' },\n { field: 'rating', label: 'Valoración', width: 'w-32 min-w-[100px]' },\n ] as const).map(column => (\n <TableHead\n key={column.field}\n className={column.width}\n aria-sort={\n sortBy === column.field\n ? sortOrder === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n }\n >\n <Button\n variant='ghost'\n size='sm'\n className='-ms-2 h-8 gap-1 px-2'\n onClick={() => handleSort(column.field)}\n >\n {column.label}\n <ArrowUpDown data-icon='inline-end' aria-hidden='true' />\n </Button>\n </TableHead>\n ))}\n <TableHead className='w-32 min-w-[100px] text-center'>Stock</TableHead>\n <TableHead className='w-34 min-w-[90px] pe-3 text-center'>Acciones</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredProducts.map(product => (\n <TableRow key={product.id}>\n <TableCell className='ps-4'>\n <CheckboxCheck\n checked={selectedProducts.includes(product.id)}\n onCheckedChange={() => toggleProductSelection(product.id)}\n />\n </TableCell>\n <TableCell className='w-56 min-w-[200px] break-words whitespace-normal'>\n <div className='flex items-center gap-3'>\n <img src={product.image || undefined} alt={product.name} className='size-12 rounded-md object-cover' />\n <div>\n <div className='font-medium'>{product.name}</div>\n <div className='text-muted-foreground text-sm'>\n {product.brand} • {product.category}\n </div>\n </div>\n </div>\n </TableCell>\n <TableCell className='w-52 min-w-[180px] break-words whitespace-normal'>\n <div>\n <div className='text-muted-foreground text-sm'>{product.specifications}</div>\n </div>\n </TableCell>\n <TableCell className='w-32 min-w-[100px]'>\n <div className='flex items-center gap-2'>\n <span className='font-semibold'>${product.price}</span>\n </div>\n </TableCell>\n <TableCell className='w-32 min-w-[100px]'>\n <div className='flex items-center gap-2'>\n <div className='flex'>{renderStars(product.rating)}</div>\n <span className='text-muted-foreground text-sm'>\n {product.rating} ({product.reviews})\n </span>\n </div>\n </TableCell>\n <TableCell className='w-32 min-w-[100px] text-center'>\n <Badge variant={stockVariants[product.stock] ?? 'secondary'} className='rounded-full'>\n {product.stock}\n </Badge>\n </TableCell>\n <TableCell className='w-34 min-w-[90px] pe-4 text-center'>\n <div className='flex items-center justify-center gap-1'>\n <Button\n variant='ghost'\n size='icon-sm'\n aria-label={`Vista rápida de ${product.name}`}\n onClick={onQuickView ? () => onQuickView(product) : undefined}\n >\n <Eye />\n </Button>\n\n {/*\n The same reaction control the card blocks use: the heart pops with an\n overshoot and throws eight particles the moment it becomes active.\n It carries its own copy of the file rather than importing from another\n block, because blocks install one at a time into a flat directory — a\n part shared across two blocks only arrives if the buyer happens to\n take both. The keyframes dedupe by marker if they do.\n */}\n <Button\n variant='ghost'\n size='icon-sm'\n onClick={() => toggleWishlist(product)}\n aria-pressed={wishlisted.includes(product.id)}\n aria-label={\n wishlisted.includes(product.id)\n ? `Quitar ${product.name} de la lista de deseos`\n : `Agregar ${product.name} a la lista de deseos`\n }\n >\n <ProductCard5ReactionToggle\n active={wishlisted.includes(product.id)}\n icon={Heart}\n iconClassName={cn(\n 'size-4',\n !wishlisted.includes(product.id) && 'text-muted-foreground'\n )}\n activeColorClassName='text-destructive'\n />\n </Button>\n\n <Button\n size='icon-sm'\n disabled={product.stock === 'Out of Stock'}\n aria-label={`Agregar ${product.name} al carrito`}\n onClick={onAddToCart ? () => onAddToCart(product) : undefined}\n >\n <ShoppingCart />\n </Button>\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Summary */}\n <div className='text-muted-foreground mt-6 flex flex-wrap items-center justify-between gap-4 text-sm'>\n <div>\n Mostrando {filteredProducts.length} de {products.length} productos\n {selectedProducts.length > 0 && (\n <span className='ms-2'>• {selectedProducts.length} seleccionados</span>\n )}\n </div>\n <div className='flex items-center gap-4'>\n <span>\n Ordenar por: {sortBy} ({sortOrder})\n </span>\n <Button\n variant='outline'\n size='sm'\n onClick={onExport ? () => onExport(filteredProducts) : undefined}\n >\n Exportar lista\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </section>\n )\n}\n\nexport default ProductCard5","'use client'\n\nimport { useLayoutEffect, useRef, useState } from 'react'\nimport { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * Animated checkbox whose tick draws on with a stroke path instead of appearing instantly.\n *\n * A drop-in replacement for `ui/checkbox`: same props, same look at rest. Two things make the\n * draw work, and both are easy to get wrong:\n *\n * 1. The indicator uses `keepMounted`. Base UI unmounts it when unchecked, and an element that\n * was never in the DOM cannot transition — the tick would still pop.\n * 2. `--check-len` is measured from the real path with `getTotalLength()` rather than hard-coded.\n * A guessed dash length either over-draws (a visible tail) or under-draws (a clipped tick),\n * and it drifts the moment the icon or the box size changes.\n *\n * Transitioning the offset (rather than animating it) means an uncheck mid-draw reverses cleanly\n * from wherever it had got to, instead of jumping to the end and restarting.\n */\nconst BOX_MS = 150\nconst DRAW_MS = 350\nconst UNCHECK_MS = 150\nconst EASE = 'cubic-bezier(0.22, 1, 0.36, 1)'\n\nexport function CheckboxCheck({ className, indeterminate, ...props }: CheckboxPrimitive.Root.Props) {\n const pathRef = useRef<SVGPathElement>(null)\n const [length, setLength] = useState(15)\n\n useLayoutEffect(() => {\n const path = pathRef.current\n if (path) {\n setLength(Math.ceil(path.getTotalLength()))\n }\n }, [])\n\n // A partial selection draws a dash, not a tick: a full tick for \"some of these are selected\"\n // reads as \"all of them\". The tick is lucide's `Check`/`Minus` rescaled from their 24-unit\n // viewBox into this 10.17-unit one (×0.4236), so the painted weight matches every static tick.\n const mark = indeterminate ? 'M2.12 5.08H8.47' : 'M1.69 5.08L3.81 7.2L8.47 2.54'\n\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary',\n 'motion-reduce:transition-none',\n className\n )}\n style={{ transition: `background-color ${BOX_MS}ms ${EASE}, border-color ${BOX_MS}ms ${EASE}` }}\n indeterminate={indeterminate}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n keepMounted\n data-slot=\"checkbox-indicator\"\n className={cn(\n 'grid size-3.5 place-content-center text-current',\n // Offset the full dash length at rest, none when checked. Driving it from the\n // indicator's own data-checked keeps the two durations asymmetric: the draw is slower\n // and deliberate, the erase is quick.\n // The transition lives in a class, not inline: an inline `transition` beats any\n // stylesheet rule, so the slower draw duration below could never take effect.\n '[&_path]:[transition:stroke-dashoffset_var(--check-uncheck)_var(--check-ease)]',\n '[&_path]:[stroke-dashoffset:var(--check-len)]',\n 'data-checked:[&_path]:[stroke-dashoffset:0]',\n 'data-checked:[&_path]:[transition-duration:var(--check-draw)]',\n 'motion-reduce:[&_path]:transition-none'\n )}\n style={\n {\n '--check-len': length,\n '--check-draw': `${DRAW_MS}ms`,\n '--check-uncheck': `${UNCHECK_MS}ms`,\n '--check-ease': EASE,\n } as React.CSSProperties\n }\n >\n <svg viewBox=\"0 0 10.1668 10.1668\" fill=\"none\" aria-hidden className=\"size-full overflow-visible\">\n <path\n ref={pathRef}\n d={mark}\n stroke=\"currentColor\"\n // 2 in lucide's 24-unit box, rescaled: the same painted weight as every static tick.\n strokeWidth={0.9}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ strokeDasharray: length }}\n />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport default CheckboxCheck","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","'use client'\n\nimport { useEffect, useRef, useState, type ComponentType } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\nconst PARTICLE_COUNT = 8\n\n/**\n * The pop/burst keyframes travel with the component instead of living in the\n * app's stylesheet, so this file is self-contained: drop it in and the\n * animation works with no Tailwind config or global CSS to copy over.\n * Injected once per page, guarded by the marker attribute.\n *\n * The marker and the keyframe names deliberately match `product-card-3`'s copy of this\n * component. Blocks install into one flat directory, so a buyer who takes both gets two files\n * with identical styles — and because the guard is on the marker rather than on the file, the\n * second one finds the first's `<style>` already there and injects nothing.\n */\nconst STYLE_MARKER = 'data-reaction-toggle-keyframes'\nconst STYLES = `\n@keyframes reaction-toggle-pop {\n 0% { transform: scale(1); }\n 30% { transform: scale(0.82); }\n 100% { transform: scale(1); }\n}\n@keyframes reaction-toggle-burst {\n 0% { opacity: 0; transform: translate(0, 0) scale(0.4); }\n 20% { opacity: 1; transform: translate(calc(var(--rx) * 0.25), calc(var(--ry) * 0.25)) scale(1); }\n 100% { opacity: 0; transform: translate(var(--rx), var(--ry)) scale(0.6); }\n}\n.reaction-toggle-pop {\n animation: reaction-toggle-pop 350ms cubic-bezier(0.34, 1.96, 0.64, 1);\n}\n.reaction-toggle-burst {\n animation-name: reaction-toggle-burst;\n animation-timing-function: ease-out;\n animation-fill-mode: forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n .reaction-toggle-pop,\n .reaction-toggle-burst { animation: none !important; }\n}\n`\n\nfunction useReactionToggleStyles() {\n useEffect(() => {\n if (document.head.querySelector(`[${STYLE_MARKER}]`)) return\n\n const style = document.createElement('style')\n style.setAttribute(STYLE_MARKER, '')\n style.textContent = STYLES\n document.head.append(style)\n }, [])\n}\n\ntype ReactionIconProps = {\n className?: string\n}\n\ntype Particle = {\n rx: number\n ry: number\n duration: number\n delay: number\n size: number\n}\n\nfunction buildParticles(): Particle[] {\n return Array.from({ length: PARTICLE_COUNT }, (_, i) => {\n const angle = (Math.PI * 2 * i) / PARTICLE_COUNT + (Math.random() - 0.5) * 0.4\n const dist = 16 + Math.random() * 10\n\n return {\n rx: Math.round(Math.cos(angle) * dist * 10) / 10,\n ry: Math.round(Math.sin(angle) * dist * 10) / 10,\n duration: Math.round(500 + Math.random() * 200),\n delay: Math.round(Math.random() * 60),\n size: Math.round((0.7 + Math.random() * 0.8) * 100) / 100,\n }\n })\n}\n\ntype ReactionToggleProps = {\n /** Whether the reaction is currently active (liked/helpful/etc). */\n active: boolean\n /** Icon component to render, e.g. `Heart` or `ThumbsUp` from lucide-react. */\n icon: ComponentType<ReactionIconProps>\n /** Wrapper class - sizing/positioning of the whole control. */\n className?: string\n /** Class applied to the icon itself (e.g. `size-5`). */\n iconClassName?: string\n /**\n * Tailwind color class (e.g. `text-primary`, `text-destructive`) applied to the\n * icon and particles while active. Drives `fill-current`/`bg-current`, so it\n * stays in sync with the design system instead of a hardcoded brand color.\n */\n activeColorClassName?: string\n}\n\n/**\n * Heart/thumbs-up style reaction control: the icon pops with an overshoot scale\n * and sprinkles 8 particles outward the moment it becomes active.\n */\nexport function ProductCard5ReactionToggle({\n active,\n icon: Icon,\n className,\n iconClassName,\n activeColorClassName = 'text-primary',\n}: ReactionToggleProps) {\n const [isBursting, setIsBursting] = useState(false)\n const wasActive = useRef(active)\n const particlesRef = useRef<Particle[]>(buildParticles())\n\n useReactionToggleStyles()\n\n useEffect(() => {\n if (active && !wasActive.current) {\n particlesRef.current = buildParticles()\n setIsBursting(true)\n const timeout = setTimeout(() => setIsBursting(false), 700)\n wasActive.current = active\n return () => clearTimeout(timeout)\n }\n\n wasActive.current = active\n }, [active])\n\n return (\n <span className={cn('relative inline-flex', className)}>\n <span className={cn('inline-flex', active && 'reaction-toggle-pop')}>\n <Icon\n className={cn(\n 'transition-[fill,stroke,color] duration-150 ease-[cubic-bezier(0.22,1,0.36,1)]',\n active ? cn('fill-current', activeColorClassName) : 'fill-transparent',\n iconClassName\n )}\n />\n </span>\n\n {isBursting && (\n <span\n aria-hidden='true'\n className={cn('pointer-events-none absolute top-1/2 left-1/2 size-0', activeColorClassName)}\n >\n {particlesRef.current.map((particle, index) => (\n <i\n key={index}\n className='reaction-toggle-burst absolute rounded-full bg-current opacity-0'\n style={\n {\n '--rx': `${particle.rx}px`,\n '--ry': `${particle.ry}px`,\n animationDuration: `${particle.duration}ms`,\n animationDelay: `${particle.delay}ms`,\n width: `${2.5 * particle.size}px`,\n height: `${2.5 * particle.size}px`,\n left: `${-1.25 * particle.size}px`,\n top: `${-1.25 * particle.size}px`,\n } as React.CSSProperties\n }\n />\n ))}\n </span>\n )}\n </span>\n )\n}\n\nexport default ProductCard5ReactionToggle","'use client'\n\nimport { useMemo, useState } from 'react'\nimport { ChevronLeft, ChevronRight, Star } from 'lucide-react'\nimport { motion, useReducedMotion } from 'motion/react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardFooter } from '../../../ui/card'\nimport { formatMoney } from '../../../lib/money'\nimport type { ProductPresentation } from '../../../lib/contracts'\n\nexport interface ProductShowcase1Props {\n products: ProductPresentation[]\n heading?: string\n description?: string\n pageSize?: number\n prevLabel?: string\n nextLabel?: string\n /** Label for the current-page status, e.g. \"Página\". */\n pageLabel?: string\n unavailablePriceLabel?: string\n emptyLabel?: string\n addToCartLabel?: string\n onAddToCart?: (product: ProductPresentation) => void\n onProductClick?: (product: ProductPresentation) => void\n}\n\nconst DEFAULT_PAGE_SIZE = 6\nconst SWIPE_THRESHOLD = 48\n\nfunction chunk<T>(items: readonly T[], size: number): T[][] {\n const pages: T[][] = []\n for (let index = 0; index < items.length; index += size) {\n pages.push(items.slice(index, index + size))\n }\n return pages\n}\n\nfunction compareAtText(product: ProductPresentation): string | undefined {\n const compareAt = product.compareAtPrice\n if (!compareAt) return undefined\n const formatted = formatMoney(compareAt)\n const price = formatMoney(product.price)\n if (!formatted || !price) return undefined\n if (Number(compareAt.amount) <= Number(product.price.amount)) return undefined\n return formatted\n}\n\n/**\n * Combined grid-and-carousel product presentation: fixed-size grid pages\n * navigated manually (prev/next) with a visible current-page indication. There\n * is no autoplay, no auto-advance, and no infinite loop. Controls are real\n * buttons (keyboard operable and visible at every breakpoint); touch swipe is an\n * addition, never the only way to navigate. Below-fold images are lazy.\n *\n * Data access lives in the host: this block only renders the props it receives\n * and reports interactions through callbacks (no backend/router/measurement\n * imports).\n */\nexport function ProductShowcase1({\n products,\n heading,\n description,\n pageSize = DEFAULT_PAGE_SIZE,\n prevLabel = 'Anterior',\n nextLabel = 'Siguiente',\n pageLabel = 'Página',\n unavailablePriceLabel = 'Precio no disponible',\n emptyLabel = 'No hay productos para mostrar.',\n addToCartLabel = 'Agregar al carrito',\n onAddToCart,\n onProductClick,\n}: ProductShowcase1Props) {\n const reduceMotion = useReducedMotion()\n const size = Number.isInteger(pageSize) && pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE\n const pages = useMemo(() => chunk(products, size), [products, size])\n const pageCount = pages.length\n const [page, setPage] = useState(0)\n const [touchStart, setTouchStart] = useState<number | null>(null)\n const safePage = pageCount === 0 ? 0 : Math.min(page, pageCount - 1)\n\n const goTo = (next: number) => {\n if (pageCount === 0) return\n if (next < 0 || next >= pageCount) return\n setPage(next)\n }\n\n if (pageCount === 0) {\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {heading && (\n <h2 className='mb-4 text-center text-2xl font-bold text-balance md:text-3xl'>\n {heading}\n </h2>\n )}\n <p className='text-muted-foreground text-center'>{emptyLabel}</p>\n </div>\n </section>\n )\n }\n\n const visible = pages[safePage]\n\n return (\n <section\n className='py-12'\n aria-roledescription='carousel'\n onKeyDown={(event) => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n goTo(safePage - 1)\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n goTo(safePage + 1)\n }\n }}\n >\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {(heading || description) && (\n <div className='mb-8 text-center'>\n {heading && (\n <h2 className='text-2xl font-bold text-balance md:text-3xl'>{heading}</h2>\n )}\n {description && <p className='text-muted-foreground mt-2 text-balance'>{description}</p>}\n </div>\n )}\n\n <div\n onTouchStart={(event) => setTouchStart(event.touches[0]?.clientX ?? null)}\n onTouchEnd={(event) => {\n if (touchStart === null) return\n const delta = (event.changedTouches[0]?.clientX ?? touchStart) - touchStart\n if (delta <= -SWIPE_THRESHOLD) goTo(safePage + 1)\n else if (delta >= SWIPE_THRESHOLD) goTo(safePage - 1)\n setTouchStart(null)\n }}\n >\n <motion.div\n key={safePage}\n initial={reduceMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className='grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3 lg:gap-6'\n >\n {visible.map((product) => {\n const compareAt = compareAtText(product)\n return (\n <Card\n key={product.id}\n className={`flex h-full flex-col gap-4 overflow-hidden rounded-lg py-4 shadow-none transition-shadow duration-300 hover:shadow-md ${\n onProductClick ? 'cursor-pointer' : ''\n }`}\n onClick={onProductClick ? () => onProductClick(product) : undefined}\n >\n <CardContent className='flex flex-1 flex-col gap-4 px-4'>\n <div className='relative aspect-square overflow-hidden rounded-md'>\n {product.badge && (\n <span className='bg-destructive text-destructive-foreground absolute top-2 left-2 z-10 rounded-full px-2 py-0.5 text-xs font-semibold'>\n {product.badge}\n </span>\n )}\n <img\n src={product.image || undefined}\n alt={product.imageAlt ?? product.title}\n className='size-full rounded-md object-contain'\n loading='lazy'\n width={400}\n height={400}\n />\n </div>\n\n <div className='flex flex-1 flex-col'>\n <h3 className='mb-1 font-medium text-balance'>\n {onProductClick ? (\n <button\n type='button'\n onClick={(event) => {\n event.stopPropagation()\n onProductClick(product)\n }}\n className='hover:text-primary cursor-pointer text-left transition-colors'\n >\n {product.title}\n </button>\n ) : (\n product.title\n )}\n </h3>\n {typeof product.rating === 'number' && Number.isFinite(product.rating) && (\n <div className='text-muted-foreground mb-1 flex items-center gap-1 text-xs'>\n <Star className='size-3.5 fill-current' aria-hidden='true' />\n <span>{product.rating.toFixed(1)}</span>\n </div>\n )}\n <div className='mt-auto flex items-baseline gap-2'>\n <p className='font-semibold'>\n {formatMoney(product.price) ?? unavailablePriceLabel}\n </p>\n {compareAt && (\n <p className='text-muted-foreground text-sm line-through'>{compareAt}</p>\n )}\n </div>\n </div>\n </CardContent>\n\n <CardFooter className='bg-transparent border-t-0 px-3 pt-0 md:px-4'>\n <Button\n variant='outline'\n size='sm'\n className='h-8 w-full cursor-pointer px-3 text-sm'\n onClick={(event) => {\n event.stopPropagation()\n onAddToCart?.(product)\n }}\n >\n {addToCartLabel}\n </Button>\n </CardFooter>\n </Card>\n )\n })}\n </motion.div>\n </div>\n\n {pageCount > 1 && (\n <div className='mt-6 flex items-center justify-center gap-3'>\n <Button\n type='button'\n variant='outline'\n size='icon-sm'\n className='cursor-pointer'\n aria-label={prevLabel}\n disabled={safePage === 0}\n onClick={() => goTo(safePage - 1)}\n >\n <ChevronLeft className='size-4' aria-hidden='true' />\n </Button>\n\n <div className='flex items-center gap-2'>\n {pages.map((_, index) => (\n <button\n key={index}\n type='button'\n aria-label={`${pageLabel} ${index + 1}`}\n aria-current={index === safePage ? 'true' : undefined}\n className={`size-2 rounded-full transition-colors ${\n index === safePage ? 'bg-primary' : 'bg-muted-foreground/40'\n }`}\n onClick={() => goTo(index)}\n />\n ))}\n </div>\n\n <Button\n type='button'\n variant='outline'\n size='icon-sm'\n className='cursor-pointer'\n aria-label={nextLabel}\n disabled={safePage === pageCount - 1}\n onClick={() => goTo(safePage + 1)}\n >\n <ChevronRight className='size-4' aria-hidden='true' />\n </Button>\n </div>\n )}\n\n <p aria-live='polite' className='sr-only'>\n {pageLabel} {safePage + 1} / {pageCount}\n </p>\n </div>\n </section>\n )\n}\n\nexport default ProductShowcase1\n","'use client'\n\nimport { useState } from 'react'\nimport { Heart, Minus, Plus, Star } from 'lucide-react'\nimport type { Image, Money, ProductOption, SelectedOption } from '@thorprovider/types'\nimport { Button } from '../../../ui/button'\nimport { cn } from '../../../lib/utils'\nimport { PRODUCT_IMAGE_FALLBACK } from '../../../lib/contracts'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport { ReactionToggle } from '../../shared/reaction-toggle'\n\n/**\n * Canonical product-detail projection.\n *\n * The block consumes the canonical `@thorprovider/types` shapes (`Money`,\n * `ProductOption`, `SelectedOption`, `Image`) so adapter output maps without a\n * second, drifting product type. The only deviation is `price`: the canon marks\n * it required, but a missing/unresolved backend price is a real, distinct state\n * that must disable purchase — so the projection allows `price` to be absent\n * and the block treats absence as \"unavailable\", never as zero.\n */\nexport interface ProductDetailVariant {\n id: string\n title: string\n sku?: string\n availableForSale: boolean\n selectedOptions: SelectedOption[]\n /** Canonical Money; omit/null when the backend has no resolved price. */\n price?: Money | null\n compareAtPrice?: Money\n image?: Image\n}\n\nexport interface ProductDetailProduct {\n id: string\n handle?: string\n title: string\n description?: string\n vendor?: string\n options: ProductOption[]\n variants: ProductDetailVariant[]\n images: Image[]\n featuredImage?: Image\n}\n\nexport interface ProductOverview1Rating {\n value: number\n count: number\n}\n\nexport interface ProductOverview1Props {\n product: ProductDetailProduct\n /** Controlled selection: the backend variant id, or null/undefined when nothing is explicitly selected. */\n selectedVariantId?: string | null\n onSelectVariant?: (variantId: string) => void\n /** Controlled quantity for the add-to-cart action; defaults to 1 when omitted. */\n quantity?: number\n onQuantityChange?: (quantity: number) => void\n /** Add-to-cart identity is the selected backend variant id, with the requested quantity. */\n onAddToCart?: (variantId: string, quantity: number) => void\n isWishlisted?: boolean\n onToggleWishlist?: (variantId: string, isWishlisted: boolean) => void\n /** Rendered only when the backend supplies it. */\n rating?: ProductOverview1Rating\n /** Rendered only when the backend supplies it. */\n deliveryEstimate?: string\n /** Rendered only when the backend supplies it. */\n shipping?: Money\n formatPrice?: (money: Money) => string\n sizesLabel?: string\n variantLabel?: string\n reviewsLabel?: string\n addToCartLabel?: string\n outOfStockLabel?: string\n unavailablePriceLabel?: string\n selectVariantLabel?: string\n quantityLabel?: string\n deliveryEstimateLabel?: string\n shippingLabel?: string\n removeFromWishlistLabel?: string\n addToWishlistLabel?: string\n imageFallback?: string\n}\n\nfunction variantLabelOf(variant: ProductDetailVariant): string {\n if (variant.title.trim() !== '') return variant.title\n return variant.selectedOptions.map(option => option.value).join(' / ')\n}\n\n/**\n * The add-to-cart payload contract: the explicitly selected backend variant id\n * and a positive quantity (defaults to 1). Returns `null` when no variant has\n * been selected — the block never substitutes the first variant.\n */\nexport function resolveAddToCartPayload(\n variant: ProductDetailVariant | null,\n quantity: number | undefined,\n): { variantId: string; quantity: number } | null {\n if (!variant) return null\n return {\n variantId: variant.id,\n quantity: typeof quantity === 'number' && quantity > 0 ? quantity : 1,\n }\n}\n\nfunction galleryImages(product: ProductDetailProduct, fallback: string): string[] {\n const images = product.images\n .map(image => image.url)\n .filter((url): url is string => typeof url === 'string' && url.trim() !== '')\n if (images.length > 0) return images\n const featured = product.featuredImage?.url\n if (typeof featured === 'string' && featured.trim() !== '') return [featured]\n return [fallback]\n}\n\nexport default function ProductOverview1({\n product,\n selectedVariantId,\n onSelectVariant,\n quantity,\n onQuantityChange,\n onAddToCart,\n isWishlisted = false,\n onToggleWishlist,\n rating,\n deliveryEstimate,\n shipping,\n formatPrice,\n sizesLabel = 'Variantes',\n variantLabel = 'Variante',\n reviewsLabel = 'Reseñas',\n addToCartLabel = 'Agregar al carrito',\n outOfStockLabel = 'Agotado',\n unavailablePriceLabel = 'Precio no disponible',\n selectVariantLabel = 'Selecciona una variante',\n quantityLabel = 'Cantidad',\n deliveryEstimateLabel = 'Entrega estimada',\n shippingLabel = 'Envío',\n removeFromWishlistLabel = 'Quitar de favoritos',\n addToWishlistLabel = 'Agregar a favoritos',\n imageFallback = PRODUCT_IMAGE_FALLBACK,\n}: ProductOverview1Props) {\n const [selectedImage, setSelectedImage] = useState(0)\n\n const selectedVariant =\n selectedVariantId != null\n ? product.variants.find(variant => variant.id === selectedVariantId) ?? null\n : null\n\n const selectedPrice = selectedVariant?.price\n const selectedCompareAt = selectedVariant?.compareAtPrice\n const priceAvailable = isAvailableMoney(selectedPrice)\n const compareAtAvailable = isAvailableMoney(selectedCompareAt)\n const canPurchase = Boolean(selectedVariant?.availableForSale) && priceAvailable\n const quantityValue = quantity ?? 1\n const addPayload = resolveAddToCartPayload(selectedVariant, quantityValue)\n\n const images = galleryImages(product, imageFallback)\n const hasRealImages = images[0] !== imageFallback || product.featuredImage != null\n const activeImage = images[Math.min(selectedImage, images.length - 1)]\n\n const toggleWishlist = () => {\n if (!selectedVariant || !onToggleWishlist) return\n onToggleWishlist(selectedVariant.id, !isWishlisted)\n }\n\n return (\n <div>\n <section className='@container mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-6 py-4 lg:grid-cols-2 lg:gap-8 lg:py-6 xl:grid-cols-3 xl:gap-12 xl:py-12'>\n <div className='flex flex-col justify-between gap-6 lg:gap-8'>\n <div className='flex flex-col gap-2 lg:gap-4'>\n {product.vendor ? (\n <span className='text-sm font-semibold tracking-wide uppercase'>{product.vendor}</span>\n ) : null}\n <h2 className='text-xl font-bold tracking-tight text-balance lg:text-3xl'>{product.title}</h2>\n {product.description ? (\n <p className='text-muted-foreground text-balance'>{product.description}</p>\n ) : null}\n\n {selectedVariant ? (\n priceAvailable ? (\n <p className='text-2xl font-bold tracking-tight'>\n {formatMoney(selectedPrice, formatPrice)}\n {compareAtAvailable ? (\n <span className='text-muted-foreground ms-2 text-base font-normal line-through'>\n {formatMoney(selectedCompareAt, formatPrice)}\n </span>\n ) : null}\n </p>\n ) : (\n <p className='text-muted-foreground text-sm'>{unavailablePriceLabel}</p>\n )\n ) : (\n <p className='text-muted-foreground text-sm'>{selectVariantLabel}</p>\n )}\n </div>\n\n {hasRealImages ? (\n <div className='flex flex-wrap gap-4'>\n {images.map((url, index) => (\n <button\n key={`${product.id}:image:${index}`}\n type='button'\n onClick={() => setSelectedImage(index)}\n aria-label={`${product.title} ${index + 1}`}\n aria-pressed={selectedImage === index}\n className={cn(\n 'ring-offset-background size-16 cursor-pointer overflow-hidden rounded-sm ring-offset-2 transition-all lg:size-18',\n selectedImage === index && 'ring-foreground ring-2',\n )}\n >\n <img src={url || undefined} alt='' className='size-full object-cover' />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className='row-span-2 row-start-1 lg:col-start-2'>\n <div className='bg-muted aspect-square w-full overflow-hidden rounded-lg'>\n <img\n src={activeImage || undefined}\n alt={product.title}\n className='h-90 w-full object-cover'\n />\n </div>\n </div>\n\n <div className='flex flex-col gap-6 lg:gap-10'>\n {product.variants.length > 0 ? (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{sizesLabel}</h3>\n <div className='flex flex-wrap gap-3'>\n {product.variants.map(variant => {\n const isSelected = variant.id === selectedVariantId\n return (\n <Button\n key={variant.id}\n variant={isSelected ? 'default' : 'outline'}\n onClick={onSelectVariant ? () => onSelectVariant(variant.id) : undefined}\n disabled={!variant.availableForSale}\n aria-pressed={isSelected}\n className='h-9 cursor-pointer rounded-full px-4'\n >\n {variantLabelOf(variant)}\n {!variant.availableForSale ? (\n <span className='text-muted-foreground ms-2 text-xs font-normal'>\n {outOfStockLabel}\n </span>\n ) : null}\n </Button>\n )\n })}\n </div>\n {selectedVariant && selectedVariant.selectedOptions.length > 0 ? (\n <p className='text-muted-foreground text-sm'>\n {selectedVariant.selectedOptions\n .map((option: SelectedOption) => `${option.name}: ${option.value}`)\n .join(' · ')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {rating ? (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{reviewsLabel}</h3>\n <div className='flex items-center gap-2'>\n <div className='flex gap-1' aria-hidden='true'>\n {[0, 1, 2, 3, 4].map(index => (\n <Star\n key={index}\n className='text-foreground size-5'\n fill={index < rating.value ? 'currentColor' : 'none'}\n />\n ))}\n </div>\n <span className='text-muted-foreground text-sm tabular-nums'>\n {`${rating.value} (${rating.count})`}\n </span>\n </div>\n </div>\n ) : null}\n\n {onQuantityChange ? (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{quantityLabel}</h3>\n <div className='border-border flex w-fit items-center rounded-md border'>\n <Button\n type='button'\n variant='ghost'\n size='icon'\n className='size-9 rounded-r-none'\n aria-label={`${quantityLabel} -1`}\n onClick={() => onQuantityChange(Math.max(1, quantityValue - 1))}\n disabled={quantityValue <= 1}\n >\n <Minus />\n </Button>\n <span className='w-10 text-center text-sm tabular-nums'>{quantityValue}</span>\n <Button\n type='button'\n variant='ghost'\n size='icon'\n className='size-9 rounded-l-none'\n aria-label={`${quantityLabel} +1`}\n onClick={() => onQuantityChange(quantityValue + 1)}\n >\n <Plus />\n </Button>\n </div>\n </div>\n ) : null}\n\n {deliveryEstimate || shipping ? (\n <dl className='text-muted-foreground flex flex-col gap-1 text-sm'>\n {deliveryEstimate ? (\n <div className='flex gap-2'>\n <dt>{deliveryEstimateLabel}</dt>\n <dd className='text-foreground'>{deliveryEstimate}</dd>\n </div>\n ) : null}\n {isAvailableMoney(shipping) ? (\n <div className='flex gap-2'>\n <dt>{shippingLabel}</dt>\n <dd className='text-foreground'>{formatMoney(shipping, formatPrice)}</dd>\n </div>\n ) : null}\n </dl>\n ) : null}\n\n <div className='flex gap-4'>\n <Button\n className='h-10 flex-1 cursor-pointer rounded-full px-8'\n size='lg'\n disabled={!canPurchase}\n onClick={\n onAddToCart && addPayload\n ? () => onAddToCart(addPayload.variantId, addPayload.quantity)\n : undefined\n }\n >\n {addToCartLabel}\n </Button>\n <Button\n variant='outline'\n size='icon'\n className='size-9 cursor-pointer rounded-full'\n disabled={!selectedVariant}\n onClick={onToggleWishlist ? toggleWishlist : undefined}\n aria-pressed={isWishlisted}\n aria-label={isWishlisted ? removeFromWishlistLabel : addToWishlistLabel}\n >\n <ReactionToggle\n active={isWishlisted}\n icon={Heart}\n iconClassName='size-5'\n activeColorClassName='text-primary'\n />\n </Button>\n </div>\n </div>\n </div>\n </section>\n </div>\n )\n}\n\nexport { variantLabelOf, galleryImages }\n","import { z } from 'zod'\nimport type { Money, PaymentMethod, ProductPreview } from '@thorprovider/types'\n\n/**\n * Serialization contracts for spec-driven storefronts.\n *\n * These Zod schemas are the *serializable subset* of what a spec may write for\n * a block. The component keeps its rich React interface; the catalog/registry\n * is the adapter that maps these props to real component props and binds\n * callbacks (see storefronts-on-blocks design D3). `z.infer` is the typed\n * boundary between spec and catalog — a prop outside the schema is a compile\n * error, not a runtime surprise.\n *\n * Data shapes are projections of the @thorprovider/types canon so that\n * @thorprovider/adapters output validates without conflict:\n * - Prices are plain numbers here while the canon `Money` is a decimal string\n * ({ amount: \"45.00\", currencyCode }). The projection happens at the\n * loader boundary.\n * - Blocks use `title` while the canon `ProductPreview` uses `name`. Reconcile\n * via the canonical aliases below or the catalog/loader adapter.\n */\nexport type CanonMoney = Money\nexport type CanonProduct = ProductPreview\n\n/**\n * Fallback data-URI for required image fields when the data source has no\n * image. Image fields are non-optional `z.string()` in these contracts, so the\n * boundary must never emit `\"\"` (React warns about `src=\"\"`); it must emit a\n * real, renderable value. Hosts may override with their own branded fallback\n * (e.g. electrostore's `CATEGORY_IMAGE_FALLBACK`), but blocks ship a neutral\n * one so direct consumers are safe by default.\n */\nexport const PRODUCT_IMAGE_FALLBACK =\n 'data:image/svg+xml;charset=utf-8,' +\n encodeURIComponent(\n `<svg xmlns='http://www.w3.org/2000/svg' width='600' height='600'><rect width='100%' height='100%' fill='#e2e8f0'/><g fill='none' stroke='#94a3b8' stroke-width='12' stroke-linecap='round'><path d='M150 300h300M300 150v300'/><path d='M220 230h50M220 300h50M220 370h50'/><path d='M330 230h50M330 300h50M330 370h50'/></g></svg>`,\n )\n\n// ---------------------------------------------------------------------------\n// Data contracts\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical `Money` (`@thorprovider/types`): a decimal string in major units\n * (`\"69.99\"`), never cents. A missing price is represented by omitting the\n * field (or `null` on a nullable field), not by an empty string.\n *\n * The amount stays a permissive `z.string()` on purpose: an unresolved backend\n * price may arrive as the canonical sentinel `\"\"`, and tightening the schema\n * would reject the whole view instead of letting the presentation layer render\n * an unavailable state. Validity is enforced at render time by\n * `isAvailableMoney`/`formatMoney` (a `\"\"`/malformed amount never becomes `$0`).\n */\nexport const moneySchema: z.ZodType<Money> = z.object({\n amount: z.string(),\n currencyCode: z.string(),\n})\n\nconst imageSchema = z.object({\n id: z.string().optional(),\n url: z.string(),\n altText: z.string(),\n width: z.number().optional(),\n height: z.number().optional(),\n})\n\nconst selectedOptionSchema = z.object({\n name: z.string(),\n value: z.string(),\n})\n\nexport const productDetailVariantSchema = z.object({\n id: z.string(),\n title: z.string(),\n sku: z.string().optional(),\n availableForSale: z.boolean(),\n selectedOptions: z.array(selectedOptionSchema),\n /** Omit or null when the backend has no resolved price (purchase disabled). */\n price: moneySchema.nullish(),\n compareAtPrice: moneySchema.optional(),\n image: imageSchema.optional(),\n})\nexport type ProductDetailVariantSpec = z.infer<typeof productDetailVariantSchema>\n\nexport const productDetailProductSchema = z.object({\n id: z.string(),\n handle: z.string().optional(),\n title: z.string(),\n description: z.string().optional(),\n vendor: z.string().optional(),\n options: z.array(z.object({ id: z.string(), name: z.string(), values: z.array(z.string()) })),\n variants: z.array(productDetailVariantSchema),\n images: z.array(imageSchema),\n featuredImage: imageSchema.optional(),\n})\nexport type ProductDetailProductSpec = z.infer<typeof productDetailProductSchema>\n\nexport const productOverview1PropsSchema = z.object({\n product: productDetailProductSchema,\n selectedVariantId: z.string().nullable().optional(),\n quantity: z.number().optional(),\n rating: z.object({ value: z.number(), count: z.number() }).optional(),\n deliveryEstimate: z.string().optional(),\n shipping: moneySchema.optional(),\n sizesLabel: z.string().optional(),\n variantLabel: z.string().optional(),\n reviewsLabel: z.string().optional(),\n addToCartLabel: z.string().optional(),\n outOfStockLabel: z.string().optional(),\n unavailablePriceLabel: z.string().optional(),\n selectVariantLabel: z.string().optional(),\n quantityLabel: z.string().optional(),\n deliveryEstimateLabel: z.string().optional(),\n shippingLabel: z.string().optional(),\n})\nexport type ProductOverview1SpecProps = z.infer<typeof productOverview1PropsSchema>\n\nexport const cardProductSchema = z.object({\n id: z.union([z.string(), z.number()]),\n title: z.string(),\n price: z.number(),\n originalPrice: z.number().optional(),\n image: z.string(),\n badge: z.string().optional(),\n})\nexport type CardProduct = z.infer<typeof cardProductSchema>\n\nexport const cartItemSchema = z.object({\n id: z.string(),\n name: z.string(),\n price: z.number(),\n quantity: z.number().int().min(0),\n /** Optional; absent images are omitted, never serialized as `\"\"`. */\n image: z.string().optional(),\n variant: z.string().optional(),\n /** Canonical backend per-unit price, preferred for display when present. */\n unitPrice: moneySchema.optional(),\n /** Canonical backend line total, preferred over `price * quantity`. */\n lineTotal: moneySchema.optional(),\n})\nexport type CartItem = z.infer<typeof cartItemSchema>\n\nexport const cartTotalsSchema = z.object({\n subtotal: moneySchema,\n discount: moneySchema.optional(),\n tax: moneySchema.optional(),\n shipping: moneySchema.optional(),\n total: moneySchema,\n})\nexport type CartTotals = z.infer<typeof cartTotalsSchema>\n\nexport const recentlyViewedItemSchema = z.object({\n id: z.string(),\n name: z.string(),\n price: z.number(),\n image: z.string(),\n})\nexport type RecentlyViewedItem = z.infer<typeof recentlyViewedItemSchema>\n\nexport const promotionSchema = z.object({\n threshold: z.number(),\n reward: z.string(),\n icon: z.string().default('gift'),\n})\nexport type Promotion = z.infer<typeof promotionSchema>\n\nconst storeCategoryBase = {\n label: z.string(),\n href: z.string(),\n emphasis: z.boolean().optional(),\n}\n\nexport const storeCategorySchema: z.ZodType<StoreCategory> = z.lazy(() =>\n z.object({\n ...storeCategoryBase,\n children: z.array(storeCategorySchema).optional(),\n }),\n)\nexport type StoreCategory = {\n label: string\n href: string\n children?: StoreCategory[]\n emphasis?: boolean\n}\n\nexport const utilityLinkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\nexport type UtilityLink = z.infer<typeof utilityLinkSchema>\n\nexport const navCartItemSchema = z.object({\n id: z.string(),\n name: z.string(),\n variant: z.string().optional(),\n price: z.number(),\n qty: z.number().int().min(0),\n /** Optional; absent images are omitted, never serialized as `\"\"`. */\n image: z.string().optional(),\n})\nexport type NavCartItem = z.infer<typeof navCartItemSchema>\n\nexport const storeUserSchema = z.object({\n name: z.string(),\n email: z.string(),\n avatar: z.string().optional(),\n initials: z.string(),\n})\nexport type StoreUser = z.infer<typeof storeUserSchema>\n\nexport const accountMenuItemSchema = z.object({\n label: z.string(),\n href: z.string(),\n description: z.string().optional(),\n icon: z.enum(['orders', 'wishlist', 'addresses', 'settings']).optional(),\n})\nexport type AccountMenuItem = z.infer<typeof accountMenuItemSchema>\n\n/**\n * Serialization contract for a payment method offered at checkout.\n *\n * A projection of `@thorprovider/types` `PaymentMethod` — the storefront-facing\n * shape produced by the adapters transform. Checkout blocks render the method\n * list from this data instead of hardcoding providers.\n */\nexport const paymentMethodSchema: z.ZodType<PaymentMethod> = z.object({\n id: z.string(),\n name: z.string(),\n type: z.enum([\n 'card',\n 'wallet',\n 'bank_transfer',\n 'buy_now_pay_later',\n 'cash_on_delivery',\n 'crypto',\n 'other',\n ]),\n isEnabled: z.boolean(),\n requiresSetup: z.boolean(),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n features: z\n .object({\n saveForLater: z.boolean().optional(),\n requires3DS: z.boolean().optional(),\n supportsRefunds: z.boolean().optional(),\n minAmount: z.number().optional(),\n maxAmount: z.number().optional(),\n supportedCurrencies: z.array(z.string()).optional(),\n requiresVerification: z.boolean().optional(),\n })\n .optional(),\n logo: z.string().optional(),\n})\n\n// ---------------------------------------------------------------------------\n// Block prop schemas\n// ---------------------------------------------------------------------------\n\nexport const buttonPropsSchema = z.object({\n variant: z\n .enum(['default', 'destructive', 'outline', 'secondary', 'ghost', 'link'])\n .optional(),\n size: z\n .enum(['default', 'xs', 'sm', 'lg', 'icon', 'icon-xs', 'icon-sm', 'icon-lg'])\n .optional(),\n disabled: z.boolean().optional(),\n className: z.string().optional(),\n})\nexport type ButtonSpecProps = z.infer<typeof buttonPropsSchema>\n\nexport const storeContainer1PropsSchema = z.object({\n size: z.enum(['default', 'narrow', 'wide', 'full']).optional(),\n className: z.string().optional(),\n})\nexport type StoreContainer1SpecProps = z.infer<typeof storeContainer1PropsSchema>\n\nexport const productCard1PropsSchema = z.object({\n products: z.array(cardProductSchema),\n heading: z.string().optional(),\n maxItems: z.number().int().positive().optional(),\n})\nexport type ProductCard1SpecProps = z.infer<typeof productCard1PropsSchema>\n\n/**\n * Canonical product presentation — the serializable projection a storefront host\n * produces from a canonical `Product` for the merchandising sections. Unlike\n * `cardProductSchema` (legacy, numeric `price`), `price`/`compareAtPrice` carry\n * canonical `Money` (decimal major-unit string + currency code), so the block\n * formats in the shopper's currency and locale and renders a truthful\n * unavailable state instead of `$0`. Optional fields are omitted, never `\"\"`.\n *\n * This contract is additive: `cardProductSchema` and its consumers are\n * unchanged, and a legacy numeric `price` still renders the legacy output.\n */\nexport const productPresentationSchema = z.object({\n id: z.union([z.string(), z.number()]),\n title: z.string(),\n /** Omitted (never `\"\"`) when the backend has no image. */\n image: z.string().optional(),\n imageAlt: z.string().optional(),\n /** Product destination; omitted when unknown. */\n href: z.string().optional(),\n price: moneySchema,\n /** Comparison (\"was\") price; rendered only when valid and higher than `price`. */\n compareAtPrice: moneySchema.optional(),\n /** Only from real evidence; omitted otherwise (never fabricated). */\n rating: z.number().optional(),\n badge: z.string().optional(),\n})\nexport type ProductPresentation = z.infer<typeof productPresentationSchema>\n\n/**\n * Serializable contract for the combined grid-and-carousel product\n * presentation (`ProductShowcase1`). The grid pages are fixed-size, navigated\n * manually (prev/next) with a visible current-page indication; there is no\n * autoplay and no infinite loop. React-only callbacks are excluded.\n */\nexport const productShowcase1PropsSchema = z.object({\n products: z.array(productPresentationSchema),\n heading: z.string().optional(),\n description: z.string().optional(),\n pageSize: z.number().int().positive().optional(),\n prevLabel: z.string().optional(),\n nextLabel: z.string().optional(),\n pageLabel: z.string().optional(),\n unavailablePriceLabel: z.string().optional(),\n emptyLabel: z.string().optional(),\n addToCartLabel: z.string().optional(),\n})\nexport type ProductShowcase1SpecProps = z.infer<typeof productShowcase1PropsSchema>\n\nexport const shoppingCart4PropsSchema = z.object({\n items: z.array(cartItemSchema),\n promotions: z.array(promotionSchema).default([]),\n recentlyViewed: z.array(recentlyViewedItemSchema).optional(),\n /** Backend-authoritative totals; rendered verbatim, never computed locally. */\n totals: cartTotalsSchema.optional(),\n totalsState: z.enum(['idle', 'pending', 'error']).optional(),\n totalsErrorLabel: z.string().optional(),\n totalsUnavailableLabel: z.string().optional(),\n amountUnavailableLabel: z.string().optional(),\n retryLabel: z.string().optional(),\n taxRate: z.number().optional(),\n titleLabel: z.string().optional(),\n subtotalLabel: z.string().optional(),\n discountLabel: z.string().optional(),\n taxLabel: z.string().optional(),\n shippingLabel: z.string().optional(),\n shippingFreeLabel: z.string().optional(),\n totalLabel: z.string().optional(),\n totalsPendingLabel: z.string().optional(),\n awayFromLabel: z.string().optional(),\n activatedLabel: z.string().optional(),\n itemsLabel: z.string().optional(),\n expressCheckoutLabel: z.string().optional(),\n expressLabel: z.string().optional(),\n standardLabel: z.string().optional(),\n estimatedDeliveryLabel: z.string().optional(),\n secureCheckoutLabel: z.string().optional(),\n recentlyViewedLabel: z.string().optional(),\n collapseLabel: z.string().optional(),\n expandLabel: z.string().optional(),\n checkoutLabel: z.string().optional(),\n quickCheckoutLabel: z.string().optional(),\n checkoutNowLabel: z.string().optional(),\n emptyLabel: z.string().optional(),\n removeLabel: z.string().optional(),\n decreaseLabel: z.string().optional(),\n increaseLabel: z.string().optional(),\n})\nexport type ShoppingCart4SpecProps = z.infer<typeof shoppingCart4PropsSchema>\n\n/**\n * Optional brand seams shared by the existing blocks. These mirror the\n * components' optional props as a serializable subset (no React): an accent\n * marks a trailing segment of the wordmark/brand name, and an editorial image\n * is a native `<img>` source. Omitting each keeps the block's current output.\n */\nexport const logoAccentSchema = z.object({\n text: z.string(),\n className: z.string().optional(),\n})\nexport type LogoAccent = z.infer<typeof logoAccentSchema>\n\nexport const brandAccentSchema = z.object({\n text: z.string(),\n className: z.string().optional(),\n})\nexport type BrandAccent = z.infer<typeof brandAccentSchema>\n\nexport const heroImageSchema = z.object({\n src: z.string(),\n alt: z.string(),\n})\nexport type HeroImage = z.infer<typeof heroImageSchema>\n\nexport const navbar4PropsSchema = z.object({\n storeCategories: z.array(storeCategorySchema),\n shippingNote: z.string().optional(),\n utilityLinks: z.array(utilityLinkSchema),\n logoText: z.string(),\n logoHref: z.string().optional(),\n /** Optional accent for a trailing segment of `logoText`; omitted → unchanged. */\n logoAccent: logoAccentSchema.optional(),\n /**\n * Consumer-supplied classes merged onto the block's outer surface as the\n * final argument (e.g. a semantic surface token). Omitted → unchanged.\n */\n className: z.string().optional(),\n accountHref: z.string().optional(),\n searchQuery: z.string().optional(),\n items: z.array(navCartItemSchema).optional(),\n /** Authoritative backend subtotal for the mini-cart. */\n subtotal: moneySchema.optional(),\n subtotalUnavailableLabel: z.string().optional(),\n user: storeUserSchema.optional(),\n accountMenuItems: z.array(accountMenuItemSchema).optional(),\n accountPending: z.boolean().optional(),\n accountUnavailable: z.boolean().optional(),\n})\nexport type Navbar4SpecProps = z.infer<typeof navbar4PropsSchema>\n\n/**\n * Serializable contracts for the two bounded editorial sections (`faq`, `cta`).\n * These are the serializable subset of `FaqBlock1Props`/`CtaSection1Props`: the\n * React-only callbacks (`onPrimaryClick`/`onSecondaryClick`) are intentionally\n * excluded — the catalog adapter binds them (see design D3).\n */\nexport const ctaSchema = z.object({\n label: z.string(),\n href: z.string().optional(),\n})\nexport type CtaSpec = z.infer<typeof ctaSchema>\n\nexport const faqItemSchema = z.object({\n value: z.string(),\n question: z.string(),\n answer: z.string(),\n})\nexport type FaqItemSpec = z.infer<typeof faqItemSchema>\n\nexport const faqBlock1PropsSchema = z.object({\n items: z.array(faqItemSchema),\n title: z.string().optional(),\n description: z.string().optional(),\n accordionType: z.enum(['single', 'multiple']).optional(),\n})\nexport type FaqBlock1SpecProps = z.infer<typeof faqBlock1PropsSchema>\n\nexport const ctaSection1PropsSchema = z.object({\n badgeText: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n primaryCta: ctaSchema.optional(),\n secondaryCta: ctaSchema.optional(),\n})\nexport type CtaSection1SpecProps = z.infer<typeof ctaSection1PropsSchema>\n\n// Pure monetary helpers, re-exported from the server-safe contracts entry so a\n// host boundary can validate/format `Money` without importing the React entry.\nexport { isCompleteFiniteDecimal, isAvailableMoney, formatMoney } from './money'\nexport { resolveAbsoluteQuantity } from './cart'\n","/**\n * Cart line quantity normalization shared by the curated cart surfaces.\n *\n * The Navbar mini-cart expresses a quantity DELTA while the cart page reports\n * an ABSOLUTE quantity. The boundary normalizes the delta against the\n * authoritative current line quantity (from the backend cart) before mutating;\n * it must never reinterpret one as the other.\n */\nexport function resolveAbsoluteQuantity(currentQuantity: number, delta: number): number {\n return Math.max(1, currentQuantity + delta)\n}\n","'use client'\n\nimport { useEffect, useRef, useState, type ComponentType } from 'react'\n\nimport { cn } from '../../lib/utils'\n\nconst PARTICLE_COUNT = 8\n\nconst STYLE_MARKER = 'data-reaction-toggle-keyframes'\nconst STYLES = `\n@keyframes reaction-toggle-pop {\n 0% { transform: scale(1); }\n 30% { transform: scale(0.82); }\n 100% { transform: scale(1); }\n}\n@keyframes reaction-toggle-burst {\n 0% { opacity: 0; transform: translate(0, 0) scale(0.4); }\n 20% { opacity: 1; transform: translate(calc(var(--rx) * 0.25), calc(var(--ry) * 0.25)) scale(1); }\n 100% { opacity: 0; transform: translate(var(--rx), var(--ry)) scale(0.6); }\n}\n.reaction-toggle-pop {\n animation: reaction-toggle-pop 350ms cubic-bezier(0.34, 1.96, 0.64, 1);\n}\n.reaction-toggle-burst {\n animation-name: reaction-toggle-burst;\n animation-timing-function: ease-out;\n animation-fill-mode: forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n .reaction-toggle-pop,\n .reaction-toggle-burst { animation: none !important; }\n}\n`\n\nfunction useReactionToggleStyles() {\n useEffect(() => {\n if (document.head.querySelector(`[${STYLE_MARKER}]`)) return\n\n const style = document.createElement('style')\n style.setAttribute(STYLE_MARKER, '')\n style.textContent = STYLES\n document.head.append(style)\n }, [])\n}\n\ntype ReactionIconProps = {\n className?: string\n}\n\ntype Particle = {\n rx: number\n ry: number\n duration: number\n delay: number\n size: number\n}\n\nfunction buildParticles(): Particle[] {\n return Array.from({ length: PARTICLE_COUNT }, (_, i) => {\n const angle = (Math.PI * 2 * i) / PARTICLE_COUNT + (Math.random() - 0.5) * 0.4\n const dist = 16 + Math.random() * 10\n\n return {\n rx: Math.round(Math.cos(angle) * dist * 10) / 10,\n ry: Math.round(Math.sin(angle) * dist * 10) / 10,\n duration: Math.round(500 + Math.random() * 200),\n delay: Math.round(Math.random() * 60),\n size: Math.round((0.7 + Math.random() * 0.8) * 100) / 100,\n }\n })\n}\n\ntype ReactionToggleProps = {\n active: boolean\n icon: ComponentType<ReactionIconProps>\n className?: string\n iconClassName?: string\n activeColorClassName?: string\n}\n\nexport function ReactionToggle({\n active,\n icon: Icon,\n className,\n iconClassName,\n activeColorClassName = 'text-primary',\n}: ReactionToggleProps) {\n const [isBursting, setIsBursting] = useState(false)\n const wasActive = useRef(active)\n const particlesRef = useRef<Particle[]>(buildParticles())\n\n useReactionToggleStyles()\n\n useEffect(() => {\n if (active && !wasActive.current) {\n particlesRef.current = buildParticles()\n setIsBursting(true)\n const timeout = setTimeout(() => setIsBursting(false), 700)\n wasActive.current = active\n return () => clearTimeout(timeout)\n }\n\n wasActive.current = active\n }, [active])\n\n return (\n <span className={cn('relative inline-flex', className)}>\n <span className={cn('inline-flex', active && 'reaction-toggle-pop')}>\n <Icon\n className={cn(\n 'transition-[fill,stroke,color] duration-150 ease-[cubic-bezier(0.22,1,0.36,1)]',\n active ? cn('fill-current', activeColorClassName) : 'fill-transparent',\n iconClassName\n )}\n />\n </span>\n\n {isBursting && (\n <span\n aria-hidden='true'\n className={cn('pointer-events-none absolute top-1/2 left-1/2 size-0', activeColorClassName)}\n >\n {particlesRef.current.map((particle, index) => (\n <i\n key={index}\n className='reaction-toggle-burst absolute rounded-full bg-current opacity-0'\n style={\n {\n '--rx': `${particle.rx}px`,\n '--ry': `${particle.ry}px`,\n animationDuration: `${particle.duration}ms`,\n animationDelay: `${particle.delay}ms`,\n width: `${2.5 * particle.size}px`,\n height: `${2.5 * particle.size}px`,\n left: `${-1.25 * particle.size}px`,\n top: `${-1.25 * particle.size}px`,\n } as React.CSSProperties\n }\n />\n ))}\n </span>\n )}\n </span>\n )\n}","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { Button } from '../../../ui/button'\nimport { cn } from '../../../lib/utils'\nimport { Heart, ShoppingBag, Truck, Star, Check } from 'lucide-react'\nimport { Carousel, CarouselContent, CarouselItem, type CarouselApi } from '../../../ui/carousel'\nimport { ReactionToggle } from '../../shared/reaction-toggle'\n\nexport interface ProductOverview2ProductImage {\n src: string\n alt: string\n}\n\nexport interface ProductOverview2ProductColor {\n name: string\n value: string\n}\n\nexport interface ProductOverview2ProductSize {\n eu: number\n uk: number\n us: number\n}\n\nexport interface ProductOverview2Product {\n id: string\n brand: string\n name: string\n sku: string\n price: number\n currency: string\n rating: number\n reviews: number\n images: ProductOverview2ProductImage[]\n sizes: ProductOverview2ProductSize[]\n colors: ProductOverview2ProductColor[]\n}\n\nexport interface ProductOverview2Props {\n product: ProductOverview2Product\n sizesLabel?: string\n colorLabel?: string\n reviewsLabel?: string\n addToCartLabel?: string\n removeFromWishlistLabel?: string\n addToWishlistLabel?: string\n sizeGuideLabel?: string\n freeDeliveryLabel?: string\n onAddToCart?: (product: ProductOverview2Product) => void\n onToggleWishlist?: (product: ProductOverview2Product, isWishlisted: boolean) => void\n}\n\nexport default function ProductOverview2({\n product,\n sizesLabel = 'Tallas',\n colorLabel = 'Color',\n reviewsLabel = 'Reseñas',\n addToCartLabel = 'Agregar al carrito',\n removeFromWishlistLabel = 'Quitar de favoritos',\n addToWishlistLabel = 'Agregar a favoritos',\n sizeGuideLabel = 'Guía de tallas',\n freeDeliveryLabel = 'Envío gratis en pedidos superiores a $30.00',\n onAddToCart,\n onToggleWishlist,\n}: ProductOverview2Props) {\n const [selectedImage, setSelectedImage] = useState(0)\n const [selectedSize, setSelectedSize] = useState<number | null>(product.sizes[1]?.eu ?? null)\n const [selectedColor, setSelectedColor] = useState(product.colors[0])\n const [isWishlisted, setIsWishlisted] = useState(false)\n const [sizeType, setSizeType] = useState<'eu' | 'uk' | 'us'>('eu')\n const [carouselApi, setCarouselApi] = useState<CarouselApi>()\n\n useEffect(() => {\n if (!carouselApi) return\n\n // Set carousel to the selected image\n carouselApi.scrollTo(selectedImage)\n\n // Update selected image when carousel changes\n const handleSelect = () => {\n const currentIndex = carouselApi.selectedScrollSnap()\n setSelectedImage(currentIndex)\n }\n\n carouselApi.on('select', handleSelect)\n return () => {\n carouselApi.off('select', handleSelect)\n }\n }, [carouselApi, selectedImage])\n\n return (\n <section className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-8 py-4 md:py-6 lg:grid-cols-2 lg:py-12'>\n {/* Product Gallery */}\n <div className='flex flex-col gap-4'>\n {/* Main Image - Carousel */}\n <Carousel setApi={setCarouselApi} className='w-full'>\n <CarouselContent>\n {product.images.map((image, index) => (\n <CarouselItem key={index}>\n <div className='flex h-130 w-full items-center justify-center overflow-hidden rounded-lg bg-muted'>\n <img src={image.src || undefined} alt={image.alt} className='h-full w-full object-cover' />\n </div>\n </CarouselItem>\n ))}\n </CarouselContent>\n </Carousel>\n\n {/* Thumbnails */}\n <div className='flex flex-wrap gap-4'>\n {product.images.map((image, index) => (\n <button\n type='button'\n key={index}\n onClick={() => setSelectedImage(index)}\n aria-label={`Mostrar imagen ${index + 1} de ${product.name}`}\n className='aspect-square size-16 cursor-pointer'\n >\n <img\n src={image.src || undefined}\n alt={image.alt}\n className={cn(\n 'size-full cursor-pointer rounded-md object-cover ring-offset-2 transition-all',\n selectedImage === index ? 'ring-foreground ring-2' : '',\n )}\n />\n </button>\n ))}\n </div>\n </div>\n\n {/* Product Details */}\n <div className='flex flex-col gap-6'>\n {/* Product Header */}\n <header className='flex flex-col gap-4'>\n <div className='flex items-center'>\n <Button variant='ghost' size='icon' className='bg-primary size-6 scale-75 cursor-pointer rounded-full'>\n <Check className='text-primary-foreground size-4' />\n </Button>\n <span className='ms-2 font-medium'>{product.brand}</span>\n <span className='text-muted-foreground ms-auto'>{product.sku}</span>\n </div>\n <h1 className='text-xl font-bold text-balance xl:text-3xl'>{product.name}</h1>\n\n {/* Ratings */}\n <div className='flex items-center gap-2'>\n <div className='flex'>\n {[...Array(5)].map((_, i) => (\n <Star\n key={i}\n className={cn(\n 'size-5',\n i < product.rating ? 'fill-foreground text-foreground' : 'text-muted-foreground',\n )}\n />\n ))}\n </div>\n <span className='text-muted-foreground text-sm'>\n {product.reviews} {reviewsLabel}\n </span>\n </div>\n </header>\n\n {/* Price */}\n <p className='text-4xl font-bold'>\n {product.currency}\n {product.price.toFixed(2)}\n </p>\n {/* Color Selection */}\n <div>\n <div className='mb-4 flex items-center text-sm'>\n <span className='font-medium'>{colorLabel}:</span>\n <span className='text-muted-foreground ms-1'>{selectedColor.name}</span>\n </div>\n <div className='flex gap-3'>\n {product.colors.map(color => (\n <Button\n key={color.name}\n onClick={() => setSelectedColor(color)}\n className={cn(\n 'h-9 px-4 py-2',\n 'ring-offset-background size-8 cursor-pointer rounded-sm ring-offset-2 transition-all',\n selectedColor.name === color.name && 'ring-foreground ring-2',\n selectedColor.name !== color.name &&\n ['Black', 'White'].includes(color.name) &&\n 'outline-muted outline-solid',\n )}\n style={{ backgroundColor: color.value }}\n aria-label={`Seleccionar color ${color.name}`}\n aria-selected={selectedColor.name === color.name}\n />\n ))}\n </div>\n </div>\n\n {/* Size Selection */}\n <div>\n <div className='mb-4 flex items-center justify-between'>\n <div className='flex items-center'>\n <span className='me-4 text-sm font-medium'>{sizesLabel}</span>\n <div className='border-input flex rounded-sm border p-1'>\n {['eu', 'uk', 'us'].map(type => (\n <Button\n key={type}\n variant='ghost'\n size='sm'\n onClick={() => setSizeType(type as 'eu' | 'uk' | 'us')}\n className={cn(\n 'cursor-pointer rounded-sm px-2 text-xs',\n sizeType === type && 'bg-secondary text-secondary-foreground',\n )}\n aria-label={`Seleccionar talla ${type.toUpperCase()}`}\n aria-selected={sizeType === type}\n >\n {type.toUpperCase()}\n </Button>\n ))}\n </div>\n </div>\n <Button variant='ghost' className='h-9 px-4 py-2 text-primary cursor-pointer text-sm hover:underline'>\n {sizeGuideLabel}\n </Button>\n </div>\n <div className='grid grid-cols-4 gap-2 xl:grid-cols-5'>\n {product.sizes.map(size => (\n <Button\n key={size.eu}\n variant={selectedSize === size.eu ? 'secondary' : 'outline'}\n onClick={() => setSelectedSize(size.eu)}\n className='h-12 cursor-pointer rounded-full shadow-none'\n >\n {sizeType === 'eu' ? size.eu : sizeType === 'uk' ? size.uk : size.us}\n </Button>\n ))}\n </div>\n </div>\n {/* Add to Cart */}\n <div>\n <div className='mb-4 flex gap-4'>\n <Button\n className='h-12 flex-1 cursor-pointer rounded-md'\n size='lg'\n onClick={onAddToCart ? () => onAddToCart(product) : undefined}\n >\n <ShoppingBag />\n {addToCartLabel}\n </Button>\n <Button\n variant='outline'\n size='icon'\n className='border-input size-12 cursor-pointer rounded-md transition-colors'\n onClick={() => {\n const next = !isWishlisted\n setIsWishlisted(next)\n onToggleWishlist?.(product, next)\n }}\n aria-label={isWishlisted ? removeFromWishlistLabel : addToWishlistLabel}\n >\n <ReactionToggle active={isWishlisted} icon={Heart} iconClassName='size-5' activeColorClassName='text-primary' />\n </Button>\n </div>\n <div className='text-muted-foreground flex items-center justify-center gap-2 text-sm'>\n <Truck className='size-4' />\n <span>{freeDeliveryLabel}</span>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n}","'use client'\n\nimport { useState } from 'react'\nimport { Camera, Heart, Info, MessageSquare, Package, Share2, ShoppingCart, Star } from 'lucide-react'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport { ReactionToggle } from '../../shared/reaction-toggle'\nimport { ProductOverview5Gallery } from './product-overview-5-gallery'\nimport { ProductOverview5LightboxTab } from './product-overview-5-lightbox-tab'\nimport { ProductOverview5ReviewsTab } from './product-overview-5-reviews-tab'\nimport {\n ProductOverview5Tabs,\n ProductOverview5TabsContentFade,\n ProductOverview5TabsIndicator,\n ProductOverview5TabsList,\n ProductOverview5TabsTrigger,\n} from './product-overview-5-tabs'\n\nexport interface ProductOverview5Review {\n id: number\n author: string\n rating: number\n comment: string\n date: string\n helpful: number\n}\n\nexport interface ProductOverview5Product {\n name: string\n price: number\n originalPrice: null | number\n rating: number\n reviewCount: number\n sku: string\n mainImages: string[]\n galleryImages: string[]\n description: string\n features: string[]\n specifications: Record<string, string>\n userReviews: ProductOverview5Review[]\n}\n\nexport interface ProductOverview5Props {\n product: ProductOverview5Product\n badgeLabel?: string\n availabilityLabel?: string\n currencySymbol?: string\n skuLabel?: string\n overviewLabel?: string\n specsLabel?: string\n featuresLabel?: string\n specificationsLabel?: string\n reviewsLabel?: string\n galleryLabel?: string\n saveLabel?: string\n savedLabel?: string\n shareLabel?: string\n addToCartLabel?: string\n basedOnReviewsLabel?: string\n foundHelpfulLabel?: string\n ofCounterLabel?: string\n photosLabel?: string\n onAddToCart?: (product: ProductOverview5Product) => void\n onToggleWishlist?: (product: ProductOverview5Product, isWishlisted: boolean) => void\n onShare?: (product: ProductOverview5Product) => void\n}\n\nfunction renderStars(rating: number) {\n return Array.from({ length: 5 }, (_, i) => (\n <Star key={i} className={`size-4 ${i < Math.floor(rating) ? 'fill-foreground text-foreground' : i < rating ? 'text-foreground' : ''}`} />\n ))\n}\n\nexport default function ProductOverview5({\n product,\n badgeLabel = 'Destacado',\n availabilityLabel = 'Disponible',\n currencySymbol = '$',\n skuLabel = 'SKU',\n overviewLabel = 'Resumen',\n specsLabel = 'Especificaciones',\n featuresLabel = 'Características clave',\n specificationsLabel = 'Especificaciones técnicas',\n reviewsLabel = 'Reseñas',\n galleryLabel = 'Galería',\n saveLabel = 'Guardar',\n savedLabel = 'Guardado',\n shareLabel = 'Compartir',\n addToCartLabel = 'Agregar al carrito',\n basedOnReviewsLabel = 'Basado en {count} reseñas',\n foundHelpfulLabel = '{count} personas encontraron esto útil',\n ofCounterLabel = '{current} de {total}',\n photosLabel = 'fotos',\n onAddToCart,\n onToggleWishlist,\n onShare,\n}: ProductOverview5Props) {\n const [selectedImage, setSelectedImage] = useState(0)\n const [isWishlisted, setIsWishlisted] = useState(false)\n\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid gap-12 lg:grid-cols-2'>\n <ProductOverview5Gallery\n product={product}\n badgeLabel={badgeLabel}\n selectedImage={selectedImage}\n onSelectImage={setSelectedImage}\n photosLabel={photosLabel}\n />\n\n <div className='flex flex-col gap-8'>\n <div>\n <h1 className='text-3xl leading-tight font-bold text-balance'>{product.name}</h1>\n <div className='mt-4 flex flex-wrap items-center gap-4'>\n <div className='flex items-center gap-2'>\n <div className='flex'>{renderStars(product.rating)}</div>\n <span className='text-sm font-medium'>{product.rating}</span>\n </div>\n <span className='text-muted-foreground text-sm'>\n {product.userReviews.length} {reviewsLabel.toLowerCase()}\n </span>\n <Separator orientation='vertical' className='h-4' />\n <span className='text-muted-foreground text-sm'>\n {skuLabel}: {product.sku}\n </span>\n </div>\n </div>\n\n <div className='flex items-baseline gap-3'>\n <span className='text-4xl font-bold'>\n {currencySymbol}\n {product.price}\n </span>\n {product.originalPrice && (\n <span className='text-muted-foreground text-xl line-through'>\n {currencySymbol}\n {product.originalPrice}\n </span>\n )}\n </div>\n\n <div className='inline-flex items-center w-fit gap-2 rounded-full bg-success/10 px-3 py-1.5'>\n <div className='size-2 rounded-full bg-success' />\n <span className='text-sm font-medium text-success'>{availabilityLabel}</span>\n </div>\n\n <p className='text-muted-foreground leading-relaxed'>{product.description}</p>\n\n <div className='flex flex-col gap-4'>\n <Button\n size='lg'\n className='h-12 w-full cursor-pointer gap-2'\n onClick={onAddToCart ? () => onAddToCart(product) : undefined}\n >\n <ShoppingCart />\n {addToCartLabel}\n </Button>\n <div className='flex gap-3'>\n <Button\n variant='outline'\n size='lg'\n className='h-12 flex-1 cursor-pointer gap-2'\n aria-pressed={isWishlisted}\n onClick={() => {\n const next = !isWishlisted\n setIsWishlisted(next)\n onToggleWishlist?.(product, next)\n }}\n >\n <ReactionToggle active={isWishlisted} icon={Heart} activeColorClassName='text-destructive' />\n {isWishlisted ? savedLabel : saveLabel}\n </Button>\n <Button\n variant='outline'\n size='lg'\n className='h-12 flex-1 cursor-pointer gap-2'\n onClick={onShare ? () => onShare(product) : undefined}\n >\n <Share2 />\n {shareLabel}\n </Button>\n </div>\n </div>\n </div>\n </div>\n\n <div className='mt-16'>\n <ProductOverview5Tabs defaultValue='overview' className='w-full'>\n <ProductOverview5TabsList className='bg-muted/50 relative grid !h-12 w-full grid-cols-4 rounded-xl p-1'>\n <ProductOverview5TabsIndicator />\n <ProductOverview5TabsTrigger\n value='overview'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Info className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{overviewLabel}</span>\n </ProductOverview5TabsTrigger>\n <ProductOverview5TabsTrigger\n value='specs'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Package className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{specsLabel}</span>\n </ProductOverview5TabsTrigger>\n <ProductOverview5TabsTrigger\n value='reviews'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <MessageSquare className='size-4 shrink-0' />\n <span className='hidden sm:inline'>\n {reviewsLabel} ({product.userReviews.length})\n </span>\n </ProductOverview5TabsTrigger>\n <ProductOverview5TabsTrigger\n value='gallery'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Camera className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{galleryLabel}</span>\n </ProductOverview5TabsTrigger>\n </ProductOverview5TabsList>\n <ProductOverview5TabsContentFade value='overview' className='mt-8'>\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <h3 className='mb-6 text-xl font-semibold text-balance'>{featuresLabel}</h3>\n <div className='grid gap-4 sm:grid-cols-2'>\n {product.features.map(feature => (\n <div key={feature} className='group flex items-center gap-3'>\n <div className='bg-primary/20 size-2 rounded-full transition-colors' />\n <span className='text-sm'>{feature}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </ProductOverview5TabsContentFade>\n <ProductOverview5TabsContentFade value='specs' className='mt-8'>\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <h3 className='mb-6 text-xl font-semibold text-balance'>{specificationsLabel}</h3>\n <div className='flex flex-col gap-4'>\n {Object.entries(product.specifications).map(([key, value]) => (\n <div key={key} className='border-muted grid grid-cols-1 gap-2 border-b py-3 last:border-b-0 md:grid-cols-3 md:gap-4'>\n <span className='text-muted-foreground text-sm font-medium'>{key}</span>\n <span className='col-span-1 text-sm md:col-span-2'>{value}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </ProductOverview5TabsContentFade>\n <ProductOverview5TabsContentFade value='reviews' className='mt-8'>\n <ProductOverview5ReviewsTab\n product={product}\n basedOnReviewsLabel={basedOnReviewsLabel}\n foundHelpfulLabel={foundHelpfulLabel}\n />\n </ProductOverview5TabsContentFade>\n <ProductOverview5TabsContentFade value='gallery' className='mt-8'>\n <ProductOverview5LightboxTab\n product={product}\n galleryLabel={galleryLabel}\n ofCounterLabel={ofCounterLabel}\n />\n </ProductOverview5TabsContentFade>\n </ProductOverview5Tabs>\n </div>\n </div>\n </section>\n )\n}","import { Camera } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { cn } from '../../../lib/utils'\n\nimport type { ProductOverview5Product } from './product-overview-5'\n\nexport interface ProductOverview5GalleryProps {\n product: ProductOverview5Product\n badgeLabel?: string\n selectedImage: number\n onSelectImage: (index: number) => void\n photosLabel?: string\n}\n\nexport function ProductOverview5Gallery({\n product,\n badgeLabel,\n selectedImage,\n onSelectImage,\n photosLabel = 'fotos',\n}: ProductOverview5GalleryProps) {\n return (\n <div>\n <div className='bg-muted relative aspect-square overflow-hidden rounded-xl'>\n <img src={product.mainImages[selectedImage] || undefined} alt={product.name} className='size-full object-cover' />\n {badgeLabel && (\n <Badge className='px-2.5 py-0.5 font-semibold absolute top-4 left-4'>\n {badgeLabel}\n </Badge>\n )}\n <div className='absolute right-4 bottom-4 rounded-full bg-black/60 px-3 py-1.5 text-sm text-white backdrop-blur-sm'>\n <Camera className='mr-1 inline size-4' />\n {product.mainImages.length} {photosLabel}\n </div>\n </div>\n\n {product.mainImages.length > 1 && (\n <div className='mt-4 flex gap-3 overflow-x-auto pb-2'>\n {product.mainImages.map((image, index) => (\n <button\n type='button'\n key={index}\n onClick={() => onSelectImage(index)}\n className={cn(\n 'relative aspect-square size-20 flex-shrink-0 cursor-pointer overflow-hidden rounded-lg border-2 transition-all',\n selectedImage === index ? 'border-primary ring-primary/20 shadow-md ring-2' : 'border-muted hover:border-muted-foreground/50',\n )}\n aria-label={`Mostrar imagen ${index + 1} de ${product.name}`}\n >\n <img src={image || undefined} alt={`${product.name} ${index + 1}`} className='size-full object-cover' />\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default ProductOverview5Gallery","'use client'\n\nimport { useState } from 'react'\nimport { ChevronLeft, ChevronRight, X } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Dialog, DialogClose, DialogContent, DialogTitle, DialogTrigger } from '../../../ui/dialog'\nimport { cn } from '../../../lib/utils'\n\nimport type { ProductOverview5Product } from './product-overview-5'\n\nexport interface ProductOverview5LightboxTabProps {\n product: ProductOverview5Product\n galleryLabel?: string\n ofCounterLabel?: string\n}\n\nexport function ProductOverview5LightboxTab({\n product,\n galleryLabel = 'Galería',\n ofCounterLabel = '{current} de {total}',\n}: ProductOverview5LightboxTabProps) {\n const [modalImageIndex, setModalImageIndex] = useState(0)\n\n const nextImage = () => setModalImageIndex(prev => (prev + 1) % product.galleryImages.length)\n const prevImage = () => setModalImageIndex(prev => (prev - 1 + product.galleryImages.length) % product.galleryImages.length)\n\n return (\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <h3 className='mb-6 text-xl font-semibold text-balance'>{galleryLabel}</h3>\n <div className='grid gap-4 sm:grid-cols-2 lg:grid-cols-3'>\n {product.galleryImages.map((image, index) => (\n <Dialog key={index}>\n <DialogTrigger asChild>\n <button\n type='button'\n className='block aspect-square cursor-pointer overflow-hidden rounded-xl'\n onClick={() => setModalImageIndex(index)}\n >\n <img src={image || undefined} alt={`${product.name} ${index + 1}`} className='size-full object-cover' />\n </button>\n </DialogTrigger>\n <DialogContent className='max-w-4xl border-0 bg-transparent p-0' showCloseButton={false}>\n <DialogTitle className='sr-only'>Imagen de galería {modalImageIndex + 1}</DialogTitle>\n <div className='relative'>\n <img\n src={product.galleryImages[modalImageIndex] || undefined}\n alt={`${product.name} ${modalImageIndex + 1}`}\n className='max-h-[80vh] w-full object-contain'\n />\n <DialogClose className='absolute top-4 right-4 rounded-full bg-black/20 p-2 text-white transition-colors hover:bg-black/30'>\n <X className='size-4' />\n </DialogClose>\n\n {product.galleryImages.length > 1 && (\n <>\n <Button\n variant='ghost'\n size='icon'\n className='size-9 absolute top-1/2 left-4 -translate-y-1/2 cursor-pointer rounded-full bg-black/20 text-white hover:bg-black/30'\n onClick={prevImage}\n >\n <ChevronLeft className='size-4' />\n </Button>\n <Button\n variant='ghost'\n size='icon'\n className='size-9 absolute top-1/2 right-4 -translate-y-1/2 cursor-pointer rounded-full bg-black/20 text-white hover:bg-black/30'\n onClick={nextImage}\n >\n <ChevronRight className='size-4' />\n </Button>\n </>\n )}\n\n <div className='absolute bottom-4 left-1/2 flex -translate-x-1/2 gap-2'>\n {product.galleryImages.map((_, idx) => (\n <button\n type='button'\n key={idx}\n aria-label={`Mostrar imagen ${idx + 1}`}\n className={cn('size-2 rounded-full transition-colors', idx === modalImageIndex ? 'bg-white' : 'bg-white/50')}\n onClick={() => setModalImageIndex(idx)}\n />\n ))}\n </div>\n\n <div className='absolute right-4 bottom-4 rounded-full bg-black/20 px-3 py-1 text-sm text-white'>\n {ofCounterLabel\n .replace('{current}', String(modalImageIndex + 1))\n .replace('{total}', String(product.galleryImages.length))}\n </div>\n </div>\n </DialogContent>\n </Dialog>\n ))}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport default ProductOverview5LightboxTab","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { XIcon } from \"lucide-react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { Button } from \"@/ui/button\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","import { Star } from 'lucide-react'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Progress } from '../../../ui/progress'\n\nimport type { ProductOverview5Product } from './product-overview-5'\n\nexport interface ProductOverview5ReviewsTabProps {\n product: ProductOverview5Product\n basedOnReviewsLabel?: string\n foundHelpfulLabel?: string\n}\n\nfunction renderStars(rating: number) {\n return Array.from({ length: 5 }, (_, i) => (\n <Star key={i} className={`size-4 ${i < Math.floor(rating) ? 'fill-foreground text-foreground' : i < rating ? 'text-foreground' : ''}`} />\n ))\n}\n\nfunction formatDate(dateString: string) {\n return new Date(dateString).toLocaleDateString('es-ES', { year: 'numeric', month: 'short', day: 'numeric' })\n}\n\nexport function ProductOverview5ReviewsTab({\n product,\n basedOnReviewsLabel = 'Basado en {count} reseñas',\n foundHelpfulLabel = '{count} personas encontraron esto útil',\n}: ProductOverview5ReviewsTabProps) {\n return (\n <div className='flex flex-col gap-6'>\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <div className='flex flex-col items-start gap-8 md:flex-row md:items-center'>\n <div className='text-center'>\n <div className='text-4xl font-bold'>{product.rating}</div>\n <div className='mt-2 flex justify-center'>{renderStars(product.rating)}</div>\n <div className='text-muted-foreground mt-2 text-sm'>\n {basedOnReviewsLabel.replace('{count}', String(product.userReviews.length))}\n </div>\n </div>\n <div className='flex-1'>\n {[5, 4, 3, 2, 1].map(stars => {\n const count = product.userReviews.filter(review => Math.floor(review.rating) === stars).length\n const percentage = (count / product.userReviews.length) * 100\n return (\n <div key={stars} className='mb-3 flex items-center gap-3'>\n <span className='w-8 text-sm font-medium'>{stars}★</span>\n <Progress value={percentage} className='h-2 flex-1 rounded-full' />\n <span className='text-muted-foreground w-8 text-sm'>{count}</span>\n </div>\n )\n })}\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className='flex flex-col gap-4'>\n {product.userReviews.map(review => (\n <Card key={review.id} className='border shadow-none'>\n <CardContent className='p-6 py-0'>\n <div className='mb-4 flex items-start justify-between'>\n <div>\n <div className='text-sm font-medium'>{review.author}</div>\n <div className='mt-2 flex items-center gap-2'>\n <div className='flex'>{renderStars(review.rating)}</div>\n <span className='text-muted-foreground text-sm'>{formatDate(review.date)}</span>\n </div>\n </div>\n </div>\n <p className='text-muted-foreground mb-3 text-sm leading-relaxed'>{review.comment}</p>\n <div className='text-muted-foreground text-xs'>\n {foundHelpfulLabel.replace('{count}', String(review.helpful))}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )\n}\n\nexport default ProductOverview5ReviewsTab","import { Tabs as TabsPrimitive } from '@base-ui/react/tabs'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * The full tab set this block renders on.\n *\n * The block's classes target Base UI state attributes (`data-active:bg-transparent` on the\n * triggers), the indicator reads Base UI positioning CSS variables (`--active-tab-*`), and the\n * content fade relies on Base UI unmounting the inactive panel - so the whole tabs area runs on\n * Base UI rather than the Radix-backed shadcn `tabs`. It lives here rather than in the shared ui\n * `tabs` so the block installs standalone: the shadcn `tabs` component you get from the registry\n * has no indicator or fading panel.\n */\nexport function ProductOverview5Tabs(props: TabsPrimitive.Root.Props) {\n return <TabsPrimitive.Root data-slot='tabs' {...props} />\n}\n\nexport function ProductOverview5TabsList({ className, ...props }: TabsPrimitive.List.Props) {\n return <TabsPrimitive.List data-slot='tabs-list' className={className} {...props} />\n}\n\n/**\n * Base UI's tab button carries no layout of its own, so the inline-flex centring that the\n * Radix-backed shadcn trigger used to supply is re-stated here.\n */\nexport function ProductOverview5TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot='tabs-trigger'\n className={cn('relative inline-flex items-center justify-center whitespace-nowrap', className)}\n {...props}\n />\n )\n}\n\n/**\n * Panel with a fade-in on every switch. Base UI unmounts the inactive panel by default, so each\n * activation is a fresh mount - `animate-in` plays automatically without needing a transition-state\n * data attribute to gate it.\n */\nexport function ProductOverview5TabsContentFade({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n className={cn('animate-in fade-in-0 duration-200 motion-reduce:animate-none', className)}\n {...props}\n />\n )\n}\n\n/**\n * Sliding pill that tracks the active trigger. Render as the first child of TabsList, and pair\n * with `data-active:bg-transparent` on the triggers so their own active background doesn't double\n * up with the pill.\n */\nexport function ProductOverview5TabsIndicator({ className, ...props }: TabsPrimitive.Indicator.Props) {\n return (\n <TabsPrimitive.Indicator\n data-slot='tabs-indicator'\n className={cn(\n 'absolute z-0 rounded-md bg-background shadow-sm transition-[left,top,width,height] duration-[250ms] ease-[cubic-bezier(0.22,1,0.36,1)] dark:bg-input/30',\n 'left-(--active-tab-left) top-(--active-tab-top) h-(--active-tab-height) w-(--active-tab-width)',\n 'motion-reduce:transition-none',\n className\n )}\n {...props}\n />\n )\n}","'use client'\n\nimport { useId, useState } from 'react'\n\nimport { Badge } from '../../../ui/badge'\n\nimport { ProductQuickViewCard } from './product-quick-view-card'\nimport { ProductQuickViewDialog } from './product-quick-view-dialog'\n\nexport interface QuickViewOption {\n value: string\n label: string\n available: boolean\n /**\n * A literal colour for a swatch, when the option is one.\n *\n * Finish colours are product data, not theme data: brass has to stay brass whatever preset the\n * customizer is on. It is the one place in the block that is not a token, and the option's\n * label always carries the same information in words.\n */\n swatch?: string\n}\n\nexport interface QuickViewVariant {\n key: string\n label: string\n /**\n * Which option a product opens on.\n *\n * Not simply the first available one: sizes are listed smallest first, and the sofa is sold as\n * the size its name promises, so the panel would otherwise open on an option that disagrees\n * with the card the reader just pressed.\n */\n defaultValue?: string\n options: QuickViewOption[]\n}\n\nexport interface QuickViewProduct {\n id: string\n name: string\n /** The one line that says what it is, under the name on the card and in the panel. */\n tagline: string\n category: string\n price: number\n compareAt?: number\n rating: number\n reviewCount: number\n /** In stock, and low enough to be worth saying. Omitted when there is plenty. */\n unitsLeft?: number\n image: string\n imageAlt: string\n description: string\n /** The panel shows these as a list, not as a specification table. */\n details: string[]\n variants: QuickViewVariant[]\n /** Where the full product page lives. The panel only links to it when set. */\n href?: string\n}\n\nexport interface ProductQuickViewProps {\n products: QuickViewProduct[]\n eyebrow?: string\n heading?: string\n lede?: string\n /**\n * Called with the chosen options when the reader adds to cart. When absent the button still\n * shows and keeps its added-to-cart confirmation; it just has nowhere to report to.\n */\n onAddToCart?: (\n product: QuickViewProduct,\n quantity: number,\n selection: Record<string, string>\n ) => void\n}\n\n/**\n * A product grid whose point is the panel that opens over it.\n *\n * One dialog serves the whole catalogue rather than one per card: the panel steps between\n * products from inside, the card it is showing stays lit underneath, and closing puts the reader\n * back exactly where the grid says they are.\n */\nexport function ProductQuickView({\n products,\n eyebrow = 'Novedades de la temporada',\n heading = 'Todo lo que vale la pena saber, sin salir de la rejilla',\n lede = 'Abre cualquier pieza para ver sus acabados, sus medidas y la respuesta a la pregunta que, de otro modo, te enviaría a la página del producto. Recorre el resto de la habitación desde dentro.',\n onAddToCart,\n}: ProductQuickViewProps) {\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n // A reusable block cannot carry a fixed heading id: two instances on a page would both claim it.\n const headingId = useId()\n\n return (\n <section aria-labelledby={headingId} className='bg-background w-full py-16 sm:py-24'>\n <div className='mx-auto w-full max-w-6xl px-4 sm:px-6 lg:px-8'>\n <div className='flex max-w-2xl flex-col items-start'>\n <Badge variant='outline' className='gap-2 rounded-full px-3'>\n <span aria-hidden='true' className='bg-primary size-1.5 rounded-full' />\n {eyebrow}\n </Badge>\n\n <h2\n id={headingId}\n className='mt-5 text-3xl font-semibold tracking-tight text-balance sm:text-4xl'\n >\n {heading}\n </h2>\n\n <p className='text-muted-foreground mt-4 text-base text-pretty'>{lede}</p>\n </div>\n\n <div className='mt-10 grid grid-cols-1 gap-5 sm:grid-cols-2 md:grid-cols-3 lg:mt-12'>\n {products.map((product, index) => (\n <ProductQuickViewCard\n key={product.id}\n product={product}\n isActive={activeIndex === index}\n onOpen={() => setActiveIndex(index)}\n />\n ))}\n </div>\n </div>\n\n <ProductQuickViewDialog\n products={products}\n activeIndex={activeIndex}\n onActiveIndexChange={setActiveIndex}\n onClose={() => setActiveIndex(null)}\n onAddToCart={onAddToCart}\n />\n </section>\n )\n}\n\nexport default ProductQuickView","'use client'\n\nimport { Eye, Star } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\n\nimport type { QuickViewProduct } from './product-quick-view'\n\nconst money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })\n\n/**\n * One product in the grid, and the thing a quick view is meant to keep you inside of.\n *\n * The whole card is the button. A card that carries a separate \"Quick view\" link has two targets\n * for one intention, and on a touch screen the hover-revealed one is a target that never appears\n * at all - so the control is drawn on hover and focus as an *affordance*, while the press area\n * is the entire card at every input type.\n */\nexport function ProductQuickViewCard({\n product,\n isActive,\n onOpen,\n}: {\n product: QuickViewProduct\n /** Whether this is the product currently open in the quick view. */\n isActive: boolean\n onOpen: () => void\n}) {\n const swatches = product.variants.find(variant => variant.options.some(option => option.swatch))?.options ?? []\n\n return (\n <Card\n className={cn(\n 'group/card relative gap-0 overflow-hidden py-0 transition-shadow',\n // The mark that survives behind the dialog: when the reader closes it, the card they\n // were looking at is the one still lit, so the grid tells them where they got to.\n isActive ? 'ring-primary ring-2' : 'hover:shadow-lg'\n )}\n >\n <div className='bg-muted relative aspect-4/5 w-full overflow-hidden'>\n <img\n src={product.image || undefined}\n alt={product.imageAlt}\n className='size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]'\n loading='lazy'\n decoding='async'\n />\n\n {product.compareAt ? (\n <Badge className='absolute top-3 left-3 rounded-full'>\n {`${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento`}\n </Badge>\n ) : null}\n\n {/*\n Drawn on hover and focus, and never the thing that has to be hit. `pointer-events-none`\n keeps every press on the card's own trigger underneath, so there is exactly one target\n however the reader is pointing at it.\n */}\n <div\n aria-hidden='true'\n className={cn(\n 'pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3',\n 'translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out',\n 'group-hover/card:translate-y-0 group-hover/card:opacity-100',\n 'group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100'\n )}\n >\n <span className='bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur'>\n <Eye className='size-4' />\n Vista rápida\n </span>\n </div>\n </div>\n\n {/*\n The card's one interactive element, and it covers the card.\n\n A stretched link would leave only the title actually pressable: the picture sits over a\n pseudo-element and swallows every click on the image and on the Quick view pill. A real\n element in the DOM, on top, with an explicit z-index, is unambiguous at every input type.\n It is empty and carries an accessible name, so the price and rating underneath are not\n read as part of the button's label.\n */}\n <button\n type='button'\n onClick={onOpen}\n aria-haspopup='dialog'\n className='focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]'\n >\n <span className='sr-only'>{`Vista rápida: ${product.name}`}</span>\n </button>\n\n <CardContent className='flex flex-col gap-1 p-4'>\n <div className='flex items-start justify-between gap-3'>\n <p className='text-base font-medium'>{product.name}</p>\n\n <p className='shrink-0 text-base font-medium tabular-nums'>{money.format(product.price)}</p>\n </div>\n\n <p className='text-muted-foreground text-sm'>{product.tagline}</p>\n\n <div className='mt-2 flex items-center justify-between gap-3'>\n <p className='text-muted-foreground flex items-center gap-1.5 text-xs'>\n {/* Foreground token per theming contract, never the only carrier of the rating. */}\n <Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />\n <span className='text-foreground font-medium tabular-nums'>{product.rating}</span>\n <span className='tabular-nums'>({product.reviewCount})</span>\n </p>\n\n {swatches.length > 0 ? (\n <span className='flex items-center gap-1'>\n {/*\n Finish colours are product data, so they stay literal rather than tokenised, and\n they are decoration here - the same information is in words inside the panel.\n */}\n {swatches.map(option => (\n <span\n key={option.value}\n aria-hidden='true'\n className='ring-border size-3 rounded-full ring-1'\n style={{ backgroundColor: option.swatch }}\n />\n ))}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport default ProductQuickViewCard","'use client'\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react'\nimport { Check, Minus, Plus, Star } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { ButtonGroup, ButtonGroupText } from '../../../ui/button-group'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '../../../ui/dialog'\nimport { Separator } from '../../../ui/separator'\nimport { ToggleGroup, ToggleGroupItem } from '../../../ui/toggle-group'\n\nimport type { QuickViewProduct } from './product-quick-view'\n\nconst money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })\n\n/** How long the added-to-cart confirmation stays up before the button returns to its label. */\nconst confirmationMs = 2400\n\n/**\n * What a product opens on: its stated default where it has one, and otherwise the first option\n * that is actually in stock — never a sold-out one, which would put the panel in a state whose\n * add-to-cart button cannot honestly be pressed.\n */\nfunction defaultSelection(product: QuickViewProduct): Record<string, string> {\n return Object.fromEntries(\n product.variants.map(variant => {\n const stated = variant.options.find(\n option => option.value === variant.defaultValue && option.available\n )\n const fallback = variant.options.find(option => option.available) ?? variant.options[0]\n\n return [variant.key, (stated ?? fallback).value]\n })\n )\n}\n\n/**\n * The panel a quick view opens, and the reason the pattern exists.\n *\n * A quick view is not a small product page. It is a promise that the reader will not lose the\n * grid, so this one keeps the whole catalogue reachable from inside: the strip under the picture\n * is the other products, not other angles of this one. Choosing from it re-dresses the panel\n * around a new product, the grid behind marks where the reader has got to, and closing returns\n * them to a grid they never actually left.\n */\nexport function ProductQuickViewDialog({\n products,\n activeIndex,\n onActiveIndexChange,\n onClose,\n onAddToCart,\n}: {\n products: QuickViewProduct[]\n /** Which product is open, or `null` when the dialog is closed. */\n activeIndex: number | null\n onActiveIndexChange: (index: number) => void\n onClose: () => void\n onAddToCart?: (\n product: QuickViewProduct,\n quantity: number,\n selection: Record<string, string>\n ) => void\n}) {\n const reduceMotion = useReducedMotion()\n const product = activeIndex === null ? null : products[activeIndex]\n\n const [selection, setSelection] = useState<Record<string, string>>({})\n const [quantity, setQuantity] = useState(1)\n const [addedCount, setAddedCount] = useState(0)\n\n /*\n One effect keyed on the product's identity rather than three scattered resets. Carrying a\n \"brushed brass\" across from a pendant to a sofa is worse than starting again, and a quantity\n of four floor lamps should not become four sofas because the reader stepped sideways.\n */\n useEffect(() => {\n if (!product) {\n return\n }\n\n setSelection(defaultSelection(product))\n setQuantity(1)\n setAddedCount(0)\n }, [product?.id]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (addedCount === 0) {\n return\n }\n\n const timer = setTimeout(() => setAddedCount(0), confirmationMs)\n\n return () => clearTimeout(timer)\n }, [addedCount])\n\n /*\n The chosen options in words, for the live region and the stock line. Built from the variant\n order rather than from the selection object, so it reads the way the controls are stacked\n instead of in whatever order the keys happen to sit in.\n */\n const selectionSummary = useMemo(() => {\n if (!product) {\n return ''\n }\n\n return product.variants\n .map(variant => variant.options.find(option => option.value === selection[variant.key])?.label)\n .filter(Boolean)\n .join(' · ')\n }, [product, selection])\n\n if (!product || activeIndex === null) {\n return null\n }\n\n const discount = product.compareAt ? Math.round((1 - product.price / product.compareAt) * 100) : null\n\n return (\n <Dialog open onOpenChange={next => !next && onClose()}>\n {/*\n `max-h` plus `overflow-y-auto` is what makes this usable below a laptop. The popup is\n fixed and centred with a translate, so without a bound it grew past both edges of a phone\n and the add-to-cart button ended up off the bottom of the screen with no way to reach it\n — the page behind a fixed element cannot scroll to it either.\n */}\n <DialogContent className='max-h-[92dvh] w-full overflow-y-auto p-0 sm:max-w-4xl md:h-[38rem] md:max-h-[92dvh] md:overflow-hidden'>\n <DialogHeader className='sr-only'>\n <DialogTitle>{product.name}</DialogTitle>\n <DialogDescription>{product.description}</DialogDescription>\n </DialogHeader>\n\n {/*\n A fixed height from `md`, and the detail column scrolls inside it.\n\n The popup is centred with a -50% translate, so its height decides where its top edge\n lands. Every product carries a different length of description and a different number\n of variant rows, so stepping through the strip re-measured the panel and slid the whole\n dialog up and down under the reader's cursor - the thumbnail they wanted next was no\n longer where they were pointing. Holding the height still makes the strip a control\n rather than a moving target. Below `md` the columns stack and the whole popup scrolls,\n where a fixed height would be the wrong answer.\n */}\n <div className='grid gap-0 md:h-full md:min-h-0 md:grid-cols-[minmax(0,0.95fr)_minmax(0,1fr)]'>\n <div className='bg-muted/40 flex flex-col gap-3 p-4 sm:p-5 md:min-h-0 md:justify-center md:overflow-y-auto'>\n {/*\n The picture cross-fades rather than cutting. At this size a hard swap reads as a\n flicker, and the fade is what ties the thumbnail that was pressed to the picture\n that arrives.\n */}\n <div className='bg-muted relative aspect-square w-full overflow-hidden rounded-lg'>\n <AnimatePresence initial={false} mode='popLayout'>\n <motion.img\n key={product.id}\n src={product.image || undefined}\n alt={product.imageAlt}\n className='absolute inset-0 size-full object-cover'\n initial={reduceMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={reduceMotion ? undefined : { opacity: 0 }}\n transition={{ duration: 0.24, ease: 'easeOut' }}\n decoding='async'\n />\n </AnimatePresence>\n\n <Badge variant='secondary' className='absolute top-3 left-3 rounded-full'>\n {product.category}\n </Badge>\n </div>\n\n {/*\n `spacing={2}` rather than a `gap-2` class. A ToggleGroup at the default spacing of\n zero is a segmented control: it strips the item radii, collapses the shared borders\n and adds `px-2` to every item through a `group-data-[spacing=0]` selector that no\n plain `p-0` utility can outrank. That padding around a small thumbnail was the odd\n width and the odd gaps; asking for real spacing turns the whole rule off.\n\n A ToggleGroup rather than a row of buttons for the same reason it is used for the\n variants: single selection, roving focus and arrow-key movement, none of which a\n loop of buttons gets without being told.\n */}\n <ToggleGroup\n type='multiple'\n spacing={2}\n value={[String(activeIndex)]}\n onValueChange={value => value[0] && onActiveIndexChange(Number(value[0]))}\n aria-label='Elegir producto'\n className='grid w-full grid-cols-4'\n >\n {products.map((entry, index) => (\n <ToggleGroupItem\n key={entry.id}\n value={String(index)}\n aria-label={entry.name}\n className='data-[state=on]:ring-primary size-auto min-w-0 overflow-hidden rounded-md p-0 ring-2 ring-transparent transition-shadow data-[state=on]:bg-transparent'\n >\n <img\n src={entry.image || undefined}\n alt=''\n className='bg-muted aspect-square w-full object-cover'\n loading='lazy'\n decoding='async'\n />\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n\n <p className='text-muted-foreground text-center font-mono text-xs tabular-nums'>\n {`${activeIndex + 1} / ${products.length}`}\n </p>\n </div>\n\n <div className='flex flex-col p-4 pt-5 sm:p-6 md:min-h-0 md:overflow-y-auto'>\n <p className='text-muted-foreground text-xs tracking-[0.16em] uppercase'>{product.tagline}</p>\n\n <h2 className='mt-2 text-2xl font-semibold tracking-tight text-balance'>{product.name}</h2>\n\n <div className='mt-3 flex flex-wrap items-center gap-x-3 gap-y-2'>\n <p className='text-xl font-semibold tabular-nums'>{money.format(product.price)}</p>\n {product.compareAt ? (\n <p className='text-muted-foreground text-sm line-through tabular-nums'>\n {money.format(product.compareAt)}\n </p>\n ) : null}\n {discount ? (\n <Badge variant='secondary' className='rounded-full font-normal'>{`${discount}% de descuento`}</Badge>\n ) : null}\n <p className='text-muted-foreground flex items-center gap-1.5 text-sm'>\n {/*\n Rating stars use the foreground token so they inherit theme contrast,\n matching storefront-hero-1 and review-rating-1. The rating number sits\n right beside the star, so the star is never the only carrier.\n */}\n <Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />\n <span className='text-foreground font-medium tabular-nums'>{product.rating}</span>\n <span className='tabular-nums'>({product.reviewCount})</span>\n </p>\n </div>\n\n <p className='text-muted-foreground mt-4 text-sm leading-6 text-pretty'>{product.description}</p>\n\n <div className='mt-5 flex flex-col gap-5'>\n {product.variants.map(variant => (\n /*\n A fieldset per variant, and a ToggleGroup inside it rather than a row of\n Buttons with a hand-rolled `aria-pressed`. A loop of buttons has to fake single\n selection and roving focus, and gets the focus order wrong the moment one of\n them is disabled — which, with a sold-out finish, is most of them.\n */\n <fieldset key={variant.key}>\n <legend className='flex w-full items-baseline gap-2 text-sm font-medium'>\n {variant.label}\n <span className='text-muted-foreground font-normal'>\n {variant.options.find(option => option.value === selection[variant.key])?.label}\n </span>\n </legend>\n\n <ToggleGroup\n type='multiple'\n spacing={2}\n variant='outline'\n value={[selection[variant.key] ?? '']}\n onValueChange={value =>\n value[0] && setSelection(current => ({ ...current, [variant.key]: value[0] }))\n }\n aria-label={variant.label}\n className='mt-2 flex-wrap'\n >\n {variant.options.map(option => (\n <ToggleGroupItem\n key={option.value}\n value={option.value}\n disabled={!option.available}\n // Sold out is a word, not just a dimmed control.\n aria-label={option.available ? option.label : `${option.label}, agotado`}\n className='data-[state=on]:border-primary data-[state=on]:ring-primary/30 gap-2 data-[state=on]:ring-2'\n >\n {option.swatch ? (\n <span\n aria-hidden='true'\n className='ring-border size-3 rounded-full ring-1'\n style={{ backgroundColor: option.swatch }}\n />\n ) : null}\n {option.label}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n </fieldset>\n ))}\n </div>\n\n <div className='mt-6 flex flex-wrap items-center gap-3'>\n {/*\n A ButtonGroup, so the stepper's shared border, its corner radii and its focus\n stacking come from the component rather than from `rounded-r-none` by hand.\n\n The readout is a `ButtonGroupText`, not a bare div. The group styles its children\n through `[&>[data-slot]…]` selectors, so an element without a `data-slot` is\n invisible to every one of them: it kept its own radius, lost no border where the\n group expected a seam, and threw off which child counted as last - which is the\n detached middle box with a stray rule under it.\n */}\n <ButtonGroup aria-label='Cantidad'>\n <Button\n variant='outline'\n size='icon'\n aria-label='Reducir cantidad'\n disabled={quantity <= 1}\n onClick={() => setQuantity(current => Math.max(1, current - 1))}\n >\n <Minus />\n </Button>\n {/*\n `aria-live` rather than a label: the number changes under the reader's own\n button presses, and announcing it is the only way they hear the result.\n */}\n <ButtonGroupText aria-live='polite' className='bg-background min-w-10 justify-center tabular-nums'>\n {quantity}\n </ButtonGroupText>\n <Button\n variant='outline'\n size='icon'\n aria-label='Aumentar cantidad'\n onClick={() => setQuantity(current => current + 1)}\n >\n <Plus />\n </Button>\n </ButtonGroup>\n\n <Button\n className='flex-1'\n onClick={() => {\n setAddedCount(quantity)\n onAddToCart?.(product, quantity, selection)\n }}\n >\n {addedCount > 0 ? (\n <>\n <Check aria-hidden='true' />\n Añadido al carrito\n </>\n ) : (\n `Añadir al carrito · ${money.format(product.price * quantity)}`\n )}\n </Button>\n </div>\n\n {product.unitsLeft ? (\n <p className='text-muted-foreground mt-3 text-xs'>\n {`Solo quedan ${product.unitsLeft} en ${selectionSummary || 'esta opción'}.`}\n </p>\n ) : null}\n\n {/* The one announcement, off-screen, that the visible confirmation stands in for. */}\n <p role='status' aria-live='polite' className='sr-only'>\n {addedCount > 0 ? `${addedCount} × ${product.name}, ${selectionSummary}, añadido a tu carrito` : ''}\n </p>\n\n <Separator className='mt-6' />\n\n <ul className='text-muted-foreground mt-4 grid gap-1.5 text-sm sm:grid-cols-2'>\n {product.details.map(detail => (\n <li key={detail} className='flex items-start gap-2'>\n <Check className='text-primary mt-0.5 size-3.5 shrink-0' aria-hidden='true' />\n {detail}\n </li>\n ))}\n </ul>\n\n {product.href ? (\n <a\n href={product.href}\n className='text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 mt-5 w-fit rounded-sm text-sm underline underline-offset-4 outline-none focus-visible:ring-[3px]'\n >\n Ver la página completa del producto\n </a>\n ) : null}\n </div>\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport default ProductQuickViewDialog","import { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Slot } from \"radix-ui\"\n\nimport { Separator } from \"@/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\n vertical:\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n className={cn(\n \"flex items-center gap-2 rounded-md border bg-muted px-4 text-sm font-medium shadow-xs [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"relative m-0! self-stretch bg-input data-[orientation=vertical]:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\"\n\nimport { toggleVariants } from \"@/ui/toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, spacing }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n \"w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10\",\n \"data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l\",\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Toggle as TogglePrimitive } from \"radix-ui\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-2\",\n sm: \"h-8 min-w-8 px-1.5\",\n lg: \"h-10 min-w-10 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","'use client'\n\nimport { useMemo, useState } from 'react'\nimport { Star, ThumbsUp, MessageCircle, Calendar } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { ReactionToggle } from '../../shared/reaction-toggle'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '../../../ui/pagination'\nimport {\n ReviewRating1ReviewForm,\n type ReviewRating1ReviewFormData,\n type ReviewRating1ReviewFormProps,\n} from './review-rating-1-review-form'\n\nexport interface ReviewRating1Review {\n id: number\n userName: string\n userAvatar?: string\n date: string\n rating: number\n content: string\n likes?: number\n comments?: number\n}\n\nexport interface ReviewRating1Props {\n pageTitle: string\n pageDescription?: string\n reviews: ReviewRating1Review[]\n form?: ReviewRating1ReviewFormProps\n reviewsPerPage?: number\n onToggleReviewLike?: (review: ReviewRating1Review, liked: boolean) => void\n onSubmitReview?: (data: ReviewRating1ReviewFormData) => void\n}\n\nexport default function ReviewRating1({\n pageTitle,\n pageDescription,\n reviews,\n form,\n reviewsPerPage = 2,\n onToggleReviewLike,\n onSubmitReview,\n}: ReviewRating1Props) {\n const [currentPage, setCurrentPage] = useState(1)\n const [isLiked, setIsLiked] = useState<Record<number, boolean>>({})\n\n const totalPages = Math.ceil(reviews.length / reviewsPerPage)\n const currentReviews = useMemo(() => {\n const startIndex = (currentPage - 1) * reviewsPerPage\n const endIndex = startIndex + reviewsPerPage\n return reviews.slice(startIndex, endIndex)\n }, [currentPage, reviews, reviewsPerPage])\n\n return (\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8 py-8'>\n <div className='mb-12 text-center'>\n <h1 className='text-3xl font-bold'>{pageTitle}</h1>\n {pageDescription ? (\n <p className='text-muted-foreground mx-auto mt-2 max-w-2xl'>{pageDescription}</p>\n ) : null}\n </div>\n\n <div className='grid grid-cols-1 gap-8 lg:grid-cols-3'>\n <div className='flex flex-col gap-6 lg:col-span-2'>\n {currentReviews.map(review => (\n <Card key={review.id} className='transition-all hover:shadow-md'>\n <CardContent>\n <div className='flex items-start justify-between gap-4'>\n <div className='flex items-start gap-4'>\n <Avatar className='bg-muted size-12'>\n <AvatarImage src={review.userAvatar || undefined} alt={`${review.userName}'s avatar`} />\n <AvatarFallback>{review.userName.substring(0, 2)}</AvatarFallback>\n </Avatar>\n <div>\n <h3 className='font-medium'>{review.userName}</h3>\n <div className='text-muted-foreground mt-1 flex items-center gap-2 text-sm'>\n <div className='flex' aria-label={`Rated ${review.rating} out of 5`}>\n {Array(5)\n .fill(0)\n .map((_, i) => (\n <Star\n key={i}\n className={cn(\n 'size-4',\n i < review.rating\n ? 'fill-foreground text-foreground'\n : 'text-foreground fill-transparent'\n )}\n />\n ))}\n </div>\n <span>•</span>\n <time\n dateTime={new Date(review.date).toISOString().split('T')[0]}\n className='flex items-center'\n >\n <Calendar className='me-1 size-3' />\n {review.date}\n </time>\n </div>\n </div>\n </div>\n </div>\n <p className='text-muted-foreground mt-4'>{review.content}</p>\n <div className='mt-4 flex gap-4'>\n <Button\n variant='ghost'\n size='sm'\n onClick={() => {\n const next = !isLiked[review.id]\n setIsLiked(prev => ({ ...prev, [review.id]: next }))\n onToggleReviewLike?.(review, next)\n }}\n className='h-8 px-3 text-xs text-muted-foreground hover:bg-primary/10 hover:text-primary cursor-pointer'\n aria-label={`${isLiked[review.id] ? 'Unlike' : 'Like'} this review`}\n >\n <ReactionToggle active={!!isLiked[review.id]} icon={ThumbsUp} iconClassName='size-4' activeColorClassName='text-primary' />\n <span>{(review.likes ?? 0) + (isLiked[review.id] ? 1 : 0)}</span>\n </Button>\n <Button\n variant='ghost'\n size='sm'\n className='h-8 px-3 text-xs text-muted-foreground hover:bg-primary/10 hover:text-primary cursor-pointer'\n aria-label='View comments'\n >\n <MessageCircle className='size-4' />\n <span>{review.comments}</span>\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n {totalPages > 1 ? (\n <Pagination className='mt-6'>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => setCurrentPage(p => Math.max(1, p - 1))}\n className={currentPage === 1 ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n {Array.from({ length: totalPages }).map((_, i) => (\n <PaginationItem key={i}>\n <PaginationLink\n onClick={() => setCurrentPage(i + 1)}\n isActive={currentPage === i + 1}\n className='cursor-pointer'\n >\n {i + 1}\n </PaginationLink>\n </PaginationItem>\n ))}\n <PaginationItem>\n <PaginationNext\n onClick={() => setCurrentPage(p => Math.min(totalPages, p + 1))}\n className={currentPage === totalPages ? 'pointer-events-none opacity-50' : 'cursor-pointer'}\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n ) : null}\n </div>\n\n {form ? <ReviewRating1ReviewForm form={form} onSubmitReview={onSubmitReview} /> : null}\n </div>\n </div>\n )\n}","import * as React from \"react\"\nimport { cn } from \"cn\"\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\"\n\nimport { buttonVariants, type Button } from \"@/ui/button\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { Send, Star } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { Label } from '../../../ui/label'\nimport { Textarea } from '../../../ui/textarea'\nimport { cn } from '../../../lib/utils'\n\nexport interface ReviewRating1ReviewFormProps {\n title: string\n description?: string\n nameLabel: string\n emailLabel: string\n reviewLabel: string\n namePlaceholder: string\n emailPlaceholder: string\n reviewPlaceholder: string\n submitButtonText: string\n submittingButtonText: string\n}\n\nexport interface ReviewRating1ReviewFormData {\n name: string\n email: string\n review: string\n rating: number\n}\n\ninterface ReviewRating1ReviewFormPropsInput {\n form: ReviewRating1ReviewFormProps\n onSubmitReview?: (data: ReviewRating1ReviewFormData) => void\n}\n\nexport function ReviewRating1ReviewForm({ form, onSubmitReview }: ReviewRating1ReviewFormPropsInput) {\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [rating, setRating] = useState<number>(0)\n const [hoveredStar, setHoveredStar] = useState<number>(0)\n const [formData, setFormData] = useState({\n name: '',\n email: '',\n review: '',\n })\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n setIsSubmitting(true)\n onSubmitReview?.({ ...formData, rating })\n setRating(0)\n setFormData({ name: '', email: '', review: '' })\n setIsSubmitting(false)\n }\n\n return (\n <div className='lg:sticky lg:top-8 lg:h-fit'>\n <Card>\n <CardHeader>\n <CardTitle id='review-form-heading'>{form.title}</CardTitle>\n {form.description ? <CardDescription>{form.description}</CardDescription> : null}\n </CardHeader>\n <CardContent>\n <form onSubmit={handleSubmit} className='flex flex-col gap-6'>\n <div className='flex flex-col gap-2'>\n <div className='flex gap-1' role='radiogroup' aria-label='Rating'>\n {[1, 2, 3, 4, 5].map(star => (\n <Button\n variant='ghost'\n key={star}\n type='button'\n onClick={() => setRating(star)}\n onMouseEnter={() => setHoveredStar(star)}\n onMouseLeave={() => setHoveredStar(0)}\n className='h-9 px-4 py-2 focus-visible:ring-ring cursor-pointer rounded-full !p-1 hover:bg-transparent focus:outline-hidden focus-visible:ring-2'\n aria-pressed={rating === star}\n aria-label={`Rate ${star} ${star === 1 ? 'star' : 'stars'}`}\n >\n <Star className={cn('size-6', (hoveredStar || rating) >= star ? 'fill-foreground' : '')} />\n </Button>\n ))}\n </div>\n </div>\n\n <div className='flex flex-col gap-2'>\n <Label htmlFor='name'>{form.nameLabel}</Label>\n <Input\n id='name'\n value={formData.name}\n onChange={e => setFormData({ ...formData, name: e.target.value })}\n placeholder={form.namePlaceholder}\n required\n aria-required='true'\n className='h-9'\n />\n </div>\n\n <div className='flex flex-col gap-2'>\n <Label htmlFor='email'>{form.emailLabel}</Label>\n <Input\n id='email'\n type='email'\n value={formData.email}\n onChange={e => setFormData({ ...formData, email: e.target.value })}\n placeholder={form.emailPlaceholder}\n required\n aria-required='true'\n className='h-9'\n />\n </div>\n\n <div className='flex flex-col gap-2'>\n <Label htmlFor='review'>{form.reviewLabel}</Label>\n <Textarea\n id='review'\n value={formData.review}\n onChange={e => setFormData({ ...formData, review: e.target.value })}\n placeholder={form.reviewPlaceholder}\n required\n aria-required='true'\n />\n </div>\n\n <Button type='submit' className='h-9 px-4 py-2 w-full cursor-pointer' disabled={isSubmitting}>\n {isSubmitting ? form.submittingButtonText : form.submitButtonText}\n {!isSubmitting && <Send className='size-4' />}\n </Button>\n </form>\n </CardContent>\n </Card>\n </div>\n )\n}","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { Calendar, MessageCircle, Star, ThumbsUp } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../ui/avatar'\nimport { Button } from '../../../ui/button'\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n type CarouselApi,\n} from '../../../ui/carousel'\nimport { Progress } from '../../../ui/progress'\nimport { ProductCard3ReactionToggle } from '../product-list/product-card-3-reaction-toggle'\n\nexport interface Review {\n id: string\n userName: string\n userAvatar?: string\n date: string\n rating: number\n content: string\n likes?: number\n comments?: number\n}\n\nexport interface ReviewRating2Props {\n reviews: Review[]\n pageTitle?: string\n pageDescription?: string\n averageRating?: number\n totalReviews?: number\n ratingDistribution?: Record<string, number>\n basedOnLabel?: string\n likesLabel?: string\n commentsLabel?: string\n onLike?: (review: Review) => void\n onComment?: (review: Review) => void\n}\n\n/**\n * ReviewRating2 — resumen de valoración (media, estrellas y distribución de\n * notas) junto a un carrusel de reseñas con acciones de \"me gusta\" y\n * comentarios. 100% prop-driven: ningún contenido demo embebido.\n */\nexport function ReviewRating2({\n reviews,\n pageTitle,\n pageDescription,\n averageRating,\n totalReviews,\n ratingDistribution,\n basedOnLabel = 'Basado en {n} reseñas',\n likesLabel = 'Me gusta',\n commentsLabel = 'Comentarios',\n onLike,\n onComment,\n}: ReviewRating2Props) {\n const [carouselApi, setCarouselApi] = useState<CarouselApi>()\n const [current, setCurrent] = useState<number>(0)\n const [isLiked, setIsLiked] = useState<Record<string, boolean>>({})\n\n useEffect(() => {\n if (!carouselApi) return\n\n const updateCurrent = () => setCurrent(carouselApi.selectedScrollSnap())\n\n carouselApi.on('select', updateCurrent)\n return () => {\n carouselApi.off('select', updateCurrent)\n }\n }, [carouselApi])\n\n const scrollTo = (index: number) => {\n if (carouselApi) {\n carouselApi.scrollTo(index)\n }\n }\n\n const handleLike = (review: Review) => {\n setIsLiked(prev => ({ ...prev, [review.id]: !prev[review.id] }))\n onLike?.(review)\n }\n\n const formatNumber = (num: number): string => {\n return num >= 1000 ? `${(num / 1000).toFixed(1)}k` : num.toString()\n }\n\n const distributionEntries = Object.entries(ratingDistribution ?? {})\n const maxCount = Math.max(0, ...distributionEntries.map(([, count]) => count))\n\n return (\n <div className='mx-auto w-full max-w-7xl px-4 py-12 sm:px-6 lg:px-8'>\n {pageTitle ? (\n <div className='mb-12 text-center'>\n <h2 className='mb-3 text-4xl font-bold'>{pageTitle}</h2>\n {pageDescription ? (\n <p className='text-muted-foreground mx-auto max-w-2xl'>{pageDescription}</p>\n ) : null}\n </div>\n ) : null}\n\n {averageRating !== undefined || distributionEntries.length > 0 ? (\n <div className='mb-12 mt-8 flex flex-col items-center justify-center gap-8 md:flex-row'>\n {averageRating !== undefined ? (\n <div className='text-center'>\n <div className='mb-2 text-6xl font-bold'>{averageRating}</div>\n <div className='flex justify-center gap-1' aria-label={`${averageRating} de 5 estrellas`}>\n {Array.from({ length: 5 }).map((_, i) => (\n <Star key={i} className={cn('size-5', 'fill-current')} />\n ))}\n </div>\n {totalReviews !== undefined ? (\n <p className='text-muted-foreground mt-1 text-sm'>\n {basedOnLabel.replace('{n}', formatNumber(totalReviews))}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {averageRating !== undefined && distributionEntries.length > 0 ? (\n <div className='bg-border mx-4 hidden h-16 w-px md:block' />\n ) : null}\n\n {distributionEntries.length > 0 ? (\n <div className='flex flex-col gap-1'>\n {distributionEntries.map(([rating, count]) => {\n const percentage = maxCount > 0 ? Math.round((count / maxCount) * 100) : 0\n return (\n <div key={rating} className='flex items-center gap-2'>\n <div className='flex flex-1 justify-end gap-1' aria-hidden='true'>\n {Array.from({ length: Number(rating) }).map((_, i) => (\n <Star key={i} className='size-3 fill-current' />\n ))}\n </div>\n <Progress value={percentage} className='h-2 w-32' />\n <span className='text-muted-foreground w-8 text-sm'>{percentage}%</span>\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {reviews.length > 0 ? (\n <div className='relative mx-auto max-w-4xl'>\n <Carousel\n setApi={setCarouselApi}\n className='w-full'\n opts={{\n align: 'start',\n loop: true,\n }}\n >\n <CarouselContent>\n {reviews.map(review => (\n <CarouselItem key={review.id}>\n <div className='p-6 sm:p-8'>\n <div className='flex flex-col gap-4'>\n <div className='flex items-start gap-4'>\n <Avatar className='bg-muted size-12'>\n <AvatarImage src={review.userAvatar || undefined} alt={review.userName} />\n <AvatarFallback>{review.userName.substring(0, 2)}</AvatarFallback>\n </Avatar>\n <div className='flex-1'>\n <h3 className='text-lg font-semibold'>{review.userName}</h3>\n <div className='mt-1 flex items-center gap-2'>\n <div className='flex gap-0.5' aria-label={`${review.rating} de 5 estrellas`}>\n {Array.from({ length: review.rating }).map((_, i) => (\n <Star key={i} className='size-4 fill-current' />\n ))}\n </div>\n <span className='text-muted-foreground text-sm'>•</span>\n <time className='text-muted-foreground flex items-center text-sm'>\n <Calendar className='me-1 size-3.5' />\n {review.date}\n </time>\n </div>\n </div>\n </div>\n\n <div>\n <p className='text-muted-foreground'>{review.content}</p>\n <div className='mt-4 flex gap-4'>\n <Button\n variant='ghost'\n size='sm'\n onClick={onLike ? () => handleLike(review) : undefined}\n className=\"h-8 px-3 text-xs text-muted-foreground hover:bg-primary/10 hover:text-primary cursor-pointer\"\n aria-label={likesLabel}\n >\n <ProductCard3ReactionToggle\n active={!!isLiked[review.id]}\n icon={ThumbsUp}\n iconClassName='size-4'\n activeColorClassName='text-primary'\n />\n {formatNumber((review.likes ?? 0) + (isLiked[review.id] ? 1 : 0))}\n </Button>\n <Button\n variant='ghost'\n size='sm'\n onClick={onComment ? () => onComment(review) : undefined}\n className=\"h-8 px-3 text-xs text-muted-foreground hover:bg-primary/10 hover:text-primary cursor-pointer\"\n aria-label={commentsLabel}\n >\n <MessageCircle className='size-4' />\n {formatNumber(review.comments ?? 0)}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n\n <div className='flex justify-center gap-2'>\n {reviews.map((_, i) => (\n <Button\n key={i}\n onClick={() => scrollTo(i)}\n className={cn(\n 'mx-1 size-2 cursor-pointer rounded-full p-1 transition-all',\n current === i ? 'bg-foreground w-6' : 'bg-muted'\n )}\n aria-label={`Ir a la reseña ${i + 1}`}\n aria-current={current === i ? 'step' : undefined}\n />\n ))}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\nexport default ReviewRating2","import { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport {\n ArrowRight,\n BatteryCharging,\n Cable,\n Camera,\n Lightbulb,\n ShieldCheck,\n Smartphone,\n Sparkles,\n Wrench,\n X,\n} from 'lucide-react'\nimport type { CTA } from '../../../lib/types'\n\nconst categoryIcons = {\n Smartphone,\n BatteryCharging,\n Wrench,\n Camera,\n Cable,\n ShieldCheck,\n Sparkles,\n Lightbulb,\n} as const\n\nexport type ProductCategory1CategoryIcon =\n | 'Smartphone'\n | 'BatteryCharging'\n | 'Wrench'\n | 'Camera'\n | 'Cable'\n | 'ShieldCheck'\n | 'Sparkles'\n | 'Lightbulb'\n\nexport interface ProductCategory1Category {\n id: string\n name: string\n subtitle: string\n icon: ProductCategory1CategoryIcon\n}\n\nexport interface ProductCategory1Props {\n badge?: string\n title: string\n description?: string\n cta?: CTA\n categories: ProductCategory1Category[]\n className?: string\n}\n\nexport function ProductCategory1({\n badge,\n title,\n description,\n cta,\n categories,\n className,\n}: ProductCategory1Props) {\n return (\n <section className={cn('relative w-full py-12 md:py-16 lg:py-20', className)}>\n <div className='relative z-10 mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <header className='mx-auto mb-12 max-w-5xl'>\n <div className='flex flex-col items-center justify-between gap-6 md:flex-row md:items-start md:text-start'>\n <div className='flex flex-col items-center gap-4 text-center md:items-start md:text-start'>\n {badge ? (\n <div className='inline-flex'>\n <span className='bg-secondary/80 text-secondary-foreground rounded-full px-4 py-1.5 text-sm font-medium'>\n {badge}\n </span>\n </div>\n ) : null}\n <div className='flex flex-col gap-2'>\n <h2 className='text-foreground text-3xl font-bold tracking-tight md:text-4xl'>{title}</h2>\n {description ? (\n <p className='text-muted-foreground max-w-2xl'>{description}</p>\n ) : null}\n </div>\n </div>\n {cta ? (\n <Button\n className='h-10 cursor-pointer whitespace-nowrap px-4'\n size='lg'\n asChild\n >\n <a href={cta.href}>\n {cta.label}\n <ArrowRight />\n </a>\n </Button>\n ) : null}\n </div>\n </header>\n\n <div className='mx-auto grid max-w-5xl grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4'>\n {categories.map(category => {\n const Icon = categoryIcons[category.icon] ?? X\n return (\n <Card\n key={category.id}\n className='group relative overflow-hidden py-6 px-2 shadow-xs transition-all hover:shadow-md'\n >\n <CardContent>\n <div className='flex flex-col gap-4'>\n <div className='bg-secondary/80 text-secondary-foreground flex size-12 items-center justify-center rounded-lg'>\n <Icon className='size-5' strokeWidth={1.5} />\n </div>\n <div>\n <h3 className='text-foreground text-lg font-semibold'>{category.name}</h3>\n <p className='text-muted-foreground text-sm'>{category.subtitle}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCategory1","import { Card } from '../../../ui/card'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { ArrowRight, ShoppingBag } from 'lucide-react'\nimport type { CTA } from '../../../lib/types'\n\nexport interface ProductCategory2Category {\n id: string\n handle?: string\n name: string\n description: string\n /**\n * Number of items in the category. Optional: when omitted, or when it is not\n * a finite non-negative number, no count is rendered — an unknown projection\n * must not be shown as a fabricated `0`. A real `0` is preserved.\n */\n itemCount?: number\n image: string\n trending: boolean\n}\n\nexport interface ProductCategory2Props {\n title?: string\n description?: string\n categories: ProductCategory2Category[]\n cta?: CTA\n onBrowse?: (category: ProductCategory2Category) => void\n}\n\n/**\n * Formats a category item count only when it is a supplied, finite,\n * non-negative number. Returns `undefined` for unknown or invalid values so the\n * caller omits the count entirely (a real `0` is preserved).\n */\nfunction formatItemCount(itemCount: number | undefined): string | undefined {\n if (itemCount === undefined || !Number.isFinite(itemCount) || itemCount < 0) {\n return undefined\n }\n return `${itemCount.toLocaleString()} items`\n}\n\nexport function ProductCategory2({\n title,\n description,\n categories,\n cta,\n onBrowse,\n}: ProductCategory2Props) {\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {(title || description) && (\n <div className='mb-12 text-center'>\n {title ? <h2 className='text-3xl font-bold tracking-tight text-balance'>{title}</h2> : null}\n {description ? (\n <p className='text-muted-foreground mt-4 text-lg'>{description}</p>\n ) : null}\n </div>\n )}\n\n <div className='grid gap-6 sm:grid-cols-2 lg:grid-cols-3'>\n {categories.map(category => {\n const itemCountLabel = formatItemCount(category.itemCount)\n return (\n <Card\n key={category.id}\n className='group cursor-pointer overflow-hidden py-0 transition-all duration-500 hover:shadow-lg'\n >\n <div className='relative aspect-[5/4] overflow-hidden'>\n <img\n src={category.image || undefined}\n alt={category.name}\n className='size-full object-cover transition-transform duration-500 group-hover:scale-105'\n />\n <div className='absolute inset-0 bg-gradient-to-t from-black/60 via-black/20 to-transparent' />\n\n {category.trending ? (\n <Badge className='absolute top-4 left-4 rounded-sm px-2.5 py-0.5 font-semibold'>\n Trending\n </Badge>\n ) : null}\n\n <div className='absolute right-0 bottom-0 left-0 p-6 text-white'>\n <h3 className='mb-1 text-xl font-bold'>{category.name}</h3>\n <p className='mb-3 text-sm text-white/90'>{category.description}</p>\n <div className='flex items-center justify-between'>\n {itemCountLabel ? <span className='text-sm'>{itemCountLabel}</span> : null}\n <Button\n size='sm'\n variant='secondary'\n className='ms-auto h-8 cursor-pointer border-white/30 bg-white/20 px-3 text-xs text-white backdrop-blur-sm hover:bg-white/30'\n onClick={onBrowse ? () => onBrowse(category) : undefined}\n >\n Browse\n <ArrowRight />\n </Button>\n </div>\n </div>\n </div>\n </Card>\n )\n })}\n </div>\n\n {cta ? (\n <div className='mt-12 text-center'>\n <Button size='lg' className='h-10 cursor-pointer gap-2 px-4' asChild>\n <a href={cta.href}>\n <ShoppingBag className='size-5' />\n {cta.label}\n </a>\n </Button>\n </div>\n ) : null}\n </div>\n </section>\n )\n}\n\nexport default ProductCategory2\n","'use client'\n\nimport type { LucideIcon } from 'lucide-react'\nimport { Users, ShoppingBag } from 'lucide-react'\n\nimport { Card, CardContent } from '../../../ui/card'\nimport { Badge } from '../../../ui/badge'\nimport { Avatar, AvatarImage, AvatarFallback } from '../../../ui/avatar'\nimport { AvatarGroup } from './avatar-group'\n\nexport interface ProductCategory4Category {\n id: string\n title: string\n description: string\n icon: LucideIcon\n customers: string\n products: number\n avatarImages?: string[]\n}\n\nexport interface ProductCategory4Props {\n title?: string\n description?: string\n categories: ProductCategory4Category[]\n productsLabel?: string\n customersLabel?: string\n onCategoryClick?: (category: ProductCategory4Category) => void\n}\n\nfunction getInitials(title: string): string {\n return title\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map(word => word.charAt(0).toUpperCase())\n .join('')\n}\n\nexport function ProductCategory4({\n title = 'Compra por categoría',\n description = 'Explora nuestra selección de repuestos y accesorios',\n categories,\n productsLabel = 'productos',\n customersLabel = 'clientes',\n onCategoryClick,\n}: ProductCategory4Props) {\n return (\n <section className='bg-background w-full py-12 md:py-16'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='mx-auto mb-12 max-w-3xl text-center'>\n <h2 className='text-foreground mb-4 text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl'>\n {title}\n </h2>\n <p className='text-muted-foreground text-lg md:text-xl'>{description}</p>\n </div>\n\n <div className='grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3'>\n {categories.map(category => {\n const Icon = category.icon\n const clickable = Boolean(onCategoryClick)\n return (\n <Card\n key={category.id}\n className={`group relative overflow-hidden transition-all hover:shadow-md ${\n clickable ? 'cursor-pointer' : ''\n }`}\n onClick={onCategoryClick ? () => onCategoryClick(category) : undefined}\n aria-label={clickable ? category.title : undefined}\n >\n <CardContent>\n <div className='mb-4 flex items-center justify-between'>\n <div className='bg-accent text-primary rounded-lg p-2.5' aria-hidden='true'>\n <Icon className='size-5' />\n </div>\n <Badge\n variant='secondary'\n className='bg-muted/50 rounded-sm px-2 py-1 font-semibold'\n aria-label={`${category.products} ${productsLabel}`}\n >\n <ShoppingBag className='me-1 size-3' />\n {category.products} {productsLabel}\n </Badge>\n </div>\n\n <h3 className='text-foreground mb-2 text-lg font-semibold'>{category.title}</h3>\n <p className='text-muted-foreground mb-4 text-sm'>{category.description}</p>\n\n <div className='flex items-center justify-between'>\n <div className='flex items-center gap-2'>\n {category.avatarImages?.length ? (\n <>\n <AvatarGroup>\n {category.avatarImages.slice(0, 3).map((src, i) => (\n <Avatar key={i} className='bg-muted size-6 border'>\n <AvatarImage src={src || undefined} alt='' />\n <AvatarFallback>{getInitials(category.title)}</AvatarFallback>\n </Avatar>\n ))}\n </AvatarGroup>\n <span\n className='text-muted-foreground flex items-center gap-1 text-sm'\n aria-label={`${category.customers} ${customersLabel}`}\n >\n <Users className='h-3.5 w-3.5' aria-hidden='true' />\n {category.customers} {customersLabel}\n </span>\n </>\n ) : (\n <span\n className='text-muted-foreground flex items-center gap-1 text-sm'\n aria-label={`${category.customers} ${customersLabel}`}\n >\n <Users className='h-3.5 w-3.5' aria-hidden='true' />\n {category.customers} {customersLabel}\n </span>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n )\n })}\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCategory4","'use client'\n\nimport * as React from 'react'\nimport { useEffect, useState } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * @title Avatar group\n * @description Overlapping avatar stack whose neighbours lift with a distance falloff on hover.\n *\n * Adapted from Transitions.dev \"Avatar group hover\".\n *\n * A dock, not a switch. Lifting only the hovered item makes the row twitch — one element jumps\n * while the rest sit rigid — so the response falls off with distance: the neighbour rises about\n * half as far, the next barely at all. The falloff is what makes the row read as one soft object.\n *\n * The return is deliberately springier than the approach: a strong overshoot curve on the way back\n * reads as elastic rather than mechanical.\n */\nconst LIFT = -4\nconst FALLOFF = 0.45\nconst ACTIVE_SCALE = 1.05\nconst DURATION = 320\nconst EASE_IN = 'cubic-bezier(0.22, 1, 0.36, 1)'\nconst EASE_OUT = 'cubic-bezier(0.34, 3.85, 0.64, 1)'\n\nexport function AvatarGroup({\n children,\n className,\n overlap = '-ml-2',\n}: {\n children: React.ReactNode\n className?: string\n /** Negative margin applied to every item but the first. Set to `''` for a non-overlapping row. */\n overlap?: string\n}) {\n const items = React.Children.toArray(children)\n const [activeIndex, setActiveIndex] = useState<number | null>(null)\n const [reducedMotion, setReducedMotion] = useState(false)\n\n useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n const sync = () => setReducedMotion(query.matches)\n\n sync()\n query.addEventListener('change', sync)\n return () => query.removeEventListener('change', sync)\n }, [])\n\n const itemStyle = (index: number): React.CSSProperties | undefined => {\n if (reducedMotion) {\n return undefined\n }\n\n const isActive = index === activeIndex\n const shift = activeIndex === null ? 0 : LIFT * FALLOFF ** Math.abs(index - activeIndex)\n\n return {\n // translateY before scale, so scaling never amplifies the lift distance.\n transform: `translateY(${shift.toFixed(3)}px) scale(${isActive ? ACTIVE_SCALE : 1})`,\n transition: `transform ${DURATION}ms ${activeIndex === null ? EASE_OUT : EASE_IN}`,\n willChange: 'transform',\n // A lifted item has to sit above the neighbour overlapping it, or the lift happens underneath.\n zIndex: isActive ? 1 : undefined,\n }\n }\n\n return (\n <div className={cn('flex', className)} onMouseLeave={() => setActiveIndex(null)}>\n {items.map((child, index) => (\n <div\n // eslint-disable-next-line react/no-array-index-key -- position is the identity here\n key={index}\n className={cn('relative', index > 0 && overlap)}\n style={itemStyle(index)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {child}\n </div>\n ))}\n </div>\n )\n}\n\nexport default AvatarGroup","'use client'\n\nimport { useState } from 'react'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Input } from '../../../ui/input'\nimport {\n ArrowRight,\n Search,\n Laptop,\n Shirt,\n Home,\n Dumbbell,\n BookOpen,\n Heart,\n Car,\n Utensils,\n Gamepad2,\n Baby,\n Gift,\n Wrench,\n} from 'lucide-react'\nimport { cn } from '../../../lib/utils'\n\nexport type CategoryIcon =\n | 'electronics'\n | 'fashion'\n | 'home'\n | 'sports'\n | 'books'\n | 'beauty'\n | 'automotive'\n | 'food'\n | 'gaming'\n | 'baby'\n | 'gifts'\n | 'tools'\n\nexport interface ProductCategory5Category {\n id: string\n name: string\n icon: CategoryIcon\n description: string\n itemCount: number\n subcategories: string[]\n featured?: boolean\n}\n\nexport interface ProductCategory5Props {\n title?: string\n description?: string\n categories: ProductCategory5Category[]\n searchPlaceholder?: string\n productsLabel?: string\n featuredLabel?: string\n browseLabel?: string\n viewAllLabel?: string\n notFoundLabel?: string\n onBrowse?: (category: ProductCategory5Category) => void\n onViewAll?: () => void\n}\n\nconst categoryIcons: Record<CategoryIcon, typeof Laptop> = {\n electronics: Laptop,\n fashion: Shirt,\n home: Home,\n sports: Dumbbell,\n books: BookOpen,\n beauty: Heart,\n automotive: Car,\n food: Utensils,\n gaming: Gamepad2,\n baby: Baby,\n gifts: Gift,\n tools: Wrench,\n}\n\nexport function ProductCategory5({\n title = 'Explora categorías',\n description = 'Encuentra lo que necesitas en nuestras categorías organizadas',\n categories,\n searchPlaceholder = 'Buscar categorías...',\n productsLabel = 'productos disponibles',\n featuredLabel = 'Destacado',\n browseLabel = 'Explorar',\n viewAllLabel = 'Ver todos los productos',\n notFoundLabel = '¿No encuentras lo que buscas?',\n onBrowse,\n onViewAll,\n}: ProductCategory5Props) {\n const [query, setQuery] = useState('')\n\n const filteredCategories = categories.filter(category => {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return (\n category.name.toLowerCase().includes(q) ||\n category.subcategories.some(sub => sub.toLowerCase().includes(q))\n )\n })\n\n const totalCount = categories.reduce((sum, category) => sum + category.itemCount, 0)\n\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='mb-8 text-center'>\n <h2 className='mb-4 text-3xl font-bold tracking-tight text-balance'>{title}</h2>\n <p className='text-muted-foreground mb-6 text-lg'>{description}</p>\n\n <div className='relative mx-auto max-w-md'>\n <Search\n className='text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2'\n aria-hidden='true'\n />\n <Input\n placeholder={searchPlaceholder}\n value={query}\n onChange={e => setQuery(e.target.value)}\n className='ps-9 h-9'\n aria-label='Buscar categorías'\n />\n </div>\n </div>\n\n {filteredCategories.length === 0 ? (\n <p className='text-muted-foreground py-10 text-center text-sm'>\n Sin resultados para "{query.trim()}"\n </p>\n ) : (\n <div className='grid grid-cols-1 gap-4 lg:grid-cols-2'>\n {filteredCategories.map(category => {\n const Icon = categoryIcons[category.icon]\n\n return (\n <Card\n key={category.id}\n className={cn(\n 'group hover:border-primary relative py-0 transition-all duration-200 hover:shadow-md'\n )}\n >\n <CardContent className='p-6'>\n <div className='flex items-start gap-4'>\n <div className='flex-shrink-0'>\n <div className='bg-primary/10 group-hover:bg-primary/20 flex size-12 items-center justify-center rounded-lg transition-colors'>\n <Icon className='text-primary size-6' aria-hidden='true' />\n </div>\n </div>\n\n <div className='min-w-0 flex-1'>\n <div className='flex items-start justify-between'>\n <div className='flex-1'>\n <div className='mb-2 flex items-center gap-2'>\n <h3 className='text-lg font-semibold transition-colors'>{category.name}</h3>\n {category.featured ? (\n <Badge\n variant='secondary'\n className='rounded-sm px-2 py-0.5 font-semibold'\n >\n {featuredLabel}\n </Badge>\n ) : null}\n </div>\n <p className='text-muted-foreground mb-3 line-clamp-2 text-sm'>\n {category.description}\n </p>\n\n <div className='mb-3 flex flex-wrap gap-2'>\n {category.subcategories.map((sub, index) => (\n <span\n key={index}\n className='bg-muted text-muted-foreground rounded-md px-2 py-1 text-xs'\n >\n {sub}\n </span>\n ))}\n </div>\n\n <div className='text-muted-foreground text-sm'>\n {category.itemCount.toLocaleString()} {productsLabel}\n </div>\n </div>\n </div>\n </div>\n </div>\n <Button\n variant='ghost'\n size='sm'\n className='absolute end-4 bottom-4 h-8 cursor-pointer px-3 text-xs opacity-0 transition-opacity group-hover:opacity-100'\n onClick={onBrowse ? () => onBrowse(category) : undefined}\n >\n {browseLabel}\n <ArrowRight />\n </Button>\n </CardContent>\n </Card>\n )\n })}\n </div>\n )}\n\n <div className='mt-8 text-center'>\n <p className='text-muted-foreground mb-4 text-sm'>{notFoundLabel}</p>\n <Button\n variant='outline'\n className='h-9 cursor-pointer px-4 py-2'\n onClick={onViewAll}\n >\n {viewAllLabel} {totalCount.toLocaleString()}\n </Button>\n </div>\n </div>\n </section>\n )\n}\n\nexport default ProductCategory5","import { Fragment } from 'react'\nimport { ChevronLeft } from 'lucide-react'\nimport { z } from 'zod'\n\nimport { cn } from '../../../lib/utils'\nimport {\n Breadcrumb as BreadcrumbRoot,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '../../../ui/breadcrumb'\n\nexport const breadcrumbItemSchema = z.object({\n label: z.string(),\n href: z.string().optional(),\n})\n\nexport type BreadcrumbItemData = z.infer<typeof breadcrumbItemSchema>\n\nexport const breadcrumbPropsSchema = z.object({\n items: z.array(breadcrumbItemSchema),\n maxItems: z.number().int().min(2).optional(),\n ariaLabel: z.string().optional(),\n backLabel: z.string().optional(),\n className: z.string().optional(),\n})\n\nexport type BreadcrumbProps = z.infer<typeof breadcrumbPropsSchema>\n\nconst DEFAULT_MAX_ITEMS = 4\nconst ELLIPSIS = Symbol('breadcrumb-ellipsis')\n\n// Shared horizontal rhythm: the same max-width and responsive gutters the\n// sibling blocks (category listing, product overview) use, so the trail aligns\n// with the page content instead of sitting flush against the viewport edge.\nconst CONTAINER = 'mx-auto w-full max-w-7xl px-4 py-4 sm:px-6 lg:px-8'\n\ntype DisplayEntry = BreadcrumbItemData | typeof ELLIPSIS\n\nfunction collapseItems(\n items: BreadcrumbItemData[],\n maxItems: number,\n): DisplayEntry[] {\n if (items.length <= maxItems) return items\n return [items[0], ELLIPSIS, ...items.slice(items.length - (maxItems - 1))]\n}\n\n/**\n * Breadcrumb trail for a real navigation path (Home → … → current).\n *\n * Framework-agnostic and prop-driven: plain anchors (no router) and the shared\n * shadcn breadcrumb primitives. The last item is the current page and is never\n * a link (`aria-current=\"page\"`); earlier items link only when an `href` is\n * given. Long labels truncate, and trails longer than `maxItems` collapse the\n * intermediate levels behind an ellipsis. On mobile the full list is replaced\n * by a single back link to the parent, so a wide trail never overflows.\n *\n * Renders nothing when there are no labelled items.\n */\nexport function Breadcrumb({\n items,\n maxItems = DEFAULT_MAX_ITEMS,\n ariaLabel = 'Breadcrumb',\n backLabel,\n className,\n}: BreadcrumbProps) {\n const clean = items.filter((item) => item.label.trim().length > 0)\n if (clean.length === 0) return null\n\n const parent = clean.length > 1 ? clean[clean.length - 2] : undefined\n const entries = collapseItems(clean, maxItems)\n\n return (\n <BreadcrumbRoot aria-label={ariaLabel} className={cn(CONTAINER, className)}>\n {parent ? (\n <a\n href={parent.href ?? '#'}\n className=\"inline-flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground md:hidden\"\n >\n <ChevronLeft className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"truncate\">{backLabel ?? parent.label}</span>\n </a>\n ) : null}\n <BreadcrumbList className=\"hidden md:flex\">\n {entries.map((entry, index) => {\n const isLast = index === entries.length - 1\n const key =\n entry === ELLIPSIS\n ? 'ellipsis'\n : `${index}:${entry.href ?? ''}:${entry.label}`\n return (\n <Fragment key={key}>\n <BreadcrumbItem>\n {entry === ELLIPSIS ? (\n <BreadcrumbEllipsis />\n ) : isLast ? (\n <BreadcrumbPage\n className=\"max-w-[24ch] truncate\"\n title={entry.label}\n >\n {entry.label}\n </BreadcrumbPage>\n ) : entry.href ? (\n <BreadcrumbLink\n href={entry.href}\n className=\"max-w-[24ch] truncate\"\n title={entry.label}\n >\n {entry.label}\n </BreadcrumbLink>\n ) : (\n <span\n className=\"max-w-[24ch] truncate\"\n title={entry.label}\n >\n {entry.label}\n </span>\n )}\n </BreadcrumbItem>\n {!isLast ? <BreadcrumbSeparator /> : null}\n </Fragment>\n )\n })}\n </BreadcrumbList>\n </BreadcrumbRoot>\n )\n}\n","import * as React from \"react\"\nimport { cn } from \"cn\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm break-words text-muted-foreground sm:gap-2.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","import { z } from 'zod'\n\nimport { cn } from '../../../lib/utils'\n\nexport const skipToContentPropsSchema = z.object({\n targetId: z.string(),\n label: z.string().optional(),\n className: z.string().optional(),\n})\n\nexport type SkipToContentProps = z.infer<typeof skipToContentPropsSchema>\n\n/**\n * Skip-to-content link (WCAG 2.4.1 Bypass Blocks).\n *\n * Framework-agnostic and prop-driven: a plain anchor to the main content id,\n * visually hidden until it receives focus, then pinned at the top-left with\n * visible contrast. The target element is responsible for carrying the id (and\n * being focusable); this block only renders the bypass affordance.\n */\nexport function SkipToContent({\n targetId,\n label = 'Skip to content',\n className,\n}: SkipToContentProps) {\n return (\n <a\n href={`#${targetId}`}\n className={cn(\n 'sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 focus:z-[100] focus:rounded-md focus:bg-primary focus:px-4 focus:py-2 focus:text-sm focus:font-semibold focus:text-primary-foreground focus:shadow-lg',\n className,\n )}\n >\n {label}\n </a>\n )\n}\n","'use client'\n\nimport { ArrowUp } from 'lucide-react'\nimport { useEffect, useState } from 'react'\nimport { z } from 'zod'\n\nimport { cn } from '../../../lib/utils'\n\nexport const backToTopPropsSchema = z.object({\n threshold: z.number().optional(),\n label: z.string().optional(),\n className: z.string().optional(),\n})\n\nexport type BackToTopProps = z.infer<typeof backToTopPropsSchema>\n\nconst DEFAULT_THRESHOLD = 400\n\n/**\n * Resolve the scroll behavior for a back-to-top activation. Pure so it can be\n * unit-tested without a DOM: reduced motion yields an instant jump.\n */\nexport function resolveScrollBehavior(\n prefersReducedMotion: boolean,\n): 'auto' | 'smooth' {\n return prefersReducedMotion ? 'auto' : 'smooth'\n}\n\n/**\n * Back-to-top control that appears once the page is scrolled past `threshold`\n * and returns the viewport to the top. Honors `prefers-reduced-motion` (instant\n * jump instead of a smooth scroll). Framework-agnostic; icon-only with an\n * accessible label.\n */\nexport function BackToTop({\n threshold = DEFAULT_THRESHOLD,\n label = 'Back to top',\n className,\n}: BackToTopProps) {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const onScroll = () => setVisible(window.scrollY > threshold)\n onScroll()\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => window.removeEventListener('scroll', onScroll)\n }, [threshold])\n\n if (!visible) return null\n\n const handleClick = () => {\n const reduce =\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\n window.scrollTo({ top: 0, behavior: resolveScrollBehavior(reduce) })\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n aria-label={label}\n className={cn(\n 'fixed bottom-4 right-4 z-40 inline-flex size-11 items-center justify-center rounded-full border bg-card text-foreground shadow-lg transition-colors hover:bg-secondary',\n className,\n )}\n >\n <ArrowUp className=\"size-5\" aria-hidden=\"true\" />\n </button>\n )\n}\n","import { z } from 'zod'\n\nimport { cn } from '../../../lib/utils'\nimport { type CategoryIconName, CategoryIcon, categoryIconNameSchema } from './category-icon'\n\nexport const mobileBottomNavItemSchema = z.object({\n id: z.string().optional(),\n label: z.string(),\n href: z.string(),\n icon: categoryIconNameSchema.optional(),\n})\n\nexport type MobileBottomNavItem = z.infer<typeof mobileBottomNavItemSchema>\n\nexport const mobileBottomNavPropsSchema = z.object({\n items: z.array(mobileBottomNavItemSchema),\n currentHref: z.string().optional(),\n ariaLabel: z.string().optional(),\n className: z.string().optional(),\n})\n\nexport type MobileBottomNavProps = z.infer<typeof mobileBottomNavPropsSchema>\n\n/**\n * Mobile-only bottom navigation offering the primary destinations.\n *\n * Framework-agnostic and prop-driven: plain anchors (no router). Hidden at\n * `md` and up; offsets the iOS home indicator via `env(safe-area-inset-bottom)`;\n * each destination meets the 44px minimum touch target. The current\n * destination is marked with `aria-current=\"page\"` and a non-colour cue (weight\n * + indicator bar), never colour alone.\n */\nexport function MobileBottomNav({\n items,\n currentHref,\n ariaLabel = 'Primary',\n className,\n}: MobileBottomNavProps) {\n if (items.length === 0) return null\n\n return (\n <nav\n aria-label={ariaLabel}\n className={cn(\n 'fixed inset-x-0 bottom-0 z-40 border-t bg-card text-foreground md:hidden',\n className,\n )}\n style={{ paddingBottom: 'env(safe-area-inset-bottom)' }}\n >\n <ul className=\"flex\">\n {items.map((item) => {\n const active = currentHref !== undefined && item.href === currentHref\n return (\n <li key={item.id ?? item.href} className=\"relative flex-1\">\n {active ? (\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-x-0 top-0 mx-auto h-0.5 w-8 rounded-full bg-primary\"\n />\n ) : null}\n <a\n href={item.href}\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'flex h-14 flex-col items-center justify-center gap-0.5 text-xs text-muted-foreground',\n active && 'font-semibold text-primary',\n )}\n >\n <CategoryIcon name={item.icon} className=\"size-5\" />\n <span className=\"truncate\">{item.label}</span>\n </a>\n </li>\n )\n })}\n </ul>\n </nav>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { ChevronDown, Search, SlidersHorizontal, X } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui/dropdown-menu'\nimport { Input } from '../../../ui/input'\nimport { cn } from '../../../lib/utils'\n\nexport interface CategoryFilter1Category {\n id: string\n name: string\n count: number\n}\n\nexport interface CategoryFilter1PriceRange {\n id: string\n label: string\n min: number\n max: number | null\n}\n\nexport interface CategoryFilter1SortOption {\n id: string\n label: string\n}\n\nexport interface CategoryFilter1Filters {\n category: string\n priceRange: string\n sort: string\n search: string\n}\n\nexport interface CategoryFilter1Props {\n title?: string\n description?: string\n categories: CategoryFilter1Category[]\n priceRanges: CategoryFilter1PriceRange[]\n sortOptions: CategoryFilter1SortOption[]\n onFilterChange?: (filters: CategoryFilter1Filters) => void\n}\n\nexport function CategoryFilter1({\n title,\n description,\n categories,\n priceRanges,\n sortOptions,\n onFilterChange,\n}: CategoryFilter1Props) {\n const [selectedCategory, setSelectedCategory] = useState('all')\n const [selectedPriceRange, setSelectedPriceRange] = useState('all')\n const [selectedSort, setSelectedSort] = useState('featured')\n const [searchQuery, setSearchQuery] = useState('')\n\n const activeFilters: { type: string; label: string; value: string }[] = []\n if (selectedCategory !== 'all') {\n const category = categories.find(c => c.id === selectedCategory)\n if (category) activeFilters.push({ type: 'category', label: category.name, value: selectedCategory })\n }\n if (selectedPriceRange !== 'all') {\n const priceRange = priceRanges.find(p => p.id === selectedPriceRange)\n if (priceRange) activeFilters.push({ type: 'price', label: priceRange.label, value: selectedPriceRange })\n }\n if (searchQuery) {\n activeFilters.push({ type: 'search', label: `\"${searchQuery}\"`, value: searchQuery })\n }\n\n const selectedCategoryCount = categories.find(c => c.id === selectedCategory)?.count ?? 0\n\n const clearFilter = (type: string) => {\n let nextCategory = selectedCategory\n let nextPrice = selectedPriceRange\n let nextSearch = searchQuery\n if (type === 'category') nextCategory = 'all'\n if (type === 'price') nextPrice = 'all'\n if (type === 'search') nextSearch = ''\n setSelectedCategory(nextCategory)\n setSelectedPriceRange(nextPrice)\n setSearchQuery(nextSearch)\n onFilterChange?.({ category: nextCategory, priceRange: nextPrice, sort: selectedSort, search: nextSearch })\n }\n\n const clearAllFilters = () => {\n setSelectedCategory('all')\n setSelectedPriceRange('all')\n setSearchQuery('')\n onFilterChange?.({ category: 'all', priceRange: 'all', sort: selectedSort, search: '' })\n }\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value\n setSearchQuery(next)\n onFilterChange?.({ category: selectedCategory, priceRange: selectedPriceRange, sort: selectedSort, search: next })\n }\n\n const handleSortSelect = (id: string) => {\n setSelectedSort(id)\n onFilterChange?.({ category: selectedCategory, priceRange: selectedPriceRange, sort: id, search: searchQuery })\n }\n\n const handleCategorySelect = (id: string) => {\n setSelectedCategory(id)\n onFilterChange?.({ category: id, priceRange: selectedPriceRange, sort: selectedSort, search: searchQuery })\n }\n\n const handlePriceRangeSelect = (id: string) => {\n setSelectedPriceRange(id)\n onFilterChange?.({ category: selectedCategory, priceRange: id, sort: selectedSort, search: searchQuery })\n }\n\n return (\n <section className=\"py-8\">\n <div className=\"mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8\">\n <div className=\"mb-8\">\n {title ? <h2 className=\"text-3xl font-bold tracking-tight text-balance\">{title}</h2> : null}\n {description ? <p className=\"text-muted-foreground mt-2\">{description}</p> : null}\n {!description && title ? (\n <p className=\"text-muted-foreground mt-2\">\n Browse our collection of {selectedCategoryCount} products\n </p>\n ) : null}\n </div>\n\n <div className=\"mb-6 flex flex-col gap-4\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative max-w-md flex-1\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2\" />\n <Input\n placeholder=\"Search products...\"\n value={searchQuery}\n onChange={handleSearchChange}\n className=\"h-9 pl-10\"\n />\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" className=\"h-9 w-full cursor-pointer px-4 py-2 sm:w-auto\">\n <SlidersHorizontal data-icon=\"inline-start\" />\n Sort: {sortOptions.find(s => s.id === selectedSort)?.label}\n <ChevronDown data-icon=\"inline-end\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {sortOptions.map(option => (\n <DropdownMenuItem\n key={option.id}\n onClick={() => handleSortSelect(option.id)}\n className={selectedSort === option.id ? 'bg-accent' : ''}\n >\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n <div className=\"flex flex-wrap gap-3\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 cursor-pointer px-3 text-xs\">\n Category: {categories.find(c => c.id === selectedCategory)?.name}\n <ChevronDown data-icon=\"inline-end\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\">\n {categories.map(category => (\n <DropdownMenuItem\n key={category.id}\n onClick={() => handleCategorySelect(category.id)}\n className={cn(selectedCategory === category.id && 'bg-accent')}\n >\n <div className=\"flex w-full items-center justify-between\">\n <span>{category.name}</span>\n <Badge variant=\"secondary\" className=\"px-2.5 py-0.5 text-xs font-semibold\">\n {category.count}\n </Badge>\n </div>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 cursor-pointer px-3 text-xs\">\n Price: {priceRanges.find(p => p.id === selectedPriceRange)?.label}\n <ChevronDown data-icon=\"inline-end\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-48\">\n {priceRanges.map(range => (\n <DropdownMenuItem\n key={range.id}\n onClick={() => handlePriceRangeSelect(range.id)}\n className={cn(selectedPriceRange === range.id && 'bg-accent')}\n >\n {range.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {activeFilters.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-muted-foreground text-sm font-medium\">Active filters:</span>\n {activeFilters.map(filter => (\n <Badge key={filter.type} variant=\"secondary\" className=\"px-2.5 py-0.5 font-semibold\">\n {filter.label}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"!p-1 h-auto cursor-pointer text-inherit\"\n onClick={() => clearFilter(filter.type)}\n >\n <X className=\"size-3\" />\n </Button>\n </Badge>\n ))}\n <DropdownMenuSeparator className=\"mx-2\" />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={clearAllFilters}\n className=\"h-auto cursor-pointer p-1.5 text-xs text-muted-foreground\"\n >\n Clear all\n </Button>\n </div>\n ) : null}\n </div>\n\n <div className=\"bg-muted/50 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-sm font-medium\">Showing {selectedCategoryCount} results</span>\n {searchQuery && <span className=\"text-muted-foreground text-sm\">for "{searchQuery}"</span>}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n Sorted by {sortOptions.find(s => s.id === selectedSort)?.label}\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport default CategoryFilter1","'use client'\n\nimport { useEffect, useId, useState, type ReactNode } from 'react'\nimport { Search, SlidersHorizontal, X } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyTitle } from '../../../ui/empty'\nimport { Input } from '../../../ui/input'\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n} from '../../../ui/pagination'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select'\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '../../../ui/sheet'\nimport { Skeleton } from '../../../ui/skeleton'\nimport { cn } from '../../../lib/utils'\n\nimport { CategoryFilter2FilterPanel } from './category-filter-2-filter-panel'\n\nexport interface FilterProduct {\n id: string\n name: string\n price: string\n /** Optional: an absent image is omitted so the block never renders `src=\"\"`. */\n image?: string\n /**\n * Optional product-detail link. When present the card renders as a real\n * `<a href>` (keyboard focus, middle-click, crawlers); when absent the block\n * falls back to the `onProductClick` path. The href is produced by the\n * presentation layer — the block never builds a route.\n */\n href?: string\n}\n\nexport interface CategoryFilter2Category {\n id: string\n label: string\n}\n\nexport interface CategoryFilter2Collection {\n id: string\n label: string\n}\n\nexport interface CategoryFilter2Color {\n id: string\n color: string\n}\n\nexport interface CategoryFilter2PriceRange {\n min: number\n max: number\n step: number\n}\n\nexport interface CategoryFilter2SortOption {\n value: string\n label: string\n}\n\nexport interface CategoryFilter2Filters {\n categories: string[]\n /** Collections requested by the `category-filters` feature (E2). */\n collections?: string[]\n priceRange: number[]\n size: string | null\n color: string | null\n}\n\n/**\n * A typed catalog-query error the listing renders for repair. It is a structural\n * mirror of the runtime boundary error (`CatalogQueryError`/`CatalogQueryFailure`):\n * `fields` names the exact raw parameters to remove and `feature` is present only\n * for `unmounted-capability`. The block never builds a host URL — it emits the\n * fields through `onRepair` (E2 task 4.5).\n */\nexport interface CategoryFilter2QueryError {\n code: 'invalid-query' | 'unsupported-query' | 'unmounted-capability'\n /** Exact raw URL parameter names that must be removed to repair the query. */\n fields: string[]\n message?: string\n feature?: 'catalog-search' | 'category-filters'\n}\n\n/**\n * The observable listing status. The host derives it from the URL boundary and\n * the provider outcome (`mapCatalogOutcomeToStatus`) and passes it down; the\n * block only renders it. `loading` is in flight; `ready` shows products; `empty`\n * is a valid zero-result query; `invalid-query`/`unsupported-query`/\n * `unmounted-capability` are typed repair states; `error` is a query/network\n * failure with retry. Distinct states stay distinct — a valid empty result is\n * never shown as an error and a raw failure is never swallowed as empty.\n */\nexport type CategoryFilter2Status =\n | { state: 'loading' }\n | { state: 'ready' }\n | { state: 'empty' }\n | { state: 'invalid-query'; error: CategoryFilter2QueryError }\n | { state: 'unsupported-query'; error: CategoryFilter2QueryError }\n | { state: 'unmounted-capability'; error: CategoryFilter2QueryError }\n | { state: 'error'; message?: string }\n\n/** The kind of canonical filter an active chip represents. */\nexport type CategoryFilter2ActiveFilterKind =\n | 'text'\n | 'category'\n | 'collection'\n | 'price'\n | 'attribute'\n\n/**\n * A removable active-filter chip. Built only from the actual canonical query\n * (never from claimed provider filtering): `params` are the raw URL parameter\n * names carrying the filter and `value` is the specific list value to drop.\n */\nexport interface CategoryFilter2ActiveFilter {\n /** Stable identity for React keys and removal callbacks. */\n id: string\n kind: CategoryFilter2ActiveFilterKind\n /** Human-readable label shown on the chip. */\n label: string\n /** Raw URL parameter names that carry this filter. */\n params: string[]\n /** The specific list value this chip removes; absent for scalar filters. */\n value?: string\n}\n\nexport interface CategoryFilter2Props {\n products: FilterProduct[]\n categories?: CategoryFilter2Category[]\n collections?: CategoryFilter2Collection[]\n sizes?: string[]\n colors?: CategoryFilter2Color[]\n /**\n * Real backend-provided price range only. When absent the price control is\n * omitted; the block never falls back to a fabricated `0..1000` default\n * (E2 design Decision 8 / spec \"Price controls require real price metadata\").\n */\n priceRange?: CategoryFilter2PriceRange\n viewOptions?: (number | string)[]\n /** Adapter-advertised sort options only. When absent/empty no sort control is rendered. */\n sortOptions?: CategoryFilter2SortOption[]\n pagination?: (number | string)[]\n\n // ── Controlled canonical-query values (E2) ────────────────────────────────\n // When supplied these win over the block's internal state, making the block\n // controlled by the URL-backed canonical query. When absent the block stays\n // uncontrolled for legacy consumers.\n searchValue?: string\n selectedCategories?: string[]\n selectedCollections?: string[]\n selectedPriceRange?: number[]\n selectedSort?: string\n selectedPage?: number | string\n selectedPageSize?: number | string\n\n // ── Per-control visibility (selected from the installed features) ─────────\n // Defaults preserve the legacy surface: filters shown, search hidden, price\n // shown when a real range is supplied, sort shown when options are supplied.\n showSearch?: boolean\n showFilters?: boolean\n showPrice?: boolean\n showSort?: boolean\n\n filtersTitle?: string\n selectedText?: string\n clearAllLabel?: string\n priceRangeTitle?: string\n minLabel?: string\n maxLabel?: string\n categoriesTitle?: string\n collectionsTitle?: string\n sizesTitle?: string\n colorsTitle?: string\n viewLabel?: string\n viewPlaceholder?: string\n sortPlaceholder?: string\n productsTitle?: string\n currentLabel?: string\n searchLabel?: string\n searchPlaceholder?: string\n onProductClick?: (product: FilterProduct) => void\n onPageChange?: (page: number | string) => void\n onViewChange?: (view: number | string) => void\n onPageSizeChange?: (pageSize: number | string) => void\n onSortChange?: (sort: string) => void\n onFilterChange?: (filters: CategoryFilter2Filters) => void\n onSearchChange?: (text: string) => void\n\n // ── Observable listing states + active-filter chips (E2 task 4.5) ─────────\n /** Observable listing status. Defaults to `ready` so legacy consumers are unchanged. */\n status?: CategoryFilter2Status\n /** Removable active-filter chips built from the canonical query. */\n activeFilters?: CategoryFilter2ActiveFilter[]\n\n // State / chip labels (Spanish defaults match the rest of the block).\n loadingLabel?: string\n emptyTitle?: string\n emptyDescription?: string\n clearFiltersLabel?: string\n invalidQueryTitle?: string\n unsupportedQueryTitle?: string\n unmountedCapabilityTitle?: string\n errorTitle?: string\n errorDescription?: string\n repairLabel?: string\n retryLabel?: string\n activeFiltersTitle?: string\n removeFilterLabel?: string\n\n // Emit-only callbacks: the block never fetches or rewrites the URL. The host\n // (the generated route's `updateURL` action, task 5.2) binds these.\n /** Empty-state clear: drops the active filters but never base scope/sort/pageSize. */\n onClearFilters?: () => void\n /** Invalid/unsupported/unmounted repair: receives the exact bad fields to remove. */\n onRepair?: (remove: string[]) => void\n /** Query/network failure retry: preserves the current query/input. */\n onRetry?: () => void\n /** Removes a single active-filter chip. */\n onRemoveFilter?: (filter: CategoryFilter2ActiveFilter) => void\n}\n\nconst DEFAULT_VIEW_OPTIONS: (number | string)[] = [10, 25, 50, 100]\n\n/**\n * Pure selection reducer shared by the controlled checkbox handlers. Exported\n * so the emitted-change contract is unit-testable without a DOM (this package's\n * tests render with `react-dom/server`).\n */\nexport function toggleFilterValue(\n current: readonly string[],\n value: string,\n checked: boolean,\n): string[] {\n return checked ? [...current, value] : current.filter(candidate => candidate !== value)\n}\n\n/** Assemble the typed filter change emitted upward. */\nexport function buildFilterChange(input: {\n categories: string[]\n collections: string[]\n priceRange: number[]\n size: string | null\n color: string | null\n}): CategoryFilter2Filters {\n return {\n categories: input.categories,\n collections: input.collections,\n priceRange: input.priceRange,\n size: input.size,\n color: input.color,\n }\n}\n\n/**\n * Reconcile the controlled search draft with the URL-backed `searchValue`\n * (E2 corrective, task 8.2).\n *\n * The category listing's search input is controlled by the canonical URL query\n * (the URL is authoritative), but the URL only updates after an async server\n * navigation. Binding the input's DOM value directly to that lagging prop makes\n * React reset it to the previous server value on every re-render, so fast typing\n * loses every character but the last. This pure function keeps a local draft\n * authoritative while the shopper is typing and adopts an external `searchValue`\n * (navigation / reload / back-forward) otherwise.\n *\n * Adoption is allowed only when the draft has not diverged from the previously\n * seen server value — i.e. there is no uncommitted local edit. A stale or\n * out-of-order response therefore cannot revert the draft. Returns the state\n * adjustment to apply, or `null` when nothing changes.\n */\nexport function reconcileSearchDraft(input: {\n searchValue?: string\n prevSearchValue?: string\n draft: string\n}): { draft: string; prevSearchValue?: string } | null {\n const { searchValue, prevSearchValue, draft } = input\n if (searchValue === undefined || searchValue === prevSearchValue) return null\n const clean = prevSearchValue === undefined || draft === prevSearchValue\n return { draft: clean ? searchValue : draft, prevSearchValue: searchValue }\n}\n\nexport interface CategoryFilter2StatusViewProps {\n status: CategoryFilter2Status\n activeFilters?: CategoryFilter2ActiveFilter[]\n activeFiltersTitle?: string\n removeFilterLabel?: string\n loadingLabel?: string\n emptyTitle?: string\n emptyDescription?: string\n clearFiltersLabel?: string\n invalidQueryTitle?: string\n unsupportedQueryTitle?: string\n unmountedCapabilityTitle?: string\n errorTitle?: string\n errorDescription?: string\n repairLabel?: string\n retryLabel?: string\n onClearFilters?: () => void\n onRepair?: (remove: string[]) => void\n onRetry?: () => void\n onRemoveFilter?: (filter: CategoryFilter2ActiveFilter) => void\n}\n\n/** Human-readable description naming the exact offending parameters (and, for\n * `unmounted-capability`, the missing feature). Never a raw stack/error dump. */\nfunction describeQueryError(\n error: CategoryFilter2QueryError,\n state: 'invalid-query' | 'unsupported-query' | 'unmounted-capability',\n): string {\n const fields = error.fields.join(', ')\n if (state === 'unmounted-capability' && error.feature) {\n return `${fields} pertenece a la función «${error.feature}», que no está instalada.`\n }\n return error.message ?? `Parámetros: ${fields}`\n}\n\n/**\n * Hooks-free presentation of the observable listing states and the removable\n * active-filter chips (E2 task 4.5). Kept separate from `CategoryFilter2` so the\n * interaction contract (clear / repair / retry / chip removal) is testable by\n * invoking the rendered handlers without a DOM (this package's tests render with\n * `react-dom/server`). It renders no products and performs no fetch — it only\n * emits the host callbacks. When `ready` with no chips it renders nothing.\n */\nexport function CategoryFilter2StatusView({\n status,\n activeFilters = [],\n activeFiltersTitle = 'Filtros activos',\n removeFilterLabel = 'Quitar filtro',\n loadingLabel = 'Cargando productos',\n emptyTitle = 'Sin resultados',\n emptyDescription = 'Ningún producto coincide con los filtros activos.',\n clearFiltersLabel = 'Limpiar filtros',\n invalidQueryTitle = 'Consulta no válida',\n unsupportedQueryTitle = 'Filtro no disponible',\n unmountedCapabilityTitle = 'Función no disponible',\n errorTitle = 'No se pudieron cargar los productos',\n errorDescription = 'Inténtalo de nuevo.',\n repairLabel = 'Corregir búsqueda',\n retryLabel = 'Reintentar',\n onClearFilters,\n onRepair,\n onRetry,\n onRemoveFilter,\n}: CategoryFilter2StatusViewProps) {\n const chips =\n activeFilters.length > 0 ? (\n <div\n role=\"group\"\n aria-label={activeFiltersTitle}\n className=\"flex flex-wrap items-center gap-2\"\n >\n {activeFilters.map(filter => (\n <Badge key={filter.id} variant=\"secondary\" className=\"gap-1 pr-1\">\n <span>{filter.label}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"size-4 cursor-pointer rounded-full\"\n aria-label={`${removeFilterLabel}: ${filter.label}`}\n data-action=\"remove-filter\"\n data-filter-id={filter.id}\n onClick={() => onRemoveFilter?.(filter)}\n >\n <X aria-hidden=\"true\" />\n </Button>\n </Badge>\n ))}\n </div>\n ) : null\n\n if (status.state === 'ready') {\n return chips\n }\n\n let body: ReactNode\n switch (status.state) {\n case 'loading':\n body = (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\" className=\"flex flex-col gap-4\">\n <span className=\"sr-only\">{loadingLabel}</span>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3\">\n {Array.from({ length: 6 }, (_, index) => (\n <div key={index} className=\"flex flex-col gap-2\">\n <Skeleton className=\"aspect-3/4 w-full rounded-lg\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/3\" />\n </div>\n ))}\n </div>\n </div>\n )\n break\n case 'empty':\n body = (\n <Empty role=\"status\">\n <EmptyHeader>\n <EmptyTitle>{emptyTitle}</EmptyTitle>\n <EmptyDescription>{emptyDescription}</EmptyDescription>\n </EmptyHeader>\n {onClearFilters ? (\n <EmptyContent>\n <Button\n type=\"button\"\n variant=\"outline\"\n data-action=\"clear-filters\"\n onClick={() => onClearFilters()}\n >\n {clearFiltersLabel}\n </Button>\n </EmptyContent>\n ) : null}\n </Empty>\n )\n break\n case 'invalid-query':\n case 'unsupported-query':\n case 'unmounted-capability':\n body = (\n <Empty role=\"alert\">\n <EmptyHeader>\n <EmptyTitle>\n {status.state === 'invalid-query'\n ? invalidQueryTitle\n : status.state === 'unsupported-query'\n ? unsupportedQueryTitle\n : unmountedCapabilityTitle}\n </EmptyTitle>\n <EmptyDescription>{describeQueryError(status.error, status.state)}</EmptyDescription>\n </EmptyHeader>\n {onRepair ? (\n <EmptyContent>\n <Button\n type=\"button\"\n variant=\"outline\"\n data-action=\"repair\"\n onClick={() => onRepair(status.error.fields)}\n >\n {repairLabel}\n </Button>\n </EmptyContent>\n ) : null}\n </Empty>\n )\n break\n case 'error':\n body = (\n <Empty role=\"alert\">\n <EmptyHeader>\n <EmptyTitle>{errorTitle}</EmptyTitle>\n <EmptyDescription>{status.message ?? errorDescription}</EmptyDescription>\n </EmptyHeader>\n {onRetry ? (\n <EmptyContent>\n <Button\n type=\"button\"\n variant=\"default\"\n data-action=\"retry\"\n onClick={() => onRetry()}\n >\n {retryLabel}\n </Button>\n </EmptyContent>\n ) : null}\n </Empty>\n )\n break\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n {chips}\n {body}\n </div>\n )\n}\n\nexport function CategoryFilter2({\n products,\n categories = [],\n collections = [],\n sizes = [],\n colors = [],\n priceRange: priceRangeConfig,\n viewOptions = DEFAULT_VIEW_OPTIONS,\n sortOptions = [],\n pagination = [],\n searchValue,\n selectedCategories,\n selectedCollections,\n selectedPriceRange,\n selectedSort,\n selectedPage,\n selectedPageSize,\n showSearch = false,\n showFilters = true,\n showPrice = true,\n showSort = true,\n filtersTitle = 'Filtros',\n selectedText = 'Filtros',\n clearAllLabel = 'Restablecer',\n priceRangeTitle = 'Rango de precio',\n minLabel = 'Mínimo',\n maxLabel = 'Máximo',\n categoriesTitle = 'Categoría',\n collectionsTitle = 'Colección',\n sizesTitle = 'Tamaño',\n colorsTitle = 'Color',\n viewLabel = 'Ver',\n viewPlaceholder = 'Seleccionar',\n sortPlaceholder = 'Ordenar por',\n productsTitle = 'Productos',\n currentLabel = '(actual)',\n searchLabel = 'Buscar',\n searchPlaceholder = 'Buscar',\n onProductClick,\n onPageChange,\n onViewChange,\n onPageSizeChange,\n onSortChange,\n onFilterChange,\n onSearchChange,\n status = { state: 'ready' },\n activeFilters = [],\n loadingLabel,\n emptyTitle,\n emptyDescription,\n clearFiltersLabel,\n invalidQueryTitle,\n unsupportedQueryTitle,\n unmountedCapabilityTitle,\n errorTitle,\n errorDescription,\n repairLabel,\n retryLabel,\n activeFiltersTitle,\n removeFilterLabel,\n onClearFilters,\n onRepair,\n onRetry,\n onRemoveFilter,\n}: CategoryFilter2Props) {\n const searchInputId = useId()\n const [internalCategories, setInternalCategories] = useState<string[]>([])\n const [internalCollections, setInternalCollections] = useState<string[]>([])\n const [internalPriceRange, setInternalPriceRange] = useState<number[]>(\n priceRangeConfig ? [priceRangeConfig.min, priceRangeConfig.max] : [],\n )\n const [internalSize, setInternalSize] = useState<string | null>(null)\n const [internalColor, setInternalColor] = useState<string | null>(null)\n const [internalView, setInternalView] = useState<number | string>(viewOptions[0] ?? 10)\n const [internalSort, setInternalSort] = useState<string>(sortOptions[0]?.value ?? '')\n const [internalPage, setInternalPage] = useState<number | string | null>(pagination.length > 0 ? pagination[0] : null)\n const [internalSearch, setInternalSearch] = useState('')\n // Local draft of the controlled search input (E2 corrective, task 8.2): the\n // URL stays authoritative for the canonical query and the listing, but the\n // input displays this draft so fast typing is never reset by a lagging server\n // response. Adopt the external `searchValue` only when no uncommitted edit is\n // pending (see `reconcileSearchDraft`).\n const [draftSearch, setDraftSearch] = useState(searchValue ?? '')\n const [prevSearchValue, setPrevSearchValue] = useState(searchValue)\n const [isSheetOpen, setIsSheetOpen] = useState(false)\n\n const reconciledSearch = reconcileSearchDraft({\n searchValue,\n prevSearchValue,\n draft: draftSearch,\n })\n if (reconciledSearch) {\n setPrevSearchValue(reconciledSearch.prevSearchValue)\n if (reconciledSearch.draft !== draftSearch) setDraftSearch(reconciledSearch.draft)\n }\n\n // Controlled-when-supplied values: the canonical query wins over local state.\n const categoriesValue = selectedCategories ?? internalCategories\n const collectionsValue = selectedCollections ?? internalCollections\n const priceRangeValue = selectedPriceRange ?? internalPriceRange\n const sortValue = selectedSort ?? internalSort\n const pageValue = selectedPage ?? internalPage\n const pageSizeValue = selectedPageSize ?? internalView\n const searchText = searchValue === undefined ? internalSearch : draftSearch\n\n // Close sheet when screen size becomes large using CSS media query\n useEffect(() => {\n const mediaQuery = window.matchMedia('(min-width: 1024px)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n if (e.matches) {\n setIsSheetOpen(false)\n }\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }, [])\n\n const emitFilters = (overrides: Partial<CategoryFilter2Filters> = {}) => {\n onFilterChange?.(\n buildFilterChange({\n categories: categoriesValue,\n collections: collectionsValue,\n priceRange: priceRangeValue,\n size: internalSize,\n color: internalColor,\n ...overrides,\n }),\n )\n }\n\n const handleCategoryChange = (category: string, checked: boolean) => {\n const next = toggleFilterValue(categoriesValue, category, checked)\n setInternalCategories(next)\n emitFilters({ categories: next })\n }\n\n const handleCollectionChange = (collection: string, checked: boolean) => {\n const next = toggleFilterValue(collectionsValue, collection, checked)\n setInternalCollections(next)\n emitFilters({ collections: next })\n }\n\n const handlePriceChange = (next: number[]) => {\n setInternalPriceRange(next)\n emitFilters({ priceRange: next })\n }\n\n const handleSizeChange = (size: string | null) => {\n setInternalSize(size)\n emitFilters({ size })\n }\n\n const handleColorChange = (color: string | null) => {\n setInternalColor(color)\n emitFilters({ color })\n }\n\n const handleClearAll = () => {\n const resetPriceRange = priceRangeConfig ? [priceRangeConfig.min, priceRangeConfig.max] : []\n setInternalCategories([])\n setInternalCollections([])\n setInternalSize(null)\n setInternalColor(null)\n setInternalPriceRange(resetPriceRange)\n onFilterChange?.(\n buildFilterChange({\n categories: [],\n collections: [],\n priceRange: resetPriceRange,\n size: null,\n color: null,\n }),\n )\n }\n\n const handlePageSizeChange = (size: number | string) => {\n setInternalView(size)\n ;(onPageSizeChange ?? onViewChange)?.(size)\n }\n\n const handleSortChange = (sort: string) => {\n setInternalSort(sort)\n onSortChange?.(sort)\n }\n\n const handlePageChange = (page: number | string) => {\n if (page === '...') return\n setInternalPage(page)\n onPageChange?.(page)\n }\n\n const handleSearchChange = (text: string) => {\n if (searchValue === undefined) setInternalSearch(text)\n else setDraftSearch(text)\n onSearchChange?.(text)\n }\n\n const filterPanelProps = {\n selectedText,\n clearAllLabel,\n priceRangeTitle,\n priceRange: priceRangeValue,\n priceRangeConfig: showPrice ? priceRangeConfig : undefined,\n minLabel,\n maxLabel,\n onPriceChange: handlePriceChange,\n categoriesTitle,\n categories,\n selectedCategories: categoriesValue,\n onCategoryChange: handleCategoryChange,\n collectionsTitle,\n collections,\n selectedCollections: collectionsValue,\n onCollectionChange: handleCollectionChange,\n sizesTitle,\n sizes,\n selectedSize: internalSize,\n onSizeChange: handleSizeChange,\n colorsTitle,\n colors,\n selectedColor: internalColor,\n onColorChange: handleColorChange,\n onClearAll: handleClearAll,\n }\n\n return (\n <div className=\"mx-auto w-full max-w-7xl px-4 py-8 sm:px-6 lg:px-8\">\n <div className=\"flex flex-col gap-8 lg:flex-row\">\n {showFilters ? (\n <aside className=\"hidden w-full flex-none lg:block lg:w-72\">\n <div className=\"max-h-100vh sticky top-4 overflow-y-auto\">\n <div className=\"flex flex-col gap-6 pb-6\">\n <CategoryFilter2FilterPanel {...filterPanelProps} />\n </div>\n </div>\n </aside>\n ) : null}\n\n <main className=\"flex min-w-0 flex-1 flex-col gap-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div className=\"flex items-center gap-4\">\n {showFilters ? (\n <Sheet open={isSheetOpen} onOpenChange={setIsSheetOpen}>\n <SheetTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 cursor-pointer px-3 text-xs lg:hidden\"\n >\n <SlidersHorizontal />\n {filtersTitle}\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-full p-0 sm:w-[380px] lg:hidden\">\n <SheetHeader className=\"border-b px-6 py-4\">\n <SheetTitle className=\"text-lg\">{filtersTitle}</SheetTitle>\n </SheetHeader>\n <div className=\"h-[calc(100vh-4rem)] overflow-y-auto p-6\">\n <div className=\"flex flex-col gap-6\">\n <CategoryFilter2FilterPanel {...filterPanelProps} />\n </div>\n </div>\n </SheetContent>\n </Sheet>\n ) : null}\n {showSearch ? (\n <div className=\"relative w-full sm:w-64\">\n <label htmlFor={searchInputId} className=\"sr-only\">\n {searchLabel}\n </label>\n <Search\n aria-hidden=\"true\"\n className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2\"\n />\n <Input\n id={searchInputId}\n type=\"search\"\n value={searchText}\n onChange={event => handleSearchChange(event.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchLabel}\n className=\"h-8 pl-8\"\n />\n </div>\n ) : null}\n {viewOptions.length > 0 ? (\n <div className=\"hidden items-center gap-2 sm:flex\">\n <span className=\"text-sm\">{viewLabel}</span>\n <Select\n value={String(pageSizeValue)}\n onValueChange={value => handlePageSizeChange(viewOptions.find(option => String(option) === value) ?? value)}\n >\n <SelectTrigger className=\"h-8 w-[100px]\" aria-label={viewLabel}>\n <SelectValue placeholder={viewPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {viewOptions.map(option => (\n <SelectItem key={option} value={String(option)}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n </div>\n {showSort && sortOptions.length > 0 ? (\n <div className=\"flex items-center gap-4\">\n <Select value={sortValue} onValueChange={handleSortChange}>\n <SelectTrigger className=\"h-8 w-[180px]\" aria-label={sortPlaceholder}>\n <SelectValue placeholder={sortPlaceholder} />\n </SelectTrigger>\n <SelectContent>\n {sortOptions.map(option => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n </div>\n\n <CategoryFilter2StatusView\n status={status}\n activeFilters={activeFilters}\n loadingLabel={loadingLabel}\n emptyTitle={emptyTitle}\n emptyDescription={emptyDescription}\n clearFiltersLabel={clearFiltersLabel}\n invalidQueryTitle={invalidQueryTitle}\n unsupportedQueryTitle={unsupportedQueryTitle}\n unmountedCapabilityTitle={unmountedCapabilityTitle}\n errorTitle={errorTitle}\n errorDescription={errorDescription}\n repairLabel={repairLabel}\n retryLabel={retryLabel}\n activeFiltersTitle={activeFiltersTitle}\n removeFilterLabel={removeFilterLabel}\n onClearFilters={onClearFilters}\n onRepair={onRepair}\n onRetry={onRetry}\n onRemoveFilter={onRemoveFilter}\n />\n\n {status.state === 'ready' ? (\n <section aria-labelledby=\"products-heading\" className=\"flex flex-col gap-6\">\n <h2 id=\"products-heading\" className=\"sr-only\">\n {productsTitle}\n </h2>\n <ul className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3\">\n {products.map(product => {\n const card = (\n <>\n <div className=\"relative aspect-3/4 overflow-hidden rounded-lg\">\n {product.image ? (\n <img\n src={product.image}\n alt={product.name}\n className=\"size-full object-cover transition-transform duration-300 group-hover:scale-105\"\n width={300}\n height={400}\n loading=\"lazy\"\n />\n ) : (\n <div\n data-slot=\"product-image-placeholder\"\n aria-hidden=\"true\"\n className=\"size-full bg-muted\"\n />\n )}\n </div>\n <h3 className=\"text-sm font-medium text-balance\">{product.name}</h3>\n <p className=\"text-sm font-semibold\">{product.price}</p>\n </>\n )\n return (\n <li key={product.id} className=\"group\">\n {product.href ? (\n // A real anchor keeps keyboard focus, middle-click and\n // crawlers working without a JS emit path.\n <a href={product.href} className=\"flex h-full flex-col gap-2\">\n {card}\n </a>\n ) : (\n <article\n className={cn(\n 'flex h-full flex-col gap-2',\n onProductClick && 'cursor-pointer',\n )}\n onClick={onProductClick ? () => onProductClick(product) : undefined}\n >\n {card}\n </article>\n )}\n </li>\n )\n })}\n </ul>\n\n {pagination.length > 0 ? (\n <Pagination aria-label=\"Paginación\">\n <PaginationContent>\n {pagination.map((page, index) =>\n page === '...' ? (\n <PaginationEllipsis key={`${page}-${index}`} />\n ) : (\n <PaginationItem key={page}>\n <Button\n type=\"button\"\n variant={pageValue === page ? 'outline' : 'ghost'}\n size=\"icon\"\n data-slot=\"pagination-link\"\n data-active={pageValue === page}\n aria-current={pageValue === page ? 'page' : undefined}\n className=\"size-8 cursor-pointer p-0\"\n onClick={() => handlePageChange(page)}\n >\n {page}\n {pageValue === page && <span className=\"sr-only\">{currentLabel}</span>}\n </Button>\n </PaginationItem>\n ),\n )}\n </PaginationContent>\n </Pagination>\n ) : null}\n </section>\n ) : null}\n </main>\n </div>\n </div>\n )\n}\n\nexport default CategoryFilter2\n","'use client'\n\nimport { useId } from 'react'\n\nimport { Button } from '../../../ui/button'\nimport { CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { CheckboxCheck } from '../checkout-forms/checkbox-check'\n\nimport type {\n CategoryFilter2Category,\n CategoryFilter2Collection,\n CategoryFilter2Color,\n CategoryFilter2PriceRange,\n} from './category-filter-2'\n\ninterface CategoryFilter2FilterPanelProps {\n selectedText?: string\n clearAllLabel?: string\n priceRangeTitle?: string\n priceRange: number[]\n /**\n * Real backend-provided range only. When absent the price section is not\n * rendered — the block never fabricates a `0..1000` range (E2 design\n * Decision 8 / spec \"Price controls require real price metadata\").\n */\n priceRangeConfig?: CategoryFilter2PriceRange\n minLabel?: string\n maxLabel?: string\n onPriceChange: (range: number[]) => void\n categoriesTitle?: string\n categories: CategoryFilter2Category[]\n selectedCategories: string[]\n onCategoryChange: (category: string, checked: boolean) => void\n collectionsTitle?: string\n collections: CategoryFilter2Collection[]\n selectedCollections: string[]\n onCollectionChange: (collection: string, checked: boolean) => void\n sizesTitle?: string\n sizes: string[]\n selectedSize: string | null\n onSizeChange: (size: string | null) => void\n colorsTitle?: string\n colors: CategoryFilter2Color[]\n selectedColor: string | null\n onColorChange: (color: string | null) => void\n onClearAll: () => void\n}\n\nexport function CategoryFilter2FilterPanel({\n selectedText = 'Filtros',\n clearAllLabel = 'Restablecer',\n priceRangeTitle = 'Rango de precio',\n priceRange,\n priceRangeConfig,\n minLabel = 'Mínimo',\n maxLabel = 'Máximo',\n onPriceChange,\n categoriesTitle = 'Categoría',\n categories,\n selectedCategories,\n onCategoryChange,\n collectionsTitle = 'Colección',\n collections,\n selectedCollections,\n onCollectionChange,\n sizesTitle = 'Tamaño',\n sizes,\n selectedSize,\n onSizeChange,\n colorsTitle = 'Color',\n colors,\n selectedColor,\n onColorChange,\n onClearAll,\n}: CategoryFilter2FilterPanelProps) {\n const priceInputId = useId()\n const categoryInputId = useId()\n const collectionInputId = useId()\n\n return (\n <>\n <div className=\"flex flex-col gap-6\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h1 className=\"font-semibold\">{selectedText}</h1>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 cursor-pointer px-2 text-xs\" onClick={onClearAll}>\n {clearAllLabel}\n </Button>\n </div>\n </div>\n\n {priceRangeConfig ? (\n <div className=\"mt-4 flex flex-col gap-4\">\n <CardTitle className=\"font-semibold\">{priceRangeTitle}</CardTitle>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex flex-1 flex-col gap-1\">\n <label htmlFor={`${priceInputId}-min`}>{minLabel}</label>\n <Input\n id={`${priceInputId}-min`}\n type=\"number\"\n value={priceRange[0] ?? priceRangeConfig.min}\n onChange={e => {\n const value = parseInt(e.target.value)\n if (!isNaN(value) && value >= priceRangeConfig.min) {\n onPriceChange([value, priceRange[1] ?? priceRangeConfig.max])\n }\n }}\n min={priceRangeConfig.min}\n max={priceRange[1] ?? priceRangeConfig.max}\n step={priceRangeConfig.step}\n className=\"h-9\"\n />\n </div>\n <div className=\"mt-5 flex-none\">-</div>\n <div className=\"flex flex-1 flex-col gap-1\">\n <label htmlFor={`${priceInputId}-max`}>{maxLabel}</label>\n <Input\n id={`${priceInputId}-max`}\n type=\"number\"\n value={priceRange[1] ?? priceRangeConfig.max}\n onChange={e => {\n const value = parseInt(e.target.value)\n if (!isNaN(value) && value <= priceRangeConfig.max) {\n onPriceChange([priceRange[0] ?? priceRangeConfig.min, value])\n }\n }}\n min={priceRange[0] ?? priceRangeConfig.min}\n max={priceRangeConfig.max}\n step={priceRangeConfig.step}\n className=\"h-9\"\n />\n </div>\n </div>\n </div>\n ) : null}\n\n {categories.length > 0 ? (\n <div className=\"mt-4 flex flex-col gap-4\">\n <CardTitle className=\"font-semibold\">{categoriesTitle}</CardTitle>\n <div className=\"flex flex-col gap-2\">\n {categories.map(category => (\n <div key={category.id} className=\"flex items-center gap-2\">\n <CheckboxCheck\n id={`${categoryInputId}-${category.id}`}\n checked={selectedCategories.includes(category.id)}\n onCheckedChange={checked => onCategoryChange(category.id, checked as boolean)}\n />\n <label htmlFor={`${categoryInputId}-${category.id}`} className=\"text-sm\">\n {category.label}\n </label>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {collections.length > 0 ? (\n <div className=\"mt-4 flex flex-col gap-4\">\n <CardTitle className=\"font-semibold\">{collectionsTitle}</CardTitle>\n <div className=\"flex flex-col gap-2\">\n {collections.map(collection => (\n <div key={collection.id} className=\"flex items-center gap-2\">\n <CheckboxCheck\n id={`${collectionInputId}-${collection.id}`}\n checked={selectedCollections.includes(collection.id)}\n onCheckedChange={checked => onCollectionChange(collection.id, checked as boolean)}\n />\n <label htmlFor={`${collectionInputId}-${collection.id}`} className=\"text-sm\">\n {collection.label}\n </label>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {sizes.length > 0 ? (\n <div className=\"mt-4 flex flex-col gap-4\">\n <CardTitle className=\"font-semibold\">{sizesTitle}</CardTitle>\n <div className=\"flex flex-wrap gap-2\">\n {sizes.map(size => (\n <Button\n key={size}\n variant={selectedSize === size ? 'default' : 'outline'}\n size=\"sm\"\n className=\"h-8 cursor-pointer px-3 text-xs\"\n onClick={() => onSizeChange(size === selectedSize ? null : size)}\n aria-pressed={selectedSize === size}\n >\n {size}\n </Button>\n ))}\n </div>\n </div>\n ) : null}\n\n {colors.length > 0 ? (\n <div className=\"mt-4 flex flex-col gap-4\">\n <CardTitle className=\"font-semibold\">{colorsTitle}</CardTitle>\n <div className=\"flex flex-wrap gap-2\">\n {colors.map(color => (\n <Button\n key={color.id}\n onClick={() => onColorChange(color.id === selectedColor ? null : color.id)}\n className={`relative size-8 cursor-pointer rounded-sm transition-transform duration-200 ${\n selectedColor === color.id ? 'ring-primary scale-105 ring-2' : 'hover:ring-foreground/20 hover:ring-1'\n } ${color.id === 'white' ? 'border-border border' : ''}`}\n style={{ backgroundColor: color.color }}\n aria-pressed={selectedColor === color.id}\n aria-label={color.id}\n >\n {selectedColor === color.id && <div className=\"border-background absolute inset-0 rounded-sm border-2\" />}\n </Button>\n ))}\n </div>\n </div>\n ) : null}\n </>\n )\n}\n\nexport default CategoryFilter2FilterPanel\n","'use client'\n\nimport { useLayoutEffect, useRef, useState } from 'react'\nimport { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'\n\nimport { cn } from '../../../lib/utils'\n\nconst BOX_MS = 150\nconst DRAW_MS = 350\nconst UNCHECK_MS = 150\nconst EASE = 'cubic-bezier(0.22, 1, 0.36, 1)'\n\nexport function CheckboxCheck({ className, indeterminate, ...props }: CheckboxPrimitive.Root.Props) {\n const pathRef = useRef<SVGPathElement>(null)\n const [length, setLength] = useState(15)\n\n useLayoutEffect(() => {\n const path = pathRef.current\n if (path) {\n setLength(Math.ceil(path.getTotalLength()))\n }\n }, [])\n\n const mark = indeterminate ? 'M2.12 5.08H8.47' : 'M1.69 5.08L3.81 7.2L8.47 2.54'\n\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n 'peer relative flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:data-checked:bg-primary',\n 'motion-reduce:transition-none',\n className\n )}\n style={{ transition: `background-color ${BOX_MS}ms ${EASE}, border-color ${BOX_MS}ms ${EASE}` }}\n indeterminate={indeterminate}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n keepMounted\n data-slot=\"checkbox-indicator\"\n className={cn(\n 'grid size-3.5 place-content-center text-current',\n '[&_path]:[transition:stroke-dashoffset_var(--check-uncheck)_var(--check-ease)]',\n '[&_path]:[stroke-dashoffset:var(--check-len)]',\n 'data-checked:[&_path]:[stroke-dashoffset:0]',\n 'data-checked:[&_path]:[transition-duration:var(--check-draw)]',\n 'motion-reduce:[&_path]:transition-none'\n )}\n style={\n {\n '--check-len': length,\n '--check-draw': `${DRAW_MS}ms`,\n '--check-uncheck': `${UNCHECK_MS}ms`,\n '--check-ease': EASE,\n } as React.CSSProperties\n }\n >\n <svg viewBox=\"0 0 10.1668 10.1668\" fill=\"none\" aria-hidden className=\"size-full overflow-visible\">\n <path\n ref={pathRef}\n d={mark}\n stroke=\"currentColor\"\n strokeWidth={0.9}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ strokeDasharray: length }}\n />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport default CheckboxCheck","'use client'\n\nimport { useState } from 'react'\nimport { SlidersHorizontal } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport {\n Empty,\n EmptyContent,\n EmptyDescription,\n EmptyHeader,\n EmptyTitle,\n} from '../../../ui/empty'\n\nimport { CategoryFilter4ChipRail } from './category-filter-4-chip-rail'\nimport { CategoryFilter4Drawer } from './category-filter-4-drawer'\nimport { CategoryFilter4Sidebar } from './category-filter-4-sidebar'\nimport { CategoryFilter4SortSheet } from './category-filter-4-sort-sheet'\nimport { emptyFilters, useCategoryFilter4State } from './category-filter-4-state'\n\nexport interface CategoryFilter4SortOption {\n value: string\n label: string\n}\n\nexport interface CategoryFilter4FacetOption {\n value: string\n label: string\n}\n\nexport interface CategoryFilter4RangeBand {\n value: string\n label: string\n min: number\n max: number\n}\n\nexport interface CategoryFilter4Facets {\n sortOptions: CategoryFilter4SortOption[]\n frameSizes: string[]\n modelTypes: CategoryFilter4FacetOption[]\n rangeBands: CategoryFilter4RangeBand[]\n featureOptions: CategoryFilter4FacetOption[]\n}\n\nexport interface CategoryFilter4FilterState {\n modelTypes: string[]\n priceMax: number\n rangeBands: string[]\n frameSizes: string[]\n colourways: string[]\n features: string[]\n}\n\nexport interface CategoryFilter4Product {\n id: string\n name: string\n modelType: string\n price: number\n rangeKm: number\n frameSize: string\n colourway: string\n features: string[]\n rating: number\n}\n\nexport interface CategoryFilter4Props {\n products: CategoryFilter4Product[]\n facets: CategoryFilter4Facets\n colourNames: Record<string, string>\n fallbackImage: string\n maxPrice: number\n filtersLabel?: string\n sortLabel?: string\n sortByLabel?: string\n modelTypeLabel?: string\n rangeLabel?: string\n frameSizeLabel?: string\n colourLabel?: string\n featuresLabel?: string\n resultsCountLabel?: (count: number) => string\n clearAllLabel?: string\n showResultsLabel?: (count: number) => string\n noResultsLabel?: string\n noResultsTitle?: string\n noResultsDescription?: string\n noResultsCtaLabel?: string\n onFiltersChange?: (filters: CategoryFilter4FilterState) => void\n onSortChange?: (sort: string) => void\n onProductSelect?: (product: CategoryFilter4Product) => void\n}\n\nfunction activeFilterCount(\n filters: CategoryFilter4FilterState,\n empty: CategoryFilter4FilterState\n): number {\n return (\n filters.modelTypes.length +\n filters.rangeBands.length +\n filters.frameSizes.length +\n filters.colourways.length +\n filters.features.length +\n (filters.priceMax < empty.priceMax ? 1 : 0)\n )\n}\n\nexport function CategoryFilter4({\n products,\n facets,\n colourNames,\n fallbackImage,\n maxPrice,\n filtersLabel = 'Filtros',\n sortLabel = 'Ordenar',\n sortByLabel = 'Ordenar por',\n modelTypeLabel = 'Tipo de modelo',\n rangeLabel = 'Autonomía',\n frameSizeLabel = 'Talla de cuadro',\n colourLabel = 'Color',\n featuresLabel = 'Características',\n resultsCountLabel = count => `${count} ${count === 1 ? 'producto' : 'productos'}`,\n clearAllLabel = 'Borrar todos',\n showResultsLabel = count => `Mostrar ${count} ${count === 1 ? 'producto' : 'productos'}`,\n noResultsLabel = 'Sin coincidencias',\n noResultsTitle = 'No hay productos que coincidan con estos filtros',\n noResultsDescription = 'Prueba a relajar alguno de los filtros aplicados.',\n noResultsCtaLabel = 'Borrar todos los filtros',\n onFiltersChange,\n onSortChange,\n onProductSelect,\n}: CategoryFilter4Props) {\n const empty = emptyFilters(maxPrice)\n const { filters, setFilters, sort, setSort, filtered, countWith } = useCategoryFilter4State(\n products,\n facets,\n maxPrice\n )\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n\n const handleFiltersChange = (next: CategoryFilter4FilterState) => {\n setFilters(next)\n onFiltersChange?.(next)\n }\n\n const handleSortChange = (next: string) => {\n setSort(next)\n onSortChange?.(next)\n }\n\n const count = activeFilterCount(filters, empty)\n const selectedSortLabel = facets.sortOptions.find(option => option.value === sort)?.label ?? sortByLabel\n\n return (\n <div className=\"w-full\">\n <div className=\"bg-background/95 sticky top-0 z-10 flex items-center justify-between gap-2 border-b px-4 py-2 backdrop-blur sm:px-6 lg:hidden\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setDrawerOpen(true)}>\n <SlidersHorizontal className=\"size-3.5\" />\n {filtersLabel}\n {count > 0 ? <Badge className=\"ml-1 size-4 justify-center rounded-full p-0 text-[10px]\">{count}</Badge> : null}\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => setSortOpen(true)}>\n {sortLabel}: {selectedSortLabel}\n </Button>\n <span aria-live=\"polite\" className=\"text-muted-foreground text-xs tabular-nums\">\n {resultsCountLabel(filtered.length)}\n </span>\n </div>\n\n <div className=\"px-4 py-2 sm:px-6 lg:hidden\">\n <CategoryFilter4ChipRail\n filters={filters}\n onChange={handleFiltersChange}\n empty={empty}\n clearAllLabel={clearAllLabel}\n />\n </div>\n\n <div className=\"flex gap-8 px-4 py-6 sm:px-6\">\n <div className=\"hidden lg:block\">\n <CategoryFilter4Sidebar\n filters={filters}\n onChange={handleFiltersChange}\n countWith={countWith}\n facets={facets}\n colourNames={colourNames}\n modelTypeLabel={modelTypeLabel}\n rangeLabel={rangeLabel}\n frameSizeLabel={frameSizeLabel}\n colourLabel={colourLabel}\n featuresLabel={featuresLabel}\n />\n </div>\n\n <div className=\"flex-1\">\n <div className=\"hidden items-center justify-between gap-2 lg:flex\">\n <CategoryFilter4ChipRail\n filters={filters}\n onChange={setFilters}\n empty={empty}\n clearAllLabel={clearAllLabel}\n />\n <span aria-live=\"polite\" className=\"text-muted-foreground text-xs tabular-nums\">\n {resultsCountLabel(filtered.length)}\n </span>\n </div>\n\n {filtered.length === 0 ? (\n <Empty className=\"mt-6\">\n <EmptyHeader>\n <EmptyTitle>{noResultsTitle}</EmptyTitle>\n <EmptyDescription>{noResultsDescription}</EmptyDescription>\n </EmptyHeader>\n <EmptyContent>\n <Button size=\"sm\" onClick={() => handleFiltersChange(empty)}>\n {noResultsCtaLabel}\n </Button>\n </EmptyContent>\n </Empty>\n ) : (\n <div className=\"mt-4 grid grid-cols-2 gap-4 sm:grid-cols-2 md:grid-cols-3\">\n {filtered.map(product => {\n const card = (\n <>\n {/*\n An empty grey square told the reader nothing and made a filtered grid look\n broken rather than filtered. The alt is empty on purpose: the name and price\n directly beneath already carry everything the picture would say.\n */}\n <img\n src={fallbackImage || undefined}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n className=\"bg-muted aspect-square w-full rounded-lg object-cover\"\n />\n <p className=\"text-sm font-medium\">{product.name}</p>\n <p className=\"text-muted-foreground text-xs tabular-nums\">\n ${product.price.toLocaleString()} · {product.rangeKm} km\n </p>\n </>\n )\n\n return onProductSelect ? (\n <button\n key={product.id}\n type=\"button\"\n onClick={() => onProductSelect(product)}\n className=\"flex cursor-pointer flex-col gap-1.5 text-left\"\n >\n {card}\n </button>\n ) : (\n <div key={product.id} className=\"flex flex-col gap-1.5\">\n {card}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n\n <CategoryFilter4Drawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n filters={filters}\n onChange={handleFiltersChange}\n countWith={countWith}\n resultCount={filtered.length}\n empty={empty}\n facets={facets}\n colourNames={colourNames}\n filtersLabel={filtersLabel}\n modelTypeLabel={modelTypeLabel}\n rangeLabel={rangeLabel}\n frameSizeLabel={frameSizeLabel}\n colourLabel={colourLabel}\n featuresLabel={featuresLabel}\n clearAllLabel={clearAllLabel}\n showResultsLabel={showResultsLabel}\n noResultsLabel={noResultsLabel}\n noResultsDescription={noResultsDescription}\n />\n <CategoryFilter4SortSheet\n open={sortOpen}\n onOpenChange={setSortOpen}\n sort={sort}\n onSortChange={handleSortChange}\n sortOptions={facets.sortOptions}\n sortByLabel={sortByLabel}\n />\n </div>\n )\n}\n\nexport default CategoryFilter4","'use client'\n\nimport { X } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport type { CategoryFilter4FilterState } from './category-filter-4'\n\ninterface CategoryFilter4ChipRailProps {\n filters: CategoryFilter4FilterState\n onChange: (next: CategoryFilter4FilterState) => void\n empty: CategoryFilter4FilterState\n clearAllLabel?: string\n}\n\nexport function CategoryFilter4ChipRail({\n filters,\n onChange,\n empty,\n clearAllLabel = 'Borrar todos',\n}: CategoryFilter4ChipRailProps) {\n type Chip = { label: string; clear: () => void }\n const chips: Chip[] = [\n ...filters.modelTypes.map(v => ({ label: v, clear: () => onChange({ ...filters, modelTypes: filters.modelTypes.filter(x => x !== v) }) })),\n ...filters.rangeBands.map(v => ({ label: v, clear: () => onChange({ ...filters, rangeBands: filters.rangeBands.filter(x => x !== v) }) })),\n ...filters.frameSizes.map(v => ({ label: `Talla ${v}`, clear: () => onChange({ ...filters, frameSizes: filters.frameSizes.filter(x => x !== v) }) })),\n ...filters.colourways.map(v => ({ label: v, clear: () => onChange({ ...filters, colourways: filters.colourways.filter(x => x !== v) }) })),\n ...filters.features.map(v => ({ label: v, clear: () => onChange({ ...filters, features: filters.features.filter(x => x !== v) }) })),\n ]\n\n if (filters.priceMax < empty.priceMax) {\n chips.push({\n label: `Menos de $${filters.priceMax.toLocaleString()}`,\n clear: () => onChange({ ...filters, priceMax: empty.priceMax }),\n })\n }\n\n if (chips.length === 0) return null\n\n return (\n <div className=\"flex items-center gap-1.5 overflow-x-auto pb-1\" role=\"group\" aria-label=\"Filtros aplicados\">\n {chips.map(chip => (\n <Badge key={chip.label} variant=\"secondary\" className=\"shrink-0 gap-1\">\n {chip.label}\n <button type=\"button\" aria-label={`Eliminar filtro: ${chip.label}`} onClick={chip.clear}>\n <X className=\"size-3\" />\n </button>\n </Badge>\n ))}\n <Button variant=\"ghost\" size=\"sm\" className=\"shrink-0\" onClick={() => onChange(empty)}>\n {clearAllLabel}\n </Button>\n </div>\n )\n}\n\nexport default CategoryFilter4ChipRail","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { animate, useReducedMotion } from 'motion/react'\n\nimport { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '../../../ui/drawer'\nimport { Button } from '../../../ui/button'\nimport type {\n CategoryFilter4Facets,\n CategoryFilter4FilterState,\n} from './category-filter-4'\nimport { CategoryFilter4Fields } from './category-filter-4-fields'\n\ninterface CategoryFilter4DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n filters: CategoryFilter4FilterState\n onChange: (next: CategoryFilter4FilterState) => void\n countWith: (partial: Partial<CategoryFilter4FilterState>) => number\n resultCount: number\n empty: CategoryFilter4FilterState\n facets: CategoryFilter4Facets\n colourNames: Record<string, string>\n filtersLabel?: string\n modelTypeLabel?: string\n rangeLabel?: string\n frameSizeLabel?: string\n colourLabel?: string\n featuresLabel?: string\n clearAllLabel?: string\n showResultsLabel?: (count: number) => string\n noResultsLabel?: string\n noResultsDescription?: string\n}\n\nexport function CategoryFilter4Drawer({\n open,\n onOpenChange,\n filters,\n onChange,\n countWith,\n resultCount,\n empty,\n facets,\n colourNames,\n filtersLabel = 'Filtros',\n modelTypeLabel,\n rangeLabel,\n frameSizeLabel,\n colourLabel,\n featuresLabel,\n clearAllLabel = 'Borrar todos',\n showResultsLabel = count => `Mostrar ${count} ${count === 1 ? 'producto' : 'productos'}`,\n noResultsLabel = 'Sin coincidencias',\n noResultsDescription = 'Prueba a relajar alguno de los filtros aplicados.',\n}: CategoryFilter4DrawerProps) {\n const reduceMotion = useReducedMotion()\n const [displayCount, setDisplayCount] = useState(resultCount)\n const prevRef = useRef(resultCount)\n\n useEffect(() => {\n if (reduceMotion) {\n setDisplayCount(resultCount)\n return\n }\n const controls = animate(prevRef.current, resultCount, { duration: 0.3, onUpdate: v => setDisplayCount(Math.round(v)) })\n prevRef.current = resultCount\n return () => controls.stop()\n }, [resultCount, reduceMotion])\n\n return (\n <Drawer open={open} onOpenChange={onOpenChange}>\n {/*\n No height override. `DrawerContent` already ships `h-auto` with a `max-h-[80vh]` cap for\n a bottom drawer, which is exactly the behaviour wanted: grow to the filters, stop before\n swallowing the screen. Forcing `h-[88vh]` made it that tall whatever it held, so a short\n filter set left a half-screen of blank between the last checkbox and the footer.\n\n `min-h-0` on the scroller because a flex child defaults to `min-height: auto` — it\n refuses to shrink below its content, so without it a tall filter set pushes the footer\n off the bottom instead of scrolling inside.\n */}\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{filtersLabel}</DrawerTitle>\n </DrawerHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-4\">\n <CategoryFilter4Fields\n filters={filters}\n onChange={onChange}\n countWith={countWith}\n facets={facets}\n colourNames={colourNames}\n modelTypeLabel={modelTypeLabel}\n rangeLabel={rangeLabel}\n frameSizeLabel={frameSizeLabel}\n colourLabel={colourLabel}\n featuresLabel={featuresLabel}\n />\n </div>\n <div className=\"flex items-center gap-2 border-t p-4 pb-[max(1rem,env(safe-area-inset-bottom))]\">\n <Button variant=\"ghost\" onClick={() => onChange(empty)}>\n {clearAllLabel}\n </Button>\n <Button\n className=\"flex-1\"\n disabled={resultCount === 0}\n aria-describedby={resultCount === 0 ? 'category-filter-4-zero-reason' : undefined}\n onClick={() => onOpenChange(false)}\n >\n {resultCount === 0 ? noResultsLabel : showResultsLabel(displayCount)}\n </Button>\n </div>\n {resultCount === 0 ? (\n <p id=\"category-filter-4-zero-reason\" className=\"text-destructive px-4 pb-2 text-xs\">\n {noResultsDescription}\n </p>\n ) : null}\n </DrawerContent>\n </Drawer>\n )\n}\n\nexport default CategoryFilter4Drawer","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content fixed z-50 flex h-auto flex-col bg-background\",\n \"data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b\",\n \"data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t\",\n \"data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n \"data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\"font-semibold text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","'use client'\n\nimport { Label } from '../../../ui/label'\nimport { CheckboxCheck } from '../checkout-forms/checkbox-check'\nimport type {\n CategoryFilter4Facets,\n CategoryFilter4FilterState,\n} from './category-filter-4'\n\ninterface CategoryFilter4FieldsProps {\n filters: CategoryFilter4FilterState\n onChange: (next: CategoryFilter4FilterState) => void\n countWith: (partial: Partial<CategoryFilter4FilterState>) => number\n facets: CategoryFilter4Facets\n colourNames: Record<string, string>\n modelTypeLabel?: string\n rangeLabel?: string\n frameSizeLabel?: string\n colourLabel?: string\n featuresLabel?: string\n}\n\nexport function CategoryFilter4Fields({\n filters,\n onChange,\n countWith,\n facets,\n colourNames,\n modelTypeLabel = 'Tipo de modelo',\n rangeLabel = 'Autonomía',\n frameSizeLabel = 'Talla de cuadro',\n colourLabel = 'Color',\n featuresLabel = 'Características',\n}: CategoryFilter4FieldsProps) {\n function toggle<K extends 'modelTypes' | 'rangeBands' | 'frameSizes' | 'colourways' | 'features'>(\n key: K,\n value: string\n ) {\n const list = filters[key] as string[]\n const next = list.includes(value) ? list.filter(v => v !== value) : [...list, value]\n onChange({ ...filters, [key]: next })\n }\n\n const colourways = Object.keys(colourNames)\n\n return (\n <div className=\"flex flex-col gap-6\">\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">{modelTypeLabel}</legend>\n <div className=\"flex flex-col gap-2\">\n {facets.modelTypes.map(option => {\n const count = countWith({\n modelTypes: filters.modelTypes.includes(option.value)\n ? filters.modelTypes\n : [...filters.modelTypes, option.value],\n })\n const zero = count === 0 && !filters.modelTypes.includes(option.value)\n return (\n <div key={option.value} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <CheckboxCheck\n id={`model-${option.value}`}\n checked={filters.modelTypes.includes(option.value)}\n disabled={zero}\n onCheckedChange={() => toggle('modelTypes', option.value)}\n />\n <Label htmlFor={`model-${option.value}`} className=\"font-normal\">\n {option.label}\n </Label>\n </div>\n <span className=\"text-muted-foreground text-xs tabular-nums\">{count}</span>\n </div>\n )\n })}\n </div>\n </fieldset>\n\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">{rangeLabel}</legend>\n <div className=\"flex flex-col gap-2\">\n {facets.rangeBands.map(band => {\n const count = countWith({\n rangeBands: filters.rangeBands.includes(band.value)\n ? filters.rangeBands\n : [...filters.rangeBands, band.value],\n })\n const zero = count === 0 && !filters.rangeBands.includes(band.value)\n return (\n <div key={band.value} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <CheckboxCheck\n id={`range-${band.value}`}\n checked={filters.rangeBands.includes(band.value)}\n disabled={zero}\n onCheckedChange={() => toggle('rangeBands', band.value)}\n />\n <Label htmlFor={`range-${band.value}`} className=\"font-normal\">\n {band.label}\n </Label>\n </div>\n <span className=\"text-muted-foreground text-xs tabular-nums\">{count}</span>\n </div>\n )\n })}\n </div>\n </fieldset>\n\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">{frameSizeLabel}</legend>\n <div className=\"flex flex-wrap gap-2\">\n {facets.frameSizes.map(size => {\n const active = filters.frameSizes.includes(size)\n return (\n <button\n key={size}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggle('frameSizes', size)}\n className=\"focus-visible:ring-ring/50 min-h-11 min-w-11 rounded-full border px-3 text-sm font-medium transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none aria-pressed:border-primary aria-pressed:bg-primary aria-pressed:text-primary-foreground border-input hover:bg-accent/50\"\n >\n {size}\n </button>\n )\n })}\n </div>\n </fieldset>\n\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">{colourLabel}</legend>\n <div className=\"flex flex-wrap gap-2\">\n {colourways.map(colour => {\n const active = filters.colourways.includes(colour)\n return (\n <button\n key={colour}\n type=\"button\"\n aria-pressed={active}\n onClick={() => toggle('colourways', colour)}\n className=\"focus-visible:ring-ring/50 flex min-h-11 items-center gap-1.5 rounded-full border px-3 text-sm transition-colors duration-150 focus-visible:ring-2 focus-visible:outline-none aria-pressed:border-primary aria-pressed:bg-primary/10 border-input hover:bg-accent/50\"\n >\n <span aria-hidden=\"true\" className=\"bg-muted-foreground/30 size-3 rounded-full\" />\n {colourNames[colour]}\n </button>\n )\n })}\n </div>\n </fieldset>\n\n <fieldset>\n <legend className=\"mb-2 text-sm font-medium\">{featuresLabel}</legend>\n <div className=\"flex flex-col gap-2\">\n {facets.featureOptions.map(option => (\n <div key={option.value} className=\"flex items-center gap-2\">\n <CheckboxCheck\n id={`feature-${option.value}`}\n checked={filters.features.includes(option.value)}\n onCheckedChange={() => toggle('features', option.value)}\n />\n <Label htmlFor={`feature-${option.value}`} className=\"font-normal\">\n {option.label}\n </Label>\n </div>\n ))}\n </div>\n </fieldset>\n </div>\n )\n}\n\nexport default CategoryFilter4Fields","'use client'\n\nimport type {\n CategoryFilter4Facets,\n CategoryFilter4FilterState,\n} from './category-filter-4'\nimport { CategoryFilter4Fields } from './category-filter-4-fields'\n\ninterface CategoryFilter4SidebarProps {\n filters: CategoryFilter4FilterState\n onChange: (next: CategoryFilter4FilterState) => void\n countWith: (partial: Partial<CategoryFilter4FilterState>) => number\n facets: CategoryFilter4Facets\n colourNames: Record<string, string>\n modelTypeLabel?: string\n rangeLabel?: string\n frameSizeLabel?: string\n colourLabel?: string\n featuresLabel?: string\n}\n\nexport function CategoryFilter4Sidebar({\n filters,\n onChange,\n countWith,\n facets,\n colourNames,\n modelTypeLabel,\n rangeLabel,\n frameSizeLabel,\n colourLabel,\n featuresLabel,\n}: CategoryFilter4SidebarProps) {\n return (\n <aside className=\"w-70 shrink-0\">\n <CategoryFilter4Fields\n filters={filters}\n onChange={onChange}\n countWith={countWith}\n facets={facets}\n colourNames={colourNames}\n modelTypeLabel={modelTypeLabel}\n rangeLabel={rangeLabel}\n frameSizeLabel={frameSizeLabel}\n colourLabel={colourLabel}\n featuresLabel={featuresLabel}\n />\n </aside>\n )\n}\n\nexport default CategoryFilter4Sidebar","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { CircleIcon } from \"lucide-react\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n \"aspect-square size-4 shrink-0 rounded-full border border-input text-primary shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <CircleIcon className=\"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 fill-primary\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","'use client'\n\nimport { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '../../../ui/drawer'\nimport { Label } from '../../../ui/label'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport type { CategoryFilter4SortOption } from './category-filter-4'\n\ninterface CategoryFilter4SortSheetProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n sort: string\n onSortChange: (value: string) => void\n sortOptions: CategoryFilter4SortOption[]\n sortByLabel?: string\n}\n\nexport function CategoryFilter4SortSheet({\n open,\n onOpenChange,\n sort,\n onSortChange,\n sortOptions,\n sortByLabel = 'Ordenar por',\n}: CategoryFilter4SortSheetProps) {\n return (\n <Drawer open={open} onOpenChange={onOpenChange}>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{sortByLabel}</DrawerTitle>\n </DrawerHeader>\n <div className=\"px-4 pb-6\">\n <RadioGroup\n value={sort}\n onValueChange={value => {\n if (typeof value === 'string') {\n onSortChange(value)\n onOpenChange(false)\n }\n }}\n className=\"gap-3\"\n >\n {sortOptions.map(option => (\n <div key={option.value} className=\"flex items-center gap-2\">\n <RadioGroupItem value={option.value} id={`sort-${option.value}`} />\n <Label htmlFor={`sort-${option.value}`} className=\"min-h-11 font-normal\">\n {option.label}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </div>\n </DrawerContent>\n </Drawer>\n )\n}\n\nexport default CategoryFilter4SortSheet","'use client'\n\nimport { useMemo, useState } from 'react'\nimport type {\n CategoryFilter4Facets,\n CategoryFilter4FilterState,\n CategoryFilter4Product,\n CategoryFilter4RangeBand,\n} from './category-filter-4'\n\nexport function emptyFilters(maxPrice: number): CategoryFilter4FilterState {\n return {\n modelTypes: [],\n priceMax: maxPrice,\n rangeBands: [],\n frameSizes: [],\n colourways: [],\n features: [],\n }\n}\n\nfunction matchesFilters(\n product: CategoryFilter4Product,\n filters: CategoryFilter4FilterState,\n rangeBands: CategoryFilter4RangeBand[]\n): boolean {\n if (filters.modelTypes.length > 0 && !filters.modelTypes.includes(product.modelType)) return false\n if (product.price > filters.priceMax) return false\n if (filters.rangeBands.length > 0) {\n const inBand = filters.rangeBands.some(value => {\n const band = rangeBands.find(b => b.value === value)\n return band && product.rangeKm >= band.min && product.rangeKm < band.max\n })\n if (!inBand) return false\n }\n if (filters.frameSizes.length > 0 && !filters.frameSizes.includes(product.frameSize)) return false\n if (filters.colourways.length > 0 && !filters.colourways.includes(product.colourway)) return false\n if (filters.features.length > 0 && !filters.features.every(f => product.features.includes(f))) return false\n return true\n}\n\n/** The shared filter hook — counts are derived from the catalogue by this\n * predicate, never typed, so an option count can never disagree with the grid. */\nexport function useCategoryFilter4State(\n products: CategoryFilter4Product[],\n facets: CategoryFilter4Facets,\n maxPrice: number\n) {\n const [filters, setFilters] = useState<CategoryFilter4FilterState>(() => emptyFilters(maxPrice))\n const [sort, setSort] = useState(() => facets.sortOptions[0]?.value ?? 'newest')\n\n const filtered = useMemo(() => {\n const matches = products.filter(product => matchesFilters(product, filters, facets.rangeBands))\n const sorted = [...matches]\n if (sort === 'price-asc') sorted.sort((a, b) => a.price - b.price)\n if (sort === 'price-desc') sorted.sort((a, b) => b.price - a.price)\n if (sort === 'range') sorted.sort((a, b) => b.rangeKm - a.rangeKm)\n if (sort === 'rating') sorted.sort((a, b) => b.rating - a.rating)\n return sorted\n }, [products, filters, sort, facets.rangeBands])\n\n function countWith(partial: Partial<CategoryFilter4FilterState>): number {\n const next = { ...filters, ...partial }\n return products.filter(product => matchesFilters(product, next, facets.rangeBands)).length\n }\n\n return { filters, setFilters, sort, setSort, filtered, countWith }\n}","import { Minus, MoveRight, Package, Plus, Shield, ShoppingBag, Store, Trash2, CreditCard } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport { Card, CardContent, CardHeader, CardTitle, CardFooter } from '../../../ui/card'\nimport { ShoppingCart1SpinningCounter } from './shopping-cart-1-spinning-counter'\nimport { cn } from '../../../lib/utils'\n\nexport interface ShoppingCart1CartItem {\n id: string\n name: string\n color: string\n size: string\n price: number\n originalPrice: number\n quantity: number\n image: string\n estimatedDelivery: string\n}\n\nexport interface ShoppingCart1Shipping {\n freeThreshold?: number\n cost?: number\n}\n\nexport interface ShoppingCart1Props {\n items: ShoppingCart1CartItem[]\n shipping?: ShoppingCart1Shipping\n title?: string\n itemCountLabel?: (count: number) => string\n emptyTitle?: string\n emptyDescription?: string\n continueShoppingLabel?: string\n removeItemLabel?: (name: string) => string\n decreaseQuantityLabel?: (name: string) => string\n increaseQuantityLabel?: (name: string) => string\n estimatedDeliveryLabel?: string\n orderSummaryLabel?: string\n subtotalLabel?: string\n shippingLabel?: string\n freeShippingLabel?: string\n youSaveLabel?: string\n totalLabel?: string\n taxNoteLabel?: string\n checkoutLabel?: string\n securePaymentLabel?: string\n secureCheckoutLabel?: string\n secureCheckoutDescription?: string\n onUpdateQuantity?: (id: string, quantity: number) => void\n onRemoveItem?: (id: string) => void\n onCheckout?: () => void\n onContinueShopping?: () => void\n}\n\nexport function ShoppingCart1({\n items,\n shipping,\n title = 'Tu carrito de compras',\n itemCountLabel = (count) => `${count} ${count === 1 ? 'artículo' : 'artículos'} en tu carrito`,\n emptyTitle = 'Tu carrito está vacío',\n emptyDescription = 'Agrega productos para empezar',\n continueShoppingLabel = 'Seguir comprando',\n removeItemLabel = (name) => `Quitar ${name}`,\n decreaseQuantityLabel = (name) => `Disminuir cantidad de ${name}`,\n increaseQuantityLabel = (name) => `Aumentar cantidad de ${name}`,\n estimatedDeliveryLabel = 'Entrega estimada',\n orderSummaryLabel = 'Resumen del pedido',\n subtotalLabel = 'Subtotal',\n shippingLabel = 'Envío',\n freeShippingLabel = 'Gratis',\n youSaveLabel = 'Ahorras',\n totalLabel = 'Total',\n taxNoteLabel = 'incluye IVA si corresponde',\n checkoutLabel = 'Finalizar compra',\n securePaymentLabel = 'Pago seguro con cifrado SSL',\n secureCheckoutLabel = 'Pago seguro',\n secureCheckoutDescription = 'Tu información de pago está cifrada y protegida.',\n onUpdateQuantity,\n onRemoveItem,\n onCheckout,\n onContinueShopping,\n}: ShoppingCart1Props) {\n const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0)\n const savings = items.reduce((sum, item) => sum + (item.originalPrice - item.price) * item.quantity, 0)\n const freeThreshold = shipping?.freeThreshold ?? Infinity\n const shippingCost = shipping?.cost ?? 0\n const shippingTotal = subtotal >= freeThreshold ? 0 : shippingCost\n const total = subtotal + shippingTotal\n\n const changeQuantity = (id: string, quantity: number, delta: number) => {\n onUpdateQuantity?.(id, Math.max(1, quantity + delta))\n }\n\n return (\n <div className='mx-auto w-full max-w-7xl px-4 py-8 sm:px-6 lg:px-8'>\n <div className='mb-8 flex flex-col gap-2 text-center'>\n <h1 className='text-3xl font-bold tracking-tight sm:text-4xl'>{title}</h1>\n <p className='text-muted-foreground'>\n {itemCountLabel(items.length)} •{' '}\n <span className='text-foreground font-semibold'>${subtotal.toFixed(2)}</span>\n </p>\n </div>\n\n <div className='flex flex-col gap-8 lg:flex-row'>\n <div className='flex flex-1 flex-col gap-6'>\n {items.length === 0 ? (\n <Card className='border-dashed'>\n <CardContent className='flex flex-col items-center justify-center py-12 text-center'>\n <ShoppingBag className='text-muted-foreground/50 mb-4 size-12' />\n <h3 className='text-lg font-medium'>{emptyTitle}</h3>\n <p className='text-muted-foreground mt-1 text-sm'>{emptyDescription}</p>\n <Button\n className='mt-4 h-9 cursor-pointer px-4 py-2'\n variant='outline'\n onClick={onContinueShopping}\n >\n {continueShoppingLabel}\n </Button>\n </CardContent>\n </Card>\n ) : (\n items.map(item => (\n <Card key={item.id} className='gap-0 overflow-hidden py-0'>\n <div className='flex flex-col sm:flex-row'>\n <div className='relative h-auto w-full sm:w-40'>\n <img\n src={item.image || undefined}\n alt={item.name}\n className='h-36 w-full object-cover object-center'\n />\n </div>\n\n <div className='flex-1 p-4'>\n <div className='flex items-start justify-between'>\n <div>\n <h3 className='text-foreground text-lg font-medium'>{item.name}</h3>\n <p className='text-muted-foreground mt-1 text-sm'>\n {item.color} {item.size ? `• ${item.size}` : ''}\n </p>\n </div>\n <Button\n variant='ghost'\n size='icon'\n className='size-8 cursor-pointer text-muted-foreground hover:bg-destructive/10 hover:text-destructive'\n onClick={onRemoveItem ? () => onRemoveItem(item.id) : undefined}\n aria-label={removeItemLabel(item.name)}\n >\n <Trash2 />\n </Button>\n </div>\n\n <div className='mt-4 flex items-center justify-between'>\n <div className='flex items-center gap-2'>\n <Button\n variant='outline'\n size='icon'\n className='size-8 cursor-pointer'\n onClick={\n onUpdateQuantity\n ? () => changeQuantity(item.id, item.quantity, -1)\n : undefined\n }\n disabled={item.quantity <= 1}\n aria-label={decreaseQuantityLabel(item.name)}\n >\n <Minus />\n </Button>\n <span className='w-8 text-center text-sm font-medium'>{item.quantity}</span>\n <Button\n variant='outline'\n size='icon'\n className='size-8 cursor-pointer'\n onClick={\n onUpdateQuantity\n ? () => changeQuantity(item.id, item.quantity, 1)\n : undefined\n }\n aria-label={increaseQuantityLabel(item.name)}\n >\n <Plus />\n </Button>\n </div>\n\n <div className='text-end'>\n <p className='text-lg font-semibold'>${(item.price * item.quantity).toFixed(2)}</p>\n {item.originalPrice > item.price && (\n <p className='text-muted-foreground text-xs line-through'>\n ${item.originalPrice.toFixed(2)}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <CardFooter className='bg-muted/20 border-t px-4 !py-2'>\n <div className='text-muted-foreground flex items-center text-sm'>\n <Package className='me-2 size-4' />\n <span>{estimatedDeliveryLabel}: {item.estimatedDelivery}</span>\n </div>\n </CardFooter>\n </Card>\n ))\n )}\n </div>\n\n <div className='flex w-full flex-col gap-4 lg:w-96'>\n <Card className='sticky top-4 gap-0'>\n <CardHeader className='pb-4'>\n <CardTitle className='text-xl'>{orderSummaryLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-4'>\n <div className='flex flex-col gap-3'>\n <div className='flex justify-between text-sm'>\n <span className='text-muted-foreground'>{subtotalLabel}</span>\n <span>${subtotal.toFixed(2)}</span>\n </div>\n <div className='flex justify-between text-sm'>\n <span className='text-muted-foreground'>{shippingLabel}</span>\n <span className={cn(shippingTotal === 0 && 'text-success')}>\n {shippingTotal === 0 ? freeShippingLabel : `$${shippingTotal.toFixed(2)}`}\n </span>\n </div>\n {savings > 0 && (\n <div className='flex justify-between text-sm font-medium'>\n <span>{youSaveLabel}</span>\n <span>-${savings.toFixed(2)}</span>\n </div>\n )}\n </div>\n\n <Separator className='my-2' />\n\n <div className='flex items-center justify-between text-base font-medium'>\n <span>{totalLabel}</span>\n <div className='text-end'>\n <p className='text-xl font-bold'>\n <ShoppingCart1SpinningCounter value={total} decimals={2} prefix='$' />\n </p>\n <p className='text-muted-foreground text-xs'>{taxNoteLabel}</p>\n </div>\n </div>\n\n <Button\n size='lg'\n className='mt-4 h-10 w-full cursor-pointer px-8 text-base font-medium'\n disabled={items.length === 0}\n onClick={onCheckout}\n >\n <ShoppingBag data-icon='inline-start' />\n {checkoutLabel}\n </Button>\n\n <div className='text-muted-foreground flex items-center justify-center gap-2 text-xs'>\n <CreditCard className='size-3.5' />\n <span>{securePaymentLabel}</span>\n </div>\n </CardContent>\n </Card>\n\n <Card className='border-dashed py-4'>\n <CardContent className='px-4'>\n <div className='flex items-start gap-3'>\n <div className='flex size-10 items-center justify-center rounded-full bg-warning/10 text-warning'>\n <Shield className='size-5' />\n </div>\n <div>\n <h4 className='font-medium'>{secureCheckoutLabel}</h4>\n <p className='text-muted-foreground mt-1 text-xs'>\n {secureCheckoutDescription}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <Button\n variant='outline'\n className='h-9 w-full cursor-pointer px-4 py-2'\n onClick={onContinueShopping}\n >\n <Store data-icon='inline-start' />\n {continueShoppingLabel}\n <MoveRight data-icon='inline-end' />\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default ShoppingCart1","'use client'\n\nimport { useEffect, useRef } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\nconst CELL_SIZE = 20\nconst DURATION = 450\nconst STAGGER = 60\nconst SPINS = 1\nconst SPIN_BLUR = 2\n\nconst REEL_DIGITS = Array.from({ length: (SPINS + 1) * 10 }, (_, i) => i % 10)\n\ntype ShoppingCart1SpinningCounterProps = {\n value: number\n decimals?: number\n prefix?: string\n className?: string\n digitClassName?: string\n}\n\nexport function ShoppingCart1SpinningCounter({\n value,\n decimals = 0,\n prefix,\n className,\n digitClassName,\n}: ShoppingCart1SpinningCounterProps) {\n const safeValue = Math.max(0, value)\n const formatted = safeValue.toFixed(decimals)\n const chars = formatted.split('')\n const containerRef = useRef<HTMLSpanElement>(null)\n const isFirstRender = useRef(true)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const strips = Array.from(container.querySelectorAll<HTMLElement>('[data-reel-strip]'))\n const timeouts: number[] = []\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\n strips.forEach((strip, index) => {\n const digit = Number(strip.dataset.digit)\n const delay = (strips.length - 1 - index) * STAGGER\n\n if (isFirstRender.current || !strip.dataset.initialized || prefersReducedMotion) {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n strip.style.filter = 'blur(0px)'\n strip.dataset.initialized = 'true'\n void strip.offsetHeight\n return\n }\n\n const landingIndex = SPINS * 10 + digit\n strip.style.transition = `transform ${DURATION}ms cubic-bezier(0.16, 1, 0.3, 1) ${delay}ms, filter ${DURATION}ms ease-out ${delay}ms`\n strip.style.transform = `translateY(-${landingIndex * CELL_SIZE}px)`\n strip.style.filter = `blur(${SPIN_BLUR}px)`\n\n const settleTimeout = window.setTimeout(() => {\n strip.style.filter = 'blur(0px)'\n }, delay + 30)\n\n const resetTimeout = window.setTimeout(() => {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n void strip.offsetHeight\n }, delay + DURATION + 30)\n\n timeouts.push(settleTimeout, resetTimeout)\n })\n\n isFirstRender.current = false\n\n return () => {\n timeouts.forEach(window.clearTimeout)\n }\n }, [formatted])\n\n return (\n <span className='relative inline-flex items-center'>\n <span className='sr-only'>{prefix}{formatted}</span>\n <span\n ref={containerRef}\n className={cn('inline-flex items-center font-[inherit] tabular-nums', className)}\n style={{ height: CELL_SIZE }}\n aria-hidden='true'\n >\n {prefix ? (\n <span\n className={digitClassName}\n style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}\n >\n {prefix}\n </span>\n ) : null}\n {chars.map((char, index) => {\n if (!/\\d/.test(char)) {\n return (\n <span\n key={index}\n className={digitClassName}\n style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}\n >\n {char}\n </span>\n )\n }\n\n return (\n <span\n key={index}\n className='relative inline-block overflow-hidden'\n style={{\n height: CELL_SIZE,\n maskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n WebkitMaskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n }}\n >\n <span data-reel-strip data-digit={char} className='flex flex-col will-change-[transform,filter]'>\n {REEL_DIGITS.map((cellDigit, cellIndex) => (\n <span\n key={cellIndex}\n className={cn('flex items-center justify-center', digitClassName)}\n style={{ height: CELL_SIZE }}\n >\n {cellDigit}\n </span>\n ))}\n </span>\n </span>\n )\n })}\n </span>\n </span>\n )\n}\n\nexport default ShoppingCart1SpinningCounter","'use client'\n\nimport { useState } from 'react'\nimport { ArrowLeft, Shield, ShoppingBag, Tag, Truck } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { ShoppingCart2ItemRow } from './shopping-cart-2-item-row'\nimport { ShoppingCart2Recommendations } from './shopping-cart-2-recommendations'\nimport { ShoppingCart2SpinningCounter } from './shopping-cart-2-spinning-counter'\n\nexport interface ShoppingCart2Item {\n id: string\n name: string\n brand?: string\n price: number\n originalPrice?: number\n quantity: number\n image: string\n color?: string\n size?: string\n}\n\nexport interface ShoppingCart2Recommendation {\n id: string\n name: string\n price: number\n image: string\n}\n\nexport interface ShoppingCart2Props {\n items: ShoppingCart2Item[]\n recommendations?: ShoppingCart2Recommendation[]\n taxRate?: number\n shippingCost?: number\n freeShippingThreshold?: number\n validatePromo?: (code: string) => number | null\n titleLabel?: string\n itemsCountLabel?: string\n cartItemsLabel?: string\n orderSummaryLabel?: string\n subtotalLabel?: string\n savingsLabel?: string\n shippingLabel?: string\n freeShippingLabel?: string\n taxLabel?: string\n totalLabel?: string\n promoPlaceholder?: string\n applyPromoLabel?: string\n promoAppliedLabel?: string\n continueShoppingLabel?: string\n emptyCartTitleLabel?: string\n emptyCartDescriptionLabel?: string\n checkoutLabel?: string\n freeShippingNoteLabel?: string\n freeShippingThresholdNoteLabel?: string\n secureCheckoutLabel?: string\n recommendationsLabel?: string\n onQuantityChange?: (id: string, quantity: number) => void\n onRemove?: (id: string) => void\n onAddToWishlist?: (item: ShoppingCart2Item) => void\n onCheckout?: () => void\n onContinueShopping?: () => void\n onRecommendationClick?: (product: ShoppingCart2Recommendation) => void\n}\n\nexport function ShoppingCart2({\n items,\n recommendations,\n taxRate = 0.08,\n shippingCost = 9.99,\n freeShippingThreshold = 75,\n validatePromo,\n titleLabel = 'Carrito de compras',\n itemsCountLabel = 'artículos en tu carrito',\n cartItemsLabel = 'Artículos',\n orderSummaryLabel = 'Resumen del pedido',\n subtotalLabel = 'Subtotal',\n savingsLabel = 'Ahorro',\n shippingLabel = 'Envío',\n freeShippingLabel = 'Gratis',\n taxLabel = 'Impuestos',\n totalLabel = 'Total',\n promoPlaceholder = 'Código de descuento',\n applyPromoLabel = 'Aplicar código',\n promoAppliedLabel = 'Código \"{code}\" aplicado',\n continueShoppingLabel = 'Seguir comprando',\n emptyCartTitleLabel = 'Tu carrito está vacío',\n emptyCartDescriptionLabel = 'Añade algunos artículos para empezar',\n checkoutLabel = 'Finalizar compra',\n freeShippingNoteLabel = 'Envío gratis en este pedido',\n freeShippingThresholdNoteLabel = 'Envío gratis en pedidos superiores a ${threshold}',\n secureCheckoutLabel = 'Pago seguro garantizado',\n recommendationsLabel = 'También te puede gustar',\n onQuantityChange,\n onRemove,\n onAddToWishlist,\n onCheckout,\n onContinueShopping,\n onRecommendationClick,\n}: ShoppingCart2Props) {\n const [promoCode, setPromoCode] = useState('')\n const [appliedPromo, setAppliedPromo] = useState<string | null>(null)\n\n const applyPromoCode = () => {\n if (!validatePromo) return\n const code = promoCode.trim()\n const discount = validatePromo(code)\n if (discount !== null && discount > 0) {\n setAppliedPromo(code)\n setPromoCode('')\n }\n }\n\n const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0)\n const itemCount = items.reduce((sum, item) => sum + item.quantity, 0)\n const savings = items.reduce((sum, item) => {\n const originalPrice = item.originalPrice ?? item.price\n return sum + (originalPrice - item.price) * item.quantity\n }, 0)\n const promoDiscount = appliedPromo && validatePromo ? subtotal * ((validatePromo(appliedPromo) ?? 0) / 100) : 0\n const shipping = subtotal > freeShippingThreshold ? 0 : shippingCost\n const tax = (subtotal - promoDiscount) * taxRate\n const total = subtotal - promoDiscount + shipping + tax\n\n const formatPrice = (value: number) => `$${value.toFixed(2)}`\n\n return (\n <section className='py-8'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n {items.length === 0 ? (\n <Card>\n <CardContent className='py-12 text-center'>\n <ShoppingBag className='text-muted-foreground mx-auto mb-4 size-16' />\n <h2 className='mb-2 text-2xl font-semibold'>{emptyCartTitleLabel}</h2>\n <p className='text-muted-foreground mb-6'>{emptyCartDescriptionLabel}</p>\n <Button size='lg' className='h-10 px-8 cursor-pointer' onClick={onContinueShopping}>\n {continueShoppingLabel}\n </Button>\n </CardContent>\n </Card>\n ) : (\n <>\n <div className='mb-8'>\n <Button\n variant='ghost'\n size='sm'\n className='mb-4 h-8 px-3 text-xs cursor-pointer'\n onClick={onContinueShopping}\n >\n <ArrowLeft />\n {continueShoppingLabel}\n </Button>\n <h1 className='text-3xl font-bold tracking-tight text-balance'>{titleLabel}</h1>\n <p className='text-muted-foreground mt-2'>\n {items.length} {itemsCountLabel}\n </p>\n </div>\n\n <div className='grid gap-8 lg:grid-cols-3'>\n <div className='lg:col-span-2'>\n <Card>\n <CardHeader>\n <CardTitle>{cartItemsLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-6'>\n {items.map((item, index) => (\n <ShoppingCart2ItemRow\n key={item.id}\n item={item}\n isLast={index === items.length - 1}\n onRemove={onRemove}\n onQuantityChange={onQuantityChange}\n onAddToWishlist={onAddToWishlist}\n />\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className='lg:col-span-1'>\n <Card className='lg:sticky lg:top-6'>\n <CardHeader>\n <CardTitle>{orderSummaryLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-4'>\n <div className='flex flex-col gap-3 text-sm'>\n <div className='flex justify-between gap-4 flex-wrap'>\n <span className='flex-1'>\n {subtotalLabel} ({itemCount} {cartItemsLabel})\n </span>\n <span className='font-medium shrink-0'>{formatPrice(subtotal)}</span>\n </div>\n\n {savings > 0 ? (\n <div className='flex justify-between gap-4 text-success flex-wrap'>\n <span className='flex-1'>{savingsLabel}</span>\n <span className='font-medium shrink-0'>-{formatPrice(savings)}</span>\n </div>\n ) : null}\n\n {appliedPromo ? (\n <div className='flex justify-between gap-4 text-success flex-wrap'>\n <span className='flex-1'>{promoAppliedLabel.replace('{code}', appliedPromo)}</span>\n <span className='font-medium shrink-0'>-{formatPrice(promoDiscount)}</span>\n </div>\n ) : null}\n\n <div className='flex justify-between gap-4 flex-wrap'>\n <span className='flex-1'>{shippingLabel}</span>\n <span className='font-medium shrink-0'>\n {shipping === 0 ? freeShippingLabel : formatPrice(shipping)}\n </span>\n </div>\n\n <div className='flex justify-between gap-4 flex-wrap'>\n <span className='flex-1'>{taxLabel}</span>\n <span className='font-medium shrink-0'>{formatPrice(tax)}</span>\n </div>\n </div>\n\n <Separator />\n\n <div className='flex justify-between gap-4 text-lg font-semibold flex-wrap'>\n <span>{totalLabel}</span>\n <span className='shrink-0'>\n <ShoppingCart2SpinningCounter value={total} decimals={2} prefix='$' />\n </span>\n </div>\n\n <div className='flex flex-col gap-3'>\n <Input\n placeholder={promoPlaceholder}\n value={promoCode}\n onChange={e => setPromoCode(e.target.value)}\n aria-label={promoPlaceholder}\n className='h-9 flex-1'\n />\n <Button\n variant='outline'\n onClick={applyPromoCode}\n className='h-9 cursor-pointer px-4 py-2'\n disabled={!promoCode || !validatePromo}\n aria-label={applyPromoLabel}\n >\n <Tag />\n </Button>\n </div>\n\n {appliedPromo ? (\n <div className='flex items-center gap-2 text-sm text-success'>\n <Tag className='size-4' />\n {promoAppliedLabel.replace('{code}', appliedPromo)}\n </div>\n ) : null}\n\n <Button size='lg' className='h-10 w-full px-8 cursor-pointer' onClick={onCheckout}>\n {checkoutLabel}\n </Button>\n\n <div className='flex flex-col gap-3 text-sm'>\n <div className='flex items-center gap-2 text-success'>\n <Truck className='size-4' />\n <span>\n {shipping === 0\n ? freeShippingNoteLabel\n : freeShippingThresholdNoteLabel.replace('${threshold}', String(freeShippingThreshold))}\n </span>\n </div>\n <div className='text-muted-foreground flex items-center gap-2'>\n <Shield className='size-4' />\n <span>{secureCheckoutLabel}</span>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {recommendations && recommendations.length > 0 ? (\n <ShoppingCart2Recommendations\n recommendations={recommendations}\n title={recommendationsLabel}\n onRecommendationClick={onRecommendationClick}\n />\n ) : null}\n </>\n )}\n </div>\n </section>\n )\n}\n\nexport default ShoppingCart2","import { Heart, Minus, Plus, Trash2 } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport type { ShoppingCart2Item } from './shopping-cart-2'\n\nexport interface ShoppingCart2ItemRowProps {\n item: ShoppingCart2Item\n isLast: boolean\n onRemove?: (id: string) => void\n onQuantityChange?: (id: string, quantity: number) => void\n onAddToWishlist?: (item: ShoppingCart2Item) => void\n}\n\nexport function ShoppingCart2ItemRow({\n item,\n isLast,\n onRemove,\n onQuantityChange,\n onAddToWishlist,\n}: ShoppingCart2ItemRowProps) {\n const formatPrice = (value: number) => `$${value.toFixed(2)}`\n\n return (\n <div>\n <div className='flex flex-col sm:flex-row sm:items-start gap-4'>\n <img src={item.image || undefined} alt={item.name} className='w-20 h-20 rounded-lg object-cover shrink-0 sm:w-20 sm:h-20' />\n\n <div className='flex-1 flex flex-col gap-3 min-w-0'>\n <div className='flex items-start justify-between gap-2'>\n <div className='flex-1 min-w-0'>\n <h3 className='line-clamp-2 font-medium'>{item.name}</h3>\n {item.brand ? <p className='text-muted-foreground text-sm'>{item.brand}</p> : null}\n <div className='text-muted-foreground mt-1 flex gap-3 text-sm flex-wrap'>\n {item.color ? <span className='whitespace-nowrap'>Color: {item.color}</span> : null}\n {item.size ? <span className='whitespace-nowrap'>Talla: {item.size}</span> : null}\n </div>\n </div>\n <Button\n variant='ghost'\n size='sm'\n onClick={onRemove ? () => onRemove(item.id) : undefined}\n className='h-8 shrink-0 px-3 text-xs cursor-pointer text-destructive'\n aria-label={`Quitar ${item.name}`}\n >\n <Trash2 />\n </Button>\n </div>\n\n <div className='flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2'>\n <div className='flex items-center gap-2 flex-wrap'>\n <span className='font-semibold text-base'>{formatPrice(item.price)}</span>\n {item.originalPrice ? (\n <span className='text-muted-foreground text-sm line-through'>\n {formatPrice(item.originalPrice)}\n </span>\n ) : null}\n {item.originalPrice ? (\n <Badge variant='destructive' className='rounded-sm px-2 py-0.5 font-semibold text-xs'>\n Ahorra {formatPrice(item.originalPrice - item.price)}\n </Badge>\n ) : null}\n </div>\n\n <div className='flex items-center gap-2 justify-between sm:justify-end'>\n <Button\n variant='ghost'\n size='sm'\n className='h-8 cursor-pointer px-2 text-xs'\n onClick={onAddToWishlist ? () => onAddToWishlist(item) : undefined}\n aria-label={`Añadir ${item.name} a la lista de deseos`}\n >\n <Heart className='size-4' />\n </Button>\n <div className='flex items-center rounded-md border'>\n <Button\n variant='ghost'\n size='sm'\n className='h-8 cursor-pointer px-2 text-xs'\n onClick={\n onQuantityChange ? () => onQuantityChange(item.id, item.quantity - 1) : undefined\n }\n disabled={item.quantity <= 1}\n aria-label={`Disminuir cantidad de ${item.name}`}\n >\n <Minus className='size-4' />\n </Button>\n <span className='min-w-[2rem] px-2 py-1 text-center text-sm'>{item.quantity}</span>\n <Button\n variant='ghost'\n size='sm'\n className='h-8 cursor-pointer px-2 text-xs'\n onClick={\n onQuantityChange ? () => onQuantityChange(item.id, item.quantity + 1) : undefined\n }\n aria-label={`Aumentar cantidad de ${item.name}`}\n >\n <Plus className='size-4' />\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n {!isLast ? <Separator className='mt-6' /> : null}\n </div>\n )\n}\n\nexport default ShoppingCart2ItemRow","import { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport type { ShoppingCart2Recommendation } from './shopping-cart-2'\n\nexport interface ShoppingCart2RecommendationsProps {\n recommendations: ShoppingCart2Recommendation[]\n title?: string\n onRecommendationClick?: (product: ShoppingCart2Recommendation) => void\n}\n\nexport function ShoppingCart2Recommendations({\n recommendations,\n title = 'También te puede gustar',\n onRecommendationClick,\n}: ShoppingCart2RecommendationsProps) {\n if (recommendations.length === 0) return null\n\n const formatPrice = (value: number) => `$${value.toFixed(2)}`\n\n return (\n <div className='mt-12'>\n <h3 className='mb-4 text-lg font-semibold'>{title}</h3>\n <div className='grid gap-4 sm:grid-cols-2 lg:grid-cols-4'>\n {recommendations.map(product => (\n <Card\n key={product.id}\n className={cn(\n 'group py-0 transition-shadow',\n onRecommendationClick && 'cursor-pointer hover:shadow-md'\n )}\n onClick={onRecommendationClick ? () => onRecommendationClick(product) : undefined}\n >\n <CardContent className='p-4'>\n <div className='mb-3 aspect-square overflow-hidden'>\n <img\n src={product.image || undefined}\n alt={product.name}\n className='size-full rounded-md object-cover'\n />\n </div>\n <h4 className='mb-1 line-clamp-2 text-sm font-medium'>{product.name}</h4>\n <p className='text-sm font-semibold'>{formatPrice(product.price)}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n )\n}\n\nexport default ShoppingCart2Recommendations","'use client'\n\nimport { useEffect, useRef } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * Spinning counter: each digit is a clipped vertical reel of 0-9 cells that\n * spins forward and lands on the target digit. Adapted from Transitions.dev\n * \"Spinning counter\" (26-spinning-counter.md), re-tuned for cart totals:\n * one loop instead of several, and a snappier duration so rapid +/- clicks\n * don't queue up sluggish animations. The spec's directional SVG blur is\n * approximated here with a CSS `filter: blur()` transition for simplicity.\n *\n * Non-digit characters (currency symbol, decimal point, thousands separator)\n * render as static text so only the digits spin.\n */\nconst CELL_SIZE = 20 // px\nconst DURATION = 450 // ms\nconst STAGGER = 60 // ms per column\nconst SPINS = 1 // extra full loops before landing\nconst SPIN_BLUR = 2 // px\n\nconst REEL_DIGITS = Array.from({ length: (SPINS + 1) * 10 }, (_, i) => i % 10)\n\ntype ShoppingCart2SpinningCounterProps = {\n value: number\n /** Fixed decimal places to format the value with, e.g. 2 for currency. */\n decimals?: number\n /** Static text rendered before the formatted value, e.g. '$'. */\n prefix?: string\n className?: string\n digitClassName?: string\n}\n\nexport function ShoppingCart2SpinningCounter({ value, decimals = 0, prefix, className, digitClassName }: ShoppingCart2SpinningCounterProps) {\n const safeValue = Math.max(0, value)\n const formatted = safeValue.toFixed(decimals)\n const chars = formatted.split('')\n const containerRef = useRef<HTMLSpanElement>(null)\n const isFirstRender = useRef(true)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const strips = Array.from(container.querySelectorAll<HTMLElement>('[data-reel-strip]'))\n const timeouts: number[] = []\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\n strips.forEach((strip, index) => {\n const digit = Number(strip.dataset.digit)\n const delay = (strips.length - 1 - index) * STAGGER\n\n if (isFirstRender.current || !strip.dataset.initialized || prefersReducedMotion) {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n strip.style.filter = 'blur(0px)'\n strip.dataset.initialized = 'true'\n void strip.offsetHeight\n return\n }\n\n const landingIndex = SPINS * 10 + digit\n strip.style.transition = `transform ${DURATION}ms cubic-bezier(0.16, 1, 0.3, 1) ${delay}ms, filter ${DURATION}ms ease-out ${delay}ms`\n strip.style.transform = `translateY(-${landingIndex * CELL_SIZE}px)`\n strip.style.filter = `blur(${SPIN_BLUR}px)`\n\n const settleTimeout = window.setTimeout(() => {\n strip.style.filter = 'blur(0px)'\n }, delay + 30)\n\n const resetTimeout = window.setTimeout(() => {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n void strip.offsetHeight\n }, delay + DURATION + 30)\n\n timeouts.push(settleTimeout, resetTimeout)\n })\n\n isFirstRender.current = false\n\n return () => {\n timeouts.forEach(window.clearTimeout)\n }\n }, [formatted])\n\n return (\n <span className='relative inline-flex items-center'>\n <span className='sr-only'>{prefix}{formatted}</span>\n <span\n ref={containerRef}\n className={cn('inline-flex items-center font-[inherit] tabular-nums', className)}\n style={{ height: CELL_SIZE }}\n aria-hidden='true'\n >\n {prefix ? (\n <span className={digitClassName} style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}>\n {prefix}\n </span>\n ) : null}\n {chars.map((char, index) => {\n if (!/\\d/.test(char)) {\n return (\n <span\n key={index}\n className={digitClassName}\n style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}\n >\n {char}\n </span>\n )\n }\n\n return (\n <span\n key={index}\n className='relative inline-block overflow-hidden'\n style={{\n height: CELL_SIZE,\n maskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n WebkitMaskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n }}\n >\n <span data-reel-strip data-digit={char} className='flex flex-col will-change-[transform,filter]'>\n {REEL_DIGITS.map((cellDigit, cellIndex) => (\n <span\n key={cellIndex}\n className={cn('flex items-center justify-center', digitClassName)}\n style={{ height: CELL_SIZE }}\n >\n {cellDigit}\n </span>\n ))}\n </span>\n </span>\n )\n })}\n </span>\n </span>\n )\n}\n\nexport default ShoppingCart2SpinningCounter","'use client'\n\nimport { useState } from 'react'\nimport { ShoppingCart, Zap, Clock, CreditCard, Wallet, Minus, Plus, X } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport type { Money } from '@thorprovider/types'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Button } from '../../../ui/button'\nimport { Separator } from '../../../ui/separator'\nimport { Progress } from '../../../ui/progress'\nimport { cn } from '../../../lib/utils'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\n\nexport interface ShoppingCart4Item {\n /** Backend cart line-item id — the stable identity for update/removal. */\n id: string\n name: string\n price: number\n quantity: number\n /** Optional; an absent image is omitted rather than serialized as `\"\"`. */\n image?: string\n variant?: string\n /** Canonical backend per-unit price; preferred for display when present. */\n unitPrice?: Money\n /** Canonical backend line total; preferred over `price * quantity`. */\n lineTotal?: Money\n}\n\nexport interface ShoppingCart4Totals {\n subtotal: Money\n discount?: Money\n tax?: Money\n shipping?: Money\n total: Money\n}\n\nexport type ShoppingCart4TotalsState = 'idle' | 'pending' | 'error'\n\nexport interface ShoppingCart4Promotion {\n threshold: number\n reward: string\n icon: LucideIcon\n}\n\nexport interface ShoppingCart4RecentlyViewed {\n id: string\n name: string\n price: number\n image?: string\n}\n\nexport type ShoppingCart4Presentation = 'compact' | 'page'\n\nexport interface ShoppingCart4Props {\n items: ShoppingCart4Item[]\n promotions: ShoppingCart4Promotion[]\n recentlyViewed?: ShoppingCart4RecentlyViewed[]\n /**\n * Layout presentation. `compact` (default) is the collapsible quick-cart\n * card; `page` is a wide, always-expanded review layout with a primary\n * heading, no collapse control, and normal page scrolling. Both use the same\n * line controls and authoritative monetary rendering.\n */\n presentation?: ShoppingCart4Presentation\n /**\n * Backend-authoritative totals. The curated cart renders these verbatim; it\n * never computes subtotal/tax/shipping/total locally.\n */\n totals?: ShoppingCart4Totals\n /** Controlled state of the totals fetch/mutation. */\n totalsState?: ShoppingCart4TotalsState\n totalsErrorLabel?: string\n /** Shown when a required total amount is absent or malformed (never as zero). */\n totalsUnavailableLabel?: string\n /** Shown for a line whose supplied line total is absent or malformed. */\n amountUnavailableLabel?: string\n retryLabel?: string\n onRetryTotals?: () => void\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n /** @deprecated legacy numeric formatter, used only when `totals` is absent. */\n formatPrice?: (value: number) => string\n /** @deprecated legacy local tax rate, used only when `totals` is absent. */\n taxRate?: number\n // labels (Spanish defaults):\n titleLabel?: string // 'Carrito de compras'\n subtotalLabel?: string // 'Subtotal'\n discountLabel?: string\n taxLabel?: string // 'Impuestos'\n shippingLabel?: string // 'Envío'\n shippingFreeLabel?: string // 'Gratis'\n totalLabel?: string // 'Total'\n totalsPendingLabel?: string\n awayFromLabel?: string // 'Te faltan ${amount} para'\n activatedLabel?: string // '¡{reward} activada!'\n itemsLabel?: string // 'artículos'\n expressCheckoutLabel?: string // 'Compra rápida'\n expressLabel?: string // 'Rápido'\n standardLabel?: string // 'Estándar'\n estimatedDeliveryLabel?: string\n secureCheckoutLabel?: string // 'Pago seguro • SSL cifrado'\n recentlyViewedLabel?: string // 'Vistos recientemente'\n collapseLabel?: string // 'Contraer carrito'\n expandLabel?: string // 'Expandir carrito'\n checkoutLabel?: string // 'Ver carrito y finalizar'\n quickCheckoutLabel?: string // 'Compra rápida'\n checkoutNowLabel?: string // 'Finalizar ahora'\n emptyLabel?: string\n removeLabel?: string\n decreaseLabel?: string\n increaseLabel?: string\n continueShoppingLabel?: string // 'Seguir comprando'\n // action availability:\n /** Suppress the checkout action (e.g. the checkout feature is not installed). */\n checkoutUnavailable?: boolean\n /** Disable checkout while the cart is not ready (pending/error/invalid totals). */\n checkoutDisabled?: boolean\n // callbacks:\n /**\n * ABSOLUTE quantity for a backend cart line-item id (distinct from the\n * Navbar's DELTA). The boundary mutates the cart by line-item id.\n */\n onQuantityChange?: (id: string, quantity: number) => void\n /** Remove the backend cart line-item id. */\n onRemove?: (id: string) => void\n onCheckout?: () => void\n onQuickCheckout?: () => void\n onPayWithApple?: () => void\n onPayWithGoogle?: () => void\n onRecentlyViewedClick?: (id: string) => void\n /** Page presentation only: navigate back to browsing. */\n onContinueShopping?: () => void\n}\n\nconst usdFormatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' })\n\nconst interpolate = (template: string, values: Record<string, string>) =>\n template.replace(/\\$\\{(\\w+)\\}|\\{(\\w+)\\}/g, (match, dollarKey, braceKey) => {\n const key = dollarKey ?? braceKey\n return values[key] ?? match\n })\n\nexport function ShoppingCart4({\n items,\n promotions,\n recentlyViewed,\n presentation = 'compact',\n totals,\n totalsState = 'idle',\n totalsErrorLabel = 'No se pudieron actualizar los totales.',\n totalsUnavailableLabel = 'Totales no disponibles.',\n amountUnavailableLabel = '—',\n retryLabel = 'Reintentar',\n onRetryTotals,\n formatMoney: formatMoneyProp,\n formatPrice,\n titleLabel = 'Carrito de compras',\n subtotalLabel = 'Subtotal',\n discountLabel = 'Descuento',\n taxLabel = 'Impuestos',\n shippingLabel = 'Envío',\n shippingFreeLabel = 'Gratis',\n totalLabel = 'Total',\n totalsPendingLabel = 'Actualizando totales…',\n awayFromLabel = 'Te faltan ${amount} para',\n activatedLabel = '¡{reward} activada!',\n itemsLabel = 'artículos',\n expressCheckoutLabel = 'Compra rápida',\n expressLabel = 'Rápido',\n standardLabel = 'Estándar',\n estimatedDeliveryLabel,\n secureCheckoutLabel = 'Pago seguro • SSL cifrado',\n recentlyViewedLabel = 'Vistos recientemente',\n collapseLabel = 'Contraer carrito',\n expandLabel = 'Expandir carrito',\n checkoutLabel = 'Ver carrito y finalizar',\n quickCheckoutLabel = 'Compra rápida',\n checkoutNowLabel = 'Finalizar ahora',\n emptyLabel = 'Tu carrito está vacío',\n removeLabel = 'Quitar',\n decreaseLabel = 'Disminuir cantidad',\n increaseLabel = 'Aumentar cantidad',\n continueShoppingLabel = 'Seguir comprando',\n checkoutUnavailable,\n checkoutDisabled,\n onQuantityChange,\n onRemove,\n onCheckout,\n onQuickCheckout,\n onPayWithApple,\n onPayWithGoogle,\n onRecentlyViewedClick,\n onContinueShopping,\n}: ShoppingCart4Props) {\n const [isExpanded, setIsExpanded] = useState(true)\n const [quickCheckout, setQuickCheckout] = useState(false)\n\n const isPage = presentation === 'page'\n // The page presentation is always expanded; only the compact card collapses.\n const expanded = isPage ? true : isExpanded\n const format = formatPrice ?? (value => usdFormatter.format(value))\n const money = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const subtotalAmount = isAvailableMoney(totals?.subtotal) ? Number(totals.subtotal.amount) : 0\n const itemCount = items.reduce((sum, item) => sum + item.quantity, 0)\n const hasExpress = Boolean(onQuickCheckout || onPayWithApple || onPayWithGoogle)\n // While totals/mutations are pending, keep confirmed data visible but block\n // conflicting edits and checkout until the backend responds.\n const mutationsDisabled = totalsState === 'pending'\n\n const sortedPromotions = [...promotions].sort((a, b) => a.threshold - b.threshold)\n const currentPromo = (() => {\n if (!isAvailableMoney(totals?.subtotal)) return null\n for (let i = sortedPromotions.length - 1; i >= 0; i--) {\n if (subtotalAmount >= sortedPromotions[i].threshold) {\n return { ...sortedPromotions[i], achieved: true }\n }\n }\n const next = sortedPromotions.find(p => subtotalAmount < p.threshold)\n return next ? { ...next, achieved: false } : null\n })()\n const progressPercentage =\n currentPromo && !currentPromo.achieved\n ? Math.min(100, (subtotalAmount / currentPromo.threshold) * 100)\n : 100\n\n const lineAmount = (item: ShoppingCart4Item): string | null => {\n // A supplied line total that is absent/malformed must not fall back to a\n // numeric guess; only an entirely absent line total uses the legacy field.\n if (item.lineTotal !== undefined) return money(item.lineTotal)\n return format(item.price * item.quantity)\n }\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return (\n <div className='flex flex-col gap-2' aria-live='polite'>\n <p className='text-muted-foreground text-sm'>{totalsPendingLabel}</p>\n </div>\n )\n }\n if (totalsState === 'error') {\n return (\n <div className='flex flex-col gap-2' role='alert'>\n <p className='text-destructive text-sm'>{totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button variant='outline' size='sm' className='w-fit' onClick={onRetryTotals}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n if (!totals) return null\n\n const subtotalText = money(totals.subtotal)\n const totalText = money(totals.total)\n // Required totals: if either is absent/malformed, show an explicit\n // unavailable state (with recovery) rather than a fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className='flex flex-col gap-2' role='status'>\n <p className='text-muted-foreground text-sm'>{totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button variant='outline' size='sm' className='w-fit' onClick={onRetryTotals}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const shippingText = money(totals.shipping)\n return (\n <>\n <div className='flex justify-between text-sm'>\n <span>{subtotalLabel}</span>\n <span className='tabular-nums'>{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className='flex justify-between text-sm'>\n <span>{discountLabel}</span>\n <span className='tabular-nums'>{money(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className='flex justify-between text-sm'>\n <span>{taxLabel}</span>\n <span className='tabular-nums'>{money(totals.tax)}</span>\n </div>\n ) : null}\n {shippingText !== null ? (\n <div className='flex justify-between text-sm text-success'>\n <span>{shippingLabel}</span>\n <span className='tabular-nums'>\n {Number(totals.shipping?.amount) === 0 ? shippingFreeLabel : shippingText}\n </span>\n </div>\n ) : null}\n <Separator />\n <div className='flex justify-between font-semibold'>\n <span>{totalLabel}</span>\n <span className='tabular-nums'>{totalText}</span>\n </div>\n </>\n )\n }\n\n return (\n <section className='py-8'>\n <div className={cn('mx-auto px-4', isPage ? 'max-w-3xl' : 'max-w-md')}>\n {isPage ? (\n <h1 className='mb-6 text-2xl font-semibold tracking-tight'>{titleLabel}</h1>\n ) : null}\n <Card className={isPage ? 'shadow-sm' : 'shadow-lg'}>\n {/* Header */}\n <CardHeader className='flex flex-row items-center justify-between space-y-0 pb-3'>\n <CardTitle className='flex items-center gap-2'>\n <ShoppingCart className='size-5' />\n {titleLabel} ({itemCount})\n </CardTitle>\n {!isPage ? (\n <Button\n variant='ghost'\n className='h-8 cursor-pointer px-3 text-xs'\n size='sm'\n onClick={() => setIsExpanded(!isExpanded)}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? collapseLabel : expandLabel}\n >\n {isExpanded ? <X /> : <Plus />}\n </Button>\n ) : null}\n </CardHeader>\n\n <CardContent className='flex flex-col gap-6'>\n {items.length === 0 ? (\n <div className='flex flex-col items-center justify-center gap-4 py-6 text-center'>\n <ShoppingCart className='text-muted-foreground/50 size-10' />\n <p className='text-muted-foreground text-sm'>{emptyLabel}</p>\n {isPage && onContinueShopping ? (\n <Button variant='outline' onClick={onContinueShopping}>\n {continueShoppingLabel}\n </Button>\n ) : null}\n </div>\n ) : (\n <>\n {/* Promotion Progress */}\n {currentPromo && !currentPromo.achieved ? (\n <div className='flex flex-col gap-3'>\n <div className='flex items-center justify-between text-sm'>\n <span className='text-muted-foreground'>\n {interpolate(awayFromLabel, {\n amount: format(currentPromo.threshold - subtotalAmount),\n })}\n </span>\n <div className='flex items-center gap-1'>\n <currentPromo.icon className='text-primary size-4' />\n <span className='text-primary font-medium'>{currentPromo.reward}</span>\n </div>\n </div>\n <Progress value={progressPercentage} className='h-2' />\n </div>\n ) : null}\n\n {/* Active Promotion */}\n {currentPromo?.achieved ? (\n <div className='rounded-lg bg-success/10 p-3'>\n <div className='flex items-center gap-2 text-success'>\n <currentPromo.icon className='size-4' />\n <span className='text-sm font-medium'>\n {interpolate(activatedLabel, { reward: currentPromo.reward })}\n </span>\n </div>\n </div>\n ) : null}\n\n {expanded && (\n <>\n {/* Cart Items */}\n <div\n className={cn(\n 'flex flex-col gap-4',\n !isPage &&\n 'scrollbar-thin scrollbar-thumb-gray-300 dark:scrollbar-thumb-gray-600 scrollbar-track-transparent max-h-64 overflow-y-auto',\n )}\n >\n {items.map(item => (\n <div key={item.id} className='flex items-start gap-3'>\n {item.image ? (\n <img src={item.image || undefined} alt='' className='h-12 w-12 rounded-md object-cover' />\n ) : (\n <div aria-hidden='true' className='bg-muted h-12 w-12 shrink-0 rounded-md' />\n )}\n\n <div className='flex flex-1 flex-col gap-1'>\n <h3 className='line-clamp-2 text-sm font-medium'>{item.name}</h3>\n {item.variant ? <p className='text-muted-foreground text-xs'>{item.variant}</p> : null}\n\n <div className='flex items-center justify-between'>\n <span className='text-sm font-semibold'>{lineAmount(item) ?? amountUnavailableLabel}</span>\n\n <div className='flex items-center'>\n <Button\n variant='ghost'\n size='sm'\n className='size-6 h-8 cursor-pointer p-0 px-3 text-xs'\n onClick={\n onQuantityChange\n ? () => onQuantityChange(item.id, item.quantity - 1)\n : undefined\n }\n disabled={item.quantity <= 1 || mutationsDisabled}\n aria-label={`${decreaseLabel}, ${item.name}`}\n >\n <Minus />\n </Button>\n <span className='mx-2 w-6 text-center text-sm'>{item.quantity}</span>\n <Button\n variant='ghost'\n size='sm'\n className='size-6 h-8 cursor-pointer p-0 px-3 text-xs'\n onClick={\n onQuantityChange\n ? () => onQuantityChange(item.id, item.quantity + 1)\n : undefined\n }\n aria-label={`${increaseLabel}, ${item.name}`}\n disabled={mutationsDisabled}\n >\n <Plus />\n </Button>\n <Button\n variant='ghost'\n size='sm'\n className='text-destructive hover:text-destructive ms-2 size-6 h-8 cursor-pointer p-0 px-3 text-xs'\n onClick={onRemove ? () => onRemove(item.id) : undefined}\n disabled={mutationsDisabled}\n aria-label={`${removeLabel} ${item.name}`}\n >\n <X />\n </Button>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n <Separator />\n\n {/* Order Summary — backend-authoritative only */}\n <div className='flex flex-col gap-2'>{renderTotals()}</div>\n\n {/* Quick Actions */}\n <div className='flex flex-col gap-3'>\n {/* Express Checkout Toggle — only when the host supplies a handler */}\n {hasExpress ? (\n <>\n <div className='flex items-center justify-between text-sm'>\n <span>{expressCheckoutLabel}</span>\n <Button\n variant='outline'\n size='sm'\n onClick={() => setQuickCheckout(!quickCheckout)}\n className='h-8 cursor-pointer'\n aria-pressed={quickCheckout}\n >\n <Zap />\n {quickCheckout ? standardLabel : expressLabel}\n </Button>\n </div>\n\n {quickCheckout ? (\n <div className='grid grid-cols-2 gap-2'>\n {onPayWithApple ? (\n <Button size='sm' variant='outline' className='h-8 cursor-pointer px-3 text-xs' onClick={onPayWithApple}>\n <Wallet />\n Apple Pay\n </Button>\n ) : null}\n {onPayWithGoogle ? (\n <Button size='sm' variant='outline' className='h-8 cursor-pointer px-3 text-xs' onClick={onPayWithGoogle}>\n <CreditCard />\n Google Pay\n </Button>\n ) : null}\n </div>\n ) : null}\n </>\n ) : null}\n\n {/* Checkout Button */}\n {!checkoutUnavailable ? (\n <Button\n size='lg'\n className='h-10 w-full cursor-pointer px-8'\n onClick={hasExpress && quickCheckout ? onQuickCheckout : onCheckout}\n disabled={checkoutDisabled || totalsState === 'pending'}\n >\n {hasExpress && quickCheckout ? quickCheckoutLabel : checkoutLabel}\n </Button>\n ) : null}\n\n {/* Continue shopping — page presentation only */}\n {isPage && onContinueShopping ? (\n <Button\n variant='outline'\n size='lg'\n className='h-10 w-full cursor-pointer px-8'\n onClick={onContinueShopping}\n >\n {continueShoppingLabel}\n </Button>\n ) : null}\n\n {/* Estimated Delivery — only when supplied, never fabricated */}\n {estimatedDeliveryLabel ? (\n <div className='text-muted-foreground flex items-center justify-center gap-2 text-xs'>\n <Clock className='size-3' />\n <span>{estimatedDeliveryLabel}</span>\n </div>\n ) : null}\n </div>\n\n {/* Security Badge */}\n <div className='bg-muted/50 rounded-lg p-3 text-center'>\n <div className='text-muted-foreground flex items-center justify-center gap-2 text-xs'>\n <div className='size-2 rounded-full bg-success' aria-hidden='true' />\n <span>{secureCheckoutLabel}</span>\n </div>\n </div>\n </>\n )}\n\n {/* Collapsed Summary */}\n {!expanded && (\n <div className='flex flex-col gap-3'>\n <div className='flex items-center justify-between'>\n <span className='text-muted-foreground text-sm'>\n {itemCount} {itemsLabel}\n </span>\n {isAvailableMoney(totals?.total) ? (\n <span className='font-semibold tabular-nums'>{money(totals.total)}</span>\n ) : null}\n </div>\n\n <Button size='sm' className='h-8 w-full cursor-pointer px-3 text-xs' onClick={onCheckout}>\n {checkoutNowLabel}\n </Button>\n </div>\n )}\n\n {/* Recently Viewed */}\n {expanded && recentlyViewed && recentlyViewed.length > 0 && (\n <div className='flex flex-col gap-3'>\n <h4 className='text-sm font-medium'>{recentlyViewedLabel}</h4>\n <div className='grid grid-cols-3 gap-2'>\n {recentlyViewed.map(item => (\n <button\n key={item.id}\n type='button'\n className={cn(\n 'group text-start',\n onRecentlyViewedClick && 'cursor-pointer',\n )}\n onClick={onRecentlyViewedClick ? () => onRecentlyViewedClick(item.id) : undefined}\n >\n <div className='bg-muted mb-1 aspect-square overflow-hidden'>\n {item.image ? (\n <img\n src={item.image || undefined}\n alt={item.name}\n className='size-full rounded-md object-cover'\n />\n ) : null}\n </div>\n <p className='text-muted-foreground truncate text-xs'>{item.name}</p>\n <p className='text-xs font-medium'>${item.price.toFixed(2)}</p>\n </button>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </CardContent>\n </Card>\n </div>\n </section>\n )\n}\n\nexport default ShoppingCart4\n","'use client'\n\nimport { ArrowRight, Clock, Heart, Minus, Plus, ShoppingBag, Trash2 } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { CheckboxCheck } from '../checkout-forms/checkbox-check'\nimport { Separator } from '../../../ui/separator'\nimport { Badge } from '../../../ui/badge'\nimport { Progress } from '../../../ui/progress'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { ShoppingCart3SpinningCounter } from './shopping-cart-3-spinning-counter'\nimport { cn } from '../../../lib/utils'\n\nexport type ShoppingCart3Tag = 'Limited Edition' | 'Best Seller' | 'New Arrival'\n\nexport interface ShoppingCart3CartItem {\n id: string\n name: string\n color: string\n size: string\n price: number\n originalPrice: number\n quantity: number\n image: string\n selected: boolean\n tag: ShoppingCart3Tag\n estimatedDelivery: string\n}\n\nexport interface ShoppingCart3Feature {\n icon: LucideIcon\n title: string\n description: string\n}\n\nexport interface ShoppingCart3Props {\n items: ShoppingCart3CartItem[]\n freeShippingThreshold?: number\n features?: ShoppingCart3Feature[]\n title?: string\n itemCountLabel?: (count: number) => string\n selectAllLabel?: string\n saveForLaterLabel?: string\n removeItemLabel?: (name: string) => string\n decreaseQuantityLabel?: (name: string) => string\n increaseQuantityLabel?: (name: string) => string\n estimatedDeliveryLabel?: string\n orderSummaryLabel?: string\n subtotalLabel?: string\n shippingLabel?: string\n freeShippingLabel?: string\n youSaveLabel?: string\n totalLabel?: string\n taxNoteLabel?: string\n checkoutLabel?: string\n securePaymentLabel?: string\n freeShippingProgressLabel?: (remaining: number) => string\n freeShippingReachedLabel?: string\n tagLabels?: Partial<Record<ShoppingCart3Tag, string>>\n onUpdateQuantity?: (id: string, quantity: number) => void\n onRemoveItem?: (id: string) => void\n onCheckout?: () => void\n onSaveForLater?: (ids: string[]) => void\n onToggleSelect?: (id: string, selected: boolean) => void\n}\n\nconst DEFAULT_TAG_LABELS: Record<ShoppingCart3Tag, string> = {\n 'Limited Edition': 'Edición limitada',\n 'Best Seller': 'Más vendido',\n 'New Arrival': 'Nuevo ingreso',\n}\n\nexport function ShoppingCart3({\n items,\n freeShippingThreshold,\n features,\n title = 'Tu carrito de compras',\n itemCountLabel = (count) => `${count} ${count === 1 ? 'artículo' : 'artículos'} en tu carrito`,\n selectAllLabel = 'Seleccionar todo',\n saveForLaterLabel = 'Guardar para después',\n removeItemLabel = (name) => `Quitar ${name}`,\n decreaseQuantityLabel = (name) => `Disminuir cantidad de ${name}`,\n increaseQuantityLabel = (name) => `Aumentar cantidad de ${name}`,\n estimatedDeliveryLabel = 'Entrega estimada',\n orderSummaryLabel = 'Resumen del pedido',\n subtotalLabel = 'Subtotal',\n shippingLabel = 'Envío',\n freeShippingLabel = 'Gratis',\n youSaveLabel = 'Ahorras',\n totalLabel = 'Total',\n taxNoteLabel = 'incluye IVA si corresponde',\n checkoutLabel = 'Finalizar compra',\n securePaymentLabel = 'Pago seguro con cifrado SSL',\n freeShippingProgressLabel = (remaining) =>\n `Agrega $${remaining.toFixed(2)} más para obtener envío gratis`,\n freeShippingReachedLabel = '¡Ahorra con envío gratis!',\n tagLabels,\n onUpdateQuantity,\n onRemoveItem,\n onCheckout,\n onSaveForLater,\n onToggleSelect,\n}: ShoppingCart3Props) {\n const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0)\n const savings = items.reduce((sum, item) => sum + (item.originalPrice - item.price) * item.quantity, 0)\n const shippingTotal: number = 0\n const total = subtotal + shippingTotal\n\n const allSelected = items.length > 0 && items.every((item) => item.selected)\n const selectedIds = items.filter((item) => item.selected).map((item) => item.id)\n const resolveTag = (tag: ShoppingCart3Tag) => (tagLabels ? (tagLabels[tag] ?? tag) : tag)\n const freeShippingProgress =\n freeShippingThreshold != null ? Math.min(100, (subtotal / freeShippingThreshold) * 100) : 0\n\n return (\n <section className='bg-background py-8'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <header className='mb-6 text-center'>\n <h1 className='text-2xl font-semibold text-balance md:text-3xl'>{title}</h1>\n <p className='text-muted-foreground mt-1 text-sm'>{itemCountLabel(items.length)}</p>\n </header>\n\n <div className='flex flex-col gap-6 lg:flex-row lg:gap-8'>\n {/* Cart Items Section */}\n <section className='flex-1 flex flex-col gap-4'>\n <div className='flex min-h-8 items-center justify-between px-4'>\n <div className='flex items-center gap-2'>\n <CheckboxCheck\n checked={allSelected}\n onCheckedChange={() => items.forEach((item) => onToggleSelect?.(item.id, !allSelected))}\n className='size-4'\n disabled={!onToggleSelect}\n id='select-all'\n />\n <label htmlFor='select-all' className='text-sm font-medium'>\n {selectAllLabel}\n </label>\n </div>\n <Button\n variant='ghost'\n size='sm'\n className='h-8 cursor-pointer text-sm'\n disabled={selectedIds.length === 0}\n onClick={onSaveForLater ? () => onSaveForLater(selectedIds) : undefined}\n >\n <Heart data-icon='inline-start' />\n {saveForLaterLabel}\n </Button>\n </div>\n\n <div className='flex flex-col gap-4'>\n {items.map((item) => (\n <div\n key={item.id}\n className='rounded-lg transition-all'\n onClick={onToggleSelect ? () => onToggleSelect(item.id, !item.selected) : undefined}\n >\n <Card className={cn('overflow-hidden transition-all', item.selected ? 'shadow-md' : 'shadow-none')}>\n <CardContent className='flex items-start gap-4' onClick={(e) => e.stopPropagation()}>\n <div onClick={(e) => e.stopPropagation()}>\n <CheckboxCheck\n checked={item.selected}\n onCheckedChange={() => onToggleSelect?.(item.id, !item.selected)}\n className='mt-1 size-4'\n disabled={!onToggleSelect}\n />\n </div>\n\n <div className='flex flex-1 gap-4'>\n <div className='relative aspect-square size-20 overflow-hidden rounded-md border sm:size-24'>\n <img src={item.image || undefined} alt={item.name} className='size-full object-cover' />\n </div>\n\n <div className='flex flex-1 flex-col'>\n <div className='flex items-start justify-between'>\n <div>\n <CardTitle className='text-base text-balance'>{item.name}</CardTitle>\n <div className='text-muted-foreground mt-1 flex gap-2 text-xs'>\n <span>{item.color}</span>\n {item.size ? (\n <>\n <span>•</span>\n <span>{item.size}</span>\n </>\n ) : null}\n </div>\n </div>\n <Badge variant='secondary' className='h-5.5 rounded-sm px-2.5 text-xs font-semibold'>\n {resolveTag(item.tag)}\n </Badge>\n </div>\n\n <div className='mt-2 flex items-center gap-2'>\n <span className='text-base font-medium'>${item.price.toFixed(2)}</span>\n {item.originalPrice > item.price ? (\n <span className='text-muted-foreground text-sm line-through'>\n ${item.originalPrice.toFixed(2)}\n </span>\n ) : null}\n </div>\n <div className='mt-2 flex flex-wrap items-end justify-between gap-2'>\n <p className='text-muted-foreground text-xs'>\n <Clock className='me-1 inline-block size-3' />\n {estimatedDeliveryLabel}: {item.estimatedDelivery}\n </p>\n\n <div className='ms-auto flex items-center justify-end gap-4 max-md:ms-0'>\n <div className='flex items-center gap-2'>\n <Button\n variant='outline'\n size='icon'\n className='size-8 cursor-pointer rounded'\n onClick={\n onUpdateQuantity\n ? () => onUpdateQuantity(item.id, Math.max(1, item.quantity - 1))\n : undefined\n }\n disabled={item.quantity <= 1}\n aria-label={decreaseQuantityLabel(item.name)}\n >\n <Minus />\n </Button>\n <span className='w-6 text-center text-sm'>{item.quantity}</span>\n <Button\n variant='outline'\n size='icon'\n className='size-8 cursor-pointer rounded'\n onClick={\n onUpdateQuantity\n ? () => onUpdateQuantity(item.id, item.quantity + 1)\n : undefined\n }\n aria-label={increaseQuantityLabel(item.name)}\n >\n <Plus />\n </Button>\n </div>\n <Button\n variant='ghost'\n size='icon'\n className='size-8 cursor-pointer rounded-sm text-muted-foreground hover:bg-destructive/10 hover:text-destructive'\n onClick={onRemoveItem ? () => onRemoveItem(item.id) : undefined}\n aria-label={removeItemLabel(item.name)}\n >\n <Trash2 />\n </Button>\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n ))}\n </div>\n </section>\n\n {/* Summary Section */}\n <aside className='w-full lg:w-[380px]'>\n <div className='sticky top-8 flex flex-col gap-4'>\n {freeShippingThreshold != null ? (\n <Card className='py-4'>\n <CardContent className='px-4'>\n {subtotal < freeShippingThreshold ? (\n <p className='text-xs'>{freeShippingProgressLabel(freeShippingThreshold - subtotal)}</p>\n ) : (\n <p className='text-xs font-medium'>{freeShippingReachedLabel}</p>\n )}\n <Progress value={subtotal < freeShippingThreshold ? freeShippingProgress : 100} className='mt-2 h-1.5' />\n </CardContent>\n </Card>\n ) : null}\n\n <Card className='gap-4 py-4'>\n <CardHeader className='px-4'>\n <CardTitle className='text-lg'>{orderSummaryLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-3 px-4'>\n <div className='flex justify-between text-sm'>\n <span className='text-muted-foreground'>{subtotalLabel}</span>\n <span className='font-medium'>${subtotal.toFixed(2)}</span>\n </div>\n <div className='flex justify-between text-sm'>\n <span className='text-muted-foreground'>{shippingLabel}</span>\n <span className='font-medium'>\n {shippingTotal === 0 ? freeShippingLabel : `$${shippingTotal.toFixed(2)}`}\n </span>\n </div>\n {savings > 0 && (\n <div className='flex justify-between text-sm'>\n <span>{youSaveLabel}</span>\n <span className='font-medium'>-${savings.toFixed(2)}</span>\n </div>\n )}\n <Separator />\n <div className='flex justify-between text-base font-medium'>\n <span>{totalLabel}</span>\n <span>\n <ShoppingCart3SpinningCounter value={total} decimals={2} prefix='$' />\n </span>\n </div>\n\n <Button\n className='mt-4 h-8 w-full cursor-pointer px-3 text-xs'\n size='sm'\n onClick={onCheckout}\n >\n <ShoppingBag data-icon='inline-start' />\n {checkoutLabel}\n <ArrowRight data-icon='inline-end' />\n </Button>\n\n <p className='text-muted-foreground text-center text-xs'>{securePaymentLabel}</p>\n </CardContent>\n </Card>\n\n {features && features.length > 0 ? (\n <div className='grid grid-cols-1 gap-3'>\n {features.map((feature, index) => (\n <Card key={index} className='py-3'>\n <CardContent className='flex items-center gap-3 px-3'>\n <div className='bg-secondary rounded-full p-1.5'>\n <feature.icon className='size-4' />\n </div>\n <div>\n <h3 className='text-sm font-medium'>{feature.title}</h3>\n <p className='text-muted-foreground text-xs'>{feature.description}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : null}\n </div>\n </aside>\n </div>\n </div>\n </section>\n )\n}\n\nexport default ShoppingCart3","'use client'\n\nimport { useEffect, useRef } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\nconst CELL_SIZE = 20\nconst DURATION = 450\nconst STAGGER = 60\nconst SPINS = 1\nconst SPIN_BLUR = 2\n\nconst REEL_DIGITS = Array.from({ length: (SPINS + 1) * 10 }, (_, i) => i % 10)\n\ntype ShoppingCart3SpinningCounterProps = {\n value: number\n decimals?: number\n prefix?: string\n className?: string\n digitClassName?: string\n}\n\nexport function ShoppingCart3SpinningCounter({\n value,\n decimals = 0,\n prefix,\n className,\n digitClassName,\n}: ShoppingCart3SpinningCounterProps) {\n const safeValue = Math.max(0, value)\n const formatted = safeValue.toFixed(decimals)\n const chars = formatted.split('')\n const containerRef = useRef<HTMLSpanElement>(null)\n const isFirstRender = useRef(true)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n\n const strips = Array.from(container.querySelectorAll<HTMLElement>('[data-reel-strip]'))\n const timeouts: number[] = []\n\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\n strips.forEach((strip, index) => {\n const digit = Number(strip.dataset.digit)\n const delay = (strips.length - 1 - index) * STAGGER\n\n if (isFirstRender.current || !strip.dataset.initialized || prefersReducedMotion) {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n strip.style.filter = 'blur(0px)'\n strip.dataset.initialized = 'true'\n void strip.offsetHeight\n return\n }\n\n const landingIndex = SPINS * 10 + digit\n strip.style.transition = `transform ${DURATION}ms cubic-bezier(0.16, 1, 0.3, 1) ${delay}ms, filter ${DURATION}ms ease-out ${delay}ms`\n strip.style.transform = `translateY(-${landingIndex * CELL_SIZE}px)`\n strip.style.filter = `blur(${SPIN_BLUR}px)`\n\n const settleTimeout = window.setTimeout(() => {\n strip.style.filter = 'blur(0px)'\n }, delay + 30)\n\n const resetTimeout = window.setTimeout(() => {\n strip.style.transition = 'none'\n strip.style.transform = `translateY(-${digit * CELL_SIZE}px)`\n void strip.offsetHeight\n }, delay + DURATION + 30)\n\n timeouts.push(settleTimeout, resetTimeout)\n })\n\n isFirstRender.current = false\n\n return () => {\n timeouts.forEach(window.clearTimeout)\n }\n }, [formatted])\n\n return (\n <span className='relative inline-flex items-center'>\n <span className='sr-only'>{prefix}{formatted}</span>\n <span\n ref={containerRef}\n className={cn('inline-flex items-center font-[inherit] tabular-nums', className)}\n style={{ height: CELL_SIZE }}\n aria-hidden='true'\n >\n {prefix ? (\n <span\n className={digitClassName}\n style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}\n >\n {prefix}\n </span>\n ) : null}\n {chars.map((char, index) => {\n if (!/\\d/.test(char)) {\n return (\n <span\n key={index}\n className={digitClassName}\n style={{ display: 'inline-flex', alignItems: 'center', height: CELL_SIZE }}\n >\n {char}\n </span>\n )\n }\n\n return (\n <span\n key={index}\n className='relative inline-block overflow-hidden'\n style={{\n height: CELL_SIZE,\n maskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n WebkitMaskImage: 'linear-gradient(to bottom, transparent 0%, #000 22%, #000 78%, transparent 100%)',\n }}\n >\n <span data-reel-strip data-digit={char} className='flex flex-col will-change-[transform,filter]'>\n {REEL_DIGITS.map((cellDigit, cellIndex) => (\n <span\n key={cellIndex}\n className={cn('flex items-center justify-center', digitClassName)}\n style={{ height: CELL_SIZE }}\n >\n {cellDigit}\n </span>\n ))}\n </span>\n </span>\n )\n })}\n </span>\n </span>\n )\n}\n\nexport default ShoppingCart3SpinningCounter","import type { ReactNode } from 'react'\nimport { cn } from '../../../lib/utils'\n\nexport interface StoreContainer1Props {\n size?: 'default' | 'narrow' | 'wide' | 'full'\n className?: string\n children?: ReactNode\n}\n\nconst sizeClasses: Record<NonNullable<StoreContainer1Props['size']>, string> = {\n default: 'mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8',\n narrow: 'mx-auto w-full max-w-3xl px-4 sm:px-6 lg:px-8',\n wide: 'mx-auto w-full max-w-screen-2xl px-4 sm:px-6 lg:px-8',\n full: 'w-full',\n}\n\n/**\n * Trivial presentational layout container used as the root of spec-driven\n * storefront pages. Constrains content width; children render as-is.\n */\nexport function StoreContainer1({\n size = 'default',\n className,\n children,\n}: StoreContainer1Props) {\n return <div className={cn(sizeClasses[size], className)}>{children}</div>\n}\n\nexport default StoreContainer1","'use client'\n\nimport { useState } from 'react'\nimport { Lock } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport { CheckoutForm1ContactStep } from './checkout-form-1-contact-step'\nimport { CheckoutForm1ShippingStep } from './checkout-form-1-shipping-step'\nimport { CheckoutForm1PaymentStep } from './checkout-form-1-payment-step'\nimport { CheckoutForm1OrderSummary } from './checkout-form-1-order-summary'\nimport { CheckoutForm1Progress } from './checkout-form-1-progress'\nimport { formatCardNumber, formatExpiryDate } from './card-formatting'\nimport type { Money, PaymentMethod } from '@thorprovider/types'\nimport type { CheckoutFieldErrors } from './checkout-form-types'\n\nexport interface CheckoutForm1FormData {\n email: string\n firstName: string\n lastName: string\n phone: string\n address: string\n city: string\n state: string\n zipCode: string\n country: string\n paymentMethod: string\n cardNumber: string\n expiryDate: string\n cvv: string\n cardName: string\n saveInfo: boolean\n sameAsBilling: boolean\n newsletter: boolean\n promoCode: string\n}\n\nexport type CheckoutForm1FieldErrors = CheckoutFieldErrors<keyof CheckoutForm1FormData>\n\nexport type CheckoutForm1FieldDescriptions = Partial<\n Record<keyof CheckoutForm1FormData, string>\n>\n\nexport interface CheckoutForm1OrderSummaryItem {\n id: string | number\n name: string\n variant?: string\n quantity: number\n /** Canonical backend line total; preferred over `price * quantity`. */\n lineTotal?: Money\n /** @deprecated legacy numeric price, used only when `lineTotal` is absent. */\n price?: number\n /** Optional; an absent image is omitted rather than serialized as `\"\"`. */\n image?: string\n}\n\nexport interface CheckoutForm1Totals {\n subtotal: Money\n discount?: Money\n tax?: Money\n shipping?: Money\n total: Money\n}\n\nexport type CheckoutForm1TotalsState = 'idle' | 'pending' | 'error'\n\nexport interface CheckoutForm1OrderSummary {\n items: CheckoutForm1OrderSummaryItem[]\n /** Backend-authoritative totals; rendered verbatim when present. */\n totals?: CheckoutForm1Totals\n /** @deprecated legacy numeric amounts, used only when `totals` is absent. */\n shipping?: number\n /** @deprecated */\n tax?: number\n /** @deprecated */\n discount?: number\n /** @deprecated */\n promoDiscount?: number\n}\n\nexport interface CheckoutForm1CountryOption {\n value: string\n label: string\n}\n\nexport interface CheckoutForm1ShippingOption {\n /** Backend shipping method id — the controlled selection identity. */\n id: string\n name: string\n price?: Money\n description?: string\n estimatedDays?: string\n}\n\nexport type CheckoutForm1ChangeHandler = (\n field: keyof CheckoutForm1FormData,\n value: string | boolean\n) => void\n\nconst STEP_COPY = [\n { title: 'Información de contacto', description: 'La usaremos para enviarte novedades de tu pedido.' },\n { title: 'Dirección de envío', description: 'Enviaremos tu pedido a esta dirección.' },\n { title: 'Datos de pago', description: 'Pago seguro para tu pedido.' },\n] as const\n\nexport interface CheckoutForm1Props {\n title?: string\n description?: string\n orderSummary?: CheckoutForm1OrderSummary\n /** Controlled state of the totals fetch/mutation. */\n totalsState?: CheckoutForm1TotalsState\n totalsErrorLabel?: string\n retryLabel?: string\n onRetryTotals?: () => void\n countries?: CheckoutForm1CountryOption[]\n /** Eligible shipping options for the cart's region/address. */\n shippingOptions?: CheckoutForm1ShippingOption[]\n /** Controlled selection of a shipping option id. */\n selectedShippingOptionId?: string\n onSelectShippingOption?: (id: string) => void\n paymentMethods?: PaymentMethod[]\n noPaymentMethodsLabel?: string\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n /**\n * Raw card fields are legacy-only and never collected in the launch flow.\n * Defaults to `false`: the curated surface renders no card inputs.\n */\n collectCardFields?: boolean\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n promoApplyLabel?: string\n promoPlaceholder?: string\n /** Optional trust copy; rendered only when supplied (never fabricated). */\n trustNotes?: string[]\n backLabel?: string\n completeOrderLabel?: string\n processingLabel?: string\n continueLabel?: string\n values: CheckoutForm1FormData\n onChange: CheckoutForm1ChangeHandler\n fieldErrors?: CheckoutForm1FieldErrors\n fieldDescriptions?: CheckoutForm1FieldDescriptions\n validateStep?: (step: number) => boolean\n onSubmit?: (data: CheckoutForm1FormData) => void\n /** Disables the submit button while the order is being placed. */\n submitting?: boolean\n /** Order-level error surfaced above the footer actions. */\n submitError?: string\n /** Optional recovery action for a failed submission. */\n onRetrySubmit?: () => void\n submitErrorActionLabel?: string\n}\n\nexport default function CheckoutForm1({\n title,\n description,\n orderSummary,\n totalsState = 'idle',\n totalsErrorLabel,\n retryLabel,\n onRetryTotals,\n countries,\n shippingOptions,\n selectedShippingOptionId,\n onSelectShippingOption,\n paymentMethods,\n noPaymentMethodsLabel,\n formatMoney,\n collectCardFields = false,\n onApplyPromo,\n promoPending = false,\n promoApplyLabel,\n promoPlaceholder,\n trustNotes,\n backLabel = 'Atrás',\n completeOrderLabel = 'Completar pedido',\n processingLabel = 'Procesando pedido…',\n continueLabel = 'Continuar',\n values,\n onChange,\n fieldErrors,\n fieldDescriptions,\n validateStep,\n onSubmit,\n submitting = false,\n submitError,\n onRetrySubmit,\n submitErrorActionLabel = 'Reintentar',\n}: CheckoutForm1Props) {\n const [step, setStep] = useState(1)\n\n const handleCardNumberChange = (value: string) => {\n onChange('cardNumber', formatCardNumber(value))\n }\n\n const handleExpiryChange = (value: string) => {\n onChange('expiryDate', formatExpiryDate(value))\n }\n\n const handleContinue = () => {\n if (validateStep && !validateStep(step)) return\n setStep((s) => Math.min(STEP_COPY.length, s + 1))\n }\n\n const handleSubmit = () => {\n if (validateStep) {\n const allValid = Array.from({ length: STEP_COPY.length }, (_, index) => index + 1).every(\n (currentStep) => validateStep(currentStep)\n )\n if (!allValid) return\n }\n onSubmit?.(values)\n }\n\n const stepCount = STEP_COPY.length\n const isLastStep = step === stepCount\n\n return (\n <div className=\"mx-auto max-w-6xl px-4 py-12 sm:px-6 lg:px-8\">\n {(title || description) && (\n <header className=\"mb-8 text-center\">\n {title && <h1 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">{title}</h1>}\n {description && <p className=\"mt-2 text-muted-foreground\">{description}</p>}\n </header>\n )}\n\n <CheckoutForm1Progress step={step} />\n\n <div className=\"mt-8 grid gap-6 lg:grid-cols-3\">\n <Card className={cn('lg:col-span-2', !orderSummary && 'lg:col-span-3')}>\n <CardContent className=\"p-6\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold\">{STEP_COPY[step - 1].title}</h2>\n <p className=\"text-sm text-muted-foreground\">{STEP_COPY[step - 1].description}</p>\n </div>\n\n {step === 1 && (\n <CheckoutForm1ContactStep\n formData={values}\n onChange={onChange}\n fieldErrors={fieldErrors}\n fieldDescriptions={fieldDescriptions}\n />\n )}\n {step === 2 && (\n <CheckoutForm1ShippingStep\n formData={values}\n onChange={onChange}\n countries={countries}\n shippingOptions={shippingOptions}\n selectedShippingOptionId={selectedShippingOptionId}\n onSelectShippingOption={onSelectShippingOption}\n formatMoney={formatMoney}\n fieldErrors={fieldErrors}\n fieldDescriptions={fieldDescriptions}\n />\n )}\n {step === 3 && (\n <CheckoutForm1PaymentStep\n formData={values}\n onChange={onChange}\n onCardNumberChange={handleCardNumberChange}\n onExpiryChange={handleExpiryChange}\n paymentMethods={paymentMethods}\n noPaymentMethodsLabel={noPaymentMethodsLabel}\n collectCardFields={collectCardFields}\n fieldErrors={fieldErrors}\n fieldDescriptions={fieldDescriptions}\n />\n )}\n\n {submitError && (\n <div\n role=\"alert\"\n className=\"mt-6 flex flex-wrap items-center justify-between gap-3 rounded-md border border-destructive/50 bg-destructive/10 px-4 py-3 text-sm text-destructive\"\n >\n <span>{submitError}</span>\n {onRetrySubmit ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetrySubmit}\n disabled={submitting}\n >\n {submitErrorActionLabel}\n </Button>\n ) : null}\n </div>\n )}\n\n <div className=\"mt-6 flex items-center justify-between gap-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setStep((s) => Math.max(1, s - 1))}\n disabled={step === 1 || submitting}\n >\n {backLabel}\n </Button>\n {isLastStep ? (\n <Button type=\"button\" onClick={handleSubmit} disabled={submitting}>\n <Lock className=\"size-4\" />\n {submitting ? processingLabel : completeOrderLabel}\n </Button>\n ) : (\n <Button type=\"button\" onClick={handleContinue} disabled={submitting}>\n {continueLabel}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n\n {orderSummary && (\n <div className=\"lg:col-span-1\">\n <CheckoutForm1OrderSummary\n orderSummary={orderSummary}\n totalsState={totalsState}\n totalsErrorLabel={totalsErrorLabel}\n retryLabel={retryLabel}\n onRetryTotals={onRetryTotals}\n promoCode={values.promoCode}\n onPromoCodeChange={(value) => onChange('promoCode', value)}\n onApplyPromo={onApplyPromo}\n promoPending={promoPending}\n promoApplyLabel={promoApplyLabel}\n promoPlaceholder={promoPlaceholder}\n trustNotes={trustNotes}\n formatMoney={formatMoney}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Label } from \"@/ui/label\"\nimport { Separator } from \"@/ui/separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col @md/field-group:flex-row @md/field-group:items-center [&>*]:w-full @md/field-group:[&>*]:w-auto [&>.sr-only]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n \"has-data-[state=checked]:border-primary has-data-[state=checked]:bg-primary/5 dark:has-data-[state=checked]:bg-primary/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-sm leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","'use client'\n\nimport { FieldDescription, FieldError } from '../../../ui/field'\nimport type { CheckoutFieldError } from './checkout-form-types'\n\nexport function checkoutFieldAria(id: string, errors?: CheckoutFieldError[]) {\n const invalid = !!errors?.length\n return {\n 'aria-invalid': invalid || undefined,\n 'aria-describedby': invalid ? `${id}-error` : undefined,\n }\n}\n\nexport function CheckoutFieldFeedback({\n id,\n errors,\n description,\n}: {\n id: string\n errors?: CheckoutFieldError[]\n description?: string\n}) {\n return (\n <>\n {description && <FieldDescription id={`${id}-description`}>{description}</FieldDescription>}\n {errors?.length ? <FieldError id={`${id}-error`} errors={errors} /> : null}\n </>\n )\n}","'use client'\n\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type {\n CheckoutForm1ChangeHandler,\n CheckoutForm1FieldDescriptions,\n CheckoutForm1FieldErrors,\n CheckoutForm1FormData,\n} from './checkout-form-1'\n\nexport interface CheckoutForm1ContactStepProps {\n formData: CheckoutForm1FormData\n onChange: CheckoutForm1ChangeHandler\n fieldErrors?: CheckoutForm1FieldErrors\n fieldDescriptions?: CheckoutForm1FieldDescriptions\n}\n\nexport function CheckoutForm1ContactStep({\n formData,\n onChange,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutForm1ContactStepProps) {\n return (\n <FieldGroup className=\"grid gap-4\">\n <Field data-invalid={!!fieldErrors?.email?.length}>\n <FieldLabel htmlFor=\"checkout-email\">Email</FieldLabel>\n <Input\n id=\"checkout-email\"\n type=\"text\"\n inputMode=\"email\"\n placeholder=\"john@example.com\"\n value={formData.email}\n onChange={(e) => onChange('email', e.target.value)}\n {...checkoutFieldAria('checkout-email', fieldErrors?.email)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-email\"\n errors={fieldErrors?.email}\n description={fieldDescriptions?.email}\n />\n </Field>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.firstName?.length}>\n <FieldLabel htmlFor=\"checkout-first-name\">First name</FieldLabel>\n <Input\n id=\"checkout-first-name\"\n placeholder=\"John\"\n value={formData.firstName}\n onChange={(e) => onChange('firstName', e.target.value)}\n {...checkoutFieldAria('checkout-first-name', fieldErrors?.firstName)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-first-name\"\n errors={fieldErrors?.firstName}\n description={fieldDescriptions?.firstName}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.lastName?.length}>\n <FieldLabel htmlFor=\"checkout-last-name\">Last name</FieldLabel>\n <Input\n id=\"checkout-last-name\"\n placeholder=\"Doe\"\n value={formData.lastName}\n onChange={(e) => onChange('lastName', e.target.value)}\n {...checkoutFieldAria('checkout-last-name', fieldErrors?.lastName)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-last-name\"\n errors={fieldErrors?.lastName}\n description={fieldDescriptions?.lastName}\n />\n </Field>\n </div>\n <Field data-invalid={!!fieldErrors?.phone?.length}>\n <FieldLabel htmlFor=\"checkout-phone\">Phone (optional)</FieldLabel>\n <Input\n id=\"checkout-phone\"\n type=\"text\"\n inputMode=\"tel\"\n placeholder=\"+1 (555) 000-0000\"\n value={formData.phone}\n onChange={(e) => onChange('phone', e.target.value)}\n {...checkoutFieldAria('checkout-phone', fieldErrors?.phone)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-phone\"\n errors={fieldErrors?.phone}\n description={fieldDescriptions?.phone}\n />\n </Field>\n </FieldGroup>\n )\n}","'use client'\n\nimport { Field, FieldLabel } from '../../../ui/field'\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../../ui/select'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { CheckoutFieldError } from './checkout-form-types'\nimport type { CheckoutForm1CountryOption } from './checkout-form-1'\n\nexport interface CheckoutForm1CountryFieldProps {\n countries: CheckoutForm1CountryOption[]\n value: string\n onValueChange: (value: string) => void\n errors?: CheckoutFieldError[]\n description?: string\n}\n\nexport function CheckoutForm1CountryField({\n countries,\n value,\n onValueChange,\n errors,\n description,\n}: CheckoutForm1CountryFieldProps) {\n return (\n <Field data-invalid={!!errors?.length}>\n <FieldLabel htmlFor=\"checkout-country\">Country</FieldLabel>\n <Select value={value} onValueChange={onValueChange}>\n <SelectTrigger id=\"checkout-country\" {...checkoutFieldAria('checkout-country', errors)}>\n <SelectValue placeholder=\"Select a country\" />\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {countries.map((country) => (\n <SelectItem key={country.value} value={country.value}>\n {country.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n <CheckoutFieldFeedback id=\"checkout-country\" errors={errors} description={description} />\n </Field>\n )\n}","'use client'\n\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type {\n CheckoutForm1ChangeHandler,\n CheckoutForm1CountryOption,\n CheckoutForm1FieldDescriptions,\n CheckoutForm1FieldErrors,\n CheckoutForm1FormData,\n CheckoutForm1ShippingOption,\n} from './checkout-form-1'\nimport { CheckoutForm1CountryField } from './checkout-form-1-country-field'\n\nexport interface CheckoutForm1ShippingStepProps {\n formData: CheckoutForm1FormData\n onChange: CheckoutForm1ChangeHandler\n countries?: CheckoutForm1CountryOption[]\n shippingOptions?: CheckoutForm1ShippingOption[]\n selectedShippingOptionId?: string\n onSelectShippingOption?: (id: string) => void\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n fieldErrors?: CheckoutForm1FieldErrors\n fieldDescriptions?: CheckoutForm1FieldDescriptions\n}\n\nexport function CheckoutForm1ShippingStep({\n formData,\n onChange,\n countries,\n shippingOptions,\n selectedShippingOptionId,\n onSelectShippingOption,\n formatMoney: formatMoneyProp,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutForm1ShippingStepProps) {\n return (\n <FieldGroup className=\"grid gap-4\">\n <Field data-invalid={!!fieldErrors?.address?.length}>\n <FieldLabel htmlFor=\"checkout-address\">Street address</FieldLabel>\n <Input\n id=\"checkout-address\"\n placeholder=\"123 Main St\"\n value={formData.address}\n onChange={(e) => onChange('address', e.target.value)}\n {...checkoutFieldAria('checkout-address', fieldErrors?.address)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-address\"\n errors={fieldErrors?.address}\n description={fieldDescriptions?.address}\n />\n </Field>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.city?.length}>\n <FieldLabel htmlFor=\"checkout-city\">City</FieldLabel>\n <Input\n id=\"checkout-city\"\n placeholder=\"San Francisco\"\n value={formData.city}\n onChange={(e) => onChange('city', e.target.value)}\n {...checkoutFieldAria('checkout-city', fieldErrors?.city)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-city\"\n errors={fieldErrors?.city}\n description={fieldDescriptions?.city}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.state?.length}>\n <FieldLabel htmlFor=\"checkout-state\">State / Province</FieldLabel>\n <Input\n id=\"checkout-state\"\n placeholder=\"CA\"\n value={formData.state}\n onChange={(e) => onChange('state', e.target.value)}\n {...checkoutFieldAria('checkout-state', fieldErrors?.state)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-state\"\n errors={fieldErrors?.state}\n description={fieldDescriptions?.state}\n />\n </Field>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.zipCode?.length}>\n <FieldLabel htmlFor=\"checkout-zip\">ZIP / Postal code</FieldLabel>\n <Input\n id=\"checkout-zip\"\n placeholder=\"94103\"\n value={formData.zipCode}\n onChange={(e) => onChange('zipCode', e.target.value)}\n {...checkoutFieldAria('checkout-zip', fieldErrors?.zipCode)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-zip\"\n errors={fieldErrors?.zipCode}\n description={fieldDescriptions?.zipCode}\n />\n </Field>\n {countries && countries.length > 0 && (\n <CheckoutForm1CountryField\n countries={countries}\n value={formData.country}\n onValueChange={(value) => onChange('country', value)}\n errors={fieldErrors?.country}\n description={fieldDescriptions?.country}\n />\n )}\n </div>\n\n {shippingOptions && shippingOptions.length > 0 ? (\n <FieldSet>\n <FieldLegend>Shipping method</FieldLegend>\n <RadioGroup\n value={selectedShippingOptionId ?? ''}\n onValueChange={(value) => value && onSelectShippingOption?.(String(value))}\n className=\"grid gap-3\"\n >\n {shippingOptions.map((option) => (\n <Field\n key={option.id}\n orientation=\"horizontal\"\n className=\"justify-between rounded-lg border p-4\"\n >\n <FieldContent>\n <FieldLabel htmlFor={`shipping-${option.id}`} className=\"flex flex-col gap-0.5\">\n <span>{option.name}</span>\n {option.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">\n {option.description}\n </span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <div className=\"flex items-center gap-3\">\n {isAvailableMoney(option.price) ? (\n <span className=\"text-sm tabular-nums\">{formatMoney(option.price, formatMoneyProp)}</span>\n ) : null}\n <RadioGroupItem value={option.id} id={`shipping-${option.id}`} />\n </div>\n </Field>\n ))}\n </RadioGroup>\n </FieldSet>\n ) : null}\n </FieldGroup>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { Eye, EyeOff } from 'lucide-react'\nimport { Field, FieldContent, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n} from '../../../ui/input-group'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { CheckboxCheck } from './checkbox-check'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type {\n CheckoutForm1ChangeHandler,\n CheckoutForm1FieldDescriptions,\n CheckoutForm1FieldErrors,\n CheckoutForm1FormData,\n} from './checkout-form-1'\n\nexport interface CheckoutForm1PaymentStepProps {\n formData: CheckoutForm1FormData\n onChange: CheckoutForm1ChangeHandler\n onCardNumberChange: (value: string) => void\n onExpiryChange: (value: string) => void\n paymentMethods?: PaymentMethod[]\n noPaymentMethodsLabel?: string\n /** Raw card fields are legacy-only; the launch flow defaults to `false`. */\n collectCardFields?: boolean\n fieldErrors?: CheckoutForm1FieldErrors\n fieldDescriptions?: CheckoutForm1FieldDescriptions\n}\n\nexport function CheckoutForm1PaymentStep({\n formData,\n onChange,\n onCardNumberChange,\n onExpiryChange,\n paymentMethods = [],\n noPaymentMethodsLabel = 'No payment methods are available for this region.',\n collectCardFields = false,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutForm1PaymentStepProps) {\n const [showCvv, setShowCvv] = useState(false)\n\n const selectedMethod = paymentMethods.find(method => method.id === formData.paymentMethod)\n const isCard = selectedMethod?.type === 'card'\n const showCardFields = collectCardFields && isCard\n\n return (\n <FieldSet>\n <FieldLegend>Payment method</FieldLegend>\n {paymentMethods.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">{noPaymentMethodsLabel}</p>\n ) : (\n <RadioGroup value={formData.paymentMethod} onValueChange={value => value && onChange('paymentMethod', value)} className=\"grid gap-3\">\n {paymentMethods.map(method => (\n <Field key={method.id} orientation=\"horizontal\" className=\"justify-between rounded-lg border p-4\">\n <FieldContent>\n <FieldLabel htmlFor={`payment-${method.id}`} className=\"flex flex-col gap-0.5\">\n <span>{method.name}</span>\n {method.description ? (\n <span className=\"text-muted-foreground text-xs font-normal\">{method.description}</span>\n ) : null}\n </FieldLabel>\n </FieldContent>\n <RadioGroupItem value={method.id} id={`payment-${method.id}`} />\n </Field>\n ))}\n </RadioGroup>\n )}\n\n {selectedMethod && !showCardFields ? (\n <div className=\"bg-muted/50 rounded-lg p-4 text-sm\">\n <p className=\"font-medium\">{selectedMethod.name}</p>\n {selectedMethod.description ? <p className=\"text-muted-foreground mt-1\">{selectedMethod.description}</p> : null}\n </div>\n ) : null}\n\n {showCardFields ? (\n <>\n <Field data-invalid={!!fieldErrors?.cardNumber?.length}>\n <FieldLabel htmlFor=\"checkout-card-number\">Card number</FieldLabel>\n <Input\n id=\"checkout-card-number\"\n inputMode=\"numeric\"\n maxLength={19}\n placeholder=\"1234 5678 9012 3456\"\n value={formData.cardNumber}\n onChange={(e) => onCardNumberChange(e.target.value)}\n {...checkoutFieldAria('checkout-card-number', fieldErrors?.cardNumber)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-card-number\"\n errors={fieldErrors?.cardNumber}\n description={fieldDescriptions?.cardNumber}\n />\n </Field>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Field data-invalid={!!fieldErrors?.expiryDate?.length}>\n <FieldLabel htmlFor=\"checkout-expiry\">Expiry date</FieldLabel>\n <Input\n id=\"checkout-expiry\"\n inputMode=\"numeric\"\n maxLength={5}\n placeholder=\"MM/YY\"\n value={formData.expiryDate}\n onChange={(e) => onExpiryChange(e.target.value)}\n {...checkoutFieldAria('checkout-expiry', fieldErrors?.expiryDate)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-expiry\"\n errors={fieldErrors?.expiryDate}\n description={fieldDescriptions?.expiryDate}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.cvv?.length}>\n <FieldLabel htmlFor=\"checkout-cvv\">CVV</FieldLabel>\n <InputGroup>\n <InputGroupInput\n id=\"checkout-cvv\"\n inputMode=\"numeric\"\n maxLength={4}\n placeholder=\"123\"\n type={showCvv ? 'text' : 'password'}\n value={formData.cvv}\n onChange={(e) => onChange('cvv', e.target.value)}\n {...checkoutFieldAria('checkout-cvv', fieldErrors?.cvv)}\n />\n <InputGroupAddon inline-end>\n <InputGroupButton\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={showCvv ? 'Hide CVV' : 'Show CVV'}\n onClick={() => setShowCvv((s) => !s)}\n >\n {showCvv ? <EyeOff /> : <Eye />}\n </InputGroupButton>\n </InputGroupAddon>\n </InputGroup>\n <CheckoutFieldFeedback\n id=\"checkout-cvv\"\n errors={fieldErrors?.cvv}\n description={fieldDescriptions?.cvv}\n />\n </Field>\n </div>\n <Field data-invalid={!!fieldErrors?.cardName?.length}>\n <FieldLabel htmlFor=\"checkout-card-name\">Name on card</FieldLabel>\n <Input\n id=\"checkout-card-name\"\n placeholder=\"John Doe\"\n value={formData.cardName}\n onChange={(e) => onChange('cardName', e.target.value)}\n {...checkoutFieldAria('checkout-card-name', fieldErrors?.cardName)}\n />\n <CheckoutFieldFeedback\n id=\"checkout-card-name\"\n errors={fieldErrors?.cardName}\n description={fieldDescriptions?.cardName}\n />\n </Field>\n <Field orientation=\"horizontal\" className=\"gap-2\" data-invalid={!!fieldErrors?.saveInfo?.length}>\n <CheckboxCheck\n id=\"checkout-save-info\"\n checked={formData.saveInfo}\n onCheckedChange={(checked) => onChange('saveInfo', checked === true)}\n {...checkoutFieldAria('checkout-save-info', fieldErrors?.saveInfo)}\n />\n <FieldContent>\n <FieldLabel htmlFor=\"checkout-save-info\">Save payment info for next time</FieldLabel>\n <CheckoutFieldFeedback\n id=\"checkout-save-info\"\n errors={fieldErrors?.saveInfo}\n description={fieldDescriptions?.saveInfo}\n />\n </FieldContent>\n </Field>\n </>\n ) : null}\n </FieldSet>\n )\n}","'use client'\n\nimport { Shield, Truck } from 'lucide-react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardTitle } from '../../../ui/card'\nimport { Field, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport type {\n CheckoutForm1OrderSummary,\n CheckoutForm1OrderSummaryItem,\n CheckoutForm1TotalsState,\n} from './checkout-form-1'\n\nexport interface CheckoutForm1OrderSummaryProps {\n orderSummary: CheckoutForm1OrderSummary\n totalsState?: CheckoutForm1TotalsState\n totalsErrorLabel?: string\n /** Shown when a required total amount is absent or malformed (never as zero). */\n totalsUnavailableLabel?: string\n /** Shown for a line whose supplied line total is absent or malformed. */\n amountUnavailableLabel?: string\n retryLabel?: string\n onRetryTotals?: () => void\n promoCode?: string\n onPromoCodeChange?: (value: string) => void\n onApplyPromo?: (code: string) => void\n promoPending?: boolean\n promoApplyLabel?: string\n promoPlaceholder?: string\n trustNotes?: string[]\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatMoney?: (money: Money) => string\n}\n\nexport function CheckoutForm1OrderSummary({\n orderSummary,\n totalsState = 'idle',\n totalsErrorLabel = 'No se pudieron actualizar los totales.',\n totalsUnavailableLabel = 'Totales no disponibles.',\n amountUnavailableLabel = '—',\n retryLabel = 'Reintentar',\n onRetryTotals,\n promoCode,\n onPromoCodeChange,\n onApplyPromo,\n promoPending = false,\n promoApplyLabel = 'Aplicar',\n promoPlaceholder = 'Ingresa el código',\n trustNotes,\n formatMoney: formatMoneyProp,\n}: CheckoutForm1OrderSummaryProps) {\n const format = (value: Money | null | undefined) => formatMoney(value, formatMoneyProp)\n const lineAmount = (item: CheckoutForm1OrderSummaryItem): string | null => {\n // A supplied line total that is absent/malformed must not fall back to a\n // numeric guess; only an entirely absent line total uses the legacy field.\n if (item.lineTotal !== undefined) return format(item.lineTotal)\n if (typeof item.price === 'number') return `$${(item.price * item.quantity).toFixed(2)}`\n return null\n }\n\n const renderTotals = () => {\n if (totalsState === 'pending') {\n return <p className=\"text-muted-foreground text-sm\" aria-live=\"polite\">Actualizando totales…</p>\n }\n if (totalsState === 'error') {\n return (\n <div className=\"flex flex-col gap-2\" role=\"alert\">\n <p className=\"text-destructive text-sm\">{totalsErrorLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n\n const totals = orderSummary.totals\n if (totals) {\n const subtotalText = format(totals.subtotal)\n const totalText = format(totals.total)\n // Required totals: if either is absent/malformed, show an explicit\n // unavailable state (with recovery) rather than a fabricated zero.\n if (subtotalText === null || totalText === null) {\n return (\n <div className=\"flex flex-col gap-2\" role=\"status\">\n <p className=\"text-muted-foreground text-sm\">{totalsUnavailableLabel}</p>\n {onRetryTotals ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onRetryTotals}>\n {retryLabel}\n </Button>\n ) : null}\n </div>\n )\n }\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Subtotal</span>\n <span className=\"font-medium tabular-nums\">{subtotalText}</span>\n </div>\n {isAvailableMoney(totals.discount) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Descuento</span>\n <span className=\"font-medium tabular-nums\">{format(totals.discount)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.tax) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Impuestos</span>\n <span className=\"font-medium tabular-nums\">{format(totals.tax)}</span>\n </div>\n ) : null}\n {isAvailableMoney(totals.shipping) ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1.5 text-muted-foreground\">\n <Truck className=\"size-4\" />\n Envío\n </span>\n <span className=\"font-medium tabular-nums\">{format(totals.shipping)}</span>\n </div>\n ) : null}\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">Total</span>\n <span className=\"font-semibold tabular-nums\">{totalText}</span>\n </div>\n </div>\n )\n }\n\n // Legacy numeric fallback for consumers that have not moved to `totals`.\n const legacySubtotal = orderSummary.items.reduce(\n (sum, item) => sum + (item.price ?? 0) * item.quantity,\n 0\n )\n const legacyTotal =\n legacySubtotal +\n (orderSummary.shipping ?? 0) +\n (orderSummary.tax ?? 0) -\n (orderSummary.discount ?? 0) -\n (orderSummary.promoDiscount ?? 0)\n return (\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Subtotal</span>\n <span className=\"font-medium tabular-nums\">${legacySubtotal.toFixed(2)}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Envío</span>\n <span className=\"font-medium tabular-nums\">${(orderSummary.shipping ?? 0).toFixed(2)}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Impuestos</span>\n <span className=\"font-medium tabular-nums\">${(orderSummary.tax ?? 0).toFixed(2)}</span>\n </div>\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold\">Total</span>\n <span className=\"font-semibold tabular-nums\">${legacyTotal.toFixed(2)}</span>\n </div>\n </div>\n )\n }\n\n return (\n <Card className=\"sticky top-8\">\n <CardContent className=\"flex flex-col gap-4 p-6\">\n <CardTitle>Order Summary</CardTitle>\n\n <div className=\"flex flex-col gap-4\">\n {orderSummary.items.map((item) => {\n const amount = lineAmount(item)\n return (\n <div key={String(item.id)} className=\"flex items-center gap-3\">\n <div className=\"relative\">\n {item.image ? (\n <img\n src={item.image || undefined}\n alt={item.name}\n width={64}\n height={64}\n className=\"bg-muted size-16 rounded-lg object-cover\"\n />\n ) : (\n <div aria-hidden=\"true\" className=\"bg-muted size-16 rounded-lg\" />\n )}\n <Badge\n variant=\"secondary\"\n className=\"absolute -right-2 -top-2 size-6 justify-center rounded-full p-0 text-xs\"\n >\n {item.quantity}\n </Badge>\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{item.name}</p>\n {item.variant ? <p className=\"text-sm text-muted-foreground\">{item.variant}</p> : null}\n </div>\n <p className=\"text-sm font-medium tabular-nums\">{amount ?? amountUnavailableLabel}</p>\n </div>\n )\n })}\n </div>\n\n <Separator />\n\n {onPromoCodeChange ? (\n <Field className=\"gap-2\">\n <FieldLabel htmlFor=\"checkout-promo-code\">Código promocional</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"checkout-promo-code\"\n placeholder={promoPlaceholder}\n value={promoCode ?? ''}\n onChange={(e) => onPromoCodeChange(e.target.value)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={promoPending || !onApplyPromo}\n onClick={() => onApplyPromo?.(promoCode ?? '')}\n >\n {promoApplyLabel}\n </Button>\n </div>\n </Field>\n ) : null}\n\n <Separator />\n\n {renderTotals()}\n\n {trustNotes && trustNotes.length > 0 ? (\n <div className=\"flex flex-col gap-2 text-sm text-muted-foreground\">\n {trustNotes.map((note, index) => (\n <span key={`trust:${index}:${note}`} className=\"flex items-center gap-2\">\n <Shield className=\"size-4\" />\n {note}\n </span>\n ))}\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}\n\nexport default CheckoutForm1OrderSummary\n","'use client'\n\nimport { cn } from '../../../lib/utils'\n\nconst STEP_COUNT = 3\n\nexport interface CheckoutForm1ProgressProps {\n step: number\n}\n\nexport function CheckoutForm1Progress({ step }: CheckoutForm1ProgressProps) {\n return (\n <div className=\"flex items-center justify-center gap-2\">\n {Array.from({ length: STEP_COUNT }, (_, index) => {\n const current = index + 1\n const isDone = current <= step\n return (\n <div key={current} className=\"flex items-center gap-2\">\n {index > 0 && (\n <div aria-hidden=\"true\" className={cn('h-1 w-16', isDone ? 'bg-primary' : 'bg-muted')} />\n )}\n <div\n aria-current={current === step ? 'step' : undefined}\n className={cn(\n 'flex size-10 items-center justify-center rounded-full text-sm font-medium',\n isDone ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'\n )}\n >\n {current}\n </div>\n </div>\n )\n })}\n </div>\n )\n}","export function formatCardNumber(value: string, maxDigits = 16): string {\n const digits = value.replace(/\\D/g, '').slice(0, maxDigits)\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ')\n}\n\nexport function formatExpiryDate(value: string, maxDigits = 4): string {\n const digits = value.replace(/\\D/g, '').slice(0, maxDigits)\n return digits.length > 2 ? `${digits.slice(0, 2)}/${digits.slice(2)}` : digits\n}","'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { ArrowLeft, Lock, Package } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { CheckboxCheck } from './checkbox-check'\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport { formatCardNumber, formatExpiryDate } from './card-formatting'\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type { CheckoutFieldErrors } from './checkout-form-types'\n\nimport { CheckoutForm2OrderSummary } from './checkout-form-2-order-summary'\nimport { CheckoutForm2PaymentCard } from './checkout-form-2-payment-card'\nimport { CheckoutForm2ShippingCard } from './checkout-form-2-shipping-card'\n\nexport interface CheckoutForm2Item {\n id: string\n name: string\n price: number\n quantity: number\n image: string\n}\n\nexport interface CheckoutForm2CountryOption {\n value: string\n label: string\n}\n\nexport interface CheckoutForm2Data {\n email: string\n firstName: string\n lastName: string\n address: string\n city: string\n zipCode: string\n country: string\n saveInfo: boolean\n newsletter: boolean\n cardNumber: string\n expiryDate: string\n cvv: string\n cardName: string\n}\n\nexport type CheckoutForm2FieldErrors = CheckoutFieldErrors<keyof CheckoutForm2Data>\n\nexport type CheckoutForm2FieldDescriptions = Partial<\n Record<keyof CheckoutForm2Data, string>\n>\n\nexport interface CheckoutForm2Totals {\n subtotal: number\n shipping: number\n tax: number\n total: number\n}\n\nexport interface CheckoutForm2Props {\n items: CheckoutForm2Item[]\n countryOptions?: CheckoutForm2CountryOption[]\n paymentMethods?: PaymentMethod[]\n noMethodsLabel?: string\n taxRate?: number\n shippingCost?: number\n freeShippingThreshold?: number\n currencySymbol?: string\n titleLabel?: string\n descriptionLabel?: string\n backToCartLabel?: string\n completeOrderLabel?: string\n contactLabel?: string\n emailLabel?: string\n emailPlaceholder?: string\n newsletterLabel?: string\n shippingAddressLabel?: string\n firstNameLabel?: string\n lastNameLabel?: string\n addressLabel?: string\n cityLabel?: string\n zipCodeLabel?: string\n countryLabel?: string\n saveInfoLabel?: string\n paymentLabel?: string\n cardNumberLabel?: string\n expiryLabel?: string\n cvvLabel?: string\n cardNameLabel?: string\n encryptedNoteLabel?: string\n orderSummaryLabel?: string\n subtotalLabel?: string\n shippingLineLabel?: string\n freeShippingLineLabel?: string\n taxLabel?: string\n totalLabel?: string\n freeShippingNoteLabel?: string\n estimatedDeliveryLabel?: string\n values: CheckoutForm2Data\n onChange: (field: keyof CheckoutForm2Data, value: string | boolean) => void\n fieldErrors?: CheckoutForm2FieldErrors\n fieldDescriptions?: CheckoutForm2FieldDescriptions\n onBackToCart?: () => void\n onCompleteOrder?: (data: CheckoutForm2Data, totals: CheckoutForm2Totals) => void\n}\n\nconst DEFAULT_COUNTRY_OPTIONS: CheckoutForm2CountryOption[] = [\n { value: 'US', label: 'Estados Unidos' },\n { value: 'CA', label: 'Canadá' },\n { value: 'UK', label: 'Reino Unido' },\n { value: 'AU', label: 'Australia' },\n]\n\nexport function CheckoutForm2({\n items,\n countryOptions = DEFAULT_COUNTRY_OPTIONS,\n paymentMethods = [],\n noMethodsLabel,\n taxRate = 0.08,\n shippingCost = 9.99,\n freeShippingThreshold = 75,\n currencySymbol = '$',\n titleLabel = 'Finalizar compra',\n descriptionLabel = 'Completa tu pedido de forma segura',\n backToCartLabel = 'Volver al carrito',\n completeOrderLabel = 'Completar pedido',\n contactLabel = 'Información de contacto',\n emailLabel = 'Correo electrónico',\n emailPlaceholder = 'tucorreo@ejemplo.com',\n newsletterLabel = 'Quiero recibir novedades y ofertas',\n shippingAddressLabel = 'Dirección de envío',\n firstNameLabel = 'Nombre',\n lastNameLabel = 'Apellido',\n addressLabel = 'Dirección',\n cityLabel = 'Ciudad',\n zipCodeLabel = 'Código postal',\n countryLabel = 'País',\n saveInfoLabel = 'Guardar esta información para la próxima vez',\n paymentLabel = 'Método de pago',\n cardNumberLabel = 'Número de tarjeta',\n expiryLabel = 'Fecha de vencimiento',\n cvvLabel = 'CVV',\n cardNameLabel = 'Nombre en la tarjeta',\n encryptedNoteLabel = 'Tu información de pago está cifrada y segura',\n orderSummaryLabel = 'Resumen del pedido',\n subtotalLabel = 'Subtotal',\n shippingLineLabel = 'Envío',\n freeShippingLineLabel = 'Gratis',\n taxLabel = 'Impuestos',\n totalLabel = 'Total',\n freeShippingNoteLabel = 'Envío gratis en pedidos superiores a',\n estimatedDeliveryLabel = 'Entrega estimada: 3-5 días hábiles',\n values,\n onChange,\n fieldErrors,\n fieldDescriptions,\n onBackToCart,\n onCompleteOrder,\n}: CheckoutForm2Props) {\n const [paymentMethod, setPaymentMethod] = useState(paymentMethods[0]?.id ?? '')\n\n const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0)\n const shipping = subtotal >= freeShippingThreshold ? 0 : shippingCost\n const tax = subtotal * taxRate\n const total = subtotal + shipping + tax\n\n const handleCardNumberChange = (value: string) => {\n onChange('cardNumber', formatCardNumber(value))\n }\n\n const handleExpiryChange = (value: string) => {\n onChange('expiryDate', formatExpiryDate(value))\n }\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault()\n onCompleteOrder?.(values, { subtotal, shipping, tax, total })\n }\n\n return (\n <section className='py-8'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='mb-8'>\n <Button\n type='button'\n variant='secondary'\n size='sm'\n className='mb-4 h-8 px-3 text-xs cursor-pointer'\n onClick={onBackToCart}\n >\n <ArrowLeft />\n {backToCartLabel}\n </Button>\n <h1 className='text-3xl font-bold tracking-tight text-balance'>{titleLabel}</h1>\n <p className='text-muted-foreground mt-2'>{descriptionLabel}</p>\n </div>\n\n <div className='grid gap-8 lg:grid-cols-3'>\n <div className='order-2 lg:order-1 lg:col-span-2'>\n <form onSubmit={handleSubmit} className='flex flex-col gap-8'>\n <Card>\n <CardHeader>\n <CardTitle className='flex items-center gap-2'>\n <Package className='size-5' aria-hidden='true' />\n {contactLabel}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <FieldGroup>\n <Field data-invalid={!!fieldErrors?.email?.length}>\n <FieldLabel htmlFor='email'>{emailLabel}</FieldLabel>\n <Input\n id='email'\n type='text'\n inputMode='email'\n placeholder={emailPlaceholder}\n value={values.email}\n onChange={event => onChange('email', event.target.value)}\n {...checkoutFieldAria('email', fieldErrors?.email)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='email'\n errors={fieldErrors?.email}\n description={fieldDescriptions?.email}\n />\n </Field>\n <Field orientation='horizontal'>\n <CheckboxCheck\n id='newsletter'\n checked={values.newsletter}\n onCheckedChange={checked => onChange('newsletter', checked as boolean)}\n />\n <FieldLabel htmlFor='newsletter' className='text-sm font-normal'>\n {newsletterLabel}\n </FieldLabel>\n </Field>\n </FieldGroup>\n </CardContent>\n </Card>\n\n <CheckoutForm2ShippingCard\n data={values}\n onChange={onChange}\n countryOptions={countryOptions}\n shippingAddressLabel={shippingAddressLabel}\n firstNameLabel={firstNameLabel}\n lastNameLabel={lastNameLabel}\n addressLabel={addressLabel}\n cityLabel={cityLabel}\n zipCodeLabel={zipCodeLabel}\n countryLabel={countryLabel}\n saveInfoLabel={saveInfoLabel}\n fieldErrors={fieldErrors}\n fieldDescriptions={fieldDescriptions}\n />\n\n <CheckoutForm2PaymentCard\n paymentMethod={paymentMethod}\n onPaymentMethodChange={setPaymentMethod}\n data={values}\n onChange={onChange}\n onCardNumberChange={handleCardNumberChange}\n onExpiryChange={handleExpiryChange}\n paymentMethods={paymentMethods}\n noMethodsLabel={noMethodsLabel}\n paymentLabel={paymentLabel}\n cardNumberLabel={cardNumberLabel}\n expiryLabel={expiryLabel}\n cvvLabel={cvvLabel}\n cardNameLabel={cardNameLabel}\n encryptedNoteLabel={encryptedNoteLabel}\n fieldErrors={fieldErrors}\n fieldDescriptions={fieldDescriptions}\n />\n\n <Button type='submit' size='lg' className='h-10 px-8 w-full cursor-pointer'>\n <Lock />\n {completeOrderLabel} • {currencySymbol}\n {total.toFixed(2)}\n </Button>\n </form>\n </div>\n\n <div className='order-1 lg:order-2 lg:col-span-1'>\n <CheckoutForm2OrderSummary\n items={items}\n subtotal={subtotal}\n shipping={shipping}\n tax={tax}\n total={total}\n currencySymbol={currencySymbol}\n orderSummaryLabel={orderSummaryLabel}\n subtotalLabel={subtotalLabel}\n shippingLabel={shippingLineLabel}\n freeShippingLabel={freeShippingLineLabel}\n taxLabel={taxLabel}\n totalLabel={totalLabel}\n freeShippingNoteLabel={freeShippingNoteLabel}\n estimatedDeliveryLabel={estimatedDeliveryLabel}\n freeShippingThreshold={freeShippingThreshold}\n />\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport default CheckoutForm2","import { Truck } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Separator } from '../../../ui/separator'\nimport type { CheckoutForm2Item } from './checkout-form-2'\n\ninterface CheckoutForm2OrderSummaryProps {\n items: CheckoutForm2Item[]\n subtotal: number\n shipping: number\n tax: number\n total: number\n currencySymbol: string\n orderSummaryLabel: string\n subtotalLabel: string\n shippingLabel: string\n freeShippingLabel: string\n taxLabel: string\n totalLabel: string\n freeShippingNoteLabel: string\n estimatedDeliveryLabel: string\n freeShippingThreshold: number\n}\n\nexport function CheckoutForm2OrderSummary({\n items,\n subtotal,\n shipping,\n tax,\n total,\n currencySymbol,\n orderSummaryLabel,\n subtotalLabel,\n shippingLabel,\n freeShippingLabel,\n taxLabel,\n totalLabel,\n freeShippingNoteLabel,\n estimatedDeliveryLabel,\n freeShippingThreshold,\n}: CheckoutForm2OrderSummaryProps) {\n return (\n <Card className='sticky top-6'>\n <CardHeader>\n <CardTitle>{orderSummaryLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-4'>\n <div className='flex flex-col gap-3'>\n {items.map(item => (\n <div key={item.id} className='flex items-center gap-3'>\n <div className='relative'>\n <img\n src={item.image || undefined}\n alt={item.name}\n width={48}\n height={48}\n className='size-12 rounded-md object-cover'\n />\n <Badge\n variant='secondary'\n className='absolute -top-2 -end-2 size-5 rounded-full p-0 text-xs font-semibold'\n >\n {item.quantity}\n </Badge>\n </div>\n <div className='flex-1'>\n <h4 className='text-sm font-medium'>{item.name}</h4>\n <p className='text-muted-foreground text-sm'>\n {currencySymbol}\n {item.price} × {item.quantity}\n </p>\n </div>\n <div className='text-sm font-medium'>\n {currencySymbol}\n {(item.price * item.quantity).toFixed(2)}\n </div>\n </div>\n ))}\n </div>\n\n <Separator />\n\n <div className='flex flex-col gap-2 text-sm'>\n <div className='flex justify-between'>\n <span>{subtotalLabel}</span>\n <span>\n {currencySymbol}\n {subtotal.toFixed(2)}\n </span>\n </div>\n <div className='flex justify-between'>\n <span>{shippingLabel}</span>\n <span>{shipping === 0 ? freeShippingLabel : `${currencySymbol}${shipping.toFixed(2)}`}</span>\n </div>\n <div className='flex justify-between'>\n <span>{taxLabel}</span>\n <span>\n {currencySymbol}\n {tax.toFixed(2)}\n </span>\n </div>\n </div>\n\n <Separator />\n\n <div className='flex justify-between text-lg font-semibold'>\n <span>{totalLabel}</span>\n <span>\n {currencySymbol}\n {total.toFixed(2)}\n </span>\n </div>\n\n {shipping === 0 ? (\n <div className='bg-muted/50 rounded-lg p-3 text-sm'>\n <div className='flex items-center gap-2 font-medium'>\n <Truck className='size-4' aria-hidden='true' />\n <span>\n {freeShippingNoteLabel} {currencySymbol}\n {freeShippingThreshold}\n </span>\n </div>\n <p className='text-muted-foreground mt-1'>{estimatedDeliveryLabel}</p>\n </div>\n ) : null}\n </CardContent>\n </Card>\n )\n}","import { CreditCard, Shield } from 'lucide-react'\n\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type {\n CheckoutForm2Data,\n CheckoutForm2FieldDescriptions,\n CheckoutForm2FieldErrors,\n} from './checkout-form-2'\n\ninterface CheckoutForm2PaymentCardProps {\n paymentMethod: string\n onPaymentMethodChange: (method: string) => void\n data: CheckoutForm2Data\n onChange: (field: keyof CheckoutForm2Data, value: string | boolean) => void\n onCardNumberChange: (value: string) => void\n onExpiryChange: (value: string) => void\n paymentMethods?: PaymentMethod[]\n noMethodsLabel?: string\n paymentLabel: string\n cardNumberLabel: string\n expiryLabel: string\n cvvLabel: string\n cardNameLabel: string\n encryptedNoteLabel: string\n fieldErrors?: CheckoutForm2FieldErrors\n fieldDescriptions?: CheckoutForm2FieldDescriptions\n}\n\nexport function CheckoutForm2PaymentCard({\n paymentMethod,\n onPaymentMethodChange,\n data,\n onChange,\n onCardNumberChange,\n onExpiryChange,\n paymentMethods = [],\n noMethodsLabel = 'No hay métodos de pago disponibles para esta región.',\n paymentLabel,\n cardNumberLabel,\n expiryLabel,\n cvvLabel,\n cardNameLabel,\n encryptedNoteLabel,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutForm2PaymentCardProps) {\n const selectedMethod = paymentMethods.find(method => method.id === paymentMethod)\n const isCard = selectedMethod?.type === 'card'\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className='flex items-center gap-2'>\n <CreditCard className='size-5' aria-hidden='true' />\n {paymentLabel}\n </CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-4'>\n {paymentMethods.length === 0 ? (\n <p className='text-muted-foreground text-sm'>{noMethodsLabel}</p>\n ) : (\n <RadioGroup value={paymentMethod} onValueChange={value => value && onPaymentMethodChange(value)}>\n {paymentMethods.map(method => (\n <Field key={method.id} orientation='horizontal'>\n <RadioGroupItem value={method.id} id={method.id} />\n <FieldLabel htmlFor={method.id} className='flex flex-col gap-0.5 font-normal'>\n <span className='flex items-center gap-2'>\n <CreditCard className='size-4' aria-hidden='true' />\n {method.name}\n </span>\n {method.description ? (\n <span className='text-muted-foreground text-xs'>{method.description}</span>\n ) : null}\n </FieldLabel>\n </Field>\n ))}\n </RadioGroup>\n )}\n\n {selectedMethod && !isCard ? (\n <div className='bg-muted/50 rounded-lg p-4 text-sm'>\n <p className='font-medium'>{selectedMethod.name}</p>\n {selectedMethod.description ? <p className='text-muted-foreground mt-1'>{selectedMethod.description}</p> : null}\n </div>\n ) : null}\n\n {isCard ? (\n <div className='border-muted border-l-2 ps-6'>\n <FieldGroup>\n <Field data-invalid={!!fieldErrors?.cardNumber?.length}>\n <FieldLabel htmlFor='cardNumber'>{cardNumberLabel}</FieldLabel>\n <Input\n id='cardNumber'\n placeholder='1234 5678 9012 3456'\n inputMode='numeric'\n value={data.cardNumber}\n onChange={event => onCardNumberChange(event.target.value)}\n {...checkoutFieldAria('cardNumber', fieldErrors?.cardNumber)}\n className='h-9 font-mono'\n />\n <CheckoutFieldFeedback\n id='cardNumber'\n errors={fieldErrors?.cardNumber}\n description={fieldDescriptions?.cardNumber}\n />\n </Field>\n <div className='grid gap-4 sm:grid-cols-2 md:grid-cols-3'>\n <Field data-invalid={!!fieldErrors?.expiryDate?.length} className='sm:col-span-2'>\n <FieldLabel htmlFor='expiryDate'>{expiryLabel}</FieldLabel>\n <Input\n id='expiryDate'\n placeholder='MM/AA'\n inputMode='numeric'\n value={data.expiryDate}\n onChange={event => onExpiryChange(event.target.value)}\n {...checkoutFieldAria('expiryDate', fieldErrors?.expiryDate)}\n className='h-9 font-mono'\n />\n <CheckoutFieldFeedback\n id='expiryDate'\n errors={fieldErrors?.expiryDate}\n description={fieldDescriptions?.expiryDate}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.cvv?.length}>\n <FieldLabel htmlFor='cvv'>{cvvLabel}</FieldLabel>\n <Input\n id='cvv'\n placeholder='123'\n inputMode='numeric'\n value={data.cvv}\n onChange={event => onChange('cvv', event.target.value)}\n {...checkoutFieldAria('cvv', fieldErrors?.cvv)}\n className='h-9 font-mono'\n />\n <CheckoutFieldFeedback\n id='cvv'\n errors={fieldErrors?.cvv}\n description={fieldDescriptions?.cvv}\n />\n </Field>\n </div>\n <Field data-invalid={!!fieldErrors?.cardName?.length}>\n <FieldLabel htmlFor='cardName'>{cardNameLabel}</FieldLabel>\n <Input\n id='cardName'\n placeholder='Juan Pérez'\n value={data.cardName}\n onChange={event => onChange('cardName', event.target.value)}\n {...checkoutFieldAria('cardName', fieldErrors?.cardName)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='cardName'\n errors={fieldErrors?.cardName}\n description={fieldDescriptions?.cardName}\n />\n </Field>\n </FieldGroup>\n </div>\n ) : null}\n\n <div className='bg-muted/50 flex items-center gap-2 rounded-lg p-3 text-sm'>\n <Shield className='size-4 text-success' aria-hidden='true' />\n <span>{encryptedNoteLabel}</span>\n </div>\n </CardContent>\n </Card>\n )\n}","import { Truck } from 'lucide-react'\n\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { CheckboxCheck } from './checkbox-check'\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../../../ui/select'\nimport { CheckoutFieldFeedback, checkoutFieldAria } from './checkout-field-feedback'\nimport type {\n CheckoutForm2CountryOption,\n CheckoutForm2Data,\n CheckoutForm2FieldDescriptions,\n CheckoutForm2FieldErrors,\n} from './checkout-form-2'\n\ninterface CheckoutForm2ShippingCardProps {\n data: CheckoutForm2Data\n onChange: (field: keyof CheckoutForm2Data, value: string | boolean) => void\n countryOptions: CheckoutForm2CountryOption[]\n shippingAddressLabel: string\n firstNameLabel: string\n lastNameLabel: string\n addressLabel: string\n cityLabel: string\n zipCodeLabel: string\n countryLabel: string\n saveInfoLabel: string\n fieldErrors?: CheckoutForm2FieldErrors\n fieldDescriptions?: CheckoutForm2FieldDescriptions\n}\n\nconst countryLabelFor = (value: string, options: CheckoutForm2CountryOption[]) =>\n options.find(option => option.value === value)?.label ?? value\n\nexport function CheckoutForm2ShippingCard({\n data,\n onChange,\n countryOptions,\n shippingAddressLabel,\n firstNameLabel,\n lastNameLabel,\n addressLabel,\n cityLabel,\n zipCodeLabel,\n countryLabel,\n saveInfoLabel,\n fieldErrors,\n fieldDescriptions,\n}: CheckoutForm2ShippingCardProps) {\n return (\n <Card>\n <CardHeader>\n <CardTitle className='flex items-center gap-2'>\n <Truck className='size-5' aria-hidden='true' />\n {shippingAddressLabel}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <FieldGroup>\n <div className='grid gap-4 sm:grid-cols-2'>\n <Field data-invalid={!!fieldErrors?.firstName?.length}>\n <FieldLabel htmlFor='firstName'>{firstNameLabel}</FieldLabel>\n <Input\n id='firstName'\n placeholder='Juan'\n value={data.firstName}\n onChange={event => onChange('firstName', event.target.value)}\n {...checkoutFieldAria('firstName', fieldErrors?.firstName)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='firstName'\n errors={fieldErrors?.firstName}\n description={fieldDescriptions?.firstName}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.lastName?.length}>\n <FieldLabel htmlFor='lastName'>{lastNameLabel}</FieldLabel>\n <Input\n id='lastName'\n placeholder='Pérez'\n value={data.lastName}\n onChange={event => onChange('lastName', event.target.value)}\n {...checkoutFieldAria('lastName', fieldErrors?.lastName)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='lastName'\n errors={fieldErrors?.lastName}\n description={fieldDescriptions?.lastName}\n />\n </Field>\n </div>\n\n <Field data-invalid={!!fieldErrors?.address?.length}>\n <FieldLabel htmlFor='address'>{addressLabel}</FieldLabel>\n <Input\n id='address'\n placeholder='Calle Principal 123'\n value={data.address}\n onChange={event => onChange('address', event.target.value)}\n {...checkoutFieldAria('address', fieldErrors?.address)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='address'\n errors={fieldErrors?.address}\n description={fieldDescriptions?.address}\n />\n </Field>\n\n <div className='grid gap-4 sm:grid-cols-2 md:grid-cols-3'>\n <Field data-invalid={!!fieldErrors?.city?.length}>\n <FieldLabel htmlFor='city'>{cityLabel}</FieldLabel>\n <Input\n id='city'\n placeholder='Madrid'\n value={data.city}\n onChange={event => onChange('city', event.target.value)}\n {...checkoutFieldAria('city', fieldErrors?.city)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='city'\n errors={fieldErrors?.city}\n description={fieldDescriptions?.city}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.zipCode?.length}>\n <FieldLabel htmlFor='zipCode'>{zipCodeLabel}</FieldLabel>\n <Input\n id='zipCode'\n placeholder='28001'\n value={data.zipCode}\n onChange={event => onChange('zipCode', event.target.value)}\n {...checkoutFieldAria('zipCode', fieldErrors?.zipCode)}\n className='h-9'\n />\n <CheckoutFieldFeedback\n id='zipCode'\n errors={fieldErrors?.zipCode}\n description={fieldDescriptions?.zipCode}\n />\n </Field>\n <Field data-invalid={!!fieldErrors?.country?.length}>\n <FieldLabel htmlFor='country'>{countryLabel}</FieldLabel>\n <Select value={data.country} onValueChange={value => value && onChange('country', value)}>\n <SelectTrigger id='country' {...checkoutFieldAria('country', fieldErrors?.country)} className='w-full'>\n <SelectValue>{countryLabelFor(data.country, countryOptions)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {countryOptions.map(country => (\n <SelectItem key={country.value} value={country.value}>\n {country.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n <CheckoutFieldFeedback\n id='country'\n errors={fieldErrors?.country}\n description={fieldDescriptions?.country}\n />\n </Field>\n </div>\n\n <Field orientation='horizontal'>\n <CheckboxCheck\n id='saveInfo'\n checked={data.saveInfo}\n onCheckedChange={checked => onChange('saveInfo', checked as boolean)}\n />\n <FieldLabel htmlFor='saveInfo' className='text-sm font-normal'>\n {saveInfoLabel}\n </FieldLabel>\n </Field>\n </FieldGroup>\n </CardContent>\n </Card>\n )\n}","'use client'\n\nimport { useState } from 'react'\nimport { ChevronLeft, ChevronRight, Lock } from 'lucide-react'\n\nimport type { PaymentMethod } from '@thorprovider/types'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\n\nimport { CheckoutForm3InformationStep } from './checkout-form-3-information-step'\nimport { CheckoutForm3OrderSummary } from './checkout-form-3-order-summary'\nimport { CheckoutForm3PaymentStep } from './checkout-form-3-payment-step'\nimport { CheckoutForm3Progress, CHECKOUT_FORM_3_STEP_ICONS } from './checkout-form-3-progress'\nimport { CheckoutForm3ReviewStep } from './checkout-form-3-review-step'\nimport { CheckoutForm3ShippingStep } from './checkout-form-3-shipping-step'\n\nexport interface CheckoutForm3CartItem {\n id: number\n name: string\n price: number\n quantity: number\n image: string\n}\n\nexport interface CheckoutForm3ShippingMethod {\n id: string\n name: string\n description: string\n cost: number\n}\n\nexport interface CheckoutForm3CountryOption {\n value: string\n label: string\n}\n\nexport interface CheckoutForm3Step {\n id: number\n name: string\n}\n\nexport interface CheckoutForm3FormData {\n email: string\n firstName: string\n lastName: string\n phone: string\n address: string\n apartment: string\n city: string\n state: string\n zipCode: string\n country: string\n shippingMethod: string\n paymentMethod: string\n cardNumber: string\n expiryDate: string\n cvv: string\n cardName: string\n billingAddress: string\n newsletter: boolean\n saveInfo: boolean\n}\n\nexport type CheckoutForm3ChangeHandler = (\n field: keyof CheckoutForm3FormData,\n value: string | boolean\n) => void\n\nexport interface CheckoutForm3Props {\n cartItems: CheckoutForm3CartItem[]\n shippingMethods: CheckoutForm3ShippingMethod[]\n paymentMethods?: PaymentMethod[]\n taxRate?: number\n countryOptions?: CheckoutForm3CountryOption[]\n steps?: CheckoutForm3Step[]\n currencySymbol?: string\n titleLabel?: string\n subtitleLabel?: string\n backLabel?: string\n continueLabel?: string\n placeOrderLabel?: string\n shippingAddressLabel?: string\n shippingMethodLabel?: string\n paymentLabel?: string\n noMethodsLabel?: string\n securePaymentLabel?: string\n emailLabel?: string\n firstNameLabel?: string\n lastNameLabel?: string\n phoneLabel?: string\n addressLabel?: string\n apartmentLabel?: string\n cityLabel?: string\n stateLabel?: string\n zipCodeLabel?: string\n countryLabel?: string\n cardNumberLabel?: string\n expiryLabel?: string\n cvvLabel?: string\n cardNameLabel?: string\n newsletterLabel?: string\n saveInfoLabel?: string\n orderSummaryLabel?: string\n subtotalLabel?: string\n shippingLabel?: string\n taxLabel?: string\n totalLabel?: string\n freeLabel?: string\n orderReviewLabel?: string\n contactReviewLabel?: string\n shipToReviewLabel?: string\n paymentReviewLabel?: string\n shippingReviewLabel?: string\n onComplete?: (data: CheckoutForm3FormData) => void\n onNextStep?: (step: number) => void\n onPreviousStep?: (step: number) => void\n onFieldChange?: CheckoutForm3ChangeHandler\n}\n\nconst DEFAULT_COUNTRY_OPTIONS: CheckoutForm3CountryOption[] = [\n { value: 'US', label: 'Estados Unidos' },\n { value: 'CA', label: 'Canadá' },\n { value: 'UK', label: 'Reino Unido' },\n { value: 'AU', label: 'Australia' },\n]\n\nconst DEFAULT_STEPS: CheckoutForm3Step[] = [\n { id: 1, name: 'Información' },\n { id: 2, name: 'Envío' },\n { id: 3, name: 'Pago' },\n { id: 4, name: 'Revisión' },\n]\n\nexport default function CheckoutForm3({\n cartItems,\n shippingMethods,\n paymentMethods = [],\n taxRate = 0,\n countryOptions = DEFAULT_COUNTRY_OPTIONS,\n steps = DEFAULT_STEPS,\n currencySymbol = '$',\n titleLabel = 'Checkout seguro',\n subtitleLabel,\n backLabel = 'Anterior',\n continueLabel = 'Continuar',\n placeOrderLabel = 'Realizar pedido',\n shippingAddressLabel = 'Dirección de envío',\n shippingMethodLabel = 'Método de envío',\n paymentLabel = 'Método de pago',\n noMethodsLabel = 'No hay métodos de pago disponibles para esta región.',\n securePaymentLabel = 'Tu información de pago está cifrada y es segura',\n emailLabel = 'Correo electrónico',\n firstNameLabel = 'Nombre',\n lastNameLabel = 'Apellidos',\n phoneLabel = 'Teléfono',\n addressLabel = 'Dirección',\n apartmentLabel = 'Apartamento, suite, etc.',\n cityLabel = 'Ciudad',\n stateLabel = 'Estado/Provincia',\n zipCodeLabel = 'Código postal',\n countryLabel = 'País',\n cardNumberLabel = 'Número de tarjeta',\n expiryLabel = 'Fecha de vencimiento',\n cvvLabel = 'CVV',\n cardNameLabel = 'Nombre en la tarjeta',\n newsletterLabel = 'Quiero recibir novedades y ofertas',\n saveInfoLabel = 'Guardar esta información para la próxima vez',\n orderSummaryLabel = 'Resumen del pedido',\n subtotalLabel = 'Subtotal',\n shippingLabel = 'Envío',\n taxLabel = 'Impuestos',\n totalLabel = 'Total',\n freeLabel = 'Gratis',\n orderReviewLabel = 'Revisión del pedido',\n contactReviewLabel = 'Contacto',\n shipToReviewLabel = 'Enviar a',\n paymentReviewLabel = 'Pago',\n shippingReviewLabel = 'Envío',\n onComplete,\n onNextStep,\n onPreviousStep,\n onFieldChange,\n}: CheckoutForm3Props) {\n const [currentStep, setCurrentStep] = useState(1)\n const [formData, setFormData] = useState<CheckoutForm3FormData>(() => ({\n email: '',\n firstName: '',\n lastName: '',\n phone: '',\n address: '',\n apartment: '',\n city: '',\n state: '',\n zipCode: '',\n country: countryOptions[0]?.value ?? '',\n shippingMethod: shippingMethods[0]?.id ?? '',\n paymentMethod: paymentMethods[0]?.id ?? '',\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n cardName: '',\n billingAddress: 'same',\n newsletter: false,\n saveInfo: false,\n }))\n\n const subtotal = cartItems.reduce((sum, item) => sum + item.price * item.quantity, 0)\n const shippingCosts = Object.fromEntries(\n shippingMethods.map(method => [method.id, method.cost]),\n ) as Record<string, number>\n const shipping = shippingCosts[formData.shippingMethod] ?? 0\n const tax = subtotal * taxRate\n const total = subtotal + shipping + tax\n\n const handleInputChange: CheckoutForm3ChangeHandler = (field, value) => {\n setFormData(prev => ({ ...prev, [field]: value }))\n onFieldChange?.(field, value)\n }\n\n const handleNextStep = () => {\n const next = Math.min(currentStep + 1, steps.length)\n setCurrentStep(next)\n onNextStep?.(next)\n }\n\n const handlePreviousStep = () => {\n const next = Math.max(currentStep - 1, 1)\n setCurrentStep(next)\n onPreviousStep?.(next)\n }\n\n /** Continue stays disabled until the fields this step is responsible for are filled in. */\n const isStepComplete = (stepNumber: number) => {\n if (stepNumber < currentStep) return true\n if (stepNumber === 1) return Boolean(formData.email && formData.firstName && formData.lastName)\n if (stepNumber === 2) return Boolean(formData.address && formData.city && formData.zipCode)\n if (stepNumber === 3) {\n const selectedMethod = paymentMethods.find(method => method.id === formData.paymentMethod)\n if (!formData.paymentMethod) return false\n return selectedMethod?.type === 'card' ? Boolean(formData.cardNumber) : true\n }\n return false\n }\n\n const CurrentStepIcon = CHECKOUT_FORM_3_STEP_ICONS[currentStep - 1]\n\n return (\n <section className='py-8'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='mb-8'>\n <h1 className='text-3xl font-bold tracking-tight text-balance'>{titleLabel}</h1>\n <p className='text-muted-foreground mt-2'>\n {subtitleLabel ?? `Completa tu compra en ${steps.length} sencillos pasos`}\n </p>\n </div>\n\n <div className='grid gap-8 lg:grid-cols-3'>\n <div className='lg:col-span-2'>\n <CheckoutForm3Progress\n steps={steps}\n currentStep={currentStep}\n isStepComplete={isStepComplete}\n />\n\n <Card>\n <CardHeader>\n <CardTitle className='flex items-center gap-2'>\n {CurrentStepIcon ? <CurrentStepIcon className='size-5' aria-hidden='true' /> : null}\n {steps[currentStep - 1].name}\n </CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-6'>\n {currentStep === 1 ? (\n <CheckoutForm3InformationStep\n formData={formData}\n onChange={handleInputChange}\n emailLabel={emailLabel}\n firstNameLabel={firstNameLabel}\n lastNameLabel={lastNameLabel}\n phoneLabel={phoneLabel}\n newsletterLabel={newsletterLabel}\n />\n ) : null}\n\n {currentStep === 2 ? (\n <CheckoutForm3ShippingStep\n formData={formData}\n onChange={handleInputChange}\n countryOptions={countryOptions}\n shippingMethods={shippingMethods}\n shippingAddressLabel={shippingAddressLabel}\n shippingMethodLabel={shippingMethodLabel}\n addressLabel={addressLabel}\n apartmentLabel={apartmentLabel}\n cityLabel={cityLabel}\n stateLabel={stateLabel}\n zipCodeLabel={zipCodeLabel}\n countryLabel={countryLabel}\n freeLabel={freeLabel}\n currencySymbol={currencySymbol}\n />\n ) : null}\n\n {currentStep === 3 ? (\n <CheckoutForm3PaymentStep\n formData={formData}\n onChange={handleInputChange}\n paymentMethods={paymentMethods}\n paymentLabel={paymentLabel}\n noMethodsLabel={noMethodsLabel}\n cardNumberLabel={cardNumberLabel}\n expiryLabel={expiryLabel}\n cvvLabel={cvvLabel}\n cardNameLabel={cardNameLabel}\n securePaymentLabel={securePaymentLabel}\n />\n ) : null}\n\n {currentStep === 4 ? (\n <CheckoutForm3ReviewStep\n formData={formData}\n onChange={handleInputChange}\n shippingMethods={shippingMethods}\n paymentMethods={paymentMethods}\n orderReviewLabel={orderReviewLabel}\n contactReviewLabel={contactReviewLabel}\n shipToReviewLabel={shipToReviewLabel}\n paymentReviewLabel={paymentReviewLabel}\n shippingReviewLabel={shippingReviewLabel}\n saveInfoLabel={saveInfoLabel}\n />\n ) : null}\n\n <div className='flex justify-between pt-6'>\n <Button\n type='button'\n variant='outline'\n className='h-9 px-4 py-2 cursor-pointer'\n onClick={handlePreviousStep}\n disabled={currentStep === 1}\n >\n <ChevronLeft data-icon='inline-start' />\n {backLabel}\n </Button>\n\n {currentStep < steps.length ? (\n <Button\n type='button'\n onClick={handleNextStep}\n className='h-9 px-4 py-2 cursor-pointer'\n disabled={!isStepComplete(currentStep)}\n >\n {continueLabel}\n <ChevronRight data-icon='inline-end' />\n </Button>\n ) : (\n <Button\n type='button'\n className='h-9 px-4 py-2 min-w-32 cursor-pointer'\n onClick={() => onComplete?.(formData)}\n >\n <Lock data-icon='inline-start' />\n {placeOrderLabel}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className='lg:col-span-1'>\n <CheckoutForm3OrderSummary\n items={cartItems}\n subtotal={subtotal}\n shipping={shipping}\n tax={tax}\n total={total}\n currencySymbol={currencySymbol}\n orderSummaryLabel={orderSummaryLabel}\n subtotalLabel={subtotalLabel}\n shippingLabel={shippingLabel}\n taxLabel={taxLabel}\n totalLabel={totalLabel}\n freeLabel={freeLabel}\n />\n </div>\n </div>\n </div>\n </section>\n )\n}","'use client'\n\nimport { CheckboxCheck } from './checkbox-check'\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\n\nimport type { CheckoutForm3ChangeHandler, CheckoutForm3FormData } from './checkout-form-3'\n\ninterface CheckoutForm3InformationStepProps {\n formData: CheckoutForm3FormData\n onChange: CheckoutForm3ChangeHandler\n emailLabel: string\n firstNameLabel: string\n lastNameLabel: string\n phoneLabel: string\n newsletterLabel: string\n}\n\nexport function CheckoutForm3InformationStep({\n formData,\n onChange,\n emailLabel,\n firstNameLabel,\n lastNameLabel,\n phoneLabel,\n newsletterLabel,\n}: CheckoutForm3InformationStepProps) {\n return (\n <FieldGroup>\n <Field>\n <FieldLabel htmlFor='email'>{emailLabel} *</FieldLabel>\n <Input\n id='email'\n type='email'\n placeholder='tucorreo@ejemplo.com'\n value={formData.email}\n onChange={event => onChange('email', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n\n <div className='grid gap-4 sm:grid-cols-2'>\n <Field>\n <FieldLabel htmlFor='firstName'>{firstNameLabel} *</FieldLabel>\n <Input\n id='firstName'\n placeholder='Juan'\n value={formData.firstName}\n onChange={event => onChange('firstName', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n <Field>\n <FieldLabel htmlFor='lastName'>{lastNameLabel} *</FieldLabel>\n <Input\n id='lastName'\n placeholder='Pérez'\n value={formData.lastName}\n onChange={event => onChange('lastName', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n </div>\n\n <Field>\n <FieldLabel htmlFor='phone'>{phoneLabel}</FieldLabel>\n <Input\n id='phone'\n placeholder='+34 600 123 456'\n value={formData.phone}\n onChange={event => onChange('phone', event.target.value)}\n className='h-9'\n />\n </Field>\n\n <Field orientation='horizontal'>\n <CheckboxCheck\n id='newsletterCheck'\n checked={formData.newsletter}\n onCheckedChange={checked => onChange('newsletter', checked as boolean)}\n />\n <FieldLabel htmlFor='newsletterCheck' className='text-sm font-normal'>\n {newsletterLabel}\n </FieldLabel>\n </Field>\n </FieldGroup>\n )\n}","import { Badge } from '../../../ui/badge'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Separator } from '../../../ui/separator'\n\nimport type { CheckoutForm3CartItem } from './checkout-form-3'\n\ninterface CheckoutForm3OrderSummaryProps {\n items: CheckoutForm3CartItem[]\n subtotal: number\n shipping: number\n tax: number\n total: number\n currencySymbol: string\n orderSummaryLabel: string\n subtotalLabel: string\n shippingLabel: string\n taxLabel: string\n totalLabel: string\n freeLabel: string\n}\n\nexport function CheckoutForm3OrderSummary({\n items,\n subtotal,\n shipping,\n tax,\n total,\n currencySymbol,\n orderSummaryLabel,\n subtotalLabel,\n shippingLabel,\n taxLabel,\n totalLabel,\n freeLabel,\n}: CheckoutForm3OrderSummaryProps) {\n return (\n <Card className='sticky top-6'>\n <CardHeader>\n <CardTitle>{orderSummaryLabel}</CardTitle>\n </CardHeader>\n <CardContent className='flex flex-col gap-4'>\n <div className='flex flex-col gap-3'>\n {items.map(item => (\n <div key={item.id} className='flex items-center gap-3'>\n <div className='relative'>\n <img\n src={item.image || undefined}\n alt={item.name}\n width={48}\n height={48}\n className='size-12 rounded-md object-cover'\n />\n <Badge\n variant='secondary'\n className='px-2.5 py-0.5 font-semibold absolute -top-2 -end-2 size-5 rounded-full p-0 text-xs'\n >\n {item.quantity}\n </Badge>\n </div>\n <div className='flex-1'>\n <h4 className='text-sm font-medium'>{item.name}</h4>\n <p className='text-muted-foreground text-sm'>\n {currencySymbol}\n {item.price}\n </p>\n </div>\n <div className='text-sm font-medium'>\n {currencySymbol}\n {(item.price * item.quantity).toFixed(2)}\n </div>\n </div>\n ))}\n </div>\n\n <Separator />\n\n <div className='flex flex-col gap-2 text-sm'>\n <div className='flex justify-between'>\n <span>{subtotalLabel}</span>\n <span>\n {currencySymbol}\n {subtotal.toFixed(2)}\n </span>\n </div>\n <div className='flex justify-between'>\n <span>{shippingLabel}</span>\n <span>{shipping === 0 ? freeLabel : `${currencySymbol}${shipping.toFixed(2)}`}</span>\n </div>\n <div className='flex justify-between'>\n <span>{taxLabel}</span>\n <span>\n {currencySymbol}\n {tax.toFixed(2)}\n </span>\n </div>\n </div>\n\n <Separator />\n\n <div className='flex justify-between text-lg font-semibold'>\n <span>{totalLabel}</span>\n <span>\n {currencySymbol}\n {total.toFixed(2)}\n </span>\n </div>\n </CardContent>\n </Card>\n )\n}","'use client'\n\nimport { CreditCard, Shield } from 'lucide-react'\n\nimport { Field, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\n\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type { CheckoutForm3ChangeHandler, CheckoutForm3FormData } from './checkout-form-3'\n\ninterface CheckoutForm3PaymentStepProps {\n formData: CheckoutForm3FormData\n onChange: CheckoutForm3ChangeHandler\n paymentMethods: PaymentMethod[]\n paymentLabel: string\n noMethodsLabel: string\n cardNumberLabel: string\n expiryLabel: string\n cvvLabel: string\n cardNameLabel: string\n securePaymentLabel: string\n}\n\nexport function CheckoutForm3PaymentStep({\n formData,\n onChange,\n paymentMethods,\n paymentLabel,\n noMethodsLabel,\n cardNumberLabel,\n expiryLabel,\n cvvLabel,\n cardNameLabel,\n securePaymentLabel,\n}: CheckoutForm3PaymentStepProps) {\n const selectedMethod = paymentMethods.find(method => method.id === formData.paymentMethod)\n const isCard = selectedMethod?.type === 'card'\n\n return (\n <div className='flex flex-col gap-6'>\n <FieldSet className='gap-4'>\n <FieldLegend className='flex items-center gap-2 text-base font-medium'>\n <CreditCard className='size-4' aria-hidden='true' />\n {paymentLabel}\n </FieldLegend>\n\n {paymentMethods.length === 0 ? (\n <p className='text-muted-foreground text-sm'>{noMethodsLabel}</p>\n ) : (\n <RadioGroup value={formData.paymentMethod} onValueChange={value => value && onChange('paymentMethod', value)}>\n {paymentMethods.map(method => (\n <Field key={method.id} orientation='horizontal' className='rounded-lg border p-4'>\n <RadioGroupItem value={method.id} id={method.id} />\n <FieldLabel htmlFor={method.id} className='flex flex-1 flex-col gap-0.5 font-normal'>\n <span className='flex items-center gap-2'>\n {method.logo ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={method.logo} alt='' className='size-4 object-contain' />\n ) : (\n <CreditCard className='size-4' aria-hidden='true' />\n )}\n {method.name}\n </span>\n {method.description ? (\n <span className='text-muted-foreground text-xs'>{method.description}</span>\n ) : null}\n </FieldLabel>\n </Field>\n ))}\n </RadioGroup>\n )}\n </FieldSet>\n\n {selectedMethod && !isCard ? (\n <div className='bg-muted/50 rounded-lg p-4 text-sm'>\n <p className='font-medium'>{selectedMethod.name}</p>\n {selectedMethod.description ? <p className='text-muted-foreground mt-1'>{selectedMethod.description}</p> : null}\n </div>\n ) : null}\n\n {isCard ? (\n <div className='rounded-lg border p-4'>\n <FieldGroup>\n <Field>\n <FieldLabel htmlFor='cardNumber'>{cardNumberLabel} *</FieldLabel>\n <Input\n id='cardNumber'\n placeholder='1234 5678 9012 3456'\n className='h-9 font-mono'\n value={formData.cardNumber}\n onChange={event => onChange('cardNumber', event.target.value)}\n />\n </Field>\n <div className='grid gap-4 sm:grid-cols-3'>\n <Field className='sm:col-span-2'>\n <FieldLabel htmlFor='expiryDate'>{expiryLabel} *</FieldLabel>\n <Input\n id='expiryDate'\n placeholder='MM/AA'\n className='h-9 font-mono'\n value={formData.expiryDate}\n onChange={event => onChange('expiryDate', event.target.value)}\n />\n </Field>\n <Field>\n <FieldLabel htmlFor='cvv'>{cvvLabel} *</FieldLabel>\n <Input\n id='cvv'\n placeholder='123'\n className='h-9 font-mono'\n value={formData.cvv}\n onChange={event => onChange('cvv', event.target.value)}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel htmlFor='cardName'>{cardNameLabel} *</FieldLabel>\n <Input\n id='cardName'\n placeholder='Juan Pérez'\n value={formData.cardName}\n onChange={event => onChange('cardName', event.target.value)}\n className='h-9'\n />\n </Field>\n </FieldGroup>\n </div>\n ) : null}\n\n <div className='bg-muted/50 flex items-center gap-2 rounded-lg p-3 text-sm'>\n <Shield className='size-4 text-success' aria-hidden='true' />\n <span>{securePaymentLabel}</span>\n </div>\n </div>\n )\n}","'use client'\n\nimport { Check, CreditCard, Package, Truck, User } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\n\nimport { cn } from '../../../lib/utils'\n\nimport type { CheckoutForm3Step } from './checkout-form-3'\n\nexport const CHECKOUT_FORM_3_STEP_ICONS: LucideIcon[] = [User, Truck, CreditCard, Package]\n\ninterface CheckoutForm3ProgressProps {\n steps: CheckoutForm3Step[]\n currentStep: number\n isStepComplete: (stepNumber: number) => boolean\n}\n\nexport function CheckoutForm3Progress({ steps, currentStep, isStepComplete }: CheckoutForm3ProgressProps) {\n return (\n <div className='mb-8'>\n <div className='flex items-center justify-between'>\n {steps.map((step, index) => {\n const Icon = CHECKOUT_FORM_3_STEP_ICONS[index]\n const isActive = step.id === currentStep\n const isCompleted = isStepComplete(step.id)\n\n return (\n <div key={step.id} className='flex flex-1 items-center'>\n <div className='flex flex-col items-center'>\n <div\n aria-current={isActive ? 'step' : undefined}\n className={cn(\n 'flex size-10 items-center justify-center rounded-full border-2 transition-colors',\n isCompleted\n ? 'border-primary bg-primary text-primary-foreground'\n : isActive\n ? 'border-primary bg-background text-primary'\n : 'border-muted bg-background text-muted-foreground',\n )}\n >\n {isCompleted ? (\n <Check className='size-5' aria-hidden='true' />\n ) : Icon ? (\n <Icon className='size-5' aria-hidden='true' />\n ) : null}\n </div>\n <span\n className={cn(\n 'mt-2 text-center text-xs font-medium',\n isActive ? 'text-primary' : 'text-muted-foreground',\n )}\n >\n {step.name}\n </span>\n </div>\n {index < steps.length - 1 ? (\n <div\n aria-hidden='true'\n className={cn('mx-4 h-px flex-1 transition-colors', isCompleted ? 'bg-primary' : 'bg-muted')}\n />\n ) : null}\n </div>\n )\n })}\n </div>\n </div>\n )\n}","'use client'\n\nimport { CheckboxCheck } from './checkbox-check'\nimport { Field, FieldLabel } from '../../../ui/field'\n\nimport type { PaymentMethod } from '@thorprovider/types'\nimport type {\n CheckoutForm3ChangeHandler,\n CheckoutForm3FormData,\n CheckoutForm3ShippingMethod,\n} from './checkout-form-3'\n\ninterface CheckoutForm3ReviewStepProps {\n formData: CheckoutForm3FormData\n onChange: CheckoutForm3ChangeHandler\n shippingMethods: CheckoutForm3ShippingMethod[]\n paymentMethods: PaymentMethod[]\n orderReviewLabel: string\n contactReviewLabel: string\n shipToReviewLabel: string\n paymentReviewLabel: string\n shippingReviewLabel: string\n saveInfoLabel: string\n}\n\nexport function CheckoutForm3ReviewStep({\n formData,\n onChange,\n shippingMethods,\n paymentMethods,\n orderReviewLabel,\n contactReviewLabel,\n shipToReviewLabel,\n paymentReviewLabel,\n shippingReviewLabel,\n saveInfoLabel,\n}: CheckoutForm3ReviewStepProps) {\n const shippingName = shippingMethods.find(method => method.id === formData.shippingMethod)?.name\n const paymentMethodName = paymentMethods.find(method => method.id === formData.paymentMethod)?.name\n\n return (\n <div className='flex flex-col gap-6'>\n <div className='bg-muted/50 rounded-lg p-6'>\n <h3 className='mb-4 font-medium'>{orderReviewLabel}</h3>\n <dl className='flex flex-col gap-4 text-sm'>\n <div>\n <dt className='inline font-medium'>{contactReviewLabel}: </dt>\n <dd className='inline'>{formData.email}</dd>\n </div>\n <div>\n <dt className='inline font-medium'>{shipToReviewLabel}: </dt>\n <dd className='inline'>\n {formData.firstName} {formData.lastName}, {formData.address}, {formData.city} {formData.zipCode}\n </dd>\n </div>\n <div>\n <dt className='inline font-medium'>{paymentReviewLabel}: </dt>\n <dd className='inline'>{paymentMethodName}</dd>\n </div>\n <div>\n <dt className='inline font-medium'>{shippingReviewLabel}: </dt>\n <dd className='inline'>{shippingName}</dd>\n </div>\n </dl>\n </div>\n\n <Field orientation='horizontal'>\n <CheckboxCheck\n id='saveInfo'\n checked={formData.saveInfo}\n onCheckedChange={checked => onChange('saveInfo', checked as boolean)}\n />\n <FieldLabel htmlFor='saveInfo' className='text-sm font-normal'>\n {saveInfoLabel}\n </FieldLabel>\n </Field>\n </div>\n )\n}","'use client'\n\nimport { MapPin, Truck } from 'lucide-react'\n\nimport { Field, FieldGroup, FieldLabel, FieldLegend, FieldSet } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select'\nimport { Separator } from '../../../ui/separator'\n\nimport type {\n CheckoutForm3ChangeHandler,\n CheckoutForm3CountryOption,\n CheckoutForm3FormData,\n CheckoutForm3ShippingMethod,\n} from './checkout-form-3'\n\ninterface CheckoutForm3ShippingStepProps {\n formData: CheckoutForm3FormData\n onChange: CheckoutForm3ChangeHandler\n countryOptions: CheckoutForm3CountryOption[]\n shippingMethods: CheckoutForm3ShippingMethod[]\n shippingAddressLabel: string\n addressLabel: string\n apartmentLabel: string\n cityLabel: string\n stateLabel: string\n zipCodeLabel: string\n countryLabel: string\n shippingMethodLabel: string\n freeLabel: string\n currencySymbol: string\n}\n\nconst countryLabelFor = (value: string, options: CheckoutForm3CountryOption[]) =>\n options.find(option => option.value === value)?.label ?? value\n\nexport function CheckoutForm3ShippingStep({\n formData,\n onChange,\n countryOptions,\n shippingMethods,\n shippingAddressLabel,\n addressLabel,\n apartmentLabel,\n cityLabel,\n stateLabel,\n zipCodeLabel,\n countryLabel,\n shippingMethodLabel,\n freeLabel,\n currencySymbol,\n}: CheckoutForm3ShippingStepProps) {\n return (\n <div className='flex flex-col gap-6'>\n <div className='flex flex-col gap-4'>\n <h3 className='flex items-center gap-2 font-medium'>\n <MapPin className='size-4' aria-hidden='true' />\n {shippingAddressLabel}\n </h3>\n\n <FieldGroup>\n <Field>\n <FieldLabel htmlFor='address'>{addressLabel} *</FieldLabel>\n <Input\n id='address'\n placeholder='Calle Principal 123'\n value={formData.address}\n onChange={event => onChange('address', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n\n <Field>\n <FieldLabel htmlFor='apartment'>{apartmentLabel}</FieldLabel>\n <Input\n id='apartment'\n placeholder='Piso 4B'\n value={formData.apartment}\n onChange={event => onChange('apartment', event.target.value)}\n className='h-9'\n />\n </Field>\n\n <div className='grid gap-4 sm:grid-cols-3'>\n <Field>\n <FieldLabel htmlFor='city'>{cityLabel} *</FieldLabel>\n <Input\n id='city'\n placeholder='Madrid'\n value={formData.city}\n onChange={event => onChange('city', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n <Field>\n <FieldLabel htmlFor='state'>{stateLabel}</FieldLabel>\n <Input\n id='state'\n placeholder='Madrid'\n value={formData.state}\n onChange={event => onChange('state', event.target.value)}\n className='h-9'\n />\n </Field>\n <Field>\n <FieldLabel htmlFor='zipCode'>{zipCodeLabel} *</FieldLabel>\n <Input\n id='zipCode'\n placeholder='28001'\n value={formData.zipCode}\n onChange={event => onChange('zipCode', event.target.value)}\n required\n className='h-9'\n />\n </Field>\n </div>\n\n <Field>\n <FieldLabel htmlFor='country'>{countryLabel}</FieldLabel>\n <Select value={formData.country} onValueChange={value => value && onChange('country', value)}>\n <SelectTrigger id='country' className='!h-9 w-full'>\n <SelectValue>{countryLabelFor(formData.country, countryOptions)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {countryOptions.map(country => (\n <SelectItem key={country.value} value={country.value}>\n {country.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n </Field>\n </FieldGroup>\n </div>\n\n <Separator />\n\n <FieldSet className='gap-4'>\n <FieldLegend className='flex items-center gap-2 text-base font-medium'>\n <Truck className='size-4' aria-hidden='true' />\n {shippingMethodLabel}\n </FieldLegend>\n <RadioGroup\n value={formData.shippingMethod}\n onValueChange={value => value && onChange('shippingMethod', value)}\n >\n {shippingMethods.map(method => (\n <div key={method.id} className='flex items-center justify-between rounded-lg border p-4'>\n <Field orientation='horizontal' className='w-auto'>\n <RadioGroupItem value={method.id} id={method.id} />\n <FieldLabel htmlFor={method.id} className='font-normal'>\n <div>\n <div className='font-medium'>{method.name}</div>\n <div className='text-muted-foreground text-sm'>{method.description}</div>\n </div>\n </FieldLabel>\n </Field>\n <div className='font-medium'>\n {method.cost === 0 ? freeLabel : `${currencySymbol}${method.cost.toFixed(2)}`}\n </div>\n </div>\n ))}\n </RadioGroup>\n </FieldSet>\n </div>\n )\n}","import { CircleCheck } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Separator } from '../../../ui/separator'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport type { Money } from '@thorprovider/types'\nimport { CheckoutConfirmationFulfilmentProgress } from './checkout-confirmation-fulfilment-progress'\n\nexport type FulfilmentStage = 'Confirmed' | 'Packed' | 'Shipped' | 'Delivered'\n\nexport interface OrderLine {\n id: string\n name: string\n variant?: string\n quantity: number\n /** Canonical backend line total. */\n lineTotal: Money\n unitPrice?: Money\n /** Optional; an absent image is omitted rather than serialized as `\"\"`. */\n image?: string\n}\n\nexport interface FulfilmentStageDetail {\n stage: FulfilmentStage\n /** What happened, in a sentence. Present tense for a stage that has not arrived yet. */\n summary: string\n /** Where it happened, or where it will. */\n location: string\n /**\n * When it happened. `null` for a stage still ahead, which the panel renders as an\n * expectation rather than as a fact — a date with no event behind it is a promise, and\n * printing it in the same voice as a completed step is how a tracker starts lying.\n */\n at: string | null\n}\n\nexport interface OrderAddress {\n name: string\n lines: string[]\n method?: string\n}\n\nexport interface OrderTotals {\n subtotal?: Money\n discount?: Money\n shipping?: Money\n tax?: Money\n total?: Money\n}\n\nexport interface Order {\n number: string\n /** ISO date */\n placedAt: string\n email?: string\n /** Present only when the backend reports a fulfilment stage. */\n currentStage?: FulfilmentStage\n /** ISO date. Rendered only when supplied; no delivery estimate is fabricated. */\n estimatedDelivery?: string | null\n trackingHref?: string\n shipping?: OrderAddress\n billing?: OrderAddress\n totals: OrderTotals\n}\n\nexport interface CheckoutConfirmationProps {\n order: Order\n orderLines: OrderLine[]\n /**\n * Keyed by `FulfilmentStage`. Rendered only when supplied; the stage strip is\n * ordered by `Object.keys`, so define the record in the canonical\n * `Confirmed → Packed → Shipped → Delivered` order.\n */\n fulfilmentDetails?: Record<FulfilmentStage, FulfilmentStageDetail>\n /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */\n formatPrice?: (money: Money) => string\n titleLabel?: string\n /** Template with `{number}`/`{date}`/`{email}` placeholders, resolved internally. */\n orderPlacedLabel?: string\n /** Used when the order carries no email. */\n orderPlacedNoEmailLabel?: string\n itemsLabel?: string\n quantityLabel?: string\n subtotalLabel?: string\n discountLabel?: string\n shippingLabel?: string\n taxLabel?: string\n totalLabel?: string\n freeLabel?: string\n /** Shown for a line whose supplied line total is absent or malformed. */\n amountUnavailableLabel?: string\n shippingAddressLabel?: string\n billingAddressLabel?: string\n continueShoppingLabel?: string\n /** Prefix of the support line; the `supportLabel` link renders right after it. */\n contactSupportLabel?: string\n supportLabel?: string\n progressLabel?: string\n estimatedDeliveryLabel?: string\n currentStageLabel?: string\n inProgressLabel?: string\n expectedByLabel?: string\n completedLabel?: string\n statusLabel?: string\n locationLabel?: string\n trackOrderLabel?: string\n continueShoppingHref?: string\n supportHref?: string\n onContinueShopping?: () => void\n}\n\nconst longDate = new Intl.DateTimeFormat('en-US', { dateStyle: 'long' })\n\n/**\n * The screen that closes the purchase journey the checkout blocks open.\n *\n * This file has no hooks or handlers, so it still renders as a server component straight from\n * your order record. Only the progress tabs are interactive, and they carry their own\n * `'use client'` — the boundary is one child rather than the whole page.\n */\nexport function CheckoutConfirmation({\n order,\n orderLines,\n fulfilmentDetails,\n formatPrice,\n titleLabel = 'Pedido registrado',\n orderPlacedLabel = 'Pedido {number} · {date} · Correo de contacto: {email}',\n orderPlacedNoEmailLabel = 'Pedido {number} realizado el {date}.',\n itemsLabel = 'Comprobante del pedido',\n quantityLabel = 'Cantidad',\n subtotalLabel = 'Subtotal',\n discountLabel = 'Descuento',\n shippingLabel = 'Envío',\n taxLabel = 'Impuestos',\n totalLabel = 'Total',\n freeLabel = 'Gratis',\n amountUnavailableLabel = '—',\n shippingAddressLabel = 'Envío',\n billingAddressLabel = 'Facturación',\n continueShoppingLabel = 'Seguir comprando',\n contactSupportLabel = '¿Algo falla con este pedido?',\n supportLabel = 'Contacta con soporte',\n progressLabel = 'Progreso',\n estimatedDeliveryLabel = 'Entrega estimada',\n currentStageLabel = 'Etapa actual',\n inProgressLabel = 'En curso',\n expectedByLabel = 'Se espera para',\n completedLabel = 'Completada',\n statusLabel = 'Estado',\n locationLabel = 'Ubicación',\n trackOrderLabel = 'Seguir este pedido',\n continueShoppingHref,\n supportHref,\n onContinueShopping,\n}: CheckoutConfirmationProps) {\n const format = (value: Money | null | undefined) => formatMoney(value, formatPrice)\n const placedDate = longDate.format(new Date(order.placedAt))\n const placedText = order.email\n ? orderPlacedLabel\n .replace('{number}', order.number)\n .replace('{date}', placedDate)\n .replace('{email}', order.email)\n : orderPlacedNoEmailLabel.replace('{number}', order.number).replace('{date}', placedDate)\n const fulfilmentStages = fulfilmentDetails\n ? (Object.keys(fulfilmentDetails) as FulfilmentStage[])\n : []\n const addresses = [\n { title: shippingAddressLabel, address: order.shipping },\n { title: billingAddressLabel, address: order.billing },\n ].filter((section): section is { title: string; address: OrderAddress } => Boolean(section.address))\n\n return (\n <div className='w-full py-16 sm:py-24'>\n <div className='mx-auto w-full max-w-3xl px-4 sm:px-6 lg:px-8'>\n <div className='text-center'>\n <span\n aria-hidden='true'\n className='bg-primary/10 text-primary mx-auto flex size-12 items-center justify-center rounded-full'\n >\n <CircleCheck className='size-6' />\n </span>\n <h1 className='mt-4 text-3xl font-semibold tracking-tight'>{titleLabel}</h1>\n <p className='text-muted-foreground mt-3'>{placedText}</p>\n </div>\n\n {fulfilmentDetails && order.currentStage ? (\n <CheckoutConfirmationFulfilmentProgress\n order={{\n currentStage: order.currentStage,\n estimatedDelivery: order.estimatedDelivery,\n trackingHref: order.trackingHref,\n }}\n stages={fulfilmentStages.map(stage => fulfilmentDetails[stage])}\n progressLabel={progressLabel}\n estimatedDeliveryLabel={estimatedDeliveryLabel}\n currentStageLabel={currentStageLabel}\n inProgressLabel={inProgressLabel}\n expectedByLabel={expectedByLabel}\n completedLabel={completedLabel}\n statusLabel={statusLabel}\n locationLabel={locationLabel}\n trackOrderLabel={trackOrderLabel}\n />\n ) : null}\n\n <Card className='mt-6'>\n <CardHeader>\n <CardTitle className='text-base'>{itemsLabel}</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className='divide-border divide-y'>\n {orderLines.map(line => (\n <li key={line.id} className='flex gap-4 py-4 first:pt-0 last:pb-0'>\n {line.image ? (\n <img\n src={line.image || undefined}\n alt={line.name}\n width={72}\n height={88}\n className='bg-muted h-22 w-18 shrink-0 rounded-md object-cover'\n />\n ) : (\n <div aria-hidden='true' className='bg-muted h-22 w-18 shrink-0 rounded-md' />\n )}\n <div className='min-w-0 flex-1'>\n <p className='text-sm font-medium'>{line.name}</p>\n {line.variant ? <p className='text-muted-foreground text-sm'>{line.variant}</p> : null}\n <p className='text-muted-foreground text-sm tabular-nums'>\n {`${quantityLabel} ${line.quantity}`}\n </p>\n </div>\n <p className='text-sm font-medium tabular-nums'>\n {format(line.lineTotal) ?? amountUnavailableLabel}\n </p>\n </li>\n ))}\n </ul>\n\n <Separator className='my-4' />\n\n <dl className='flex flex-col gap-2 text-sm'>\n {isAvailableMoney(order.totals.subtotal) ? (\n <div className='flex justify-between'>\n <dt className='text-muted-foreground'>{subtotalLabel}</dt>\n <dd className='tabular-nums'>{format(order.totals.subtotal)}</dd>\n </div>\n ) : null}\n {isAvailableMoney(order.totals.discount) ? (\n <div className='flex justify-between'>\n <dt className='text-muted-foreground'>{discountLabel}</dt>\n <dd className='tabular-nums'>{format(order.totals.discount)}</dd>\n </div>\n ) : null}\n {isAvailableMoney(order.totals.shipping) ? (\n <div className='flex justify-between'>\n <dt className='text-muted-foreground'>{shippingLabel}</dt>\n <dd className='tabular-nums'>\n {Number(order.totals.shipping.amount) === 0\n ? freeLabel\n : format(order.totals.shipping)}\n </dd>\n </div>\n ) : null}\n {isAvailableMoney(order.totals.tax) ? (\n <div className='flex justify-between'>\n <dt className='text-muted-foreground'>{taxLabel}</dt>\n <dd className='tabular-nums'>{format(order.totals.tax)}</dd>\n </div>\n ) : null}\n {isAvailableMoney(order.totals.total) ? (\n <div className='flex justify-between pt-2 text-base font-semibold'>\n <dt>{totalLabel}</dt>\n <dd className='tabular-nums'>{format(order.totals.total)}</dd>\n </div>\n ) : null}\n </dl>\n </CardContent>\n </Card>\n\n {addresses.length > 0 ? (\n <div className='mt-6 grid gap-6 sm:grid-cols-2'>\n {addresses.map(section => (\n <Card key={section.title}>\n <CardHeader>\n <CardTitle className='text-base'>{section.title}</CardTitle>\n </CardHeader>\n <CardContent className='text-sm'>\n <address className='text-muted-foreground not-italic'>\n <span className='text-foreground block font-medium'>{section.address.name}</span>\n {section.address.lines.map((line, index) => (\n <span key={`${section.title}:${index}:${line}`} className='block'>\n {line}\n </span>\n ))}\n </address>\n {section.address.method ? (\n <p className='text-muted-foreground mt-3'>{section.address.method}</p>\n ) : null}\n </CardContent>\n </Card>\n ))}\n </div>\n ) : null}\n\n <div className='mt-8 flex flex-col items-center gap-2'>\n {continueShoppingHref ? (\n <Button variant='ghost' asChild>\n <a href={continueShoppingHref}>{continueShoppingLabel}</a>\n </Button>\n ) : onContinueShopping ? (\n <Button variant='ghost' onClick={onContinueShopping}>\n {continueShoppingLabel}\n </Button>\n ) : null}\n {supportHref ? (\n <p className='text-muted-foreground text-sm'>\n {contactSupportLabel}{' '}\n <a href={supportHref} className='underline underline-offset-4'>\n {supportLabel}\n </a>\n </p>\n ) : null}\n </div>\n </div>\n </div>\n )\n}\n\nexport default CheckoutConfirmation\n","'use client'\n\nimport { useState } from 'react'\nimport { Check, Clock, MapPin, Truck } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../../../ui/tabs'\nimport { cn } from '../../../lib/utils'\nimport type { FulfilmentStage, FulfilmentStageDetail } from './checkout-confirmation'\n\nconst longDate = new Intl.DateTimeFormat('en-US', { dateStyle: 'long' })\nconst stampDate = new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium',\n timeStyle: 'short',\n})\n\nconst STAGE_LABELS: Record<FulfilmentStage, string> = {\n Confirmed: 'Confirmado',\n Packed: 'Empaquetado',\n Shipped: 'Enviado',\n Delivered: 'Entregado',\n}\n\ninterface CheckoutConfirmationFulfilmentProgressProps {\n order: {\n currentStage?: FulfilmentStage\n estimatedDelivery?: string | null\n trackingHref?: string\n }\n /** Ordered by `Object.keys(fulfilmentDetails)` from the orchestrator. */\n stages: FulfilmentStageDetail[]\n progressLabel?: string\n estimatedDeliveryLabel?: string\n currentStageLabel?: string\n inProgressLabel?: string\n expectedByLabel?: string\n completedLabel?: string\n statusLabel?: string\n locationLabel?: string\n trackOrderLabel?: string\n /** Kept for API symmetry with the orchestrator; the fulfilment card renders no prices. */\n formatPrice?: (value: number) => string\n}\n\n/**\n * The four fulfilment stages, as tabs that actually open.\n *\n * This was a static `<ol>` that looked exactly like a tab strip — four labels with an underline\n * under each — and did nothing when pressed. A control that looks pressable and is not is worse\n * than no control: the reader tries it, nothing happens, and they conclude the page is broken\n * rather than that the row was decoration.\n *\n * So it is a real `Tabs`, and each stage opens the one thing a reader on this screen wants that\n * the label alone cannot give them: when it happened, where, and what it means. Radix Tabs\n * supplies roving focus, arrow-key movement and the tab/panel wiring; a row of buttons with a\n * `useState` would have to fake all three.\n *\n * Every stage is reachable, including ones still ahead — a reader is entitled to look at what\n * \"Delivered\" will mean before it happens. What a future stage does not get is a fabricated\n * timestamp; it says what it is waiting for instead.\n */\nexport function CheckoutConfirmationFulfilmentProgress({\n order,\n stages,\n progressLabel = 'Progreso',\n estimatedDeliveryLabel = 'Entrega estimada',\n currentStageLabel = 'Etapa actual',\n inProgressLabel = 'En curso',\n expectedByLabel = 'Se espera para',\n completedLabel = 'Completada',\n statusLabel = 'Estado',\n locationLabel = 'Ubicación',\n trackOrderLabel = 'Seguir este pedido',\n}: CheckoutConfirmationFulfilmentProgressProps) {\n const currentIndex = order.currentStage\n ? stages.findIndex(stage => stage.stage === order.currentStage)\n : -1\n const [selected, setSelected] = useState<string>(order.currentStage ?? stages[0]?.stage ?? '')\n\n return (\n <Card className='mt-10'>\n <CardHeader>\n <CardTitle className='flex flex-wrap items-center justify-between gap-2 text-base'>\n {progressLabel}\n {order.estimatedDelivery ? (\n <span className='text-muted-foreground text-sm font-normal'>\n {`${estimatedDeliveryLabel} ${longDate.format(new Date(order.estimatedDelivery))}`}\n </span>\n ) : null}\n </CardTitle>\n </CardHeader>\n\n <CardContent>\n <Tabs value={selected} onValueChange={value => setSelected(String(value))}>\n {/*\n `variant='line'` because these are stages along a route, not a segmented control —\n the underline reads as progress in a way a filled pill does not.\n\n `h-auto!` because `TabsList` pins itself to `h-8` through a\n `group-data-horizontal/tabs:` variant, which a plain `h-auto` cannot outrank and\n tailwind-merge does not treat as the same utility. Left alone it clipped the 24px\n stage markers. The list scrolls rather than wrapping on a narrow screen, so the four\n stages stay in one order.\n\n `pb-2` is load-bearing, not spacing. `TabsTrigger` draws its active underline at\n `bottom-[-5px]`, i.e. outside its own box, and CSS forces an axis to `auto` when the\n other one is not `visible` — so asking for `overflow-x-auto` silently made the\n vertical axis scrollable too, and those 7px of underline became a stray vertical\n scrollbar beside the tabs at every width. The padding puts the underline back inside\n the box, which leaves nothing to scroll.\n */}\n <TabsList variant='line' className='h-auto! w-full justify-start gap-2 overflow-x-auto p-0 pb-2'>\n {stages.map((stage, index) => {\n const done = index <= currentIndex\n\n return (\n <TabsTrigger key={stage.stage} value={stage.stage} className='h-auto flex-1 justify-start gap-2 px-1 py-2'>\n <span\n aria-hidden='true'\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-full text-xs',\n done ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'\n )}\n >\n {done ? <Check className='size-3.5' /> : index + 1}\n </span>\n {STAGE_LABELS[stage.stage]}\n {/*\n The stage the order is actually at, marked on the strip itself. Without it\n the only sign of \"where we are\" would be whichever tab happens to be open,\n which changes the moment the reader looks at another one.\n */}\n {index === currentIndex ? <span className='sr-only'>{currentStageLabel}</span> : null}\n {index === currentIndex ? (\n <span aria-hidden='true' className='bg-primary size-1.5 shrink-0 rounded-full' />\n ) : null}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {stages.map((detail, index) => {\n const done = index <= currentIndex\n\n return (\n <TabsContent key={detail.stage} value={detail.stage} className='pt-4'>\n {index === currentIndex ? (\n <p className='text-primary mb-2 text-xs font-medium tracking-[0.12em] uppercase'>\n {currentStageLabel}\n </p>\n ) : null}\n <p className='text-sm'>{detail.summary}</p>\n\n <dl className='text-muted-foreground mt-3 flex flex-col gap-1.5 text-sm sm:flex-row sm:gap-6'>\n <div className='flex items-center gap-2'>\n <dt className='sr-only'>{detail.at ? completedLabel : statusLabel}</dt>\n <Clock className='size-4 shrink-0' aria-hidden='true' />\n <dd className='tabular-nums'>\n {detail.at\n ? stampDate.format(new Date(detail.at))\n : done\n ? inProgressLabel\n : order.estimatedDelivery\n ? `${expectedByLabel} ${longDate.format(new Date(order.estimatedDelivery))}`\n : null}\n </dd>\n </div>\n\n <div className='flex items-center gap-2'>\n <dt className='sr-only'>{locationLabel}</dt>\n <MapPin className='size-4 shrink-0' aria-hidden='true' />\n <dd>{detail.location}</dd>\n </div>\n </dl>\n </TabsContent>\n )\n })}\n </Tabs>\n\n {/*\n Render as an anchor through Radix `asChild` when a real tracking URL exists; with no\n href the button is omitted rather than pointing at a fabricated destination.\n */}\n {order.trackingHref ? (\n <Button className='mt-6 w-full sm:w-auto' asChild>\n <a href={order.trackingHref}>\n <Truck />\n {trackOrderLabel}\n </a>\n </Button>\n ) : null}\n </CardContent>\n </Card>\n )\n}","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-[orientation=horizontal]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> &\n VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent\",\n \"data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","import { Button } from '../../../ui/button'\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from '../../../ui/card'\nimport {\n Table,\n TableBody,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../../ui/table'\n\nexport interface OrderHistory1Order {\n name: string\n image: string\n color: string\n size: string\n quantity: number\n price: number\n orderDate: string\n}\n\nexport interface OrderHistory1Props {\n orders: OrderHistory1Order[]\n title?: string\n description?: string\n totalOrdersLabel?: string\n lastOrderLabel?: string\n itemLabel?: string\n orderDateLabel?: string\n quantityLabel?: string\n priceLabel?: string\n colorLabel?: string\n sizeLabel?: string\n viewDetailsLabel?: string\n downloadInvoiceLabel?: string\n onViewDetails?: () => void\n onDownloadInvoice?: () => void\n}\n\nfunction getLastOrder(orders: OrderHistory1Order[]): string {\n if (orders.length === 0) return ''\n return orders.reduce((latest, order) => {\n const current = new Date(order.orderDate)\n const previous = new Date(latest)\n if (Number.isNaN(current.getTime())) return latest\n if (Number.isNaN(previous.getTime())) return order.orderDate\n return current > previous ? order.orderDate : latest\n }, orders[0].orderDate)\n}\n\nexport function OrderHistory1({\n orders,\n title,\n description,\n totalOrdersLabel = 'Total de pedidos',\n lastOrderLabel = 'Último pedido',\n itemLabel = 'Artículo',\n orderDateLabel = 'Fecha',\n quantityLabel = 'Cantidad',\n priceLabel = 'Precio',\n colorLabel = 'Color',\n sizeLabel = 'Talla',\n viewDetailsLabel = 'Ver detalles del pedido',\n downloadInvoiceLabel = 'Descargar factura',\n onViewDetails,\n onDownloadInvoice,\n}: OrderHistory1Props) {\n const totalAmount = orders.reduce((sum, order) => sum + order.price, 0)\n const lastOrder = getLastOrder(orders)\n\n return (\n <div className=\"mx-auto w-full max-w-7xl px-4 py-8 sm:px-6 lg:px-8\">\n <Card>\n <CardHeader className=\"flex flex-col gap-2 md:flex-row md:items-start md:justify-between md:gap-x-6\">\n <div>\n <CardTitle className=\"text-2xl\">{title ?? 'Historial de pedidos'}</CardTitle>\n <CardDescription className=\"text-balance\">\n {description ?? 'Ver tus pedidos anteriores y su estado'}\n </CardDescription>\n </div>\n <div className=\"text-end text-sm text-muted-foreground max-sm:text-start\">\n <p>{totalOrdersLabel}: {orders.length}</p>\n <p>{lastOrderLabel}: {lastOrder}</p>\n </div>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"font-semibold\">{itemLabel}</TableHead>\n <TableHead className=\"hidden text-end font-semibold sm:table-cell\">{orderDateLabel}</TableHead>\n <TableHead className=\"hidden text-end font-semibold md:table-cell\">{quantityLabel}</TableHead>\n <TableHead className=\"text-end font-semibold\">{priceLabel}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {orders.map((order) => (\n <TableRow key={order.name}>\n <TableCell className=\"flex flex-col gap-3 py-3 sm:flex-row sm:items-center\">\n <img\n src={order.image || undefined}\n alt={order.name}\n className=\"h-16 w-16 shrink-0 rounded-md object-cover\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium\">{order.name}</p>\n <p className=\"truncate text-sm text-muted-foreground\">\n {colorLabel}: {order.color} • {sizeLabel}: {order.size}\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground sm:hidden\">{order.orderDate}</p>\n </div>\n </TableCell>\n <TableCell className=\"hidden text-end sm:table-cell\">{order.orderDate}</TableCell>\n <TableCell className=\"hidden text-end md:table-cell\">{order.quantity}</TableCell>\n <TableCell className=\"text-end\">${order.price.toFixed(2)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n <TableFooter className=\"bg-transparent\">\n <TableRow className=\"font-semibold hover:bg-transparent md:hidden\">\n <TableCell colSpan={1} />\n <TableCell className=\"text-end\">${totalAmount.toFixed(2)}</TableCell>\n </TableRow>\n <TableRow className=\"hidden font-semibold hover:bg-transparent md:table-row\">\n <TableCell colSpan={2} />\n <TableCell className=\"text-end\">${totalAmount.toFixed(2)}</TableCell>\n </TableRow>\n </TableFooter>\n </Table>\n </CardContent>\n <CardFooter className=\"flex flex-wrap gap-4 border-t-0 bg-transparent pt-0\">\n <Button\n className=\"h-9 cursor-pointer px-4 py-2\"\n onClick={onViewDetails}\n >\n {viewDetailsLabel}\n </Button>\n <Button\n className=\"h-9 cursor-pointer px-4 py-2\"\n variant=\"secondary\"\n onClick={onDownloadInvoice}\n >\n {downloadInvoiceLabel}\n </Button>\n </CardFooter>\n </Card>\n </div>\n )\n}\n\nexport default OrderHistory1","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"../../../ui/card\"\nimport { Badge } from \"../../../ui/badge\"\nimport { Button } from \"../../../ui/button\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"../../../ui/carousel\"\n\nexport interface OrderItem {\n id: string\n name: string\n image: string\n details: string\n price: string\n quantity: number\n}\n\nexport interface Order {\n id: string\n date: string\n status: string\n total: string\n items: OrderItem[]\n}\n\nexport interface OrderHistory2Props {\n orders: Order[]\n titleLabel?: string\n descriptionLabel?: string\n totalOrdersLabel?: string\n lastOrderLabel?: string\n orderLabel?: string\n placedOnLabel?: string\n trackOrderLabel?: string\n viewDetailsLabel?: string\n qtyLabel?: string\n orderTotalLabel?: string\n onTrackOrder?: (order: Order) => void\n onViewDetails?: (order: Order) => void\n}\n\nfunction useWindowSize() {\n const [windowSize, setWindowSize] = useState({\n width: typeof window !== \"undefined\" ? window.innerWidth : 0,\n })\n\n useEffect(() => {\n const handleResize = () => {\n setWindowSize({\n width: window.innerWidth,\n })\n }\n\n window.addEventListener(\"resize\", handleResize)\n handleResize()\n\n return () => window.removeEventListener(\"resize\", handleResize)\n }, [])\n\n return windowSize\n}\n\nfunction getVisibleItemsCount(width: number) {\n if (width >= 1024) return 4\n if (width >= 640) return 2\n return 1\n}\n\nfunction formatLabel(label: string, values: Record<string, string | number>): string {\n return label.replace(/\\{(\\w+)\\}/g, (match, key) => {\n return key in values ? String(values[key]) : match\n })\n}\n\nexport function OrderHistory2({\n orders,\n titleLabel = \"Tus pedidos\",\n descriptionLabel = \"Consulta y gestiona tus pedidos recientes\",\n totalOrdersLabel = \"Total de pedidos: {n}\",\n lastOrderLabel = \"Último pedido realizado el {date}\",\n orderLabel = \"Pedido {id}\",\n placedOnLabel = \"Realizado el {date}\",\n trackOrderLabel = \"Seguir pedido\",\n viewDetailsLabel = \"Ver detalles\",\n qtyLabel = \"Cantidad: {n}\",\n orderTotalLabel = \"Total del pedido\",\n onTrackOrder,\n onViewDetails,\n}: OrderHistory2Props) {\n const { width } = useWindowSize()\n const visibleItemsCount = getVisibleItemsCount(width)\n const hasOrders = orders.length > 0\n\n const shouldShowArrows = (items: OrderItem[]) => {\n return items.length > visibleItemsCount\n }\n\n return (\n <div className=\"mx-auto w-full max-w-7xl px-4 py-12 sm:px-6 lg:px-8\">\n <Card className=\"overflow-visible border-0 bg-transparent shadow-none ring-0\">\n <CardHeader className=\"flex flex-col gap-4 px-0 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <CardTitle className=\"text-2xl text-balance\">{titleLabel}</CardTitle>\n <CardDescription className=\"text-balance\">\n {descriptionLabel}\n </CardDescription>\n </div>\n <div className=\"flex flex-col items-start gap-1 sm:items-end\">\n <p className=\"text-sm font-medium\">{formatLabel(totalOrdersLabel, { n: orders.length })}</p>\n {hasOrders ? (\n <p className=\"text-sm text-muted-foreground\">\n {formatLabel(lastOrderLabel, { date: orders[0].date })}\n </p>\n ) : null}\n </div>\n </CardHeader>\n <CardContent className=\"grid gap-6 p-0\">\n {orders.map((order) => (\n <Card key={order.id} className=\"overflow-hidden pt-0\">\n <CardHeader className=\"flex flex-col gap-4 bg-muted/50 p-6 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-3\">\n <CardTitle className=\"text-lg text-balance\">\n {formatLabel(orderLabel, { id: order.id })}\n </CardTitle>\n <Badge\n variant={order.status === \"Delivered\" ? \"default\" : \"secondary\"}\n className=\"px-2.5 py-0.5 font-semibold\"\n >\n {order.status}\n </Badge>\n </div>\n <CardDescription className=\"text-sm text-balance\">\n {formatLabel(placedOnLabel, { date: order.date })}\n </CardDescription>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {order.status === \"Processing\" ? (\n <Button\n size=\"sm\"\n className=\"h-8 cursor-pointer px-3 text-xs\"\n onClick={onTrackOrder ? () => onTrackOrder(order) : undefined}\n >\n {trackOrderLabel}\n </Button>\n ) : null}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 cursor-pointer px-3 text-xs\"\n onClick={onViewDetails ? () => onViewDetails(order) : undefined}\n >\n {viewDetailsLabel}\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"px-16\">\n <Carousel opts={{ align: \"start\", loop: false }} className=\"w-full [&>div]:p-4\">\n <CarouselContent className=\"-ml-5\" id={`carousel-${order.id}`}>\n {order.items.map((item) => (\n <CarouselItem\n key={item.id}\n className=\"basis-full pl-5.5 sm:basis-1/2 lg:basis-1/4\"\n >\n <Card className=\"py-0\">\n <CardContent className=\"p-4\">\n <div className=\"aspect-square w-full overflow-hidden rounded-lg\">\n <img\n src={item.image || undefined}\n alt={item.name}\n className=\"size-full object-contain\"\n />\n </div>\n <div className=\"mt-4 flex flex-col gap-2\">\n <h4 className=\"font-medium\">{item.name}</h4>\n <p className=\"text-sm text-muted-foreground\">{item.details}</p>\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium\">{item.price}</p>\n <p className=\"text-sm text-muted-foreground\">\n {formatLabel(qtyLabel, { n: item.quantity })}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </CarouselItem>\n ))}\n </CarouselContent>\n\n {shouldShowArrows(order.items) ? (\n <>\n <CarouselPrevious className=\"-inset-inline-start-10\" />\n <CarouselNext className=\"-inset-inline-end-10\" />\n </>\n ) : null}\n </Carousel>\n <div className=\"mt-6 flex items-center justify-between border-t pt-4\">\n <p className=\"text-sm text-muted-foreground\">{orderTotalLabel}</p>\n <p className=\"text-lg font-semibold\">{order.total}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport default OrderHistory2","'use client'\n\nimport { motion, useReducedMotion } from 'motion/react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { ShoppingBag, Star, ArrowRight } from 'lucide-react'\nimport type { ComponentProps, ReactNode } from 'react'\nimport type { CTA } from '../../../lib/types'\n\nexport interface FeaturedProduct {\n id: string\n name: string\n brand: string\n price: number\n originalPrice: number\n rating: number\n reviewCount: number\n inStock: boolean\n isNew: boolean\n isOnSale: boolean\n image: string\n colors: string[]\n}\n\nexport interface HeroImage {\n src: string\n alt: string\n}\n\nexport interface StorefrontHero1Props {\n title: string\n description: string\n products: FeaturedProduct[]\n titleAccent?: string\n badge?: string\n primaryCta?: CTA\n secondaryCta?: CTA\n /**\n * Optional editorial image. Rendered as a native `<img>` when `src` is a\n * non-empty string; omitted entirely when absent or blank (never an empty\n * `src`). The product grid is unaffected.\n */\n heroImage?: HeroImage\n onAddToCart?: (product: FeaturedProduct) => void\n onBuyNow?: (product: FeaturedProduct) => void\n onSelectColor?: (product: FeaturedProduct, index: number, color: string) => void\n addToCartLabel?: string\n buyNowLabel?: string\n newLabel?: string\n outOfStockLabel?: string\n colorsLabel?: string\n}\n\nfunction CtaButton({\n cta,\n variant,\n children,\n}: {\n cta: CTA\n variant?: ComponentProps<typeof Button>['variant']\n children: ReactNode\n}) {\n if (cta.href) {\n return (\n <Button\n variant={variant}\n size='lg'\n className='group relative cursor-pointer overflow-hidden px-8 py-6 text-base font-medium'\n asChild\n >\n <a href={cta.href}>{children}</a>\n </Button>\n )\n }\n\n return (\n <Button\n variant={variant}\n size='lg'\n className='group relative cursor-pointer overflow-hidden px-8 py-6 text-base font-medium'\n >\n {children}\n </Button>\n )\n}\n\nfunction StorefrontHero1({\n title,\n description,\n products,\n titleAccent,\n badge,\n primaryCta,\n secondaryCta,\n heroImage,\n onAddToCart,\n onBuyNow,\n onSelectColor,\n addToCartLabel = 'Agregar al carrito',\n buyNowLabel = 'Ver producto',\n newLabel = 'Nuevo',\n outOfStockLabel = 'Agotado',\n colorsLabel = 'Colores:',\n}: StorefrontHero1Props) {\n const reduceMotion = useReducedMotion()\n\n return (\n <div className='from-primary/5 to-background relative overflow-hidden bg-gradient-to-br'>\n <div className='relative z-10 mx-auto w-full max-w-7xl flex flex-col items-center justify-between gap-12 px-4 sm:px-6 lg:px-8 py-16 lg:py-20 xl:flex-row xl:items-start'>\n <motion.div\n initial={reduceMotion ? false : { opacity: 0, y: 24 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.5, ease: 'easeOut' }}\n className='mx-auto max-w-xl text-center lg:mx-0 xl:text-left'\n >\n {badge && (\n <div className='border-primary/20 bg-primary/5 text-primary inline-flex items-center rounded-full border px-4 py-1.5 text-sm font-medium backdrop-blur-sm'>\n {badge}\n </div>\n )}\n <h1 className='text-foreground mt-8 text-4xl font-bold tracking-tight sm:text-5xl md:text-7xl'>\n {title}{' '}\n {titleAccent && (\n <span className='from-primary to-primary/70 bg-gradient-to-r bg-clip-text text-transparent'>\n {titleAccent}\n </span>\n )}\n </h1>\n <p className='text-muted-foreground mt-8 text-lg'>{description}</p>\n {(primaryCta || secondaryCta) && (\n <div className='mt-10 flex flex-col gap-4 sm:flex-row sm:justify-center xl:justify-start'>\n {primaryCta && (\n <CtaButton cta={primaryCta}>\n <span className='relative z-10 flex items-center gap-2'>\n {primaryCta.label}\n <ArrowRight className='transition-transform group-hover:translate-x-1' />\n </span>\n <span className='bg-primary/5 absolute inset-0 -z-0 opacity-0 transition-opacity group-hover:opacity-100'></span>\n </CtaButton>\n )}\n {secondaryCta && (\n <CtaButton cta={secondaryCta} variant='outline'>\n <span className='relative z-10 flex items-center gap-2'>\n <ShoppingBag />\n {secondaryCta.label}\n </span>\n </CtaButton>\n )}\n </div>\n )}\n {heroImage && heroImage.src.trim().length > 0 ? (\n <img\n src={heroImage.src}\n alt={heroImage.alt}\n className='mt-10 aspect-video w-full rounded-lg object-cover'\n />\n ) : null}\n </motion.div>\n\n <div className='w-full max-w-2xl lg:mt-0'>\n <div className='grid gap-6 sm:grid-cols-2'>\n {products.map((product, index) => (\n <motion.div\n key={product.id}\n initial={reduceMotion ? false : { opacity: 0, y: 24 }}\n whileInView={{ opacity: 1, y: 0 }}\n viewport={{ once: true, margin: '-40px' }}\n transition={{\n duration: 0.45,\n delay: reduceMotion ? 0 : index * 0.1,\n ease: 'easeOut',\n }}\n className='bg-card relative h-full overflow-hidden rounded-lg border shadow-sm transition-shadow hover:shadow-md'\n >\n <div className='absolute top-4 left-4 z-10 flex flex-col gap-2'>\n {product.isNew && (\n <Badge variant='secondary' className='rounded-full'>{newLabel}</Badge>\n )}\n {product.isOnSale && (\n <Badge variant='destructive' className='rounded-full'>\n {Math.round(((product.originalPrice - product.price) / product.originalPrice) * 100)}% OFF\n </Badge>\n )}\n </div>\n\n <div className='relative aspect-square overflow-hidden'>\n <img\n src={product.image || undefined}\n alt={`${product.brand} ${product.name}`}\n className='size-full object-cover'\n loading='lazy'\n />\n {!product.inStock && (\n <div className='absolute inset-0 flex items-center justify-center bg-black/50'>\n <span className='rounded bg-white/90 px-3 py-1 text-sm font-medium'>{outOfStockLabel}</span>\n </div>\n )}\n </div>\n\n <div className='p-4'>\n <div className='text-muted-foreground mb-1 text-sm font-medium'>{product.brand}</div>\n <h3 className='mb-2 font-medium'>{product.name}</h3>\n\n <div className='mb-3'>\n <span className='text-lg font-bold'>${product.price.toFixed(2)}</span>\n {product.isOnSale && (\n <span className='text-muted-foreground ms-2 text-sm line-through'>\n ${product.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n\n <div className='mb-4 flex items-center'>\n <span className='text-muted-foreground me-2 text-sm'>{colorsLabel}</span>\n <div className='flex gap-1'>\n {product.colors.map((color, i) => (\n <button\n key={i}\n className='size-5 rounded-full border'\n style={{ backgroundColor: color }}\n aria-label={`Opción de color ${i + 1}`}\n onClick={onSelectColor ? () => onSelectColor(product, i, product.colors[i]) : undefined}\n />\n ))}\n </div>\n </div>\n\n <div className='mb-4 flex items-center'>\n <div className='flex'>\n {[...Array(5)].map((_, i) => (\n <Star\n key={i}\n className={`size-4 ${i < Math.floor(product.rating) ? 'fill-foreground text-foreground' : 'text-muted-foreground'}`}\n />\n ))}\n </div>\n <span className='text-muted-foreground ms-2 text-sm'>({product.reviewCount.toLocaleString()})</span>\n </div>\n\n <div className='flex flex-col gap-2'>\n <Button variant='outline' className=\"h-9 px-4 py-2 cursor-pointer\" disabled={!product.inStock} onClick={onAddToCart ? () => onAddToCart(product) : undefined}>\n <ShoppingBag />\n {addToCartLabel}\n </Button>\n <Button className=\"h-9 px-4 py-2 cursor-pointer\" disabled={!product.inStock} onClick={onBuyNow ? () => onBuyNow(product) : undefined}>\n {buyNowLabel}\n </Button>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n </div>\n </div>\n\n <div className='bg-primary/10 absolute -top-32 -right-32 size-96 rounded-full blur-3xl' />\n <div className='bg-secondary/30 absolute -bottom-32 -left-32 size-96 rounded-full blur-3xl' />\n </div>\n )\n}\n\nexport default StorefrontHero1","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { ArrowRight, Flame, Search, ShoppingBag, Star, TrendingUp } from 'lucide-react'\nimport type { ComponentProps, ReactNode } from 'react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Carousel, CarouselContent, CarouselItem } from '../../../ui/carousel'\nimport type { CarouselApi } from '../../../ui/carousel'\nimport { Input } from '../../../ui/input'\nimport type { CTA } from '../../../lib/types'\nimport { cn } from '../../../lib/utils'\n\ninterface FeaturedProduct {\n /** Unique identifier for the product. */\n id: string\n /** Product display name. */\n name: string\n /** Image URL or path for the product. */\n image: string\n /** Current selling price in the store currency. */\n price: number\n /** Average rating from 0 to 5. */\n rating: number\n /** Number of reviews the product has received. */\n reviews: number\n /** Whether the product is flagged as trending. */\n trending: boolean\n /** Badge label shown on the slide, e.g. \"Best Seller\". */\n tag: string\n}\n\ninterface StorefrontHero2Props {\n /** Main heading displayed in the hero. */\n title: string\n /** Supporting description under the heading. */\n description: string\n /** Products rendered in the auto-rotating carousel. */\n products: FeaturedProduct[]\n /** Small pill badge above the heading. */\n badge?: string\n /** Placeholder text for the search input. */\n searchPlaceholder?: string\n /** Label of the search submit button. */\n searchLabel?: string\n /** Primary call to action; rendered as a link when it has an href. */\n primaryCta?: CTA\n /** Secondary call to action; rendered as a link when it has an href. */\n secondaryCta?: CTA\n /** Copy shown inside each product slide below the product name. */\n featuredDescription?: string\n /** Label of the call to action inside each product slide. */\n productCtaLabel?: string\n /** Label shown next to the review count. */\n reviewsLabel?: string\n /** Label of the trending badge on product slides. */\n trendingLabel?: string\n /** Called with the current query when the search is submitted. */\n onSearch?: (query: string) => void\n /** Called when a product slide call to action is clicked. */\n onProductClick?: (product: FeaturedProduct) => void\n}\n\nfunction CtaButton({\n cta,\n variant,\n children,\n}: {\n cta: CTA\n variant?: ComponentProps<typeof Button>['variant']\n children: ReactNode\n}) {\n const className = 'h-10 cursor-pointer rounded-full px-4'\n\n if (cta.href) {\n return (\n <Button variant={variant} size='lg' className={className} asChild>\n <a href={cta.href}>{children}</a>\n </Button>\n )\n }\n\n return (\n <Button variant={variant} size='lg' className={className}>\n {children}\n </Button>\n )\n}\n\nfunction StorefrontHero2({\n title,\n description,\n products,\n badge,\n searchPlaceholder = 'Buscar productos...',\n searchLabel = 'Buscar',\n primaryCta,\n secondaryCta,\n featuredDescription,\n productCtaLabel = 'Comprar ahora',\n reviewsLabel = 'reseñas',\n trendingLabel = 'Tendencia',\n onSearch,\n onProductClick,\n}: StorefrontHero2Props) {\n const [searchQuery, setSearchQuery] = useState('')\n const [api, setApi] = useState<CarouselApi>()\n const [currentSlide, setCurrentSlide] = useState(0)\n\n useEffect(() => {\n if (!api || products.length <= 1) return\n\n const interval = setInterval(() => {\n const nextSlide = (currentSlide + 1) % products.length\n api.scrollTo(nextSlide)\n setCurrentSlide(nextSlide)\n }, 5000)\n\n return () => clearInterval(interval)\n }, [api, currentSlide, products.length])\n\n const handleSearch = () => {\n if (onSearch) onSearch(searchQuery)\n }\n\n return (\n <section className='from-background to-accent/20 relative bg-linear-to-b'>\n <div className='relative mx-auto w-full max-w-7xl px-4 py-16 sm:px-6 lg:px-8 lg:py-20'>\n <div className='grid grid-cols-1 items-center gap-12 lg:grid-cols-2'>\n <header className='flex flex-col gap-8'>\n {badge && (\n <Badge variant='outline' className='flex h-auto w-fit items-center gap-2 rounded-full px-4 py-2 font-semibold'>\n <TrendingUp className='size-4' />\n {badge}\n </Badge>\n )}\n\n <h1 className='text-5xl leading-tight font-bold text-balance md:text-6xl lg:text-7xl'>{title}</h1>\n\n <p className='text-muted-foreground max-w-lg text-xl text-balance'>{description}</p>\n\n <div className='relative max-w-md'>\n <Input\n type='search'\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') handleSearch()\n }}\n className='h-14 rounded-full pe-4 pl-12 text-lg'\n aria-label={searchPlaceholder}\n />\n <Search className='text-muted-foreground absolute top-1/2 start-4 size-5 -translate-y-1/2' />\n <Button\n size='lg'\n className='absolute top-1/2 end-2 h-10 -translate-y-1/2 cursor-pointer rounded-full px-6'\n onClick={handleSearch}\n >\n {searchLabel}\n </Button>\n </div>\n\n {(primaryCta || secondaryCta) && (\n <div className='flex items-center gap-4'>\n {primaryCta && (\n <CtaButton cta={primaryCta}>\n <span className='flex items-center gap-2'>\n {primaryCta.label}\n <ArrowRight />\n </span>\n </CtaButton>\n )}\n {secondaryCta && (\n <CtaButton cta={secondaryCta} variant='outline'>\n <span className='flex items-center gap-2'>\n <ShoppingBag />\n {secondaryCta.label}\n </span>\n </CtaButton>\n )}\n </div>\n )}\n </header>\n\n {products.length > 0 && (\n <div className='flex flex-col gap-4'>\n <div className='relative h-[500px] w-full border-0'>\n <Carousel\n className='group size-full'\n setApi={setApi}\n opts={{\n align: 'start',\n loop: true,\n duration: 20,\n skipSnaps: true,\n }}\n >\n <CarouselContent className='h-full'>\n {products.map(product => (\n <CarouselItem key={product.id} className='h-full'>\n <Card className='relative size-full overflow-hidden border-1 py-4'>\n <CardContent className='px-4'>\n <div className='relative size-full overflow-hidden rounded-md'>\n <img\n src={product.image || undefined}\n alt={product.name}\n className='h-[500px] w-full object-cover'\n loading='lazy'\n />\n </div>\n <div className='from-background/90 via-background/30 absolute inset-0 bg-linear-to-t to-transparent' />\n\n <div className='text-background-foreground absolute inset-0 flex flex-col justify-end p-8'>\n <div className='relative z-10 flex max-w-md flex-col gap-4'>\n <Badge className='w-fit rounded-full px-2.5 py-0.5 font-semibold'>{product.tag}</Badge>\n <h2 className='text-4xl font-bold'>{product.name}</h2>\n {featuredDescription && (\n <p className='text-background-foreground/80 text-lg'>{featuredDescription}</p>\n )}\n <span className='text-3xl font-bold'>${product.price.toFixed(2)}</span>\n <div className='flex items-center gap-4 pt-2'>\n <Button\n size='lg'\n className='h-10 cursor-pointer rounded-full px-8'\n onClick={onProductClick ? () => onProductClick(product) : undefined}\n >\n {productCtaLabel}\n </Button>\n <div className='text-foreground flex items-center gap-1'>\n <Star className='fill-foreground size-5' />\n <span className='font-medium'>{product.rating}</span>\n <span className='text-foreground/80'>\n ({product.reviews} {reviewsLabel})\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {product.trending && (\n <div className='text-background-foreground bg-foreground/10 dark:bg-background/20 absolute top-8 end-8 flex items-center gap-1 rounded-full px-3 py-1 text-sm font-medium backdrop-blur-xs'>\n <Flame className='size-4' /> {trendingLabel}\n </div>\n )}\n </CardContent>\n </Card>\n </CarouselItem>\n ))}\n </CarouselContent>\n </Carousel>\n </div>\n\n <div className='relative mt-8 flex justify-center gap-3'>\n {products.map((_, index) => (\n <button\n key={index}\n onClick={() => {\n api?.scrollTo(index)\n setCurrentSlide(index)\n }}\n className={cn(\n 'relative size-3 rounded-full transition-all',\n currentSlide === index ? 'bg-primary' : 'bg-foreground/20 hover:bg-foreground/40'\n )}\n aria-label={`Ir a la diapositiva ${index + 1}`}\n aria-current={currentSlide === index ? 'step' : undefined}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport { StorefrontHero2 }\nexport type { FeaturedProduct, StorefrontHero2Props }\nexport default StorefrontHero2","import { ArrowRight, MapPin } from 'lucide-react'\nimport type { ComponentProps, ReactNode } from 'react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\nimport type { CTA } from '../../../lib/types'\n\nexport interface Department {\n /** Unique identifier */\n id: string\n /** Department name */\n name: string\n /** Image URL for the department chip */\n image: string\n /** Accessible image description (falls back to `name`) */\n imageAlt?: string\n /** Product count label shown under the name */\n count?: string\n /** Link destination when the department is a link */\n href?: string\n}\n\nexport interface FeaturedDeal {\n /** Unique identifier */\n id: string\n /** Deal title */\n name: string\n /** Short supporting description */\n description: string\n /** Image URL */\n image: string\n /** Accessible image description (falls back to `name`) */\n imageAlt?: string\n /** Current price */\n price: number\n /** Original price, rendered struck-through when present */\n originalPrice?: number\n /** Optional call to action shown on the card */\n cta?: CTA\n}\n\nexport interface StoreLocator {\n /** Locator section title */\n title: string\n /** Locator section description */\n description: string\n /** Locator button label */\n ctaLabel: string\n /** Optional link destination for the locator button */\n ctaHref?: string\n}\n\nexport interface StorefrontHero5Props {\n /** Small pill shown above the title */\n badge?: string\n /** Main headline */\n title: string\n /** Accent text appended to the headline */\n titleAccent?: string\n /** Supporting paragraph under the headline */\n description: string\n /** Primary call to action */\n primaryCta?: CTA\n /** Secondary call to action */\n secondaryCta?: CTA\n /** Shipping banner text shown under the CTAs */\n shippingInfo?: string\n /** Department categories rendered as a grid */\n departments: Department[]\n /** Featured deals rendered as cards */\n featuredDeals: FeaturedDeal[]\n /** Store locator strip rendered at the bottom */\n storeLocator?: StoreLocator\n /** Invoked when a department is clicked (departments without `href`) */\n onDepartmentClick?: (department: Department) => void\n /** Invoked when a deal CTA is clicked (deals whose `cta` has no `href`) */\n onShopNow?: (deal: FeaturedDeal) => void\n /** Invoked when the locator button is clicked (when `ctaHref` is absent) */\n onLocateStores?: () => void\n /** Label for the deal call-to-action button */\n shopNowLabel?: string\n}\n\nfunction CtaButton({\n cta,\n variant,\n children,\n}: {\n cta: CTA\n variant?: ComponentProps<typeof Button>['variant']\n children: ReactNode\n}) {\n if (cta.href) {\n return (\n <Button\n variant={variant}\n size='lg'\n className='group h-10 px-4 cursor-pointer text-base'\n asChild\n >\n <a href={cta.href}>{children}</a>\n </Button>\n )\n }\n\n return (\n <Button\n variant={variant}\n size='lg'\n className='group h-10 px-4 cursor-pointer text-base'\n >\n {children}\n </Button>\n )\n}\n\nfunction StorefrontHero5({\n badge,\n title,\n titleAccent,\n description,\n primaryCta,\n secondaryCta,\n shippingInfo,\n departments,\n featuredDeals,\n storeLocator,\n onDepartmentClick,\n onShopNow,\n onLocateStores,\n shopNowLabel = 'Comprar ahora',\n}: StorefrontHero5Props) {\n const departmentChipClasses = cn(\n 'flex flex-col items-center gap-4 rounded-lg p-2 text-center outline-none',\n 'transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:ring-ring',\n )\n\n return (\n <div className='bg-background relative overflow-hidden'>\n <div className='relative z-10'>\n <div className='mx-auto w-full max-w-7xl px-4 py-16 sm:px-6 lg:px-8 lg:py-20'>\n <div className='mx-auto max-w-4xl text-center'>\n {badge && (\n <div className='border-primary/20 bg-primary/5 text-primary inline-flex items-center justify-center rounded-md border px-4 py-1.5 text-sm'>\n {badge}\n </div>\n )}\n\n <h1 className='mt-6 text-4xl font-bold tracking-tight text-balance sm:text-5xl md:text-6xl'>\n {title}{' '}\n {titleAccent && <span className='text-primary'>{titleAccent}</span>}\n </h1>\n\n <p className='text-muted-foreground mx-auto mt-6 max-w-2xl text-lg'>\n {description}\n </p>\n\n {(primaryCta || secondaryCta) && (\n <div className='mt-8 flex flex-wrap justify-center gap-4'>\n {primaryCta && (\n <CtaButton cta={primaryCta}>\n {primaryCta.label}\n <ArrowRight className='transition-transform group-hover:translate-x-1' />\n </CtaButton>\n )}\n {secondaryCta && <CtaButton cta={secondaryCta} variant='outline'>{secondaryCta.label}</CtaButton>}\n </div>\n )}\n\n {shippingInfo && (\n <div className='mt-6'>\n <div className='bg-background/80 text-muted-foreground inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-sm backdrop-blur-sm'>\n <MapPin className='text-primary size-4' aria-hidden='true' />\n <span>{shippingInfo}</span>\n </div>\n </div>\n )}\n\n <div className='mt-12 grid grid-cols-3 gap-8'>\n {departments.map(department => {\n const chip = (\n <>\n <img\n src={department.image || undefined}\n alt={department.imageAlt ?? department.name}\n className='bg-card border-border size-16 rounded-full border object-cover'\n loading='lazy'\n />\n <div>\n <div className='text-lg font-medium'>{department.name}</div>\n {department.count && (\n <div className='text-muted-foreground mt-1 text-sm'>{department.count}</div>\n )}\n </div>\n </>\n )\n\n if (department.href) {\n return (\n <a\n key={department.id}\n href={department.href}\n className={cn(departmentChipClasses, 'cursor-pointer')}\n >\n {chip}\n </a>\n )\n }\n\n return (\n <button\n key={department.id}\n type='button'\n onClick={onDepartmentClick ? () => onDepartmentClick(department) : undefined}\n className={cn(departmentChipClasses, 'cursor-pointer')}\n >\n {chip}\n </button>\n )\n })}\n </div>\n\n {featuredDeals.length > 0 && (\n <div className='mt-16 grid gap-6 sm:grid-cols-2'>\n {featuredDeals.map(deal => (\n <Card key={deal.id} className='mx-auto h-full w-full overflow-hidden border-0 py-0 shadow-lg'>\n <CardContent className='p-0'>\n <div className='relative aspect-[3/2] overflow-hidden'>\n <img\n src={deal.image || undefined}\n alt={deal.imageAlt ?? deal.name}\n className='size-full object-cover object-center transition-transform duration-700 hover:scale-105'\n loading='lazy'\n />\n <div className='from-background/90 via-background/30 absolute inset-0 bg-gradient-to-t to-transparent' />\n <div className='absolute inset-0 flex items-end p-8'>\n <div className='w-full'>\n <div className='bg-background/80 flex flex-col items-center justify-between gap-6 rounded-lg p-6 backdrop-blur-sm sm:flex-row sm:gap-8'>\n <div className='text-center sm:text-left'>\n <h3 className='text-2xl font-bold tracking-tight sm:text-3xl'>{deal.name}</h3>\n <p className='text-muted-foreground mt-1'>{deal.description}</p>\n <div className='mt-2 flex items-baseline justify-center gap-2 sm:justify-start'>\n <span className='text-lg font-bold'>${deal.price.toFixed(2)}</span>\n {deal.originalPrice && (\n <span className='text-muted-foreground text-sm line-through'>\n ${deal.originalPrice.toFixed(2)}\n </span>\n )}\n </div>\n </div>\n {(deal.cta || onShopNow) && (\n <div className='flex-shrink-0'>\n {deal.cta?.href ? (\n <Button size='lg' className='group h-10 px-4 cursor-pointer' asChild>\n <a href={deal.cta.href}>\n {deal.cta.label}\n <ArrowRight className='transition-transform group-hover:translate-x-1' />\n </a>\n </Button>\n ) : (\n <Button\n size='lg'\n className='group h-10 px-4 cursor-pointer'\n onClick={onShopNow ? () => onShopNow(deal) : undefined}\n >\n {deal.cta?.label ?? shopNowLabel}\n <ArrowRight className='transition-transform group-hover:translate-x-1' />\n </Button>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {storeLocator && (\n <div className='border-border/50 bg-background/50 mt-8 rounded-lg border p-6 backdrop-blur-sm'>\n <div className='flex flex-col items-center gap-6 sm:flex-row sm:justify-between'>\n <div className='flex items-center gap-4'>\n <div className='bg-primary/10 text-primary flex size-12 items-center justify-center rounded-full'>\n <MapPin className='size-6' aria-hidden='true' />\n </div>\n <div className='text-start'>\n <h4 className='text-lg font-medium'>{storeLocator.title}</h4>\n <p className='text-muted-foreground'>{storeLocator.description}</p>\n </div>\n </div>\n {storeLocator.ctaHref ? (\n <Button variant='outline' className='h-9 cursor-pointer px-4 py-2 whitespace-nowrap' asChild>\n <a href={storeLocator.ctaHref}>{storeLocator.ctaLabel}</a>\n </Button>\n ) : (\n <Button\n variant='outline'\n className='h-9 cursor-pointer px-4 py-2 whitespace-nowrap'\n onClick={onLocateStores ? onLocateStores : undefined}\n >\n {storeLocator.ctaLabel}\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default StorefrontHero5","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { ArrowRight, Sparkles } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\n\nexport interface HeroDeal {\n /** Unique identifier for the deal. */\n id: string\n /** Deal name shown in the badge, e.g. \"Summer Sale\". */\n title: string\n /** Discount label, e.g. \"50% OFF\". */\n discount: string\n /** Countdown text, e.g. \"2d : 15h : 30m\". */\n endTime: string\n}\n\nexport interface HeroCategory {\n /** Unique identifier for the category. */\n id: string\n /** Category name. */\n name: string\n /** Product count label, e.g. \"2.5k+\". */\n count: string\n /** Image URL for the category card. */\n image: string\n /** Accessible image description (falls back to `name`). */\n imageAlt?: string\n /** Optional link destination; renders the card arrow as a link when present. */\n href?: string\n}\n\nexport interface StorefrontHero6Props {\n /** Small pill shown above the headline. */\n badge?: string\n /** Main headline. */\n title: string\n /** Accent line rendered on a new line after the headline. */\n subtitle?: string\n /** Supporting paragraph under the headline. */\n description: string\n /** Deals rendered in the sticky auto-rotating top bar. */\n deals: HeroDeal[]\n /** Product categories rendered as a card grid. */\n categories: HeroCategory[]\n /** Milliseconds between auto-rotating deals (default 3000). */\n rotationInterval?: number\n /** Label shown before the deal countdown, e.g. \"Ends in\". */\n endsInLabel?: string\n /** Label of the shop-now button in the deals bar. */\n shopNowLabel?: string\n /** Unit appended to each category product count. */\n productsLabel?: string\n /** Prefix for the category arrow accessible label. */\n viewLabel?: string\n /** Called when the shop-now button in the deals bar is clicked. */\n onShopNow?: (deal: HeroDeal) => void\n /** Called when a category arrow is clicked (categories without `href`). */\n onCategoryClick?: (category: HeroCategory) => void\n}\n\nfunction StorefrontHero6({\n badge,\n title,\n subtitle,\n description,\n deals,\n categories,\n rotationInterval = 3000,\n endsInLabel = 'Termina en',\n shopNowLabel = 'Comprar ahora',\n productsLabel = 'productos',\n viewLabel = 'Ver',\n onShopNow,\n onCategoryClick,\n}: StorefrontHero6Props) {\n const [currentDeal, setCurrentDeal] = useState(0)\n\n useEffect(() => {\n if (deals.length <= 1) return\n\n const interval = setInterval(() => {\n setCurrentDeal(prev => (prev + 1) % deals.length)\n }, rotationInterval)\n\n return () => clearInterval(interval)\n }, [deals.length, rotationInterval])\n\n const deal = deals[currentDeal]\n\n return (\n <div className='relative'>\n {deal && (\n <header className='bg-primary text-primary-foreground sticky top-0 z-50 shadow-md'>\n <div className='mx-auto w-full max-w-7xl px-4 py-2 sm:px-6 lg:px-8'>\n <div className='flex items-center justify-center'>\n <div className='flex w-full max-w-3xl items-center justify-center gap-4'>\n <div className='flex items-center gap-2'>\n <Badge\n variant='secondary'\n className='bg-primary-foreground text-primary px-2.5 py-0.5 font-semibold'\n >\n {deal.title}\n </Badge>\n <span className='font-semibold'>{deal.discount}</span>\n </div>\n <span className='hidden sm:inline'>\n {endsInLabel} {deal.endTime}\n </span>\n <Button\n variant='link'\n size='sm'\n className='text-primary-foreground hover:text-primary-foreground/80 ml-auto h-8 cursor-pointer px-3 text-xs'\n onClick={onShopNow ? () => onShopNow(deal) : undefined}\n >\n {shopNowLabel} <ArrowRight />\n </Button>\n </div>\n </div>\n </div>\n </header>\n )}\n\n <main className='mx-auto w-full max-w-7xl px-4 py-8 sm:px-6 lg:px-8'>\n <div className='mb-12 text-center'>\n {badge && (\n <div className='relative inline-block'>\n <Badge\n variant='outline'\n className='mb-4 flex h-auto items-center gap-2 rounded-full px-3.5 py-1.5 text-sm font-normal'\n >\n <Sparkles className='size-4' aria-hidden='true' />\n {badge}\n </Badge>\n </div>\n )}\n <h1 className='text-4xl font-bold tracking-tight text-balance sm:text-5xl md:text-6xl'>\n {title}\n {subtitle && (\n <>\n <br />\n {subtitle}\n </>\n )}\n </h1>\n <p className='text-muted-foreground mx-auto mt-4 max-w-2xl text-lg'>{description}</p>\n </div>\n\n <div className='grid gap-4 sm:grid-cols-2 lg:grid-cols-4'>\n {categories.map(category => (\n <Card key={category.id} className='group relative overflow-hidden py-0 transition-all duration-500'>\n <img\n src={category.image || undefined}\n alt={category.imageAlt ?? category.name}\n className='aspect-4/5 size-full object-cover grayscale transition-all duration-500 hover:grayscale-0'\n width={400}\n height={500}\n loading='lazy'\n />\n <CardContent className='absolute inset-x-0 bottom-0 p-4'>\n <div className='mt-1 flex items-center justify-between'>\n <div>\n <h2 className='text-background dark:text-foreground text-lg font-medium'>{category.name}</h2>\n <span className='text-background/80 dark:text-foreground/80 text-sm'>\n {category.count} {productsLabel}\n </span>\n </div>\n {category.href ? (\n <Button\n variant='secondary'\n size='icon'\n className='h-9 w-9 cursor-pointer rounded-full backdrop-blur-xs'\n aria-label={`${viewLabel} ${category.name}`}\n asChild\n >\n <a href={category.href}>\n <ArrowRight />\n </a>\n </Button>\n ) : (\n <Button\n variant='secondary'\n size='icon'\n className='h-9 w-9 cursor-pointer rounded-full backdrop-blur-xs'\n aria-label={`${viewLabel} ${category.name}`}\n onClick={onCategoryClick ? () => onCategoryClick(category) : undefined}\n >\n <ArrowRight />\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </main>\n </div>\n )\n}\n\nexport { StorefrontHero6 }\nexport default StorefrontHero6","'use client'\n\nimport { Bell, Plus, Search } from 'lucide-react'\nimport type { ReactNode } from 'react'\n\nimport type { CTA } from '../../../lib/types'\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '../../../ui/breadcrumb'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { Separator } from '../../../ui/separator'\nimport { SidebarInset, SidebarProvider, SidebarTrigger } from '../../../ui/sidebar'\nimport AppShell1Sidebar from './app-shell-1-sidebar'\nimport type { AppShell1NavItem, AppShell1User } from './app-shell-1-sidebar'\n\nexport interface AppShell1BreadcrumbItem {\n label: string\n href?: string\n}\n\nexport interface AppShell1Stat {\n label: string\n value: string\n}\n\nexport interface AppShell1Props {\n brandName?: string\n navGroupLabel?: string\n navItems?: AppShell1NavItem[]\n user?: AppShell1User\n breadcrumb?: AppShell1BreadcrumbItem[]\n pageTitle?: string\n pageDescription?: string\n action?: CTA\n stats?: AppShell1Stat[]\n children?: ReactNode\n className?: string\n}\n\nfunction AppHeader({ breadcrumb }: { breadcrumb?: AppShell1BreadcrumbItem[] }) {\n return (\n <header className=\"flex h-14 shrink-0 items-center gap-3 border-b px-4 sm:px-6\">\n <SidebarTrigger aria-label=\"Toggle navigation\" className=\"min-h-11 min-w-11\" />\n <Separator orientation=\"vertical\" className=\"data-vertical:h-5 data-vertical:self-center\" />\n {breadcrumb && breadcrumb.length > 0 ? (\n <Breadcrumb>\n <BreadcrumbList>\n {breadcrumb.map((item, index) => {\n const isLast = index === breadcrumb.length - 1\n return (\n <div key={item.label} className=\"contents\">\n <BreadcrumbItem className={isLast ? undefined : 'hidden sm:flex'}>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : item.href ? (\n <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>\n ) : (\n <span>{item.label}</span>\n )}\n </BreadcrumbItem>\n {!isLast ? (\n <BreadcrumbSeparator className=\"hidden sm:flex\" />\n ) : null}\n </div>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n ) : null}\n <div className=\"ml-auto hidden w-56 md:block\">\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n aria-label=\"Buscar en el espacio de trabajo\"\n placeholder=\"Buscar…\"\n className=\"h-9 pl-9\"\n />\n </div>\n </div>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Notifications, 3 unread\">\n <Bell />\n <span className=\"sr-only\">3 unread</span>\n </Button>\n </header>\n )\n}\n\nfunction AppContent({\n pageTitle,\n pageDescription,\n action,\n stats,\n children,\n}: {\n pageTitle?: string\n pageDescription?: string\n action?: CTA\n stats?: AppShell1Stat[]\n children?: ReactNode\n}) {\n return (\n <main className=\"flex flex-1 flex-col gap-6 p-4 sm:p-6\">\n {pageTitle || pageDescription || action ? (\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n {pageTitle ? (\n <h1 className=\"text-2xl font-semibold tracking-tight\">{pageTitle}</h1>\n ) : null}\n {pageDescription ? (\n <p className=\"text-sm text-muted-foreground\">{pageDescription}</p>\n ) : null}\n </div>\n {action ? (\n <Button asChild>\n <a href={action.href}>\n <Plus data-icon=\"inline-start\" />\n {action.label}\n </a>\n </Button>\n ) : null}\n </div>\n ) : null}\n {stats && stats.length > 0 ? (\n <div className=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n {stats.map(stat => (\n <Card key={stat.label}>\n <CardHeader>\n <CardDescription>{stat.label}</CardDescription>\n <CardTitle className=\"text-3xl\">{stat.value}</CardTitle>\n </CardHeader>\n </Card>\n ))}\n </div>\n ) : null}\n <Card className=\"min-h-72\">\n <CardHeader>\n <CardTitle>Project activity</CardTitle>\n <CardDescription>Your product content goes inside this shell.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-1\">\n {children ?? (\n <div className=\"flex flex-1 items-center justify-center rounded-lg border border-dashed text-sm text-muted-foreground\">\n <Search className=\"mr-2 size-4\" />\n Replace with your screen\n </div>\n )}\n </CardContent>\n </Card>\n </main>\n )\n}\n\nexport function AppShell1({\n brandName,\n navGroupLabel,\n navItems,\n user,\n breadcrumb,\n pageTitle,\n pageDescription,\n action,\n stats,\n children,\n className,\n}: AppShell1Props) {\n return (\n <SidebarProvider className={className}>\n <AppShell1Sidebar\n brandName={brandName}\n navGroupLabel={navGroupLabel}\n navItems={navItems}\n user={user}\n />\n <SidebarInset>\n <AppHeader breadcrumb={breadcrumb} />\n <AppContent\n pageTitle={pageTitle}\n pageDescription={pageDescription}\n action={action}\n stats={stats}\n >\n {children}\n </AppContent>\n </SidebarInset>\n </SidebarProvider>\n )\n}\n\nexport default AppShell1","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\nimport { PanelLeftIcon } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"@/hooks/use-mobile\"\nimport { Button } from \"@/ui/button\"\nimport { Input } from \"@/ui/input\"\nimport { Separator } from \"@/ui/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/ui/sheet\"\nimport { Skeleton } from \"@/ui/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/ui/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","'use client'\n\nimport {\n BarChart3,\n ChevronsUpDown,\n FolderKanban,\n Home,\n LayoutDashboard,\n Package,\n Settings,\n ShoppingCart,\n User,\n Users,\n} from 'lucide-react'\nimport type { ComponentType } from 'react'\n\nimport { Avatar, AvatarFallback } from '../../../ui/avatar'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '../../../ui/dropdown-menu'\nimport { Input } from '../../../ui/input'\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n useSidebar,\n} from '../../../ui/sidebar'\n\nexport type AppShell1NavIcon =\n | 'layout-dashboard'\n | 'package'\n | 'user'\n | 'settings'\n | 'home'\n | 'shopping-cart'\n | 'bar-chart-3'\n | 'users'\n | 'folder-kanban'\n\nexport interface AppShell1NavItem {\n label: string\n href: string\n icon: AppShell1NavIcon\n active?: boolean\n}\n\nexport interface AppShell1User {\n name: string\n email: string\n initials: string\n}\n\nconst appShell1NavIcons: Record<AppShell1NavIcon, ComponentType> = {\n 'layout-dashboard': LayoutDashboard,\n package: Package,\n user: User,\n settings: Settings,\n home: Home,\n 'shopping-cart': ShoppingCart,\n 'bar-chart-3': BarChart3,\n users: Users,\n 'folder-kanban': FolderKanban,\n}\n\n// SidebarInset must remain a direct sibling of Sidebar. The sidebar primitive persists open state in the `sidebar_state` cookie.\nfunction BrandMark() {\n return (\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z\"\n fill=\"currentColor\"\n />\n <path d=\"M21.1694 10.5806L14.5651 17.1849\" stroke=\"currentColor\" />\n <path d=\"M22.1694 14.5806L18.5632 18.1868\" stroke=\"currentColor\" />\n <circle cx=\"13.1\" cy=\"26.1\" r=\"1.7\" stroke=\"currentColor\" />\n <circle cx=\"22.1\" cy=\"26.1\" r=\"1.7\" stroke=\"currentColor\" />\n </svg>\n )\n}\n\nexport interface AppShell1SidebarProps {\n brandName?: string\n navGroupLabel?: string\n navItems?: AppShell1NavItem[]\n user?: AppShell1User\n}\n\nexport function AppShell1Sidebar({\n brandName,\n navGroupLabel = 'Workspace',\n navItems = [],\n user,\n}: AppShell1SidebarProps) {\n const { setOpenMobile } = useSidebar()\n\n return (\n <Sidebar>\n <SidebarHeader>\n <a\n href=\"#resumen\"\n className=\"flex min-h-11 items-center gap-2 rounded-lg px-2 font-semibold\"\n onClick={() => setOpenMobile(false)}\n >\n <BrandMark />\n {brandName}\n </a>\n </SidebarHeader>\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupLabel>{navGroupLabel}</SidebarGroupLabel>\n <SidebarGroupContent>\n <nav aria-label={navGroupLabel}>\n <SidebarMenu>\n {navItems.map(item => {\n const Icon = appShell1NavIcons[item.icon]\n return (\n <SidebarMenuItem key={item.label}>\n <SidebarMenuButton isActive={item.active} asChild>\n <a\n href={item.href}\n aria-current={item.active ? 'page' : undefined}\n aria-label={item.label}\n onClick={() => setOpenMobile(false)}\n >\n <Icon />\n <span>{item.label}</span>\n </a>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n })}\n </SidebarMenu>\n </nav>\n </SidebarGroupContent>\n </SidebarGroup>\n <div className=\"px-2 md:hidden\">\n <Input aria-label=\"Buscar en el espacio de trabajo\" placeholder=\"Buscar…\" />\n </div>\n </SidebarContent>\n {user ? (\n <SidebarFooter>\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton className=\"min-h-11\">\n <Avatar className=\"size-7\">\n <AvatarFallback>{user.initials}</AvatarFallback>\n </Avatar>\n <span className=\"truncate\">{user.name}</span>\n <ChevronsUpDown className=\"ml-auto\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>{user.email}</DropdownMenuLabel>\n <DropdownMenuItem>Configuración de la cuenta</DropdownMenuItem>\n <DropdownMenuItem>Cerrar sesión</DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarFooter>\n ) : null}\n </Sidebar>\n )\n}\n\nexport default AppShell1Sidebar","'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { Eye, EyeOff, Lock, Mail, type LucideIcon } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Card } from '../../../ui/card'\nimport { CheckboxCheck } from '../../e-commerce/checkout-forms/checkbox-check'\nimport { Input } from '../../../ui/input'\nimport { cn } from '../../../lib/utils'\n\nexport interface LoginPage1SocialButton {\n name: string\n icon: LucideIcon\n}\n\nexport interface LoginPage1FormData {\n email: string\n password: string\n remember: boolean\n}\n\nexport interface LoginPage1Props {\n logoText?: string\n welcomeTitleLabel?: string\n welcomeDescriptionLabel?: string\n emailLabel?: string\n emailPlaceholder?: string\n passwordLabel?: string\n passwordPlaceholder?: string\n rememberMeLabel?: string\n forgotPasswordLabel?: string\n signInLabel?: string\n orContinueWithLabel?: string\n dontHaveAccountLabel?: string\n createAccountLabel?: string\n /** Template with a `{provider}` placeholder for the social login buttons' aria-labels. */\n socialAriaLabelTemplate?: string\n showPasswordAriaLabel?: string\n hidePasswordAriaLabel?: string\n socialButtons?: LoginPage1SocialButton[]\n onSubmit?: (data: LoginPage1FormData) => void\n onForgotPassword?: () => void\n onCreateAccount?: () => void\n onSocialLogin?: (providerName: string) => void\n}\n\nexport function LoginPage1({\n logoText,\n welcomeTitleLabel = 'Bienvenido de nuevo',\n welcomeDescriptionLabel = 'Inicia sesión para continuar',\n emailLabel = 'Correo electrónico',\n emailPlaceholder = 'taller@correo.com',\n passwordLabel = 'Contraseña',\n passwordPlaceholder = '••••••••',\n rememberMeLabel = 'Recuérdame',\n forgotPasswordLabel = '¿Olvidaste tu contraseña?',\n signInLabel = 'Iniciar sesión',\n orContinueWithLabel = 'O continúa con',\n dontHaveAccountLabel = '¿No tienes una cuenta?',\n createAccountLabel = 'Crea una cuenta',\n socialAriaLabelTemplate = 'Iniciar sesión con {provider}',\n showPasswordAriaLabel = 'Mostrar contraseña',\n hidePasswordAriaLabel = 'Ocultar contraseña',\n socialButtons = [],\n onSubmit,\n onForgotPassword,\n onCreateAccount,\n onSocialLogin,\n}: LoginPage1Props) {\n const [showPassword, setShowPassword] = useState(false)\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [remember, setRemember] = useState(false)\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault()\n onSubmit?.({ email, password, remember })\n }\n\n const forgotPasswordClassName = cn(\n 'ms-auto inline-block text-sm underline-offset-4',\n onForgotPassword ? 'cursor-pointer hover:underline' : 'text-muted-foreground'\n )\n\n const createAccountClassName = cn('underline underline-offset-4', onCreateAccount ? 'cursor-pointer' : undefined)\n\n return (\n <section className='from-background to-muted/50 relative isolate flex min-h-dvh w-full items-center justify-center overflow-hidden bg-linear-to-br'>\n <div className='relative z-10 container mx-auto flex min-h-dvh items-center justify-center px-4 py-12'>\n <Card className='relative w-full max-w-md ring-0 p-8 shadow-2xl'>\n <div className='mb-8 flex flex-col items-center'>\n <div className='my-4 flex justify-center'>\n <div className='bg-secondary relative size-14 rounded-full border'>\n <div className='flex h-full items-center justify-center'>\n <svg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg' aria-hidden='true'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n </div>\n </div>\n </div>\n {logoText && <p className='text-muted-foreground mb-2 text-sm font-semibold'>{logoText}</p>}\n <h1 className='mb-2 text-center text-2xl font-bold tracking-tight'>{welcomeTitleLabel}</h1>\n <p className='text-muted-foreground text-center text-sm'>{welcomeDescriptionLabel}</p>\n </div>\n\n <form onSubmit={handleSubmit} className='flex flex-col gap-6'>\n <div className='relative'>\n <Input\n type='email'\n placeholder={emailPlaceholder}\n aria-label={emailLabel}\n autoComplete='email'\n value={email}\n onChange={event => setEmail(event.target.value)}\n className='bg-transparent ps-10 h-9 text-sm'\n />\n <Mail className='text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2' aria-hidden='true' />\n </div>\n\n <div className='relative'>\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder={passwordPlaceholder}\n aria-label={passwordLabel}\n autoComplete='current-password'\n value={password}\n onChange={event => setPassword(event.target.value)}\n className='bg-transparent ps-10 h-9 text-sm'\n />\n <Lock className='text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2' aria-hidden='true' />\n <Button\n type='button'\n variant='ghost'\n aria-label={showPassword ? hidePasswordAriaLabel : showPasswordAriaLabel}\n className='absolute end-0 top-0 h-full cursor-pointer px-3 py-2 hover:bg-transparent'\n onClick={() => setShowPassword(prev => !prev)}\n >\n {showPassword ? (\n <EyeOff className='text-muted-foreground' />\n ) : (\n <Eye className='text-muted-foreground' />\n )}\n </Button>\n </div>\n\n <div className='flex items-center justify-between'>\n <div className='flex items-center gap-2'>\n <CheckboxCheck\n id='remember'\n checked={remember}\n onCheckedChange={value => setRemember(value === true)}\n className='data-checked:bg-primary bg-transparent'\n />\n <label\n htmlFor='remember'\n className='text-sm leading-none font-normal text-muted-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n >\n {rememberMeLabel}\n </label>\n </div>\n {onForgotPassword ? (\n <button type='button' onClick={onForgotPassword} className={forgotPasswordClassName}>\n {forgotPasswordLabel}\n </button>\n ) : (\n <span className={forgotPasswordClassName}>{forgotPasswordLabel}</span>\n )}\n </div>\n\n <Button type='submit' className='h-9 w-full cursor-pointer px-4 py-2'>\n {signInLabel}\n </Button>\n\n {socialButtons.length > 0 && (\n <>\n <div className='relative my-6 text-center'>\n <div className='absolute inset-0 flex items-center'>\n <div className='w-full border-t' />\n </div>\n <div className='relative flex justify-center text-xs uppercase'>\n <span className='bg-card text-muted-foreground px-2'>{orContinueWithLabel}</span>\n </div>\n </div>\n\n <div className='grid grid-cols-3 gap-3'>\n {socialButtons.map(button => {\n const Icon = button.icon\n return (\n <Button\n key={button.name}\n type='button'\n variant='outline'\n aria-label={socialAriaLabelTemplate.replace('{provider}', button.name)}\n className='h-9 w-full cursor-pointer px-4 py-2'\n onClick={onSocialLogin ? () => onSocialLogin(button.name) : undefined}\n >\n <Icon className='size-5' aria-hidden='true' />\n </Button>\n )\n })}\n </div>\n </>\n )}\n </form>\n\n <p className='mt-6 flex justify-center gap-1 text-center text-sm'>\n <span>{dontHaveAccountLabel}</span>\n {onCreateAccount ? (\n <button type='button' onClick={onCreateAccount} className={createAccountClassName}>\n {createAccountLabel}\n </button>\n ) : (\n <span className={createAccountClassName}>{createAccountLabel}</span>\n )}\n </p>\n </Card>\n </div>\n </section>\n )\n}\n\nexport default LoginPage1","'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { Eye, EyeOff, type LucideIcon } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { Label } from '../../../ui/label'\nimport { Separator } from '../../../ui/separator'\nimport { CheckboxCheck } from '../../e-commerce/checkout-forms/checkbox-check'\n\nexport interface LoginPage2SocialButton {\n name: string\n icon: LucideIcon\n}\n\nexport interface LoginPage2Props {\n /** Brand text rendered next to the block logo. Omit to hide the logo. */\n logoText?: string\n welcomeTitleLabel?: string\n welcomeDescriptionLabel?: string\n emailLabel?: string\n emailPlaceholder?: string\n passwordLabel?: string\n passwordPlaceholder?: string\n rememberMeLabel?: string\n forgotPasswordLabel?: string\n signInLabel?: string\n orContinueWithLabel?: string\n /** Social login buttons rendered in a 2-column grid. Pass an empty array to hide. */\n socialButtons?: LoginPage2SocialButton[]\n dontHaveAccountLabel?: string\n signUpLabel?: string\n showPasswordLabel?: string\n hidePasswordLabel?: string\n onSubmit?: (email: string, password: string) => void\n onForgotPassword?: () => void\n onSignUp?: () => void\n}\n\nexport function LoginPage2({\n logoText,\n welcomeTitleLabel = 'Bienvenido de nuevo',\n welcomeDescriptionLabel = 'Ingresa tus credenciales para acceder a tu cuenta',\n emailLabel = 'Correo electrónico',\n emailPlaceholder = 'tucorreo@ejemplo.com',\n passwordLabel = 'Contraseña',\n passwordPlaceholder = 'Tu contraseña',\n rememberMeLabel = 'Recuérdame',\n forgotPasswordLabel = '¿Olvidaste tu contraseña?',\n signInLabel = 'Iniciar sesión',\n orContinueWithLabel = 'O continúa con',\n socialButtons = [],\n dontHaveAccountLabel = '¿No tienes una cuenta?',\n signUpLabel = 'Regístrate aquí',\n showPasswordLabel = 'Mostrar contraseña',\n hidePasswordLabel = 'Ocultar contraseña',\n onSubmit,\n onForgotPassword,\n onSignUp,\n}: LoginPage2Props) {\n const [showPassword, setShowPassword] = useState(false)\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault()\n onSubmit?.(email, password)\n }\n\n return (\n <div className='bg-background flex min-h-dvh items-center justify-center p-4 py-12'>\n <div className='flex w-full max-w-md flex-col gap-6'>\n {logoText && (\n <div className='mb-3 flex items-center gap-2 self-center font-medium'>\n {/* Logo mark uses the bg-muted token so it inherits the active theme. */}\n <div className='bg-muted flex size-10 items-center justify-center rounded-lg'>\n <svg width='32' height='32' className='text-primary' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n </div>\n <div className='text-2xl font-medium'>{logoText}</div>\n </div>\n )}\n <Card className='w-full max-w-md'>\n <CardHeader className='text-center'>\n <CardTitle className='text-2xl font-bold text-balance'>{welcomeTitleLabel}</CardTitle>\n <CardDescription>{welcomeDescriptionLabel}</CardDescription>\n </CardHeader>\n <CardContent className='flex flex-col gap-5'>\n <form className='flex flex-col gap-5' onSubmit={handleSubmit}>\n <div className='flex flex-col gap-3'>\n <Label htmlFor='email'>{emailLabel}</Label>\n <Input\n id='email'\n type='email'\n placeholder={emailPlaceholder}\n value={email}\n onChange={event => setEmail(event.target.value)}\n className='h-9 text-sm'\n />\n </div>\n <div className='flex flex-col gap-3'>\n <Label htmlFor='password'>{passwordLabel}</Label>\n <div className='relative'>\n <Input\n id='password'\n type={showPassword ? 'text' : 'password'}\n placeholder={passwordPlaceholder}\n value={password}\n onChange={event => setPassword(event.target.value)}\n className='h-9 pe-10 text-sm'\n />\n <Button\n type='button'\n variant='ghost'\n size='icon'\n className='absolute end-0 top-1/2 size-9 -translate-y-1/2 cursor-pointer hover:bg-transparent'\n onClick={() => setShowPassword(!showPassword)}\n >\n {showPassword ? (\n <EyeOff className='text-muted-foreground' />\n ) : (\n <Eye className='text-muted-foreground' />\n )}\n <span className='sr-only'>{showPassword ? hidePasswordLabel : showPasswordLabel}</span>\n </Button>\n </div>\n </div>\n <div className='flex items-center justify-between'>\n <div className='flex items-center gap-2'>\n <CheckboxCheck id='remember-me' />\n <Label\n htmlFor='remember-me'\n className='text-sm leading-none font-normal text-muted-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\n >\n {rememberMeLabel}\n </Label>\n </div>\n <Button variant='link' className='cursor-pointer p-0 text-sm' onClick={onForgotPassword}>\n {forgotPasswordLabel}\n </Button>\n </div>\n <Button type='submit' className='h-9 w-full cursor-pointer px-4 py-2'>\n {signInLabel}\n </Button>\n </form>\n\n {socialButtons.length > 0 && (\n <>\n {/* Flex divider rather than a rule masked by an opaque label: the mask has to\n match whatever surface it sits on, and on a card it did not. */}\n <div className='flex items-center gap-3'>\n <Separator className='flex-1' />\n <span className='text-muted-foreground text-xs uppercase'>{orContinueWithLabel}</span>\n <Separator className='flex-1' />\n </div>\n\n <div className='grid grid-cols-2 gap-4'>\n {socialButtons.map(button => (\n <Button key={button.name} variant='outline' className='h-9 w-full cursor-pointer px-4 py-2'>\n <button.icon />\n {button.name}\n </Button>\n ))}\n </div>\n </>\n )}\n\n <div className='text-muted-foreground text-center text-sm'>\n {dontHaveAccountLabel}{' '}\n <Button variant='link' className='cursor-pointer p-0 text-sm' onClick={onSignUp}>\n {signUpLabel}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n )\n}\n\nexport default LoginPage2","import type { FormEvent } from 'react'\nimport { Lock, Mail, User, type LucideIcon } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Card } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\n\nexport interface SignUpPage1SocialButton {\n name: string\n icon: LucideIcon\n}\n\nexport interface SignUpPage1Data {\n fullName: string\n email: string\n password: string\n}\n\nexport interface SignUpPage1Props {\n /** Brand text shown under the logo mark. Omit to hide it. */\n logoText?: string\n createAccountTitleLabel?: string\n createAccountDescriptionLabel?: string\n fullNameLabel?: string\n fullNamePlaceholder?: string\n emailLabel?: string\n emailPlaceholder?: string\n passwordLabel?: string\n passwordPlaceholder?: string\n createAccountLabel?: string\n orSignUpWithLabel?: string\n /** aria-label template for each social button. Use `{name}` as the button name placeholder. */\n socialAriaLabel?: string\n /** Social sign-up buttons rendered in a 3-column grid. Pass an empty array to hide. */\n socialButtons?: SignUpPage1SocialButton[]\n alreadyHaveAccountLabel?: string\n signInLabel?: string\n termsLabel?: string\n termsLinkLabel?: string\n termsHref?: string\n termsAndLabel?: string\n privacyLinkLabel?: string\n privacyHref?: string\n onSubmit?: (data: SignUpPage1Data) => void\n onSignIn?: () => void\n}\n\nexport function SignUpPage1({\n logoText,\n createAccountTitleLabel = 'Crea tu cuenta',\n createAccountDescriptionLabel = 'Completa el formulario para comenzar',\n fullNameLabel = 'Nombre completo',\n fullNamePlaceholder = 'Nombre completo',\n emailLabel = 'Correo electrónico',\n emailPlaceholder = 'me@ejemplo.com',\n passwordLabel = 'Contraseña',\n passwordPlaceholder = 'Crea una contraseña',\n createAccountLabel = 'Crear cuenta',\n orSignUpWithLabel = 'O regístrate con',\n socialAriaLabel = 'Continuar con {name}',\n socialButtons = [],\n alreadyHaveAccountLabel = '¿Ya tienes una cuenta?',\n signInLabel = 'Inicia sesión',\n termsLabel = 'Al crear una cuenta, aceptas los',\n termsLinkLabel = 'Términos de servicio',\n termsHref,\n termsAndLabel = 'y',\n privacyLinkLabel = 'Política de privacidad',\n privacyHref,\n onSubmit,\n onSignIn,\n}: SignUpPage1Props) {\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n onSubmit?.({\n fullName: String(formData.get('fullName') ?? ''),\n email: String(formData.get('email') ?? ''),\n password: String(formData.get('password') ?? ''),\n })\n }\n\n return (\n <section className='from-background to-muted/50 relative isolate flex min-h-dvh w-full flex-col items-center justify-center overflow-hidden bg-linear-to-br'>\n <div className='relative z-10 container mx-auto flex min-h-dvh flex-col items-center justify-center px-4 py-12'>\n <Card className='relative w-full max-w-lg p-8 shadow-2xl ring-0'>\n <div className='mb-8 flex flex-col items-center'>\n <div className='my-4 flex justify-center'>\n <div className='bg-secondary relative size-14 rounded-full border'>\n <div className='flex h-full items-center justify-center'>\n <svg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'>\n <path\n d='M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z'\n fill='currentColor'\n />\n <path\n d='M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z'\n fill='currentColor'\n />\n <path\n d='M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z'\n fill='currentColor'\n />\n <path\n d='M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z'\n fill='currentColor'\n />\n <path\n d='M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z'\n fill='currentColor'\n />\n <path d='M21.1694 10.5806L14.5651 17.1849' stroke='currentColor' />\n <path d='M22.1694 14.5806L18.5632 18.1868' stroke='currentColor' />\n <circle cx='13.1' cy='26.1' r='1.7' stroke='currentColor' />\n <circle cx='22.1' cy='26.1' r='1.7' stroke='currentColor' />\n </svg>\n </div>\n </div>\n </div>\n {logoText && <div className='text-base font-semibold tracking-tight'>{logoText}</div>}\n <h1 className='mb-2 mt-4 text-center text-2xl font-bold tracking-tight'>{createAccountTitleLabel}</h1>\n <p className='text-muted-foreground text-center text-sm'>{createAccountDescriptionLabel}</p>\n </div>\n\n <form className='flex flex-col gap-6' onSubmit={handleSubmit}>\n <div className='relative'>\n <Input\n id='fullname'\n name='fullName'\n type='text'\n placeholder={fullNamePlaceholder}\n aria-label={fullNameLabel}\n className='bg-transparent h-9 ps-10 text-sm'\n autoComplete='name'\n required\n />\n <User className='text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2' />\n </div>\n\n <div className='relative'>\n <Input\n id='email'\n name='email'\n type='email'\n placeholder={emailPlaceholder}\n aria-label={emailLabel}\n className='bg-transparent h-9 ps-10 text-sm'\n autoComplete='email'\n required\n />\n <Mail className='text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2' />\n </div>\n\n <div className='relative'>\n <Input\n id='password'\n name='password'\n type='password'\n placeholder={passwordPlaceholder}\n aria-label={passwordLabel}\n className='bg-transparent h-9 ps-10 text-sm'\n autoComplete='new-password'\n required\n />\n <Lock className='text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2' />\n </div>\n\n <Button className='h-9 w-full cursor-pointer px-4 py-2' type='submit'>\n {createAccountLabel}\n </Button>\n\n {socialButtons.length > 0 && (\n <>\n <div className='relative my-6 text-center'>\n <div className='absolute inset-0 flex items-center'>\n <div className='w-full border-t' />\n </div>\n <div className='relative flex justify-center text-xs uppercase'>\n <span className='bg-card text-muted-foreground px-2'>{orSignUpWithLabel}</span>\n </div>\n </div>\n\n <div className='grid grid-cols-3 gap-3'>\n {socialButtons.map(button => (\n <Button key={button.name} variant='outline' className='h-9 w-full cursor-pointer px-4 py-2'>\n <button.icon />\n <span className='sr-only'>{socialAriaLabel.replace('{name}', button.name)}</span>\n </Button>\n ))}\n </div>\n </>\n )}\n </form>\n\n <p className='mt-6 flex justify-center gap-1 text-center text-sm'>\n <span>{alreadyHaveAccountLabel}</span>\n {onSignIn ? (\n <button type='button' onClick={onSignIn} className='underline underline-offset-4'>\n {signInLabel}\n </button>\n ) : (\n <span className='underline underline-offset-4'>{signInLabel}</span>\n )}\n </p>\n </Card>\n\n <p className='text-muted-foreground relative z-10 mt-8 max-w-lg px-8 text-center text-xs text-balance'>\n {termsLabel}{' '}\n {termsHref ? (\n <a href={termsHref} className='hover:text-primary underline underline-offset-4'>\n {termsLinkLabel}\n </a>\n ) : (\n <span className='hover:text-primary underline underline-offset-4'>{termsLinkLabel}</span>\n )}{' '}\n {termsAndLabel}{' '}\n {privacyHref ? (\n <a href={privacyHref} className='hover:text-primary underline underline-offset-4'>\n {privacyLinkLabel}\n </a>\n ) : (\n <span className='hover:text-primary underline underline-offset-4'>{privacyLinkLabel}</span>\n )}\n .\n </p>\n </div>\n </section>\n )\n}\n\nexport default SignUpPage1","'use client'\n\nimport { useEffect, useState } from 'react'\nimport { Eye, EyeOff, Lock, Mail } from 'lucide-react'\n\nimport { Button } from '../../../ui/button'\nimport { Card, CardDescription, CardFooter, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { InputOTP, InputOTPGroup, InputOTPSlot } from '../../../ui/input-otp'\nimport { Progress } from '../../../ui/progress'\n\nimport ForgotPasswordPage1BrandMark from './forgot-password-page-1-brand-mark'\n\nexport interface ForgotPasswordPage1Props {\n /** Callback fired with the email when the user submits the reset-code step. */\n onSendResetCode?: (email: string) => void\n /** Callback fired with the 6-digit code when the user verifies it. */\n onVerifyCode?: (code: string) => void\n /** Callback fired when the user requests a new code. */\n onResendCode?: () => void\n /** Callback fired with the new password when the user sets it. */\n onSetNewPassword?: (password: string) => void\n /** Callback fired when the user goes back to login from the success step. */\n onBackToLogin?: () => void\n step1TitleLabel?: string\n step1DescriptionLabel?: string\n emailLabel?: string\n emailPlaceholder?: string\n sendResetCodeLabel?: string\n step2TitleLabel?: string\n step2DescriptionLabel?: string\n codeLabel?: string\n verifyCodeLabel?: string\n resendCodeLabel?: string\n resendCodeCooldownLabel?: string\n didNotReceiveLabel?: string\n step3TitleLabel?: string\n step3DescriptionLabel?: string\n newPasswordLabel?: string\n setNewPasswordLabel?: string\n strengthWeakLabel?: string\n strengthMediumLabel?: string\n strengthStrongLabel?: string\n strengthIndicatorLabel?: string\n step4TitleLabel?: string\n step4DescriptionLabel?: string\n backToLoginLabel?: string\n dontHaveAccountLabel?: string\n signUpLabel?: string\n showPasswordLabel?: string\n hidePasswordLabel?: string\n}\n\nconst RESEND_COOLDOWN_SECONDS = 30\n\n/**\n * Returns a password strength score from 0 to 100.\n * Adds 25 points per satisfied criterion: length >= 8, contains an\n * uppercase letter, contains a digit, and contains a non-alphanumeric\n * character. Used to gate the \"Set new password\" step and drive the\n * strength progress bar.\n */\nfunction passwordStrength(password: string) {\n let strength = 0\n if (password.length >= 8) strength += 25\n if (/[A-Z]/.test(password)) strength += 25\n if (/[0-9]/.test(password)) strength += 25\n if (/[^A-Za-z0-9]/.test(password)) strength += 25\n return strength\n}\n\nexport function ForgotPasswordPage1({\n onSendResetCode,\n onVerifyCode,\n onResendCode,\n onSetNewPassword,\n onBackToLogin,\n step1TitleLabel = '¿Olvidaste tu contraseña?',\n step1DescriptionLabel = 'Ingresa tu correo para restablecer tu contraseña',\n emailLabel = 'Correo electrónico',\n emailPlaceholder = 'tucorreo@ejemplo.com',\n sendResetCodeLabel = 'Enviar código de restablecimiento',\n step2TitleLabel = 'Revisa tu correo',\n step2DescriptionLabel = 'Ingresa el código de 6 dígitos enviado a {email}',\n codeLabel = 'Código de verificación',\n verifyCodeLabel = 'Verificar código',\n resendCodeLabel = 'Reenviar código',\n resendCodeCooldownLabel = 'Reenviar en {n}s',\n didNotReceiveLabel = '¿No lo recibiste?',\n step3TitleLabel = 'Crea una nueva contraseña',\n step3DescriptionLabel = 'Elige una contraseña segura para proteger tu cuenta',\n newPasswordLabel = 'Nueva contraseña',\n setNewPasswordLabel = 'Establecer nueva contraseña',\n strengthWeakLabel = 'Débil',\n strengthMediumLabel = 'Media',\n strengthStrongLabel = 'Fuerte',\n strengthIndicatorLabel = 'Indicador de fuerza de contraseña',\n step4TitleLabel = '¡Felicitaciones!',\n step4DescriptionLabel = 'Restableciste tu contraseña correctamente',\n backToLoginLabel = 'Volver al inicio de sesión',\n dontHaveAccountLabel = '¿Aún no tienes una cuenta?',\n signUpLabel = 'Regístrate',\n showPasswordLabel = 'Mostrar contraseña',\n hidePasswordLabel = 'Ocultar contraseña',\n}: ForgotPasswordPage1Props) {\n const [step, setStep] = useState(1)\n const [email, setEmail] = useState('')\n const [code, setCode] = useState('')\n const [password, setPassword] = useState('')\n const [showPassword, setShowPassword] = useState(false)\n const [resendCooldown, setResendCooldown] = useState(0)\n\n useEffect(() => {\n if (resendCooldown <= 0) return\n const timer = setInterval(() => {\n setResendCooldown(prev => (prev <= 1 ? 0 : prev - 1))\n }, 1000)\n return () => clearInterval(timer)\n }, [resendCooldown])\n\n const handleResend = () => {\n onResendCode?.()\n setResendCooldown(RESEND_COOLDOWN_SECONDS)\n }\n\n const renderStepContent = () => {\n switch (step) {\n case 1:\n return (\n <>\n <CardHeader className=\"pt-0 text-center\">\n <CardTitle className=\"text-2xl\">{step1TitleLabel}</CardTitle>\n <CardDescription>{step1DescriptionLabel}</CardDescription>\n </CardHeader>\n\n <div className=\"flex flex-col gap-6\">\n <div className=\"relative\">\n <Input\n id=\"email-forgot-password-page-1\"\n type=\"email\"\n placeholder={emailPlaceholder}\n className=\"bg-transparent ps-10 h-9 text-sm\"\n autoComplete=\"email\"\n aria-label={emailLabel}\n value={email}\n onChange={e => setEmail(e.target.value)}\n required\n />\n <Mail className=\"text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2\" />\n </div>\n <Button\n type=\"button\"\n className=\"h-9 px-4 py-2 w-full cursor-pointer\"\n onClick={() => {\n onSendResetCode?.(email)\n setStep(2)\n }}\n disabled={!email}\n >\n {sendResetCodeLabel}\n </Button>\n <p className=\"mt-6 flex justify-center gap-1 text-center text-sm\">\n <span>{dontHaveAccountLabel}</span>\n <a href=\"#\" className=\"underline underline-offset-4\">\n {signUpLabel}\n </a>\n </p>\n </div>\n </>\n )\n\n case 2:\n return (\n <>\n <div className=\"mb-6 text-center\">\n <h1 className=\"mb-2 text-2xl font-bold tracking-tight text-balance\">{step2TitleLabel}</h1>\n <p className=\"text-muted-foreground text-sm text-balance\">\n {step2DescriptionLabel.replace('{email}', email || 'tu correo')}\n </p>\n </div>\n\n <div className=\"flex flex-col gap-6\">\n <InputOTP\n maxLength={6}\n value={code}\n onChange={value => setCode(value)}\n aria-label={codeLabel}\n >\n <InputOTPGroup className=\"grid w-full grid-cols-6 gap-2 sm:gap-3\">\n <InputOTPSlot index={0} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n <InputOTPSlot index={1} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n <InputOTPSlot index={2} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n <InputOTPSlot index={3} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n <InputOTPSlot index={4} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n <InputOTPSlot index={5} className=\"h-12 w-auto flex-1 rounded-md border-l text-lg\" />\n </InputOTPGroup>\n </InputOTP>\n <Button\n type=\"button\"\n className=\"h-9 px-4 py-2 w-full cursor-pointer\"\n onClick={() => {\n onVerifyCode?.(code)\n setStep(3)\n }}\n disabled={code.length < 6}\n >\n {verifyCodeLabel}\n </Button>\n <p className=\"text-muted-foreground text-center text-sm\">\n {didNotReceiveLabel}{' '}\n <Button\n variant=\"link\"\n className=\"cursor-pointer px-1 font-medium underline underline-offset-4 hover:underline\"\n onClick={handleResend}\n disabled={resendCooldown > 0}\n >\n {resendCooldown > 0\n ? resendCodeCooldownLabel.replace('{n}', String(resendCooldown))\n : resendCodeLabel}\n </Button>\n </p>\n </div>\n </>\n )\n\n case 3: {\n const strength = passwordStrength(password)\n const strengthLabel =\n strength === 0 ? '' : strength < 50 ? strengthWeakLabel : strength < 75 ? strengthMediumLabel : strengthStrongLabel\n return (\n <>\n <div className=\"mb-6 text-center\">\n <h1 className=\"mb-2 text-2xl font-bold tracking-tight text-balance\">{step3TitleLabel}</h1>\n <p className=\"text-muted-foreground text-sm text-balance\">{step3DescriptionLabel}</p>\n </div>\n\n <div className=\"flex flex-col gap-6\">\n <div className=\"relative\">\n <Input\n id=\"new-password-forgot-password-page-1\"\n type={showPassword ? 'text' : 'password'}\n placeholder={newPasswordLabel}\n className=\"bg-transparent ps-10 text-sm\"\n autoComplete=\"new-password\"\n aria-label={newPasswordLabel}\n value={password}\n onChange={e => setPassword(e.target.value)}\n required\n />\n <Lock className=\"text-muted-foreground absolute start-3 top-1/2 size-5 -translate-y-1/2\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-9 text-muted-foreground absolute end-1 top-1/2 -translate-y-1/2 cursor-pointer hover:bg-transparent\"\n onClick={() => setShowPassword(prev => !prev)}\n aria-label={showPassword ? hidePasswordLabel : showPasswordLabel}\n >\n {showPassword ? <EyeOff /> : <Eye />}\n </Button>\n </div>\n <div className=\"flex flex-col gap-1\">\n <Progress value={strength} className=\"h-2\" aria-label={strengthIndicatorLabel} />\n <small className=\"text-muted-foreground block text-end text-xs\">{strengthLabel}</small>\n </div>\n\n <Button\n type=\"button\"\n className=\"h-9 px-4 py-2 w-full cursor-pointer\"\n onClick={() => {\n onSetNewPassword?.(password)\n setStep(4)\n }}\n disabled={strength < 75}\n >\n {setNewPasswordLabel}\n </Button>\n </div>\n </>\n )\n }\n\n case 4:\n return (\n <>\n <CardHeader className=\"mb-4 pt-0 text-center\">\n <CardTitle className=\"text-2xl\">{step4TitleLabel}</CardTitle>\n <CardDescription>{step4DescriptionLabel}</CardDescription>\n </CardHeader>\n <CardFooter>\n <Button\n className=\"h-9 px-4 py-2 w-full cursor-pointer\"\n onClick={() => {\n onBackToLogin?.()\n setStep(1)\n }}\n >\n {backToLoginLabel}\n </Button>\n </CardFooter>\n </>\n )\n default:\n return null\n }\n }\n\n return (\n <section className=\"from-background to-muted/50 relative isolate flex min-h-dvh w-full items-center justify-center overflow-hidden bg-linear-to-br\">\n <div className=\"relative z-10 container mx-auto flex min-h-dvh items-center justify-center px-4 py-12 sm:py-16\">\n <Card className=\"bg-background/80 relative w-full max-w-md ring-0 p-6 shadow-2xl backdrop-blur-md sm:p-8\">\n <ForgotPasswordPage1BrandMark />\n {renderStepContent()}\n </Card>\n </div>\n </section>\n )\n}\n\nexport default ForgotPasswordPage1","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"relative flex h-9 w-9 items-center justify-center border-y border-r border-input text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-[3px] data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","export function ForgotPasswordPage1BrandMark() {\n return (\n <div className=\"my-4 flex justify-center\">\n <div className=\"bg-secondary relative size-14 rounded-full border\">\n <div className=\"flex h-full items-center justify-center\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path\n d=\"M26 24.75C26.4142 24.75 26.75 24.4142 26.75 24C26.75 23.5858 26.4142 23.25 26 23.25V24.75ZM26 23.25H11V24.75H26V23.25ZM8.75 21V15H7.25V21H8.75ZM11 23.25C9.75736 23.25 8.75 22.2426 8.75 21H7.25C7.25 23.0711 8.92893 24.75 11 24.75V23.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M1.5 3.25C1.08579 3.25 0.75 3.58579 0.75 4C0.75 4.41421 1.08579 4.75 1.5 4.75V3.25ZM1.5 4.75H6V3.25H1.5V4.75ZM7.25 6V21H8.75V6H7.25ZM6 4.75C6.69036 4.75 7.25 5.30964 7.25 6H8.75C8.75 4.48122 7.51878 3.25 6 3.25V4.75Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22 21.75C22.4142 21.75 22.75 21.4142 22.75 21C22.75 20.5858 22.4142 20.25 22 20.25V21.75ZM22 20.25H11V21.75H22V20.25ZM8.75 18V12H7.25V18H8.75ZM11 20.25C9.75736 20.25 8.75 19.2426 8.75 18H7.25C7.25 20.0711 8.92893 21.75 11 21.75V20.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M27.2057 19.754C27.0654 20.1438 26.6357 20.346 26.246 20.2057C25.8562 20.0654 25.654 19.6357 25.7943 19.246L27.2057 19.754ZM30.0361 9.67744L29.3305 9.4234L29.3305 9.4234L30.0361 9.67744ZM25.7943 19.246L29.3305 9.4234L30.7418 9.93148L27.2057 19.754L25.7943 19.246ZM28.1543 7.75L8 7.75V6.25L28.1543 6.25V7.75ZM29.3305 9.4234C29.6237 8.60882 29.0201 7.75 28.1543 7.75V6.25C30.059 6.25 31.3869 8.13941 30.7418 9.93148L29.3305 9.4234Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M13.5 21.75C13.0858 21.75 12.75 21.4142 12.75 21C12.75 20.5858 13.0858 20.25 13.5 20.25V21.75ZM26.7111 19.009L27.4174 19.2613L27.4174 19.2613L26.7111 19.009ZM13.5 20.25H23.8858V21.75H13.5V20.25ZM26.0048 18.7568L27.7937 13.7477L29.2063 14.2523L27.4174 19.2613L26.0048 18.7568ZM23.8858 20.25C24.8367 20.25 25.6849 19.6522 26.0048 18.7568L27.4174 19.2613C26.8843 20.7537 25.4706 21.75 23.8858 21.75V20.25Z\"\n fill=\"currentColor\"\n />\n <path d=\"M21.1694 10.5806L14.5651 17.1849\" stroke=\"currentColor\" />\n <path d=\"M22.1694 14.5806L18.5632 18.1868\" stroke=\"currentColor\" />\n <circle cx=\"13.1\" cy=\"26.1\" r=\"1.7\" stroke=\"currentColor\" />\n <circle cx=\"22.1\" cy=\"26.1\" r=\"1.7\" stroke=\"currentColor\" />\n </svg>\n </div>\n </div>\n </div>\n )\n}\n\nexport default ForgotPasswordPage1BrandMark","'use client'\n\nimport { useEffect, useId, useState, type FormEvent } from 'react'\nimport { KeyRound, Loader2, ShieldCheck } from 'lucide-react'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../../ui/card'\nimport { Input } from '../../../ui/input'\nimport { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from '../../../ui/input-otp'\nimport { Label } from '../../../ui/label'\nimport { Confetti } from './verify-confetti'\n\n/**\n * Bloque de verificación de dos factores (solo render).\n *\n * Este bloque NO valida credenciales reales, no crea sesiones ni se comunica con\n * ningún backend. Para producción, conecta la verificación real a través de las\n * props `onVerify` y `onVerifyBackup` (devuelven `Promise<boolean>`) y de `onResend`\n * / `onContinue`. Si no se proporcionan, se usa una demo interna documentada:\n * código `123456`, código de respaldo `CQ4T-9WLM`, máximo 3 intentos antes del\n * bloqueo y reenvío con espera de 30 segundos. La máquina de estados (modo\n * otp/respaldo, intentos, bloqueo, cuenta atrás, verificado, pendiente) es el\n * comportamiento valioso del bloque y se conserva en ambos modos.\n */\n\nconst acceptedCode = '123456'\nconst acceptedBackupCode = 'CQ4T-9WLM'\nconst maxAttempts = 3\nconst resendCooldownSeconds = 30\n\nasync function demoVerifyCode(code: string): Promise<boolean> {\n await new Promise(resolve => setTimeout(resolve, 700))\n return code === acceptedCode\n}\n\nasync function demoVerifyBackupCode(code: string): Promise<boolean> {\n await new Promise(resolve => setTimeout(resolve, 700))\n return code.trim().toUpperCase() === acceptedBackupCode\n}\n\nexport interface Verify1Props {\n verifyTitleLabel?: string\n verifyDescriptionLabel?: string\n backupCodeTitleLabel?: string\n backupCodeDescriptionLabel?: string\n backupCodeLabel?: string\n backupCodePlaceholder?: string\n otpAriaLabel?: string\n verifyLabel?: string\n resendCodeLabel?: string\n /** Plantilla con {n} sustituido por los segundos restantes. */\n resendCooldownLabel?: string\n useBackupCodeLabel?: string\n useAuthenticatorLabel?: string\n tooManyAttemptsLabel?: string\n /** Plantilla con {n} sustituido por los intentos restantes. */\n attemptsLeftLabel?: string\n verifiedTitleLabel?: string\n verifiedDescriptionLabel?: string\n continueLabel?: string\n demoOtpHintLabel?: string\n /** Plantilla con {code} sustituido por el código de respaldo de la demo. */\n demoBackupHintLabel?: string\n /** Verificación real del código OTP. Devuelve true si es correcto. */\n onVerify?: (code: string) => Promise<boolean>\n /** Verificación real del código de respaldo. Devuelve true si es correcto. */\n onVerifyBackup?: (code: string) => Promise<boolean>\n /** Se dispara al pedir reenviar el código. */\n onResend?: () => void\n /** Se dispara al continuar tras la verificación. */\n onContinue?: () => void\n}\n\nexport function Verify1({\n verifyTitleLabel = 'Verificación de dos factores',\n verifyDescriptionLabel = 'Ingresa el código de 6 dígitos de tu aplicación de autenticación',\n backupCodeTitleLabel = 'Usa un código de respaldo',\n backupCodeDescriptionLabel = 'Ingresa uno de tus códigos de respaldo de un solo uso',\n backupCodeLabel = 'Código de respaldo',\n backupCodePlaceholder = 'XXXX-XXXX',\n otpAriaLabel = 'Código de verificación',\n verifyLabel = 'Verificar',\n resendCodeLabel = 'Reenviar código',\n resendCooldownLabel = 'Reenviar código en {n}s',\n useBackupCodeLabel = 'Usar un código de respaldo en su lugar',\n useAuthenticatorLabel = 'Usa tu aplicación de autenticación',\n tooManyAttemptsLabel = 'Demasiados códigos incorrectos. Espera quince minutos o usa un código de respaldo.',\n attemptsLeftLabel = 'Ese código no es correcto. Te quedan {n} intentos.',\n verifiedTitleLabel = 'Verificación completa',\n verifiedDescriptionLabel = 'Este dispositivo es de confianza por treinta días. Puedes revocarlo desde la configuración de seguridad.',\n continueLabel = 'Continuar',\n demoOtpHintLabel = 'Prueba 123456 en esta demo.',\n demoBackupHintLabel = 'Prueba {code} en esta demo. Cada código funciona una sola vez.',\n onVerify,\n onVerifyBackup,\n onResend,\n onContinue,\n}: Verify1Props) {\n const backupId = useId()\n const [mode, setMode] = useState<'otp' | 'backup'>('otp')\n const [code, setCode] = useState('')\n const [backup, setBackup] = useState('')\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [attempts, setAttempts] = useState(0)\n const [verified, setVerified] = useState(false)\n const [cooldown, setCooldown] = useState(resendCooldownSeconds)\n\n const locked = attempts >= maxAttempts\n\n useEffect(() => {\n if (cooldown <= 0) {\n return\n }\n\n const timer = window.setTimeout(() => setCooldown(current => current - 1), 1000)\n return () => window.clearTimeout(timer)\n }, [cooldown])\n\n const handleResend = () => {\n onResend?.()\n setCooldown(resendCooldownSeconds)\n }\n\n const submit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n\n if (locked) {\n return\n }\n\n setPending(true)\n setError(null)\n\n try {\n const ok =\n mode === 'otp'\n ? onVerify\n ? await onVerify(code)\n : await demoVerifyCode(code)\n : onVerifyBackup\n ? await onVerifyBackup(backup)\n : await demoVerifyBackupCode(backup)\n\n if (ok) {\n setVerified(true)\n return\n }\n\n const next = attempts + 1\n setAttempts(next)\n setCode('')\n setBackup('')\n setError(\n next >= maxAttempts\n ? tooManyAttemptsLabel\n : attemptsLeftLabel.replace('{n}', String(maxAttempts - next)),\n )\n } finally {\n setPending(false)\n }\n }\n\n if (verified) {\n return (\n <div className='bg-muted/30 relative flex min-h-dvh w-full items-center justify-center overflow-hidden px-4 py-12'>\n {/* Fired once, over the whole field rather than the card, so the paper has somewhere\n to fall. The success is stated in the heading below; this only decorates it. */}\n <Confetti fire origin={{ x: 0.5, y: 0.5 }} />\n\n <Card className='relative w-full max-w-md gap-6 py-8 shadow-lg'>\n <CardContent className='flex flex-col items-center gap-4 px-8 py-8 text-center'>\n <span\n aria-hidden='true'\n className='bg-primary/10 text-primary flex size-14 items-center justify-center rounded-full'\n >\n <ShieldCheck className='size-7' />\n </span>\n <h1 className='text-2xl font-semibold tracking-tight'>{verifiedTitleLabel}</h1>\n <p className='text-muted-foreground max-w-xs text-sm'>{verifiedDescriptionLabel}</p>\n <Button className='mt-2' onClick={onContinue}>\n {continueLabel}\n </Button>\n </CardContent>\n </Card>\n </div>\n )\n }\n\n return (\n <div className='bg-muted/30 flex min-h-dvh w-full items-center justify-center px-4 py-12'>\n <Card className='w-full max-w-md gap-6 py-8 shadow-lg'>\n <CardHeader className='gap-2 px-8 text-center'>\n <span\n aria-hidden='true'\n className='bg-muted text-muted-foreground mx-auto mb-3 flex size-14 items-center justify-center rounded-full'\n >\n {mode === 'otp' ? <ShieldCheck className='size-6' /> : <KeyRound className='size-6' />}\n </span>\n <CardTitle className='text-2xl font-semibold tracking-tight'>\n {mode === 'otp' ? verifyTitleLabel : backupCodeTitleLabel}\n </CardTitle>\n <CardDescription>\n {mode === 'otp' ? verifyDescriptionLabel : backupCodeDescriptionLabel}\n </CardDescription>\n </CardHeader>\n\n <CardContent className='px-8'>\n <form onSubmit={submit} noValidate className='flex flex-col items-center gap-6'>\n {mode === 'otp' ? (\n <>\n <InputOTP\n maxLength={6}\n value={code}\n onChange={setCode}\n disabled={pending || locked}\n aria-label={otpAriaLabel}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? 'verify-error' : undefined}\n >\n <InputOTPGroup>\n <InputOTPSlot index={0} className='size-12 text-lg' />\n <InputOTPSlot index={1} className='size-12 text-lg' />\n <InputOTPSlot index={2} className='size-12 text-lg' />\n </InputOTPGroup>\n <InputOTPSeparator />\n <InputOTPGroup>\n <InputOTPSlot index={3} className='size-12 text-lg' />\n <InputOTPSlot index={4} className='size-12 text-lg' />\n <InputOTPSlot index={5} className='size-12 text-lg' />\n </InputOTPGroup>\n </InputOTP>\n <p className='text-muted-foreground text-xs'>{demoOtpHintLabel}</p>\n </>\n ) : (\n <div className='grid w-full gap-2'>\n <Label htmlFor={backupId}>{backupCodeLabel}</Label>\n <Input\n id={backupId}\n value={backup}\n onChange={event => setBackup(event.target.value)}\n placeholder={backupCodePlaceholder}\n autoComplete='one-time-code'\n className='font-mono tracking-wider'\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? 'verify-error' : `${backupId}-hint`}\n disabled={pending || locked}\n />\n <p id={`${backupId}-hint`} className='text-muted-foreground text-xs'>\n {demoBackupHintLabel.replace('{code}', acceptedBackupCode)}\n </p>\n </div>\n )}\n\n {error ? (\n <p id='verify-error' role='alert' className='text-destructive text-center text-sm'>\n {error}\n </p>\n ) : null}\n\n <Button\n type='submit'\n className='w-full'\n disabled={\n pending || locked || (mode === 'otp' ? code.length < 6 : backup.trim() === '')\n }\n aria-busy={pending}\n >\n {pending ? <Loader2 className='size-4 animate-spin' aria-hidden='true' /> : null}\n {verifyLabel}\n </Button>\n\n <div className='flex w-full flex-col items-center gap-1 pt-1'>\n {mode === 'otp' ? (\n <Button\n type='button'\n variant='ghost'\n size='sm'\n disabled={cooldown > 0}\n onClick={handleResend}\n >\n {cooldown > 0\n ? resendCooldownLabel.replace('{n}', String(cooldown))\n : resendCodeLabel}\n </Button>\n ) : null}\n\n <Button\n type='button'\n variant='link'\n size='sm'\n className='text-muted-foreground'\n onClick={() => {\n setMode(current => (current === 'otp' ? 'backup' : 'otp'))\n setError(null)\n }}\n >\n {mode === 'otp' ? useBackupCodeLabel : useAuthenticatorLabel}\n </Button>\n </div>\n </form>\n </CardContent>\n </Card>\n </div>\n )\n}\n\nexport default Verify1","'use client'\n\nimport { useCallback, useEffect, useImperativeHandle, useRef } from 'react'\n\nimport { cn } from '../../../lib/utils'\n\n/**\n * @title Confetti burst\n * @description Canvas confetti fired once when something succeeds, with no animation library.\n *\n * Deliberately dependency-free. Every other confetti component reaches for `canvas-confetti`,\n * which means a buyer pasting one block also installs a package. This is roughly a hundred\n * lines of the same physics: throw particles from an origin, apply gravity and drag, spin them,\n * fade them out, stop the loop when the last one dies.\n *\n * The canvas is `pointer-events-none` and `aria-hidden`, so it can never sit between a person\n * and the button underneath it, and a screen reader never announces it. Success has to be\n * stated in text as well; confetti is not a message.\n *\n * Under `prefers-reduced-motion` it renders nothing at all. A burst of moving particles is the\n * exact thing that setting is asking us not to do, and dropping it costs no information.\n */\nconst GRAVITY = 0.24\nconst DRAG = 0.992\nconst TERMINAL_VELOCITY = 7\nconst DECAY = 0.0125\n\n/** Bright by default: a monochrome theme would fire grey paper, which reads as dust. */\nconst DEFAULT_COLORS = ['#f43f5e', '#f59e0b', '#22c55e', '#3b82f6', '#a855f7', '#14b8a6']\n\nexport interface ConfettiHandle {\n /** Fire a burst now. Repeated calls stack rather than restart. */\n fire: () => void\n}\n\nexport interface ConfettiProps extends Omit<React.ComponentProps<'canvas'>, 'ref'> {\n /** Flip to true to fire. Firing again needs a flip back to false first. */\n fire?: boolean\n /** Particles per burst. */\n count?: number\n /** Origin inside the canvas, 0 to 1 on each axis. */\n origin?: { x: number; y: number }\n /** How far the burst throws, in canvas pixels per frame. */\n spread?: number\n colors?: string[]\n ref?: React.Ref<ConfettiHandle>\n}\n\ntype Particle = {\n x: number\n y: number\n vx: number\n vy: number\n size: number\n tilt: number\n spin: number\n life: number\n color: string\n}\n\nexport function Confetti({\n fire = false,\n count = 90,\n origin = { x: 0.5, y: 0.45 },\n spread = 11,\n colors = DEFAULT_COLORS,\n className,\n ref,\n ...props\n}: ConfettiProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const particlesRef = useRef<Particle[]>([])\n const frameRef = useRef<number | null>(null)\n\n const draw = useCallback(() => {\n const canvas = canvasRef.current\n const context = canvas?.getContext('2d')\n\n if (!canvas || !context) {\n return\n }\n\n const ratio = window.devicePixelRatio || 1\n context.clearRect(0, 0, canvas.width, canvas.height)\n\n const alive: Particle[] = []\n\n for (const particle of particlesRef.current) {\n particle.vy = Math.min(particle.vy + GRAVITY, TERMINAL_VELOCITY)\n particle.vx *= DRAG\n particle.x += particle.vx\n particle.y += particle.vy\n particle.tilt += particle.spin\n particle.life -= DECAY\n\n if (particle.life <= 0) {\n continue\n }\n\n alive.push(particle)\n\n context.save()\n context.translate(particle.x * ratio, particle.y * ratio)\n context.rotate(particle.tilt)\n context.globalAlpha = Math.min(1, particle.life)\n context.fillStyle = particle.color\n // Scaling the height by the tilt is what sells a flat rectangle as a tumbling\n // piece of paper. Without it the pieces read as falling dots.\n context.fillRect(\n (-particle.size / 2) * ratio,\n (-particle.size / 4) * ratio,\n particle.size * ratio,\n ((particle.size / 2) * Math.abs(Math.cos(particle.tilt)) + 1) * ratio,\n )\n context.restore()\n }\n\n particlesRef.current = alive\n\n if (alive.length > 0) {\n frameRef.current = window.requestAnimationFrame(draw)\n return\n }\n\n frameRef.current = null\n context.clearRect(0, 0, canvas.width, canvas.height)\n }, [])\n\n const start = useCallback(() => {\n const canvas = canvasRef.current\n\n if (!canvas || window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n return\n }\n\n const ratio = window.devicePixelRatio || 1\n const { width, height } = canvas.getBoundingClientRect()\n\n canvas.width = Math.round(width * ratio)\n canvas.height = Math.round(height * ratio)\n\n for (let index = 0; index < count; index += 1) {\n // Biased upward: paper thrown sideways at the floor never looks celebratory.\n const angle = Math.PI * (1.15 + Math.random() * 0.7)\n const velocity = spread * (0.45 + Math.random() * 0.55)\n\n particlesRef.current.push({\n x: origin.x * width,\n y: origin.y * height,\n vx: Math.cos(angle) * velocity,\n vy: Math.sin(angle) * velocity,\n size: 6 + Math.random() * 6,\n tilt: Math.random() * Math.PI,\n spin: (Math.random() - 0.5) * 0.34,\n life: 1,\n color: colors[index % colors.length],\n })\n }\n\n if (frameRef.current === null) {\n frameRef.current = window.requestAnimationFrame(draw)\n }\n }, [colors, count, draw, origin.x, origin.y, spread])\n\n useImperativeHandle(ref, () => ({ fire: start }), [start])\n\n useEffect(() => {\n if (fire) {\n start()\n }\n }, [fire, start])\n\n useEffect(\n () => () => {\n if (frameRef.current !== null) {\n window.cancelAnimationFrame(frameRef.current)\n }\n },\n [],\n )\n\n return (\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n className={cn('pointer-events-none absolute inset-0 z-10 size-full', className)}\n {...props}\n />\n )\n}\n\nexport default Confetti"],"mappings":"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","names":["cn","cva","cn","Slot","jsx","cn","jsx","cn","jsx","cn","jsx","cn","jsx","jsx","cn","jsx","jsxs","useState","Menu","cn","jsx","jsxs","cva","cn","ChevronDownIcon","jsx","jsxs","Fragment","jsx","jsxs","Logo","useState","Menu","useState","Menu","Fragment","jsx","jsxs","Logo","useState","Menu","useEffect","useRef","useState","AnimatePresence","motion","useReducedMotion","Menu","Search","ShoppingBag","X","cn","jsx","jsxs","jsx","cn","jsx","cn","jsx","jsxs","useEffect","useState","motion","useReducedMotion","cva","cn","jsx","money","Fragment","jsx","jsxs","useReducedMotion","useState","useEffect","motion","cva","cn","cn","jsx","cn","jsx","jsx","cn","cva","jsx","cn","jsx","jsxs","useState","z","z","jsx","z","jsx","jsxs","z","useState","ChevronRight","useEffect","useState","z","Fragment","jsx","jsxs","z","useState","useEffect","ChevronRight","Fragment","jsx","jsxs","Logo","useReducedMotion","AnimatePresence","motion","formatMoney","useState","useRef","useEffect","Menu","X","Search","ShoppingBag","useEffect","useState","motion","useReducedMotion","ArrowRight","X","useEffect","useState","jsx","useState","useEffect","jsx","jsxs","useState","useReducedMotion","useEffect","ArrowRight","X","motion","React","useEffect","useState","jsx","LIFT","FALLOFF","ACTIVE_SCALE","DURATION","EASE_IN","EASE_OUT","AvatarGroup","useState","useEffect","jsx","jsxs","rating","AvatarGroup","ArrowRight","jsx","jsxs","ArrowRight","jsx","jsxs","jsx","jsxs","React","Star","React","cn","ArrowRight","jsx","jsxs","api","cn","ArrowRight","jsx","jsxs","rating","Star","jsx","jsxs","jsx","jsxs","ArrowRight","jsx","jsxs","ArrowRight","cn","jsx","jsx","jsxs","cn","jsx","jsx","iconMap","jsx","jsxs","ArrowRight","jsx","jsxs","ArrowRight","ArrowRight","jsx","jsxs","ArrowRight","MapPin","Phone","Fragment","jsx","jsxs","Star","motion","useReducedMotion","jsx","jsxs","useReducedMotion","motion","Star","Star","jsx","jsxs","Star","useState","Heart","Star","Sparkles","useEffect","useRef","useState","jsx","jsxs","useEffect","useState","useRef","jsx","jsxs","Sparkles","useState","Star","Heart","useState","useRef","useState","jsx","useRef","useState","cn","jsx","cn","CheckIcon","ChevronDownIcon","jsx","jsxs","jsxs","cn","jsx","CheckIcon","jsx","cn","ChevronDownIcon","Heart","ShoppingCart","Star","Search","useEffect","useRef","useState","jsx","jsxs","PARTICLE_COUNT","STYLE_MARKER","STYLES","useReactionToggleStyles","useEffect","buildParticles","useState","useRef","jsx","jsxs","useState","renderStars","rating","Star","Search","Heart","ShoppingCart","useMemo","useState","ChevronLeft","ChevronRight","Star","motion","useReducedMotion","jsx","jsxs","compareAtText","useReducedMotion","useMemo","useState","motion","Star","ChevronLeft","ChevronRight","useState","Heart","Minus","Plus","Star","z","z","useEffect","useRef","useState","jsx","jsxs","PARTICLE_COUNT","STYLE_MARKER","STYLES","useReactionToggleStyles","useEffect","buildParticles","useState","useRef","jsx","jsxs","rating","useState","Star","Minus","Plus","Heart","useState","useEffect","Heart","ShoppingBag","Star","Check","jsx","jsxs","useState","useEffect","Check","Star","ShoppingBag","Heart","useState","Camera","Heart","Package","ShoppingCart","Star","jsx","jsxs","useState","ChevronLeft","ChevronRight","X","cn","XIcon","jsx","jsxs","cn","XIcon","jsx","cn","Fragment","jsx","jsxs","useState","X","ChevronLeft","ChevronRight","Star","jsx","jsxs","rating","Star","jsx","jsx","jsxs","renderStars","rating","Star","useState","ShoppingCart","Heart","Package","Camera","useState","Eye","Star","jsx","jsxs","Eye","Star","useEffect","useMemo","useState","AnimatePresence","motion","useReducedMotion","Check","Minus","Plus","Star","cva","cn","Slot","jsx","cva","cn","Slot","React","cn","cva","cn","jsx","jsx","cn","Fragment","jsx","jsxs","money","useReducedMotion","useState","useEffect","useMemo","AnimatePresence","motion","Star","Minus","Plus","Check","jsx","jsxs","useState","useMemo","useState","Star","cn","ChevronRightIcon","jsx","jsxs","cn","ChevronRightIcon","useState","Star","cn","jsx","jsx","jsxs","useState","rating","Star","jsx","jsxs","useState","useMemo","Star","useEffect","useState","Calendar","MessageCircle","Star","ThumbsUp","jsx","jsxs","useState","useEffect","Star","rating","Calendar","ThumbsUp","MessageCircle","ArrowRight","Camera","Sparkles","Wrench","X","jsx","jsxs","ArrowRight","ShoppingBag","jsx","jsxs","ShoppingBag","React","useEffect","useState","jsx","LIFT","FALLOFF","ACTIVE_SCALE","DURATION","EASE_IN","EASE_OUT","AvatarGroup","useState","useEffect","Fragment","jsx","jsxs","ShoppingBag","AvatarGroup","useState","ArrowRight","Search","Home","Heart","Car","Utensils","Wrench","jsx","jsxs","categoryIcons","Home","Heart","Car","Utensils","Wrench","useState","Search","ArrowRight","Fragment","ChevronLeft","z","cn","ChevronRight","Slot","jsx","jsxs","jsx","jsxs","z","Breadcrumb","ChevronLeft","Fragment","z","jsx","z","useEffect","useState","z","jsx","z","useState","useEffect","z","jsx","jsxs","z","useState","Search","X","jsx","jsxs","useState","Search","X","useEffect","useId","useState","Search","SlidersHorizontal","X","useId","useLayoutEffect","useRef","useState","CheckboxPrimitive","jsx","BOX_MS","DRAW_MS","UNCHECK_MS","EASE","CheckboxCheck","useRef","useState","useLayoutEffect","CheckboxPrimitive","Fragment","jsx","jsxs","useId","CheckboxCheck","Fragment","jsx","jsxs","X","useId","useState","useEffect","SlidersHorizontal","Search","useState","SlidersHorizontal","X","jsx","jsxs","X","useEffect","useRef","useState","useReducedMotion","cn","jsx","jsxs","jsx","jsx","cn","jsxs","jsx","cn","jsx","jsxs","CheckboxCheck","jsx","jsxs","useReducedMotion","useState","useRef","useEffect","jsx","cn","CircleIcon","jsx","jsx","jsxs","useMemo","useState","Fragment","jsx","jsxs","useState","SlidersHorizontal","Minus","Package","Plus","Shield","ShoppingBag","Store","useEffect","useRef","jsx","jsxs","DURATION","useRef","useEffect","jsx","jsxs","ShoppingBag","Minus","Plus","Package","Shield","Store","useState","ArrowLeft","Shield","ShoppingBag","Truck","Heart","Minus","Plus","Trash2","jsx","jsxs","Trash2","Heart","Minus","Plus","jsx","jsxs","useEffect","useRef","jsx","jsxs","CELL_SIZE","DURATION","STAGGER","SPINS","SPIN_BLUR","REEL_DIGITS","useRef","useEffect","Fragment","jsx","jsxs","ShoppingCart2","useState","ShoppingBag","ArrowLeft","Truck","Shield","useState","ShoppingCart","Zap","CreditCard","Minus","Plus","X","Fragment","jsx","jsxs","usdFormatter","ShoppingCart4","useState","money","ShoppingCart","X","Plus","Minus","Zap","CreditCard","ArrowRight","Clock","Heart","Minus","Plus","ShoppingBag","Trash2","useEffect","useRef","jsx","jsxs","CELL_SIZE","DURATION","STAGGER","SPINS","SPIN_BLUR","REEL_DIGITS","useRef","useEffect","Fragment","jsx","jsxs","ShoppingCart3","jsx","jsxs","CheckboxCheck","Heart","Fragment","Clock","Minus","Plus","Trash2","ShoppingBag","ArrowRight","jsx","useState","useMemo","cva","cn","jsx","jsxs","cn","cva","jsx","cn","useMemo","jsx","cn","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","Eye","Fragment","jsx","jsxs","useState","Eye","CheckboxCheck","Shield","Truck","jsx","jsxs","Truck","Shield","jsx","jsxs","jsx","jsxs","formatMoney","useState","useState","ArrowLeft","Lock","Package","Truck","jsx","jsxs","Truck","CreditCard","Shield","jsx","jsxs","CreditCard","Shield","Truck","jsx","jsxs","Truck","CheckboxCheck","jsx","jsxs","useState","ArrowLeft","Package","CheckboxCheck","Lock","useState","ChevronLeft","ChevronRight","Lock","jsx","jsxs","CheckboxCheck","jsx","jsxs","CreditCard","Shield","jsx","jsxs","CreditCard","Shield","Check","CreditCard","Package","Truck","jsx","jsxs","Truck","CreditCard","Package","Check","jsx","jsxs","CheckboxCheck","MapPin","Truck","jsx","jsxs","countryLabelFor","MapPin","Truck","jsx","jsxs","DEFAULT_COUNTRY_OPTIONS","useState","ChevronLeft","ChevronRight","Lock","useState","Check","Clock","MapPin","Truck","cva","cn","TabsPrimitive","jsx","jsx","jsxs","useState","Check","Clock","MapPin","Truck","jsx","jsxs","longDate","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","motion","useReducedMotion","ShoppingBag","Star","ArrowRight","jsx","jsxs","useReducedMotion","motion","useEffect","useState","ArrowRight","Flame","Search","ShoppingBag","Star","jsx","jsxs","CtaButton","useState","useEffect","Search","ArrowRight","ShoppingBag","Star","Flame","ArrowRight","MapPin","Fragment","jsx","jsxs","CtaButton","ArrowRight","MapPin","useEffect","useState","ArrowRight","Sparkles","Fragment","jsx","jsxs","useState","useEffect","ArrowRight","Sparkles","Plus","Search","React","cva","cn","Slot","React","cn","jsx","jsxs","jsx","jsxs","open","cn","jsx","cn","jsx","cn","jsx","cn","Slot","jsx","cn","cva","Slot","jsxs","BarChart3","Home","Package","Settings","ShoppingCart","User","Users","jsx","jsxs","Package","User","Settings","Home","ShoppingCart","BarChart3","Users","jsx","jsxs","Search","Plus","useState","Eye","EyeOff","Lock","Mail","Fragment","jsx","jsxs","useState","Mail","Lock","EyeOff","Eye","CheckboxCheck","useState","Eye","EyeOff","Fragment","jsx","jsxs","useState","EyeOff","Eye","CheckboxCheck","Lock","Mail","User","Fragment","jsx","jsxs","User","Mail","Lock","useEffect","useState","Eye","EyeOff","Lock","Mail","React","cn","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","Mail","Lock","EyeOff","Eye","useEffect","useId","useState","ShieldCheck","useCallback","useEffect","useRef","jsx","useRef","useCallback","useEffect","Fragment","jsx","jsxs","useId","useState","useEffect","ShieldCheck"]}
|