@umituz/react-native-design-system 1.0.5 → 1.1.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-design-system",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Universal design system for React Native apps - Domain-Driven Design architecture with Material Design 3 components",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"react-native-reanimated": "~3.10.1",
|
|
32
32
|
"@react-native-community/datetimepicker": "8.0.1",
|
|
33
33
|
"@expo/vector-icons": "^14.0.0",
|
|
34
|
-
"lucide-react-native": "^0.468.0"
|
|
34
|
+
"lucide-react-native": "^0.468.0",
|
|
35
|
+
"zustand": "^5.0.2"
|
|
35
36
|
},
|
|
36
37
|
"peerDependenciesMeta": {
|
|
37
38
|
"@react-native-community/datetimepicker": {
|
package/src/index.ts
CHANGED
|
@@ -343,3 +343,12 @@ export {
|
|
|
343
343
|
getOnboardingDescriptionMarginTop,
|
|
344
344
|
DeviceType,
|
|
345
345
|
} from './presentation/utils/responsive';
|
|
346
|
+
|
|
347
|
+
// =============================================================================
|
|
348
|
+
// THEME MANAGEMENT - Global Theme Store
|
|
349
|
+
// =============================================================================
|
|
350
|
+
|
|
351
|
+
export {
|
|
352
|
+
useDesignSystemTheme,
|
|
353
|
+
type ThemeMode,
|
|
354
|
+
} from './infrastructure/theme/globalThemeStore';
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Theme Store for Design System
|
|
3
|
+
*
|
|
4
|
+
* Minimal Zustand store for theme state management.
|
|
5
|
+
* Apps can sync their theme state with this global store.
|
|
6
|
+
*
|
|
7
|
+
* WHY THIS EXISTS:
|
|
8
|
+
* - ScreenLayout needs to know current theme mode
|
|
9
|
+
* - Without prop drilling or Context API
|
|
10
|
+
* - Single source of truth for design system components
|
|
11
|
+
* - Apps control theme, design system reacts
|
|
12
|
+
*
|
|
13
|
+
* USAGE IN APP:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { useDesignSystemTheme } from '@umituz/react-native-design-system';
|
|
16
|
+
* import { useTheme } from '@domains/theme';
|
|
17
|
+
*
|
|
18
|
+
* // Sync app theme with design system
|
|
19
|
+
* const { themeMode } = useTheme();
|
|
20
|
+
* const { setThemeMode } = useDesignSystemTheme();
|
|
21
|
+
*
|
|
22
|
+
* useEffect(() => {
|
|
23
|
+
* setThemeMode(themeMode);
|
|
24
|
+
* }, [themeMode]);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { create } from 'zustand';
|
|
29
|
+
|
|
30
|
+
export type ThemeMode = 'light' | 'dark';
|
|
31
|
+
|
|
32
|
+
interface GlobalThemeStore {
|
|
33
|
+
/** Current theme mode */
|
|
34
|
+
themeMode: ThemeMode;
|
|
35
|
+
|
|
36
|
+
/** Update theme mode (called by app when theme changes) */
|
|
37
|
+
setThemeMode: (mode: ThemeMode) => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Global theme store for design system components
|
|
42
|
+
*
|
|
43
|
+
* This is a MINIMAL store - app has the real theme logic.
|
|
44
|
+
* Design system just mirrors the current theme for its components.
|
|
45
|
+
*/
|
|
46
|
+
export const useDesignSystemTheme = create<GlobalThemeStore>((set) => ({
|
|
47
|
+
themeMode: 'light',
|
|
48
|
+
setThemeMode: (mode: ThemeMode) => set({ themeMode: mode }),
|
|
49
|
+
}));
|
|
@@ -30,6 +30,8 @@ import { View, ScrollView, StyleSheet, ViewStyle } from 'react-native';
|
|
|
30
30
|
import { SafeAreaView, Edge } from 'react-native-safe-area-context';
|
|
31
31
|
import { useAppDesignTokens } from '../hooks/useAppDesignTokens';
|
|
32
32
|
import { LoadingState } from '../loading/presentation/components/LoadingState';
|
|
33
|
+
import { useDesignSystemTheme } from '../../infrastructure/theme/globalThemeStore';
|
|
34
|
+
import type { ThemeMode } from '../tokens/core/TokenFactory';
|
|
33
35
|
|
|
34
36
|
export interface ScreenLayoutProps {
|
|
35
37
|
/**
|
|
@@ -111,6 +113,13 @@ export interface ScreenLayoutProps {
|
|
|
111
113
|
* Useful for screens with inputs
|
|
112
114
|
*/
|
|
113
115
|
keyboardAvoiding?: boolean;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Theme mode for design tokens
|
|
119
|
+
* If not provided, uses global theme from useDesignSystemTheme()
|
|
120
|
+
* Apps should sync their theme with the global store instead of passing this prop
|
|
121
|
+
*/
|
|
122
|
+
themeMode?: ThemeMode;
|
|
114
123
|
}
|
|
115
124
|
|
|
116
125
|
export const ScreenLayout: React.FC<ScreenLayoutProps> = ({
|
|
@@ -128,8 +137,13 @@ export const ScreenLayout: React.FC<ScreenLayoutProps> = ({
|
|
|
128
137
|
testID,
|
|
129
138
|
hideScrollIndicator = false,
|
|
130
139
|
keyboardAvoiding = false,
|
|
140
|
+
themeMode,
|
|
131
141
|
}) => {
|
|
132
|
-
|
|
142
|
+
// Use global theme if themeMode prop not provided
|
|
143
|
+
const { themeMode: globalTheme } = useDesignSystemTheme();
|
|
144
|
+
const effectiveTheme = themeMode ?? globalTheme;
|
|
145
|
+
|
|
146
|
+
const tokens = useAppDesignTokens(effectiveTheme);
|
|
133
147
|
const styles = useMemo(() => getStyles(tokens), [tokens]);
|
|
134
148
|
|
|
135
149
|
const bgColor = backgroundColor || tokens.colors.backgroundPrimary;
|