color-swatch-picker

PreviousNext

color-swatch-picker

Docs
intentuiui

Preview

Loading preview…
components/ui/color-swatch-picker.tsx
import type { ColorSwatchPickerItemProps, ColorSwatchPickerProps } from "react-aria-components"
import {
  ColorSwatchPicker as PrimitiveColorSwatchPicker,
  ColorSwatchPickerItem as PrimitiveColorSwatchPickerItem,
} from "react-aria-components"
import { cx } from "@/lib/primitive"

export function ColorSwatchPicker({ className, ...props }: ColorSwatchPickerProps) {
  return <PrimitiveColorSwatchPicker className={cx("flex flex-wrap gap-6", className)} {...props} />
}

export function ColorSwatchPickerItem({
  children,
  className,
  ...props
}: ColorSwatchPickerItemProps) {
  return (
    <PrimitiveColorSwatchPickerItem
      style={({ defaultStyle }) => ({
        ...defaultStyle,
        "--tw-ring-color": props.color
          ? `color-mix(in oklab, ${props.color} 40%, transparent)`
          : undefined,
      })}
      className={cx(
        "relative rounded-lg outline-hidden *:rounded-[calc(var(--radius-lg)-1px)]",
        "selected:ring-3 selected:ring-ring/20 selected:*:inset-ring-current/40",
        "focus-visible:opacity-80 focus-visible:ring-ring/20 focus-visible:*:inset-ring-current/40",
        "hover:opacity-90",
        "disabled:opacity-50",
        className,
      )}
      {...props}
    >
      {(values) => (
        <>
          {values.isSelected && (
            <span
              className="pointer-events-none absolute bottom-1.5 left-1/2 size-1.5 -translate-x-1/2 rounded-full bg-current/50"
              aria-hidden
            />
          )}
          {typeof children === "function" ? children(values) : children}
        </>
      )}
    </PrimitiveColorSwatchPickerItem>
  )
}

Installation

npx shadcn@latest add @intentui/color-swatch-picker

Usage

import { ColorSwatchPicker } from "@/components/ui/color-swatch-picker"
<ColorSwatchPicker />