@coze-arch/cli 0.0.1-alpha.8f2811 → 0.0.1-alpha.904498
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/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +12 -13
- package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +8 -9
- package/lib/__templates__/expo/README.md +13 -16
- package/lib/__templates__/expo/client/app/+not-found.tsx +4 -19
- package/lib/__templates__/expo/client/app/_layout.tsx +16 -17
- package/lib/__templates__/expo/client/global.css +78 -0
- package/lib/__templates__/expo/client/metro.config.js +8 -1
- package/lib/__templates__/expo/client/package.json +9 -7
- package/lib/__templates__/expo/client/screens/demo/index.tsx +7 -13
- package/lib/__templates__/expo/client/styles.css +263 -0
- package/lib/__templates__/expo/client/uniwind-types.d.ts +10 -0
- package/lib/__templates__/expo/patches/expo@54.0.32.patch +2 -3
- package/lib/__templates__/expo/pnpm-lock.yaml +1732 -163
- package/lib/__templates__/expo/server/package.json +1 -1
- package/lib/__templates__/nextjs/src/app/page.tsx +61 -17
- package/lib/__templates__/templates.json +0 -32
- package/lib/__templates__/vite/src/main.ts +47 -17
- package/lib/cli.js +1 -1
- package/package.json +1 -1
- package/lib/__templates__/expo/client/components/ThemedText.tsx +0 -33
- package/lib/__templates__/expo/client/components/ThemedView.tsx +0 -37
- package/lib/__templates__/expo/client/constants/theme.ts +0 -177
- package/lib/__templates__/expo/client/hooks/useColorScheme.tsx +0 -48
- package/lib/__templates__/expo/client/hooks/useTheme.ts +0 -33
- package/lib/__templates__/taro/.coze +0 -14
- package/lib/__templates__/taro/.cozeproj/scripts/deploy_build.sh +0 -19
- package/lib/__templates__/taro/.cozeproj/scripts/deploy_run.sh +0 -14
- package/lib/__templates__/taro/.cozeproj/scripts/dev_build.sh +0 -16
- package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +0 -74
- package/lib/__templates__/taro/.cozeproj/scripts/init_env.sh +0 -5
- package/lib/__templates__/taro/.cozeproj/scripts/pack.sh +0 -1
- package/lib/__templates__/taro/README.md +0 -687
- package/lib/__templates__/taro/_gitignore +0 -40
- package/lib/__templates__/taro/_npmrc +0 -18
- package/lib/__templates__/taro/babel.config.js +0 -12
- package/lib/__templates__/taro/config/dev.ts +0 -9
- package/lib/__templates__/taro/config/index.ts +0 -173
- package/lib/__templates__/taro/config/prod.ts +0 -35
- package/lib/__templates__/taro/eslint.config.mjs +0 -57
- package/lib/__templates__/taro/key/private.appid.key +0 -0
- package/lib/__templates__/taro/package.json +0 -95
- package/lib/__templates__/taro/pnpm-lock.yaml +0 -22430
- package/lib/__templates__/taro/pnpm-workspace.yaml +0 -2
- package/lib/__templates__/taro/project.config.json +0 -15
- package/lib/__templates__/taro/server/nest-cli.json +0 -10
- package/lib/__templates__/taro/server/package.json +0 -38
- package/lib/__templates__/taro/server/src/app.controller.ts +0 -23
- package/lib/__templates__/taro/server/src/app.module.ts +0 -10
- package/lib/__templates__/taro/server/src/app.service.ts +0 -8
- package/lib/__templates__/taro/server/src/interceptors/http-status.interceptor.ts +0 -23
- package/lib/__templates__/taro/server/src/main.ts +0 -49
- package/lib/__templates__/taro/server/tsconfig.json +0 -24
- package/lib/__templates__/taro/src/app.config.ts +0 -11
- package/lib/__templates__/taro/src/app.css +0 -52
- package/lib/__templates__/taro/src/app.ts +0 -14
- package/lib/__templates__/taro/src/index.html +0 -50
- package/lib/__templates__/taro/src/network.ts +0 -39
- package/lib/__templates__/taro/src/pages/index/index.config.ts +0 -3
- package/lib/__templates__/taro/src/pages/index/index.css +0 -1
- package/lib/__templates__/taro/src/pages/index/index.tsx +0 -33
- package/lib/__templates__/taro/src/utils/h5-styles.ts +0 -22
- package/lib/__templates__/taro/src/utils/wx-debug.ts +0 -23
- package/lib/__templates__/taro/stylelint.config.mjs +0 -4
- package/lib/__templates__/taro/template.config.js +0 -68
- package/lib/__templates__/taro/tsconfig.json +0 -29
- package/lib/__templates__/taro/types/global.d.ts +0 -32
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
2
2
|
PREVIEW_DIR="${COZE_PREVIEW_DIR:-/source/preview}"
|
|
3
3
|
LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
|
|
4
|
-
|
|
4
|
+
LOG_FILE="$LOG_DIR/app.log"
|
|
5
5
|
mkdir -p "$LOG_DIR"
|
|
6
6
|
|
|
7
7
|
# ==================== 配置项 ====================
|
|
@@ -89,17 +89,14 @@ ensure_port() {
|
|
|
89
89
|
pipe_to_log() {
|
|
90
90
|
local source="${1:-CLIENT}"
|
|
91
91
|
local raw_log="${2:-}"
|
|
92
|
-
local line
|
|
92
|
+
local line timestamp ts msg record
|
|
93
93
|
while IFS= read -r line || [ -n "$line" ]; do
|
|
94
|
-
clean_line=$(printf '%s' "$line" | sed 's/\x1b\[[0-9;]*[mA-Za-z]//g')
|
|
95
|
-
if echo "$clean_line" | grep -qE '(^(Web|iOS|Android) node_modules/.*expo-router.*entry\.js.*%|^(Web|iOS|Android) Bundled [0-9]+ms node_modules/.*expo-router.*entry\.js|Logs will appear in the browser)'; then
|
|
96
|
-
continue
|
|
97
|
-
fi
|
|
98
94
|
if [ -n "$raw_log" ]; then
|
|
99
|
-
|
|
100
|
-
echo "[$timestamp] $clean_line" >> "$raw_log"
|
|
95
|
+
echo "$line" >> "$raw_log"
|
|
101
96
|
fi
|
|
102
|
-
|
|
97
|
+
line=$(echo "[$source] $line" | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\x1b\[[0-9;]*m//g')
|
|
98
|
+
msg="${line}"
|
|
99
|
+
echo "$msg"
|
|
103
100
|
done
|
|
104
101
|
}
|
|
105
102
|
|
|
@@ -119,10 +116,10 @@ start_expo() {
|
|
|
119
116
|
|
|
120
117
|
if [ "$offline" = "1" ]; then
|
|
121
118
|
( EXPO_OFFLINE=1 EXPO_NO_DEPENDENCY_VALIDATION=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" EXPO_PUBLIC_COZE_PROJECT_ID="$EXPO_PUBLIC_COZE_PROJECT_ID" \
|
|
122
|
-
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$
|
|
119
|
+
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$ROOT_DIR/logs/client.log" ) &
|
|
123
120
|
else
|
|
124
121
|
( EXPO_NO_DEPENDENCY_VALIDATION=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" EXPO_PUBLIC_COZE_PROJECT_ID="$EXPO_PUBLIC_COZE_PROJECT_ID" \
|
|
125
|
-
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$
|
|
122
|
+
nohup npx expo start --clear --port "$EXPO_PORT" 2>&1 | pipe_to_log "CLIENT" "$ROOT_DIR/logs/client.log" ) &
|
|
126
123
|
fi
|
|
127
124
|
EXPO_PID=$!
|
|
128
125
|
disown $EXPO_PID 2>/dev/null || true
|
|
@@ -133,9 +130,9 @@ start_expo() {
|
|
|
133
130
|
detect_expo_fetch_failed() {
|
|
134
131
|
local timeout="${1:-8}"
|
|
135
132
|
local waited=0
|
|
136
|
-
local log_file="$
|
|
133
|
+
local log_file="$ROOT_DIR/logs/client.log"
|
|
137
134
|
while [ "$waited" -lt "$timeout" ]; do
|
|
138
|
-
if [ -f "$log_file" ] &&
|
|
135
|
+
if [ -f "$log_file" ] && grep -q "TypeError: fetch failed" "$log_file" 2>/dev/null; then
|
|
139
136
|
return 0
|
|
140
137
|
fi
|
|
141
138
|
sleep 1
|
|
@@ -169,6 +166,8 @@ check_command "pnpm"
|
|
|
169
166
|
check_command "lsof"
|
|
170
167
|
check_command "bash"
|
|
171
168
|
|
|
169
|
+
echo "准备日志目录:$ROOT_DIR/logs"
|
|
170
|
+
mkdir -p "$ROOT_DIR/logs"
|
|
172
171
|
# 端口占用预检查与处理
|
|
173
172
|
ensure_port SERVER_PORT "$SERVER_PORT"
|
|
174
173
|
ensure_port EXPO_PORT "$EXPO_PORT"
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
ROOT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
4
4
|
SERVER_DIR="$ROOT_DIR/server"
|
|
5
|
-
LOG_DIR="$
|
|
6
|
-
|
|
5
|
+
LOG_DIR="$ROOT_DIR/logs"
|
|
6
|
+
LOG_FILE="$LOG_DIR/server.log"
|
|
7
7
|
SERVER_PORT="${SERVER_PORT:-9091}"
|
|
8
8
|
|
|
9
9
|
mkdir -p "$LOG_DIR"
|
|
@@ -11,14 +11,13 @@ mkdir -p "$LOG_DIR"
|
|
|
11
11
|
pipe_to_log() {
|
|
12
12
|
local source="${1:-SERVER}"
|
|
13
13
|
local raw_log="${2:-}"
|
|
14
|
-
local line
|
|
14
|
+
local line
|
|
15
15
|
while IFS= read -r line || [ -n "$line" ]; do
|
|
16
|
-
clean_line=$(printf '%s' "$line" | sed 's/\x1b\[[0-9;]*[mA-Za-z]//g')
|
|
17
16
|
if [ -n "$raw_log" ]; then
|
|
18
|
-
|
|
19
|
-
echo "[$timestamp] $clean_line" >> "$raw_log"
|
|
17
|
+
echo "$line" >> "$raw_log"
|
|
20
18
|
fi
|
|
21
|
-
|
|
19
|
+
line=$(echo "[$source] $line" | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g; s/\x1b\[[0-9;]*m//g')
|
|
20
|
+
echo "$line"
|
|
22
21
|
done
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -37,10 +36,10 @@ kill_old_server() {
|
|
|
37
36
|
echo "==================== Server Dev Run ===================="
|
|
38
37
|
echo "Server 目录:$SERVER_DIR"
|
|
39
38
|
echo "Server 端口:$SERVER_PORT"
|
|
40
|
-
echo "日志文件:$
|
|
39
|
+
echo "日志文件:$LOG_FILE"
|
|
41
40
|
|
|
42
41
|
kill_old_server
|
|
43
42
|
|
|
44
43
|
echo "启动 server 服务..."
|
|
45
44
|
cd "$SERVER_DIR"
|
|
46
|
-
NODE_ENV=development PORT="$SERVER_PORT" npx tsx ./src/index.ts 2>&1 | pipe_to_log "SERVER" "$
|
|
45
|
+
NODE_ENV=development PORT="$SERVER_PORT" npx tsx ./src/index.ts 2>&1 | pipe_to_log "SERVER" "$LOG_FILE"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Expo App + Express.js
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 目录结构规范
|
|
4
4
|
|
|
5
5
|
当前仓库是一个 monorepo(基于 pnpm 的 workspace)
|
|
6
6
|
|
|
@@ -16,17 +16,14 @@
|
|
|
16
16
|
├── client/ # React Native 前端代码
|
|
17
17
|
│ ├── app/ # Expo Router 路由目录(仅路由配置)
|
|
18
18
|
│ │ ├── _layout.tsx # 根布局文件(必需,务必阅读)
|
|
19
|
-
│ │
|
|
20
|
-
│ │ └── index.tsx # re-export home.tsx
|
|
19
|
+
│ │ └── index.tsx # 首页
|
|
21
20
|
│ ├── screens/ # 页面实现目录(与 app/ 路由对应)
|
|
22
|
-
│ │ └── demo/
|
|
23
|
-
│ │
|
|
24
|
-
│ │ └── styles.ts # 页面样式
|
|
21
|
+
│ │ └── demo/
|
|
22
|
+
│ │ └── index.tsx # demo 示例页面(默认首页,不需要可以删除,记得同时更新路由文件)
|
|
25
23
|
│ ├── components/ # 可复用组件
|
|
26
24
|
│ │ └── Screen.tsx # 页面容器组件(必用)
|
|
27
25
|
│ ├── hooks/ # 自定义 Hooks
|
|
28
26
|
│ ├── contexts/ # React Context 代码
|
|
29
|
-
│ ├── constants/ # 常量定义(如主题配置)
|
|
30
27
|
│ ├── utils/ # 工具函数
|
|
31
28
|
│ ├── assets/ # 静态资源
|
|
32
29
|
| └── package.json # Expo 应用 package.json
|
|
@@ -34,6 +31,15 @@
|
|
|
34
31
|
├── .cozeproj # 预置脚手架脚本(禁止修改)
|
|
35
32
|
└── .coze # 配置文件(禁止修改)
|
|
36
33
|
|
|
34
|
+
## 技术选型(严格遵循)
|
|
35
|
+
|
|
36
|
+
- 前端:Expo + React Native + TailwindCSS
|
|
37
|
+
- 后端:Express.js
|
|
38
|
+
|
|
39
|
+
本项目通过 uniwind 实现了 react-native 对 TailwindCSS v4 的支持,在编写样式时应使用 TailwindCSS 写法
|
|
40
|
+
|
|
41
|
+
在开始开发前,先查看 client/global.css 了解必要的信息
|
|
42
|
+
|
|
37
43
|
## 安装依赖
|
|
38
44
|
|
|
39
45
|
### 命令
|
|
@@ -42,15 +48,6 @@
|
|
|
42
48
|
pnpm i
|
|
43
49
|
```
|
|
44
50
|
|
|
45
|
-
### 新增依赖约束
|
|
46
|
-
|
|
47
|
-
如果需要新增依赖,需在 client 和 server 各自的目录添加(原因:隔离前后端的依赖),禁止在根目录直接安装依赖
|
|
48
|
-
|
|
49
|
-
### 新增依赖标准流程
|
|
50
|
-
|
|
51
|
-
- 编辑 `client/package.json` 或 `server/package.json`
|
|
52
|
-
- 在根目录执行 `pnpm i`
|
|
53
|
-
|
|
54
51
|
## Expo 开发规范
|
|
55
52
|
|
|
56
53
|
### 路径别名
|
|
@@ -1,30 +1,15 @@
|
|
|
1
|
-
import { View, Text
|
|
1
|
+
import { View, Text } from 'react-native';
|
|
2
2
|
import { Link } from 'expo-router';
|
|
3
|
-
import { useTheme } from '@/hooks/useTheme';
|
|
4
|
-
import { Spacing } from '@/constants/theme';
|
|
5
3
|
|
|
6
4
|
export default function NotFoundScreen() {
|
|
7
|
-
const { theme } = useTheme();
|
|
8
|
-
|
|
9
5
|
return (
|
|
10
|
-
<View
|
|
11
|
-
<Text>
|
|
6
|
+
<View className="flex-1 justify-center items-center bg-background">
|
|
7
|
+
<Text className="text-foreground">
|
|
12
8
|
页面不存在
|
|
13
9
|
</Text>
|
|
14
|
-
<Link href="/"
|
|
10
|
+
<Link href="/" className="text-accent mt-6">
|
|
15
11
|
返回首页
|
|
16
12
|
</Link>
|
|
17
13
|
</View>
|
|
18
14
|
);
|
|
19
15
|
}
|
|
20
|
-
|
|
21
|
-
const styles = StyleSheet.create({
|
|
22
|
-
container: {
|
|
23
|
-
flex: 1,
|
|
24
|
-
justifyContent: 'center',
|
|
25
|
-
alignItems: 'center',
|
|
26
|
-
},
|
|
27
|
-
gohome: {
|
|
28
|
-
marginTop: Spacing['2xl'],
|
|
29
|
-
},
|
|
30
|
-
});
|
|
@@ -5,7 +5,8 @@ import { StatusBar } from 'expo-status-bar';
|
|
|
5
5
|
import { LogBox } from 'react-native';
|
|
6
6
|
import Toast from 'react-native-toast-message';
|
|
7
7
|
import { AuthProvider } from "@/contexts/AuthContext";
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
import '../global.css';
|
|
9
10
|
|
|
10
11
|
LogBox.ignoreLogs([
|
|
11
12
|
"TurboModuleRegistry.getEnforcing(...): 'RNMapsAirModule' could not be found",
|
|
@@ -15,22 +16,20 @@ LogBox.ignoreLogs([
|
|
|
15
16
|
export default function RootLayout() {
|
|
16
17
|
return (
|
|
17
18
|
<AuthProvider>
|
|
18
|
-
<
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
</GestureHandlerRootView>
|
|
33
|
-
</ColorSchemeProvider>
|
|
19
|
+
<GestureHandlerRootView style={{ flex: 1 }}>
|
|
20
|
+
<StatusBar style="dark"></StatusBar>
|
|
21
|
+
<Stack screenOptions={{
|
|
22
|
+
// 设置所有页面的切换动画为从右侧滑入,适用于iOS 和 Android
|
|
23
|
+
animation: 'slide_from_right',
|
|
24
|
+
gestureEnabled: true,
|
|
25
|
+
gestureDirection: 'horizontal',
|
|
26
|
+
// 隐藏自带的头部
|
|
27
|
+
headerShown: false
|
|
28
|
+
}}>
|
|
29
|
+
<Stack.Screen name="index" options={{ title: "" }} />
|
|
30
|
+
</Stack>
|
|
31
|
+
<Toast />
|
|
32
|
+
</GestureHandlerRootView>
|
|
34
33
|
</AuthProvider>
|
|
35
34
|
);
|
|
36
35
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
@import 'uniwind';
|
|
3
|
+
|
|
4
|
+
@import './styles';
|
|
5
|
+
|
|
6
|
+
:root,
|
|
7
|
+
.light,
|
|
8
|
+
.default,
|
|
9
|
+
[data-theme="light"],
|
|
10
|
+
[data-theme="default"] {
|
|
11
|
+
/* Theme Colors (Light Mode) */
|
|
12
|
+
--accent: oklch(55.00% 0.2500 254.00);
|
|
13
|
+
--accent-foreground: oklch(99.11% 0 0);
|
|
14
|
+
--background: oklch(97.02% 0.0040 254.00);
|
|
15
|
+
--border: oklch(90.00% 0.0040 254.00);
|
|
16
|
+
--danger: oklch(65.32% 0.2347 25.76);
|
|
17
|
+
--danger-foreground: oklch(99.11% 0 0);
|
|
18
|
+
--default: oklch(94.00% 0.0040 254.00);
|
|
19
|
+
--default-foreground: oklch(21.03% 0.0059 254.00);
|
|
20
|
+
--field-background: oklch(100.00% 0.0020 254.00);
|
|
21
|
+
--field-foreground: oklch(21.03% 0.0059 254.00);
|
|
22
|
+
--field-placeholder: oklch(55.17% 0.0081 254.00);
|
|
23
|
+
--focus: oklch(55.00% 0.2500 254.00);
|
|
24
|
+
--foreground: oklch(21.03% 0.0059 254.00);
|
|
25
|
+
--muted: oklch(55.17% 0.0081 254.00);
|
|
26
|
+
--overlay: oklch(100.00% 0.0012 254.00);
|
|
27
|
+
--overlay-foreground: oklch(21.03% 0.0059 254.00);
|
|
28
|
+
--scrollbar: oklch(87.10% 0.0040 254.00);
|
|
29
|
+
--segment: oklch(100.00% 0.0040 254.00);
|
|
30
|
+
--segment-foreground: oklch(21.03% 0.0059 254.00);
|
|
31
|
+
--separator: oklch(92.00% 0.0040 254.00);
|
|
32
|
+
--success: oklch(73.29% 0.1951 150.83);
|
|
33
|
+
--success-foreground: oklch(21.03% 0.0059 150.83);
|
|
34
|
+
--surface: oklch(100.00% 0.0020 254.00);
|
|
35
|
+
--surface-foreground: oklch(21.03% 0.0059 254.00);
|
|
36
|
+
--warning: oklch(78.19% 0.1598 72.35);
|
|
37
|
+
--warning-foreground: oklch(21.03% 0.0059 72.35);
|
|
38
|
+
|
|
39
|
+
/* Border Radius */
|
|
40
|
+
--radius: 0.75rem;
|
|
41
|
+
--field-radius: 0.5rem;
|
|
42
|
+
|
|
43
|
+
/* Font Family */
|
|
44
|
+
/* Make sure to load Google Sans font in your app */
|
|
45
|
+
--font-sans: var(--font-google-sans);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.dark,
|
|
49
|
+
[data-theme="dark"] {
|
|
50
|
+
color-scheme: dark;
|
|
51
|
+
/* Theme Colors (Dark Mode) */
|
|
52
|
+
--accent: oklch(55.00% 0.2500 254.00);
|
|
53
|
+
--accent-foreground: oklch(99.11% 0 0);
|
|
54
|
+
--background: oklch(12.00% 0.0040 254.00);
|
|
55
|
+
--border: oklch(28.00% 0.0040 254.00);
|
|
56
|
+
--danger: oklch(59.40% 0.1983 24.65);
|
|
57
|
+
--danger-foreground: oklch(99.11% 0 0);
|
|
58
|
+
--default: oklch(27.40% 0.0040 254.00);
|
|
59
|
+
--default-foreground: oklch(99.11% 0 0);
|
|
60
|
+
--field-background: oklch(21.03% 0.0081 254.00);
|
|
61
|
+
--field-foreground: oklch(99.11% 0.0000 0.00);
|
|
62
|
+
--field-placeholder: oklch(70.50% 0.0081 254.00);
|
|
63
|
+
--focus: oklch(55.00% 0.2500 254.00);
|
|
64
|
+
--foreground: oklch(99.11% 0.0000 0.00);
|
|
65
|
+
--muted: oklch(70.50% 0.0081 254.00);
|
|
66
|
+
--overlay: oklch(21.03% 0.0081 254.00);
|
|
67
|
+
--overlay-foreground: oklch(99.11% 0.0000 0.00);
|
|
68
|
+
--scrollbar: oklch(70.50% 0.0040 254.00);
|
|
69
|
+
--segment: oklch(39.64% 0.0040 254.00);
|
|
70
|
+
--segment-foreground: oklch(99.11% 0.0000 0.00);
|
|
71
|
+
--separator: oklch(25.00% 0.0040 254.00);
|
|
72
|
+
--success: oklch(73.29% 0.1951 150.83);
|
|
73
|
+
--success-foreground: oklch(21.03% 0.0059 150.83);
|
|
74
|
+
--surface: oklch(21.03% 0.0081 254.00);
|
|
75
|
+
--surface-foreground: oklch(99.11% 0.0000 0.00);
|
|
76
|
+
--warning: oklch(82.03% 0.1399 76.36);
|
|
77
|
+
--warning-foreground: oklch(21.03% 0.0059 76.36);
|
|
78
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const { getDefaultConfig } = require('expo/metro-config');
|
|
2
2
|
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
3
3
|
const connect = require('connect');
|
|
4
|
+
const { withUniwindConfig } = require('uniwind/metro');
|
|
4
5
|
|
|
5
6
|
const config = getDefaultConfig(__dirname);
|
|
6
7
|
|
|
@@ -118,4 +119,10 @@ config.server = {
|
|
|
118
119
|
},
|
|
119
120
|
};
|
|
120
121
|
|
|
121
|
-
module.exports = config
|
|
122
|
+
module.exports = withUniwindConfig(config, {
|
|
123
|
+
// relative path to your global.css file (from previous step)
|
|
124
|
+
cssEntryFile: './global.css',
|
|
125
|
+
// (optional) path where we gonna auto-generate typings
|
|
126
|
+
// defaults to project's root
|
|
127
|
+
dtsFile: './uniwind-types.d.ts'
|
|
128
|
+
});
|
|
@@ -35,18 +35,18 @@
|
|
|
35
35
|
"expo-file-system": "~19.0.21",
|
|
36
36
|
"expo-font": "~14.0.7",
|
|
37
37
|
"expo-haptics": "~15.0.6",
|
|
38
|
+
"expo-image": "^3.0.11",
|
|
38
39
|
"expo-image-picker": "~17.0.7",
|
|
39
40
|
"expo-linear-gradient": "~15.0.6",
|
|
40
41
|
"expo-linking": "~8.0.7",
|
|
41
42
|
"expo-location": "~19.0.7",
|
|
42
|
-
"expo-image": "^3.0.11",
|
|
43
|
-
"js-base64": "^3.7.7",
|
|
44
43
|
"expo-router": "~6.0.0",
|
|
45
44
|
"expo-splash-screen": "~31.0.8",
|
|
46
45
|
"expo-status-bar": "~3.0.7",
|
|
47
46
|
"expo-symbols": "~1.0.6",
|
|
48
47
|
"expo-system-ui": "~6.0.9",
|
|
49
48
|
"expo-web-browser": "~15.0.10",
|
|
49
|
+
"js-base64": "^3.7.7",
|
|
50
50
|
"react": "19.1.0",
|
|
51
51
|
"react-dom": "19.1.0",
|
|
52
52
|
"react-native": "0.81.5",
|
|
@@ -62,17 +62,20 @@
|
|
|
62
62
|
"react-native-web": "^0.21.2",
|
|
63
63
|
"react-native-webview": "~13.15.0",
|
|
64
64
|
"react-native-worklets": "0.5.1",
|
|
65
|
+
"tailwindcss": "^4.1.18",
|
|
66
|
+
"uniwind": "^1.2.7",
|
|
65
67
|
"zod": "^4.2.1"
|
|
66
68
|
},
|
|
67
69
|
"devDependencies": {
|
|
68
70
|
"@babel/core": "^7.25.2",
|
|
69
|
-
"babel-plugin-module-resolver": "^5.0.2",
|
|
70
|
-
"babel-preset-expo": "^54.0.9",
|
|
71
71
|
"@eslint/js": "^9.27.0",
|
|
72
72
|
"@types/jest": "^29.5.12",
|
|
73
73
|
"@types/react": "~19.1.0",
|
|
74
74
|
"@types/react-test-renderer": "19.1.0",
|
|
75
|
+
"babel-plugin-module-resolver": "^5.0.2",
|
|
76
|
+
"babel-preset-expo": "^54.0.9",
|
|
75
77
|
"chalk": "^4.1.2",
|
|
78
|
+
"connect": "^3.7.0",
|
|
76
79
|
"depcheck": "^1.4.7",
|
|
77
80
|
"esbuild": "0.27.2",
|
|
78
81
|
"eslint": "^9.39.2",
|
|
@@ -83,13 +86,12 @@
|
|
|
83
86
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
84
87
|
"eslint-plugin-regexp": "^2.10.0",
|
|
85
88
|
"globals": "^16.1.0",
|
|
89
|
+
"http-proxy-middleware": "^3.0.5",
|
|
86
90
|
"jest": "^29.2.1",
|
|
87
91
|
"jest-expo": "~54.0.10",
|
|
88
92
|
"react-test-renderer": "19.1.0",
|
|
89
93
|
"tsx": "^4.21.0",
|
|
90
94
|
"typescript": "^5.8.3",
|
|
91
|
-
"typescript-eslint": "^8.32.1"
|
|
92
|
-
"connect": "^3.7.0",
|
|
93
|
-
"http-proxy-middleware": "^3.0.5"
|
|
95
|
+
"typescript-eslint": "^8.32.1"
|
|
94
96
|
}
|
|
95
97
|
}
|
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
import { View, Text } from 'react-native';
|
|
2
2
|
import { Image } from 'expo-image';
|
|
3
3
|
|
|
4
|
-
import { useTheme } from '@/hooks/useTheme';
|
|
5
4
|
import { Screen } from '@/components/Screen';
|
|
6
|
-
import { styles } from './styles';
|
|
7
5
|
|
|
8
6
|
export default function DemoPage() {
|
|
9
|
-
const { theme, isDark } = useTheme();
|
|
10
|
-
|
|
11
7
|
return (
|
|
12
|
-
<Screen backgroundColor=
|
|
13
|
-
<View
|
|
14
|
-
style={styles.container}
|
|
15
|
-
>
|
|
8
|
+
<Screen backgroundColor="var(--background)" statusBarStyle="auto">
|
|
9
|
+
<View className="absolute top-0 left-0 w-full h-full flex flex-col items-center justify-center">
|
|
16
10
|
<Image
|
|
17
|
-
|
|
18
|
-
source="https://lf-coze-web-cdn.coze.cn/obj/eden-cn/lm-lgvj/ljhwZthlaukjlkulzlp/coze-coding/
|
|
19
|
-
|
|
20
|
-
<Text
|
|
21
|
-
<Text
|
|
11
|
+
className="w-[130px] h-[109px]"
|
|
12
|
+
source="https://lf-coze-web-cdn.coze.cn/obj/eden-cn/lm-lgvj/ljhwZthlaukjlkulzlp/coze-coding/expo/coze-loading.gif"
|
|
13
|
+
/>
|
|
14
|
+
<Text className="text-base font-bold text-foreground">APP 开发中</Text>
|
|
15
|
+
<Text className="text-sm mt-2 text-muted">即将为您呈现应用界面</Text>
|
|
22
16
|
</View>
|
|
23
17
|
</Screen>
|
|
24
18
|
);
|