@nexub/react-native 0.0.0-stage → 2.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 (134) hide show
  1. package/README.md +113 -2
  2. package/lib/module/components/actions.js +222 -0
  3. package/lib/module/components/actions.js.map +1 -0
  4. package/lib/module/components/containers.js +300 -0
  5. package/lib/module/components/containers.js.map +1 -0
  6. package/lib/module/components/display.js +299 -0
  7. package/lib/module/components/display.js.map +1 -0
  8. package/lib/module/components/feedback.js +484 -0
  9. package/lib/module/components/feedback.js.map +1 -0
  10. package/lib/module/components/inputs.js +792 -0
  11. package/lib/module/components/inputs.js.map +1 -0
  12. package/lib/module/components/mobile.js +818 -0
  13. package/lib/module/components/mobile.js.map +1 -0
  14. package/lib/module/components/overlays.js +421 -0
  15. package/lib/module/components/overlays.js.map +1 -0
  16. package/lib/module/components/shared.js +57 -0
  17. package/lib/module/components/shared.js.map +1 -0
  18. package/lib/module/hooks/useControllableState.js +23 -0
  19. package/lib/module/hooks/useControllableState.js.map +1 -0
  20. package/lib/module/index.js +31 -0
  21. package/lib/module/index.js.map +1 -0
  22. package/lib/module/package.json +1 -0
  23. package/lib/module/patterns/app.js +709 -0
  24. package/lib/module/patterns/app.js.map +1 -0
  25. package/lib/module/patterns/auth.js +224 -0
  26. package/lib/module/patterns/auth.js.map +1 -0
  27. package/lib/module/patterns/home.js +201 -0
  28. package/lib/module/patterns/home.js.map +1 -0
  29. package/lib/module/patterns/index.js +8 -0
  30. package/lib/module/patterns/index.js.map +1 -0
  31. package/lib/module/patterns/money.js +419 -0
  32. package/lib/module/patterns/money.js.map +1 -0
  33. package/lib/module/primitives/Icon.js +17 -0
  34. package/lib/module/primitives/Icon.js.map +1 -0
  35. package/lib/module/primitives/Layout.js +79 -0
  36. package/lib/module/primitives/Layout.js.map +1 -0
  37. package/lib/module/primitives/Pressable.js +79 -0
  38. package/lib/module/primitives/Pressable.js.map +1 -0
  39. package/lib/module/primitives/ScreenContainer.js +58 -0
  40. package/lib/module/primitives/ScreenContainer.js.map +1 -0
  41. package/lib/module/primitives/Surface.js +57 -0
  42. package/lib/module/primitives/Surface.js.map +1 -0
  43. package/lib/module/primitives/Text.js +70 -0
  44. package/lib/module/primitives/Text.js.map +1 -0
  45. package/lib/module/theme/ThemeProvider.js +127 -0
  46. package/lib/module/theme/ThemeProvider.js.map +1 -0
  47. package/lib/module/theme/fonts.js +56 -0
  48. package/lib/module/theme/fonts.js.map +1 -0
  49. package/lib/module/theme/haptics.js +56 -0
  50. package/lib/module/theme/haptics.js.map +1 -0
  51. package/lib/module/theme/motion.js +89 -0
  52. package/lib/module/theme/motion.js.map +1 -0
  53. package/lib/module/theme/navigation.js +99 -0
  54. package/lib/module/theme/navigation.js.map +1 -0
  55. package/lib/typescript/components/actions.d.ts +53 -0
  56. package/lib/typescript/components/actions.d.ts.map +1 -0
  57. package/lib/typescript/components/containers.d.ts +59 -0
  58. package/lib/typescript/components/containers.d.ts.map +1 -0
  59. package/lib/typescript/components/display.d.ts +68 -0
  60. package/lib/typescript/components/display.d.ts.map +1 -0
  61. package/lib/typescript/components/feedback.d.ts +96 -0
  62. package/lib/typescript/components/feedback.d.ts.map +1 -0
  63. package/lib/typescript/components/inputs.d.ts +141 -0
  64. package/lib/typescript/components/inputs.d.ts.map +1 -0
  65. package/lib/typescript/components/mobile.d.ts +173 -0
  66. package/lib/typescript/components/mobile.d.ts.map +1 -0
  67. package/lib/typescript/components/overlays.d.ts +74 -0
  68. package/lib/typescript/components/overlays.d.ts.map +1 -0
  69. package/lib/typescript/components/shared.d.ts +20 -0
  70. package/lib/typescript/components/shared.d.ts.map +1 -0
  71. package/lib/typescript/hooks/useControllableState.d.ts +6 -0
  72. package/lib/typescript/hooks/useControllableState.d.ts.map +1 -0
  73. package/lib/typescript/index.d.ts +39 -0
  74. package/lib/typescript/index.d.ts.map +1 -0
  75. package/lib/typescript/package.json +1 -0
  76. package/lib/typescript/patterns/app.d.ts +139 -0
  77. package/lib/typescript/patterns/app.d.ts.map +1 -0
  78. package/lib/typescript/patterns/auth.d.ts +54 -0
  79. package/lib/typescript/patterns/auth.d.ts.map +1 -0
  80. package/lib/typescript/patterns/home.d.ts +50 -0
  81. package/lib/typescript/patterns/home.d.ts.map +1 -0
  82. package/lib/typescript/patterns/index.d.ts +9 -0
  83. package/lib/typescript/patterns/index.d.ts.map +1 -0
  84. package/lib/typescript/patterns/money.d.ts +106 -0
  85. package/lib/typescript/patterns/money.d.ts.map +1 -0
  86. package/lib/typescript/primitives/Icon.d.ts +12 -0
  87. package/lib/typescript/primitives/Icon.d.ts.map +1 -0
  88. package/lib/typescript/primitives/Layout.d.ts +26 -0
  89. package/lib/typescript/primitives/Layout.d.ts.map +1 -0
  90. package/lib/typescript/primitives/Pressable.d.ts +21 -0
  91. package/lib/typescript/primitives/Pressable.d.ts.map +1 -0
  92. package/lib/typescript/primitives/ScreenContainer.d.ts +25 -0
  93. package/lib/typescript/primitives/ScreenContainer.d.ts.map +1 -0
  94. package/lib/typescript/primitives/Surface.d.ts +23 -0
  95. package/lib/typescript/primitives/Surface.d.ts.map +1 -0
  96. package/lib/typescript/primitives/Text.d.ts +21 -0
  97. package/lib/typescript/primitives/Text.d.ts.map +1 -0
  98. package/lib/typescript/theme/ThemeProvider.d.ts +69 -0
  99. package/lib/typescript/theme/ThemeProvider.d.ts.map +1 -0
  100. package/lib/typescript/theme/fonts.d.ts +25 -0
  101. package/lib/typescript/theme/fonts.d.ts.map +1 -0
  102. package/lib/typescript/theme/haptics.d.ts +3 -0
  103. package/lib/typescript/theme/haptics.d.ts.map +1 -0
  104. package/lib/typescript/theme/motion.d.ts +79 -0
  105. package/lib/typescript/theme/motion.d.ts.map +1 -0
  106. package/lib/typescript/theme/navigation.d.ts +158 -0
  107. package/lib/typescript/theme/navigation.d.ts.map +1 -0
  108. package/package.json +138 -3
  109. package/src/components/actions.tsx +259 -0
  110. package/src/components/containers.tsx +352 -0
  111. package/src/components/display.tsx +345 -0
  112. package/src/components/feedback.tsx +541 -0
  113. package/src/components/inputs.tsx +899 -0
  114. package/src/components/mobile.tsx +883 -0
  115. package/src/components/overlays.tsx +488 -0
  116. package/src/components/shared.ts +54 -0
  117. package/src/hooks/useControllableState.ts +27 -0
  118. package/src/index.ts +177 -0
  119. package/src/patterns/app.tsx +715 -0
  120. package/src/patterns/auth.tsx +266 -0
  121. package/src/patterns/home.tsx +211 -0
  122. package/src/patterns/index.ts +59 -0
  123. package/src/patterns/money.tsx +458 -0
  124. package/src/primitives/Icon.tsx +15 -0
  125. package/src/primitives/Layout.tsx +71 -0
  126. package/src/primitives/Pressable.tsx +97 -0
  127. package/src/primitives/ScreenContainer.tsx +65 -0
  128. package/src/primitives/Surface.tsx +75 -0
  129. package/src/primitives/Text.tsx +79 -0
  130. package/src/theme/ThemeProvider.tsx +210 -0
  131. package/src/theme/fonts.ts +52 -0
  132. package/src/theme/haptics.ts +57 -0
  133. package/src/theme/motion.ts +105 -0
  134. package/src/theme/navigation.ts +68 -0
package/README.md CHANGED
@@ -1,3 +1,114 @@
1
- # Temporary Holding Version
1
+ # @nexub/react-native
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ React Native components and screen patterns for Nexub Design System. They use the same tokens, brands and prop names as `@nexub/react` on the web.
4
+
5
+ **Native chrome, Nexub content.** The system draws the tab bar, stack header, back gesture, action sheets, pickers and iOS 26 Liquid Glass; Nexub themes them. Everything inside a screen (lists, cards, buttons, inputs, money) is drawn by Nexub, so it looks the same on iOS, Android and the web.
6
+
7
+ Status: **alpha**. Built for Expo SDK 57+ / React Native 0.86+ (New Architecture). Works in Expo apps and bare React Native apps.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npx expo install @nexub/react-native react-native-reanimated react-native-worklets react-native-svg react-native-safe-area-context expo-font
13
+ ```
14
+
15
+ Optional peers. Add only what you use; without them the feature is a no-op or the component tells you what to install:
16
+
17
+ | Package | Used by |
18
+ |---|---|
19
+ | `expo-haptics` | Semantic haptics on every control |
20
+ | `expo-glass-effect` | Native Liquid Glass (`Surface material="glass"`) on iOS 26+ |
21
+ | `expo-screen-capture` | `PrivacyShield preventCapture` |
22
+ | `@react-native-community/datetimepicker` | `DateTimeField` |
23
+
24
+ `@nexub/tokens`, `@nexub/core`, `@nexub/icons` and the fonts (Inter, Plus Jakarta Sans, Geist Mono; OFL) come with the package.
25
+
26
+ ## Set up
27
+
28
+ ```tsx
29
+ import { useFonts } from 'expo-font';
30
+ import { Stack } from 'expo-router';
31
+ import { NexubNativeProvider, ToastProvider, nexubFonts, useNexubNavigation } from '@nexub/react-native';
32
+
33
+ function Screens() {
34
+ const nav = useNexubNavigation(); // native stack in Nexub colours and type
35
+ return <Stack screenOptions={nav.stack} />;
36
+ }
37
+
38
+ export default function RootLayout() {
39
+ const [ready] = useFonts(nexubFonts);
40
+ if (!ready) return null;
41
+ return (
42
+ <NexubNativeProvider product="payub">
43
+ <ToastProvider>
44
+ <Screens />
45
+ </ToastProvider>
46
+ </NexubNativeProvider>
47
+ );
48
+ }
49
+ ```
50
+
51
+ `NexubNativeProvider` props:
52
+
53
+ | Prop | Default | |
54
+ |---|---|---|
55
+ | `scheme` | `'system'` | `'light'`, `'dark'` or follow the OS |
56
+ | `contrast` | `'system'` | follows iOS Increase Contrast / Android high-contrast text (re-read on foreground) |
57
+ | `product` | none | `'leap' \| 'bookub' \| 'payub' \| 'founderub'`: remaps the tertiary family |
58
+ | `seed`, `seedTarget` | none | white-label colour: regenerates the primary (or tertiary) family with contrast-safe tones |
59
+ | `glass` | `'balanced'` | the user's glass dial; forced `'off'` under Reduce Transparency |
60
+ | `haptics` | `true` | the user's haptics setting |
61
+ | `fonts` | `'nexub'` | `'system'` to use the platform font |
62
+ | `locale`, `dir`, `messages` | `'en'` | Intl locale, RTL (derived from the locale) and translated strings, same as web `NexubProvider` |
63
+
64
+ Hooks: `useTheme()`, `useRoles()`, `useHaptics()`, `useNexubMessages()`, `useNexubNavigation()`.
65
+
66
+ ## Components
67
+
68
+ Names and props match `@nexub/react` where a web twin exists.
69
+
70
+ - **Primitives:** `Text`, `Heading`, `Pressable` (state layer, 0.97 press spring, haptic), `Surface` (tonal tiers, elevation, glass), `Box`, `Stack`, `Inline`, `Icon`, `ScreenContainer`.
71
+ - **Actions:** `Button`, `IconButton`, `ButtonGroup`, `Link`.
72
+ - **Data:** `Amount`, `Badge`, `Avatar`, `AvatarGroup`, `Divider`.
73
+ - **Inputs:** `TextField`, `PasswordInput`, `SearchField`, `MoneyInput`, `Stepper`, `Checkbox`, `RadioGroup` / `Radio`, `Switch` (the platform switch), `SegmentedControl`, `Slider`, `Chip`, `FilterChip`, `Select`, `DateTimeField`, `OTPInput`, `NumericKeypad`, `ExpressiveMoneyInput`.
74
+ - **Containers:** `Card`, `ListItem` (navigation, switch, checkbox, radio, button and value rows), `ListSection`, `Accordion`.
75
+ - **Overlays:** `BottomSheet` (detents), `ActionSheet` (system sheet on iOS), `ContextMenu`, `Dialog`.
76
+ - **Feedback:** `Banner`, `ToastProvider` / `useToast`, `Progress`, `LoadingIndicator`, `Skeleton`, `EmptyState`, `ErrorState`, `OfflineBanner`, `Coachmark`.
77
+ - **Mobile:** `SwipeableRow`, `RefreshControl`, `Carousel`, `PageIndicator`, `StickyFooter`, `SensitiveValue`, `PrivacyShield`, `FAB` (Android only by default).
78
+ - **Navigation helpers:** `nexubStackOptions`, `nexubNavigationTheme`, `nexubTabsOptions`.
79
+
80
+ - **Motion:** `nxEnter`, `nxExit`, `nxLayout` (Reanimated layout animations) and `nxSpring` (a `withSpring` config), built from the same spring tokens as the web. `<Animated.View entering={nxEnter('up')} exiting={nxExit('down')} layout={nxLayout()} />`. Toast, Banner, `ListSection` rows, `SwipeableRow`, `Chip`, the `SegmentedControl` pill and `Amount` (`animate`) already use them. In a `FlatList`, pass `nxLayout()` as `itemLayoutAnimation`.
81
+
82
+ Icons: `import { Search } from '@nexub/icons/native'`. These are the same names as `@nexub/icons`. Colour them with `<Icon icon={Search} color="primary" />`.
83
+
84
+ ## Patterns
85
+
86
+ `import { SignInScreen, AmountStep, ActivityList } from '@nexub/react-native/patterns'`. Each pattern is a screen template that takes data and callbacks, so it works with any router.
87
+
88
+ - **Auth:** `AuthScreen`, `SignInScreen`, `VerifyCodeScreen`, `LockScreen`.
89
+ - **Money:** `FlowStep`, `AmountStep`, `ReviewStep`, `ActivityList`, `TransactionDetail`, `ResultScreen`.
90
+ - **App:** `OnboardingScreen`, `PermissionPrimer`, `SettingsScreen`, `ProfileHeader`, `AppearanceSection`, `NotificationsInbox`, `SearchScreen`, `ChatScreen`, `PaywallScreen`, `AppSwitcherSheet`.
91
+
92
+ ## Rules the components follow
93
+
94
+ - **Touch targets:** every control reaches 44pt (`hitSlop` on smaller visuals). Primary actions use `size="lg"` (48).
95
+ - **Text scaling:** every role scales with the system text size. iOS follows Apple's Dynamic Type curve per role, and display and headline roles are capped so they don't push content off screen.
96
+ - **Screen readers:**
97
+ - A list row is one element ("Amazon, −$42.50, today").
98
+ - Swipe and long-press actions are also accessibility actions.
99
+ - Masked values read as "hidden".
100
+ - Toasts are announced.
101
+ - **Haptics are semantic** (`selection`, `toggleOn`/`toggleOff`, `confirm`, `reject`, `warning`, `snap`), never on plain taps, and never the only feedback.
102
+ - **Motion:** M3 springs. Enter rides the spatial spring; exit is quicker on the effects spring and never overshoots. Every preset follows the OS Reduce Motion setting.
103
+ - **Glass:** for the control layer only, never content. It is native Liquid Glass on iOS 26+, solid elsewhere and whenever the user turns transparency down.
104
+ - **Security:** `OTPInput` uses one field, so SMS autofill works. `PasswordInput` sets the platform autofill hints. `SensitiveValue` re-masks when the app backgrounds. `PrivacyShield` covers the app-switcher snapshot. The library makes no network calls and stores nothing.
105
+
106
+ ## Testing your app
107
+
108
+ The library's own tests use Jest (jest-expo) and React Native Testing Library. In your Jest setup, stub `react-native-reanimated`'s APIs and use `react-native-safe-area-context/jest/mock`; `packages/react-native/jest.setup.js` in the repo shows the pattern.
109
+
110
+ ## Links
111
+
112
+ - Docs: https://nexub-ds-docs.pages.dev/getting-started/react-native
113
+ - Plan and decisions: [MOBILE_PLAN.md](https://github.com/Nexub-AI/nexub-ds/blob/development/MOBILE_PLAN.md)
114
+ - Web components: `@nexub/react`
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+
3
+ import * as React from 'react';
4
+ import { ActivityIndicator, View } from 'react-native';
5
+ import { Pressable } from "../primitives/Pressable.js";
6
+ import { Surface } from "../primitives/Surface.js";
7
+ import { Text } from "../primitives/Text.js";
8
+ import { useTheme } from "../theme/ThemeProvider.js";
9
+ import { TONE_ROLES, controlHeight, disabledOpacity, hitSlopFor } from "./shared.js";
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ // [container role | undefined, content role]
12
+ const VARIANT = {
13
+ filled: ['primary', 'on-primary'],
14
+ tonal: ['secondary-container', 'on-secondary-container'],
15
+ outlined: [undefined, 'on-surface'],
16
+ text: [undefined, 'primary'],
17
+ glass: [undefined, 'on-surface']
18
+ };
19
+ const LABEL = {
20
+ xs: 'label-md',
21
+ sm: 'label-md',
22
+ md: 'label-lg',
23
+ lg: 'label-lg',
24
+ xl: 'title-md'
25
+ };
26
+ const PAD = {
27
+ xs: 10,
28
+ sm: 14,
29
+ md: 20,
30
+ lg: 24,
31
+ xl: 28
32
+ };
33
+ const ICON = {
34
+ xs: 'xs',
35
+ sm: 'sm',
36
+ md: 'sm',
37
+ lg: 'md',
38
+ xl: 'md'
39
+ };
40
+ /** Capsule button. One `filled` (or toned) action per screen; the rest tonal/outlined/text. */
41
+ export function Button({
42
+ children,
43
+ variant = 'filled',
44
+ tone,
45
+ size = 'md',
46
+ loading,
47
+ loadingLabel,
48
+ fullWidth,
49
+ leadingIcon: Leading,
50
+ trailingIcon: Trailing,
51
+ disabled,
52
+ style,
53
+ accessibilityLabel,
54
+ ...rest
55
+ }) {
56
+ const theme = useTheme();
57
+ const {
58
+ roles
59
+ } = theme;
60
+ const [bgRole, fgRole] = tone ? TONE_ROLES[tone] : VARIANT[variant];
61
+ const height = controlHeight(theme, size);
62
+ const fg = roles[fgRole];
63
+ const inactive = disabled || loading;
64
+ const label = typeof children === 'string' ? children : undefined;
65
+ const body = /*#__PURE__*/_jsxs(View, {
66
+ style: {
67
+ flexDirection: 'row',
68
+ alignItems: 'center',
69
+ justifyContent: 'center',
70
+ gap: 8,
71
+ opacity: disabled ? disabledOpacity(theme) : 1
72
+ },
73
+ children: [loading ? /*#__PURE__*/_jsx(ActivityIndicator, {
74
+ size: "small",
75
+ color: fg
76
+ }) : Leading && /*#__PURE__*/_jsx(Leading, {
77
+ size: ICON[size],
78
+ color: fg
79
+ }), typeof children === 'string' ? /*#__PURE__*/_jsx(Text, {
80
+ variant: LABEL[size],
81
+ style: {
82
+ color: fg
83
+ },
84
+ numberOfLines: 1,
85
+ children: children
86
+ }) : children, !loading && Trailing && /*#__PURE__*/_jsx(Trailing, {
87
+ size: ICON[size],
88
+ color: fg
89
+ })]
90
+ });
91
+ const shape = [{
92
+ height,
93
+ paddingHorizontal: PAD[size],
94
+ borderRadius: theme.tokens.shape.control,
95
+ justifyContent: 'center',
96
+ alignSelf: fullWidth ? 'stretch' : 'flex-start',
97
+ backgroundColor: bgRole ? roles[bgRole] : 'transparent'
98
+ }, variant === 'outlined' && !tone && {
99
+ borderWidth: 1,
100
+ borderColor: roles['outline-variant']
101
+ }, disabled && bgRole && {
102
+ backgroundColor: roles['on-surface'] + '1f'
103
+ },
104
+ // disabled-container 12%
105
+ style];
106
+ return /*#__PURE__*/_jsx(Pressable, {
107
+ accessibilityLabel: accessibilityLabel ?? (loading && loadingLabel ? loadingLabel : label),
108
+ accessibilityState: {
109
+ disabled: !!inactive,
110
+ busy: !!loading
111
+ },
112
+ disabled: inactive,
113
+ hitSlop: hitSlopFor(height),
114
+ stateLayer: fgRole,
115
+ style: variant === 'glass' && !tone ? {
116
+ alignSelf: fullWidth ? 'stretch' : 'flex-start'
117
+ } : shape,
118
+ ...rest,
119
+ children: variant === 'glass' && !tone ? /*#__PURE__*/_jsx(Surface, {
120
+ material: "glass",
121
+ radius: "control",
122
+ style: [{
123
+ height,
124
+ paddingHorizontal: PAD[size],
125
+ justifyContent: 'center'
126
+ }, style],
127
+ children: body
128
+ }) : body
129
+ });
130
+ }
131
+ /** Circular icon-only button; always 44pt+ to touch. */
132
+ export function IconButton({
133
+ icon: Glyph,
134
+ label,
135
+ variant = 'text',
136
+ tone,
137
+ size = 'md',
138
+ selected,
139
+ disabled,
140
+ style,
141
+ ...rest
142
+ }) {
143
+ const theme = useTheme();
144
+ const [bgRole, fgRole] = tone ? TONE_ROLES[tone] : VARIANT[variant];
145
+ const fgSelected = selected ? 'primary' : variant === 'text' && !tone ? 'on-surface-variant' : fgRole;
146
+ const height = controlHeight(theme, size);
147
+ return /*#__PURE__*/_jsx(Pressable, {
148
+ accessibilityLabel: label,
149
+ accessibilityState: {
150
+ disabled: !!disabled,
151
+ selected
152
+ },
153
+ disabled: disabled,
154
+ hitSlop: hitSlopFor(height),
155
+ stateLayer: fgRole,
156
+ style: [{
157
+ width: height,
158
+ height,
159
+ borderRadius: height / 2,
160
+ alignItems: 'center',
161
+ justifyContent: 'center',
162
+ backgroundColor: bgRole ? theme.roles[bgRole] : 'transparent',
163
+ opacity: disabled ? disabledOpacity(theme) : 1
164
+ }, variant === 'outlined' && {
165
+ borderWidth: 1,
166
+ borderColor: theme.roles['outline-variant']
167
+ }, style],
168
+ ...rest,
169
+ children: /*#__PURE__*/_jsx(Glyph, {
170
+ size: ICON[size] === 'xs' ? 'sm' : size === 'xl' ? 'lg' : 'md',
171
+ color: theme.roles[fgSelected]
172
+ })
173
+ });
174
+ }
175
+ /** Related actions together. In a stack, put the primary action first. */
176
+ export function ButtonGroup({
177
+ children,
178
+ direction = 'row',
179
+ style
180
+ }) {
181
+ const {
182
+ tokens
183
+ } = useTheme();
184
+ return /*#__PURE__*/_jsx(View, {
185
+ style: [direction === 'row' ? {
186
+ flexDirection: 'row',
187
+ flexWrap: 'wrap',
188
+ gap: tokens.spacing[2]
189
+ } : {
190
+ gap: tokens.spacing[3],
191
+ alignItems: 'stretch'
192
+ }, style],
193
+ children: direction === 'stack' ? React.Children.map(children, c => /*#__PURE__*/React.isValidElement(c) ? /*#__PURE__*/React.cloneElement(c, {
194
+ fullWidth: true
195
+ }) : c) : children
196
+ });
197
+ }
198
+ /** Inline text action. Opens nothing by itself: pass `onPress` (e.g. router.push / Linking.openURL). */
199
+ export function Link({
200
+ children,
201
+ style,
202
+ ...rest
203
+ }) {
204
+ return /*#__PURE__*/_jsx(Pressable, {
205
+ accessibilityRole: "link",
206
+ accessibilityLabel: children,
207
+ stateLayer: false,
208
+ pressScale: false,
209
+ hitSlop: 8,
210
+ style: style,
211
+ ...rest,
212
+ children: /*#__PURE__*/_jsx(Text, {
213
+ variant: "label-lg",
214
+ color: "primary",
215
+ style: {
216
+ textDecorationLine: 'underline'
217
+ },
218
+ children: children
219
+ })
220
+ });
221
+ }
222
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","ActivityIndicator","View","Pressable","Surface","Text","useTheme","TONE_ROLES","controlHeight","disabledOpacity","hitSlopFor","jsx","_jsx","jsxs","_jsxs","VARIANT","filled","tonal","outlined","undefined","text","glass","LABEL","xs","sm","md","lg","xl","PAD","ICON","Button","children","variant","tone","size","loading","loadingLabel","fullWidth","leadingIcon","Leading","trailingIcon","Trailing","disabled","style","accessibilityLabel","rest","theme","roles","bgRole","fgRole","height","fg","inactive","label","body","flexDirection","alignItems","justifyContent","gap","opacity","color","numberOfLines","shape","paddingHorizontal","borderRadius","tokens","control","alignSelf","backgroundColor","borderWidth","borderColor","accessibilityState","busy","hitSlop","stateLayer","material","radius","IconButton","icon","Glyph","selected","fgSelected","width","ButtonGroup","direction","flexWrap","spacing","Children","map","c","isValidElement","cloneElement","Link","accessibilityRole","pressScale","textDecorationLine"],"sourceRoot":"../../../src","sources":["components/actions.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,300 @@
1
+ "use strict";
2
+
3
+ import * as React from 'react';
4
+ import { Switch as RNSwitch, View } from 'react-native';
5
+ import Animated, { LayoutAnimationConfig } from 'react-native-reanimated';
6
+ import { Check, ChevronDown, ChevronRight } from '@nexub/icons/native';
7
+ import { useControllableState } from "../hooks/useControllableState.js";
8
+ import { Pressable } from "../primitives/Pressable.js";
9
+ import { Surface } from "../primitives/Surface.js";
10
+ import { Text } from "../primitives/Text.js";
11
+ import { useTheme } from "../theme/ThemeProvider.js";
12
+ import { nxEnter, nxExit, nxLayout } from "../theme/motion.js";
13
+ import { Divider } from "./display.js";
14
+ import { disabledOpacity } from "./shared.js";
15
+
16
+ // ─── Card ────────────────────────────────────────────────────────────────────
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
+ /** Content container on a tonal tier. Hierarchy through tone, not shadow (elevation for floating cards only). */
19
+ export function Card({
20
+ onPress,
21
+ accessibilityLabel,
22
+ tone = 'surface-container-low',
23
+ radius = 'container',
24
+ style,
25
+ children,
26
+ ...rest
27
+ }) {
28
+ const {
29
+ tokens
30
+ } = useTheme();
31
+ const surface = /*#__PURE__*/_jsx(Surface, {
32
+ tone: tone,
33
+ radius: radius,
34
+ style: [{
35
+ padding: tokens.spacing[4],
36
+ gap: tokens.spacing[2]
37
+ }, style],
38
+ ...rest,
39
+ children: children
40
+ });
41
+ if (!onPress) return surface;
42
+ return /*#__PURE__*/_jsx(Pressable, {
43
+ accessibilityLabel: accessibilityLabel,
44
+ onPress: onPress,
45
+ style: {
46
+ borderRadius: tokens.shape[radius] ?? radius
47
+ },
48
+ children: surface
49
+ });
50
+ }
51
+
52
+ // ─── ListItem ────────────────────────────────────────────────────────────────
53
+
54
+ /**
55
+ * One row of a list (Wise "List Item" model). The whole row is a single
56
+ * target and a single screen-reader element: "Title, subtitle, value".
57
+ */
58
+ export function ListItem({
59
+ title,
60
+ subtitle,
61
+ leading,
62
+ value,
63
+ trailing,
64
+ variant: variantProp,
65
+ checked,
66
+ onCheckedChange,
67
+ onPress,
68
+ destructive,
69
+ disabled,
70
+ style
71
+ }) {
72
+ const theme = useTheme();
73
+ const {
74
+ roles,
75
+ tokens,
76
+ dir
77
+ } = theme;
78
+ const variant = variantProp ?? (onPress ? 'navigation' : 'static');
79
+ const toggles = variant === 'switch' || variant === 'checkbox' || variant === 'radio';
80
+ const press = toggles ? () => onCheckedChange?.(variant === 'radio' ? true : !checked) : onPress;
81
+ const interactive = !!press && variant !== 'static' && variant !== 'value';
82
+ const role = {
83
+ switch: 'switch',
84
+ checkbox: 'checkbox',
85
+ radio: 'radio',
86
+ navigation: 'button',
87
+ button: 'button'
88
+ }[variant];
89
+ const trail = trailing ?? (variant === 'switch' ? /*#__PURE__*/_jsx(View, {
90
+ pointerEvents: "none",
91
+ importantForAccessibility: "no-hide-descendants",
92
+ accessibilityElementsHidden: true,
93
+ children: /*#__PURE__*/_jsx(RNSwitch, {
94
+ value: !!checked,
95
+ trackColor: {
96
+ false: roles['surface-container-highest'],
97
+ true: roles.primary
98
+ },
99
+ ios_backgroundColor: roles['surface-container-highest'],
100
+ thumbColor: roles['surface-container-lowest']
101
+ })
102
+ }) : variant === 'checkbox' || variant === 'radio' ? checked ? /*#__PURE__*/_jsx(Check, {
103
+ size: "md",
104
+ color: roles.primary
105
+ }) : null : variant === 'navigation' ? /*#__PURE__*/_jsxs(View, {
106
+ style: {
107
+ flexDirection: 'row',
108
+ alignItems: 'center',
109
+ gap: 4
110
+ },
111
+ children: [value && /*#__PURE__*/_jsx(Text, {
112
+ variant: "body-md",
113
+ color: "on-surface-variant",
114
+ tabular: true,
115
+ numberOfLines: 1,
116
+ children: value
117
+ }), /*#__PURE__*/_jsx(ChevronRight, {
118
+ size: "sm",
119
+ color: roles['on-surface-muted'],
120
+ style: dir === 'rtl' ? {
121
+ transform: [{
122
+ scaleX: -1
123
+ }]
124
+ } : undefined
125
+ })]
126
+ }) : variant === 'value' && value ? /*#__PURE__*/_jsx(Text, {
127
+ variant: "body-md",
128
+ color: "on-surface-variant",
129
+ tabular: true,
130
+ numberOfLines: 1,
131
+ children: value
132
+ }) : null);
133
+ const content = /*#__PURE__*/_jsxs(View, {
134
+ style: [{
135
+ minHeight: subtitle ? 72 : 56,
136
+ paddingHorizontal: tokens.spacing[4],
137
+ paddingVertical: tokens.spacing[3],
138
+ flexDirection: 'row',
139
+ alignItems: 'center',
140
+ gap: tokens.spacing[3],
141
+ opacity: disabled ? disabledOpacity(theme) : 1
142
+ }, style],
143
+ children: [leading, /*#__PURE__*/_jsxs(View, {
144
+ style: {
145
+ flex: 1,
146
+ gap: 2,
147
+ alignItems: variant === 'button' ? 'center' : 'flex-start'
148
+ },
149
+ children: [/*#__PURE__*/_jsx(Text, {
150
+ variant: "body-lg",
151
+ color: variant === 'button' ? destructive ? 'error' : 'primary' : 'on-surface',
152
+ children: title
153
+ }), subtitle && /*#__PURE__*/_jsx(Text, {
154
+ variant: "body-sm",
155
+ color: "on-surface-variant",
156
+ children: subtitle
157
+ })]
158
+ }), trail]
159
+ });
160
+ const a11yLabel = [title, subtitle, variant === 'switch' || toggles ? undefined : value].filter(Boolean).join(', ');
161
+ if (!interactive) {
162
+ return /*#__PURE__*/_jsx(View, {
163
+ accessible: true,
164
+ accessibilityLabel: a11yLabel,
165
+ children: content
166
+ });
167
+ }
168
+ return /*#__PURE__*/_jsx(Pressable, {
169
+ accessibilityRole: role,
170
+ accessibilityLabel: a11yLabel,
171
+ accessibilityState: {
172
+ disabled: !!disabled,
173
+ checked: toggles ? !!checked : undefined
174
+ },
175
+ disabled: disabled,
176
+ haptic: variant === 'radio' && !checked ? 'selection' : variant === 'checkbox' ? 'selection' : undefined,
177
+ onPress: press,
178
+ pressScale: false,
179
+ children: content
180
+ });
181
+ }
182
+
183
+ // ─── ListSection ─────────────────────────────────────────────────────────────
184
+
185
+ /** Inset-grouped rows on a container tier, hairlines between rows only. */
186
+ export function ListSection({
187
+ header,
188
+ footer,
189
+ inset = 16,
190
+ children,
191
+ style,
192
+ ...rest
193
+ }) {
194
+ const {
195
+ roles,
196
+ tokens
197
+ } = useTheme();
198
+ const rows = React.Children.toArray(children).filter(Boolean);
199
+ return /*#__PURE__*/_jsxs(View, {
200
+ style: [{
201
+ gap: tokens.spacing[2]
202
+ }, style],
203
+ ...rest,
204
+ children: [header && /*#__PURE__*/_jsx(Text, {
205
+ variant: "title-sm",
206
+ color: "on-surface-variant",
207
+ accessibilityRole: "header",
208
+ style: {
209
+ paddingHorizontal: tokens.spacing[4]
210
+ },
211
+ children: header
212
+ }), /*#__PURE__*/_jsx(View, {
213
+ style: {
214
+ borderRadius: tokens.shape.container,
215
+ overflow: 'hidden',
216
+ backgroundColor: roles['surface-container-lowest']
217
+ },
218
+ children: /*#__PURE__*/_jsx(LayoutAnimationConfig, {
219
+ skipEntering: true,
220
+ children: rows.map((row, i) => /*#__PURE__*/_jsxs(Animated.View, {
221
+ entering: nxEnter('fade'),
222
+ exiting: nxExit('fade'),
223
+ layout: nxLayout(),
224
+ children: [i > 0 && /*#__PURE__*/_jsx(Divider, {
225
+ inset: inset
226
+ }), row]
227
+ }, /*#__PURE__*/React.isValidElement(row) && row.key != null ? row.key : i))
228
+ })
229
+ }), footer && /*#__PURE__*/_jsx(Text, {
230
+ variant: "body-sm",
231
+ color: "on-surface-variant",
232
+ style: {
233
+ paddingHorizontal: tokens.spacing[4]
234
+ },
235
+ children: footer
236
+ })]
237
+ });
238
+ }
239
+
240
+ // ─── Accordion ───────────────────────────────────────────────────────────────
241
+
242
+ /** Disclosure: a header row that shows or hides its content. */
243
+ export function Accordion({
244
+ title,
245
+ expanded,
246
+ defaultExpanded = false,
247
+ onExpandedChange,
248
+ children,
249
+ style
250
+ }) {
251
+ const {
252
+ roles,
253
+ tokens
254
+ } = useTheme();
255
+ const [open, setOpen] = useControllableState({
256
+ value: expanded,
257
+ defaultValue: defaultExpanded,
258
+ onChange: onExpandedChange
259
+ });
260
+ return /*#__PURE__*/_jsxs(View, {
261
+ style: style,
262
+ children: [/*#__PURE__*/_jsxs(Pressable, {
263
+ accessibilityLabel: title,
264
+ accessibilityState: {
265
+ expanded: open
266
+ },
267
+ onPress: () => setOpen(!open),
268
+ pressScale: false,
269
+ style: {
270
+ minHeight: 56,
271
+ paddingHorizontal: tokens.spacing[4],
272
+ flexDirection: 'row',
273
+ alignItems: 'center',
274
+ gap: tokens.spacing[3]
275
+ },
276
+ children: [/*#__PURE__*/_jsx(Text, {
277
+ variant: "title-md",
278
+ style: {
279
+ flex: 1
280
+ },
281
+ children: title
282
+ }), /*#__PURE__*/_jsx(ChevronDown, {
283
+ size: "sm",
284
+ color: roles['on-surface-variant'],
285
+ style: open ? {
286
+ transform: [{
287
+ rotate: '180deg'
288
+ }]
289
+ } : undefined
290
+ })]
291
+ }), open && /*#__PURE__*/_jsx(View, {
292
+ style: {
293
+ paddingHorizontal: tokens.spacing[4],
294
+ paddingBottom: tokens.spacing[4]
295
+ },
296
+ children: children
297
+ })]
298
+ });
299
+ }
300
+ //# sourceMappingURL=containers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","Switch","RNSwitch","View","Animated","LayoutAnimationConfig","Check","ChevronDown","ChevronRight","useControllableState","Pressable","Surface","Text","useTheme","nxEnter","nxExit","nxLayout","Divider","disabledOpacity","jsx","_jsx","jsxs","_jsxs","Card","onPress","accessibilityLabel","tone","radius","style","children","rest","tokens","surface","padding","spacing","gap","borderRadius","shape","ListItem","title","subtitle","leading","value","trailing","variant","variantProp","checked","onCheckedChange","destructive","disabled","theme","roles","dir","toggles","press","interactive","role","switch","checkbox","radio","navigation","button","trail","pointerEvents","importantForAccessibility","accessibilityElementsHidden","trackColor","false","true","primary","ios_backgroundColor","thumbColor","size","color","flexDirection","alignItems","tabular","numberOfLines","transform","scaleX","undefined","content","minHeight","paddingHorizontal","paddingVertical","opacity","flex","a11yLabel","filter","Boolean","join","accessible","accessibilityRole","accessibilityState","haptic","pressScale","ListSection","header","footer","inset","rows","Children","toArray","container","overflow","backgroundColor","skipEntering","map","row","i","entering","exiting","layout","isValidElement","key","Accordion","expanded","defaultExpanded","onExpandedChange","open","setOpen","defaultValue","onChange","rotate","paddingBottom"],"sourceRoot":"../../../src","sources":["components/containers.tsx"],"mappings":"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","ignoreList":[]}