@coze-arch/cli 0.0.1-alpha.9f719c → 0.0.1-alpha.a166f2

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 (136) hide show
  1. package/lib/__templates__/expo/.coze +3 -3
  2. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +46 -0
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +229 -0
  4. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +2 -2
  5. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +3 -4
  6. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +46 -0
  7. package/lib/__templates__/expo/README.md +68 -7
  8. package/lib/__templates__/expo/_gitignore +1 -1
  9. package/lib/__templates__/expo/_npmrc +2 -4
  10. package/lib/__templates__/expo/client/app/+not-found.tsx +15 -64
  11. package/lib/__templates__/expo/client/app/_layout.tsx +15 -12
  12. package/lib/__templates__/expo/client/app/index.tsx +1 -0
  13. package/lib/__templates__/expo/client/app.config.ts +76 -0
  14. package/lib/__templates__/expo/client/components/Screen.tsx +1 -17
  15. package/lib/__templates__/expo/client/components/ThemedText.tsx +33 -0
  16. package/lib/__templates__/expo/client/components/ThemedView.tsx +37 -0
  17. package/lib/__templates__/expo/client/constants/theme.ts +116 -67
  18. package/lib/__templates__/expo/client/declarations.d.ts +5 -0
  19. package/lib/__templates__/expo/{eslint.config.mjs → client/eslint.config.mjs} +33 -10
  20. package/lib/__templates__/expo/client/hooks/useColorScheme.tsx +48 -0
  21. package/lib/__templates__/expo/client/hooks/useSafeRouter.ts +152 -0
  22. package/lib/__templates__/expo/client/hooks/useTheme.ts +26 -6
  23. package/lib/__templates__/expo/client/metro.config.js +124 -0
  24. package/lib/__templates__/expo/client/package.json +95 -0
  25. package/lib/__templates__/expo/client/screens/demo/index.tsx +25 -0
  26. package/lib/__templates__/expo/client/screens/demo/styles.ts +28 -0
  27. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +1 -0
  28. package/lib/__templates__/expo/client/tsconfig.json +24 -0
  29. package/lib/__templates__/expo/client/utils/index.ts +22 -0
  30. package/lib/__templates__/expo/eslint-plugins/fontawesome6/index.js +9 -0
  31. package/lib/__templates__/expo/eslint-plugins/fontawesome6/names.js +1889 -0
  32. package/lib/__templates__/expo/eslint-plugins/fontawesome6/rule.js +174 -0
  33. package/lib/__templates__/expo/eslint-plugins/fontawesome6/v5-only-names.js +388 -0
  34. package/lib/__templates__/expo/eslint-plugins/react-native/index.js +9 -0
  35. package/lib/__templates__/expo/eslint-plugins/react-native/rule.js +64 -0
  36. package/lib/__templates__/expo/eslint-plugins/reanimated/index.js +9 -0
  37. package/lib/__templates__/expo/eslint-plugins/reanimated/rule.js +88 -0
  38. package/lib/__templates__/expo/package.json +16 -107
  39. package/lib/__templates__/expo/patches/expo@54.0.33.patch +45 -0
  40. package/lib/__templates__/expo/pnpm-lock.yaml +1437 -3171
  41. package/lib/__templates__/expo/pnpm-workspace.yaml +3 -0
  42. package/lib/__templates__/expo/server/build.js +21 -0
  43. package/lib/__templates__/expo/server/package.json +34 -0
  44. package/lib/__templates__/expo/server/src/index.ts +20 -0
  45. package/lib/__templates__/expo/server/tsconfig.json +24 -0
  46. package/lib/__templates__/expo/template.config.js +57 -0
  47. package/lib/__templates__/expo/tsconfig.json +1 -24
  48. package/lib/__templates__/native-static/.coze +11 -0
  49. package/lib/__templates__/native-static/index.html +33 -0
  50. package/lib/__templates__/native-static/styles/main.css +136 -0
  51. package/lib/__templates__/native-static/template.config.js +22 -0
  52. package/lib/__templates__/nextjs/.babelrc +15 -0
  53. package/lib/__templates__/nextjs/.coze +1 -0
  54. package/lib/__templates__/nextjs/_npmrc +1 -0
  55. package/lib/__templates__/nextjs/next.config.ts +12 -0
  56. package/lib/__templates__/nextjs/package.json +13 -2
  57. package/lib/__templates__/nextjs/pnpm-lock.yaml +2682 -1786
  58. package/lib/__templates__/nextjs/scripts/prepare.sh +9 -0
  59. package/lib/__templates__/nextjs/src/app/globals.css +109 -89
  60. package/lib/__templates__/nextjs/src/app/layout.tsx +5 -14
  61. package/lib/__templates__/nextjs/src/app/page.tsx +18 -48
  62. package/lib/__templates__/nextjs/src/components/ui/resizable.tsx +29 -22
  63. package/lib/__templates__/nextjs/src/components/ui/sidebar.tsx +228 -230
  64. package/lib/__templates__/nextjs/template.config.js +67 -2
  65. package/lib/__templates__/taro/.coze +14 -0
  66. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +19 -0
  67. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +14 -0
  68. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +2 -0
  69. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +151 -0
  70. package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +5 -0
  71. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +24 -0
  72. package/lib/__templates__/taro/README.md +749 -0
  73. package/lib/__templates__/taro/_gitignore +40 -0
  74. package/lib/__templates__/taro/_npmrc +18 -0
  75. package/lib/__templates__/taro/babel.config.js +12 -0
  76. package/lib/__templates__/taro/config/dev.ts +9 -0
  77. package/lib/__templates__/taro/config/index.ts +173 -0
  78. package/lib/__templates__/taro/config/prod.ts +35 -0
  79. package/lib/__templates__/taro/eslint.config.mjs +79 -0
  80. package/lib/__templates__/taro/key/private.appid.key +0 -0
  81. package/lib/__templates__/taro/package.json +97 -0
  82. package/lib/__templates__/taro/pnpm-lock.yaml +22694 -0
  83. package/lib/__templates__/taro/pnpm-workspace.yaml +2 -0
  84. package/lib/__templates__/taro/project.config.json +15 -0
  85. package/lib/__templates__/taro/server/nest-cli.json +10 -0
  86. package/lib/__templates__/taro/server/package.json +40 -0
  87. package/lib/__templates__/taro/server/src/app.controller.ts +23 -0
  88. package/lib/__templates__/taro/server/src/app.module.ts +10 -0
  89. package/lib/__templates__/taro/server/src/app.service.ts +8 -0
  90. package/lib/__templates__/taro/server/src/interceptors/http-status.interceptor.ts +23 -0
  91. package/lib/__templates__/taro/server/src/main.ts +49 -0
  92. package/lib/__templates__/taro/server/tsconfig.json +24 -0
  93. package/lib/__templates__/taro/src/app.config.ts +11 -0
  94. package/lib/__templates__/taro/src/app.css +52 -0
  95. package/lib/__templates__/taro/src/app.tsx +9 -0
  96. package/lib/__templates__/taro/src/index.html +39 -0
  97. package/lib/__templates__/taro/src/network.ts +39 -0
  98. package/lib/__templates__/taro/src/pages/index/index.config.ts +3 -0
  99. package/lib/__templates__/taro/src/pages/index/index.css +1 -0
  100. package/lib/__templates__/taro/src/pages/index/index.tsx +33 -0
  101. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +171 -0
  102. package/lib/__templates__/taro/src/presets/h5-styles.ts +33 -0
  103. package/lib/__templates__/taro/src/presets/index.tsx +18 -0
  104. package/lib/__templates__/taro/src/presets/wx-debug.ts +23 -0
  105. package/lib/__templates__/taro/stylelint.config.mjs +4 -0
  106. package/lib/__templates__/taro/template.config.js +68 -0
  107. package/lib/__templates__/taro/tsconfig.json +29 -0
  108. package/lib/__templates__/taro/types/global.d.ts +32 -0
  109. package/lib/__templates__/templates.json +104 -43
  110. package/lib/__templates__/vite/.coze +1 -0
  111. package/lib/__templates__/vite/_npmrc +1 -0
  112. package/lib/__templates__/vite/eslint.config.mjs +9 -0
  113. package/lib/__templates__/vite/package.json +14 -1
  114. package/lib/__templates__/vite/pnpm-lock.yaml +1581 -105
  115. package/lib/__templates__/vite/scripts/prepare.sh +9 -0
  116. package/lib/__templates__/vite/src/main.ts +17 -48
  117. package/lib/__templates__/vite/template.config.js +67 -6
  118. package/lib/__templates__/vite/vite.config.ts +1 -0
  119. package/lib/cli.js +1006 -154
  120. package/package.json +9 -3
  121. package/lib/__templates__/expo/.cozeproj/scripts/deploy_build.sh +0 -109
  122. package/lib/__templates__/expo/.cozeproj/scripts/deploy_run.sh +0 -232
  123. package/lib/__templates__/expo/app.json +0 -63
  124. package/lib/__templates__/expo/babel.config.js +0 -19
  125. package/lib/__templates__/expo/client/app/(tabs)/_layout.tsx +0 -43
  126. package/lib/__templates__/expo/client/app/(tabs)/home.tsx +0 -1
  127. package/lib/__templates__/expo/client/app/(tabs)/index.tsx +0 -7
  128. package/lib/__templates__/expo/client/hooks/useColorScheme.ts +0 -1
  129. package/lib/__templates__/expo/client/index.js +0 -12
  130. package/lib/__templates__/expo/client/screens/home/index.tsx +0 -51
  131. package/lib/__templates__/expo/client/screens/home/styles.ts +0 -60
  132. package/lib/__templates__/expo/metro.config.js +0 -51
  133. package/lib/__templates__/expo/src/index.ts +0 -12
  134. package/lib/__templates__/nextjs/.vscode/settings.json +0 -121
  135. package/lib/__templates__/vite/.vscode/settings.json +0 -7
  136. /package/lib/__templates__/expo/{eslint-formatter-simple.mjs → client/eslint-formatter-simple.mjs} +0 -0
@@ -0,0 +1,76 @@
1
+ import { ExpoConfig, ConfigContext } from 'expo/config';
2
+
3
+ const appName = process.env.COZE_PROJECT_NAME || process.env.EXPO_PUBLIC_COZE_PROJECT_NAME || '应用';
4
+ const projectId = process.env.COZE_PROJECT_ID || process.env.EXPO_PUBLIC_COZE_PROJECT_ID;
5
+ const slugAppName = projectId ? `app${projectId}` : 'myapp';
6
+
7
+ export default ({ config }: ConfigContext): ExpoConfig => {
8
+ return {
9
+ ...config,
10
+ "name": appName,
11
+ "slug": slugAppName,
12
+ "version": "1.0.0",
13
+ "orientation": "portrait",
14
+ "icon": "./assets/images/icon.png",
15
+ "scheme": "myapp",
16
+ "userInterfaceStyle": "automatic",
17
+ "newArchEnabled": true,
18
+ "ios": {
19
+ "supportsTablet": true
20
+ },
21
+ "android": {
22
+ "adaptiveIcon": {
23
+ "foregroundImage": "./assets/images/adaptive-icon.png",
24
+ "backgroundColor": "#ffffff"
25
+ },
26
+ "package": `com.anonymous.x${projectId || '0'}`
27
+ },
28
+ "web": {
29
+ "bundler": "metro",
30
+ "output": "single",
31
+ "favicon": "./assets/images/favicon.png"
32
+ },
33
+ "plugins": [
34
+ process.env.EXPO_PUBLIC_BACKEND_BASE_URL ? [
35
+ "expo-router",
36
+ {
37
+ "origin": process.env.EXPO_PUBLIC_BACKEND_BASE_URL
38
+ }
39
+ ] : 'expo-router',
40
+ [
41
+ "expo-splash-screen",
42
+ {
43
+ "image": "./assets/images/splash-icon.png",
44
+ "imageWidth": 200,
45
+ "resizeMode": "contain",
46
+ "backgroundColor": "#ffffff"
47
+ }
48
+ ],
49
+ [
50
+ "expo-image-picker",
51
+ {
52
+ "photosPermission": `允许${appName}访问您的相册,以便您上传或保存图片。`,
53
+ "cameraPermission": `允许${appName}使用您的相机,以便您直接拍摄照片上传。`,
54
+ "microphonePermission": `允许${appName}访问您的麦克风,以便您拍摄带有声音的视频。`
55
+ }
56
+ ],
57
+ [
58
+ "expo-location",
59
+ {
60
+ "locationWhenInUsePermission": `${appName}需要访问您的位置以提供周边服务及导航功能。`
61
+ }
62
+ ],
63
+ [
64
+ "expo-camera",
65
+ {
66
+ "cameraPermission": `${appName}需要访问相机以拍摄照片和视频。`,
67
+ "microphonePermission": `${appName}需要访问麦克风以录制视频声音。`,
68
+ "recordAudioAndroid": true
69
+ }
70
+ ]
71
+ ],
72
+ "experiments": {
73
+ "typedRoutes": true
74
+ }
75
+ }
76
+ }
@@ -197,26 +197,10 @@ export const Screen = ({
197
197
  // 强制禁用 iOS 自动调整内容区域,完全由手动 padding 控制,消除系统自动计算带来的多余空白
198
198
  const contentInsetBehaviorIOS = 'never';
199
199
 
200
- // 1. 外层容器样式
201
- // 负责:背景色、Top/Left/Right 安全区、以及非滚动模式下的 Bottom 安全区
202
- const childArray = React.Children.toArray(children);
203
- let firstChild: React.ReactElement<any, any> | null = null;
204
- for (let i = 0; i < childArray.length; i++) {
205
- const el = childArray[i];
206
- if (React.isValidElement(el)) { firstChild = el as React.ReactElement<any, any>; break; }
207
- }
208
- const firstChildHasInlinePaddingTop = (() => {
209
- if (!firstChild) return false;
210
- const st: any = (firstChild as any).props?.style;
211
- const arr = Array.isArray(st) ? st : st ? [st] : [];
212
- return arr.some((s) => s && typeof s === 'object' && typeof (s as any).paddingTop === 'number' && (s as any).paddingTop > 10);
213
- })();
214
- const applyTopInset = hasTop && !firstChildHasInlinePaddingTop;
215
-
216
200
  const wrapperStyle: ViewStyle = {
217
201
  flex: 1,
218
202
  backgroundColor,
219
- paddingTop: applyTopInset ? insets.top : 0,
203
+ paddingTop: hasTop ? insets.top : 0,
220
204
  paddingLeft: hasLeft ? insets.left : 0,
221
205
  paddingRight: hasRight ? insets.right : 0,
222
206
  // 当页面不使用外层 ScrollView 时(子树本身可滚动),由外层 View 负责底部安全区
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { Text, TextProps, TextStyle } from 'react-native';
3
+ import { useTheme } from '@/hooks/useTheme';
4
+ import { Typography } from '@/constants/theme';
5
+
6
+ type TypographyVariant = keyof typeof Typography;
7
+
8
+ interface ThemedTextProps extends TextProps {
9
+ variant?: TypographyVariant;
10
+ color?: string;
11
+ }
12
+
13
+ export function ThemedText({
14
+ variant = 'body',
15
+ color,
16
+ style,
17
+ children,
18
+ ...props
19
+ }: ThemedTextProps) {
20
+ const { theme } = useTheme();
21
+ const typographyStyle = Typography[variant];
22
+
23
+ const textStyle: TextStyle = {
24
+ ...typographyStyle,
25
+ color: color ?? theme.textPrimary,
26
+ };
27
+
28
+ return (
29
+ <Text style={[textStyle, style]} {...props}>
30
+ {children}
31
+ </Text>
32
+ );
33
+ }
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import { View, ViewProps, ViewStyle } from 'react-native';
3
+ import { useTheme } from '@/hooks/useTheme';
4
+
5
+ type BackgroundLevel = 'root' | 'default' | 'tertiary';
6
+
7
+ interface ThemedViewProps extends ViewProps {
8
+ level?: BackgroundLevel;
9
+ backgroundColor?: string;
10
+ }
11
+
12
+ const backgroundMap: Record<BackgroundLevel, string> = {
13
+ root: 'backgroundRoot',
14
+ default: 'backgroundDefault',
15
+ tertiary: 'backgroundTertiary',
16
+ };
17
+
18
+ export function ThemedView({
19
+ level = 'root',
20
+ backgroundColor,
21
+ style,
22
+ children,
23
+ ...props
24
+ }: ThemedViewProps) {
25
+ const { theme } = useTheme();
26
+ const bgColor = backgroundColor ?? (theme as any)[backgroundMap[level]];
27
+
28
+ const viewStyle: ViewStyle = {
29
+ backgroundColor: bgColor,
30
+ };
31
+
32
+ return (
33
+ <View style={[viewStyle, style]} {...props}>
34
+ {children}
35
+ </View>
36
+ );
37
+ }
@@ -1,40 +1,35 @@
1
- import { Platform } from "react-native";
2
-
3
- const tintColorLight = "#007AFF";
4
- const tintColorDark = "#0A84FF";
5
-
6
1
  export const Colors = {
7
2
  light: {
8
- text: "#11181C",
9
- textPrimary: "#11181C",
10
- textSecondary: "#687076",
11
- textMuted: "#9BA1A6",
12
- buttonText: "#FFFFFF",
13
- tabIconDefault: "#687076",
14
- tabIconSelected: tintColorLight,
15
- primary: tintColorLight,
16
- link: "#007AFF",
17
- backgroundRoot: "#FFFFFF", // Elevation 0
18
- backgroundDefault: "#F2F2F2", // Elevation 1
19
- backgroundSecondary: "#E6E6E6", // Elevation 2
20
- backgroundTertiary: "#D9D9D9", // Elevation 3
21
- border: "#E6E6E6",
3
+ textPrimary: "#1C1917",
4
+ textSecondary: "#78716c",
5
+ textMuted: "#9CA3AF",
6
+ primary: "#4F46E5", // Indigo-600 - 品牌主色,代表科技与智能
7
+ accent: "#8B5CF6", // Violet-500 - 辅助色,代表创造力
8
+ success: "#10B981", // Emerald-500
9
+ error: "#EF4444",
10
+ backgroundRoot: "#FAFAFA",
11
+ backgroundDefault: "#FFFFFF",
12
+ backgroundTertiary: "#F9FAFB", // 更浅的背景色,用于去线留白
13
+ buttonPrimaryText: "#FFFFFF",
14
+ tabIconSelected: "#4F46E5",
15
+ border: "#E5E7EB",
16
+ borderLight: "#F3F4F6",
22
17
  },
23
18
  dark: {
24
- text: "#ECEDEE",
25
- textPrimary: "#ECEDEE",
26
- textSecondary: "#9BA1A6",
19
+ textPrimary: "#FAFAF9",
20
+ textSecondary: "#A8A29E",
27
21
  textMuted: "#6F767E",
28
- buttonText: "#FFFFFF",
29
- tabIconDefault: "#9BA1A6",
30
- tabIconSelected: tintColorDark,
31
- primary: tintColorDark,
32
- link: "#0A84FF",
33
- backgroundRoot: "#1F2123", // Elevation 0
34
- backgroundDefault: "#2A2C2E", // Elevation 1
35
- backgroundSecondary: "#353739", // Elevation 2
36
- backgroundTertiary: "#404244", // Elevation 3
37
- border: "#353739",
22
+ primary: "#818CF8", // Indigo-400 - 暗色模式品牌主色
23
+ accent: "#A78BFA", // Violet-400
24
+ success: "#34D399",
25
+ error: "#F87171",
26
+ backgroundRoot: "#09090B", // 更深的背景色
27
+ backgroundDefault: "#1C1C1E",
28
+ backgroundTertiary: "#1F1F22", // 暗色模式去线留白背景
29
+ buttonPrimaryText: "#09090B",
30
+ tabIconSelected: "#818CF8",
31
+ border: "#3F3F46",
32
+ borderLight: "#27272A",
38
33
  },
39
34
  };
40
35
 
@@ -48,22 +43,39 @@ export const Spacing = {
48
43
  "3xl": 32,
49
44
  "4xl": 40,
50
45
  "5xl": 48,
51
- inputHeight: 48,
52
- buttonHeight: 52,
46
+ "6xl": 64,
53
47
  };
54
48
 
55
49
  export const BorderRadius = {
56
- xs: 8,
57
- sm: 12,
58
- md: 18,
59
- lg: 24,
60
- xl: 30,
61
- "2xl": 40,
62
- "3xl": 50,
50
+ xs: 4,
51
+ sm: 8,
52
+ md: 12,
53
+ lg: 16,
54
+ xl: 20,
55
+ "2xl": 24,
56
+ "3xl": 28,
57
+ "4xl": 32,
63
58
  full: 9999,
64
59
  };
65
60
 
66
61
  export const Typography = {
62
+ display: {
63
+ fontSize: 112,
64
+ lineHeight: 112,
65
+ fontWeight: "200" as const,
66
+ letterSpacing: -4,
67
+ },
68
+ displayLarge: {
69
+ fontSize: 112,
70
+ lineHeight: 112,
71
+ fontWeight: "200" as const,
72
+ letterSpacing: -2,
73
+ },
74
+ displayMedium: {
75
+ fontSize: 48,
76
+ lineHeight: 56,
77
+ fontWeight: "200" as const,
78
+ },
67
79
  h1: {
68
80
  fontSize: 32,
69
81
  lineHeight: 40,
@@ -77,52 +89,89 @@ export const Typography = {
77
89
  h3: {
78
90
  fontSize: 24,
79
91
  lineHeight: 32,
80
- fontWeight: "600" as const,
92
+ fontWeight: "300" as const,
81
93
  },
82
94
  h4: {
83
95
  fontSize: 20,
84
96
  lineHeight: 28,
85
97
  fontWeight: "600" as const,
86
98
  },
99
+ title: {
100
+ fontSize: 18,
101
+ lineHeight: 24,
102
+ fontWeight: "700" as const,
103
+ },
87
104
  body: {
88
105
  fontSize: 16,
89
106
  lineHeight: 24,
90
107
  fontWeight: "400" as const,
91
108
  },
109
+ bodyMedium: {
110
+ fontSize: 16,
111
+ lineHeight: 24,
112
+ fontWeight: "500" as const,
113
+ },
92
114
  small: {
93
115
  fontSize: 14,
94
116
  lineHeight: 20,
95
117
  fontWeight: "400" as const,
96
118
  },
119
+ smallMedium: {
120
+ fontSize: 14,
121
+ lineHeight: 20,
122
+ fontWeight: "500" as const,
123
+ },
124
+ caption: {
125
+ fontSize: 12,
126
+ lineHeight: 16,
127
+ fontWeight: "400" as const,
128
+ },
129
+ captionMedium: {
130
+ fontSize: 12,
131
+ lineHeight: 16,
132
+ fontWeight: "500" as const,
133
+ },
134
+ label: {
135
+ fontSize: 14,
136
+ lineHeight: 20,
137
+ fontWeight: "500" as const,
138
+ letterSpacing: 2,
139
+ textTransform: "uppercase" as const,
140
+ },
141
+ labelSmall: {
142
+ fontSize: 12,
143
+ lineHeight: 16,
144
+ fontWeight: "500" as const,
145
+ letterSpacing: 1,
146
+ textTransform: "uppercase" as const,
147
+ },
148
+ labelTitle: {
149
+ fontSize: 14,
150
+ lineHeight: 20,
151
+ fontWeight: "700" as const,
152
+ letterSpacing: 2,
153
+ textTransform: "uppercase" as const,
154
+ },
97
155
  link: {
98
156
  fontSize: 16,
99
157
  lineHeight: 24,
100
158
  fontWeight: "400" as const,
101
159
  },
160
+ stat: {
161
+ fontSize: 30,
162
+ lineHeight: 36,
163
+ fontWeight: "300" as const,
164
+ },
165
+ tiny: {
166
+ fontSize: 10,
167
+ lineHeight: 14,
168
+ fontWeight: "400" as const,
169
+ },
170
+ navLabel: {
171
+ fontSize: 10,
172
+ lineHeight: 14,
173
+ fontWeight: "500" as const,
174
+ },
102
175
  };
103
176
 
104
- export const Fonts = Platform.select({
105
- ios: {
106
- /** iOS `UIFontDescriptorSystemDesignDefault` */
107
- sans: "system-ui",
108
- /** iOS `UIFontDescriptorSystemDesignSerif` */
109
- serif: "ui-serif",
110
- /** iOS `UIFontDescriptorSystemDesignRounded` */
111
- rounded: "ui-rounded",
112
- /** iOS `UIFontDescriptorSystemDesignMonospaced` */
113
- mono: "ui-monospace",
114
- },
115
- default: {
116
- sans: "normal",
117
- serif: "serif",
118
- rounded: "normal",
119
- mono: "monospace",
120
- },
121
- web: {
122
- sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
123
- serif: "Georgia, 'Times New Roman', serif",
124
- rounded:
125
- "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif",
126
- mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
127
- },
128
- });
177
+ export type Theme = typeof Colors.light;
@@ -0,0 +1,5 @@
1
+ // declarations.d.ts
2
+
3
+ declare module 'expo-file-system/legacy' {
4
+ export * from 'expo-file-system';
5
+ }
@@ -1,10 +1,13 @@
1
- import js from "@eslint/js";
2
- import globals from "globals";
3
- import tseslint from "typescript-eslint";
4
- import pluginReact from "eslint-plugin-react";
5
- import reactHooks from "eslint-plugin-react-hooks";
6
- import regexp from "eslint-plugin-regexp";
7
- import pluginImport from "eslint-plugin-import";
1
+ import js from '@eslint/js';
2
+ import globals from 'globals';
3
+ import tseslint from 'typescript-eslint';
4
+ import pluginReact from 'eslint-plugin-react';
5
+ import reactHooks from 'eslint-plugin-react-hooks';
6
+ import regexp from 'eslint-plugin-regexp';
7
+ import pluginImport from 'eslint-plugin-import';
8
+ import fontawesome6 from '../eslint-plugins/fontawesome6/index.js';
9
+ import reanimated from '../eslint-plugins/reanimated/index.js';
10
+ import reactnative from '../eslint-plugins/react-native/index.js';
8
11
 
9
12
  export default [
10
13
  {
@@ -15,19 +18,21 @@ export default [
15
18
  'src/api/**', // 排除 src 下的自动生成 API
16
19
  '.expo/**', // 排除 Expo 自动生成的文件
17
20
  'tailwind.config.js', // 排除 Tailwind 配置文件
21
+ '**/*.d.ts',
22
+ 'eslint.config.*',
18
23
  ],
19
24
  },
20
25
  regexp.configs["flat/recommended"],
21
26
  js.configs.recommended,
22
27
  ...tseslint.configs.recommended,
23
-
28
+
24
29
  // React 的推荐配置
25
30
  pluginReact.configs.flat.recommended,
26
31
  pluginReact.configs.flat['jsx-runtime'],
27
32
  reactHooks.configs.flat.recommended,
28
33
  {
29
34
  files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
30
-
35
+
31
36
  // 语言选项:设置全局变量
32
37
  languageOptions: {
33
38
  globals: {
@@ -52,6 +57,9 @@ export default [
52
57
 
53
58
  plugins: {
54
59
  import: pluginImport,
60
+ fontawesome6,
61
+ reanimated,
62
+ reactnative,
55
63
  },
56
64
  rules: {
57
65
  // 关闭代码风格规则
@@ -70,6 +78,21 @@ export default [
70
78
  'no-prototype-builtins': 'off',
71
79
  'react/react-in-jsx-scope': 'off',
72
80
  'react/jsx-uses-react': 'off',
81
+ 'fontawesome6/valid-name': 'error',
82
+ 'reanimated/ban-mix-use': 'error',
83
+ // 禁止使用 via.placeholder.com 服务
84
+ 'no-restricted-syntax': [
85
+ 'error',
86
+ {
87
+ 'selector': 'Literal[value=/via\\.placeholder\\.com/]',
88
+ 'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
89
+ },
90
+ {
91
+ 'selector': 'TemplateLiteral > TemplateElement[value.raw=/via\\.placeholder\\.com/]',
92
+ 'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
93
+ },
94
+ ],
95
+ 'reactnative/wrap-horizontal-scrollview-inside-view': ['error'],
73
96
  },
74
97
  },
75
98
 
@@ -91,7 +114,7 @@ export default [
91
114
  // 在 .js 文件中关闭 TS 规则
92
115
  '@typescript-eslint/no-require-imports': 'off',
93
116
  // 在 Node.js 文件中允许 require
94
- '@typescript-eslint/no-var-requires': 'off',
117
+ '@typescript-eslint/no-var-requires': 'off',
95
118
  'no-undef': 'off',
96
119
  },
97
120
  },
@@ -0,0 +1,48 @@
1
+ import { createContext, Dispatch, ReactNode, SetStateAction, useContext, useEffect, useState } from 'react';
2
+ import { ColorSchemeName, useColorScheme as useReactNativeColorScheme, Platform } from 'react-native';
3
+
4
+ const ColorSchemeContext = createContext<'light' | 'dark' | null | undefined>(null);
5
+
6
+ const ColorSchemeProvider = function ({ children }: { children?: ReactNode }) {
7
+ const systemColorScheme = useReactNativeColorScheme();
8
+ const [colorScheme, setColorScheme] = useState(systemColorScheme);
9
+
10
+ useEffect(() => {
11
+ setColorScheme(systemColorScheme);
12
+ }, [systemColorScheme]);
13
+
14
+ useEffect(() => {
15
+ function handleMessage(e: MessageEvent<{ event: string; colorScheme: ColorSchemeName; } | undefined>) {
16
+ if (e.data?.event === 'coze.workbench.colorScheme') {
17
+ const cs = e.data.colorScheme;
18
+ if (typeof cs === 'string' && typeof setColorScheme === 'function') {
19
+ setColorScheme(cs);
20
+ }
21
+ }
22
+ }
23
+
24
+ if (Platform.OS === 'web') {
25
+ window.addEventListener('message', handleMessage, false);
26
+ }
27
+
28
+ return () => {
29
+ if (Platform.OS === 'web') {
30
+ window.removeEventListener('message', handleMessage, false);
31
+ }
32
+ }
33
+ }, [setColorScheme]);
34
+
35
+ return <ColorSchemeContext.Provider value={colorScheme}>
36
+ {children}
37
+ </ColorSchemeContext.Provider>
38
+ };
39
+
40
+ function useColorScheme() {
41
+ const colorScheme = useContext(ColorSchemeContext);
42
+ return colorScheme;
43
+ }
44
+
45
+ export {
46
+ ColorSchemeProvider,
47
+ useColorScheme,
48
+ }