A collection of efficient and customizable color pickers built with Vue 3, designed for modern web development.
Explore the components in action: π Open Live Demo
-
Modular & Tree-Shakable β Import only what you use
-
TypeScript Ready β Full typings for better DX
-
SSR-Friendly β Compatible with Nuxt and other SSR frameworks
-
Optimized for Accessibility β Built with keyboard navigation and screen readers in mind.
npm install vue-color@next
# or
yarn add vue-color@next
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
// Import styles
import 'vue-color/style.css';
createApp(App).mount('#app')
<template>
<ChromePicker v-model="color" />
</template>
<script setup lang="ts">
import { ChromePicker } from 'vue-color'
const color = defineModel({
default: '#68CCCA'
});
</script>
π For a full list of available components, see the Documentation.
All color pickers listed below can be imported as named exports from vue-color
.
import { ChromePicker, CompactPicker, HueSlider /** ...etc */ } from 'vue-color';
Component Name | Docs |
---|---|
ChromePicker | View |
CompactPicker | View |
GrayscalePicker | View |
MaterialPicker | - |
PhotoshopPicker | View |
SketchPicker | View |
SliderPicker | View |
SwatchesPicker | View |
TwitterPicker | View |
HueSlider | View |
AlphaSlider | - |
All color picker components (expect for <HueSlider />
) in vue-color
share a set of common props and events for handling color updates and synchronization.
Below we'll take <ChromePicker />
as an example to illustrate how to work with v-model
.
<template>
<ChromePicker v-model="color" />
</template>
<script setup>
import { ChromePicker } from 'vue-color'
const color = defineModel({
default: 'rgb(50, 168, 82)'
});
</script>
The v-model
of vue-color
accepts a variety of color formats as input. It will preserve the format you provide, which is especially useful if you need format consistency throughout your app.
const color = defineModel({
default: 'hsl(136, 54%, 43%)'
// or
default: '#32a852'
// or
default: '#32a852ff'
// or
default: { r: 255, g: 255, b: 255, a: 1 }
});
Under the hood, vue-color
uses tinycolor2
to handle color parsing and conversion.
This means you can pass in any color format that tinycolor2
supportsβand it will just work.
<template>
<ChromePicker v-model:tinyColor="tinyColor" />
</template>
<script setup>
import { ChromePicker, tinycolor } from 'vue-color';
const tinyColor = defineModel('tinyColor', {
default: tinycolor('#F5F7FA')
});
</script>
In addition to plain color values, you can also bind a tinycolor2
instance using v-model:tinyColor
.
This gives you full control and utility of the tinycolor
API.
β οΈ Note: You must use thetinycolor
exported fromvue-color
to ensure compatibility with the library's internal handling.
Since vue-color
relies on DOM interaction, components must be rendered client-side. Example for Nuxt:
<template>
<ClientOnly>
<ChromePicker />
</ClientOnly>
</template>
<script setup lang="ts">
import { ClientOnly } from '#components';
import {ChromePicker } from 'vue-color';
</script>
Contributions are welcome! Please open issues or pull requests as needed.