文档定位:本文件是 前端实施细则,定义 Apple Style 的具体视觉参数和编码规范。 业务域前缀注册表和全链路命名规范的 权威来源 为
contexts.md第 11 章。
- 去框架化工程化:虽然不使用 React/Vue,但必须通过模块化、服务层分层等手段达到同等的代码复用与维护能力。
- Apple Style Premium UI:视觉效果必须对齐苹果公司(Apple Inc.)设计语言。优先采用浅色系、高通透感、大幅留白的视觉体验。
- 逻辑与样式解耦:CSS 只负责视觉,JS 只负责逻辑,两者通过
js-类名和dataset桥接,严禁混用。 - 设计令牌驱动:所有审美标准必须通过 Design Tokens 实现,禁止硬编码视觉参数。
- 玻璃拟态 (Glassmorphism):核心卡片和导航组件优先使用玻璃质感。
- 规范:使用
backdrop-filter: blur(20px) saturate(180%);。 - 背景:使用半透明白色
rgba(255, 255, 255, 0.72)。
- 规范:使用
- 连续圆角 (Continuous Curves):
- 小组件/按钮:
8px-12px。 - 内容卡片:
16px-24px。 - 模态框/认证卡:
24px以上。
- 小组件/按钮:
- 背景色 (Base):使用
#F5F5F7(Apple Gray) 作为全局背景,而非纯白。 - 文字色级:
- Primary:
#1D1D1F(接近黑色的深灰,用于标题)。 - Secondary:
#86868B(灰色,用于辅助文字)。
- Primary:
- 行动项: 使用
#0071E3(Apple Blue) 作为主动作色。
- 8px 栅格:所有 Padding 和 Margin 必须是 8 的倍数 (8, 16, 24, 32, 48, 64)。
- 底部安全区 (Breathing Bottom):所有独立内容页面底部必须强制增加
120px的透明占位,确保滚动体验的从容感。 - 视口缓冲区:页面顶部内容距离 Header 必须保持至少
40px-60px的视觉缓冲区。
- 严禁内联:禁止在 HTML 标签中编写超过 2 项属性的内联样式。
- 样式回收:凡在 3 处以上重复使用的布局,必须在
css/main.css中提取为.u-原子类或.g-全局类。
所有类名遵循:.前缀-组件名__子元素--修饰符。
- 业务域前缀 (Business Prefixes):
sd-(Service Desk),adm-(Administration),pm-(Project Management),qa-(Quality Assurance),rpt-(Report),sys-(System)。
- 功能性前缀 (Functional Prefixes):
u-(Utility): 原子类,如.u-mt-20。g-(Global): 全局组件/材质,如.g-glass-panel。is-/has-(State): 描述状态,如.is-active,.is-loading。
- 字体栈:优先系统默认字体
-apple-system, BlinkMacSystemFont,其次使用Inter或Outfit。 - 阴影层级 (Levelized Shadows):
- Soft:
0 4px 6px -1px rgba(0,0,0,0.01)(基础边界)。 - Deep:
0 20px 40px rgba(0,0,0,0.04)(悬浮或弹出层)。
- Soft:
- 滚动条:禁止使用系统默认宽度。必须同步
main.css中的极细圆角 Apple 风格滚动条。 - 动效:统一使用
cubic-bezier(0.4, 0, 0.2, 1)或弹性cubic-bezier(0.175, 0.885, 0.32, 1.275)。
- ES6 Modules: 强制使用
type="module"。 - 分层设计:
*_service.js(Fetch 数据) <->*_handler.js(DOM/UI 交互)。
- 逻辑钩子 (Logic Hooks): 使用以
js-开头的类名作为 JS 选择器。 - 状态驱动: 通过操作
dataset或classList来切换 UI,禁止修改.style.xxx。 - 事件委派: 动态生成的元素必须在父容器上联合
e.target.closest()监听。
- XSS 防御: 渲染动态内容严禁
innerHTML,强制使用textContent或<template>。 - 异步体感: 必须提供骨架屏或
is-loading状态。
- 300 行定律:单个 JS/CSS/HTML 文件严禁超过 300 行。超出必须拆分为独立模块。可通过
scripts/lint_frontend.py自动检查。 - 拆分策略:Service 层 (
*_service.js) 和 Handler 层 (*_handler.js) 必须分离。当单个 Handler 超过 200 行时,按功能区域拆分为多个文件。
- Fetch 统一处理:所有
fetch()调用必须包含try-catch,并检查response.ok。严禁忽略网络错误。 - 用户反馈:错误发生时必须通过 Toast 或内联提示告知用户,严禁静默失败。
- 控制台日志:
catch块必须console.error()记录完整上下文(URL、参数、错误对象),严禁空catch。
为了在不引入重型框架的情况下实现高度的代码复用和视觉一致性,本项目采用原生 Web Components 封装通用的 UI 组件和复杂的业务部件。
- 命名规范:
- 强制前缀:必须使用业务域前缀或全局前缀(如
<sd-card>,<g-button>)。 - 横杠原则:组件名必须包含至少一个连字符
-(浏览器原生要求)。
- 强制前缀:必须使用业务域前缀或全局前缀(如
- 封装标准 (Shadow DOM):
- 强制启用:所有组件必须使用
this.attachShadow({mode: 'open'})开启隔离罩。 - 隔离原则:组件内部样式不应受外部影响,反之亦然。内部装饰应优先使用宿主选择器
:host。
- 强制启用:所有组件必须使用
- 样式集成:
- 禁止硬编码颜色:组件内部 CSS 必须使用
var(--...)引用main.css中定义的设计令牌(Design Tokens)。 - 通透感适配:若组件包含背景,需支持
glassmorphism样式变量。
- 禁止硬编码颜色:组件内部 CSS 必须使用
- 单一数据流:
- 属性传入 (Attributes):配置信息(如状态、大小、颜色主题)通过 HTML 属性传入。
- 事件驱动 (Events):组件内部的状态变化必须通过
new CustomEvent()向上冒泡,严禁在组件内部直接修改外部变量。
- 反应式更新:
- 利用
attributeChangedCallback监听属性变化并按需局部更新 DOM,确保性能最优。
- 利用
- 存储路径:
devops_portal/static/js/components/。 - 命名格式:
{prefix}_{name}.component.js。 - 单文件组件:每个 JavaScript 文件应包含一个完整的类定义和
customElements.define注册逻辑。
全链路命名规范(含数据库、API、后端文件)参见
contexts.md第 11.2 章。以下为前端特有的命名规则:
| 维度 | 规范格式 | 示例 |
|---|---|---|
| JS 脚本文件名 | {prefix}_{resource}.js |
sd_ticket_service.js |
| 组件文件名 | {prefix}_{name}.component.js |
sd_ticket_card.component.js |
| 自定义 HTML 标签 | <{prefix}-{name}> |
<sd-priority-badge> |
| CSS 类名 | .prefix-component__element |
.sd-table__cell |
| DOM 逻辑钩子 | .js-{action}-{resource} |
.js-delete-ticket |
| 数据属性 | data-{key}="{value}" |
data-ticket-id="123" |