@coze-arch/cli 0.0.1-alpha.1fb1dc → 0.0.1-alpha.209402

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 (240) hide show
  1. package/README.md +1 -0
  2. package/lib/__templates__/expo/.coze +7 -2
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +46 -0
  4. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +229 -0
  5. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +47 -0
  6. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +34 -0
  7. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +46 -0
  8. package/lib/__templates__/expo/README.md +68 -7
  9. package/lib/__templates__/expo/_gitignore +1 -1
  10. package/lib/__templates__/expo/_npmrc +3 -4
  11. package/lib/__templates__/expo/client/app/+not-found.tsx +15 -64
  12. package/lib/__templates__/expo/client/app/_layout.tsx +15 -12
  13. package/lib/__templates__/expo/client/app/index.tsx +1 -0
  14. package/lib/__templates__/expo/client/app.config.ts +76 -0
  15. package/lib/__templates__/expo/client/components/Screen.tsx +3 -19
  16. package/lib/__templates__/expo/client/components/ThemedText.tsx +33 -0
  17. package/lib/__templates__/expo/client/components/ThemedView.tsx +37 -0
  18. package/lib/__templates__/expo/client/constants/theme.ts +117 -58
  19. package/lib/__templates__/expo/client/declarations.d.ts +5 -0
  20. package/lib/__templates__/expo/{eslint.config.mjs → client/eslint.config.mjs} +40 -10
  21. package/lib/__templates__/expo/client/hooks/useColorScheme.tsx +48 -0
  22. package/lib/__templates__/expo/client/hooks/useSafeRouter.ts +152 -0
  23. package/lib/__templates__/expo/client/hooks/useTheme.ts +26 -6
  24. package/lib/__templates__/expo/client/metro.config.js +124 -0
  25. package/lib/__templates__/expo/client/package.json +95 -0
  26. package/lib/__templates__/expo/client/screens/demo/index.tsx +25 -0
  27. package/lib/__templates__/expo/client/screens/demo/styles.ts +28 -0
  28. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +11 -10
  29. package/lib/__templates__/expo/client/tsconfig.json +24 -0
  30. package/lib/__templates__/expo/client/utils/index.ts +22 -0
  31. package/lib/__templates__/expo/eslint-plugins/fontawesome6/index.js +9 -0
  32. package/lib/__templates__/expo/eslint-plugins/fontawesome6/names.js +1889 -0
  33. package/lib/__templates__/expo/eslint-plugins/fontawesome6/rule.js +174 -0
  34. package/lib/__templates__/expo/eslint-plugins/fontawesome6/v5-only-names.js +388 -0
  35. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/index.js +9 -0
  36. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/rule.js +112 -0
  37. package/lib/__templates__/expo/eslint-plugins/forbid-emoji/tech.md +94 -0
  38. package/lib/__templates__/expo/eslint-plugins/react-native/index.js +9 -0
  39. package/lib/__templates__/expo/eslint-plugins/react-native/rule.js +64 -0
  40. package/lib/__templates__/expo/eslint-plugins/reanimated/index.js +9 -0
  41. package/lib/__templates__/expo/eslint-plugins/reanimated/rule.js +88 -0
  42. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/index.js +9 -0
  43. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/rule.js +120 -0
  44. package/lib/__templates__/expo/eslint-plugins/restrict-linear-gradient/tech.md +58 -0
  45. package/lib/__templates__/expo/package.json +16 -103
  46. package/lib/__templates__/expo/patches/expo@54.0.33.patch +45 -0
  47. package/lib/__templates__/expo/pnpm-lock.yaml +1437 -3171
  48. package/lib/__templates__/expo/pnpm-workspace.yaml +3 -0
  49. package/lib/__templates__/expo/server/build.js +21 -0
  50. package/lib/__templates__/expo/server/package.json +34 -0
  51. package/lib/__templates__/expo/server/src/index.ts +20 -0
  52. package/lib/__templates__/expo/server/tsconfig.json +24 -0
  53. package/lib/__templates__/expo/template.config.js +57 -0
  54. package/lib/__templates__/expo/tsconfig.json +1 -24
  55. package/lib/__templates__/native-static/.coze +11 -0
  56. package/lib/__templates__/native-static/index.html +33 -0
  57. package/lib/__templates__/native-static/styles/main.css +136 -0
  58. package/lib/__templates__/native-static/template.config.js +22 -0
  59. package/lib/__templates__/nextjs/.babelrc +15 -0
  60. package/lib/__templates__/nextjs/.coze +1 -0
  61. package/lib/__templates__/nextjs/AGENTS.md +54 -0
  62. package/lib/__templates__/nextjs/README.md +5 -0
  63. package/lib/__templates__/nextjs/_npmrc +1 -0
  64. package/lib/__templates__/nextjs/eslint.config.mjs +5 -0
  65. package/lib/__templates__/nextjs/next.config.ts +11 -0
  66. package/lib/__templates__/nextjs/package.json +10 -2
  67. package/lib/__templates__/nextjs/pnpm-lock.yaml +3488 -1569
  68. package/lib/__templates__/nextjs/scripts/build.sh +4 -1
  69. package/lib/__templates__/nextjs/scripts/dev.sh +15 -28
  70. package/lib/__templates__/nextjs/scripts/prepare.sh +9 -0
  71. package/lib/__templates__/nextjs/scripts/start.sh +7 -1
  72. package/lib/__templates__/nextjs/src/app/globals.css +109 -89
  73. package/lib/__templates__/nextjs/src/app/layout.tsx +23 -32
  74. package/lib/__templates__/nextjs/src/app/page.tsx +18 -49
  75. package/lib/__templates__/nextjs/src/components/ui/resizable.tsx +29 -22
  76. package/lib/__templates__/nextjs/src/components/ui/sidebar.tsx +228 -230
  77. package/lib/__templates__/nextjs/src/server.ts +35 -0
  78. package/lib/__templates__/nextjs/template.config.js +67 -2
  79. package/lib/__templates__/nextjs/tsconfig.json +1 -1
  80. package/lib/__templates__/nuxt-vue/.coze +12 -0
  81. package/lib/__templates__/nuxt-vue/AGENTS.md +42 -0
  82. package/lib/__templates__/nuxt-vue/README.md +73 -0
  83. package/lib/__templates__/nuxt-vue/_gitignore +24 -0
  84. package/lib/__templates__/nuxt-vue/_npmrc +23 -0
  85. package/lib/__templates__/nuxt-vue/app/app.vue +6 -0
  86. package/lib/__templates__/nuxt-vue/app/pages/index.vue +23 -0
  87. package/lib/__templates__/nuxt-vue/assets/css/main.css +24 -0
  88. package/lib/__templates__/nuxt-vue/nuxt.config.ts +116 -0
  89. package/lib/__templates__/nuxt-vue/package.json +35 -0
  90. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +8759 -0
  91. package/lib/__templates__/nuxt-vue/postcss.config.mjs +8 -0
  92. package/lib/__templates__/nuxt-vue/public/favicon.ico +0 -0
  93. package/lib/__templates__/nuxt-vue/public/robots.txt +2 -0
  94. package/lib/__templates__/nuxt-vue/scripts/build.sh +14 -0
  95. package/lib/__templates__/nuxt-vue/scripts/dev.sh +39 -0
  96. package/lib/__templates__/nuxt-vue/scripts/prepare.sh +14 -0
  97. package/lib/__templates__/nuxt-vue/scripts/start.sh +21 -0
  98. package/lib/__templates__/nuxt-vue/server/api/hello.ts +10 -0
  99. package/lib/__templates__/nuxt-vue/server/middleware/logger.ts +10 -0
  100. package/lib/__templates__/nuxt-vue/server/routes/health.ts +10 -0
  101. package/lib/__templates__/nuxt-vue/tailwind.config.js +13 -0
  102. package/lib/__templates__/nuxt-vue/template.config.js +87 -0
  103. package/lib/__templates__/nuxt-vue/tsconfig.json +18 -0
  104. package/lib/__templates__/taro/.coze +14 -0
  105. package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +19 -0
  106. package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +14 -0
  107. package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +2 -0
  108. package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +151 -0
  109. package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +5 -0
  110. package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +24 -0
  111. package/lib/__templates__/taro/README.md +763 -0
  112. package/lib/__templates__/taro/_gitignore +40 -0
  113. package/lib/__templates__/taro/_npmrc +18 -0
  114. package/lib/__templates__/taro/babel.config.js +12 -0
  115. package/lib/__templates__/taro/config/dev.ts +9 -0
  116. package/lib/__templates__/taro/config/index.ts +238 -0
  117. package/lib/__templates__/taro/config/prod.ts +34 -0
  118. package/lib/__templates__/taro/eslint.config.mjs +135 -0
  119. package/lib/__templates__/taro/key/private.appid.key +0 -0
  120. package/lib/__templates__/taro/package.json +112 -0
  121. package/lib/__templates__/taro/patches/@tarojs__plugin-mini-ci@4.1.9.patch +30 -0
  122. package/lib/__templates__/taro/pnpm-lock.yaml +23412 -0
  123. package/lib/__templates__/taro/pnpm-workspace.yaml +2 -0
  124. package/lib/__templates__/taro/project.config.json +15 -0
  125. package/lib/__templates__/taro/server/nest-cli.json +10 -0
  126. package/lib/__templates__/taro/server/package.json +40 -0
  127. package/lib/__templates__/taro/server/src/app.controller.ts +23 -0
  128. package/lib/__templates__/taro/server/src/app.module.ts +10 -0
  129. package/lib/__templates__/taro/server/src/app.service.ts +8 -0
  130. package/lib/__templates__/taro/server/src/interceptors/http-status.interceptor.ts +23 -0
  131. package/lib/__templates__/taro/server/src/main.ts +49 -0
  132. package/lib/__templates__/taro/server/tsconfig.json +24 -0
  133. package/lib/__templates__/taro/src/app.config.ts +11 -0
  134. package/lib/__templates__/taro/src/app.css +156 -0
  135. package/lib/__templates__/taro/src/app.tsx +9 -0
  136. package/lib/__templates__/taro/src/components/ui/accordion.tsx +159 -0
  137. package/lib/__templates__/taro/src/components/ui/alert-dialog.tsx +260 -0
  138. package/lib/__templates__/taro/src/components/ui/alert.tsx +60 -0
  139. package/lib/__templates__/taro/src/components/ui/aspect-ratio.tsx +36 -0
  140. package/lib/__templates__/taro/src/components/ui/avatar.tsx +84 -0
  141. package/lib/__templates__/taro/src/components/ui/badge.tsx +37 -0
  142. package/lib/__templates__/taro/src/components/ui/breadcrumb.tsx +117 -0
  143. package/lib/__templates__/taro/src/components/ui/button-group.tsx +83 -0
  144. package/lib/__templates__/taro/src/components/ui/button.tsx +67 -0
  145. package/lib/__templates__/taro/src/components/ui/calendar.tsx +394 -0
  146. package/lib/__templates__/taro/src/components/ui/card.tsx +108 -0
  147. package/lib/__templates__/taro/src/components/ui/carousel.tsx +228 -0
  148. package/lib/__templates__/taro/src/components/ui/checkbox.tsx +58 -0
  149. package/lib/__templates__/taro/src/components/ui/code-block.tsx +169 -0
  150. package/lib/__templates__/taro/src/components/ui/collapsible.tsx +71 -0
  151. package/lib/__templates__/taro/src/components/ui/command.tsx +385 -0
  152. package/lib/__templates__/taro/src/components/ui/context-menu.tsx +614 -0
  153. package/lib/__templates__/taro/src/components/ui/dialog.tsx +256 -0
  154. package/lib/__templates__/taro/src/components/ui/drawer.tsx +192 -0
  155. package/lib/__templates__/taro/src/components/ui/dropdown-menu.tsx +561 -0
  156. package/lib/__templates__/taro/src/components/ui/field.tsx +228 -0
  157. package/lib/__templates__/taro/src/components/ui/hover-card.tsx +282 -0
  158. package/lib/__templates__/taro/src/components/ui/input-group.tsx +197 -0
  159. package/lib/__templates__/taro/src/components/ui/input-otp.tsx +136 -0
  160. package/lib/__templates__/taro/src/components/ui/input.tsx +56 -0
  161. package/lib/__templates__/taro/src/components/ui/label.tsx +24 -0
  162. package/lib/__templates__/taro/src/components/ui/menubar.tsx +595 -0
  163. package/lib/__templates__/taro/src/components/ui/navigation-menu.tsx +264 -0
  164. package/lib/__templates__/taro/src/components/ui/pagination.tsx +118 -0
  165. package/lib/__templates__/taro/src/components/ui/popover.tsx +291 -0
  166. package/lib/__templates__/taro/src/components/ui/portal.tsx +19 -0
  167. package/lib/__templates__/taro/src/components/ui/progress.tsx +28 -0
  168. package/lib/__templates__/taro/src/components/ui/radio-group.tsx +64 -0
  169. package/lib/__templates__/taro/src/components/ui/resizable.tsx +346 -0
  170. package/lib/__templates__/taro/src/components/ui/scroll-area.tsx +34 -0
  171. package/lib/__templates__/taro/src/components/ui/select.tsx +438 -0
  172. package/lib/__templates__/taro/src/components/ui/separator.tsx +30 -0
  173. package/lib/__templates__/taro/src/components/ui/sheet.tsx +262 -0
  174. package/lib/__templates__/taro/src/components/ui/skeleton.tsx +17 -0
  175. package/lib/__templates__/taro/src/components/ui/slider.tsx +203 -0
  176. package/lib/__templates__/taro/src/components/ui/sonner.tsx +1 -0
  177. package/lib/__templates__/taro/src/components/ui/switch.tsx +55 -0
  178. package/lib/__templates__/taro/src/components/ui/table.tsx +142 -0
  179. package/lib/__templates__/taro/src/components/ui/tabs.tsx +114 -0
  180. package/lib/__templates__/taro/src/components/ui/textarea.tsx +54 -0
  181. package/lib/__templates__/taro/src/components/ui/toast.tsx +517 -0
  182. package/lib/__templates__/taro/src/components/ui/toggle-group.tsx +120 -0
  183. package/lib/__templates__/taro/src/components/ui/toggle.tsx +77 -0
  184. package/lib/__templates__/taro/src/components/ui/tooltip.tsx +455 -0
  185. package/lib/__templates__/taro/src/index.html +39 -0
  186. package/lib/__templates__/taro/src/lib/hooks/use-keyboard-offset.ts +37 -0
  187. package/lib/__templates__/taro/src/lib/measure.ts +115 -0
  188. package/lib/__templates__/taro/src/lib/platform.ts +12 -0
  189. package/lib/__templates__/taro/src/lib/utils.ts +6 -0
  190. package/lib/__templates__/taro/src/network.ts +39 -0
  191. package/lib/__templates__/taro/src/pages/index/index.config.ts +3 -0
  192. package/lib/__templates__/taro/src/pages/index/index.css +1 -0
  193. package/lib/__templates__/taro/src/pages/index/index.tsx +33 -0
  194. package/lib/__templates__/taro/src/presets/dev-debug.ts +23 -0
  195. package/lib/__templates__/taro/src/presets/h5-container.tsx +15 -0
  196. package/lib/__templates__/taro/src/presets/h5-navbar.tsx +238 -0
  197. package/lib/__templates__/taro/src/presets/h5-styles.ts +220 -0
  198. package/lib/__templates__/taro/src/presets/index.tsx +18 -0
  199. package/lib/__templates__/taro/stylelint.config.mjs +4 -0
  200. package/lib/__templates__/taro/template.config.js +68 -0
  201. package/lib/__templates__/taro/tsconfig.json +29 -0
  202. package/lib/__templates__/taro/types/global.d.ts +32 -0
  203. package/lib/__templates__/templates.json +136 -36
  204. package/lib/__templates__/vite/.coze +1 -0
  205. package/lib/__templates__/vite/AGENTS.md +41 -0
  206. package/lib/__templates__/vite/README.md +190 -11
  207. package/lib/__templates__/vite/_gitignore +1 -0
  208. package/lib/__templates__/vite/_npmrc +1 -0
  209. package/lib/__templates__/vite/eslint.config.mjs +14 -0
  210. package/lib/__templates__/vite/package.json +23 -3
  211. package/lib/__templates__/vite/pnpm-lock.yaml +2509 -293
  212. package/lib/__templates__/vite/scripts/build.sh +4 -1
  213. package/lib/__templates__/vite/scripts/dev.sh +16 -28
  214. package/lib/__templates__/vite/scripts/prepare.sh +9 -0
  215. package/lib/__templates__/vite/scripts/start.sh +9 -3
  216. package/lib/__templates__/vite/server/routes/index.ts +31 -0
  217. package/lib/__templates__/vite/server/server.ts +65 -0
  218. package/lib/__templates__/vite/server/vite.ts +67 -0
  219. package/lib/__templates__/vite/src/main.ts +17 -48
  220. package/lib/__templates__/vite/template.config.js +78 -8
  221. package/lib/__templates__/vite/tsconfig.json +4 -3
  222. package/lib/__templates__/vite/vite.config.ts +8 -3
  223. package/lib/cli.js +1711 -298
  224. package/package.json +17 -5
  225. package/lib/__templates__/expo/.cozeproj/scripts/deploy_build.sh +0 -116
  226. package/lib/__templates__/expo/.cozeproj/scripts/deploy_run.sh +0 -239
  227. package/lib/__templates__/expo/app.json +0 -63
  228. package/lib/__templates__/expo/babel.config.js +0 -9
  229. package/lib/__templates__/expo/client/app/(tabs)/_layout.tsx +0 -43
  230. package/lib/__templates__/expo/client/app/(tabs)/home.tsx +0 -1
  231. package/lib/__templates__/expo/client/app/(tabs)/index.tsx +0 -7
  232. package/lib/__templates__/expo/client/hooks/useColorScheme.ts +0 -1
  233. package/lib/__templates__/expo/client/index.js +0 -12
  234. package/lib/__templates__/expo/client/screens/home/index.tsx +0 -51
  235. package/lib/__templates__/expo/client/screens/home/styles.ts +0 -60
  236. package/lib/__templates__/expo/metro.config.js +0 -53
  237. package/lib/__templates__/expo/src/index.ts +0 -12
  238. package/lib/__templates__/nextjs/.vscode/settings.json +0 -121
  239. package/lib/__templates__/vite/.vscode/settings.json +0 -7
  240. /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
+ }
@@ -32,7 +32,7 @@ import {
32
32
  *
33
33
  * ## 2. 沉浸式 Header (推荐)
34
34
  * - 场景:Header 背景色/图片需要延伸到状态栏 (如首页、个人中心)。
35
- * - 用法:`<Screen safeAreaEdges={['left', 'right', 'bottom']}>` (去掉 'top')
35
+ * - 用法:`<Screen safeAreaEdges={['left', 'right', 'bottom']}>` (去掉 'top')
36
36
  * - 配合:页面内部 Header 组件必须手动添加 paddingTop:
37
37
  * ```tsx
38
38
  * const insets = useSafeAreaInsets();
@@ -41,7 +41,7 @@ import {
41
41
  *
42
42
  * ## 3. 底部有 TabBar 或 悬浮按钮
43
43
  * - 场景:页面底部有固定导航栏,或者需要精细控制底部留白。
44
- * - 用法:`<Screen safeAreaEdges={['top', 'left', 'right']}>` (去掉 'bottom')
44
+ * - 用法:`<Screen safeAreaEdges={['top', 'left', 'right']}>` (去掉 'bottom')
45
45
  * - 配合:
46
46
  * - 若是滚动页:`<ScrollView contentContainerStyle={{ paddingBottom: insets.bottom + 80 }}>`
47
47
  * - 若是固定页:`<View style={{ paddingBottom: insets.bottom + 60 }}>`
@@ -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,30 +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
- buttonText: "#FFFFFF",
10
- tabIconDefault: "#687076",
11
- tabIconSelected: tintColorLight,
12
- link: "#007AFF",
13
- backgroundRoot: "#FFFFFF", // Elevation 0
14
- backgroundDefault: "#F2F2F2", // Elevation 1
15
- backgroundSecondary: "#E6E6E6", // Elevation 2
16
- backgroundTertiary: "#D9D9D9", // Elevation 3
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",
17
17
  },
18
18
  dark: {
19
- text: "#ECEDEE",
20
- buttonText: "#FFFFFF",
21
- tabIconDefault: "#9BA1A6",
22
- tabIconSelected: tintColorDark,
23
- link: "#0A84FF",
24
- backgroundRoot: "#1F2123", // Elevation 0
25
- backgroundDefault: "#2A2C2E", // Elevation 1
26
- backgroundSecondary: "#353739", // Elevation 2
27
- backgroundTertiary: "#404244", // Elevation 3
19
+ textPrimary: "#FAFAF9",
20
+ textSecondary: "#A8A29E",
21
+ textMuted: "#6F767E",
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",
28
33
  },
29
34
  };
30
35
 
@@ -38,22 +43,39 @@ export const Spacing = {
38
43
  "3xl": 32,
39
44
  "4xl": 40,
40
45
  "5xl": 48,
41
- inputHeight: 48,
42
- buttonHeight: 52,
46
+ "6xl": 64,
43
47
  };
44
48
 
45
49
  export const BorderRadius = {
46
- xs: 8,
47
- sm: 12,
48
- md: 18,
49
- lg: 24,
50
- xl: 30,
51
- "2xl": 40,
52
- "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,
53
58
  full: 9999,
54
59
  };
55
60
 
56
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
+ },
57
79
  h1: {
58
80
  fontSize: 32,
59
81
  lineHeight: 40,
@@ -67,52 +89,89 @@ export const Typography = {
67
89
  h3: {
68
90
  fontSize: 24,
69
91
  lineHeight: 32,
70
- fontWeight: "600" as const,
92
+ fontWeight: "300" as const,
71
93
  },
72
94
  h4: {
73
95
  fontSize: 20,
74
96
  lineHeight: 28,
75
97
  fontWeight: "600" as const,
76
98
  },
99
+ title: {
100
+ fontSize: 18,
101
+ lineHeight: 24,
102
+ fontWeight: "700" as const,
103
+ },
77
104
  body: {
78
105
  fontSize: 16,
79
106
  lineHeight: 24,
80
107
  fontWeight: "400" as const,
81
108
  },
109
+ bodyMedium: {
110
+ fontSize: 16,
111
+ lineHeight: 24,
112
+ fontWeight: "500" as const,
113
+ },
82
114
  small: {
83
115
  fontSize: 14,
84
116
  lineHeight: 20,
85
117
  fontWeight: "400" as const,
86
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
+ },
87
155
  link: {
88
156
  fontSize: 16,
89
157
  lineHeight: 24,
90
158
  fontWeight: "400" as const,
91
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
+ },
92
175
  };
93
176
 
94
- export const Fonts = Platform.select({
95
- ios: {
96
- /** iOS `UIFontDescriptorSystemDesignDefault` */
97
- sans: "system-ui",
98
- /** iOS `UIFontDescriptorSystemDesignSerif` */
99
- serif: "ui-serif",
100
- /** iOS `UIFontDescriptorSystemDesignRounded` */
101
- rounded: "ui-rounded",
102
- /** iOS `UIFontDescriptorSystemDesignMonospaced` */
103
- mono: "ui-monospace",
104
- },
105
- default: {
106
- sans: "normal",
107
- serif: "serif",
108
- rounded: "normal",
109
- mono: "monospace",
110
- },
111
- web: {
112
- sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
113
- serif: "Georgia, 'Times New Roman', serif",
114
- rounded:
115
- "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif",
116
- mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
117
- },
118
- });
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,15 @@
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';
11
+ import forbidEmoji from '../eslint-plugins/forbid-emoji/index.js';
12
+ import restrictLinearGradient from '../eslint-plugins/restrict-linear-gradient/index.js';
8
13
 
9
14
  export default [
10
15
  {
@@ -15,19 +20,22 @@ export default [
15
20
  'src/api/**', // 排除 src 下的自动生成 API
16
21
  '.expo/**', // 排除 Expo 自动生成的文件
17
22
  'tailwind.config.js', // 排除 Tailwind 配置文件
23
+ '**/*.d.ts',
24
+ 'eslint.config.*',
25
+ 'metro.config.*',
18
26
  ],
19
27
  },
20
28
  regexp.configs["flat/recommended"],
21
29
  js.configs.recommended,
22
30
  ...tseslint.configs.recommended,
23
-
31
+
24
32
  // React 的推荐配置
25
33
  pluginReact.configs.flat.recommended,
26
34
  pluginReact.configs.flat['jsx-runtime'],
27
35
  reactHooks.configs.flat.recommended,
28
36
  {
29
37
  files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
30
-
38
+
31
39
  // 语言选项:设置全局变量
32
40
  languageOptions: {
33
41
  globals: {
@@ -52,6 +60,11 @@ export default [
52
60
 
53
61
  plugins: {
54
62
  import: pluginImport,
63
+ fontawesome6,
64
+ reanimated,
65
+ reactnative,
66
+ forbidEmoji,
67
+ restrictLinearGradient,
55
68
  },
56
69
  rules: {
57
70
  // 关闭代码风格规则
@@ -70,6 +83,23 @@ export default [
70
83
  'no-prototype-builtins': 'off',
71
84
  'react/react-in-jsx-scope': 'off',
72
85
  'react/jsx-uses-react': 'off',
86
+ 'fontawesome6/valid-name': 'error',
87
+ 'reanimated/ban-mix-use': 'error',
88
+ 'forbidEmoji/no-emoji': 'error',
89
+ 'restrictLinearGradient/no-linear-gradient-backgroundcolor': 'error',
90
+ // 禁止使用 via.placeholder.com 服务
91
+ 'no-restricted-syntax': [
92
+ 'error',
93
+ {
94
+ 'selector': 'Literal[value=/via\\.placeholder\\.com/]',
95
+ 'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
96
+ },
97
+ {
98
+ 'selector': 'TemplateLiteral > TemplateElement[value.raw=/via\\.placeholder\\.com/]',
99
+ 'message': 'via.placeholder.com 服务不可用,禁止在代码中使用',
100
+ },
101
+ ],
102
+ 'reactnative/wrap-horizontal-scrollview-inside-view': ['error'],
73
103
  },
74
104
  },
75
105
 
@@ -91,7 +121,7 @@ export default [
91
121
  // 在 .js 文件中关闭 TS 规则
92
122
  '@typescript-eslint/no-require-imports': 'off',
93
123
  // 在 Node.js 文件中允许 require
94
- '@typescript-eslint/no-var-requires': 'off',
124
+ '@typescript-eslint/no-var-requires': 'off',
95
125
  'no-undef': 'off',
96
126
  },
97
127
  },
@@ -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
+ }