@storybook/addon-ondevice-controls 10.4.3 → 10.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { I18nManager, Image, StyleSheet, Text, View, } from 'react-native';
4
4
  import tinycolor from 'tinycolor2';
5
5
  import SliderWrapper from '../SliderWrapper';
@@ -8,27 +8,46 @@ const getHsv = (color) => tinycolor(color).toHsv();
8
8
  export function HoloColorPicker({ defaultColor, oldColor, onColorChange, style, }) {
9
9
  const [color, setColor] = useState(() => getHsv(defaultColor));
10
10
  const [pickerSize, setPickerSize] = useState(0);
11
+ const colorRef = useRef(color);
12
+ const pickerSizeRef = useRef(pickerSize);
13
+ const pickerRef = useRef(null);
14
+ const pickerPageOffsetRef = useRef({ x: 0, y: 0 });
11
15
  useEffect(() => {
12
- setColor(getHsv(defaultColor));
16
+ const nextColor = getHsv(defaultColor);
17
+ colorRef.current = nextColor;
18
+ setColor(nextColor);
13
19
  }, [defaultColor]);
14
20
  const updateColor = useCallback((nextColor) => {
21
+ colorRef.current = nextColor;
15
22
  setColor(nextColor);
16
23
  onColorChange(nextColor);
17
24
  }, [onColorChange]);
18
25
  const handleHueChange = useCallback(({ x, y }) => {
19
- if (!pickerSize) {
26
+ const currentPickerSize = pickerSizeRef.current;
27
+ if (!currentPickerSize) {
20
28
  return;
21
29
  }
22
- const h = computeHue(x, y, pickerSize);
23
- updateColor({ ...color, h });
24
- }, [color, pickerSize, updateColor]);
30
+ const relativeX = x - pickerPageOffsetRef.current.x;
31
+ const relativeY = y - pickerPageOffsetRef.current.y;
32
+ const h = computeHue(relativeX, relativeY, currentPickerSize);
33
+ updateColor({ ...colorRef.current, h });
34
+ }, [updateColor]);
25
35
  const pickerResponder = useMemo(() => createPanResponder({
26
36
  onStart: handleHueChange,
27
37
  onMove: handleHueChange,
28
38
  }), [handleHueChange]);
29
39
  const onLayout = (event) => {
30
40
  const { width, height } = event.nativeEvent.layout;
31
- setPickerSize(Math.min(width, height));
41
+ const nextPickerSize = Math.min(width, height);
42
+ pickerSizeRef.current = nextPickerSize;
43
+ setPickerSize(nextPickerSize);
44
+ };
45
+ const onPickerLayout = () => {
46
+ requestAnimationFrame(() => {
47
+ pickerRef.current?.measure((_x, _y, _width, _height, pageX, pageY) => {
48
+ pickerPageOffsetRef.current = { x: pageX, y: pageY };
49
+ });
50
+ });
32
51
  };
33
52
  const selectedColor = tinycolor(color).toHexString();
34
53
  const indicatorColor = tinycolor({ h: color.h, s: 1, v: 1 }).toHexString();
@@ -40,7 +59,7 @@ export function HoloColorPicker({ defaultColor, oldColor, onColorChange, style,
40
59
  angle: hueToRad(color.h),
41
60
  isRTL: I18nManager.isRTL,
42
61
  });
43
- return (_jsxs(View, { style: style, children: [_jsx(View, { onLayout: onLayout, style: styles.pickerContainer, children: !pickerSize ? null : (_jsxs(View, { children: [_jsxs(View, { ...pickerResponder.panHandlers, style: computed.picker, collapsable: false, children: [_jsx(Image, { source: require('./resources/color-circle.png'), resizeMode: "contain", style: styles.pickerImage }), _jsx(View, { style: [styles.pickerIndicator, computed.pickerIndicator] })] }), oldColor ? (_jsxs(_Fragment, { children: [_jsx(View, { style: [styles.selectedPreview, computed.selectedPreview] }), _jsx(View, { style: [styles.originalPreview, computed.originalPreview] })] })) : (_jsx(View, { style: [styles.selectedFullPreview, computed.selectedFullPreview] }))] })) }), _jsxs(View, { children: [_jsx(Text, { style: styles.sliderLabel, children: "Saturation" }), _jsx(SliderWrapper, { value: color.s, onValueChange: (s) => updateColor({ ...color, s }) }), _jsx(Text, { style: styles.sliderLabel, children: "Lightness" }), _jsx(SliderWrapper, { value: color.v, onValueChange: (v) => updateColor({ ...color, v }) })] })] }));
62
+ return (_jsxs(View, { style: style, children: [_jsx(View, { onLayout: onLayout, style: styles.pickerContainer, children: !pickerSize ? null : (_jsxs(View, { children: [_jsxs(View, { ref: pickerRef, onLayout: onPickerLayout, ...pickerResponder.panHandlers, style: computed.picker, collapsable: false, children: [_jsx(Image, { source: require('./resources/color-circle.png'), resizeMode: "contain", style: styles.pickerImage }), _jsx(View, { style: [styles.pickerIndicator, computed.pickerIndicator], pointerEvents: "none" })] }), oldColor ? (_jsxs(_Fragment, { children: [_jsx(View, { style: [styles.selectedPreview, computed.selectedPreview], pointerEvents: "none" }), _jsx(View, { style: [styles.originalPreview, computed.originalPreview], pointerEvents: "none" })] })) : (_jsx(View, { style: [styles.selectedFullPreview, computed.selectedFullPreview], pointerEvents: "none" }))] })) }), _jsxs(View, { children: [_jsx(Text, { style: styles.sliderLabel, children: "Saturation" }), _jsx(SliderWrapper, { value: color.s, onValueChange: (s) => updateColor({ ...colorRef.current, s }) }), _jsx(Text, { style: styles.sliderLabel, children: "Lightness" }), _jsx(SliderWrapper, { value: color.v, onValueChange: (v) => updateColor({ ...colorRef.current, v }) })] })] }));
44
63
  }
45
64
  const computeHue = (x, y, pickerSize) => {
46
65
  const center = pickerSize / 2;
@@ -28,13 +28,13 @@ export function createPanResponder({ onStart = fn, onMove = fn, onEnd = fn, }) {
28
28
  onMoveShouldSetPanResponderCapture: fn,
29
29
  onPanResponderTerminationRequest: fn,
30
30
  onPanResponderGrant: (evt, state) => {
31
- return onStart({ x: evt.nativeEvent.locationX, y: evt.nativeEvent.locationY }, evt, state);
31
+ return onStart({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state);
32
32
  },
33
33
  onPanResponderMove: (evt, state) => {
34
- return onMove({ x: evt.nativeEvent.locationX, y: evt.nativeEvent.locationY }, evt, state);
34
+ return onMove({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state);
35
35
  },
36
36
  onPanResponderRelease: (evt, state) => {
37
- return onEnd({ x: evt.nativeEvent.locationX, y: evt.nativeEvent.locationY }, evt, state);
37
+ return onEnd({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state);
38
38
  },
39
39
  });
40
40
  }
@@ -71,7 +71,7 @@ const ColorType = ({ arg, onChange = (value) => value }) => {
71
71
  backgroundColor: theme.background.content,
72
72
  } }));
73
73
  }
74
- return (_jsxs(View, { children: [_jsx(TouchableContainer, { onPress: openColorPicker, hitSlop: controlHitSlop, activeOpacity: 0.7, children: _jsx(Touchable, { color: arg.value }) }), _jsxs(ModalPortal, { supportedOrientations: ['portrait', 'landscape'], transparent: true, visible: displayColorPicker, onRequestClose: closeColorPicker, animationType: "fade", children: [_jsx(TouchableWithoutFeedback, { onPress: closeColorPicker, children: _jsx(View, { style: styles.modalOverlay }) }), _jsx(View, { style: styles.centerContainer, children: _jsxs(InnerContainer, { pointerEvents: "box-none", children: [_jsx(ColorPicker, { onColorChange: (color) => setCurrentColor(color), defaultColor: arg.value, oldColor: arg.value, style: styles.picker }), _jsxs(View, { style: styles.actionContainer, children: [_jsx(ButtonTouchable, { onPress: closeColorPicker, hitSlop: buttonHitSlop, children: _jsx(ButtonText, { children: "Cancel" }) }), _jsx(View, { style: { width: 12 } }), _jsx(ButtonTouchable, { primary: true, hitSlop: buttonHitSlop, onPress: () => {
74
+ return (_jsxs(View, { children: [_jsx(TouchableContainer, { onPress: openColorPicker, hitSlop: controlHitSlop, activeOpacity: 0.7, children: _jsx(Touchable, { color: arg.value }) }), _jsxs(ModalPortal, { supportedOrientations: ['portrait', 'landscape'], transparent: true, visible: displayColorPicker, onRequestClose: closeColorPicker, animationType: "fade", children: [_jsx(TouchableWithoutFeedback, { onPress: closeColorPicker, children: _jsx(View, { style: styles.modalOverlay }) }), _jsx(View, { style: styles.centerContainer, children: _jsxs(InnerContainer, { children: [_jsx(ColorPicker, { onColorChange: (color) => setCurrentColor(color), defaultColor: arg.value, oldColor: arg.value, style: styles.picker }), _jsxs(View, { style: styles.actionContainer, children: [_jsx(ButtonTouchable, { onPress: closeColorPicker, hitSlop: buttonHitSlop, children: _jsx(ButtonText, { children: "Cancel" }) }), _jsx(View, { style: { width: 12 } }), _jsx(ButtonTouchable, { primary: true, hitSlop: buttonHitSlop, onPress: () => {
75
75
  onChangeColor(currentColor);
76
76
  closeColorPicker();
77
77
  }, children: _jsx(ButtonText, { primary: true, children: "Select" }) })] })] }) })] })] }));
@@ -104,7 +104,11 @@ const styles = StyleSheet.create({
104
104
  alignItems: 'center',
105
105
  },
106
106
  modalOverlay: {
107
- ...StyleSheet.absoluteFillObject,
107
+ position: 'absolute',
108
+ top: 0,
109
+ left: 0,
110
+ right: 0,
111
+ bottom: 0,
108
112
  backgroundColor: 'rgba(0,0,0,0.3)',
109
113
  },
110
114
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/addon-ondevice-controls",
3
- "version": "10.4.3",
3
+ "version": "10.4.4",
4
4
  "description": "Display storybook controls on your device.",
5
5
  "keywords": [
6
6
  "addon",
@@ -25,8 +25,8 @@
25
25
  ],
26
26
  "dependencies": {
27
27
  "@gorhom/portal": "^1.0.14",
28
- "@storybook/react-native-theming": "^10.4.3",
29
- "@storybook/react-native-ui-common": "^10.4.3",
28
+ "@storybook/react-native-theming": "^10.4.4",
29
+ "@storybook/react-native-ui-common": "^10.4.4",
30
30
  "polished": "^4.3.1",
31
31
  "react-native-modal-datetime-picker": "^18.0.0",
32
32
  "tinycolor2": "^1.6.0"
@@ -34,7 +34,7 @@
34
34
  "devDependencies": {
35
35
  "@gorhom/bottom-sheet": "*",
36
36
  "cross-env": "^10.1.0",
37
- "storybook": "^10.3.2",
37
+ "storybook": "^10.4.0",
38
38
  "typescript": "~6.0.3"
39
39
  },
40
40
  "peerDependencies": {