react-native-better-html 1.0.3 → 1.0.4

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.
package/dist/index.d.mts CHANGED
@@ -3,7 +3,7 @@ export { AnyOtherString, AssetName, AssetsConfig, Color, ColorName, ColorTheme,
3
3
  import * as react from 'react';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as react_native from 'react-native';
6
- import { ViewStyle, GestureResponderEvent, ViewProps as ViewProps$1, TextProps as TextProps$1, TextStyle, ColorValue } from 'react-native';
6
+ import { ViewStyle, GestureResponderEvent, ViewProps as ViewProps$1, TextProps as TextProps$1, TextStyle, ColorValue, ImageSourcePropType, ImageProps as ImageProps$1, ImageStyle, TextInput, FocusEvent } from 'react-native';
7
7
  import { EaseFunction, PropsTransforms } from '@legendapp/motion';
8
8
 
9
9
  type AppConfig = {};
@@ -40,6 +40,9 @@ type ComponentMarginProps = Pick<ComponentStyle, "margin" | "marginTop" | "margi
40
40
  type ComponentExcludeMarginProps = "marginBlock" | "marginBlockStart" | "marginBlockEnd" | "marginInline" | "marginInlineStart" | "marginInlineEnd" | "marginStart" | "marginEnd";
41
41
  type ComponentPaddingProps = Pick<ComponentStyle, "padding" | "paddingTop" | "paddingBottom" | "paddingLeft" | "paddingRight" | "paddingVertical" | "paddingHorizontal">;
42
42
  type ComponentExcludePaddingProps = "paddingBlock" | "paddingBlockStart" | "paddingBlockEnd" | "paddingInline" | "paddingInlineStart" | "paddingInlineEnd" | "paddingStart" | "paddingEnd";
43
+ type ComponentPropWithRef<ComponentRef, ComponentProps> = ComponentProps & {
44
+ ref?: React.Ref<ComponentRef>;
45
+ };
43
46
 
44
47
  declare const pressStrength: () => Record<"z05" | "z1" | "z2" | "z3", number>;
45
48
 
@@ -64,6 +67,11 @@ declare function useDevice(): {
64
67
  /** @description Whether the device is small. */
65
68
  isSmallDevice: boolean;
66
69
  };
70
+ declare function useKeyboard(): {
71
+ isOpened: boolean;
72
+ willOpen: boolean;
73
+ height: number;
74
+ };
67
75
 
68
76
  declare function generateAsyncStorage<AsyncStorage extends object>(): {
69
77
  setItem: <StorageName extends keyof AsyncStorage>(name: StorageName, value: AsyncStorage[StorageName]) => void;
@@ -258,6 +266,8 @@ type ScreenHolderProps = {
258
266
  /** @default 0 */
259
267
  bottomSpace?: number;
260
268
  footer?: React.ReactNode;
269
+ /** @default false */
270
+ keepFooterOnKeyboardOpened?: boolean;
261
271
  children?: React.ReactNode;
262
272
  };
263
273
  type ScreenHolderComponentType = {
@@ -278,8 +288,61 @@ declare const ScreenHolder: typeof ScreenHolderComponent & {
278
288
  footer: typeof ScreenHolderComponent.footer;
279
289
  };
280
290
 
291
+ type ImageProps = {
292
+ name?: AssetName | AnyOtherString;
293
+ source?: ImageSourcePropType;
294
+ /** @default false */
295
+ withDevFittingMode?: boolean;
296
+ } & OmitProps<ImageProps$1, "source"> & ComponentStyle<ImageStyle>;
297
+ type ImageComponentType = {
298
+ (props: ImageProps): React.ReactElement;
299
+ profileImage: (props: OmitProps<ImageProps, "width" | "height"> & {
300
+ /** @default 50 */
301
+ size?: number;
302
+ letters?: string;
303
+ backgroundColor?: string;
304
+ }) => React.ReactElement;
305
+ };
306
+ declare const ImageComponent: ImageComponentType;
307
+ /** @description size is set to 100x100 by default */
308
+ declare const Image: typeof ImageComponent & {
309
+ profileImage: typeof ImageComponent.profileImage;
310
+ };
311
+
312
+ type InputFieldProps = {
313
+ placeholder?: string;
314
+ prefix?: string;
315
+ suffix?: string;
316
+ defaultValue?: string;
317
+ /** @default true */
318
+ editable?: boolean;
319
+ /** @default false */
320
+ autoFocus?: boolean;
321
+ autoCapitalize?: React.ComponentProps<typeof TextInput>["autoCapitalize"];
322
+ autoComplete?: React.ComponentProps<typeof TextInput>["autoComplete"];
323
+ autoCorrect?: React.ComponentProps<typeof TextInput>["autoCorrect"];
324
+ /** @default "default" */
325
+ keyboardAppearance?: React.ComponentProps<typeof TextInput>["keyboardAppearance"];
326
+ keyboardType?: React.ComponentProps<typeof TextInput>["keyboardType"];
327
+ /** @default false */
328
+ secureTextEntry?: boolean;
329
+ onFocus?: (event: FocusEvent) => void;
330
+ onBlur?: (event: FocusEvent) => void;
331
+ };
332
+ type InputFieldRef = {};
333
+ type InputFieldComponentType = {
334
+ (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>): React.ReactElement;
335
+ email: (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>) => React.ReactElement;
336
+ password: (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>) => React.ReactElement;
337
+ };
338
+ declare const InputFieldComponent: InputFieldComponentType;
339
+ declare const InputField: typeof InputFieldComponent & {
340
+ email: typeof InputFieldComponent.email;
341
+ password: typeof InputFieldComponent.password;
342
+ };
343
+
281
344
  type AsyncStoragePluginOptions = {};
282
345
  declare const defaultAsyncStoragePluginOptions: Required<AsyncStoragePluginOptions>;
283
346
  declare const asyncStoragePlugin: BetterComponentsPluginConstructor<AsyncStoragePluginOptions>;
284
347
 
285
- export { Animate, type AnimateTextProps, type AnimateViewProps, type AppConfig, type AsyncStoragePluginOptions, type BetterComponentsConfig, type BetterComponentsPlugin, _default as BetterComponentsProvider, type BetterComponentsProviderConfig, Button, type ButtonProps, type ComponentMarginProps, type ComponentPaddingProps, type FooterProps, Loader, type LoaderProps, type LoaderSize, type PluginName, ScreenHolder, type ScreenHolderProps, Text, type TextProps, View, type ViewProps, asyncStoragePlugin, defaultAsyncStoragePluginOptions, generateAsyncStorage, pressStrength, useBetterComponentsContext, useDevice };
348
+ export { Animate, type AnimateTextProps, type AnimateViewProps, type AppConfig, type AsyncStoragePluginOptions, type BetterComponentsConfig, type BetterComponentsPlugin, _default as BetterComponentsProvider, type BetterComponentsProviderConfig, Button, type ButtonProps, type ComponentMarginProps, type ComponentPaddingProps, type FooterProps, Image, type ImageProps, InputField, type InputFieldProps, Loader, type LoaderProps, type LoaderSize, type PluginName, ScreenHolder, type ScreenHolderProps, Text, type TextProps, View, type ViewProps, asyncStoragePlugin, defaultAsyncStoragePluginOptions, generateAsyncStorage, pressStrength, useBetterComponentsContext, useDevice, useKeyboard };
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { AnyOtherString, AssetName, AssetsConfig, Color, ColorName, ColorTheme,
3
3
  import * as react from 'react';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import * as react_native from 'react-native';
6
- import { ViewStyle, GestureResponderEvent, ViewProps as ViewProps$1, TextProps as TextProps$1, TextStyle, ColorValue } from 'react-native';
6
+ import { ViewStyle, GestureResponderEvent, ViewProps as ViewProps$1, TextProps as TextProps$1, TextStyle, ColorValue, ImageSourcePropType, ImageProps as ImageProps$1, ImageStyle, TextInput, FocusEvent } from 'react-native';
7
7
  import { EaseFunction, PropsTransforms } from '@legendapp/motion';
8
8
 
9
9
  type AppConfig = {};
@@ -40,6 +40,9 @@ type ComponentMarginProps = Pick<ComponentStyle, "margin" | "marginTop" | "margi
40
40
  type ComponentExcludeMarginProps = "marginBlock" | "marginBlockStart" | "marginBlockEnd" | "marginInline" | "marginInlineStart" | "marginInlineEnd" | "marginStart" | "marginEnd";
41
41
  type ComponentPaddingProps = Pick<ComponentStyle, "padding" | "paddingTop" | "paddingBottom" | "paddingLeft" | "paddingRight" | "paddingVertical" | "paddingHorizontal">;
42
42
  type ComponentExcludePaddingProps = "paddingBlock" | "paddingBlockStart" | "paddingBlockEnd" | "paddingInline" | "paddingInlineStart" | "paddingInlineEnd" | "paddingStart" | "paddingEnd";
43
+ type ComponentPropWithRef<ComponentRef, ComponentProps> = ComponentProps & {
44
+ ref?: React.Ref<ComponentRef>;
45
+ };
43
46
 
44
47
  declare const pressStrength: () => Record<"z05" | "z1" | "z2" | "z3", number>;
45
48
 
@@ -64,6 +67,11 @@ declare function useDevice(): {
64
67
  /** @description Whether the device is small. */
65
68
  isSmallDevice: boolean;
66
69
  };
70
+ declare function useKeyboard(): {
71
+ isOpened: boolean;
72
+ willOpen: boolean;
73
+ height: number;
74
+ };
67
75
 
68
76
  declare function generateAsyncStorage<AsyncStorage extends object>(): {
69
77
  setItem: <StorageName extends keyof AsyncStorage>(name: StorageName, value: AsyncStorage[StorageName]) => void;
@@ -258,6 +266,8 @@ type ScreenHolderProps = {
258
266
  /** @default 0 */
259
267
  bottomSpace?: number;
260
268
  footer?: React.ReactNode;
269
+ /** @default false */
270
+ keepFooterOnKeyboardOpened?: boolean;
261
271
  children?: React.ReactNode;
262
272
  };
263
273
  type ScreenHolderComponentType = {
@@ -278,8 +288,61 @@ declare const ScreenHolder: typeof ScreenHolderComponent & {
278
288
  footer: typeof ScreenHolderComponent.footer;
279
289
  };
280
290
 
291
+ type ImageProps = {
292
+ name?: AssetName | AnyOtherString;
293
+ source?: ImageSourcePropType;
294
+ /** @default false */
295
+ withDevFittingMode?: boolean;
296
+ } & OmitProps<ImageProps$1, "source"> & ComponentStyle<ImageStyle>;
297
+ type ImageComponentType = {
298
+ (props: ImageProps): React.ReactElement;
299
+ profileImage: (props: OmitProps<ImageProps, "width" | "height"> & {
300
+ /** @default 50 */
301
+ size?: number;
302
+ letters?: string;
303
+ backgroundColor?: string;
304
+ }) => React.ReactElement;
305
+ };
306
+ declare const ImageComponent: ImageComponentType;
307
+ /** @description size is set to 100x100 by default */
308
+ declare const Image: typeof ImageComponent & {
309
+ profileImage: typeof ImageComponent.profileImage;
310
+ };
311
+
312
+ type InputFieldProps = {
313
+ placeholder?: string;
314
+ prefix?: string;
315
+ suffix?: string;
316
+ defaultValue?: string;
317
+ /** @default true */
318
+ editable?: boolean;
319
+ /** @default false */
320
+ autoFocus?: boolean;
321
+ autoCapitalize?: React.ComponentProps<typeof TextInput>["autoCapitalize"];
322
+ autoComplete?: React.ComponentProps<typeof TextInput>["autoComplete"];
323
+ autoCorrect?: React.ComponentProps<typeof TextInput>["autoCorrect"];
324
+ /** @default "default" */
325
+ keyboardAppearance?: React.ComponentProps<typeof TextInput>["keyboardAppearance"];
326
+ keyboardType?: React.ComponentProps<typeof TextInput>["keyboardType"];
327
+ /** @default false */
328
+ secureTextEntry?: boolean;
329
+ onFocus?: (event: FocusEvent) => void;
330
+ onBlur?: (event: FocusEvent) => void;
331
+ };
332
+ type InputFieldRef = {};
333
+ type InputFieldComponentType = {
334
+ (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>): React.ReactElement;
335
+ email: (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>) => React.ReactElement;
336
+ password: (props: ComponentPropWithRef<InputFieldRef, InputFieldProps>) => React.ReactElement;
337
+ };
338
+ declare const InputFieldComponent: InputFieldComponentType;
339
+ declare const InputField: typeof InputFieldComponent & {
340
+ email: typeof InputFieldComponent.email;
341
+ password: typeof InputFieldComponent.password;
342
+ };
343
+
281
344
  type AsyncStoragePluginOptions = {};
282
345
  declare const defaultAsyncStoragePluginOptions: Required<AsyncStoragePluginOptions>;
283
346
  declare const asyncStoragePlugin: BetterComponentsPluginConstructor<AsyncStoragePluginOptions>;
284
347
 
285
- export { Animate, type AnimateTextProps, type AnimateViewProps, type AppConfig, type AsyncStoragePluginOptions, type BetterComponentsConfig, type BetterComponentsPlugin, _default as BetterComponentsProvider, type BetterComponentsProviderConfig, Button, type ButtonProps, type ComponentMarginProps, type ComponentPaddingProps, type FooterProps, Loader, type LoaderProps, type LoaderSize, type PluginName, ScreenHolder, type ScreenHolderProps, Text, type TextProps, View, type ViewProps, asyncStoragePlugin, defaultAsyncStoragePluginOptions, generateAsyncStorage, pressStrength, useBetterComponentsContext, useDevice };
348
+ export { Animate, type AnimateTextProps, type AnimateViewProps, type AppConfig, type AsyncStoragePluginOptions, type BetterComponentsConfig, type BetterComponentsPlugin, _default as BetterComponentsProvider, type BetterComponentsProviderConfig, Button, type ButtonProps, type ComponentMarginProps, type ComponentPaddingProps, type FooterProps, Image, type ImageProps, InputField, type InputFieldProps, Loader, type LoaderProps, type LoaderSize, type PluginName, ScreenHolder, type ScreenHolderProps, Text, type TextProps, View, type ViewProps, asyncStoragePlugin, defaultAsyncStoragePluginOptions, generateAsyncStorage, pressStrength, useBetterComponentsContext, useDevice, useKeyboard };
package/dist/index.js CHANGED
@@ -33,37 +33,40 @@ __export(index_exports, {
33
33
  Animate: () => Animate_default,
34
34
  BetterComponentsProvider: () => BetterComponentsProvider_default,
35
35
  Button: () => Button_default,
36
+ Image: () => Image_default,
37
+ InputField: () => InputField_default,
36
38
  Loader: () => Loader_default,
37
39
  ScreenHolder: () => ScreenHolder_default,
38
40
  Text: () => Text_default,
39
41
  View: () => View_default,
40
42
  asyncStoragePlugin: () => asyncStoragePlugin,
41
- colorThemeControls: () => import_react_better_core8.colorThemeControls,
42
- countries: () => import_react_better_core8.countries,
43
- darkenColor: () => import_react_better_core8.darkenColor,
43
+ colorThemeControls: () => import_react_better_core10.colorThemeControls,
44
+ countries: () => import_react_better_core10.countries,
45
+ darkenColor: () => import_react_better_core10.darkenColor,
44
46
  defaultAsyncStoragePluginOptions: () => defaultAsyncStoragePluginOptions,
45
- desaturateColor: () => import_react_better_core8.desaturateColor,
46
- eventPreventDefault: () => import_react_better_core8.eventPreventDefault,
47
- eventPreventStop: () => import_react_better_core8.eventPreventStop,
48
- eventStopPropagation: () => import_react_better_core8.eventStopPropagation,
49
- formatPhoneNumber: () => import_react_better_core8.formatPhoneNumber,
47
+ desaturateColor: () => import_react_better_core10.desaturateColor,
48
+ eventPreventDefault: () => import_react_better_core10.eventPreventDefault,
49
+ eventPreventStop: () => import_react_better_core10.eventPreventStop,
50
+ eventStopPropagation: () => import_react_better_core10.eventStopPropagation,
51
+ formatPhoneNumber: () => import_react_better_core10.formatPhoneNumber,
50
52
  generateAsyncStorage: () => generateAsyncStorage,
51
- generateRandomString: () => import_react_better_core8.generateRandomString,
52
- getPluralWord: () => import_react_better_core8.getPluralWord,
53
- lightenColor: () => import_react_better_core8.lightenColor,
54
- loaderControls: () => import_react_better_core8.loaderControls,
53
+ generateRandomString: () => import_react_better_core10.generateRandomString,
54
+ getPluralWord: () => import_react_better_core10.getPluralWord,
55
+ lightenColor: () => import_react_better_core10.lightenColor,
56
+ loaderControls: () => import_react_better_core10.loaderControls,
55
57
  pressStrength: () => pressStrength,
56
- saturateColor: () => import_react_better_core8.saturateColor,
58
+ saturateColor: () => import_react_better_core10.saturateColor,
57
59
  useBetterComponentsContext: () => useBetterComponentsContext,
58
- useBooleanState: () => import_react_better_core8.useBooleanState,
59
- useDebounceState: () => import_react_better_core8.useDebounceState,
60
+ useBooleanState: () => import_react_better_core10.useBooleanState,
61
+ useDebounceState: () => import_react_better_core10.useDebounceState,
60
62
  useDevice: () => useDevice,
61
- useLoader: () => import_react_better_core8.useLoader,
62
- useLoaderControls: () => import_react_better_core8.useLoaderControls,
63
- useTheme: () => import_react_better_core8.useTheme
63
+ useKeyboard: () => useKeyboard,
64
+ useLoader: () => import_react_better_core10.useLoader,
65
+ useLoaderControls: () => import_react_better_core10.useLoaderControls,
66
+ useTheme: () => import_react_better_core10.useTheme
64
67
  });
65
68
  module.exports = __toCommonJS(index_exports);
66
- var import_react_better_core8 = require("react-better-core");
69
+ var import_react_better_core10 = require("react-better-core");
67
70
 
68
71
  // src/components/BetterComponentsProvider.tsx
69
72
  var import_react = require("react");
@@ -406,6 +409,36 @@ function useDevice() {
406
409
  isSmallDevice
407
410
  };
408
411
  }
412
+ function useKeyboard() {
413
+ const [keyboardOpened, setKeyboardOpened] = (0, import_react_better_core2.useBooleanState)();
414
+ const [keyboardWillOpen, setKeyboardWillOpen] = (0, import_react_better_core2.useBooleanState)();
415
+ const [keyboardHeight, setKeyboardHeight] = (0, import_react2.useState)(0);
416
+ (0, import_react2.useEffect)(() => {
417
+ const keyboardDidShow = (event) => {
418
+ setKeyboardOpened.setTrue();
419
+ setKeyboardHeight(event.endCoordinates.height);
420
+ };
421
+ const keyboardDidHide = () => {
422
+ setKeyboardOpened.setFalse();
423
+ setKeyboardHeight(0);
424
+ };
425
+ const willShowSubscription = import_react_native.Keyboard.addListener("keyboardWillShow", setKeyboardWillOpen.setTrue);
426
+ const willHideSubscription = import_react_native.Keyboard.addListener("keyboardWillHide", setKeyboardWillOpen.setFalse);
427
+ const didShowSubscription = import_react_native.Keyboard.addListener("keyboardDidShow", keyboardDidShow);
428
+ const didHideSubscription = import_react_native.Keyboard.addListener("keyboardDidHide", keyboardDidHide);
429
+ return () => {
430
+ willShowSubscription.remove();
431
+ willHideSubscription.remove();
432
+ didShowSubscription.remove();
433
+ didHideSubscription.remove();
434
+ };
435
+ }, []);
436
+ return {
437
+ isOpened: keyboardOpened,
438
+ willOpen: keyboardWillOpen,
439
+ height: keyboardHeight
440
+ };
441
+ }
409
442
  function useComponentPropsGrouper(props, prefix) {
410
443
  return (0, import_react2.useMemo)(() => {
411
444
  const style = {};
@@ -718,6 +751,7 @@ var Text_default = Text2;
718
751
 
719
752
  // src/components/Button.tsx
720
753
  var import_react7 = require("react");
754
+ var import_react_native5 = require("react-native");
721
755
  var import_react_better_core6 = require("react-better-core");
722
756
 
723
757
  // src/components/Animate.tsx
@@ -879,6 +913,7 @@ var ButtonComponent = function Button({
879
913
  const color = textColor ?? theme2.colors.base;
880
914
  const paddingVertical = props.paddingVertical ? parseFloat(props.paddingVertical.toString()) : theme2.styles.space;
881
915
  const paddingHorizontal = props.paddingHorizontal ? parseFloat(props.paddingHorizontal.toString()) : theme2.styles.space + theme2.styles.gap;
916
+ const buttonHeight = paddingVertical + lineHeight + paddingVertical;
882
917
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
883
918
  Animate_default.View,
884
919
  {
@@ -892,6 +927,7 @@ var ButtonComponent = function Button({
892
927
  {
893
928
  position: "relative",
894
929
  width: !isSmall ? "100%" : void 0,
930
+ height: import_react_native5.Platform.OS === "android" ? buttonHeight : void 0,
895
931
  alignItems: "center",
896
932
  justifyContent: "center",
897
933
  backgroundColor: theme2.colors.primary,
@@ -919,7 +955,7 @@ var ButtonComponent = function Button({
919
955
  {
920
956
  position: "absolute",
921
957
  width: "100%",
922
- height: paddingVertical + lineHeight + paddingVertical,
958
+ height: buttonHeight,
923
959
  left: paddingHorizontal,
924
960
  alignItems: "center",
925
961
  justifyContent: "center",
@@ -978,7 +1014,7 @@ var Button_default = Button2;
978
1014
 
979
1015
  // src/components/ScreenHolder.tsx
980
1016
  var import_react8 = require("react");
981
- var import_react_native5 = require("react-native");
1017
+ var import_react_native6 = require("react-native");
982
1018
  var import_react_better_core7 = require("react-better-core");
983
1019
  var import_jsx_runtime7 = require("react/jsx-runtime");
984
1020
  var ScreenHolderComponent = ({
@@ -992,11 +1028,19 @@ var ScreenHolderComponent = ({
992
1028
  insideBottomSafeArea,
993
1029
  bottomSpace = 0,
994
1030
  footer,
1031
+ keepFooterOnKeyboardOpened,
995
1032
  children
996
1033
  }) => {
997
1034
  const theme2 = (0, import_react_better_core7.useTheme)();
998
1035
  const device = useDevice();
1036
+ const keyboard = useKeyboard();
999
1037
  const [isRefreshing, setIsRefreshing] = (0, import_react_better_core7.useBooleanState)();
1038
+ const keyboardAvoidingViewStyle = (0, import_react8.useMemo)(
1039
+ () => ({
1040
+ flex: 1
1041
+ }),
1042
+ []
1043
+ );
1000
1044
  const onRefreshElement = (0, import_react8.useCallback)(() => {
1001
1045
  setIsRefreshing.setTrue();
1002
1046
  onRefresh?.();
@@ -1011,21 +1055,29 @@ var ScreenHolderComponent = ({
1011
1055
  flex: 1,
1012
1056
  paddingHorizontal: !noSideSpace ? theme2.styles.space : void 0,
1013
1057
  paddingTop: theme2.styles.gap + (insideTopSafeArea ? device.safeArea.afterCalculations.top : 0),
1014
- paddingBottom: bottomSpace + (insideBottomSafeArea ? device.safeArea.afterCalculations.bottom : 0),
1058
+ paddingBottom: import_react_native6.Platform.OS === "ios" && keyboard.isOpened ? device.safeArea.afterCalculations.top : bottomSpace + (insideBottomSafeArea ? device.safeArea.afterCalculations.bottom : 0),
1015
1059
  children
1016
1060
  }
1017
1061
  );
1018
1062
  const withRefresh = onRefresh || onRefreshEnd;
1019
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(View_default, { flex: 1, backgroundColor: backgroundColor ?? theme2.colors.backgroundBase, children: [
1020
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { flex: 1, children: noScroll ? content : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1021
- import_react_native5.ScrollView,
1022
- {
1023
- refreshControl: withRefresh ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native5.RefreshControl, { refreshing: isRefreshing, onRefresh: onRefreshElement }) : void 0,
1024
- children: content
1025
- }
1026
- ) }),
1027
- footer && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { children: footer })
1028
- ] });
1063
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { flex: 1, backgroundColor: backgroundColor ?? theme2.colors.backgroundBase, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
1064
+ import_react_native6.KeyboardAvoidingView,
1065
+ {
1066
+ style: keyboardAvoidingViewStyle,
1067
+ keyboardVerticalOffset: keepFooterOnKeyboardOpened ? import_react_native6.Platform.OS === "ios" ? device.safeArea.afterCalculations.bottom : theme2.styles.gap : void 0,
1068
+ behavior: import_react_native6.Platform.OS === "ios" ? "padding" : "height",
1069
+ children: [
1070
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { flex: 1, children: noScroll ? content : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1071
+ import_react_native6.ScrollView,
1072
+ {
1073
+ refreshControl: withRefresh ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native6.RefreshControl, { refreshing: isRefreshing, onRefresh: onRefreshElement }) : void 0,
1074
+ children: content
1075
+ }
1076
+ ) }),
1077
+ keepFooterOnKeyboardOpened || (import_react_native6.Platform.OS === "ios" ? !keyboard.willOpen : !keyboard.isOpened) ? footer && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { children: footer }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(View_default, { width: "100%", height: device.safeArea.afterCalculations.bottom })
1078
+ ]
1079
+ }
1080
+ ) });
1029
1081
  };
1030
1082
  ScreenHolderComponent.footer = function Footer({
1031
1083
  noSideSpace,
@@ -1050,6 +1102,226 @@ var ScreenHolder = (0, import_react8.memo)(ScreenHolderComponent);
1050
1102
  ScreenHolder.footer = ScreenHolderComponent.footer;
1051
1103
  var ScreenHolder_default = ScreenHolder;
1052
1104
 
1105
+ // src/components/Image.tsx
1106
+ var import_react9 = require("react");
1107
+ var import_react_better_core8 = require("react-better-core");
1108
+ var import_react_native7 = require("react-native");
1109
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1110
+ var ImageComponent = function Image({ name, source, withDevFittingMode, ...props }) {
1111
+ const { assets: assets2 } = (0, import_react_better_core8.useBetterCoreContext)();
1112
+ const style = (0, import_react9.useMemo)(
1113
+ () => ({
1114
+ width: 100,
1115
+ height: 100,
1116
+ ...withDevFittingMode ? {
1117
+ borderWidth: 1,
1118
+ borderColor: "#eb39f7"
1119
+ } : {},
1120
+ ...props
1121
+ }),
1122
+ [withDevFittingMode, props]
1123
+ );
1124
+ (0, import_react9.useEffect)(() => {
1125
+ if (!name) return;
1126
+ if (!assets2[name.toString()])
1127
+ console.warn(
1128
+ `The asset \`${name}\` you are trying to use does not exist. Make sure to add it to the \`assets\` object in \`<BetterComponentsProvider>\` config value prop.`
1129
+ );
1130
+ }, [assets2, name]);
1131
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native7.Image, { source: name ? assets2[name.toString()] : source, style, ...props });
1132
+ };
1133
+ ImageComponent.profileImage = function ProfileImage({ size = 50, letters, backgroundColor, ...props }) {
1134
+ const theme2 = (0, import_react_better_core8.useTheme)();
1135
+ return letters ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1136
+ View_default,
1137
+ {
1138
+ width: size,
1139
+ height: size,
1140
+ backgroundColor: backgroundColor ?? theme2.colors.backgroundSecondary,
1141
+ borderWidth: 1,
1142
+ borderColor: theme2.colors.border,
1143
+ borderRadius: 999,
1144
+ alignItems: "center",
1145
+ justifyContent: "center",
1146
+ ...props,
1147
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Text_default, { fontSize: size / 2.5, fontWeight: 700, marginTop: 1, children: letters.toUpperCase().slice(0, 2) })
1148
+ }
1149
+ ) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1150
+ ImageComponent,
1151
+ {
1152
+ width: size,
1153
+ height: size,
1154
+ borderWidth: 1,
1155
+ borderColor: theme2.colors.border,
1156
+ borderRadius: 999,
1157
+ objectFit: "cover",
1158
+ ...props
1159
+ }
1160
+ );
1161
+ };
1162
+ var Image2 = (0, import_react9.memo)(ImageComponent);
1163
+ Image2.profileImage = ImageComponent.profileImage;
1164
+ var Image_default = Image2;
1165
+
1166
+ // src/components/InputField.tsx
1167
+ var import_react10 = require("react");
1168
+ var import_react_native8 = require("react-native");
1169
+ var import_react_better_core9 = require("react-better-core");
1170
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1171
+ var InputFieldComponent = (0, import_react10.forwardRef)(
1172
+ ({
1173
+ placeholder,
1174
+ prefix,
1175
+ suffix,
1176
+ defaultValue,
1177
+ editable = true,
1178
+ autoFocus,
1179
+ autoCapitalize,
1180
+ autoComplete,
1181
+ autoCorrect,
1182
+ keyboardAppearance = "default",
1183
+ keyboardType,
1184
+ secureTextEntry,
1185
+ onFocus,
1186
+ onBlur
1187
+ }, ref) => {
1188
+ const theme2 = (0, import_react_better_core9.useTheme)();
1189
+ const { colorTheme } = (0, import_react_better_core9.useBetterCoreContext)();
1190
+ const [isFocused, setIsFocused] = (0, import_react_better_core9.useBooleanState)();
1191
+ const paddingHorizontal = theme2.styles.space;
1192
+ const paddingVertical = (theme2.styles.space + theme2.styles.gap) / 2;
1193
+ const onFocusElement = (0, import_react10.useCallback)((event) => {
1194
+ setIsFocused.setTrue();
1195
+ onFocus?.(event);
1196
+ }, []);
1197
+ const onBlurElement = (0, import_react10.useCallback)((event) => {
1198
+ setIsFocused.setFalse();
1199
+ onBlur?.(event);
1200
+ }, []);
1201
+ const textInputStyle = (0, import_react10.useMemo)(
1202
+ () => ({
1203
+ flex: 1,
1204
+ fontSize: 16,
1205
+ lineHeight: 20,
1206
+ color: theme2.colors.textPrimary,
1207
+ paddingHorizontal,
1208
+ paddingVertical
1209
+ }),
1210
+ [theme2.colors, paddingHorizontal, paddingVertical]
1211
+ );
1212
+ (0, import_react10.useImperativeHandle)(
1213
+ ref,
1214
+ () => {
1215
+ return {};
1216
+ },
1217
+ []
1218
+ );
1219
+ const prefixSuffixBackgroundColor = colorTheme === "light" ? (0, import_react_better_core9.darkenColor)(theme2.colors.backgroundContent, 0.03) : (0, import_react_better_core9.lightenColor)(theme2.colors.backgroundContent, 0.1);
1220
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(View_default, { isRow: true, position: "relative", alignItems: "center", children: [
1221
+ prefix && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1222
+ View_default,
1223
+ {
1224
+ isRow: true,
1225
+ height: "100%",
1226
+ backgroundColor: prefixSuffixBackgroundColor,
1227
+ alignItems: "center",
1228
+ borderWidth: 1,
1229
+ borderRightWidth: 0,
1230
+ borderTopLeftRadius: theme2.styles.borderRadius,
1231
+ borderBottomLeftRadius: theme2.styles.borderRadius,
1232
+ borderColor: theme2.colors.border,
1233
+ paddingHorizontal,
1234
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Text_default, { fontWeight: 700, children: prefix })
1235
+ }
1236
+ ),
1237
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1238
+ Animate_default.View,
1239
+ {
1240
+ flex: 1,
1241
+ backgroundColor: theme2.colors.backgroundContent,
1242
+ borderTopLeftRadius: prefix ? 0 : theme2.styles.borderRadius,
1243
+ borderBottomLeftRadius: prefix ? 0 : theme2.styles.borderRadius,
1244
+ borderTopRightRadius: suffix ? 0 : theme2.styles.borderRadius,
1245
+ borderBottomRightRadius: suffix ? 0 : theme2.styles.borderRadius,
1246
+ borderWidth: 1,
1247
+ initialBorderColor: theme2.colors.border,
1248
+ animateBorderColor: isFocused ? theme2.colors.primary : theme2.colors.border,
1249
+ overflow: "hidden",
1250
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1251
+ import_react_native8.TextInput,
1252
+ {
1253
+ style: textInputStyle,
1254
+ defaultValue,
1255
+ autoCapitalize,
1256
+ autoComplete,
1257
+ autoCorrect,
1258
+ autoFocus,
1259
+ placeholder,
1260
+ placeholderTextColor: theme2.colors.textSecondary + "80",
1261
+ readOnly: !editable,
1262
+ keyboardAppearance,
1263
+ keyboardType,
1264
+ cursorColor: theme2.colors.primary,
1265
+ selectionColor: theme2.colors.primary,
1266
+ secureTextEntry,
1267
+ onFocus: onFocusElement,
1268
+ onBlur: onBlurElement
1269
+ }
1270
+ )
1271
+ }
1272
+ ),
1273
+ suffix && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1274
+ View_default,
1275
+ {
1276
+ isRow: true,
1277
+ height: "100%",
1278
+ backgroundColor: prefixSuffixBackgroundColor,
1279
+ alignItems: "center",
1280
+ borderWidth: 1,
1281
+ borderLeftWidth: 0,
1282
+ borderTopRightRadius: theme2.styles.borderRadius,
1283
+ borderBottomRightRadius: theme2.styles.borderRadius,
1284
+ borderColor: theme2.colors.border,
1285
+ paddingHorizontal,
1286
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Text_default, { fontWeight: 700, children: suffix })
1287
+ }
1288
+ )
1289
+ ] });
1290
+ }
1291
+ );
1292
+ InputFieldComponent.email = (0, import_react10.forwardRef)(function Email(props, ref) {
1293
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1294
+ InputFieldComponent,
1295
+ {
1296
+ placeholder: "your@email.here",
1297
+ autoComplete: "email",
1298
+ keyboardType: "email-address",
1299
+ autoCapitalize: "none",
1300
+ autoCorrect: false,
1301
+ ...props,
1302
+ ref
1303
+ }
1304
+ );
1305
+ });
1306
+ InputFieldComponent.password = (0, import_react10.forwardRef)(function Password(props, ref) {
1307
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1308
+ InputFieldComponent,
1309
+ {
1310
+ secureTextEntry: true,
1311
+ placeholder: "******",
1312
+ autoCapitalize: "none",
1313
+ autoComplete: "password",
1314
+ autoCorrect: false,
1315
+ ...props,
1316
+ ref
1317
+ }
1318
+ );
1319
+ });
1320
+ var InputField = (0, import_react10.memo)(InputFieldComponent);
1321
+ InputField.email = InputFieldComponent.email;
1322
+ InputField.password = InputFieldComponent.password;
1323
+ var InputField_default = InputField;
1324
+
1053
1325
  // src/plugins/asyncStorage.ts
1054
1326
  var defaultAsyncStoragePluginOptions = {};
1055
1327
  var asyncStoragePlugin = (options) => ({
@@ -1067,6 +1339,8 @@ var asyncStoragePlugin = (options) => ({
1067
1339
  Animate,
1068
1340
  BetterComponentsProvider,
1069
1341
  Button,
1342
+ Image,
1343
+ InputField,
1070
1344
  Loader,
1071
1345
  ScreenHolder,
1072
1346
  Text,
@@ -1092,6 +1366,7 @@ var asyncStoragePlugin = (options) => ({
1092
1366
  useBooleanState,
1093
1367
  useDebounceState,
1094
1368
  useDevice,
1369
+ useKeyboard,
1095
1370
  useLoader,
1096
1371
  useLoaderControls,
1097
1372
  useTheme