timeline
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: timeline
Skill: timeline
Component HTML/CSS/JS thuần (không framework) — danh sách mốc dọc, mỗi mốc có ngày + tiêu đề + nguồn, cuộn tới đâu hiện tới đó.
纯 HTML/CSS/JS 组件(不使用框架)——垂直里程碑列表;每个里程碑包含日期、标题和来源,滚动到哪里就显示到哪里。
WHAT
内容
Purpose và context
目的与上下文
- Purpose: đưa vào trang đích một timeline dọc MỘT trục thời gian (mốc ngày + tiêu đề + nguồn), cuộn-hiện dần, responsive mobile→desktop ở 768px, dữ liệu thật.
- Trigger (when to use):
- Trang cần liệt kê MỐC THEO THỜI GIAN: changelog, lịch sử dự án, roadmap, writing archive, timeline sự kiện.
- User nói "làm timeline", "dòng thời gian", "lịch sử dạng timeline".
- Non-goals: KHÔNG dùng cho sơ đồ quan hệ/luồng (đó là ) hay biểu đồ dữ liệu số (đó là
/diagram) — đây chỉ là MỘT trục thời gian tuyến tính.dataviz
- 目的: 将一个单一时间轴的垂直 timeline 引入目标页面(日期里程碑 + 标题 + 来源),滚动时渐显,在 768px 处从移动端响应式切换到桌面端,并使用真实数据。
- 触发条件(何时使用):
- 需要按时间列出里程碑的页面:changelog、项目历史、roadmap、写作归档、事件 timeline。
- 用户说“制作 timeline”“时间线”“timeline 形式的历史”。
- 非目标: 不要用于关系/流程图(使用 )或数值图表(使用
/diagram)——这里只处理一条线性时间轴。dataviz
Mental model
心智模型
dữ liệu mốc thật (API/markdown/CMS) → <li class="timeline__item"> (time + a + small) → IntersectionObserver gắn timeline__item--in → CSS transition hiện dần真实里程碑数据(API/markdown/CMS)→ <li class="timeline__item">(<time> + <a> + <small>)→ IntersectionObserver 添加 timeline__item--in → CSS transition 渐显Input và output contract
输入与输出约定
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | trang đích | có | nơi gắn timeline |
| In | dữ liệu mốc thật | có | ngày (ISO) + tiêu đề + link + nguồn; thiếu thì chưa wire được (chỉ có demo faker) |
| In | | không | có thì đổi class/token theo hệ design dự án |
| Out | HTML/CSS/JS đã adapt | có | không còn import faker, class BEM khớp CSS và JS |
| Out | bằng chứng verify | có | ảnh chụp + cuộn thử qua |
| 字段 | 是否必填? | 含义 | |
|---|---|---|---|
| In | 目标页面 | 是 | 安装 timeline 的位置 |
| In | 真实里程碑数据 | 是 | 日期(ISO)+ 标题 + 链接 + 来源;缺失时无法完成接入(只能使用 faker demo) |
| In | | 否 | 如有,可根据项目的设计体系调整 class/token |
| Out | 已适配的 HTML/CSS/JS | 是 | 不再导入 faker,BEM class 与 CSS/JS 一致 |
| Out | 验证证据 | 是 | 截图 + 通过 |
Rules và capabilities
规则与能力
- RULE-01 (MUST): dòng 1 import
assets/timeline.jstừfakerchỉ để SINH DỮ LIỆU GIẢ cho demo (esm.sh) — khi wire vào dự án thật, XOÁ import đó +generateArticles(), thaygenerateArticles()bằng dữ liệu THẬT (API/markdown/CMS) trước khi build(). Để nguyên import faker trong production là phụ thuộc thừa + lộ dữ liệu giả.this.articles - RULE-02 (MUST): Class đặt tên theo BEM (...) — đổi tên class thì đổi cả CSS lẫn JS
timeline__item-time, đừng đổi một bên.querySelector - RULE-03 (MUST): Ngưỡng của
threshold: 1nghĩa là mốc phải vào khung nhìn TOÀN BỘ mới hiện — mốc cao hơn viewport (nội dung dài) sẽ không bao giờ đạt threshold 1, hạ xuốngIntersectionObservernếu mốc có nội dung dài.0.5 - RULE-04 (MUST): Verify bằng (chụp + cuộn thử) sau khi wire dữ liệu thật, không tự khen "chạy được" chỉ vì không lỗi console.
playwright-verify - Capabilities: đọc asset mẫu của skill; ghi file front-end của trang đích; chạy trình duyệt headless để chụp/cuộn kiểm.
- RULE-01 (MUST):第 1 行从
assets/timeline.js导入esm.sh,仅用于为 demo 生成虚假数据(faker)——接入真实项目时,必须在 build() 前删除该导入和generateArticles(),并将generateArticles()替换为真实数据(API/markdown/CMS)。在 production 中保留 faker 导入会造成多余依赖,并暴露虚假数据。this.articles - RULE-02 (MUST):Class 命名遵循 BEM(等)——修改 class 名称时,必须同步修改 CSS 和 JS 中的
timeline__item-time,不能只改一边。querySelector - RULE-03 (MUST):的
IntersectionObserver表示里程碑必须完全进入视口才会显示——高度超过 viewport 的里程碑(内容较长)永远无法达到 threshold 1;如果里程碑包含长内容,应将其降至threshold: 1。0.5 - RULE-04 (MUST):接入真实数据后,必须使用 进行验证(截图 + 滚动测试);不能仅因控制台没有错误就自行宣称“能够运行”。
playwright-verify - 能力:读取 skill 的示例素材;编写目标页面的前端文件;运行 headless 浏览器进行截图和滚动检查。
Failure boundaries
失败边界
- Chưa có dữ liệu mốc thật → clarify nguồn dữ liệu; không giao bản còn faker.
- Việc thật ra là sơ đồ quan hệ/luồng hoặc biểu đồ số → blocked, chuyển hoặc
/diagram.dataviz - Verify playwright thấy mốc không hiện khi cuộn → failed, sửa (vd hạ threshold) rồi verify lại.
- 没有真实里程碑数据 → clarify 数据来源;不得交付仍包含 faker 的版本。
- 实际需求是关系/流程图或数值图表 → blocked,转至 或
/diagram。dataviz - Playwright 验证发现滚动时里程碑未显示 → failed,进行修复(例如降低 threshold)后重新 verify。
HOW
方法
Main workflow
主工作流
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | skill assets | Đọc | hiểu cấu trúc | — |
| W02 | judgment | asset, | ADAPT vào trang đích: đổi class/token theo hệ design dự án (BEM đồng bộ CSS + JS) | component trong trang | không có design.md → giữ token mẫu |
| W03 | effect | dữ liệu thật | Xoá import faker + | JS không còn faker | thiếu dữ liệu → clarify |
| W04 | judgment | dự án | Chọn dark-mode: giữ | một cơ chế dark duy nhất | — |
| W05 | deterministic | trang | Verify bằng | ảnh + mốc hiện đủ | mốc không hiện → B02 |
Chi tiết từng bước (nguồn chân lý cho W01–W05):
| 步骤 | 类型 | 输入 | 操作 | 输出/退出 | 失败/下一步 |
|---|---|---|---|---|---|
| W01 | deterministic | skill 示例素材 | 读取 | 理解结构 | — |
| W02 | judgment | asset、 | 适配到目标页面:根据项目的设计体系调整 class/token(BEM 与 CSS + JS 同步) | 页面中的组件 | 没有 design.md → 保留示例 token |
| W03 | effect | 真实数据 | 删除 faker 导入 + | JS 不再包含 faker | 缺少数据 → clarify |
| W04 | judgment | 项目 | 选择 dark mode:保留 | 唯一的 dark mode 机制 | — |
| W05 | deterministic | 页面 | 使用 | 截图 + 所有里程碑均显示 | 里程碑未显示 → B02 |
各步骤详情(W01–W05 的唯一事实来源):
Assets
示例素材
assets/timeline.htmlassets/timeline.cssassets/timeline.jsdesign.mdassets/timeline.htmlassets/timeline.cssassets/timeline.jsdesign.mdCơ chế
机制
- Mỗi mốc là chứa
<li class="timeline__item">(ngày,<time>attr chuẩn ISO) +datetimetiêu đề +<a>nguồn.<small> - gắn class
IntersectionObserverkhi mốc cuộn vào khung nhìn → CSS transition làm nó "hiện dần" (opacity + translateX), KHÔNG animate bằng JS trực tiếp.timeline__item--in - Responsive: mobile — chấm mốc + đường nối bên trái, ngày nằm trong dòng. — ngày tách ra cột riêng bên trái (
≥768px).position: absolute - Dark theme qua — đổi 3 biến
@media (prefers-color-scheme: dark); nếu dự án đã có--bg/--fg/--primary(toggle chủ động, không chỉ theo OS) thì thay khối này bằng biến token củadark-mode-maker, đừng để hai cơ chế dark-mode chỏi nhau.dark-mode-maker
- 每个里程碑都是 ,包含
<li class="timeline__item">(日期,使用标准 ISO<time>属性)+datetime标题 +<a>来源。<small> - 在里程碑滚入视口时添加 class
IntersectionObserver→ CSS transition 使其“渐显”(opacity + translateX),不要直接使用 JS 做动画。timeline__item--in - 响应式布局:移动端——左侧显示里程碑圆点和连接线,日期位于行内。——日期拆分到左侧独立列(
≥768px)。position: absolute - Dark theme 通过 实现——更改 3 个变量
@media (prefers-color-scheme: dark);如果项目已有--bg/--fg/--primary(可主动切换主题,而不只是跟随 OS),则用dark-mode-maker的 token 变量替换该代码块,不要让两种 dark mode 机制相互冲突。dark-mode-maker
Branches
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | dự án đã có | thay khối | không có → giữ khối mẫu | W05 |
| B02 | recovery | mốc có nội dung dài, cao hơn viewport, không bao giờ hiện | hạ | vẫn không hiện → failed, báo user | W05 |
| ID | 类型 | 守卫条件 | 行为 | 跳过/失败 | 汇合点 |
|---|---|---|---|---|---|
| B01 | conditional_required | 项目已有 | 用 | 不存在 → 保留示例代码块 | W05 |
| B02 | recovery | 里程碑内容较长、高度超过 viewport,始终无法显示 | 将 | 仍然不显示 → failed,向用户报告 | W05 |
Validation và stopping
验证与停止条件
Xong khi: grep không còn / trong JS trang đích, class CSS và JS khớp, và chụp được mọi mốc hiện sau khi cuộn. Không lỗi console chưa đủ để kết luận (RULE-04).
fakergenerateArticlesplaywright-verify完成条件:目标页面的 JS 中 grep 不到 /,CSS 与 JS 的 class 一致,并且 能够在滚动后截取到所有已显示的里程碑。仅无控制台错误不足以得出结论(RULE-04)。
fakergenerateArticlesplaywright-verifyExamples
示例
- Positive: "làm changelog timeline từ CHANGELOG.md" → adapt 3 asset, dữ liệu parse từ markdown thay , xoá faker → playwright cuộn thấy mọi mốc có class
this.articles, desktop ≥768px ngày nằm cột trái.timeline__item--in - Boundary/failure: mốc roadmap mô tả dài hơn chiều cao màn hình → với mốc đứng opacity 0 mãi → B02 hạ
threshold: 1, verify lại thấy hiện.0.5
- 正向示例:“根据 CHANGELOG.md 制作 changelog timeline”→ 适配 3 个素材,从 markdown 解析数据以替代 ,删除 faker → Playwright 滚动后,每个里程碑都带有 class
this.articles;在桌面端timeline__item--in时,日期位于左列。≥768px - 边界/失败: roadmap 里程碑的描述长于屏幕高度 → 使用 时,里程碑会一直保持 opacity 0 → B02 将其降至
threshold: 1,重新验证后即可显示。0.5
Origin
来源
- Nén từ (snippet tham khảo chưa gắn skill nào, chưa từng track git) thành skill thật theo yêu cầu user 2026-09-17 — cùng đợt với
llmwiki/patterns/timeline/.blur
- 压缩自 (该参考片段尚未关联任何 skill,也从未纳入 git 跟踪),根据用户在 2026-09-17 的要求整理为正式 skill——与
llmwiki/patterns/timeline/同一批次。blur