Panel2 Saturation
A Windows-style panel: hue runs left to right, saturation bottom to top. Brightness gets its own slider underneath, and the input widget lets you type a color in any format or switch between them.
Code
import React, { useState } from 'react';import { KeyboardAvoidingView, View } from 'react-native';
import type { ColorFormatsObject } from 'reanimated-color-picker';import ColorPicker, { BrightnessSlider, InputWidget, OpacitySlider, Panel2, colorKit } from 'reanimated-color-picker';
import { useContainerBackgroundColor } from './components/BaseContainer';import Divider from './components/Divider';import { colorPickerStyle } from './components/colorPickerStyle';
// initial random colorconst initialColor = colorKit.randomRgbColor().hex();
export default function Example() { const [resultColor, setResultColor] = useState(initialColor);
const currentColor = useContainerBackgroundColor(initialColor);
// runs on the ui thread on color change const onColorChange = (color: ColorFormatsObject) => { 'worklet'; currentColor.value = color.hex; };
// runs on the js thread on color pick const onColorPick = (color: ColorFormatsObject) => { setResultColor(color.hex); };
return ( <KeyboardAvoidingView behavior='position'> <View style={colorPickerStyle.pickerContainer}> <ColorPicker value={resultColor} sliderThickness={25} thumbSize={30} thumbShape='rect' onChange={onColorChange} onCompleteJS={onColorPick} style={colorPickerStyle.picker} > <Panel2 style={colorPickerStyle.panelStyle} thumbShape='ring' reverseVerticalChannel reverseHue /> <BrightnessSlider style={colorPickerStyle.sliderStyle} /> <OpacitySlider style={colorPickerStyle.sliderStyle} /> <Divider /> <InputWidget inputStyle={colorPickerStyle.inputStyle} iconColor='#707070' /> </ColorPicker> </View> </KeyboardAvoidingView> );}The colorPickerStyle object is shared by every example. Divider is a 1px line, and useContainerBackgroundColor only tints the modal of the example app.
import { Platform, StyleSheet } from "react-native";
const shadow = Platform.select({ web: { boxShadow: "rgba(0, 0, 0, 0.3) 0px 0px 2px" }, default: { shadowColor: "#000", shadowOffset: { width: 0, height: 1, }, shadowOpacity: 0.2, shadowRadius: 1.41,
elevation: 2, },});
export const colorPickerStyle = StyleSheet.create({ title: { textAlign: "center", fontFamily: "Quicksand", fontWeight: "bold", marginVertical: 20, color: "gray", }, picker: { gap: 20, }, pickerContainer: { alignSelf: "center", width: 300, backgroundColor: "#eee", padding: 20, borderRadius: 20, ...shadow, }, panelStyle: { borderRadius: 16, ...shadow, }, sliderStyle: { borderRadius: 20, ...shadow, }, sliderVerticalStyle: { borderRadius: 20, height: 300, ...shadow, }, sliderTitle: { color: "#000", fontWeight: "bold", marginBottom: 5, paddingHorizontal: 4, fontFamily: "Quicksand", }, previewStyle: { height: 40, borderRadius: 14, }, previewTxt: { color: "#707070", fontFamily: "Quicksand", }, inputStyle: { color: "#707070", paddingVertical: 2, borderColor: "#707070", fontSize: 12, marginLeft: 5, }, swatchesContainer: { alignItems: "center", flexWrap: "nowrap", gap: 10, }, swatchStyle: { borderRadius: 20, height: 30, width: 30, margin: 0, marginBottom: 0, marginHorizontal: 0, marginVertical: 0, },});