@indra-inter/neobrutalism-components 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -128
- package/dist/module/components/accordion/accordion.js +2 -13
- package/dist/module/components/accordion/accordion.js.map +1 -1
- package/dist/module/components/app-bar/app-bar.js +3 -5
- package/dist/module/components/app-bar/app-bar.js.map +1 -1
- package/dist/module/components/avatar/avatar.js +10 -11
- package/dist/module/components/avatar/avatar.js.map +1 -1
- package/dist/module/components/badge/badge.js +4 -5
- package/dist/module/components/badge/badge.js.map +1 -1
- package/dist/module/components/bottom-navigation/bottom-navigation.js +2 -15
- package/dist/module/components/bottom-navigation/bottom-navigation.js.map +1 -1
- package/dist/module/components/bottom-sheet/bottom-sheet.js +10 -4
- package/dist/module/components/bottom-sheet/bottom-sheet.js.map +1 -1
- package/dist/module/components/button/button.js +6 -16
- package/dist/module/components/button/button.js.map +1 -1
- package/dist/module/components/calendar/calendar.js.map +1 -1
- package/dist/module/components/card/card.js +3 -19
- package/dist/module/components/card/card.js.map +1 -1
- package/dist/module/components/chat-list-item/chat-list-item.js +1 -1
- package/dist/module/components/chat-list-item/chat-list-item.js.map +1 -1
- package/dist/module/components/dialog/dialog.js +1 -1
- package/dist/module/components/dialog/dialog.js.map +1 -1
- package/dist/module/components/dropdown/dropdown-menu.js +4 -17
- package/dist/module/components/dropdown/dropdown-menu.js.map +1 -1
- package/dist/module/components/dropdown/dropdown.js +1 -1
- package/dist/module/components/dropdown/dropdown.js.map +1 -1
- package/dist/module/components/icon-button/icon-button.js +3 -3
- package/dist/module/components/icon-button/icon-button.js.map +1 -1
- package/dist/module/components/pin-code-field/pin-code-field.js +3 -2
- package/dist/module/components/pin-code-field/pin-code-field.js.map +1 -1
- package/dist/module/components/shared/styling.js +12 -0
- package/dist/module/components/shared/styling.js.map +1 -1
- package/dist/module/components/skeleton/skeleton.js +3 -3
- package/dist/module/components/skeleton/skeleton.js.map +1 -1
- package/dist/module/components/tabs/tabs.js.map +1 -1
- package/dist/module/index.js +2 -1
- package/dist/module/index.js.map +1 -1
- package/dist/module/theme/design-tokens.generated.js +91 -3
- package/dist/module/theme/design-tokens.generated.js.map +1 -1
- package/dist/module/theme/nativewind-theme-provider.js +27 -0
- package/dist/module/theme/nativewind-theme-provider.js.map +1 -0
- package/dist/module/theme/nativewind-tokens.generated.js +299 -0
- package/dist/module/theme/nativewind-tokens.generated.js.map +1 -0
- package/dist/module/theme/theme-provider.js +3 -2
- package/dist/module/theme/theme-provider.js.map +1 -1
- package/dist/module/theme/theme.js +45 -22
- package/dist/module/theme/theme.js.map +1 -1
- package/dist/typescript/components/accordion/accordion.d.ts +2 -3
- package/dist/typescript/components/accordion/accordion.d.ts.map +1 -1
- package/dist/typescript/components/app-bar/app-bar.d.ts +0 -2
- package/dist/typescript/components/app-bar/app-bar.d.ts.map +1 -1
- package/dist/typescript/components/avatar/avatar.d.ts +4 -7
- package/dist/typescript/components/avatar/avatar.d.ts.map +1 -1
- package/dist/typescript/components/badge/badge.d.ts +5 -8
- package/dist/typescript/components/badge/badge.d.ts.map +1 -1
- package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts +3 -5
- package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts.map +1 -1
- package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts +4 -1
- package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts.map +1 -1
- package/dist/typescript/components/button/button.d.ts +2 -3
- package/dist/typescript/components/button/button.d.ts.map +1 -1
- package/dist/typescript/components/calendar/calendar.d.ts +3 -4
- package/dist/typescript/components/calendar/calendar.d.ts.map +1 -1
- package/dist/typescript/components/card/card.d.ts +3 -7
- package/dist/typescript/components/card/card.d.ts.map +1 -1
- package/dist/typescript/components/dropdown/dropdown-menu.d.ts +3 -7
- package/dist/typescript/components/dropdown/dropdown-menu.d.ts.map +1 -1
- package/dist/typescript/components/icon-button/icon-button.d.ts +4 -5
- package/dist/typescript/components/icon-button/icon-button.d.ts.map +1 -1
- package/dist/typescript/components/pin-code-field/pin-code-field.d.ts +3 -2
- package/dist/typescript/components/pin-code-field/pin-code-field.d.ts.map +1 -1
- package/dist/typescript/components/shared/styling.d.ts +2 -0
- package/dist/typescript/components/shared/styling.d.ts.map +1 -1
- package/dist/typescript/components/skeleton/skeleton.d.ts +4 -5
- package/dist/typescript/components/skeleton/skeleton.d.ts.map +1 -1
- package/dist/typescript/components/tabs/tabs.d.ts +2 -4
- package/dist/typescript/components/tabs/tabs.d.ts.map +1 -1
- package/dist/typescript/index.d.ts +11 -10
- package/dist/typescript/index.d.ts.map +1 -1
- package/dist/typescript/theme/design-tokens.generated.d.ts +91 -3
- package/dist/typescript/theme/design-tokens.generated.d.ts.map +1 -1
- package/dist/typescript/theme/nativewind-theme-provider.d.ts +8 -0
- package/dist/typescript/theme/nativewind-theme-provider.d.ts.map +1 -0
- package/dist/typescript/theme/nativewind-tokens.generated.d.ts +295 -0
- package/dist/typescript/theme/nativewind-tokens.generated.d.ts.map +1 -0
- package/dist/typescript/theme/theme-provider.d.ts +3 -2
- package/dist/typescript/theme/theme-provider.d.ts.map +1 -1
- package/dist/typescript/theme/theme.d.ts +19 -16
- package/dist/typescript/theme/theme.d.ts.map +1 -1
- package/nativewind.css +66 -22
- package/package.json +6 -3
- package/tokens.css +2 -2
package/README.md
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
# Neobrutalism Components
|
|
2
2
|
|
|
3
|
-
A token-driven
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
A token-driven React Native component library for iOS and Android. It provides
|
|
4
|
+
neobrutalist foundations, forms, navigation, feedback, and overlays with Blue
|
|
5
|
+
and Coral families in light and dark mode.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
## Start here
|
|
8
|
+
|
|
9
|
+
Use this README in order:
|
|
10
|
+
|
|
11
|
+
1. [Install the package](#installation) and its native peers.
|
|
12
|
+
2. Add the required [app providers](#app-providers) once at the application root.
|
|
13
|
+
3. Choose [React Native styles or NativeWind](#styling-components), then configure
|
|
14
|
+
[theming](#theming) if the app supports mode or family switching.
|
|
15
|
+
4. Use the [component reference](#components) for component-specific examples.
|
|
16
|
+
|
|
17
|
+
All public examples use the scoped package name
|
|
18
|
+
`@indra-inter/neobrutalism-components`.
|
|
9
19
|
|
|
10
20
|
## Installation
|
|
11
21
|
|
|
@@ -21,13 +31,13 @@ During local development, add the package from its sibling directory:
|
|
|
21
31
|
pnpm add ../neobrutalism-components-rn
|
|
22
32
|
```
|
|
23
33
|
|
|
24
|
-
|
|
34
|
+
Install the published package:
|
|
25
35
|
|
|
26
36
|
```bash
|
|
27
|
-
pnpm add neobrutalism-components
|
|
37
|
+
pnpm add @indra-inter/neobrutalism-components
|
|
28
38
|
```
|
|
29
39
|
|
|
30
|
-
##
|
|
40
|
+
## Styling components
|
|
31
41
|
|
|
32
42
|
NativeWind v4 is a required peer dependency. Configure it in the consuming
|
|
33
43
|
application, then import components from the same package entry point. Neo's
|
|
@@ -38,7 +48,7 @@ components also expose named class slots that match their existing `*Style`
|
|
|
38
48
|
props.
|
|
39
49
|
|
|
40
50
|
```tsx
|
|
41
|
-
import { Button, Radio } from 'neobrutalism-components';
|
|
51
|
+
import { Button, Radio } from '@indra-inter/neobrutalism-components';
|
|
42
52
|
|
|
43
53
|
<Radio
|
|
44
54
|
className="min-h-14 items-center px-2 py-2"
|
|
@@ -48,7 +58,7 @@ import { Button, Radio } from 'neobrutalism-components';
|
|
|
48
58
|
/>
|
|
49
59
|
|
|
50
60
|
<Button
|
|
51
|
-
className="bg-
|
|
61
|
+
className="bg-primary"
|
|
52
62
|
containerClassName="self-end"
|
|
53
63
|
containerStyle={{ marginTop: 12 }}>
|
|
54
64
|
Continue
|
|
@@ -71,34 +81,15 @@ control.
|
|
|
71
81
|
<Button className="mt-4" rounded="sharp" shadow={false}>Save</Button>
|
|
72
82
|
<Input className="bg-card" containerClassName="gap-2" />
|
|
73
83
|
<Badge variant="destructive" rounded="pill">Failed</Badge>
|
|
74
|
-
<Avatar
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
The following aliases remain supported for compatibility. Prefer the canonical
|
|
78
|
-
prop in new code: `Button variant="noShadow"` → `shadow={false}`,
|
|
79
|
-
`Badge.type` → `Badge.variant`, `Avatar.variant` → `Avatar.mode`,
|
|
80
|
-
`AppBar.Content.variant` → `AppBar.Content.layout`, and
|
|
81
|
-
`DropdownMenu.variant` → `DropdownMenu.mode`. If both values are supplied,
|
|
82
|
-
the canonical prop takes precedence.
|
|
83
|
-
|
|
84
|
-
## Example app
|
|
85
|
-
|
|
86
|
-
The repository includes a private Expo Router example application in
|
|
87
|
-
[`example/`](./example). It demonstrates the package in Chats, Calls, Discover,
|
|
88
|
-
and Me screens, while the external `company-ui-test` project remains the focused
|
|
89
|
-
regression consumer. The example is excluded from the npm tarball.
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
# repository root
|
|
93
|
-
pnpm build
|
|
94
|
-
pnpm --dir example install
|
|
95
|
-
pnpm --dir example start
|
|
84
|
+
<Avatar variant="image" source={photo} />
|
|
96
85
|
```
|
|
97
86
|
|
|
98
|
-
|
|
99
|
-
|
|
87
|
+
Use the canonical selector props only: `Avatar.variant`, `Badge.variant`, and
|
|
88
|
+
`DropdownMenu.variant`. Shadow color is always semantic: use
|
|
89
|
+
`shadowVariant="primary"` or another Neo role; arbitrary `shadowColor` values
|
|
90
|
+
are intentionally not supported.
|
|
100
91
|
|
|
101
|
-
##
|
|
92
|
+
## App providers
|
|
102
93
|
|
|
103
94
|
Wrap the application once. `SafeAreaProvider` supplies insets used by toasts,
|
|
104
95
|
dialogs, and bottom sheets. `DialogProvider` provides the portal host for
|
|
@@ -112,7 +103,7 @@ import {
|
|
|
112
103
|
ThemeProvider,
|
|
113
104
|
ToastProvider,
|
|
114
105
|
type ThemeMode,
|
|
115
|
-
} from 'neobrutalism-components';
|
|
106
|
+
} from '@indra-inter/neobrutalism-components';
|
|
116
107
|
|
|
117
108
|
export function AppProviders({ children }: PropsWithChildren) {
|
|
118
109
|
const [mode] = useState<ThemeMode>('light');
|
|
@@ -131,20 +122,30 @@ export function AppProviders({ children }: PropsWithChildren) {
|
|
|
131
122
|
|
|
132
123
|
## Theming
|
|
133
124
|
|
|
134
|
-
`ThemeProvider` supports `light` and `dark` modes
|
|
135
|
-
|
|
125
|
+
`ThemeProvider` supports `light` and `dark` modes plus `blue` and `coral` theme
|
|
126
|
+
families. Blue is the default. Components automatically react to mode and
|
|
127
|
+
family changes.
|
|
136
128
|
|
|
137
129
|
```tsx
|
|
138
130
|
import { useState } from 'react';
|
|
139
|
-
import {
|
|
131
|
+
import {
|
|
132
|
+
Button,
|
|
133
|
+
ThemeProvider,
|
|
134
|
+
type ThemeMode,
|
|
135
|
+
type ThemeVariant,
|
|
136
|
+
} from '@indra-inter/neobrutalism-components';
|
|
140
137
|
|
|
141
138
|
export function ThemeExample() {
|
|
142
139
|
const [mode, setMode] = useState<ThemeMode>('light');
|
|
140
|
+
const [variant, setVariant] = useState<ThemeVariant>('blue');
|
|
143
141
|
|
|
144
142
|
return (
|
|
145
|
-
<ThemeProvider mode={mode}>
|
|
143
|
+
<ThemeProvider mode={mode} variant={variant}>
|
|
146
144
|
<Button onPress={() => setMode(mode === 'light' ? 'dark' : 'light')}>
|
|
147
|
-
Switch
|
|
145
|
+
Switch mode
|
|
146
|
+
</Button>
|
|
147
|
+
<Button onPress={() => setVariant(variant === 'blue' ? 'coral' : 'blue')}>
|
|
148
|
+
Switch family
|
|
148
149
|
</Button>
|
|
149
150
|
</ThemeProvider>
|
|
150
151
|
);
|
|
@@ -156,7 +157,7 @@ tokens:
|
|
|
156
157
|
|
|
157
158
|
```tsx
|
|
158
159
|
import { Text, View } from 'react-native';
|
|
159
|
-
import { useTheme } from 'neobrutalism-components';
|
|
160
|
+
import { useTheme } from '@indra-inter/neobrutalism-components';
|
|
160
161
|
|
|
161
162
|
export function ThemedPanel() {
|
|
162
163
|
const theme = useTheme();
|
|
@@ -171,31 +172,65 @@ export function ThemedPanel() {
|
|
|
171
172
|
|
|
172
173
|
`createTheme`, `theme`, `designTokens`, and `defaultDesignTokenModes` are also
|
|
173
174
|
exported when an application needs to inspect theme data outside a component.
|
|
175
|
+
For example, `createTheme('dark', 'coral')` returns the same palette used by
|
|
176
|
+
`ThemeProvider mode="dark" variant="coral"`.
|
|
174
177
|
|
|
175
178
|
### Figma token workflow
|
|
176
179
|
|
|
177
|
-
Figma exports are versioned in [`tokens/figma/`](./tokens/figma).
|
|
178
|
-
the
|
|
179
|
-
updating those files:
|
|
180
|
+
Figma exports are versioned in [`tokens/figma/`](./tokens/figma). After changing
|
|
181
|
+
them, regenerate the TypeScript theme and NativeWind semantic variables:
|
|
180
182
|
|
|
181
183
|
```bash
|
|
182
184
|
pnpm generate:design-tokens
|
|
183
185
|
pnpm test:design-tokens
|
|
184
186
|
```
|
|
185
187
|
|
|
186
|
-
For
|
|
187
|
-
|
|
188
|
+
For NativeWind semantic utilities, import the generated stylesheet once in the
|
|
189
|
+
consuming application's global CSS:
|
|
188
190
|
|
|
189
191
|
```css
|
|
190
192
|
@import '@indra-inter/neobrutalism-components/nativewind.css';
|
|
191
193
|
```
|
|
192
194
|
|
|
193
|
-
|
|
194
|
-
`text-foreground`, `bg-
|
|
195
|
-
`
|
|
195
|
+
It provides semantic roles and status scales such as `text-foreground`,
|
|
196
|
+
`bg-sidebar`, `text-code-foreground`, `bg-success-100`, `bg-info-100`,
|
|
197
|
+
`bg-warning-100`, and `bg-error-100`.
|
|
198
|
+
|
|
199
|
+
For apps that switch Blue/Coral while running, use `NativeWindThemeProvider`
|
|
200
|
+
instead of `ThemeProvider`. It keeps `useTheme()` and descendant NativeWind
|
|
201
|
+
classes on the same generated variable record:
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
import {
|
|
205
|
+
NativeWindThemeProvider,
|
|
206
|
+
type ThemeMode,
|
|
207
|
+
type ThemeVariant,
|
|
208
|
+
} from '@indra-inter/neobrutalism-components';
|
|
209
|
+
import { useState, type PropsWithChildren } from 'react';
|
|
196
210
|
|
|
197
|
-
|
|
198
|
-
|
|
211
|
+
function AppTheme({ children }: PropsWithChildren) {
|
|
212
|
+
const [mode] = useState<ThemeMode>('dark');
|
|
213
|
+
const [variant] = useState<ThemeVariant>('coral');
|
|
214
|
+
|
|
215
|
+
return (
|
|
216
|
+
<NativeWindThemeProvider mode={mode} variant={variant}>
|
|
217
|
+
{children}
|
|
218
|
+
</NativeWindThemeProvider>
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The selected family changes all semantic classes together. For example:
|
|
224
|
+
|
|
225
|
+
```tsx
|
|
226
|
+
<View className="bg-success-100 border-success-300" />
|
|
227
|
+
<View className="bg-info-100 border-info-300" />
|
|
228
|
+
<View className="bg-warning-100 border-warning-300" />
|
|
229
|
+
<View className="bg-error-100 border-error-300" />
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
For advanced integrations that need the namespaced `--neo-*` variables
|
|
233
|
+
directly, import `tokens.css` instead:
|
|
199
234
|
|
|
200
235
|
```css
|
|
201
236
|
@import '@indra-inter/neobrutalism-components/tokens.css';
|
|
@@ -203,6 +238,10 @@ the namespaced `--neo-*` variables directly:
|
|
|
203
238
|
|
|
204
239
|
## Components
|
|
205
240
|
|
|
241
|
+
Each section documents the decision-making props and a focused example. The
|
|
242
|
+
exported TypeScript props remain the complete source of truth for optional
|
|
243
|
+
style slots and platform-native props.
|
|
244
|
+
|
|
206
245
|
| Group | Components |
|
|
207
246
|
| --- | --- |
|
|
208
247
|
| Foundation | `Button`, `IconButton`, `Badge`, `Card`, `Avatar` |
|
|
@@ -214,7 +253,7 @@ the namespaced `--neo-*` variables directly:
|
|
|
214
253
|
|
|
215
254
|
```tsx
|
|
216
255
|
import { Text } from 'react-native';
|
|
217
|
-
import { Button } from 'neobrutalism-components';
|
|
256
|
+
import { Button } from '@indra-inter/neobrutalism-components';
|
|
218
257
|
|
|
219
258
|
<Button
|
|
220
259
|
accessibilityLabel="Continue"
|
|
@@ -229,7 +268,7 @@ import { Button } from 'neobrutalism-components';
|
|
|
229
268
|
|
|
230
269
|
| Key prop | Description |
|
|
231
270
|
| --- | --- |
|
|
232
|
-
| `variant` | `primary`, `secondary`, `ghost`, `outline`, `destructive`, `warning`, `success`,
|
|
271
|
+
| `variant` | `primary`, `secondary`, `ghost`, `outline`, `destructive`, `warning`, `success`, or `info`. |
|
|
233
272
|
| `size` | `sm`, `md` (default), or `lg`. |
|
|
234
273
|
| `radius` | Overrides the theme border radius. |
|
|
235
274
|
| `rounded` | `rounded` (default) uses the theme radius; `sharp` sets the surface radius to `0`. An explicit `radius` takes precedence. |
|
|
@@ -250,7 +289,7 @@ other icon-first actions. The application supplies the icon and behavior.
|
|
|
250
289
|
|
|
251
290
|
```tsx
|
|
252
291
|
import { MicOff, PhoneOff } from 'lucide-react-native';
|
|
253
|
-
import { IconButton } from 'neobrutalism-components';
|
|
292
|
+
import { IconButton } from '@indra-inter/neobrutalism-components';
|
|
254
293
|
|
|
255
294
|
<IconButton
|
|
256
295
|
accessibilityLabel="Mute microphone"
|
|
@@ -275,7 +314,7 @@ import { IconButton } from 'neobrutalism-components';
|
|
|
275
314
|
| `variant` | `default`, `primary`, or `destructive`. |
|
|
276
315
|
| `size` | Side length of the icon surface; defaults to `60`. |
|
|
277
316
|
| `rounded` / `radius` | `rounded` uses the theme radius, `sharp` uses `0`; an explicit `radius` takes precedence. |
|
|
278
|
-
| `shadow` / `
|
|
317
|
+
| `shadow` / `shadowVariant` | Hard shadow is enabled by default. Disable it or select a semantic Neo shadow color when needed. |
|
|
279
318
|
|
|
280
319
|
### ListItem
|
|
281
320
|
|
|
@@ -285,7 +324,7 @@ data mapping remain in the consuming application.
|
|
|
285
324
|
```tsx
|
|
286
325
|
import { useState } from 'react';
|
|
287
326
|
import { Text } from 'react-native';
|
|
288
|
-
import { Avatar, ListItem, Switch } from 'neobrutalism-components';
|
|
327
|
+
import { Avatar, ListItem, Switch } from '@indra-inter/neobrutalism-components';
|
|
289
328
|
|
|
290
329
|
const [notificationsEnabled, setNotificationsEnabled] = useState(true);
|
|
291
330
|
|
|
@@ -343,7 +382,7 @@ sections. It has no shadow or border of its own, and uses `theme.border.color`
|
|
|
343
382
|
at one pixel by default.
|
|
344
383
|
|
|
345
384
|
```tsx
|
|
346
|
-
import { Divider } from 'neobrutalism-components';
|
|
385
|
+
import { Divider } from '@indra-inter/neobrutalism-components';
|
|
347
386
|
|
|
348
387
|
<Divider />
|
|
349
388
|
<Divider inset="md" />
|
|
@@ -363,7 +402,7 @@ message preview, and an unread counter. Data mapping, navigation, avatar choice,
|
|
|
363
402
|
and selection state stay in the app.
|
|
364
403
|
|
|
365
404
|
```tsx
|
|
366
|
-
import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
405
|
+
import { Avatar, ChatListItem } from '@indra-inter/neobrutalism-components';
|
|
367
406
|
|
|
368
407
|
<ChatListItem
|
|
369
408
|
leading={<Avatar initials="AK" size="md" />}
|
|
@@ -374,7 +413,7 @@ import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
|
374
413
|
state="unread"
|
|
375
414
|
timestamp="10:11"
|
|
376
415
|
title="Ariana Kim"
|
|
377
|
-
unreadBadgeProps={{ radius: 8,
|
|
416
|
+
unreadBadgeProps={{ radius: 8, shadowVariant: 'primary' }}
|
|
378
417
|
unreadCount={2}
|
|
379
418
|
/>
|
|
380
419
|
```
|
|
@@ -386,7 +425,7 @@ import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
|
386
425
|
| `leading` / `leadingStyle` | Optional avatar or custom 40px leading content, with a style override. |
|
|
387
426
|
| `title`, `message`, `timestamp` | Required consumer-owned chat content. |
|
|
388
427
|
| `titleNumberOfLines`, `messageNumberOfLines`, `timestampNumberOfLines` | Per-field truncation limits. The default title limit is `1` (`2` for `request`), while message and timestamp default to `1`. |
|
|
389
|
-
| `unreadBadgeProps` | Optional `Badge` props for the unread counter, such as `radius`, `rounded`, `shadow`, and `
|
|
428
|
+
| `unreadBadgeProps` | Optional `Badge` props for the unread counter, such as `radius`, `rounded`, `shadow`, and `shadowVariant`. |
|
|
390
429
|
| `divider`, `onPress`, `onLongPress`, `disabled` | Row behavior and section composition. `onLongPress` is useful for consumer-owned multiselect flows. |
|
|
391
430
|
|
|
392
431
|
### CallItem
|
|
@@ -396,7 +435,7 @@ provides its avatar, phone/video icon, copy, and interaction.
|
|
|
396
435
|
|
|
397
436
|
```tsx
|
|
398
437
|
import { Phone } from 'lucide-react-native';
|
|
399
|
-
import { Avatar, CallItem } from 'neobrutalism-components';
|
|
438
|
+
import { Avatar, CallItem } from '@indra-inter/neobrutalism-components';
|
|
400
439
|
|
|
401
440
|
<CallItem
|
|
402
441
|
detail="Incoming · 5:23"
|
|
@@ -418,21 +457,21 @@ import { Avatar, CallItem } from 'neobrutalism-components';
|
|
|
418
457
|
### Badge
|
|
419
458
|
|
|
420
459
|
```tsx
|
|
421
|
-
import { Badge } from 'neobrutalism-components';
|
|
460
|
+
import { Badge } from '@indra-inter/neobrutalism-components';
|
|
422
461
|
|
|
423
|
-
<Badge size="md"
|
|
462
|
+
<Badge size="md" variant="success">Published</Badge>
|
|
424
463
|
|
|
425
|
-
<Badge className="min-h-8 px-2" shadow={false} size="md"
|
|
464
|
+
<Badge className="min-h-8 px-2" shadow={false} size="md" variant="primary">
|
|
426
465
|
Category
|
|
427
466
|
</Badge>
|
|
428
467
|
```
|
|
429
468
|
|
|
430
469
|
| Key prop | Description |
|
|
431
470
|
| --- | --- |
|
|
432
|
-
| `
|
|
471
|
+
| `variant` | `default`, `primary`, `info`, `error`, `warning`, or `success`. |
|
|
433
472
|
| `size` | `sm` or `md`. |
|
|
434
473
|
| `radius` / `rounded` | `radius` has priority; otherwise `rounded` is `rounded` (default) or `sharp`. |
|
|
435
|
-
| `shadow` / `
|
|
474
|
+
| `shadow` / `shadowVariant` | Show or hide the hard shadow, and select its semantic Neo color. |
|
|
436
475
|
| `className` | NativeWind classes mapped to the Badge visual style surface. |
|
|
437
476
|
| `leadingIcon` | Optional icon before the badge label. |
|
|
438
477
|
|
|
@@ -442,7 +481,7 @@ import { Badge } from 'neobrutalism-components';
|
|
|
442
481
|
application or backend.
|
|
443
482
|
|
|
444
483
|
```tsx
|
|
445
|
-
import { Progress } from 'neobrutalism-components';
|
|
484
|
+
import { Progress } from '@indra-inter/neobrutalism-components';
|
|
446
485
|
|
|
447
486
|
<Progress value={75} />
|
|
448
487
|
|
|
@@ -475,7 +514,7 @@ and text blocks. It uses a lightweight native opacity pulse and requires no
|
|
|
475
514
|
additional animation or gradient dependency.
|
|
476
515
|
|
|
477
516
|
```tsx
|
|
478
|
-
import { Skeleton } from 'neobrutalism-components';
|
|
517
|
+
import { Skeleton } from '@indra-inter/neobrutalism-components';
|
|
479
518
|
|
|
480
519
|
<Skeleton type="chat" />
|
|
481
520
|
|
|
@@ -488,7 +527,7 @@ import { Skeleton } from 'neobrutalism-components';
|
|
|
488
527
|
| --- | --- |
|
|
489
528
|
| `type` | `textBlock` (default), `list`, or `chat`. Each renders the corresponding Figma placeholder layout. |
|
|
490
529
|
| `rounded` / `radius` | `sharp` is the default; `rounded` uses the theme radius. An explicit `radius` takes precedence. |
|
|
491
|
-
| `shadow` / `
|
|
530
|
+
| `shadow` / `shadowVariant` / `shadowOffset` | Hard shadow is on by default. Select its semantic Neo color or override its right-and-bottom offset as needed. |
|
|
492
531
|
| `animated` / `animationDuration` | Enables the native opacity pulse by default. Set `animated={false}` for static loading states. |
|
|
493
532
|
| `style` | Styles the outer preset container, such as its width or placement. |
|
|
494
533
|
|
|
@@ -504,7 +543,7 @@ exchange JavaScript `Date` objects with the consuming application.
|
|
|
504
543
|
|
|
505
544
|
```tsx
|
|
506
545
|
import { useState } from 'react';
|
|
507
|
-
import { Calendar, type CalendarRangeValue } from 'neobrutalism-components';
|
|
546
|
+
import { Calendar, type CalendarRangeValue } from '@indra-inter/neobrutalism-components';
|
|
508
547
|
|
|
509
548
|
const [date, setDate] = useState<string | undefined>('2026-08-31');
|
|
510
549
|
const [range, setRange] = useState<CalendarRangeValue | undefined>({
|
|
@@ -548,7 +587,7 @@ the consuming application.
|
|
|
548
587
|
|
|
549
588
|
```tsx
|
|
550
589
|
import { Text } from 'react-native';
|
|
551
|
-
import { Accordion } from 'neobrutalism-components';
|
|
590
|
+
import { Accordion } from '@indra-inter/neobrutalism-components';
|
|
552
591
|
|
|
553
592
|
<Accordion
|
|
554
593
|
defaultValue="overview"
|
|
@@ -586,7 +625,6 @@ Use `type="multiple"` when several sections may remain open:
|
|
|
586
625
|
| `value` / `defaultValue` / `onValueChange` | Controlled or uncontrolled expanded state. Single mode uses a string or `null`; multiple mode uses a string array. |
|
|
587
626
|
| `collapsible` | Defaults to `true`; set `false` to keep the expanded item open in single mode. |
|
|
588
627
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`; it applies to expanded sections only. |
|
|
589
|
-
| `shadowColor` | Direct hard-shadow override; takes precedence over `shadowVariant`. |
|
|
590
628
|
| Style props | `containerStyle`, `style`, `headerStyle`, `contentStyle`, and `titleStyle`. |
|
|
591
629
|
|
|
592
630
|
Expanded headers use the current theme's `primaryHover` color. The chevron,
|
|
@@ -597,7 +635,7 @@ border, hard shadow, and disabled state are package-managed.
|
|
|
597
635
|
```tsx
|
|
598
636
|
import { useState } from 'react';
|
|
599
637
|
import { Text } from 'react-native';
|
|
600
|
-
import { Input } from 'neobrutalism-components';
|
|
638
|
+
import { Input } from '@indra-inter/neobrutalism-components';
|
|
601
639
|
|
|
602
640
|
const [email, setEmail] = useState('');
|
|
603
641
|
|
|
@@ -635,7 +673,7 @@ high by default and aligns text at the top.
|
|
|
635
673
|
|
|
636
674
|
```tsx
|
|
637
675
|
import { useState } from 'react';
|
|
638
|
-
import { TextArea } from 'neobrutalism-components';
|
|
676
|
+
import { TextArea } from '@indra-inter/neobrutalism-components';
|
|
639
677
|
|
|
640
678
|
export function BioField() {
|
|
641
679
|
const [bio, setBio] = useState('');
|
|
@@ -670,7 +708,7 @@ surface. Visibility can be controlled by the app or managed internally.
|
|
|
670
708
|
|
|
671
709
|
```tsx
|
|
672
710
|
import { useState } from 'react';
|
|
673
|
-
import { PasswordInput } from 'neobrutalism-components';
|
|
711
|
+
import { PasswordInput } from '@indra-inter/neobrutalism-components';
|
|
674
712
|
|
|
675
713
|
const [password, setPassword] = useState('');
|
|
676
714
|
|
|
@@ -697,7 +735,7 @@ const [password, setPassword] = useState('');
|
|
|
697
735
|
segment without requiring the consuming app to compose it manually.
|
|
698
736
|
|
|
699
737
|
```tsx
|
|
700
|
-
import { UrlInput } from 'neobrutalism-components';
|
|
738
|
+
import { UrlInput } from '@indra-inter/neobrutalism-components';
|
|
701
739
|
|
|
702
740
|
<UrlInput
|
|
703
741
|
label="Website"
|
|
@@ -720,7 +758,7 @@ import { UrlInput } from 'neobrutalism-components';
|
|
|
720
758
|
defaults. The app owns country selection and phone-number validation.
|
|
721
759
|
|
|
722
760
|
```tsx
|
|
723
|
-
import { PhoneInput } from 'neobrutalism-components';
|
|
761
|
+
import { PhoneInput } from '@indra-inter/neobrutalism-components';
|
|
724
762
|
|
|
725
763
|
<PhoneInput
|
|
726
764
|
country={{ dialCode: '+62', isoCode: 'ID' }}
|
|
@@ -745,7 +783,7 @@ segments. Values are intentionally unformatted so the consuming app can apply
|
|
|
745
783
|
its own locale, decimal, and submission rules.
|
|
746
784
|
|
|
747
785
|
```tsx
|
|
748
|
-
import { CurrencyInput } from 'neobrutalism-components';
|
|
786
|
+
import { CurrencyInput } from '@indra-inter/neobrutalism-components';
|
|
749
787
|
|
|
750
788
|
<CurrencyInput
|
|
751
789
|
currencyCode="IDR"
|
|
@@ -771,7 +809,7 @@ paste behavior on iOS and Android.
|
|
|
771
809
|
|
|
772
810
|
```tsx
|
|
773
811
|
import { useState } from 'react';
|
|
774
|
-
import { OtpInput } from 'neobrutalism-components';
|
|
812
|
+
import { OtpInput } from '@indra-inter/neobrutalism-components';
|
|
775
813
|
|
|
776
814
|
const [code, setCode] = useState('');
|
|
777
815
|
|
|
@@ -809,10 +847,9 @@ import {
|
|
|
809
847
|
CardFooter,
|
|
810
848
|
CardHeader,
|
|
811
849
|
CardTitle,
|
|
812
|
-
} from 'neobrutalism-components';
|
|
850
|
+
} from '@indra-inter/neobrutalism-components';
|
|
813
851
|
|
|
814
852
|
<Card
|
|
815
|
-
backgroundColor="#FFFFFF"
|
|
816
853
|
radius={{ topLeft: 16, topRight: 16, bottomLeft: 0, bottomRight: 0 }}
|
|
817
854
|
shadowVariant="primary">
|
|
818
855
|
<CardHeader>
|
|
@@ -830,10 +867,9 @@ import {
|
|
|
830
867
|
|
|
831
868
|
| Key prop | Description |
|
|
832
869
|
| --- | --- |
|
|
833
|
-
| `backgroundColor` |
|
|
870
|
+
| `backgroundColor` | Explicit runtime override for the theme surface. Prefer `className`, `style`, or a semantic theme token when the color is known ahead of time. |
|
|
834
871
|
| `radius` | A number or corner object with `topLeft`, `topRight`, `bottomRight`, and `bottomLeft`. |
|
|
835
872
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. |
|
|
836
|
-
| `shadowColor` | Direct hard-shadow override; takes precedence over `shadowVariant`. |
|
|
837
873
|
| `contentStyle` | Overrides the default content layout, for example `{{ padding: 0 }}` for full-bleed list rows. |
|
|
838
874
|
| `containerStyle` / `style` | Styles for the shadow wrapper or card surface. |
|
|
839
875
|
| `containerClassName` / `className` / `contentClassName` | NativeWind equivalents for `containerStyle`, `style`, and `contentStyle`; `contentClassName` is applied last. |
|
|
@@ -841,7 +877,7 @@ import {
|
|
|
841
877
|
### Avatar
|
|
842
878
|
|
|
843
879
|
```tsx
|
|
844
|
-
import { Avatar } from 'neobrutalism-components';
|
|
880
|
+
import { Avatar } from '@indra-inter/neobrutalism-components';
|
|
845
881
|
|
|
846
882
|
<Avatar initials="AK" size="md" />
|
|
847
883
|
<Avatar size="lg" source={{ uri: profileUri }} variant="image" />
|
|
@@ -856,17 +892,17 @@ import { Avatar } from 'neobrutalism-components';
|
|
|
856
892
|
| `source` | Native `ImageSourcePropType` for the `image` variant. |
|
|
857
893
|
| `showAdd` | Shows the add indicator for `md`, `lg`, and `xl` avatars. |
|
|
858
894
|
| `rounded` | `rounded` (default) uses the theme radius; `sharp` makes the avatar square. |
|
|
859
|
-
| `shadow` / `
|
|
895
|
+
| `shadow` / `shadowVariant` | Show or hide the hard shadow, and select its semantic Neo color. |
|
|
860
896
|
|
|
861
897
|
### AppBar
|
|
862
898
|
|
|
863
899
|
`AppBar` supplies the screen-header surface; navigation and every interactive
|
|
864
900
|
slot remain owned by the consuming application. Keep the application wrapped
|
|
865
|
-
with `SafeAreaProvider` as shown in [
|
|
901
|
+
with `SafeAreaProvider` as shown in [App providers](#app-providers).
|
|
866
902
|
|
|
867
903
|
```tsx
|
|
868
904
|
import { Text } from 'react-native';
|
|
869
|
-
import { AppBar, Avatar, Checkbox, Tabs } from 'neobrutalism-components';
|
|
905
|
+
import { AppBar, Avatar, Checkbox, Tabs } from '@indra-inter/neobrutalism-components';
|
|
870
906
|
|
|
871
907
|
<AppBar>
|
|
872
908
|
<AppBar.Content
|
|
@@ -888,12 +924,12 @@ inset or when the bar intentionally overlays screen content. Use
|
|
|
888
924
|
negative values are clamped at zero:
|
|
889
925
|
|
|
890
926
|
```tsx
|
|
891
|
-
<AppBar
|
|
927
|
+
<AppBar safeArea={false}>
|
|
892
928
|
<AppBar.Content title="Select items" trailing={<Text>2 selected</Text>} />
|
|
893
929
|
</AppBar>
|
|
894
930
|
```
|
|
895
931
|
|
|
896
|
-
Use `
|
|
932
|
+
Use `layout="select"` for a bulk-selection header. The selection count stays in
|
|
897
933
|
the flexible title slot, while the select-all control stays pinned to the right:
|
|
898
934
|
|
|
899
935
|
```tsx
|
|
@@ -910,7 +946,7 @@ the flexible title slot, while the select-all control stays pinned to the right:
|
|
|
910
946
|
style={{ width: 106 }}
|
|
911
947
|
/>
|
|
912
948
|
}
|
|
913
|
-
|
|
949
|
+
layout="select"
|
|
914
950
|
/>
|
|
915
951
|
</AppBar>
|
|
916
952
|
```
|
|
@@ -919,7 +955,7 @@ the flexible title slot, while the select-all control stays pinned to the right:
|
|
|
919
955
|
| --- | --- |
|
|
920
956
|
| `safeArea` | Defaults to `true`; applies the top device inset through `SafeAreaProvider`. |
|
|
921
957
|
| `safeAreaOffset` | Adds to the top inset when `safeArea` is enabled. Defaults to `0`; the final inset never becomes negative. |
|
|
922
|
-
| `backgroundColor` |
|
|
958
|
+
| `backgroundColor` | Explicit runtime override for the default primary surface. Prefer a semantic theme token when the color is known ahead of time. |
|
|
923
959
|
| `variant` | `default` (default) or `select`. `select` matches the compact bottom padding of Figma's selection header. |
|
|
924
960
|
| `leading` / `avatar` / `trailing` | Consumer-owned React-node slots in `AppBar.Content`. Supply accessible pressable controls for actions. |
|
|
925
961
|
| `title` / `subtitle` | String or number values receive theme text styling and truncate safely to one line; custom React nodes remain unchanged. |
|
|
@@ -932,7 +968,7 @@ These controls are controlled by their value props and callbacks.
|
|
|
932
968
|
|
|
933
969
|
```tsx
|
|
934
970
|
import { useState } from 'react';
|
|
935
|
-
import { Checkbox, Radio, Switch } from 'neobrutalism-components';
|
|
971
|
+
import { Checkbox, Radio, Switch } from '@indra-inter/neobrutalism-components';
|
|
936
972
|
|
|
937
973
|
const [accepted, setAccepted] = useState(false);
|
|
938
974
|
const [plan, setPlan] = useState<'standard' | 'express'>('standard');
|
|
@@ -974,7 +1010,7 @@ screen content in the consuming application.
|
|
|
974
1010
|
```tsx
|
|
975
1011
|
import { useState } from 'react';
|
|
976
1012
|
import { Text } from 'react-native';
|
|
977
|
-
import { Badge, Tabs, type TabItem } from 'neobrutalism-components';
|
|
1013
|
+
import { Badge, Tabs, type TabItem } from '@indra-inter/neobrutalism-components';
|
|
978
1014
|
|
|
979
1015
|
const items: readonly TabItem[] = [
|
|
980
1016
|
{ label: 'Overview', value: 'overview' },
|
|
@@ -1034,7 +1070,7 @@ and navigation calls in the consuming application.
|
|
|
1034
1070
|
```tsx
|
|
1035
1071
|
import { useState } from 'react';
|
|
1036
1072
|
import { Text } from 'react-native';
|
|
1037
|
-
import { BottomNavigation } from 'neobrutalism-components';
|
|
1073
|
+
import { BottomNavigation } from '@indra-inter/neobrutalism-components';
|
|
1038
1074
|
|
|
1039
1075
|
export function AppNavigation() {
|
|
1040
1076
|
const [tab, setTab] = useState('chats');
|
|
@@ -1043,7 +1079,7 @@ export function AppNavigation() {
|
|
|
1043
1079
|
<BottomNavigation
|
|
1044
1080
|
items={[
|
|
1045
1081
|
{
|
|
1046
|
-
activeIcon: <Text
|
|
1082
|
+
activeIcon: <Text>●</Text>,
|
|
1047
1083
|
icon: <Text>○</Text>,
|
|
1048
1084
|
label: 'Chats',
|
|
1049
1085
|
value: 'chats',
|
|
@@ -1068,7 +1104,6 @@ export function AppNavigation() {
|
|
|
1068
1104
|
| `indicatorRadius` | Radius for the selected tab's bottom indicator. Defaults to `0` for the square Figma treatment. |
|
|
1069
1105
|
| `shadow` | Enables the hard shadow; defaults to `true`. Use `false` for a flat navigation surface. |
|
|
1070
1106
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. It defaults to `primary` to match the Figma navigation shadow. |
|
|
1071
|
-
| `shadowColor` | Direct hard-shadow override. It takes precedence over `shadowVariant`. |
|
|
1072
1107
|
| `containerStyle` / `style` / `contentStyle` | Style the outer wrapper, safe-area surface, or bordered navigation row. |
|
|
1073
1108
|
|
|
1074
1109
|
Each item exposes the native `tab` role with selected and disabled state. Use
|
|
@@ -1082,7 +1117,7 @@ Use `Dropdown` for value selection. `single` is the default; use
|
|
|
1082
1117
|
|
|
1083
1118
|
```tsx
|
|
1084
1119
|
import { useState } from 'react';
|
|
1085
|
-
import { Dropdown } from 'neobrutalism-components';
|
|
1120
|
+
import { Dropdown } from '@indra-inter/neobrutalism-components';
|
|
1086
1121
|
|
|
1087
1122
|
const [team, setTeam] = useState<string>();
|
|
1088
1123
|
|
|
@@ -1104,7 +1139,7 @@ the application and provide mapper callbacks instead of reshaping every
|
|
|
1104
1139
|
response into UI data first.
|
|
1105
1140
|
|
|
1106
1141
|
```tsx
|
|
1107
|
-
import { Avatar, Dropdown } from 'neobrutalism-components';
|
|
1142
|
+
import { Avatar, Dropdown } from '@indra-inter/neobrutalism-components';
|
|
1108
1143
|
|
|
1109
1144
|
type Team = {
|
|
1110
1145
|
avatarUri?: string;
|
|
@@ -1168,7 +1203,7 @@ const [teamIds, setTeamIds] = useState<readonly string[]>([]);
|
|
|
1168
1203
|
`DropdownMenu` is an action menu, not a value-select control.
|
|
1169
1204
|
|
|
1170
1205
|
```tsx
|
|
1171
|
-
import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
1206
|
+
import { Button, DropdownMenu } from '@indra-inter/neobrutalism-components';
|
|
1172
1207
|
|
|
1173
1208
|
<DropdownMenu
|
|
1174
1209
|
align="end"
|
|
@@ -1190,7 +1225,6 @@ import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
|
1190
1225
|
| `side` / `sideOffset` | Menu side (`top` or `bottom`) and gap from its trigger. Defaults to `bottom` and `6`. |
|
|
1191
1226
|
| `shadow` | Enables the neobrutalist shadow. Defaults to `true`. |
|
|
1192
1227
|
| `shadowVariant` | Shadow color token: `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. |
|
|
1193
|
-
| `shadowColor` | Explicit shadow color. Takes precedence over `shadowVariant`. |
|
|
1194
1228
|
| `shadowOffset` | Right-and-bottom shadow thickness. Defaults to the theme shadow offset. |
|
|
1195
1229
|
| `children` | One trigger element, usually a `Button`. |
|
|
1196
1230
|
|
|
@@ -1199,7 +1233,7 @@ import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
|
1199
1233
|
Use `useToast` inside `ToastProvider` for application notifications.
|
|
1200
1234
|
|
|
1201
1235
|
```tsx
|
|
1202
|
-
import { Button, useToast } from 'neobrutalism-components';
|
|
1236
|
+
import { Button, useToast } from '@indra-inter/neobrutalism-components';
|
|
1203
1237
|
|
|
1204
1238
|
export function SaveButton() {
|
|
1205
1239
|
const { show } = useToast();
|
|
@@ -1231,7 +1265,7 @@ export function SaveButton() {
|
|
|
1231
1265
|
`onOpenChange`.
|
|
1232
1266
|
|
|
1233
1267
|
```tsx
|
|
1234
|
-
import { Toast } from 'neobrutalism-components';
|
|
1268
|
+
import { Toast } from '@indra-inter/neobrutalism-components';
|
|
1235
1269
|
|
|
1236
1270
|
<Toast
|
|
1237
1271
|
description="Your changes have been saved successfully."
|
|
@@ -1255,7 +1289,7 @@ import {
|
|
|
1255
1289
|
DialogBody,
|
|
1256
1290
|
DialogFooter,
|
|
1257
1291
|
DialogHeader,
|
|
1258
|
-
} from 'neobrutalism-components';
|
|
1292
|
+
} from '@indra-inter/neobrutalism-components';
|
|
1259
1293
|
|
|
1260
1294
|
const [open, setOpen] = useState(false);
|
|
1261
1295
|
|
|
@@ -1273,7 +1307,7 @@ const [open, setOpen] = useState(false);
|
|
|
1273
1307
|
```
|
|
1274
1308
|
|
|
1275
1309
|
```tsx
|
|
1276
|
-
import { ConfirmDialog } from 'neobrutalism-components';
|
|
1310
|
+
import { ConfirmDialog } from '@indra-inter/neobrutalism-components';
|
|
1277
1311
|
|
|
1278
1312
|
<ConfirmDialog
|
|
1279
1313
|
confirmLabel="Delete"
|
|
@@ -1299,7 +1333,7 @@ screen header that also needs to be cleared.
|
|
|
1299
1333
|
|
|
1300
1334
|
```tsx
|
|
1301
1335
|
import { useState } from 'react';
|
|
1302
|
-
import { Button, BottomSheet, BottomSheetBody, BottomSheetFooter, BottomSheetHeader } from 'neobrutalism-components';
|
|
1336
|
+
import { Button, BottomSheet, BottomSheetBody, BottomSheetFooter, BottomSheetHeader } from '@indra-inter/neobrutalism-components';
|
|
1303
1337
|
|
|
1304
1338
|
const [open, setOpen] = useState(false);
|
|
1305
1339
|
|
|
@@ -1310,7 +1344,8 @@ const [open, setOpen] = useState(false);
|
|
|
1310
1344
|
animationDuration={220}
|
|
1311
1345
|
onOpenChange={setOpen}
|
|
1312
1346
|
open={open}
|
|
1313
|
-
|
|
1347
|
+
rounded="rounded"
|
|
1348
|
+
shadowVariant="primary">
|
|
1314
1349
|
<BottomSheetHeader title="Update profile" />
|
|
1315
1350
|
<BottomSheetBody>{/* Application-owned form content */}</BottomSheetBody>
|
|
1316
1351
|
<BottomSheetFooter>
|
|
@@ -1326,26 +1361,7 @@ const [open, setOpen] = useState(false);
|
|
|
1326
1361
|
| `open` / `onOpenChange` | Controlled visibility. Tapping the backdrop invokes `onOpenChange(false)`. |
|
|
1327
1362
|
| `animation` | `slide` (default) or `none`. |
|
|
1328
1363
|
| `animationDuration` | Open and close duration in milliseconds; defaults to `220`. |
|
|
1329
|
-
| `radius` |
|
|
1330
|
-
| `shadow` |
|
|
1364
|
+
| `rounded` / `radius` | Controls the two top corner radii. `rounded` uses the Neo shape presets; numeric `radius` takes precedence. |
|
|
1365
|
+
| `shadow` / `shadowVariant` | Controls elevation. Shadow is enabled by default; set `shadow={false}` for a flat sheet or choose a semantic color role. |
|
|
1331
1366
|
| `bottomPadding` | Overrides the safe-area spacing below the sheet content. |
|
|
1332
1367
|
| `keyboardVerticalOffset` | Header offset for keyboard positioning; defaults to `0`. |
|
|
1333
|
-
|
|
1334
|
-
## Local Development and Publishing
|
|
1335
|
-
|
|
1336
|
-
The package currently resolves directly to `src/index.ts` and has
|
|
1337
|
-
`"private": true` in `package.json`; this is deliberate for local iteration.
|
|
1338
|
-
|
|
1339
|
-
Before publishing to npm, add an intentional release configuration that:
|
|
1340
|
-
|
|
1341
|
-
1. builds JavaScript output rather than shipping TypeScript source only;
|
|
1342
|
-
2. emits `.d.ts` declaration files and points `types`/`exports` to them;
|
|
1343
|
-
3. removes `private`, chooses a version, and verifies the npm tarball; and
|
|
1344
|
-
4. documents the supported React Native and Expo ranges for that release.
|
|
1345
|
-
|
|
1346
|
-
Until then, consume the package through the local file dependency and run the
|
|
1347
|
-
package typecheck after API changes:
|
|
1348
|
-
|
|
1349
|
-
```bash
|
|
1350
|
-
pnpm run typecheck
|
|
1351
|
-
```
|