@indra-inter/neobrutalism-components 0.1.4 → 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 +98 -127
- 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.map +1 -1
- package/dist/module/theme/design-tokens.generated.js +5 -5
- package/dist/module/theme/design-tokens.generated.js.map +1 -1
- package/dist/module/theme/nativewind-tokens.generated.js +4 -4
- package/dist/module/theme/nativewind-tokens.generated.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 +9 -9
- package/dist/typescript/index.d.ts.map +1 -1
- package/dist/typescript/theme/design-tokens.generated.d.ts +5 -5
- package/dist/typescript/theme/nativewind-tokens.generated.d.ts +4 -4
- package/nativewind.css +2 -2
- package/package.json +3 -1
- 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
|
|
84
|
+
<Avatar variant="image" source={photo} />
|
|
75
85
|
```
|
|
76
86
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
`
|
|
80
|
-
|
|
81
|
-
`DropdownMenu.variant` → `DropdownMenu.mode`. If both values are supplied,
|
|
82
|
-
the canonical prop takes precedence.
|
|
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.
|
|
83
91
|
|
|
84
|
-
##
|
|
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
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
See [`example/README.md`](./example/README.md) for the local workflow and
|
|
99
|
-
validation commands.
|
|
100
|
-
|
|
101
|
-
## Setup
|
|
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,9 +122,9 @@ export function AppProviders({ children }: PropsWithChildren) {
|
|
|
131
122
|
|
|
132
123
|
## Theming
|
|
133
124
|
|
|
134
|
-
`ThemeProvider` supports `light` and `dark` modes plus
|
|
135
|
-
|
|
136
|
-
|
|
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.
|
|
137
128
|
|
|
138
129
|
```tsx
|
|
139
130
|
import { useState } from 'react';
|
|
@@ -142,7 +133,7 @@ import {
|
|
|
142
133
|
ThemeProvider,
|
|
143
134
|
type ThemeMode,
|
|
144
135
|
type ThemeVariant,
|
|
145
|
-
} from 'neobrutalism-components';
|
|
136
|
+
} from '@indra-inter/neobrutalism-components';
|
|
146
137
|
|
|
147
138
|
export function ThemeExample() {
|
|
148
139
|
const [mode, setMode] = useState<ThemeMode>('light');
|
|
@@ -166,7 +157,7 @@ tokens:
|
|
|
166
157
|
|
|
167
158
|
```tsx
|
|
168
159
|
import { Text, View } from 'react-native';
|
|
169
|
-
import { useTheme } from 'neobrutalism-components';
|
|
160
|
+
import { useTheme } from '@indra-inter/neobrutalism-components';
|
|
170
161
|
|
|
171
162
|
export function ThemedPanel() {
|
|
172
163
|
const theme = useTheme();
|
|
@@ -186,25 +177,24 @@ For example, `createTheme('dark', 'coral')` returns the same palette used by
|
|
|
186
177
|
|
|
187
178
|
### Figma token workflow
|
|
188
179
|
|
|
189
|
-
Figma exports are versioned in [`tokens/figma/`](./tokens/figma).
|
|
190
|
-
the
|
|
191
|
-
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:
|
|
192
182
|
|
|
193
183
|
```bash
|
|
194
184
|
pnpm generate:design-tokens
|
|
195
185
|
pnpm test:design-tokens
|
|
196
186
|
```
|
|
197
187
|
|
|
198
|
-
For
|
|
199
|
-
|
|
188
|
+
For NativeWind semantic utilities, import the generated stylesheet once in the
|
|
189
|
+
consuming application's global CSS:
|
|
200
190
|
|
|
201
191
|
```css
|
|
202
192
|
@import '@indra-inter/neobrutalism-components/nativewind.css';
|
|
203
193
|
```
|
|
204
194
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
`bg-
|
|
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`.
|
|
208
198
|
|
|
209
199
|
For apps that switch Blue/Coral while running, use `NativeWindThemeProvider`
|
|
210
200
|
instead of `ThemeProvider`. It keeps `useTheme()` and descendant NativeWind
|
|
@@ -239,8 +229,8 @@ The selected family changes all semantic classes together. For example:
|
|
|
239
229
|
<View className="bg-error-100 border-error-300" />
|
|
240
230
|
```
|
|
241
231
|
|
|
242
|
-
|
|
243
|
-
|
|
232
|
+
For advanced integrations that need the namespaced `--neo-*` variables
|
|
233
|
+
directly, import `tokens.css` instead:
|
|
244
234
|
|
|
245
235
|
```css
|
|
246
236
|
@import '@indra-inter/neobrutalism-components/tokens.css';
|
|
@@ -248,6 +238,10 @@ the namespaced `--neo-*` variables directly:
|
|
|
248
238
|
|
|
249
239
|
## Components
|
|
250
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
|
+
|
|
251
245
|
| Group | Components |
|
|
252
246
|
| --- | --- |
|
|
253
247
|
| Foundation | `Button`, `IconButton`, `Badge`, `Card`, `Avatar` |
|
|
@@ -259,7 +253,7 @@ the namespaced `--neo-*` variables directly:
|
|
|
259
253
|
|
|
260
254
|
```tsx
|
|
261
255
|
import { Text } from 'react-native';
|
|
262
|
-
import { Button } from 'neobrutalism-components';
|
|
256
|
+
import { Button } from '@indra-inter/neobrutalism-components';
|
|
263
257
|
|
|
264
258
|
<Button
|
|
265
259
|
accessibilityLabel="Continue"
|
|
@@ -274,7 +268,7 @@ import { Button } from 'neobrutalism-components';
|
|
|
274
268
|
|
|
275
269
|
| Key prop | Description |
|
|
276
270
|
| --- | --- |
|
|
277
|
-
| `variant` | `primary`, `secondary`, `ghost`, `outline`, `destructive`, `warning`, `success`,
|
|
271
|
+
| `variant` | `primary`, `secondary`, `ghost`, `outline`, `destructive`, `warning`, `success`, or `info`. |
|
|
278
272
|
| `size` | `sm`, `md` (default), or `lg`. |
|
|
279
273
|
| `radius` | Overrides the theme border radius. |
|
|
280
274
|
| `rounded` | `rounded` (default) uses the theme radius; `sharp` sets the surface radius to `0`. An explicit `radius` takes precedence. |
|
|
@@ -295,7 +289,7 @@ other icon-first actions. The application supplies the icon and behavior.
|
|
|
295
289
|
|
|
296
290
|
```tsx
|
|
297
291
|
import { MicOff, PhoneOff } from 'lucide-react-native';
|
|
298
|
-
import { IconButton } from 'neobrutalism-components';
|
|
292
|
+
import { IconButton } from '@indra-inter/neobrutalism-components';
|
|
299
293
|
|
|
300
294
|
<IconButton
|
|
301
295
|
accessibilityLabel="Mute microphone"
|
|
@@ -320,7 +314,7 @@ import { IconButton } from 'neobrutalism-components';
|
|
|
320
314
|
| `variant` | `default`, `primary`, or `destructive`. |
|
|
321
315
|
| `size` | Side length of the icon surface; defaults to `60`. |
|
|
322
316
|
| `rounded` / `radius` | `rounded` uses the theme radius, `sharp` uses `0`; an explicit `radius` takes precedence. |
|
|
323
|
-
| `shadow` / `
|
|
317
|
+
| `shadow` / `shadowVariant` | Hard shadow is enabled by default. Disable it or select a semantic Neo shadow color when needed. |
|
|
324
318
|
|
|
325
319
|
### ListItem
|
|
326
320
|
|
|
@@ -330,7 +324,7 @@ data mapping remain in the consuming application.
|
|
|
330
324
|
```tsx
|
|
331
325
|
import { useState } from 'react';
|
|
332
326
|
import { Text } from 'react-native';
|
|
333
|
-
import { Avatar, ListItem, Switch } from 'neobrutalism-components';
|
|
327
|
+
import { Avatar, ListItem, Switch } from '@indra-inter/neobrutalism-components';
|
|
334
328
|
|
|
335
329
|
const [notificationsEnabled, setNotificationsEnabled] = useState(true);
|
|
336
330
|
|
|
@@ -388,7 +382,7 @@ sections. It has no shadow or border of its own, and uses `theme.border.color`
|
|
|
388
382
|
at one pixel by default.
|
|
389
383
|
|
|
390
384
|
```tsx
|
|
391
|
-
import { Divider } from 'neobrutalism-components';
|
|
385
|
+
import { Divider } from '@indra-inter/neobrutalism-components';
|
|
392
386
|
|
|
393
387
|
<Divider />
|
|
394
388
|
<Divider inset="md" />
|
|
@@ -408,7 +402,7 @@ message preview, and an unread counter. Data mapping, navigation, avatar choice,
|
|
|
408
402
|
and selection state stay in the app.
|
|
409
403
|
|
|
410
404
|
```tsx
|
|
411
|
-
import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
405
|
+
import { Avatar, ChatListItem } from '@indra-inter/neobrutalism-components';
|
|
412
406
|
|
|
413
407
|
<ChatListItem
|
|
414
408
|
leading={<Avatar initials="AK" size="md" />}
|
|
@@ -419,7 +413,7 @@ import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
|
419
413
|
state="unread"
|
|
420
414
|
timestamp="10:11"
|
|
421
415
|
title="Ariana Kim"
|
|
422
|
-
unreadBadgeProps={{ radius: 8,
|
|
416
|
+
unreadBadgeProps={{ radius: 8, shadowVariant: 'primary' }}
|
|
423
417
|
unreadCount={2}
|
|
424
418
|
/>
|
|
425
419
|
```
|
|
@@ -431,7 +425,7 @@ import { Avatar, ChatListItem } from 'neobrutalism-components';
|
|
|
431
425
|
| `leading` / `leadingStyle` | Optional avatar or custom 40px leading content, with a style override. |
|
|
432
426
|
| `title`, `message`, `timestamp` | Required consumer-owned chat content. |
|
|
433
427
|
| `titleNumberOfLines`, `messageNumberOfLines`, `timestampNumberOfLines` | Per-field truncation limits. The default title limit is `1` (`2` for `request`), while message and timestamp default to `1`. |
|
|
434
|
-
| `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`. |
|
|
435
429
|
| `divider`, `onPress`, `onLongPress`, `disabled` | Row behavior and section composition. `onLongPress` is useful for consumer-owned multiselect flows. |
|
|
436
430
|
|
|
437
431
|
### CallItem
|
|
@@ -441,7 +435,7 @@ provides its avatar, phone/video icon, copy, and interaction.
|
|
|
441
435
|
|
|
442
436
|
```tsx
|
|
443
437
|
import { Phone } from 'lucide-react-native';
|
|
444
|
-
import { Avatar, CallItem } from 'neobrutalism-components';
|
|
438
|
+
import { Avatar, CallItem } from '@indra-inter/neobrutalism-components';
|
|
445
439
|
|
|
446
440
|
<CallItem
|
|
447
441
|
detail="Incoming · 5:23"
|
|
@@ -463,21 +457,21 @@ import { Avatar, CallItem } from 'neobrutalism-components';
|
|
|
463
457
|
### Badge
|
|
464
458
|
|
|
465
459
|
```tsx
|
|
466
|
-
import { Badge } from 'neobrutalism-components';
|
|
460
|
+
import { Badge } from '@indra-inter/neobrutalism-components';
|
|
467
461
|
|
|
468
|
-
<Badge size="md"
|
|
462
|
+
<Badge size="md" variant="success">Published</Badge>
|
|
469
463
|
|
|
470
|
-
<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">
|
|
471
465
|
Category
|
|
472
466
|
</Badge>
|
|
473
467
|
```
|
|
474
468
|
|
|
475
469
|
| Key prop | Description |
|
|
476
470
|
| --- | --- |
|
|
477
|
-
| `
|
|
471
|
+
| `variant` | `default`, `primary`, `info`, `error`, `warning`, or `success`. |
|
|
478
472
|
| `size` | `sm` or `md`. |
|
|
479
473
|
| `radius` / `rounded` | `radius` has priority; otherwise `rounded` is `rounded` (default) or `sharp`. |
|
|
480
|
-
| `shadow` / `
|
|
474
|
+
| `shadow` / `shadowVariant` | Show or hide the hard shadow, and select its semantic Neo color. |
|
|
481
475
|
| `className` | NativeWind classes mapped to the Badge visual style surface. |
|
|
482
476
|
| `leadingIcon` | Optional icon before the badge label. |
|
|
483
477
|
|
|
@@ -487,7 +481,7 @@ import { Badge } from 'neobrutalism-components';
|
|
|
487
481
|
application or backend.
|
|
488
482
|
|
|
489
483
|
```tsx
|
|
490
|
-
import { Progress } from 'neobrutalism-components';
|
|
484
|
+
import { Progress } from '@indra-inter/neobrutalism-components';
|
|
491
485
|
|
|
492
486
|
<Progress value={75} />
|
|
493
487
|
|
|
@@ -520,7 +514,7 @@ and text blocks. It uses a lightweight native opacity pulse and requires no
|
|
|
520
514
|
additional animation or gradient dependency.
|
|
521
515
|
|
|
522
516
|
```tsx
|
|
523
|
-
import { Skeleton } from 'neobrutalism-components';
|
|
517
|
+
import { Skeleton } from '@indra-inter/neobrutalism-components';
|
|
524
518
|
|
|
525
519
|
<Skeleton type="chat" />
|
|
526
520
|
|
|
@@ -533,7 +527,7 @@ import { Skeleton } from 'neobrutalism-components';
|
|
|
533
527
|
| --- | --- |
|
|
534
528
|
| `type` | `textBlock` (default), `list`, or `chat`. Each renders the corresponding Figma placeholder layout. |
|
|
535
529
|
| `rounded` / `radius` | `sharp` is the default; `rounded` uses the theme radius. An explicit `radius` takes precedence. |
|
|
536
|
-
| `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. |
|
|
537
531
|
| `animated` / `animationDuration` | Enables the native opacity pulse by default. Set `animated={false}` for static loading states. |
|
|
538
532
|
| `style` | Styles the outer preset container, such as its width or placement. |
|
|
539
533
|
|
|
@@ -549,7 +543,7 @@ exchange JavaScript `Date` objects with the consuming application.
|
|
|
549
543
|
|
|
550
544
|
```tsx
|
|
551
545
|
import { useState } from 'react';
|
|
552
|
-
import { Calendar, type CalendarRangeValue } from 'neobrutalism-components';
|
|
546
|
+
import { Calendar, type CalendarRangeValue } from '@indra-inter/neobrutalism-components';
|
|
553
547
|
|
|
554
548
|
const [date, setDate] = useState<string | undefined>('2026-08-31');
|
|
555
549
|
const [range, setRange] = useState<CalendarRangeValue | undefined>({
|
|
@@ -593,7 +587,7 @@ the consuming application.
|
|
|
593
587
|
|
|
594
588
|
```tsx
|
|
595
589
|
import { Text } from 'react-native';
|
|
596
|
-
import { Accordion } from 'neobrutalism-components';
|
|
590
|
+
import { Accordion } from '@indra-inter/neobrutalism-components';
|
|
597
591
|
|
|
598
592
|
<Accordion
|
|
599
593
|
defaultValue="overview"
|
|
@@ -631,7 +625,6 @@ Use `type="multiple"` when several sections may remain open:
|
|
|
631
625
|
| `value` / `defaultValue` / `onValueChange` | Controlled or uncontrolled expanded state. Single mode uses a string or `null`; multiple mode uses a string array. |
|
|
632
626
|
| `collapsible` | Defaults to `true`; set `false` to keep the expanded item open in single mode. |
|
|
633
627
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`; it applies to expanded sections only. |
|
|
634
|
-
| `shadowColor` | Direct hard-shadow override; takes precedence over `shadowVariant`. |
|
|
635
628
|
| Style props | `containerStyle`, `style`, `headerStyle`, `contentStyle`, and `titleStyle`. |
|
|
636
629
|
|
|
637
630
|
Expanded headers use the current theme's `primaryHover` color. The chevron,
|
|
@@ -642,7 +635,7 @@ border, hard shadow, and disabled state are package-managed.
|
|
|
642
635
|
```tsx
|
|
643
636
|
import { useState } from 'react';
|
|
644
637
|
import { Text } from 'react-native';
|
|
645
|
-
import { Input } from 'neobrutalism-components';
|
|
638
|
+
import { Input } from '@indra-inter/neobrutalism-components';
|
|
646
639
|
|
|
647
640
|
const [email, setEmail] = useState('');
|
|
648
641
|
|
|
@@ -680,7 +673,7 @@ high by default and aligns text at the top.
|
|
|
680
673
|
|
|
681
674
|
```tsx
|
|
682
675
|
import { useState } from 'react';
|
|
683
|
-
import { TextArea } from 'neobrutalism-components';
|
|
676
|
+
import { TextArea } from '@indra-inter/neobrutalism-components';
|
|
684
677
|
|
|
685
678
|
export function BioField() {
|
|
686
679
|
const [bio, setBio] = useState('');
|
|
@@ -715,7 +708,7 @@ surface. Visibility can be controlled by the app or managed internally.
|
|
|
715
708
|
|
|
716
709
|
```tsx
|
|
717
710
|
import { useState } from 'react';
|
|
718
|
-
import { PasswordInput } from 'neobrutalism-components';
|
|
711
|
+
import { PasswordInput } from '@indra-inter/neobrutalism-components';
|
|
719
712
|
|
|
720
713
|
const [password, setPassword] = useState('');
|
|
721
714
|
|
|
@@ -742,7 +735,7 @@ const [password, setPassword] = useState('');
|
|
|
742
735
|
segment without requiring the consuming app to compose it manually.
|
|
743
736
|
|
|
744
737
|
```tsx
|
|
745
|
-
import { UrlInput } from 'neobrutalism-components';
|
|
738
|
+
import { UrlInput } from '@indra-inter/neobrutalism-components';
|
|
746
739
|
|
|
747
740
|
<UrlInput
|
|
748
741
|
label="Website"
|
|
@@ -765,7 +758,7 @@ import { UrlInput } from 'neobrutalism-components';
|
|
|
765
758
|
defaults. The app owns country selection and phone-number validation.
|
|
766
759
|
|
|
767
760
|
```tsx
|
|
768
|
-
import { PhoneInput } from 'neobrutalism-components';
|
|
761
|
+
import { PhoneInput } from '@indra-inter/neobrutalism-components';
|
|
769
762
|
|
|
770
763
|
<PhoneInput
|
|
771
764
|
country={{ dialCode: '+62', isoCode: 'ID' }}
|
|
@@ -790,7 +783,7 @@ segments. Values are intentionally unformatted so the consuming app can apply
|
|
|
790
783
|
its own locale, decimal, and submission rules.
|
|
791
784
|
|
|
792
785
|
```tsx
|
|
793
|
-
import { CurrencyInput } from 'neobrutalism-components';
|
|
786
|
+
import { CurrencyInput } from '@indra-inter/neobrutalism-components';
|
|
794
787
|
|
|
795
788
|
<CurrencyInput
|
|
796
789
|
currencyCode="IDR"
|
|
@@ -816,7 +809,7 @@ paste behavior on iOS and Android.
|
|
|
816
809
|
|
|
817
810
|
```tsx
|
|
818
811
|
import { useState } from 'react';
|
|
819
|
-
import { OtpInput } from 'neobrutalism-components';
|
|
812
|
+
import { OtpInput } from '@indra-inter/neobrutalism-components';
|
|
820
813
|
|
|
821
814
|
const [code, setCode] = useState('');
|
|
822
815
|
|
|
@@ -854,10 +847,9 @@ import {
|
|
|
854
847
|
CardFooter,
|
|
855
848
|
CardHeader,
|
|
856
849
|
CardTitle,
|
|
857
|
-
} from 'neobrutalism-components';
|
|
850
|
+
} from '@indra-inter/neobrutalism-components';
|
|
858
851
|
|
|
859
852
|
<Card
|
|
860
|
-
backgroundColor="#FFFFFF"
|
|
861
853
|
radius={{ topLeft: 16, topRight: 16, bottomLeft: 0, bottomRight: 0 }}
|
|
862
854
|
shadowVariant="primary">
|
|
863
855
|
<CardHeader>
|
|
@@ -875,10 +867,9 @@ import {
|
|
|
875
867
|
|
|
876
868
|
| Key prop | Description |
|
|
877
869
|
| --- | --- |
|
|
878
|
-
| `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. |
|
|
879
871
|
| `radius` | A number or corner object with `topLeft`, `topRight`, `bottomRight`, and `bottomLeft`. |
|
|
880
872
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. |
|
|
881
|
-
| `shadowColor` | Direct hard-shadow override; takes precedence over `shadowVariant`. |
|
|
882
873
|
| `contentStyle` | Overrides the default content layout, for example `{{ padding: 0 }}` for full-bleed list rows. |
|
|
883
874
|
| `containerStyle` / `style` | Styles for the shadow wrapper or card surface. |
|
|
884
875
|
| `containerClassName` / `className` / `contentClassName` | NativeWind equivalents for `containerStyle`, `style`, and `contentStyle`; `contentClassName` is applied last. |
|
|
@@ -886,7 +877,7 @@ import {
|
|
|
886
877
|
### Avatar
|
|
887
878
|
|
|
888
879
|
```tsx
|
|
889
|
-
import { Avatar } from 'neobrutalism-components';
|
|
880
|
+
import { Avatar } from '@indra-inter/neobrutalism-components';
|
|
890
881
|
|
|
891
882
|
<Avatar initials="AK" size="md" />
|
|
892
883
|
<Avatar size="lg" source={{ uri: profileUri }} variant="image" />
|
|
@@ -901,17 +892,17 @@ import { Avatar } from 'neobrutalism-components';
|
|
|
901
892
|
| `source` | Native `ImageSourcePropType` for the `image` variant. |
|
|
902
893
|
| `showAdd` | Shows the add indicator for `md`, `lg`, and `xl` avatars. |
|
|
903
894
|
| `rounded` | `rounded` (default) uses the theme radius; `sharp` makes the avatar square. |
|
|
904
|
-
| `shadow` / `
|
|
895
|
+
| `shadow` / `shadowVariant` | Show or hide the hard shadow, and select its semantic Neo color. |
|
|
905
896
|
|
|
906
897
|
### AppBar
|
|
907
898
|
|
|
908
899
|
`AppBar` supplies the screen-header surface; navigation and every interactive
|
|
909
900
|
slot remain owned by the consuming application. Keep the application wrapped
|
|
910
|
-
with `SafeAreaProvider` as shown in [
|
|
901
|
+
with `SafeAreaProvider` as shown in [App providers](#app-providers).
|
|
911
902
|
|
|
912
903
|
```tsx
|
|
913
904
|
import { Text } from 'react-native';
|
|
914
|
-
import { AppBar, Avatar, Checkbox, Tabs } from 'neobrutalism-components';
|
|
905
|
+
import { AppBar, Avatar, Checkbox, Tabs } from '@indra-inter/neobrutalism-components';
|
|
915
906
|
|
|
916
907
|
<AppBar>
|
|
917
908
|
<AppBar.Content
|
|
@@ -933,12 +924,12 @@ inset or when the bar intentionally overlays screen content. Use
|
|
|
933
924
|
negative values are clamped at zero:
|
|
934
925
|
|
|
935
926
|
```tsx
|
|
936
|
-
<AppBar
|
|
927
|
+
<AppBar safeArea={false}>
|
|
937
928
|
<AppBar.Content title="Select items" trailing={<Text>2 selected</Text>} />
|
|
938
929
|
</AppBar>
|
|
939
930
|
```
|
|
940
931
|
|
|
941
|
-
Use `
|
|
932
|
+
Use `layout="select"` for a bulk-selection header. The selection count stays in
|
|
942
933
|
the flexible title slot, while the select-all control stays pinned to the right:
|
|
943
934
|
|
|
944
935
|
```tsx
|
|
@@ -955,7 +946,7 @@ the flexible title slot, while the select-all control stays pinned to the right:
|
|
|
955
946
|
style={{ width: 106 }}
|
|
956
947
|
/>
|
|
957
948
|
}
|
|
958
|
-
|
|
949
|
+
layout="select"
|
|
959
950
|
/>
|
|
960
951
|
</AppBar>
|
|
961
952
|
```
|
|
@@ -964,7 +955,7 @@ the flexible title slot, while the select-all control stays pinned to the right:
|
|
|
964
955
|
| --- | --- |
|
|
965
956
|
| `safeArea` | Defaults to `true`; applies the top device inset through `SafeAreaProvider`. |
|
|
966
957
|
| `safeAreaOffset` | Adds to the top inset when `safeArea` is enabled. Defaults to `0`; the final inset never becomes negative. |
|
|
967
|
-
| `backgroundColor` |
|
|
958
|
+
| `backgroundColor` | Explicit runtime override for the default primary surface. Prefer a semantic theme token when the color is known ahead of time. |
|
|
968
959
|
| `variant` | `default` (default) or `select`. `select` matches the compact bottom padding of Figma's selection header. |
|
|
969
960
|
| `leading` / `avatar` / `trailing` | Consumer-owned React-node slots in `AppBar.Content`. Supply accessible pressable controls for actions. |
|
|
970
961
|
| `title` / `subtitle` | String or number values receive theme text styling and truncate safely to one line; custom React nodes remain unchanged. |
|
|
@@ -977,7 +968,7 @@ These controls are controlled by their value props and callbacks.
|
|
|
977
968
|
|
|
978
969
|
```tsx
|
|
979
970
|
import { useState } from 'react';
|
|
980
|
-
import { Checkbox, Radio, Switch } from 'neobrutalism-components';
|
|
971
|
+
import { Checkbox, Radio, Switch } from '@indra-inter/neobrutalism-components';
|
|
981
972
|
|
|
982
973
|
const [accepted, setAccepted] = useState(false);
|
|
983
974
|
const [plan, setPlan] = useState<'standard' | 'express'>('standard');
|
|
@@ -1019,7 +1010,7 @@ screen content in the consuming application.
|
|
|
1019
1010
|
```tsx
|
|
1020
1011
|
import { useState } from 'react';
|
|
1021
1012
|
import { Text } from 'react-native';
|
|
1022
|
-
import { Badge, Tabs, type TabItem } from 'neobrutalism-components';
|
|
1013
|
+
import { Badge, Tabs, type TabItem } from '@indra-inter/neobrutalism-components';
|
|
1023
1014
|
|
|
1024
1015
|
const items: readonly TabItem[] = [
|
|
1025
1016
|
{ label: 'Overview', value: 'overview' },
|
|
@@ -1079,7 +1070,7 @@ and navigation calls in the consuming application.
|
|
|
1079
1070
|
```tsx
|
|
1080
1071
|
import { useState } from 'react';
|
|
1081
1072
|
import { Text } from 'react-native';
|
|
1082
|
-
import { BottomNavigation } from 'neobrutalism-components';
|
|
1073
|
+
import { BottomNavigation } from '@indra-inter/neobrutalism-components';
|
|
1083
1074
|
|
|
1084
1075
|
export function AppNavigation() {
|
|
1085
1076
|
const [tab, setTab] = useState('chats');
|
|
@@ -1088,7 +1079,7 @@ export function AppNavigation() {
|
|
|
1088
1079
|
<BottomNavigation
|
|
1089
1080
|
items={[
|
|
1090
1081
|
{
|
|
1091
|
-
activeIcon: <Text
|
|
1082
|
+
activeIcon: <Text>●</Text>,
|
|
1092
1083
|
icon: <Text>○</Text>,
|
|
1093
1084
|
label: 'Chats',
|
|
1094
1085
|
value: 'chats',
|
|
@@ -1113,7 +1104,6 @@ export function AppNavigation() {
|
|
|
1113
1104
|
| `indicatorRadius` | Radius for the selected tab's bottom indicator. Defaults to `0` for the square Figma treatment. |
|
|
1114
1105
|
| `shadow` | Enables the hard shadow; defaults to `true`. Use `false` for a flat navigation surface. |
|
|
1115
1106
|
| `shadowVariant` | `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. It defaults to `primary` to match the Figma navigation shadow. |
|
|
1116
|
-
| `shadowColor` | Direct hard-shadow override. It takes precedence over `shadowVariant`. |
|
|
1117
1107
|
| `containerStyle` / `style` / `contentStyle` | Style the outer wrapper, safe-area surface, or bordered navigation row. |
|
|
1118
1108
|
|
|
1119
1109
|
Each item exposes the native `tab` role with selected and disabled state. Use
|
|
@@ -1127,7 +1117,7 @@ Use `Dropdown` for value selection. `single` is the default; use
|
|
|
1127
1117
|
|
|
1128
1118
|
```tsx
|
|
1129
1119
|
import { useState } from 'react';
|
|
1130
|
-
import { Dropdown } from 'neobrutalism-components';
|
|
1120
|
+
import { Dropdown } from '@indra-inter/neobrutalism-components';
|
|
1131
1121
|
|
|
1132
1122
|
const [team, setTeam] = useState<string>();
|
|
1133
1123
|
|
|
@@ -1149,7 +1139,7 @@ the application and provide mapper callbacks instead of reshaping every
|
|
|
1149
1139
|
response into UI data first.
|
|
1150
1140
|
|
|
1151
1141
|
```tsx
|
|
1152
|
-
import { Avatar, Dropdown } from 'neobrutalism-components';
|
|
1142
|
+
import { Avatar, Dropdown } from '@indra-inter/neobrutalism-components';
|
|
1153
1143
|
|
|
1154
1144
|
type Team = {
|
|
1155
1145
|
avatarUri?: string;
|
|
@@ -1213,7 +1203,7 @@ const [teamIds, setTeamIds] = useState<readonly string[]>([]);
|
|
|
1213
1203
|
`DropdownMenu` is an action menu, not a value-select control.
|
|
1214
1204
|
|
|
1215
1205
|
```tsx
|
|
1216
|
-
import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
1206
|
+
import { Button, DropdownMenu } from '@indra-inter/neobrutalism-components';
|
|
1217
1207
|
|
|
1218
1208
|
<DropdownMenu
|
|
1219
1209
|
align="end"
|
|
@@ -1235,7 +1225,6 @@ import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
|
1235
1225
|
| `side` / `sideOffset` | Menu side (`top` or `bottom`) and gap from its trigger. Defaults to `bottom` and `6`. |
|
|
1236
1226
|
| `shadow` | Enables the neobrutalist shadow. Defaults to `true`. |
|
|
1237
1227
|
| `shadowVariant` | Shadow color token: `default`, `primary`, `secondary`, `destructive`, `warning`, `success`, or `info`. |
|
|
1238
|
-
| `shadowColor` | Explicit shadow color. Takes precedence over `shadowVariant`. |
|
|
1239
1228
|
| `shadowOffset` | Right-and-bottom shadow thickness. Defaults to the theme shadow offset. |
|
|
1240
1229
|
| `children` | One trigger element, usually a `Button`. |
|
|
1241
1230
|
|
|
@@ -1244,7 +1233,7 @@ import { Button, DropdownMenu } from 'neobrutalism-components';
|
|
|
1244
1233
|
Use `useToast` inside `ToastProvider` for application notifications.
|
|
1245
1234
|
|
|
1246
1235
|
```tsx
|
|
1247
|
-
import { Button, useToast } from 'neobrutalism-components';
|
|
1236
|
+
import { Button, useToast } from '@indra-inter/neobrutalism-components';
|
|
1248
1237
|
|
|
1249
1238
|
export function SaveButton() {
|
|
1250
1239
|
const { show } = useToast();
|
|
@@ -1276,7 +1265,7 @@ export function SaveButton() {
|
|
|
1276
1265
|
`onOpenChange`.
|
|
1277
1266
|
|
|
1278
1267
|
```tsx
|
|
1279
|
-
import { Toast } from 'neobrutalism-components';
|
|
1268
|
+
import { Toast } from '@indra-inter/neobrutalism-components';
|
|
1280
1269
|
|
|
1281
1270
|
<Toast
|
|
1282
1271
|
description="Your changes have been saved successfully."
|
|
@@ -1300,7 +1289,7 @@ import {
|
|
|
1300
1289
|
DialogBody,
|
|
1301
1290
|
DialogFooter,
|
|
1302
1291
|
DialogHeader,
|
|
1303
|
-
} from 'neobrutalism-components';
|
|
1292
|
+
} from '@indra-inter/neobrutalism-components';
|
|
1304
1293
|
|
|
1305
1294
|
const [open, setOpen] = useState(false);
|
|
1306
1295
|
|
|
@@ -1318,7 +1307,7 @@ const [open, setOpen] = useState(false);
|
|
|
1318
1307
|
```
|
|
1319
1308
|
|
|
1320
1309
|
```tsx
|
|
1321
|
-
import { ConfirmDialog } from 'neobrutalism-components';
|
|
1310
|
+
import { ConfirmDialog } from '@indra-inter/neobrutalism-components';
|
|
1322
1311
|
|
|
1323
1312
|
<ConfirmDialog
|
|
1324
1313
|
confirmLabel="Delete"
|
|
@@ -1344,7 +1333,7 @@ screen header that also needs to be cleared.
|
|
|
1344
1333
|
|
|
1345
1334
|
```tsx
|
|
1346
1335
|
import { useState } from 'react';
|
|
1347
|
-
import { Button, BottomSheet, BottomSheetBody, BottomSheetFooter, BottomSheetHeader } from 'neobrutalism-components';
|
|
1336
|
+
import { Button, BottomSheet, BottomSheetBody, BottomSheetFooter, BottomSheetHeader } from '@indra-inter/neobrutalism-components';
|
|
1348
1337
|
|
|
1349
1338
|
const [open, setOpen] = useState(false);
|
|
1350
1339
|
|
|
@@ -1355,7 +1344,8 @@ const [open, setOpen] = useState(false);
|
|
|
1355
1344
|
animationDuration={220}
|
|
1356
1345
|
onOpenChange={setOpen}
|
|
1357
1346
|
open={open}
|
|
1358
|
-
|
|
1347
|
+
rounded="rounded"
|
|
1348
|
+
shadowVariant="primary">
|
|
1359
1349
|
<BottomSheetHeader title="Update profile" />
|
|
1360
1350
|
<BottomSheetBody>{/* Application-owned form content */}</BottomSheetBody>
|
|
1361
1351
|
<BottomSheetFooter>
|
|
@@ -1371,26 +1361,7 @@ const [open, setOpen] = useState(false);
|
|
|
1371
1361
|
| `open` / `onOpenChange` | Controlled visibility. Tapping the backdrop invokes `onOpenChange(false)`. |
|
|
1372
1362
|
| `animation` | `slide` (default) or `none`. |
|
|
1373
1363
|
| `animationDuration` | Open and close duration in milliseconds; defaults to `220`. |
|
|
1374
|
-
| `radius` |
|
|
1375
|
-
| `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. |
|
|
1376
1366
|
| `bottomPadding` | Overrides the safe-area spacing below the sheet content. |
|
|
1377
1367
|
| `keyboardVerticalOffset` | Header offset for keyboard positioning; defaults to `0`. |
|
|
1378
|
-
|
|
1379
|
-
## Local Development and Publishing
|
|
1380
|
-
|
|
1381
|
-
The package currently resolves directly to `src/index.ts` and has
|
|
1382
|
-
`"private": true` in `package.json`; this is deliberate for local iteration.
|
|
1383
|
-
|
|
1384
|
-
Before publishing to npm, add an intentional release configuration that:
|
|
1385
|
-
|
|
1386
|
-
1. builds JavaScript output rather than shipping TypeScript source only;
|
|
1387
|
-
2. emits `.d.ts` declaration files and points `types`/`exports` to them;
|
|
1388
|
-
3. removes `private`, chooses a version, and verifies the npm tarball; and
|
|
1389
|
-
4. documents the supported React Native and Expo ranges for that release.
|
|
1390
|
-
|
|
1391
|
-
Until then, consume the package through the local file dependency and run the
|
|
1392
|
-
package typecheck after API changes:
|
|
1393
|
-
|
|
1394
|
-
```bash
|
|
1395
|
-
pnpm run typecheck
|
|
1396
|
-
```
|