@chem-po/react-native 0.0.47 → 0.0.49

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 (250) hide show
  1. package/lib/commonjs/components/box/Center.js.map +1 -1
  2. package/lib/commonjs/components/box/CollapseHorizontal.js.map +1 -1
  3. package/lib/commonjs/components/box/ContentBox.js.map +1 -1
  4. package/lib/commonjs/components/box/DropShadow.js.map +1 -1
  5. package/lib/commonjs/components/box/ExpandOnMount.js.map +1 -1
  6. package/lib/commonjs/components/box/Expandable.js.map +1 -1
  7. package/lib/commonjs/components/box/FullSizeContainer.js.map +1 -1
  8. package/lib/commonjs/components/box/index.js.map +1 -1
  9. package/lib/commonjs/components/button/ActionButton.js +5 -3
  10. package/lib/commonjs/components/button/ActionButton.js.map +1 -1
  11. package/lib/commonjs/components/button/ButtonText.js.map +1 -1
  12. package/lib/commonjs/components/button/DeleteButton.js +7 -2
  13. package/lib/commonjs/components/button/DeleteButton.js.map +1 -1
  14. package/lib/commonjs/components/button/LoadingButton.js.map +1 -1
  15. package/lib/commonjs/components/button/Toggle.js.map +1 -1
  16. package/lib/commonjs/components/button/hooks.js.map +1 -1
  17. package/lib/commonjs/components/button/index.js.map +1 -1
  18. package/lib/commonjs/components/feed/FeedContentPane.js.map +1 -1
  19. package/lib/commonjs/components/feed/MediaFeed.js.map +1 -1
  20. package/lib/commonjs/components/feed/MediaFeedBackground.js.map +1 -1
  21. package/lib/commonjs/components/feed/MediaFeedRefresh.js.map +1 -1
  22. package/lib/commonjs/components/feed/constants.js.map +1 -1
  23. package/lib/commonjs/components/feed/context.js.map +1 -1
  24. package/lib/commonjs/components/feed/hooks.js.map +1 -1
  25. package/lib/commonjs/components/feed/index.js.map +1 -1
  26. package/lib/commonjs/components/form/Condition.js.map +1 -1
  27. package/lib/commonjs/components/form/Field.js.map +1 -1
  28. package/lib/commonjs/components/form/Form.js +9 -4
  29. package/lib/commonjs/components/form/Form.js.map +1 -1
  30. package/lib/commonjs/components/form/FormFooter.js.map +1 -1
  31. package/lib/commonjs/components/form/UploadProgress/index.js.map +1 -1
  32. package/lib/commonjs/components/form/index.js.map +1 -1
  33. package/lib/commonjs/components/form/input/Editable.js +51 -17
  34. package/lib/commonjs/components/form/input/Editable.js.map +1 -1
  35. package/lib/commonjs/components/form/input/InputSlider.js.map +1 -1
  36. package/lib/commonjs/components/form/input/OptionalTag.js.map +1 -1
  37. package/lib/commonjs/components/form/input/StandaloneInput.js.map +1 -1
  38. package/lib/commonjs/components/form/input/boolean/index.js +3 -2
  39. package/lib/commonjs/components/form/input/boolean/index.js.map +1 -1
  40. package/lib/commonjs/components/form/input/color/index.js.map +1 -1
  41. package/lib/commonjs/components/form/input/common/InputClearButton.js.map +1 -1
  42. package/lib/commonjs/components/form/input/date/index.js.map +1 -1
  43. package/lib/commonjs/components/form/input/datetime/index.js.map +1 -1
  44. package/lib/commonjs/components/form/input/file/index.js +3 -1
  45. package/lib/commonjs/components/form/input/file/index.js.map +1 -1
  46. package/lib/commonjs/components/form/input/hooks/index.js.map +1 -1
  47. package/lib/commonjs/components/form/input/hooks/useInputColor.js.map +1 -1
  48. package/lib/commonjs/components/form/input/hooks/useInputImperativeHandle.js.map +1 -1
  49. package/lib/commonjs/components/form/input/hooks/useInputStyles.js.map +1 -1
  50. package/lib/commonjs/components/form/input/index.js.map +1 -1
  51. package/lib/commonjs/components/form/input/input.js.map +1 -1
  52. package/lib/commonjs/components/form/input/multipleSelect/index.js.map +1 -1
  53. package/lib/commonjs/components/form/input/number/index.js.map +1 -1
  54. package/lib/commonjs/components/form/input/select/index.js.map +1 -1
  55. package/lib/commonjs/components/form/input/socialMedia/index.js.map +1 -1
  56. package/lib/commonjs/components/form/input/text/AutoResizeTextarea.js.map +1 -1
  57. package/lib/commonjs/components/form/input/text/index.js.map +1 -1
  58. package/lib/commonjs/components/form/input/text/textarea.js.map +1 -1
  59. package/lib/commonjs/components/form/input/text/useWebAutoResize.js.map +1 -1
  60. package/lib/commonjs/components/form/input/time/index.js.map +1 -1
  61. package/lib/commonjs/components/form/types.js.map +1 -1
  62. package/lib/commonjs/components/form/view/file.js.map +1 -1
  63. package/lib/commonjs/components/form/view/index.js.map +1 -1
  64. package/lib/commonjs/components/form/view/multipleSelect.js.map +1 -1
  65. package/lib/commonjs/components/form/view/select.js.map +1 -1
  66. package/lib/commonjs/components/form/view/styles.js.map +1 -1
  67. package/lib/commonjs/components/icons/index.js.map +1 -1
  68. package/lib/commonjs/components/image/ImageViewModal.js.map +1 -1
  69. package/lib/commonjs/components/image/index.js.map +1 -1
  70. package/lib/commonjs/components/index.js.map +1 -1
  71. package/lib/commonjs/components/layout/CollapseHorizontal.js.map +1 -1
  72. package/lib/commonjs/components/loading/CircularProgress.js.map +1 -1
  73. package/lib/commonjs/components/loading/Loading.js.map +1 -1
  74. package/lib/commonjs/components/loading/LoadingImage.js.map +1 -1
  75. package/lib/commonjs/components/loading/LoadingOverlay.js +6 -1
  76. package/lib/commonjs/components/loading/LoadingOverlay.js.map +1 -1
  77. package/lib/commonjs/components/loading/LoadingSwitch.js.map +1 -1
  78. package/lib/commonjs/components/loading/ProgressBar.js.map +1 -1
  79. package/lib/commonjs/components/loading/index.js.map +1 -1
  80. package/lib/commonjs/components/text/AnimatedText.js +5 -3
  81. package/lib/commonjs/components/text/AnimatedText.js.map +1 -1
  82. package/lib/commonjs/components/text/Txt.js.map +1 -1
  83. package/lib/commonjs/components/text/index.js.map +1 -1
  84. package/lib/commonjs/components/theme/colorMode/DarkModeToggle.js.map +1 -1
  85. package/lib/commonjs/components/theme/colorMode/index.js.map +1 -1
  86. package/lib/commonjs/components/theme/index.js.map +1 -1
  87. package/lib/commonjs/constants/index.js.map +1 -1
  88. package/lib/commonjs/constants/toast.js.map +1 -1
  89. package/lib/commonjs/contexts/fonts.js.map +1 -1
  90. package/lib/commonjs/contexts/index.js.map +1 -1
  91. package/lib/commonjs/contexts/root.js +3 -0
  92. package/lib/commonjs/contexts/root.js.map +1 -1
  93. package/lib/commonjs/hooks/index.js.map +1 -1
  94. package/lib/commonjs/hooks/useFadeIn.js.map +1 -1
  95. package/lib/commonjs/hooks/useFont.js.map +1 -1
  96. package/lib/commonjs/hooks/useRefreshFontScale.js +33 -0
  97. package/lib/commonjs/hooks/useRefreshFontScale.js.map +1 -0
  98. package/lib/commonjs/hooks/useThemeState.js.map +1 -1
  99. package/lib/commonjs/index.js.map +1 -1
  100. package/lib/commonjs/store/index.js +11 -0
  101. package/lib/commonjs/store/index.js.map +1 -1
  102. package/lib/commonjs/store/useFontScale.js +14 -0
  103. package/lib/commonjs/store/useFontScale.js.map +1 -0
  104. package/lib/commonjs/store/useScreen.js.map +1 -1
  105. package/lib/commonjs/styles/fill.js.map +1 -1
  106. package/lib/commonjs/types/forms.js.map +1 -1
  107. package/lib/commonjs/types/index.js.map +1 -1
  108. package/lib/commonjs/utils/downloadFile.js.map +1 -1
  109. package/lib/commonjs/utils/downloadFileLegacy.js.map +1 -1
  110. package/lib/module/components/box/Center.js.map +1 -1
  111. package/lib/module/components/box/CollapseHorizontal.js.map +1 -1
  112. package/lib/module/components/box/ContentBox.js.map +1 -1
  113. package/lib/module/components/box/DropShadow.js.map +1 -1
  114. package/lib/module/components/box/ExpandOnMount.js.map +1 -1
  115. package/lib/module/components/box/Expandable.js.map +1 -1
  116. package/lib/module/components/box/FullSizeContainer.js.map +1 -1
  117. package/lib/module/components/box/index.js.map +1 -1
  118. package/lib/module/components/button/ActionButton.js +5 -3
  119. package/lib/module/components/button/ActionButton.js.map +1 -1
  120. package/lib/module/components/button/ButtonText.js.map +1 -1
  121. package/lib/module/components/button/DeleteButton.js +7 -2
  122. package/lib/module/components/button/DeleteButton.js.map +1 -1
  123. package/lib/module/components/button/LoadingButton.js.map +1 -1
  124. package/lib/module/components/button/Toggle.js.map +1 -1
  125. package/lib/module/components/button/hooks.js.map +1 -1
  126. package/lib/module/components/button/index.js.map +1 -1
  127. package/lib/module/components/feed/FeedContentPane.js.map +1 -1
  128. package/lib/module/components/feed/MediaFeed.js.map +1 -1
  129. package/lib/module/components/feed/MediaFeedBackground.js.map +1 -1
  130. package/lib/module/components/feed/MediaFeedRefresh.js.map +1 -1
  131. package/lib/module/components/feed/constants.js.map +1 -1
  132. package/lib/module/components/feed/context.js.map +1 -1
  133. package/lib/module/components/feed/hooks.js.map +1 -1
  134. package/lib/module/components/feed/index.js.map +1 -1
  135. package/lib/module/components/form/Condition.js.map +1 -1
  136. package/lib/module/components/form/Field.js.map +1 -1
  137. package/lib/module/components/form/Form.js +9 -4
  138. package/lib/module/components/form/Form.js.map +1 -1
  139. package/lib/module/components/form/FormFooter.js.map +1 -1
  140. package/lib/module/components/form/UploadProgress/index.js.map +1 -1
  141. package/lib/module/components/form/index.js.map +1 -1
  142. package/lib/module/components/form/input/Editable.js +51 -17
  143. package/lib/module/components/form/input/Editable.js.map +1 -1
  144. package/lib/module/components/form/input/InputSlider.js.map +1 -1
  145. package/lib/module/components/form/input/OptionalTag.js.map +1 -1
  146. package/lib/module/components/form/input/StandaloneInput.js.map +1 -1
  147. package/lib/module/components/form/input/boolean/index.js +4 -3
  148. package/lib/module/components/form/input/boolean/index.js.map +1 -1
  149. package/lib/module/components/form/input/color/index.js.map +1 -1
  150. package/lib/module/components/form/input/common/InputClearButton.js.map +1 -1
  151. package/lib/module/components/form/input/date/index.js.map +1 -1
  152. package/lib/module/components/form/input/datetime/index.js.map +1 -1
  153. package/lib/module/components/form/input/file/index.js +3 -1
  154. package/lib/module/components/form/input/file/index.js.map +1 -1
  155. package/lib/module/components/form/input/hooks/index.js.map +1 -1
  156. package/lib/module/components/form/input/hooks/useInputColor.js.map +1 -1
  157. package/lib/module/components/form/input/hooks/useInputImperativeHandle.js.map +1 -1
  158. package/lib/module/components/form/input/hooks/useInputStyles.js.map +1 -1
  159. package/lib/module/components/form/input/index.js.map +1 -1
  160. package/lib/module/components/form/input/input.js.map +1 -1
  161. package/lib/module/components/form/input/multipleSelect/index.js.map +1 -1
  162. package/lib/module/components/form/input/number/index.js.map +1 -1
  163. package/lib/module/components/form/input/select/index.js.map +1 -1
  164. package/lib/module/components/form/input/socialMedia/index.js.map +1 -1
  165. package/lib/module/components/form/input/text/AutoResizeTextarea.js.map +1 -1
  166. package/lib/module/components/form/input/text/index.js.map +1 -1
  167. package/lib/module/components/form/input/text/textarea.js.map +1 -1
  168. package/lib/module/components/form/input/text/useWebAutoResize.js.map +1 -1
  169. package/lib/module/components/form/input/time/index.js.map +1 -1
  170. package/lib/module/components/form/types.js.map +1 -1
  171. package/lib/module/components/form/view/file.js.map +1 -1
  172. package/lib/module/components/form/view/index.js.map +1 -1
  173. package/lib/module/components/form/view/multipleSelect.js.map +1 -1
  174. package/lib/module/components/form/view/select.js.map +1 -1
  175. package/lib/module/components/form/view/styles.js.map +1 -1
  176. package/lib/module/components/icons/index.js.map +1 -1
  177. package/lib/module/components/image/ImageViewModal.js.map +1 -1
  178. package/lib/module/components/image/index.js.map +1 -1
  179. package/lib/module/components/index.js.map +1 -1
  180. package/lib/module/components/layout/CollapseHorizontal.js.map +1 -1
  181. package/lib/module/components/loading/CircularProgress.js.map +1 -1
  182. package/lib/module/components/loading/Loading.js.map +1 -1
  183. package/lib/module/components/loading/LoadingImage.js.map +1 -1
  184. package/lib/module/components/loading/LoadingOverlay.js +6 -1
  185. package/lib/module/components/loading/LoadingOverlay.js.map +1 -1
  186. package/lib/module/components/loading/LoadingSwitch.js.map +1 -1
  187. package/lib/module/components/loading/ProgressBar.js.map +1 -1
  188. package/lib/module/components/loading/index.js.map +1 -1
  189. package/lib/module/components/text/AnimatedText.js +5 -3
  190. package/lib/module/components/text/AnimatedText.js.map +1 -1
  191. package/lib/module/components/text/Txt.js.map +1 -1
  192. package/lib/module/components/text/index.js.map +1 -1
  193. package/lib/module/components/theme/colorMode/DarkModeToggle.js.map +1 -1
  194. package/lib/module/components/theme/colorMode/index.js.map +1 -1
  195. package/lib/module/components/theme/index.js.map +1 -1
  196. package/lib/module/constants/index.js.map +1 -1
  197. package/lib/module/constants/toast.js.map +1 -1
  198. package/lib/module/contexts/fonts.js.map +1 -1
  199. package/lib/module/contexts/index.js.map +1 -1
  200. package/lib/module/contexts/root.js +3 -0
  201. package/lib/module/contexts/root.js.map +1 -1
  202. package/lib/module/hooks/index.js.map +1 -1
  203. package/lib/module/hooks/useFadeIn.js.map +1 -1
  204. package/lib/module/hooks/useFont.js.map +1 -1
  205. package/lib/module/hooks/useRefreshFontScale.js +28 -0
  206. package/lib/module/hooks/useRefreshFontScale.js.map +1 -0
  207. package/lib/module/hooks/useThemeState.js.map +1 -1
  208. package/lib/module/index.js.map +1 -1
  209. package/lib/module/store/index.js +1 -0
  210. package/lib/module/store/index.js.map +1 -1
  211. package/lib/module/store/useFontScale.js +9 -0
  212. package/lib/module/store/useFontScale.js.map +1 -0
  213. package/lib/module/store/useScreen.js.map +1 -1
  214. package/lib/module/styles/fill.js.map +1 -1
  215. package/lib/module/types/forms.js.map +1 -1
  216. package/lib/module/types/index.js.map +1 -1
  217. package/lib/module/utils/downloadFile.js.map +1 -1
  218. package/lib/module/utils/downloadFileLegacy.js.map +1 -1
  219. package/lib/typescript/components/button/ActionButton.d.ts.map +1 -1
  220. package/lib/typescript/components/button/DeleteButton.d.ts.map +1 -1
  221. package/lib/typescript/components/button/LoadingButton.d.ts.map +1 -1
  222. package/lib/typescript/components/form/Form.d.ts.map +1 -1
  223. package/lib/typescript/components/form/input/Editable.d.ts +1 -1
  224. package/lib/typescript/components/form/input/Editable.d.ts.map +1 -1
  225. package/lib/typescript/components/form/input/boolean/index.d.ts.map +1 -1
  226. package/lib/typescript/components/form/input/file/index.d.ts.map +1 -1
  227. package/lib/typescript/components/loading/LoadingOverlay.d.ts.map +1 -1
  228. package/lib/typescript/components/text/AnimatedText.d.ts.map +1 -1
  229. package/lib/typescript/contexts/root.d.ts +2 -1
  230. package/lib/typescript/contexts/root.d.ts.map +1 -1
  231. package/lib/typescript/hooks/useRefreshFontScale.d.ts +7 -0
  232. package/lib/typescript/hooks/useRefreshFontScale.d.ts.map +1 -0
  233. package/lib/typescript/store/index.d.ts +1 -0
  234. package/lib/typescript/store/index.d.ts.map +1 -1
  235. package/lib/typescript/store/useFontScale.d.ts +4 -0
  236. package/lib/typescript/store/useFontScale.d.ts.map +1 -0
  237. package/package.json +3 -3
  238. package/src/components/button/ActionButton.tsx +5 -3
  239. package/src/components/button/DeleteButton.tsx +6 -4
  240. package/src/components/button/LoadingButton.tsx +4 -2
  241. package/src/components/form/Form.tsx +6 -3
  242. package/src/components/form/input/Editable.tsx +51 -15
  243. package/src/components/form/input/boolean/index.tsx +4 -3
  244. package/src/components/form/input/file/index.tsx +3 -1
  245. package/src/components/loading/LoadingOverlay.tsx +3 -2
  246. package/src/components/text/AnimatedText.tsx +5 -3
  247. package/src/contexts/root.tsx +7 -2
  248. package/src/hooks/useRefreshFontScale.ts +26 -0
  249. package/src/store/index.ts +1 -0
  250. package/src/store/useFontScale.ts +8 -0
@@ -12,6 +12,7 @@ import { Ionicons } from '@expo/vector-icons'
12
12
  import React, { ForwardedRef, useCallback, useEffect } from 'react'
13
13
  import { StyleSheet, TextStyle, View, ViewStyle } from 'react-native'
14
14
  import { Pressable } from 'react-native-gesture-handler'
15
+ import { useFontScale } from '../../../store/useFontScale'
15
16
  import { CustomInputProps } from '../../../types/forms'
16
17
  import { LoadingOverlay } from '../../loading/LoadingOverlay'
17
18
  import { UploadProgress } from '../UploadProgress'
@@ -29,6 +30,7 @@ export const Editable = <T extends Field>({
29
30
  containerStyle,
30
31
  size,
31
32
  CustomInput,
33
+ ref,
32
34
  CustomView,
33
35
  inputStyle,
34
36
  }: EditableProps<ViewStyle, TextStyle, T>) => {
@@ -39,12 +41,12 @@ export const Editable = <T extends Field>({
39
41
  uploads,
40
42
  editHovered,
41
43
  handleEditOpen,
42
- handleEditClose,
43
44
  isEditing,
44
45
  shouldSubmitOnChange,
46
+ handleEditClose,
47
+ submit,
45
48
  value,
46
49
  setEditHovered,
47
- submit,
48
50
  } = useEditable({
49
51
  value: initValue,
50
52
  field,
@@ -52,7 +54,9 @@ export const Editable = <T extends Field>({
52
54
  storagePath,
53
55
  onEditOpen,
54
56
  onEditClose,
57
+ ref,
55
58
  })
59
+ const fontScale = useFontScale(s => s.fontScale)
56
60
 
57
61
  useEffect(() => {
58
62
  if (isEditing) {
@@ -61,8 +65,8 @@ export const Editable = <T extends Field>({
61
65
  }, [isEditing, inputRef])
62
66
 
63
67
  const iconColor = useIconColor()
68
+ const submitBackgroundColor = useThemeValue('colors.accent.600')
64
69
  const editingBorderColor = useColorModeValue('#00000055', '#ffffff55')
65
- const submitColor = useThemeValue('colors.accent.600')
66
70
 
67
71
  const RenderInput = useCallback(
68
72
  (props: CustomInputProps<T['defaultValue']>, ref?: ForwardedRef<InputRef | null>) => {
@@ -110,21 +114,57 @@ export const Editable = <T extends Field>({
110
114
  <RenderView inEditable noLabel size={size} value={value} />
111
115
  )}
112
116
  </View>
113
- {!shouldSubmitOnChange && (
117
+ {!shouldSubmitOnChange ? (
114
118
  <View style={styles.buttonsContainer}>
115
- {isEditing ? null : (
119
+ {isEditing ? (
120
+ <>
121
+ <Pressable
122
+ onPress={() => {
123
+ handleEditClose()
124
+ }}
125
+ style={[
126
+ styles.submitButton,
127
+ {
128
+ borderColor: iconColor,
129
+ borderWidth: 1,
130
+ width: 28 * fontScale,
131
+ height: 28 * fontScale,
132
+ },
133
+ ]}
134
+ onPressIn={() => setEditHovered(true)}
135
+ onPressOut={() => setEditHovered(false)}>
136
+ <Ionicons name="close-outline" size={20 * fontScale} color={iconColor} />
137
+ </Pressable>
138
+ <Pressable
139
+ onPress={() => {
140
+ submit()
141
+ }}
142
+ style={[
143
+ styles.submitButton,
144
+ {
145
+ backgroundColor: submitBackgroundColor,
146
+ width: 28 * fontScale,
147
+ height: 28 * fontScale,
148
+ },
149
+ ]}
150
+ onPressIn={() => setEditHovered(true)}
151
+ onPressOut={() => setEditHovered(false)}>
152
+ <Ionicons color="white" name="checkmark-outline" size={20 * fontScale} />
153
+ </Pressable>
154
+ </>
155
+ ) : (
116
156
  <Pressable
117
157
  onPress={() => {
118
158
  handleEditOpen()
119
159
  }}
120
- style={styles.submitButton}
160
+ style={[styles.submitButton, { width: 28 * fontScale, height: 28 * fontScale }]}
121
161
  onPressIn={() => setEditHovered(true)}
122
162
  onPressOut={() => setEditHovered(false)}>
123
- <Ionicons name="create-outline" size={20} color={iconColor} />
163
+ <Ionicons name="create-outline" size={20 * fontScale} color={iconColor} />
124
164
  </Pressable>
125
165
  )}
126
166
  </View>
127
- )}
167
+ ) : null}
128
168
  <LoadingOverlay loading={isLoading} />
129
169
  </View>
130
170
  <UploadProgress uploads={uploads} />
@@ -141,6 +181,7 @@ const styles = StyleSheet.create({
141
181
  flexDirection: 'row',
142
182
  justifyContent: 'center',
143
183
  paddingTop: 6,
184
+ paddingHorizontal: 4,
144
185
  gap: 10,
145
186
  },
146
187
  contentContainer: {
@@ -155,14 +196,9 @@ const styles = StyleSheet.create({
155
196
  borderWidth: 1,
156
197
  borderStyle: 'dashed',
157
198
  },
158
- submitButtonContainer: {
159
- flexDirection: 'row',
160
- overflow: 'hidden',
161
- gap: 12,
162
- },
163
199
  submitButton: {
164
- width: 24,
165
- height: 24,
200
+ width: 28,
201
+ height: 28,
166
202
  borderRadius: 4,
167
203
  alignItems: 'center',
168
204
  justifyContent: 'center',
@@ -1,7 +1,8 @@
1
1
  import { InputRef } from '@chem-po/core'
2
2
  import { BooleanField, useBooleanFieldText } from '@chem-po/react'
3
3
  import React, { ForwardedRef, forwardRef, useImperativeHandle } from 'react'
4
- import { Switch, Text, View } from 'react-native'
4
+ import { Switch, View } from 'react-native'
5
+ import { Txt } from '../../../text/Txt'
5
6
  import { FieldProps } from '../../types'
6
7
 
7
8
  const BaseCheckboxComponent = (
@@ -16,7 +17,7 @@ const BaseCheckboxComponent = (
16
17
  return (
17
18
  <View style={{ flexDirection: 'row', alignItems: 'center' }}>
18
19
  <Switch value={value} onValueChange={onChange} {...input} />
19
- <Text style={{ marginLeft: 8, fontWeight: '600', opacity: value ? 0.9 : 0.6 }}>{text}</Text>
20
+ <Txt style={{ marginLeft: 8, fontWeight: '600', opacity: value ? 0.9 : 0.6 }}>{text}</Txt>
20
21
  </View>
21
22
  )
22
23
  }
@@ -37,7 +38,7 @@ const BaseSwitchComponent = (
37
38
  return (
38
39
  <View style={{ flexDirection: 'row', alignItems: 'center' }}>
39
40
  <Switch value={value} onValueChange={onChange} {...input} />
40
- <Text style={{ marginLeft: 8, fontWeight: '600', opacity: value ? 0.9 : 0.6 }}>{text}</Text>
41
+ <Txt style={{ marginLeft: 8, fontWeight: '600', opacity: value ? 0.9 : 0.6 }}>{text}</Txt>
41
42
  </View>
42
43
  )
43
44
  }
@@ -15,6 +15,7 @@ import * as ImagePicker from 'expo-image-picker'
15
15
  import React, { forwardRef, useCallback, useImperativeHandle, useMemo } from 'react'
16
16
  import { Platform, StyleProp, StyleSheet, Text, TextStyle, View, ViewStyle } from 'react-native'
17
17
  import { Pressable } from 'react-native-gesture-handler'
18
+ import { useFontScale } from '../../../../store/useFontScale'
18
19
  import { downloadFile } from '../../../../utils/downloadFile'
19
20
  import { LoadingImage } from '../../../loading/LoadingImage'
20
21
  import { FieldProps } from '../../types'
@@ -38,12 +39,13 @@ const NoFileView = ({ hasUpload, onPress }: { hasUpload?: boolean; onPress?: ()
38
39
  const textColor = useTextColor()
39
40
  const iconColor = useIconColor()
40
41
  const borderColor = useBorderColor()
42
+ const fontScale = useFontScale(s => s.fontScale)
41
43
  return (
42
44
  <Pressable style={[styles.noFileContainer, { borderColor }]} onPress={onPress}>
43
45
  <Text style={[styles.noFileText, { color: textColor }]}>
44
46
  {hasUpload ? 'Tap to upload file' : 'No file uploaded'}
45
47
  </Text>
46
- <Ionicons name="cloud-upload" size={24} color={iconColor} />
48
+ <Ionicons name="cloud-upload" size={24 * fontScale} color={iconColor} />
47
49
  </Pressable>
48
50
  )
49
51
  }
@@ -1,8 +1,8 @@
1
1
  import React, { useMemo } from 'react'
2
2
  import { Animated, StyleProp, StyleSheet, ViewStyle } from 'react-native'
3
3
  import { FadeInOptions, useFadeIn } from '../../hooks/useFadeIn'
4
+ import { useFontScale } from '../../store/useFontScale'
4
5
  import { CircularProgress, CircularProgressProps } from './CircularProgress'
5
-
6
6
  const loadingFadeInProps: FadeInOptions = {
7
7
  activeOpacity: 0.8,
8
8
  duration: 100,
@@ -22,10 +22,11 @@ export const LoadingOverlay = ({
22
22
  const opts = useMemo(() => ({ ...loadingFadeInProps, ...fadeOptions }), [fadeOptions])
23
23
  const opacity = useFadeIn(loading, opts)
24
24
 
25
+ const fontScale = useFontScale(s => s.fontScale)
25
26
  return (
26
27
  <Animated.View
27
28
  style={[styles.overlay, style, { opacity, pointerEvents: loading ? 'auto' : 'none' }]}>
28
- <CircularProgress {...indicatorProps} />
29
+ <CircularProgress size={indicatorProps?.size ?? 20 * fontScale} {...indicatorProps} />
29
30
  </Animated.View>
30
31
  )
31
32
  }
@@ -1,5 +1,6 @@
1
1
  import React, { PropsWithChildren, useEffect, useMemo, useRef } from 'react'
2
2
  import { Animated, StyleProp, TextStyle } from 'react-native'
3
+ import { useFontScale } from '../../store/useFontScale'
3
4
 
4
5
  export interface AnimatedTextProps {
5
6
  show: boolean
@@ -10,6 +11,7 @@ export interface AnimatedTextProps {
10
11
  }
11
12
  const useAnimatedText = (show: boolean, color: string, height: number, marginBottom: number) => {
12
13
  const placeholderAnim = useRef(new Animated.Value(0)).current
14
+ const fontScale = useFontScale(s => s.fontScale)
13
15
 
14
16
  useEffect(() => {
15
17
  Animated.timing(placeholderAnim, {
@@ -33,14 +35,14 @@ const useAnimatedText = (show: boolean, color: string, height: number, marginBot
33
35
  ],
34
36
  height: placeholderAnim.interpolate({
35
37
  inputRange: [0, 1],
36
- outputRange: [0, height],
38
+ outputRange: [0, height * fontScale],
37
39
  }),
38
40
  marginBottom: placeholderAnim.interpolate({
39
41
  inputRange: [0, 1],
40
- outputRange: [0, marginBottom],
42
+ outputRange: [0, marginBottom * fontScale],
41
43
  }),
42
44
  }),
43
- [color, height, marginBottom, placeholderAnim],
45
+ [color, height, marginBottom, placeholderAnim, fontScale],
44
46
  )
45
47
  }
46
48
 
@@ -13,6 +13,7 @@ import { en, registerTranslation } from 'react-native-paper-dates'
13
13
  import { MD3Type, MD3Typescale, ThemeProp } from 'react-native-paper/lib/typescript/types'
14
14
  import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context'
15
15
  import { nativeToast } from '../constants/toast'
16
+ import { useRefreshFontScale } from '../hooks/useRefreshFontScale'
16
17
  import { UseThemeProps, useThemeState } from '../hooks/useThemeState'
17
18
  import { initializeScreen } from '../store/useScreen'
18
19
  import { ChempoFontsProvider } from './fonts'
@@ -21,14 +22,16 @@ registerTranslation('en', en)
21
22
 
22
23
  export type FontConfig = Partial<Record<MD3TypescaleKey, Partial<MD3Type>>>
23
24
  export type MiddlewareProvider = FC<PropsWithChildren>
24
- export interface ChempoNativeProviderProps<BackendAdapter extends BackendAdapterInterface>
25
- extends PropsWithChildren<Pick<ChempoProps<BackendAdapter>, 'backendAdapter' | 'assets'>> {
25
+ export interface ChempoNativeProviderProps<
26
+ BackendAdapter extends BackendAdapterInterface,
27
+ > extends PropsWithChildren<Pick<ChempoProps<BackendAdapter>, 'backendAdapter' | 'assets'>> {
26
28
  theme?: Theme
27
29
  fonts?: FontConfig
28
30
  initialColorMode?: ColorMode
29
31
  colorModeProp?: string
30
32
  middlewareProvider?: MiddlewareProvider
31
33
  insetNotifier?: boolean
34
+ disableFontScaling?: boolean
32
35
  }
33
36
  const createPaperTheme = (
34
37
  themeConfig: Theme,
@@ -148,6 +151,7 @@ export const ChempoNativeProvider = <BackendAdapter extends BackendAdapterInterf
148
151
  colorModeProp,
149
152
  middlewareProvider: Middleware,
150
153
  insetNotifier,
154
+ disableFontScaling,
151
155
  ...props
152
156
  }: ChempoNativeProviderProps<BackendAdapter>) => {
153
157
  const useThemeProps = useMemo<UseThemeProps>(
@@ -155,6 +159,7 @@ export const ChempoNativeProvider = <BackendAdapter extends BackendAdapterInterf
155
159
  [themeProp, initialColorMode, colorModeProp],
156
160
  )
157
161
  const theme = useThemeState(useThemeProps)
162
+ useRefreshFontScale(disableFontScaling)
158
163
 
159
164
  const { theme: paperTheme, fonts } = useMemo(
160
165
  () => createPaperTheme(theme.theme ?? defaultTheme, fontConfig, theme.colorMode),
@@ -0,0 +1,26 @@
1
+ import { useEffect } from 'react'
2
+ import { AppState, PixelRatio } from 'react-native'
3
+ import { useFontScale } from '../store/useFontScale'
4
+
5
+ /**
6
+ * Subscribes to app state and refreshes the global font scale when the app
7
+ * becomes active (cold start or returning from background). Call once near the
8
+ * root of the app (e.g. in _layout).
9
+ */
10
+ export function useRefreshFontScale(disableFontScaling = false) {
11
+ useEffect(() => {
12
+ if (disableFontScaling) {
13
+ useFontScale.setState({ fontScale: 1 })
14
+ return () => {}
15
+ }
16
+ const refresh = () => useFontScale.setState({ fontScale: PixelRatio.getFontScale() ?? 1 })
17
+
18
+ refresh()
19
+
20
+ const sub = AppState.addEventListener('change', nextState => {
21
+ if (nextState === 'active') refresh()
22
+ })
23
+
24
+ return () => sub.remove()
25
+ }, [disableFontScaling])
26
+ }
@@ -1 +1,2 @@
1
+ export * from './useFontScale'
1
2
  export * from './useScreen'
@@ -0,0 +1,8 @@
1
+ import { PixelRatio } from 'react-native'
2
+ import { create } from 'zustand'
3
+
4
+ // export const normalizeFontScale = (fontScale: number) =>
5
+ // fontScale > 1 ? (fontScale - 1) * 0.5 + 1 : fontScale
6
+ export const useFontScale = create<{ fontScale: number }>(() => ({
7
+ fontScale: PixelRatio.getFontScale() ?? 1,
8
+ }))