npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@marcosfreitas/pastel-color-picker

v4.2.0

Published

A comprehensive React color picker component with multiple variants, pastel color support, and alpha channel control

Readme

🎨 Pastel Color Picker

npm version Node.js TypeScript React Accessibility

📋 Summary

A comprehensive React color picker component with multiple variants, pastel color support, and alpha channel control. Built with Radix UI primitives and modern CSS architecture.

Key Features:

  • 🎯 Multiple Variants - Button, Circles, and Random selection modes
  • 🌈 Pastel & Vivid Colors - Smart color generation for different aesthetics
  • 💧 Alpha Channel Support - Transparency control with visual feedback
  • WCAG 2.1 AA Compliant - Full accessibility with screen reader support
  • 🔧 TypeScript Ready - Complete type safety with detailed interfaces
  • Modern Stack - Built with Radix UI primitives and BEM CSS methodology
  • 📦 Flexible Installation - Self-contained, headless, or source import options

📑 Table of Contents

✨ Features

  • 🎯 Multiple Variants: Button, Circles, and Random color selection modes
  • 🌈 Pastel & Vivid Colors: Toggle between soft pastel and vibrant color palettes
  • 💧 Alpha Channel Support: Control transparency with optional alpha slider
  • 📱 Responsive Design: Works perfectly on both small and large screens
  • 🎨 Custom Presets: Define your own color palettes
  • ♿ Accessibility: Full keyboard navigation and screen reader support
  • 🔧 TypeScript: Complete type safety with detailed interfaces
  • ⚡ Modern Stack: Built with Radix UI primitives and BEM CSS methodology

🎯 How It Works

The color picker uses the HSV (Hue, Saturation, Value) color model, which provides an intuitive way to select colors by separating color properties:

🌈 Color Theory

HSV Color Model Components:

  • Hue (H): The color type (0-360°) - Red, Orange, Yellow, Green, Blue, Purple, etc.
  • Saturation (S): Color intensity (0-100%) - Gray to Vivid
  • Value (V): Brightness (0-100%) - Black to Bright

🎨 Color Variants

  • 2D Color Area (optional): Interactive canvas for selecting saturation and value simultaneously
  • Individual Sliders (default): Separate controls for precise adjustment
  • Random Mode: Generate colors within pastel or vivid ranges

🚀 Demo

Live Demo →

📦 Installation

From npm (Recommended)

npm install @marcosfreitas/pastel-color-picker

Peer Dependencies

npm install react react-dom

Note: All other dependencies (Radix UI, Lucide React, etc.) are bundled with the package for optimal compatibility.

🎯 Quick Start

// Runtime imports (from .js files)
import { ColorPicker, ColorModeEnum } from '@marcosfreitas/pastel-color-picker';
// Type imports (from .d.ts files)
import type { ColorValue } from '@marcosfreitas/pastel-color-picker';
// CSS import
import '@marcosfreitas/pastel-color-picker/style.css';
import { useState } from 'react';

function App() {
  const [color, setColor] = useState<ColorValue>();

  return (
    <ColorPicker
      defaultColor={color}
      onColorChange={setColor}
      variant="button"
      colorMode={ColorModeEnum.PASTEL}  // Use enum for runtime
      // OR colorMode="pastel"         // Use string literal
      showAlpha={true}
    />
  );
}

🔧 API Reference

🔍 Import Clarification

Important: Types (ColorValue, ColorMode, etc.) must be imported separately from runtime values:

// ✅ Correct - Import types separately
import { ColorPicker, ColorModeEnum } from '@marcosfreitas/pastel-color-picker';
import type { ColorValue, ColorMode } from '@marcosfreitas/pastel-color-picker';

// ❌ Incorrect - Types don't exist in JS runtime
import { ColorPicker, ColorValue, ColorMode } from '@marcosfreitas/pastel-color-picker';

ColorPickerProps

| Prop | Type | Default | Description | |------|------|---------|-------------| | defaultColor | ColorValue | first preset color | Current color value | | onColorChange | (color: ColorValue, random?: boolean) => void | - | Callback when color changes | | variant | 'button' \| 'circles' \| 'random' | 'button' | Presentation variant | | colorMode | 'pastel' \| 'vivid' | 'pastel' | Color generation mode | | presets | string[] | pastel/vivid colors | Custom preset colors (hex values) | | title | string | 'Color Picker' | Dialog title | | showAlpha | boolean | true | Whether to show alpha channel controls | | showColorArea | boolean | false | Whether to show 2D color area instead of color bar | | hideSliders | boolean | false | Whether to hide all slider controls in dialogs | | showPresets | boolean | true | Show preset colors in dialog | | showHue | boolean | true | Show hue slider | | showSaturation | boolean | true | Show saturation slider | | showLightness | boolean | true | Show lightness/value slider | | showRandomButton | boolean | true | Show random color button | | className | string | - | Custom CSS class | | size | 'sm' \| 'md' \| 'lg' | 'md' | Size variant | | disabled | boolean | false | Disabled state | | label | string | - | Label text to display with the button/random variants | | children | ReactNode | - | Custom content for trigger button |

Event Callbacks

| Callback | Type | Description | |----------|------|-------------| | onColorChange | (color: ColorValue, random?: boolean) => void | Called when color changes | | onPresetClick | (color: ColorValue) => void | Called when preset color is clicked | | onHueChange | (hue: number[]) => void | Called when hue slider changes | | onSaturationChange | (saturation: number[]) => void | Called when saturation slider changes | | onLightnessChange | (lightness: number[]) => void | Called when lightness slider changes | | onAlphaChange | (alpha: number[]) => void | Called when alpha slider changes |

ColorValue Interface

interface ColorValue {
  hexa: string;                              // Hex color (#FF0000)
  rgba: { r: number; g: number; b: number; a: number }; // RGBA values
  hsva: { h: number; s: number; v: number; a: number }; // HSVA values
}

ColorMode Enum

enum ColorMode {
  PASTEL = 'pastel',
  VIVID = 'vivid'
}

🎨 Variants

Button Variant (Default)

Displays a colored button that opens a full-featured color picker dialog.

<ColorPicker 
  variant="button" 
  size="md"
  colorMode={ColorMode.PASTEL}
  onColorChange={(color) => console.log(color)}
/>

Circles Variant

Shows preset color circles with an option to open the full picker.

<ColorPicker 
  variant="circles" 
  presets={['#FF6B6B', '#4ECDC4', '#45B7D1']}
  colorMode={ColorMode.VIVID}
  onColorChange={(color) => console.log(color)}
/>

Note: The label and children props are not rendered in circles variant - it uses preset circles instead.

Random Variant

Generates random colors with a colored bottom border indicator.

<ColorPicker 
  variant="random" 
  colorMode={ColorMode.PASTEL}
  onColorChange={(color) => console.log(color)}
  label="Generate Random Color"
/>

Note: The presets prop is not used in random variant - it generates colors based on colorMode only.

🎯 Variant Comparison

| Feature | Button | Circles | Random | |---------|--------|---------|--------| | Dialog | ✅ Full dialog | ✅ Full dialog | ❌ No dialog | | Presets | ✅ Uses presets | ✅ Uses presets | ❌ Ignores presets | | Label/Children | ✅ Renders content | ❌ Uses circles only | ✅ Renders content | | All Sliders | ✅ All controls | ✅ All controls | ❌ No sliders | | Random Generation | ✅ Via dialog | ✅ Via dialog | ✅ Primary function | | Best For | Complex selection | Quick presets | Inspiration |

Choose your variant:

  • Button: When you need full control and all color picker features
  • Circles: When you want quick preset selection with dialog fallback
  • Random: When you want simple random color generation for creative workflows

🌈 Color Modes

Pastel Colors

When colorMode="pastel":

  • Saturation: 70-100%
  • Value: 75-90%
  • Perfect for soft, elegant designs

Vivid Colors

When colorMode="vivid":

  • Saturation: 50-100%
  • Value: 40-80%
  • Great for bold, energetic designs

🎨 Styling

The component uses a modern CSS architecture with BEM methodology and scoped variables. You can customize the appearance by overriding CSS custom properties:

:root {
  --pcp-color-border: 0 0% 10%;
  --pcp-color-background: 0 0% 100%;
  --pcp-color-foreground: 222.2 84% 4.9%;
  --pcp-color-primary: 222.2 47.4% 11.2%;
  --pcp-color-primary-foreground: 210 40% 98%;
  --pcp-radius: 0.5rem;
}

♿ Accessibility

This color picker provides comprehensive accessibility support that exceeds WCAG 2.1 AA standards:

Complete Implementation

  • 🎯 Advanced Keyboard Navigation - 2D color area navigation, grid-based preset selection, shortcuts (Home/End/PageUp/PageDown)
  • 🔊 Screen Reader Excellence - Live region announcements, descriptive color names, context-aware feedback
  • 👁️ Enhanced Focus Management - Dual-outline system with soft black focus rings for optimal visibility
  • 🎨 Color Independence - Information conveyed through text, ARIA labels, and multiple formats (HEX, RGB)
  • ⚡ High Contrast Mode - Automatic detection with enhanced outlines and pure black indicators
  • 🌊 Reduced Motion Support - Respects user motion preferences
  • 📱 Responsive Design - Accessible at all zoom levels and screen sizes

🏆 WCAG 2.1 AA Compliant

  • All success criteria met with automated testing verification
  • Compatible with NVDA, JAWS, VoiceOver, and Orca screen readers
  • Lighthouse accessibility score: 100%
  • Zero accessibility violations detected by axe-core

📚 Detailed Documentation

For comprehensive accessibility implementation details, testing procedures, and contribution guidelines, see our Accessibility Guide.

This component sets the standard for accessible color picker implementations.

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

📝 License

This project is licensed under the GPL-3.0 License - see the LICENSE file for details.

🙏 Acknowledgments


Made with ❤️ by Marcos Freitas