@beyondcorp/beyond-ui-native 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +130 -113
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +130 -113
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/accordion/accordion.tsx +5 -5
- package/src/components/bottom-sheet/bottom-sheet.tsx +4 -4
- package/src/components/data-table/data-table.tsx +12 -13
- package/src/components/select/select.tsx +30 -28
- package/src/providers/BeyondUIProvider.tsx +23 -4
- package/src/templates/auth/ForgotPasswordTemplate.tsx +4 -4
- package/src/templates/auth/SignInTemplate.tsx +9 -9
- package/src/templates/auth/SignUpTemplate.tsx +7 -7
- package/src/templates/dashboard/DashboardTemplate.tsx +13 -14
- package/src/templates/settings/SettingsTemplate.tsx +25 -25
package/package.json
CHANGED
|
@@ -148,7 +148,7 @@ export const AccordionItem = React.forwardRef<View, AccordionItemProps>(
|
|
|
148
148
|
<AccordionItemContext.Provider value={{ value, isOpen }}>
|
|
149
149
|
<View
|
|
150
150
|
ref={ref}
|
|
151
|
-
className={cn("border-b border-border py-1", className)}
|
|
151
|
+
className={cn("border-b border-neutral-200 dark:border-neutral-800 py-1", className)}
|
|
152
152
|
{...props}
|
|
153
153
|
>
|
|
154
154
|
{children}
|
|
@@ -200,13 +200,13 @@ export const AccordionTrigger = React.forwardRef<View, AccordionTriggerProps>(
|
|
|
200
200
|
>
|
|
201
201
|
<View className="flex-1 pr-2">
|
|
202
202
|
{typeof children === "string" ? (
|
|
203
|
-
<Text className="text-base font-medium text-
|
|
203
|
+
<Text className="text-base font-medium text-neutral-900 dark:text-neutral-100">{children}</Text>
|
|
204
204
|
) : (
|
|
205
205
|
children
|
|
206
206
|
)}
|
|
207
207
|
</View>
|
|
208
208
|
<Animated.View style={{ transform: [{ rotate }] }}>
|
|
209
|
-
<Text className="text-
|
|
209
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-base font-semibold">▼</Text>
|
|
210
210
|
</Animated.View>
|
|
211
211
|
</Pressable>
|
|
212
212
|
);
|
|
@@ -230,11 +230,11 @@ export const AccordionContent = React.forwardRef<View, AccordionContentProps>(
|
|
|
230
230
|
return (
|
|
231
231
|
<View
|
|
232
232
|
ref={ref}
|
|
233
|
-
className={cn("pt-1 pb-3 px-1
|
|
233
|
+
className={cn("pt-1 pb-3 px-1", className)}
|
|
234
234
|
{...props}
|
|
235
235
|
>
|
|
236
236
|
{typeof children === "string" ? (
|
|
237
|
-
<Text className="text-sm text-
|
|
237
|
+
<Text className="text-sm text-neutral-600 dark:text-neutral-400 leading-relaxed">{children}</Text>
|
|
238
238
|
) : (
|
|
239
239
|
children
|
|
240
240
|
)}
|
|
@@ -193,14 +193,14 @@ export const BottomSheetContent = React.forwardRef<View, BottomSheetContentProps
|
|
|
193
193
|
ref={ref}
|
|
194
194
|
style={{ transform: [{ translateY }] }}
|
|
195
195
|
className={cn(
|
|
196
|
-
"w-full bg-
|
|
196
|
+
"w-full bg-white dark:bg-neutral-900 rounded-t-3xl border-t border-neutral-200 dark:border-neutral-800 shadow-2xl pt-2 pb-8 px-6 max-h-[85%]",
|
|
197
197
|
className
|
|
198
198
|
)}
|
|
199
199
|
{...props}
|
|
200
200
|
>
|
|
201
201
|
{/* Drag Handle Bar */}
|
|
202
202
|
<View {...panResponder.panHandlers} className="w-full py-2 items-center">
|
|
203
|
-
<View className="w-12 h-1.5 rounded-full bg-
|
|
203
|
+
<View className="w-12 h-1.5 rounded-full bg-neutral-300 dark:bg-neutral-700" />
|
|
204
204
|
</View>
|
|
205
205
|
|
|
206
206
|
{children}
|
|
@@ -240,7 +240,7 @@ export const BottomSheetTitle: React.FC<BottomSheetTitleProps> = ({
|
|
|
240
240
|
children,
|
|
241
241
|
}) => {
|
|
242
242
|
return (
|
|
243
|
-
<Heading level={4} className={cn("text-xl font-bold text-
|
|
243
|
+
<Heading level={4} className={cn("text-xl font-bold text-neutral-900 dark:text-neutral-50", className)}>
|
|
244
244
|
{children}
|
|
245
245
|
</Heading>
|
|
246
246
|
);
|
|
@@ -259,7 +259,7 @@ export const BottomSheetDescription: React.FC<BottomSheetDescriptionProps> = ({
|
|
|
259
259
|
children,
|
|
260
260
|
}) => {
|
|
261
261
|
return (
|
|
262
|
-
<Text className={cn("text-sm text-
|
|
262
|
+
<Text className={cn("text-sm text-neutral-500 dark:text-neutral-400", className)}>
|
|
263
263
|
{children}
|
|
264
264
|
</Text>
|
|
265
265
|
);
|
|
@@ -124,7 +124,6 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
124
124
|
setSearch(val);
|
|
125
125
|
setCurrentPage(1);
|
|
126
126
|
}}
|
|
127
|
-
className="bg-card"
|
|
128
127
|
/>
|
|
129
128
|
)}
|
|
130
129
|
|
|
@@ -137,7 +136,7 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
137
136
|
</View>
|
|
138
137
|
) : paginatedData.length === 0 ? (
|
|
139
138
|
<Card className="items-center justify-center p-8">
|
|
140
|
-
<Text className="text-
|
|
139
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-base">{emptyText}</Text>
|
|
141
140
|
</Card>
|
|
142
141
|
) : mode === "card" ? (
|
|
143
142
|
/* Mobile Card Mode */
|
|
@@ -157,14 +156,14 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
157
156
|
return (
|
|
158
157
|
<View
|
|
159
158
|
key={String(col.key)}
|
|
160
|
-
className="flex-row items-center justify-between py-1 border-b border-border
|
|
159
|
+
className="flex-row items-center justify-between py-1 border-b border-neutral-200 dark:border-neutral-800 last:border-b-0"
|
|
161
160
|
>
|
|
162
|
-
<Text className="text-xs font-semibold text-
|
|
161
|
+
<Text className="text-xs font-semibold text-neutral-500 dark:text-neutral-400 uppercase tracking-wider">
|
|
163
162
|
{col.title}
|
|
164
163
|
</Text>
|
|
165
164
|
<View className="shrink">
|
|
166
165
|
{typeof renderedVal === "string" ? (
|
|
167
|
-
<Text className="text-sm font-medium text-
|
|
166
|
+
<Text className="text-sm font-medium text-neutral-900 dark:text-neutral-100">
|
|
168
167
|
{renderedVal}
|
|
169
168
|
</Text>
|
|
170
169
|
) : (
|
|
@@ -181,9 +180,9 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
181
180
|
) : (
|
|
182
181
|
/* Horizontal Table Mode */
|
|
183
182
|
<ScrollView horizontal showsHorizontalScrollIndicator={false}>
|
|
184
|
-
<View className="rounded-2xl border border-border bg-
|
|
183
|
+
<View className="rounded-2xl border border-neutral-200 dark:border-neutral-800 bg-white dark:bg-neutral-900 overflow-hidden">
|
|
185
184
|
{/* Header */}
|
|
186
|
-
<View className="flex-row bg-
|
|
185
|
+
<View className="flex-row bg-neutral-100 dark:bg-neutral-800/60 border-b border-neutral-200 dark:border-neutral-800">
|
|
187
186
|
{columns.map((col) => (
|
|
188
187
|
<Pressable
|
|
189
188
|
key={String(col.key)}
|
|
@@ -192,11 +191,11 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
192
191
|
style={{ width: col.width || 120 }}
|
|
193
192
|
className="px-4 py-3 flex-row items-center justify-between"
|
|
194
193
|
>
|
|
195
|
-
<Text className="text-xs font-bold text-
|
|
194
|
+
<Text className="text-xs font-bold text-neutral-900 dark:text-neutral-100 uppercase tracking-wider">
|
|
196
195
|
{col.title}
|
|
197
196
|
</Text>
|
|
198
197
|
{col.sortable && (
|
|
199
|
-
<Text className="text-xs text-
|
|
198
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400">
|
|
200
199
|
{sortKey === col.key
|
|
201
200
|
? sortDirection === "asc"
|
|
202
201
|
? "▲"
|
|
@@ -214,7 +213,7 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
214
213
|
key={keyExtractor(item, idx)}
|
|
215
214
|
disabled={!onRowPress}
|
|
216
215
|
onPress={() => onRowPress?.(item)}
|
|
217
|
-
className="flex-row border-b border-border
|
|
216
|
+
className="flex-row border-b border-neutral-200 dark:border-neutral-800 active:bg-neutral-100 dark:active:bg-neutral-800"
|
|
218
217
|
>
|
|
219
218
|
{columns.map((col) => {
|
|
220
219
|
const rawVal = item[col.key as string];
|
|
@@ -227,7 +226,7 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
227
226
|
className="px-4 py-3 justify-center"
|
|
228
227
|
>
|
|
229
228
|
{typeof renderedVal === "string" ? (
|
|
230
|
-
<Text className="text-sm text-
|
|
229
|
+
<Text className="text-sm text-neutral-900 dark:text-neutral-100">{renderedVal}</Text>
|
|
231
230
|
) : (
|
|
232
231
|
renderedVal
|
|
233
232
|
)}
|
|
@@ -243,7 +242,7 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
243
242
|
{/* Pagination Footer */}
|
|
244
243
|
{totalPages > 1 && (
|
|
245
244
|
<View className="flex-row items-center justify-between pt-2">
|
|
246
|
-
<Text className="text-xs text-
|
|
245
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400">
|
|
247
246
|
Showing {(currentPage - 1) * pageSize + 1} -{" "}
|
|
248
247
|
{Math.min(currentPage * pageSize, sortedData.length)} of{" "}
|
|
249
248
|
{sortedData.length}
|
|
@@ -258,7 +257,7 @@ export function DataTable<T extends Record<string, any>>({
|
|
|
258
257
|
>
|
|
259
258
|
Prev
|
|
260
259
|
</Button>
|
|
261
|
-
<Text className="text-xs font-medium text-
|
|
260
|
+
<Text className="text-xs font-medium text-neutral-900 dark:text-neutral-100 px-1">
|
|
262
261
|
{currentPage} / {totalPages}
|
|
263
262
|
</Text>
|
|
264
263
|
<Button
|
|
@@ -12,11 +12,11 @@ import { cn } from "../../utilities/cn";
|
|
|
12
12
|
import { Text } from "../text/text";
|
|
13
13
|
|
|
14
14
|
const selectTriggerVariants = cva(
|
|
15
|
-
"flex-row items-center justify-between rounded-xl border bg-
|
|
15
|
+
"flex-row items-center justify-between rounded-xl border bg-white dark:bg-neutral-900 px-4 py-3 active:opacity-80",
|
|
16
16
|
{
|
|
17
17
|
variants: {
|
|
18
18
|
variant: {
|
|
19
|
-
default: "border-border",
|
|
19
|
+
default: "border-neutral-300 dark:border-neutral-700",
|
|
20
20
|
error: "border-danger",
|
|
21
21
|
success: "border-success",
|
|
22
22
|
},
|
|
@@ -130,7 +130,7 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
130
130
|
>
|
|
131
131
|
<View className={cn("w-full gap-1.5", className)}>
|
|
132
132
|
{label && (
|
|
133
|
-
<Text className="text-sm font-medium text-
|
|
133
|
+
<Text className="text-sm font-medium text-neutral-800 dark:text-neutral-200">{label}</Text>
|
|
134
134
|
)}
|
|
135
135
|
|
|
136
136
|
{children ? (
|
|
@@ -149,19 +149,21 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
149
149
|
<Text
|
|
150
150
|
className={cn(
|
|
151
151
|
"text-base",
|
|
152
|
-
displayLabel
|
|
152
|
+
displayLabel
|
|
153
|
+
? "text-neutral-900 dark:text-neutral-100 font-medium"
|
|
154
|
+
: "text-neutral-500 dark:text-neutral-400 font-normal"
|
|
153
155
|
)}
|
|
154
156
|
>
|
|
155
157
|
{displayLabel || placeholder}
|
|
156
158
|
</Text>
|
|
157
|
-
<Text className="text-
|
|
159
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-xs">▼</Text>
|
|
158
160
|
</Pressable>
|
|
159
161
|
)}
|
|
160
162
|
|
|
161
163
|
{error ? (
|
|
162
164
|
<Text className="text-xs text-danger font-medium">{error}</Text>
|
|
163
165
|
) : helperText ? (
|
|
164
|
-
<Text className="text-xs text-
|
|
166
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400">{helperText}</Text>
|
|
165
167
|
) : null}
|
|
166
168
|
|
|
167
169
|
{/* Modal Options Picker if options prop was passed */}
|
|
@@ -175,13 +177,13 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
175
177
|
>
|
|
176
178
|
<View className="flex-1 justify-end bg-black/60">
|
|
177
179
|
<Pressable className="flex-1" onPress={() => setOpen(false)} />
|
|
178
|
-
<View className="w-full bg-
|
|
179
|
-
<View className="flex-row items-center justify-between pb-4 border-b border-border mb-3">
|
|
180
|
-
<Text className="text-lg font-bold text-
|
|
180
|
+
<View className="w-full bg-white dark:bg-neutral-900 rounded-t-3xl border-t border-neutral-200 dark:border-neutral-800 p-6 max-h-[75%]">
|
|
181
|
+
<View className="flex-row items-center justify-between pb-4 border-b border-neutral-200 dark:border-neutral-800 mb-3">
|
|
182
|
+
<Text className="text-lg font-bold text-neutral-900 dark:text-neutral-50">
|
|
181
183
|
{label || placeholder}
|
|
182
184
|
</Text>
|
|
183
185
|
<Pressable onPress={() => setOpen(false)} className="p-1">
|
|
184
|
-
<Text className="text-
|
|
186
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-lg font-semibold">✕</Text>
|
|
185
187
|
</Pressable>
|
|
186
188
|
</View>
|
|
187
189
|
|
|
@@ -192,7 +194,7 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
192
194
|
onChangeText={setSearchQuery}
|
|
193
195
|
placeholder="Search options..."
|
|
194
196
|
placeholderTextColor="#9ca3af"
|
|
195
|
-
className="h-11 px-4 rounded-xl border border-border bg-
|
|
197
|
+
className="h-11 px-4 rounded-xl border border-neutral-300 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-800 text-neutral-900 dark:text-neutral-100 text-base"
|
|
196
198
|
/>
|
|
197
199
|
</View>
|
|
198
200
|
)}
|
|
@@ -200,7 +202,7 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
200
202
|
<ScrollView className="max-h-80" showsVerticalScrollIndicator={false}>
|
|
201
203
|
{filteredOptions.length === 0 ? (
|
|
202
204
|
<View className="py-8 items-center">
|
|
203
|
-
<Text className="text-
|
|
205
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-sm">No options found</Text>
|
|
204
206
|
</View>
|
|
205
207
|
) : (
|
|
206
208
|
filteredOptions.map((opt) => {
|
|
@@ -211,8 +213,8 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
211
213
|
disabled={opt.disabled}
|
|
212
214
|
onPress={() => handleSelect(opt.value)}
|
|
213
215
|
className={cn(
|
|
214
|
-
"flex-row items-center justify-between py-3.5 px-3 rounded-xl active:bg-
|
|
215
|
-
isSelected && "bg-primary/
|
|
216
|
+
"flex-row items-center justify-between py-3.5 px-3 rounded-xl active:bg-neutral-100 dark:active:bg-neutral-800",
|
|
217
|
+
isSelected && "bg-primary-50 dark:bg-primary-950/40",
|
|
216
218
|
opt.disabled && "opacity-40"
|
|
217
219
|
)}
|
|
218
220
|
>
|
|
@@ -220,14 +222,14 @@ export const Select: React.FC<SelectProps> = ({
|
|
|
220
222
|
className={cn(
|
|
221
223
|
"text-base",
|
|
222
224
|
isSelected
|
|
223
|
-
? "text-primary font-semibold"
|
|
224
|
-
: "text-
|
|
225
|
+
? "text-primary-600 dark:text-primary-400 font-semibold"
|
|
226
|
+
: "text-neutral-900 dark:text-neutral-100 font-normal"
|
|
225
227
|
)}
|
|
226
228
|
>
|
|
227
229
|
{opt.label}
|
|
228
230
|
</Text>
|
|
229
231
|
{isSelected && (
|
|
230
|
-
<Text className="text-primary font-bold text-base">✓</Text>
|
|
232
|
+
<Text className="text-primary-600 dark:text-primary-400 font-bold text-base">✓</Text>
|
|
231
233
|
)}
|
|
232
234
|
</Pressable>
|
|
233
235
|
);
|
|
@@ -263,13 +265,13 @@ export const SelectTrigger: React.FC<SelectTriggerProps> = ({
|
|
|
263
265
|
accessibilityRole="combobox"
|
|
264
266
|
accessibilityState={{ expanded: open }}
|
|
265
267
|
className={cn(
|
|
266
|
-
"flex-row items-center justify-between rounded-xl border border-border bg-
|
|
268
|
+
"flex-row items-center justify-between rounded-xl border border-neutral-300 dark:border-neutral-700 bg-white dark:bg-neutral-900 px-4 py-3 active:opacity-80",
|
|
267
269
|
className
|
|
268
270
|
)}
|
|
269
271
|
{...props}
|
|
270
272
|
>
|
|
271
273
|
{children}
|
|
272
|
-
<Text className="text-
|
|
274
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-xs">▼</Text>
|
|
273
275
|
</Pressable>
|
|
274
276
|
);
|
|
275
277
|
};
|
|
@@ -289,7 +291,7 @@ export const SelectValue: React.FC<SelectValueProps> = ({
|
|
|
289
291
|
<Text
|
|
290
292
|
className={cn(
|
|
291
293
|
"text-base",
|
|
292
|
-
value ? "text-
|
|
294
|
+
value ? "text-neutral-900 dark:text-neutral-100 font-medium" : "text-neutral-500 dark:text-neutral-400",
|
|
293
295
|
className
|
|
294
296
|
)}
|
|
295
297
|
>
|
|
@@ -318,11 +320,11 @@ export const SelectContent: React.FC<SelectContentProps> = ({ title, children })
|
|
|
318
320
|
>
|
|
319
321
|
<View className="flex-1 justify-end bg-black/60">
|
|
320
322
|
<Pressable className="flex-1" onPress={() => setOpen(false)} />
|
|
321
|
-
<View className="w-full bg-
|
|
322
|
-
<View className="flex-row items-center justify-between pb-3 border-b border-border mb-3">
|
|
323
|
-
<Text className="text-lg font-bold text-
|
|
323
|
+
<View className="w-full bg-white dark:bg-neutral-900 rounded-t-3xl border-t border-neutral-200 dark:border-neutral-800 p-6 max-h-[75%]">
|
|
324
|
+
<View className="flex-row items-center justify-between pb-3 border-b border-neutral-200 dark:border-neutral-800 mb-3">
|
|
325
|
+
<Text className="text-lg font-bold text-neutral-900 dark:text-neutral-100">{title || "Select"}</Text>
|
|
324
326
|
<Pressable onPress={() => setOpen(false)} className="p-1">
|
|
325
|
-
<Text className="text-
|
|
327
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-lg font-semibold">✕</Text>
|
|
326
328
|
</Pressable>
|
|
327
329
|
</View>
|
|
328
330
|
<ScrollView className="max-h-80">{children}</ScrollView>
|
|
@@ -351,8 +353,8 @@ export const SelectItem: React.FC<SelectItemProps> = ({
|
|
|
351
353
|
<Pressable
|
|
352
354
|
onPress={() => onSelect(itemValue)}
|
|
353
355
|
className={cn(
|
|
354
|
-
"flex-row items-center justify-between py-3.5 px-3 rounded-xl active:bg-
|
|
355
|
-
isSelected && "bg-primary/
|
|
356
|
+
"flex-row items-center justify-between py-3.5 px-3 rounded-xl active:bg-neutral-100 dark:active:bg-neutral-800",
|
|
357
|
+
isSelected && "bg-primary-50 dark:bg-primary-950/40",
|
|
356
358
|
className
|
|
357
359
|
)}
|
|
358
360
|
>
|
|
@@ -360,7 +362,7 @@ export const SelectItem: React.FC<SelectItemProps> = ({
|
|
|
360
362
|
<Text
|
|
361
363
|
className={cn(
|
|
362
364
|
"text-base",
|
|
363
|
-
isSelected ? "text-primary font-semibold" : "text-
|
|
365
|
+
isSelected ? "text-primary-600 dark:text-primary-400 font-semibold" : "text-neutral-900 dark:text-neutral-100 font-normal"
|
|
364
366
|
)}
|
|
365
367
|
>
|
|
366
368
|
{children}
|
|
@@ -368,7 +370,7 @@ export const SelectItem: React.FC<SelectItemProps> = ({
|
|
|
368
370
|
) : (
|
|
369
371
|
children
|
|
370
372
|
)}
|
|
371
|
-
{isSelected && <Text className="text-primary font-bold text-base">✓</Text>}
|
|
373
|
+
{isSelected && <Text className="text-primary-600 dark:text-primary-400 font-bold text-base">✓</Text>}
|
|
372
374
|
</Pressable>
|
|
373
375
|
);
|
|
374
376
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { View, useColorScheme as useRNColorScheme } from "react-native";
|
|
3
|
+
import { colorScheme as nwColorScheme } from "nativewind";
|
|
3
4
|
import { PortalHost } from "@rn-primitives/portal";
|
|
4
5
|
import { ToastContext, ToastItem, ToastContextValue } from "../components/toast/types";
|
|
5
6
|
import { ToastContainer } from "../components/toast/toast";
|
|
@@ -38,10 +39,28 @@ export function BeyondUIProvider({
|
|
|
38
39
|
const activeScheme: "light" | "dark" =
|
|
39
40
|
selectedScheme === "system" ? systemScheme : selectedScheme;
|
|
40
41
|
|
|
42
|
+
// Sync NativeWind colorScheme store with BeyondUIProvider active scheme
|
|
43
|
+
React.useEffect(() => {
|
|
44
|
+
try {
|
|
45
|
+
nwColorScheme.set(selectedScheme === "system" ? "system" : activeScheme);
|
|
46
|
+
} catch (_) {}
|
|
47
|
+
}, [selectedScheme, activeScheme]);
|
|
48
|
+
|
|
49
|
+
const handleSetColorScheme = React.useCallback((scheme: ColorScheme) => {
|
|
50
|
+
setSelectedScheme(scheme);
|
|
51
|
+
try {
|
|
52
|
+
nwColorScheme.set(scheme === "system" ? "system" : scheme);
|
|
53
|
+
} catch (_) {}
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
41
56
|
const toggleColorScheme = React.useCallback(() => {
|
|
42
57
|
setSelectedScheme((prev) => {
|
|
43
58
|
const current = prev === "system" ? systemScheme : prev;
|
|
44
|
-
|
|
59
|
+
const next = current === "dark" ? "light" : "dark";
|
|
60
|
+
try {
|
|
61
|
+
nwColorScheme.set(next);
|
|
62
|
+
} catch (_) {}
|
|
63
|
+
return next;
|
|
45
64
|
});
|
|
46
65
|
}, [systemScheme]);
|
|
47
66
|
|
|
@@ -77,10 +96,10 @@ export function BeyondUIProvider({
|
|
|
77
96
|
const contextValue: BeyondUIContextValue = React.useMemo(
|
|
78
97
|
() => ({
|
|
79
98
|
colorScheme: activeScheme,
|
|
80
|
-
setColorScheme:
|
|
99
|
+
setColorScheme: handleSetColorScheme,
|
|
81
100
|
toggleColorScheme,
|
|
82
101
|
}),
|
|
83
|
-
[activeScheme, toggleColorScheme]
|
|
102
|
+
[activeScheme, handleSetColorScheme, toggleColorScheme]
|
|
84
103
|
);
|
|
85
104
|
|
|
86
105
|
return (
|
|
@@ -88,7 +107,7 @@ export function BeyondUIProvider({
|
|
|
88
107
|
<ToastContext.Provider value={toastContextValue}>
|
|
89
108
|
<View
|
|
90
109
|
style={{ flex: 1 }}
|
|
91
|
-
className={activeScheme === "dark" ? "dark flex-1" : "flex-1"}
|
|
110
|
+
className={activeScheme === "dark" ? "dark flex-1 bg-neutral-950" : "flex-1 bg-white"}
|
|
92
111
|
>
|
|
93
112
|
{children}
|
|
94
113
|
<PortalHost />
|
|
@@ -50,7 +50,7 @@ export const ForgotPasswordTemplate: React.FC<ForgotPasswordTemplateProps> = ({
|
|
|
50
50
|
<KeyboardAvoidingView
|
|
51
51
|
behavior={Platform.OS === "ios" ? "padding" : "height"}
|
|
52
52
|
style={{ flex: 1 }}
|
|
53
|
-
className={cn("flex-1 bg-
|
|
53
|
+
className={cn("flex-1 bg-neutral-50 dark:bg-neutral-950", className)}
|
|
54
54
|
>
|
|
55
55
|
<ScrollView
|
|
56
56
|
style={{ flex: 1 }}
|
|
@@ -61,10 +61,10 @@ export const ForgotPasswordTemplate: React.FC<ForgotPasswordTemplateProps> = ({
|
|
|
61
61
|
>
|
|
62
62
|
<View className="w-full max-w-md mx-auto gap-6">
|
|
63
63
|
<View className="items-center gap-2">
|
|
64
|
-
<Heading level={2} className="text-3xl font-extrabold text-
|
|
64
|
+
<Heading level={2} className="text-3xl font-extrabold text-neutral-900 dark:text-neutral-50 text-center">
|
|
65
65
|
{title}
|
|
66
66
|
</Heading>
|
|
67
|
-
<Text className="text-
|
|
67
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-center text-base">
|
|
68
68
|
{subtitle}
|
|
69
69
|
</Text>
|
|
70
70
|
</View>
|
|
@@ -117,7 +117,7 @@ export const ForgotPasswordTemplate: React.FC<ForgotPasswordTemplateProps> = ({
|
|
|
117
117
|
{onBackToSignIn && (
|
|
118
118
|
<View className="flex-row justify-center items-center gap-1.5 pt-2">
|
|
119
119
|
<Pressable onPress={onBackToSignIn}>
|
|
120
|
-
<Text className="text-sm font-semibold text-primary">
|
|
120
|
+
<Text className="text-sm font-semibold text-primary-600 dark:text-primary-400">
|
|
121
121
|
Back to Sign In
|
|
122
122
|
</Text>
|
|
123
123
|
</Pressable>
|
|
@@ -72,7 +72,7 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
72
72
|
<KeyboardAvoidingView
|
|
73
73
|
behavior={Platform.OS === "ios" ? "padding" : "height"}
|
|
74
74
|
style={{ flex: 1 }}
|
|
75
|
-
className={cn("flex-1 bg-
|
|
75
|
+
className={cn("flex-1 bg-neutral-50 dark:bg-neutral-950", className)}
|
|
76
76
|
>
|
|
77
77
|
<ScrollView
|
|
78
78
|
style={{ flex: 1 }}
|
|
@@ -85,10 +85,10 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
85
85
|
{/* Logo & Header */}
|
|
86
86
|
<View className="items-center gap-2">
|
|
87
87
|
{logo && <View className="mb-2">{logo}</View>}
|
|
88
|
-
<Heading level={2} className="text-3xl font-extrabold text-
|
|
88
|
+
<Heading level={2} className="text-3xl font-extrabold text-neutral-900 dark:text-neutral-50 text-center">
|
|
89
89
|
{title}
|
|
90
90
|
</Heading>
|
|
91
|
-
<Text className="text-
|
|
91
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-center text-base">
|
|
92
92
|
{subtitle}
|
|
93
93
|
</Text>
|
|
94
94
|
</View>
|
|
@@ -129,7 +129,7 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
129
129
|
error={passwordError}
|
|
130
130
|
rightElement={
|
|
131
131
|
<Pressable onPress={() => setShowPassword((p) => !p)} className="p-1">
|
|
132
|
-
<Text className="text-xs text-
|
|
132
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400 font-semibold">
|
|
133
133
|
{showPassword ? "HIDE" : "SHOW"}
|
|
134
134
|
</Text>
|
|
135
135
|
</Pressable>
|
|
@@ -141,12 +141,12 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
141
141
|
<View className="flex-row items-center justify-between py-1">
|
|
142
142
|
<View className="flex-row items-center gap-2">
|
|
143
143
|
<Checkbox checked={rememberMe} onCheckedChange={setRememberMe} />
|
|
144
|
-
<Text className="text-sm text-
|
|
144
|
+
<Text className="text-sm text-neutral-900 dark:text-neutral-100">Remember me</Text>
|
|
145
145
|
</View>
|
|
146
146
|
|
|
147
147
|
{onForgotPassword && (
|
|
148
148
|
<Pressable onPress={onForgotPassword}>
|
|
149
|
-
<Text className="text-sm font-semibold text-primary">
|
|
149
|
+
<Text className="text-sm font-semibold text-primary-600 dark:text-primary-400">
|
|
150
150
|
Forgot password?
|
|
151
151
|
</Text>
|
|
152
152
|
</Pressable>
|
|
@@ -170,7 +170,7 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
170
170
|
<View className="gap-4">
|
|
171
171
|
<View className="flex-row items-center gap-3">
|
|
172
172
|
<Separator className="flex-1" />
|
|
173
|
-
<Text className="text-xs text-
|
|
173
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400 uppercase">or continue with</Text>
|
|
174
174
|
<Separator className="flex-1" />
|
|
175
175
|
</View>
|
|
176
176
|
|
|
@@ -200,9 +200,9 @@ export const SignInTemplate: React.FC<SignInTemplateProps> = ({
|
|
|
200
200
|
{/* Switch to SignUp */}
|
|
201
201
|
{onSignUpPress && (
|
|
202
202
|
<View className="flex-row justify-center items-center gap-1.5 pt-2">
|
|
203
|
-
<Text className="text-sm text-
|
|
203
|
+
<Text className="text-sm text-neutral-500 dark:text-neutral-400">Don't have an account?</Text>
|
|
204
204
|
<Pressable onPress={onSignUpPress}>
|
|
205
|
-
<Text className="text-sm font-bold text-primary">Sign Up</Text>
|
|
205
|
+
<Text className="text-sm font-bold text-primary-600 dark:text-primary-400">Sign Up</Text>
|
|
206
206
|
</Pressable>
|
|
207
207
|
</View>
|
|
208
208
|
)}
|
|
@@ -88,7 +88,7 @@ export const SignUpTemplate: React.FC<SignUpTemplateProps> = ({
|
|
|
88
88
|
<KeyboardAvoidingView
|
|
89
89
|
behavior={Platform.OS === "ios" ? "padding" : "height"}
|
|
90
90
|
style={{ flex: 1 }}
|
|
91
|
-
className={cn("flex-1 bg-
|
|
91
|
+
className={cn("flex-1 bg-neutral-50 dark:bg-neutral-950", className)}
|
|
92
92
|
>
|
|
93
93
|
<ScrollView
|
|
94
94
|
style={{ flex: 1 }}
|
|
@@ -101,10 +101,10 @@ export const SignUpTemplate: React.FC<SignUpTemplateProps> = ({
|
|
|
101
101
|
{/* Header */}
|
|
102
102
|
<View className="items-center gap-2">
|
|
103
103
|
{logo && <View className="mb-2">{logo}</View>}
|
|
104
|
-
<Heading level={2} className="text-3xl font-extrabold text-
|
|
104
|
+
<Heading level={2} className="text-3xl font-extrabold text-neutral-900 dark:text-neutral-50 text-center">
|
|
105
105
|
{title}
|
|
106
106
|
</Heading>
|
|
107
|
-
<Text className="text-
|
|
107
|
+
<Text className="text-neutral-500 dark:text-neutral-400 text-center text-base">
|
|
108
108
|
{subtitle}
|
|
109
109
|
</Text>
|
|
110
110
|
</View>
|
|
@@ -164,7 +164,7 @@ export const SignUpTemplate: React.FC<SignUpTemplateProps> = ({
|
|
|
164
164
|
if (termsError) setTermsError(undefined);
|
|
165
165
|
}}
|
|
166
166
|
/>
|
|
167
|
-
<Text className="text-sm text-
|
|
167
|
+
<Text className="text-sm text-neutral-900 dark:text-neutral-100 flex-1">
|
|
168
168
|
I agree to the Terms of Service & Privacy Policy
|
|
169
169
|
</Text>
|
|
170
170
|
</View>
|
|
@@ -190,7 +190,7 @@ export const SignUpTemplate: React.FC<SignUpTemplateProps> = ({
|
|
|
190
190
|
<View className="gap-4">
|
|
191
191
|
<View className="flex-row items-center gap-3">
|
|
192
192
|
<Separator className="flex-1" />
|
|
193
|
-
<Text className="text-xs text-
|
|
193
|
+
<Text className="text-xs text-neutral-500 dark:text-neutral-400 uppercase">or continue with</Text>
|
|
194
194
|
<Separator className="flex-1" />
|
|
195
195
|
</View>
|
|
196
196
|
|
|
@@ -220,9 +220,9 @@ export const SignUpTemplate: React.FC<SignUpTemplateProps> = ({
|
|
|
220
220
|
{/* Back to SignIn */}
|
|
221
221
|
{onSignInPress && (
|
|
222
222
|
<View className="flex-row justify-center items-center gap-1.5 pt-2">
|
|
223
|
-
<Text className="text-sm text-
|
|
223
|
+
<Text className="text-sm text-neutral-500 dark:text-neutral-400">Already have an account?</Text>
|
|
224
224
|
<Pressable onPress={onSignInPress}>
|
|
225
|
-
<Text className="text-sm font-bold text-primary">Sign In</Text>
|
|
225
|
+
<Text className="text-sm font-bold text-primary-600 dark:text-primary-400">Sign In</Text>
|
|
226
226
|
</Pressable>
|
|
227
227
|
</View>
|
|
228
228
|
)}
|