@draftbit/core 47.0.0-alpha.0 → 47.0.0-ba694d.2

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 (144) hide show
  1. package/lib/commonjs/components/Banner.js +168 -0
  2. package/lib/commonjs/components/Banner.js.map +1 -0
  3. package/lib/commonjs/components/Picker/Picker.js +2 -2
  4. package/lib/commonjs/components/Picker/Picker.js.map +1 -1
  5. package/lib/commonjs/components/Stepper.js +1 -0
  6. package/lib/commonjs/index.js +14 -0
  7. package/lib/commonjs/index.js.map +1 -1
  8. package/lib/commonjs/mappings/View.js.map +1 -1
  9. package/lib/commonjs/mappings/WebView.js.map +1 -1
  10. package/lib/module/components/Banner.js +158 -0
  11. package/lib/module/components/Banner.js.map +1 -0
  12. package/lib/module/components/Picker/Picker.js +1 -1
  13. package/lib/module/components/Picker/Picker.js.map +1 -1
  14. package/lib/module/components/Stepper.js +1 -0
  15. package/lib/module/index.js +2 -0
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/typescript/src/components/Banner.d.ts +23 -0
  18. package/lib/typescript/src/components/Banner.d.ts.map +1 -0
  19. package/lib/typescript/src/components/Picker/Picker.d.ts.map +1 -1
  20. package/lib/typescript/src/index.d.ts +2 -0
  21. package/lib/typescript/src/index.d.ts.map +1 -1
  22. package/package.json +3 -3
  23. package/src/Provider.js +9 -0
  24. package/src/components/Accordion/AccordionGroup.js +44 -0
  25. package/src/components/Accordion/AccordionItem.js +32 -0
  26. package/src/components/Accordion/index.js +2 -0
  27. package/src/components/ActionSheet/ActionSheet.js +45 -0
  28. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  29. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  30. package/src/components/ActionSheet/index.js +3 -0
  31. package/src/components/Banner.js +109 -0
  32. package/src/components/Banner.tsx +204 -0
  33. package/src/components/Button.js +114 -0
  34. package/src/components/Checkbox/Checkbox.js +63 -0
  35. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  36. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  37. package/src/components/Checkbox/CheckboxRow.js +78 -0
  38. package/src/components/Checkbox/context.js +14 -0
  39. package/src/components/Checkbox/index.js +3 -0
  40. package/src/components/Config.js +64 -0
  41. package/src/components/DatePicker/DatePicker.js +368 -0
  42. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  43. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  44. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  45. package/src/components/DeprecatedButton.js +95 -0
  46. package/src/components/Elevation.js +20 -0
  47. package/src/components/FormRow.js +19 -0
  48. package/src/components/IconButton.js +35 -0
  49. package/src/components/Layout.js +50 -0
  50. package/src/components/NumberInput.js +49 -0
  51. package/src/components/Picker/Picker.js +267 -0
  52. package/src/components/Picker/Picker.tsx +2 -2
  53. package/src/components/Picker/PickerComponent.android.js +69 -0
  54. package/src/components/Picker/PickerComponent.ios.js +79 -0
  55. package/src/components/Picker/PickerComponent.web.js +70 -0
  56. package/src/components/Picker/PickerTypes.js +1 -0
  57. package/src/components/Portal/Portal.js +35 -0
  58. package/src/components/Portal/PortalConsumer.js +27 -0
  59. package/src/components/Portal/PortalHost.js +107 -0
  60. package/src/components/Portal/PortalManager.js +32 -0
  61. package/src/components/RadioButton/RadioButton.js +17 -0
  62. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  63. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  64. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  65. package/src/components/RadioButton/context.js +14 -0
  66. package/src/components/RadioButton/index.js +4 -0
  67. package/src/components/SVG.js +13 -0
  68. package/src/components/ScreenContainer.js +34 -0
  69. package/src/components/Slider.js +63 -0
  70. package/src/components/StarRating.js +50 -0
  71. package/src/components/Stepper.js +39 -0
  72. package/src/components/Surface.js +32 -0
  73. package/src/components/Swiper/Swiper.js +29 -0
  74. package/src/components/Swiper/SwiperItem.js +9 -0
  75. package/src/components/Swiper/index.js +2 -0
  76. package/src/components/Switch.js +56 -0
  77. package/src/components/Text.js +33 -0
  78. package/src/components/TextField.js +428 -0
  79. package/src/components/Touchable.js +12 -0
  80. package/src/components/Touchable.web.js +2 -0
  81. package/src/constants.js +10 -0
  82. package/src/hooks.js +12 -0
  83. package/src/index.js +35 -0
  84. package/src/index.tsx +2 -0
  85. package/src/interfaces/Icon.js +8 -0
  86. package/src/mappings/Accordion.js +41 -0
  87. package/src/mappings/AccordionItem.js +16 -0
  88. package/src/mappings/ActionSheet.js +13 -0
  89. package/src/mappings/ActionSheetCancel.js +19 -0
  90. package/src/mappings/ActionSheetItem.js +23 -0
  91. package/src/mappings/ActivityIndicator.js +58 -0
  92. package/src/mappings/AudioPlayer.js +20 -0
  93. package/src/mappings/BlurView.js +42 -0
  94. package/src/mappings/Button.js +87 -0
  95. package/src/mappings/Checkbox.js +46 -0
  96. package/src/mappings/CheckboxGroup.js +26 -0
  97. package/src/mappings/CheckboxRow.js +61 -0
  98. package/src/mappings/CustomCode.js +8 -0
  99. package/src/mappings/DatePicker.js +157 -0
  100. package/src/mappings/Fetch.js +13 -0
  101. package/src/mappings/FlashList.js +33 -0
  102. package/src/mappings/FlatList.js +24 -0
  103. package/src/mappings/Icon.js +32 -0
  104. package/src/mappings/IconButton.js +35 -0
  105. package/src/mappings/Image.js +35 -0
  106. package/src/mappings/ImageBackground.js +29 -0
  107. package/src/mappings/KeyboardAvoidingView.js +41 -0
  108. package/src/mappings/KeyboardAwareScrollView.js +50 -0
  109. package/src/mappings/Layout.js +200 -0
  110. package/src/mappings/LinearGradient.js +77 -0
  111. package/src/mappings/MapCallout.js +21 -0
  112. package/src/mappings/MapMarker.js +47 -0
  113. package/src/mappings/MapView.js +139 -0
  114. package/src/mappings/Modal.js +42 -0
  115. package/src/mappings/NumberInput.js +254 -0
  116. package/src/mappings/Picker.js +148 -0
  117. package/src/mappings/RadioButton.js +51 -0
  118. package/src/mappings/RadioButtonGroup.js +17 -0
  119. package/src/mappings/RadioButtonRow.js +42 -0
  120. package/src/mappings/SVG.js +20 -0
  121. package/src/mappings/SafeAreaView.js +33 -0
  122. package/src/mappings/ScrollView.js +31 -0
  123. package/src/mappings/Slider.js +60 -0
  124. package/src/mappings/StarRating.js +43 -0
  125. package/src/mappings/Stepper.js +29 -0
  126. package/src/mappings/Surface.js +14 -0
  127. package/src/mappings/Swiper.js +60 -0
  128. package/src/mappings/SwiperItem.js +8 -0
  129. package/src/mappings/Switch.js +81 -0
  130. package/src/mappings/Text.js +251 -0
  131. package/src/mappings/TextArea.js +263 -0
  132. package/src/mappings/TextField.js +381 -0
  133. package/src/mappings/TextInput.js +391 -0
  134. package/src/mappings/Touchable.js +17 -0
  135. package/src/mappings/Video.js +81 -0
  136. package/src/mappings/View.js +207 -0
  137. package/src/mappings/WebView.js +88 -0
  138. package/src/styles/DarkTheme.js +26 -0
  139. package/src/styles/DefaultTheme.js +111 -0
  140. package/src/styles/fonts.js +62 -0
  141. package/src/styles/overlay.js +60 -0
  142. package/src/styles/shadow.js +51 -0
  143. package/src/theming.js +3 -0
  144. package/src/utilities.js +102 -0
@@ -0,0 +1,107 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import PortalManager from "./PortalManager";
4
+ export const PortalContext = React.createContext(null);
5
+ /**
6
+ * Portal host renders all of its children `Portal` elements.
7
+ * For example, you can wrap a screen in `Portal.Host` to render items above the screen.
8
+ * If you're using the `Provider` component, it already includes `Portal.Host`.
9
+ *
10
+ * ## Usage
11
+ * ```js
12
+ * import * as React from 'react';
13
+ * import { Text } from 'react-native';
14
+ * import { Portal } from 'react-native-paper';
15
+ *
16
+ * export default class MyComponent extends React.Component {
17
+ * render() {
18
+ * return (
19
+ * <Portal.Host>
20
+ * <Text>Content of the app</Text>
21
+ * </Portal.Host>
22
+ * );
23
+ * }
24
+ * }
25
+ * ```
26
+ *
27
+ * Here any `Portal` elements under `<App />` are rendered alongside `<App />` and will appear above `<App />` like a `Modal`.
28
+ */
29
+ export default class PortalHost extends React.Component {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.setManager = (manager) => {
33
+ this.manager = manager;
34
+ };
35
+ this.mount = (children) => {
36
+ const key = this.nextKey++;
37
+ if (this.manager) {
38
+ this.manager.mount(key, children);
39
+ }
40
+ else {
41
+ this.queue.push({ type: "mount", key, children });
42
+ }
43
+ return key;
44
+ };
45
+ this.update = (key, children) => {
46
+ if (this.manager) {
47
+ this.manager.update(key, children);
48
+ }
49
+ else {
50
+ const op = { type: "mount", key, children };
51
+ const index = this.queue.findIndex((o) => o.type === "mount" || (o.type === "update" && o.key === key));
52
+ if (index > -1) {
53
+ // @ts-ignore
54
+ this.queue[index] = op;
55
+ }
56
+ else {
57
+ this.queue.push(op);
58
+ }
59
+ }
60
+ };
61
+ this.unmount = (key) => {
62
+ if (this.manager) {
63
+ this.manager.unmount(key);
64
+ }
65
+ else {
66
+ this.queue.push({ type: "unmount", key });
67
+ }
68
+ };
69
+ this.nextKey = 0;
70
+ this.queue = [];
71
+ }
72
+ componentDidMount() {
73
+ const manager = this.manager;
74
+ const queue = this.queue;
75
+ while (queue.length && manager) {
76
+ const action = queue.pop();
77
+ if (action) {
78
+ switch (action.type) {
79
+ case "mount":
80
+ manager.mount(action.key, action.children);
81
+ break;
82
+ case "update":
83
+ manager.update(action.key, action.children);
84
+ break;
85
+ case "unmount":
86
+ manager.unmount(action.key);
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ }
92
+ render() {
93
+ return (React.createElement(PortalContext.Provider, { value: {
94
+ mount: this.mount,
95
+ update: this.update,
96
+ unmount: this.unmount,
97
+ } },
98
+ React.createElement(View, { style: styles.container, collapsable: false, pointerEvents: "box-none" }, this.props.children),
99
+ React.createElement(PortalManager, { ref: this.setManager })));
100
+ }
101
+ }
102
+ PortalHost.displayName = "Portal.Host";
103
+ const styles = StyleSheet.create({
104
+ container: {
105
+ flex: 1,
106
+ },
107
+ });
@@ -0,0 +1,32 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ /**
4
+ * Portal host is the component which actually renders all Portals.
5
+ */
6
+ export default class PortalManager extends React.PureComponent {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.state = {
10
+ portals: [],
11
+ };
12
+ this.mount = (key, children) => {
13
+ this.setState((state) => ({
14
+ portals: [...state.portals, { key, children }],
15
+ }));
16
+ };
17
+ this.update = (key, children) => this.setState((state) => ({
18
+ portals: state.portals.map((item) => {
19
+ if (item.key === key) {
20
+ return { ...item, children };
21
+ }
22
+ return item;
23
+ }),
24
+ }));
25
+ this.unmount = (key) => this.setState((state) => ({
26
+ portals: state.portals.filter((item) => item.key !== key),
27
+ }));
28
+ }
29
+ render() {
30
+ return this.state.portals.map(({ key, children }) => (React.createElement(View, { key: key, collapsable: false /* Need collapsable=false here to clip the elevations, otherwise they appear above sibling components */, pointerEvents: "box-none", style: StyleSheet.absoluteFill }, children)));
31
+ }
32
+ }
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ import Config from "../Config";
3
+ import IconButton from "../IconButton";
4
+ import { getValueForRadioButton } from "../../utilities";
5
+ import { useRadioButtonGroupContext } from "./context";
6
+ const RadioButton = ({ Icon, disabled = false, color, value = "", selected, unselectedColor, onPress, size = Config.radioButtonSize, selectedIcon = "MaterialIcons/radio-button-checked", unselectedIcon = "MaterialIcons/radio-button-unchecked", style, ...rest }) => {
7
+ const { value: contextValue, onValueChange } = useRadioButtonGroupContext();
8
+ const realValue = getValueForRadioButton(value);
9
+ const realContextValue = getValueForRadioButton(contextValue);
10
+ const isSelected = selected !== null && selected !== void 0 ? selected : realContextValue === realValue;
11
+ const handlePress = () => {
12
+ onPress === null || onPress === void 0 ? void 0 : onPress(realValue);
13
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(realValue);
14
+ };
15
+ return (React.createElement(IconButton, { Icon: Icon, icon: isSelected ? selectedIcon : unselectedIcon, color: isSelected ? color : unselectedColor, disabled: disabled, onPress: handlePress, size: size, style: style, ...rest }));
16
+ };
17
+ export default RadioButton;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import Text from "../Text";
4
+ import { withTheme } from "../../theming";
5
+ import RadioButtonGroup from "./RadioButtonGroup";
6
+ const RadioButtonFieldGroup = ({ label, children, theme, labelStyle, style, ...rest }) => {
7
+ return (React.createElement(View, { style: style },
8
+ React.createElement(Text, { style: [
9
+ {
10
+ fontSize: theme.typography.headline4.fontSize,
11
+ color: theme.typography.headline4.color,
12
+ },
13
+ labelStyle,
14
+ ] }, label),
15
+ React.createElement(RadioButtonGroup, { theme: theme, ...rest }, children)));
16
+ };
17
+ export default withTheme(RadioButtonFieldGroup);
@@ -0,0 +1,43 @@
1
+ import * as React from "react";
2
+ import { View } from "react-native";
3
+ import { getValueForRadioButton } from "../../utilities";
4
+ import { radioButtonGroupContext, Direction } from "./context";
5
+ const { Provider } = radioButtonGroupContext;
6
+ const RadioButtonGroup = ({ direction = Direction.Vertical, value = "", onValueChange, defaultValue, style, children, ...rest }) => {
7
+ const [internalValue, setInternalValue] = React.useState("");
8
+ React.useEffect(() => {
9
+ if (value != null) {
10
+ const realValue = getValueForRadioButton(value);
11
+ setInternalValue(realValue);
12
+ }
13
+ }, [value]);
14
+ React.useEffect(() => {
15
+ if (defaultValue != null) {
16
+ const realDefaultValue = getValueForRadioButton(defaultValue);
17
+ setInternalValue(realDefaultValue);
18
+ }
19
+ }, [defaultValue]);
20
+ const handleValueChange = (newValue) => {
21
+ const realNewValue = getValueForRadioButton(newValue);
22
+ setInternalValue(realNewValue);
23
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(realNewValue);
24
+ };
25
+ const _containerStyle = [
26
+ {
27
+ flexDirection: direction === Direction.Horizontal ? "row" : "column",
28
+ },
29
+ ];
30
+ if (direction !== Direction.Vertical) {
31
+ _containerStyle.push({
32
+ alignItems: "center",
33
+ });
34
+ }
35
+ return (React.createElement(View, { style: [{ minHeight: 40 }, style], ...rest },
36
+ React.createElement(Provider, { value: {
37
+ value: internalValue,
38
+ onValueChange: handleValueChange,
39
+ direction,
40
+ } },
41
+ React.createElement(View, { style: _containerStyle }, children))));
42
+ };
43
+ export default RadioButtonGroup;
@@ -0,0 +1,76 @@
1
+ import * as React from "react";
2
+ import { StyleSheet, View, Platform, } from "react-native";
3
+ import RadioButton from "./RadioButton";
4
+ import Text from "../Text";
5
+ import { useRadioButtonGroupContext } from "./context";
6
+ import { Direction as GroupDirection } from "./context";
7
+ import Touchable from "../Touchable";
8
+ import { extractStyles, getValueForRadioButton } from "../../utilities";
9
+ export var Direction;
10
+ (function (Direction) {
11
+ Direction["Row"] = "row";
12
+ Direction["RowReverse"] = "row-reverse";
13
+ })(Direction || (Direction = {}));
14
+ const getRadioButtonAlignment = (parentDirection, direction) => {
15
+ if (parentDirection === GroupDirection.Horizontal) {
16
+ return direction === Direction.Row ? "flex-start" : "flex-end";
17
+ }
18
+ else if (direction === Direction.RowReverse) {
19
+ return "flex-start";
20
+ }
21
+ else {
22
+ return "flex-end";
23
+ }
24
+ };
25
+ const renderLabel = (value, labelStyle, textStyle) => {
26
+ if (typeof value === "string") {
27
+ return React.createElement(Text, { style: [labelStyle, textStyle] }, value);
28
+ }
29
+ else {
30
+ return React.createElement(React.Fragment, null, value);
31
+ }
32
+ };
33
+ const RadioButtonRow = ({ Icon, label, value = "", color, unselectedColor, onPress, labelContainerStyle, labelStyle, radioButtonStyle, direction = Direction.Row, selected, disabled, style, ...rest }) => {
34
+ const { value: contextValue, onValueChange, direction: parentDirection, } = useRadioButtonGroupContext();
35
+ const realValue = getValueForRadioButton(value);
36
+ const realContextValue = getValueForRadioButton(contextValue);
37
+ const isSelected = selected !== null && selected !== void 0 ? selected : realContextValue === realValue;
38
+ const handlePress = () => {
39
+ onPress === null || onPress === void 0 ? void 0 : onPress(realValue);
40
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(realValue);
41
+ };
42
+ const { textStyles, viewStyles } = extractStyles(style);
43
+ return (React.createElement(Touchable, { onPress: handlePress, style: [styles.mainParent, { flexDirection: direction }, viewStyles], disabled: disabled, ...rest },
44
+ React.createElement(View, { style: [
45
+ styles.label,
46
+ {
47
+ alignItems: direction === Direction.Row ? "flex-start" : "flex-end",
48
+ },
49
+ labelContainerStyle,
50
+ ] }, renderLabel(label, labelStyle, textStyles)),
51
+ React.createElement(View, { style: {
52
+ flex: 1,
53
+ alignItems: getRadioButtonAlignment(parentDirection, direction),
54
+ } },
55
+ React.createElement(RadioButton, { Icon: Icon, selected: isSelected, value: realValue, color: color, unselectedColor: unselectedColor, style: radioButtonStyle }))));
56
+ };
57
+ const styles = StyleSheet.create({
58
+ mainParent: {
59
+ alignItems: "center",
60
+ justifyContent: "space-around",
61
+ paddingStart: 20,
62
+ minHeight: 50,
63
+ paddingEnd: 20,
64
+ display: "flex",
65
+ ...Platform.select({
66
+ web: {
67
+ cursor: "pointer",
68
+ userSelect: "none",
69
+ },
70
+ }),
71
+ },
72
+ label: {
73
+ flex: 3,
74
+ },
75
+ });
76
+ export default RadioButtonRow;
@@ -0,0 +1,14 @@
1
+ import { createContext, useContext } from "react";
2
+ export var Direction;
3
+ (function (Direction) {
4
+ Direction["Horizontal"] = "horizontal";
5
+ Direction["Vertical"] = "vertical";
6
+ })(Direction || (Direction = {}));
7
+ export const radioButtonGroupContext = createContext({
8
+ onValueChange: () => { },
9
+ value: "",
10
+ direction: undefined,
11
+ });
12
+ export function useRadioButtonGroupContext() {
13
+ return useContext(radioButtonGroupContext);
14
+ }
@@ -0,0 +1,4 @@
1
+ export { default as RadioButton } from "./RadioButton";
2
+ export { default as RadioButtonGroup } from "./RadioButtonGroup";
3
+ export { default as RadioButtonRow } from "./RadioButtonRow";
4
+ export { default as RadioButtonFieldGroup } from "./RadioButtonFieldGroup";
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ import { View, Platform, Image } from "react-native";
3
+ import { SvgUri } from "react-native-svg";
4
+ import Config from "./Config";
5
+ const SVG = ({ source = Config.placeholderSvgURL, style, }) => {
6
+ return (React.createElement(React.Fragment, null,
7
+ Platform.OS === "ios" && (React.createElement(View, { style: style },
8
+ React.createElement(SvgUri, { width: "100%", height: "100%", uri: source }))),
9
+ Platform.OS === "android" && (React.createElement(View, { style: style },
10
+ React.createElement(SvgUri, { width: "100%", height: "100%", uri: source }))),
11
+ Platform.OS === "web" && (React.createElement(Image, { style: style, source: { uri: source } }))));
12
+ };
13
+ export default SVG;
@@ -0,0 +1,34 @@
1
+ import * as React from "react";
2
+ import { StyleSheet, ScrollView, View, } from "react-native";
3
+ import { SafeAreaView } from "react-native-safe-area-context";
4
+ import { withTheme } from "../theming";
5
+ function ScreenContainer({ scrollable = false, hasSafeArea = false, hasBottomSafeArea = false, hasTopSafeArea = false, theme, style, children, ...rest }) {
6
+ const backgroundColor = theme.colors.background;
7
+ const edges = ["left", "right"];
8
+ if (hasSafeArea || hasTopSafeArea) {
9
+ edges.push("top");
10
+ }
11
+ if (hasSafeArea || hasBottomSafeArea) {
12
+ edges.push("bottom");
13
+ }
14
+ return (React.createElement(SafeAreaView, { edges: edges, style: [
15
+ styles.container,
16
+ {
17
+ backgroundColor,
18
+ },
19
+ ], ...rest }, scrollable ? (React.createElement(ScrollView, { contentContainerStyle: [
20
+ styles.scrollViewContainer,
21
+ { backgroundColor },
22
+ style,
23
+ ] }, children)) : (React.createElement(View, { style: [styles.container, { backgroundColor }, style] }, children))));
24
+ }
25
+ const styles = StyleSheet.create({
26
+ container: {
27
+ flex: 1,
28
+ },
29
+ scrollViewContainer: {
30
+ flexGrow: 1,
31
+ flex: undefined,
32
+ },
33
+ });
34
+ export default withTheme(ScreenContainer);
@@ -0,0 +1,63 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import NativeSlider from "@react-native-community/slider";
4
+ import isNumber from "lodash.isnumber";
5
+ import toNumber from "lodash.tonumber";
6
+ import { withTheme } from "../theming";
7
+ function maybeParseValue(value) {
8
+ if (value === undefined) {
9
+ return undefined;
10
+ }
11
+ if (isNumber(value)) {
12
+ return value;
13
+ }
14
+ try {
15
+ const maybe = toNumber(value);
16
+ if (isNumber(maybe)) {
17
+ return maybe;
18
+ }
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ return undefined;
24
+ }
25
+ function Slider({ Icon, leftIcon, rightIcon, leftIconColor, rightIconColor, value, defaultValue, minimumTrackTintColor, maximumTrackTintColor, thumbTintColor, minimumValue = 0, maximumValue = 100, tapToSeek, step = 1, onValueChange = () => { }, style, theme, ...rest }) {
26
+ const [internalValue, setInternalValue] = React.useState(value || defaultValue);
27
+ React.useEffect(() => {
28
+ if (value != null) {
29
+ setInternalValue(value);
30
+ }
31
+ }, [value]);
32
+ React.useEffect(() => {
33
+ if (defaultValue != null) {
34
+ setInternalValue(defaultValue);
35
+ }
36
+ }, [defaultValue]);
37
+ const minTrackColor = minimumTrackTintColor || theme.colors.primary;
38
+ const maxTrackColor = maximumTrackTintColor || theme.colors.light;
39
+ const thumbColor = thumbTintColor || theme.colors.primary;
40
+ const leftIconThemeColor = leftIconColor || theme.colors.light;
41
+ const rightIconThemeColor = rightIconColor || theme.colors.light;
42
+ const parsedValue = maybeParseValue(internalValue);
43
+ const handleSlidingComplete = (newValue) => {
44
+ setInternalValue(newValue);
45
+ onValueChange(newValue);
46
+ };
47
+ return (React.createElement(View, { style: [styles.container, style], ...rest },
48
+ leftIcon ? (React.createElement(Icon, { color: leftIconThemeColor, name: leftIcon, size: 24 })) : null,
49
+ React.createElement(NativeSlider, { value: parsedValue, step: step, minimumValue: minimumValue, maximumValue: maximumValue, tapToSeek: tapToSeek, minimumTrackTintColor: minTrackColor, maximumTrackTintColor: maxTrackColor, thumbTintColor: thumbColor, onSlidingComplete: handleSlidingComplete, style: styles.slider }),
50
+ rightIcon ? (React.createElement(Icon, { color: rightIconThemeColor, name: rightIcon, size: 24 })) : null));
51
+ }
52
+ const styles = StyleSheet.create({
53
+ container: {
54
+ height: 40,
55
+ flexDirection: "row",
56
+ alignItems: "center",
57
+ },
58
+ slider: {
59
+ flex: 1,
60
+ marginHorizontal: 12,
61
+ },
62
+ });
63
+ export default withTheme(Slider);
@@ -0,0 +1,50 @@
1
+ import * as React from "react";
2
+ import { View, StyleSheet, Pressable, } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ const StarRating = ({ Icon, starSize = 16, maxStars = 5, rating = 0, defaultValue, isEditable = false, activeColor, inactiveColor, style, onPress, ...rest }) => {
5
+ const [localRating, setLocalRating] = React.useState(rating || defaultValue || 0);
6
+ React.useEffect(() => {
7
+ if (rating != null) {
8
+ setLocalRating(rating);
9
+ }
10
+ }, [rating]);
11
+ React.useEffect(() => {
12
+ if (defaultValue != null) {
13
+ setLocalRating(defaultValue);
14
+ }
15
+ }, [defaultValue]);
16
+ const ratingHandler = React.useCallback((r) => {
17
+ setLocalRating(r);
18
+ !!onPress && onPress(r);
19
+ }, [onPress]);
20
+ const ratingRounded = Math.round(localRating * 2) / 2;
21
+ return (React.createElement(View, { style: [styles.container, style], ...rest }, [...Array(maxStars)].map((_, i) => (React.createElement(View, { key: i, style: { display: "flex" } },
22
+ React.createElement(Icon, { name: ratingRounded - i === 0.5
23
+ ? "MaterialIcons/star-half"
24
+ : "MaterialIcons/star", size: starSize, color: ratingRounded > i ? activeColor : inactiveColor }),
25
+ isEditable && (React.createElement(View, { style: styles.touchContainer },
26
+ React.createElement(Pressable, { style: styles.pressable, onPress: () => ratingHandler(i + 0.5) }),
27
+ React.createElement(Pressable, { style: styles.pressable, onPress: () => ratingHandler(i + 1) }))))))));
28
+ };
29
+ const styles = StyleSheet.create({
30
+ container: {
31
+ flexDirection: "row",
32
+ alignItems: "center",
33
+ },
34
+ touchContainer: {
35
+ display: "flex",
36
+ flexDirection: "row",
37
+ position: "absolute",
38
+ top: 0,
39
+ right: 0,
40
+ left: 0,
41
+ bottom: 0,
42
+ zIndex: 1,
43
+ },
44
+ pressable: {
45
+ flex: 1,
46
+ height: "100%",
47
+ width: "50%",
48
+ },
49
+ });
50
+ export default withTheme(StarRating);
@@ -0,0 +1,39 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { View, Text } from "react-native";
3
+ import { isNumber } from "lodash";
4
+ import { withTheme } from "../theming";
5
+ import IconButton from "./IconButton";
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 !== null && defaultValue !== void 0 ? 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 === null || onChange === void 0 ? void 0 : onChange(newValue);
14
+ }
15
+ };
16
+ useEffect(() => {
17
+ if (valueProp != null &&
18
+ isNumber(valueProp) &&
19
+ valueProp !== value &&
20
+ isValidValue(valueProp)) {
21
+ setValue(valueProp);
22
+ }
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 } }),
27
+ React.createElement(Text, { style: [
28
+ typography.body1,
29
+ {
30
+ textAlign: "center",
31
+ alignSelf: "center",
32
+ color: colors.medium,
33
+ marginHorizontal: 8,
34
+ },
35
+ typeStyle,
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 } })));
38
+ };
39
+ export default withTheme(Stepper);
@@ -0,0 +1,32 @@
1
+ /* Copied from https://github.com/callstack/react-native-paper/blob/main/src/components/Surface.tsx */
2
+ import * as React from "react";
3
+ import { Animated, StyleSheet, } from "react-native";
4
+ import shadow from "../styles/shadow";
5
+ import overlay from "../styles/overlay";
6
+ import { withTheme } from "../theming";
7
+ const Surface = ({ elevation: propElevation, style, theme, children, ...rest }) => {
8
+ const { elevation: styleElevation = 3, backgroundColor, ...restStyle } = (StyleSheet.flatten(style) || {});
9
+ const { dark: isDarkTheme, mode, colors } = theme;
10
+ const elevation = propElevation || styleElevation;
11
+ const evalationStyles = elevation ? shadow(elevation) : {};
12
+ const getBackgroundColor = () => {
13
+ if (backgroundColor) {
14
+ return backgroundColor;
15
+ }
16
+ else if (isDarkTheme && mode === "adaptive") {
17
+ return overlay(elevation, colors.surface);
18
+ }
19
+ else {
20
+ return colors.surface;
21
+ }
22
+ };
23
+ return (React.createElement(Animated.View, { ...rest, style: [
24
+ {
25
+ backgroundColor: getBackgroundColor(),
26
+ elevation,
27
+ ...evalationStyles,
28
+ ...restStyle,
29
+ },
30
+ ] }, children));
31
+ };
32
+ export default withTheme(Surface);
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import SwiperComponent from "react-native-web-swiper";
4
+ const Swiper = ({ vertical = false, loop = false, timeout = 0, from = 0, prevTitle = "", nextTitle = "", prevTitleColor, nextTitleColor, dotsTouchable = true, dotColor, dotActiveColor, data, keyExtractor, renderItem, children, style, }) => (React.createElement(View, { style: style },
5
+ React.createElement(SwiperComponent, { from: from, loop: loop, timeout: timeout, vertical: vertical, controlsProps: {
6
+ prevTitle,
7
+ nextTitle,
8
+ prevTitleStyle: { color: prevTitleColor },
9
+ nextTitleStyle: { color: nextTitleColor },
10
+ dotsTouchable,
11
+ ...(dotColor
12
+ ? { dotProps: { badgeStyle: { backgroundColor: dotColor } } }
13
+ : {}),
14
+ ...(dotActiveColor
15
+ ? { dotActiveStyle: { backgroundColor: dotActiveColor } }
16
+ : {}),
17
+ } }, data && renderItem
18
+ ? data.map((item, index) => {
19
+ const component = renderItem({ item, index });
20
+ if (!component) {
21
+ return null;
22
+ }
23
+ const key = keyExtractor ? keyExtractor(item, index) : index;
24
+ return React.cloneElement(component, {
25
+ key,
26
+ });
27
+ })
28
+ : children)));
29
+ export default Swiper;
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ const styles = StyleSheet.create({
4
+ wrapper: {
5
+ flex: 1,
6
+ },
7
+ });
8
+ const SwiperItem = ({ children, style }) => (React.createElement(View, { style: [styles.wrapper, style] }, children));
9
+ export default SwiperItem;
@@ -0,0 +1,2 @@
1
+ export { default as Swiper } from "./Swiper";
2
+ export { default as SwiperItem } from "./SwiperItem";
@@ -0,0 +1,56 @@
1
+ import * as React from "react";
2
+ import { Switch as NativeSwitch, } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ import FormRow from "./FormRow";
5
+ import { RowDirection } from "@draftbit/types";
6
+ import { usePrevious } from "../hooks";
7
+ function Switch({ value, defaultValue, disabled, onValueChange, activeTrackColor, inactiveTrackColor, activeThumbColor, inactiveThumbColor, theme, style, ...rest }) {
8
+ const activeTrackThemeColor = activeTrackColor || theme.colors.primary;
9
+ const inactiveTrackThemeColor = inactiveTrackColor || "#EEE";
10
+ const activeThumbThemeColor = activeThumbColor || "#FFF";
11
+ const inactiveThumbThemeColor = inactiveThumbColor || "#FFF";
12
+ const [checked, setChecked] = React.useState(value || defaultValue);
13
+ React.useEffect(() => {
14
+ if (value != null && value !== checked) {
15
+ setChecked(value);
16
+ }
17
+ }, [value, checked]);
18
+ // This special logic is to handle weird APIs like Airtable that return
19
+ // true or undefined for a boolean
20
+ const previousDefaultValue = usePrevious(defaultValue);
21
+ React.useEffect(() => {
22
+ if (defaultValue !== previousDefaultValue) {
23
+ setChecked(Boolean(defaultValue));
24
+ }
25
+ }, [defaultValue, previousDefaultValue]);
26
+ return (React.createElement(NativeSwitch, { value: checked, disabled: disabled, trackColor: {
27
+ false: inactiveTrackThemeColor,
28
+ true: activeTrackThemeColor,
29
+ }, thumbColor: value ? activeThumbThemeColor : inactiveThumbThemeColor,
30
+ // @ts-ignore react-native-web only
31
+ activeThumbColor: activeThumbThemeColor, ios_backgroundColor: inactiveTrackThemeColor, style: style, onValueChange: (bool) => {
32
+ setChecked(bool);
33
+ onValueChange && onValueChange(bool);
34
+ }, ...rest }));
35
+ }
36
+ function Row({ label = "Label", direction = RowDirection.Row, style, value, defaultValue, disabled, onValueChange, activeTrackColor, inactiveTrackColor, activeThumbColor, inactiveThumbColor, theme, ...rest }) {
37
+ const [checked, setChecked] = React.useState(value != null ? value : defaultValue);
38
+ React.useEffect(() => {
39
+ if (value != null) {
40
+ setChecked(value);
41
+ }
42
+ }, [value]);
43
+ React.useEffect(() => {
44
+ if (defaultValue != null) {
45
+ setChecked(defaultValue);
46
+ }
47
+ }, [defaultValue]);
48
+ return (React.createElement(FormRow, { disabled: disabled, onPress: () => {
49
+ setChecked(!checked);
50
+ onValueChange && onValueChange(!checked);
51
+ }, label: label, direction: direction, style: style, ...rest },
52
+ React.createElement(Switch, { theme: theme, value: checked, disabled: disabled, onValueChange: onValueChange, activeTrackColor: activeTrackColor, inactiveTrackColor: inactiveTrackColor, activeThumbColor: activeThumbColor, inactiveThumbColor: inactiveThumbColor })));
53
+ }
54
+ const SwitchRow = withTheme(Row);
55
+ export { SwitchRow };
56
+ export default withTheme(Switch);