@swan-io/lake 1.5.1 → 1.6.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swan-io/lake",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "engines": {
5
5
  "node": ">=14.0.0",
6
6
  "yarn": "^1.20.0"
@@ -0,0 +1,25 @@
1
+ import { Future, Result } from "@swan-io/boxed";
2
+ import { MutableRefObject, ReactNode } from "react";
3
+ type Suggestion<T> = {
4
+ id: string;
5
+ title: string;
6
+ subtitle: string;
7
+ value: T;
8
+ };
9
+ type Props<T> = {
10
+ inputRef?: MutableRefObject<unknown>;
11
+ value?: string;
12
+ onValueChange: (value: string) => void;
13
+ disabled?: boolean;
14
+ id?: string;
15
+ placeholder?: string;
16
+ error?: string;
17
+ emptyResultText: string;
18
+ ListFooterComponent?: ReactNode;
19
+ shouldDisplaySuggestions?: boolean;
20
+ loadSuggestions: (value: string) => Future<Result<Suggestion<T>[], unknown>>;
21
+ onSuggestion: (suggestion: Suggestion<T>) => void;
22
+ onLoadError?: (error: unknown) => void;
23
+ };
24
+ export declare const AutocompleteSearchInput: <T>({ inputRef, value, onValueChange, disabled, id, placeholder, error, emptyResultText, ListFooterComponent, shouldDisplaySuggestions, loadSuggestions, onSuggestion, onLoadError, }: Props<T>) => JSX.Element;
25
+ export {};
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AsyncData } from "@swan-io/boxed";
3
+ import { useRef, useState } from "react";
4
+ import { colors } from "../constants/design";
5
+ import { LakeCombobox } from "./LakeCombobox";
6
+ import { LakeText } from "./LakeText";
7
+ export const AutocompleteSearchInput = ({ inputRef, value, onValueChange, disabled, id, placeholder, error, emptyResultText, ListFooterComponent, shouldDisplaySuggestions = true, loadSuggestions, onSuggestion, onLoadError, }) => {
8
+ const [state, setState] = useState(AsyncData.NotAsked());
9
+ const lastRequest = useRef();
10
+ return (_jsx(LakeCombobox, { inputRef: inputRef, id: id, placeholder: placeholder, value: value ?? "", items: state, icon: "search-filled", disabled: disabled, error: error, ListFooterComponent: ListFooterComponent, onSelectItem: item => {
11
+ onSuggestion(item);
12
+ }, onValueChange: value => {
13
+ lastRequest.current?.cancel(); // cancel previous request to avoid race condition
14
+ lastRequest.current = undefined; // avoid to cancel twice the same request
15
+ onValueChange(value);
16
+ if (value.length <= 3 || !shouldDisplaySuggestions) {
17
+ return setState(AsyncData.NotAsked());
18
+ }
19
+ setState(AsyncData.Loading());
20
+ const request = loadSuggestions(value);
21
+ lastRequest.current = request;
22
+ if (onLoadError != null) {
23
+ request.tapError(onLoadError);
24
+ }
25
+ request.onResolve(value => setState(AsyncData.Done(value)));
26
+ }, keyExtractor: item => item.id, emptyResultText: emptyResultText, renderItem: item => (_jsxs(_Fragment, { children: [_jsx(LakeText, { numberOfLines: 1, selectable: false, color: colors.gray[900], children: item.title }), _jsx(LakeText, { numberOfLines: 1, selectable: false, variant: "smallRegular", children: item.subtitle })] })) }));
27
+ };
@@ -16,7 +16,7 @@ const styles = StyleSheet.create({
16
16
  list: {
17
17
  paddingVertical: 20,
18
18
  marginVertical: 4,
19
- width: 250,
19
+ minWidth: 250,
20
20
  overflow: "hidden",
21
21
  },
22
22
  item: {
@@ -60,7 +60,7 @@ const styles = StyleSheet.create({
60
60
  paddingHorizontal: 24,
61
61
  },
62
62
  input: {
63
- width: 200,
63
+ minWidth: 200,
64
64
  },
65
65
  value: {
66
66
  maxWidth: 130,
@@ -76,6 +76,9 @@ const styles = StyleSheet.create({
76
76
  cursor: "not-allowed",
77
77
  opacity: 0.3,
78
78
  },
79
+ resetOpacity: {
80
+ opacity: 1,
81
+ },
79
82
  loaderContainer: {
80
83
  ...StyleSheet.absoluteFillObject,
81
84
  alignItems: "center",
@@ -114,6 +117,7 @@ export const LakeButton = memo(forwardRef(({ ariaControls, ariaExpanded, ariaLab
114
117
  hasIconEnd && (isSmall ? styles.withIconEndSmall : styles.withIconEnd),
115
118
  hasOnlyIcon && (isSmall ? styles.iconSmallOnly : styles.iconOnly),
116
119
  disabled && styles.disabled,
120
+ disabled && forceBackground && styles.resetOpacity,
117
121
  grow && styles.grow,
118
122
  typeof style == "function" ? style({ hovered, pressed, focused }) : style,
119
123
  match(mode)
@@ -135,7 +139,11 @@ export const LakeButton = memo(forwardRef(({ ariaControls, ariaExpanded, ariaLab
135
139
  ? backgroundColor.accented
136
140
  : invariantColors.transparent,
137
141
  borderWidth: 1,
138
- borderColor: hovered ? colors[color][600] : colors[color][300],
142
+ borderColor: disabled && forceBackground
143
+ ? colors[color][100]
144
+ : hovered
145
+ ? colors[color][600]
146
+ : colors[color][300],
139
147
  }))
140
148
  .with("tertiary", () => ({
141
149
  backgroundColor: pressed
@@ -147,9 +155,11 @@ export const LakeButton = memo(forwardRef(({ ariaControls, ariaExpanded, ariaLab
147
155
  .exhaustive(),
148
156
  ], children: ({ pressed, hovered }) => {
149
157
  const textColor = mode === "secondary" || mode === "tertiary"
150
- ? hovered || pressed
151
- ? colors[color][700]
152
- : colors[color][600]
158
+ ? disabled && forceBackground
159
+ ? colors[color][300]
160
+ : hovered || pressed
161
+ ? colors[color][700]
162
+ : colors[color][600]
153
163
  : colors[color].contrast;
154
164
  return (_jsxs(_Fragment, { children: [hasIconStart && (_jsxs(_Fragment, { children: [_jsx(Icon, { color: textColor, name: icon, size: iconSize }), isNotNullish(children) && _jsx(Space, { width: isSmall ? 8 : 12 })] })), isReactText(children) ? (_jsx(LakeText, { numberOfLines: 1, userSelect: "none", style: [isSmall ? styles.textSmall : styles.text, { color: textColor }], children: children })) : (children), hasIconEnd && (_jsxs(_Fragment, { children: [isNotNullish(children) && _jsx(Space, { width: isSmall ? 8 : 12 }), _jsx(Icon, { color: textColor, name: icon, size: iconSize })] })), loading && (_jsx(View, { role: "none", style: [
155
165
  styles.loaderContainer,
@@ -122,7 +122,7 @@ const LakeComboboxWithRef = ({ inputRef, value, items, ListFooterComponent, onVa
122
122
  }
123
123
  const nextIndex = index + direction;
124
124
  event.preventDefault();
125
- if (nextIndex === 0) {
125
+ if (nextIndex === -1) {
126
126
  ref.current?.focus();
127
127
  }
128
128
  else {
@@ -112,8 +112,8 @@ const styles = StyleSheet.create({
112
112
  ...StyleSheet.absoluteFillObject,
113
113
  },
114
114
  closeButton: {
115
- top: negativeSpacings[4],
116
- right: negativeSpacings[4],
115
+ top: negativeSpacings[16],
116
+ right: negativeSpacings[16],
117
117
  },
118
118
  });
119
119
  export const LakeModal = ({ visible, icon, title, color = "current", children, maxWidth = 570, onPressClose, }) => {
@@ -22,6 +22,7 @@ export type LakeTextInputProps = Except<TextInputProps, "editable" | "keyboardTy
22
22
  style?: TextInputProps["style"];
23
23
  onChange?: ChangeEventHandler<HTMLInputElement>;
24
24
  maxCharCount?: number;
25
+ help?: string;
25
26
  };
26
27
  export declare const LakeTextInput: import("react").ForwardRefExoticComponent<Except<TextInputProps, "editable" | "keyboardType" | "onChange"> & {
27
28
  ariaExpanded?: boolean | undefined;
@@ -42,4 +43,5 @@ export declare const LakeTextInput: import("react").ForwardRefExoticComponent<Ex
42
43
  style?: TextInputProps["style"];
43
44
  onChange?: ChangeEventHandler<HTMLInputElement> | undefined;
44
45
  maxCharCount?: number | undefined;
46
+ help?: string | undefined;
45
47
  } & import("react").RefAttributes<TextInput | null>>;
@@ -124,7 +124,7 @@ const styles = StyleSheet.create({
124
124
  export const LakeTextInput = forwardRef(({ ariaExpanded, ariaControls, error, disabled = false, validating = false, valid = false, readOnly = false, icon, children, unit, color = "gray", inputMode = "text", hideErrors = false, onChange, pattern, style: stylesFromProps, onFocus: originalOnFocus, onBlur: originalOnBlur, value, defaultValue, multiline = false,
125
125
  //maxCharCount is different from maxLength(props inherited of TextInput), maxLength truncates the text in the limitation asked,
126
126
  //maxCharCount doesn't have limitation but displays a counter of characters
127
- maxCharCount, ...props }, forwardRef) => {
127
+ maxCharCount, help, ...props }, forwardRef) => {
128
128
  const inputRef = useRef(null);
129
129
  const [isHovered, setIsHovered] = useState(false);
130
130
  const [isFocused, setIsFocused] = useState(false);
@@ -159,5 +159,5 @@ maxCharCount, ...props }, forwardRef) => {
159
159
  isFocused && styles.focused,
160
160
  isFocused && { borderColor: colors[color][500] },
161
161
  stylesFromProps,
162
- ] }), validating && (_jsx(ActivityIndicator, { size: "small", style: styles.endIcon, color: colors.current[500] })), !validating && hasError && (_jsx(Icon, { name: "warning-regular", size: 20, color: colors.negative[400], style: [styles.endIcon, readOnly && styles.readOnlyEndIcon] })), !validating && !hasError && valid && (_jsx(Icon, { name: "checkmark-filled", size: 20, color: colors.positive[400], style: [styles.endIcon, readOnly && styles.readOnlyEndIcon] })), isNotNullish(icon) && (_jsx(Icon, { name: icon, size: 20, color: colors.current.primary, style: styles.icon }))] }), isNotNullish(unit) && (_jsx(LakeText, { color: colors.gray[900], style: [styles.unit, (disabled || readOnly) && styles.unitDisabled], children: unit }))] }), children] }), !hideErrors && (_jsxs(Box, { direction: "row", justifyContent: "spaceBetween", style: styles.errorContainer, children: [_jsx(LakeText, { variant: "smallRegular", color: colors.negative[500], children: error ?? " " }), isNotNullish(maxCharCount) && (_jsxs(_Fragment, { children: [_jsx(Fill, { minWidth: 4 }), _jsxs(LakeText, { variant: "smallRegular", color: charCount > maxCharCount ? colors.negative[500] : colors.gray[400], style: styles.descriptionLimitation, children: [charCount, " / ", maxCharCount] })] }))] }))] }));
162
+ ] }), validating && (_jsx(ActivityIndicator, { size: "small", style: styles.endIcon, color: colors.current[500] })), !validating && hasError && (_jsx(Icon, { name: "warning-regular", size: 20, color: colors.negative[400], style: [styles.endIcon, readOnly && styles.readOnlyEndIcon] })), !validating && !hasError && valid && (_jsx(Icon, { name: "checkmark-filled", size: 20, color: colors.positive[400], style: [styles.endIcon, readOnly && styles.readOnlyEndIcon] })), isNotNullish(icon) && (_jsx(Icon, { name: icon, size: 20, color: colors.current.primary, style: styles.icon }))] }), isNotNullish(unit) && (_jsx(LakeText, { color: colors.gray[900], style: [styles.unit, (disabled || readOnly) && styles.unitDisabled], children: unit }))] }), children] }), !hideErrors && (_jsxs(Box, { direction: "row", style: styles.errorContainer, children: [isNotNullish(help) ? (_jsx(LakeText, { variant: "smallRegular", color: isNotNullish(error) ? colors.negative[500] : colors.gray[500], children: help })) : (_jsx(LakeText, { variant: "smallRegular", color: colors.negative[500], children: error ?? " " })), isNotNullish(maxCharCount) && (_jsxs(_Fragment, { children: [_jsx(Fill, { minWidth: 4 }), _jsxs(LakeText, { variant: "smallRegular", color: charCount > maxCharCount ? colors.negative[500] : colors.gray[400], style: styles.descriptionLimitation, children: [charCount, " / ", maxCharCount] })] }))] }))] }));
163
163
  });
@@ -275,6 +275,7 @@ export declare const PressableTextInput: FC<Except<{
275
275
  "aria-rowspan"?: number | undefined;
276
276
  "aria-setsize"?: number | undefined;
277
277
  "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
278
+ value?: string | undefined;
278
279
  allowFontScaling?: boolean | undefined;
279
280
  numberOfLines?: number | undefined;
280
281
  onPress?: ((event: import("react-native").GestureResponderEvent) => void) | undefined;
@@ -286,33 +287,32 @@ export declare const PressableTextInput: FC<Except<{
286
287
  disabled?: boolean | undefined;
287
288
  selectionColor?: import("react-native").ColorValue | undefined;
288
289
  textBreakStrategy?: "simple" | "highQuality" | "balanced" | undefined;
289
- autoFocus?: boolean | undefined;
290
- value?: string | undefined;
291
- onContentSizeChange?: ((e: NativeSyntheticEvent<import("react-native").TextInputContentSizeChangeEventData>) => void) | undefined;
292
- onScroll?: ((e: NativeSyntheticEvent<import("react-native").TextInputScrollEventData>) => void) | undefined;
293
- scrollEnabled?: boolean | undefined;
290
+ placeholderTextColor?: import("react-native").ColorValue | undefined;
291
+ readOnly?: boolean | undefined;
292
+ editable?: boolean | undefined;
293
+ keyboardType?: import("react-native").KeyboardTypeOptions | undefined;
294
+ onChange?: ((e: NativeSyntheticEvent<import("react-native").TextInputChangeEventData>) => void) | undefined;
294
295
  autoCapitalize?: "none" | "sentences" | "words" | "characters" | undefined;
295
296
  autoCorrect?: boolean | undefined;
297
+ autoFocus?: boolean | undefined;
296
298
  blurOnSubmit?: boolean | undefined;
297
299
  caretHidden?: boolean | undefined;
298
300
  contextMenuHidden?: boolean | undefined;
299
301
  defaultValue?: string | undefined;
300
- editable?: boolean | undefined;
301
- keyboardType?: import("react-native").KeyboardTypeOptions | undefined;
302
302
  inputMode?: import("react-native").InputModeOptions | undefined;
303
303
  maxLength?: number | undefined;
304
304
  multiline?: boolean | undefined;
305
305
  onBlur?: ((event: NativeSyntheticEvent<React.FocusEvent>) => void) | undefined;
306
- onChange?: ((e: NativeSyntheticEvent<import("react-native").TextInputChangeEventData>) => void) | undefined;
307
306
  onChangeText?: ((text: string) => void) | undefined;
307
+ onContentSizeChange?: ((e: NativeSyntheticEvent<import("react-native").TextInputContentSizeChangeEventData>) => void) | undefined;
308
308
  onEndEditing?: ((e: NativeSyntheticEvent<import("react-native").TextInputEndEditingEventData>) => void) | undefined;
309
309
  onFocus?: ((event: NativeSyntheticEvent<React.FocusEvent>) => void) | undefined;
310
310
  onSelectionChange?: ((e: NativeSyntheticEvent<import("react-native").TextInputSelectionChangeEventData>) => void) | undefined;
311
311
  onSubmitEditing?: ((e: NativeSyntheticEvent<import("react-native").TextInputSubmitEditingEventData>) => void) | undefined;
312
312
  onTextInput?: ((e: NativeSyntheticEvent<import("react-native").TextInputTextInputEventData>) => void) | undefined;
313
+ onScroll?: ((e: NativeSyntheticEvent<import("react-native").TextInputScrollEventData>) => void) | undefined;
313
314
  onKeyPress?: ((e: NativeSyntheticEvent<import("react-native").TextInputKeyPressEventData>) => void) | undefined;
314
315
  placeholder?: string | undefined;
315
- placeholderTextColor?: import("react-native").ColorValue | undefined;
316
316
  returnKeyType?: import("react-native").ReturnKeyTypeOptions | undefined;
317
317
  secureTextEntry?: boolean | undefined;
318
318
  selectTextOnFocus?: boolean | undefined;
@@ -322,10 +322,9 @@ export declare const PressableTextInput: FC<Except<{
322
322
  } | undefined;
323
323
  inputAccessoryViewID?: string | undefined;
324
324
  initialValue?: string | undefined;
325
- autoComplete?: "off" | "name" | "email" | "url" | "tel" | "additional-name" | "address-level1" | "address-level2" | "address-level3" | "address-level4" | "address-line1" | "address-line2" | "address-line3" | "bday" | "bday-day" | "bday-month" | "bday-year" | "cc-additional-name" | "cc-csc" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-family-name" | "cc-given-name" | "cc-name" | "cc-number" | "cc-type" | "country" | "country-name" | "current-password" | "family-name" | "given-name" | "honorific-prefix" | "honorific-suffix" | "impp" | "language" | "new-password" | "nickname" | "on" | "one-time-code" | "organization" | "organization-title" | "postal-code" | "sex" | "street-address" | "tel-area-code" | "tel-country-code" | "tel-extension" | "tel-local" | "tel-national" | "transaction-amount" | "transaction-currency" | "username" | undefined;
325
+ autoComplete?: "off" | "name" | "email" | "tel" | "url" | "additional-name" | "address-level1" | "address-level2" | "address-level3" | "address-level4" | "address-line1" | "address-line2" | "address-line3" | "bday" | "bday-day" | "bday-month" | "bday-year" | "cc-additional-name" | "cc-csc" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-family-name" | "cc-given-name" | "cc-name" | "cc-number" | "cc-type" | "country" | "country-name" | "current-password" | "family-name" | "given-name" | "honorific-prefix" | "honorific-suffix" | "impp" | "language" | "new-password" | "nickname" | "on" | "one-time-code" | "organization" | "organization-title" | "postal-code" | "sex" | "street-address" | "tel-area-code" | "tel-country-code" | "tel-extension" | "tel-local" | "tel-national" | "transaction-amount" | "transaction-currency" | "username" | undefined;
326
326
  enterKeyHint?: "enter" | "search" | "done" | "go" | "next" | "send" | "previous" | undefined;
327
327
  rows?: number | undefined;
328
- readOnly?: boolean | undefined;
329
328
  clearButtonMode?: "never" | "while-editing" | "unless-editing" | "always" | undefined;
330
329
  clearTextOnFocus?: boolean | undefined;
331
330
  dataDetectorTypes?: import("react-native").DataDetectorTypes | import("react-native").DataDetectorTypes[] | undefined;
@@ -336,6 +335,7 @@ export declare const PressableTextInput: FC<Except<{
336
335
  selectionState?: import("react-native").DocumentSelectionState | undefined;
337
336
  spellCheck?: boolean | undefined;
338
337
  textContentType?: "none" | "location" | "name" | "nickname" | "username" | "URL" | "addressCity" | "addressCityAndState" | "addressState" | "countryName" | "creditCardNumber" | "emailAddress" | "familyName" | "fullStreetAddress" | "givenName" | "jobTitle" | "middleName" | "namePrefix" | "nameSuffix" | "organizationName" | "postalCode" | "streetAddressLine1" | "streetAddressLine2" | "sublocality" | "telephoneNumber" | "password" | "newPassword" | "oneTimeCode" | undefined;
338
+ scrollEnabled?: boolean | undefined;
339
339
  cursorColor?: import("react-native").ColorValue | null | undefined;
340
340
  importantForAutofill?: "auto" | "yes" | "no" | "noExcludeDescendants" | "yesExcludeDescendants" | undefined;
341
341
  disableFullscreenUI?: boolean | undefined;
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ type SortDirection = "Asc" | "Desc";
3
+ export type SortField<T> = {
4
+ name: T;
5
+ ascLabel: string;
6
+ descLabel: string;
7
+ };
8
+ export type SortValue<T extends string> = {
9
+ field: T;
10
+ direction: SortDirection;
11
+ };
12
+ type Props<T extends string> = {
13
+ visible: boolean;
14
+ title: string;
15
+ fields: SortField<T>[];
16
+ value: SortValue<T> | undefined;
17
+ onChange: (value: SortValue<T>) => void;
18
+ onClose: () => void;
19
+ };
20
+ export declare const SortBottomPanel: <T extends string>({ visible, title, value, fields, onChange, onClose, }: Props<T>) => JSX.Element;
21
+ export {};
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment } from "react";
3
+ import { StyleSheet, View } from "react-native";
4
+ import { commonStyles } from "../constants/commonStyles";
5
+ import { colors, spacings } from "../constants/design";
6
+ import { BottomPanel } from "./BottomPanel";
7
+ import { Icon } from "./Icon";
8
+ import { LakeHeading } from "./LakeHeading";
9
+ import { LakeRadio } from "./LakeRadio";
10
+ import { LakeText } from "./LakeText";
11
+ import { Pressable } from "./Pressable";
12
+ import { Separator } from "./Separator";
13
+ import { Space } from "./Space";
14
+ const styles = StyleSheet.create({
15
+ head: {
16
+ padding: 24,
17
+ paddingBottom: 12,
18
+ },
19
+ option: {
20
+ display: "flex",
21
+ flexDirection: "row",
22
+ alignItems: "center",
23
+ paddingHorizontal: spacings[24],
24
+ paddingVertical: spacings[12],
25
+ },
26
+ arrowDown: {
27
+ transform: "rotate(180deg)",
28
+ },
29
+ text: {
30
+ ...commonStyles.fill,
31
+ },
32
+ });
33
+ export const SortBottomPanel = ({ visible, title, value, fields, onChange, onClose, }) => {
34
+ return (_jsxs(BottomPanel, { visible: visible, onPressClose: onClose, children: [_jsx(View, { style: styles.head, children: _jsx(LakeHeading, { level: 3, variant: "h3", children: title }) }), fields.map((field, index) => (_jsxs(Fragment, { children: [_jsxs(Pressable, { style: styles.option, onPress: () => {
35
+ onChange({ field: field.name, direction: "Asc" });
36
+ onClose();
37
+ }, children: [_jsx(Icon, { name: "arrow-up-filled", size: 12, color: colors.gray[600], style: styles.arrowDown }), _jsx(Space, { width: 12 }), _jsx(LakeText, { variant: "smallRegular", color: colors.gray[600], style: styles.text, children: field.ascLabel }), _jsx(Space, { width: 16 }), _jsx(LakeRadio, { value: value?.field === field.name && value.direction === "Asc" })] }), _jsxs(Pressable, { style: styles.option, onPress: () => {
38
+ onChange({ field: field.name, direction: "Desc" });
39
+ onClose();
40
+ }, children: [_jsx(Icon, { name: "arrow-up-filled", size: 12, color: colors.gray[600] }), _jsx(Space, { width: 12 }), _jsx(LakeText, { variant: "smallRegular", color: colors.gray[600], style: styles.text, children: field.descLabel }), _jsx(Space, { width: 16 }), _jsx(LakeRadio, { value: value?.field === field.name && value.direction === "Desc" })] }), index < fields.length - 1 && _jsx(Separator, {})] }, field.name))), _jsx(Space, { height: 12 })] }));
41
+ };
@@ -7,6 +7,6 @@ export declare const Stack: import("react").ForwardRefExoticComponent<import("re
7
7
  justifyContent?: ("end" | "start" | "normal" | "center" | "spaceBetween" | "spaceAround" | "spaceEvenly") | undefined;
8
8
  style?: import("react-native").StyleProp<import("react-native").ViewStyle>;
9
9
  } & {
10
- space?: 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 48 | 72 | 96 | undefined;
10
+ space?: 4 | 8 | 12 | 16 | 20 | 32 | 24 | 40 | 48 | 72 | 96 | undefined;
11
11
  wrap?: boolean | undefined;
12
12
  } & import("react").RefAttributes<View>>;