@draftbit/core 43.4.16-cbc807.1 → 43.4.17-ab8b1a.0

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.
Files changed (48) hide show
  1. package/lib/commonjs/components/ActionSheet/ActionSheetCancel.js.map +1 -1
  2. package/lib/commonjs/components/CardContainerRating.js +5 -16
  3. package/lib/commonjs/components/CardContainerRating.js.map +1 -1
  4. package/lib/commonjs/components/Config.js.map +1 -1
  5. package/lib/commonjs/components/DatePicker/DatePickerComponent.js.map +1 -1
  6. package/lib/commonjs/components/Header.js.map +1 -1
  7. package/lib/commonjs/components/Picker/PickerComponent.ios.js +10 -30
  8. package/lib/commonjs/components/Picker/PickerComponent.ios.js.map +1 -1
  9. package/lib/commonjs/components/Portal/PortalConsumer.js.map +1 -1
  10. package/lib/commonjs/components/Portal/PortalManager.js.map +1 -1
  11. package/lib/commonjs/components/RadioButton/RadioButton.js +3 -15
  12. package/lib/commonjs/components/RadioButton/RadioButton.js.map +1 -1
  13. package/lib/commonjs/components/RadioButton/RadioButtonFieldGroup.js +2 -11
  14. package/lib/commonjs/components/RadioButton/RadioButtonFieldGroup.js.map +1 -1
  15. package/lib/commonjs/components/RadioButton/RadioButtonGroup.js +5 -17
  16. package/lib/commonjs/components/RadioButton/RadioButtonGroup.js.map +1 -1
  17. package/lib/commonjs/components/ScreenContainer.js +1 -1
  18. package/lib/commonjs/components/ScreenContainer.js.map +1 -1
  19. package/lib/commonjs/components/Stepper.js +40 -58
  20. package/lib/commonjs/components/Stepper.js.map +1 -1
  21. package/lib/commonjs/components/Surface.js +5 -15
  22. package/lib/commonjs/components/Surface.js.map +1 -1
  23. package/lib/commonjs/components/Swiper/SwiperItem.js.map +1 -1
  24. package/lib/commonjs/mappings/Accordion.js.map +1 -1
  25. package/lib/commonjs/mappings/BlurView.js.map +1 -1
  26. package/lib/commonjs/mappings/Container.js.map +1 -1
  27. package/lib/commonjs/mappings/FAB.js.map +1 -1
  28. package/lib/commonjs/mappings/Slider.js.map +1 -1
  29. package/lib/commonjs/mappings/TextArea.js.map +1 -1
  30. package/lib/module/components/IconButton.js +5 -21
  31. package/lib/module/components/IconButton.js.map +1 -1
  32. package/lib/module/components/Portal/PortalHost.js.map +1 -1
  33. package/lib/module/components/RowHeadlineImageIcon.js.map +1 -1
  34. package/lib/module/components/ScreenContainer.js +1 -1
  35. package/lib/module/components/ScreenContainer.js.map +1 -1
  36. package/lib/module/components/Stepper.js +36 -54
  37. package/lib/module/components/Stepper.js.map +1 -1
  38. package/lib/module/components/Surface.js +6 -16
  39. package/lib/module/components/Surface.js.map +1 -1
  40. package/lib/typescript/src/components/ScreenContainer.d.ts +6 -6
  41. package/lib/typescript/src/components/Stepper.d.ts +8 -9
  42. package/package.json +2 -2
  43. package/src/components/ScreenContainer.js +1 -1
  44. package/src/components/ScreenContainer.tsx +5 -5
  45. package/src/components/Stepper.js +23 -37
  46. package/src/components/Stepper.tsx +48 -64
  47. package/src/components/Surface.js +4 -15
  48. package/src/components/Surface.tsx +4 -23
@@ -1,77 +1,59 @@
1
- import * as React from "react";
1
+ import React, { useEffect, useState } from "react";
2
2
  import { View, Text } from "react-native";
3
+ import { isNumber } from "lodash";
3
4
  import { withTheme } from "../theming";
4
5
  import IconButton from "./IconButton";
5
- import isNumber from "lodash.isnumber";
6
6
 
7
7
  const Stepper = _ref => {
8
8
  let {
9
- Icon,
10
- value,
11
- min,
12
- max,
9
+ min = -Infinity,
10
+ max = Infinity,
11
+ value: valueProp,
12
+ defaultValue,
13
13
  style,
14
+ typeStyle,
15
+ iconSize = 24,
16
+ iconColor,
14
17
  onChange,
15
- defaultValue,
16
18
  theme: {
17
19
  colors,
18
- typography,
19
- roundness
20
+ typography
20
21
  },
21
- iconSize = 24,
22
- iconColor = colors.strong,
23
- borderRadius = roundness,
24
- typeStyle
22
+ Icon
25
23
  } = _ref;
26
- const [stateValue, setStateValue] = React.useState(value || defaultValue || 0);
27
- React.useEffect(() => {
28
- if (value || value === 0) {
29
- onChange && onChange(stateValue);
30
- }
31
- }, [onChange, stateValue, value]);
32
- React.useEffect(() => {
33
- let newValue = value || defaultValue || 0;
24
+ const [value, setValue] = useState(defaultValue !== null && defaultValue !== void 0 ? defaultValue : 0);
34
25
 
35
- if (isNumber(max) && newValue > max) {
36
- newValue = max;
37
- }
26
+ const isValidValue = valueArg => valueArg >= min && valueArg <= max;
38
27
 
39
- if (isNumber(min) && newValue < min) {
40
- newValue = min;
41
- }
28
+ const handlePlusOrMinus = type => {
29
+ const newValue = type === "plus" ? value + 1 : value - 1;
42
30
 
43
- setStateValue(newValue);
44
- }, [defaultValue, value, min, max]);
45
- const handleMinus = React.useCallback(() => {
46
- if (isNumber(min) && value === min) {
47
- return;
31
+ if (isValidValue(newValue)) {
32
+ setValue(newValue);
33
+ onChange === null || onChange === void 0 ? void 0 : onChange(newValue);
48
34
  }
35
+ };
49
36
 
50
- setStateValue(stateValue - 1);
51
- }, [min, stateValue, value]);
52
- const handlePlus = React.useCallback(() => {
53
- if (isNumber(max) && value === max) {
54
- return;
55
- }
37
+ useEffect(() => {
38
+ if (valueProp != null && isNumber(valueProp) && valueProp !== value && isValidValue(valueProp)) {
39
+ setValue(valueProp);
40
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
56
41
 
57
- setStateValue(stateValue + 1);
58
- }, [max, stateValue, value]);
42
+ }, [valueProp]);
59
43
  return /*#__PURE__*/React.createElement(View, {
60
44
  style: [{
61
45
  flexDirection: "row"
62
- }, style, borderRadius ? {
63
- borderRadius
64
- } : {}]
46
+ }, style]
65
47
  }, /*#__PURE__*/React.createElement(IconButton, {
66
48
  Icon: Icon,
67
49
  icon: "MaterialIcons/remove",
68
- onPress: handleMinus,
50
+ onPress: () => handlePlusOrMinus("minus"),
69
51
  size: iconSize,
70
52
  color: iconColor,
71
- disabled: stateValue === min,
72
- style: stateValue === min ? {
73
- opacity: 0.5
74
- } : {}
53
+ disabled: value === min,
54
+ style: {
55
+ opacity: value === min ? 0.5 : 1
56
+ }
75
57
  }), /*#__PURE__*/React.createElement(Text, {
76
58
  style: [typography.body1, {
77
59
  textAlign: "center",
@@ -79,16 +61,16 @@ const Stepper = _ref => {
79
61
  color: colors.medium,
80
62
  marginHorizontal: 8
81
63
  }, typeStyle]
82
- }, value || stateValue), /*#__PURE__*/React.createElement(IconButton, {
64
+ }, value), /*#__PURE__*/React.createElement(IconButton, {
83
65
  Icon: Icon,
84
66
  icon: "MaterialIcons/add",
85
- onPress: handlePlus,
67
+ onPress: () => handlePlusOrMinus("plus"),
86
68
  size: iconSize,
87
69
  color: iconColor,
88
- disabled: stateValue === max,
89
- style: stateValue === max ? {
90
- opacity: 0.5
91
- } : {}
70
+ disabled: value === max,
71
+ style: {
72
+ opacity: value === max ? 0.5 : 1
73
+ }
92
74
  }));
93
75
  };
94
76
 
@@ -1 +1 @@
1
- {"version":3,"sources":["Stepper.tsx"],"names":["React","View","Text","withTheme","IconButton","isNumber","Stepper","Icon","value","min","max","style","onChange","defaultValue","theme","colors","typography","roundness","iconSize","iconColor","strong","borderRadius","typeStyle","stateValue","setStateValue","useState","useEffect","newValue","handleMinus","useCallback","handlePlus","flexDirection","opacity","body1","textAlign","alignSelf","color","medium","marginHorizontal"],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport { View, Text, StyleProp, ViewStyle, TextStyle } from \"react-native\";\nimport { withTheme } from \"../theming\";\nimport type { Theme } from \"../styles/DefaultTheme\";\nimport type { IconSlot } from \"../interfaces/Icon\";\n\nimport IconButton from \"./IconButton\";\nimport isNumber from \"lodash.isnumber\";\n\ntype Props = {\n value?: number;\n min?: number;\n max?: number;\n theme: Theme;\n style?: StyleProp<ViewStyle>;\n onChange?: (value: number) => void;\n defaultValue?: number;\n iconSize?: number;\n iconColor?: string;\n borderRadius?: number;\n typeStyle?: StyleProp<TextStyle>;\n} & IconSlot;\n\nconst Stepper: React.FC<Props> = ({\n Icon,\n value,\n min,\n max,\n style,\n onChange,\n defaultValue,\n theme: { colors, typography, roundness },\n iconSize = 24,\n iconColor = colors.strong,\n borderRadius = roundness,\n typeStyle,\n}) => {\n const [stateValue, setStateValue] = React.useState(\n value || defaultValue || 0\n );\n\n React.useEffect(() => {\n if (value || value === 0) {\n onChange && onChange(stateValue);\n }\n }, [onChange, stateValue, value]);\n\n React.useEffect(() => {\n let newValue = value || defaultValue || 0;\n if (isNumber(max) && newValue > max) {\n newValue = max;\n }\n if (isNumber(min) && newValue < min) {\n newValue = min;\n }\n setStateValue(newValue);\n }, [defaultValue, value, min, max]);\n\n const handleMinus = React.useCallback(() => {\n if (isNumber(min) && value === min) {\n return;\n }\n setStateValue(stateValue - 1);\n }, [min, stateValue, value]);\n\n const handlePlus = React.useCallback(() => {\n if (isNumber(max) && value === max) {\n return;\n }\n setStateValue(stateValue + 1);\n }, [max, stateValue, value]);\n\n return (\n <View\n style={[\n { flexDirection: \"row\" },\n style,\n borderRadius ? { borderRadius } : {},\n ]}\n >\n <IconButton\n Icon={Icon}\n icon=\"MaterialIcons/remove\"\n onPress={handleMinus}\n size={iconSize}\n color={iconColor}\n disabled={stateValue === min}\n style={stateValue === min ? { opacity: 0.5 } : {}}\n />\n <Text\n style={[\n typography.body1,\n {\n textAlign: \"center\",\n alignSelf: \"center\",\n color: colors.medium,\n marginHorizontal: 8,\n },\n typeStyle,\n ]}\n >\n {value || stateValue}\n </Text>\n <IconButton\n Icon={Icon}\n icon=\"MaterialIcons/add\"\n onPress={handlePlus}\n size={iconSize}\n color={iconColor}\n disabled={stateValue === max}\n style={stateValue === max ? { opacity: 0.5 } : {}}\n />\n </View>\n );\n};\n\nexport default withTheme(Stepper);\n"]}
1
+ {"version":3,"sources":["Stepper.tsx"],"names":["React","useEffect","useState","View","Text","isNumber","withTheme","IconButton","Stepper","min","Infinity","max","value","valueProp","defaultValue","style","typeStyle","iconSize","iconColor","onChange","theme","colors","typography","Icon","setValue","isValidValue","valueArg","handlePlusOrMinus","type","newValue","flexDirection","opacity","body1","textAlign","alignSelf","color","medium","marginHorizontal"],"mappings":"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","sourcesContent":["import React, { FC, useEffect, useState } from \"react\";\nimport { View, Text, StyleProp, ViewStyle, TextStyle } from \"react-native\";\nimport { isNumber } from \"lodash\";\n\nimport { withTheme } from \"../theming\";\nimport type { Theme } from \"../styles/DefaultTheme\";\nimport type { IconSlot } from \"../interfaces/Icon\";\nimport IconButton from \"./IconButton\";\n\ntype Props = {\n min: number;\n max: number;\n value?: number;\n defaultValue?: number;\n style?: StyleProp<ViewStyle>;\n typeStyle?: StyleProp<TextStyle>;\n iconSize: number;\n iconColor?: string;\n onChange?: (value: number) => void;\n theme: Theme;\n} & IconSlot;\n\nconst Stepper: FC<Props> = ({\n min = -Infinity,\n max = Infinity,\n value: valueProp,\n defaultValue,\n style,\n typeStyle,\n iconSize = 24,\n iconColor,\n onChange,\n theme: { colors, typography },\n Icon,\n}) => {\n const [value, setValue] = useState(defaultValue ?? 0);\n\n const isValidValue = (valueArg: number) => valueArg >= min && valueArg <= max;\n\n const handlePlusOrMinus = (type: \"plus\" | \"minus\") => {\n const newValue = type === \"plus\" ? value + 1 : value - 1;\n\n if (isValidValue(newValue)) {\n setValue(newValue);\n onChange?.(newValue);\n }\n };\n\n useEffect(() => {\n if (\n valueProp != null &&\n isNumber(valueProp) &&\n valueProp !== value &&\n isValidValue(valueProp)\n ) {\n setValue(valueProp);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueProp]);\n\n return (\n <View style={[{ flexDirection: \"row\" }, style]}>\n <IconButton\n Icon={Icon}\n icon=\"MaterialIcons/remove\"\n onPress={() => handlePlusOrMinus(\"minus\")}\n size={iconSize}\n color={iconColor}\n disabled={value === min}\n style={{ opacity: value === min ? 0.5 : 1 }}\n />\n\n <Text\n style={[\n typography.body1,\n {\n textAlign: \"center\",\n alignSelf: \"center\",\n color: colors.medium,\n marginHorizontal: 8,\n },\n typeStyle,\n ]}\n >\n {value}\n </Text>\n\n <IconButton\n Icon={Icon}\n icon=\"MaterialIcons/add\"\n onPress={() => handlePlusOrMinus(\"plus\")}\n size={iconSize}\n color={iconColor}\n disabled={value === max}\n style={{ opacity: value === max ? 0.5 : 1 }}\n />\n </View>\n );\n};\n\nexport default withTheme(Stepper);\n"]}
@@ -2,7 +2,7 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
2
2
 
3
3
  /* Copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx */
4
4
  import * as React from "react";
5
- import { Animated, StyleSheet, View, Platform } from "react-native";
5
+ import { Animated, StyleSheet } from "react-native";
6
6
  import shadow from "../styles/shadow";
7
7
  import overlay from "../styles/overlay";
8
8
  import { withTheme } from "../theming";
@@ -18,10 +18,7 @@ const Surface = _ref => {
18
18
  const {
19
19
  elevation: styleElevation = 3,
20
20
  backgroundColor,
21
- borderRadius,
22
- overflow,
23
- height,
24
- width
21
+ ...restStyle
25
22
  } = StyleSheet.flatten(style) || {};
26
23
  const {
27
24
  dark: isDarkTheme,
@@ -42,20 +39,13 @@ const Surface = _ref => {
42
39
  };
43
40
 
44
41
  return /*#__PURE__*/React.createElement(Animated.View, _extends({}, rest, {
45
- style: [style, {
42
+ style: [{
46
43
  backgroundColor: getBackgroundColor(),
47
- overflow: Platform.OS === "web" && overflow === "hidden" ? "hidden" : "visible",
48
44
  elevation,
49
- ...evalationStyles
50
- }]
51
- }), /*#__PURE__*/React.createElement(View, {
52
- style: [{
53
- overflow,
54
- borderRadius,
55
- height,
56
- width
45
+ ...evalationStyles,
46
+ ...restStyle
57
47
  }]
58
- }, children));
48
+ }), children);
59
49
  };
60
50
 
61
51
  export default withTheme(Surface);
@@ -1 +1 @@
1
- {"version":3,"sources":["Surface.tsx"],"names":["React","Animated","StyleSheet","View","Platform","shadow","overlay","withTheme","Surface","elevation","propElevation","style","theme","children","rest","styleElevation","backgroundColor","borderRadius","overflow","height","width","flatten","dark","isDarkTheme","mode","colors","evalationStyles","getBackgroundColor","surface","OS"],"mappings":";;AAAA;AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SACEC,QADF,EAEEC,UAFF,EAMEC,IANF,EAOEC,QAPF,QAQO,cARP;AASA,OAAOC,MAAP,MAAmB,kBAAnB;AACA,OAAOC,OAAP,MAAoB,mBAApB;AACA,SAASC,SAAT,QAA0B,YAA1B;;AASA,MAAMC,OAAwB,GAAG,QAM3B;AAAA,MAN4B;AAChCC,IAAAA,SAAS,EAAEC,aADqB;AAEhCC,IAAAA,KAFgC;AAGhCC,IAAAA,KAHgC;AAIhCC,IAAAA,QAJgC;AAKhC,OAAGC;AAL6B,GAM5B;AACJ,QAAM;AACJL,IAAAA,SAAS,EAAEM,cAAc,GAAG,CADxB;AAEJC,IAAAA,eAFI;AAGJC,IAAAA,YAHI;AAIJC,IAAAA,QAJI;AAKJC,IAAAA,MALI;AAMJC,IAAAA;AANI,MAODlB,UAAU,CAACmB,OAAX,CAAmBV,KAAnB,KAA6B,EAPlC;AASA,QAAM;AAAEW,IAAAA,IAAI,EAAEC,WAAR;AAAqBC,IAAAA,IAArB;AAA2BC,IAAAA;AAA3B,MAAsCb,KAA5C;AAEA,QAAMH,SAAS,GAAGC,aAAa,IAAIK,cAAnC;AAEA,QAAMW,eAAe,GAAGjB,SAAS,GAAGJ,MAAM,CAACI,SAAD,CAAT,GAAuB,EAAxD;;AAEA,QAAMkB,kBAAkB,GAAG,MAAM;AAC/B,QAAIX,eAAJ,EAAqB;AACnB,aAAOA,eAAP;AACD,KAFD,MAEO,IAAIO,WAAW,IAAIC,IAAI,KAAK,UAA5B,EAAwC;AAC7C,aAAOlB,OAAO,CAACG,SAAD,EAAYgB,MAAM,CAACG,OAAnB,CAAd;AACD,KAFM,MAEA;AACL,aAAOH,MAAM,CAACG,OAAd;AACD;AACF,GARD;;AAUA,sBACE,oBAAC,QAAD,CAAU,IAAV,eACMd,IADN;AAEE,IAAA,KAAK,EAAE,CACLH,KADK,EAEL;AACEK,MAAAA,eAAe,EAAEW,kBAAkB,EADrC;AAEET,MAAAA,QAAQ,EACNd,QAAQ,CAACyB,EAAT,KAAgB,KAAhB,IAAyBX,QAAQ,KAAK,QAAtC,GACI,QADJ,GAEI,SALR;AAMET,MAAAA,SANF;AAOE,SAAGiB;AAPL,KAFK;AAFT,mBAeE,oBAAC,IAAD;AACE,IAAA,KAAK,EAAE,CACL;AACER,MAAAA,QADF;AAEED,MAAAA,YAFF;AAGEE,MAAAA,MAHF;AAIEC,MAAAA;AAJF,KADK;AADT,KAUGP,QAVH,CAfF,CADF;AA8BD,CA9DD;;AAgEA,eAAeN,SAAS,CAACC,OAAD,CAAxB","sourcesContent":["/* Copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx */\nimport * as React from \"react\";\nimport {\n Animated,\n StyleSheet,\n ViewProps,\n StyleProp,\n ViewStyle,\n View,\n Platform,\n} from \"react-native\";\nimport shadow from \"../styles/shadow\";\nimport overlay from \"../styles/overlay\";\nimport { withTheme } from \"../theming\";\nimport type { Theme } from \"../styles/DefaultTheme\";\n\ntype Props = {\n elevation?: number;\n style?: StyleProp<ViewStyle>;\n theme: Theme;\n} & ViewProps;\n\nconst Surface: React.FC<Props> = ({\n elevation: propElevation,\n style,\n theme,\n children,\n ...rest\n}) => {\n const {\n elevation: styleElevation = 3,\n backgroundColor,\n borderRadius,\n overflow,\n height,\n width,\n } = (StyleSheet.flatten(style) || {}) as ViewStyle;\n\n const { dark: isDarkTheme, mode, colors } = theme;\n\n const elevation = propElevation || styleElevation;\n\n const evalationStyles = elevation ? shadow(elevation) : {};\n\n const getBackgroundColor = () => {\n if (backgroundColor) {\n return backgroundColor;\n } else if (isDarkTheme && mode === \"adaptive\") {\n return overlay(elevation, colors.surface);\n } else {\n return colors.surface;\n }\n };\n\n return (\n <Animated.View\n {...rest}\n style={[\n style,\n {\n backgroundColor: getBackgroundColor(),\n overflow:\n Platform.OS === \"web\" && overflow === \"hidden\"\n ? \"hidden\"\n : \"visible\",\n elevation,\n ...evalationStyles,\n },\n ]}\n >\n <View\n style={[\n {\n overflow,\n borderRadius,\n height,\n width,\n },\n ]}\n >\n {children}\n </View>\n </Animated.View>\n );\n};\n\nexport default withTheme(Surface);\n"]}
1
+ {"version":3,"sources":["Surface.tsx"],"names":["React","Animated","StyleSheet","shadow","overlay","withTheme","Surface","elevation","propElevation","style","theme","children","rest","styleElevation","backgroundColor","restStyle","flatten","dark","isDarkTheme","mode","colors","evalationStyles","getBackgroundColor","surface"],"mappings":";;AAAA;AACA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SACEC,QADF,EAEEC,UAFF,QAMO,cANP;AAQA,OAAOC,MAAP,MAAmB,kBAAnB;AACA,OAAOC,OAAP,MAAoB,mBAApB;AACA,SAASC,SAAT,QAA0B,YAA1B;;AASA,MAAMC,OAAwB,GAAG,QAM3B;AAAA,MAN4B;AAChCC,IAAAA,SAAS,EAAEC,aADqB;AAEhCC,IAAAA,KAFgC;AAGhCC,IAAAA,KAHgC;AAIhCC,IAAAA,QAJgC;AAKhC,OAAGC;AAL6B,GAM5B;AACJ,QAAM;AACJL,IAAAA,SAAS,EAAEM,cAAc,GAAG,CADxB;AAEJC,IAAAA,eAFI;AAGJ,OAAGC;AAHC,MAIDb,UAAU,CAACc,OAAX,CAAmBP,KAAnB,KAA6B,EAJlC;AAMA,QAAM;AAAEQ,IAAAA,IAAI,EAAEC,WAAR;AAAqBC,IAAAA,IAArB;AAA2BC,IAAAA;AAA3B,MAAsCV,KAA5C;AAEA,QAAMH,SAAS,GAAGC,aAAa,IAAIK,cAAnC;AAEA,QAAMQ,eAAe,GAAGd,SAAS,GAAGJ,MAAM,CAACI,SAAD,CAAT,GAAuB,EAAxD;;AAEA,QAAMe,kBAAkB,GAAG,MAAM;AAC/B,QAAIR,eAAJ,EAAqB;AACnB,aAAOA,eAAP;AACD,KAFD,MAEO,IAAII,WAAW,IAAIC,IAAI,KAAK,UAA5B,EAAwC;AAC7C,aAAOf,OAAO,CAACG,SAAD,EAAYa,MAAM,CAACG,OAAnB,CAAd;AACD,KAFM,MAEA;AACL,aAAOH,MAAM,CAACG,OAAd;AACD;AACF,GARD;;AAUA,sBACE,oBAAC,QAAD,CAAU,IAAV,eACMX,IADN;AAEE,IAAA,KAAK,EAAE,CACL;AACEE,MAAAA,eAAe,EAAEQ,kBAAkB,EADrC;AAEEf,MAAAA,SAFF;AAGE,SAAGc,eAHL;AAIE,SAAGN;AAJL,KADK;AAFT,MAWGJ,QAXH,CADF;AAeD,CA5CD;;AA8CA,eAAeN,SAAS,CAACC,OAAD,CAAxB","sourcesContent":["/* Copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx */\nimport * as React from \"react\";\nimport {\n Animated,\n StyleSheet,\n ViewProps,\n StyleProp,\n ViewStyle,\n} from \"react-native\";\n\nimport shadow from \"../styles/shadow\";\nimport overlay from \"../styles/overlay\";\nimport { withTheme } from \"../theming\";\nimport type { Theme } from \"../styles/DefaultTheme\";\n\ntype Props = {\n elevation?: number;\n style?: StyleProp<ViewStyle>;\n theme: Theme;\n} & ViewProps;\n\nconst Surface: React.FC<Props> = ({\n elevation: propElevation,\n style,\n theme,\n children,\n ...rest\n}) => {\n const {\n elevation: styleElevation = 3,\n backgroundColor,\n ...restStyle\n } = (StyleSheet.flatten(style) || {}) as ViewStyle;\n\n const { dark: isDarkTheme, mode, colors } = theme;\n\n const elevation = propElevation || styleElevation;\n\n const evalationStyles = elevation ? shadow(elevation) : {};\n\n const getBackgroundColor = () => {\n if (backgroundColor) {\n return backgroundColor;\n } else if (isDarkTheme && mode === \"adaptive\") {\n return overlay(elevation, colors.surface);\n } else {\n return colors.surface;\n }\n };\n\n return (\n <Animated.View\n {...rest}\n style={[\n {\n backgroundColor: getBackgroundColor(),\n elevation,\n ...evalationStyles,\n ...restStyle,\n },\n ]}\n >\n {children}\n </Animated.View>\n );\n};\n\nexport default withTheme(Surface);\n"]}
@@ -1,17 +1,17 @@
1
1
  import * as React from "react";
2
2
  import { StyleProp, ViewStyle } from "react-native";
3
3
  import type { Theme } from "../styles/DefaultTheme";
4
- declare type Props = {
5
- hasSafeArea: boolean;
4
+ declare type ScreenContainerProps = {
6
5
  scrollable: boolean;
7
- hasBottomSafeArea: boolean;
6
+ hasSafeArea: boolean;
8
7
  hasTopSafeArea: boolean;
8
+ hasBottomSafeArea: boolean;
9
9
  theme: Theme;
10
10
  style?: StyleProp<ViewStyle>;
11
11
  children?: React.ReactNode;
12
12
  };
13
- declare function ScreenContainer({ hasSafeArea, scrollable, hasBottomSafeArea, hasTopSafeArea, theme, style, children, ...rest }: Props): JSX.Element;
14
- declare const _default: React.ComponentType<import("@draftbit/react-theme-provider").$Without<Props, "theme"> & {
13
+ declare function ScreenContainer({ scrollable, hasSafeArea, hasBottomSafeArea, hasTopSafeArea, theme, style, children, ...rest }: ScreenContainerProps): JSX.Element;
14
+ declare const _default: React.ComponentType<import("@draftbit/react-theme-provider").$Without<ScreenContainerProps, "theme"> & {
15
15
  theme?: import("@draftbit/react-theme-provider").$DeepPartial<any> | undefined;
16
- }> & import("@draftbit/react-theme-provider/typings/hoist-non-react-statics").NonReactStatics<React.ComponentType<Props> & typeof ScreenContainer, {}>;
16
+ }> & import("@draftbit/react-theme-provider/typings/hoist-non-react-statics").NonReactStatics<React.ComponentType<ScreenContainerProps> & typeof ScreenContainer, {}>;
17
17
  export default _default;
@@ -1,19 +1,18 @@
1
- import * as React from "react";
1
+ import React from "react";
2
2
  import { StyleProp, ViewStyle, TextStyle } from "react-native";
3
3
  import type { Theme } from "../styles/DefaultTheme";
4
4
  import type { IconSlot } from "../interfaces/Icon";
5
5
  declare type Props = {
6
+ min: number;
7
+ max: number;
6
8
  value?: number;
7
- min?: number;
8
- max?: number;
9
- theme: Theme;
10
- style?: StyleProp<ViewStyle>;
11
- onChange?: (value: number) => void;
12
9
  defaultValue?: number;
13
- iconSize?: number;
14
- iconColor?: string;
15
- borderRadius?: number;
10
+ style?: StyleProp<ViewStyle>;
16
11
  typeStyle?: StyleProp<TextStyle>;
12
+ iconSize: number;
13
+ iconColor?: string;
14
+ onChange?: (value: number) => void;
15
+ theme: Theme;
17
16
  } & IconSlot;
18
17
  declare const _default: React.ComponentType<import("@draftbit/react-theme-provider").$Without<Props, "theme"> & {
19
18
  theme?: import("@draftbit/react-theme-provider").$DeepPartial<any> | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@draftbit/core",
3
- "version": "43.4.16-cbc807.1+cbc8074b",
3
+ "version": "43.4.17-ab8b1a.0+ab8b1acf",
4
4
  "description": "Core (non-native) Components",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -80,5 +80,5 @@
80
80
  ]
81
81
  ]
82
82
  },
83
- "gitHead": "cbc8074b66f9168d8c24d7b1c6e4b298ad545336"
83
+ "gitHead": "ab8b1acf6dbba1f8e7224cc87ac7c3c7e8a74a4d"
84
84
  }
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
  import { StyleSheet, ScrollView, View, } from "react-native";
3
3
  import { SafeAreaView } from "react-native-safe-area-context";
4
4
  import { withTheme } from "../theming";
5
- function ScreenContainer({ hasSafeArea, scrollable = false, hasBottomSafeArea = false, hasTopSafeArea = false, theme, style, children, ...rest }) {
5
+ function ScreenContainer({ scrollable = false, hasSafeArea = false, hasBottomSafeArea = false, hasTopSafeArea = false, theme, style, children, ...rest }) {
6
6
  const backgroundColor = theme.colors.background;
7
7
  const edges = ["left", "right"];
8
8
  if (hasSafeArea || hasTopSafeArea) {
@@ -11,26 +11,26 @@ import type { Edge } from "react-native-safe-area-context";
11
11
  import { withTheme } from "../theming";
12
12
  import type { Theme } from "../styles/DefaultTheme";
13
13
 
14
- type Props = {
15
- hasSafeArea: boolean;
14
+ type ScreenContainerProps = {
16
15
  scrollable: boolean;
17
- hasBottomSafeArea: boolean;
16
+ hasSafeArea: boolean;
18
17
  hasTopSafeArea: boolean;
18
+ hasBottomSafeArea: boolean;
19
19
  theme: Theme;
20
20
  style?: StyleProp<ViewStyle>;
21
21
  children?: React.ReactNode;
22
22
  };
23
23
 
24
24
  function ScreenContainer({
25
- hasSafeArea,
26
25
  scrollable = false,
26
+ hasSafeArea = false,
27
27
  hasBottomSafeArea = false,
28
28
  hasTopSafeArea = false,
29
29
  theme,
30
30
  style,
31
31
  children,
32
32
  ...rest
33
- }: Props) {
33
+ }: ScreenContainerProps) {
34
34
  const backgroundColor = theme.colors.background;
35
35
 
36
36
  const edges: Edge[] = ["left", "right"];
@@ -1,43 +1,29 @@
1
- import * as React from "react";
1
+ import React, { useEffect, useState } from "react";
2
2
  import { View, Text } from "react-native";
3
+ import { isNumber } from "lodash";
3
4
  import { withTheme } from "../theming";
4
5
  import IconButton from "./IconButton";
5
- import isNumber from "lodash.isnumber";
6
- const Stepper = ({ Icon, value, min, max, style, onChange, defaultValue, theme: { colors, typography, roundness }, iconSize = 24, iconColor = colors.strong, borderRadius = roundness, typeStyle, }) => {
7
- const [stateValue, setStateValue] = React.useState(value || defaultValue || 0);
8
- React.useEffect(() => {
9
- if (value || value === 0) {
10
- onChange && onChange(stateValue);
6
+ const Stepper = ({ min = -Infinity, max = Infinity, value: valueProp, defaultValue, style, typeStyle, iconSize = 24, iconColor, onChange, theme: { colors, typography }, Icon, }) => {
7
+ const [value, setValue] = useState(defaultValue ?? 0);
8
+ const isValidValue = (valueArg) => valueArg >= min && valueArg <= max;
9
+ const handlePlusOrMinus = (type) => {
10
+ const newValue = type === "plus" ? value + 1 : value - 1;
11
+ if (isValidValue(newValue)) {
12
+ setValue(newValue);
13
+ onChange?.(newValue);
11
14
  }
12
- }, [onChange, stateValue, value]);
13
- React.useEffect(() => {
14
- let newValue = value || defaultValue || 0;
15
- if (isNumber(max) && newValue > max) {
16
- newValue = max;
15
+ };
16
+ useEffect(() => {
17
+ if (valueProp != null &&
18
+ isNumber(valueProp) &&
19
+ valueProp !== value &&
20
+ isValidValue(valueProp)) {
21
+ setValue(valueProp);
17
22
  }
18
- if (isNumber(min) && newValue < min) {
19
- newValue = min;
20
- }
21
- setStateValue(newValue);
22
- }, [defaultValue, value, min, max]);
23
- const handleMinus = React.useCallback(() => {
24
- if (isNumber(min) && value === min) {
25
- return;
26
- }
27
- setStateValue(stateValue - 1);
28
- }, [min, stateValue, value]);
29
- const handlePlus = React.useCallback(() => {
30
- if (isNumber(max) && value === max) {
31
- return;
32
- }
33
- setStateValue(stateValue + 1);
34
- }, [max, stateValue, value]);
35
- return (React.createElement(View, { style: [
36
- { flexDirection: "row" },
37
- style,
38
- borderRadius ? { borderRadius } : {},
39
- ] },
40
- React.createElement(IconButton, { Icon: Icon, icon: "MaterialIcons/remove", onPress: handleMinus, size: iconSize, color: iconColor, disabled: stateValue === min, style: stateValue === min ? { opacity: 0.5 } : {} }),
23
+ // eslint-disable-next-line react-hooks/exhaustive-deps
24
+ }, [valueProp]);
25
+ return (React.createElement(View, { style: [{ flexDirection: "row" }, style] },
26
+ React.createElement(IconButton, { Icon: Icon, icon: "MaterialIcons/remove", onPress: () => handlePlusOrMinus("minus"), size: iconSize, color: iconColor, disabled: value === min, style: { opacity: value === min ? 0.5 : 1 } }),
41
27
  React.createElement(Text, { style: [
42
28
  typography.body1,
43
29
  {
@@ -47,7 +33,7 @@ const Stepper = ({ Icon, value, min, max, style, onChange, defaultValue, theme:
47
33
  marginHorizontal: 8,
48
34
  },
49
35
  typeStyle,
50
- ] }, value || stateValue),
51
- React.createElement(IconButton, { Icon: Icon, icon: "MaterialIcons/add", onPress: handlePlus, size: iconSize, color: iconColor, disabled: stateValue === max, style: stateValue === max ? { opacity: 0.5 } : {} })));
36
+ ] }, value),
37
+ React.createElement(IconButton, { Icon: Icon, icon: "MaterialIcons/add", onPress: () => handlePlusOrMinus("plus"), size: iconSize, color: iconColor, disabled: value === max, style: { opacity: value === max ? 0.5 : 1 } })));
52
38
  };
53
39
  export default withTheme(Stepper);
@@ -1,92 +1,75 @@
1
- import * as React from "react";
1
+ import React, { FC, useEffect, useState } from "react";
2
2
  import { View, Text, StyleProp, ViewStyle, TextStyle } from "react-native";
3
+ import { isNumber } from "lodash";
4
+
3
5
  import { withTheme } from "../theming";
4
6
  import type { Theme } from "../styles/DefaultTheme";
5
7
  import type { IconSlot } from "../interfaces/Icon";
6
-
7
8
  import IconButton from "./IconButton";
8
- import isNumber from "lodash.isnumber";
9
9
 
10
10
  type Props = {
11
+ min: number;
12
+ max: number;
11
13
  value?: number;
12
- min?: number;
13
- max?: number;
14
- theme: Theme;
15
- style?: StyleProp<ViewStyle>;
16
- onChange?: (value: number) => void;
17
14
  defaultValue?: number;
18
- iconSize?: number;
19
- iconColor?: string;
20
- borderRadius?: number;
15
+ style?: StyleProp<ViewStyle>;
21
16
  typeStyle?: StyleProp<TextStyle>;
17
+ iconSize: number;
18
+ iconColor?: string;
19
+ onChange?: (value: number) => void;
20
+ theme: Theme;
22
21
  } & IconSlot;
23
22
 
24
- const Stepper: React.FC<Props> = ({
25
- Icon,
26
- value,
27
- min,
28
- max,
29
- style,
30
- onChange,
23
+ const Stepper: FC<Props> = ({
24
+ min = -Infinity,
25
+ max = Infinity,
26
+ value: valueProp,
31
27
  defaultValue,
32
- theme: { colors, typography, roundness },
33
- iconSize = 24,
34
- iconColor = colors.strong,
35
- borderRadius = roundness,
28
+ style,
36
29
  typeStyle,
30
+ iconSize = 24,
31
+ iconColor,
32
+ onChange,
33
+ theme: { colors, typography },
34
+ Icon,
37
35
  }) => {
38
- const [stateValue, setStateValue] = React.useState(
39
- value || defaultValue || 0
40
- );
36
+ const [value, setValue] = useState(defaultValue ?? 0);
41
37
 
42
- React.useEffect(() => {
43
- if (value || value === 0) {
44
- onChange && onChange(stateValue);
45
- }
46
- }, [onChange, stateValue, value]);
38
+ const isValidValue = (valueArg: number) => valueArg >= min && valueArg <= max;
47
39
 
48
- React.useEffect(() => {
49
- let newValue = value || defaultValue || 0;
50
- if (isNumber(max) && newValue > max) {
51
- newValue = max;
52
- }
53
- if (isNumber(min) && newValue < min) {
54
- newValue = min;
55
- }
56
- setStateValue(newValue);
57
- }, [defaultValue, value, min, max]);
40
+ const handlePlusOrMinus = (type: "plus" | "minus") => {
41
+ const newValue = type === "plus" ? value + 1 : value - 1;
58
42
 
59
- const handleMinus = React.useCallback(() => {
60
- if (isNumber(min) && value === min) {
61
- return;
43
+ if (isValidValue(newValue)) {
44
+ setValue(newValue);
45
+ onChange?.(newValue);
62
46
  }
63
- setStateValue(stateValue - 1);
64
- }, [min, stateValue, value]);
47
+ };
65
48
 
66
- const handlePlus = React.useCallback(() => {
67
- if (isNumber(max) && value === max) {
68
- return;
49
+ useEffect(() => {
50
+ if (
51
+ valueProp != null &&
52
+ isNumber(valueProp) &&
53
+ valueProp !== value &&
54
+ isValidValue(valueProp)
55
+ ) {
56
+ setValue(valueProp);
69
57
  }
70
- setStateValue(stateValue + 1);
71
- }, [max, stateValue, value]);
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ }, [valueProp]);
72
60
 
73
61
  return (
74
- <View
75
- style={[
76
- { flexDirection: "row" },
77
- style,
78
- borderRadius ? { borderRadius } : {},
79
- ]}
80
- >
62
+ <View style={[{ flexDirection: "row" }, style]}>
81
63
  <IconButton
82
64
  Icon={Icon}
83
65
  icon="MaterialIcons/remove"
84
- onPress={handleMinus}
66
+ onPress={() => handlePlusOrMinus("minus")}
85
67
  size={iconSize}
86
68
  color={iconColor}
87
- disabled={stateValue === min}
88
- style={stateValue === min ? { opacity: 0.5 } : {}}
69
+ disabled={value === min}
70
+ style={{ opacity: value === min ? 0.5 : 1 }}
89
71
  />
72
+
90
73
  <Text
91
74
  style={[
92
75
  typography.body1,
@@ -99,16 +82,17 @@ const Stepper: React.FC<Props> = ({
99
82
  typeStyle,
100
83
  ]}
101
84
  >
102
- {value || stateValue}
85
+ {value}
103
86
  </Text>
87
+
104
88
  <IconButton
105
89
  Icon={Icon}
106
90
  icon="MaterialIcons/add"
107
- onPress={handlePlus}
91
+ onPress={() => handlePlusOrMinus("plus")}
108
92
  size={iconSize}
109
93
  color={iconColor}
110
- disabled={stateValue === max}
111
- style={stateValue === max ? { opacity: 0.5 } : {}}
94
+ disabled={value === max}
95
+ style={{ opacity: value === max ? 0.5 : 1 }}
112
96
  />
113
97
  </View>
114
98
  );
@@ -1,11 +1,11 @@
1
1
  /* Copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx */
2
2
  import * as React from "react";
3
- import { Animated, StyleSheet, View, Platform, } from "react-native";
3
+ import { Animated, StyleSheet, } from "react-native";
4
4
  import shadow from "../styles/shadow";
5
5
  import overlay from "../styles/overlay";
6
6
  import { withTheme } from "../theming";
7
7
  const Surface = ({ elevation: propElevation, style, theme, children, ...rest }) => {
8
- const { elevation: styleElevation = 3, backgroundColor, borderRadius, overflow, height, width, } = (StyleSheet.flatten(style) || {});
8
+ const { elevation: styleElevation = 3, backgroundColor, ...restStyle } = (StyleSheet.flatten(style) || {});
9
9
  const { dark: isDarkTheme, mode, colors } = theme;
10
10
  const elevation = propElevation || styleElevation;
11
11
  const evalationStyles = elevation ? shadow(elevation) : {};
@@ -21,23 +21,12 @@ const Surface = ({ elevation: propElevation, style, theme, children, ...rest })
21
21
  }
22
22
  };
23
23
  return (React.createElement(Animated.View, { ...rest, style: [
24
- style,
25
24
  {
26
25
  backgroundColor: getBackgroundColor(),
27
- overflow: Platform.OS === "web" && overflow === "hidden"
28
- ? "hidden"
29
- : "visible",
30
26
  elevation,
31
27
  ...evalationStyles,
28
+ ...restStyle,
32
29
  },
33
- ] },
34
- React.createElement(View, { style: [
35
- {
36
- overflow,
37
- borderRadius,
38
- height,
39
- width,
40
- },
41
- ] }, children)));
30
+ ] }, children));
42
31
  };
43
32
  export default withTheme(Surface);