import React, { useCallback } from 'react'; import classNames from 'classnames'; import { Clickable } from '../Clickable'; import { SKU_COLORS, SkuColor } from './skuColors'; import './ColorSwatch.scss'; export type ColorSwatchSize = 'default' | 'small'; export type ColorSwatchProps = Omit< Omit, 'onClick'>, 'onMouseEnter' > & { size?: ColorSwatchSize; color: SkuColor | string; backgroundUrl?: string; focus?: boolean; hover?: boolean; selected?: boolean; soldOut?: boolean; onSale?: boolean; onClick?(color: string, title?: string): void; onMouseEnter?(color: string, title?: string): void; }; export const ColorSwatch: React.FC = ({ className, size, color, backgroundUrl, focus, hover, selected, soldOut, onSale, onClick, onMouseEnter, disabled, title, ...rest }) => { const handleClick = useCallback( (_event: React.MouseEvent) => { onClick?.(color, title); }, [color, title, onClick] ); const handleMouseEnter = useCallback( (_event: React.MouseEvent) => { onMouseEnter?.(color, title); }, [color, title, onMouseEnter] ); const backgroundColor = SKU_COLORS[color as SkuColor] ?? color; const isWhite = !backgroundUrl && (!backgroundColor.startsWith('#') || backgroundColor.toLowerCase() === '#fff' || backgroundColor.toLowerCase() === '#ffffff'); const styles: React.CSSProperties = { backgroundColor, ...(backgroundUrl ? { backgroundImage: `url(${backgroundUrl})`, backgroundSize: 'cover' } : {}) }; return (
); };