UNPKG

reanimated-color-picker

Version:
243 lines (237 loc) 8.5 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); exports.BlueSlider = BlueSlider; var _react = _interopRequireDefault(require('react')); var _reactNative = require('react-native'); var _reactNativeReanimated = _interopRequireWildcard(require('react-native-reanimated')); var _index = _interopRequireDefault(require('../../../colorKit/index')); var _AppContext = _interopRequireDefault(require('../../../AppContext')); var _SliderCore = require('../SliderCore'); var _Thumb = _interopRequireDefault(require('../../Thumb/Thumb')); var _utils = require('../../../utils'); function _interopRequireWildcard(e, t) { if ('function' == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || ('object' != typeof e && 'function' != typeof e)) return f; if ((o = t ? n : r)) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) 'default' !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : (f[t] = e[t])); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } /** @see [BlueSlider](https://alabsi91.github.io/reanimated-color-picker/api/sliders/rgb/blue-slider/) */ function BlueSlider({ gestures = [], style = {}, vertical = false, reverse = false, ...props }) { const { hueValue, saturationValue, brightnessValue, onGestureChange, onGestureEnd, ...ctx } = (0, _AppContext.default)(); const thumbShape = props.thumbShape ?? ctx.thumbShape; const thumbSize = props.thumbSize ?? ctx.thumbSize; const thumbColor = props.thumbColor ?? ctx.thumbColor; const boundedThumb = props.boundedThumb ?? ctx.boundedThumb; const renderThumb = props.renderThumb ?? ctx.renderThumb; const thumbStyle = props.thumbStyle ?? ctx.thumbStyle ?? {}; const thumbInnerStyle = props.thumbInnerStyle ?? ctx.thumbInnerStyle ?? {}; const thumbScaleAnimationValue = props.thumbScaleAnimationValue ?? ctx.thumbScaleAnimationValue; const thumbScaleAnimationDuration = props.thumbScaleAnimationDuration ?? ctx.thumbScaleAnimationDuration; const adaptSpectrum = props.adaptSpectrum ?? ctx.adaptSpectrum; const sliderThickness = props.sliderThickness ?? ctx.sliderThickness; const borderRadius = (0, _utils.getStyle)(style, 'borderRadius') ?? 5; const widthStyle = (0, _utils.getStyle)(style, 'width'); const heightStyle = (0, _utils.getStyle)(style, 'height'); const width = (0, _reactNativeReanimated.useSharedValue)( vertical ? sliderThickness : typeof widthStyle === 'number' ? widthStyle : 0, ); const height = (0, _reactNativeReanimated.useSharedValue)( !vertical ? sliderThickness : typeof heightStyle === 'number' ? heightStyle : 0, ); const handleScale = (0, _reactNativeReanimated.useSharedValue)(1); const blueValue = (0, _reactNativeReanimated.useSharedValue)(0); const rgb = (0, _reactNativeReanimated.useDerivedValue)(() => { const currentHsvColor = { h: hueValue.value, s: saturationValue.value, v: brightnessValue.value, }; const rgbColor = _index.default.runOnUI().RGB(currentHsvColor).object(false); blueValue.value = rgbColor.b; return rgbColor; }, [hueValue, saturationValue, brightnessValue, blueValue]); const thumbAnimatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => { const length = (vertical ? height.value : width.value) - (boundedThumb ? thumbSize : 0); const percent = (rgb.value.b / 255) * length; const pos = (reverse ? length - percent : percent) - (boundedThumb ? 0 : thumbSize / 2); const posY = vertical ? pos : height.value / 2 - thumbSize / 2; const posX = vertical ? width.value / 2 - thumbSize / 2 : pos; return { transform: [ { translateY: posY, }, { translateX: posX, }, { scale: handleScale.value, }, ], }; }, [rgb, width, height, handleScale, vertical, reverse, boundedThumb, thumbSize]); const imageStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => { if (_utils.isWeb) { return {}; } const imageRotate = vertical ? (reverse ? '90deg' : '270deg') : reverse ? '0deg' : '180deg'; const imageTranslateY = ((height.value - width.value) / 2) * ((reverse && _utils.isRtl) || (!reverse && !_utils.isRtl) ? -1 : 1); const tintColor = adaptSpectrum ? `rgb(${Math.round(rgb.value.r)}, ${Math.round(rgb.value.g)}, 255)` : 'rgb(0, 0, 255)'; return { tintColor, width: vertical ? height.value : '100%', height: vertical ? width.value : '100%', transform: [ { rotate: imageRotate, }, { translateX: vertical ? ((height.value - width.value) / 2) * (reverse ? 1 : -1) : 0, }, { translateY: vertical ? imageTranslateY : 0, }, ], }; }, [rgb, width, height, adaptSpectrum, vertical, reverse]); const sliderBackground = (0, _reactNativeReanimated.useAnimatedStyle)(() => { const r = Math.round(rgb.value.r); const g = Math.round(rgb.value.g); if (_utils.isWeb) { const deg = vertical ? (reverse ? 180 : 0) : reverse ? 90 : 270; return { background: adaptSpectrum ? `linear-gradient(${deg}deg, rgb(${r}, ${g}, 255) 0%, rgb(${r}, ${g}, 0) 100%)` : `linear-gradient(${deg}deg, rgb(0, 0, 255) 0%, rgb(0, 0, 0) 100%)`, }; } return { backgroundColor: adaptSpectrum ? `rgb(${r}, ${g}, 0)` : 'rgb(0, 0, 0)', }; }, [rgb, adaptSpectrum, vertical, reverse]); const onBegin = () => { 'worklet'; handleScale.value = (0, _reactNativeReanimated.withTiming)(thumbScaleAnimationValue, { duration: thumbScaleAnimationDuration, }); }; const onUpdate = newValue => { 'worklet'; const { h, s, v } = _index.default .runOnUI() .HSV({ r: rgb.value.r, g: rgb.value.g, b: newValue, }) .object(false); if (hueValue.value === h && saturationValue.value === s && brightnessValue.value === v) { return; } hueValue.value = h; saturationValue.value = s; brightnessValue.value = v; onGestureChange(); }; const onEnd = () => { 'worklet'; handleScale.value = (0, _reactNativeReanimated.withTiming)(1, { duration: thumbScaleAnimationDuration, }); onGestureEnd(); }; const getAdaptiveColor = hsva => { 'worklet'; if (adaptSpectrum) { return hsva; } return { r: 0, g: 0, b: rgb.value.b, }; }; return /*#__PURE__*/ _react.default.createElement( _SliderCore.SliderCore, { style: [ style, { position: 'relative', borderRadius, borderWidth: 0, padding: 0, }, sliderBackground, ], maxValue: 255, label: props.accessibilityLabel ?? 'Blue Slider', hint: props.accessibilityHint, currentValue: blueValue, width: width, height: height, thumbSize: thumbSize, boundedThumb: boundedThumb, sliderThickness: sliderThickness, gestures: gestures, vertical: vertical, reverse: reverse, onBegin: onBegin, onUpdate: onUpdate, onEnd: onEnd, }, /*#__PURE__*/ _react.default.createElement( _utils.RenderNativeOnly, null, /*#__PURE__*/ _react.default.createElement( _reactNative.View, { style: { flex: 1, borderRadius, overflow: 'hidden', }, 'aria-hidden': true, }, /*#__PURE__*/ _react.default.createElement(_reactNativeReanimated.default.Image, { source: require('../../../assets/blackGradient.png'), style: imageStyle, }), ), ), /*#__PURE__*/ _react.default.createElement(_Thumb.default, { thumbShape: thumbShape, thumbSize: thumbSize, thumbColor: thumbColor, renderThumb: renderThumb, innerStyle: thumbInnerStyle, thumbAnimatedStyle: thumbAnimatedStyle, style: thumbStyle, vertical: vertical, getAdaptiveColor: getAdaptiveColor, }), ); }