ColorSwatchPicker

PreviousNext
Docs
react-ariaui

Preview

Loading preview…
components/ui/ColorSwatchPicker.tsx
'use client';
import React from 'react';
import {
  ColorSwatchPicker as AriaColorSwatchPicker,
  ColorSwatchPickerItem as AriaColorSwatchPickerItem,
  ColorSwatchPickerItemProps,
  ColorSwatchPickerProps,
  composeRenderProps
} from 'react-aria-components';
import {ColorSwatch} from '@/registry/react-aria/ui/ColorSwatch';
import {focusRing} from '@/registry/react-aria/lib/react-aria-utils';
import {tv} from 'tailwind-variants';

const pickerStyles = tv({
  base: 'flex gap-1',
  variants: {
    layout: {
      stack: 'flex-col',
      grid: 'flex-wrap'
    }
  }
})

export function ColorSwatchPicker(
  { children, ...props }: Omit<ColorSwatchPickerProps, 'layout'>
) {
  return (
    <AriaColorSwatchPicker {...props} className={composeRenderProps(props.className, (className, renderProps) => pickerStyles({...renderProps, className}))}>
      {children}
    </AriaColorSwatchPicker>
  );
}

const itemStyles = tv({
  extend: focusRing,
  base: 'relative rounded-xs [-webkit-tap-highlight-color:transparent]'
});

export function ColorSwatchPickerItem(props: ColorSwatchPickerItemProps) {
  return (
    <AriaColorSwatchPickerItem {...props} className={itemStyles}>
      {({isSelected}) => <>
        <ColorSwatch />
        {isSelected && <div className="absolute top-0 left-0 w-full h-full box-border border border-2 border-black dark:border-white outline outline-2 outline-white dark:outline-black -outline-offset-4 rounded-md forced-color-adjust-none" />}
      </>}
    </AriaColorSwatchPickerItem>
  );
}

Installation

npx shadcn@latest add @react-aria/tailwind-colorswatchpicker

Usage

import { TailwindColorswatchpicker } from "@/components/ui/tailwind-colorswatchpicker"
<TailwindColorswatchpicker />