Skip to content

Panel2 Brightness

Hue horizontally, brightness vertically, saturation on the slider below. The sliders use the doubleTriangle thumb while the panel keeps a ring, so each control can carry the shape that suits it.

Code

Panel2Brightness.tsx
import React, { useState } from 'react';
import { KeyboardAvoidingView, View } from 'react-native';
import type { ColorFormatsObject } from 'reanimated-color-picker';
import ColorPicker, { colorKit, InputWidget, OpacitySlider, Panel2, SaturationSlider } from 'reanimated-color-picker';
import { useContainerBackgroundColor } from './components/BaseContainer';
import Divider from './components/Divider';
import { colorPickerStyle } from './components/colorPickerStyle';
// initial random color
const 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={26}
thumbSize={13}
thumbShape='doubleTriangle'
onChange={onColorChange}
onCompleteJS={onColorPick}
style={colorPickerStyle.picker}
adaptSpectrum
>
<Panel2 style={colorPickerStyle.panelStyle} verticalChannel='brightness' thumbShape='ring' thumbSize={30} />
<SaturationSlider 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.

components/colorPickerStyle.ts
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,
},
});