@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.
Files changed (77) hide show
  1. package/README.md +98 -127
  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.map +1 -1
  37. package/dist/module/theme/design-tokens.generated.js +5 -5
  38. package/dist/module/theme/design-tokens.generated.js.map +1 -1
  39. package/dist/module/theme/nativewind-tokens.generated.js +4 -4
  40. package/dist/module/theme/nativewind-tokens.generated.js.map +1 -1
  41. package/dist/typescript/components/accordion/accordion.d.ts +2 -3
  42. package/dist/typescript/components/accordion/accordion.d.ts.map +1 -1
  43. package/dist/typescript/components/app-bar/app-bar.d.ts +0 -2
  44. package/dist/typescript/components/app-bar/app-bar.d.ts.map +1 -1
  45. package/dist/typescript/components/avatar/avatar.d.ts +4 -7
  46. package/dist/typescript/components/avatar/avatar.d.ts.map +1 -1
  47. package/dist/typescript/components/badge/badge.d.ts +5 -8
  48. package/dist/typescript/components/badge/badge.d.ts.map +1 -1
  49. package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts +3 -5
  50. package/dist/typescript/components/bottom-navigation/bottom-navigation.d.ts.map +1 -1
  51. package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts +4 -1
  52. package/dist/typescript/components/bottom-sheet/bottom-sheet.d.ts.map +1 -1
  53. package/dist/typescript/components/button/button.d.ts +2 -3
  54. package/dist/typescript/components/button/button.d.ts.map +1 -1
  55. package/dist/typescript/components/calendar/calendar.d.ts +3 -4
  56. package/dist/typescript/components/calendar/calendar.d.ts.map +1 -1
  57. package/dist/typescript/components/card/card.d.ts +3 -7
  58. package/dist/typescript/components/card/card.d.ts.map +1 -1
  59. package/dist/typescript/components/dropdown/dropdown-menu.d.ts +3 -7
  60. package/dist/typescript/components/dropdown/dropdown-menu.d.ts.map +1 -1
  61. package/dist/typescript/components/icon-button/icon-button.d.ts +4 -5
  62. package/dist/typescript/components/icon-button/icon-button.d.ts.map +1 -1
  63. package/dist/typescript/components/pin-code-field/pin-code-field.d.ts +3 -2
  64. package/dist/typescript/components/pin-code-field/pin-code-field.d.ts.map +1 -1
  65. package/dist/typescript/components/shared/styling.d.ts +2 -0
  66. package/dist/typescript/components/shared/styling.d.ts.map +1 -1
  67. package/dist/typescript/components/skeleton/skeleton.d.ts +4 -5
  68. package/dist/typescript/components/skeleton/skeleton.d.ts.map +1 -1
  69. package/dist/typescript/components/tabs/tabs.d.ts +2 -4
  70. package/dist/typescript/components/tabs/tabs.d.ts.map +1 -1
  71. package/dist/typescript/index.d.ts +9 -9
  72. package/dist/typescript/index.d.ts.map +1 -1
  73. package/dist/typescript/theme/design-tokens.generated.d.ts +5 -5
  74. package/dist/typescript/theme/nativewind-tokens.generated.d.ts +4 -4
  75. package/nativewind.css +2 -2
  76. package/package.json +3 -1
  77. 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} />
84
+ <Avatar variant="image" source={photo} />
75
85
  ```
76
86
 
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.
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
- ## 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
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 the `blue` and `coral`
135
- theme families. Blue is the default, so existing `ThemeProvider mode={mode}`
136
- usage is unchanged. Components react to mode or family changes 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.
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). Regenerate
190
- the runtime TypeScript tokens and the NativeWind-compatible CSS variables after
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 standard NativeWind semantic utilities, import the generated opt-in
199
- 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:
200
190
 
201
191
  ```css
202
192
  @import '@indra-inter/neobrutalism-components/nativewind.css';
203
193
  ```
204
194
 
205
- This provides direct Blue light and dark values for every Mode role and status
206
- scale, including `text-foreground`, `bg-sidebar`, `text-code-foreground`,
207
- `bg-success-100`, `bg-info-100`, `bg-warning-100`, and `bg-error-100`.
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
- `tokens.css` remains available for compatibility and for consumers that need
243
- the namespaced `--neo-*` variables directly:
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`, `info`, `neutral`, or `noShadow`. |
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` / `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. |
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, shadowColor: '#01ABFF' }}
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 `shadowColor`. |
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" type="success">Published</Badge>
462
+ <Badge size="md" variant="success">Published</Badge>
469
463
 
470
- <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">
471
465
  Category
472
466
  </Badge>
473
467
  ```
474
468
 
475
469
  | Key prop | Description |
476
470
  | --- | --- |
477
- | `type` | `default`, `primary`, `info`, `error`, `warning`, or `success`. |
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` / `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. |
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` / `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. |
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` | 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. |
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` / `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. |
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 [Setup](#setup).
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 backgroundColor="#25A9EB" safeArea={false}>
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 `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
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
- variant="select"
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` | 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. |
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 style={{ color: '#01ABFF' }}>●</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
- radius={16}>
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` | Overrides both top corner radii. |
1375
- | `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. |
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
- ```