From 79b231476bd6ad43174a2e5f6937c07409158c21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nishan=20=28o=5E=E2=96=BD=5Eo=29?= Date: Mon, 8 Jun 2026 23:42:56 +0530 Subject: [PATCH 1/2] [ui][compose] Add `BasicTextField` (#46442) # Why Adds `BasicTextField` which is unstyled `TextField` view and use it in universal `TextInput` instead of Material Filled one. # How TextInput on RN is an unstyled TextField. Currently ours is a Filled Material TextField. Compose has `BasicTextField` which is an unstyled one, so this PR adds that. # Test Plan Added example in NCL. # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --------- Co-authored-by: Aman Mittal --- .../UI/BasicTextFieldScreen.android.tsx | 126 ++++++++ .../screens/UI/TextFieldScreen.android.tsx | 3 - .../src/screens/UI/UIScreen.android.tsx | 8 + .../sdk/ui/jetpack-compose/textfield.mdx | 57 +++- .../sdk/ui/jetpack-compose/textfield.mdx | 57 +++- .../expo-ui/jetpack-compose/textfield.json | 2 +- .../jetpack-compose/usenativestate.json | 2 +- .../expo-ui/jetpack-compose/textfield.json | 2 +- .../jetpack-compose/usenativestate.json | 2 +- .../expo-ui/textfield/android-dark.webp | Bin 5228 -> 13156 bytes .../expo-ui/textfield/android-light.webp | Bin 5048 -> 13118 bytes packages/expo-ui/CHANGELOG.md | 3 + .../main/java/expo/modules/ui/ExpoUIModule.kt | 38 +++ .../modules/ui/textfield/BasicTextField.kt | 203 ++++++++++++ .../TextField.kt} | 282 ++--------------- .../modules/ui/textfield/TextFieldShared.kt | 299 ++++++++++++++++++ .../expo-ui/build/State/useNativeState.d.ts | 3 - .../build/State/useNativeState.d.ts.map | 2 +- .../TextField/BasicTextField.d.ts | 36 +++ .../TextField/BasicTextField.d.ts.map | 1 + .../jetpack-compose/TextField/TextField.d.ts | 131 ++++++++ .../TextField/TextField.d.ts.map | 1 + .../jetpack-compose/TextField/index.d.ts | 247 +-------------- .../jetpack-compose/TextField/index.d.ts.map | 2 +- .../jetpack-compose/TextField/shared.d.ts | 171 ++++++++++ .../jetpack-compose/TextField/shared.d.ts.map | 1 + .../expo-ui/build/jetpack-compose/index.d.ts | 2 +- .../build/jetpack-compose/index.d.ts.map | 2 +- .../TextInput/index.android.d.ts.map | 2 +- .../build/universal/TextInput/types.d.ts | 6 +- .../build/universal/TextInput/types.d.ts.map | 2 +- packages/expo-ui/src/State/useNativeState.ts | 12 +- .../TextField/BasicTextField.tsx | 118 +++++++ .../jetpack-compose/TextField/TextField.tsx | 198 ++++++++++++ .../src/jetpack-compose/TextField/index.ts | 19 ++ .../TextField/{index.tsx => shared.ts} | 274 +++++----------- packages/expo-ui/src/jetpack-compose/index.ts | 6 + .../src/universal/TextInput/index.android.tsx | 86 ++--- .../expo-ui/src/universal/TextInput/types.ts | 6 +- tools/src/commands/GenerateDocsAPIData.ts | 2 +- 40 files changed, 1622 insertions(+), 792 deletions(-) create mode 100644 apps/native-component-list/src/screens/UI/BasicTextFieldScreen.android.tsx create mode 100644 packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/BasicTextField.kt rename packages/expo-ui/android/src/main/java/expo/modules/ui/{TextFieldView.kt => textfield/TextField.kt} (59%) create mode 100644 packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextFieldShared.kt create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts.map create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts.map create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts create mode 100644 packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts.map create mode 100644 packages/expo-ui/src/jetpack-compose/TextField/BasicTextField.tsx create mode 100644 packages/expo-ui/src/jetpack-compose/TextField/TextField.tsx create mode 100644 packages/expo-ui/src/jetpack-compose/TextField/index.ts rename packages/expo-ui/src/jetpack-compose/TextField/{index.tsx => shared.ts} (50%) diff --git a/apps/native-component-list/src/screens/UI/BasicTextFieldScreen.android.tsx b/apps/native-component-list/src/screens/UI/BasicTextFieldScreen.android.tsx new file mode 100644 index 00000000000000..2d5fed2492fd52 --- /dev/null +++ b/apps/native-component-list/src/screens/UI/BasicTextFieldScreen.android.tsx @@ -0,0 +1,126 @@ +import { + BasicTextField, + BasicTextFieldRef, + Button, + Card, + Column, + Host, + LazyColumn, + Row, + Switch, + Text as ComposeText, + useNativeState, +} from '@expo/ui/jetpack-compose'; +import { fillMaxWidth, padding, weight } from '@expo/ui/jetpack-compose/modifiers'; +import * as React from 'react'; + +export default function BasicTextFieldScreen() { + const value = useNativeState(''); + const [text, setText] = React.useState(''); + const [focused, setFocused] = React.useState(false); + const [lastAction, setLastAction] = React.useState('none'); + const ref = React.useRef(null); + + const [enabled, setEnabled] = React.useState(true); + const [readOnly, setReadOnly] = React.useState(false); + const [singleLine, setSingleLine] = React.useState(true); + const [secure, setSecure] = React.useState(false); + + const p = padding(16, 12, 16, 12); + const cardModifiers = [fillMaxWidth()]; + + return ( + + + + + Undecorated + setLastAction(`done: ${v}`) }} + onValueChange={setText} + onFocusChanged={setFocused} + modifiers={[fillMaxWidth()]} + /> + + Value: {JSON.stringify(text)} | Focused: {String(focused)} | Action: {lastAction} + + + + + + + + + + + + + decorationBox + + + {text.length === 0 ? Type here… : null} + + + + + `decorationBox` wraps `InnerTextField`. Here the placeholder sits behind it and hides + once there's text. + + + + + {/* Props */} + + + Props + + + + + + + + + ); +} + +function SwitchRow({ + label, + value, + onCheckedChange, +}: { + label: string; + value: boolean; + onCheckedChange: (v: boolean) => void; +}) { + return ( + + {label} + + + ); +} + +BasicTextFieldScreen.navigationOptions = { + title: 'BasicTextField', +}; diff --git a/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx b/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx index c196d5f87cc320..4766165eed9788 100644 --- a/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx +++ b/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx @@ -78,9 +78,6 @@ export default function TextFieldScreen() { 'worklet'; console.log('Value changed to:', newValue); }; - return () => { - fieldValue.onChange = null; - }; }, []); const sharedProps = { diff --git a/apps/native-component-list/src/screens/UI/UIScreen.android.tsx b/apps/native-component-list/src/screens/UI/UIScreen.android.tsx index 42adb17f3f11ec..39b9096f33e66a 100644 --- a/apps/native-component-list/src/screens/UI/UIScreen.android.tsx +++ b/apps/native-component-list/src/screens/UI/UIScreen.android.tsx @@ -250,6 +250,14 @@ export const UIScreens = [ return optionalRequire(() => require('./TextFieldScreen')); }, }, + { + name: 'BasicTextField component', + route: 'ui/basicTextField', + options: {}, + getComponent() { + return optionalRequire(() => require('./BasicTextFieldScreen')); + }, + }, { name: 'Progress component', route: 'ui/progress', diff --git a/docs/pages/versions/unversioned/sdk/ui/jetpack-compose/textfield.mdx b/docs/pages/versions/unversioned/sdk/ui/jetpack-compose/textfield.mdx index a9489439057d50..8bf1712c4108b0 100644 --- a/docs/pages/versions/unversioned/sdk/ui/jetpack-compose/textfield.mdx +++ b/docs/pages/versions/unversioned/sdk/ui/jetpack-compose/textfield.mdx @@ -12,19 +12,20 @@ import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; > **info** For cross-platform usage, see the universal [`TextInput`](../universal/textinput) — it renders the appropriate native component per platform. -Expo UI provides two text field components that match the official Jetpack Compose [TextField API](https://developer.android.com/develop/ui/compose/text/user-input): `TextField` (filled) and `OutlinedTextField` (outlined border). Both variants share the same props and support composable slot children for label, placeholder, icons, prefix, suffix, and supporting text. +Expo UI provides three text field components that match the official Jetpack Compose [TextField API](https://developer.android.com/develop/ui/compose/text/user-input): `TextField` (filled), `OutlinedTextField` (outlined border), and `BasicTextField` (unstyled). The Material variants `TextField` and `OutlinedTextField` share the same props and support composable slot children for label, placeholder, icons, prefix, suffix, and supporting text. `BasicTextField` has no Material chrome, so you supply your own decoration. -| Type | Appearance | Purpose | -| -------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| Filled | Solid background with a bottom indicator line. | Default text input style following Material3 design. Use for most forms and input fields. | -| Outlined | Transparent background with a border outline. | Alternative style that provides a distinct visual boundary. Use when filled fields blend into the background. | +| Type | Appearance | Purpose | +| -------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | +| Filled | Solid background with a bottom indicator line. | Default text input style following Material3 design. Use for most forms and input fields. | +| Outlined | Transparent background with a border outline. | Alternative style that provides a distinct visual boundary. Use when filled fields blend into the background. | +| Basic | No container, indicator, or padding. Just the editable text. | Fully custom-styled inputs. Style it yourself and add decoration through `DecorationBox`. | ## Installation @@ -113,6 +114,48 @@ export default function OutlinedTextFieldExample() { } ``` +### Basic text field + +`BasicTextField` is the unstyled Compose primitive, with no container, indicator, or padding. Style it yourself with [modifiers](modifiers) and supply decoration through `DecorationBox`, placing `InnerTextField` where the editable text should render. Wrap placeholder content in `Placeholder` to have it shown only while the field is empty, toggled natively from the field's text. + +```tsx BasicTextFieldExample.tsx +import { Host, BasicTextField, Box, Text, useNativeState } from '@expo/ui/jetpack-compose'; +import { + background, + clip, + fillMaxWidth, + padding, + Shapes, +} from '@expo/ui/jetpack-compose/modifiers'; + +export default function BasicTextFieldExample() { + const value = useNativeState(''); + + return ( + + + + + + Search… + + + + + + + ); +} +``` + ### Slots Both `TextField` and `OutlinedTextField` support 7 composable slots that match the Compose API: `Label`, `Placeholder`, `LeadingIcon`, `TrailingIcon`, `Prefix`, `Suffix`, and `SupportingText`. @@ -317,7 +360,7 @@ export default function WorkletPhoneMaskExample() { ## API ```tsx -import { TextField, OutlinedTextField } from '@expo/ui/jetpack-compose'; +import { TextField, OutlinedTextField, BasicTextField } from '@expo/ui/jetpack-compose'; ``` diff --git a/docs/pages/versions/v56.0.0/sdk/ui/jetpack-compose/textfield.mdx b/docs/pages/versions/v56.0.0/sdk/ui/jetpack-compose/textfield.mdx index c3c1d24f75530b..741b1e475bb45b 100644 --- a/docs/pages/versions/v56.0.0/sdk/ui/jetpack-compose/textfield.mdx +++ b/docs/pages/versions/v56.0.0/sdk/ui/jetpack-compose/textfield.mdx @@ -12,19 +12,20 @@ import { ContentSpotlight } from '~/ui/components/ContentSpotlight'; > **info** For cross-platform usage, see the universal [`TextInput`](../universal/textinput) — it renders the appropriate native component per platform. -Expo UI provides two text field components that match the official Jetpack Compose [TextField API](https://developer.android.com/develop/ui/compose/text/user-input): `TextField` (filled) and `OutlinedTextField` (outlined border). Both variants share the same props and support composable slot children for label, placeholder, icons, prefix, suffix, and supporting text. +Expo UI provides three text field components that match the official Jetpack Compose [TextField API](https://developer.android.com/develop/ui/compose/text/user-input): `TextField` (filled), `OutlinedTextField` (outlined border), and `BasicTextField` (unstyled). The Material variants `TextField` and `OutlinedTextField` share the same props and support composable slot children for label, placeholder, icons, prefix, suffix, and supporting text. `BasicTextField` has no Material chrome, so you supply your own decoration. -| Type | Appearance | Purpose | -| -------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| Filled | Solid background with a bottom indicator line. | Default text input style following Material3 design. Use for most forms and input fields. | -| Outlined | Transparent background with a border outline. | Alternative style that provides a distinct visual boundary. Use when filled fields blend into the background. | +| Type | Appearance | Purpose | +| -------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | +| Filled | Solid background with a bottom indicator line. | Default text input style following Material3 design. Use for most forms and input fields. | +| Outlined | Transparent background with a border outline. | Alternative style that provides a distinct visual boundary. Use when filled fields blend into the background. | +| Basic | No container, indicator, or padding. Just the editable text. | Fully custom-styled inputs. Style it yourself and add decoration through `DecorationBox`. | ## Installation @@ -113,6 +114,48 @@ export default function OutlinedTextFieldExample() { } ``` +### Basic text field + +`BasicTextField` is the unstyled Compose primitive, with no container, indicator, or padding. Style it yourself with [modifiers](modifiers) and supply decoration through `DecorationBox`, placing `InnerTextField` where the editable text should render. Wrap placeholder content in `Placeholder` to have it shown only while the field is empty, toggled natively from the field's text. + +```tsx BasicTextFieldExample.tsx +import { Host, BasicTextField, Box, Text, useNativeState } from '@expo/ui/jetpack-compose'; +import { + background, + clip, + fillMaxWidth, + padding, + Shapes, +} from '@expo/ui/jetpack-compose/modifiers'; + +export default function BasicTextFieldExample() { + const value = useNativeState(''); + + return ( + + + + + + Search… + + + + + + + ); +} +``` + ### Slots Both `TextField` and `OutlinedTextField` support 7 composable slots that match the Compose API: `Label`, `Placeholder`, `LeadingIcon`, `TrailingIcon`, `Prefix`, `Suffix`, and `SupportingText`. @@ -317,7 +360,7 @@ export default function WorkletPhoneMaskExample() { ## API ```tsx -import { TextField, OutlinedTextField } from '@expo/ui/jetpack-compose'; +import { TextField, OutlinedTextField, BasicTextField } from '@expo/ui/jetpack-compose'; ``` diff --git a/docs/public/static/data/unversioned/expo-ui/jetpack-compose/textfield.json b/docs/public/static/data/unversioned/expo-ui/jetpack-compose/textfield.json index 0542f705abf515..df7123aa390979 100644 --- a/docs/public/static/data/unversioned/expo-ui/jetpack-compose/textfield.json +++ b/docs/public/static/data/unversioned/expo-ui/jetpack-compose/textfield.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/textfield","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"OutlinedTextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/TextField/index.tsx","qualifiedName":"BaseTextFieldProps"},"name":"BaseTextFieldProps","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}}]}}]}},{"name":"TextFieldCapitalization","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"characters"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"}]}},{"name":"TextFieldColors","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Colors for "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":".\nMaps to "},{"kind":"code","text":"`TextFieldColors`"},{"kind":"text","text":" in Compose, shared by both variants."}]},"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorCursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]},{"name":"TextFieldImeAction","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"none"},{"type":"literal","value":"go"},{"type":"literal","value":"search"},{"type":"literal","value":"send"},{"type":"literal","value":"previous"},{"type":"literal","value":"next"},{"type":"literal","value":"done"}]}},{"name":"TextFieldKeyboardActions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard actions matching Compose "},{"kind":"code","text":"`KeyboardActions`"},{"kind":"text","text":".\nThe triggered callback depends on the "},{"kind":"code","text":"`imeAction`"},{"kind":"text","text":" in "},{"kind":"code","text":"`keyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"onDone","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onGo","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onNext","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPrevious","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSearch","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSend","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"TextFieldKeyboardOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard options matching Compose "},{"kind":"code","text":"`KeyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"autoCorrectEnabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"capitalization","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'none'"}]}]},"type":{"type":"reference","name":"TextFieldCapitalization","package":"@expo/ui"}},{"name":"imeAction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'default'"}]}]},"type":{"type":"reference","name":"TextFieldImeAction","package":"@expo/ui"}},{"name":"keyboardType","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'text'"}]}]},"type":{"type":"reference","name":"TextFieldKeyboardType","package":"@expo/ui"}}]},{"name":"TextFieldKeyboardType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"text"},{"type":"literal","value":"number"},{"type":"literal","value":"email"},{"type":"literal","value":"phone"},{"type":"literal","value":"decimal"},{"type":"literal","value":"password"},{"type":"literal","value":"ascii"},{"type":"literal","value":"uri"},{"type":"literal","value":"numberPassword"}]}},{"name":"TextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/TextField/index.tsx","qualifiedName":"BaseTextFieldProps"},"name":"BaseTextFieldProps","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}}]}}]}},{"name":"TextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Can be used for imperatively focusing and setting text/selection on the "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" component."}]},"children":[{"name":"blur","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"clear","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Clear the current text."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"focus","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setSelection","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Programmatically set the selection range."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"start","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"end","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"newText","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}]},{"name":"OutlinedTextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"OutlinedTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":" with a transparent background and border outline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"OutlinedTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"TextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"TextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":"."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"TextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/textfield","variant":"project","kind":1,"children":[{"name":"BasicTextFieldProps","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props for "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". Mirrors Compose's "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":": a bare,\nunstyled text field with no Material chrome (no container, indicator, or\nbuilt-in padding). Shares "},{"kind":"inline-tag","tag":"@link","text":"CommonTextFieldProperties"},{"kind":"text","text":" with "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":"; use "},{"kind":"code","text":"`BasicTextField.DecorationBox`"},{"kind":"text","text":" to add your own\ndecoration."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the text cursor. Maps to Compose's "},{"kind":"code","text":"`cursorBrush`"},{"kind":"text","text":" via\n"},{"kind":"code","text":"`SolidColor(color)`"},{"kind":"text","text":". Defaults to the theme's primary color\n("},{"kind":"code","text":"`MaterialTheme.colorScheme.primary`"},{"kind":"text","text":") so it stays visible in light and dark."}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]}}]}},{"name":"BasicTextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Imperative methods for "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". Identical to "},{"kind":"inline-tag","tag":"@link","text":"TextFieldRef"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"TextFieldRef","package":"@expo/ui"}},{"name":"CommonTextFieldProperties","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props shared by every Compose text field variant — "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". The Material variants add their\nown decoration props ("},{"kind":"code","text":"`isError`"},{"kind":"text","text":", "},{"kind":"code","text":"`shape`"},{"kind":"text","text":", "},{"kind":"code","text":"`colors`"},{"kind":"text","text":", slot children);\n"},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" adds "},{"kind":"code","text":"`cursorColor`"},{"kind":"text","text":"."}]},"children":[{"name":"autoFocus","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If true, the text field will be focused automatically when mounted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Slot children that configure the field's decoration."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"enabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"keyboardActions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldKeyboardActions","package":"@expo/ui"}},{"name":"keyboardOptions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldKeyboardOptions","package":"@expo/ui"}},{"name":"maxLength","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum number of characters allowed. Truncates natively as the user types."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"maxLines","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minLines","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onFocusChanged","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A callback triggered when the field gains or loses focus."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"focused","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called when the selection range changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"selection","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"end","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"start","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onValueChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires whenever the text value changes. If marked with the "},{"kind":"code","text":"`'worklet'`"},{"kind":"text","text":"\ndirective, runs synchronously on the UI thread; otherwise delivered\nasynchronously as a regular JS event. Use "},{"kind":"code","text":"`onSelectionChange`"},{"kind":"text","text":" (or read\nthe "},{"kind":"code","text":"`selection`"},{"kind":"text","text":" observable) to react to selection-only changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"readOnly","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"ref","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.Ref"},"typeArguments":[{"type":"reference","name":"TextFieldRef","package":"@expo/ui"}],"name":"Ref","package":"@types/react","qualifiedName":"React.Ref"}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Observable state holding the current selection range. Create with\n"},{"kind":"code","text":"`useNativeState({ start: 0, end: 0 })`"},{"kind":"text","text":". The field writes user-driven\nchanges back to it, and writes from JS (or a worklet) update the\ncursor/selection in the field. Use "},{"kind":"code","text":"`ref.setSelection(start, end)`"},{"kind":"text","text":" for\nimperative one-shot updates."}]},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"end","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"start","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}],"name":"ObservableState","package":"@expo/ui"}},{"name":"singleLine","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"textSelectionColors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Selection-related colors. Maps to Compose's "},{"kind":"code","text":"`TextSelectionColors`"},{"kind":"text","text":" via\n"},{"kind":"code","text":"`LocalTextSelectionColors`"},{"kind":"text","text":". "},{"kind":"code","text":"`handleColor`"},{"kind":"text","text":" controls the drag handles (and\nthe caret's drag handle); "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":" is the highlighted-text\nbackground (typically the same tint at lower alpha so the underlying text\nstays readable). Independent of "},{"kind":"code","text":"`cursorColor`"},{"kind":"text","text":", which tints the caret line."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"backgroundColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"handleColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]}}},{"name":"textStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text styling for the field's content. Maps to Compose's "},{"kind":"code","text":"`TextStyle`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"TextFieldTextStyle","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An observable state that holds the current text value. Create one with\n"},{"kind":"code","text":"`useNativeState('initial text')`"},{"kind":"text","text":". If omitted, the field manages its own\ninternal state."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"visualTransformation","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Display-time text transformation. "},{"kind":"code","text":"`'password'`"},{"kind":"text","text":" masks every character;\n"},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" (default) leaves the buffer as-is."}]},"type":{"type":"union","types":[{"type":"literal","value":"password"},{"type":"literal","value":"none"}]}}]},{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"OutlinedTextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}},{"name":"isError","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Shape used for the field's container outline/fill. Use the helpers from\n"},{"kind":"code","text":"`Shape`"},{"kind":"text","text":" (for example, "},{"kind":"code","text":"``"},{"kind":"text","text":" or "},{"kind":"code","text":"``"},{"kind":"text","text":").\nDefaults to the Material "},{"kind":"code","text":"`OutlinedTextFieldDefaults.shape`"},{"kind":"text","text":"/"},{"kind":"code","text":"`TextFieldDefaults.shape`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/Shape/index.tsx","qualifiedName":"ShapeJSXElement"},"name":"ShapeJSXElement","package":"@expo/ui"}}]}}]}},{"name":"TextFieldCapitalization","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"characters"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"}]}},{"name":"TextFieldColors","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Colors for "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":".\nMaps to "},{"kind":"code","text":"`TextFieldColors`"},{"kind":"text","text":" in Compose, shared by both variants."}]},"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorCursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]},{"name":"TextFieldImeAction","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"none"},{"type":"literal","value":"go"},{"type":"literal","value":"search"},{"type":"literal","value":"send"},{"type":"literal","value":"previous"},{"type":"literal","value":"next"},{"type":"literal","value":"done"}]}},{"name":"TextFieldKeyboardActions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard actions matching Compose "},{"kind":"code","text":"`KeyboardActions`"},{"kind":"text","text":".\nThe triggered callback depends on the "},{"kind":"code","text":"`imeAction`"},{"kind":"text","text":" in "},{"kind":"code","text":"`keyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"onDone","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onGo","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onNext","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPrevious","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSearch","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSend","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"TextFieldKeyboardOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard options matching Compose "},{"kind":"code","text":"`KeyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"autoCorrectEnabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"capitalization","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'none'"}]}]},"type":{"type":"reference","name":"TextFieldCapitalization","package":"@expo/ui"}},{"name":"imeAction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'default'"}]}]},"type":{"type":"reference","name":"TextFieldImeAction","package":"@expo/ui"}},{"name":"keyboardType","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'text'"}]}]},"type":{"type":"reference","name":"TextFieldKeyboardType","package":"@expo/ui"}}]},{"name":"TextFieldKeyboardType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"text"},{"type":"literal","value":"number"},{"type":"literal","value":"email"},{"type":"literal","value":"phone"},{"type":"literal","value":"decimal"},{"type":"literal","value":"password"},{"type":"literal","value":"ascii"},{"type":"literal","value":"uri"},{"type":"literal","value":"numberPassword"}]}},{"name":"TextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}},{"name":"isError","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Shape used for the field's container outline/fill. Use the helpers from\n"},{"kind":"code","text":"`Shape`"},{"kind":"text","text":" (for example, "},{"kind":"code","text":"``"},{"kind":"text","text":" or "},{"kind":"code","text":"``"},{"kind":"text","text":").\nDefaults to the Material "},{"kind":"code","text":"`OutlinedTextFieldDefaults.shape`"},{"kind":"text","text":"/"},{"kind":"code","text":"`TextFieldDefaults.shape`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/Shape/index.tsx","qualifiedName":"ShapeJSXElement"},"name":"ShapeJSXElement","package":"@expo/ui"}}]}}]}},{"name":"TextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Can be used for imperatively focusing and setting text/selection on the\n"},{"kind":"code","text":"`TextField`"},{"kind":"text","text":", "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" components."}]},"children":[{"name":"blur","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"clear","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Clear the current text."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"focus","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setSelection","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Programmatically set the selection range."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"start","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"end","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"newText","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}]},{"name":"TextFieldTextStyle","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Text styling for a text field's content. Maps to Compose's "},{"kind":"code","text":"`TextStyle`"},{"kind":"text","text":".\nShared by "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":", "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":"."}]},"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"fontFamily","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"fontSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"fontWeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"100"},{"type":"literal","value":"200"},{"type":"literal","value":"300"},{"type":"literal","value":"400"},{"type":"literal","value":"500"},{"type":"literal","value":"600"},{"type":"literal","value":"700"},{"type":"literal","value":"800"},{"type":"literal","value":"900"},{"type":"literal","value":"normal"},{"type":"literal","value":"bold"}]}},{"name":"letterSpacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"lineHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"textAlign","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"left"},{"type":"literal","value":"right"},{"type":"literal","value":"center"},{"type":"literal","value":"justify"}]}}]},{"name":"BasicTextField","variant":"declaration","kind":64,"children":[{"name":"DecorationBox","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Wraps the editable text with custom decoration. Maps to Compose's\n"},{"kind":"code","text":"`decorationBox`"},{"kind":"text","text":". Place "},{"kind":"inline-tag","tag":"@link","text":"InnerTextField"},{"kind":"text","text":" inside it where the text\nshould render."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"InnerTextField","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The editable text itself, placed wherever you want it inside\n"},{"kind":"inline-tag","tag":"@link","text":"DecorationBox"},{"kind":"text","text":". Maps to the "},{"kind":"code","text":"`innerTextField`"},{"kind":"text","text":" lambda Compose passes to\n"},{"kind":"code","text":"`decorationBox`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A placeholder shown only while the field is empty. Place it inside\n"},{"kind":"inline-tag","tag":"@link","text":"DecorationBox"},{"kind":"text","text":", typically overlaying "},{"kind":"inline-tag","tag":"@link","text":"InnerTextField"},{"kind":"text","text":". Its\nvisibility is toggled natively from the field's text, so it stays correct for\nevery change — typing, "},{"kind":"code","text":"`clear()`"},{"kind":"text","text":", "},{"kind":"code","text":"`setText`"},{"kind":"text","text":", and writes to the "},{"kind":"code","text":"`value`"},{"kind":"text","text":"\nobservable — without a JS round-trip."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"BasicTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bare, unstyled Compose "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" with no Material decoration."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"BasicTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"OutlinedTextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"OutlinedTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":" with a transparent background and border outline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"OutlinedTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"TextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"TextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":"."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"TextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/unversioned/expo-ui/jetpack-compose/usenativestate.json b/docs/public/static/data/unversioned/expo-ui/jetpack-compose/usenativestate.json index 96b493e4b20e58..eb400d3fad6f44 100644 --- a/docs/public/static/data/unversioned/expo-ui/jetpack-compose/usenativestate.json +++ b/docs/public/static/data/unversioned/expo-ui/jetpack-compose/usenativestate.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/usenativestate","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"useNativeState","variant":"declaration","kind":64,"signatures":[{"name":"useNativeState","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an observable native state that is automatically cleaned up when the\ncomponent unmounts. "},{"kind":"code","text":"`initialValue`"},{"kind":"text","text":" is captured once on the first render"}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"parameters":[{"name":"initialValue","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}],"name":"ObservableState","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/usenativestate","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"useNativeState","variant":"declaration","kind":64,"signatures":[{"name":"useNativeState","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an observable native state that is automatically cleaned up when the\ncomponent unmounts. "},{"kind":"code","text":"`initialValue`"},{"kind":"text","text":" is captured once on the first render"}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"parameters":[{"name":"initialValue","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}],"name":"ObservableState","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/textfield.json b/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/textfield.json index 0542f705abf515..df7123aa390979 100644 --- a/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/textfield.json +++ b/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/textfield.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/textfield","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"OutlinedTextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/TextField/index.tsx","qualifiedName":"BaseTextFieldProps"},"name":"BaseTextFieldProps","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}}]}}]}},{"name":"TextFieldCapitalization","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"characters"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"}]}},{"name":"TextFieldColors","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Colors for "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":".\nMaps to "},{"kind":"code","text":"`TextFieldColors`"},{"kind":"text","text":" in Compose, shared by both variants."}]},"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorCursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]},{"name":"TextFieldImeAction","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"none"},{"type":"literal","value":"go"},{"type":"literal","value":"search"},{"type":"literal","value":"send"},{"type":"literal","value":"previous"},{"type":"literal","value":"next"},{"type":"literal","value":"done"}]}},{"name":"TextFieldKeyboardActions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard actions matching Compose "},{"kind":"code","text":"`KeyboardActions`"},{"kind":"text","text":".\nThe triggered callback depends on the "},{"kind":"code","text":"`imeAction`"},{"kind":"text","text":" in "},{"kind":"code","text":"`keyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"onDone","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onGo","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onNext","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPrevious","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSearch","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSend","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"TextFieldKeyboardOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard options matching Compose "},{"kind":"code","text":"`KeyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"autoCorrectEnabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"capitalization","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'none'"}]}]},"type":{"type":"reference","name":"TextFieldCapitalization","package":"@expo/ui"}},{"name":"imeAction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'default'"}]}]},"type":{"type":"reference","name":"TextFieldImeAction","package":"@expo/ui"}},{"name":"keyboardType","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'text'"}]}]},"type":{"type":"reference","name":"TextFieldKeyboardType","package":"@expo/ui"}}]},{"name":"TextFieldKeyboardType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"text"},{"type":"literal","value":"number"},{"type":"literal","value":"email"},{"type":"literal","value":"phone"},{"type":"literal","value":"decimal"},{"type":"literal","value":"password"},{"type":"literal","value":"ascii"},{"type":"literal","value":"uri"},{"type":"literal","value":"numberPassword"}]}},{"name":"TextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/TextField/index.tsx","qualifiedName":"BaseTextFieldProps"},"name":"BaseTextFieldProps","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}}]}}]}},{"name":"TextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Can be used for imperatively focusing and setting text/selection on the "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" component."}]},"children":[{"name":"blur","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"clear","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Clear the current text."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"focus","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setSelection","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Programmatically set the selection range."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"start","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"end","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"newText","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}]},{"name":"OutlinedTextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"OutlinedTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":" with a transparent background and border outline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"OutlinedTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"TextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"TextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":"."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"TextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/textfield","variant":"project","kind":1,"children":[{"name":"BasicTextFieldProps","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props for "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". Mirrors Compose's "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":": a bare,\nunstyled text field with no Material chrome (no container, indicator, or\nbuilt-in padding). Shares "},{"kind":"inline-tag","tag":"@link","text":"CommonTextFieldProperties"},{"kind":"text","text":" with "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and\n"},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":"; use "},{"kind":"code","text":"`BasicTextField.DecorationBox`"},{"kind":"text","text":" to add your own\ndecoration."}]},"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Color of the text cursor. Maps to Compose's "},{"kind":"code","text":"`cursorBrush`"},{"kind":"text","text":" via\n"},{"kind":"code","text":"`SolidColor(color)`"},{"kind":"text","text":". Defaults to the theme's primary color\n("},{"kind":"code","text":"`MaterialTheme.colorScheme.primary`"},{"kind":"text","text":") so it stays visible in light and dark."}]},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]}}]}},{"name":"BasicTextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Imperative methods for "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". Identical to "},{"kind":"inline-tag","tag":"@link","text":"TextFieldRef"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"TextFieldRef","package":"@expo/ui"}},{"name":"CommonTextFieldProperties","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Props shared by every Compose text field variant — "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":",\n"},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":". The Material variants add their\nown decoration props ("},{"kind":"code","text":"`isError`"},{"kind":"text","text":", "},{"kind":"code","text":"`shape`"},{"kind":"text","text":", "},{"kind":"code","text":"`colors`"},{"kind":"text","text":", slot children);\n"},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" adds "},{"kind":"code","text":"`cursorColor`"},{"kind":"text","text":"."}]},"children":[{"name":"autoFocus","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"If true, the text field will be focused automatically when mounted."}],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"children","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Slot children that configure the field's decoration."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}},{"name":"enabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"keyboardActions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldKeyboardActions","package":"@expo/ui"}},{"name":"keyboardOptions","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldKeyboardOptions","package":"@expo/ui"}},{"name":"maxLength","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Maximum number of characters allowed. Truncates natively as the user types."}]},"type":{"type":"intrinsic","name":"number"}},{"name":"maxLines","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"minLines","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"modifiers","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"array","elementType":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/types.ts","qualifiedName":"ModifierConfig"},"name":"ModifierConfig","package":"@expo/ui"}}},{"name":"onFocusChanged","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"A callback triggered when the field gains or loses focus."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"focused","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"boolean"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSelectionChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Called when the selection range changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"selection","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"end","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"start","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onValueChange","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Fires whenever the text value changes. If marked with the "},{"kind":"code","text":"`'worklet'`"},{"kind":"text","text":"\ndirective, runs synchronously on the UI thread; otherwise delivered\nasynchronously as a regular JS event. Use "},{"kind":"code","text":"`onSelectionChange`"},{"kind":"text","text":" (or read\nthe "},{"kind":"code","text":"`selection`"},{"kind":"text","text":" observable) to react to selection-only changes."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"readOnly","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"ref","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.Ref"},"typeArguments":[{"type":"reference","name":"TextFieldRef","package":"@expo/ui"}],"name":"Ref","package":"@types/react","qualifiedName":"React.Ref"}},{"name":"selection","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Observable state holding the current selection range. Create with\n"},{"kind":"code","text":"`useNativeState({ start: 0, end: 0 })`"},{"kind":"text","text":". The field writes user-driven\nchanges back to it, and writes from JS (or a worklet) update the\ncursor/selection in the field. Use "},{"kind":"code","text":"`ref.setSelection(start, end)`"},{"kind":"text","text":" for\nimperative one-shot updates."}]},"type":{"type":"reference","typeArguments":[{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"end","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}},{"name":"start","variant":"declaration","kind":1024,"type":{"type":"intrinsic","name":"number"}}]}}],"name":"ObservableState","package":"@expo/ui"}},{"name":"singleLine","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"textSelectionColors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Selection-related colors. Maps to Compose's "},{"kind":"code","text":"`TextSelectionColors`"},{"kind":"text","text":" via\n"},{"kind":"code","text":"`LocalTextSelectionColors`"},{"kind":"text","text":". "},{"kind":"code","text":"`handleColor`"},{"kind":"text","text":" controls the drag handles (and\nthe caret's drag handle); "},{"kind":"code","text":"`backgroundColor`"},{"kind":"text","text":" is the highlighted-text\nbackground (typically the same tint at lower alpha so the underlying text\nstays readable). Independent of "},{"kind":"code","text":"`cursorColor`"},{"kind":"text","text":", which tints the caret line."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"backgroundColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"handleColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]}}},{"name":"textStyle","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Text styling for the field's content. Maps to Compose's "},{"kind":"code","text":"`TextStyle`"},{"kind":"text","text":"."}]},"type":{"type":"reference","name":"TextFieldTextStyle","package":"@expo/ui"}},{"name":"value","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"An observable state that holds the current text value. Create one with\n"},{"kind":"code","text":"`useNativeState('initial text')`"},{"kind":"text","text":". If omitted, the field manages its own\ninternal state."}]},"type":{"type":"reference","typeArguments":[{"type":"intrinsic","name":"string"}],"name":"ObservableState","package":"@expo/ui"}},{"name":"visualTransformation","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Display-time text transformation. "},{"kind":"code","text":"`'password'`"},{"kind":"text","text":" masks every character;\n"},{"kind":"code","text":"`'none'`"},{"kind":"text","text":" (default) leaves the buffer as-is."}]},"type":{"type":"union","types":[{"type":"literal","value":"password"},{"type":"literal","value":"none"}]}}]},{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n return () => {\n state.onChange = null;\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"OutlinedTextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}},{"name":"isError","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Shape used for the field's container outline/fill. Use the helpers from\n"},{"kind":"code","text":"`Shape`"},{"kind":"text","text":" (for example, "},{"kind":"code","text":"``"},{"kind":"text","text":" or "},{"kind":"code","text":"``"},{"kind":"text","text":").\nDefaults to the Material "},{"kind":"code","text":"`OutlinedTextFieldDefaults.shape`"},{"kind":"text","text":"/"},{"kind":"code","text":"`TextFieldDefaults.shape`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/Shape/index.tsx","qualifiedName":"ShapeJSXElement"},"name":"ShapeJSXElement","package":"@expo/ui"}}]}}]}},{"name":"TextFieldCapitalization","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"none"},{"type":"literal","value":"characters"},{"type":"literal","value":"words"},{"type":"literal","value":"sentences"}]}},{"name":"TextFieldColors","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Colors for "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":" and "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":".\nMaps to "},{"kind":"code","text":"`TextFieldColors`"},{"kind":"text","text":" in Compose, shared by both variants."}]},"children":[{"name":"cursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"disabledTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorCursorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"errorTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"focusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedContainerColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedIndicatorColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLabelColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedLeadingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPlaceholderColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedPrefixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSuffixColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedSupportingTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTextColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"unfocusedTrailingIconColor","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}}]},{"name":"TextFieldImeAction","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"default"},{"type":"literal","value":"none"},{"type":"literal","value":"go"},{"type":"literal","value":"search"},{"type":"literal","value":"send"},{"type":"literal","value":"previous"},{"type":"literal","value":"next"},{"type":"literal","value":"done"}]}},{"name":"TextFieldKeyboardActions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard actions matching Compose "},{"kind":"code","text":"`KeyboardActions`"},{"kind":"text","text":".\nThe triggered callback depends on the "},{"kind":"code","text":"`imeAction`"},{"kind":"text","text":" in "},{"kind":"code","text":"`keyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"onDone","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onGo","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onNext","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onPrevious","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSearch","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}},{"name":"onSend","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"intrinsic","name":"void"}}]}}}]},{"name":"TextFieldKeyboardOptions","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Keyboard options matching Compose "},{"kind":"code","text":"`KeyboardOptions`"},{"kind":"text","text":"."}]},"children":[{"name":"autoCorrectEnabled","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"true"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"capitalization","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'none'"}]}]},"type":{"type":"reference","name":"TextFieldCapitalization","package":"@expo/ui"}},{"name":"imeAction","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'default'"}]}]},"type":{"type":"reference","name":"TextFieldImeAction","package":"@expo/ui"}},{"name":"keyboardType","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"'text'"}]}]},"type":{"type":"reference","name":"TextFieldKeyboardType","package":"@expo/ui"}}]},{"name":"TextFieldKeyboardType","variant":"declaration","kind":2097152,"type":{"type":"union","types":[{"type":"literal","value":"text"},{"type":"literal","value":"number"},{"type":"literal","value":"email"},{"type":"literal","value":"phone"},{"type":"literal","value":"decimal"},{"type":"literal","value":"password"},{"type":"literal","value":"ascii"},{"type":"literal","value":"uri"},{"type":"literal","value":"numberPassword"}]}},{"name":"TextFieldProps","variant":"declaration","kind":2097152,"type":{"type":"intersection","types":[{"type":"reference","name":"CommonTextFieldProperties","package":"@expo/ui"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"colors","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","name":"TextFieldColors","package":"@expo/ui"}},{"name":"isError","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[],"blockTags":[{"tag":"@default","content":[{"kind":"text","text":"false"}]}]},"type":{"type":"intrinsic","name":"boolean"}},{"name":"shape","variant":"declaration","kind":1024,"flags":{"isOptional":true},"comment":{"summary":[{"kind":"text","text":"Shape used for the field's container outline/fill. Use the helpers from\n"},{"kind":"code","text":"`Shape`"},{"kind":"text","text":" (for example, "},{"kind":"code","text":"``"},{"kind":"text","text":" or "},{"kind":"code","text":"``"},{"kind":"text","text":").\nDefaults to the Material "},{"kind":"code","text":"`OutlinedTextFieldDefaults.shape`"},{"kind":"text","text":"/"},{"kind":"code","text":"`TextFieldDefaults.shape`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@expo/ui","packagePath":"src/jetpack-compose/Shape/index.tsx","qualifiedName":"ShapeJSXElement"},"name":"ShapeJSXElement","package":"@expo/ui"}}]}}]}},{"name":"TextFieldRef","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Can be used for imperatively focusing and setting text/selection on the\n"},{"kind":"code","text":"`TextField`"},{"kind":"text","text":", "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" components."}]},"children":[{"name":"blur","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"clear","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Clear the current text."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"focus","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setSelection","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"Programmatically set the selection range."}]},"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"start","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}},{"name":"end","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"number"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}},{"name":"setText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"newText","variant":"param","kind":32768,"type":{"type":"intrinsic","name":"string"}}],"type":{"type":"reference","target":{"packageName":"typescript","packagePath":"lib/lib.es5.d.ts","qualifiedName":"Promise"},"typeArguments":[{"type":"intrinsic","name":"void"}],"name":"Promise","package":"typescript"}}]}}}]},{"name":"TextFieldTextStyle","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Text styling for a text field's content. Maps to Compose's "},{"kind":"code","text":"`TextStyle`"},{"kind":"text","text":".\nShared by "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":", "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":", and "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":"."}]},"children":[{"name":"color","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"reference","target":{"packageName":"react-native","packagePath":"Libraries/StyleSheet/StyleSheet.d.ts","qualifiedName":"ColorValue"},"name":"ColorValue","package":"react-native"}},{"name":"fontFamily","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"string"}},{"name":"fontSize","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"fontWeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"100"},{"type":"literal","value":"200"},{"type":"literal","value":"300"},{"type":"literal","value":"400"},{"type":"literal","value":"500"},{"type":"literal","value":"600"},{"type":"literal","value":"700"},{"type":"literal","value":"800"},{"type":"literal","value":"900"},{"type":"literal","value":"normal"},{"type":"literal","value":"bold"}]}},{"name":"letterSpacing","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"lineHeight","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"intrinsic","name":"number"}},{"name":"textAlign","variant":"declaration","kind":1024,"flags":{"isOptional":true},"type":{"type":"union","types":[{"type":"literal","value":"left"},{"type":"literal","value":"right"},{"type":"literal","value":"center"},{"type":"literal","value":"justify"}]}}]},{"name":"BasicTextField","variant":"declaration","kind":64,"children":[{"name":"DecorationBox","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Wraps the editable text with custom decoration. Maps to Compose's\n"},{"kind":"code","text":"`decorationBox`"},{"kind":"text","text":". Place "},{"kind":"inline-tag","tag":"@link","text":"InnerTextField"},{"kind":"text","text":" inside it where the text\nshould render."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"InnerTextField","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"The editable text itself, placed wherever you want it inside\n"},{"kind":"inline-tag","tag":"@link","text":"DecorationBox"},{"kind":"text","text":". Maps to the "},{"kind":"code","text":"`innerTextField`"},{"kind":"text","text":" lambda Compose passes to\n"},{"kind":"code","text":"`decorationBox`"},{"kind":"text","text":"."}]},"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A placeholder shown only while the field is empty. Place it inside\n"},{"kind":"inline-tag","tag":"@link","text":"DecorationBox"},{"kind":"text","text":", typically overlaying "},{"kind":"inline-tag","tag":"@link","text":"InnerTextField"},{"kind":"text","text":". Its\nvisibility is toggled natively from the field's text, so it stays correct for\nevery change — typing, "},{"kind":"code","text":"`clear()`"},{"kind":"text","text":", "},{"kind":"code","text":"`setText`"},{"kind":"text","text":", and writes to the "},{"kind":"code","text":"`value`"},{"kind":"text","text":"\nobservable — without a JS round-trip."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"BasicTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A bare, unstyled Compose "},{"kind":"code","text":"`BasicTextField`"},{"kind":"text","text":" with no Material decoration."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"BasicTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"OutlinedTextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"OutlinedTextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`OutlinedTextField`"},{"kind":"text","text":" with a transparent background and border outline."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"OutlinedTextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]},{"name":"TextField","variant":"declaration","kind":64,"children":[{"name":"Label","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"LeadingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Placeholder","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Prefix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"Suffix","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"SupportingText","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}},{"name":"TrailingIcon","variant":"declaration","kind":1024,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"signatures":[{"name":"__type","variant":"signature","kind":4096,"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"children","variant":"declaration","kind":1024,"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"index.d.ts","qualifiedName":"React.ReactNode"},"name":"ReactNode","package":"@types/react","qualifiedName":"React.ReactNode"}}]}}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}}}],"signatures":[{"name":"TextField","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"A Material3 "},{"kind":"code","text":"`TextField`"},{"kind":"text","text":"."}]},"parameters":[{"name":"props","variant":"param","kind":32768,"type":{"type":"reference","name":"TextFieldProps","package":"@expo/ui"}}],"type":{"type":"reference","target":{"packageName":"@types/react","packagePath":"jsx-runtime.d.ts","qualifiedName":"JSX.Element"},"name":"Element","package":"@types/react","qualifiedName":"JSX.Element"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/usenativestate.json b/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/usenativestate.json index 3368e4716c5a36..eb400d3fad6f44 100644 --- a/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/usenativestate.json +++ b/docs/public/static/data/v56.0.0/expo-ui/jetpack-compose/usenativestate.json @@ -1 +1 @@ -{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/usenativestate","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value. Reads are safe from any thread; prefer writing from a worklet\nso the update runs on the native UI thread. Updating state from the JS thread\nmight show a development warning."}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"useNativeState","variant":"declaration","kind":64,"signatures":[{"name":"useNativeState","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an observable native state that is automatically cleaned up when the component unmounts."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"parameters":[{"name":"initialValue","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}],"name":"ObservableState","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file +{"schemaVersion":"2.0","name":"expo-ui/jetpack-compose/usenativestate","variant":"project","kind":1,"children":[{"name":"ObservableState","variant":"declaration","kind":2097152,"comment":{"summary":[{"kind":"text","text":"Observable state shared between JavaScript and native views (Jetpack Compose\non Android and SwiftUI on iOS)."}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"type":{"type":"intersection","types":[{"type":"reference","target":{"packageName":"expo-modules-core","packagePath":"src/SharedObject.ts","qualifiedName":"SharedObject"},"name":"SharedObject","package":"expo-modules-core"},{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"onChange","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"A single listener invoked on the native UI runtime whenever the value changes\n(after iOS "},{"kind":"code","text":"`didSet`"},{"kind":"text","text":" and Android's setter). Assigning replaces the previous\nlistener; assign "},{"kind":"code","text":"`null`"},{"kind":"text","text":" to clear. The initial value does not fire "},{"kind":"code","text":"`onChange`"},{"kind":"text","text":".\n\nThe callback must be a worklet so it can run synchronously on the UI thread.\nAttach it inside "},{"kind":"code","text":"`useEffect`"},{"kind":"text","text":" and clear it in the cleanup so the listener\nlifecycle matches the component lifecycle."}],"blockTags":[{"tag":"@example","content":[{"kind":"code","text":"```tsx\nconst state = useNativeState(0);\n\nuseEffect(() => {\n state.onChange = (value) => {\n 'worklet';\n console.log('changed to', value);\n };\n}, []);\n```"}]}]},"type":{"type":"union","types":[{"type":"indexedAccess","indexType":{"type":"literal","value":"listener"},"objectType":{"type":"reflection","declaration":{"name":"__type","variant":"declaration","kind":65536,"children":[{"name":"listener","variant":"declaration","kind":2048,"signatures":[{"name":"listener","variant":"signature","kind":4096,"parameters":[{"name":"value","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"intrinsic","name":"void"}}]}]}}},{"type":"literal","value":null}]}},{"name":"value","variant":"declaration","kind":1024,"comment":{"summary":[{"kind":"text","text":"The current value.\n\nWrites from a UI worklet are synchronous and immediately readable. Writes\nfrom the JS thread are scheduled to the UI thread asynchronously, the new value is not readable until the update has been\napplied. Prefer writing from a worklet when you need synchronous updates"}]},"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}]}}]}},{"name":"useNativeState","variant":"declaration","kind":64,"signatures":[{"name":"useNativeState","variant":"signature","kind":4096,"comment":{"summary":[{"kind":"text","text":"Creates an observable native state that is automatically cleaned up when the\ncomponent unmounts. "},{"kind":"code","text":"`initialValue`"},{"kind":"text","text":" is captured once on the first render"}]},"typeParameters":[{"name":"T","variant":"typeParam","kind":131072}],"parameters":[{"name":"initialValue","variant":"param","kind":32768,"type":{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}}],"type":{"type":"reference","typeArguments":[{"type":"reference","name":"T","package":"@expo/ui","refersToTypeParameter":true}],"name":"ObservableState","package":"@expo/ui"}}]}],"packageName":"@expo/ui"} \ No newline at end of file diff --git a/docs/public/static/images/expo-ui/textfield/android-dark.webp b/docs/public/static/images/expo-ui/textfield/android-dark.webp index fd30082b1b9fcd75ddf62d85dbfd867269cceeda..5653acf5818e9730347077f2031178c5a67c7aa4 100644 GIT binary patch literal 13156 zcmdV8bC@UHvMyNcLYHmZuIjR_F59+kcGefN2PRlfm$iMgde>)Grv@on}Qav(Y9JM#wiHh%4S;k(Y+1MC1IAEG~>XXVBK z)xO1FJFh>UfIp;OOJ4b|`Py@K0f6_>7eTksMTk}SyPY%LQ^2Ut6(ADur`;O9)V$yy z@GbcadCGs(yt{tn-1wgMnEUhr;(SE`nx8EnBcD5WJpjO)_ki!obJ2Ulh3Y#kpp_Nq zm7eslGbR2`M{3Od|7Q?vc2ut2UD@fkcrmjDE?%B?1CAVrw1o&`hWyDR^kwS4d%vLq zW#oFOSgESj2=X*CR-ClSA}5bvhY3fvUFu@EAzR+u8LHZ5VlllN2!bG(QEdIP!-DJ? zFGO?-4 zY}iK}!M!l$JpJp$zt&)VF<1pX{KcRES|tM^O&2#A?I4B08G?5@st&n6gS<21cU$XI zLNW{bUwslH7^1&qOajeyg7cr{gy28H{Tp=n?FHvQvo)R0yt?XKuf_e7X^}FL7xL%# zbH9)yr&OPrpJ?_-i>wT!>3EsKI42&gE(UZ>ErSNoOqK3Cu;3xh)@X06N3?CR{g88H z)tUNIxRZ~R(b2S&8o&O&k>j&tssAif)rZ8w62hFAX^*oLkvX`^c9zn76>kEX0A(m7lqtpZ>18IpcMlzDY ze}?hL7044}zANecm8nXV-`q4+v!@ry-zpeLjh)+mdm?hmV?WD5m73JMgSLE&brw`| zst6euRjm;Wv%Tm=V*6j$m-&am+;sM5MuXGJ^Rb^&+Nx0{4q~V(ikDwAtcvQ^(Q2zw zACf@ZBBMm{-zEJw`CY{H;N$m(*-b9CG8$ZLrq(+C4p)n&{;a&7q5hYeu}4CVe}?~^ zqXvc0dhtmF0#fFjE%NIJYkA`_p*yfpX0BEnQ}6Ah29Sd-diSw*-Et#WkaCP<+Pjtr zsO~f3Dqgz@afHxwn~^_W5Js!=ziel_HlFC# z%KBom%4*aDM&Lm=jxpFI4M`0M1ci2+=&RTM9;ClQX#IG_1Hoz8x7YKlGvvKmYFA`e z=KOLOuH*9LW$mGNa8ebKbdjhoY+k!o%l9KFF6&xtvfNRh_7w^IJQ^94rc1%gXh6A% zASet#f@~_BP1L&6t3#j=W~jSy*Nn+~7+k>1g4IlQjgsLa)Xqt8xK^sUbik=$K#ncb zcB6#i;t)oan@ znPjX)sZ*s+9>Fe?_S}1nWhleeLjN~$cI;EH8?X)ZKa}Th4DjEj{Lj4*BJWiBb-0xG zsR%pmAMF~XVnJyYw=n_O&$=m6!lgF}tUio4+?`=Kk)$*Tyi#Le1cb)_BYqe@lJ5P( zwp2)ecph7~#z}&k-Sl7B_b(=qogf)ZG4Uv&2n9f7)J~@Ru!qAXeUsiuhoNYm8)ezU zm37WHRz)|kVZ_15{-(v(Eq9C?+rS4M;^lb1#-tm7el-IEFKMq&Ox8Rl&L!XdB^)3x zKMOVZpOSPr8j?F5j)91emg{}fR}-#1zPNQhmF~zW{57>&E29W3&9Z7}5oZ{SdQ5Kb zHGaDmasQi@WF8%02ZAqoVx$r~R&l_u>KLXZEbDj@U*#6_XWWA$ZIu5;t-D)yuV9kC zfFPca8_0j~?0;C9k_*Ty1&)!yiz-?x${sYb0G8{6vG{HVK>l76BA7`uLfAmNXU$iHo!a)q&LhfIxx`;@cbgHd`R4kj9{2CfU4j= z{ZFL%UsLJ-N4*R{Ux3%5UZDTnVBQTM!{U0&mX9alnKaZ|@+S5w**wjWvkLRtupH-N z370_yLm@1d=;+8Jz{C}x?@$6dg9&N~#i>XCA9@J#`GvLER)s-ct*`NZ{@4?0yfh1T zyLc-<^Q-AbZF0{RG&v4cYfF<^f1xw~Brfa~S~`mMLOzSxliN8j0Yum%TK7GA^1?(( zLtTwpD-4OrfaeFh*O*`Z`|dJa;_pIaF53y}sSY6|OXJu5V$0y84^IIIh5*#6M8 zog?+!hHXf1C{xzF#1c)_@2L84Mc;n-a_ON514wr6P!`?Z-*6k z&rUG>45He+S_4?`TTFX2E=hSSHD%%OdT|y?)yYeX;R&g-p9sc9(cr>NeP zsa|?2V6XVOrBf<&tBbt|YPFhY47Rv-vWMF^4j6!7NutvBC~Y*=1TMu^#Uh)gi@j|$ zcmhB+NJC+|i&FK9kII+Q*w`BaN{ zwJD?su$oWy-zgROxz8^nIvQ%wrfk#3$AMfe}|s1xs+#ycca3_D*kkg{51m z8{&NK$$mlCpbZ>0*Kp+gE5DP zd(n4!Nd^GB&oxIK786dwuZpF8E9H(Ew$Z|5y3%m;w{m+wLShJcclv6%p87m<1;0ly zE7eb5s$m41-Qoy(^@-wa*y0P(?4U=#aM}IWk00t^vLMdyZP0i7jaXl8tq}5&eQ||P zAZA`n&!Y4Q!Keh`MJtem%{57=OUrXCw`OwRE5BnG)?@lQ(aY$*xWUyS?93=&fkpAa zIsm`U7`(>;&A)>vwfS2-Rw8!yI^0{nREZ z*4iFUX(Cf?ZM3#qDsw9M*Y<89nutse5{>If-^ie3yacFHsH~qFFqC&i1$e)c`UySHBxv$EV{d+Zda%tWz0>Qu;&s>YrC06pLPWn?Ep@g8F1BF4;;_P8HgJT~t@v;vVcqP9Q+IvOJh zXwf=muNhKpaXz37a5!B)41_L1&)4tog-8gX zI(@VE-J;Z&uOiwD|IwmBO~L*yH%pvcxz^<7Km168j zt<=(h3Xg8&>sC>%PmG~el-N2HcO|;%z_)HIk!-Ugi*+}k%K)mR8L?S+PkGWQp77YV|T)SqMoY(K7NiWERn(B2=Vtp;1I<%68!I!Y`b!1xs? zcugb#1rsI?RK{(bbuMAaeDVrJuknzIAO`heyl-^KB6$h_hRjx=)T1XS>|t>I&I_&W;-!@8@m_1y zn|qq(TT$w`eWD(MBpUL0;g_OPVQLVRN8DF~W2vIUtsh|y1J0gl2qvkV)mf6cArhL6 zuMZk*NiPwM{k9rkWzERf1mg<~; zy$kRhy3Nxtcy!O!MQ-iE+R_t1Q1468#)3v~BZyCB)*auRSt6#tmPoTn$|i2%tUcNRt_<7IGq`7ef%{H7WL@2Rk4Q-PQd$-;!cB~c-i zQ5keZUA`AKIr9Z=op;&I9_bcmv7pnLOCEU#GVpB2#T$XBdyHb&5ZD6k;n1t zt7BkC$pULuMOCKG6w?bn0eJQ^KD5tCe<1^1hGyG<=`NwETbHdLg+Kl(h;aHk!XXK}kb?7G(GN&ZfP{*(GTyOAm#P5MBSh&o3aoRQw`rB^xc`>soE z6o7!|yMX4{Jp0Zqn$`+L&B*U(#8xvRxVA%xlOOE>^mOyZmG??9g!FKl7_DZS-g}vdlrh}oMan1GHJG+Z(IJ@_4cCj3W zXrF9qjdSUFdv}5=H=5p2c@wR2_yr`b}E-{^|Ho z*ukqFAO$)ir?K9tc$)BOTYoEe`nY3k173x1g@z&v;?5rgu!h2i=uYjp zaj9KzoxY=kCi@n0)D~blFE2!$sB3j%5+wX$vz1##)EbPk=O61EJ&sh+TvNmWH*e&{ z#bPMvkc!*YYzFH0*Uua8m=${cnIE|*hye!lD+9n14pD}R`dn2s@56BFhTF&bv*BSM zv&Tvi2+E#JZL)p15bx+NcT*OKxG)2Zy!~Du4p*krkQi;(N}vd8mDfpzCRGR1#ZI26 z9J*MqzMn|RqcHw8ep2PYu)3m6KNYuvmTx2vRp$vgY@K+dKIgC3S0E`+5pI3IVs8(J z4g8Pd+8FBZ^(TlNpwL#6Ttr9qg zbpHY-TV;4(tAF-A0@-_PcC@9l2*Lfv?CsW}`rO=bGXy1ChHbj2O8pLBq~mNb2K25+ zMxw0+win>5qwCp{V=Hw5Ld=-#sVi=gLPxG1e0d{kb5>c8y&XSGmfPjBbs4a4=*xYI1;5eY^7G+*uUH57;ma zbKoL9jJ}_y-%-B$e(!<*&)C0OXw3#eO0knTNU>(&kPMZ2`7y)LI;=x#+nP- zkZ<^sN8A2nhJviBh!v2v$u6;%8!{%ea8gbrR~=)?8}^xg>4bcjVlR?Y^S%g9R)oJK zY)z>8%1*UAWo+2;o^fKA`yHtoAzu+7CZp$>E^bA#SQ9r_IkB3RY**4aF!BBQB7%+x z3D_5`a1Q?P>sI0!r+m;dkW1Ai4Iko?^&sc+qqK&zKO=h=${8~NOe`mtZWCLS7JKBx zhx)hJT%=RcVyBN&hf~`iW9er2s13ewNWU`4=Q~a=2}mD(`ntAVn|SFCi>MxI9Ae?L zxLeU_jX0m1Q0g3Nn<1+&{>Sdz)IIa|v7QD#PIqt_C{EsVknMB;iN7wXxU42C@ummBastyFCSaOnC;m&ik2}MQ>l_7OMB-XxlZM`mUl6yDsv!Dze zWqQ}`rXyFwJAhUfp*XfRuPZLu4)5lho`dcpDTv>LbwrA$3?5Lxn{_lF%Fc*j5PqO$ zfK*(*ASx;v5Dh_0vPOkQUls&gIES)S(oINaf zBhj~p9KBVs6CBd^HEH zYWejWxOs55%8g$!!-oqfHp?sr)Qt;b1H^7-@4Qh9WE@hUWxBvSrD}|nqb=xH3?EreRU>JPKJ)?H2&b-|DwI;UNZ5RSj` zJs7ONk^R}9=C_F%RN1M=GWHBkDB97ryCIU9icP)g9J-|%^d5i~h!oQGa|oyKPJ^)Fh1oLB zSVIztAZc?`a?v7(c-#DMqNd5F_FZj3OY*Z?q)ZP9R{MSSLUu~)Wlm7U7OJV%V{Bp% zgnbwo;a{{kV|!sDzie&Tk;`lxi#wh&jf{P~lb`Xh=;V2g>-}24M{v$r$VZR;`FVas zq4&|d1`m5Z*Wf8Y2dy^6&jl|ahi|0_x+Rx^^=p8NXc5o zh@Q~re3^;4m?B~=*APB1KSzSgWyJ*6!C9fO0F1tW2B+q#y`HKF} zRj&NQEr)(A$kMP!l)`#Q5{#9e$iq=kF|ys(g&hRu9VM7&xeAFWik^6p5Asuu_w`^0iIlS0< z-x2nGxfBt(+n+3(2E0|>kMzz9sY{TW&Ec)nX>QD33_~re=iIBxh2GbNd3Bd{%2(j% z^3*?4Lgl8z|6E1l8Kjz3CIHD*JyoG_9<6O>9+@%qHYSX+p}}?t8In_@<#6?Kb~E)9Jsjd43RsLU6!7<1tWhYC|;LO7^B z%Ns6IX7S4+q^w!#uL=)^4^o>~ootZ<2Ao!t<&XtC0U@|H4*uW*W=s#bS!B`8XfY1q zNx_}{1jGR-(#1)EqR^9F(yFNI=SEZ-9UL-i0}KZ>?GMDqbKlm?0sN9w(aMP^ z^;F4#o7O~-^!a|ZIhz1K*Mcdpo#z04E#TkRkC;S64TlPl&(=t-cKS$uX>@CQihaob zLBMW2g;tlTT~K4E0OE7(DC~;J=jCMs*BJt@*7#M8H_QI^4^CnPGX|a@-b_M3ilR+;Rp0Jyyfn5?cOrRm!@QHpteH@bfKx^84ReFiX zXJ^37=b4Od$f~X++NVB79KBVon1)tQxc(nm|`r5llBQ&LvJ7nA7O+i-9C>+)YvzdC7(Ou$uE0#GJ8&J zNq;@qqZsQbu{>oim3gxuUB5{Kx!YblZJ>OUrdy?HXujhY0mO@K(540N9@ze9@O=nD#XwSZ<&)HhY%KE zIouw@oYB5H=p6lWO))Fl&0>L>e30#zZuK>40kN+$bHT85FgV>iXUClRhZglEmn|hd zpE=Kg_2LJA@rQ$z?ZXsc76=6ERU!)%w}YtiH+!jOO7`*sz0xU~sa#ZnnYa`zf&sy9 z#&?*c!sk=1s{xBwnV}$%VKLe1lO5VRZ=|9?UeU6{5p%$UQ&Qhnq-Z$m=rUj}6m(DI zTPPupd9__x0>AohAL~xi;zMBA(kxx1E0R-3GTiamsewgmfAYJjcF6(%17LO_fJjvXD#8izM5eM9kEVc*m()D2uF2G};ly88o@#P>3X z>6(Bo7b?(@ma+^wP{XshS)?}HnHeD-j^R+cU$Z`!SQ_ z%J&m=ZNF?nd@@9({?u<5q|e0&=arF*(G(XK^A7E#s1ZJ~yX(vP6NEec3Rz+id=|J7 zD#9(UZyF;k{$^9BkzM(o;6~wB@ccT*CNIQn^>;;;eOVF~L!SN1o)Q_E>-yFgw4YwL zgDf1)$P22x^MLY!lDfe}obdDrWH=0plI5Gzk2#XiTfeX2mM5m$E&L61lrQE}23rQp8Cy8CZNg(*EKp&3K(LMdE6F`X5Nd6@AFT=t@tPIw?0RNMa)WRWKWY zZB3$ZbEFZ!Otv?r^#;iDa1PLF;X)z(wr1U+U%nTVaE$5&w)Q+4CtCgtS#d}t8xfFY z$#1ZKc;~!X?x{_k4MgvuoI?LhvNobjIJr`mgy&geXr)^*YLZUk{aCPJ0YkwFF{C(l zhyr@|0MEgyc#K&5os#5t-6YD#K57naBW#*OkVwH-dvV@tI#8x?WqC*kRpcKw``W+V5 zL8Y=$<068n?0JRrAo;@E-fzC@CDB0886QIi{Zse_9K#ZmOy*lM#Pua7=zuLBNK5Hr zV-}eU{=&KbbGN)Sfgy_X$Gj6N6&00jyo0l45iUD;!fC-zPG8D_EY3-YyqYUKe)iK^ zKX&M@V~E)XM*6jU?Tiu4qHRTKIe_8(xL5lCQ=K4?(2A>;gDCN^ueO?NBN2LJ1}K7- zRR2ZHTf}b)3TjT+M=lyOEO8V&-)B7*K{jC`dtIx}OhxpKVedFt!&h8PdiI6)J(;iyQ@4EP}^p;~8R*Gbu{r>%E zMNWS9f~vS90q?Rrj~@u;2rWJ)AzyiTB{dI*Q$w{8<_JWUL2}>9^~dxElMjI=%R9Mo zn47;p0{z37ssDap$BVAK?_7J*SD|37Rm<57uOnDtee{s0HA?ha}Q79<# zrapWPl)Kb>_89beL=u^IIL=hC0yyv>4w->NKgd*y!?Qb93kZ}untq=U{WWr_zId+? zRGDmVPhfPfx)xv?o|*iz)NkjS6g9XaxK1Tz!X>g}HUr3$^=+3oeOR`N@Z%#Y;F*xGTk3D43k9Ws0g>o*W#A%`(>H; z3b}KIc3in2YW%2qYye0@CRmygawtDS6@2DWbN;$alLE+3OlrZ?%L{mkxZPTz=9L-u- z_PcY<14KP~={$2HIJW3(LWJ3W+CE{1-_Ir)J!*Pb8EQoUxQKHy{h&X3Hc|Yr+_EbU zPaF}K&1GvE=X@#EWZlE`H>j|Xfo2D**J+!5BCbp%^?2to(%h|QwyjeC!So(5zPXW{ zl(>&A2BGxxA(NN$bjPb!lwLbQE}XUt8J(>YyP2?^EK6lohoz=kCVd1uM^FryXjF78 zaVof4={xo}=s|p3sx&?I&ZH9Dt390(ONJgZH0ep=yr^)G_Q*>&tCgAz;4*xtJ{@G)fL>o?G-zVcy9|0Pk2upZZ7>E!cY zl91R%>VdU)dYA?6Yt8SH9M1WD6_NJO`;^fY6RBY2dowm&ll}wV8##U{o+y@sjD2g` znd4NWv?{EJHqTDn0Sy9`npt?m)mGv}q4vC`{0miMq7S?J>I~+R3i9{wbyj+4`b-u9 zDp$TkPOFji-yz0sC(-CdF}WU(c(f?t0)0r^O-&3qJK}v@d~0Rib7Mp9k&AV-cqcxc zeQ#+sgNC5sQrHf{K5ZquAWvF&+2y%eU`+FA%+))#nAJHqj_UjF1UNIbv>{U=8w*x! zXYb-c9qX{wDwGtuYkvD1m-Mbpw9D*#sm!W9K_*(|br`56TfEq97bL(1w5!D|U7pl~ zZ|##4^X6e^?~7{F8hbOh2Go2PlIMn)S$uUJxjYD3sM&{~AKNOL9%?0j#e>OU+Vaby z7N6H2=1H>_P1;nO;*+59LbE)CxM-y?3Nad^_AvO62bbydwzJ#nEBX{Ce>uF$Uv(g(uYHo;Pbxg0I=v&lRb7XX)Bh;!Nmi2ON{j09X4eA$@5?B7Cs>u}?&W(Zph~sFJC{_*%;5 zCN`5Ju0o1|M3i3J@bNTKHX#pCp#w}6$y;u0T;fh1UjaT!>U8>!Si_FSE#vZ|Mhf6{F8ifM{4Wr%LR(^pOq#xDIC;kj3t$dlZSc z0WzE4?^NfXC+@NK*Yvx6iBI~>?C|sQOH;F{q97nUgjgWiM4`$%;8_Irlvyh`XBu#R zn(}_*mR2XP0aCxa^G}leaeGH<2R?c$ZX3Iky`#P(ATMnMFc1$z8$JzkGVuXgfB$xs zTN&<*`xXv(AIfP0VQH2g$}BIAdI^+b}%FL!?2IYS~xSyHlh6n&M0 z9Ed5}IDT1TZYLfKibEZlyf+iadG2UtH#)i|FApY-)?2J;yhWI}nG52uS3b8u@liiN zaHp)NG~(pPyZ^Bzf?B?BD$$f@#q&hDmR%8u`JcLVjzHoZ*n% zw*>V_-YYc(zjv~4VmLy|CG!2vJ?s8OP>_nXh}^kmT-AUN%z`v81kCSBm#N8=)ItPAX~EcCS~ervD`( z!AL7%tsF770yE9GpmrV;+D%j1ywFf(O|cfOD#hfn+`i~j0UOBi)n42C#CV*q@Y7gX zIQ}2rd)m+&Wn_in8QoDPGIZcfk@x4)wBWeRx%}|F(XJ7Y-TDu4mD4xPk$zN3P(Prj zPp>nd>?QisRf#ja^=S}6r&~RfF`WDg`2(64bQb$hy+m`r!1s2sBlzy-3FeYJkC#>{(Tk_rozrn|`omI&J_X%K$?@iGWC@lOW8I zsZIw=p5?UwF%kvYONzO;HspnUbJMoz%JuV|f-3#j#%l zeK!&w^tm2X@-+Rv8dwqNFZ?C=Hz2EnF-se@5la@9k0RXh6BviCiz_dC))+z)jX($iD z=p(2ikIBO&>FF{F9|)z=qM=vUxz_47AuU>Knyoi>=YSUFm&L8$=2~+vF}_1GpB2Y|dp)W8ljDzT%Il2JTLz=U!JK z4=&r0Tw~5x1QH@}FBCskWF~Sr#&5L6Ule*Bc5H^MyEeL5lrT!Wj=CO0x-apazdLa_ zPhV&<_tbjj&3TTYWakdhZCIf24$S9m@@Jjf!)p~+hZ?}h?A>1((H0JtE#dMBcCg24 zAf_M~(6r@uy$_vj>QM)W_FvC_B%cjwAhU{>*%D?nCv+_z1;tEyD)iBA8D+`QlpH0$ z5ua?6j2G42;9?Fc^?eQUt@>o4ilz6RSoXVR&OjD^%>^j#VpuL&lG^6{>3?!{|0*ee z%^Zrw+Dr38oYa|JK$Uaz-}2?}8eB56{3`7~n%cv&x0&cs?kCItZg|4l4gAw%OiLI% zs#ZWX@rB?`G!QM{X%R*@QDLfn7J(|{S(1Ic)fjx zDX}GfimdpR1!avBLmv1Bx%GiVTlaR1*m1eG!V1|EP4>ORVPd)==p8+Z z1^jPLp812Y_EIuB5%3XbY|8?K1iuaJW~ebql*>UOX$4YVPHNM!Q(R7y4D8##`~&Os zc_(j(xH}6E^WZvtlP~XOf2fN`q_RuLxN~3j@ClO-yNEbvZrF%w!ibl~3t{A=1^QR9VPLBt7MdKGeoaU>j!C#pgl5O%dmD&#)8&{~BIIYk zo>I5d$FY9`zE@RCs?bG z`c~Py0+jps!P@fUfcQ`emfTH%+>=bwPsadI=1BO4r$4dEx|Bsj4;yAK^YkCCA{E7ENZCE4=o6$C^igYGm>kjC zYT4yVWIRx*bv`MV*PC{s`m+#0X7z5u+vLC~6jRY^0q~i~OPfJ3U%~}m`NlY$f&;60 z0Zw=tRv_4)z=9O^|I}S3Kt3XaK>?kEWRI_Gk#J0iRp5Q!^L#J9KlAOB?fy?qlu@p) zG4lL{f)8Ej->}(sFZY*%-oFw|Y<#2fk+bpKZ%DD#NP@Cvy(f(r1zRoFsf()opoqGr z5;1B%<9xU$AFeC1lknh1f)DEW&ipeJf1x=2cS!!b zYWM#b^a?@mzi9uE3;s`X^$Di`B3bNf-}yK6S9tZ_nUM!l%}VJ z+r8ypJqbT%B=AS)4(KmaADkux+-0anhwJE6XiwX{nUGab-Og>2?FU(Jd6?9QL_A+Jwyv0uR_>PH%@x z7PBxvt;SDwV8?tnW9iUVcA1AByb9RmAX7;*SCdMOaaZQwjT9{Sv_f49mzJY-($ zG*Bn0bZ0fgKu!_`1E0s_Q!w~D$E&t-yiqr}+)HD0UO&~yuv*yDC&2ya^BAE(RJwAVWJf87Raq7> zAZArMMfHB$(uqjQ9B9_!MIr7$1zO+eV;TB{S%*S?G`*weTsp$wgmo-A#`g6r_$Asc zlgV>$iD7_WwBS2URb?Ub8Zf1H>j%ffF<8^`bA_Vjkb$nb%T$Tx8hFkN$UqRz7V~j$ z{eXPM;Pm$p&zj;w(&^_$GAJFox)Qxm*^SLH(GwT&h zRVdz@d-y382p=v`t88nlD3Hnv!zdd0BH7k1DkeksrW?(DUlNbX+2?a3RKekxvq3Fz__&kOSMd09ceI zfHhqqaJbFex^;VHuui-l`@-0IETge@4Q2NlE4lVh#C%# zF6dUv36C!1G0cvx5jG!=RJyQv!3wsTI~+(;%z-$8l{jX<(!2q^<#PhKJw8)q(z&!| zqLIHwELfu8E2RIfZekA~l{$#FB8`laLxj5lulkAJ;EI7B;b5pQb||We+F4tG(KRWV_rOe! z7xH~_Q4B~2qdOBnT)IV~wx?eC!(I3EC9kP)Q51tVrNw+m`p0nIZ!Z=O5*p5m>}+?h z1{nr*+27Vo4wWlZBhr_N4PwutJe&7}afWBa$m`{d8x_7KuU?HcB^s7vlL1&U$A+et z;OG$;57xF*hndMrR+#nkKZbsdSrISFHx&gE2SCob;5FV(p>cJ#q|UBD&b}d{@}vT# zr!K;Z^6&2qX;0&wWT7>DzFX<0&Y|mgLP>+)$`hH|BsCqwzbou4%8YchF8R>oe~n;~ z&T!(vqZ``YNvxs~#PPuljMaMApmyT#JOB71uox$Gy!|-l!HoJ$>cj+nw^ZmDRa}>P z%jhF-!>5f*zD)Cij4-SSeKnS=i6q|1SZM4dak`lxdMA?aM38w#VwSi&;0ALT9 zvTm|cL4_%z51blDn$f zr+)icl)7ecln*fHV7iVnuNa&1LRfC4(w;|Ai%}SI#1m` z@3>Gn=IWr{Z9H!&OsaN2`j|6S42Ex?+$gxB-M#xiQ3Krd-05OrLdI}yxXG;(L;1PR z`CY?-3C`r+Q3Uh}u-j|48WNjLdzULT*4}9EF4b`|0O46}==2-_#1lH&d|Nx3B^2^y zbZ+{|o+L|y3FZ^`@x!dGCt$R?(Gms9z|pZ%kMQCVRAF6ERV@MBPBYCts(XD+GB)&V zb}cl`mi5$I`hi2^Zs<30lM%vy#-Bwy%-(X>3`!+x!G(=A)Uzd>!U8P)uOd-is`Z1Y+0^2tS zhQcHc>4d1Jq73x$X zy4IU^%jLDtn>70DGdilOjUz04@tJ!GFI&h$atXU(MlaaUc@Av+QkLlicB3L_IBR^( zH|W1&?Q51l9PjGI%t6N>C28$wI=0FW<)?|B-qz1p3R0SvAPjHUdsL{{9QPO~tDPFQ z8LOv!G@Rid%5^4CwEgg^8}CK7_g0)8B4Wpd6H3{r9qZ9!70mgX;odDQ+UJ^;oXCJz zAY?5Ye~8FN3(UzJ^QaRRpC6}L+kyW^aM3`YxirE?v>roif@fLJdiC&(&CZ8Y;#|2v zgPSR5u=R^@+EKDEifzSp+WtFe zTl1w&RKfy~!tGI)$Qk%6G2NqB(s7TVVed2q&D|}Cs-&aFwA&=A2@bjI?O zV45*7H?0+Z26}}i!#@AJ!MI~dZU`%GM?IX>wV+3|O47>d&u78=o` z(%aK6m#IFhP8Y&;4vcyxh2GPNRZWR~z_#$tmh!1D7KT28LD6X8giDGyjB3hVuDCeX zUZi)`!OPJ%u-P;!Ly_F=p*JzyVdxme*&kJmwlWhHz}6kBLx_4H7{&N)9tT8_D4H6T z>QVMorN=pe(yJs029ySkC7IsDqih@XngZHy=s`TZgft!L4Pnrp!+x%|0` zy+zM?iJ?r6kY>0LiwF=;KI1+B(;BsEc?o87H(*=oP422^O4pCCr{e8r+W9iB%*@QpY#%ek%*=4iOffSvGsbqz%Uf1VL1z^jAO&o1CjvEO>GyxXlkiAnsG-jr|2pIh(a zN3Ko{pMAf*u^#}7KX^X1KHIO%-_m10LOy}V9yiQC@)bYEUlHG1A3AqFZ-|q6<2F}5 z1YbR#ffL9V{v?JGpU5B0Pw(%+5A16o5LfTvm($kC&jJ5{_pXnHYeqQeKmah`I`O)y!kx!H|y!|P52c56nP(idwl==lmGd7`~JsU=-uFf=RM-{ z7e>=lp~XgmdTE7^QltGZx_NaW8tqmyOsk4~42HD^_@)KLC@i}bC>`svp)XwLLDih9 zyP?_cA{trcH=>iBB$e`N|4RdijP2H5P&$*2wWA#9ML5@p^J6Ye)7 zIUa_zjf1HmDC!G=W7237PHFm2ewh+9P(y58@s$F%MuDqYrS)ghSP+-$rV6u9%_GX> zf5ft$alds-ESvbJnOXCmcmldz{%rsx&q}K~_F<&KUy)gAPX=a3j>#NyEO)U0_Yf}) zg&od6pr(Sw#%Nsk3h9x@pd~;X_WRJr&5g(}zq5!S_E$%9gvrLI^K2v3`2%yahWYpI*R{@9{I>j!no{m9Ah*qbB*LhCY=!#3?O9 zZ+yn|xc{2uC&Sgj`;QW6(}Io5qD&vdJ|4@!llMx;d^9unhk--7{VUYoi>TSc{6Oa{ zIi?_eS4ONeXUml4g0#}|h!0idnfrR{@km%I?7aGY02uuGNl$!ui z=#5zNB3_KbHK$ec4Th?1moZ7eL#3@N1@SmM0`6_J zHV+kBc!4yt&xiMI$Zv|s^GmfG%;e*L-VYDK!&=-t(}_6 zyF+z(w1&@PY|C787z~YtoyH1E``%?d(`4Uq@smnn_%d~A1R4P|=v(q=&K_%IT4oc# zjrdnp7z)&=%byo&C59Y4DFmz@78P`7$_nDM8S^J{#&kzWr}dBj-of`X!V`}p+6Ln< zozm#;l~+I_`9~d7HO9{)5Vl)MGwj}Ql9R6OKfidZ8&xloD$_9uD?;;P$E#V7)XRI< zW_#MsqA49YJnv&-j^+19?9+%7nf+aPo00wsy@ht9G@tlnk5|@sf%vJaSsl^p$w!`B zcUN%K6_fWavo%AD_=u zfWI4@H>1wnCBGBb|mv>Z-ik;@7zha&*?U@NZP;)k>FaQ#Pqd2-Ik8eM>VfWj(mb$B`NZbiVAzPnJ= zhzJ$PL&@c1^v6tk_aVDBYExJ7L_{yAHo?JAWU&+1YM&0_{>_nYooDBCgwkKWS18;) zq>?Z$%&Wz#P0VrQp$ekXON8n3NHXd$jd0g@g{S^drcpABu$Dpvnb#@u&W&&6ZcW|7 z_9Ni{wY#9p+%WfFcjKPbA~b)1FHu2)(GZkV*11(;9ZM>GRlQ3~zy2D&zj@7mR6=W3Rpx{sJMtk*_QBP@Zr?ED~214u>Eti>7-m_d&Heu)ywlLv; z;T1m7dii=)H)a0?pI7k5_|C%v?6!>2_~8C7HJJjC*lU&N|56i0M}Tqct) zs&pkM^MbJbq~zNq#9>S3Fg^$14A7NyQTW^13q2oWp!JhV{(wa~X3CDPEiA@Sl5#1- z-N?jOEU5Q{$8k!n7($zl=#zY<$(rveZw)z}?-VKTP)}anbChBjqr=sK~o*i<-7KAurrD zQzcjYQh?s>f^gW=R#?cVPuB?BEQe_Mz=Uie?psW%ZxN=n&J!}U-qG4#GEn&3h*|md zn;*+&1heG(E})kCWT0>zFI7pfw8`4{)}4bEn5#9M;DSo`I~-ph=|SoJZ7iv+G*Uft z)NB$y@0B$a()~gm zs6j$Vsq!~GcHoa)b&e`S_vYn9Bq~UlIY*5yz|Z%uE%M%=9?-9cJo(w8V%lSc!XR3f zOF(zxEc)~lhBC+Rl%oZ#7?wvrY>nwa2FY(FI0pevgZr150#{GxQc`}n)pn;74TJhS zTvXt0jG9s`Tj*hgo#e7}$POJa=oyDJicpQNp@m697<5bk@B8T`TzSneH)jS@1UgJ>;OA%ZVT~P40;N+^KZ0bn>wEO3a zP!u3Gdzf5rbm)(qU04U&5>n?Vo6z6AB-y*(EmAr`fbJ!h0U?cyU4rf{xLqR}GbJXt z1d&a37bI!kqGh%8Tlr~l9NZ8fPMQU6jUKIWQHUC)xlge{@%ZDJNK^-kwcJQDlQW{a?wWeU1z)-RrL# zl*2}OMW2T!>+#8Cl}g~yd+ctRlAwqRICUBmU${$Elp=XBdx@D}I{7iEP_yZFnCY`? zEBu-EhSLq>MsPv*+-WC8fi>sF2(H#|r3HIz<+?NSs<3pBsqYwQ#UCp61?A6PHk_rX zrb=R(4zLl_J!Vbrp9;fzA}YlBvf9k-no;z%By)1wW5~>aSLJ9dI$0NiK_V&BPng;+ z$`E*$M4QKXYDV+5opU{%{8qMSJ(`b=wF+8wx3imrnQi!6h}-)I2JpF`n~?(u?DMvH zr2eg#B#@Xtmw7Kp$}Zj+70A#WEuWrG_vH@@Ra0+`lEKAJKfZQ^XrQ9co#s;d{!Hxh z_e)wIz;8fkEtk!LSEi)GV)vwrG7C0Cf(_w5zkq?xUJqw%_aS2qEx8t@+;U`W48t@B z(i*(^OD_^AIEc~0eyf_hAyTbBfy9su?6BO4!VUA%GF9fxUm_8e8~#)f*uuqiJM19S zH0C*b`#N8lh-Oi?2hpUyY_fNpYZFZve;+8PR+teTOc1=T=MdRaDc7r`XZb9P1zj7w zp^%=m%-8OBWkKjkru&$4g6}03W(_uCIrV3hfo|M&=!N5ZQ=qXzYgIst6v(Th(;o7@=9*X71hTrDNtCf+JNU!0b zI%Gu(t56uVUnx3*(|uvqlElQ(T$}rJ*#)e6c*zsTT_6XO4QYw8w*}W-nR7>Kw131I zM(0WJ8_PW7E1#&}mLB{1u;2@b5xqV5qr}+V{X+Z~7fVVsQm$>=%GpE=oC9;%gccaK zqUjXgQ4H|@#{g6qRl^drjka%+_oQrxYm%TBzvj~Oo|NrR6|?EvlWuza*eP`5%KSA? zM`G~?H;IgD+gu-)K+G^p2$vcOJ~goSJk&Z2zr7qJ%06Z3q^gsp(Xu^uS2dERW|#5X zywt!p_Su~zjOYD9NhlA)?_-z<`06jZyHjfGLK-DsT(X&HB!1MpH-;Nvx6nZBGA~ue zM|%g8`B6K5DfBQ)*2dBQqqwV*JZ7(MbV%BWg zG7vUH+aW=qudEUH8Q(;L#a)+vUaXUmL}i4Ud{}f}Gfy_2+m(C3>8;AuQx0TbGJv8g ziTDY#%`lWPRUHx5F#w*sQuLbFf-wiLBli_9Dm)k>MY%UVm7bbYj`#wZ4|P9CMFR}U>C4;ZKwJ8LlgCoCIbL~Fw!GVq+!jd z(M;=8#hVQ~Di;#uZ=~2kw=wg<&2zzXYHx{8v2$hHz*W!E3bUlujB2+dG4P zoSR?uMUU_6ppRpWv$qg64}MzKJKjGZ!5_;{|2?~}eJb0S#=ho`S#fzT;**0Lr{5f)3&R2X`zc(E+rwQgbT|s59 z%d4ABMfYH3Dy!uSzS{i^Bd=kvCWt{tP;OjUI1oNJ=gW#x;Cee(6~^Q#p1Uiyg8~%m z5AZ)j#kdD8B3Jle1$DoMl_9mb9odtGhm@Nmr4kn37KXwf@wpH*dFiAvoNsksYxbL+ z?PgC}PbGfO80`^k$%``5{{~Xo`*O#lIJQ_{=Q01Rxm0`ZSU zv;1xD@V7-Ya9M+>`SwTbki5V`4asl9+Mu0c_D_ZTKUd|!u9us+vze+5wi0aP7VohBm(TgRt!wAVc(Mx#xJ-RNeDXlIWuJ-Obl3(PtSgCxHFIv zJ_k7$k(g*-fOd9SK94q|jEW`QsPz*YSsW6;>J2?iL+n=fR}@h6oRXdo zo;&2RHM*B{o+ze9;6V!)@0|?F?6^qk;J;`20Ss#YZuOwU^r5~7h9LI zOx!Pb8+^Ld`0Fz}CF(FPh0jUuS|G05!sS^q-cqjR1niD5-=~BaZR}D{*>5o1ZeqUk zbma+_<3|-XMF&Hbb7IPGA^BuBFQWoencSg*mzq-FdRfG-H06Y=}f=J=l z1mfgO$;qUe7327-CM0oOX0v9c$7F&st$obbldM*N&H1_3RK!}ZShTXq{%q)@UJib{ zgRL7hRr}kZKr0x;SgNb5V2Y}2ti|0k4dYlk4ij5(bsi&TO-5#0r!0eCaDV_(V8Rhl zgN|}-N~VY+Y?u2_YF3?W!u|2N={@Bu#g2)ROfWE;zd)tx`-;V4EJ?{!kl*5Q!~_w z-!qT)lM*cDr7`0k0a9HN;P|yLF3cBUoT@@IE!RLd7jMQPEv4O5h@Bo?XM7wD5{qkq zh|@L}RG^U*xE#q}V(<%JexOkb#!xOK!@@nC|1ZjCDsw*y?iabzD%xE9%)p)GNBD5{ zOjp?=vUP8ivWtM!|8ncfxCPmty0m*qr4vh4p@Z-h+>u(b^)c8an7cbMkRiD<L~2o?QR_{NwC@%6Uo8)(`A4|=-0i6pND=64|q zB9xJvy1U3K-?X9w3R+@|KLNzR9d)Ui+*+6?lxZ2n> z6WIAD%ji6HUH0t?)i9^%((mh$APOarG>F@eJTmnTX1{52-)FkPH#jI28cyJ^nf613 ztl83zXl(~LHRnLqZm#8UQwJ%3l(wbe zjN~Wi{#epaJiJV#iktCCSLztD5g4zA0J9lry6p9RcjEIqzRSCr2g8Sa{&iJr{IJD0 zH76wZoVW!3dd)hoR^Ow-ed2}s>&${ZK^wP&g414;AoGfUqF`+=9lUHgpBc31!8?dm z!kSZ0N2hnQzYj84(D_~|IdbT(N@K9+zY*r!gx%U)JYw;BUVEnx-Dmk^$=(sCsOhD% z(b1W8DV2{D+^8zViu}VybO1KYBq!~uiqk)Th>6O;Ccww_lm)?a?Hx+LCZMy{_h3=l zci{ld)i|SWu^9@-hPt+2n0T5{h;|i1<3MLhPe3hx1L1V=acJkfe81Qf5yxzETeopF z$sj&Oj5`IAa8&qrPd0CV2o~s`it3#)XbZN-syB>wc32UIdCh7@C4w1r12Vq~}R!+s3g~;VrV1JlP$6*dxcPw7G zwZVD-Q~68ER)SqCMpT7AVdWTVH|<=c20EIHtu#q}>KlIM0!foOtz@v{lCvxIp;g(c zCN}Vygb!odj;KPN=8;igj*nPPrSf}Z$_(w;zmr${@QGhsbO(3pDY?Oh zpGu%H8v$c()!mfMHdV%EY~893R5`33Qw7NYuDS0_!lCztdl;w1O6#Wz7aAy!3gO~~ zx1kW76Go3qu*1;@&al5dw<57FAMeXq^-L?toUX5BIHFu!K6e86LZ+>@y#E$+`0=4wdKnDJI=X_6ZqkDN~m6+eaLw zgtZAt?4C=WU?E+JHQln7nW5_}ZfeYlc!~dy@|Bd(T(T8?YHkIrKg_krSrseQZFBY# zQsPar+zD~rFn0_BCvP85*R~7jb~y(-u&u3*ldOTP!il|V8oEMz4oJlDET?IqdUhOy zzlYHj@zD%C(tbP)hHwn zY+Iza0ilotJkg~?<#SM&+yp7cZT-un!Yilx#wGKGG;Q7#?xYr0)FkJSSm5PS34VJ9hX=X+>71};VDRg5>^gcgbt98n-8Dbu z(Gk2Jsld+sVXWnYGHonBdx{deo=76irK7zP6vWcWGCCi{|6Cy;Ib5Wly+-mlZT}X< z1_*Ddyk3^GZr_xQ`|H1o9{f+!b*xlNxQc7pW3h#g1cgwxh>>*u?Ha*h?@9zHMI~W0 zPDI!G^GN1%rbF@!Js)n^=PtyF8h2tDPLeMsIWvx8ZI7feu(mZ-w+YMOOzpXy zPm}ajl?!#RWjkv&tZR2@Ddm?a-{#FWJmqp%Ld5i7O6~mW-l)xx@ie{>Wv8l~7d0W4 z%A2*WkbR^2bsX$Fc^n=o=$c`;4Z^OgJQhBd(^d}25yXASplA7L{>+*b75=J<%TG=A zSs~Z=b;SZ09?{rL3qieyAFy^?zwD2ega>~8vBW=S)+GGiMHp-;C|6h&1#Shd&)2ojl8GY&*oHLJub=(xT>mge)7*ngiK_!Mv{G~_?xCoMH`m!Pj zTf9h*l41}4RrE2ZhumLwNI#XZ=kP7YQ|`d#Q>ZO@FVs&DMQ+4lKK_`@jML|rmPJs6*l<9g502?2Gkr@A(!D~oN9q?-c1bj!J02ivsMXcj4udJe_7-eZVpfPhwYT{EITmnJxQblF1Jhzk z2n+JY4|GtO>;##F@jOoqR?&pRYlJL^JgyTp^Hm!KJHn(5ghQAnWpx(Q5+fe~o37OO zSuk)=@q{ehEV%MaT39G|q<@#`ot>GI%j>!i!%FLI2t6ESlJoQww#jNnkWp4d+`QjAC#OX_vwG4tKUeV!{-H;2LV| zOK{VV|vcnI(3oO|%*Tc0FK zIMv142rS%&Odc-Fv{%Y``)Z$zj*Qz_1Y}zoVI}`y3(G{R(&$QkKo-MzloL*=XjP&)_CkTebt<76~rR0{f zC@VEb`t){@dUdYH!mr_A?6=Fz|1DOL0PmZbRlLjm-78m^vv{xo#9fh$`&9m@>Ht@4 z#U~g*r`5;;QQe2-_nJl{!^ zL1)@yrP+!;*Xni{Az&y|p<_BLgGI(k8!yvLIZ)bF8BV@cMR096tJitm2EtAEtFb&p z6=|W{V?E5R7JkK&WyD}~(CQZe06Q1S_oSs7>qs=Eo&98-><4^T39kWk--rTz`?=s` z>Ga~`wZ_gzOLJcS%#l?=DRq@EPn*Lk#sI3A`Aa1m0~C@dumLcH|2oCc2sBFZuBWzln^~5^JYX=(Lk9nwHdM4L>n^7C zTTuy|le{?+5p8)IVS63Hmz6m$sww$R!yF~&Ot1) zrwd468N@Won%RQHmSj=g^E&c%>1p56yQ=Y6;y=s1pL+R!Hx9dmRTr@FlNxljr4*%g zF>nC5%nHUK+*clWVu7vF7z~qdSYs)vR9{}B>E)j|+-z%`=4v^x*g0p*vApXW4tTEL zBg?OZVPJ!Qi6p`~I$$wlBnb~H%TWeC@)-ofn;X=dfb)ec^GI**7Vo;(c9rO{MJezf z;<`HvlJrBelj7VNioXcfjYJFtW{^2@L=Q67S5YlwKiM1Klo||Ma^Mfkx7V2mc9K8u0&ThE3d^ayP|3Vgz5hhuv9yH~ zG|F+@QfNbK3reD4wntl*u?0vNydd;Q@9mYqSfbIMVtEv37i&Fr^^cxCOTb7II#0I0 zXW`gy+P^9E6dY@C1jn}Atwx38SVm0kLLB@SOwQ52Re>PQHmD%rEWWbg{bnCR<5AOR zIv5uKRtTJZQZUZxeVx*6AnMnH{R5wLhz-wpAVhp^S`Z+~E1FB3UCU-prIZ_O-MGT$ zG^KjQ(*Je-@VD#kajCJ~K!14?K}60 zKCiJ5@d}}2nZWw`h+=-S5w&`{HN>0qYyWX)zqj<1%fw+)?&I@o?tKBdZjo%|L3|X! z`o6&!%^OGk<6`T`(s+m-@Y5=^?=fD)if%ZMQ-xd%j*vg*JD!?iEWlm(Pz!eDv%zs7CW%soW*=J^^BWB=O(CG zN0Zmv!lM|r=p6(lq#-=!Gnudg*0cmISJjVENI2zSY$8JBjt|y zlJcp&=1l%y-M_~iC9&-%S)3m{JLHK1K$pj`6F^P^mL&9ni98BrYNb({*Ez6- zmrouAMMb>)<16t&($a|)VjaFhf9#inF{eMYZeZcVaTbtWLcI?@A+)QRGk)qhgzws& z!uhs9r11OXTBWsnR~$)=&~a1tk?p5B#neYWvMy*{aL15&5Bb%~Yj-D=Om<81-wqWm zI&u)qF-dV*Dj})TX!~ey-&&>hSK;P_qTcx+KI6eEak!T3OVKX2e=tV#j9;Ppx(^H` zI{=EAHy}ftJCO;@lMH|YG@A9Uti=6+8X_p~ugt$oJ6YBx#v z*Y@yJl!VR~dmz(F5}(lf;EOMszF`JFs|bD8P!n8=zk8s{So6qKmyLDJX-kjeF=t@g zGu-Z5Hg(oSD(w(_kKFvZDEP*jP~ghZPKMI%oZ+-;U^B=xrb0Qd%WFHI7znk^!XGYB zz+V%TZpzJh>Pbft;3GnO_Z*aO^)biYh$%N-iINMPU)k_FUf&%7%59%9=#~s?F~Aun zkDzW*;jl|IzD6f@L%+If`U}cWC{kU3_;pV_!a*Qi2BeA|n)H#{jO=j+wBL#;R zFZx%Le|-(GX-e~a|6I04YZ?@s}T?jrPo%Rb9QIk=t-KKk?%E)T8fbO{x)j*YsnKTmD`)9r)%` zkay($S&YAZbo4I~BxF5uDH6(cZ{|x+L98Q>_m@%j1}F)}u<{hS%^^l1GDoyq^^Q_5OjS!h4*VO#DN` z6+Fs7jT!f}eJ9BxIBKB(!UeyUqJQG;NYb{iZieakUQ!HDiU_A_T&eohmjlUVz3>O; z)bQl1Ws0GIb|q39L+k=Hg)N9OYd6wGfyDB6SHXZo720UYHw)+uXzHG7r8N1b2n+8I zIGRHfFsEO5s~vFh$;fcj*+tilvZun13^*XF{=>%+&<9Pt#JgwI8*vQ<=-Q>y-C&w| zi#DI1X*N<9#%S~yn@tPMlBH5e0#`<8MR7AI$11YExrf|hG4Uo-e^V`WslH^ai3_a3 zq$~(#B4LrR=S;Cy!44&vfl4${UK1tSJ&;<}ezB0sX(4yP9otc@BHeLd0?YDM13W?t z*Wjbsd0YE#a#{4&Vja#c7g5tp#CLPD-`jPTWd0YxIpL6Rz$9}5`jFT;6)v&rbiIO; zbZVN1N~Rhr_o5~n!@C}JSI=!a&mrrBBVDc(kuC(Oz6AykR5X}9h6Chkz0-KZH*$g; z2MU9SLK&hIvQC|pgqCV7`EbLK?nXmEh^dprD6BW9p-VR_>>To$tk?E#sv2GI*5%Hu z#7FSH-6o$|zhNI}khwwnf%SUbyK#}}laGcW)q{424}?7JHwlk*4<&U}7KW1p8IRp7 zdjibG5sHdgD~i)$M$mcsWT-1kF2gFwaSu>MT?Z@Z=0^%93$wKbR?w<|UB~s%fNJCpEhl zo1_F=w3McHs|VnelZ2xl!#Hl3E=B1-2SbvPfKaf+P_g?(>uk9|oKF7&@R9=UMyPSdD{3^`DjDP~Y1357+~9Ddc&`NF9mqYeg)jmb9`@G~UBL z4`Dm#H&JzaFq7U~h9&A_l$2e!8>wsqMbiV_$tLwiwof(o_+p33mC%Cuhf@KJhsHHL zIImd0>A_Q-QnVljN(nbI$C9>Dn%xU60Qmt0Hp-;VW{V=|bSMBcUCqvoYtrA2!So3M zaPYN$Sq7yv`A$?nk%W=z>NPG&{Z>*oo({Jm$eo|21J}pp1ONc3!74`pOdor_w9+;J W@w=~e_TCkkk!Nwhf0UnpyZj$;_j|Me literal 5048 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, used as the SwiftUI tint on iOS and to derive the primary color scale on web. ([#46566](https://github.com/expo/expo/pull/46566) by [@zoontek](https://github.com/zoontek)) - [iOS] Added the SwiftUI `accessibilityHidden` modifier to hide decorative views from VoiceOver and other assistive technologies during element traversal. ([#46579](https://github.com/expo/expo/pull/46579) by [@ramonclaudio](https://github.com/ramonclaudio)) - [iOS] Added the SwiftUI `accessibilityIdentifier` modifier to set a stable identifier for UI testing tools such as XCUITest. ([#46556](https://github.com/expo/expo/pull/46556) by [@ramonclaudio](https://github.com/ramonclaudio)) diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt index 573dc4fe9fa92c..f2ed1b98e033fa 100644 --- a/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/ExpoUIModule.kt @@ -36,6 +36,15 @@ import expo.modules.ui.menu.DropdownMenuItemProps import expo.modules.kotlin.jni.worklets.Worklet import expo.modules.ui.state.ObservableState import expo.modules.ui.state.WorkletCallback +import expo.modules.ui.textfield.BasicTextFieldContent +import expo.modules.ui.textfield.BasicTextFieldProps +import expo.modules.ui.textfield.InnerTextFieldView +import expo.modules.ui.textfield.KeyboardActionEvent +import expo.modules.ui.textfield.PlaceholderView +import expo.modules.ui.textfield.TextFieldContent +import expo.modules.ui.textfield.TextFieldProps +import expo.modules.ui.textfield.TextFieldSelectionPayload +import expo.modules.ui.textfield.TextFieldValuePayload import expo.modules.ui.menu.ExposedDropdownMenuBoxContent import expo.modules.ui.menu.ExposedDropdownMenuBoxProps import expo.modules.ui.menu.ExposedDropdownMenuContent @@ -155,6 +164,8 @@ class ExpoUIModule : Module() { View(SlotView::class) { Events("onSlotEvent") } + View(InnerTextFieldView::class) + View(PlaceholderView::class) View(IconView::class) View(LazyColumnView::class) View(LazyRowView::class) @@ -697,6 +708,33 @@ class ExpoUIModule : Module() { } } + ExpoUIView("BasicTextFieldView") { + val setText by AsyncFunction() + val setSelection by AsyncFunction() + val clear by AsyncFunction() + val focus by AsyncFunction() + val blur by AsyncFunction() + val onValueChange by Event() + val onFocusChanged by Event>() + val onKeyboardAction by Event() + val onSelectionChange by Event() + + Content { props -> + BasicTextFieldContent( + props, + setText, + setSelection, + clear, + focus, + blur, + onValueChanged = { onValueChange(it) }, + onFocusChange = { onFocusChanged(it) }, + onKeyboardActionTriggered = { onKeyboardAction(it) }, + onSelectionChanged = { onSelectionChange(it) } + ) + } + } + ExpoUIView("RadioButtonView") { val onButtonPressed by Event() diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/BasicTextField.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/BasicTextField.kt new file mode 100644 index 00000000000000..299758bf57efc6 --- /dev/null +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/BasicTextField.kt @@ -0,0 +1,203 @@ +package expo.modules.ui.textfield + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.selection.LocalTextSelectionColors +import androidx.compose.foundation.text.selection.TextSelectionColors +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.isUnspecified +import expo.modules.kotlin.AppContext +import expo.modules.kotlin.views.AsyncFunctionHandle +import expo.modules.kotlin.views.AsyncFunctionHandle2 +import expo.modules.kotlin.views.ComposableScope +import expo.modules.kotlin.views.ComposeProps +import expo.modules.kotlin.views.ExpoComposeView +import expo.modules.kotlin.views.FunctionalComposableScope +import expo.modules.kotlin.views.OptimizedComposeProps +import expo.modules.ui.GenericEventPayload1 +import expo.modules.ui.ModifierList +import expo.modules.ui.composeOrNull +import expo.modules.ui.findChildSlotView +import expo.modules.ui.renderSlot +import expo.modules.ui.state.ObservableState +import expo.modules.ui.state.WorkletCallback + +// region Inner text field plumbing + +/** + * Carries the framework-provided `innerTextField` lambda from `BasicTextField`'s + * `decorationBox` down to the [InnerTextFieldView] marker, wherever the JS + * decoration places it. `null` when read outside a decoration (the marker then + * renders nothing rather than crashing). + */ +val LocalInnerTextField = compositionLocalOf<(@Composable () -> Unit)?> { null } + +class InnerTextFieldProps : ComposeProps + +/** + * Slot view for `BasicTextField.InnerTextField`. + */ +@SuppressLint("ViewConstructor") +class InnerTextFieldView(context: Context, appContext: AppContext) : + ExpoComposeView(context, appContext) { + override val props = InnerTextFieldProps() + + @Composable + override fun ComposableScope.Content() { + LocalInnerTextField.current?.invoke() + } +} + +// endregion Inner text field plumbing + +// region Placeholder plumbing + +/** + * Tracks whether textfield is empty, in order to render placeholder slot + */ +val LocalTextFieldIsEmpty = compositionLocalOf { true } + +class PlaceholderProps : ComposeProps + +/** + * Slot view for `BasicTextField.Placeholder`. Renders its children only while + * the field is empty. + */ +@SuppressLint("ViewConstructor") +class PlaceholderView(context: Context, appContext: AppContext) : + ExpoComposeView(context, appContext) { + override val props = PlaceholderProps() + + @Composable + override fun ComposableScope.Content() { + if (LocalTextFieldIsEmpty.current) { + Children(this) + } + } +} + +// endregion Placeholder plumbing + +// region Props + +@OptimizedComposeProps +data class BasicTextFieldProps( + val value: ObservableState = ObservableState(""), + val selection: ObservableState = ObservableState(mapOf("start" to 0, "end" to 0)), + val maxLength: Int? = null, + val autoFocus: Boolean = false, + val enabled: Boolean = true, + val readOnly: Boolean = false, + val singleLine: Boolean = false, + val maxLines: Int? = null, + val minLines: Int? = null, + val textStyle: TextFieldTextStyleRecord? = null, + val visualTransformation: String? = null, + val keyboardOptions: TextFieldKeyboardOptionsRecord? = null, + val cursorColor: Color? = null, + val textSelectionColors: TextFieldSelectionColorsRecord? = null, + val onValueChangeSync: WorkletCallback? = null, + val modifiers: ModifierList = emptyList() +) : ComposeProps + +// endregion Props + +// region View + +@Composable +fun FunctionalComposableScope.BasicTextFieldContent( + props: BasicTextFieldProps, + setText: AsyncFunctionHandle, + setSelection: AsyncFunctionHandle2, + clear: AsyncFunctionHandle, + focus: AsyncFunctionHandle, + blur: AsyncFunctionHandle, + onValueChanged: (TextFieldValuePayload) -> Unit, + onFocusChange: (GenericEventPayload1) -> Unit, + onKeyboardActionTriggered: (KeyboardActionEvent) -> Unit, + onSelectionChanged: (TextFieldSelectionPayload) -> Unit +) { + val core = rememberTextFieldCore( + value = props.value, + selection = props.selection, + maxLength = props.maxLength, + autoFocus = props.autoFocus, + keyboardOptionsRecord = props.keyboardOptions, + modifiers = props.modifiers, + onValueChangeSync = props.onValueChangeSync, + setText = setText, + setSelection = setSelection, + clear = clear, + focus = focus, + blur = blur, + onValueChanged = onValueChanged, + onFocusChange = onFocusChange, + onKeyboardActionTriggered = onKeyboardActionTriggered, + onSelectionChanged = onSelectionChanged + ) + + val singleLine = props.singleLine + val maxLines = props.maxLines ?: if (singleLine) 1 else Int.MAX_VALUE + val minLines = props.minLines ?: 1 + + val textStyle = props.textStyle.toTextStyle(appContext.reactContext).let { + if (it.color.isUnspecified) it.copy(color = MaterialTheme.colorScheme.onSurface) else it + } + val visualTransformation = props.visualTransformation.toVisualTransformation() + val cursorBrush = SolidColor(props.cursorColor.composeOrNull ?: MaterialTheme.colorScheme.primary) + + val current = LocalTextSelectionColors.current + val selectionColors = props.textSelectionColors?.let { record -> + val handle = record.handleColor.composeOrNull + val background = record.backgroundColor.composeOrNull + if (handle == null && background == null) { + current + } else { + TextSelectionColors( + handleColor = handle ?: current.handleColor, + backgroundColor = background ?: handle?.copy(alpha = 0.4f) ?: current.backgroundColor + ) + } + } ?: current + + val decoration: (@Composable () -> Unit)? = + findChildSlotView(view, "decorationBox")?.let { slot -> { slot.renderSlot() } } + + CompositionLocalProvider(LocalTextSelectionColors provides selectionColors) { + BasicTextField( + value = core.value, + onValueChange = core.onValueChange, + modifier = core.modifier, + enabled = props.enabled, + readOnly = props.readOnly, + textStyle = textStyle, + keyboardOptions = core.keyboardOptions, + keyboardActions = core.keyboardActions, + singleLine = singleLine, + maxLines = maxLines, + minLines = minLines, + visualTransformation = visualTransformation, + cursorBrush = cursorBrush, + decorationBox = { innerTextField -> + if (decoration != null) { + CompositionLocalProvider( + LocalInnerTextField provides innerTextField, + LocalTextFieldIsEmpty provides core.value.text.isEmpty() + ) { + decoration() + } + } else { + innerTextField() + } + } + ) + } +} + +// endregion View diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/TextFieldView.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextField.kt similarity index 59% rename from packages/expo-ui/android/src/main/java/expo/modules/ui/TextFieldView.kt rename to packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextField.kt index a675d9b1d5bae3..aa98cd5db8c5fb 100644 --- a/packages/expo-ui/android/src/main/java/expo/modules/ui/TextFieldView.kt +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextField.kt @@ -1,8 +1,6 @@ -package expo.modules.ui +package expo.modules.ui.textfield import android.graphics.Color -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.TextSelectionColors import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialExpressiveTheme @@ -13,35 +11,24 @@ import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldColors import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.text.TextRange -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.input.ImeAction -import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.TextUnit -import androidx.compose.ui.unit.sp import expo.modules.kotlin.records.Field import expo.modules.kotlin.records.Record import expo.modules.kotlin.types.Enumerable +import expo.modules.kotlin.types.OptimizedRecord import expo.modules.kotlin.views.AsyncFunctionHandle import expo.modules.kotlin.views.AsyncFunctionHandle2 import expo.modules.kotlin.views.ComposeProps import expo.modules.kotlin.views.FunctionalComposableScope -import expo.modules.kotlin.types.OptimizedRecord +import expo.modules.kotlin.views.OptimizedComposeProps +import expo.modules.ui.GenericEventPayload1 +import expo.modules.ui.ModifierList +import expo.modules.ui.ShapeRecord +import expo.modules.ui.composeOrNull +import expo.modules.ui.findChildSlotView +import expo.modules.ui.renderSlot +import expo.modules.ui.shapeFromShapeRecord import expo.modules.ui.state.ObservableState import expo.modules.ui.state.WorkletCallback -import expo.modules.kotlin.views.OptimizedComposeProps // region Records @@ -50,25 +37,6 @@ enum class TextFieldVariant(val value: String) : Enumerable { OUTLINED("outlined") } -@OptimizedRecord -data class TextFieldKeyboardOptionsRecord( - @Field val capitalization: String? = null, - @Field val autoCorrectEnabled: Boolean? = null, - @Field val keyboardType: String? = null, - @Field val imeAction: String? = null -) : Record - -@OptimizedRecord -data class TextFieldTextStyleRecord( - @Field val textAlign: TextAlignType? = null, - @Field val color: Color? = null, - @Field val fontSize: Float? = null, - @Field val fontFamily: String? = null, - @Field val fontWeight: TextFontWeight? = null, - @Field val lineHeight: Float? = null, - @Field val letterSpacing: Float? = null -) : Record - @OptimizedRecord data class TextFieldColorsRecord( // Text @@ -132,21 +100,6 @@ data class TextFieldSelectionColorsRecord( @Field val backgroundColor: Color? = null ) : Record -data class KeyboardActionEvent( - @Field val action: String, - @Field val value: String -) : Record - -data class TextFieldSelectionPayload( - @Field val start: Int, - @Field val end: Int -) : Record - -data class TextFieldValuePayload( - @Field val text: String, - @Field val selection: TextFieldSelectionPayload -) : Record - // endregion Records // region Color builder @@ -230,54 +183,6 @@ data class TextFieldProps( // endregion Props -// region Mappers - -private fun String?.toKeyboardType(): KeyboardType = when (this) { - "text" -> KeyboardType.Text - "number" -> KeyboardType.Number - "email" -> KeyboardType.Email - "phone" -> KeyboardType.Phone - "decimal" -> KeyboardType.Decimal - "password" -> KeyboardType.Password - "ascii" -> KeyboardType.Ascii - "uri" -> KeyboardType.Uri - "numberPassword" -> KeyboardType.NumberPassword - else -> KeyboardType.Text -} - -private fun String?.toCapitalization(): KeyboardCapitalization = when (this) { - "characters" -> KeyboardCapitalization.Characters - "none" -> KeyboardCapitalization.None - "sentences" -> KeyboardCapitalization.Sentences - "words" -> KeyboardCapitalization.Words - else -> KeyboardCapitalization.None -} - -private fun String?.toImeAction(): ImeAction = when (this) { - "default" -> ImeAction.Default - "none" -> ImeAction.None - "go" -> ImeAction.Go - "search" -> ImeAction.Search - "send" -> ImeAction.Send - "previous" -> ImeAction.Previous - "next" -> ImeAction.Next - "done" -> ImeAction.Done - else -> ImeAction.Default -} - -// endregion Mappers - -// region Value helpers - -private fun ObservableState.extractSelection(textLength: Int): TextRange { - val selMap = value as? Map<*, *> - val start = (selMap?.get("start") as? Number)?.toInt()?.coerceIn(0, textLength) ?: 0 - val end = (selMap?.get("end") as? Number)?.toInt()?.coerceIn(0, textLength) ?: 0 - return TextRange(start, end) -} - -// endregion Value helpers - // region View @OptIn(ExperimentalMaterial3ExpressiveApi::class) @@ -294,31 +199,24 @@ fun FunctionalComposableScope.TextFieldContent( onKeyboardActionTriggered: (KeyboardActionEvent) -> Unit, onSelectionChanged: (TextFieldSelectionPayload) -> Unit ) { - val focusManager = LocalFocusManager.current - val focusRequester = remember { FocusRequester() } - val state = props.value - - setText.handle { text -> - state.value = text - // setText moves the cursor to the end; use setSelection afterwards to override. - props.selection.value = mapOf("start" to text.length, "end" to text.length) - } - focus.handle { - focusRequester.requestFocus() - } - blur.handle { - focusManager.clearFocus() - } - setSelection.handle { start, end -> - val text = state.value as? String ?: "" - val clampedStart = start.coerceIn(0, text.length) - val clampedEnd = end.coerceIn(0, text.length) - props.selection.value = mapOf("start" to clampedStart, "end" to clampedEnd) - } - clear.handle { - state.value = "" - props.selection.value = mapOf("start" to 0, "end" to 0) - } + val core = rememberTextFieldCore( + value = props.value, + selection = props.selection, + maxLength = props.maxLength, + autoFocus = props.autoFocus, + keyboardOptionsRecord = props.keyboardOptions, + modifiers = props.modifiers, + onValueChangeSync = props.onValueChangeSync, + setText = setText, + setSelection = setSelection, + clear = clear, + focus = focus, + blur = blur, + onValueChanged = onValueChanged, + onFocusChange = onFocusChange, + onKeyboardActionTriggered = onKeyboardActionTriggered, + onSelectionChanged = onSelectionChanged + ) // Slots val label: (@Composable () -> Unit)? = findChildSlotView(view, "label")?.let { slot -> { slot.renderSlot() } } @@ -329,58 +227,11 @@ fun FunctionalComposableScope.TextFieldContent( val suffix: (@Composable () -> Unit)? = findChildSlotView(view, "suffix")?.let { slot -> { slot.renderSlot() } } val supportingText: (@Composable () -> Unit)? = findChildSlotView(view, "supportingText")?.let { slot -> { slot.renderSlot() } } - // Keyboard - val kbOpts = props.keyboardOptions - val keyboardOptions = KeyboardOptions.Default.copy( - keyboardType = kbOpts?.keyboardType.toKeyboardType(), - autoCorrectEnabled = kbOpts?.autoCorrectEnabled ?: true, - capitalization = kbOpts?.capitalization.toCapitalization(), - imeAction = kbOpts?.imeAction.toImeAction() - ) - val currentText = { state.value as? String ?: "" } - val keyboardActions = KeyboardActions( - onDone = { - defaultKeyboardAction(ImeAction.Done) - onKeyboardActionTriggered(KeyboardActionEvent("done", currentText())) - }, - onGo = { - defaultKeyboardAction(ImeAction.Go) - onKeyboardActionTriggered(KeyboardActionEvent("go", currentText())) - }, - onNext = { - defaultKeyboardAction(ImeAction.Next) - onKeyboardActionTriggered(KeyboardActionEvent("next", currentText())) - }, - onPrevious = { - defaultKeyboardAction(ImeAction.Previous) - onKeyboardActionTriggered(KeyboardActionEvent("previous", currentText())) - }, - onSearch = { - defaultKeyboardAction(ImeAction.Search) - onKeyboardActionTriggered(KeyboardActionEvent("search", currentText())) - }, - onSend = { - defaultKeyboardAction(ImeAction.Send) - onKeyboardActionTriggered(KeyboardActionEvent("send", currentText())) - } - ) - // Lines val singleLine = props.singleLine val maxLines = props.maxLines ?: if (singleLine) 1 else Int.MAX_VALUE val minLines = props.minLines ?: 1 - // Modifier - val modifier = ModifierRegistry.applyModifiers(props.modifiers, appContext, composableScope, globalEventDispatcher) - .focusRequester(focusRequester) - .onFocusChanged { focusState -> - onFocusChange(GenericEventPayload1(focusState.isFocused)) - } - - if (props.autoFocus) { - LaunchedEffect(Unit) { focusRequester.requestFocus() } - } - val isOutlined = props.variant == TextFieldVariant.OUTLINED val shape = shapeFromShapeRecord(props.shape) ?: if (isOutlined) OutlinedTextFieldDefaults.shape else TextFieldDefaults.shape @@ -402,73 +253,8 @@ fun FunctionalComposableScope.TextFieldContent( } } ?: baseColors - val text = state.value as? String ?: "" - val selection = props.selection.extractSelection(text.length) - - val localValue = remember { mutableStateOf(TextFieldValue(text, selection)) } - if (localValue.value.text != text || localValue.value.selection != selection) { - localValue.value = TextFieldValue(text, selection) - } - - val value = localValue.value - - val onValueChange: (TextFieldValue) -> Unit = { incoming -> - val new = props.maxLength?.let { max -> - if (incoming.text.length > max) { - val truncated = incoming.text.substring(0, max) - incoming.copy( - text = truncated, - selection = TextRange( - incoming.selection.start.coerceAtMost(max), - incoming.selection.end.coerceAtMost(max) - ) - ) - } else { - null - } - } ?: incoming - val prev = localValue.value - localValue.value = new - if (new.selection != prev.selection) { - val cur = props.selection.value as? Map<*, *> - val curStart = (cur?.get("start") as? Number)?.toInt() - val curEnd = (cur?.get("end") as? Number)?.toInt() - if (curStart != new.selection.start || curEnd != new.selection.end) { - props.selection.value = mapOf( - "start" to new.selection.start, - "end" to new.selection.end - ) - } - onSelectionChanged(TextFieldSelectionPayload(new.selection.start, new.selection.end)) - } - if (new.text != prev.text) { - state.value = new.text - val payload = TextFieldValuePayload( - text = new.text, - selection = TextFieldSelectionPayload(new.selection.start, new.selection.end) - ) - onValueChanged(payload) - props.onValueChangeSync?.invoke(new.text) - } - } - - val context = appContext.reactContext - val textStyle = props.textStyle?.let { textStyleProps -> - TextStyle( - color = colorToComposeColorOrNull(textStyleProps.color) ?: androidx.compose.ui.graphics.Color.Unspecified, - fontSize = textStyleProps.fontSize?.sp ?: TextUnit.Unspecified, - fontWeight = textStyleProps.fontWeight?.toComposeFontWeight(), - fontFamily = context?.let { resolveFontFamily(textStyleProps.fontFamily, it) }, - letterSpacing = textStyleProps.letterSpacing?.sp ?: TextUnit.Unspecified, - lineHeight = textStyleProps.lineHeight?.sp ?: TextUnit.Unspecified, - textAlign = textStyleProps.textAlign?.toComposeTextAlign() ?: TextAlign.Unspecified - ) - } ?: TextStyle.Default - - val visualTransformation = when (props.visualTransformation) { - "password" -> PasswordVisualTransformation() - else -> VisualTransformation.None - } + val textStyle = props.textStyle.toTextStyle(appContext.reactContext) + val visualTransformation = props.visualTransformation.toVisualTransformation() // Workaround (pending upstream fix, https://issuetracker.google.com/issues/519816993) // the expressive motion scheme's spring overshoots >1f, and TextField's calculateHeight @@ -477,25 +263,25 @@ fun FunctionalComposableScope.TextFieldContent( MaterialExpressiveTheme(motionScheme = MotionScheme.standard()) { if (isOutlined) { OutlinedTextField( - value = value, onValueChange = onValueChange, modifier = modifier, + value = core.value, onValueChange = core.onValueChange, modifier = core.modifier, enabled = props.enabled, readOnly = props.readOnly, textStyle = textStyle, label = label, placeholder = placeholder, leadingIcon = leadingIcon, trailingIcon = trailingIcon, prefix = prefix, suffix = suffix, supportingText = supportingText, isError = props.isError, visualTransformation = visualTransformation, - keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, + keyboardOptions = core.keyboardOptions, keyboardActions = core.keyboardActions, singleLine = singleLine, maxLines = maxLines, minLines = minLines, shape = shape, colors = colors ) } else { TextField( - value = value, onValueChange = onValueChange, modifier = modifier, + value = core.value, onValueChange = core.onValueChange, modifier = core.modifier, enabled = props.enabled, readOnly = props.readOnly, textStyle = textStyle, label = label, placeholder = placeholder, leadingIcon = leadingIcon, trailingIcon = trailingIcon, prefix = prefix, suffix = suffix, supportingText = supportingText, isError = props.isError, visualTransformation = visualTransformation, - keyboardOptions = keyboardOptions, keyboardActions = keyboardActions, + keyboardOptions = core.keyboardOptions, keyboardActions = core.keyboardActions, singleLine = singleLine, maxLines = maxLines, minLines = minLines, shape = shape, colors = colors ) diff --git a/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextFieldShared.kt b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextFieldShared.kt new file mode 100644 index 00000000000000..b7808d7ac982c6 --- /dev/null +++ b/packages/expo-ui/android/src/main/java/expo/modules/ui/textfield/TextFieldShared.kt @@ -0,0 +1,299 @@ +package expo.modules.ui.textfield + +import android.content.Context +import android.graphics.Color +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.sp +import expo.modules.kotlin.records.Field +import expo.modules.kotlin.records.Record +import expo.modules.kotlin.types.OptimizedRecord +import expo.modules.kotlin.views.AsyncFunctionHandle +import expo.modules.kotlin.views.AsyncFunctionHandle2 +import expo.modules.kotlin.views.FunctionalComposableScope +import expo.modules.ui.GenericEventPayload1 +import expo.modules.ui.ModifierList +import expo.modules.ui.ModifierRegistry +import expo.modules.ui.TextAlignType +import expo.modules.ui.TextFontWeight +import expo.modules.ui.colorToComposeColorOrNull +import expo.modules.ui.resolveFontFamily +import expo.modules.ui.state.ObservableState +import expo.modules.ui.state.WorkletCallback + +// region Records + +@OptimizedRecord +data class TextFieldKeyboardOptionsRecord( + @Field val capitalization: String? = null, + @Field val autoCorrectEnabled: Boolean? = null, + @Field val keyboardType: String? = null, + @Field val imeAction: String? = null +) : Record + +@OptimizedRecord +data class TextFieldTextStyleRecord( + @Field val textAlign: TextAlignType? = null, + @Field val color: Color? = null, + @Field val fontSize: Float? = null, + @Field val fontFamily: String? = null, + @Field val fontWeight: TextFontWeight? = null, + @Field val lineHeight: Float? = null, + @Field val letterSpacing: Float? = null +) : Record + +data class KeyboardActionEvent( + @Field val action: String, + @Field val value: String +) : Record + +data class TextFieldSelectionPayload( + @Field val start: Int, + @Field val end: Int +) : Record + +data class TextFieldValuePayload( + @Field val text: String, + @Field val selection: TextFieldSelectionPayload +) : Record + +// endregion Records + +// region Mappers + +private fun String?.toKeyboardType(): KeyboardType = when (this) { + "text" -> KeyboardType.Text + "number" -> KeyboardType.Number + "email" -> KeyboardType.Email + "phone" -> KeyboardType.Phone + "decimal" -> KeyboardType.Decimal + "password" -> KeyboardType.Password + "ascii" -> KeyboardType.Ascii + "uri" -> KeyboardType.Uri + "numberPassword" -> KeyboardType.NumberPassword + else -> KeyboardType.Text +} + +private fun String?.toCapitalization(): KeyboardCapitalization = when (this) { + "characters" -> KeyboardCapitalization.Characters + "none" -> KeyboardCapitalization.None + "sentences" -> KeyboardCapitalization.Sentences + "words" -> KeyboardCapitalization.Words + else -> KeyboardCapitalization.None +} + +private fun String?.toImeAction(): ImeAction = when (this) { + "default" -> ImeAction.Default + "none" -> ImeAction.None + "go" -> ImeAction.Go + "search" -> ImeAction.Search + "send" -> ImeAction.Send + "previous" -> ImeAction.Previous + "next" -> ImeAction.Next + "done" -> ImeAction.Done + else -> ImeAction.Default +} + +internal fun String?.toVisualTransformation(): VisualTransformation = when (this) { + "password" -> PasswordVisualTransformation() + else -> VisualTransformation.None +} + +internal fun TextFieldTextStyleRecord?.toTextStyle(context: Context?): TextStyle { + if (this == null) return TextStyle.Default + return TextStyle( + color = colorToComposeColorOrNull(color) ?: androidx.compose.ui.graphics.Color.Unspecified, + fontSize = fontSize?.sp ?: TextUnit.Unspecified, + fontWeight = fontWeight?.toComposeFontWeight(), + fontFamily = context?.let { resolveFontFamily(fontFamily, it) }, + letterSpacing = letterSpacing?.sp ?: TextUnit.Unspecified, + lineHeight = lineHeight?.sp ?: TextUnit.Unspecified, + textAlign = textAlign?.toComposeTextAlign() ?: TextAlign.Unspecified + ) +} + +// endregion Mappers + +// region Value helpers + +private fun ObservableState.extractSelection(textLength: Int): TextRange { + val selMap = value as? Map<*, *> + val start = (selMap?.get("start") as? Number)?.toInt()?.coerceIn(0, textLength) ?: 0 + val end = (selMap?.get("end") as? Number)?.toInt()?.coerceIn(0, textLength) ?: 0 + return TextRange(start, end) +} + +// endregion Value helpers + +// region Shared core + +class TextFieldCore( + val value: TextFieldValue, + val onValueChange: (TextFieldValue) -> Unit, + val keyboardOptions: KeyboardOptions, + val keyboardActions: KeyboardActions, + val modifier: Modifier +) + +@Composable +fun FunctionalComposableScope.rememberTextFieldCore( + value: ObservableState, + selection: ObservableState, + maxLength: Int?, + autoFocus: Boolean, + keyboardOptionsRecord: TextFieldKeyboardOptionsRecord?, + modifiers: ModifierList, + onValueChangeSync: WorkletCallback?, + setText: AsyncFunctionHandle, + setSelection: AsyncFunctionHandle2, + clear: AsyncFunctionHandle, + focus: AsyncFunctionHandle, + blur: AsyncFunctionHandle, + onValueChanged: (TextFieldValuePayload) -> Unit, + onFocusChange: (GenericEventPayload1) -> Unit, + onKeyboardActionTriggered: (KeyboardActionEvent) -> Unit, + onSelectionChanged: (TextFieldSelectionPayload) -> Unit +): TextFieldCore { + val focusManager = LocalFocusManager.current + val focusRequester = remember { FocusRequester() } + val state = value + + setText.handle { text -> + state.value = text + // setText moves the cursor to the end; use setSelection afterwards to override. + selection.value = mapOf("start" to text.length, "end" to text.length) + } + focus.handle { + focusRequester.requestFocus() + } + blur.handle { + focusManager.clearFocus() + } + setSelection.handle { start, end -> + val text = state.value as? String ?: "" + val clampedStart = start.coerceIn(0, text.length) + val clampedEnd = end.coerceIn(0, text.length) + selection.value = mapOf("start" to clampedStart, "end" to clampedEnd) + } + clear.handle { + state.value = "" + selection.value = mapOf("start" to 0, "end" to 0) + } + + // Keyboard + val keyboardOptions = KeyboardOptions.Default.copy( + keyboardType = keyboardOptionsRecord?.keyboardType.toKeyboardType(), + autoCorrectEnabled = keyboardOptionsRecord?.autoCorrectEnabled ?: true, + capitalization = keyboardOptionsRecord?.capitalization.toCapitalization(), + imeAction = keyboardOptionsRecord?.imeAction.toImeAction() + ) + val currentText = { state.value as? String ?: "" } + val keyboardActions = KeyboardActions( + onDone = { + defaultKeyboardAction(ImeAction.Done) + onKeyboardActionTriggered(KeyboardActionEvent("done", currentText())) + }, + onGo = { + defaultKeyboardAction(ImeAction.Go) + onKeyboardActionTriggered(KeyboardActionEvent("go", currentText())) + }, + onNext = { + defaultKeyboardAction(ImeAction.Next) + onKeyboardActionTriggered(KeyboardActionEvent("next", currentText())) + }, + onPrevious = { + defaultKeyboardAction(ImeAction.Previous) + onKeyboardActionTriggered(KeyboardActionEvent("previous", currentText())) + }, + onSearch = { + defaultKeyboardAction(ImeAction.Search) + onKeyboardActionTriggered(KeyboardActionEvent("search", currentText())) + }, + onSend = { + defaultKeyboardAction(ImeAction.Send) + onKeyboardActionTriggered(KeyboardActionEvent("send", currentText())) + } + ) + + // Modifier + val modifier = ModifierRegistry.applyModifiers(modifiers, appContext, composableScope, globalEventDispatcher) + .focusRequester(focusRequester) + .onFocusChanged { focusState -> + onFocusChange(GenericEventPayload1(focusState.isFocused)) + } + + if (autoFocus) { + LaunchedEffect(Unit) { focusRequester.requestFocus() } + } + + val text = state.value as? String ?: "" + val sel = selection.extractSelection(text.length) + + val localValue = remember { mutableStateOf(TextFieldValue(text, sel)) } + if (localValue.value.text != text || localValue.value.selection != sel) { + localValue.value = TextFieldValue(text, sel) + } + + val onValueChange: (TextFieldValue) -> Unit = { incoming -> + val new = maxLength?.let { max -> + if (incoming.text.length > max) { + val truncated = incoming.text.substring(0, max) + incoming.copy( + text = truncated, + selection = TextRange( + incoming.selection.start.coerceAtMost(max), + incoming.selection.end.coerceAtMost(max) + ) + ) + } else { + null + } + } ?: incoming + val prev = localValue.value + localValue.value = new + if (new.selection != prev.selection) { + val cur = selection.value as? Map<*, *> + val curStart = (cur?.get("start") as? Number)?.toInt() + val curEnd = (cur?.get("end") as? Number)?.toInt() + if (curStart != new.selection.start || curEnd != new.selection.end) { + selection.value = mapOf( + "start" to new.selection.start, + "end" to new.selection.end + ) + } + onSelectionChanged(TextFieldSelectionPayload(new.selection.start, new.selection.end)) + } + if (new.text != prev.text) { + state.value = new.text + val payload = TextFieldValuePayload( + text = new.text, + selection = TextFieldSelectionPayload(new.selection.start, new.selection.end) + ) + onValueChanged(payload) + onValueChangeSync?.invoke(new.text) + } + } + + return TextFieldCore(localValue.value, onValueChange, keyboardOptions, keyboardActions, modifier) +} + +// endregion Shared core diff --git a/packages/expo-ui/build/State/useNativeState.d.ts b/packages/expo-ui/build/State/useNativeState.d.ts index 5d6d0142e1f91f..c78fd92d9ea933 100644 --- a/packages/expo-ui/build/State/useNativeState.d.ts +++ b/packages/expo-ui/build/State/useNativeState.d.ts @@ -30,9 +30,6 @@ export type ObservableState = SharedObject & { * 'worklet'; * console.log('changed to', value); * }; - * return () => { - * state.onChange = null; - * }; * }, []); * ``` */ diff --git a/packages/expo-ui/build/State/useNativeState.d.ts.map b/packages/expo-ui/build/State/useNativeState.d.ts.map index fc445051c04833..4c758c73bcd69d 100644 --- a/packages/expo-ui/build/State/useNativeState.d.ts.map +++ b/packages/expo-ui/build/State/useNativeState.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"useNativeState.d.ts","sourceRoot":"","sources":["../../src/State/useNativeState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAOhF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,GAAG;IAC9C;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,CAAC;IAET;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAQrE"} \ No newline at end of file +{"version":3,"file":"useNativeState.d.ts","sourceRoot":"","sources":["../../src/State/useNativeState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAOhF;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,GAAG;IAC9C;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,CAAC;IAET;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAQrE"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts b/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts new file mode 100644 index 00000000000000..b760e3b2cc87ae --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts @@ -0,0 +1,36 @@ +import type { ColorValue } from 'react-native'; +import { type CommonTextFieldProperties, type TextFieldRef } from './shared'; +/** + * Imperative methods for `BasicTextField`. Identical to {@link TextFieldRef}. + */ +export type BasicTextFieldRef = TextFieldRef; +/** + * Props for `BasicTextField`. Mirrors Compose's `BasicTextField`: a bare, + * unstyled text field with no Material chrome (no container, indicator, or + * built-in padding). Shares {@link CommonTextFieldProperties} with `TextField` and + * `OutlinedTextField`; use `BasicTextField.DecorationBox` to add your own + * decoration. + */ +export type BasicTextFieldProps = CommonTextFieldProperties & { + /** + * Color of the text cursor. Maps to Compose's `cursorBrush` via + * `SolidColor(color)`. Defaults to the theme's primary color + * (`MaterialTheme.colorScheme.primary`) so it stays visible in light and dark. + */ + cursorColor?: ColorValue; +}; +/** + * A bare, unstyled Compose `BasicTextField` with no Material decoration. + */ +declare function BasicTextFieldComponent(props: BasicTextFieldProps): import("react/jsx-runtime").JSX.Element; +declare namespace BasicTextFieldComponent { + var DecorationBox: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var InnerTextField: () => import("react/jsx-runtime").JSX.Element; + var Placeholder: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; +} +export { BasicTextFieldComponent as BasicTextField }; +//# sourceMappingURL=BasicTextField.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts.map b/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts.map new file mode 100644 index 00000000000000..545600e767b1a2 --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/BasicTextField.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"BasicTextField.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/BasicTextField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAKlB;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,yBAAyB,GAAG;IAC5D;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B,CAAC;AAwEF;;GAEG;AACH,iBAAS,uBAAuB,CAAC,KAAK,EAAE,mBAAmB,2CAE1D;kBAFQ,uBAAuB;+BA/BF;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;6BAoB/B;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;AAqBzD,OAAO,EAAE,uBAAuB,IAAI,cAAc,EAAE,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts b/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts new file mode 100644 index 00000000000000..5474789648b3b0 --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts @@ -0,0 +1,131 @@ +import type { ColorValue } from 'react-native'; +import { type CommonTextFieldProperties } from './shared'; +import { type ObservableState } from '../../State'; +import { type ShapeJSXElement } from '../Shape'; +/** + * Colors for `TextField` and `OutlinedTextField`. + * Maps to `TextFieldColors` in Compose, shared by both variants. + */ +export type TextFieldColors = { + focusedTextColor?: ColorValue; + unfocusedTextColor?: ColorValue; + disabledTextColor?: ColorValue; + errorTextColor?: ColorValue; + focusedContainerColor?: ColorValue; + unfocusedContainerColor?: ColorValue; + disabledContainerColor?: ColorValue; + errorContainerColor?: ColorValue; + cursorColor?: ColorValue; + errorCursorColor?: ColorValue; + focusedIndicatorColor?: ColorValue; + unfocusedIndicatorColor?: ColorValue; + disabledIndicatorColor?: ColorValue; + errorIndicatorColor?: ColorValue; + focusedLeadingIconColor?: ColorValue; + unfocusedLeadingIconColor?: ColorValue; + disabledLeadingIconColor?: ColorValue; + errorLeadingIconColor?: ColorValue; + focusedTrailingIconColor?: ColorValue; + unfocusedTrailingIconColor?: ColorValue; + disabledTrailingIconColor?: ColorValue; + errorTrailingIconColor?: ColorValue; + focusedLabelColor?: ColorValue; + unfocusedLabelColor?: ColorValue; + disabledLabelColor?: ColorValue; + errorLabelColor?: ColorValue; + focusedPlaceholderColor?: ColorValue; + unfocusedPlaceholderColor?: ColorValue; + disabledPlaceholderColor?: ColorValue; + errorPlaceholderColor?: ColorValue; + focusedSupportingTextColor?: ColorValue; + unfocusedSupportingTextColor?: ColorValue; + disabledSupportingTextColor?: ColorValue; + errorSupportingTextColor?: ColorValue; + focusedPrefixColor?: ColorValue; + unfocusedPrefixColor?: ColorValue; + disabledPrefixColor?: ColorValue; + errorPrefixColor?: ColorValue; + focusedSuffixColor?: ColorValue; + unfocusedSuffixColor?: ColorValue; + disabledSuffixColor?: ColorValue; + errorSuffixColor?: ColorValue; +}; +export type TextFieldProps = CommonTextFieldProperties & { + /** @default false */ + isError?: boolean; + /** + * Shape used for the field's container outline/fill. Use the helpers from + * `Shape` (for example, `` or ``). + * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. + */ + shape?: ShapeJSXElement; + colors?: TextFieldColors; +}; +export type OutlinedTextFieldProps = CommonTextFieldProperties & { + /** @default false */ + isError?: boolean; + /** + * Shape used for the field's container outline/fill. Use the helpers from + * `Shape` (for example, `` or ``). + * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. + */ + shape?: ShapeJSXElement; + colors?: TextFieldColors; +}; +/** + * A Material3 `TextField`. + */ +declare function TextFieldComponent(props: TextFieldProps): import("react/jsx-runtime").JSX.Element; +declare namespace TextFieldComponent { + var Label: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Placeholder: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var LeadingIcon: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var TrailingIcon: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Prefix: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Suffix: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var SupportingText: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; +} +/** + * A Material3 `OutlinedTextField` with a transparent background and border outline. + */ +declare function OutlinedTextFieldComponent(props: OutlinedTextFieldProps): import("react/jsx-runtime").JSX.Element; +declare namespace OutlinedTextFieldComponent { + var Label: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Placeholder: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var LeadingIcon: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var TrailingIcon: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Prefix: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var Suffix: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; + var SupportingText: (props: { + children: React.ReactNode; + }) => import("react/jsx-runtime").JSX.Element; +} +export { TextFieldComponent as TextField, OutlinedTextFieldComponent as OutlinedTextField }; +export { type ObservableState }; +//# sourceMappingURL=TextField.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts.map b/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts.map new file mode 100644 index 00000000000000..e8a2f16799b333 --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/TextField.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/TextField.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts index 21fea25e94c9a4..cd79c02ce727e3 100644 --- a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts @@ -1,245 +1,4 @@ -import type { Ref } from 'react'; -import type { ColorValue } from 'react-native'; -import { type ObservableState } from '../../State'; -import type { ModifierConfig } from '../../types'; -import { type ShapeJSXElement } from '../Shape'; -/** - * Can be used for imperatively focusing and setting text/selection on the `TextField` component. - */ -export type TextFieldRef = { - setText: (newText: string) => Promise; - /** Clear the current text. */ - clear: () => Promise; - focus: () => Promise; - blur: () => Promise; - /** - * Programmatically set the selection range. - */ - setSelection: (start: number, end: number) => Promise; -}; -export type TextFieldCapitalization = 'none' | 'characters' | 'words' | 'sentences'; -export type TextFieldKeyboardType = 'text' | 'number' | 'email' | 'phone' | 'decimal' | 'password' | 'ascii' | 'uri' | 'numberPassword'; -export type TextFieldImeAction = 'default' | 'none' | 'go' | 'search' | 'send' | 'previous' | 'next' | 'done'; -/** - * Keyboard options matching Compose `KeyboardOptions`. - */ -export type TextFieldKeyboardOptions = { - /** @default 'none' */ - capitalization?: TextFieldCapitalization; - /** @default true */ - autoCorrectEnabled?: boolean; - /** @default 'text' */ - keyboardType?: TextFieldKeyboardType; - /** @default 'default' */ - imeAction?: TextFieldImeAction; -}; -/** - * Keyboard actions matching Compose `KeyboardActions`. - * The triggered callback depends on the `imeAction` in `keyboardOptions`. - */ -export type TextFieldKeyboardActions = { - onDone?: (value: string) => void; - onGo?: (value: string) => void; - onNext?: (value: string) => void; - onPrevious?: (value: string) => void; - onSearch?: (value: string) => void; - onSend?: (value: string) => void; -}; -/** - * Colors for `TextField` and `OutlinedTextField`. - * Maps to `TextFieldColors` in Compose, shared by both variants. - */ -export type TextFieldColors = { - focusedTextColor?: ColorValue; - unfocusedTextColor?: ColorValue; - disabledTextColor?: ColorValue; - errorTextColor?: ColorValue; - focusedContainerColor?: ColorValue; - unfocusedContainerColor?: ColorValue; - disabledContainerColor?: ColorValue; - errorContainerColor?: ColorValue; - cursorColor?: ColorValue; - errorCursorColor?: ColorValue; - focusedIndicatorColor?: ColorValue; - unfocusedIndicatorColor?: ColorValue; - disabledIndicatorColor?: ColorValue; - errorIndicatorColor?: ColorValue; - focusedLeadingIconColor?: ColorValue; - unfocusedLeadingIconColor?: ColorValue; - disabledLeadingIconColor?: ColorValue; - errorLeadingIconColor?: ColorValue; - focusedTrailingIconColor?: ColorValue; - unfocusedTrailingIconColor?: ColorValue; - disabledTrailingIconColor?: ColorValue; - errorTrailingIconColor?: ColorValue; - focusedLabelColor?: ColorValue; - unfocusedLabelColor?: ColorValue; - disabledLabelColor?: ColorValue; - errorLabelColor?: ColorValue; - focusedPlaceholderColor?: ColorValue; - unfocusedPlaceholderColor?: ColorValue; - disabledPlaceholderColor?: ColorValue; - errorPlaceholderColor?: ColorValue; - focusedSupportingTextColor?: ColorValue; - unfocusedSupportingTextColor?: ColorValue; - disabledSupportingTextColor?: ColorValue; - errorSupportingTextColor?: ColorValue; - focusedPrefixColor?: ColorValue; - unfocusedPrefixColor?: ColorValue; - disabledPrefixColor?: ColorValue; - errorPrefixColor?: ColorValue; - focusedSuffixColor?: ColorValue; - unfocusedSuffixColor?: ColorValue; - disabledSuffixColor?: ColorValue; - errorSuffixColor?: ColorValue; -}; -/** Shared props between `TextField` and `OutlinedTextField`. */ -type BaseTextFieldProps = { - ref?: Ref; - /** - * An observable state that holds the current text value. Create one with - * `useNativeState('initial text')`. If omitted, the field manages its own - * internal state. - */ - value?: ObservableState; - /** If true, the text field will be focused automatically when mounted. @default false */ - autoFocus?: boolean; - /** @default true */ - enabled?: boolean; - /** @default false */ - readOnly?: boolean; - /** @default false */ - isError?: boolean; - /** @default false */ - singleLine?: boolean; - maxLines?: number; - minLines?: number; - /** - * Display-time text transformation. `'password'` masks every character; - * `'none'` (default) leaves the buffer as-is. - */ - visualTransformation?: 'password' | 'none'; - /** - * Selection-related colors. Maps to Compose's `TextSelectionColors` via - * `LocalTextSelectionColors`. `handleColor` controls the drag handles; - * `backgroundColor` is the highlighted-text background (typically the same - * tint at lower alpha so the underlying text stays readable). - */ - textSelectionColors?: { - handleColor?: ColorValue; - backgroundColor?: ColorValue; - }; - /** - * Observable state holding the current selection range. Create with - * `useNativeState({ start: 0, end: 0 })`. The field writes user-driven - * changes back to it, and writes from JS (or a worklet) update the - * cursor/selection in the field. Use `ref.setSelection(start, end)` for - * imperative one-shot updates. - */ - selection?: ObservableState<{ - start: number; - end: number; - }>; - /** Maximum number of characters allowed. Truncates natively as the user types. */ - maxLength?: number; - /** Called when the selection range changes. */ - onSelectionChange?: (selection: { - start: number; - end: number; - }) => void; - /** - * Text styling for the field's content. Maps to Compose's `TextStyle`. - */ - textStyle?: { - textAlign?: 'left' | 'right' | 'center' | 'justify'; - color?: ColorValue; - fontSize?: number; - fontFamily?: string; - fontWeight?: '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | 'normal' | 'bold'; - lineHeight?: number; - letterSpacing?: number; - }; - keyboardOptions?: TextFieldKeyboardOptions; - keyboardActions?: TextFieldKeyboardActions; - /** - * Fires whenever the text value changes. If marked with the `'worklet'` - * directive, runs synchronously on the UI thread; otherwise delivered - * asynchronously as a regular JS event. Use `onSelectionChange` (or read - * the `selection` observable) to react to selection-only changes. - */ - onValueChange?: (value: string) => void; - /** A callback triggered when the field gains or loses focus. */ - onFocusChanged?: (focused: boolean) => void; - /** - * Shape used for the field's container outline/fill. Use the helpers from - * `Shape` (for example, `` or ``). - * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. - */ - shape?: ShapeJSXElement; - modifiers?: ModifierConfig[]; - /** Slot children (e.g. `TextField.Label`, `TextField.Placeholder`). */ - children?: React.ReactNode; -}; -export type TextFieldProps = BaseTextFieldProps & { - colors?: TextFieldColors; -}; -export type OutlinedTextFieldProps = BaseTextFieldProps & { - colors?: TextFieldColors; -}; -/** - * A Material3 `TextField`. - */ -declare function TextFieldComponent(props: TextFieldProps): import("react/jsx-runtime").JSX.Element; -declare namespace TextFieldComponent { - var Label: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Placeholder: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var LeadingIcon: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var TrailingIcon: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Prefix: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Suffix: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var SupportingText: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; -} -/** - * A Material3 `OutlinedTextField` with a transparent background and border outline. - */ -declare function OutlinedTextFieldComponent(props: OutlinedTextFieldProps): import("react/jsx-runtime").JSX.Element; -declare namespace OutlinedTextFieldComponent { - var Label: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Placeholder: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var LeadingIcon: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var TrailingIcon: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Prefix: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var Suffix: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; - var SupportingText: (props: { - children: React.ReactNode; - }) => import("react/jsx-runtime").JSX.Element; -} -export { TextFieldComponent as TextField, OutlinedTextFieldComponent as OutlinedTextField }; -export { type ObservableState }; +export { TextField, OutlinedTextField, type TextFieldColors, type TextFieldProps, type OutlinedTextFieldProps, type ObservableState, } from './TextField'; +export { BasicTextField, type BasicTextFieldProps, type BasicTextFieldRef } from './BasicTextField'; +export type { TextFieldRef, TextFieldCapitalization, TextFieldImeAction, TextFieldKeyboardType, TextFieldKeyboardOptions, TextFieldKeyboardActions, TextFieldTextStyle, CommonTextFieldProperties, } from './shared'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map index 39aad147531b0d..748871392ee41d 100644 --- a/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/TextField/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/index.tsx"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACpG,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,UAAU,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts b/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts new file mode 100644 index 00000000000000..6b6e9b5bfb5861 --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts @@ -0,0 +1,171 @@ +import type { ReactNode, Ref } from 'react'; +import type { ColorValue } from 'react-native'; +import { type ObservableState } from '../../State'; +import type { ModifierConfig, ViewEvent } from '../../types'; +/** + * Can be used for imperatively focusing and setting text/selection on the + * `TextField`, `OutlinedTextField`, and `BasicTextField` components. + */ +export type TextFieldRef = { + setText: (newText: string) => Promise; + /** Clear the current text. */ + clear: () => Promise; + focus: () => Promise; + blur: () => Promise; + /** + * Programmatically set the selection range. + */ + setSelection: (start: number, end: number) => Promise; +}; +export type TextFieldCapitalization = 'none' | 'characters' | 'words' | 'sentences'; +export type TextFieldKeyboardType = 'text' | 'number' | 'email' | 'phone' | 'decimal' | 'password' | 'ascii' | 'uri' | 'numberPassword'; +export type TextFieldImeAction = 'default' | 'none' | 'go' | 'search' | 'send' | 'previous' | 'next' | 'done'; +/** + * Keyboard options matching Compose `KeyboardOptions`. + */ +export type TextFieldKeyboardOptions = { + /** @default 'none' */ + capitalization?: TextFieldCapitalization; + /** @default true */ + autoCorrectEnabled?: boolean; + /** @default 'text' */ + keyboardType?: TextFieldKeyboardType; + /** @default 'default' */ + imeAction?: TextFieldImeAction; +}; +/** + * Keyboard actions matching Compose `KeyboardActions`. + * The triggered callback depends on the `imeAction` in `keyboardOptions`. + */ +export type TextFieldKeyboardActions = { + onDone?: (value: string) => void; + onGo?: (value: string) => void; + onNext?: (value: string) => void; + onPrevious?: (value: string) => void; + onSearch?: (value: string) => void; + onSend?: (value: string) => void; +}; +/** + * Text styling for a text field's content. Maps to Compose's `TextStyle`. + * Shared by `TextField`, `OutlinedTextField`, and `BasicTextField`. + */ +export type TextFieldTextStyle = { + textAlign?: 'left' | 'right' | 'center' | 'justify'; + color?: ColorValue; + fontSize?: number; + fontFamily?: string; + fontWeight?: '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | 'normal' | 'bold'; + lineHeight?: number; + letterSpacing?: number; +}; +/** + * Props shared by every Compose text field variant — `TextField`, + * `OutlinedTextField`, and `BasicTextField`. The Material variants add their + * own decoration props (`isError`, `shape`, `colors`, slot children); + * `BasicTextField` adds `cursorColor`. + */ +export type CommonTextFieldProperties = { + ref?: Ref; + /** + * An observable state that holds the current text value. Create one with + * `useNativeState('initial text')`. If omitted, the field manages its own + * internal state. + */ + value?: ObservableState; + /** If true, the text field will be focused automatically when mounted. @default false */ + autoFocus?: boolean; + /** @default true */ + enabled?: boolean; + /** @default false */ + readOnly?: boolean; + /** @default false */ + singleLine?: boolean; + maxLines?: number; + minLines?: number; + /** + * Display-time text transformation. `'password'` masks every character; + * `'none'` (default) leaves the buffer as-is. + */ + visualTransformation?: 'password' | 'none'; + /** + * Observable state holding the current selection range. Create with + * `useNativeState({ start: 0, end: 0 })`. The field writes user-driven + * changes back to it, and writes from JS (or a worklet) update the + * cursor/selection in the field. Use `ref.setSelection(start, end)` for + * imperative one-shot updates. + */ + selection?: ObservableState<{ + start: number; + end: number; + }>; + /** Maximum number of characters allowed. Truncates natively as the user types. */ + maxLength?: number; + /** Called when the selection range changes. */ + onSelectionChange?: (selection: { + start: number; + end: number; + }) => void; + /** + * Selection-related colors. Maps to Compose's `TextSelectionColors` via + * `LocalTextSelectionColors`. `handleColor` controls the drag handles (and + * the caret's drag handle); `backgroundColor` is the highlighted-text + * background (typically the same tint at lower alpha so the underlying text + * stays readable). Independent of `cursorColor`, which tints the caret line. + */ + textSelectionColors?: { + handleColor?: ColorValue; + backgroundColor?: ColorValue; + }; + /** + * Text styling for the field's content. Maps to Compose's `TextStyle`. + */ + textStyle?: TextFieldTextStyle; + keyboardOptions?: TextFieldKeyboardOptions; + keyboardActions?: TextFieldKeyboardActions; + /** + * Fires whenever the text value changes. If marked with the `'worklet'` + * directive, runs synchronously on the UI thread; otherwise delivered + * asynchronously as a regular JS event. Use `onSelectionChange` (or read + * the `selection` observable) to react to selection-only changes. + */ + onValueChange?: (value: string) => void; + /** A callback triggered when the field gains or loses focus. */ + onFocusChanged?: (focused: boolean) => void; + modifiers?: ModifierConfig[]; + /** Slot children that configure the field's decoration. */ + children?: ReactNode; +}; +/** + * Keys consumed (and reshaped) by {@link useCommonTextFieldProps}. Everything + * else on the props passes through untouched. + */ +type TransformedKeys = 'value' | 'selection' | 'modifiers' | 'children' | 'keyboardActions' | 'onValueChange' | 'onFocusChanged' | 'onSelectionChange'; +/** + * Native-facing prop shape shared by every Compose text field variant. The + * observable-backed props collapse to shared-object ids, and the public + * callbacks become `nativeEvent`-wrapped listeners. + */ +export type CommonNativeTextFieldProps = { + modifiers?: ModifierConfig[]; + children?: ReactNode; + value?: number | null; + selection?: number | null; + onValueChangeSync?: number | null; +} & ViewEvent<'onValueChange', { + text: string; + selection: { + start: number; + end: number; + }; +}> & ViewEvent<'onFocusChanged', { + value: boolean; +}> & ViewEvent<'onSelectionChange', { + start: number; + end: number; +}> & ViewEvent<'onKeyboardAction', { + action: string; + value: string; +}>; +export declare function useCommonTextFieldProps(props: T): CommonNativeTextFieldProps & Omit; +export {}; +//# sourceMappingURL=shared.d.ts.map \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts.map b/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts.map new file mode 100644 index 00000000000000..803f116b68d1fd --- /dev/null +++ b/packages/expo-ui/build/jetpack-compose/TextField/shared.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/jetpack-compose/TextField/shared.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-ui/build/jetpack-compose/index.d.ts b/packages/expo-ui/build/jetpack-compose/index.d.ts index d967890d40437c..f4f73b52e8fa31 100644 --- a/packages/expo-ui/build/jetpack-compose/index.d.ts +++ b/packages/expo-ui/build/jetpack-compose/index.d.ts @@ -25,7 +25,7 @@ export * from './Slider'; export * from './Spacer'; export * from './Switch'; export * from './SyncSwitch'; -export { TextField, OutlinedTextField, type TextFieldProps, type TextFieldRef, type TextFieldCapitalization, type TextFieldImeAction, type TextFieldKeyboardOptions, type TextFieldKeyboardType, type TextFieldKeyboardActions, type TextFieldColors, } from './TextField'; +export { TextField, OutlinedTextField, BasicTextField, type TextFieldProps, type OutlinedTextFieldProps, type BasicTextFieldProps, type BasicTextFieldRef, type TextFieldRef, type TextFieldCapitalization, type TextFieldImeAction, type TextFieldKeyboardOptions, type TextFieldKeyboardType, type TextFieldKeyboardActions, type TextFieldColors, type TextFieldTextStyle, type CommonTextFieldProperties, } from './TextField'; export * from './ToggleButton'; export * from './Shape'; export * from './ModalBottomSheet'; diff --git a/packages/expo-ui/build/jetpack-compose/index.d.ts.map b/packages/expo-ui/build/jetpack-compose/index.d.ts.map index 48109c840de453..b4a1479c8ee1c6 100644 --- a/packages/expo-ui/build/jetpack-compose/index.d.ts.map +++ b/packages/expo-ui/build/jetpack-compose/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jetpack-compose/index.ts"],"names":[],"mappings":"AAAA,OAAO,uCAAuC,CAAC;AAE/C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jetpack-compose/index.ts"],"names":[],"mappings":"AAAA,OAAO,uCAAuC,CAAC;AAE/C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/universal/TextInput/index.android.d.ts.map b/packages/expo-ui/build/universal/TextInput/index.android.d.ts.map index 51c57c82467b30..95b66fcd1b8203 100644 --- a/packages/expo-ui/build/universal/TextInput/index.android.d.ts.map +++ b/packages/expo-ui/build/universal/TextInput/index.android.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.android.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/index.android.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqC9C,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EAAE,YAAY,EACtB,SAAS,EACT,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EACd,WAAW,EACX,aAAa,EAAE,iBAAiB,EAChC,eAAe,EACf,OAAO,EACP,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EAAE,iBAAiB,EAChC,IAAI,EACJ,qBAAqB,EACrB,MAAM,EACN,oBAAoB,EACpB,SAAS,EACT,KAAK,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EAAE,aAAa,GACzB,EAAE,cAAc,2CA8JhB;AAED,cAAc,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"index.android.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/index.android.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqC9C,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EAAE,YAAY,EACtB,SAAS,EACT,YAAY,EAAE,gBAAgB,EAC9B,cAAc,EACd,WAAW,EACX,aAAa,EAAE,iBAAiB,EAChC,eAAe,EACf,OAAO,EACP,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EAAE,iBAAiB,EAChC,IAAI,EACJ,qBAAqB,EACrB,MAAM,EACN,oBAAoB,EACpB,SAAS,EACT,KAAK,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EAAE,aAAa,GACzB,EAAE,cAAc,2CA2HhB;AAED,cAAc,SAAS,CAAC"} \ No newline at end of file diff --git a/packages/expo-ui/build/universal/TextInput/types.d.ts b/packages/expo-ui/build/universal/TextInput/types.d.ts index bc9e9fb182eba9..530a131cb3f367 100644 --- a/packages/expo-ui/build/universal/TextInput/types.d.ts +++ b/packages/expo-ui/build/universal/TextInput/types.d.ts @@ -167,7 +167,11 @@ export interface TextInputProps { */ rows?: number; /** - * Color of the underline indicator on Android. iOS / web ignore this. + * Color of the underline indicator on Android. + * + * @deprecated The Android `TextInput` renders an unstyled `BasicTextField` that + * has no underline indicator, so this has no effect. To draw your own border, + * pass it through `style` or `modifiers`. * @platform android */ underlineColorAndroid?: ColorValue; diff --git a/packages/expo-ui/build/universal/TextInput/types.d.ts.map b/packages/expo-ui/build/universal/TextInput/types.d.ts.map index 153d43289635c7..8c44d3490f5f19 100644 --- a/packages/expo-ui/build/universal/TextInput/types.d.ts.map +++ b/packages/expo-ui/build/universal/TextInput/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/universal/TextInput/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/expo-ui/src/State/useNativeState.ts b/packages/expo-ui/src/State/useNativeState.ts index 9a36bf49fa122d..0396366d7805ae 100644 --- a/packages/expo-ui/src/State/useNativeState.ts +++ b/packages/expo-ui/src/State/useNativeState.ts @@ -38,9 +38,6 @@ export type ObservableState = SharedObject & { * 'worklet'; * console.log('changed to', value); * }; - * return () => { - * state.onChange = null; - * }; * }, []); * ``` */ @@ -96,7 +93,14 @@ function defineOnChangeProperty(state: NativeObservableState): void { set(fn: ((value: unknown) => void) | null | undefined) { if (!fn) { currentFn = null; - state.setOnChange(null); + try { + state.setOnChange(null); + } catch { + // On unmount the shared object is often released before this cleanup + // runs (useReleasingSharedObject releases it earlier in the component), + // so setOnChange throws "already released". Clearing a listener on a + // gone object is a no-op, so ignore it rather than crash teardown. + } return; } if (!worklets) { diff --git a/packages/expo-ui/src/jetpack-compose/TextField/BasicTextField.tsx b/packages/expo-ui/src/jetpack-compose/TextField/BasicTextField.tsx new file mode 100644 index 00000000000000..c90231c35695eb --- /dev/null +++ b/packages/expo-ui/src/jetpack-compose/TextField/BasicTextField.tsx @@ -0,0 +1,118 @@ +import { requireNativeView } from 'expo'; +import type { ColorValue } from 'react-native'; + +import { + type CommonNativeTextFieldProps, + type CommonTextFieldProperties, + type TextFieldRef, + useCommonTextFieldProps, +} from './shared'; +import { Slot } from '../SlotView'; + +// region Types + +/** + * Imperative methods for `BasicTextField`. Identical to {@link TextFieldRef}. + */ +export type BasicTextFieldRef = TextFieldRef; + +/** + * Props for `BasicTextField`. Mirrors Compose's `BasicTextField`: a bare, + * unstyled text field with no Material chrome (no container, indicator, or + * built-in padding). Shares {@link CommonTextFieldProperties} with `TextField` and + * `OutlinedTextField`; use `BasicTextField.DecorationBox` to add your own + * decoration. + */ +export type BasicTextFieldProps = CommonTextFieldProperties & { + /** + * Color of the text cursor. Maps to Compose's `cursorBrush` via + * `SolidColor(color)`. Defaults to the theme's primary color + * (`MaterialTheme.colorScheme.primary`) so it stays visible in light and dark. + */ + cursorColor?: ColorValue; +}; + +// endregion Types + +// region Native + +type NativeBasicTextFieldProps = Omit< + BasicTextFieldProps, + | 'value' + | 'selection' + | 'onValueChange' + | 'onFocusChanged' + | 'onSelectionChange' + | 'keyboardActions' + | 'children' +> & + CommonNativeTextFieldProps; + +const BasicTextFieldNativeView: React.ComponentType = requireNativeView( + 'ExpoUI', + 'BasicTextFieldView' +); + +const InnerTextFieldNativeView: React.ComponentType = requireNativeView( + 'ExpoUI', + 'InnerTextFieldView' +); + +const PlaceholderNativeView: React.ComponentType<{ children?: React.ReactNode }> = + requireNativeView('ExpoUI', 'PlaceholderView'); + +function useTransformedProps(props: BasicTextFieldProps): NativeBasicTextFieldProps { + return useCommonTextFieldProps(props); +} + +// endregion Native + +// region Slot components + +/** + * Wraps the editable text with custom decoration. Maps to Compose's + * `decorationBox`. Place {@link InnerTextField} inside it where the text + * should render. + */ +function DecorationBox(props: { children: React.ReactNode }) { + return {props.children}; +} + +/** + * The editable text itself, placed wherever you want it inside + * {@link DecorationBox}. Maps to the `innerTextField` lambda Compose passes to + * `decorationBox`. + */ +function InnerTextField() { + return ; +} + +/** + * A placeholder shown only while the field is empty. Place it inside + * {@link DecorationBox}, typically overlaying {@link InnerTextField}. Its + * visibility is toggled natively from the field's text, so it stays correct for + * every change — typing, `clear()`, `setText`, and writes to the `value` + * observable — without a JS round-trip. + */ +function Placeholder(props: { children: React.ReactNode }) { + return {props.children}; +} + +// endregion Slot components + +// region Component + +/** + * A bare, unstyled Compose `BasicTextField` with no Material decoration. + */ +function BasicTextFieldComponent(props: BasicTextFieldProps) { + return ; +} + +BasicTextFieldComponent.DecorationBox = DecorationBox; +BasicTextFieldComponent.InnerTextField = InnerTextField; +BasicTextFieldComponent.Placeholder = Placeholder; + +// endregion Component + +export { BasicTextFieldComponent as BasicTextField }; diff --git a/packages/expo-ui/src/jetpack-compose/TextField/TextField.tsx b/packages/expo-ui/src/jetpack-compose/TextField/TextField.tsx new file mode 100644 index 00000000000000..edf5b38c3c2859 --- /dev/null +++ b/packages/expo-ui/src/jetpack-compose/TextField/TextField.tsx @@ -0,0 +1,198 @@ +import { requireNativeView } from 'expo'; +import type { ColorValue } from 'react-native'; + +import { + type CommonNativeTextFieldProps, + type CommonTextFieldProperties, + useCommonTextFieldProps, +} from './shared'; +import { type ObservableState } from '../../State'; +import { parseJSXShape, type ShapeJSXElement, type ShapeRecordProps } from '../Shape'; +import { Slot } from '../SlotView'; + +// region Types + +/** + * Colors for `TextField` and `OutlinedTextField`. + * Maps to `TextFieldColors` in Compose, shared by both variants. + */ +export type TextFieldColors = { + focusedTextColor?: ColorValue; + unfocusedTextColor?: ColorValue; + disabledTextColor?: ColorValue; + errorTextColor?: ColorValue; + focusedContainerColor?: ColorValue; + unfocusedContainerColor?: ColorValue; + disabledContainerColor?: ColorValue; + errorContainerColor?: ColorValue; + cursorColor?: ColorValue; + errorCursorColor?: ColorValue; + focusedIndicatorColor?: ColorValue; + unfocusedIndicatorColor?: ColorValue; + disabledIndicatorColor?: ColorValue; + errorIndicatorColor?: ColorValue; + focusedLeadingIconColor?: ColorValue; + unfocusedLeadingIconColor?: ColorValue; + disabledLeadingIconColor?: ColorValue; + errorLeadingIconColor?: ColorValue; + focusedTrailingIconColor?: ColorValue; + unfocusedTrailingIconColor?: ColorValue; + disabledTrailingIconColor?: ColorValue; + errorTrailingIconColor?: ColorValue; + focusedLabelColor?: ColorValue; + unfocusedLabelColor?: ColorValue; + disabledLabelColor?: ColorValue; + errorLabelColor?: ColorValue; + focusedPlaceholderColor?: ColorValue; + unfocusedPlaceholderColor?: ColorValue; + disabledPlaceholderColor?: ColorValue; + errorPlaceholderColor?: ColorValue; + focusedSupportingTextColor?: ColorValue; + unfocusedSupportingTextColor?: ColorValue; + disabledSupportingTextColor?: ColorValue; + errorSupportingTextColor?: ColorValue; + focusedPrefixColor?: ColorValue; + unfocusedPrefixColor?: ColorValue; + disabledPrefixColor?: ColorValue; + errorPrefixColor?: ColorValue; + focusedSuffixColor?: ColorValue; + unfocusedSuffixColor?: ColorValue; + disabledSuffixColor?: ColorValue; + errorSuffixColor?: ColorValue; +}; + +// Material props inlined per variant (not a shared named base) so docs render them directly. +export type TextFieldProps = CommonTextFieldProperties & { + /** @default false */ + isError?: boolean; + /** + * Shape used for the field's container outline/fill. Use the helpers from + * `Shape` (for example, `` or ``). + * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. + */ + shape?: ShapeJSXElement; + colors?: TextFieldColors; +}; + +export type OutlinedTextFieldProps = CommonTextFieldProperties & { + /** @default false */ + isError?: boolean; + /** + * Shape used for the field's container outline/fill. Use the helpers from + * `Shape` (for example, `` or ``). + * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. + */ + shape?: ShapeJSXElement; + colors?: TextFieldColors; +}; + +// endregion Types + +// region Native + +type NativeTextFieldProps = Omit< + TextFieldProps, + | 'value' + | 'selection' + | 'onValueChange' + | 'onFocusChanged' + | 'onSelectionChange' + | 'keyboardActions' + | 'children' + | 'shape' +> & + CommonNativeTextFieldProps & { + variant: 'filled' | 'outlined'; + colors?: TextFieldColors; + shape?: ShapeRecordProps; + }; + +const TextFieldNativeView: React.ComponentType = requireNativeView( + 'ExpoUI', + 'TextFieldView' +); + +function useTransformedProps( + props: TextFieldProps | OutlinedTextFieldProps, + variant: 'filled' | 'outlined' +): NativeTextFieldProps { + const { shape, ...rest } = props; + return { + ...useCommonTextFieldProps(rest), + variant, + shape: parseJSXShape(shape), + }; +} + +// endregion Native + +// region Slot components + +function Label(props: { children: React.ReactNode }) { + return {props.children}; +} + +function Placeholder(props: { children: React.ReactNode }) { + return {props.children}; +} + +function LeadingIcon(props: { children: React.ReactNode }) { + return {props.children}; +} + +function TrailingIcon(props: { children: React.ReactNode }) { + return {props.children}; +} + +function Prefix(props: { children: React.ReactNode }) { + return {props.children}; +} + +function Suffix(props: { children: React.ReactNode }) { + return {props.children}; +} + +function SupportingText(props: { children: React.ReactNode }) { + return {props.children}; +} + +// endregion Slot components + +// region Components + +/** + * A Material3 `TextField`. + */ +function TextFieldComponent(props: TextFieldProps) { + return ; +} + +TextFieldComponent.Label = Label; +TextFieldComponent.Placeholder = Placeholder; +TextFieldComponent.LeadingIcon = LeadingIcon; +TextFieldComponent.TrailingIcon = TrailingIcon; +TextFieldComponent.Prefix = Prefix; +TextFieldComponent.Suffix = Suffix; +TextFieldComponent.SupportingText = SupportingText; + +/** + * A Material3 `OutlinedTextField` with a transparent background and border outline. + */ +function OutlinedTextFieldComponent(props: OutlinedTextFieldProps) { + return ; +} + +OutlinedTextFieldComponent.Label = Label; +OutlinedTextFieldComponent.Placeholder = Placeholder; +OutlinedTextFieldComponent.LeadingIcon = LeadingIcon; +OutlinedTextFieldComponent.TrailingIcon = TrailingIcon; +OutlinedTextFieldComponent.Prefix = Prefix; +OutlinedTextFieldComponent.Suffix = Suffix; +OutlinedTextFieldComponent.SupportingText = SupportingText; + +// endregion Components + +export { TextFieldComponent as TextField, OutlinedTextFieldComponent as OutlinedTextField }; + +// Exported for docs api data +export { type ObservableState }; diff --git a/packages/expo-ui/src/jetpack-compose/TextField/index.ts b/packages/expo-ui/src/jetpack-compose/TextField/index.ts new file mode 100644 index 00000000000000..ecd81740aa59f5 --- /dev/null +++ b/packages/expo-ui/src/jetpack-compose/TextField/index.ts @@ -0,0 +1,19 @@ +export { + TextField, + OutlinedTextField, + type TextFieldColors, + type TextFieldProps, + type OutlinedTextFieldProps, + type ObservableState, +} from './TextField'; +export { BasicTextField, type BasicTextFieldProps, type BasicTextFieldRef } from './BasicTextField'; +export type { + TextFieldRef, + TextFieldCapitalization, + TextFieldImeAction, + TextFieldKeyboardType, + TextFieldKeyboardOptions, + TextFieldKeyboardActions, + TextFieldTextStyle, + CommonTextFieldProperties, +} from './shared'; diff --git a/packages/expo-ui/src/jetpack-compose/TextField/index.tsx b/packages/expo-ui/src/jetpack-compose/TextField/shared.ts similarity index 50% rename from packages/expo-ui/src/jetpack-compose/TextField/index.tsx rename to packages/expo-ui/src/jetpack-compose/TextField/shared.ts index a367df24ca641d..b94fc65e4d9cf0 100644 --- a/packages/expo-ui/src/jetpack-compose/TextField/index.tsx +++ b/packages/expo-ui/src/jetpack-compose/TextField/shared.ts @@ -1,17 +1,13 @@ -import { requireNativeView } from 'expo'; -import type { Ref } from 'react'; +import type { ReactNode, Ref } from 'react'; import type { ColorValue } from 'react-native'; import { getStateId, type ObservableState, useWorkletProp, worklets } from '../../State'; import type { ModifierConfig, ViewEvent } from '../../types'; -import { parseJSXShape, type ShapeJSXElement, type ShapeRecordProps } from '../Shape'; -import { Slot } from '../SlotView'; import { createViewModifierEventListener } from '../modifiers/utils'; -// region Types - /** - * Can be used for imperatively focusing and setting text/selection on the `TextField` component. + * Can be used for imperatively focusing and setting text/selection on the + * `TextField`, `OutlinedTextField`, and `BasicTextField` components. */ export type TextFieldRef = { setText: (newText: string) => Promise; @@ -76,56 +72,37 @@ export type TextFieldKeyboardActions = { }; /** - * Colors for `TextField` and `OutlinedTextField`. - * Maps to `TextFieldColors` in Compose, shared by both variants. + * Text styling for a text field's content. Maps to Compose's `TextStyle`. + * Shared by `TextField`, `OutlinedTextField`, and `BasicTextField`. */ -export type TextFieldColors = { - focusedTextColor?: ColorValue; - unfocusedTextColor?: ColorValue; - disabledTextColor?: ColorValue; - errorTextColor?: ColorValue; - focusedContainerColor?: ColorValue; - unfocusedContainerColor?: ColorValue; - disabledContainerColor?: ColorValue; - errorContainerColor?: ColorValue; - cursorColor?: ColorValue; - errorCursorColor?: ColorValue; - focusedIndicatorColor?: ColorValue; - unfocusedIndicatorColor?: ColorValue; - disabledIndicatorColor?: ColorValue; - errorIndicatorColor?: ColorValue; - focusedLeadingIconColor?: ColorValue; - unfocusedLeadingIconColor?: ColorValue; - disabledLeadingIconColor?: ColorValue; - errorLeadingIconColor?: ColorValue; - focusedTrailingIconColor?: ColorValue; - unfocusedTrailingIconColor?: ColorValue; - disabledTrailingIconColor?: ColorValue; - errorTrailingIconColor?: ColorValue; - focusedLabelColor?: ColorValue; - unfocusedLabelColor?: ColorValue; - disabledLabelColor?: ColorValue; - errorLabelColor?: ColorValue; - focusedPlaceholderColor?: ColorValue; - unfocusedPlaceholderColor?: ColorValue; - disabledPlaceholderColor?: ColorValue; - errorPlaceholderColor?: ColorValue; - focusedSupportingTextColor?: ColorValue; - unfocusedSupportingTextColor?: ColorValue; - disabledSupportingTextColor?: ColorValue; - errorSupportingTextColor?: ColorValue; - focusedPrefixColor?: ColorValue; - unfocusedPrefixColor?: ColorValue; - disabledPrefixColor?: ColorValue; - errorPrefixColor?: ColorValue; - focusedSuffixColor?: ColorValue; - unfocusedSuffixColor?: ColorValue; - disabledSuffixColor?: ColorValue; - errorSuffixColor?: ColorValue; +export type TextFieldTextStyle = { + textAlign?: 'left' | 'right' | 'center' | 'justify'; + color?: ColorValue; + fontSize?: number; + fontFamily?: string; + fontWeight?: + | '100' + | '200' + | '300' + | '400' + | '500' + | '600' + | '700' + | '800' + | '900' + | 'normal' + | 'bold'; + lineHeight?: number; + letterSpacing?: number; }; -/** Shared props between `TextField` and `OutlinedTextField`. */ -type BaseTextFieldProps = { +/** + * Props shared by every Compose text field variant — `TextField`, + * `OutlinedTextField`, and `BasicTextField`. The Material variants add their + * own decoration props (`isError`, `shape`, `colors`, slot children); + * `BasicTextField` adds `cursorColor`. + */ +export type CommonTextFieldProperties = { ref?: Ref; /** * An observable state that holds the current text value. Create one with @@ -140,8 +117,6 @@ type BaseTextFieldProps = { /** @default false */ readOnly?: boolean; /** @default false */ - isError?: boolean; - /** @default false */ singleLine?: boolean; maxLines?: number; minLines?: number; @@ -151,17 +126,6 @@ type BaseTextFieldProps = { */ visualTransformation?: 'password' | 'none'; - /** - * Selection-related colors. Maps to Compose's `TextSelectionColors` via - * `LocalTextSelectionColors`. `handleColor` controls the drag handles; - * `backgroundColor` is the highlighted-text background (typically the same - * tint at lower alpha so the underlying text stays readable). - */ - textSelectionColors?: { - handleColor?: ColorValue; - backgroundColor?: ColorValue; - }; - /** * Observable state holding the current selection range. Create with * `useNativeState({ start: 0, end: 0 })`. The field writes user-driven @@ -178,28 +142,21 @@ type BaseTextFieldProps = { onSelectionChange?: (selection: { start: number; end: number }) => void; /** - * Text styling for the field's content. Maps to Compose's `TextStyle`. + * Selection-related colors. Maps to Compose's `TextSelectionColors` via + * `LocalTextSelectionColors`. `handleColor` controls the drag handles (and + * the caret's drag handle); `backgroundColor` is the highlighted-text + * background (typically the same tint at lower alpha so the underlying text + * stays readable). Independent of `cursorColor`, which tints the caret line. */ - textStyle?: { - textAlign?: 'left' | 'right' | 'center' | 'justify'; - color?: ColorValue; - fontSize?: number; - fontFamily?: string; - fontWeight?: - | '100' - | '200' - | '300' - | '400' - | '500' - | '600' - | '700' - | '800' - | '900' - | 'normal' - | 'bold'; - lineHeight?: number; - letterSpacing?: number; + textSelectionColors?: { + handleColor?: ColorValue; + backgroundColor?: ColorValue; }; + + /** + * Text styling for the field's content. Maps to Compose's `TextStyle`. + */ + textStyle?: TextFieldTextStyle; keyboardOptions?: TextFieldKeyboardOptions; keyboardActions?: TextFieldKeyboardActions; /** @@ -211,44 +168,35 @@ type BaseTextFieldProps = { onValueChange?: (value: string) => void; /** A callback triggered when the field gains or loses focus. */ onFocusChanged?: (focused: boolean) => void; - /** - * Shape used for the field's container outline/fill. Use the helpers from - * `Shape` (for example, `` or ``). - * Defaults to the Material `OutlinedTextFieldDefaults.shape`/`TextFieldDefaults.shape`. - */ - shape?: ShapeJSXElement; modifiers?: ModifierConfig[]; - /** Slot children (e.g. `TextField.Label`, `TextField.Placeholder`). */ - children?: React.ReactNode; -}; - -export type TextFieldProps = BaseTextFieldProps & { - colors?: TextFieldColors; -}; - -export type OutlinedTextFieldProps = BaseTextFieldProps & { - colors?: TextFieldColors; + /** Slot children that configure the field's decoration. */ + children?: ReactNode; }; -// endregion Types +// region Native transform -// region Native - -type NativeTextFieldProps = Omit< - BaseTextFieldProps, +/** + * Keys consumed (and reshaped) by {@link useCommonTextFieldProps}. Everything + * else on the props passes through untouched. + */ +type TransformedKeys = | 'value' | 'selection' + | 'modifiers' + | 'children' + | 'keyboardActions' | 'onValueChange' | 'onFocusChanged' - | 'onSelectionChange' - | 'keyboardActions' - | 'children' - | 'shape' -> & { - variant: 'filled' | 'outlined'; - colors?: TextFieldColors; - shape?: ShapeRecordProps; - children?: React.ReactNode; + | 'onSelectionChange'; + +/** + * Native-facing prop shape shared by every Compose text field variant. The + * observable-backed props collapse to shared-object ids, and the public + * callbacks become `nativeEvent`-wrapped listeners. + */ +export type CommonNativeTextFieldProps = { + modifiers?: ModifierConfig[]; + children?: ReactNode; value?: number | null; selection?: number | null; onValueChangeSync?: number | null; @@ -257,15 +205,9 @@ type NativeTextFieldProps = Omit< ViewEvent<'onSelectionChange', { start: number; end: number }> & ViewEvent<'onKeyboardAction', { action: string; value: string }>; -const TextFieldNativeView: React.ComponentType = requireNativeView( - 'ExpoUI', - 'TextFieldView' -); - -function useTransformedProps( - props: TextFieldProps | OutlinedTextFieldProps, - variant: 'filled' | 'outlined' -): NativeTextFieldProps { +export function useCommonTextFieldProps( + props: T +): CommonNativeTextFieldProps & Omit { const { value, selection, @@ -275,19 +217,16 @@ function useTransformedProps( onValueChange, onFocusChanged, onSelectionChange, - shape, - ...restProps + ...rest } = props; const isWorklet = !!onValueChange && !!worklets?.isWorkletFunction?.(onValueChange); const workletCallback = useWorkletProp(isWorklet ? onValueChange : undefined, 'onValueChange'); return { + ...rest, modifiers, ...(modifiers ? createViewModifierEventListener(modifiers) : undefined), - ...restProps, - variant, - shape: parseJSXShape(shape), children, value: getStateId(value), selection: getStateId(selection), @@ -315,75 +254,4 @@ function useTransformedProps( }; } -// endregion Native - -// region Slot components - -function Label(props: { children: React.ReactNode }) { - return {props.children}; -} - -function Placeholder(props: { children: React.ReactNode }) { - return {props.children}; -} - -function LeadingIcon(props: { children: React.ReactNode }) { - return {props.children}; -} - -function TrailingIcon(props: { children: React.ReactNode }) { - return {props.children}; -} - -function Prefix(props: { children: React.ReactNode }) { - return {props.children}; -} - -function Suffix(props: { children: React.ReactNode }) { - return {props.children}; -} - -function SupportingText(props: { children: React.ReactNode }) { - return {props.children}; -} - -// endregion Slot components - -// region Components - -/** - * A Material3 `TextField`. - */ -function TextFieldComponent(props: TextFieldProps) { - return ; -} - -TextFieldComponent.Label = Label; -TextFieldComponent.Placeholder = Placeholder; -TextFieldComponent.LeadingIcon = LeadingIcon; -TextFieldComponent.TrailingIcon = TrailingIcon; -TextFieldComponent.Prefix = Prefix; -TextFieldComponent.Suffix = Suffix; -TextFieldComponent.SupportingText = SupportingText; - -/** - * A Material3 `OutlinedTextField` with a transparent background and border outline. - */ -function OutlinedTextFieldComponent(props: OutlinedTextFieldProps) { - return ; -} - -OutlinedTextFieldComponent.Label = Label; -OutlinedTextFieldComponent.Placeholder = Placeholder; -OutlinedTextFieldComponent.LeadingIcon = LeadingIcon; -OutlinedTextFieldComponent.TrailingIcon = TrailingIcon; -OutlinedTextFieldComponent.Prefix = Prefix; -OutlinedTextFieldComponent.Suffix = Suffix; -OutlinedTextFieldComponent.SupportingText = SupportingText; - -// endregion Components - -export { TextFieldComponent as TextField, OutlinedTextFieldComponent as OutlinedTextField }; - -// Exported for docs api data -export { type ObservableState }; +// endregion Native transform diff --git a/packages/expo-ui/src/jetpack-compose/index.ts b/packages/expo-ui/src/jetpack-compose/index.ts index 5aedc12b0e97e1..e34a1c8623f515 100644 --- a/packages/expo-ui/src/jetpack-compose/index.ts +++ b/packages/expo-ui/src/jetpack-compose/index.ts @@ -29,7 +29,11 @@ export * from './SyncSwitch'; export { TextField, OutlinedTextField, + BasicTextField, type TextFieldProps, + type OutlinedTextFieldProps, + type BasicTextFieldProps, + type BasicTextFieldRef, type TextFieldRef, type TextFieldCapitalization, type TextFieldImeAction, @@ -37,6 +41,8 @@ export { type TextFieldKeyboardType, type TextFieldKeyboardActions, type TextFieldColors, + type TextFieldTextStyle, + type CommonTextFieldProperties, } from './TextField'; export * from './ToggleButton'; export * from './Shape'; diff --git a/packages/expo-ui/src/universal/TextInput/index.android.tsx b/packages/expo-ui/src/universal/TextInput/index.android.tsx index e3ee0741555c71..1b7fd0de40b2fe 100644 --- a/packages/expo-ui/src/universal/TextInput/index.android.tsx +++ b/packages/expo-ui/src/universal/TextInput/index.android.tsx @@ -1,5 +1,6 @@ import { - TextField as ComposeTextField, + BasicTextField, + Box, Text, type TextFieldImeAction, type TextFieldKeyboardType, @@ -97,8 +98,6 @@ export function TextInput({ const numberOfLines = numberOfLinesProp ?? rows; const keyboardType = keyboardTypeProp ?? inputModeToKeyboardType(inputMode); const returnKeyType = returnKeyTypeProp ?? enterKeyHintToReturnKeyType(enterKeyHint); - const { backgroundColor: styleBackgroundColor, ...boxStyle } = style ?? {}; - const hideIndicator = boxStyle.borderWidth === 0 && underlineColorAndroid == null; const initialFallbackRef = useRef(defaultValue ?? ''); const fallback = useNativeState(initialFallbackRef.current); @@ -156,11 +155,11 @@ export function TextInput({ : undefined; return ( - 0 ? numberOfLines : undefined} minLines={multiline && numberOfLines && numberOfLines > 0 ? numberOfLines : undefined} - colors={ - caretHidden || - cursorColor || - underlineColorAndroid || - placeholderTextColor || - styleBackgroundColor || - hideIndicator - ? { - ...(caretHidden - ? { cursorColor: 'transparent' } - : cursorColor - ? { cursorColor } - : null), - ...(styleBackgroundColor - ? { - focusedContainerColor: styleBackgroundColor, - unfocusedContainerColor: styleBackgroundColor, - disabledContainerColor: styleBackgroundColor, - errorContainerColor: styleBackgroundColor, - } - : null), - ...(underlineColorAndroid - ? { - unfocusedIndicatorColor: underlineColorAndroid, - focusedIndicatorColor: underlineColorAndroid, - } - : hideIndicator - ? { - focusedIndicatorColor: 'transparent', - unfocusedIndicatorColor: 'transparent', - disabledIndicatorColor: 'transparent', - errorIndicatorColor: 'transparent', - } - : null), - ...(placeholderTextColor - ? { - unfocusedPlaceholderColor: placeholderTextColor, - focusedPlaceholderColor: placeholderTextColor, - disabledPlaceholderColor: placeholderTextColor, - } - : null), - } - : undefined - } + cursorColor={caretHidden ? 'transparent' : (cursorColor ?? selectionColor)} textStyle={ textStyle || (textAlign && textAlign !== 'auto') ? { @@ -237,18 +193,28 @@ export function TextInput({ onValueChange={onChangeText} maxLength={maxLength} onFocusChanged={handleFocusChanged} - selection={selection as Parameters[0]['selection']} + selection={selection as Parameters[0]['selection']} onSelectionChange={onSelectionChange}> - {placeholder ? ( - - - {placeholder} - - - ) : null} - + + + {placeholder != null ? ( + + + {placeholder} + + + ) : null} + + + + ); } diff --git a/packages/expo-ui/src/universal/TextInput/types.ts b/packages/expo-ui/src/universal/TextInput/types.ts index 86b65af278663c..150505fe8150f9 100644 --- a/packages/expo-ui/src/universal/TextInput/types.ts +++ b/packages/expo-ui/src/universal/TextInput/types.ts @@ -194,7 +194,11 @@ export interface TextInputProps { rows?: number; /** - * Color of the underline indicator on Android. iOS / web ignore this. + * Color of the underline indicator on Android. + * + * @deprecated The Android `TextInput` renders an unstyled `BasicTextField` that + * has no underline indicator, so this has no effect. To draw your own border, + * pass it through `style` or `modifiers`. * @platform android */ underlineColorAndroid?: ColorValue; diff --git a/tools/src/commands/GenerateDocsAPIData.ts b/tools/src/commands/GenerateDocsAPIData.ts index 7f526272426876..c608b6a1176a7b 100644 --- a/tools/src/commands/GenerateDocsAPIData.ts +++ b/tools/src/commands/GenerateDocsAPIData.ts @@ -151,7 +151,7 @@ const uiPackagesMapping: Record = { 'expo-ui/jetpack-compose/snackbar': ['jetpack-compose/Snackbar/index.tsx', 'expo-ui'], 'expo-ui/jetpack-compose/switch': ['jetpack-compose/Switch/index.tsx', 'expo-ui'], 'expo-ui/jetpack-compose/text': ['jetpack-compose/Text/index.tsx', 'expo-ui'], - 'expo-ui/jetpack-compose/textfield': ['jetpack-compose/TextField/index.tsx', 'expo-ui'], + 'expo-ui/jetpack-compose/textfield': ['jetpack-compose/TextField/index.ts', 'expo-ui'], 'expo-ui/jetpack-compose/togglebutton': ['jetpack-compose/ToggleButton/index.tsx', 'expo-ui'], 'expo-ui/jetpack-compose/tooltip': ['jetpack-compose/Tooltip/index.tsx', 'expo-ui'], 'expo-ui/jetpack-compose/usenativestate': ['State/useNativeState.ts', 'expo-ui'], From eeb6d66bc088d7b296042cc4316a3a08658bda9c Mon Sep 17 00:00:00 2001 From: Shubh Porwal Date: Tue, 9 Jun 2026 01:02:35 +0530 Subject: [PATCH 2/2] [audio] Add directory option for recordings (#46189) # Why `expo-audio` currently saves recordings to the app cache directory by default. On Android and iOS, cache files may be deleted by the system when the device runs low on storage, which can make newly recorded audio disappear before the app has a chance to upload, process or persist it elsewhere. This adds a native recording `directory` option so apps can choose whether new recordings should be stored in the cache directory or the app document directory. The default remains `cache`, preserving existing behavior, while `directory: 'document'` gives apps a more persistent location for important recordings. # How Added a native-only `RecordingDirectory` option to recording options with support for: - `cache`: the existing default behavior - `document`: stores new recordings under the app document directory The option is passed only to Android and iOS recording options, so web behavior is unchanged. On Android, recorder file path creation now resolves the selected parent directory before configuring `MediaRecorder` and releases the recorder if native configuration fails. On iOS, recorder creation now throws a real recording error instead of returning a placeholder recorder, and `prepareToRecordAsync()` only swaps recorder state after the replacement `AVAudioRecorder` is created successfully. Docs now explain the default cache behavior and recommend `directory: 'document'` for new recordings that should be kept. # Test Plan
Android iOS
# Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [x] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --------- Co-authored-by: Aman Mittal --- .../src/screens/Audio/Recorder.tsx | 92 ++++++++++++++++--- apps/test-suite/tests/Recording.ts | 65 +++++++++++++ docs/pages/versions/unversioned/sdk/audio.mdx | 2 + docs/pages/versions/v56.0.0/sdk/audio.mdx | 2 + packages/expo-audio/CHANGELOG.md | 2 + .../java/expo/modules/audio/AudioRecorder.kt | 48 ++++++---- .../java/expo/modules/audio/AudioRecords.kt | 8 +- packages/expo-audio/build/Audio.types.d.ts | 18 ++++ .../expo-audio/build/Audio.types.d.ts.map | 2 +- packages/expo-audio/build/Audio.types.js.map | 2 +- packages/expo-audio/build/utils/options.d.ts | 5 +- .../expo-audio/build/utils/options.d.ts.map | 2 +- packages/expo-audio/build/utils/options.js | 2 + .../expo-audio/build/utils/options.js.map | 2 +- packages/expo-audio/ios/AudioModule.swift | 11 ++- packages/expo-audio/ios/AudioRecorder.swift | 20 +++- packages/expo-audio/ios/AudioRecords.swift | 6 ++ packages/expo-audio/ios/AudioUtils.swift | 19 ++-- packages/expo-audio/src/Audio.types.ts | 19 ++++ packages/expo-audio/src/utils/options.ts | 13 ++- 20 files changed, 281 insertions(+), 59 deletions(-) diff --git a/apps/native-component-list/src/screens/Audio/Recorder.tsx b/apps/native-component-list/src/screens/Audio/Recorder.tsx index 29bd22b85eb5a9..eb0b80ac035a07 100644 --- a/apps/native-component-list/src/screens/Audio/Recorder.tsx +++ b/apps/native-component-list/src/screens/Audio/Recorder.tsx @@ -1,15 +1,10 @@ import Ionicons from '@expo/vector-icons/build/Ionicons'; -import { - useAudioRecorder, - useAudioRecorderState, - AudioModule, - RecordingStatus, - RecordingOptions, - RecordingPresets, -} from 'expo-audio'; +import { useAudioRecorder, useAudioRecorderState, AudioModule, RecordingPresets } from 'expo-audio'; +import type { RecordingDirectory, RecordingOptions, RecordingStatus } from 'expo-audio'; import React, { useEffect } from 'react'; import { Alert, + Platform, ScrollView, StyleProp, StyleSheet, @@ -30,6 +25,8 @@ type RecorderProps = { style?: StyleProp; }; +const supportsRecordingDirectory = Platform.OS === 'android' || Platform.OS === 'ios'; + export default function Recorder({ onDone, style }: RecorderProps) { const [state, setState] = React.useState({ id: 'initial', @@ -41,8 +38,20 @@ export default function Recorder({ onDone, style }: RecorderProps) { const [recorderOptions, setRecorderOptions] = React.useState( RecordingPresets.HIGH_QUALITY ); + const [recordingDirectory, setRecordingDirectory] = React.useState('cache'); + const [lastUri, setLastUri] = React.useState(null); const [useAtTime, setUseAtTime] = React.useState(false); const [useForDuration, setUseForDuration] = React.useState(false); + const currentRecorderOptions = React.useMemo( + () => + supportsRecordingDirectory + ? { + ...recorderOptions, + directory: recordingDirectory, + } + : recorderOptions, + [recorderOptions, recordingDirectory] + ); useEffect(() => { (async () => { @@ -53,7 +62,7 @@ export default function Recorder({ onDone, style }: RecorderProps) { })(); }, []); - const audioRecorder = useAudioRecorder(recorderOptions, (status) => { + const audioRecorder = useAudioRecorder(currentRecorderOptions, (status) => { if (status.mediaServicesDidReset) { console.warn('[Recorder] Media services were reset'); Alert.alert( @@ -70,8 +79,9 @@ export default function Recorder({ onDone, style }: RecorderProps) { setState(status); // Handle automatic recording completion (from forDuration or atTime+forDuration) - if (status.isFinished && !status.hasError && status.url && onDone) { - onDone(status.url); + if (status.isFinished && !status.hasError && status.url) { + setLastUri(status.url); + onDone?.(status.url); } }); @@ -104,6 +114,30 @@ export default function Recorder({ onDone, style }: RecorderProps) { ); }; + const renderDirectoryOptions = () => { + if (!supportsRecordingDirectory) { + return null; + } + + return ( + + Directory + +