feat(web): 薄 Web 面 sundynix-web —— 注册/组织/团队/账单自助入口
CI / Go · build + vet + test (pull_request) Failing after 30m3s
CI / Frontend · tsc (sundynix-admin) (pull_request) Failing after 9m42s
CI / Frontend · tsc (sundynix-desktop/frontend) (pull_request) Failing after 16m53s
CI / Frontend · tsc (sundynix-web) (pull_request) Has been cancelled
CI / mcp-py · sandbox guard (pull_request) Has been cancelled
CI / Go · build + vet + test (pull_request) Failing after 30m3s
CI / Frontend · tsc (sundynix-admin) (pull_request) Failing after 9m42s
CI / Frontend · tsc (sundynix-desktop/frontend) (pull_request) Failing after 16m53s
CI / Frontend · tsc (sundynix-web) (pull_request) Has been cancelled
CI / mcp-py · sandbox guard (pull_request) Has been cancelled
SaaS P3 收口第二刀(设计见 SAAS_DESIGN.md §8)。第三个产品面:desktop=用户 工作产品、admin=平台超管控制塔、web=租户客户的自助柜台——做「装桌面端之前 就要能用」的那些事,三者不合并。 - 骨架抄 admin(HashRouter+路由注册表+me()/sdx:logout 鉴权门+vite/vitest 单文件配置);UI 整目录搬 desktop 的 ui/ 组件+ink/brand 主题 token(亮暗 双主题),品牌观感与桌面端一致;api.ts 抄 desktop 的 auth/tenant/usage 段 (纯 fetch 零 Wails 依赖),成员管理/建组织打新的租户自助接口。 - 页面:登录注册(一页两态)/概览(组织+角色+余额+桌面端下载指引)/团队(名册+ 邀请+改角色+移除,写控件按角色显隐、真闸在后端)/组织(列表+自助新建+切换)/ 用量与账单(余额 hero+趋势+合计+最近消耗,数据全来自现成 /me/usage;充值 只放说明占位,支付 P5 再接,不做假入口)。 - 工程:vite :5175、launch.json 配置、make webface、ci.yml web 矩阵纳入。 - 测试:tsc 干净;vitest 3 例(fmtCredits 去尾零——测试先行抓出 1.50 毛刺; ASSIGNABLE_ROLES 不含 owner)。浏览器 live 全流程:甲(owner)登录→概览→ 团队邀请乙→乙(member)登录写控件全隐藏、名册只读,组织/用量页真数据渲染。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: ["./index.html", "./src/**/*.{ts,tsx}"],
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
// 分层表面 / 边框 / 文字均由 CSS 变量驱动(RGB 三元组,保留 /透明度 修饰符)。
|
||||
// 变量在 index.css 的 :root(亮) 与 .dark(暗) 两套值间切换 —— 一处定义,全 app 换肤。
|
||||
ink: {
|
||||
950: "rgb(var(--ink-950) / <alpha-value>)",
|
||||
900: "rgb(var(--ink-900) / <alpha-value>)",
|
||||
850: "rgb(var(--ink-850) / <alpha-value>)",
|
||||
800: "rgb(var(--ink-800) / <alpha-value>)",
|
||||
700: "rgb(var(--ink-700) / <alpha-value>)",
|
||||
600: "rgb(var(--ink-600) / <alpha-value>)",
|
||||
},
|
||||
line: "rgb(var(--line) / <alpha-value>)",
|
||||
slate: {
|
||||
100: "rgb(var(--slate-100) / <alpha-value>)",
|
||||
200: "rgb(var(--slate-200) / <alpha-value>)",
|
||||
300: "rgb(var(--slate-300) / <alpha-value>)",
|
||||
400: "rgb(var(--slate-400) / <alpha-value>)",
|
||||
500: "rgb(var(--slate-500) / <alpha-value>)",
|
||||
600: "rgb(var(--slate-600) / <alpha-value>)",
|
||||
700: "rgb(var(--slate-700) / <alpha-value>)",
|
||||
},
|
||||
// 语义强调色 —— 两套主题通用(紫=brand,青=accent)。
|
||||
brand: { DEFAULT: "#7c5cf6", 400: "#a78bfa", 500: "#8b5cf6", 600: "#6d28d9" },
|
||||
accent: { DEFAULT: "#22d3ee", 400: "#22d3ee", 500: "#06b6d4" },
|
||||
success: { DEFAULT: "#34d399", 500: "#10b981" },
|
||||
warn: { DEFAULT: "#fbbf24", 500: "#f59e0b" },
|
||||
danger: { DEFAULT: "#fb7185", 500: "#f43f5e" },
|
||||
},
|
||||
borderRadius: {
|
||||
lg: "0.625rem", // 10px —— 卡片/面板
|
||||
md: "0.5rem", // 8px —— 控件
|
||||
},
|
||||
boxShadow: {
|
||||
glow: "0 0 0 1px rgba(139,92,246,0.45), 0 0 18px rgba(139,92,246,0.28)",
|
||||
"glow-cyan": "0 0 0 1px rgba(34,211,238,0.4), 0 0 16px rgba(34,211,238,0.22)",
|
||||
card: "var(--shadow-card)",
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [],
|
||||
};
|
||||
Reference in New Issue
Block a user