落地总案(字段、路由、波次、组件抽取):docs/SAAS-UPGRADE-PLAN.md
组件索引(Agent 定位):docs/COMPONENT-INDEX.md
角色:本文件管视觉 token 与壳层。实现按波次执行,先改壳层与共享组件,再改旗舰页与下钻路由。
对标:
npx shadcn@latest init:本仓是 Angular 17,没有 Tailwind。只借鉴其语义 token、圆角、按钮变体、侧栏分组和卡片结构,落到现有 SCSS / 共享组件。styles.scss 的 g-* 高级灰、token 体系、以及 header / page-header / empty-state 残留的拟态阴影同时存在。header.component.scss 仍是深色拟态条,和白底侧栏、浅色内容区割裂。data.section,缺少「进了一层」的面包屑与返回。topics/:id、竞品 competitors/:productId、VOC rail 子分页。background(近白/浅灰),卡片用 card 白底 + hairline border + shadow-xs。禁止双层拟态光影。--primary 是炭黑(约 #171717),主按钮白字;--secondary / --muted / --accent 是浅灰底。蓝色只做链接、图表、信息态,不当默认 CTA。accent 底 / 细边变化,并尽量带真实路由。| 场景 | 交互 | 路由形态 |
|---|---|---|
| 模块内平级(趋势 / 情绪 / 店铺) | 顶部分段或 BoardTabs | 现有 sibling path,保留 |
| 列表 → 实体 | 整行/整卡点击进入新页面 | /module/:id,带 query 保留筛选 |
| 工作台信号 / KPI | 进入对应实体或工作区,不是弹说明 | 已有 go* 接到真实页 |
| 验证、分析运行 | 从抽屉改为独立子页 | /validation/:id、/voc-insight/runs/:id |
| 反馈收件箱 | 桌面可保留分栏,但 URL 必须表达选中项;提供「展开为页面」 | /feedback-inbox/:reviewId |
| 返回 | 页头返回到列表,保留 query | PageHeader.backRoute |
面包屑示例:洞察中心 / 分析运行 / 2026-08-19 批次。侧栏高亮父级,不把每个实体推进侧栏。
官方主题:https://ui.shadcn.com/docs/theming
仓库:https://github.com/shadcn-ui/ui
语义对(Angular 里继续用 $color-*,但含义必须对上):
| shadcn | 我们 | 近似值 |
|---|---|---|
--background / --foreground |
$color-bg / $color-text |
#fafafa / #171717 |
--card |
$color-surface |
#ffffff |
--muted / --muted-foreground |
$color-surface-muted / $color-text-muted |
#f4f4f5 / #737373 |
--accent |
hover / 选中浅底 | #f4f4f5 |
--primary / --primary-foreground |
$color-primary |
#171717 / #fafafa |
--border / --input / --ring |
$color-border |
#e5e5e5;focus ring 3px 半透明 |
--destructive |
$color-red |
保持现有红 |
--radius |
基数 10px(0.625rem) |
$radius-card: 10px;按钮 8px |
在 _tokens.scss 落地:
$color-bg: #fafafa;
$color-surface: #ffffff;
$color-surface-muted: #f4f4f5;
$color-border: #e5e5e5;
$color-text: #171717;
$color-text-muted: #737373;
$color-primary: #171717; // shadcn 默认主按钮,不是蓝
$color-primary-hover: #262626;
$color-primary-foreground: #fafafa;
$color-accent: #f4f4f5;
$color-blue: #2563eb; // 仅链接 / 信息 / 图表
$radius-card: 10px;
$shadow-card-flat: 0 1px 2px rgba(15, 23, 42, 0.04); // shadow-xs
$shadow-float: 0 8px 24px rgba(15, 23, 42, 0.08);
focus-ring 做成 shadcn 的 ring-[3px] ring-black/20,不要蓝光圈当默认。
soft-neu-* 保留 mixin 名,视觉改为白底细边。
页面进入:opacity + translateY(6px) 180ms,只加在主内容第一层。
header#ffffff / #fafafa,底部分割线 1px var(--border),去掉深色拟态。--foreground。h-9、圆角 8–10px、muted 底、border,focus 用 3px ring)。不要重写搜索逻辑。ghost / outline 按钮,不要内凹拟态。navigation对标 shadcn Sidebar:SidebarGroup + SidebarGroupLabel + SidebarMenuButton。
--sidebar-accent(浅灰);选中 = 同色更深一点 + 字重 600。不要左侧蓝条。app.component.scss 画布跟 token。g-page 大空白。| 组件 | 升级点 |
|---|---|
page-header |
增加 crumbs、backLabel、backRoute;去掉 neu 图标凹槽;标题 22px / 字重 700 |
新建 page-breadcrumb |
可独立使用;最后一级纯文本,前面可点击 |
content-card |
对标 shadcn Card:10px 圆角、细边、shadow-xs,header 与 body 分区 |
entry-card / summary-metric-card |
hover 用 accent 浅底,不要上浮过大;可点击显示 chevron |
board-tabs |
对标 Tabs:底部分割线 + active 下划线(炭黑或前景色),不要蓝胶囊 |
empty-state / _state.scss |
淡底圆标 + muted 文案;主按钮用炭黑 primary |
data-table-shell |
行 hover accent,可点击行 cursor |
neu-button |
改皮不改名:default=炭黑底白字;outline=白底细边;ghost=hover muted;高度约 36px |
alert-card |
保持左边色条,阴影改扁平 |
只动共享层:
src/modules/shared/styles/_tokens.scsssrc/modules/shared/styles/_card.scss _button.scss _state.scss _badge.scss _board-tabs.scss(如需)src/app/app.component.scsssrc/modules/shared/components/header/*(样式为主,逻辑不动)src/modules/shared/components/navigation/*(样式 + section label,path 不动)src/modules/shared/components/page-header/*page-breadcrumbboard-tabs empty-state content-card entry-card summary-metric-card neu-buttonsrc/styles.scss 的 g-* 与新 token 对齐,不要改 .ai-visual-report-html 大段验收:登录后顶栏/侧栏不再是深色拟态;主按钮是炭黑(shadcn default);卡片是细边扁平面;侧栏选中是浅灰 accent 不是蓝条。
在不改数据口径的前提下,把页面做成「工作区」而不是表单堆砌:
operating-overview:命令栏做成 sticky 工具条;KPI 点击已有下钻保持;信号行加 chevron。把「抽屉详情」升级为「属于该页的子页」:
| 现况 | 目标路由 | 体验 |
|---|---|---|
| 验证详情抽屉 | /validation + /validation/:id |
独立页,返回验证中心 |
| 分析运行抽屉 | /voc-insight/runs + /voc-insight/runs/:id |
独立页,返回运行列表 |
| 反馈仅 query | /feedback-inbox/:reviewId |
深链可开;桌面可仍是分栏布局,但要有「仅此页」的头 |
| 行动项多在看板上 | /action-suggestion/kanban/:id |
已落地:提案详情子页(只读+状态),创建仍用面板 |
已有且保持:/voc-insight/topics/:id、/voc-insight/detail、/domestic/competitors/:productId。
实现约束:
state 或 query 把 from 带上。监测 workbench、退款、新品开发、知识库、数据中台、系统设置:套 Wave 1 组件,补面包屑,表格行能进已有详情就接线。
已补:退款高退款商品、监测竞品/类目行、新品成交/对标行、品类分析行整行进入已有详情;证据链接改为 /feedback-inbox/:reviewId。
npx ng build --configuration=development 通过npx shadcn@latest init。docs/AI-VOC-NEXT-ITERATION.md 里的业务闭环逻辑。