@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.
Files changed (92) hide show
  1. package/README.md +144 -128
  2. package/dist/module/components/accordion/accordion.js +2 -13
  3. package/dist/module/components/accordion/accordion.js.map +1 -1
  4. package/dist/module/components/app-bar/app-bar.js +3 -5
  5. package/dist/module/components/app-bar/app-bar.js.map +1 -1
  6. package/dist/module/components/avatar/avatar.js +10 -11
  7. package/dist/module/components/avatar/avatar.js.map +1 -1
  8. package/dist/module/components/badge/badge.js +4 -5
  9. package/dist/module/components/badge/badge.js.map +1 -1
  10. package/dist/module/components/bottom-navigation/bottom-navigation.js +2 -15
  11. package/dist/module/components/bottom-navigation/bottom-navigation.js.map +1 -1
  12. package/dist/module/components/bottom-sheet/bottom-sheet.js +10 -4
  13. package/dist/module/components/bottom-sheet/bottom-sheet.js.map +1 -1
  14. package/dist/module/components/button/button.js +6 -16
  15. package/dist/module/components/button/button.js.map +1 -1
  16. package/dist/module/components/calendar/calendar.js.map +1 -1
  17. package/dist/module/components/card/card.js +3 -19
  18. package/dist/module/components/card/card.js.map +1 -1
  19. package/dist/module/components/chat-list-item/chat-list-item.js +1 -1
  20. package/dist/module/components/chat-list-item/chat-list-item.js.map +1 -1
  21. package/dist/module/components/dialog/dialog.js +1 -1
  22. package/dist/module/components/dialog/dialog.js.map +1 -1
  23. package/dist/module/components/dropdown/dropdown-menu.js +4 -17
  24. package/dist/module/components/dropdown/dropdown-menu.js.map +1 -1
  25. package/dist/module/components/dropdown/dropdown.js +1 -1
  26. package/dist/module/components/dropdown/dropdown.js.map +1 -1
  27. package/dist/module/components/icon-button/icon-button.js +3 -3
  28. package/dist/module/components/icon-button/icon-button.js.map +1 -1
  29. package/dist/module/components/pin-code-field/pin-code-field.js +3 -2
  30. package/dist/module/components/pin-code-field/pin-code-field.js.map +1 -1
  31. package/dist/module/components/shared/styling.js +12 -0
  32. package/dist/module/components/shared/styling.js.map +1 -1
  33. package/dist/module/components/skeleton/skeleton.js +3 -3
  34. package/dist/module/components/skeleton/skeleton.js.map +1 -1
  35. package/dist/module/components/tabs/tabs.js.map +1 -1
  36. package/dist/module/index.js +2 -1
  37. package/dist/module/index.js.map +1 -1
  38. package/dist/module/theme/design-tokens.generated.js +91 -3
  39. package/dist/module/theme/design-tokens.generated.js.map +1 -1
  40. package/dist/module/theme/nativewind-theme-provider.js +27 -0
  41. package/dist/module/theme/nativewind-theme-provider.js.map +1 -0
  42. package/dist/module/theme/nativewind-tokens.generated.js +299 -0
  43. package/dist/module/theme/nativewind-tokens.generated.js.map +1 -0
  44. package/dist/module/theme/theme-provider.js +3 -2
  45. package/dist/module/theme/theme-provider.js.map +1 -1
  46. package/dist/module/theme/theme.js +45 -22
  47. package/dist/module/theme/theme.js.map +1 -1
  48. package/dist/typescript/components/accordion/accordion.d.ts +2 -3
  49. package/dist/typescript/components/accordion/accordion.d.ts.map +1 -1
  50. package/dist/typescript/components/app-bar/app-bar.d.ts +0 -2
  51. package/dist/typescript/components/app-bar/app-bar.d.ts.map +1 -1
  52. package/dist/typescript/components/avatar/avatar.d.ts +4 -7
  53. package/dist/typescript/components/avatar/avatar.d.ts.map +1 -1
  54. package/dist/typescript/components/badge/badge.d.ts +5 -8
  55. package/dist/typescript/components/badge/badge.d.ts.map +1 -1
  56. package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts +3 -5
  57. package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts.map +1 -1
  58. package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts +4 -1
  59. package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts.map +1 -1
  60. package/dist/typescript/components/button/button.d.ts +2 -3
  61. package/dist/typescript/components/button/button.d.ts.map +1 -1
  62. package/dist/typescript/components/calendar/calendar.d.ts +3 -4
  63. package/dist/typescript/components/calendar/calendar.d.ts.map +1 -1
  64. package/dist/typescript/components/card/card.d.ts +3 -7
  65. package/dist/typescript/components/card/card.d.ts.map +1 -1
  66. package/dist/typescript/components/dropdown/dropdown-menu.d.ts +3 -7
  67. package/dist/typescript/components/dropdown/dropdown-menu.d.ts.map +1 -1
  68. package/dist/typescript/components/icon-button/icon-button.d.ts +4 -5
  69. package/dist/typescript/components/icon-button/icon-button.d.ts.map +1 -1
  70. package/dist/typescript/components/pin-code-field/pin-code-field.d.ts +3 -2
  71. package/dist/typescript/components/pin-code-field/pin-code-field.d.ts.map +1 -1
  72. package/dist/typescript/components/shared/styling.d.ts +2 -0
  73. package/dist/typescript/components/shared/styling.d.ts.map +1 -1
  74. package/dist/typescript/components/skeleton/skeleton.d.ts +4 -5
  75. package/dist/typescript/components/skeleton/skeleton.d.ts.map +1 -1
  76. package/dist/typescript/components/tabs/tabs.d.ts +2 -4
  77. package/dist/typescript/components/tabs/tabs.d.ts.map +1 -1
  78. package/dist/typescript/index.d.ts +11 -10
  79. package/dist/typescript/index.d.ts.map +1 -1
  80. package/dist/typescript/theme/design-tokens.generated.d.ts +91 -3
  81. package/dist/typescript/theme/design-tokens.generated.d.ts.map +1 -1
  82. package/dist/typescript/theme/nativewind-theme-provider.d.ts +8 -0
  83. package/dist/typescript/theme/nativewind-theme-provider.d.ts.map +1 -0
  84. package/dist/typescript/theme/nativewind-tokens.generated.d.ts +295 -0
  85. package/dist/typescript/theme/nativewind-tokens.generated.d.ts.map +1 -0
  86. package/dist/typescript/theme/theme-provider.d.ts +3 -2
  87. package/dist/typescript/theme/theme-provider.d.ts.map +1 -1
  88. package/dist/typescript/theme/theme.d.ts +19 -16
  89. package/dist/typescript/theme/theme.d.ts.map +1 -1
  90. package/nativewind.css +66 -22
  91. package/package.json +6 -3
  92. package/tokens.css +2 -2
package/README.md CHANGED
@@ -1,11 +1,21 @@
1
1
  # Neobrutalism Components
2
2
 
3
- A token-driven neobrutalism component library for React Native iOS and Android.
4
- It provides reusable foundation, form, selection, feedback, and overlay
5
- components with light and dark themes.
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
- > This package is currently used as a local package. The npm command below is
8
- > the intended installation flow after the package has been published.
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
- After publishing to npm:
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
- ## NativeWind and React Native styles
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-sky-500"
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 mode="image" source={photo} />
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
- See [`example/README.md`](./example/README.md) for the local workflow and
99
- validation commands.
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
- ## 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,20 +122,30 @@ export function AppProviders({ children }: PropsWithChildren) {
131
122
 
132
123
  ## Theming
133
124
 
134
- `ThemeProvider` supports `light` and `dark` modes. Components react to a mode
135
- change automatically.
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 { Button, ThemeProvider, type ThemeMode } from 'neobrutalism-components';
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 theme
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). Regenerate
178
- the runtime TypeScript tokens and the NativeWind-compatible CSS variables after
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 standard NativeWind semantic utilities, import the generated opt-in
187
- semantic stylesheet once in the consuming application's global CSS:
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
- This provides direct light and dark values for semantic classes such as
194
- `text-foreground`, `bg-primary`, and `bg-success-100`, matching the package
195
- `ThemeProvider` palette without a consumer-maintained token bridge.
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
- `tokens.css` remains available for compatibility and for consumers that need
198
- the namespaced `--neo-*` variables directly:
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`, `info`, `neutral`, or `noShadow`. |
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` / `shadowColor` | Hard shadow is enabled by default. Disable it or override its color when needed. |
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, shadowColor: '#01ABFF' }}
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 `shadowColor`. |
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" type="success">Published</Badge>
462
+ <Badge size="md" variant="success">Published</Badge>
424
463
 
425
- <Badge className="min-h-8 px-2" shadow={false} size="md" type="primary">
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
- | `type` | `default`, `primary`, `info`, `error`, `warning`, or `success`. |
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` / `shadowColor` | Show or hide the hard shadow, and optionally override its color. |
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` / `shadowColor` / `shadowOffset` | Hard shadow is on by default. Override its color or right-and-bottom offset as needed. |
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` | Overrides the theme surface color. |
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` / `shadowColor` | Show or hide the hard shadow, and optionally override its color. |
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 [Setup](#setup).
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 backgroundColor="#25A9EB" safeArea={false}>
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 `variant="select"` for a bulk-selection header. The selection count stays in
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
- variant="select"
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` | Overrides the default primary app-bar surface. |
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 style={{ color: '#01ABFF' }}>●</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
- radius={16}>
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` | Overrides both top corner radii. |
1330
- | `shadow` | Shows the platform surface shadow. Defaults to `true`; use `false` for a flat sheet. |
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
- ```