@shopito/design-system-fe 0.1.10 → 0.1.11
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/dist/common/Grid/Grid.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/components/common/Container/Container.tsx","../src/components/common/Main/Main.tsx","../node_modules/classnames/index.js","../src/components/common/Button/Button.tsx","../src/components/common/LoadingSpin/LoadingSpin.tsx","../src/components/common/IconButton/IconButton.tsx","../src/components/common/Input/Input.tsx","../src/components/common/Select/Select.tsx","../src/components/common/Typography/Heading.tsx","../src/components/common/Typography/Text.tsx","../src/components/common/Badge/Badge.tsx","../src/components/common/Card/Card.tsx","../src/components/common/Spinner/Spinner.tsx","../src/components/common/Alert/Alert.tsx","../src/components/common/Modal/Modal.tsx","../src/components/common/Checkbox/Checkbox.tsx","../src/components/common/Toggle/Toggle.tsx","../src/components/common/Avatar/Avatar.tsx","../src/components/common/Stack/Stack.tsx","../src/components/common/Grid/Grid.tsx","../src/components/common/QuantityInput/QuantityInput.tsx","../src/components/common/Pagination/Pagination.tsx","../src/components/Header/Header.tsx","../src/components/CategoryTree/CategoryTree.tsx","../src/components/MegaMenu/MegaMenu.tsx","../src/components/BannerCarousel/BannerCarousel.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/ProductGrid/ProductGrid.tsx","../src/components/CallToAction/CallToAction.tsx","../src/components/Footer/Footer.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\n\nexport interface ContainerProps {\n children: ReactNode;\n}\n\nexport const Container = ({ children }: ContainerProps) => {\n return <div className=\"container\">{children}</div>;\n};\n","import { type ReactNode } from 'react';\n\nexport interface MainProps {\n children: ReactNode;\n}\n\nexport const Main = ({ children }: MainProps) => {\n return <main className=\"main\">{children}</main>;\n};\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype Variant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n fullWidth?: boolean;\n}\n\n// const variantClasses: Record<Variant, string> = {\n// primary:\n// 'bg-primary-600 text-white hover:bg-primary-700 active:bg-primary-800 focus-visible:ring-primary-500',\n// secondary:\n// 'bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 focus-visible:ring-gray-400',\n// outline:\n// 'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 active:bg-gray-100 focus-visible:ring-gray-400',\n// ghost:\n// 'bg-transparent text-gray-700 hover:bg-gray-100 active:bg-gray-200 focus-visible:ring-gray-400',\n// danger:\n// 'bg-danger-600 text-white hover:bg-danger-700 active:bg-danger-800 focus-visible:ring-danger-500',\n// };\n\n// const sizeClasses: Record<Size, string> = {\n// xs: 'h-7 px-2.5 text-xs gap-1',\n// sm: 'h-8 px-3 text-sm gap-1.5',\n// md: 'h-10 px-4 text-sm gap-2',\n// lg: 'h-11 px-5 text-base gap-2',\n// };\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n fullWidth = false,\n disabled,\n children,\n className = '',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n className={clx(\n 'btn',\n variant && `btn-${variant}`,\n size && `btn-${size}`,\n fullWidth && 'w-full',\n className,\n )}\n {...props}\n >\n {loading && (\n <svg\n className=\"animate-spin h-4 w-4 shrink-0\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","import clx from 'classnames';\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface LoadingSpinProps {\n size: Size;\n}\n\nexport const LoadingSpin = ({ size = 'md' }: LoadingSpinProps) => {\n return (\n <svg\n className={clx('loading-spin', `loading-spin-${size}`)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n};\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\nimport { LoadingSpin } from '../LoadingSpin';\n\ntype Variant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode;\n label: string;\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n label,\n variant = 'ghost',\n size = 'md',\n loading = false,\n disabled,\n className = '',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n aria-label={label}\n title={label}\n className={clx(\n 'icon-button',\n `icon-button-${variant}`,\n `icon-button-${size}`,\n className,\n )}\n {...props}\n >\n {loading ? <LoadingSpin size={size} /> : icon}\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n hint?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n { label, error, hint, leftIcon, rightIcon, className = '', id, ...props },\n ref,\n ) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={'w-full'}>\n {label && (\n <label htmlFor={inputId} className=\"input-label\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n {leftIcon && <span className=\"left-icon\">{leftIcon}</span>}\n <input\n ref={ref}\n id={inputId}\n className={clx(\n 'input',\n error && 'has-error',\n !!leftIcon && 'with-left-icon',\n !!rightIcon && 'with-right-icon',\n 'w-full',\n className,\n )}\n {...props}\n />\n {rightIcon && <span className=\"right-icon\">{rightIcon}</span>}\n </div>\n {(error || hint) && (\n <p className={clx('helper-text', error && 'has-error')}>\n {error ?? hint}\n </p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n","import { forwardRef } from 'react';\nimport type { SelectHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n hint?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n { label, error, hint, options, placeholder, className = '', id, ...props },\n ref,\n ) => {\n const selectId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={clx('select-wrapper', 'w-full')}>\n {label && (\n <label htmlFor={selectId} className=\"select-label\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n <select\n ref={ref}\n id={selectId}\n className={clx('select', 'w-full', error && 'has-error', className)}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n {/* Chevron icon */}\n <span className=\"select-chevron-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n </span>\n </div>\n {(error || hint) && (\n <p className={clx('select-helper', error && 'has-error')}>\n {error ?? hint}\n </p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\nimport type { Color } from './Text';\n\ntype HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\ninterface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: HeadingLevel;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n color?: Color;\n children: ReactNode;\n}\n\nexport const Heading = ({\n as,\n level = 1,\n color = 'default',\n className = '',\n children,\n ...props\n}: HeadingProps) => {\n const Tag = as ?? (`h${level}` as HeadingLevel);\n\n return (\n <Tag\n className={cx(`text-color-${color}`, `heading-size-${level}`, className)}\n {...props}\n >\n {children}\n </Tag>\n );\n};\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\n\ntype TextVariant = 'body' | 'body-sm' | 'caption' | 'overline' | 'code';\n\nexport type Color =\n | 'default'\n | 'muted'\n | 'primary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'inherit';\n\ninterface TextProps extends HTMLAttributes<HTMLElement> {\n variant?: TextVariant;\n color?: Color;\n as?: ElementType;\n children: ReactNode;\n}\n\nexport const Text = ({\n variant = 'body',\n color = 'default',\n as: Tag = 'p',\n className = '',\n children,\n ...props\n}: TextProps) => {\n return (\n <Tag\n className={cx(\n `text-color-${color}`,\n `text-variant-${variant}`,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n};\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype BadgeVariant =\n | 'default'\n | 'primary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'outline';\n\ntype BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n dot?: boolean;\n children: ReactNode;\n}\n\nexport function Badge({\n variant = 'default',\n size = 'md',\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={clx('badge', `badge-${variant}`, `badge-${size}`, className)}\n {...props}\n >\n {dot && <span className={clx('badge-dot', `badge-dot-${variant}`)} />}\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n padding?: 'none' | 'sm' | 'md' | 'lg'\n shadow?: boolean\n border?: boolean\n}\n\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nconst paddingClasses = {\n none: '',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n}\n\nexport function Card({\n children,\n padding = 'md',\n shadow = true,\n border = true,\n className = '',\n ...props\n}: CardProps) {\n return (\n <div\n className={[\n 'bg-white rounded-xl overflow-hidden',\n border ? 'border border-gray-200' : '',\n shadow ? 'shadow-sm' : '',\n paddingClasses[padding],\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport function CardHeader({ children, className = '', ...props }: CardHeaderProps) {\n return (\n <div\n className={['px-6 py-4 border-b border-gray-100', className].filter(Boolean).join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport function CardBody({ children, className = '', ...props }: CardBodyProps) {\n return (\n <div className={['p-6', className].filter(Boolean).join(' ')} {...props}>\n {children}\n </div>\n )\n}\n\nexport function CardFooter({ children, className = '', ...props }: CardFooterProps) {\n return (\n <div\n className={[\n 'px-6 py-4 border-t border-gray-100 bg-gray-50',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import type { HTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype SpinnerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\ntype SpinnerColor = 'primary' | 'white' | 'gray';\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize;\n color?: SpinnerColor;\n label?: string;\n}\n\nexport function Spinner({\n size = 'md',\n color = 'primary',\n label = 'Loading…',\n className = '',\n ...props\n}: SpinnerProps) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={clx('spinner-wrapper', className)}\n {...props}\n >\n <span className={clx('spinner', `spinner-${size}`, `spinner-${color}`)} />\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant;\n title?: string;\n children: ReactNode;\n onClose?: () => void;\n}\n\nconst variantIcon: Record<AlertVariant, ReactNode> = {\n info: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n ),\n success: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n ),\n warning: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\n />\n ),\n danger: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n ),\n};\n\nexport function Alert({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n ...props\n}: AlertProps) {\n return (\n <div\n role=\"alert\"\n className={clx('alert', `alert-${variant}`, 'w-full', className)}\n {...props}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={clx('alert-icon', `alert-icon-${variant}`)}\n >\n {variantIcon[variant]}\n </svg>\n <div className=\"flex-1 min-w-0\">\n {title && <p className=\"alert-title\">{title}</p>}\n <div className=\"alert-text\">{children}</div>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"alert-close-btn\"\n aria-label=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react'\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\ntype ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\nexport interface ModalProps {\n open: boolean\n onClose: () => void\n title?: string\n children: ReactNode\n footer?: ReactNode\n size?: ModalSize\n closeOnBackdrop?: boolean\n}\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full mx-4',\n}\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n}: ModalProps) {\n const backdropRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div\n ref={backdropRef}\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm\"\n onClick={(e) => {\n if (closeOnBackdrop && e.target === backdropRef.current) onClose()\n }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n className={[\n 'relative w-full bg-white rounded-xl shadow-xl flex flex-col max-h-[90vh]',\n sizeClasses[size],\n ].join(' ')}\n >\n {title && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-100 shrink-0\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-gray-900\">\n {title}\n </h2>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-5 h-5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n {footer && (\n <div className=\"px-6 py-4 border-t border-gray-100 shrink-0 bg-gray-50 rounded-b-xl\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )\n}\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface CheckboxProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> {\n label?: string;\n description?: string;\n error?: string;\n indeterminate?: boolean;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n { label, description, error, indeterminate, className = '', id, ...props },\n ref,\n ) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={clx('checkbox-wrapper', className)}>\n <div className=\"checkbox-wrapper-inner\">\n <input\n ref={(el) => {\n if (el) el.indeterminate = indeterminate ?? false;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n }}\n id={inputId}\n type=\"checkbox\"\n className={clx('checkbox', error && 'has-error')}\n {...props}\n />\n </div>\n {(label || description) && (\n <div>\n {label && (\n <label htmlFor={inputId} className=\"checkbox-label\">\n {label}\n </label>\n )}\n {description && (\n <p className=\"checkbox-description\">{description}</p>\n )}\n {error && <p className=\"checkbox-error\">{error}</p>}\n </div>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype ToggleSize = 'sm' | 'md' | 'lg';\n\nexport interface ToggleProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size'\n> {\n label?: string;\n description?: string;\n size?: ToggleSize;\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ label, description, size = 'md', className = '', id, ...props }, ref) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <label\n htmlFor={inputId}\n className={clx(\n 'toggle',\n props.disabled && 'toggle-disabled',\n className,\n )}\n >\n <div className={clx('toggle-wrapper', `toggle-wrapper-${size}`)}>\n <input\n ref={ref}\n id={inputId}\n type=\"checkbox\"\n role=\"switch\"\n className=\"sr-only peer\"\n {...props}\n />\n <div className=\"toggle-track\" />\n <div className={clx('toggle-thumb', `toggle-thumb-${size}`)} />\n </div>\n {(label || description) && (\n <div>\n {label && <span className=\"toggle-label\">{label}</span>}\n {description && (\n <span className=\"toggle-description\">{description}</span>\n )}\n </div>\n )}\n </label>\n );\n },\n);\n\nToggle.displayName = 'Toggle';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n}\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n max?: number;\n size?: AvatarSize;\n children: ReactNode;\n}\n\nconst bgColors = [\n 'bg-red-500',\n 'bg-orange-500',\n 'bg-amber-500',\n 'bg-emerald-500',\n 'bg-teal-500',\n 'bg-cyan-500',\n 'bg-blue-500',\n 'bg-violet-500',\n 'bg-pink-500',\n];\n\nexport function Avatar({\n src,\n alt,\n name,\n size = 'md',\n className,\n ...props\n}: AvatarProps) {\n const baseClasses = ['avatar', `avatar-${size}`, className];\n\n const nameToColor = (n: string) => {\n let hash = 0;\n for (let i = 0; i < n.length; i++) hash += n.charCodeAt(i);\n return bgColors[hash % bgColors.length];\n };\n\n const getInitials = (name: string) =>\n name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('')\n .toUpperCase();\n\n if (src) {\n return (\n <span className={clx(baseClasses)} {...props}>\n <img\n src={src}\n alt={alt ?? name ?? ''}\n className=\"w-full h-full object-cover\"\n />\n </span>\n );\n }\n\n if (name) {\n return (\n <span\n className={clx(baseClasses, nameToColor(name))}\n aria-label={name}\n {...props}\n >\n {getInitials(name)}\n </span>\n );\n }\n\n // Fallback icon\n return (\n <span className={clx(baseClasses, 'avatar-fallback')} {...props}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"w-3/5 h-3/5\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.5 6a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM3.751 20.105a8.25 8.25 0 0116.498 0 .75.75 0 01-.437.695A18.683 18.683 0 0112 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 01-.437-.695z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport cx from 'classnames';\n\ninterface StackProps {\n direction?: 'row' | 'column';\n gap?: number;\n alignItems?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';\n justifyItems?: 'start' | 'end' | 'center' | 'stretch';\n children?: ReactNode;\n}\n\nexport const Stack = ({\n direction = 'row',\n gap,\n alignItems = 'start',\n justifyItems = 'start',\n children,\n}: StackProps) => {\n const alignItemsMap: Record<string, string> = {\n start: 'items-start',\n end: 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n };\n\n const justifyItemsMap: Record<string, string> = {\n start: 'justify-items-start',\n end: 'justify-items-end',\n center: 'justify-items-center',\n stretch: 'justify-items-stretch',\n };\n\n return (\n <div\n className={cx(\n 'stack',\n `stack-${direction}`,\n gap && `gap-${gap}`,\n alignItemsMap[alignItems],\n justifyItemsMap[justifyItems],\n )}\n >\n {children}\n </div>\n );\n};\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ColSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\nexport type ColOffset = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\nexport type GridCols = 1 | 2 | 3 | 4 | 6 | 12;\nexport type GapSize = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n\nexport interface GridProps {\n children?: ReactNode;\n cols?: GridCols;\n gap?: GapSize;\n rowGap?: GapSize;\n colGap?: GapSize;\n as?: ElementType;\n className?: string;\n}\n\nexport interface ColProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n /** Výchozí šířka (mobile-first) */\n span?: ColSpan;\n sm?: ColSpan;\n md?: ColSpan;\n lg?: ColSpan;\n xl?: ColSpan;\n /** Přeskočit N sloupců od aktuální pozice (mobile-first) */\n offset?: ColOffset;\n smOffset?: ColOffset;\n mdOffset?: ColOffset;\n lgOffset?: ColOffset;\n xlOffset?: ColOffset;\n}\n\n// ─── Class maps — všechny literální stringy, Tailwind je detekuje při scanu ──\n\nconst colsMap: Record<GridCols, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 6: 'grid-cols-6',\n 12: 'grid-cols-12',\n};\n\nconst gapMap: Record<GapSize, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n 16: 'gap-16',\n};\n\nconst rowGapMap: Record<GapSize, string> = {\n 0: 'gap-y-0',\n 1: 'gap-y-1',\n 2: 'gap-y-2',\n 3: 'gap-y-3',\n 4: 'gap-y-4',\n 5: 'gap-y-5',\n 6: 'gap-y-6',\n 8: 'gap-y-8',\n 10: 'gap-y-10',\n 12: 'gap-y-12',\n 16: 'gap-y-16',\n};\n\nconst colGapMap: Record<GapSize, string> = {\n 0: 'gap-x-0',\n 1: 'gap-x-1',\n 2: 'gap-x-2',\n 3: 'gap-x-3',\n 4: 'gap-x-4',\n 5: 'gap-x-5',\n 6: 'gap-x-6',\n 8: 'gap-x-8',\n 10: 'gap-x-10',\n 12: 'gap-x-12',\n 16: 'gap-x-16',\n};\n\n// Span — bez prefixu (výchozí, mobile-first)\nconst spanMap: Record<ColSpan, string> = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n 7: 'col-span-7',\n 8: 'col-span-8',\n 9: 'col-span-9',\n 10: 'col-span-10',\n 11: 'col-span-11',\n 12: 'col-span-12',\n};\n\nconst smSpanMap: Record<ColSpan, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n};\n\nconst mdSpanMap: Record<ColSpan, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n};\n\nconst lgSpanMap: Record<ColSpan, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n 7: 'lg:col-span-7',\n 8: 'lg:col-span-8',\n 9: 'lg:col-span-9',\n 10: 'lg:col-span-10',\n 11: 'lg:col-span-11',\n 12: 'lg:col-span-12',\n};\n\nconst xlSpanMap: Record<ColSpan, string> = {\n 1: 'xl:col-span-1',\n 2: 'xl:col-span-2',\n 3: 'xl:col-span-3',\n 4: 'xl:col-span-4',\n 5: 'xl:col-span-5',\n 6: 'xl:col-span-6',\n 7: 'xl:col-span-7',\n 8: 'xl:col-span-8',\n 9: 'xl:col-span-9',\n 10: 'xl:col-span-10',\n 11: 'xl:col-span-11',\n 12: 'xl:col-span-12',\n};\n\n// Offset: přeskočit N sloupců → col-start-(N+1)\nconst offsetMap: Record<ColOffset, string> = {\n 1: 'col-start-2',\n 2: 'col-start-3',\n 3: 'col-start-4',\n 4: 'col-start-5',\n 5: 'col-start-6',\n 6: 'col-start-7',\n 7: 'col-start-8',\n 8: 'col-start-9',\n 9: 'col-start-10',\n 10: 'col-start-11',\n 11: 'col-start-12',\n};\n\nconst smOffsetMap: Record<ColOffset, string> = {\n 1: 'sm:col-start-2',\n 2: 'sm:col-start-3',\n 3: 'sm:col-start-4',\n 4: 'sm:col-start-5',\n 5: 'sm:col-start-6',\n 6: 'sm:col-start-7',\n 7: 'sm:col-start-8',\n 8: 'sm:col-start-9',\n 9: 'sm:col-start-10',\n 10: 'sm:col-start-11',\n 11: 'sm:col-start-12',\n};\n\nconst mdOffsetMap: Record<ColOffset, string> = {\n 1: 'md:col-start-2',\n 2: 'md:col-start-3',\n 3: 'md:col-start-4',\n 4: 'md:col-start-5',\n 5: 'md:col-start-6',\n 6: 'md:col-start-7',\n 7: 'md:col-start-8',\n 8: 'md:col-start-9',\n 9: 'md:col-start-10',\n 10: 'md:col-start-11',\n 11: 'md:col-start-12',\n};\n\nconst lgOffsetMap: Record<ColOffset, string> = {\n 1: 'lg:col-start-2',\n 2: 'lg:col-start-3',\n 3: 'lg:col-start-4',\n 4: 'lg:col-start-5',\n 5: 'lg:col-start-6',\n 6: 'lg:col-start-7',\n 7: 'lg:col-start-8',\n 8: 'lg:col-start-9',\n 9: 'lg:col-start-10',\n 10: 'lg:col-start-11',\n 11: 'lg:col-start-12',\n};\n\nconst xlOffsetMap: Record<ColOffset, string> = {\n 1: 'xl:col-start-2',\n 2: 'xl:col-start-3',\n 3: 'xl:col-start-4',\n 4: 'xl:col-start-5',\n 5: 'xl:col-start-6',\n 6: 'xl:col-start-7',\n 7: 'xl:col-start-8',\n 8: 'xl:col-start-9',\n 9: 'xl:col-start-10',\n 10: 'xl:col-start-11',\n 11: 'xl:col-start-12',\n};\n\n// ─── Components ───────────────────────────────────────────────────────────────\n\nexport const Grid = ({\n children,\n cols = 12,\n gap,\n rowGap,\n colGap,\n as: Tag = 'div',\n className,\n}: GridProps) => (\n <Tag\n className={cx(\n 'grid',\n colsMap[cols],\n gap !== undefined && gapMap[gap],\n rowGap !== undefined && rowGapMap[rowGap],\n colGap !== undefined && colGapMap[colGap],\n className,\n )}\n >\n {children}\n </Tag>\n);\n\nGrid.displayName = 'Grid';\n\nexport const Col = ({\n children,\n span,\n sm,\n md,\n lg,\n xl,\n offset,\n smOffset,\n mdOffset,\n lgOffset,\n xlOffset,\n className,\n ...rest\n}: ColProps) => (\n <div\n className={cx(\n 'w-full',\n span && spanMap[span],\n sm && smSpanMap[sm],\n md && mdSpanMap[md],\n lg && lgSpanMap[lg],\n xl && xlSpanMap[xl],\n offset && offsetMap[offset],\n smOffset && smOffsetMap[smOffset],\n mdOffset && mdOffsetMap[mdOffset],\n lgOffset && lgOffsetMap[lgOffset],\n xlOffset && xlOffsetMap[xlOffset],\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\nCol.displayName = 'Col';\n","import { useEffect, useId, useRef, useState } from 'react';\nimport clx from 'classnames';\n\nexport interface QuantityInputProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n label?: string;\n error?: string;\n hint?: string;\n id?: string;\n className?: string;\n}\n\nexport const QuantityInput = ({\n value,\n onChange,\n min = 1,\n max = 999,\n step = 1,\n disabled = false,\n label,\n error,\n hint,\n id,\n className,\n}: QuantityInputProps) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Lokální string stav — umožňuje volné psaní, clamping proběhne při blur\n const [inputValue, setInputValue] = useState(String(value));\n\n // Synchronizace při změně value zvenčí (controlled)\n useEffect(() => {\n if (document.activeElement !== inputRef.current) {\n setInputValue(String(value));\n }\n }, [value]);\n\n const clamp = (n: number) => Math.min(max, Math.max(min, n));\n\n const commitValue = (raw: string) => {\n const parsed = parseInt(raw, 10);\n const next = isNaN(parsed) ? value : clamp(parsed);\n setInputValue(String(next));\n if (next !== value) onChange(next);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/[^0-9]/g, '');\n setInputValue(raw);\n // Průběžně volej onChange jen pokud je platné číslo\n const parsed = parseInt(raw, 10);\n if (!isNaN(parsed)) onChange(clamp(parsed));\n };\n\n const handleBlur = () => commitValue(inputValue);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n commitValue(inputValue);\n inputRef.current?.blur();\n return;\n }\n // Blokuj vše kromě číslic a ovládacích kláves\n const allowed = [\n 'Backspace', 'Delete', 'Tab', 'Escape',\n 'ArrowLeft', 'ArrowRight', 'Home', 'End',\n ];\n if (!allowed.includes(e.key) && !/^[0-9]$/.test(e.key) && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n }\n };\n\n const decrement = () => onChange(clamp(value - step));\n const increment = () => onChange(clamp(value + step));\n\n const canDecrement = value - step >= min;\n const canIncrement = value + step <= max;\n\n return (\n <div className={clx('quantity-input-wrapper', className)}>\n {label && (\n <label htmlFor={inputId} className=\"input-label\">\n {label}\n </label>\n )}\n\n <div className={clx('quantity-input', error && 'has-error', disabled && 'is-disabled')}>\n <button\n type=\"button\"\n className=\"quantity-btn\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n aria-label=\"Snížit množství\"\n tabIndex={-1}\n >\n <MinusIcon />\n </button>\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"quantity-field\"\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-label={label ?? 'Množství'}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n\n <button\n type=\"button\"\n className=\"quantity-btn\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n aria-label=\"Zvýšit množství\"\n tabIndex={-1}\n >\n <PlusIcon />\n </button>\n </div>\n\n {(error || hint) && (\n <p className={clx('helper-text', error && 'has-error')}>{error ?? hint}</p>\n )}\n </div>\n );\n};\n\nQuantityInput.displayName = 'QuantityInput';\n\nconst MinusIcon = () => (\n <svg width=\"12\" height=\"2\" viewBox=\"0 0 12 2\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 1V11M1 6H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n","import type { ButtonHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingsCount?: number;\n}\n\nconst range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\nconst buildPages = (\n page: number,\n totalPages: number,\n siblings: number,\n): (number | '…')[] => {\n const totalNumbers = siblings * 2 + 5; // siblings + first + last + current + 2 dots\n\n if (totalPages <= totalNumbers) return range(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, 1);\n const rightSibling = Math.min(page + siblings, totalPages);\n const showLeftDots = leftSibling > 2;\n const showRightDots = rightSibling < totalPages - 1;\n\n if (!showLeftDots && showRightDots) {\n const leftRange = range(1, 3 + siblings * 2);\n return [...leftRange, '…', totalPages];\n }\n\n if (showLeftDots && !showRightDots) {\n const rightRange = range(totalPages - (2 + siblings * 2), totalPages);\n return [1, '…', ...rightRange];\n }\n\n return [1, '…', ...range(leftSibling, rightSibling), '…', totalPages];\n};\n\nconst PageButton = ({\n active,\n disabled,\n children,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { active?: boolean }) => {\n return (\n <button\n disabled={disabled}\n className={clx(\n 'pagination-button',\n `pagination-button-${active ? 'active' : 'inactive'}`,\n )}\n {...props}\n >\n {children}\n </button>\n );\n};\n\nexport const Pagination = ({\n page,\n totalPages,\n onPageChange,\n siblingsCount = 1,\n}: PaginationProps) => {\n const pages = buildPages(page, totalPages, siblingsCount);\n\n return (\n <nav aria-label=\"Pagination\" className=\"pagination\">\n {/* Prev */}\n <PageButton\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 19.5L8.25 12l7.5-7.5\"\n />\n </svg>\n </PageButton>\n\n {pages.map((p, i) =>\n p === '…' ? (\n <span key={`dots-${i}`} className=\"pagination-dots\">\n …\n </span>\n ) : (\n <PageButton\n key={p}\n active={p === page}\n onClick={() => onPageChange(p)}\n aria-label={`Page ${p}`}\n aria-current={p === page ? 'page' : undefined}\n >\n {p}\n </PageButton>\n ),\n )}\n\n {/* Next */}\n <PageButton\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8.25 4.5l7.5 7.5-7.5 7.5\"\n />\n </svg>\n </PageButton>\n </nav>\n );\n};\n","import { useRef, useState } from 'react';\nimport type { ReactNode, KeyboardEvent } from 'react';\nimport { Input } from '../common/Input/Input';\n\nexport interface CurrencyOption {\n code: string;\n symbol: string;\n label: string;\n}\n\nexport interface LocaleOption {\n code: string;\n label: string;\n flag?: string;\n}\n\nexport interface HeaderProps {\n /** Logo — ReactNode (image, SVG, text) */\n logo?: ReactNode;\n /** Search placeholder */\n searchPlaceholder?: string;\n onSearch?: (query: string) => void;\n /** Cart */\n cartItemCount?: number;\n onCartClick?: () => void;\n /** Customer */\n isLoggedIn?: boolean;\n customerName?: string;\n onCustomerClick?: () => void;\n /** Currency */\n currencies?: CurrencyOption[];\n selectedCurrency?: string;\n onCurrencyChange?: (code: string) => void;\n /** Locale / eshop */\n locales?: LocaleOption[];\n selectedLocale?: string;\n onLocaleChange?: (code: string) => void;\n /** Extra right slot */\n rightSlot?: ReactNode;\n}\n\n// ─── Small internal dropdown ────────────────────────────────────────────────\n\ninterface DropdownProps<T extends { label: string }> {\n trigger: ReactNode;\n items: T[];\n onSelect: (item: T) => void;\n getKey: (item: T) => string;\n renderItem?: (item: T) => ReactNode;\n}\n\nfunction Dropdown<T extends { label: string }>({\n trigger,\n items,\n onSelect,\n getKey,\n renderItem,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = () => setOpen(false);\n\n // Close on outside click\n const handleBlur = (e: React.FocusEvent) => {\n if (!ref.current?.contains(e.relatedTarget as Node)) close();\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n return (\n <div ref={ref} className=\"relative\" onBlur={handleBlur} onKeyDown={onKey}>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={(e) => e.key === 'Enter' && setOpen((v) => !v)}\n className=\"cursor-pointer\"\n >\n {trigger}\n </div>\n {open && (\n <ul\n role=\"menu\"\n className=\"absolute right-0 top-full mt-1 z-50 min-w-28 bg-white rounded-lg shadow-lg border border-gray-100 py-1 text-sm\"\n >\n {items.map((item) => (\n <li key={getKey(item)} role=\"none\">\n <button\n role=\"menuitem\"\n className=\"w-full px-3 py-1.5 text-left hover:bg-gray-50 text-gray-700 whitespace-nowrap\"\n onClick={() => {\n onSelect(item);\n close();\n }}\n >\n {renderItem ? renderItem(item) : item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\n// ─── Search icon ─────────────────────────────────────────────────────────────\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 15.803a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n );\n}\n\n// ─── Header ──────────────────────────────────────────────────────────────────\n\nexport function Header({\n logo,\n searchPlaceholder = 'Hledat produkty…',\n onSearch,\n cartItemCount = 0,\n onCartClick,\n isLoggedIn = false,\n customerName,\n onCustomerClick,\n currencies = [],\n selectedCurrency,\n onCurrencyChange,\n locales = [],\n selectedLocale,\n onLocaleChange,\n rightSlot,\n}: HeaderProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const activeCurrency = currencies.find((c) => c.code === selectedCurrency);\n const activeLocale = locales.find((l) => l.code === selectedLocale);\n\n const handleSearchKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') onSearch?.(searchQuery);\n };\n\n return (\n <header className=\"bg-white border-b border-gray-200 sticky top-0 z-40\">\n <div className=\"max-w-7xl mx-auto px-4 h-16 flex items-center gap-4\">\n {/* Logo */}\n <div className=\"shrink-0\">\n {logo ?? (\n <span className=\"text-xl font-bold text-primary-600 tracking-tight\">\n shopito\n </span>\n )}\n </div>\n\n {/* Search */}\n <div className=\"flex-1 max-w-xl\">\n <Input\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleSearchKey}\n leftIcon={<SearchIcon />}\n rightIcon={\n searchQuery ? (\n <button\n onClick={() => {\n setSearchQuery('');\n onSearch?.('');\n }}\n className=\"hover:text-gray-600 transition-colors\"\n aria-label=\"Clear search\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-3.5 h-3.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n ) : undefined\n }\n />\n </div>\n\n {/* Right controls */}\n <div className=\"flex items-center gap-1 shrink-0 ml-auto\">\n {/* Currency switcher */}\n {currencies.length > 0 && (\n <Dropdown\n trigger={\n <button className=\"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors font-medium\">\n <span>{activeCurrency?.symbol ?? selectedCurrency}</span>\n <span className=\"text-xs text-gray-400\">\n {activeCurrency?.code ?? selectedCurrency}\n </span>\n <ChevronDown className=\"w-3 h-3 text-gray-400\" />\n </button>\n }\n items={currencies}\n getKey={(c) => c.code}\n onSelect={(c) => onCurrencyChange?.(c.code)}\n renderItem={(c) => (\n <span className=\"flex items-center gap-2\">\n <span className=\"w-6 text-center font-medium text-gray-500\">\n {c.symbol}\n </span>\n <span>{c.label}</span>\n </span>\n )}\n />\n )}\n\n {/* Locale switcher */}\n {locales.length > 0 && (\n <Dropdown\n trigger={\n <button className=\"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\">\n {activeLocale?.flag && (\n <span className=\"text-base leading-none\">\n {activeLocale.flag}\n </span>\n )}\n <span className=\"font-medium uppercase\">\n {activeLocale?.code ?? selectedLocale}\n </span>\n <ChevronDown className=\"w-3 h-3 text-gray-400\" />\n </button>\n }\n items={locales}\n getKey={(l) => l.code}\n onSelect={(l) => onLocaleChange?.(l.code)}\n renderItem={(l) => (\n <span className=\"flex items-center gap-2\">\n {l.flag && <span className=\"text-base\">{l.flag}</span>}\n <span>{l.label}</span>\n </span>\n )}\n />\n )}\n\n {/* Divider */}\n {(currencies.length > 0 || locales.length > 0) && (\n <div className=\"w-px h-5 bg-gray-200 mx-1\" />\n )}\n\n {/* Customer button */}\n <button\n onClick={onCustomerClick}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\"\n aria-label={isLoggedIn ? 'My account' : 'Sign in'}\n >\n {isLoggedIn ? (\n <>\n <div className=\"w-6 h-6 rounded-full bg-primary-600 text-white flex items-center justify-center text-xs font-bold\">\n {(customerName ?? 'U')[0].toUpperCase()}\n </div>\n {customerName && (\n <span className=\"hidden sm:block font-medium max-w-32 truncate\">\n {customerName}\n </span>\n )}\n </>\n ) : (\n <>\n <UserIcon className=\"w-5 h-5\" />\n <span className=\"hidden sm:block font-medium\">\n Přihlásit se\n </span>\n </>\n )}\n </button>\n\n {/* Cart */}\n <button\n onClick={onCartClick}\n className=\"relative flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\"\n aria-label={`Cart, ${cartItemCount} items`}\n >\n <CartIcon className=\"w-5 h-5\" />\n <span className=\"hidden sm:block font-medium\">Košík</span>\n {cartItemCount > 0 && (\n <span className=\"absolute -top-0.5 -right-0.5 min-w-4.5 h-4.5 flex items-center justify-center rounded-full bg-primary-600 text-white text-[10px] font-bold leading-none px-1\">\n {cartItemCount > 99 ? '99+' : cartItemCount}\n </span>\n )}\n </button>\n\n {rightSlot}\n </div>\n </div>\n </header>\n );\n}\n\n// ─── Icon helpers ─────────────────────────────────────────────────────────────\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n );\n}\n\nfunction UserIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n );\n}\n\nfunction CartIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 00-16.536-1.84M7.5 14.25L5.106 5.272M6 20.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm12.75 0a.75.75 0 11-1.5 0 .75.75 0 011.5 0z\"\n />\n </svg>\n );\n}\n","import { useState } from 'react'\n\nexport interface Category {\n id: string\n label: string\n icon?: string\n count?: number\n children?: Category[]\n}\n\nexport interface CategoryTreeProps {\n categories: Category[]\n activeId?: string\n onSelect?: (category: Category) => void\n /** Show product counts */\n showCounts?: boolean\n /** All nodes expanded by default */\n defaultExpandAll?: boolean\n className?: string\n}\n\ninterface TreeNodeProps {\n node: Category\n activeId: string | undefined\n onSelect: (category: Category) => void\n showCounts: boolean\n depth: number\n defaultExpandAll: boolean\n}\n\nfunction TreeNode({\n node,\n activeId,\n onSelect,\n showCounts,\n depth,\n defaultExpandAll,\n}: TreeNodeProps) {\n const hasChildren = node.children && node.children.length > 0\n const [expanded, setExpanded] = useState(defaultExpandAll || isAncestorOf(node, activeId))\n const isActive = node.id === activeId\n\n return (\n <li>\n <div\n className={[\n 'group flex items-center gap-1.5 rounded-lg px-2 py-1.5 cursor-pointer select-none',\n 'transition-colors text-sm',\n isActive\n ? 'bg-primary-50 text-primary-700 font-medium'\n : 'text-gray-700 hover:bg-gray-50 hover:text-gray-900',\n depth > 0 ? `ml-${Math.min(depth * 4, 8)}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={depth > 0 ? { marginLeft: depth * 16 } : undefined}\n onClick={() => {\n onSelect(node)\n if (hasChildren) setExpanded((v) => !v)\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect(node)\n if (hasChildren) setExpanded((v) => !v)\n }\n }}\n aria-expanded={hasChildren ? expanded : undefined}\n >\n {/* Expand toggle */}\n {hasChildren ? (\n <span\n className={`shrink-0 text-gray-400 transition-transform duration-150 ${expanded ? 'rotate-90' : ''}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-3.5 h-3.5\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </span>\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n\n {/* Icon */}\n {node.icon && <span className=\"text-base leading-none\">{node.icon}</span>}\n\n {/* Label */}\n <span className=\"flex-1 truncate\">{node.label}</span>\n\n {/* Count */}\n {showCounts && node.count !== undefined && (\n <span\n className={`text-xs rounded-full px-1.5 py-0.5 font-medium ${\n isActive ? 'bg-primary-100 text-primary-600' : 'bg-gray-100 text-gray-500'\n }`}\n >\n {node.count}\n </span>\n )}\n </div>\n\n {/* Children */}\n {hasChildren && expanded && (\n <ul role=\"group\">\n {node.children!.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n activeId={activeId}\n onSelect={onSelect}\n showCounts={showCounts}\n depth={depth + 1}\n defaultExpandAll={defaultExpandAll}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nfunction isAncestorOf(node: Category, activeId: string | undefined): boolean {\n if (!activeId) return false\n if (!node.children) return false\n return node.children.some(\n (c) => c.id === activeId || isAncestorOf(c, activeId),\n )\n}\n\nexport function CategoryTree({\n categories,\n activeId,\n onSelect,\n showCounts = true,\n defaultExpandAll = false,\n className = '',\n ...props\n}: CategoryTreeProps) {\n const handleSelect = (cat: Category) => onSelect?.(cat)\n\n return (\n <nav\n aria-label=\"Category navigation\"\n className={['w-full', className].filter(Boolean).join(' ')}\n {...props}\n >\n <ul role=\"tree\" className=\"space-y-0.5\">\n {categories.map((cat) => (\n <TreeNode\n key={cat.id}\n node={cat}\n activeId={activeId}\n onSelect={handleSelect}\n showCounts={showCounts}\n depth={0}\n defaultExpandAll={defaultExpandAll}\n />\n ))}\n </ul>\n </nav>\n )\n}\n","import { useState, useRef } from 'react'\n\nexport interface MegaMenuSubItem {\n id: string\n label: string\n href?: string\n badge?: string\n}\n\nexport interface MegaMenuColumn {\n heading?: string\n items: MegaMenuSubItem[]\n}\n\nexport interface MegaMenuFeatured {\n image?: string\n eyebrow?: string\n title: string\n description?: string\n cta?: string\n href?: string\n}\n\nexport interface MegaMenuItem {\n id: string\n label: string\n icon?: string\n href?: string\n /** If columns are present, hovering opens the mega panel */\n columns?: MegaMenuColumn[]\n featured?: MegaMenuFeatured\n}\n\nexport interface MegaMenuProps {\n items: MegaMenuItem[]\n activeId?: string\n onNavigate?: (item: MegaMenuSubItem | MegaMenuItem) => void\n}\n\n// ─── Mega panel ──────────────────────────────────────────────────────────────\n\ninterface MegaPanelProps {\n item: MegaMenuItem\n onNavigate: (subItem: MegaMenuSubItem | MegaMenuItem) => void\n onClose: () => void\n}\n\nfunction MegaPanel({ item, onNavigate, onClose }: MegaPanelProps) {\n if (!item.columns?.length) return null\n\n return (\n <div className=\"absolute left-0 right-0 top-full z-50 bg-white border-b border-gray-200 shadow-lg\">\n <div className=\"max-w-7xl mx-auto px-4 py-6 flex gap-8\">\n {/* Columns */}\n <div className=\"flex-1 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6\">\n {item.columns.map((col, ci) => (\n <div key={ci}>\n {col.heading && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-gray-400 mb-2\">\n {col.heading}\n </p>\n )}\n <ul className=\"space-y-1\">\n {col.items.map((sub) => (\n <li key={sub.id}>\n <button\n className=\"flex items-center gap-1.5 text-sm text-gray-700 hover:text-primary-600 transition-colors py-0.5\"\n onClick={() => {\n onNavigate(sub)\n onClose()\n }}\n >\n {sub.label}\n {sub.badge && (\n <span className=\"text-[10px] font-semibold px-1.5 py-0.5 rounded-full bg-danger-50 text-danger-600 leading-none\">\n {sub.badge}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {/* Featured card */}\n {item.featured && (\n <div className=\"w-52 shrink-0\">\n <button\n className=\"group block w-full rounded-xl overflow-hidden border border-gray-100 text-left hover:shadow-md transition-shadow\"\n onClick={() => {\n onNavigate(item)\n onClose()\n }}\n >\n {item.featured.image ? (\n <img\n src={item.featured.image}\n alt={item.featured.title}\n className=\"w-full h-28 object-cover\"\n />\n ) : (\n <div className=\"w-full h-28 bg-linear-to-br from-primary-100 to-primary-200 flex items-center justify-center text-4xl\">\n {item.icon ?? '🛍️'}\n </div>\n )}\n <div className=\"p-3\">\n {item.featured.eyebrow && (\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-primary-500 mb-0.5\">\n {item.featured.eyebrow}\n </p>\n )}\n <p className=\"text-sm font-semibold text-gray-900 group-hover:text-primary-600 transition-colors\">\n {item.featured.title}\n </p>\n {item.featured.description && (\n <p className=\"text-xs text-gray-500 mt-0.5 line-clamp-2\">\n {item.featured.description}\n </p>\n )}\n {item.featured.cta && (\n <span className=\"inline-block mt-2 text-xs font-medium text-primary-600\">\n {item.featured.cta} →\n </span>\n )}\n </div>\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ─── MegaMenu ────────────────────────────────────────────────────────────────\n\nexport function MegaMenu({\n items,\n activeId,\n onNavigate,\n}: MegaMenuProps) {\n const [openId, setOpenId] = useState<string | null>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const open = (id: string) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setOpenId(id)\n }\n\n const scheduleClose = () => {\n timeoutRef.current = setTimeout(() => setOpenId(null), 120)\n }\n\n const cancelClose = () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n\n const activeItem = items.find((i) => i.id === openId)\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className=\"relative bg-white border-b border-gray-100\"\n onMouseLeave={scheduleClose}\n >\n <div className=\"max-w-7xl mx-auto px-4\">\n <ul className=\"flex items-center gap-0\" role=\"menubar\">\n {items.map((item) => {\n const hasMega = !!item.columns?.length\n const isOpen = openId === item.id\n const isActive = activeId === item.id\n\n return (\n <li key={item.id} role=\"none\">\n <button\n role=\"menuitem\"\n aria-haspopup={hasMega ? 'true' : undefined}\n aria-expanded={hasMega ? isOpen : undefined}\n className={[\n 'flex items-center gap-1.5 px-4 py-3.5 text-sm font-medium transition-colors relative',\n 'outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500',\n isActive || isOpen\n ? 'text-primary-600'\n : 'text-gray-700 hover:text-gray-900',\n isOpen\n ? 'after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary-600'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseEnter={() => hasMega ? open(item.id) : setOpenId(null)}\n onFocus={() => hasMega && open(item.id)}\n onClick={() => {\n if (!hasMega) {\n onNavigate?.(item)\n setOpenId(null)\n }\n }}\n >\n {item.icon && <span className=\"text-base leading-none\">{item.icon}</span>}\n {item.label}\n {hasMega && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className={`w-3.5 h-3.5 transition-transform duration-150 ${isOpen ? 'rotate-180' : ''}`}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n )}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n\n {/* Mega panel */}\n {activeItem?.columns?.length && (\n <div\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n >\n <MegaPanel\n item={activeItem}\n onNavigate={(sub) => onNavigate?.(sub)}\n onClose={() => setOpenId(null)}\n />\n </div>\n )}\n </nav>\n )\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\n\nexport interface Banner {\n id: string\n /** Background image URL or gradient CSS value */\n backgroundImage?: string\n backgroundColor?: string\n /** Overlaid text content */\n eyebrow?: string\n title: string\n subtitle?: string\n ctaLabel?: string\n ctaHref?: string\n onCtaClick?: () => void\n /** Image on the right side of the banner */\n sideImage?: string\n /** Text colors — default to white for dark backgrounds */\n textColor?: 'light' | 'dark'\n}\n\nexport interface BannerCarouselProps {\n banners: Banner[]\n autoPlay?: boolean\n autoPlayInterval?: number\n /** Show arrow navigation */\n arrows?: boolean\n /** Show dot indicators */\n dots?: boolean\n className?: string\n /** Aspect ratio of the banner — default 3/1 */\n aspectRatio?: string\n}\n\nexport function BannerCarousel({\n banners,\n autoPlay = true,\n autoPlayInterval = 5000,\n arrows = true,\n dots = true,\n className = '',\n aspectRatio = '3 / 1',\n}: BannerCarouselProps) {\n const [current, setCurrent] = useState(0)\n const [paused, setPaused] = useState(false)\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const count = banners.length\n\n const goTo = useCallback(\n (index: number) => {\n setCurrent(((index % count) + count) % count)\n },\n [count],\n )\n\n const prev = () => goTo(current - 1)\n const next = useCallback(() => goTo(current + 1), [current, goTo])\n\n // Auto-play\n useEffect(() => {\n if (!autoPlay || paused || count <= 1) return\n timerRef.current = setInterval(next, autoPlayInterval)\n return () => {\n if (timerRef.current) clearInterval(timerRef.current)\n }\n }, [autoPlay, paused, autoPlayInterval, next, count])\n\n // Swipe support\n const touchStartX = useRef<number | null>(null)\n const handleTouchStart = (e: React.TouchEvent) => {\n touchStartX.current = e.touches[0].clientX\n }\n const handleTouchEnd = (e: React.TouchEvent) => {\n if (touchStartX.current === null) return\n const delta = e.changedTouches[0].clientX - touchStartX.current\n if (Math.abs(delta) > 50) delta < 0 ? next() : prev()\n touchStartX.current = null\n }\n\n if (count === 0) return null\n\n const banner = banners[current]\n const isLight = banner.textColor === 'light' || !banner.textColor\n\n return (\n <div\n className={['relative overflow-hidden rounded-xl', className].filter(Boolean).join(' ')}\n style={{ aspectRatio }}\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {/* Slides */}\n <div ref={trackRef} className=\"relative w-full h-full\">\n {banners.map((b, i) => (\n <div\n key={b.id}\n aria-hidden={i !== current}\n className={[\n 'absolute inset-0 transition-opacity duration-700',\n i === current ? 'opacity-100 z-10' : 'opacity-0 z-0',\n ].join(' ')}\n style={{\n background: b.backgroundImage\n ? `url(${b.backgroundImage}) center/cover no-repeat`\n : b.backgroundColor ?? 'linear-gradient(135deg, #1d4ed8 0%, #7c3aed 100%)',\n }}\n >\n {/* Overlay for readability */}\n {b.backgroundImage && (\n <div className=\"absolute inset-0 bg-gradient-to-r from-black/50 via-black/20 to-transparent\" />\n )}\n\n {/* Content */}\n <div className=\"relative z-10 h-full flex items-center px-8 md:px-12 gap-8\">\n <div className=\"flex-1 max-w-lg\">\n {b.eyebrow && (\n <p\n className={`text-xs font-semibold uppercase tracking-widest mb-2 ${\n isLight ? 'text-white/70' : 'text-gray-500'\n }`}\n >\n {b.eyebrow}\n </p>\n )}\n <h2\n className={`text-2xl md:text-3xl lg:text-4xl font-bold leading-tight ${\n isLight ? 'text-white' : 'text-gray-900'\n }`}\n >\n {b.title}\n </h2>\n {b.subtitle && (\n <p\n className={`mt-2 text-sm md:text-base ${\n isLight ? 'text-white/80' : 'text-gray-600'\n }`}\n >\n {b.subtitle}\n </p>\n )}\n {b.ctaLabel && (\n <button\n onClick={b.onCtaClick}\n className={[\n 'mt-5 inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-semibold transition-all',\n isLight\n ? 'bg-white text-gray-900 hover:bg-gray-100'\n : 'bg-primary-600 text-white hover:bg-primary-700',\n ].join(' ')}\n >\n {b.ctaLabel}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Side image */}\n {b.sideImage && (\n <div className=\"hidden md:block flex-1 h-full flex items-end justify-end overflow-hidden\">\n <img\n src={b.sideImage}\n alt=\"\"\n className=\"h-full w-auto object-contain object-bottom drop-shadow-2xl\"\n />\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n\n {/* Arrow navigation */}\n {arrows && count > 1 && (\n <>\n <button\n onClick={prev}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 z-20 w-9 h-9 flex items-center justify-center rounded-full bg-black/30 text-white hover:bg-black/50 transition-colors backdrop-blur-sm\"\n aria-label=\"Previous banner\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-5 h-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\n </svg>\n </button>\n <button\n onClick={next}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 z-20 w-9 h-9 flex items-center justify-center rounded-full bg-black/30 text-white hover:bg-black/50 transition-colors backdrop-blur-sm\"\n aria-label=\"Next banner\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-5 h-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n </>\n )}\n\n {/* Dot indicators */}\n {dots && count > 1 && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 z-20 flex gap-1.5\">\n {banners.map((_, i) => (\n <button\n key={i}\n onClick={() => goTo(i)}\n aria-label={`Go to slide ${i + 1}`}\n className={[\n 'rounded-full transition-all duration-300',\n i === current\n ? 'w-5 h-2 bg-white'\n : 'w-2 h-2 bg-white/50 hover:bg-white/80',\n ].join(' ')}\n />\n ))}\n </div>\n )}\n\n {/* Auto-play progress bar */}\n {autoPlay && count > 1 && (\n <div className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-white/20 z-20\">\n <div\n key={`${current}-${paused}`}\n className={`h-full bg-white/60 ${paused ? '' : 'animate-progress'}`}\n style={{\n animation: paused ? 'none' : `progress ${autoPlayInterval}ms linear`,\n }}\n />\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { Badge } from '../common/Badge/Badge'\nimport { Button } from '../common/Button/Button'\n\nexport interface ProductCardProduct {\n id: string\n name: string\n slug?: string\n /** Primary image URL */\n image?: string\n /** Secondary image on hover */\n imageHover?: string\n price: number\n originalPrice?: number\n currency?: string\n /** 'new' | 'sale' | 'hot' | custom string */\n badge?: string\n /** 0–5 */\n rating?: number\n reviewCount?: number\n inStock?: boolean\n /** Variants available (e.g. colors) */\n variants?: { id: string; color?: string; label: string }[]\n}\n\nexport interface ProductCardProps {\n product: ProductCardProduct\n onAddToCart?: (product: ProductCardProduct) => void\n onWishlistToggle?: (product: ProductCardProduct) => void\n isWishlisted?: boolean\n onProductClick?: (product: ProductCardProduct) => void\n /** compact — narrower, used in grids with 4+ columns */\n size?: 'default' | 'compact'\n className?: string\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n className={`w-3.5 h-3.5 ${filled ? 'fill-amber-400 stroke-amber-400' : 'fill-gray-200 stroke-gray-300'}`}\n strokeWidth={1}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\"\n />\n </svg>\n )\n}\n\nfunction StarRating({ value, count }: { value: number; count?: number }) {\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((s) => (\n <StarIcon key={s} filled={s <= Math.round(value)} />\n ))}\n </div>\n {count !== undefined && (\n <span className=\"text-xs text-gray-400\">({count})</span>\n )}\n </div>\n )\n}\n\nfunction badgeVariant(badge: string) {\n const b = badge.toLowerCase()\n if (b === 'sale' || b === 'akce') return 'danger' as const\n if (b === 'new' || b === 'nové') return 'primary' as const\n if (b === 'hot') return 'warning' as const\n return 'default' as const\n}\n\nfunction formatPrice(price: number, currency = 'Kč') {\n return `${price.toLocaleString('cs-CZ')} ${currency}`\n}\n\nfunction discountPercent(original: number, current: number) {\n return Math.round((1 - current / original) * 100)\n}\n\nexport function ProductCard({\n product,\n onAddToCart,\n onWishlistToggle,\n isWishlisted = false,\n onProductClick,\n size = 'default',\n className = '',\n}: ProductCardProps) {\n const [hovered, setHovered] = useState(false)\n const [addedToCart, setAddedToCart] = useState(false)\n\n const hasDiscount =\n product.originalPrice !== undefined && product.originalPrice > product.price\n\n const handleAddToCart = (e: React.MouseEvent) => {\n e.stopPropagation()\n onAddToCart?.(product)\n setAddedToCart(true)\n setTimeout(() => setAddedToCart(false), 1500)\n }\n\n const handleWishlist = (e: React.MouseEvent) => {\n e.stopPropagation()\n onWishlistToggle?.(product)\n }\n\n return (\n <article\n className={[\n 'group relative flex flex-col bg-white rounded-xl border border-gray-200',\n 'hover:shadow-md transition-shadow duration-200 overflow-hidden cursor-pointer',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onProductClick?.(product)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Image */}\n <div className={`relative overflow-hidden bg-gray-50 ${size === 'compact' ? 'aspect-square' : 'aspect-4/3'}`}>\n {product.image ? (\n <img\n src={hovered && product.imageHover ? product.imageHover : product.image}\n alt={product.name}\n className=\"w-full h-full object-contain p-4 transition-transform duration-300 group-hover:scale-105\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-5xl bg-linear-to-br from-gray-100 to-gray-200\">\n 🛍️\n </div>\n )}\n\n {/* Badge */}\n {product.badge && (\n <div className=\"absolute top-2 left-2\">\n <Badge variant={badgeVariant(product.badge)} size=\"sm\">\n {product.badge === 'sale' && hasDiscount\n ? `-${discountPercent(product.originalPrice!, product.price)}%`\n : product.badge}\n </Badge>\n </div>\n )}\n\n {/* Out of stock overlay */}\n {product.inStock === false && (\n <div className=\"absolute inset-0 bg-white/70 flex items-center justify-center\">\n <span className=\"text-sm font-semibold text-gray-500 bg-white/90 px-3 py-1 rounded-full border border-gray-200\">\n Vyprodáno\n </span>\n </div>\n )}\n\n {/* Wishlist button */}\n <button\n onClick={handleWishlist}\n aria-label={isWishlisted ? 'Remove from wishlist' : 'Add to wishlist'}\n className={[\n 'absolute top-2 right-2 w-8 h-8 flex items-center justify-center rounded-full bg-white shadow-sm border border-gray-100',\n 'transition-all duration-200',\n 'opacity-0 group-hover:opacity-100 focus:opacity-100',\n isWishlisted ? 'text-danger-500' : 'text-gray-400 hover:text-danger-400',\n ].join(' ')}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={`w-4 h-4 ${isWishlisted ? 'fill-current' : 'fill-none'}`}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z\"\n />\n </svg>\n </button>\n\n {/* Quick add — slides up on hover */}\n <div\n className={[\n 'absolute bottom-0 left-0 right-0 p-2 transition-transform duration-200',\n hovered ? 'translate-y-0' : 'translate-y-full',\n ].join(' ')}\n >\n <Button\n variant=\"primary\"\n size=\"sm\"\n fullWidth\n loading={false}\n disabled={product.inStock === false}\n onClick={handleAddToCart}\n className=\"shadow-lg\"\n >\n {addedToCart ? (\n <span className=\"flex items-center gap-1.5\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-4 h-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n Přidáno\n </span>\n ) : (\n 'Přidat do košíku'\n )}\n </Button>\n </div>\n </div>\n\n {/* Info */}\n <div className={`flex flex-col gap-1.5 ${size === 'compact' ? 'p-3' : 'p-4'}`}>\n {/* Color variants */}\n {product.variants && product.variants.length > 0 && (\n <div className=\"flex gap-1\">\n {product.variants.slice(0, 5).map((v) => (\n <span\n key={v.id}\n title={v.label}\n className=\"w-4 h-4 rounded-full border border-gray-300 shrink-0\"\n style={{ backgroundColor: v.color ?? '#ccc' }}\n />\n ))}\n {product.variants.length > 5 && (\n <span className=\"text-xs text-gray-400\">+{product.variants.length - 5}</span>\n )}\n </div>\n )}\n\n {/* Name */}\n <h3\n className={`font-medium text-gray-900 leading-snug line-clamp-2 group-hover:text-primary-600 transition-colors ${\n size === 'compact' ? 'text-xs' : 'text-sm'\n }`}\n >\n {product.name}\n </h3>\n\n {/* Rating */}\n {product.rating !== undefined && (\n <StarRating value={product.rating} count={product.reviewCount} />\n )}\n\n {/* Price */}\n <div className=\"flex items-baseline gap-2 mt-auto pt-1\">\n <span\n className={`font-bold text-gray-900 ${size === 'compact' ? 'text-base' : 'text-lg'}`}\n >\n {formatPrice(product.price, product.currency)}\n </span>\n {hasDiscount && (\n <span className=\"text-sm text-gray-400 line-through\">\n {formatPrice(product.originalPrice!, product.currency)}\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ProductCard } from '../ProductCard/ProductCard'\nimport type { ProductCardProduct, ProductCardProps } from '../ProductCard/ProductCard'\nimport { Pagination } from '../common/Pagination/Pagination'\nimport { Select } from '../common/Select/Select'\n\nexport type GridColumns = 2 | 3 | 4 | 5\n\nexport interface SortOption {\n value: string\n label: string\n}\n\nexport interface ProductGridProps {\n products: ProductCardProduct[]\n /** Total products (for pagination) */\n totalCount?: number\n /** Current page */\n page?: number\n onPageChange?: (page: number) => void\n /** Products per page */\n perPage?: number\n /** Column count */\n columns?: GridColumns\n /** Sort options */\n sortOptions?: SortOption[]\n selectedSort?: string\n onSortChange?: (value: string) => void\n /** Active filters summary */\n activeFilters?: string[]\n onRemoveFilter?: (filter: string) => void\n onClearFilters?: () => void\n /** Loading skeleton */\n loading?: boolean\n /** Empty state slot */\n emptyState?: ReactNode\n /** ProductCard passthrough props */\n onAddToCart?: ProductCardProps['onAddToCart']\n onWishlistToggle?: ProductCardProps['onWishlistToggle']\n onProductClick?: ProductCardProps['onProductClick']\n wishlisted?: string[]\n className?: string\n}\n\nconst colClasses: Record<GridColumns, string> = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 md:grid-cols-3',\n 4: 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4',\n 5: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5',\n}\n\nconst DEFAULT_SORT_OPTIONS: SortOption[] = [\n { value: 'newest', label: 'Nejnovější' },\n { value: 'price-asc', label: 'Cena: od nejnižší' },\n { value: 'price-desc', label: 'Cena: od nejvyšší' },\n { value: 'rating', label: 'Hodnocení' },\n { value: 'bestseller', label: 'Bestsellery' },\n]\n\nfunction SkeletonCard() {\n return (\n <div className=\"rounded-xl border border-gray-100 overflow-hidden animate-pulse\">\n <div className=\"aspect-4/3 bg-gray-200\" />\n <div className=\"p-4 space-y-2\">\n <div className=\"h-3 bg-gray-200 rounded w-3/4\" />\n <div className=\"h-3 bg-gray-200 rounded w-1/2\" />\n <div className=\"h-5 bg-gray-200 rounded w-1/3 mt-2\" />\n </div>\n </div>\n )\n}\n\nexport function ProductGrid({\n products,\n totalCount,\n page = 1,\n onPageChange,\n perPage = 20,\n columns = 4,\n sortOptions = DEFAULT_SORT_OPTIONS,\n selectedSort,\n onSortChange,\n activeFilters = [],\n onRemoveFilter,\n onClearFilters,\n loading = false,\n emptyState,\n onAddToCart,\n onWishlistToggle,\n onProductClick,\n wishlisted = [],\n className = '',\n}: ProductGridProps) {\n const totalPages = totalCount ? Math.ceil(totalCount / perPage) : undefined\n const cardSize = columns >= 5 ? 'compact' : 'default'\n\n return (\n <div className={['w-full', className].filter(Boolean).join(' ')}>\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center justify-between gap-3 mb-4\">\n {/* Left: count + active filters */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {totalCount !== undefined && (\n <span className=\"text-sm text-gray-500\">\n <span className=\"font-semibold text-gray-900\">{totalCount}</span> produktů\n </span>\n )}\n {activeFilters.map((f) => (\n <span\n key={f}\n className=\"inline-flex items-center gap-1 text-xs bg-primary-50 text-primary-700 border border-primary-200 rounded-full px-2.5 py-1\"\n >\n {f}\n <button\n onClick={() => onRemoveFilter?.(f)}\n aria-label={`Remove filter ${f}`}\n className=\"hover:text-primary-900 transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-3 h-3\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n ))}\n {activeFilters.length > 1 && (\n <button\n onClick={onClearFilters}\n className=\"text-xs text-gray-400 hover:text-gray-600 underline underline-offset-2 transition-colors\"\n >\n Zrušit vše\n </button>\n )}\n </div>\n\n {/* Right: sort */}\n <Select\n options={sortOptions}\n value={selectedSort ?? ''}\n onChange={(e) => onSortChange?.(e.target.value)}\n aria-label=\"Sort products\"\n className=\"text-sm\"\n />\n </div>\n\n {/* Grid */}\n {loading ? (\n <div className={`grid gap-4 ${colClasses[columns]}`}>\n {Array.from({ length: perPage > 12 ? 12 : perPage }).map((_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n ) : products.length === 0 ? (\n <div className=\"py-16 text-center\">\n {emptyState ?? (\n <div className=\"space-y-2\">\n <p className=\"text-4xl\">🔍</p>\n <p className=\"font-semibold text-gray-900\">Žádné produkty nenalezeny</p>\n <p className=\"text-sm text-gray-500\">Zkuste upravit filtry nebo hledat jinak.</p>\n {activeFilters.length > 0 && (\n <button\n onClick={onClearFilters}\n className=\"mt-3 text-sm text-primary-600 hover:underline\"\n >\n Zrušit všechny filtry\n </button>\n )}\n </div>\n )}\n </div>\n ) : (\n <div className={`grid gap-4 ${colClasses[columns]}`}>\n {products.map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n size={cardSize}\n onAddToCart={onAddToCart}\n onWishlistToggle={onWishlistToggle}\n onProductClick={onProductClick}\n isWishlisted={wishlisted.includes(product.id)}\n />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n {totalPages && totalPages > 1 && onPageChange && (\n <div className=\"flex justify-center mt-8\">\n <Pagination\n page={page}\n totalPages={totalPages}\n onPageChange={onPageChange}\n />\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode, CSSProperties } from 'react'\nimport { Button } from '../common/Button/Button'\nimport type { ButtonProps } from '../common/Button/Button'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype CtaAlign = 'left' | 'center' | 'right'\ntype CtaSize = 'sm' | 'md' | 'lg' | 'xl'\ntype CtaVariant = 'default' | 'primary' | 'dark' | 'gradient' | 'outline' | 'image'\ntype CtaLayout = 'stacked' | 'inline'\n\nexport interface CtaAction {\n label: string\n onClick?: () => void\n href?: string\n variant?: ButtonProps['variant']\n size?: ButtonProps['size']\n}\n\nexport interface CallToActionProps {\n // Content\n eyebrow?: string\n title: string\n description?: string\n actions?: CtaAction[]\n\n // Layout\n align?: CtaAlign\n layout?: CtaLayout\n size?: CtaSize\n\n // Visual\n variant?: CtaVariant\n /** Custom background colour or gradient CSS value (overrides variant background) */\n background?: string\n /** For variant=\"image\": URL of background image */\n backgroundImage?: string\n /** Extra decorative slot — e.g. an illustration, icon or badge */\n media?: ReactNode\n\n // Misc\n className?: string\n style?: CSSProperties\n}\n\n// ─── Config maps ─────────────────────────────────────────────────────────────\n\nconst variantClasses: Record<CtaVariant, string> = {\n default: 'bg-gray-50 border border-gray-200',\n primary: 'bg-primary-600',\n dark: 'bg-gray-900',\n gradient: 'bg-linear-to-br from-primary-600 via-primary-700 to-violet-700',\n outline: 'bg-white border-2 border-primary-600',\n image: 'relative overflow-hidden', // bg applied inline via style\n}\n\nconst variantTextClasses: Record<CtaVariant, { eyebrow: string; title: string; description: string }> = {\n default: { eyebrow: 'text-primary-600', title: 'text-gray-900', description: 'text-gray-600' },\n primary: { eyebrow: 'text-primary-100', title: 'text-white', description: 'text-primary-100' },\n dark: { eyebrow: 'text-primary-400', title: 'text-white', description: 'text-gray-400' },\n gradient: { eyebrow: 'text-primary-200', title: 'text-white', description: 'text-primary-100' },\n outline: { eyebrow: 'text-primary-600', title: 'text-gray-900', description: 'text-gray-600' },\n image: { eyebrow: 'text-white/70', title: 'text-white', description: 'text-white/80' },\n}\n\nconst sizeClasses: Record<CtaSize, { wrapper: string; title: string; description: string; eyebrow: string }> = {\n sm: { wrapper: 'px-6 py-6 rounded-xl', title: 'text-xl font-bold', description: 'text-sm', eyebrow: 'text-xs' },\n md: { wrapper: 'px-8 py-10 rounded-2xl', title: 'text-2xl font-bold', description: 'text-base', eyebrow: 'text-xs' },\n lg: { wrapper: 'px-10 py-14 rounded-2xl', title: 'text-3xl font-bold', description: 'text-lg', eyebrow: 'text-sm' },\n xl: { wrapper: 'px-12 py-20 rounded-3xl', title: 'text-4xl font-extrabold leading-tight', description: 'text-xl', eyebrow: 'text-sm' },\n}\n\nconst alignClasses: Record<CtaAlign, { wrapper: string; actions: string }> = {\n left: { wrapper: 'items-start text-left', actions: 'justify-start' },\n center: { wrapper: 'items-center text-center', actions: 'justify-center' },\n right: { wrapper: 'items-end text-right', actions: 'justify-end' },\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function CallToAction({\n eyebrow,\n title,\n description,\n actions = [],\n align = 'center',\n layout = 'stacked',\n size = 'md',\n variant = 'default',\n background,\n backgroundImage,\n media,\n className = '',\n style,\n}: CallToActionProps) {\n const textColors = variantTextClasses[variant]\n const sizes = sizeClasses[size]\n const alignment = alignClasses[align]\n const isInline = layout === 'inline'\n\n const inlineStyle: CSSProperties = {\n ...(background ? { background } : {}),\n ...(backgroundImage ? { backgroundImage: `url(${backgroundImage})`, backgroundSize: 'cover', backgroundPosition: 'center' } : {}),\n ...style,\n }\n\n return (\n <div\n className={[\n 'w-full',\n variantClasses[variant],\n sizes.wrapper,\n className,\n ].filter(Boolean).join(' ')}\n style={Object.keys(inlineStyle).length ? inlineStyle : undefined}\n >\n {/* Image overlay */}\n {(variant === 'image' || backgroundImage) && (\n <div className=\"absolute inset-0 bg-black/50\" />\n )}\n\n <div className={`relative ${isInline ? 'flex flex-wrap items-center justify-between gap-6' : `flex flex-col gap-4 ${alignment.wrapper}`}`}>\n\n {/* Text block */}\n <div className={`flex flex-col gap-2 ${isInline ? 'flex-1 min-w-0' : alignment.wrapper}`}>\n {eyebrow && (\n <p className={`font-semibold uppercase tracking-widest ${sizes.eyebrow} ${textColors.eyebrow}`}>\n {eyebrow}\n </p>\n )}\n <h2 className={`${sizes.title} ${textColors.title}`}>\n {title}\n </h2>\n {description && (\n <p className={`max-w-2xl ${sizes.description} ${textColors.description}`}>\n {description}\n </p>\n )}\n </div>\n\n {/* Media slot */}\n {media && !isInline && (\n <div className=\"mt-2\">{media}</div>\n )}\n\n {/* Actions */}\n {actions.length > 0 && (\n <div className={`flex flex-wrap gap-3 ${isInline ? 'shrink-0' : alignment.actions}`}>\n {actions.map((action, i) => {\n const btn = (\n <Button\n key={i}\n variant={action.variant ?? (i === 0 ? resolveDefaultPrimaryVariant(variant) : 'outline')}\n size={action.size ?? (size === 'sm' ? 'sm' : size === 'xl' ? 'lg' : 'md')}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n )\n return action.href ? (\n <a key={i} href={action.href} className=\"contents\">{btn}</a>\n ) : btn\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** Pick a sensible default button variant that contrasts with the CTA background */\nfunction resolveDefaultPrimaryVariant(ctaVariant: CtaVariant): ButtonProps['variant'] {\n if (ctaVariant === 'default' || ctaVariant === 'outline') return 'primary'\n return 'secondary' // white-ish on dark/coloured backgrounds\n}\n","import type { ReactNode } from 'react'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface FooterContact {\n icon?: 'phone' | 'email' | 'address' | 'hours' | ReactNode\n label: string\n value: string\n href?: string\n}\n\nexport interface FooterLink {\n label: string\n href?: string\n onClick?: () => void\n}\n\nexport interface FooterLinkGroup {\n heading: string\n links: FooterLink[]\n}\n\nexport interface FooterSocialLink {\n label: string\n href?: string\n icon: 'facebook' | 'instagram' | 'twitter' | 'youtube' | 'tiktok' | ReactNode\n}\n\nexport interface FooterProps {\n // Branding\n logo?: ReactNode\n tagline?: string\n\n // Contact section\n contactHeading?: string\n contacts?: FooterContact[]\n\n // Links section\n linkGroups?: FooterLinkGroup[]\n\n // Social\n socialLinks?: FooterSocialLink[]\n\n // Bottom bar\n copyright?: string\n bottomLinks?: FooterLink[]\n\n className?: string\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction PhoneIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z\" />\n </svg>\n )\n}\n\nfunction EmailIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n )\n}\n\nfunction AddressIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\" />\n </svg>\n )\n}\n\nfunction HoursIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nfunction FacebookIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M24 12.073C24 5.405 18.627 0 12 0S0 5.405 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047V9.41c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.97h-1.513c-1.491 0-1.956.93-1.956 1.886v2.267h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z\" />\n </svg>\n )\n}\n\nfunction InstagramIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\" />\n </svg>\n )\n}\n\nfunction TwitterIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n )\n}\n\nfunction YoutubeIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n )\n}\n\nfunction TiktokIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-2.88 2.5 2.89 2.89 0 01-2.89-2.89 2.89 2.89 0 012.89-2.89c.28 0 .54.04.79.1V9.01a6.33 6.33 0 00-.79-.05 6.34 6.34 0 00-6.34 6.34 6.34 6.34 0 006.34 6.34 6.34 6.34 0 006.33-6.34V8.69a8.18 8.18 0 004.78 1.52V6.76a4.85 4.85 0 01-1.01-.07z\" />\n </svg>\n )\n}\n\nconst SOCIAL_ICONS = { facebook: FacebookIcon, instagram: InstagramIcon, twitter: TwitterIcon, youtube: YoutubeIcon, tiktok: TiktokIcon }\nconst CONTACT_ICONS = { phone: PhoneIcon, email: EmailIcon, address: AddressIcon, hours: HoursIcon }\n\nfunction resolveContactIcon(icon: FooterContact['icon']) {\n if (!icon) return null\n if (typeof icon === 'string') {\n const Icon = CONTACT_ICONS[icon as keyof typeof CONTACT_ICONS]\n return Icon ? <Icon /> : null\n }\n return icon\n}\n\nfunction resolveSocialIcon(icon: FooterSocialLink['icon']) {\n if (typeof icon === 'string') {\n const Icon = SOCIAL_ICONS[icon as keyof typeof SOCIAL_ICONS]\n return Icon ? <Icon /> : null\n }\n return icon\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function Footer({\n logo,\n tagline,\n contactHeading = 'Kontakty',\n contacts = [],\n linkGroups = [],\n socialLinks = [],\n copyright,\n bottomLinks = [],\n className = '',\n}: FooterProps) {\n const year = new Date().getFullYear()\n\n return (\n <footer className={['bg-gray-900 text-gray-300', className].filter(Boolean).join(' ')}>\n\n {/* ── Main section ───────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 py-12 grid grid-cols-1 md:grid-cols-2 gap-10 lg:gap-16\">\n\n {/* ── Left: Contact section ──────────────────────────────────────── */}\n <div className=\"flex flex-col gap-6\">\n {/* Logo + tagline */}\n <div>\n {logo ? (\n <div className=\"mb-3\">{logo}</div>\n ) : (\n <span className=\"text-xl font-bold text-white tracking-tight mb-3 block\">\n shopito\n </span>\n )}\n {tagline && (\n <p className=\"text-sm text-gray-400 max-w-xs\">{tagline}</p>\n )}\n </div>\n\n {/* Contacts */}\n {contacts.length > 0 && (\n <div>\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-gray-500 mb-3\">\n {contactHeading}\n </h3>\n <ul className=\"space-y-3\">\n {contacts.map((c, i) => {\n const icon = resolveContactIcon(c.icon)\n const inner = (\n <div className=\"flex items-start gap-2.5\">\n {icon && (\n <span className=\"mt-0.5 text-primary-400\">{icon}</span>\n )}\n <div>\n <p className=\"text-xs text-gray-500 leading-none mb-0.5\">{c.label}</p>\n <p className={`text-sm text-gray-200 ${c.href ? 'hover:text-white transition-colors' : ''}`}>\n {c.value}\n </p>\n </div>\n </div>\n )\n\n return (\n <li key={i}>\n {c.href ? (\n <a href={c.href}>{inner}</a>\n ) : (\n inner\n )}\n </li>\n )\n })}\n </ul>\n </div>\n )}\n\n {/* Social links */}\n {socialLinks.length > 0 && (\n <div className=\"flex gap-2 flex-wrap\">\n {socialLinks.map((s, i) => (\n <a\n key={i}\n href={s.href}\n aria-label={s.label}\n className=\"w-8 h-8 flex items-center justify-center rounded-lg bg-gray-800 text-gray-400 hover:bg-primary-600 hover:text-white transition-colors\"\n >\n {resolveSocialIcon(s.icon)}\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Right: Link groups ─────────────────────────────────────────── */}\n {linkGroups.length > 0 && (\n <div className={`grid gap-8 ${linkGroups.length === 1 ? 'grid-cols-1' : linkGroups.length === 2 ? 'grid-cols-2' : 'grid-cols-2 sm:grid-cols-3'}`}>\n {linkGroups.map((group, gi) => (\n <div key={gi}>\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-gray-500 mb-3\">\n {group.heading}\n </h3>\n <ul className=\"space-y-2\">\n {group.links.map((link, li) => (\n <li key={li}>\n {link.href ? (\n <a\n href={link.href}\n className=\"text-sm text-gray-400 hover:text-white transition-colors\"\n >\n {link.label}\n </a>\n ) : (\n <button\n onClick={link.onClick}\n className=\"text-sm text-gray-400 hover:text-white transition-colors text-left\"\n >\n {link.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Bottom bar ─────────────────────────────────────────────────────── */}\n <div className=\"border-t border-gray-800\">\n <div className=\"max-w-7xl mx-auto px-4 py-4 flex flex-wrap items-center justify-between gap-3\">\n <p className=\"text-xs text-gray-500\">\n {copyright ?? `© ${year} Shopito. Všechna práva vyhrazena.`}\n </p>\n {bottomLinks.length > 0 && (\n <nav className=\"flex flex-wrap gap-4\">\n {bottomLinks.map((link, i) => (\n link.href ? (\n <a key={i} href={link.href} className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors\">\n {link.label}\n </a>\n ) : (\n <button key={i} onClick={link.onClick} className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors\">\n {link.label}\n </button>\n )\n ))}\n </nav>\n )}\n </div>\n </div>\n\n </footer>\n )\n}\n"],"x_google_ignoreList":[2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/components/common/Container/Container.tsx","../src/components/common/Main/Main.tsx","../node_modules/classnames/index.js","../src/components/common/Button/Button.tsx","../src/components/common/LoadingSpin/LoadingSpin.tsx","../src/components/common/IconButton/IconButton.tsx","../src/components/common/Input/Input.tsx","../src/components/common/Select/Select.tsx","../src/components/common/Typography/Heading.tsx","../src/components/common/Typography/Text.tsx","../src/components/common/Badge/Badge.tsx","../src/components/common/Card/Card.tsx","../src/components/common/Spinner/Spinner.tsx","../src/components/common/Alert/Alert.tsx","../src/components/common/Modal/Modal.tsx","../src/components/common/Checkbox/Checkbox.tsx","../src/components/common/Toggle/Toggle.tsx","../src/components/common/Avatar/Avatar.tsx","../src/components/common/Stack/Stack.tsx","../src/components/common/Grid/Grid.tsx","../src/components/common/QuantityInput/QuantityInput.tsx","../src/components/common/Pagination/Pagination.tsx","../src/components/Header/Header.tsx","../src/components/CategoryTree/CategoryTree.tsx","../src/components/MegaMenu/MegaMenu.tsx","../src/components/BannerCarousel/BannerCarousel.tsx","../src/components/ProductCard/ProductCard.tsx","../src/components/ProductGrid/ProductGrid.tsx","../src/components/CallToAction/CallToAction.tsx","../src/components/Footer/Footer.tsx"],"sourcesContent":["import { type ReactNode } from 'react';\n\nexport interface ContainerProps {\n children: ReactNode;\n}\n\nexport const Container = ({ children }: ContainerProps) => {\n return <div className=\"container\">{children}</div>;\n};\n","import { type ReactNode } from 'react';\n\nexport interface MainProps {\n children: ReactNode;\n}\n\nexport const Main = ({ children }: MainProps) => {\n return <main className=\"main\">{children}</main>;\n};\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype Variant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n fullWidth?: boolean;\n}\n\n// const variantClasses: Record<Variant, string> = {\n// primary:\n// 'bg-primary-600 text-white hover:bg-primary-700 active:bg-primary-800 focus-visible:ring-primary-500',\n// secondary:\n// 'bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 focus-visible:ring-gray-400',\n// outline:\n// 'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 active:bg-gray-100 focus-visible:ring-gray-400',\n// ghost:\n// 'bg-transparent text-gray-700 hover:bg-gray-100 active:bg-gray-200 focus-visible:ring-gray-400',\n// danger:\n// 'bg-danger-600 text-white hover:bg-danger-700 active:bg-danger-800 focus-visible:ring-danger-500',\n// };\n\n// const sizeClasses: Record<Size, string> = {\n// xs: 'h-7 px-2.5 text-xs gap-1',\n// sm: 'h-8 px-3 text-sm gap-1.5',\n// md: 'h-10 px-4 text-sm gap-2',\n// lg: 'h-11 px-5 text-base gap-2',\n// };\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n fullWidth = false,\n disabled,\n children,\n className = '',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n className={clx(\n 'btn',\n variant && `btn-${variant}`,\n size && `btn-${size}`,\n fullWidth && 'w-full',\n className,\n )}\n {...props}\n >\n {loading && (\n <svg\n className=\"animate-spin h-4 w-4 shrink-0\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {children}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\n","import clx from 'classnames';\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface LoadingSpinProps {\n size: Size;\n}\n\nexport const LoadingSpin = ({ size = 'md' }: LoadingSpinProps) => {\n return (\n <svg\n className={clx('loading-spin', `loading-spin-${size}`)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n};\n","import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\nimport { LoadingSpin } from '../LoadingSpin';\n\ntype Variant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger';\ntype Size = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode;\n label: string;\n variant?: Variant;\n size?: Size;\n loading?: boolean;\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n label,\n variant = 'ghost',\n size = 'md',\n loading = false,\n disabled,\n className = '',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n\n return (\n <button\n ref={ref}\n disabled={isDisabled}\n aria-label={label}\n title={label}\n className={clx(\n 'icon-button',\n `icon-button-${variant}`,\n `icon-button-${size}`,\n className,\n )}\n {...props}\n >\n {loading ? <LoadingSpin size={size} /> : icon}\n </button>\n );\n },\n);\n\nIconButton.displayName = 'IconButton';\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n error?: string;\n hint?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n { label, error, hint, leftIcon, rightIcon, className = '', id, ...props },\n ref,\n ) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={'w-full'}>\n {label && (\n <label htmlFor={inputId} className=\"input-label\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n {leftIcon && <span className=\"left-icon\">{leftIcon}</span>}\n <input\n ref={ref}\n id={inputId}\n className={clx(\n 'input',\n error && 'has-error',\n !!leftIcon && 'with-left-icon',\n !!rightIcon && 'with-right-icon',\n 'w-full',\n className,\n )}\n {...props}\n />\n {rightIcon && <span className=\"right-icon\">{rightIcon}</span>}\n </div>\n {(error || hint) && (\n <p className={clx('helper-text', error && 'has-error')}>\n {error ?? hint}\n </p>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n","import { forwardRef } from 'react';\nimport type { SelectHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n label?: string;\n error?: string;\n hint?: string;\n options: SelectOption[];\n placeholder?: string;\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n { label, error, hint, options, placeholder, className = '', id, ...props },\n ref,\n ) => {\n const selectId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={clx('select-wrapper', 'w-full')}>\n {label && (\n <label htmlFor={selectId} className=\"select-label\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n <select\n ref={ref}\n id={selectId}\n className={clx('select', 'w-full', error && 'has-error', className)}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n {/* Chevron icon */}\n <span className=\"select-chevron-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n </span>\n </div>\n {(error || hint) && (\n <p className={clx('select-helper', error && 'has-error')}>\n {error ?? hint}\n </p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\nimport type { Color } from './Text';\n\ntype HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\ninterface HeadingProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: HeadingLevel;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n color?: Color;\n children: ReactNode;\n}\n\nexport const Heading = ({\n as,\n level = 1,\n color = 'default',\n className = '',\n children,\n ...props\n}: HeadingProps) => {\n const Tag = as ?? (`h${level}` as HeadingLevel);\n\n return (\n <Tag\n className={cx(`text-color-${color}`, `heading-size-${level}`, className)}\n {...props}\n >\n {children}\n </Tag>\n );\n};\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\n\ntype TextVariant = 'body' | 'body-sm' | 'caption' | 'overline' | 'code';\n\nexport type Color =\n | 'default'\n | 'muted'\n | 'primary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'inherit';\n\ninterface TextProps extends HTMLAttributes<HTMLElement> {\n variant?: TextVariant;\n color?: Color;\n as?: ElementType;\n children: ReactNode;\n}\n\nexport const Text = ({\n variant = 'body',\n color = 'default',\n as: Tag = 'p',\n className = '',\n children,\n ...props\n}: TextProps) => {\n return (\n <Tag\n className={cx(\n `text-color-${color}`,\n `text-variant-${variant}`,\n className,\n )}\n {...props}\n >\n {children}\n </Tag>\n );\n};\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype BadgeVariant =\n | 'default'\n | 'primary'\n | 'success'\n | 'warning'\n | 'danger'\n | 'outline';\n\ntype BadgeSize = 'sm' | 'md';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n dot?: boolean;\n children: ReactNode;\n}\n\nexport function Badge({\n variant = 'default',\n size = 'md',\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={clx('badge', `badge-${variant}`, `badge-${size}`, className)}\n {...props}\n >\n {dot && <span className={clx('badge-dot', `badge-dot-${variant}`)} />}\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n padding?: 'none' | 'sm' | 'md' | 'lg'\n shadow?: boolean\n border?: boolean\n}\n\nexport interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nexport interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\nconst paddingClasses = {\n none: '',\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8',\n}\n\nexport function Card({\n children,\n padding = 'md',\n shadow = true,\n border = true,\n className = '',\n ...props\n}: CardProps) {\n return (\n <div\n className={[\n 'bg-white rounded-xl overflow-hidden',\n border ? 'border border-gray-200' : '',\n shadow ? 'shadow-sm' : '',\n paddingClasses[padding],\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport function CardHeader({ children, className = '', ...props }: CardHeaderProps) {\n return (\n <div\n className={['px-6 py-4 border-b border-gray-100', className].filter(Boolean).join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport function CardBody({ children, className = '', ...props }: CardBodyProps) {\n return (\n <div className={['p-6', className].filter(Boolean).join(' ')} {...props}>\n {children}\n </div>\n )\n}\n\nexport function CardFooter({ children, className = '', ...props }: CardFooterProps) {\n return (\n <div\n className={[\n 'px-6 py-4 border-t border-gray-100 bg-gray-50',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import type { HTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype SpinnerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\ntype SpinnerColor = 'primary' | 'white' | 'gray';\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize;\n color?: SpinnerColor;\n label?: string;\n}\n\nexport function Spinner({\n size = 'md',\n color = 'primary',\n label = 'Loading…',\n className = '',\n ...props\n}: SpinnerProps) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={clx('spinner-wrapper', className)}\n {...props}\n >\n <span className={clx('spinner', `spinner-${size}`, `spinner-${color}`)} />\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant;\n title?: string;\n children: ReactNode;\n onClose?: () => void;\n}\n\nconst variantIcon: Record<AlertVariant, ReactNode> = {\n info: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n ),\n success: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n ),\n warning: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\n />\n ),\n danger: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n ),\n};\n\nexport function Alert({\n variant = 'info',\n title,\n children,\n onClose,\n className = '',\n ...props\n}: AlertProps) {\n return (\n <div\n role=\"alert\"\n className={clx('alert', `alert-${variant}`, 'w-full', className)}\n {...props}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={clx('alert-icon', `alert-icon-${variant}`)}\n >\n {variantIcon[variant]}\n </svg>\n <div className=\"flex-1 min-w-0\">\n {title && <p className=\"alert-title\">{title}</p>}\n <div className=\"alert-text\">{children}</div>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"alert-close-btn\"\n aria-label=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react'\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\ntype ModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\nexport interface ModalProps {\n open: boolean\n onClose: () => void\n title?: string\n children: ReactNode\n footer?: ReactNode\n size?: ModalSize\n closeOnBackdrop?: boolean\n}\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n full: 'max-w-full mx-4',\n}\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n size = 'md',\n closeOnBackdrop = true,\n}: ModalProps) {\n const backdropRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n if (!open) return null\n\n return createPortal(\n <div\n ref={backdropRef}\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm\"\n onClick={(e) => {\n if (closeOnBackdrop && e.target === backdropRef.current) onClose()\n }}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n className={[\n 'relative w-full bg-white rounded-xl shadow-xl flex flex-col max-h-[90vh]',\n sizeClasses[size],\n ].join(' ')}\n >\n {title && (\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-100 shrink-0\">\n <h2 id=\"modal-title\" className=\"text-lg font-semibold text-gray-900\">\n {title}\n </h2>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n aria-label=\"Close modal\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-5 h-5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n {footer && (\n <div className=\"px-6 py-4 border-t border-gray-100 shrink-0 bg-gray-50 rounded-b-xl\">\n {footer}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )\n}\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface CheckboxProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> {\n label?: string;\n description?: string;\n error?: string;\n indeterminate?: boolean;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n { label, description, error, indeterminate, className = '', id, ...props },\n ref,\n ) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <div className={clx('checkbox-wrapper', className)}>\n <div className=\"checkbox-wrapper-inner\">\n <input\n ref={(el) => {\n if (el) el.indeterminate = indeterminate ?? false;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n }}\n id={inputId}\n type=\"checkbox\"\n className={clx('checkbox', error && 'has-error')}\n {...props}\n />\n </div>\n {(label || description) && (\n <div>\n {label && (\n <label htmlFor={inputId} className=\"checkbox-label\">\n {label}\n </label>\n )}\n {description && (\n <p className=\"checkbox-description\">{description}</p>\n )}\n {error && <p className=\"checkbox-error\">{error}</p>}\n </div>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { forwardRef } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\ntype ToggleSize = 'sm' | 'md' | 'lg';\n\nexport interface ToggleProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'size'\n> {\n label?: string;\n description?: string;\n size?: ToggleSize;\n}\n\nexport const Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n ({ label, description, size = 'md', className = '', id, ...props }, ref) => {\n const inputId = id ?? label?.toLowerCase().replace(/\\s+/g, '-');\n\n return (\n <label\n htmlFor={inputId}\n className={clx(\n 'toggle',\n props.disabled && 'toggle-disabled',\n className,\n )}\n >\n <div className={clx('toggle-wrapper', `toggle-wrapper-${size}`)}>\n <input\n ref={ref}\n id={inputId}\n type=\"checkbox\"\n role=\"switch\"\n className=\"sr-only peer\"\n {...props}\n />\n <div className=\"toggle-track\" />\n <div className={clx('toggle-thumb', `toggle-thumb-${size}`)} />\n </div>\n {(label || description) && (\n <div>\n {label && <span className=\"toggle-label\">{label}</span>}\n {description && (\n <span className=\"toggle-description\">{description}</span>\n )}\n </div>\n )}\n </label>\n );\n },\n);\n\nToggle.displayName = 'Toggle';\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport clx from 'classnames';\n\ntype AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n src?: string;\n alt?: string;\n name?: string;\n size?: AvatarSize;\n}\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n max?: number;\n size?: AvatarSize;\n children: ReactNode;\n}\n\nconst bgColors = [\n 'bg-red-500',\n 'bg-orange-500',\n 'bg-amber-500',\n 'bg-emerald-500',\n 'bg-teal-500',\n 'bg-cyan-500',\n 'bg-blue-500',\n 'bg-violet-500',\n 'bg-pink-500',\n];\n\nexport function Avatar({\n src,\n alt,\n name,\n size = 'md',\n className,\n ...props\n}: AvatarProps) {\n const baseClasses = ['avatar', `avatar-${size}`, className];\n\n const nameToColor = (n: string) => {\n let hash = 0;\n for (let i = 0; i < n.length; i++) hash += n.charCodeAt(i);\n return bgColors[hash % bgColors.length];\n };\n\n const getInitials = (name: string) =>\n name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0])\n .join('')\n .toUpperCase();\n\n if (src) {\n return (\n <span className={clx(baseClasses)} {...props}>\n <img\n src={src}\n alt={alt ?? name ?? ''}\n className=\"w-full h-full object-cover\"\n />\n </span>\n );\n }\n\n if (name) {\n return (\n <span\n className={clx(baseClasses, nameToColor(name))}\n aria-label={name}\n {...props}\n >\n {getInitials(name)}\n </span>\n );\n }\n\n // Fallback icon\n return (\n <span className={clx(baseClasses, 'avatar-fallback')} {...props}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n className=\"w-3/5 h-3/5\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.5 6a4.5 4.5 0 119 0 4.5 4.5 0 01-9 0zM3.751 20.105a8.25 8.25 0 0116.498 0 .75.75 0 01-.437.695A18.683 18.683 0 0112 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 01-.437-.695z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport cx from 'classnames';\n\ninterface StackProps {\n direction?: 'row' | 'column';\n gap?: number;\n alignItems?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';\n justifyItems?: 'start' | 'end' | 'center' | 'stretch';\n children?: ReactNode;\n}\n\nexport const Stack = ({\n direction = 'row',\n gap,\n alignItems = 'start',\n justifyItems = 'start',\n children,\n}: StackProps) => {\n const alignItemsMap: Record<string, string> = {\n start: 'items-start',\n end: 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n };\n\n const justifyItemsMap: Record<string, string> = {\n start: 'justify-items-start',\n end: 'justify-items-end',\n center: 'justify-items-center',\n stretch: 'justify-items-stretch',\n };\n\n return (\n <div\n className={cx(\n 'stack',\n `stack-${direction}`,\n gap && `gap-${gap}`,\n alignItemsMap[alignItems],\n justifyItemsMap[justifyItems],\n )}\n >\n {children}\n </div>\n );\n};\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport cx from 'classnames';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ColSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\nexport type ColOffset = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\nexport type GridCols = 1 | 2 | 3 | 4 | 6 | 12;\nexport type GapSize = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16;\n\nexport interface GridProps {\n children?: ReactNode;\n cols?: GridCols;\n gap?: GapSize;\n rowGap?: GapSize;\n colGap?: GapSize;\n as?: ElementType;\n className?: string;\n}\n\nexport interface ColProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n /** Výchozí šířka (mobile-first) */\n span?: ColSpan;\n sm?: ColSpan;\n md?: ColSpan;\n lg?: ColSpan;\n xl?: ColSpan;\n /** Přeskočit N sloupců od aktuální pozice (mobile-first) */\n offset?: ColOffset;\n smOffset?: ColOffset;\n mdOffset?: ColOffset;\n lgOffset?: ColOffset;\n xlOffset?: ColOffset;\n}\n\n// ─── Class maps — všechny literální stringy, Tailwind je detekuje při scanu ──\n\nconst colsMap: Record<GridCols, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 6: 'grid-cols-6',\n 12: 'grid-cols-12',\n};\n\nconst gapMap: Record<GapSize, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n 16: 'gap-16',\n};\n\nconst rowGapMap: Record<GapSize, string> = {\n 0: 'gap-y-0',\n 1: 'gap-y-1',\n 2: 'gap-y-2',\n 3: 'gap-y-3',\n 4: 'gap-y-4',\n 5: 'gap-y-5',\n 6: 'gap-y-6',\n 8: 'gap-y-8',\n 10: 'gap-y-10',\n 12: 'gap-y-12',\n 16: 'gap-y-16',\n};\n\nconst colGapMap: Record<GapSize, string> = {\n 0: 'gap-x-0',\n 1: 'gap-x-1',\n 2: 'gap-x-2',\n 3: 'gap-x-3',\n 4: 'gap-x-4',\n 5: 'gap-x-5',\n 6: 'gap-x-6',\n 8: 'gap-x-8',\n 10: 'gap-x-10',\n 12: 'gap-x-12',\n 16: 'gap-x-16',\n};\n\n// Span — bez prefixu (výchozí, mobile-first)\nconst spanMap: Record<ColSpan, string> = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n 7: 'col-span-7',\n 8: 'col-span-8',\n 9: 'col-span-9',\n 10: 'col-span-10',\n 11: 'col-span-11',\n 12: 'col-span-12',\n};\n\nconst smSpanMap: Record<ColSpan, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n};\n\nconst mdSpanMap: Record<ColSpan, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n};\n\nconst lgSpanMap: Record<ColSpan, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n 7: 'lg:col-span-7',\n 8: 'lg:col-span-8',\n 9: 'lg:col-span-9',\n 10: 'lg:col-span-10',\n 11: 'lg:col-span-11',\n 12: 'lg:col-span-12',\n};\n\nconst xlSpanMap: Record<ColSpan, string> = {\n 1: 'xl:col-span-1',\n 2: 'xl:col-span-2',\n 3: 'xl:col-span-3',\n 4: 'xl:col-span-4',\n 5: 'xl:col-span-5',\n 6: 'xl:col-span-6',\n 7: 'xl:col-span-7',\n 8: 'xl:col-span-8',\n 9: 'xl:col-span-9',\n 10: 'xl:col-span-10',\n 11: 'xl:col-span-11',\n 12: 'xl:col-span-12',\n};\n\n// Offset: přeskočit N sloupců → col-start-(N+1)\nconst offsetMap: Record<ColOffset, string> = {\n 1: 'col-start-2',\n 2: 'col-start-3',\n 3: 'col-start-4',\n 4: 'col-start-5',\n 5: 'col-start-6',\n 6: 'col-start-7',\n 7: 'col-start-8',\n 8: 'col-start-9',\n 9: 'col-start-10',\n 10: 'col-start-11',\n 11: 'col-start-12',\n};\n\nconst smOffsetMap: Record<ColOffset, string> = {\n 1: 'sm:col-start-2',\n 2: 'sm:col-start-3',\n 3: 'sm:col-start-4',\n 4: 'sm:col-start-5',\n 5: 'sm:col-start-6',\n 6: 'sm:col-start-7',\n 7: 'sm:col-start-8',\n 8: 'sm:col-start-9',\n 9: 'sm:col-start-10',\n 10: 'sm:col-start-11',\n 11: 'sm:col-start-12',\n};\n\nconst mdOffsetMap: Record<ColOffset, string> = {\n 1: 'md:col-start-2',\n 2: 'md:col-start-3',\n 3: 'md:col-start-4',\n 4: 'md:col-start-5',\n 5: 'md:col-start-6',\n 6: 'md:col-start-7',\n 7: 'md:col-start-8',\n 8: 'md:col-start-9',\n 9: 'md:col-start-10',\n 10: 'md:col-start-11',\n 11: 'md:col-start-12',\n};\n\nconst lgOffsetMap: Record<ColOffset, string> = {\n 1: 'lg:col-start-2',\n 2: 'lg:col-start-3',\n 3: 'lg:col-start-4',\n 4: 'lg:col-start-5',\n 5: 'lg:col-start-6',\n 6: 'lg:col-start-7',\n 7: 'lg:col-start-8',\n 8: 'lg:col-start-9',\n 9: 'lg:col-start-10',\n 10: 'lg:col-start-11',\n 11: 'lg:col-start-12',\n};\n\nconst xlOffsetMap: Record<ColOffset, string> = {\n 1: 'xl:col-start-2',\n 2: 'xl:col-start-3',\n 3: 'xl:col-start-4',\n 4: 'xl:col-start-5',\n 5: 'xl:col-start-6',\n 6: 'xl:col-start-7',\n 7: 'xl:col-start-8',\n 8: 'xl:col-start-9',\n 9: 'xl:col-start-10',\n 10: 'xl:col-start-11',\n 11: 'xl:col-start-12',\n};\n\n// ─── Components ───────────────────────────────────────────────────────────────\n\nexport const Grid = ({\n children,\n cols = 12,\n gap,\n rowGap,\n colGap,\n as: Tag = 'div',\n className,\n}: GridProps) => (\n <Tag\n className={cx(\n 'grid',\n 'w-full',\n colsMap[cols],\n gap !== undefined && gapMap[gap],\n rowGap !== undefined && rowGapMap[rowGap],\n colGap !== undefined && colGapMap[colGap],\n className,\n )}\n >\n {children}\n </Tag>\n);\n\nGrid.displayName = 'Grid';\n\nexport const Col = ({\n children,\n span,\n sm,\n md,\n lg,\n xl,\n offset,\n smOffset,\n mdOffset,\n lgOffset,\n xlOffset,\n className,\n ...rest\n}: ColProps) => (\n <div\n className={cx(\n span && spanMap[span],\n sm && smSpanMap[sm],\n md && mdSpanMap[md],\n lg && lgSpanMap[lg],\n xl && xlSpanMap[xl],\n offset && offsetMap[offset],\n smOffset && smOffsetMap[smOffset],\n mdOffset && mdOffsetMap[mdOffset],\n lgOffset && lgOffsetMap[lgOffset],\n xlOffset && xlOffsetMap[xlOffset],\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\nCol.displayName = 'Col';\n","import { useEffect, useId, useRef, useState } from 'react';\nimport clx from 'classnames';\n\nexport interface QuantityInputProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n label?: string;\n error?: string;\n hint?: string;\n id?: string;\n className?: string;\n}\n\nexport const QuantityInput = ({\n value,\n onChange,\n min = 1,\n max = 999,\n step = 1,\n disabled = false,\n label,\n error,\n hint,\n id,\n className,\n}: QuantityInputProps) => {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Lokální string stav — umožňuje volné psaní, clamping proběhne při blur\n const [inputValue, setInputValue] = useState(String(value));\n\n // Synchronizace při změně value zvenčí (controlled)\n useEffect(() => {\n if (document.activeElement !== inputRef.current) {\n setInputValue(String(value));\n }\n }, [value]);\n\n const clamp = (n: number) => Math.min(max, Math.max(min, n));\n\n const commitValue = (raw: string) => {\n const parsed = parseInt(raw, 10);\n const next = isNaN(parsed) ? value : clamp(parsed);\n setInputValue(String(next));\n if (next !== value) onChange(next);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/[^0-9]/g, '');\n setInputValue(raw);\n // Průběžně volej onChange jen pokud je platné číslo\n const parsed = parseInt(raw, 10);\n if (!isNaN(parsed)) onChange(clamp(parsed));\n };\n\n const handleBlur = () => commitValue(inputValue);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n commitValue(inputValue);\n inputRef.current?.blur();\n return;\n }\n // Blokuj vše kromě číslic a ovládacích kláves\n const allowed = [\n 'Backspace', 'Delete', 'Tab', 'Escape',\n 'ArrowLeft', 'ArrowRight', 'Home', 'End',\n ];\n if (!allowed.includes(e.key) && !/^[0-9]$/.test(e.key) && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n }\n };\n\n const decrement = () => onChange(clamp(value - step));\n const increment = () => onChange(clamp(value + step));\n\n const canDecrement = value - step >= min;\n const canIncrement = value + step <= max;\n\n return (\n <div className={clx('quantity-input-wrapper', className)}>\n {label && (\n <label htmlFor={inputId} className=\"input-label\">\n {label}\n </label>\n )}\n\n <div className={clx('quantity-input', error && 'has-error', disabled && 'is-disabled')}>\n <button\n type=\"button\"\n className=\"quantity-btn\"\n onClick={decrement}\n disabled={disabled || !canDecrement}\n aria-label=\"Snížit množství\"\n tabIndex={-1}\n >\n <MinusIcon />\n </button>\n\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n inputMode=\"numeric\"\n className=\"quantity-field\"\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-label={label ?? 'Množství'}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n />\n\n <button\n type=\"button\"\n className=\"quantity-btn\"\n onClick={increment}\n disabled={disabled || !canIncrement}\n aria-label=\"Zvýšit množství\"\n tabIndex={-1}\n >\n <PlusIcon />\n </button>\n </div>\n\n {(error || hint) && (\n <p className={clx('helper-text', error && 'has-error')}>{error ?? hint}</p>\n )}\n </div>\n );\n};\n\nQuantityInput.displayName = 'QuantityInput';\n\nconst MinusIcon = () => (\n <svg width=\"12\" height=\"2\" viewBox=\"0 0 12 2\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1 1H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M6 1V11M1 6H11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n","import type { ButtonHTMLAttributes } from 'react';\nimport clx from 'classnames';\n\nexport interface PaginationProps {\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingsCount?: number;\n}\n\nconst range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\nconst buildPages = (\n page: number,\n totalPages: number,\n siblings: number,\n): (number | '…')[] => {\n const totalNumbers = siblings * 2 + 5; // siblings + first + last + current + 2 dots\n\n if (totalPages <= totalNumbers) return range(1, totalPages);\n\n const leftSibling = Math.max(page - siblings, 1);\n const rightSibling = Math.min(page + siblings, totalPages);\n const showLeftDots = leftSibling > 2;\n const showRightDots = rightSibling < totalPages - 1;\n\n if (!showLeftDots && showRightDots) {\n const leftRange = range(1, 3 + siblings * 2);\n return [...leftRange, '…', totalPages];\n }\n\n if (showLeftDots && !showRightDots) {\n const rightRange = range(totalPages - (2 + siblings * 2), totalPages);\n return [1, '…', ...rightRange];\n }\n\n return [1, '…', ...range(leftSibling, rightSibling), '…', totalPages];\n};\n\nconst PageButton = ({\n active,\n disabled,\n children,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { active?: boolean }) => {\n return (\n <button\n disabled={disabled}\n className={clx(\n 'pagination-button',\n `pagination-button-${active ? 'active' : 'inactive'}`,\n )}\n {...props}\n >\n {children}\n </button>\n );\n};\n\nexport const Pagination = ({\n page,\n totalPages,\n onPageChange,\n siblingsCount = 1,\n}: PaginationProps) => {\n const pages = buildPages(page, totalPages, siblingsCount);\n\n return (\n <nav aria-label=\"Pagination\" className=\"pagination\">\n {/* Prev */}\n <PageButton\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n aria-label=\"Previous page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 19.5L8.25 12l7.5-7.5\"\n />\n </svg>\n </PageButton>\n\n {pages.map((p, i) =>\n p === '…' ? (\n <span key={`dots-${i}`} className=\"pagination-dots\">\n …\n </span>\n ) : (\n <PageButton\n key={p}\n active={p === page}\n onClick={() => onPageChange(p)}\n aria-label={`Page ${p}`}\n aria-current={p === page ? 'page' : undefined}\n >\n {p}\n </PageButton>\n ),\n )}\n\n {/* Next */}\n <PageButton\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n aria-label=\"Next page\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M8.25 4.5l7.5 7.5-7.5 7.5\"\n />\n </svg>\n </PageButton>\n </nav>\n );\n};\n","import { useRef, useState } from 'react';\nimport type { ReactNode, KeyboardEvent } from 'react';\nimport { Input } from '../common/Input/Input';\n\nexport interface CurrencyOption {\n code: string;\n symbol: string;\n label: string;\n}\n\nexport interface LocaleOption {\n code: string;\n label: string;\n flag?: string;\n}\n\nexport interface HeaderProps {\n /** Logo — ReactNode (image, SVG, text) */\n logo?: ReactNode;\n /** Search placeholder */\n searchPlaceholder?: string;\n onSearch?: (query: string) => void;\n /** Cart */\n cartItemCount?: number;\n onCartClick?: () => void;\n /** Customer */\n isLoggedIn?: boolean;\n customerName?: string;\n onCustomerClick?: () => void;\n /** Currency */\n currencies?: CurrencyOption[];\n selectedCurrency?: string;\n onCurrencyChange?: (code: string) => void;\n /** Locale / eshop */\n locales?: LocaleOption[];\n selectedLocale?: string;\n onLocaleChange?: (code: string) => void;\n /** Extra right slot */\n rightSlot?: ReactNode;\n}\n\n// ─── Small internal dropdown ────────────────────────────────────────────────\n\ninterface DropdownProps<T extends { label: string }> {\n trigger: ReactNode;\n items: T[];\n onSelect: (item: T) => void;\n getKey: (item: T) => string;\n renderItem?: (item: T) => ReactNode;\n}\n\nfunction Dropdown<T extends { label: string }>({\n trigger,\n items,\n onSelect,\n getKey,\n renderItem,\n}: DropdownProps<T>) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = () => setOpen(false);\n\n // Close on outside click\n const handleBlur = (e: React.FocusEvent) => {\n if (!ref.current?.contains(e.relatedTarget as Node)) close();\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n return (\n <div ref={ref} className=\"relative\" onBlur={handleBlur} onKeyDown={onKey}>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setOpen((v) => !v)}\n onKeyDown={(e) => e.key === 'Enter' && setOpen((v) => !v)}\n className=\"cursor-pointer\"\n >\n {trigger}\n </div>\n {open && (\n <ul\n role=\"menu\"\n className=\"absolute right-0 top-full mt-1 z-50 min-w-28 bg-white rounded-lg shadow-lg border border-gray-100 py-1 text-sm\"\n >\n {items.map((item) => (\n <li key={getKey(item)} role=\"none\">\n <button\n role=\"menuitem\"\n className=\"w-full px-3 py-1.5 text-left hover:bg-gray-50 text-gray-700 whitespace-nowrap\"\n onClick={() => {\n onSelect(item);\n close();\n }}\n >\n {renderItem ? renderItem(item) : item.label}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\n// ─── Search icon ─────────────────────────────────────────────────────────────\n\nfunction SearchIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 15.803a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n );\n}\n\n// ─── Header ──────────────────────────────────────────────────────────────────\n\nexport function Header({\n logo,\n searchPlaceholder = 'Hledat produkty…',\n onSearch,\n cartItemCount = 0,\n onCartClick,\n isLoggedIn = false,\n customerName,\n onCustomerClick,\n currencies = [],\n selectedCurrency,\n onCurrencyChange,\n locales = [],\n selectedLocale,\n onLocaleChange,\n rightSlot,\n}: HeaderProps) {\n const [searchQuery, setSearchQuery] = useState('');\n\n const activeCurrency = currencies.find((c) => c.code === selectedCurrency);\n const activeLocale = locales.find((l) => l.code === selectedLocale);\n\n const handleSearchKey = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') onSearch?.(searchQuery);\n };\n\n return (\n <header className=\"bg-white border-b border-gray-200 sticky top-0 z-40\">\n <div className=\"max-w-7xl mx-auto px-4 h-16 flex items-center gap-4\">\n {/* Logo */}\n <div className=\"shrink-0\">\n {logo ?? (\n <span className=\"text-xl font-bold text-primary-600 tracking-tight\">\n shopito\n </span>\n )}\n </div>\n\n {/* Search */}\n <div className=\"flex-1 max-w-xl\">\n <Input\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleSearchKey}\n leftIcon={<SearchIcon />}\n rightIcon={\n searchQuery ? (\n <button\n onClick={() => {\n setSearchQuery('');\n onSearch?.('');\n }}\n className=\"hover:text-gray-600 transition-colors\"\n aria-label=\"Clear search\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-3.5 h-3.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n ) : undefined\n }\n />\n </div>\n\n {/* Right controls */}\n <div className=\"flex items-center gap-1 shrink-0 ml-auto\">\n {/* Currency switcher */}\n {currencies.length > 0 && (\n <Dropdown\n trigger={\n <button className=\"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors font-medium\">\n <span>{activeCurrency?.symbol ?? selectedCurrency}</span>\n <span className=\"text-xs text-gray-400\">\n {activeCurrency?.code ?? selectedCurrency}\n </span>\n <ChevronDown className=\"w-3 h-3 text-gray-400\" />\n </button>\n }\n items={currencies}\n getKey={(c) => c.code}\n onSelect={(c) => onCurrencyChange?.(c.code)}\n renderItem={(c) => (\n <span className=\"flex items-center gap-2\">\n <span className=\"w-6 text-center font-medium text-gray-500\">\n {c.symbol}\n </span>\n <span>{c.label}</span>\n </span>\n )}\n />\n )}\n\n {/* Locale switcher */}\n {locales.length > 0 && (\n <Dropdown\n trigger={\n <button className=\"flex items-center gap-1 px-2 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\">\n {activeLocale?.flag && (\n <span className=\"text-base leading-none\">\n {activeLocale.flag}\n </span>\n )}\n <span className=\"font-medium uppercase\">\n {activeLocale?.code ?? selectedLocale}\n </span>\n <ChevronDown className=\"w-3 h-3 text-gray-400\" />\n </button>\n }\n items={locales}\n getKey={(l) => l.code}\n onSelect={(l) => onLocaleChange?.(l.code)}\n renderItem={(l) => (\n <span className=\"flex items-center gap-2\">\n {l.flag && <span className=\"text-base\">{l.flag}</span>}\n <span>{l.label}</span>\n </span>\n )}\n />\n )}\n\n {/* Divider */}\n {(currencies.length > 0 || locales.length > 0) && (\n <div className=\"w-px h-5 bg-gray-200 mx-1\" />\n )}\n\n {/* Customer button */}\n <button\n onClick={onCustomerClick}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\"\n aria-label={isLoggedIn ? 'My account' : 'Sign in'}\n >\n {isLoggedIn ? (\n <>\n <div className=\"w-6 h-6 rounded-full bg-primary-600 text-white flex items-center justify-center text-xs font-bold\">\n {(customerName ?? 'U')[0].toUpperCase()}\n </div>\n {customerName && (\n <span className=\"hidden sm:block font-medium max-w-32 truncate\">\n {customerName}\n </span>\n )}\n </>\n ) : (\n <>\n <UserIcon className=\"w-5 h-5\" />\n <span className=\"hidden sm:block font-medium\">\n Přihlásit se\n </span>\n </>\n )}\n </button>\n\n {/* Cart */}\n <button\n onClick={onCartClick}\n className=\"relative flex items-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-50 transition-colors\"\n aria-label={`Cart, ${cartItemCount} items`}\n >\n <CartIcon className=\"w-5 h-5\" />\n <span className=\"hidden sm:block font-medium\">Košík</span>\n {cartItemCount > 0 && (\n <span className=\"absolute -top-0.5 -right-0.5 min-w-4.5 h-4.5 flex items-center justify-center rounded-full bg-primary-600 text-white text-[10px] font-bold leading-none px-1\">\n {cartItemCount > 99 ? '99+' : cartItemCount}\n </span>\n )}\n </button>\n\n {rightSlot}\n </div>\n </div>\n </header>\n );\n}\n\n// ─── Icon helpers ─────────────────────────────────────────────────────────────\n\nfunction ChevronDown({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n );\n}\n\nfunction UserIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n );\n}\n\nfunction CartIcon({ className }: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={className}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 00-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 00-16.536-1.84M7.5 14.25L5.106 5.272M6 20.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm12.75 0a.75.75 0 11-1.5 0 .75.75 0 011.5 0z\"\n />\n </svg>\n );\n}\n","import { useState } from 'react'\n\nexport interface Category {\n id: string\n label: string\n icon?: string\n count?: number\n children?: Category[]\n}\n\nexport interface CategoryTreeProps {\n categories: Category[]\n activeId?: string\n onSelect?: (category: Category) => void\n /** Show product counts */\n showCounts?: boolean\n /** All nodes expanded by default */\n defaultExpandAll?: boolean\n className?: string\n}\n\ninterface TreeNodeProps {\n node: Category\n activeId: string | undefined\n onSelect: (category: Category) => void\n showCounts: boolean\n depth: number\n defaultExpandAll: boolean\n}\n\nfunction TreeNode({\n node,\n activeId,\n onSelect,\n showCounts,\n depth,\n defaultExpandAll,\n}: TreeNodeProps) {\n const hasChildren = node.children && node.children.length > 0\n const [expanded, setExpanded] = useState(defaultExpandAll || isAncestorOf(node, activeId))\n const isActive = node.id === activeId\n\n return (\n <li>\n <div\n className={[\n 'group flex items-center gap-1.5 rounded-lg px-2 py-1.5 cursor-pointer select-none',\n 'transition-colors text-sm',\n isActive\n ? 'bg-primary-50 text-primary-700 font-medium'\n : 'text-gray-700 hover:bg-gray-50 hover:text-gray-900',\n depth > 0 ? `ml-${Math.min(depth * 4, 8)}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={depth > 0 ? { marginLeft: depth * 16 } : undefined}\n onClick={() => {\n onSelect(node)\n if (hasChildren) setExpanded((v) => !v)\n }}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect(node)\n if (hasChildren) setExpanded((v) => !v)\n }\n }}\n aria-expanded={hasChildren ? expanded : undefined}\n >\n {/* Expand toggle */}\n {hasChildren ? (\n <span\n className={`shrink-0 text-gray-400 transition-transform duration-150 ${expanded ? 'rotate-90' : ''}`}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-3.5 h-3.5\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </span>\n ) : (\n <span className=\"w-3.5 shrink-0\" />\n )}\n\n {/* Icon */}\n {node.icon && <span className=\"text-base leading-none\">{node.icon}</span>}\n\n {/* Label */}\n <span className=\"flex-1 truncate\">{node.label}</span>\n\n {/* Count */}\n {showCounts && node.count !== undefined && (\n <span\n className={`text-xs rounded-full px-1.5 py-0.5 font-medium ${\n isActive ? 'bg-primary-100 text-primary-600' : 'bg-gray-100 text-gray-500'\n }`}\n >\n {node.count}\n </span>\n )}\n </div>\n\n {/* Children */}\n {hasChildren && expanded && (\n <ul role=\"group\">\n {node.children!.map((child) => (\n <TreeNode\n key={child.id}\n node={child}\n activeId={activeId}\n onSelect={onSelect}\n showCounts={showCounts}\n depth={depth + 1}\n defaultExpandAll={defaultExpandAll}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nfunction isAncestorOf(node: Category, activeId: string | undefined): boolean {\n if (!activeId) return false\n if (!node.children) return false\n return node.children.some(\n (c) => c.id === activeId || isAncestorOf(c, activeId),\n )\n}\n\nexport function CategoryTree({\n categories,\n activeId,\n onSelect,\n showCounts = true,\n defaultExpandAll = false,\n className = '',\n ...props\n}: CategoryTreeProps) {\n const handleSelect = (cat: Category) => onSelect?.(cat)\n\n return (\n <nav\n aria-label=\"Category navigation\"\n className={['w-full', className].filter(Boolean).join(' ')}\n {...props}\n >\n <ul role=\"tree\" className=\"space-y-0.5\">\n {categories.map((cat) => (\n <TreeNode\n key={cat.id}\n node={cat}\n activeId={activeId}\n onSelect={handleSelect}\n showCounts={showCounts}\n depth={0}\n defaultExpandAll={defaultExpandAll}\n />\n ))}\n </ul>\n </nav>\n )\n}\n","import { useState, useRef } from 'react'\n\nexport interface MegaMenuSubItem {\n id: string\n label: string\n href?: string\n badge?: string\n}\n\nexport interface MegaMenuColumn {\n heading?: string\n items: MegaMenuSubItem[]\n}\n\nexport interface MegaMenuFeatured {\n image?: string\n eyebrow?: string\n title: string\n description?: string\n cta?: string\n href?: string\n}\n\nexport interface MegaMenuItem {\n id: string\n label: string\n icon?: string\n href?: string\n /** If columns are present, hovering opens the mega panel */\n columns?: MegaMenuColumn[]\n featured?: MegaMenuFeatured\n}\n\nexport interface MegaMenuProps {\n items: MegaMenuItem[]\n activeId?: string\n onNavigate?: (item: MegaMenuSubItem | MegaMenuItem) => void\n}\n\n// ─── Mega panel ──────────────────────────────────────────────────────────────\n\ninterface MegaPanelProps {\n item: MegaMenuItem\n onNavigate: (subItem: MegaMenuSubItem | MegaMenuItem) => void\n onClose: () => void\n}\n\nfunction MegaPanel({ item, onNavigate, onClose }: MegaPanelProps) {\n if (!item.columns?.length) return null\n\n return (\n <div className=\"absolute left-0 right-0 top-full z-50 bg-white border-b border-gray-200 shadow-lg\">\n <div className=\"max-w-7xl mx-auto px-4 py-6 flex gap-8\">\n {/* Columns */}\n <div className=\"flex-1 grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6\">\n {item.columns.map((col, ci) => (\n <div key={ci}>\n {col.heading && (\n <p className=\"text-xs font-semibold uppercase tracking-wider text-gray-400 mb-2\">\n {col.heading}\n </p>\n )}\n <ul className=\"space-y-1\">\n {col.items.map((sub) => (\n <li key={sub.id}>\n <button\n className=\"flex items-center gap-1.5 text-sm text-gray-700 hover:text-primary-600 transition-colors py-0.5\"\n onClick={() => {\n onNavigate(sub)\n onClose()\n }}\n >\n {sub.label}\n {sub.badge && (\n <span className=\"text-[10px] font-semibold px-1.5 py-0.5 rounded-full bg-danger-50 text-danger-600 leading-none\">\n {sub.badge}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n {/* Featured card */}\n {item.featured && (\n <div className=\"w-52 shrink-0\">\n <button\n className=\"group block w-full rounded-xl overflow-hidden border border-gray-100 text-left hover:shadow-md transition-shadow\"\n onClick={() => {\n onNavigate(item)\n onClose()\n }}\n >\n {item.featured.image ? (\n <img\n src={item.featured.image}\n alt={item.featured.title}\n className=\"w-full h-28 object-cover\"\n />\n ) : (\n <div className=\"w-full h-28 bg-linear-to-br from-primary-100 to-primary-200 flex items-center justify-center text-4xl\">\n {item.icon ?? '🛍️'}\n </div>\n )}\n <div className=\"p-3\">\n {item.featured.eyebrow && (\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-primary-500 mb-0.5\">\n {item.featured.eyebrow}\n </p>\n )}\n <p className=\"text-sm font-semibold text-gray-900 group-hover:text-primary-600 transition-colors\">\n {item.featured.title}\n </p>\n {item.featured.description && (\n <p className=\"text-xs text-gray-500 mt-0.5 line-clamp-2\">\n {item.featured.description}\n </p>\n )}\n {item.featured.cta && (\n <span className=\"inline-block mt-2 text-xs font-medium text-primary-600\">\n {item.featured.cta} →\n </span>\n )}\n </div>\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ─── MegaMenu ────────────────────────────────────────────────────────────────\n\nexport function MegaMenu({\n items,\n activeId,\n onNavigate,\n}: MegaMenuProps) {\n const [openId, setOpenId] = useState<string | null>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const open = (id: string) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setOpenId(id)\n }\n\n const scheduleClose = () => {\n timeoutRef.current = setTimeout(() => setOpenId(null), 120)\n }\n\n const cancelClose = () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n\n const activeItem = items.find((i) => i.id === openId)\n\n return (\n <nav\n aria-label=\"Main navigation\"\n className=\"relative bg-white border-b border-gray-100\"\n onMouseLeave={scheduleClose}\n >\n <div className=\"max-w-7xl mx-auto px-4\">\n <ul className=\"flex items-center gap-0\" role=\"menubar\">\n {items.map((item) => {\n const hasMega = !!item.columns?.length\n const isOpen = openId === item.id\n const isActive = activeId === item.id\n\n return (\n <li key={item.id} role=\"none\">\n <button\n role=\"menuitem\"\n aria-haspopup={hasMega ? 'true' : undefined}\n aria-expanded={hasMega ? isOpen : undefined}\n className={[\n 'flex items-center gap-1.5 px-4 py-3.5 text-sm font-medium transition-colors relative',\n 'outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary-500',\n isActive || isOpen\n ? 'text-primary-600'\n : 'text-gray-700 hover:text-gray-900',\n isOpen\n ? 'after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary-600'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseEnter={() => hasMega ? open(item.id) : setOpenId(null)}\n onFocus={() => hasMega && open(item.id)}\n onClick={() => {\n if (!hasMega) {\n onNavigate?.(item)\n setOpenId(null)\n }\n }}\n >\n {item.icon && <span className=\"text-base leading-none\">{item.icon}</span>}\n {item.label}\n {hasMega && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className={`w-3.5 h-3.5 transition-transform duration-150 ${isOpen ? 'rotate-180' : ''}`}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n )}\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n\n {/* Mega panel */}\n {activeItem?.columns?.length && (\n <div\n onMouseEnter={cancelClose}\n onMouseLeave={scheduleClose}\n >\n <MegaPanel\n item={activeItem}\n onNavigate={(sub) => onNavigate?.(sub)}\n onClose={() => setOpenId(null)}\n />\n </div>\n )}\n </nav>\n )\n}\n","import { useState, useEffect, useCallback, useRef } from 'react'\n\nexport interface Banner {\n id: string\n /** Background image URL or gradient CSS value */\n backgroundImage?: string\n backgroundColor?: string\n /** Overlaid text content */\n eyebrow?: string\n title: string\n subtitle?: string\n ctaLabel?: string\n ctaHref?: string\n onCtaClick?: () => void\n /** Image on the right side of the banner */\n sideImage?: string\n /** Text colors — default to white for dark backgrounds */\n textColor?: 'light' | 'dark'\n}\n\nexport interface BannerCarouselProps {\n banners: Banner[]\n autoPlay?: boolean\n autoPlayInterval?: number\n /** Show arrow navigation */\n arrows?: boolean\n /** Show dot indicators */\n dots?: boolean\n className?: string\n /** Aspect ratio of the banner — default 3/1 */\n aspectRatio?: string\n}\n\nexport function BannerCarousel({\n banners,\n autoPlay = true,\n autoPlayInterval = 5000,\n arrows = true,\n dots = true,\n className = '',\n aspectRatio = '3 / 1',\n}: BannerCarouselProps) {\n const [current, setCurrent] = useState(0)\n const [paused, setPaused] = useState(false)\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const count = banners.length\n\n const goTo = useCallback(\n (index: number) => {\n setCurrent(((index % count) + count) % count)\n },\n [count],\n )\n\n const prev = () => goTo(current - 1)\n const next = useCallback(() => goTo(current + 1), [current, goTo])\n\n // Auto-play\n useEffect(() => {\n if (!autoPlay || paused || count <= 1) return\n timerRef.current = setInterval(next, autoPlayInterval)\n return () => {\n if (timerRef.current) clearInterval(timerRef.current)\n }\n }, [autoPlay, paused, autoPlayInterval, next, count])\n\n // Swipe support\n const touchStartX = useRef<number | null>(null)\n const handleTouchStart = (e: React.TouchEvent) => {\n touchStartX.current = e.touches[0].clientX\n }\n const handleTouchEnd = (e: React.TouchEvent) => {\n if (touchStartX.current === null) return\n const delta = e.changedTouches[0].clientX - touchStartX.current\n if (Math.abs(delta) > 50) delta < 0 ? next() : prev()\n touchStartX.current = null\n }\n\n if (count === 0) return null\n\n const banner = banners[current]\n const isLight = banner.textColor === 'light' || !banner.textColor\n\n return (\n <div\n className={['relative overflow-hidden rounded-xl', className].filter(Boolean).join(' ')}\n style={{ aspectRatio }}\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n >\n {/* Slides */}\n <div ref={trackRef} className=\"relative w-full h-full\">\n {banners.map((b, i) => (\n <div\n key={b.id}\n aria-hidden={i !== current}\n className={[\n 'absolute inset-0 transition-opacity duration-700',\n i === current ? 'opacity-100 z-10' : 'opacity-0 z-0',\n ].join(' ')}\n style={{\n background: b.backgroundImage\n ? `url(${b.backgroundImage}) center/cover no-repeat`\n : b.backgroundColor ?? 'linear-gradient(135deg, #1d4ed8 0%, #7c3aed 100%)',\n }}\n >\n {/* Overlay for readability */}\n {b.backgroundImage && (\n <div className=\"absolute inset-0 bg-gradient-to-r from-black/50 via-black/20 to-transparent\" />\n )}\n\n {/* Content */}\n <div className=\"relative z-10 h-full flex items-center px-8 md:px-12 gap-8\">\n <div className=\"flex-1 max-w-lg\">\n {b.eyebrow && (\n <p\n className={`text-xs font-semibold uppercase tracking-widest mb-2 ${\n isLight ? 'text-white/70' : 'text-gray-500'\n }`}\n >\n {b.eyebrow}\n </p>\n )}\n <h2\n className={`text-2xl md:text-3xl lg:text-4xl font-bold leading-tight ${\n isLight ? 'text-white' : 'text-gray-900'\n }`}\n >\n {b.title}\n </h2>\n {b.subtitle && (\n <p\n className={`mt-2 text-sm md:text-base ${\n isLight ? 'text-white/80' : 'text-gray-600'\n }`}\n >\n {b.subtitle}\n </p>\n )}\n {b.ctaLabel && (\n <button\n onClick={b.onCtaClick}\n className={[\n 'mt-5 inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-semibold transition-all',\n isLight\n ? 'bg-white text-gray-900 hover:bg-gray-100'\n : 'bg-primary-600 text-white hover:bg-primary-700',\n ].join(' ')}\n >\n {b.ctaLabel}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={2}\n stroke=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Side image */}\n {b.sideImage && (\n <div className=\"hidden md:block flex-1 h-full flex items-end justify-end overflow-hidden\">\n <img\n src={b.sideImage}\n alt=\"\"\n className=\"h-full w-auto object-contain object-bottom drop-shadow-2xl\"\n />\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n\n {/* Arrow navigation */}\n {arrows && count > 1 && (\n <>\n <button\n onClick={prev}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 z-20 w-9 h-9 flex items-center justify-center rounded-full bg-black/30 text-white hover:bg-black/50 transition-colors backdrop-blur-sm\"\n aria-label=\"Previous banner\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-5 h-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\n </svg>\n </button>\n <button\n onClick={next}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 z-20 w-9 h-9 flex items-center justify-center rounded-full bg-black/30 text-white hover:bg-black/50 transition-colors backdrop-blur-sm\"\n aria-label=\"Next banner\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-5 h-5\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n </>\n )}\n\n {/* Dot indicators */}\n {dots && count > 1 && (\n <div className=\"absolute bottom-3 left-1/2 -translate-x-1/2 z-20 flex gap-1.5\">\n {banners.map((_, i) => (\n <button\n key={i}\n onClick={() => goTo(i)}\n aria-label={`Go to slide ${i + 1}`}\n className={[\n 'rounded-full transition-all duration-300',\n i === current\n ? 'w-5 h-2 bg-white'\n : 'w-2 h-2 bg-white/50 hover:bg-white/80',\n ].join(' ')}\n />\n ))}\n </div>\n )}\n\n {/* Auto-play progress bar */}\n {autoPlay && count > 1 && (\n <div className=\"absolute bottom-0 left-0 right-0 h-0.5 bg-white/20 z-20\">\n <div\n key={`${current}-${paused}`}\n className={`h-full bg-white/60 ${paused ? '' : 'animate-progress'}`}\n style={{\n animation: paused ? 'none' : `progress ${autoPlayInterval}ms linear`,\n }}\n />\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { Badge } from '../common/Badge/Badge'\nimport { Button } from '../common/Button/Button'\n\nexport interface ProductCardProduct {\n id: string\n name: string\n slug?: string\n /** Primary image URL */\n image?: string\n /** Secondary image on hover */\n imageHover?: string\n price: number\n originalPrice?: number\n currency?: string\n /** 'new' | 'sale' | 'hot' | custom string */\n badge?: string\n /** 0–5 */\n rating?: number\n reviewCount?: number\n inStock?: boolean\n /** Variants available (e.g. colors) */\n variants?: { id: string; color?: string; label: string }[]\n}\n\nexport interface ProductCardProps {\n product: ProductCardProduct\n onAddToCart?: (product: ProductCardProduct) => void\n onWishlistToggle?: (product: ProductCardProduct) => void\n isWishlisted?: boolean\n onProductClick?: (product: ProductCardProduct) => void\n /** compact — narrower, used in grids with 4+ columns */\n size?: 'default' | 'compact'\n className?: string\n}\n\nfunction StarIcon({ filled }: { filled: boolean }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n className={`w-3.5 h-3.5 ${filled ? 'fill-amber-400 stroke-amber-400' : 'fill-gray-200 stroke-gray-300'}`}\n strokeWidth={1}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\"\n />\n </svg>\n )\n}\n\nfunction StarRating({ value, count }: { value: number; count?: number }) {\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"flex gap-0.5\">\n {[1, 2, 3, 4, 5].map((s) => (\n <StarIcon key={s} filled={s <= Math.round(value)} />\n ))}\n </div>\n {count !== undefined && (\n <span className=\"text-xs text-gray-400\">({count})</span>\n )}\n </div>\n )\n}\n\nfunction badgeVariant(badge: string) {\n const b = badge.toLowerCase()\n if (b === 'sale' || b === 'akce') return 'danger' as const\n if (b === 'new' || b === 'nové') return 'primary' as const\n if (b === 'hot') return 'warning' as const\n return 'default' as const\n}\n\nfunction formatPrice(price: number, currency = 'Kč') {\n return `${price.toLocaleString('cs-CZ')} ${currency}`\n}\n\nfunction discountPercent(original: number, current: number) {\n return Math.round((1 - current / original) * 100)\n}\n\nexport function ProductCard({\n product,\n onAddToCart,\n onWishlistToggle,\n isWishlisted = false,\n onProductClick,\n size = 'default',\n className = '',\n}: ProductCardProps) {\n const [hovered, setHovered] = useState(false)\n const [addedToCart, setAddedToCart] = useState(false)\n\n const hasDiscount =\n product.originalPrice !== undefined && product.originalPrice > product.price\n\n const handleAddToCart = (e: React.MouseEvent) => {\n e.stopPropagation()\n onAddToCart?.(product)\n setAddedToCart(true)\n setTimeout(() => setAddedToCart(false), 1500)\n }\n\n const handleWishlist = (e: React.MouseEvent) => {\n e.stopPropagation()\n onWishlistToggle?.(product)\n }\n\n return (\n <article\n className={[\n 'group relative flex flex-col bg-white rounded-xl border border-gray-200',\n 'hover:shadow-md transition-shadow duration-200 overflow-hidden cursor-pointer',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onProductClick?.(product)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {/* Image */}\n <div className={`relative overflow-hidden bg-gray-50 ${size === 'compact' ? 'aspect-square' : 'aspect-4/3'}`}>\n {product.image ? (\n <img\n src={hovered && product.imageHover ? product.imageHover : product.image}\n alt={product.name}\n className=\"w-full h-full object-contain p-4 transition-transform duration-300 group-hover:scale-105\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-5xl bg-linear-to-br from-gray-100 to-gray-200\">\n 🛍️\n </div>\n )}\n\n {/* Badge */}\n {product.badge && (\n <div className=\"absolute top-2 left-2\">\n <Badge variant={badgeVariant(product.badge)} size=\"sm\">\n {product.badge === 'sale' && hasDiscount\n ? `-${discountPercent(product.originalPrice!, product.price)}%`\n : product.badge}\n </Badge>\n </div>\n )}\n\n {/* Out of stock overlay */}\n {product.inStock === false && (\n <div className=\"absolute inset-0 bg-white/70 flex items-center justify-center\">\n <span className=\"text-sm font-semibold text-gray-500 bg-white/90 px-3 py-1 rounded-full border border-gray-200\">\n Vyprodáno\n </span>\n </div>\n )}\n\n {/* Wishlist button */}\n <button\n onClick={handleWishlist}\n aria-label={isWishlisted ? 'Remove from wishlist' : 'Add to wishlist'}\n className={[\n 'absolute top-2 right-2 w-8 h-8 flex items-center justify-center rounded-full bg-white shadow-sm border border-gray-100',\n 'transition-all duration-200',\n 'opacity-0 group-hover:opacity-100 focus:opacity-100',\n isWishlisted ? 'text-danger-500' : 'text-gray-400 hover:text-danger-400',\n ].join(' ')}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={`w-4 h-4 ${isWishlisted ? 'fill-current' : 'fill-none'}`}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z\"\n />\n </svg>\n </button>\n\n {/* Quick add — slides up on hover */}\n <div\n className={[\n 'absolute bottom-0 left-0 right-0 p-2 transition-transform duration-200',\n hovered ? 'translate-y-0' : 'translate-y-full',\n ].join(' ')}\n >\n <Button\n variant=\"primary\"\n size=\"sm\"\n fullWidth\n loading={false}\n disabled={product.inStock === false}\n onClick={handleAddToCart}\n className=\"shadow-lg\"\n >\n {addedToCart ? (\n <span className=\"flex items-center gap-1.5\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-4 h-4\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\n </svg>\n Přidáno\n </span>\n ) : (\n 'Přidat do košíku'\n )}\n </Button>\n </div>\n </div>\n\n {/* Info */}\n <div className={`flex flex-col gap-1.5 ${size === 'compact' ? 'p-3' : 'p-4'}`}>\n {/* Color variants */}\n {product.variants && product.variants.length > 0 && (\n <div className=\"flex gap-1\">\n {product.variants.slice(0, 5).map((v) => (\n <span\n key={v.id}\n title={v.label}\n className=\"w-4 h-4 rounded-full border border-gray-300 shrink-0\"\n style={{ backgroundColor: v.color ?? '#ccc' }}\n />\n ))}\n {product.variants.length > 5 && (\n <span className=\"text-xs text-gray-400\">+{product.variants.length - 5}</span>\n )}\n </div>\n )}\n\n {/* Name */}\n <h3\n className={`font-medium text-gray-900 leading-snug line-clamp-2 group-hover:text-primary-600 transition-colors ${\n size === 'compact' ? 'text-xs' : 'text-sm'\n }`}\n >\n {product.name}\n </h3>\n\n {/* Rating */}\n {product.rating !== undefined && (\n <StarRating value={product.rating} count={product.reviewCount} />\n )}\n\n {/* Price */}\n <div className=\"flex items-baseline gap-2 mt-auto pt-1\">\n <span\n className={`font-bold text-gray-900 ${size === 'compact' ? 'text-base' : 'text-lg'}`}\n >\n {formatPrice(product.price, product.currency)}\n </span>\n {hasDiscount && (\n <span className=\"text-sm text-gray-400 line-through\">\n {formatPrice(product.originalPrice!, product.currency)}\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ProductCard } from '../ProductCard/ProductCard'\nimport type { ProductCardProduct, ProductCardProps } from '../ProductCard/ProductCard'\nimport { Pagination } from '../common/Pagination/Pagination'\nimport { Select } from '../common/Select/Select'\n\nexport type GridColumns = 2 | 3 | 4 | 5\n\nexport interface SortOption {\n value: string\n label: string\n}\n\nexport interface ProductGridProps {\n products: ProductCardProduct[]\n /** Total products (for pagination) */\n totalCount?: number\n /** Current page */\n page?: number\n onPageChange?: (page: number) => void\n /** Products per page */\n perPage?: number\n /** Column count */\n columns?: GridColumns\n /** Sort options */\n sortOptions?: SortOption[]\n selectedSort?: string\n onSortChange?: (value: string) => void\n /** Active filters summary */\n activeFilters?: string[]\n onRemoveFilter?: (filter: string) => void\n onClearFilters?: () => void\n /** Loading skeleton */\n loading?: boolean\n /** Empty state slot */\n emptyState?: ReactNode\n /** ProductCard passthrough props */\n onAddToCart?: ProductCardProps['onAddToCart']\n onWishlistToggle?: ProductCardProps['onWishlistToggle']\n onProductClick?: ProductCardProps['onProductClick']\n wishlisted?: string[]\n className?: string\n}\n\nconst colClasses: Record<GridColumns, string> = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 md:grid-cols-3',\n 4: 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4',\n 5: 'grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5',\n}\n\nconst DEFAULT_SORT_OPTIONS: SortOption[] = [\n { value: 'newest', label: 'Nejnovější' },\n { value: 'price-asc', label: 'Cena: od nejnižší' },\n { value: 'price-desc', label: 'Cena: od nejvyšší' },\n { value: 'rating', label: 'Hodnocení' },\n { value: 'bestseller', label: 'Bestsellery' },\n]\n\nfunction SkeletonCard() {\n return (\n <div className=\"rounded-xl border border-gray-100 overflow-hidden animate-pulse\">\n <div className=\"aspect-4/3 bg-gray-200\" />\n <div className=\"p-4 space-y-2\">\n <div className=\"h-3 bg-gray-200 rounded w-3/4\" />\n <div className=\"h-3 bg-gray-200 rounded w-1/2\" />\n <div className=\"h-5 bg-gray-200 rounded w-1/3 mt-2\" />\n </div>\n </div>\n )\n}\n\nexport function ProductGrid({\n products,\n totalCount,\n page = 1,\n onPageChange,\n perPage = 20,\n columns = 4,\n sortOptions = DEFAULT_SORT_OPTIONS,\n selectedSort,\n onSortChange,\n activeFilters = [],\n onRemoveFilter,\n onClearFilters,\n loading = false,\n emptyState,\n onAddToCart,\n onWishlistToggle,\n onProductClick,\n wishlisted = [],\n className = '',\n}: ProductGridProps) {\n const totalPages = totalCount ? Math.ceil(totalCount / perPage) : undefined\n const cardSize = columns >= 5 ? 'compact' : 'default'\n\n return (\n <div className={['w-full', className].filter(Boolean).join(' ')}>\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center justify-between gap-3 mb-4\">\n {/* Left: count + active filters */}\n <div className=\"flex flex-wrap items-center gap-2\">\n {totalCount !== undefined && (\n <span className=\"text-sm text-gray-500\">\n <span className=\"font-semibold text-gray-900\">{totalCount}</span> produktů\n </span>\n )}\n {activeFilters.map((f) => (\n <span\n key={f}\n className=\"inline-flex items-center gap-1 text-xs bg-primary-50 text-primary-700 border border-primary-200 rounded-full px-2.5 py-1\"\n >\n {f}\n <button\n onClick={() => onRemoveFilter?.(f)}\n aria-label={`Remove filter ${f}`}\n className=\"hover:text-primary-900 transition-colors\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={2} stroke=\"currentColor\" className=\"w-3 h-3\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n ))}\n {activeFilters.length > 1 && (\n <button\n onClick={onClearFilters}\n className=\"text-xs text-gray-400 hover:text-gray-600 underline underline-offset-2 transition-colors\"\n >\n Zrušit vše\n </button>\n )}\n </div>\n\n {/* Right: sort */}\n <Select\n options={sortOptions}\n value={selectedSort ?? ''}\n onChange={(e) => onSortChange?.(e.target.value)}\n aria-label=\"Sort products\"\n className=\"text-sm\"\n />\n </div>\n\n {/* Grid */}\n {loading ? (\n <div className={`grid gap-4 ${colClasses[columns]}`}>\n {Array.from({ length: perPage > 12 ? 12 : perPage }).map((_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n ) : products.length === 0 ? (\n <div className=\"py-16 text-center\">\n {emptyState ?? (\n <div className=\"space-y-2\">\n <p className=\"text-4xl\">🔍</p>\n <p className=\"font-semibold text-gray-900\">Žádné produkty nenalezeny</p>\n <p className=\"text-sm text-gray-500\">Zkuste upravit filtry nebo hledat jinak.</p>\n {activeFilters.length > 0 && (\n <button\n onClick={onClearFilters}\n className=\"mt-3 text-sm text-primary-600 hover:underline\"\n >\n Zrušit všechny filtry\n </button>\n )}\n </div>\n )}\n </div>\n ) : (\n <div className={`grid gap-4 ${colClasses[columns]}`}>\n {products.map((product) => (\n <ProductCard\n key={product.id}\n product={product}\n size={cardSize}\n onAddToCart={onAddToCart}\n onWishlistToggle={onWishlistToggle}\n onProductClick={onProductClick}\n isWishlisted={wishlisted.includes(product.id)}\n />\n ))}\n </div>\n )}\n\n {/* Pagination */}\n {totalPages && totalPages > 1 && onPageChange && (\n <div className=\"flex justify-center mt-8\">\n <Pagination\n page={page}\n totalPages={totalPages}\n onPageChange={onPageChange}\n />\n </div>\n )}\n </div>\n )\n}\n","import type { ReactNode, CSSProperties } from 'react'\nimport { Button } from '../common/Button/Button'\nimport type { ButtonProps } from '../common/Button/Button'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype CtaAlign = 'left' | 'center' | 'right'\ntype CtaSize = 'sm' | 'md' | 'lg' | 'xl'\ntype CtaVariant = 'default' | 'primary' | 'dark' | 'gradient' | 'outline' | 'image'\ntype CtaLayout = 'stacked' | 'inline'\n\nexport interface CtaAction {\n label: string\n onClick?: () => void\n href?: string\n variant?: ButtonProps['variant']\n size?: ButtonProps['size']\n}\n\nexport interface CallToActionProps {\n // Content\n eyebrow?: string\n title: string\n description?: string\n actions?: CtaAction[]\n\n // Layout\n align?: CtaAlign\n layout?: CtaLayout\n size?: CtaSize\n\n // Visual\n variant?: CtaVariant\n /** Custom background colour or gradient CSS value (overrides variant background) */\n background?: string\n /** For variant=\"image\": URL of background image */\n backgroundImage?: string\n /** Extra decorative slot — e.g. an illustration, icon or badge */\n media?: ReactNode\n\n // Misc\n className?: string\n style?: CSSProperties\n}\n\n// ─── Config maps ─────────────────────────────────────────────────────────────\n\nconst variantClasses: Record<CtaVariant, string> = {\n default: 'bg-gray-50 border border-gray-200',\n primary: 'bg-primary-600',\n dark: 'bg-gray-900',\n gradient: 'bg-linear-to-br from-primary-600 via-primary-700 to-violet-700',\n outline: 'bg-white border-2 border-primary-600',\n image: 'relative overflow-hidden', // bg applied inline via style\n}\n\nconst variantTextClasses: Record<CtaVariant, { eyebrow: string; title: string; description: string }> = {\n default: { eyebrow: 'text-primary-600', title: 'text-gray-900', description: 'text-gray-600' },\n primary: { eyebrow: 'text-primary-100', title: 'text-white', description: 'text-primary-100' },\n dark: { eyebrow: 'text-primary-400', title: 'text-white', description: 'text-gray-400' },\n gradient: { eyebrow: 'text-primary-200', title: 'text-white', description: 'text-primary-100' },\n outline: { eyebrow: 'text-primary-600', title: 'text-gray-900', description: 'text-gray-600' },\n image: { eyebrow: 'text-white/70', title: 'text-white', description: 'text-white/80' },\n}\n\nconst sizeClasses: Record<CtaSize, { wrapper: string; title: string; description: string; eyebrow: string }> = {\n sm: { wrapper: 'px-6 py-6 rounded-xl', title: 'text-xl font-bold', description: 'text-sm', eyebrow: 'text-xs' },\n md: { wrapper: 'px-8 py-10 rounded-2xl', title: 'text-2xl font-bold', description: 'text-base', eyebrow: 'text-xs' },\n lg: { wrapper: 'px-10 py-14 rounded-2xl', title: 'text-3xl font-bold', description: 'text-lg', eyebrow: 'text-sm' },\n xl: { wrapper: 'px-12 py-20 rounded-3xl', title: 'text-4xl font-extrabold leading-tight', description: 'text-xl', eyebrow: 'text-sm' },\n}\n\nconst alignClasses: Record<CtaAlign, { wrapper: string; actions: string }> = {\n left: { wrapper: 'items-start text-left', actions: 'justify-start' },\n center: { wrapper: 'items-center text-center', actions: 'justify-center' },\n right: { wrapper: 'items-end text-right', actions: 'justify-end' },\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function CallToAction({\n eyebrow,\n title,\n description,\n actions = [],\n align = 'center',\n layout = 'stacked',\n size = 'md',\n variant = 'default',\n background,\n backgroundImage,\n media,\n className = '',\n style,\n}: CallToActionProps) {\n const textColors = variantTextClasses[variant]\n const sizes = sizeClasses[size]\n const alignment = alignClasses[align]\n const isInline = layout === 'inline'\n\n const inlineStyle: CSSProperties = {\n ...(background ? { background } : {}),\n ...(backgroundImage ? { backgroundImage: `url(${backgroundImage})`, backgroundSize: 'cover', backgroundPosition: 'center' } : {}),\n ...style,\n }\n\n return (\n <div\n className={[\n 'w-full',\n variantClasses[variant],\n sizes.wrapper,\n className,\n ].filter(Boolean).join(' ')}\n style={Object.keys(inlineStyle).length ? inlineStyle : undefined}\n >\n {/* Image overlay */}\n {(variant === 'image' || backgroundImage) && (\n <div className=\"absolute inset-0 bg-black/50\" />\n )}\n\n <div className={`relative ${isInline ? 'flex flex-wrap items-center justify-between gap-6' : `flex flex-col gap-4 ${alignment.wrapper}`}`}>\n\n {/* Text block */}\n <div className={`flex flex-col gap-2 ${isInline ? 'flex-1 min-w-0' : alignment.wrapper}`}>\n {eyebrow && (\n <p className={`font-semibold uppercase tracking-widest ${sizes.eyebrow} ${textColors.eyebrow}`}>\n {eyebrow}\n </p>\n )}\n <h2 className={`${sizes.title} ${textColors.title}`}>\n {title}\n </h2>\n {description && (\n <p className={`max-w-2xl ${sizes.description} ${textColors.description}`}>\n {description}\n </p>\n )}\n </div>\n\n {/* Media slot */}\n {media && !isInline && (\n <div className=\"mt-2\">{media}</div>\n )}\n\n {/* Actions */}\n {actions.length > 0 && (\n <div className={`flex flex-wrap gap-3 ${isInline ? 'shrink-0' : alignment.actions}`}>\n {actions.map((action, i) => {\n const btn = (\n <Button\n key={i}\n variant={action.variant ?? (i === 0 ? resolveDefaultPrimaryVariant(variant) : 'outline')}\n size={action.size ?? (size === 'sm' ? 'sm' : size === 'xl' ? 'lg' : 'md')}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n )\n return action.href ? (\n <a key={i} href={action.href} className=\"contents\">{btn}</a>\n ) : btn\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/** Pick a sensible default button variant that contrasts with the CTA background */\nfunction resolveDefaultPrimaryVariant(ctaVariant: CtaVariant): ButtonProps['variant'] {\n if (ctaVariant === 'default' || ctaVariant === 'outline') return 'primary'\n return 'secondary' // white-ish on dark/coloured backgrounds\n}\n","import type { ReactNode } from 'react'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface FooterContact {\n icon?: 'phone' | 'email' | 'address' | 'hours' | ReactNode\n label: string\n value: string\n href?: string\n}\n\nexport interface FooterLink {\n label: string\n href?: string\n onClick?: () => void\n}\n\nexport interface FooterLinkGroup {\n heading: string\n links: FooterLink[]\n}\n\nexport interface FooterSocialLink {\n label: string\n href?: string\n icon: 'facebook' | 'instagram' | 'twitter' | 'youtube' | 'tiktok' | ReactNode\n}\n\nexport interface FooterProps {\n // Branding\n logo?: ReactNode\n tagline?: string\n\n // Contact section\n contactHeading?: string\n contacts?: FooterContact[]\n\n // Links section\n linkGroups?: FooterLinkGroup[]\n\n // Social\n socialLinks?: FooterSocialLink[]\n\n // Bottom bar\n copyright?: string\n bottomLinks?: FooterLink[]\n\n className?: string\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction PhoneIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z\" />\n </svg>\n )\n}\n\nfunction EmailIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" />\n </svg>\n )\n}\n\nfunction AddressIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\" />\n </svg>\n )\n}\n\nfunction HoursIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" strokeWidth={1.5} stroke=\"currentColor\" className=\"w-4 h-4 shrink-0\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n )\n}\n\nfunction FacebookIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M24 12.073C24 5.405 18.627 0 12 0S0 5.405 0 12.073C0 18.1 4.388 23.094 10.125 24v-8.437H7.078v-3.49h3.047V9.41c0-3.025 1.792-4.697 4.533-4.697 1.312 0 2.686.236 2.686.236v2.97h-1.513c-1.491 0-1.956.93-1.956 1.886v2.267h3.328l-.532 3.49h-2.796V24C19.612 23.094 24 18.1 24 12.073z\" />\n </svg>\n )\n}\n\nfunction InstagramIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\" />\n </svg>\n )\n}\n\nfunction TwitterIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n )\n}\n\nfunction YoutubeIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\" />\n </svg>\n )\n}\n\nfunction TiktokIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className=\"w-4 h-4\">\n <path d=\"M19.59 6.69a4.83 4.83 0 01-3.77-4.25V2h-3.45v13.67a2.89 2.89 0 01-2.88 2.5 2.89 2.89 0 01-2.89-2.89 2.89 2.89 0 012.89-2.89c.28 0 .54.04.79.1V9.01a6.33 6.33 0 00-.79-.05 6.34 6.34 0 00-6.34 6.34 6.34 6.34 0 006.34 6.34 6.34 6.34 0 006.33-6.34V8.69a8.18 8.18 0 004.78 1.52V6.76a4.85 4.85 0 01-1.01-.07z\" />\n </svg>\n )\n}\n\nconst SOCIAL_ICONS = { facebook: FacebookIcon, instagram: InstagramIcon, twitter: TwitterIcon, youtube: YoutubeIcon, tiktok: TiktokIcon }\nconst CONTACT_ICONS = { phone: PhoneIcon, email: EmailIcon, address: AddressIcon, hours: HoursIcon }\n\nfunction resolveContactIcon(icon: FooterContact['icon']) {\n if (!icon) return null\n if (typeof icon === 'string') {\n const Icon = CONTACT_ICONS[icon as keyof typeof CONTACT_ICONS]\n return Icon ? <Icon /> : null\n }\n return icon\n}\n\nfunction resolveSocialIcon(icon: FooterSocialLink['icon']) {\n if (typeof icon === 'string') {\n const Icon = SOCIAL_ICONS[icon as keyof typeof SOCIAL_ICONS]\n return Icon ? <Icon /> : null\n }\n return icon\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function Footer({\n logo,\n tagline,\n contactHeading = 'Kontakty',\n contacts = [],\n linkGroups = [],\n socialLinks = [],\n copyright,\n bottomLinks = [],\n className = '',\n}: FooterProps) {\n const year = new Date().getFullYear()\n\n return (\n <footer className={['bg-gray-900 text-gray-300', className].filter(Boolean).join(' ')}>\n\n {/* ── Main section ───────────────────────────────────────────────────── */}\n <div className=\"max-w-7xl mx-auto px-4 py-12 grid grid-cols-1 md:grid-cols-2 gap-10 lg:gap-16\">\n\n {/* ── Left: Contact section ──────────────────────────────────────── */}\n <div className=\"flex flex-col gap-6\">\n {/* Logo + tagline */}\n <div>\n {logo ? (\n <div className=\"mb-3\">{logo}</div>\n ) : (\n <span className=\"text-xl font-bold text-white tracking-tight mb-3 block\">\n shopito\n </span>\n )}\n {tagline && (\n <p className=\"text-sm text-gray-400 max-w-xs\">{tagline}</p>\n )}\n </div>\n\n {/* Contacts */}\n {contacts.length > 0 && (\n <div>\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-gray-500 mb-3\">\n {contactHeading}\n </h3>\n <ul className=\"space-y-3\">\n {contacts.map((c, i) => {\n const icon = resolveContactIcon(c.icon)\n const inner = (\n <div className=\"flex items-start gap-2.5\">\n {icon && (\n <span className=\"mt-0.5 text-primary-400\">{icon}</span>\n )}\n <div>\n <p className=\"text-xs text-gray-500 leading-none mb-0.5\">{c.label}</p>\n <p className={`text-sm text-gray-200 ${c.href ? 'hover:text-white transition-colors' : ''}`}>\n {c.value}\n </p>\n </div>\n </div>\n )\n\n return (\n <li key={i}>\n {c.href ? (\n <a href={c.href}>{inner}</a>\n ) : (\n inner\n )}\n </li>\n )\n })}\n </ul>\n </div>\n )}\n\n {/* Social links */}\n {socialLinks.length > 0 && (\n <div className=\"flex gap-2 flex-wrap\">\n {socialLinks.map((s, i) => (\n <a\n key={i}\n href={s.href}\n aria-label={s.label}\n className=\"w-8 h-8 flex items-center justify-center rounded-lg bg-gray-800 text-gray-400 hover:bg-primary-600 hover:text-white transition-colors\"\n >\n {resolveSocialIcon(s.icon)}\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Right: Link groups ─────────────────────────────────────────── */}\n {linkGroups.length > 0 && (\n <div className={`grid gap-8 ${linkGroups.length === 1 ? 'grid-cols-1' : linkGroups.length === 2 ? 'grid-cols-2' : 'grid-cols-2 sm:grid-cols-3'}`}>\n {linkGroups.map((group, gi) => (\n <div key={gi}>\n <h3 className=\"text-xs font-semibold uppercase tracking-widest text-gray-500 mb-3\">\n {group.heading}\n </h3>\n <ul className=\"space-y-2\">\n {group.links.map((link, li) => (\n <li key={li}>\n {link.href ? (\n <a\n href={link.href}\n className=\"text-sm text-gray-400 hover:text-white transition-colors\"\n >\n {link.label}\n </a>\n ) : (\n <button\n onClick={link.onClick}\n className=\"text-sm text-gray-400 hover:text-white transition-colors text-left\"\n >\n {link.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* ── Bottom bar ─────────────────────────────────────────────────────── */}\n <div className=\"border-t border-gray-800\">\n <div className=\"max-w-7xl mx-auto px-4 py-4 flex flex-wrap items-center justify-between gap-3\">\n <p className=\"text-xs text-gray-500\">\n {copyright ?? `© ${year} Shopito. Všechna práva vyhrazena.`}\n </p>\n {bottomLinks.length > 0 && (\n <nav className=\"flex flex-wrap gap-4\">\n {bottomLinks.map((link, i) => (\n link.href ? (\n <a key={i} href={link.href} className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors\">\n {link.label}\n </a>\n ) : (\n <button key={i} onClick={link.onClick} className=\"text-xs text-gray-500 hover:text-gray-300 transition-colors\">\n {link.label}\n </button>\n )\n ))}\n </nav>\n )}\n </div>\n </div>\n\n </footer>\n )\n}\n"],"x_google_ignoreList":[2],"mappings":"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"}
|