@umituz/react-native-design-system 4.23.55 → 4.23.56
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/package.json +1 -1
- package/src/atoms/EmptyState.tsx +9 -9
- package/src/atoms/index.ts +0 -1
- package/src/exports/atoms.ts +0 -1
- package/src/exports/molecules/bottom-sheet.ts +0 -1
- package/src/exports/theme.ts +0 -1
- package/src/filesystem/infrastructure/services/file-reader.service.ts +6 -5
- package/src/image/presentation/components/editor/FilterPickerSheet.tsx +1 -1
- package/src/image/presentation/components/editor/StickerPickerSheet.tsx +1 -1
- package/src/molecules/bottom-sheet/index.ts +0 -1
- package/src/molecules/navigation/hooks/useAppNavigation.ts +2 -2
- package/src/onboarding/domain/entities/OnboardingSlide.ts +1 -1
- package/src/onboarding/domain/types/ImageSourceType.ts +8 -0
- package/src/onboarding/infrastructure/utils/layouts/layoutTypes.ts +2 -2
- package/src/storage/domain/factories/StoreFactory.ts +1 -2
- package/src/storage/domain/types/Store.ts +9 -0
- package/src/storage/index.ts +2 -4
- package/src/storage/infrastructure/adapters/StorageService.ts +1 -9
- package/src/tanstack/domain/config/QueryClientAccessor.ts +69 -0
- package/src/tanstack/domain/repositories/BaseRepository.ts +1 -1
- package/src/tanstack/domain/repositories/RepositoryFactory.ts +1 -1
- package/src/tanstack/infrastructure/config/QueryClientSingleton.ts +7 -65
- package/src/tanstack/presentation/hooks/usePrefetch.ts +2 -1
- package/src/theme/core/themes.ts +0 -16
- package/src/theme/core/tokens/BaseTokens.ts +0 -4
- package/src/theme/core/tokens/Borders.ts +3 -2
- package/src/theme/core/tokens/Sizes.ts +2 -1
- package/src/theme/core/tokens/Typography.ts +0 -19
- package/src/theme/hooks/commonStyles/textStyles.ts +4 -2
- package/src/theme/index.ts +0 -1
- package/src/theme/infrastructure/providers/DesignSystemProvider.tsx +4 -4
- package/src/theme/infrastructure/stores/themeStore.ts +0 -2
- package/src/molecules/bottom-sheet/SafeBottomSheetModalProvider.tsx +0 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-design-system",
|
|
3
|
-
"version": "4.23.
|
|
3
|
+
"version": "4.23.56",
|
|
4
4
|
"description": "Universal design system for React Native apps - Consolidated package with atoms, molecules, organisms, theme, typography, responsive, safe area, exception, infinite scroll, UUID, image, timezone, offline, onboarding, and loading utilities",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
package/src/atoms/EmptyState.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import React from 'react';
|
|
|
11
11
|
import { View, StyleSheet, TouchableOpacity, ViewStyle } from 'react-native';
|
|
12
12
|
import { AtomicIcon } from './icon';
|
|
13
13
|
import { AtomicText } from './AtomicText';
|
|
14
|
-
import { useAppDesignTokens,
|
|
14
|
+
import { useAppDesignTokens, BASE_TOKENS } from '../theme';
|
|
15
15
|
|
|
16
16
|
export interface EmptyStateProps {
|
|
17
17
|
icon?: string;
|
|
@@ -95,7 +95,7 @@ const styles = StyleSheet.create({
|
|
|
95
95
|
flex: 1,
|
|
96
96
|
alignItems: 'flex-start',
|
|
97
97
|
justifyContent: 'flex-start',
|
|
98
|
-
padding:
|
|
98
|
+
padding: BASE_TOKENS.spacing.xl,
|
|
99
99
|
},
|
|
100
100
|
iconContainer: {
|
|
101
101
|
width: 120,
|
|
@@ -103,18 +103,18 @@ const styles = StyleSheet.create({
|
|
|
103
103
|
borderRadius: 60,
|
|
104
104
|
alignItems: 'flex-start',
|
|
105
105
|
justifyContent: 'flex-start',
|
|
106
|
-
marginBottom:
|
|
106
|
+
marginBottom: BASE_TOKENS.spacing.lg,
|
|
107
107
|
},
|
|
108
108
|
title: {
|
|
109
|
-
marginBottom:
|
|
109
|
+
marginBottom: BASE_TOKENS.spacing.sm,
|
|
110
110
|
},
|
|
111
111
|
description: {
|
|
112
|
-
marginBottom:
|
|
112
|
+
marginBottom: BASE_TOKENS.spacing.lg,
|
|
113
113
|
},
|
|
114
114
|
actionButton: {
|
|
115
|
-
paddingHorizontal:
|
|
116
|
-
paddingVertical:
|
|
117
|
-
borderRadius:
|
|
118
|
-
marginTop:
|
|
115
|
+
paddingHorizontal: BASE_TOKENS.spacing.lg,
|
|
116
|
+
paddingVertical: BASE_TOKENS.spacing.md,
|
|
117
|
+
borderRadius: BASE_TOKENS.borders.radius.md,
|
|
118
|
+
marginTop: BASE_TOKENS.spacing.sm,
|
|
119
119
|
},
|
|
120
120
|
});
|
package/src/atoms/index.ts
CHANGED
package/src/exports/atoms.ts
CHANGED
package/src/exports/theme.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Single Responsibility: Read files from device storage
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import { File } from "expo-file-system";
|
|
7
7
|
import type { FileEncoding } from "../../domain/entities/File";
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -14,10 +14,11 @@ export async function readFile(
|
|
|
14
14
|
encoding: FileEncoding = "utf8",
|
|
15
15
|
): Promise<string | null> {
|
|
16
16
|
try {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const file = new File(uri);
|
|
18
|
+
if (encoding === "base64") {
|
|
19
|
+
return await file.base64();
|
|
20
|
+
}
|
|
21
|
+
return await file.text();
|
|
21
22
|
} catch {
|
|
22
23
|
return null;
|
|
23
24
|
}
|
|
@@ -28,7 +28,7 @@ export const FilterPickerSheet = forwardRef<BottomSheetModalRef, FilterPickerShe
|
|
|
28
28
|
return (
|
|
29
29
|
<BottomSheetModal ref={ref} snapPoints={snapPoints} onDismiss={onDismiss}>
|
|
30
30
|
<View style={{ padding: tokens.spacing.lg, flex: 1 }}>
|
|
31
|
-
<AtomicText style={{ ...tokens.typography.
|
|
31
|
+
<AtomicText style={{ ...tokens.typography.titleLarge, fontWeight: tokens.typography.semibold, marginBottom: tokens.spacing.md }}>
|
|
32
32
|
{title}
|
|
33
33
|
</AtomicText>
|
|
34
34
|
|
|
@@ -26,7 +26,7 @@ export const StickerPickerSheet = forwardRef<BottomSheetModalRef, StickerPickerS
|
|
|
26
26
|
return (
|
|
27
27
|
<BottomSheetModal ref={ref} snapPoints={snapPoints} onDismiss={onDismiss}>
|
|
28
28
|
<View style={{ padding: tokens.spacing.lg, flex: 1 }}>
|
|
29
|
-
<AtomicText style={{ ...tokens.typography.
|
|
29
|
+
<AtomicText style={{ ...tokens.typography.titleLarge, fontWeight: tokens.typography.semibold, marginBottom: tokens.spacing.md }}>
|
|
30
30
|
{title}
|
|
31
31
|
</AtomicText>
|
|
32
32
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useNavigation } from "@react-navigation/native";
|
|
1
|
+
import { useNavigation, CommonActions } from "@react-navigation/native";
|
|
2
2
|
import type { NavigationProp, ParamListBase } from "@react-navigation/native";
|
|
3
3
|
import { useCallback, useMemo } from "react";
|
|
4
4
|
|
|
@@ -30,7 +30,7 @@ export function useAppNavigation(): AppNavigationResult {
|
|
|
30
30
|
|
|
31
31
|
const navigate = useCallback(
|
|
32
32
|
(screen: string, params?: Record<string, unknown>) => {
|
|
33
|
-
|
|
33
|
+
navigation.dispatch(CommonActions.navigate({ name: screen, params }));
|
|
34
34
|
},
|
|
35
35
|
[navigation]
|
|
36
36
|
);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { VideoSource } from "expo-video";
|
|
8
|
-
import type { ImageSourceType } from "
|
|
8
|
+
import type { ImageSourceType } from "../types/ImageSourceType";
|
|
9
9
|
import type { OnboardingQuestion, OnboardingAnswerValue } from "./OnboardingQuestion";
|
|
10
10
|
|
|
11
11
|
/**
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Type definitions for image layout generators
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type {
|
|
6
|
+
import type { ImageSourceType } from "../../../domain/types/ImageSourceType";
|
|
7
7
|
|
|
8
|
-
export type ImageSourceType
|
|
8
|
+
export type { ImageSourceType };
|
|
9
9
|
|
|
10
10
|
export interface SafeAreaInsets {
|
|
11
11
|
top: number;
|
|
@@ -7,7 +7,6 @@ import { create } from 'zustand';
|
|
|
7
7
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
8
8
|
import type { StoreApi } from 'zustand';
|
|
9
9
|
import type { StoreConfig } from '../types/Store';
|
|
10
|
-
import { storageService } from '../../infrastructure/adapters/StorageService';
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* Create a Zustand store with optional persistence and actions
|
|
@@ -35,7 +34,7 @@ export function createStore<
|
|
|
35
34
|
return create<Store>()(
|
|
36
35
|
persist<Store>(stateCreator, {
|
|
37
36
|
name: config.name,
|
|
38
|
-
storage: createJSONStorage(() =>
|
|
37
|
+
storage: config.storage ? createJSONStorage(() => config.storage!) : undefined,
|
|
39
38
|
version: config.version || 1,
|
|
40
39
|
partialize: (config.partialize
|
|
41
40
|
? (state: Store) => config.partialize!(state)
|
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
import type { StoreApi } from 'zustand';
|
|
7
7
|
|
|
8
|
+
/** StateStorage interface for Zustand persist middleware */
|
|
9
|
+
export interface StateStorage {
|
|
10
|
+
getItem: (name: string) => string | null | Promise<string | null>;
|
|
11
|
+
setItem: (name: string, value: string) => void | Promise<void>;
|
|
12
|
+
removeItem: (name: string) => void | Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
|
|
8
15
|
/** Set function type for Zustand */
|
|
9
16
|
export type SetState<T> = StoreApi<T>['setState'];
|
|
10
17
|
|
|
@@ -35,6 +42,8 @@ export interface StoreConfig<TState extends object, TActions extends object = ob
|
|
|
35
42
|
onRehydrate?: (state: TState & TActions) => void;
|
|
36
43
|
/** Migration function for version changes */
|
|
37
44
|
migrate?: (persistedState: unknown, version: number) => TState;
|
|
45
|
+
/** Custom storage adapter (required when persist is true) */
|
|
46
|
+
storage?: StateStorage;
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
/** Persisted state wrapper */
|
package/src/storage/index.ts
CHANGED
|
@@ -124,10 +124,8 @@ export {
|
|
|
124
124
|
storageRepository,
|
|
125
125
|
} from './infrastructure/repositories/AsyncStorageRepository';
|
|
126
126
|
|
|
127
|
-
export {
|
|
128
|
-
|
|
129
|
-
type StateStorage,
|
|
130
|
-
} from './infrastructure/adapters/StorageService';
|
|
127
|
+
export { storageService } from './infrastructure/adapters/StorageService';
|
|
128
|
+
export type { StateStorage } from './domain/types/Store';
|
|
131
129
|
|
|
132
130
|
// =============================================================================
|
|
133
131
|
// PRESENTATION LAYER - Hooks
|
|
@@ -7,15 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
9
9
|
import { devWarn } from '../../domain/utils/devUtils';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* StateStorage interface for Zustand persist middleware
|
|
13
|
-
*/
|
|
14
|
-
export interface StateStorage {
|
|
15
|
-
getItem: (name: string) => string | null | Promise<string | null>;
|
|
16
|
-
setItem: (name: string, value: string) => void | Promise<void>;
|
|
17
|
-
removeItem: (name: string) => void | Promise<void>;
|
|
18
|
-
}
|
|
10
|
+
import type { StateStorage } from '../../domain/types/Store';
|
|
19
11
|
|
|
20
12
|
/**
|
|
21
13
|
* Storage service for Zustand persist middleware
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryClient Accessor
|
|
3
|
+
* Domain layer - Global QueryClient access
|
|
4
|
+
*
|
|
5
|
+
* Provides access to QueryClient instance outside of React component tree.
|
|
6
|
+
* Useful for services, utilities, and callbacks that need to invalidate cache.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: setGlobalQueryClient must be called before using getGlobalQueryClient.
|
|
9
|
+
* This is typically done in TanstackProvider.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { QueryClient } from '@tanstack/react-query';
|
|
13
|
+
|
|
14
|
+
let globalQueryClient: QueryClient | null = null;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Set the global QueryClient instance.
|
|
18
|
+
* Called automatically by TanstackProvider.
|
|
19
|
+
*/
|
|
20
|
+
export function setGlobalQueryClient(client: QueryClient): void {
|
|
21
|
+
if (globalQueryClient && globalQueryClient !== client) {
|
|
22
|
+
if (__DEV__) {
|
|
23
|
+
|
|
24
|
+
console.warn(
|
|
25
|
+
'[TanStack] QueryClient instance changed. Ensure you are not creating multiple instances.',
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
globalQueryClient = client;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get the global QueryClient instance.
|
|
34
|
+
* Use this in non-React contexts (services, utilities, callbacks).
|
|
35
|
+
*
|
|
36
|
+
* @throws Error if QueryClient has not been set
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import { getGlobalQueryClient, creditsQueryKeys } from '@umituz/react-native-tanstack';
|
|
41
|
+
*
|
|
42
|
+
* const queryClient = getGlobalQueryClient();
|
|
43
|
+
* queryClient.invalidateQueries({ queryKey: creditsQueryKeys.user(userId) });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function getGlobalQueryClient(): QueryClient {
|
|
47
|
+
if (!globalQueryClient) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
'[TanStack] QueryClient not initialized. Ensure TanstackProvider is rendered before calling getGlobalQueryClient.',
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return globalQueryClient;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Check if global QueryClient is available.
|
|
57
|
+
* Use this before calling getGlobalQueryClient to avoid throwing.
|
|
58
|
+
*/
|
|
59
|
+
export function hasGlobalQueryClient(): boolean {
|
|
60
|
+
return globalQueryClient !== null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Clear the global QueryClient reference.
|
|
65
|
+
* Useful for cleanup in tests.
|
|
66
|
+
*/
|
|
67
|
+
export function clearGlobalQueryClient(): void {
|
|
68
|
+
globalQueryClient = null;
|
|
69
|
+
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
38
|
import type { QueryClient, QueryKey } from '@tanstack/react-query';
|
|
39
|
-
import { getGlobalQueryClient } from '
|
|
39
|
+
import { getGlobalQueryClient } from '../config/QueryClientAccessor';
|
|
40
40
|
import { CacheStrategies } from '../../infrastructure/config/QueryClientConfig';
|
|
41
41
|
import { createQueryKeyFactory } from '../utils/QueryKeyFactory';
|
|
42
42
|
import type {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
import type { BaseRepository } from './BaseRepository';
|
|
27
|
-
import { getGlobalQueryClient } from '
|
|
27
|
+
import { getGlobalQueryClient } from '../config/QueryClientAccessor';
|
|
28
28
|
|
|
29
29
|
type RepositoryMap = Map<string, BaseRepository<unknown, unknown, unknown>>;
|
|
30
30
|
|
|
@@ -1,69 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* QueryClient Singleton
|
|
3
|
-
* Infrastructure layer -
|
|
4
|
-
*
|
|
5
|
-
* Provides access to QueryClient instance outside of React component tree.
|
|
6
|
-
* Useful for services, utilities, and callbacks that need to invalidate cache.
|
|
7
|
-
*
|
|
8
|
-
* IMPORTANT: setGlobalQueryClient must be called before using getGlobalQueryClient.
|
|
9
|
-
* This is typically done in TanstackProvider.
|
|
3
|
+
* Infrastructure layer re-export from domain accessor
|
|
10
4
|
*/
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
* Called automatically by TanstackProvider.
|
|
19
|
-
*/
|
|
20
|
-
export function setGlobalQueryClient(client: QueryClient): void {
|
|
21
|
-
if (globalQueryClient && globalQueryClient !== client) {
|
|
22
|
-
if (__DEV__) {
|
|
23
|
-
|
|
24
|
-
console.warn(
|
|
25
|
-
'[TanStack] QueryClient instance changed. Ensure you are not creating multiple instances.',
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
globalQueryClient = client;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Get the global QueryClient instance.
|
|
34
|
-
* Use this in non-React contexts (services, utilities, callbacks).
|
|
35
|
-
*
|
|
36
|
-
* @throws Error if QueryClient has not been set
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```typescript
|
|
40
|
-
* import { getGlobalQueryClient, creditsQueryKeys } from '@umituz/react-native-tanstack';
|
|
41
|
-
*
|
|
42
|
-
* const queryClient = getGlobalQueryClient();
|
|
43
|
-
* queryClient.invalidateQueries({ queryKey: creditsQueryKeys.user(userId) });
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export function getGlobalQueryClient(): QueryClient {
|
|
47
|
-
if (!globalQueryClient) {
|
|
48
|
-
throw new Error(
|
|
49
|
-
'[TanStack] QueryClient not initialized. Ensure TanstackProvider is rendered before calling getGlobalQueryClient.',
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
return globalQueryClient;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Check if global QueryClient is available.
|
|
57
|
-
* Use this before calling getGlobalQueryClient to avoid throwing.
|
|
58
|
-
*/
|
|
59
|
-
export function hasGlobalQueryClient(): boolean {
|
|
60
|
-
return globalQueryClient !== null;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Clear the global QueryClient reference.
|
|
65
|
-
* Useful for cleanup in tests.
|
|
66
|
-
*/
|
|
67
|
-
export function clearGlobalQueryClient(): void {
|
|
68
|
-
globalQueryClient = null;
|
|
69
|
-
}
|
|
6
|
+
export {
|
|
7
|
+
getGlobalQueryClient,
|
|
8
|
+
setGlobalQueryClient,
|
|
9
|
+
hasGlobalQueryClient,
|
|
10
|
+
clearGlobalQueryClient,
|
|
11
|
+
} from '../../domain/config/QueryClientAccessor';
|
|
@@ -115,6 +115,7 @@ export function usePrefetchInfiniteQuery<
|
|
|
115
115
|
>(
|
|
116
116
|
queryKey: QueryKey,
|
|
117
117
|
queryFn: QueryFunction<TQueryFnData, QueryKey, TPageParam>,
|
|
118
|
+
initialPageParam: TPageParam,
|
|
118
119
|
options: PrefetchOptions = {},
|
|
119
120
|
) {
|
|
120
121
|
const queryClient = useQueryClient();
|
|
@@ -133,7 +134,7 @@ export function usePrefetchInfiniteQuery<
|
|
|
133
134
|
queryFn,
|
|
134
135
|
staleTime: options.staleTime,
|
|
135
136
|
gcTime: options.gcTime,
|
|
136
|
-
initialPageParam
|
|
137
|
+
initialPageParam,
|
|
137
138
|
});
|
|
138
139
|
|
|
139
140
|
if (__DEV__) {
|
package/src/theme/core/themes.ts
CHANGED
|
@@ -17,13 +17,6 @@ export interface Theme {
|
|
|
17
17
|
spacing: typeof BASE_TOKENS.spacing;
|
|
18
18
|
typography: typeof BASE_TOKENS.typography;
|
|
19
19
|
borders: typeof BASE_TOKENS.borders;
|
|
20
|
-
borderRadius: {
|
|
21
|
-
sm: number;
|
|
22
|
-
md: number;
|
|
23
|
-
lg: number;
|
|
24
|
-
xl: number;
|
|
25
|
-
full: number;
|
|
26
|
-
};
|
|
27
20
|
iconSizes: {
|
|
28
21
|
xs: number;
|
|
29
22
|
sm: number;
|
|
@@ -54,15 +47,6 @@ export const lightTheme: Theme = {
|
|
|
54
47
|
typography: BASE_TOKENS.typography,
|
|
55
48
|
borders: BASE_TOKENS.borders,
|
|
56
49
|
|
|
57
|
-
// Legacy compatibility mappings
|
|
58
|
-
borderRadius: {
|
|
59
|
-
sm: BASE_TOKENS.borders.radius.sm,
|
|
60
|
-
md: BASE_TOKENS.borders.radius.md,
|
|
61
|
-
lg: BASE_TOKENS.borders.radius.lg,
|
|
62
|
-
xl: BASE_TOKENS.borders.radius.xl,
|
|
63
|
-
full: BASE_TOKENS.borders.radius.full,
|
|
64
|
-
},
|
|
65
|
-
|
|
66
50
|
// Icon sizes from spacing
|
|
67
51
|
iconSizes: {
|
|
68
52
|
xs: BASE_TOKENS.spacing.iconSizeSmall,
|
|
@@ -56,10 +56,6 @@ export type Typography = {
|
|
|
56
56
|
button: TextStyle;
|
|
57
57
|
caption: TextStyle;
|
|
58
58
|
overline: TextStyle;
|
|
59
|
-
// Legacy compatibility
|
|
60
|
-
headingLarge: TextStyle;
|
|
61
|
-
headingMedium: TextStyle;
|
|
62
|
-
headingSmall: TextStyle;
|
|
63
59
|
// Font weight helpers (for inline fontWeight usage)
|
|
64
60
|
semibold: '600';
|
|
65
61
|
medium: '500';
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type { ViewStyle } from 'react-native';
|
|
8
8
|
import type { Borders } from './BaseTokens';
|
|
9
|
+
import { DESIGN_CONSTANTS } from '../constants/DesignConstants';
|
|
9
10
|
|
|
10
11
|
export const borders: Borders = {
|
|
11
12
|
radius: {
|
|
@@ -16,7 +17,7 @@ export const borders: Borders = {
|
|
|
16
17
|
lg: 12,
|
|
17
18
|
xl: 16,
|
|
18
19
|
xxl: 24,
|
|
19
|
-
full:
|
|
20
|
+
full: DESIGN_CONSTANTS.FULL_BORDER_RADIUS,
|
|
20
21
|
},
|
|
21
22
|
width: {
|
|
22
23
|
none: 0,
|
|
@@ -37,7 +38,7 @@ export const borders: Borders = {
|
|
|
37
38
|
borderWidth: 1,
|
|
38
39
|
} as ViewStyle,
|
|
39
40
|
pill: {
|
|
40
|
-
borderRadius:
|
|
41
|
+
borderRadius: DESIGN_CONSTANTS.FULL_BORDER_RADIUS,
|
|
41
42
|
borderWidth: 0,
|
|
42
43
|
} as ViewStyle,
|
|
43
44
|
};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { IconSizes, Opacity, AvatarSizes, ComponentSizes } from './BaseTokens';
|
|
8
|
+
import { DESIGN_CONSTANTS } from '../constants/DesignConstants';
|
|
8
9
|
|
|
9
10
|
export const iconSizes: IconSizes = {
|
|
10
11
|
xs: 16,
|
|
@@ -34,7 +35,7 @@ export const avatarSizes: AvatarSizes = {
|
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
export const sizes: ComponentSizes = {
|
|
37
|
-
touchTarget:
|
|
38
|
+
touchTarget: DESIGN_CONSTANTS.MINIMUM_TOUCH_TARGET,
|
|
38
39
|
progressBar: {
|
|
39
40
|
normal: 4,
|
|
40
41
|
thick: 8,
|
|
@@ -116,25 +116,6 @@ export const typography: Typography = {
|
|
|
116
116
|
lineHeight: 16,
|
|
117
117
|
letterSpacing: 1.5,
|
|
118
118
|
textTransform: 'uppercase',
|
|
119
|
-
} as TextStyle,
|
|
120
|
-
// Legacy compatibility aliases
|
|
121
|
-
headingLarge: {
|
|
122
|
-
fontSize: 32,
|
|
123
|
-
fontWeight: '700',
|
|
124
|
-
lineHeight: 40,
|
|
125
|
-
letterSpacing: 0,
|
|
126
|
-
} as TextStyle,
|
|
127
|
-
headingMedium: {
|
|
128
|
-
fontSize: 24,
|
|
129
|
-
fontWeight: '600',
|
|
130
|
-
lineHeight: 32,
|
|
131
|
-
letterSpacing: 0,
|
|
132
|
-
} as TextStyle,
|
|
133
|
-
headingSmall: {
|
|
134
|
-
fontSize: 20,
|
|
135
|
-
fontWeight: '600',
|
|
136
|
-
lineHeight: 28,
|
|
137
|
-
letterSpacing: 0,
|
|
138
119
|
} as TextStyle,
|
|
139
120
|
// Font weight helpers (for inline fontWeight usage)
|
|
140
121
|
semibold: '600' as const,
|
|
@@ -7,13 +7,15 @@ import type { DesignTokens } from '../../types/ThemeTypes';
|
|
|
7
7
|
|
|
8
8
|
export const createTextStyles = (tokens: DesignTokens) => ({
|
|
9
9
|
screenTitle: {
|
|
10
|
-
...tokens.typography.
|
|
10
|
+
...tokens.typography.headlineLarge,
|
|
11
|
+
fontWeight: tokens.typography.bold,
|
|
11
12
|
color: tokens.colors.textPrimary,
|
|
12
13
|
marginBottom: tokens.spacing.sm,
|
|
13
14
|
} as TextStyle,
|
|
14
15
|
|
|
15
16
|
sectionTitle: {
|
|
16
|
-
...tokens.typography.
|
|
17
|
+
...tokens.typography.headlineSmall,
|
|
18
|
+
fontWeight: tokens.typography.semibold,
|
|
17
19
|
color: tokens.colors.textPrimary,
|
|
18
20
|
marginBottom: tokens.spacing.md,
|
|
19
21
|
} as TextStyle,
|
package/src/theme/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { ActivityIndicator, View, StyleSheet } from 'react-native';
|
|
|
3
3
|
import { GestureHandlerRootView } from 'react-native-gesture-handler';
|
|
4
4
|
import { useFonts } from 'expo-font';
|
|
5
5
|
import { SafeAreaProvider, initialWindowMetrics } from '../../../safe-area';
|
|
6
|
-
import {
|
|
6
|
+
import { useTheme } from '../stores/themeStore';
|
|
7
7
|
import { useDesignSystemTheme, type ThemeMode } from '../globalThemeStore';
|
|
8
8
|
import type { CustomThemeColors } from '../../core/CustomColors';
|
|
9
9
|
import { SplashScreen } from '../../../molecules/splash';
|
|
@@ -43,9 +43,9 @@ export const DesignSystemProvider: React.FC<DesignSystemProviderProps> = ({
|
|
|
43
43
|
const [isInitialized, setIsInitialized] = useState(false);
|
|
44
44
|
const [fontsLoaded, fontError] = fonts ? useFonts(fonts) : [true, null];
|
|
45
45
|
|
|
46
|
-
const initialize =
|
|
47
|
-
const setCustomColors =
|
|
48
|
-
const setDefaultColors =
|
|
46
|
+
const initialize = useTheme((state) => state.initialize);
|
|
47
|
+
const setCustomColors = useTheme((state) => state.setCustomColors);
|
|
48
|
+
const setDefaultColors = useTheme((state) => state.setDefaultColors);
|
|
49
49
|
const setGlobalCustomColors = useDesignSystemTheme((state) => state.setCustomColors);
|
|
50
50
|
const setGlobalThemeMode = useDesignSystemTheme((state) => state.setThemeMode);
|
|
51
51
|
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* SafeBottomSheetModalProvider
|
|
5
|
-
* A wrapper provider that was previously used for bottom sheet modals.
|
|
6
|
-
* Currently serves as a pass-through to maintain compatibility with other packages.
|
|
7
|
-
*/
|
|
8
|
-
export const SafeBottomSheetModalProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
|
|
9
|
-
return <>{children}</>;
|
|
10
|
-
};
|