@dayflow/blossom-color-picker-vue

Vue 3 wrapper for Blossom Color Picker
15,061 401
Install
npm install @dayflow/blossom-color-picker-vue
Latest Version:1.4.0
Vue:3
License:MIT
Last Updated:Oct 13, 2026
Links: GitHub  ·  npm
Maintainer: jayceli

Blossom Color Picker

npm version PRs Welcome GitHub license

A beautiful, blooming color picker for Web. Available as a standalone vanilla JS class, or as a thin React / Vue / Svelte / Angular wrapper.

https://github.com/user-attachments/assets/553ee0ff-1f52-497f-bc8f-cee9a7b91d66

Packages

Package Description Version
@dayflow/blossom-color-picker Vanilla JS core (zero dependencies) 2.0.0
@dayflow/blossom-color-picker-react React wrapper 1.0.0
@dayflow/blossom-color-picker-vue Vue 3 wrapper 1.0.0
@dayflow/blossom-color-picker-svelte Svelte wrapper 1.0.0
@dayflow/blossom-color-picker-angular Angular wrapper 1.0.0

Installation

# Vanilla JS (core)
npm install @dayflow/blossom-color-picker

# React
npm install @dayflow/blossom-color-picker-react

# Vue 3
npm install @dayflow/blossom-color-picker-vue

# Svelte
npm install @dayflow/blossom-color-picker-svelte

# Angular
npm install @dayflow/blossom-color-picker-angular

Usage

Vanilla JS

import { BlossomColorPicker } from '@dayflow/blossom-color-picker';
import '@dayflow/blossom-color-picker/styles.css';

const picker = new BlossomColorPicker(document.getElementById('picker'), {
  onChange: color => console.log(color.hex),
});

// Programmatic control
picker.expand();
picker.collapse();
picker.toggle();
picker.setValue({ hue: 200, saturation: 50, alpha: 100, layer: 'outer' });
picker.setOptions({ disabled: true });
picker.destroy();

React

import { BlossomColorPicker } from '@dayflow/blossom-color-picker-react';

function App() {
  const [color, setColor] = useState({
    hue: 330,
    saturation: 70,
    alpha: 100,
    layer: 'outer' as const,
  });

  return <BlossomColorPicker value={color} onChange={c => setColor(c)} />;
}

Vue 3

<script setup>
import { ref } from 'vue';
import { BlossomColorPicker } from '@dayflow/blossom-color-picker-vue';

const color = ref({
  hue: 330,
  saturation: 70,
  alpha: 100,
  layer: 'outer',
});

function handleChange(c) {
  color.value = c;
}
</script>

<template>
  <BlossomColorPicker :value="color" @change="handleChange" />
</template>

Svelte

<script>
  import { BlossomColorPicker } from '@dayflow/blossom-color-picker-svelte';

  let color = $state({
    hue: 330, saturation: 70, alpha: 100, layer: 'outer',
  });

  function handleChange(newColor) {
    color = newColor;
  }
</script>

<BlossomColorPicker value={color} onchange={handleChange} />

Angular

import { Component } from '@angular/core';
import {
  BlossomColorPickerComponent,
  type BlossomColorPickerColor,
} from '@dayflow/blossom-color-picker-angular';

@Component({
  selector: 'app-root',
  imports: [BlossomColorPickerComponent],
  template: `
    <blossom-color-picker
      [value]="color"
      (colorChange)="onColorChange($event)"
    />
  `,
})
export class App {
  color = { hue: 330, saturation: 70, alpha: 100, layer: 'outer' as const };

  onColorChange(c: BlossomColorPickerColor) {
    this.color = c;
  }
}

Options / Props

All packages share the same set of options. In React they are passed as JSX props; in Vue as component props (with events via @change / @collapse); in Svelte as callback props (onchange / oncollapse); in Angular as @Input() bindings (with events via (colorChange) / (colorCollapse)).

Option Type Default Description
value BlossomColorPickerValue - Controlled value of the picker.
defaultValue BlossomColorPickerValue { hue: 330, saturation: 70, alpha: 50, layer: 'outer' } Initial value for uncontrolled mode.
colors ColorInput[] (Default 18-color set) Color list, automatically sorted and distributed into layers.
onChange (color: BlossomColorPickerColor) => void - Called when color changes. Vue: @change. Svelte: onchange. Angular: (colorChange).
onCollapse (color: BlossomColorPickerColor) => void - Called when the picker collapses. Vue: @collapse. Svelte: oncollapse. Angular: (colorCollapse).
disabled boolean false Whether the picker is disabled.
openOnHover boolean false If true, opens the picker on hover instead of click.
initialExpanded boolean false Whether the picker starts expanded.
animationDuration number 280 Base timing of the blooming animation in ms; every phase scales with it (at the default the bloom settles in about 550 ms).
showAlphaSlider boolean true Whether to show the saturation arc slider.
coreSize number 32 Diameter of the central circle in px.
petalSize number 32 Diameter of individual color petals in px.
showCoreColor boolean false When true, the core shows the selected color while expanded; otherwise it is white.
sliderPosition 'top' | 'bottom' | 'left' | 'right' 'right' Fixed position for the arc slider.
adaptivePositioning boolean true Smart Shifter: Automatically shifts the picker to stay within viewport and repositions the slider for best visibility.
className / class string "" Additional CSS class (React: className, Svelte: class).

Vanilla JS Methods

The core class exposes these additional methods:

Method Description
setValue(value) Set the current color value.
getValue() Get the current color as a BlossomColorPickerColor.
expand() Open the picker.
collapse() Close the picker.
toggle() Toggle open/close.
setOptions(opts) Update any options at runtime.
destroy() Remove all DOM elements and event listeners.

Features

Smart Shifter & Adaptive UI

The picker is built for all screen sizes. When adaptivePositioning is enabled:

  • Viewport Shifting: If the expanded picker would overflow the screen edge (common on mobile), it automatically shifts itself into view.
  • Auto Slider Positioning: The Arc Slider automatically moves to the side with the most available space (Top, Bottom, Left, or Right).
  • Dark Mode Ready: The background automatically adapts to your theme, using a soft, tinted overlay of the currently selected color.

Geometric Nesting

Our "Bloom" algorithm uses trigonometric calculations to ensure:

  • Zero Gaps: Petals aggressively "hug" the core and nestle deep into the "valleys" of previous layers.
  • Staggered Layout: Adjacent layers are automatically staggered to create a dense, natural blossom effect regardless of the color count.

Type Reference

BlossomColorPickerValue

The value object used for controlled / uncontrolled state.

Field Type Description
hue number Hue angle (0-360).
saturation number Slider position (0-100). 0 = bright, 100 = dark.
lightness number? HSL lightness (auto-computed from slider if omitted).
originalSaturation number? Base saturation of the selected petal.
alpha number Alpha value (0-100).
layer 'inner' | 'outer' Which layer the selected petal belongs to.

BlossomColorPickerColor

Extends BlossomColorPickerValue — returned by onChange and onCollapse.

Field Type Description
hex string Hex color string, e.g. "#6586E5".
hsl string HSL string, e.g. "hsl(225, 71%, 65%)".
hsla string HSLA string with alpha.

ColorInput

type ColorInput = string | { h: number; s: number; l: number };

Color Formats

The colors option accepts any of the following formats, and they can be mixed:

// Vanilla JS
const picker = new BlossomColorPicker(el, {
  colors: [
    '#FF6B6B', // hex
    'rgb(107, 203, 119)', // rgb()
    'rgba(65, 105, 225, 0.9)', // rgba()
    'hsl(280, 70%, 55%)', // hsl()
    'hsl(200 80% 60%)', // hsl() space-separated
    { h: 45, s: 90, l: 65 }, // HSL object
  ],
});
// React
<BlossomColorPicker
  colors={['#FF6B6B', 'rgb(107, 203, 119)', { h: 45, s: 90, l: 65 }]}
/>

Project Structure

This is a monorepo with five packages:

packages/
  core/      @dayflow/blossom-color-picker          — standalone vanilla JS class
  react/     @dayflow/blossom-color-picker-react     — thin React wrapper
  vue/       @dayflow/blossom-color-picker-vue       — thin Vue 3 wrapper
  svelte/    @dayflow/blossom-color-picker-svelte    — thin Svelte 5 wrapper
  angular/   @dayflow/blossom-color-picker-angular   — thin Angular wrapper

The React, Vue, Svelte and Angular adapters are lightweight wrappers (~2 KB each) that mount the core instance into a container element and sync framework props/events to it.

Made by Jayce Li, idea from @lichinlin.

Related Packages

@v-c/color-picker

vue color picker

49,706 32
@morev/vue-transitions

Shareable Vue transitions library

412,603 222
animated-number-vue

A vue component with number animation

158,718 211
vue-starport

Shared Vue component across routes with animations

57,522 1,949
verte-vue3

Vue Color Picker

48,073 6

Version History

Version Released License
1.4.0 MIT
1.3.0 MIT
1.2.1 MIT
1.2.0 MIT
1.1.0 MIT