create-next-imagicma 0.0.7 → 0.0.8
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/template/opencode.json +7 -0
- package/template/package.json +1 -1
- package/template/pnpm-lock.yaml +12 -12
- package/template-hono/AGENTS.md +50 -2
- package/template-hono/client/index.html +1 -1
- package/template-hono/client/src/components/ui/alert-dialog.tsx +9 -3
- package/template-hono/client/src/components/ui/button.tsx +10 -13
- package/template-hono/client/src/components/ui/card.tsx +3 -3
- package/template-hono/client/src/components/ui/checkbox.tsx +2 -2
- package/template-hono/client/src/components/ui/input.tsx +1 -1
- package/template-hono/client/src/components/ui/select.tsx +3 -3
- package/template-hono/client/src/components/ui/textarea.tsx +1 -1
- package/template-hono/client/src/globals.css +152 -108
- package/template-hono/client/src/lib/theme/default-theme.ts +1 -1
- package/template-hono/opencode.json +7 -0
- package/template-hono/package.json +1 -1
- package/template-hono/pnpm-lock.yaml +11 -11
package/package.json
CHANGED
package/template/package.json
CHANGED
package/template/pnpm-lock.yaml
CHANGED
|
@@ -106,7 +106,7 @@ importers:
|
|
|
106
106
|
version: 0.39.3(pg@8.18.0)
|
|
107
107
|
drizzle-zod:
|
|
108
108
|
specifier: ^0.7.0
|
|
109
|
-
version: 0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@3.
|
|
109
|
+
version: 0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@4.3.6)
|
|
110
110
|
embla-carousel-react:
|
|
111
111
|
specifier: ^8.6.0
|
|
112
112
|
version: 8.6.0(react@19.2.3)
|
|
@@ -153,8 +153,8 @@ importers:
|
|
|
153
153
|
specifier: ^1.1.2
|
|
154
154
|
version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
|
|
155
155
|
zod:
|
|
156
|
-
specifier: ^
|
|
157
|
-
version: 3.
|
|
156
|
+
specifier: ^4.1.5
|
|
157
|
+
version: 4.3.6
|
|
158
158
|
devDependencies:
|
|
159
159
|
'@tailwindcss/postcss':
|
|
160
160
|
specifier: ^4
|
|
@@ -3534,8 +3534,8 @@ packages:
|
|
|
3534
3534
|
peerDependencies:
|
|
3535
3535
|
zod: ^3.25.0 || ^4.0.0
|
|
3536
3536
|
|
|
3537
|
-
zod@3.
|
|
3538
|
-
resolution: {integrity: sha512-
|
|
3537
|
+
zod@4.3.6:
|
|
3538
|
+
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
|
|
3539
3539
|
|
|
3540
3540
|
snapshots:
|
|
3541
3541
|
|
|
@@ -5339,10 +5339,10 @@ snapshots:
|
|
|
5339
5339
|
optionalDependencies:
|
|
5340
5340
|
pg: 8.18.0
|
|
5341
5341
|
|
|
5342
|
-
drizzle-zod@0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@3.
|
|
5342
|
+
drizzle-zod@0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@4.3.6):
|
|
5343
5343
|
dependencies:
|
|
5344
5344
|
drizzle-orm: 0.39.3(pg@8.18.0)
|
|
5345
|
-
zod: 3.
|
|
5345
|
+
zod: 4.3.6
|
|
5346
5346
|
|
|
5347
5347
|
dunder-proto@1.0.1:
|
|
5348
5348
|
dependencies:
|
|
@@ -5645,8 +5645,8 @@ snapshots:
|
|
|
5645
5645
|
'@babel/parser': 7.29.0
|
|
5646
5646
|
eslint: 9.39.2(jiti@2.6.1)
|
|
5647
5647
|
hermes-parser: 0.25.1
|
|
5648
|
-
zod: 3.
|
|
5649
|
-
zod-validation-error: 4.0.2(zod@3.
|
|
5648
|
+
zod: 4.3.6
|
|
5649
|
+
zod-validation-error: 4.0.2(zod@4.3.6)
|
|
5650
5650
|
transitivePeerDependencies:
|
|
5651
5651
|
- supports-color
|
|
5652
5652
|
|
|
@@ -6930,8 +6930,8 @@ snapshots:
|
|
|
6930
6930
|
|
|
6931
6931
|
yocto-queue@0.1.0: {}
|
|
6932
6932
|
|
|
6933
|
-
zod-validation-error@4.0.2(zod@3.
|
|
6933
|
+
zod-validation-error@4.0.2(zod@4.3.6):
|
|
6934
6934
|
dependencies:
|
|
6935
|
-
zod: 3.
|
|
6935
|
+
zod: 4.3.6
|
|
6936
6936
|
|
|
6937
|
-
zod@3.
|
|
6937
|
+
zod@4.3.6: {}
|
package/template-hono/AGENTS.md
CHANGED
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
默认使用中文沟通与输出(除非用户明确要求其他语言)。
|
|
4
4
|
|
|
5
|
+
## 目标
|
|
6
|
+
|
|
7
|
+
你需要一次性交付可运行、可预览、可验证、可演示的完整应用,而不是半成品。
|
|
8
|
+
|
|
5
9
|
## 技术栈与约束
|
|
6
10
|
|
|
7
11
|
- 框架:Hono(Node runtime)+ Vite(单进程开发)
|
|
8
12
|
- 前端:React 19 + React Router + Tailwind v4 + shadcn/ui
|
|
9
13
|
- 请求层:React Query + fetch
|
|
10
14
|
- 契约:Zod(`shared/routes.ts`)
|
|
11
|
-
-
|
|
15
|
+
- 数据库:优先 Postgres + Drizzle;若 `DATABASE_URL` 缺失,默认走 SQLite(零配置)并保持 API 契约不变
|
|
12
16
|
|
|
13
17
|
## 目录约定
|
|
14
18
|
|
|
@@ -30,10 +34,54 @@
|
|
|
30
34
|
- `pnpm lint`:ESLint
|
|
31
35
|
- `pnpm db:push`:同步数据库结构
|
|
32
36
|
|
|
33
|
-
##
|
|
37
|
+
## 执行硬规则
|
|
38
|
+
|
|
39
|
+
- 不阻塞就不要问用户,直接推进到完成。
|
|
40
|
+
- 不要要求用户发送“继续执行/不要停在总结”之类控制语句,把持续推进作为默认行为。
|
|
41
|
+
- 进度反馈用自然里程碑播报,不使用突兀命令式话术。
|
|
42
|
+
- 仅在真实阻塞时才提问,并附已尝试步骤与日志证据。
|
|
43
|
+
- 未达到完成标准前,不得用“文档总结/状态总结”代替执行。
|
|
44
|
+
- 不得只做前端占位,必须打通真实 API 与数据读写链路。
|
|
45
|
+
- 每次代码改动后必须重启服务并验证页面/接口。
|
|
46
|
+
- 关键改动后必须跑端到端验证(如 `run_test`)并检查日志。
|
|
47
|
+
- 禁止递归调用测试代理或无限循环调用同一工具。
|
|
48
|
+
- 如果 `run_test` 结果不是 `[run_test] ok`,必须视为未通过,继续修复。
|
|
49
|
+
- `run_test` 卡住或无进展时要快速失败并给出证据,禁止长时间空转重试。
|
|
50
|
+
- 不允许“口头完成”。完成声明必须有工具证据支撑。
|
|
51
|
+
- SQLite 路径必须保持单一 schema 真相源,禁止手写临时 SQL 与 ORM schema 并行漂移。
|
|
52
|
+
|
|
53
|
+
## 状态文件写入规则
|
|
54
|
+
|
|
55
|
+
- 若维护 `docs/project_state.json`,每次写入前先读取最新版本。
|
|
56
|
+
- 若写入报冲突(文件已变更),必须重新读取后重试,不得忽略。
|
|
57
|
+
- `quality_gates.typecheck=true` 仅在构建命令真实通过后设置。
|
|
58
|
+
|
|
59
|
+
## UI 质量门禁(必须全部满足)
|
|
60
|
+
|
|
61
|
+
- 首页不得空白,不得仅显示默认模板文案。
|
|
62
|
+
- 视觉风格必须明确:字体、颜色、间距、动效要统一。
|
|
63
|
+
- 禁止“紫色渐变 + 白底默认感”模板化输出。
|
|
64
|
+
- 必须定义可复用设计 token(颜色、圆角、阴影、间距等级)。
|
|
65
|
+
- 至少覆盖桌面与移动端关键断点,不允许内容溢出。
|
|
66
|
+
- 交互状态完整:hover/focus/disabled/loading/error/success。
|
|
67
|
+
- 在 `<Button>` 上使用自定义背景色类(如 `bg-*`)时,必须同时显式声明文本色类(如 `text-*`);禁止只改背景不改文字色。
|
|
68
|
+
- Todo 类页面优先采用单主轴布局(标题区 + 输入区 + 列表区),避免信息噪音过载。
|
|
69
|
+
- 优先复用 `Input/Button/Card/Checkbox/Select` 的默认视觉语言,必要时只做局部增强,不要重写整套样式。
|
|
70
|
+
- 列表增删改状态建议加入轻量动效(如 `framer-motion` 的入场/退出),并提供失败反馈(toast 或 inline alert)。
|
|
71
|
+
|
|
72
|
+
## 数据与安全
|
|
34
73
|
|
|
35
74
|
- 服务端数据库逻辑放在 `server/`,不要泄漏到客户端。
|
|
36
75
|
- API 响应必须经过 `shared/routes.ts` 的 Zod schema 校验。
|
|
37
76
|
- 不提交 `.env.local`、数据库密钥。
|
|
38
77
|
- 优先复用 `client/src/components/ui` 与 `client/src/hooks`,避免重复造轮子。
|
|
39
78
|
|
|
79
|
+
## 完成标准
|
|
80
|
+
|
|
81
|
+
只有以下全部满足才允许结束:
|
|
82
|
+
|
|
83
|
+
- `pnpm build` 通过(无 pnpm 时 `npm run build` 通过)
|
|
84
|
+
- 页面可在本地端口访问并完成核心流程
|
|
85
|
+
- `run_test` 返回 `[run_test] ok`
|
|
86
|
+
- 关键日志无阻塞级错误
|
|
87
|
+
- UI 达到可演示级(非“功能可用但观感粗糙”)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import * as React from "react"
|
|
4
4
|
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
|
|
5
|
+
import type { VariantProps } from "class-variance-authority"
|
|
5
6
|
|
|
6
7
|
import { cn } from "@/lib/utils"
|
|
7
8
|
import { buttonVariants } from "@/components/ui/button"
|
|
@@ -98,13 +99,18 @@ const AlertDialogDescription = React.forwardRef<
|
|
|
98
99
|
AlertDialogDescription.displayName =
|
|
99
100
|
AlertDialogPrimitive.Description.displayName
|
|
100
101
|
|
|
102
|
+
type AlertDialogActionProps = React.ComponentPropsWithoutRef<
|
|
103
|
+
typeof AlertDialogPrimitive.Action
|
|
104
|
+
> &
|
|
105
|
+
VariantProps<typeof buttonVariants>
|
|
106
|
+
|
|
101
107
|
const AlertDialogAction = React.forwardRef<
|
|
102
108
|
React.ElementRef<typeof AlertDialogPrimitive.Action>,
|
|
103
|
-
|
|
104
|
-
>(({ className, ...props }, ref) => (
|
|
109
|
+
AlertDialogActionProps
|
|
110
|
+
>(({ className, variant, size, ...props }, ref) => (
|
|
105
111
|
<AlertDialogPrimitive.Action
|
|
106
112
|
ref={ref}
|
|
107
|
-
className={cn(buttonVariants(), className)}
|
|
113
|
+
className={cn(buttonVariants({ variant, size }), className)}
|
|
108
114
|
{...props}
|
|
109
115
|
/>
|
|
110
116
|
))
|
|
@@ -7,31 +7,28 @@ import { cva, type VariantProps } from "class-variance-authority"
|
|
|
7
7
|
import { cn } from "@/lib/utils"
|
|
8
8
|
|
|
9
9
|
const buttonVariants = cva(
|
|
10
|
-
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-
|
|
11
|
-
" hover-elevate active-elevate-2",
|
|
10
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-semibold tracking-[0.01em] transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40 focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
12
11
|
{
|
|
13
12
|
variants: {
|
|
14
13
|
variant: {
|
|
15
14
|
default:
|
|
16
|
-
"bg-primary text-primary-foreground border border-primary-
|
|
15
|
+
"bg-primary text-primary-foreground border border-primary/45 shadow-[0_10px_24px_hsl(var(--primary)/0.38)] hover:-translate-y-0.5 hover:shadow-[0_14px_30px_hsl(var(--primary)/0.46)] active:translate-y-0",
|
|
17
16
|
destructive:
|
|
18
|
-
"bg-destructive text-destructive-foreground border border-destructive-
|
|
17
|
+
"bg-destructive text-destructive-foreground border border-destructive/45 shadow-[0_10px_22px_hsl(var(--destructive)/0.3)] hover:brightness-105",
|
|
19
18
|
outline:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
" border [border-color:var(--button-outline)] shadow-xs active:shadow-none ",
|
|
23
|
-
secondary: "border bg-secondary text-secondary-foreground border border-secondary-border ",
|
|
19
|
+
"border border-input/80 bg-white/75 text-foreground shadow-[0_4px_12px_rgba(15,23,42,0.08)] hover:bg-white hover:border-ring/35",
|
|
20
|
+
secondary: "border border-secondary-border bg-secondary/90 text-secondary-foreground shadow-sm hover:bg-secondary",
|
|
24
21
|
// Add a transparent border so that when someone toggles a border on later, it doesn't shift layout/size.
|
|
25
|
-
ghost: "border border-transparent",
|
|
22
|
+
ghost: "border border-transparent text-foreground/80 hover:bg-accent/75 hover:text-foreground",
|
|
26
23
|
},
|
|
27
24
|
// Heights are set as "min" heights, because sometimes Ai will place large amount of content
|
|
28
25
|
// inside buttons. With a min-height they will look appropriate with small amounts of content,
|
|
29
26
|
// but will expand to fit large amounts of content.
|
|
30
27
|
size: {
|
|
31
|
-
default: "min-h-
|
|
32
|
-
sm: "min-h-8 rounded-
|
|
33
|
-
lg: "min-h-
|
|
34
|
-
icon: "h-
|
|
28
|
+
default: "min-h-10 px-4 py-2",
|
|
29
|
+
sm: "min-h-8 rounded-lg px-3 text-xs",
|
|
30
|
+
lg: "min-h-11 rounded-xl px-8",
|
|
31
|
+
icon: "h-10 w-10 rounded-xl",
|
|
35
32
|
},
|
|
36
33
|
},
|
|
37
34
|
defaultVariants: {
|
|
@@ -11,7 +11,7 @@ const Card = React.forwardRef<
|
|
|
11
11
|
<div
|
|
12
12
|
ref={ref}
|
|
13
13
|
className={cn(
|
|
14
|
-
"shadcn-card rounded-
|
|
14
|
+
"shadcn-card rounded-2xl border border-white/70 bg-card/84 text-card-foreground shadow-[0_18px_42px_rgba(15,23,42,0.1)] backdrop-blur",
|
|
15
15
|
className
|
|
16
16
|
)}
|
|
17
17
|
{...props}
|
|
@@ -25,7 +25,7 @@ const CardHeader = React.forwardRef<
|
|
|
25
25
|
>(({ className, ...props }, ref) => (
|
|
26
26
|
<div
|
|
27
27
|
ref={ref}
|
|
28
|
-
className={cn("flex flex-col space-y-1.5 p-6", className)}
|
|
28
|
+
className={cn("flex flex-col space-y-1.5 p-5 sm:p-6", className)}
|
|
29
29
|
{...props}
|
|
30
30
|
/>
|
|
31
31
|
));
|
|
@@ -38,7 +38,7 @@ const CardTitle = React.forwardRef<
|
|
|
38
38
|
<div
|
|
39
39
|
ref={ref}
|
|
40
40
|
className={cn(
|
|
41
|
-
"text-
|
|
41
|
+
"text-xl font-semibold leading-tight tracking-tight sm:text-2xl",
|
|
42
42
|
className
|
|
43
43
|
)}
|
|
44
44
|
{...props}
|
|
@@ -13,7 +13,7 @@ const Checkbox = React.forwardRef<
|
|
|
13
13
|
<CheckboxPrimitive.Root
|
|
14
14
|
ref={ref}
|
|
15
15
|
className={cn(
|
|
16
|
-
"peer h-
|
|
16
|
+
"peer h-5 w-5 shrink-0 rounded-full border-2 border-primary/45 bg-white shadow-[0_1px_3px_rgba(15,23,42,0.18)] ring-offset-background transition-[background-color,border-color,box-shadow] duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/35 focus-visible:ring-offset-1 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:shadow-[0_8px_16px_hsl(var(--primary)/0.35)]",
|
|
17
17
|
className
|
|
18
18
|
)}
|
|
19
19
|
{...props}
|
|
@@ -21,7 +21,7 @@ const Checkbox = React.forwardRef<
|
|
|
21
21
|
<CheckboxPrimitive.Indicator
|
|
22
22
|
className={cn("flex items-center justify-center text-current")}
|
|
23
23
|
>
|
|
24
|
-
<Check className="h-
|
|
24
|
+
<Check className="h-3.5 w-3.5" />
|
|
25
25
|
</CheckboxPrimitive.Indicator>
|
|
26
26
|
</CheckboxPrimitive.Root>
|
|
27
27
|
))
|
|
@@ -11,7 +11,7 @@ const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
|
|
|
11
11
|
<input
|
|
12
12
|
type={type}
|
|
13
13
|
className={cn(
|
|
14
|
-
"flex h-
|
|
14
|
+
"flex h-11 w-full rounded-2xl border border-input/85 bg-white/82 px-4 py-2 text-[15px] text-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.86),0_1px_2px_rgba(15,23,42,0.06)] ring-offset-background transition-[border-color,box-shadow,background-color] duration-200 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground/70 focus-visible:outline-none focus-visible:border-primary/55 focus-visible:bg-white focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
15
15
|
className
|
|
16
16
|
)}
|
|
17
17
|
ref={ref}
|
|
@@ -19,7 +19,7 @@ const SelectTrigger = React.forwardRef<
|
|
|
19
19
|
<SelectPrimitive.Trigger
|
|
20
20
|
ref={ref}
|
|
21
21
|
className={cn(
|
|
22
|
-
"flex h-
|
|
22
|
+
"flex h-11 w-full items-center justify-between rounded-2xl border border-input/85 bg-white/82 px-4 py-2 text-sm text-foreground shadow-[inset_0_1px_0_rgba(255,255,255,0.86),0_1px_2px_rgba(15,23,42,0.06)] ring-offset-background transition-[border-color,box-shadow,background-color] duration-200 data-[placeholder]:text-muted-foreground/70 focus:outline-none focus:border-primary/55 focus:bg-white focus:ring-2 focus:ring-ring/30 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
{...props}
|
|
@@ -75,7 +75,7 @@ const SelectContent = React.forwardRef<
|
|
|
75
75
|
<SelectPrimitive.Content
|
|
76
76
|
ref={ref}
|
|
77
77
|
className={cn(
|
|
78
|
-
"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-
|
|
78
|
+
"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-xl border border-white/70 bg-popover/95 text-popover-foreground shadow-[0_16px_36px_rgba(15,23,42,0.18)] backdrop-blur data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]",
|
|
79
79
|
position === "popper" &&
|
|
80
80
|
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
|
|
81
81
|
className
|
|
@@ -118,7 +118,7 @@ const SelectItem = React.forwardRef<
|
|
|
118
118
|
<SelectPrimitive.Item
|
|
119
119
|
ref={ref}
|
|
120
120
|
className={cn(
|
|
121
|
-
"relative flex w-full cursor-default select-none items-center rounded-
|
|
121
|
+
"relative flex w-full cursor-default select-none items-center rounded-lg py-2 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent/85 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
122
122
|
className
|
|
123
123
|
)}
|
|
124
124
|
{...props}
|
|
@@ -11,7 +11,7 @@ const Textarea = React.forwardRef<
|
|
|
11
11
|
return (
|
|
12
12
|
<textarea
|
|
13
13
|
className={cn(
|
|
14
|
-
"flex min-h-[
|
|
14
|
+
"flex min-h-[96px] w-full rounded-2xl border border-input/85 bg-white/82 px-4 py-3 text-[15px] shadow-[inset_0_1px_0_rgba(255,255,255,0.86),0_1px_2px_rgba(15,23,42,0.06)] ring-offset-background transition-[border-color,box-shadow,background-color] duration-200 placeholder:text-muted-foreground/70 focus-visible:outline-none focus-visible:border-primary/55 focus-visible:bg-white focus-visible:ring-2 focus-visible:ring-ring/30 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
15
15
|
className
|
|
16
16
|
)}
|
|
17
17
|
ref={ref}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap");
|
|
1
2
|
@import "tailwindcss";
|
|
2
3
|
@config "../../tailwind.config.mjs";
|
|
3
4
|
|
|
4
5
|
:root {
|
|
5
6
|
/* Fonts */
|
|
6
|
-
--font-sans:
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
--font-serif:
|
|
11
|
-
|
|
7
|
+
--font-sans: "Poppins", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
|
|
8
|
+
"Noto Sans SC", "Helvetica Neue", sans-serif;
|
|
9
|
+
--font-display: "Poppins", "PingFang SC", "Hiragino Sans GB",
|
|
10
|
+
"Microsoft YaHei", sans-serif;
|
|
11
|
+
--font-serif: "Poppins", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
|
|
12
|
+
"Noto Sans SC", "Helvetica Neue", sans-serif;
|
|
13
|
+
--font-mono: Menlo, ui-monospace, SFMono-Regular, Monaco, Consolas,
|
|
12
14
|
"Liberation Mono", "Courier New", monospace;
|
|
13
15
|
|
|
14
16
|
/* Core theme tokens (HSL triples) */
|
|
@@ -40,7 +42,19 @@
|
|
|
40
42
|
--input: 240 5.9% 90%;
|
|
41
43
|
--ring: 240 5.9% 10%;
|
|
42
44
|
|
|
43
|
-
--radius: 0.
|
|
45
|
+
--radius: 0.8rem;
|
|
46
|
+
|
|
47
|
+
/* Visual system tokens for showcase pages */
|
|
48
|
+
--surface-1: 224 40% 98%;
|
|
49
|
+
--surface-2: 220 35% 95%;
|
|
50
|
+
--brand-accent: 201 92% 56%;
|
|
51
|
+
--brand-success: 156 72% 40%;
|
|
52
|
+
--elevation-soft: 0 14px 34px rgba(15, 23, 42, 0.12);
|
|
53
|
+
--elevation-strong: 0 22px 56px rgba(15, 23, 42, 0.18);
|
|
54
|
+
--space-xs: 0.625rem;
|
|
55
|
+
--space-sm: 0.875rem;
|
|
56
|
+
--space-md: 1.125rem;
|
|
57
|
+
--space-lg: 1.625rem;
|
|
44
58
|
|
|
45
59
|
/* Extra tokens used by the migrated shadcn components */
|
|
46
60
|
--card-border: var(--border);
|
|
@@ -115,119 +129,119 @@
|
|
|
115
129
|
|
|
116
130
|
/* Theme style presets (used by html[data-theme-style="<preset>"]) */
|
|
117
131
|
:root[data-theme-style="quadratic"] {
|
|
118
|
-
--background:
|
|
119
|
-
--foreground:
|
|
132
|
+
--background: 246 33% 96%;
|
|
133
|
+
--foreground: 233 24% 17%;
|
|
120
134
|
|
|
121
135
|
--card: 0 0% 100%;
|
|
122
|
-
--card-foreground:
|
|
136
|
+
--card-foreground: 233 24% 17%;
|
|
123
137
|
--popover: 0 0% 100%;
|
|
124
|
-
--popover-foreground:
|
|
125
|
-
|
|
126
|
-
--primary:
|
|
127
|
-
--primary-foreground:
|
|
128
|
-
--secondary:
|
|
129
|
-
--secondary-foreground:
|
|
130
|
-
--muted:
|
|
131
|
-
--muted-foreground:
|
|
132
|
-
--accent:
|
|
133
|
-
--accent-foreground:
|
|
134
|
-
|
|
135
|
-
--border:
|
|
136
|
-
--input:
|
|
137
|
-
--ring:
|
|
138
|
-
|
|
139
|
-
--chart-1:
|
|
140
|
-
--chart-2:
|
|
141
|
-
--chart-3:
|
|
142
|
-
--chart-4:
|
|
143
|
-
--chart-5:
|
|
138
|
+
--popover-foreground: 233 24% 17%;
|
|
139
|
+
|
|
140
|
+
--primary: 258 84% 63%;
|
|
141
|
+
--primary-foreground: 0 0% 100%;
|
|
142
|
+
--secondary: 250 44% 92%;
|
|
143
|
+
--secondary-foreground: 233 24% 20%;
|
|
144
|
+
--muted: 246 36% 93%;
|
|
145
|
+
--muted-foreground: 230 12% 42%;
|
|
146
|
+
--accent: 257 62% 88%;
|
|
147
|
+
--accent-foreground: 234 24% 24%;
|
|
148
|
+
|
|
149
|
+
--border: 246 24% 86%;
|
|
150
|
+
--input: 246 24% 84%;
|
|
151
|
+
--ring: 258 84% 63%;
|
|
152
|
+
|
|
153
|
+
--chart-1: 258 78% 56%;
|
|
154
|
+
--chart-2: 201 84% 56%;
|
|
155
|
+
--chart-3: 172 65% 45%;
|
|
156
|
+
--chart-4: 338 74% 58%;
|
|
157
|
+
--chart-5: 39 84% 58%;
|
|
144
158
|
}
|
|
145
159
|
|
|
146
160
|
.dark[data-theme-style="quadratic"] {
|
|
147
|
-
--background:
|
|
148
|
-
--foreground:
|
|
149
|
-
|
|
150
|
-
--card:
|
|
151
|
-
--card-foreground:
|
|
152
|
-
--popover:
|
|
153
|
-
--popover-foreground:
|
|
154
|
-
|
|
155
|
-
--primary:
|
|
156
|
-
--primary-foreground:
|
|
157
|
-
--secondary:
|
|
158
|
-
--secondary-foreground:
|
|
159
|
-
--muted:
|
|
160
|
-
--muted-foreground: 240
|
|
161
|
-
--accent:
|
|
162
|
-
--accent-foreground:
|
|
163
|
-
|
|
164
|
-
--border:
|
|
165
|
-
--input:
|
|
166
|
-
--ring:
|
|
167
|
-
|
|
168
|
-
--chart-1:
|
|
169
|
-
--chart-2:
|
|
170
|
-
--chart-3:
|
|
171
|
-
--chart-4:
|
|
172
|
-
--chart-5:
|
|
161
|
+
--background: 233 22% 11%;
|
|
162
|
+
--foreground: 246 33% 96%;
|
|
163
|
+
|
|
164
|
+
--card: 232 20% 14%;
|
|
165
|
+
--card-foreground: 246 33% 96%;
|
|
166
|
+
--popover: 232 20% 14%;
|
|
167
|
+
--popover-foreground: 246 33% 96%;
|
|
168
|
+
|
|
169
|
+
--primary: 258 90% 70%;
|
|
170
|
+
--primary-foreground: 233 22% 11%;
|
|
171
|
+
--secondary: 235 16% 20%;
|
|
172
|
+
--secondary-foreground: 246 30% 94%;
|
|
173
|
+
--muted: 234 14% 18%;
|
|
174
|
+
--muted-foreground: 240 15% 76%;
|
|
175
|
+
--accent: 235 16% 20%;
|
|
176
|
+
--accent-foreground: 246 30% 94%;
|
|
177
|
+
|
|
178
|
+
--border: 234 14% 26%;
|
|
179
|
+
--input: 234 14% 26%;
|
|
180
|
+
--ring: 258 90% 70%;
|
|
181
|
+
|
|
182
|
+
--chart-1: 258 90% 70%;
|
|
183
|
+
--chart-2: 201 78% 68%;
|
|
184
|
+
--chart-3: 172 58% 62%;
|
|
185
|
+
--chart-4: 338 76% 72%;
|
|
186
|
+
--chart-5: 39 78% 70%;
|
|
173
187
|
}
|
|
174
188
|
|
|
175
189
|
:root[data-theme-style="nomad"] {
|
|
176
|
-
--background:
|
|
177
|
-
--foreground:
|
|
178
|
-
|
|
179
|
-
--card:
|
|
180
|
-
--card-foreground:
|
|
181
|
-
--popover:
|
|
182
|
-
--popover-foreground:
|
|
183
|
-
|
|
184
|
-
--primary:
|
|
185
|
-
--primary-foreground:
|
|
186
|
-
--secondary:
|
|
187
|
-
--secondary-foreground:
|
|
188
|
-
--muted:
|
|
189
|
-
--muted-foreground:
|
|
190
|
-
--accent:
|
|
191
|
-
--accent-foreground:
|
|
192
|
-
|
|
193
|
-
--border:
|
|
194
|
-
--input:
|
|
195
|
-
--ring:
|
|
196
|
-
|
|
197
|
-
--chart-1:
|
|
198
|
-
--chart-2:
|
|
199
|
-
--chart-3:
|
|
200
|
-
--chart-4:
|
|
201
|
-
--chart-5:
|
|
190
|
+
--background: 0 0% 94.1%;
|
|
191
|
+
--foreground: 0 0% 10.2%;
|
|
192
|
+
|
|
193
|
+
--card: 0 0% 98.8%;
|
|
194
|
+
--card-foreground: 0 0% 0%;
|
|
195
|
+
--popover: 45 25% 96.9%;
|
|
196
|
+
--popover-foreground: 0 0% 10.2%;
|
|
197
|
+
|
|
198
|
+
--primary: 341.9 85.1% 52.5%;
|
|
199
|
+
--primary-foreground: 0 0% 100%;
|
|
200
|
+
--secondary: 0 0% 76.9%;
|
|
201
|
+
--secondary-foreground: 0 0% 10.2%;
|
|
202
|
+
--muted: 0 0% 89%;
|
|
203
|
+
--muted-foreground: 0 0% 12.9%;
|
|
204
|
+
--accent: 0 0% 100%;
|
|
205
|
+
--accent-foreground: 0 0% 10.2%;
|
|
206
|
+
|
|
207
|
+
--border: 0 0% 91%;
|
|
208
|
+
--input: 0 0% 71%;
|
|
209
|
+
--ring: 0 0% 42%;
|
|
210
|
+
|
|
211
|
+
--chart-1: 203.9 88.3% 53.1%;
|
|
212
|
+
--chart-2: 159.8 100% 36.1%;
|
|
213
|
+
--chart-3: 42 92.8% 56.3%;
|
|
214
|
+
--chart-4: 147.1 78.5% 42%;
|
|
215
|
+
--chart-5: 341.5 75.2% 51%;
|
|
202
216
|
}
|
|
203
217
|
|
|
204
218
|
.dark[data-theme-style="nomad"] {
|
|
205
|
-
--background:
|
|
206
|
-
--foreground:
|
|
207
|
-
|
|
208
|
-
--card:
|
|
209
|
-
--card-foreground:
|
|
210
|
-
--popover:
|
|
211
|
-
--popover-foreground:
|
|
212
|
-
|
|
213
|
-
--primary:
|
|
214
|
-
--primary-foreground:
|
|
215
|
-
--secondary:
|
|
216
|
-
--secondary-foreground:
|
|
217
|
-
--muted:
|
|
218
|
-
--muted-foreground:
|
|
219
|
-
--accent:
|
|
220
|
-
--accent-foreground:
|
|
221
|
-
|
|
222
|
-
--border:
|
|
223
|
-
--input:
|
|
224
|
-
--ring:
|
|
225
|
-
|
|
226
|
-
--chart-1:
|
|
227
|
-
--chart-2:
|
|
228
|
-
--chart-3:
|
|
229
|
-
--chart-4:
|
|
230
|
-
--chart-5:
|
|
219
|
+
--background: 0 0% 10%;
|
|
220
|
+
--foreground: 0 0% 96%;
|
|
221
|
+
|
|
222
|
+
--card: 0 0% 13%;
|
|
223
|
+
--card-foreground: 0 0% 98%;
|
|
224
|
+
--popover: 0 0% 8%;
|
|
225
|
+
--popover-foreground: 0 0% 96%;
|
|
226
|
+
|
|
227
|
+
--primary: 341.9 85.1% 60%;
|
|
228
|
+
--primary-foreground: 0 0% 100%;
|
|
229
|
+
--secondary: 0 0% 26%;
|
|
230
|
+
--secondary-foreground: 0 0% 96%;
|
|
231
|
+
--muted: 0 0% 18%;
|
|
232
|
+
--muted-foreground: 0 0% 72%;
|
|
233
|
+
--accent: 0 0% 22%;
|
|
234
|
+
--accent-foreground: 0 0% 96%;
|
|
235
|
+
|
|
236
|
+
--border: 0 0% 24%;
|
|
237
|
+
--input: 0 0% 34%;
|
|
238
|
+
--ring: 0 0% 62%;
|
|
239
|
+
|
|
240
|
+
--chart-1: 203.9 88.3% 62%;
|
|
241
|
+
--chart-2: 159.8 100% 44%;
|
|
242
|
+
--chart-3: 42 92.8% 64%;
|
|
243
|
+
--chart-4: 147.1 78.5% 50%;
|
|
244
|
+
--chart-5: 341.5 75.2% 59%;
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
:root[data-theme-style="honey"] {
|
|
@@ -412,10 +426,40 @@
|
|
|
412
426
|
body {
|
|
413
427
|
@apply bg-background text-foreground antialiased;
|
|
414
428
|
font-family: var(--font-sans);
|
|
429
|
+
line-height: 1.5;
|
|
430
|
+
text-rendering: optimizeLegibility;
|
|
431
|
+
-webkit-font-smoothing: antialiased;
|
|
432
|
+
-moz-osx-font-smoothing: grayscale;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
h1,
|
|
436
|
+
h2,
|
|
437
|
+
h3,
|
|
438
|
+
h4 {
|
|
439
|
+
font-family: var(--font-display);
|
|
440
|
+
letter-spacing: -0.02em;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
::selection {
|
|
444
|
+
background: hsl(var(--primary) / 0.22);
|
|
415
445
|
}
|
|
416
446
|
}
|
|
417
447
|
|
|
418
448
|
@layer utilities {
|
|
449
|
+
@keyframes showcase-rise-in {
|
|
450
|
+
0% {
|
|
451
|
+
opacity: 0;
|
|
452
|
+
transform: translateY(12px) scale(0.992);
|
|
453
|
+
}
|
|
454
|
+
100% {
|
|
455
|
+
opacity: 1;
|
|
456
|
+
transform: translateY(0) scale(1);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
.showcase-rise {
|
|
461
|
+
animation: showcase-rise-in 560ms cubic-bezier(0.2, 0.72, 0.24, 1) both;
|
|
462
|
+
}
|
|
419
463
|
.hover-elevate {
|
|
420
464
|
transition: transform 150ms ease, box-shadow 150ms ease;
|
|
421
465
|
}
|
|
@@ -13,7 +13,7 @@ importers:
|
|
|
13
13
|
version: 1.19.9(hono@4.11.9)
|
|
14
14
|
'@hono/zod-validator':
|
|
15
15
|
specifier: ^0.7.6
|
|
16
|
-
version: 0.7.6(hono@4.11.9)(zod@3.
|
|
16
|
+
version: 0.7.6(hono@4.11.9)(zod@4.3.6)
|
|
17
17
|
'@radix-ui/react-accordion':
|
|
18
18
|
specifier: ^1.2.4
|
|
19
19
|
version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
|
|
@@ -112,7 +112,7 @@ importers:
|
|
|
112
112
|
version: 0.39.3(pg@8.18.0)
|
|
113
113
|
drizzle-zod:
|
|
114
114
|
specifier: ^0.7.0
|
|
115
|
-
version: 0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@3.
|
|
115
|
+
version: 0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@4.3.6)
|
|
116
116
|
embla-carousel-react:
|
|
117
117
|
specifier: ^8.6.0
|
|
118
118
|
version: 8.6.0(react@19.2.3)
|
|
@@ -162,8 +162,8 @@ importers:
|
|
|
162
162
|
specifier: ^1.1.2
|
|
163
163
|
version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
|
|
164
164
|
zod:
|
|
165
|
-
specifier: ^
|
|
166
|
-
version: 3.
|
|
165
|
+
specifier: ^4.1.5
|
|
166
|
+
version: 4.3.6
|
|
167
167
|
devDependencies:
|
|
168
168
|
'@hono/vite-dev-server':
|
|
169
169
|
specifier: ^0.25.0
|
|
@@ -2859,8 +2859,8 @@ packages:
|
|
|
2859
2859
|
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
|
2860
2860
|
engines: {node: '>=10'}
|
|
2861
2861
|
|
|
2862
|
-
zod@3.
|
|
2863
|
-
resolution: {integrity: sha512-
|
|
2862
|
+
zod@4.3.6:
|
|
2863
|
+
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
|
|
2864
2864
|
|
|
2865
2865
|
snapshots:
|
|
2866
2866
|
|
|
@@ -3289,10 +3289,10 @@ snapshots:
|
|
|
3289
3289
|
hono: 4.11.9
|
|
3290
3290
|
minimatch: 9.0.5
|
|
3291
3291
|
|
|
3292
|
-
'@hono/zod-validator@0.7.6(hono@4.11.9)(zod@3.
|
|
3292
|
+
'@hono/zod-validator@0.7.6(hono@4.11.9)(zod@4.3.6)':
|
|
3293
3293
|
dependencies:
|
|
3294
3294
|
hono: 4.11.9
|
|
3295
|
-
zod: 3.
|
|
3295
|
+
zod: 4.3.6
|
|
3296
3296
|
|
|
3297
3297
|
'@humanfs/core@0.19.1': {}
|
|
3298
3298
|
|
|
@@ -4410,10 +4410,10 @@ snapshots:
|
|
|
4410
4410
|
optionalDependencies:
|
|
4411
4411
|
pg: 8.18.0
|
|
4412
4412
|
|
|
4413
|
-
drizzle-zod@0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@3.
|
|
4413
|
+
drizzle-zod@0.7.1(drizzle-orm@0.39.3(pg@8.18.0))(zod@4.3.6):
|
|
4414
4414
|
dependencies:
|
|
4415
4415
|
drizzle-orm: 0.39.3(pg@8.18.0)
|
|
4416
|
-
zod: 3.
|
|
4416
|
+
zod: 4.3.6
|
|
4417
4417
|
|
|
4418
4418
|
electron-to-chromium@1.5.286: {}
|
|
4419
4419
|
|
|
@@ -5173,4 +5173,4 @@ snapshots:
|
|
|
5173
5173
|
|
|
5174
5174
|
yocto-queue@0.1.0: {}
|
|
5175
5175
|
|
|
5176
|
-
zod@3.
|
|
5176
|
+
zod@4.3.6: {}
|