# Jyotisha Web Design System `CLAUDE_DESIGN.md` 只作上游参照,不是实现合同。本文件写已经上线的界面。不要删那份参照文件。 ## 1. 组件一律用 shadcn base-nova,令牌如下 控件放在 `src/components/ui`,一律用 shadcn base-nova。缺的组件用固定版本的 shadcn CLI 加,不手抄,也不改组件的行为。图标只用 Lucide。动效只用 Motion,时长和曲线用下一节的预设。可拖宽、可收起的分栏用 react-resizable-panels;侧栏右缘和对话右栏左缘这两处单边拖宽改用 `useDragWidth`(2026-10-27,BUG-1456)。拖动排序用 dnd-kit。跨组件状态用 Zustand。 `globals.css` 在 Tailwind 的下一行引入 `shadcn/tailwind.css`。长相不换:下面的色板就是令牌,映射成 shadcn 的 `--background`、`--primary` 等。深色跟着已有的 `--color-*`,不另抄一套。星盘、星图的 SVG 绘制,以及那一刻的天空这张画布,仍按后面的章节手绘。 ### Palette | Role | Token | Value | Usage | |---|---|---:|---| | Canvas | `--color-canvas` | `#fbfaf7` | Main reading surface, inputs, light controls | | Page floor | `--color-canvas-soft` | `#f3f2ee` | App background and quiet secondary bands | | Warm surface | `--color-canvas-muted` | `#ebe9e3` | Cards, user messages, table headings | | Strong neutral | `--color-canvas-strong` | `#e1ded6` | Pressed and emphasized neutral surfaces | | Sidebar glass | `--color-sidebar` | `rgba(235, 233, 227, .86)` | Desktop navigation only | | Sidebar solid | `--color-sidebar-solid` | `#ebe9e3` | Mobile drawer, and any reduced-transparency surface | | Selected surface | `--color-selected` | `rgba(255, 255, 255, .62)` | Current navigation and raised light rows | | Ink | `--color-ink` | `#1d1d1f` | Headlines and primary text | | Body | `--color-ink-strong` | `#32322f` | Strong body copy | | Secondary text | `--color-ink-secondary` | `#5f5f59` | Supporting copy and labels, section headings | | Tertiary text | `--color-ink-tertiary` | `#6a6963` | Hints, metadata, empty-state copy | | Primary action (text rank) | `--color-action` | `#a9583e` | Links, tinted labels, icons — anything the user reads | | Primary action (fill rank) | `--color-action-strong` | `#cc785c` | Avatar fills, the active session rail, rings, carets, checked radios — never a button with a label | | Solid button fill | `--color-action-fill` / `--color-on-action-fill` | `#a9583e` / `#fbfaf7` (dark `#8f4a33` / `#f2f0ea`) | Every solid primary button: `