@draftbit/core 46.4.3 → 46.4.4-3bb5e5.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 (233) hide show
  1. package/lib/commonjs/components/Container.js +17 -5
  2. package/lib/commonjs/components/Justification.js +5 -1
  3. package/lib/commonjs/components/ResizeMode.js +5 -1
  4. package/lib/commonjs/components/Table/Table.js +50 -0
  5. package/lib/commonjs/components/Table/TableCell.js +50 -0
  6. package/lib/commonjs/components/Table/TableHeader.js +41 -0
  7. package/lib/commonjs/components/Table/TablePaginator.js +17 -0
  8. package/lib/commonjs/components/Table/TableRow.js +47 -0
  9. package/lib/commonjs/components/Table/TableTitle.js +60 -0
  10. package/lib/commonjs/components/Table/index.js +55 -0
  11. package/lib/commonjs/index.js +38 -0
  12. package/lib/commonjs/mappings/Table.js +103 -0
  13. package/lib/commonjs/utilities.js +2 -2
  14. package/lib/module/components/Justification.js +1 -0
  15. package/lib/module/components/ResizeMode.js +1 -0
  16. package/lib/module/components/Table/Table.js +23 -0
  17. package/lib/module/components/Table/TableCell.js +37 -0
  18. package/lib/module/components/Table/TableHeader.js +27 -0
  19. package/lib/module/components/Table/TablePaginator.js +6 -0
  20. package/lib/module/components/Table/TableRow.js +33 -0
  21. package/lib/module/components/Table/TableTitle.js +47 -0
  22. package/lib/module/components/Table/index.js +6 -0
  23. package/lib/module/index.js +1 -0
  24. package/lib/module/mappings/Table.js +94 -0
  25. package/lib/module/utilities.js +3 -3
  26. package/lib/typescript/src/components/Table/Table.d.ts +8 -0
  27. package/lib/typescript/src/components/Table/TableCell.d.ts +10 -0
  28. package/lib/typescript/src/components/Table/TableHeader.d.ts +12 -0
  29. package/lib/typescript/src/components/Table/TablePaginator.d.ts +3 -0
  30. package/lib/typescript/src/components/Table/TableRow.d.ts +12 -0
  31. package/lib/typescript/src/components/Table/TableTitle.d.ts +12 -0
  32. package/lib/typescript/src/components/Table/index.d.ts +6 -0
  33. package/lib/typescript/src/index.d.ts +1 -0
  34. package/lib/typescript/src/mappings/Table.d.ts +153 -0
  35. package/lib/typescript/src/utilities.d.ts +3 -3
  36. package/package.json +3 -3
  37. package/src/Provider.js +9 -0
  38. package/src/components/Accordion/AccordionGroup.js +44 -0
  39. package/src/components/Accordion/AccordionItem.js +32 -0
  40. package/src/components/Accordion/index.js +2 -0
  41. package/src/components/ActionSheet/ActionSheet.js +45 -0
  42. package/src/components/ActionSheet/ActionSheetCancel.js +6 -0
  43. package/src/components/ActionSheet/ActionSheetItem.js +30 -0
  44. package/src/components/ActionSheet/index.js +3 -0
  45. package/src/components/AnimatedCircularProgress.js +43 -0
  46. package/src/components/AspectRatio.js +18 -0
  47. package/src/components/AvatarEdit.js +30 -0
  48. package/src/components/Banner.js +109 -0
  49. package/src/components/Button.js +114 -0
  50. package/src/components/Card.js +57 -0
  51. package/src/components/CardBlock.js +54 -0
  52. package/src/components/CardContainer.js +69 -0
  53. package/src/components/CardContainerRating.js +79 -0
  54. package/src/components/CardContainerShortImage.js +33 -0
  55. package/src/components/CardInline.js +36 -0
  56. package/src/components/Carousel.js +68 -0
  57. package/src/components/Checkbox/Checkbox.js +63 -0
  58. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  59. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  60. package/src/components/Checkbox/CheckboxRow.js +78 -0
  61. package/src/components/Checkbox/context.js +14 -0
  62. package/src/components/Checkbox/index.js +3 -0
  63. package/src/components/CircleImage.js +8 -0
  64. package/src/components/CircularProgress.js +81 -0
  65. package/src/components/Config.js +64 -0
  66. package/src/components/Container.js +43 -0
  67. package/src/components/DatePicker/DatePicker.js +368 -0
  68. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  69. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  70. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  71. package/src/components/DeprecatedButton.js +95 -0
  72. package/src/components/DeprecatedCardWrapper.js +18 -0
  73. package/src/components/DeprecatedFAB.js +115 -0
  74. package/src/components/Divider.js +13 -0
  75. package/src/components/Elevation.js +20 -0
  76. package/src/components/FAB.js +46 -0
  77. package/src/components/FieldSearchBarFull.js +53 -0
  78. package/src/components/FormRow.js +19 -0
  79. package/src/components/Header.js +44 -0
  80. package/src/components/HeaderLarge.js +7 -0
  81. package/src/components/HeaderMedium.js +7 -0
  82. package/src/components/HeaderOverline.js +7 -0
  83. package/src/components/IconButton.js +35 -0
  84. package/src/components/Image.js +47 -0
  85. package/src/components/Justification.js +1 -0
  86. package/src/components/Layout.js +50 -0
  87. package/src/components/NumberInput.js +49 -0
  88. package/src/components/Picker/Picker.js +267 -0
  89. package/src/components/Picker/PickerComponent.android.js +69 -0
  90. package/src/components/Picker/PickerComponent.ios.js +79 -0
  91. package/src/components/Picker/PickerComponent.web.js +70 -0
  92. package/src/components/Picker/PickerTypes.js +1 -0
  93. package/src/components/Portal/Portal.js +35 -0
  94. package/src/components/Portal/PortalConsumer.js +27 -0
  95. package/src/components/Portal/PortalHost.js +107 -0
  96. package/src/components/Portal/PortalManager.js +32 -0
  97. package/src/components/ProgressBar.js +118 -0
  98. package/src/components/ProgressCircle.js +13 -0
  99. package/src/components/ProgressIndicator.js +27 -0
  100. package/src/components/RadioButton/RadioButton.js +17 -0
  101. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  102. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  103. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  104. package/src/components/RadioButton/context.js +14 -0
  105. package/src/components/RadioButton/index.js +4 -0
  106. package/src/components/ResizeMode.js +1 -0
  107. package/src/components/Row.js +48 -0
  108. package/src/components/RowBodyIcon.js +8 -0
  109. package/src/components/RowHeadlineImageCaption.js +12 -0
  110. package/src/components/RowHeadlineImageIcon.js +14 -0
  111. package/src/components/SVG.js +13 -0
  112. package/src/components/ScreenContainer.js +34 -0
  113. package/src/components/Slider.js +63 -0
  114. package/src/components/StarRating.js +50 -0
  115. package/src/components/StepIndicator.js +346 -0
  116. package/src/components/Stepper.js +39 -0
  117. package/src/components/Surface.js +32 -0
  118. package/src/components/Swiper/Swiper.js +29 -0
  119. package/src/components/Swiper/SwiperItem.js +9 -0
  120. package/src/components/Swiper/index.js +2 -0
  121. package/src/components/Switch.js +56 -0
  122. package/src/components/Table/Table.js +10 -0
  123. package/src/components/Table/Table.tsx +22 -0
  124. package/src/components/Table/TableCell.js +21 -0
  125. package/src/components/Table/TableCell.tsx +44 -0
  126. package/src/components/Table/TableHeader.js +11 -0
  127. package/src/components/Table/TableHeader.tsx +28 -0
  128. package/src/components/Table/TablePaginator.js +5 -0
  129. package/src/components/Table/TablePaginator.tsx +10 -0
  130. package/src/components/Table/TableRow.js +16 -0
  131. package/src/components/Table/TableRow.tsx +31 -0
  132. package/src/components/Table/TableTitle.js +28 -0
  133. package/src/components/Table/TableTitle.tsx +58 -0
  134. package/src/components/Table/index.js +6 -0
  135. package/src/components/Table/index.tsx +6 -0
  136. package/src/components/Text.js +27 -0
  137. package/src/components/TextField.js +423 -0
  138. package/src/components/ToggleButton.js +39 -0
  139. package/src/components/Touchable.js +12 -0
  140. package/src/components/Touchable.web.js +2 -0
  141. package/src/components/Typography.js +36 -0
  142. package/src/components/useAuthState.js +31 -0
  143. package/src/constants.js +10 -0
  144. package/src/hooks.js +12 -0
  145. package/src/index.js +53 -0
  146. package/src/index.tsx +9 -0
  147. package/src/interfaces/Icon.js +8 -0
  148. package/src/mappings/Accordion.js +41 -0
  149. package/src/mappings/AccordionItem.js +16 -0
  150. package/src/mappings/ActionSheet.js +13 -0
  151. package/src/mappings/ActionSheetCancel.js +19 -0
  152. package/src/mappings/ActionSheetItem.js +23 -0
  153. package/src/mappings/ActivityIndicator.js +58 -0
  154. package/src/mappings/AudioPlayer.js +20 -0
  155. package/src/mappings/AvatarEdit.js +38 -0
  156. package/src/mappings/Banner.js +32 -0
  157. package/src/mappings/BlurView.js +42 -0
  158. package/src/mappings/Button.js +87 -0
  159. package/src/mappings/Card.js +52 -0
  160. package/src/mappings/CardBlock.js +123 -0
  161. package/src/mappings/CardContainer.js +104 -0
  162. package/src/mappings/CardContainerRating.js +126 -0
  163. package/src/mappings/CardContainerShortImage.js +120 -0
  164. package/src/mappings/CardInline.js +52 -0
  165. package/src/mappings/Carousel.js +19 -0
  166. package/src/mappings/Checkbox.js +46 -0
  167. package/src/mappings/CheckboxGroup.js +26 -0
  168. package/src/mappings/CheckboxRow.js +61 -0
  169. package/src/mappings/CircleImage.js +25 -0
  170. package/src/mappings/Container.js +30 -0
  171. package/src/mappings/CustomCode.js +8 -0
  172. package/src/mappings/DatePicker.js +157 -0
  173. package/src/mappings/Divider.js +27 -0
  174. package/src/mappings/FAB.js +37 -0
  175. package/src/mappings/Fetch.js +13 -0
  176. package/src/mappings/FieldSearchBarFull.js +50 -0
  177. package/src/mappings/FlashList.js +33 -0
  178. package/src/mappings/FlatList.js +24 -0
  179. package/src/mappings/HeaderLarge.js +29 -0
  180. package/src/mappings/HeaderMedium.js +55 -0
  181. package/src/mappings/HeaderOverline.js +55 -0
  182. package/src/mappings/Icon.js +32 -0
  183. package/src/mappings/IconButton.js +35 -0
  184. package/src/mappings/Image.js +35 -0
  185. package/src/mappings/ImageBackground.js +29 -0
  186. package/src/mappings/KeyboardAvoidingView.js +41 -0
  187. package/src/mappings/KeyboardAwareScrollView.js +50 -0
  188. package/src/mappings/Layout.js +200 -0
  189. package/src/mappings/LinearGradient.js +77 -0
  190. package/src/mappings/MapCallout.js +21 -0
  191. package/src/mappings/MapMarker.js +47 -0
  192. package/src/mappings/MapView.js +139 -0
  193. package/src/mappings/Modal.js +42 -0
  194. package/src/mappings/NumberInput.js +254 -0
  195. package/src/mappings/Picker.js +148 -0
  196. package/src/mappings/ProgressBar.js +101 -0
  197. package/src/mappings/ProgressCircle.js +109 -0
  198. package/src/mappings/ProgressIndicator.js +181 -0
  199. package/src/mappings/RadioButton.js +51 -0
  200. package/src/mappings/RadioButtonGroup.js +17 -0
  201. package/src/mappings/RadioButtonRow.js +42 -0
  202. package/src/mappings/RowBodyIcon.js +75 -0
  203. package/src/mappings/RowHeadlineImageCaption.js +167 -0
  204. package/src/mappings/RowHeadlineImageIcon.js +99 -0
  205. package/src/mappings/SVG.js +20 -0
  206. package/src/mappings/SafeAreaView.js +33 -0
  207. package/src/mappings/ScrollView.js +31 -0
  208. package/src/mappings/Slider.js +60 -0
  209. package/src/mappings/StarRating.js +43 -0
  210. package/src/mappings/Stepper.js +29 -0
  211. package/src/mappings/Surface.js +14 -0
  212. package/src/mappings/Swiper.js +60 -0
  213. package/src/mappings/SwiperItem.js +8 -0
  214. package/src/mappings/Switch.js +81 -0
  215. package/src/mappings/Table.js +137 -0
  216. package/src/mappings/Table.ts +145 -0
  217. package/src/mappings/Text.js +251 -0
  218. package/src/mappings/TextArea.js +263 -0
  219. package/src/mappings/TextField.js +381 -0
  220. package/src/mappings/TextInput.js +391 -0
  221. package/src/mappings/ToggleButton.js +50 -0
  222. package/src/mappings/Touchable.js +17 -0
  223. package/src/mappings/Video.js +81 -0
  224. package/src/mappings/View.js +207 -0
  225. package/src/mappings/WebView.js +88 -0
  226. package/src/styles/DarkTheme.js +26 -0
  227. package/src/styles/DefaultTheme.js +111 -0
  228. package/src/styles/fonts.js +62 -0
  229. package/src/styles/overlay.js +60 -0
  230. package/src/styles/shadow.js +51 -0
  231. package/src/theming.js +3 -0
  232. package/src/utilities.js +105 -0
  233. package/src/utilities.ts +13 -2
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { View, Text } from "react-native";
3
+
4
+ const TablePaginator = () => (
5
+ <View>
6
+ <Text>Table Paginator</Text>
7
+ </View>
8
+ );
9
+
10
+ export default TablePaginator;
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import { View, StyleSheet } from "react-native";
3
+ import { withTheme } from "../../theming";
4
+ const TableRow = ({ children, style, theme, ...rest }) => (React.createElement(View, { ...rest, style: [styles.container, { borderBottomColor: theme.colors.light }, style] },
5
+ React.createElement(View, { style: styles.content }, children)));
6
+ const styles = StyleSheet.create({
7
+ container: {
8
+ display: "flex",
9
+ flexDirection: "row",
10
+ },
11
+ content: {
12
+ flex: 1,
13
+ flexDirection: "row",
14
+ },
15
+ });
16
+ export default withTheme(TableRow);
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { View, StyleProp, ViewStyle, StyleSheet } from "react-native";
3
+ import { Theme } from "../../styles/DefaultTheme";
4
+ import { withTheme } from "../../theming";
5
+ export interface TableRowProps {
6
+ children: React.ReactNode;
7
+ style?: StyleProp<ViewStyle>;
8
+ theme: Theme;
9
+ }
10
+
11
+ const TableRow = ({ children, style, theme, ...rest }: TableRowProps) => (
12
+ <View
13
+ {...rest}
14
+ style={[styles.container, { borderBottomColor: theme.colors.light }, style]}
15
+ >
16
+ <View style={styles.content}>{children}</View>
17
+ </View>
18
+ );
19
+
20
+ const styles = StyleSheet.create({
21
+ container: {
22
+ display: "flex",
23
+ flexDirection: "row",
24
+ },
25
+ content: {
26
+ flex: 1,
27
+ flexDirection: "row",
28
+ },
29
+ });
30
+
31
+ export default withTheme(TableRow);
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { View, Text, StyleSheet } from "react-native";
3
+ import { extractStyles } from "../../utilities";
4
+ const TableTitle = ({ children, style, numeric = false, isAscending = false, numberOfLines = 1, title, ...rest }) => {
5
+ const { textStyles, viewStyles } = extractStyles(style);
6
+ return (React.createElement(View, { ...rest, style: [styles.wrapper, numeric && styles.right, viewStyles] },
7
+ React.createElement(Text, { style: [isAscending ? styles.sorted : { color: "gray" }, textStyles], numberOfLines: numberOfLines },
8
+ children,
9
+ title)));
10
+ };
11
+ const styles = StyleSheet.create({
12
+ wrapper: {
13
+ flex: 1,
14
+ display: "flex",
15
+ flexDirection: "row",
16
+ },
17
+ right: {
18
+ justifyContent: "flex-end",
19
+ },
20
+ sorted: {
21
+ // marginLeft: 8,
22
+ },
23
+ icon: {
24
+ height: 24,
25
+ justifyContent: "center",
26
+ },
27
+ });
28
+ export default TableTitle;
@@ -0,0 +1,58 @@
1
+ import React from "react";
2
+ import { View, Text, StyleProp, ViewStyle, StyleSheet } from "react-native";
3
+ import { extractStyles } from "../../utilities";
4
+
5
+ export interface TableCellProps {
6
+ children: React.ReactNode;
7
+ numeric?: boolean;
8
+ isAscending: boolean;
9
+ numberOfLines?: number;
10
+ title?: string;
11
+ style?: StyleProp<ViewStyle>;
12
+ }
13
+
14
+ const TableTitle = ({
15
+ children,
16
+ style,
17
+ numeric = false,
18
+ isAscending = false,
19
+ numberOfLines = 1,
20
+ title,
21
+ ...rest
22
+ }: TableCellProps) => {
23
+ const { textStyles, viewStyles } = extractStyles(style);
24
+ return (
25
+ <View
26
+ {...rest}
27
+ style={[styles.wrapper, numeric && styles.right, viewStyles]}
28
+ >
29
+ <Text
30
+ style={[isAscending ? styles.sorted : { color: "gray" }, textStyles]}
31
+ numberOfLines={numberOfLines}
32
+ >
33
+ {children}
34
+ {title}
35
+ </Text>
36
+ </View>
37
+ );
38
+ };
39
+
40
+ const styles = StyleSheet.create({
41
+ wrapper: {
42
+ flex: 1,
43
+ display: "flex",
44
+ flexDirection: "row",
45
+ },
46
+ right: {
47
+ justifyContent: "flex-end",
48
+ },
49
+ sorted: {
50
+ // marginLeft: 8,
51
+ },
52
+ icon: {
53
+ height: 24,
54
+ justifyContent: "center",
55
+ },
56
+ });
57
+
58
+ export default TableTitle;
@@ -0,0 +1,6 @@
1
+ export { default as Table } from "./Table";
2
+ export { default as TableHeader } from "./TableHeader";
3
+ export { default as TablePaginator } from "./TablePaginator";
4
+ export { default as TableRow } from "./TableRow";
5
+ export { default as TableCell } from "./TableCell";
6
+ export { default as TableTitle } from "./TableTitle";
@@ -0,0 +1,6 @@
1
+ export { default as Table } from "./Table";
2
+ export { default as TableHeader } from "./TableHeader";
3
+ export { default as TablePaginator } from "./TablePaginator";
4
+ export { default as TableRow } from "./TableRow";
5
+ export { default as TableCell } from "./TableCell";
6
+ export { default as TableTitle } from "./TableTitle";
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ import { Text as NativeText, I18nManager } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ class Text extends React.Component {
5
+ setNativeProps(args) {
6
+ return this._root && this._root.setNativeProps(args);
7
+ }
8
+ render() {
9
+ const { style, ...rest } = this.props;
10
+ const writingDirection = I18nManager.isRTL ? "rtl" : "ltr";
11
+ return (React.createElement(NativeText, { ...rest, ref: (c) => {
12
+ this._root = c;
13
+ }, style: [
14
+ {
15
+ textAlign: "left",
16
+ writingDirection,
17
+ },
18
+ style,
19
+ ] }));
20
+ }
21
+ }
22
+ export const BaseLink = ({ style, theme, title, ...props }) => {
23
+ return (React.createElement(Text, { hitSlop: 8, style: [{ color: theme.colors.primary }, style], theme: theme, ...props }, title));
24
+ };
25
+ const Link = withTheme(BaseLink);
26
+ export { Link };
27
+ export default withTheme(Text);
@@ -0,0 +1,423 @@
1
+ import * as React from "react";
2
+ import { View, Animated, TextInput as NativeTextInput, StyleSheet, Text, I18nManager, } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ import { applyStyles, extractStyles } from "../utilities";
5
+ const AnimatedText = Animated.createAnimatedComponent(Text);
6
+ const FOCUS_ANIMATION_DURATION = 150;
7
+ const BLUR_ANIMATION_DURATION = 180;
8
+ const ICON_SIZE = 24;
9
+ class TextField extends React.Component {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.state = {
13
+ labeled: new Animated.Value(this.props.value || this.props.error ? 0 : 1),
14
+ focused: false,
15
+ placeholder: this.props.error ? this.props.placeholder : "",
16
+ labelLayout: {
17
+ measured: false,
18
+ width: 0,
19
+ },
20
+ };
21
+ this._timer = setTimeout(() => { }, 0);
22
+ this._showPlaceholder = () => {
23
+ clearTimeout(this._timer);
24
+ // Set the placeholder in a delay to offset the label animation
25
+ // If we show it immediately, they'll overlap and look ugly
26
+ this._timer = setTimeout(() => this.setState({
27
+ placeholder: this.props.placeholder,
28
+ }), 50);
29
+ };
30
+ this._hidePlaceholder = () => this.setState({
31
+ placeholder: "",
32
+ });
33
+ this._restoreLabel = () => Animated.timing(this.state.labeled, {
34
+ toValue: 1,
35
+ duration: FOCUS_ANIMATION_DURATION,
36
+ useNativeDriver: true,
37
+ }).start();
38
+ this._minmizeLabel = () => Animated.timing(this.state.labeled, {
39
+ toValue: 0,
40
+ duration: BLUR_ANIMATION_DURATION,
41
+ useNativeDriver: true,
42
+ }).start();
43
+ this._handleFocus = () => {
44
+ if (this.props.disabled) {
45
+ return;
46
+ }
47
+ this.setState({ focused: true });
48
+ };
49
+ this._handleBlur = () => {
50
+ if (this.props.disabled) {
51
+ return;
52
+ }
53
+ this.setState({ focused: false });
54
+ };
55
+ this._handleChangeText = (value) => {
56
+ if (this.props.disabled) {
57
+ return;
58
+ }
59
+ if (typeof value === "string") {
60
+ this.setState({ value });
61
+ this.props.onChangeText && this.props.onChangeText(value);
62
+ }
63
+ else {
64
+ this.setState({ value: value.nativeEvent.text });
65
+ this.props.onChangeText &&
66
+ this.props.onChangeText(value.nativeEvent.text);
67
+ }
68
+ };
69
+ this._root = undefined;
70
+ }
71
+ static getDerivedStateFromProps(nextProps, prevState) {
72
+ return {
73
+ value: typeof nextProps.value !== "undefined"
74
+ ? nextProps.value
75
+ : prevState.value,
76
+ };
77
+ }
78
+ componentDidMount() {
79
+ if (this.props.defaultValue) {
80
+ this._handleChangeText(this.props.defaultValue);
81
+ }
82
+ if (this.props.placeholder) {
83
+ this._minmizeLabel();
84
+ }
85
+ }
86
+ componentDidUpdate(prevProps, prevState) {
87
+ if (prevState.focused !== this.state.focused ||
88
+ prevState.value !== this.state.value) {
89
+ // The label should be minimized if the text input is focused, or has text
90
+ // In minimized mode, the label moves up and becomes small
91
+ if (this.state.value ||
92
+ this.state.focused ||
93
+ this.props.error ||
94
+ this.props.placeholder) {
95
+ this._minmizeLabel();
96
+ }
97
+ else {
98
+ this._restoreLabel();
99
+ }
100
+ }
101
+ if (prevState.focused !== this.state.focused ||
102
+ prevProps.label !== this.props.label) {
103
+ // Show placeholder text only if the input is focused, or has error, or there's no label
104
+ // We don't show placeholder if there's a label because the label acts as placeholder
105
+ // When focused, the label moves up, so we can show a placeholder
106
+ if (this.state.focused || this.props.error || !this.props.label) {
107
+ this._showPlaceholder();
108
+ }
109
+ else {
110
+ this._hidePlaceholder();
111
+ }
112
+ }
113
+ }
114
+ componentWillUnmount() {
115
+ clearTimeout(this._timer);
116
+ }
117
+ toggleFocus() {
118
+ this.setState((prevState) => ({ focused: !prevState.focused }));
119
+ }
120
+ /**
121
+ * @internal
122
+ */
123
+ setNativeProps(args) {
124
+ return this._root && this._root.setNativeProps(args);
125
+ }
126
+ isFocused() {
127
+ return this._root && this._root.isFocused();
128
+ }
129
+ clear() {
130
+ return this._root && this._root.clear();
131
+ }
132
+ focus() {
133
+ return this._root && this._root.focus();
134
+ }
135
+ blur() {
136
+ return this._root && this._root.blur();
137
+ }
138
+ render() {
139
+ const { Icon, type = "underline", disabled = false, label, error = false, leftIconName, leftIconMode, rightIconName, assistiveText, underlineColor: underlineColorProp, activeBorderColor: activeBorderColorProp, multiline = false, numberOfLines = 4, style, theme: { colors, typography, roundness, disabledOpacity }, render = (props) => React.createElement(NativeTextInput, { ...props }), ...rest } = this.props;
140
+ const MINIMIZED_LABEL_Y_OFFSET = -(typography.caption.lineHeight + 4);
141
+ const OUTLINE_MINIMIZED_LABEL_Y_OFFSET = -(16 * 0.5 + 4);
142
+ const MAXIMIZED_LABEL_FONT_SIZE = typography.subtitle1.fontSize;
143
+ const MINIMIZED_LABEL_FONT_SIZE = typography.caption.fontSize;
144
+ const hasActiveOutline = this.state.focused || error;
145
+ let inputTextColor, activeColor, underlineColor, borderColor, placeholderColor, containerStyle, backgroundColor, inputStyle;
146
+ inputTextColor = colors.strong;
147
+ if (disabled) {
148
+ activeColor = colors.light;
149
+ placeholderColor = colors.light;
150
+ borderColor = "transparent";
151
+ underlineColor = "transparent";
152
+ backgroundColor = colors.divider;
153
+ }
154
+ else {
155
+ activeColor = error ? colors.error : activeBorderColorProp;
156
+ placeholderColor = borderColor = colors.light;
157
+ underlineColor = underlineColorProp;
158
+ backgroundColor = colors.background;
159
+ }
160
+ if (rest.placeholderTextColor) {
161
+ placeholderColor = rest.placeholderTextColor;
162
+ }
163
+ const { lineHeight, ...subtitle1 } = typography.subtitle1;
164
+ inputStyle = {
165
+ paddingVertical: 0,
166
+ color: inputTextColor,
167
+ paddingLeft: leftIconName && leftIconMode === "inset"
168
+ ? ICON_SIZE + 12 + (type === "solid" ? 16 : 0)
169
+ : 0,
170
+ paddingRight: rightIconName ? ICON_SIZE + 16 + 4 : 12,
171
+ ...subtitle1,
172
+ };
173
+ if (!multiline) {
174
+ inputStyle.height = lineHeight;
175
+ }
176
+ let assistiveTextLeftMargin;
177
+ if (type === "underline") {
178
+ containerStyle = {
179
+ borderTopLeftRadius: roundness,
180
+ borderTopRightRadius: roundness,
181
+ paddingBottom: 12,
182
+ marginTop: 16,
183
+ };
184
+ if (leftIconName && leftIconMode === "outset") {
185
+ assistiveTextLeftMargin = ICON_SIZE + 8;
186
+ }
187
+ else {
188
+ assistiveTextLeftMargin = 0;
189
+ }
190
+ }
191
+ else {
192
+ containerStyle = {
193
+ borderRadius: roundness,
194
+ borderColor: hasActiveOutline ? activeColor : borderColor,
195
+ borderWidth: 1,
196
+ paddingTop: label ? 16 * 1.5 : 16,
197
+ paddingBottom: label ? 16 * 0.5 : 16,
198
+ opacity: disabled ? disabledOpacity : 1,
199
+ backgroundColor,
200
+ };
201
+ if (leftIconName && leftIconMode === "inset") {
202
+ assistiveTextLeftMargin = 16 + 4;
203
+ }
204
+ else if (leftIconName && leftIconMode === "outset") {
205
+ assistiveTextLeftMargin = ICON_SIZE + 8 + 12;
206
+ }
207
+ else {
208
+ assistiveTextLeftMargin = 12;
209
+ }
210
+ inputStyle.paddingHorizontal = 12;
211
+ }
212
+ if (leftIconName && leftIconMode === "outset") {
213
+ containerStyle.marginLeft = ICON_SIZE + 8;
214
+ }
215
+ let leftIconColor;
216
+ if (error) {
217
+ leftIconColor = colors.error;
218
+ }
219
+ else if (this.state.focused) {
220
+ leftIconColor = colors.primary;
221
+ }
222
+ else {
223
+ leftIconColor = colors.light;
224
+ }
225
+ const leftIconProps = {
226
+ size: 24,
227
+ color: leftIconColor,
228
+ name: leftIconName || "",
229
+ };
230
+ const leftIconStyle = {
231
+ position: "absolute",
232
+ marginTop: type === "solid"
233
+ ? MINIMIZED_LABEL_FONT_SIZE + 4
234
+ : leftIconMode === "outset"
235
+ ? 16
236
+ : 0,
237
+ marginLeft: leftIconMode === "inset" && type === "solid" ? 16 : 0,
238
+ };
239
+ const labelStyle = {
240
+ ...typography.subtitle1,
241
+ top: type === "solid" ? 16 : 0,
242
+ left: leftIconName && leftIconMode === "inset"
243
+ ? ICON_SIZE + (type === "solid" ? 16 : 12)
244
+ : 0,
245
+ transform: [
246
+ {
247
+ // Move label to top
248
+ translateY: this.state.labeled.interpolate({
249
+ inputRange: [0, 1],
250
+ outputRange: [
251
+ type === "solid"
252
+ ? OUTLINE_MINIMIZED_LABEL_Y_OFFSET
253
+ : MINIMIZED_LABEL_Y_OFFSET,
254
+ 0,
255
+ ],
256
+ }),
257
+ },
258
+ {
259
+ // Make label smaller
260
+ scale: this.state.labeled.interpolate({
261
+ inputRange: [0, 1],
262
+ outputRange: [
263
+ MINIMIZED_LABEL_FONT_SIZE / MAXIMIZED_LABEL_FONT_SIZE,
264
+ 1,
265
+ ],
266
+ }),
267
+ },
268
+ {
269
+ // Offset label scale since RN doesn't support transform origin
270
+ translateX: this.state.labeled.interpolate({
271
+ inputRange: [0, 1],
272
+ outputRange: [
273
+ -(1 - MINIMIZED_LABEL_FONT_SIZE / MAXIMIZED_LABEL_FONT_SIZE) *
274
+ (this.state.labelLayout.width / 2),
275
+ 0,
276
+ ],
277
+ }),
278
+ },
279
+ ],
280
+ };
281
+ const { textStyles } = extractStyles(style);
282
+ const inputStyles = applyStyles([
283
+ styles.input,
284
+ inputStyle,
285
+ type === "solid" ? { marginHorizontal: 12 } : {},
286
+ ], textStyles);
287
+ const { backgroundColor: bgColor, padding, paddingTop, paddingBottom, paddingLeft, paddingRight, borderRadius, borderWidth, borderTopWidth, borderRightWidth, borderBottomWidth, borderLeftWidth, borderColor: borderCol, ...styleProp } = StyleSheet.flatten(style || {});
288
+ return (React.createElement(View, { style: [styles.container, styleProp] },
289
+ leftIconName && leftIconMode === "outset" ? (React.createElement(Icon, { ...leftIconProps, style: leftIconStyle })) : null,
290
+ React.createElement(View, { style: applyStyles([containerStyle], {
291
+ height: style === null || style === void 0 ? void 0 : style.height,
292
+ backgroundColor: bgColor,
293
+ padding,
294
+ paddingTop,
295
+ paddingBottom,
296
+ paddingLeft,
297
+ paddingRight,
298
+ borderRadius,
299
+ borderWidth,
300
+ borderTopWidth,
301
+ borderRightWidth,
302
+ borderBottomWidth,
303
+ borderLeftWidth,
304
+ borderColor: borderCol,
305
+ }) },
306
+ type === "underline" ? (
307
+ // When type === 'flat', render an underline
308
+ React.createElement(Animated.View, { style: [
309
+ styles.underline,
310
+ {
311
+ backgroundColor: bgColor ||
312
+ (error
313
+ ? colors.error
314
+ : this.state.focused
315
+ ? activeColor
316
+ : underlineColor),
317
+ // Underlines is thinner when input is not focused
318
+ transform: [{ scaleY: this.state.focused ? 1 : 0.5 }],
319
+ },
320
+ ] })) : null,
321
+ label ? (
322
+ // Position colored placeholder and gray placeholder on top of each other and crossfade them
323
+ // This gives the effect of animating the color, but allows us to use native driver
324
+ React.createElement(View, { pointerEvents: "none", style: [
325
+ StyleSheet.absoluteFill,
326
+ {
327
+ opacity:
328
+ // Hide the label in minimized state until we measure its width
329
+ this.state.value || this.state.focused
330
+ ? this.state.labelLayout.measured
331
+ ? 1
332
+ : 0
333
+ : 1,
334
+ },
335
+ ] },
336
+ React.createElement(AnimatedText, { onLayout: (e) => this.setState({
337
+ labelLayout: {
338
+ width: e.nativeEvent.layout.width,
339
+ measured: true,
340
+ },
341
+ }), style: [
342
+ styles.placeholder,
343
+ type === "solid" ? { paddingHorizontal: 12 } : {},
344
+ labelStyle,
345
+ {
346
+ color: placeholderColor,
347
+ opacity: this.state.labeled.interpolate({
348
+ inputRange: [0, 1],
349
+ outputRange: [hasActiveOutline ? 1 : 0, 0],
350
+ }),
351
+ },
352
+ ], numberOfLines: 1 }, label),
353
+ React.createElement(AnimatedText, { style: [
354
+ styles.placeholder,
355
+ type === "solid" ? { paddingHorizontal: 12 } : {},
356
+ labelStyle,
357
+ {
358
+ color: placeholderColor,
359
+ opacity: hasActiveOutline ? this.state.labeled : 1,
360
+ },
361
+ ], numberOfLines: 1 }, label))) : null,
362
+ leftIconName && leftIconMode === "inset" ? (React.createElement(View, { style: {
363
+ justifyContent: type === "solid" ? "center" : undefined,
364
+ } },
365
+ React.createElement(Icon, { ...leftIconProps, style: leftIconStyle }))) : null,
366
+ render({
367
+ ref: (c) => {
368
+ this._root = c;
369
+ },
370
+ onChange: this._handleChangeText,
371
+ placeholder: label
372
+ ? this.state.placeholder
373
+ : this.props.placeholder,
374
+ placeholderTextColor: placeholderColor,
375
+ editable: !disabled,
376
+ selectionColor: activeColor,
377
+ multiline,
378
+ numberOfLines,
379
+ onFocus: this._handleFocus,
380
+ onBlur: this._handleBlur,
381
+ underlineColorAndroid: "transparent",
382
+ style: inputStyles,
383
+ ...rest,
384
+ value: this.state.value,
385
+ })),
386
+ rightIconName ? (React.createElement(Icon, { name: rightIconName, size: ICON_SIZE, color: colors.light, style: {
387
+ position: "absolute",
388
+ right: 16,
389
+ marginTop: type === "solid" ? MINIMIZED_LABEL_FONT_SIZE + 4 : 16,
390
+ } })) : null,
391
+ assistiveText ? (React.createElement(Text, { style: [
392
+ {
393
+ color: error ? colors.error : colors.light,
394
+ marginTop: 8,
395
+ marginLeft: assistiveTextLeftMargin,
396
+ },
397
+ ] }, assistiveText)) : null));
398
+ }
399
+ }
400
+ export default withTheme(TextField);
401
+ const styles = StyleSheet.create({
402
+ container: {
403
+ alignSelf: "stretch",
404
+ },
405
+ placeholder: {
406
+ position: "absolute",
407
+ left: 0,
408
+ },
409
+ underline: {
410
+ position: "absolute",
411
+ left: 0,
412
+ right: 0,
413
+ bottom: 0,
414
+ height: 2,
415
+ },
416
+ input: {
417
+ flexGrow: 1,
418
+ justifyContent: "center",
419
+ textAlignVertical: "center",
420
+ margin: 0,
421
+ textAlign: I18nManager.isRTL ? "right" : "left",
422
+ },
423
+ });
@@ -0,0 +1,39 @@
1
+ import * as React from "react";
2
+ import { withTheme } from "../theming";
3
+ import { StyleSheet } from "react-native";
4
+ import IconButton from "./IconButton";
5
+ const ToggleButton = ({ Icon, icon, toggled = false, onPress = () => { }, defaultValue, disabled = false, color = "primary", colorSecondary = "surface", borderColor = "divider", iconSize = 25, width = 50, height = 50, theme: { colors }, style, ...rest }) => {
6
+ const [internalValue, setInternalValue] = React.useState(toggled || defaultValue || false);
7
+ React.useEffect(() => {
8
+ if (toggled != null) {
9
+ setInternalValue(toggled);
10
+ }
11
+ }, [toggled]);
12
+ React.useEffect(() => {
13
+ if (defaultValue != null) {
14
+ setInternalValue(defaultValue);
15
+ }
16
+ }, [defaultValue]);
17
+ const handlePress = () => {
18
+ setInternalValue(!internalValue);
19
+ onPress(!internalValue);
20
+ };
21
+ return (React.createElement(IconButton, { Icon: Icon, icon: icon, size: iconSize, color: internalValue ? colors[color] : colors[colorSecondary], onPress: handlePress, disabled: disabled, style: [
22
+ styles.mainContainer,
23
+ {
24
+ width,
25
+ height,
26
+ backgroundColor: internalValue
27
+ ? colors[colorSecondary]
28
+ : colors[color],
29
+ borderColor: colors[borderColor],
30
+ },
31
+ style,
32
+ ], ...rest }));
33
+ };
34
+ const styles = StyleSheet.create({
35
+ mainContainer: {
36
+ borderWidth: 1,
37
+ },
38
+ });
39
+ export default withTheme(ToggleButton);
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { Pressable } from "react-native";
3
+ export default function Touchable({ children, disabled, onPress, style, ...props }) {
4
+ return (React.createElement(Pressable, { onPress: onPress, disabled: disabled, hitSlop: 8, style: ({ pressed }) => {
5
+ return [
6
+ {
7
+ opacity: pressed || disabled ? 0.75 : 1,
8
+ },
9
+ style,
10
+ ];
11
+ }, ...props }, children));
12
+ }
@@ -0,0 +1,2 @@
1
+ import { TouchableOpacity } from "react-native";
2
+ export default TouchableOpacity;