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

react-iro-gradient-picker

v1.4.5

Published

Modern React gradient and solid color picker with complete dark theme support, built with TypeScript and Tailwind CSS

Readme

React Iro Gradient Picker

✨ Modern React Color Picker with Complete Dark Theme Support! ✨

A beautiful, modern React gradient and solid color picker with full dark theme integration, built with Tailwind CSS and TypeScript.

🚀 ✨ LIVE DEMO & DOCUMENTATION ✨

NPM License GitHub Pages

📚 Interactive Documentation | 📦 NPM Package | 🔧 GitHub Repository

Inspired by gpickr and enhanced with modern features

✨ Features

  • 🌙 Complete Dark Theme - Works perfectly across all components (modal, solid, gradient)
  • 🎨 Gradient & Solid Colors - Full support for both gradient and solid color picking
  • 🔄 Reset Button - Built-in reset functionality with customizable callbacks
  • 🔄 Theme Toggle - Easy switching between light and dark themes
  • 💾 Theme Persistence - Automatically saves user theme preference
  • 🎯 Tailwind CSS - Modern styling with comprehensive theming system
  • 📱 Responsive Design - Works great on all screen sizes

🎬 Live Demo

🚀 ✨ Try it Live - Interactive Storybook Demo ✨

Experience all features in action:

  • 🌙 Dark/Light Theme Toggle - Switch themes and see all components adapt
  • 🎨 Solid Color Picker - Pick any solid color with alpha transparency
  • 🌈 Gradient Picker - Create linear/radial gradients with multiple stops
  • 🔄 Dual Mode - Switch between solid and gradient modes seamlessly
  • 📱 Responsive Design - Works perfectly on desktop and mobile
  • ⚙️ All Props & Configuration - Explore every feature and customization option

📚 View Complete Documentation →


🚀 Quick Start

Install

Important: this component uses React Hooks and works on React version 16.8.0 and higher

npm install react-iro-gradient-picker
yarn add react-iro-gradient-picker
pnpm add react-iro-gradient-picker

⚠️ IMPORTANT: Import CSS Styles

You MUST import the CSS file for the component to work properly:

import 'react-iro-gradient-picker/dist/index.css';

Add this import at the top of your main App.js/App.tsx file or in your main CSS/SCSS file.

Basic Usage

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';
import 'react-iro-gradient-picker/dist/index.css'; // ⚠️ REQUIRED CSS import

function App() {
  const [color, setColor] = useState('#3B82F6');

  return (
    <ColorPicker
      solid
      value={color}
      onChange={(newColor: string) => {
        setColor(newColor);
        return newColor;
      }}
    />
  );
}

export default App;

🔄 With Reset Functionality

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';
import 'react-iro-gradient-picker/dist/index.css'; // ⚠️ REQUIRED CSS import

function App() {
  const [color, setColor] = useState('#3B82F6');
  const originalColor = '#3B82F6';

  const handleReset = () => {
    setColor(originalColor);
    console.log('Color reset to original value!');
  };

  return (
    <ColorPicker
      solid
      value={color}
      onChange={setColor}
      showReset
      onReset={handleReset}
    />
  );
}

export default App;

NEW: Enhanced Gradient Object Support

v1.2.0+ supports both CSS strings AND gradient objects for maximum flexibility!

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';
import 'react-iro-gradient-picker/dist/index.css';

function GradientObjectExample() {
  // Define gradient as an object
  const [gradientData, setGradientData] = useState({
    type: 'linear',
    angle: 120,
    stops: [
      { color: '#FF6B6B', position: 0 }, // Red at 0%
      { color: '#FFD93D', position: 50 }, // Yellow at 50%
      { color: '#6BCB77', position: 100 } // Green at 100%
    ]
  });

  return (
    <ColorPicker
      value={gradientData} // 🎯 Pass object directly!
      onChange={(cssGradient) => {
        console.log('Generated CSS:', cssGradient);
        // Component auto-switches to gradient tab
        // Sets angle to 120°, creates 3 stops with exact colors/positions
      }}
      gradient={true}
      solid={true}
      showGradientAngle={true}
      showGradientStops={true}
    />
  );
}

🚀 What happens when you pass a gradient object:

  • Auto-switches to gradient tab
  • Sets angle slider to specified degrees (120° in example)
  • Creates gradient stops at exact positions (0%, 50%, 100%)
  • Sets stop colors to specified values (#FF6B6B, #FFD93D, #6BCB77)
  • Updates gradient preview to match exactly
  • Returns CSS gradient string in onChange callback

📋 Gradient Object Structure:

interface IGradientData {
  type: 'linear' | 'radial';
  angle?: number; // For linear gradients (0-360 degrees)
  stops: Array<{
    color: string; // Any valid CSS color
    position: number; // 0-100 (percentage)
  }>;
}

�🌙 With Dark Theme Support

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';
import { ThemeProvider } from 'react-iro-gradient-picker/components/providers/ThemeContext';

function App() {
  const [color, setColor] = useState('#3B82F6');

  return (
    <ThemeProvider defaultTheme='dark'>
      <ColorPicker
        solid
        gradient
        value={color}
        onChange={setColor}
        showAlpha={true}
        showInputs={true}
      />
    </ThemeProvider>
  );
}

🎨 Format Control

Control the color format returned by the onChange callback:

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';

function FormatExample() {
  const [color, setColor] = useState('#3B82F6');

  // RGB format (default)
  <ColorPicker
    solid
    value={color}
    onChange={setColor}
    format="rgb"      // Returns: "rgb(59, 130, 246)" or "rgba(59, 130, 246, 0.8)"
  />

  // HSL format
  <ColorPicker
    solid
    value={color}
    onChange={setColor}
    format="hsl"      // Returns: "hsl(217, 91%, 60%)" or "hsla(217, 91%, 60%, 0.8)"
  />

  // HEX format
  <ColorPicker
    solid
    value={color}
    onChange={setColor}
    format="hex"      // Returns: "#3b82f6" or "#3b82f680" (with alpha)
  />
}

🎨 Default Gradient Selection

Control which gradient is used when switching from solid to gradient tab:

import React, { useState } from 'react';
import ColorPicker from 'react-iro-gradient-picker';

function GradientExample() {
  const [color, setColor] = useState('#FF6B6B');

  return (
    <ColorPicker
      solid
      gradient
      value={color}
      onChange={setColor}
      defaultGradientIndex={0} // Use first gradient from defaultColors (index 0)
    />
  );
}

How it works:

  • defaultGradientIndex controls which gradient from your defaultColors array is used as the default
  • Default value is 7 (8th gradient in the array)
  • When switching from Solid → Gradient tab, the picker shows this gradient instead of converting the solid color
  • The selected gradient is automatically highlighted in the Popular Colors panel
  • Helps maintain consistent UX by starting with a predefined gradient

Examples:

// Use the first gradient (index 0)
<ColorPicker defaultGradientIndex={0} gradient solid />

// Use the 5th gradient (index 4)
<ColorPicker defaultGradientIndex={4} gradient solid />

// Default behavior (uses index 7)
<ColorPicker gradient solid />

Smart bounds checking:

  • If index is negative, uses 0
  • If index exceeds available gradients, uses the last gradient
  • If no gradients in defaultColors, uses a fallback gradient

📚 → View Complete Documentation & Examples

🌟 What Makes This Special

This is an enhanced version of the original react-gcolor-picker with major improvements:

🌙 Complete Dark Theme Integration

  • Fixed all components - Modal, solid picker, gradient picker, and inputs now work perfectly in dark mode
  • CSS Custom Properties - Dynamic theming that responds to theme changes
  • Tailwind CSS Integration - Modern, maintainable styling system
  • Theme Toggle Component - Easy switching between light/dark themes
  • Persistent Preferences - Automatically saves user's theme choice

🎯 Enhanced Storybook Documentation

  • Dark-themed Storybook - Professional development environment
  • Comprehensive Documentation - Updated guides and examples
  • Live Examples - See all components working in both themes

🚀 Modern Development Stack

  • TypeScript Support - Full type safety and better development experience
  • Updated Dependencies - Latest versions of all packages
  • Better Build Process - Optimized for modern React applications

🎨 Supported CSS Gradient Formats

v1.2.2+ supports all standard CSS gradient formats with robust parsing:

Linear Gradients

/* Angle-based directions */
linear-gradient(120deg, #FF6B6B, #FFD93D, #6BCB77)
linear-gradient(45deg, #4FACFE, #00F2FE, #38EF7D)
linear-gradient(200deg, #FF9A9E, #FAD0C4, #FBC2EB)
linear-gradient(60deg, #30CFD0, #330867, #6A82FB)

/* Named directions */
linear-gradient(to top right, #FF6B6B, #FFD93D)
linear-gradient(to bottom, #4FACFE, #00F2FE)
linear-gradient(to left, #FF9A9E, #FAD0C4)

/* With explicit positions */
linear-gradient(90deg, #FF6B6B 0%, #FFD93D 50%, #6BCB77 100%)

/* Without positions (auto-distributed) */
linear-gradient(180deg, #FF9966, #FF5E62, #F54EA2)

Radial Gradients

/* Basic circle gradients */
radial-gradient(circle at center, #00C9FF, #92FE9D, #0061FF)
radial-gradient(circle at top left, #FF6B6B, #FF4757, #2F3542)
radial-gradient(circle at bottom right, #1E90FF, #3742FA, #2C3E50)

/* Positioned radial gradients */
radial-gradient(circle at 70% 30%, #2ED573, #1EAE98, #004E64)
radial-gradient(circle at 20% 80%, #FFB347, #FFCC33, #FF6347)
radial-gradient(circle at top center, #FF7E5F, #FEB47B, #FFD93D)
radial-gradient(circle at right center, #6A82FB, #FC5C7D, #FF85A1)

/* Complex positioning */
radial-gradient(circle at 30% 70%, #11998E, #38EF7D, #8BC34A)
radial-gradient(circle at 80% 20%, #F7971E, #FFD200, #FF512F)
radial-gradient(circle at 40% 40%, #C6FFDD, #FBD786, #F7797D)

Advanced Features

  • Auto-positioning: Color stops without explicit positions are automatically distributed evenly
  • Flexible syntax: Supports various positioning keywords and percentage values
  • Error recovery: Invalid gradients fall back to a default gradient instead of crashing
  • Type safety: Full TypeScript support with proper gradient object interfaces
  • Smart position mapping: Automatically highlights correct position markers for all gradient formats

📐 Gradient Value Format Guide

The component accepts gradient values in multiple formats and automatically maps them to the correct UI controls:

✅ Supported Gradient Formats

Linear Gradients

/* Angle-based (0-360 degrees) */
linear-gradient(45deg, #FF6B6B, #4ECDC4)
linear-gradient(180deg, #667eea 0%, #764ba2 100%)

/* Named directions (automatically converted to angles) */
linear-gradient(to top, #FF6B6B, #4ECDC4)        → 0deg
linear-gradient(to top right, #FF6B6B, #4ECDC4)  → 45deg
linear-gradient(to right, #FF6B6B, #4ECDC4)      → 90deg
linear-gradient(to bottom, #FF6B6B, #4ECDC4)     → 180deg

Radial Gradients - Standard Positions

/* Standard position keywords (auto-mapped to UI markers) */
radial-gradient(circle at center, #FF6B6B, #4ECDC4)
radial-gradient(circle at top left, #FF6B6B, #4ECDC4)
radial-gradient(circle at top center, #FF6B6B, #4ECDC4)    ✨ Maps to "center top"
radial-gradient(circle at right center, #FF6B6B, #4ECDC4)  ✨ Maps to "center right"

/* Percentage-based positions */
radial-gradient(circle at 70% 30%, #FF6B6B, #4ECDC4)
radial-gradient(circle at 0% 100%, #FF6B6B, #4ECDC4)

Radial Gradients - Edge Cases ✨ NEW

/* Size-only gradients (automatically default to center position) */
radial-gradient(70, #ff0000, #0000ff)              ✨ → circle at center
radial-gradient(150%, #FFB347, #FFCC33, #FF6347)   ✨ → circle at center
radial-gradient(200px, #FF6B6B, #4ECDC4)           ✨ → circle at center

/* Size keywords (automatically default to center position) */
radial-gradient(closest-side, #FF6B6B, #4ECDC4)    ✨ → circle at center
radial-gradient(farthest-corner, #FF6B6B, #4ECDC4) ✨ → circle at center

🎯 Position Mapping Intelligence

The component intelligently maps gradient positions to UI markers:

| Input Format | UI Marker Highlighted | Notes | | ------------------------ | ------------------------- | ------------------------------- | | circle at center | Center (●) | Standard center position | | circle at top center | Center Top (●) | Alias automatically normalized | | circle at right center | Center Right (●) | Alias automatically normalized | | 70, 150%, 200px | Center (●) | Size-only defaults to center | | closest-side | Center (●) | Size keywords default to center | | circle at 25% 75% | No marker | Custom percentage position |

📝 Gradient Value Requirements

✅ Valid Examples

/* With explicit positions (recommended) */
linear-gradient(90deg, #FF6B6B 0%, #4ECDC4 100%)
radial-gradient(circle at center, #FF6B6B 0%, #4ECDC4 50%, #FFD93D 100%)

/* Without positions (auto-distributed) */
linear-gradient(45deg, #FF6B6B, #4ECDC4, #FFD93D)
radial-gradient(circle at top left, #FF6B6B, #4ECDC4)

❌ Invalid Examples

/* Missing gradient type */
90deg, #FF6B6B, #4ECDC4

/* Invalid color format */
linear-gradient(90deg, notacolor, #4ECDC4)

Props

| Attribute | Type | Default | Description | | :-------------------- | :--------: | :-------------------------: | :---------------------------------------------------------------------------------------------------- | | value | string | #ffffff | Default color value. Accept: rgba/rgb, hsla/hsl, named colors | | format | string | rgb | Return value format. Accept: 'rgb', 'hex', 'hsl' | | gradient | bool | false | Show gradient color panel | | solid | bool | true | Show solid color panel | | debounceMS | number | 300 | Debounce ms value | | debounce | bool | true | Debouce off/on | | showAlpha | bool | true | Show/hide alpha input and range | | showInputs | bool | true | Show/hide inputs alpha and color | | showGradientResult | bool | true | Show/hide gradient result fields(angle, mode, position) | | showGradientStops | bool | true | Show/hide gradient color stops | | showGradientMode | bool | true | Show/hide gradient color mode switcher | | showGradientAngle | bool | true | Show/hide gradient angle for linear-gradient | | showGradientPosition | bool | true | Show/hide gradient position for radial-gradient | | allowAddGradientStops | bool | true | Allow to add new gradient stops | | popupWidth | number | 267 | Popup width | | colorBoardHeight | number | 120 | Board color height | | defaultColors | array | List | Default colors array for panel picker | | defaultActiveTab | string | undefined | Default value for active tab when initializing the component, takes two values: solid or gradient | | defaultGradientIndex | number | 7 | Index of the gradient from defaultColors to use when switching from solid to gradient tab | | onChangeTabs | function | null | Default onChange function detect when tabs change and return one of the values: solid or gradient | | onChange | function | null | Default onChange function returns string value in the given format | | showReset | bool | false | Show/hide reset button in the picker interface | | onReset | function | null | Callback function triggered when reset button is clicked |

🎯 Radial Gradient Position Reference

The component supports all standard radial gradient positions and automatically maps them to UI markers:

Standard Positions (9-Point Grid)

/* Top Row */
circle at left top       → Top-Left marker (●)
circle at center top     → Top-Center marker (●)
circle at right top      → Top-Right marker (●)

/* Middle Row */
circle at left           → Middle-Left marker (●)
circle at center         → Center marker (●) [Default]
circle at right          → Middle-Right marker (●)

/* Bottom Row */
circle at left bottom    → Bottom-Left marker (●)
circle at center bottom  → Bottom-Center marker (●)
circle at right bottom   → Bottom-Right marker (●)

Position Aliases (Auto-Normalized)

/* These aliases are automatically converted: */
circle at top center     → circle at center top
circle at bottom center  → circle at center bottom
circle at left center    → circle at center left
circle at right center   → circle at center right

Edge Cases (Auto-Defaulted to Center)

/* Size-only gradients default to center: */
70                       → circle at center
150%                     → circle at center
200px                    → circle at center
closest-side            → circle at center
farthest-corner         → circle at center

Default color list


'#FF6900',
'#FCB900',
'#7BDCB5',
'#00D084',
'#8ED1FC',
'#0693E3',
'#ABB8C3',
'#607d8b',
'#EB144C',
'#F78DA7',
'#ba68c8',
'#9900EF',
'linear-gradient(0deg, rgb(255, 177, 153) 0%, rgb(255, 8, 68) 100%)',
'linear-gradient(270deg, rgb(251, 171, 126) 8.00%, rgb(247, 206, 104) 92.00%)',
'linear-gradient(315deg, rgb(150, 230, 161) 8.00%, rgb(212, 252, 121) 92.00%)',
'linear-gradient(to left, rgb(249, 240, 71) 0%, rgb(15, 216, 80) 100%)',
'linear-gradient(315deg, rgb(194, 233, 251) 8.00%, rgb(161, 196, 253) 92.00%)',
'linear-gradient(0deg, rgb(0, 198, 251) 0%, rgb(0, 91, 234) 100%)',
'linear-gradient(0deg, rgb(167, 166, 203) 0%, rgb(137, 137, 186) 51.00%, rgb(137, 137, 186) 100%)',
'linear-gradient(0deg, rgb(80, 82, 133) 0%, rgb(88, 94, 146) 15.0%, rgb(101, 104, 159) 28.00%, rgb(116, 116, 176) 43.00%, rgb(126, 126, 187) 57.00%, rgb(131, 137, 199) 71.00%, rgb(151, 149, 212) 82.00%, rgb(162, 161, 220) 92.00%, rgb(181, 174, 228) 100%)',
'linear-gradient(270deg, rgb(255, 126, 179) 0%, rgb(255, 117, 140) 100%)',
'linear-gradient(90deg, rgb(120, 115, 245) 0%, rgb(236, 119, 171) 100%)',
'linear-gradient(45deg, #2e266f 0.00%, #9664dd38 100.00%)',
'radial-gradient(circle at center, yellow 0%, #009966 50%, purple 100%)'

FAQ

Q: There's any possibility to remove extra gradient lines?

A: Yes, you only need to drag them outside(bottom) the Gradient component area or double click on the element you want to remove.

Credits & Attribution

This project is based on the excellent react-gcolor-picker by undind, enhanced with:

  • Complete dark theme integration
  • Modern Tailwind CSS styling
  • Improved TypeScript support
  • Enhanced Storybook documentation
  • Better accessibility features

Special thanks to the original author for creating such a solid foundation! 🙏

License

MIT © romfatal

Original project: MIT © undind