重构: 前端DRY(style全局沉淀 + ts/js公共沉淀)
style-dry: - 新增 src/styles/components.css: .info-item*/.panel/.panel-header/.tech-tag/.card-tags 全局 - main.ts 注册 import - 删重复: ProjectDetail/TaskDetail/TaskOutputCard/ProjectCard/Projects(scoped删重复, 全局对子组件生效) - 未使用清理: Projects .card-progress dead(1处保守核对) tsjs-dry: - aiShared.ts: resolveAiLang(合并useAiSend.resolveLang + useAiContext.resolveLanguage) - stores/knowledge.ts: kindText/kindLabel/kindIcon/knowledgeStatusLabel/knowledgeConfidenceLabel(5公共) - 删重复: useAiSend/useAiContext(resolveLang) + Knowledge/KnowledgeDetail(4+5 helper) + ActiveProjectsPanel(formatLastActivity→formatRelativeZh复用) strategy: DRY收口, 公共沉淀(utils/store/shared); relativeTime非纯重复保留; .btn/.empty-hint局部override WATCH未动
This commit is contained in:
79
src/styles/components.css
Normal file
79
src/styles/components.css
Normal file
@@ -0,0 +1,79 @@
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
DevFlow 公共组件样式(全局,非 scoped)— DRY 收口
|
||||
═══════════════════════════════════════════════════════════
|
||||
背景:多个视图/组件 <style scoped> 重复定义相同规则块,且 Vue scoped
|
||||
不跨组件渗透(子组件内部 DOM 拿不到父级 scoped 后代选择器),被迫逐处复制。
|
||||
本文件提取高频重复且**完全一致**的样式为全局类,各组件删除 scoped 重复块。
|
||||
全局类与各页 template class 名一致,零侵入。
|
||||
|
||||
提取原则:
|
||||
- 仅提取 ≥2 处逐字相同的规则(已 grep 比对一致)
|
||||
- scoped 故意 override 全局值的(如 .empty-hint padding 24px vs 全局 12px)
|
||||
不提取,保留各组件 scoped 覆盖(零视觉变化)
|
||||
- global.css 已有的 .btn/.modal-*/.page-header/.empty-hint/.empty-state
|
||||
不在此重复,仅补充尚未全局化的类
|
||||
|
||||
落地批:DRY 收口(B-260619)
|
||||
- .info-item / .info-item.info-block / .info-item .label / .info-item .value
|
||||
← ProjectDetail.vue / TaskDetail.vue / TaskOutputCard.vue 三处复制
|
||||
- .panel / .panel-header ← ProjectDetail.vue / TaskDetail.vue 两处复制
|
||||
- .tech-tag / .card-tags ← ProjectCard.vue / Projects.vue 两处复制
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
/* — Info Item:字段同行布局(label 固定宽 + 值占余),描述字段 info-block 保持块状 —
|
||||
原 ProjectDetail.vue L439-456 / TaskDetail.vue L560-577 /
|
||||
TaskOutputCard.vue L93-110 三处逐字一致(后者注释说明 scoped 不渗透故复制)。 */
|
||||
.info-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: baseline;
|
||||
gap: 12px;
|
||||
}
|
||||
.info-item.info-block {
|
||||
flex-direction: column;
|
||||
}
|
||||
.info-item .label {
|
||||
font-size: 12px;
|
||||
color: var(--df-text-dim);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
min-width: 88px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.info-item .value { font-size: 14px; color: var(--df-text); flex: 1; min-width: 0; }
|
||||
|
||||
/* — Panel:内嵌面板容器(卡片底 + 头部行)—
|
||||
原 ProjectDetail.vue L617-630 / TaskDetail.vue L539-551 两处逐字一致。
|
||||
.task-count 为 ProjectDetail 特有,留组件 scoped。 */
|
||||
.panel {
|
||||
background: var(--df-bg-card);
|
||||
border: 0.5px solid var(--df-border);
|
||||
border-radius: var(--df-radius-lg);
|
||||
padding: var(--df-pad-panel);
|
||||
}
|
||||
.panel-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: var(--df-gap-head);
|
||||
}
|
||||
.panel-header h2 { font-size: 15px; font-weight: 500; }
|
||||
|
||||
/* — Tech Tags:技术栈标签行 + 单标签 —
|
||||
原 ProjectCard.vue L110-122 / Projects.vue L471-483 两处逐字一致。
|
||||
ProjectCard 为 scoped 组件,Projects.vue 为创建/导入模态复用;统一全局后
|
||||
两处均生效(scoped 下全局类对当前组件根/子 DOM 仍生效,仅 scoped 属性选择器
|
||||
不渗透到子组件内部 — 此处标签是当前组件自身 DOM,无渗透问题)。 */
|
||||
.card-tags {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.tech-tag {
|
||||
font-size: 11px;
|
||||
padding: 2px 8px;
|
||||
border-radius: var(--df-radius-xs);
|
||||
background: rgba(108, 99, 255, 0.08);
|
||||
color: var(--df-text-secondary);
|
||||
border: 0.5px solid var(--df-border);
|
||||
}
|
||||
Reference in New Issue
Block a user