diff --git a/design-refs/mockup/components-page-1.png b/design-refs/mockup/components-page-1.png index 4132207..0ada3b5 100644 Binary files a/design-refs/mockup/components-page-1.png and b/design-refs/mockup/components-page-1.png differ diff --git a/design-refs/mockup/components-page-2.png b/design-refs/mockup/components-page-2.png index 223e8fb..6031262 100644 Binary files a/design-refs/mockup/components-page-2.png and b/design-refs/mockup/components-page-2.png differ diff --git a/design-refs/mockup/components-page-3.png b/design-refs/mockup/components-page-3.png index c3a9154..51b8c56 100644 Binary files a/design-refs/mockup/components-page-3.png and b/design-refs/mockup/components-page-3.png differ diff --git a/design-refs/mockup/components-page-4.png b/design-refs/mockup/components-page-4.png index 672b755..b92b97b 100644 Binary files a/design-refs/mockup/components-page-4.png and b/design-refs/mockup/components-page-4.png differ diff --git a/design-refs/mockup/components-page-5.png b/design-refs/mockup/components-page-5.png index 9e05a3c..e500afe 100644 Binary files a/design-refs/mockup/components-page-5.png and b/design-refs/mockup/components-page-5.png differ diff --git a/design-refs/mockup/components-page-6.png b/design-refs/mockup/components-page-6.png index 8f2e393..418928f 100644 Binary files a/design-refs/mockup/components-page-6.png and b/design-refs/mockup/components-page-6.png differ diff --git a/design-refs/mockup/components-page-7.png b/design-refs/mockup/components-page-7.png index a48b36c..e3f12ce 100644 Binary files a/design-refs/mockup/components-page-7.png and b/design-refs/mockup/components-page-7.png differ diff --git a/design-refs/mockup/components-page-8.png b/design-refs/mockup/components-page-8.png new file mode 100644 index 0000000..4882762 Binary files /dev/null and b/design-refs/mockup/components-page-8.png differ diff --git a/design-refs/mockup/components-page-9.png b/design-refs/mockup/components-page-9.png new file mode 100644 index 0000000..6b18da6 Binary files /dev/null and b/design-refs/mockup/components-page-9.png differ diff --git a/design-refs/mockup/components.html b/design-refs/mockup/components.html index c84aff2..5142847 100644 --- a/design-refs/mockup/components.html +++ b/design-refs/mockup/components.html @@ -163,11 +163,45 @@ .ev .r3 { font-size: 9.5px; color: #6b6b6b; } /* P1 目录卡 */ - .toc-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; } + .toc-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; } .toc-card { background: #fff; border-radius: 14px; padding: 14px 16px; box-shadow: 0 1px 2px rgba(26,26,26,0.06); } .toc-card .t { font-family: "DejaVu Sans Mono", monospace; font-size: 13.5px; font-weight: 700; color: #6d28d9; } .toc-card .c { font-size: 12.5px; font-weight: 700; color: #1a1a1a; margin-top: 3px; } .toc-card .d { font-size: 11px; color: #8a8a8a; margin-top: 3px; line-height: 1.45; } + /* P7 课程关系图 */ + .gnode { + position: absolute; width: 180px; height: 46px; + background: #ffffff; border-radius: 12px; + display: flex; align-items: center; gap: 9px; padding: 0 14px; + box-shadow: 0 1px 2px rgba(26,26,26,0.10); + } + .gnode .t { font-size: 13px; font-weight: 700; color: #1a1a1a; } + .entry-badge { + position: absolute; top: -10px; left: -10px; + width: 22px; height: 22px; border-radius: 50%; + background: #6366f1; color: #ffffff; font-size: 12px; font-weight: 700; + display: flex; align-items: center; justify-content: center; + } + .gedges { position: absolute; inset: 0; pointer-events: none; } + .glegend { display: flex; gap: 22px; font-size: 12px; color: #555; align-items: center; } + .glegend .sw { display: inline-block; width: 34px; border-top: 2px solid #555; margin-right: 6px; vertical-align: middle; } + .glegend .sw.rel { border-top-style: dashed; border-top-color: #b9b9b9; } + + /* P8 入口梳理 */ + .profile-card { + background: #ffffff; border-radius: 16px; padding: 18px 20px; + width: 368px; display: flex; flex-direction: column; gap: 11px; + box-shadow: 0 1px 2px rgba(26,26,26,0.06); + } + .profile-card .ph { display: flex; align-items: center; gap: 10px; } + .path-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } + .path-chips .arr { color: #8a8a8a; font-size: 11px; } + .path-chips .pchip { font-size: 11px; padding: 3px 10px; border-radius: 999px; border: 1px solid #cfcfcd; color: #1a1a1a; background: #ffffff; } + .path-chips .pchip.start { border-color: #6366f1; color: #6366f1; font-weight: 700; } + table.spec.tight { font-size: 12px; } + table.spec.tight th { padding: 4px 10px 4px 0; } + table.spec.tight td { padding: 3px 10px 3px 0; } + @@ -182,8 +216,8 @@
STACK IDEALJS · 全栈工程师教程

组件设计稿 · Storybook 拆分

- 整页设计稿(course-shelf v2)拆解为 8 个可独立实现与验收的组件,每组件一页:变体展示 + Args 表 + 规格。
- 组件即实现单元:Docusaurus 侧按组件对应文件落码,Storybook 页即验收清单。 + 整页设计稿(course-shelf v2)拆解为 10 个可独立实现与验收的组件、9 页 stories:变体展示 + Args 表 + 规格。
+ 组件即实现单元:Docusaurus 侧按组件对应文件落码,每页 stories 即验收清单。
<TopBar />
黑顶栏
logo · 菜单 · 当前项高亮 · 🔔 · 头像
@@ -193,17 +227,19 @@
<CourseCard />
课程白卡
图标 · 标题 · 预期一句话 · 状态 · 按钮
<CourseCardMedia />
悬停媒体卡
淡彩底 + 播放钮 + ⏱ GIF 循环
<EventsPanel />
事件栏
彩色条目:类型 · 日期 · 描述 · 时间
+
<CourseGraph />
课程关系图
前置实线 · 关联虚线 · 入口 ①②③
+
<EntryGuide />
入口梳理
读者画像 → 起点与路径
Atoms
原子组件
Pill · CircleButton · Chip · IconTile
-
8Components · 组件
-
7Stories · 页
+
10Components · 组件
+
9Stories · 页
6Variants · 课程变体
-
+
v2.1 · 2026-10 · 派生自 course-shelf v2
复刻视觉:Learning Plan Dashboard(仅风格参考)
-
01 / 07
+
01 / 09
@@ -274,7 +310,7 @@
组件设计稿 · Storybook 拆分 · stack idealjs
-
02 / 07
+
02 / 09
@@ -344,7 +380,7 @@
组件设计稿 · Storybook 拆分 · stack idealjs
-
03 / 07
+
03 / 09
@@ -372,7 +408,7 @@
⚛️
快速开始 React
用脚手架创建 React 应用,亲手拼出第一个 Todo List。
-
前置:快速开始
+
前置:快速开始关联:更多示例
✓ Completed 🎉✓
hello-react
@@ -394,7 +430,7 @@
📦
更多
把示例工程构建为可发布产物,看清 build 做了什么。
-
前置:更多示例
+
前置:快速开始 React
✓ Completed 🎉✓
more
@@ -422,28 +458,29 @@ -
-
+
+

Args

- +
- + +
Prop类型说明
titlestring章节名(分类 label)
descstring预期结果一句话
donebooleantrue → ✓ 胶囊 + ✓ 钮
relationsstring[]空 → 虚线占位 chip
prerequisitesstring[]前置章节 → 实线 chip + 图中实线边
relatedstring[]关联章节 → 虚线 chip + 图中虚线边
icon / tintemoji / hexIconTile 底色与图标
hrefstring章节分类索引路由
-
+

交互

-
1整卡可点 → 进入章节;hover 切换为 <CourseCardMedia />(见下页)。
-
2Tab focus 与 hover 同态;触屏无预览态。
+
1整卡可点 → 进入章节;hover 切换为 <CourseCardMedia />(见下页)。
+
2Tab focus 与 hover 同态;触屏无预览态。
组件设计稿 · Storybook 拆分 · stack idealjs
-
04 / 07
+
04 / 09
@@ -503,7 +540,7 @@
组件设计稿 · Storybook 拆分 · stack idealjs
-
05 / 07
+
05 / 09
@@ -582,7 +619,133 @@
组件设计稿 · Storybook 拆分 · stack idealjs
-
06 / 07
+
06 / 09
+ + + +
+
+ <CourseGraph /> +

课程关系图 · 知识是网,不是线

+
节点 = 章节卡;实线箭头 = 前置(prerequisites);虚线 = 关联(related);①②③ = 读者入口。
+
+ +
+
+ + + + + + + + + + + + + +
①🌐快速开始
+
②⚛️快速开始 React
+
🧱更多示例
+
📦更多
+
🔗全栈基础
+
③🧠高级教程
+
+ 前置 prerequisites + 关联 related + ①②③读者入口(见下页) +
+
+
+ +
+

Args

+ + + + + + +
Prop类型说明
nodesCourse[]直接取 courses.ts,渲染为迷你章节卡
edges.prerequisites[from,to][]实线箭头,由每章 prerequisites 派生
edges.related[from,to][]虚线,由 related 派生
entryPointsEntry[]①②③ 入口徽标,数据见 EntryGuide
+
+
+

为什么要关系图(skill 依据)

+
1知识是网状:有前置也有旁路,线性目录会掩盖它。
+
2教程是索引:图让「我在哪、缺哪块」一眼可见。
+
3入口不锁死:③ 直达是合法路径(skill 死原则)。
+
4关系现为示例占位;正式关系填 courses.ts 后图自动更新。卡片 chips 与边一一对应:前置实线、关联虚线。
+
+ +
组件设计稿 · Storybook 拆分 · stack idealjs
+
07 / 09
+
+ + +
+
+ <EntryGuide /> +

入口梳理 · 按读者画像推荐起点

+
三类读者三种入口:路径是推荐不是强制;起点章节高亮,沿途章节排成路径 chips。
+
+ +
+
+
+
🌱零基础入门
+
入口 ① 快速开始
+
+ 快速开始→ + React→ + 更多示例→ + 更多→ + 全栈基础→ + 高级教程 +
+
完整链按序走;每步先核对验收产物再前进,认知基础必须在真机跑通。
+
+
+
⚛️写过页面 · 有前端经验
+
入口 ② 快速开始 React
+
+ React→ + 更多→ + 全栈基础→ + 高级教程 +
+
「快速开始」降级为查漏清单:实践过的部分直接跳过,撞到陌生积木再回看。
+
+
+
🧠在职补工程思维
+
入口 ③ 高级教程
+
+ 高级教程 + 专题按需点读 +
+
数据流 / 纯函数 / CAP 按需取用;缺上下文时回看「全栈基础」,真机验收不可代劳。
+
+
+
+ +
+

Args

+ + + + + + +
Prop类型说明
profiles[].namestring读者画像名
profiles[].entrycourseId起点章节,对应图中 ①②③
profiles[].pathcourseId[]推荐路径(可空 = 按需点读)
profiles[].notestring跳读/回看策略一句话
+
+
+

入口梳理原则

+
1路径非强制:推荐序列只做导航,不设锁——任何章节始终可进(skill 死原则)。
+
2与 CourseGraph 共用数据:entries 与图上的入口徽标同源,改一处两处同步。
+
3画像数据入 entries.ts;后续可由读者自选画像并高亮其路径。
+
+ +
组件设计稿 · Storybook 拆分 · stack idealjs
+
08 / 09
@@ -654,7 +817,7 @@

组件树(实现映射)

- +
@@ -662,19 +825,20 @@ - + +
设计组件实现文件
DashboardPagepages/index.tsx
TopBarnavbar 主题化 docusaurus.config
StatsRowCourseShelf/StatsRow
CourseCard(/Media)CourseShelf/CourseCard
EventsPanelCourseShelf/EventsPanel
courses/events 数据courses.ts / events.ts
CourseGraph / EntryGuideCourseShelf/CourseGraph 等
数据courses.ts / events.ts / entries.ts

组装要点

1网格 auto-fill minmax(280px, 1fr);本页示意 2 列,≥1140px 实为 3 列。
-
2各组件可独立验收:本册 02–06 页即逐组件的验收清单。
-
3整页效果见 course-shelf.pdf(v2 整页版)。
+
2各组件可独立验收:本册 02–08 页即逐组件的验收清单。
+
3关系图与入口梳理挂书架上方(默认折叠)或独立路由 /curriculum;整页效果见 course-shelf.pdf。
组件设计稿 · Storybook 拆分 · stack idealjs
-
07 / 07
+
09 / 09
diff --git a/design-refs/mockup/components.pdf b/design-refs/mockup/components.pdf index 4b9f08a..6ca61bf 100644 Binary files a/design-refs/mockup/components.pdf and b/design-refs/mockup/components.pdf differ