Positioning-engine not included. Use your own, or one suggested below
Optional color swatches:
pre-determined values (un-removable)
custom color add/remove swatch
optional global sync with localstorage between picker instances
This color-picker component is based on my previous work with highly customizable range input (slider) component: UI-Range
and the power of HSLA color format infused into custom CSS properties (variables) to allow as lightweight solution as possible.
I have hand-crafted the color transformation functions to be as lightweight as possible, and kept the UI to
the minimum necessary to provide the user with a better, unified, color-picking experience which I believe is better
than the default <input type='color'> which looks different across browsers and OS, and does not allow modifications to a color's alpha (opacity) channel.
Since this component is only a color-picker, and does not transforms or interacts with any <input type='color'> elements on the page,
it is up to developers, if they wish, to connect it to an input and have the color-picker positioned next to it in a popup-manner.
Such behavior can be seen seen in the demo page and below, on the last section.
I advise using a type='text' input which can offer support for any color format (as a string) because type='text' cannot work with named colors such as value='red'.
const cPicker = newColorPicker({
// accepted formats: HEX(A), RGB(A), HSL(A), X11 color namecolor: 'red',
// default rendered textual represention format// default: 'hex'defaultFormat: 'hex',
// initial class name for the component's wrapper element// default: ''className: 'hidden',
// to disable, set "false" instead of an Array// default: []swatches: ['red', '#666', 'rgba(10,20,30,.5)'],
// saves colors for persistance and cross-usage between picker instances// default: falseswatchesLocalStorage: true,
// buttons text & iconbuttons: {
undo : { icon: '↶', title: 'Undo' },
add : { icon: '+', title: 'Add to Swatches' },
format : { icon: '⇆', title: 'Switch Color Format' }
},
// fired rapidly, on every range slider movement or any color changeonInput(color){},
// like "onInput", but not fired while a range slider is movedonChange(color){},
// helpful when the component is used as a popuponClickOutside(e){}
})
Example
In the below example the color picker is used as a popup, so when an input of type color is clicked, the popup
is shown in a way which doesn't affect the flow of the page.
Since this component was designed as bare-minimum, it has no internal positioning-system
and can be pluged with one, for example, my own.
In the below example, the color-picker is being bound to an input element, so when the color-picker
is being changes, so will the other input.
// because "@yaireo/position" is used (in this demo) as a script file and not an node module (ES export)
position = position.default;
const cPicker = newColorPicker({
color: myColor.value, // use the input element's valueclassName: 'hidden', // optional class name which will be added to the color-picker componentswatches: ['white', '#000', 'rgba(255,0,0,.3)'],
// when clicking anywhere that is not within the color picker.// use special logic if clicked on the color-input which is// assosiacated with this specific pickeronClickOutside(e){
let action = 'add',
isTargetColorInput = e.target == myColor
if( isTargetColorInput ) action = 'toggle'if( e.key == 'Escape' ) action = 'add'
cPicker.DOM.scope.classList[action]('hidden')
isTargetColorInput && observerCallback()
},
onInput(color){
myColor.value = color;
myColor.style.setProperty('--color', color)
},
})
// add the color picker to the DOMdocument.body.appendChild(cPicker.DOM.scope)
constobserverCallback = (entries) => {
!cPicker.DOM.scope.classList.contains('hidden') &&
position({ target:cPicker.DOM.scope, ref:myColor });
}
const resizeObserver = newResizeObserver(observerCallback)
const intersectionObserver = newIntersectionObserver(observerCallback, {root:document, threshold:1});
// position the color picker next to the input element
resizeObserver.observe(document.body)
intersectionObserver.observe(cPicker.DOM.scope)
observerCallback()
// re-position on window resize
resizeObserver.observe(document.body)
Listen to input external value changes
If your element's value property might change by means other than this color picker component,
then it is advisable to periodically check and match the color picker's internal value to the input's value.
The npm package @yaireo/color-picker receives a total of 237 weekly downloads. As such, @yaireo/color-picker popularity was classified as not popular.
We found that @yaireo/color-picker demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.It has 0 open source maintainers collaborating on the project.
Package last updated on 13 Sep 2024
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Ransomware payment rates hit an all-time low in 2024 as law enforcement crackdowns, stronger defenses, and shifting policies make attacks riskier and less profitable.