一键导入
coding-experience-outline
从大纲视图闪动抽搐问题中总结的编码经验教训,包括 CSS 自定义属性正确使用、Vue 响应式边界、DOM 操作与 CSS 变量选择等
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
从大纲视图闪动抽搐问题中总结的编码经验教训,包括 CSS 自定义属性正确使用、Vue 响应式边界、DOM 操作与 CSS 变量选择等
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Keeps MetaDoc UI locales in sync with zh_cn as the blueprint. Prefer running locales/i18n_keys.py (query/prefix/apply) instead of reading huge JSON. Use when fixing missing i18n keys, adding locale strings, or improving translation quality. Trigger: i18n, locales, i18n_keys, missing key, 翻译, 多语言, intlify Not found key.
MetaDoc 统一操作菜单规范。使用 ItemActionMenu 组件实现列表/卡片右键菜单或「...」按钮菜单,避免 shadcn DropdownMenu 与 el-dropdown 混用导致的 hover 缺失、双击触发、Dialog 内不显示等问题。使用场景:CardGrid、SessionList、配置/引擎/工具集管理界面等需要操作菜单的地方。
Manages AI/agent prompts in locale_prompts JSON and automates i18n (report missing keys, AI review/translate). Use when editing agent or tool prompts, adding locale_prompts keys, or running locale_prompts i18n scripts.
Integrates AI content generation with streaming output using createAiTask, StreamingContentDisplay, and centralized prompts. Use when adding or modifying features that call the LLM for content output, stream results in the UI, or manage prompt templates and i18n.
Run and test MetaDoc agent from the terminal via agent-cli (real tools, no mock). Use when testing agent tool CRUD (create/read/update/delete files and folders), debugging agent without GUI, or verifying the agent-cli TCP flow. Trigger: agent-cli, agent test, workspace CRUD, 工作区文件测试, agent 工具测试.
使用 GitHub CLI (`gh`) 管理 Issues、Pull Requests、Workflows、Repositories 等所有 GitHub 操作。支持自动化 TODO 扫描创建 Issues、PR 管理、CI/CD 监控等功能。
| name | coding-experience-outline |
| version | 1.0.0 |
| description | 从大纲视图闪动抽搐问题中总结的编码经验教训,包括 CSS 自定义属性正确使用、Vue 响应式边界、DOM 操作与 CSS 变量选择等 |
/* CSS 不支持这种语法! */
cursor: var(--outline-dragging, 0) == 1 ? default : inherit;
stroke: var(--outline-theme-type, light) == dark ? #e0e0e0 : #9ca3af;
filter: var(--outline-theme-type, light) == dark ? brightness(1.15) : brightness(0.92);
原因:
== 运算符// TypeScript 中进行条件判断
const isDark = theme.type === 'dark'
const outlinePage = document.querySelector('.outline-page') as HTMLElement
// 设置计算后的值
outlinePage.style.setProperty('--outline-link-color', isDark ? '#e0e0e0' : '#9ca3af')
outlinePage.style.setProperty('--outline-filter', isDark ? 'brightness(1.15)' : 'brightness(0.92)')
/* CSS 中直接使用变量值 */
.tree-node {
stroke: var(--outline-link-color, #9ca3af);
filter: var(--outline-filter, brightness(0.92));
}
原则:CSS 变量 = 存储值;TypeScript = 逻辑判断
<template>
<vue-tree
:class="{
'is-dragging': isDraggingNode,
'outline-theme-dark': themeState.type === 'dark'
}"
/>
</template>
问题:
:style="initialTransformStyle"<template>
<vue-tree class="outline-tree-inner" />
</template>
<script>
watch(
() => themeState.type,
(type) => {
const page = document.querySelector('.outline-page')
page?.style.setProperty('--outline-link-color', type === 'dark' ? '#e0e0e0' : '#9ca3af')
}
)
</script>
原则:修改 CSS 变量不会触发 Vue 重新渲染
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 主题切换(颜色、亮度) | CSS 变量 | 数据驱动,不触发重渲染 |
| 拖拽状态(cursor) | CSS 变量 | 纯视觉反馈 |
| 动态添加/移除元素 | Vue 响应式 | 必须触发重新渲染 |
| 复杂的交互逻辑 | Vue 响应式 | 需要组件重新计算 |
决策流程:
需要修改的值会影响组件重新计算吗?
├── 是 → 使用 Vue 响应式
└── 否 → 是纯视觉/样式变化?
├── 是 → 使用 CSS 自定义属性
└── 否 → 使用 DOM 操作
// ❌ 错误
async animateTabOpen() {
const first = recordPositions()
await nextTick()
await nextFrame() // 浏览器在这里绘制了!
applyInvert() // 标签已闪现到新位置
}
// ✅ 正确
async animateTabOpen() {
const first = recordPositions()
await nextTick()
// 立即在同一帧内测量并应用 invert
const last = measurePositions()
const delta = calcDelta(first, last)
applyInvert(delta) // 同一事件循环!
await nextFrame() // 下一帧才播放动画
playAnimation()
}
关键:nextTick() 后立即测量并应用 invert,不给浏览器绘制机会。
.animated-element {
will-change: transform;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
contain: layout style paint;
}
// 创建动画
const animation = element.animate(
[{ transform: 'translate3d(0, 0, 0)' }, { transform: 'translate3d(100px, 0, 0)' }],
{ duration: 200, easing: 'ease-out' }
)
// 取消动画
animation.cancel()
// 等待完成
await animation.finished
优势:完全控制(暂停、回放、取消),60fps GPU 加速。
// ❌ 错误
const outlinePage = document.querySelector('.outline-page')
outlinePage.dataset.theme = 'dark' // Property 'dataset' does not exist
// ✅ 正确
const outlinePage = document.querySelector('.outline-page') as HTMLElement
outlinePage.dataset.theme = 'dark'
# PR 已存在时,修改后需要强制推送
git push origin fix/branch-name -f
注意:
-ftranslate3d 强制 GPU 加速== 或 ? :Element vs HTMLElementawait nextFrame() 在应用 invert 之前相关 Issue: #25 (大纲), #21 (Tab 动画)
相关 PR: #26, #27
文档: docs/outline/CODING_EXPERIENCE_OUTLINE_RENDER_FLASH.md