@draftbit/core 46.4.3 → 46.4.4-7f27fb.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 (210) 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/TabView/TabView.js +102 -0
  5. package/lib/commonjs/components/TabView/TabViewItem.js +26 -0
  6. package/lib/commonjs/components/TabView/index.js +23 -0
  7. package/lib/commonjs/index.js +14 -0
  8. package/lib/commonjs/mappings/TabView.js +79 -0
  9. package/lib/module/components/Justification.js +1 -0
  10. package/lib/module/components/ResizeMode.js +1 -0
  11. package/lib/module/components/TabView/TabView.js +87 -0
  12. package/lib/module/components/TabView/TabViewItem.js +18 -0
  13. package/lib/module/components/TabView/index.js +2 -0
  14. package/lib/module/components/ToggleButton.js +17 -3
  15. package/lib/module/index.js +1 -0
  16. package/lib/module/mappings/TabView.js +70 -0
  17. package/lib/typescript/src/components/TabView/TabView.d.ts +19 -0
  18. package/lib/typescript/src/components/TabView/TabViewItem.d.ts +10 -0
  19. package/lib/typescript/src/components/TabView/index.d.ts +2 -0
  20. package/lib/typescript/src/index.d.ts +1 -0
  21. package/lib/typescript/src/mappings/TabView.d.ts +111 -0
  22. package/package.json +6 -4
  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/AnimatedCircularProgress.js +43 -0
  32. package/src/components/AspectRatio.js +18 -0
  33. package/src/components/AvatarEdit.js +30 -0
  34. package/src/components/Banner.js +109 -0
  35. package/src/components/Button.js +114 -0
  36. package/src/components/Card.js +57 -0
  37. package/src/components/CardBlock.js +54 -0
  38. package/src/components/CardContainer.js +69 -0
  39. package/src/components/CardContainerRating.js +79 -0
  40. package/src/components/CardContainerShortImage.js +33 -0
  41. package/src/components/CardInline.js +36 -0
  42. package/src/components/Carousel.js +68 -0
  43. package/src/components/Checkbox/Checkbox.js +63 -0
  44. package/src/components/Checkbox/CheckboxGroup.js +21 -0
  45. package/src/components/Checkbox/CheckboxGroupRow.js +77 -0
  46. package/src/components/Checkbox/CheckboxRow.js +78 -0
  47. package/src/components/Checkbox/context.js +14 -0
  48. package/src/components/Checkbox/index.js +3 -0
  49. package/src/components/CircleImage.js +8 -0
  50. package/src/components/CircularProgress.js +81 -0
  51. package/src/components/Config.js +64 -0
  52. package/src/components/Container.js +43 -0
  53. package/src/components/DatePicker/DatePicker.js +368 -0
  54. package/src/components/DatePicker/DatePickerComponent.js +13 -0
  55. package/src/components/DatePicker/DatePickerComponent.web.js +30 -0
  56. package/src/components/DatePicker/DatePickerComponentType.js +1 -0
  57. package/src/components/DeprecatedButton.js +95 -0
  58. package/src/components/DeprecatedCardWrapper.js +18 -0
  59. package/src/components/DeprecatedFAB.js +115 -0
  60. package/src/components/Divider.js +13 -0
  61. package/src/components/Elevation.js +20 -0
  62. package/src/components/FAB.js +46 -0
  63. package/src/components/FieldSearchBarFull.js +53 -0
  64. package/src/components/FormRow.js +19 -0
  65. package/src/components/Header.js +44 -0
  66. package/src/components/HeaderLarge.js +7 -0
  67. package/src/components/HeaderMedium.js +7 -0
  68. package/src/components/HeaderOverline.js +7 -0
  69. package/src/components/IconButton.js +35 -0
  70. package/src/components/Image.js +47 -0
  71. package/src/components/Justification.js +1 -0
  72. package/src/components/Layout.js +50 -0
  73. package/src/components/NumberInput.js +49 -0
  74. package/src/components/Picker/Picker.js +267 -0
  75. package/src/components/Picker/PickerComponent.android.js +69 -0
  76. package/src/components/Picker/PickerComponent.ios.js +79 -0
  77. package/src/components/Picker/PickerComponent.web.js +70 -0
  78. package/src/components/Picker/PickerTypes.js +1 -0
  79. package/src/components/Portal/Portal.js +35 -0
  80. package/src/components/Portal/PortalConsumer.js +27 -0
  81. package/src/components/Portal/PortalHost.js +107 -0
  82. package/src/components/Portal/PortalManager.js +32 -0
  83. package/src/components/ProgressBar.js +118 -0
  84. package/src/components/ProgressCircle.js +13 -0
  85. package/src/components/ProgressIndicator.js +27 -0
  86. package/src/components/RadioButton/RadioButton.js +17 -0
  87. package/src/components/RadioButton/RadioButtonFieldGroup.js +17 -0
  88. package/src/components/RadioButton/RadioButtonGroup.js +43 -0
  89. package/src/components/RadioButton/RadioButtonRow.js +76 -0
  90. package/src/components/RadioButton/context.js +14 -0
  91. package/src/components/RadioButton/index.js +4 -0
  92. package/src/components/ResizeMode.js +1 -0
  93. package/src/components/Row.js +48 -0
  94. package/src/components/RowBodyIcon.js +8 -0
  95. package/src/components/RowHeadlineImageCaption.js +12 -0
  96. package/src/components/RowHeadlineImageIcon.js +14 -0
  97. package/src/components/SVG.js +13 -0
  98. package/src/components/ScreenContainer.js +34 -0
  99. package/src/components/Slider.js +63 -0
  100. package/src/components/StarRating.js +50 -0
  101. package/src/components/StepIndicator.js +346 -0
  102. package/src/components/Stepper.js +39 -0
  103. package/src/components/Surface.js +32 -0
  104. package/src/components/Swiper/Swiper.js +29 -0
  105. package/src/components/Swiper/SwiperItem.js +9 -0
  106. package/src/components/Swiper/index.js +2 -0
  107. package/src/components/Switch.js +56 -0
  108. package/src/components/TabView/TabView.js +34 -0
  109. package/src/components/TabView/TabView.tsx +97 -0
  110. package/src/components/TabView/TabViewItem.js +5 -0
  111. package/src/components/TabView/TabViewItem.tsx +21 -0
  112. package/src/components/TabView/index.js +2 -0
  113. package/src/components/TabView/index.tsx +2 -0
  114. package/src/components/Text.js +27 -0
  115. package/src/components/TextField.js +423 -0
  116. package/src/components/ToggleButton.js +39 -0
  117. package/src/components/Touchable.js +12 -0
  118. package/src/components/Touchable.web.js +2 -0
  119. package/src/components/Typography.js +36 -0
  120. package/src/components/useAuthState.js +31 -0
  121. package/src/constants.js +10 -0
  122. package/src/hooks.js +12 -0
  123. package/src/index.js +53 -0
  124. package/src/index.tsx +1 -0
  125. package/src/interfaces/Icon.js +8 -0
  126. package/src/mappings/Accordion.js +41 -0
  127. package/src/mappings/AccordionItem.js +16 -0
  128. package/src/mappings/ActionSheet.js +13 -0
  129. package/src/mappings/ActionSheetCancel.js +19 -0
  130. package/src/mappings/ActionSheetItem.js +23 -0
  131. package/src/mappings/ActivityIndicator.js +58 -0
  132. package/src/mappings/AudioPlayer.js +20 -0
  133. package/src/mappings/AvatarEdit.js +38 -0
  134. package/src/mappings/Banner.js +32 -0
  135. package/src/mappings/BlurView.js +42 -0
  136. package/src/mappings/Button.js +87 -0
  137. package/src/mappings/Card.js +52 -0
  138. package/src/mappings/CardBlock.js +123 -0
  139. package/src/mappings/CardContainer.js +104 -0
  140. package/src/mappings/CardContainerRating.js +126 -0
  141. package/src/mappings/CardContainerShortImage.js +120 -0
  142. package/src/mappings/CardInline.js +52 -0
  143. package/src/mappings/Carousel.js +19 -0
  144. package/src/mappings/Checkbox.js +46 -0
  145. package/src/mappings/CheckboxGroup.js +26 -0
  146. package/src/mappings/CheckboxRow.js +61 -0
  147. package/src/mappings/CircleImage.js +25 -0
  148. package/src/mappings/Container.js +30 -0
  149. package/src/mappings/CustomCode.js +8 -0
  150. package/src/mappings/DatePicker.js +157 -0
  151. package/src/mappings/Divider.js +27 -0
  152. package/src/mappings/FAB.js +37 -0
  153. package/src/mappings/Fetch.js +13 -0
  154. package/src/mappings/FieldSearchBarFull.js +50 -0
  155. package/src/mappings/FlashList.js +33 -0
  156. package/src/mappings/FlatList.js +24 -0
  157. package/src/mappings/HeaderLarge.js +29 -0
  158. package/src/mappings/HeaderMedium.js +55 -0
  159. package/src/mappings/HeaderOverline.js +55 -0
  160. package/src/mappings/Icon.js +32 -0
  161. package/src/mappings/IconButton.js +35 -0
  162. package/src/mappings/Image.js +35 -0
  163. package/src/mappings/ImageBackground.js +29 -0
  164. package/src/mappings/KeyboardAvoidingView.js +41 -0
  165. package/src/mappings/KeyboardAwareScrollView.js +50 -0
  166. package/src/mappings/Layout.js +200 -0
  167. package/src/mappings/LinearGradient.js +77 -0
  168. package/src/mappings/MapCallout.js +21 -0
  169. package/src/mappings/MapMarker.js +47 -0
  170. package/src/mappings/MapView.js +139 -0
  171. package/src/mappings/Modal.js +42 -0
  172. package/src/mappings/NumberInput.js +254 -0
  173. package/src/mappings/Picker.js +148 -0
  174. package/src/mappings/ProgressBar.js +101 -0
  175. package/src/mappings/ProgressCircle.js +109 -0
  176. package/src/mappings/ProgressIndicator.js +181 -0
  177. package/src/mappings/RadioButton.js +51 -0
  178. package/src/mappings/RadioButtonGroup.js +17 -0
  179. package/src/mappings/RadioButtonRow.js +42 -0
  180. package/src/mappings/RowBodyIcon.js +75 -0
  181. package/src/mappings/RowHeadlineImageCaption.js +167 -0
  182. package/src/mappings/RowHeadlineImageIcon.js +99 -0
  183. package/src/mappings/SVG.js +20 -0
  184. package/src/mappings/SafeAreaView.js +33 -0
  185. package/src/mappings/ScrollView.js +31 -0
  186. package/src/mappings/Slider.js +60 -0
  187. package/src/mappings/StarRating.js +43 -0
  188. package/src/mappings/Stepper.js +29 -0
  189. package/src/mappings/Surface.js +14 -0
  190. package/src/mappings/Swiper.js +60 -0
  191. package/src/mappings/SwiperItem.js +8 -0
  192. package/src/mappings/Switch.js +81 -0
  193. package/src/mappings/TabView.js +73 -0
  194. package/src/mappings/TabView.ts +80 -0
  195. package/src/mappings/Text.js +251 -0
  196. package/src/mappings/TextArea.js +263 -0
  197. package/src/mappings/TextField.js +381 -0
  198. package/src/mappings/TextInput.js +391 -0
  199. package/src/mappings/ToggleButton.js +50 -0
  200. package/src/mappings/Touchable.js +17 -0
  201. package/src/mappings/Video.js +81 -0
  202. package/src/mappings/View.js +207 -0
  203. package/src/mappings/WebView.js +88 -0
  204. package/src/styles/DarkTheme.js +26 -0
  205. package/src/styles/DefaultTheme.js +111 -0
  206. package/src/styles/fonts.js +62 -0
  207. package/src/styles/overlay.js +60 -0
  208. package/src/styles/shadow.js +51 -0
  209. package/src/theming.js +3 -0
  210. package/src/utilities.js +102 -0
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ interface TabViewItemProps {
3
+ title: string;
4
+ id: string;
5
+ icon: string;
6
+ accessibilityLabel: string;
7
+ children: React.ReactNode;
8
+ }
9
+
10
+ const TabViewItem = ({
11
+ title,
12
+ id,
13
+ icon,
14
+ children,
15
+ accessibilityLabel,
16
+ }: TabViewItemProps) => {
17
+ console.log({ title, id, icon, accessibilityLabel });
18
+ return children;
19
+ };
20
+
21
+ export default TabViewItem;
@@ -0,0 +1,2 @@
1
+ export { default as TabView } from "./TabView";
2
+ export { default as TabViewItem } from "./TabViewItem";
@@ -0,0 +1,2 @@
1
+ export { default as TabView } from "./TabView";
2
+ export { default as TabViewItem } from "./TabViewItem";
@@ -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;
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { Text } from "react-native";
3
+ import { withTheme } from "../theming";
4
+ export const Title = withTheme(({ text, theme, style }) => {
5
+ return (React.createElement(Text, { style: [
6
+ {
7
+ fontSize: 20,
8
+ letterSpacing: 0,
9
+ lineHeight: 26,
10
+ color: theme.colors.text,
11
+ },
12
+ style,
13
+ ] }, text));
14
+ });
15
+ export const Subtitle = withTheme(({ text, theme, style }) => {
16
+ return (React.createElement(Text, { style: [
17
+ {
18
+ fontSize: 14,
19
+ letterSpacing: 0,
20
+ lineHeight: 16,
21
+ color: theme.colors.medium,
22
+ },
23
+ style,
24
+ ] }, text));
25
+ });
26
+ export const Caption = withTheme(({ text, theme, style }) => {
27
+ return (React.createElement(Text, { style: [
28
+ {
29
+ fontSize: 12,
30
+ letterSpacing: 0,
31
+ lineHeight: 14,
32
+ color: theme.colors.light,
33
+ },
34
+ style,
35
+ ] }, text));
36
+ });
@@ -0,0 +1,31 @@
1
+ import * as React from "react";
2
+ export const useAuthState = (auth) => {
3
+ const [error, setError] = React.useState();
4
+ const [value, setValue] = React.useState(auth.currentUser);
5
+ React.useEffect(() => {
6
+ const list = auth.onAuthStateChanged(setValue, setError);
7
+ return () => {
8
+ list();
9
+ };
10
+ }, [auth]);
11
+ const signInWithEmailAndPassword = (user, password) => {
12
+ auth
13
+ .signInWithEmailAndPassword(user, password)
14
+ .then(setValue)
15
+ .catch(setError);
16
+ };
17
+ const createUserWithEmailAndPassword = (user, password) => {
18
+ auth
19
+ .signInWithEmailAndPassword(user, password)
20
+ .then(setValue)
21
+ .catch(setError);
22
+ };
23
+ const signOut = () => auth.signOut();
24
+ return [
25
+ value,
26
+ error,
27
+ signInWithEmailAndPassword,
28
+ signOut,
29
+ createUserWithEmailAndPassword,
30
+ ];
31
+ };
@@ -0,0 +1,10 @@
1
+ import { Platform } from "react-native";
2
+ // @ts-ignore
3
+ const expo = global.__expo;
4
+ const DEFAULT_STATUSBAR_HEIGHT_EXPO = (expo === null || expo === void 0 ? void 0 : expo.Constants)
5
+ ? expo.Constants.statusBarHeight
6
+ : 0;
7
+ export const APPROX_STATUSBAR_HEIGHT = Platform.select({
8
+ android: DEFAULT_STATUSBAR_HEIGHT_EXPO,
9
+ ios: Platform.Version < 11 ? DEFAULT_STATUSBAR_HEIGHT_EXPO : 0,
10
+ });
package/src/hooks.js ADDED
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ export function usePrevious(value) {
3
+ // The ref object is a generic container whose current property is mutable
4
+ // and can hold any value, similar to an instance property on a class
5
+ const ref = React.useRef();
6
+ // Store current value in ref
7
+ React.useEffect(() => {
8
+ ref.current = value;
9
+ }, [value]);
10
+ // Return previous value (happens before update in useEffect above)
11
+ return ref.current;
12
+ }