{
  "name": "Citrus",
  "schemaVersion": 1,
  "version": "2026.11.01.1",
  "scope": "统一UI/UE交互思路；首页为可操作、可复用的组件参考库，不规定所有工具同一外观。",
  "provenance": "依据现有档案室实际组件、UI-CONSISTENCY.md与本次用户已确认约定；不包含角色、密钥、预算数值或私有路径。",
  "rules": [
    {
      "id": "content.concise-interface",
      "category": "界面总则",
      "title": "干净界面，按需说明",
      "rule": "布局和控件优先表达用途。减少装饰性文案、重复说明和开发术语堆砌，不做过多解释，减少无关紧要的文字。保留必要控件标签、状态反馈、累计费用及关键风险确认；次要帮助按需展示。精简界面文案不等于删除角色或用户实际资料。",
      "scope": "以后制作的界面及 Citrus、档案室本轮精简",
      "check": "目视检查主操作与信息层级；确认没有重复说明铺满页面，必要费用和风险仍可理解，用户资料没有被改写。",
      "authority": "confirmed"
    },
    {
      "id": "archive.color-semantics",
      "category": "界面总则",
      "title": "档案室红色语义",
      "rule": "档案室普通表单、上传、新增及常规操作使用中性或青蓝边框与键盘焦点；红框仅用于重要提醒、警告、危险操作或页签选中。品牌红底白狼保留。新增服装槽位与普通单行选项等高、同纵向内边距，保留虚线与中央加号；悬停仅用很淡红底，不用警告红框。",
      "scope": "档案室应用规范；不改变Citrus黄绿主题或要求其他项目复制档案室配色",
      "check": "比较普通项与新增槽位实际高度和padding；明暗、桌面与手机检查常态、hover和键盘focus，确认品牌、警告、危险删除和选中页签语义仍在。",
      "authority": "confirmed"
    },
    {
      "id": "layout.action-feedback-spacing",
      "category": "界面总则",
      "title": "操作组与状态反馈留白",
      "rule": "同类操作使用明确的按钮组、统一间距token与安全换行；输入、操作组及状态反馈之间保留清晰紧凑间距，不能让保存/删除紧贴或反馈文字贴住按钮。保留危险操作区分与已有二次确认，不以增加大块空白替代布局。",
      "scope": "设置API、服装生成、聊天和图片等操作区；紧凑图标工具组保留其专用密度",
      "check": "桌面4K及390/320检查按钮实际边界、组内gap和状态上下间距；长文与换行不重叠，不操作真实凭据。",
      "authority": "confirmed"
    },
    {
      "id": "edit.entry",
      "category": "编辑与确认",
      "title": "标题右侧进入编辑",
      "rule": "编辑图标位于标题右侧；进入编辑后原位置变为取消。",
      "scope": "可编辑信息卡片",
      "check": "观察阅读态与编辑态的位置是否一致。",
      "authority": "confirmed"
    },
    {
      "id": "edit.dirty",
      "category": "编辑与确认",
      "title": "按真实差异判断修改",
      "rule": "只在当前值与保存值实际不同时视为 dirty；改回原文、撤回图片或选择视为 clean。不能只记录是否碰过输入框。",
      "scope": "文本、选择、图片及组合表单",
      "check": "进入编辑不操作；修改后还原；检查保存按钮和取消行为。",
      "authority": "confirmed"
    },
    {
      "id": "edit.save-placement",
      "category": "编辑与确认",
      "title": "有改动才出现保存",
      "rule": "保存仅在 dirty 时显示，位于取消图标左侧。",
      "scope": "卡片内编辑工具栏",
      "check": "检查 clean、dirty、还原三态。",
      "authority": "confirmed"
    },
    {
      "id": "edit.clean-cancel",
      "category": "编辑与确认",
      "title": "无改动直接退出",
      "rule": "clean 时取消直接退出，不出现二次确认。",
      "scope": "所有编辑模块",
      "check": "不修改或改回原值后点取消，直接回阅读态。",
      "authority": "confirmed"
    },
    {
      "id": "edit.dirty-cancel",
      "category": "编辑与确认",
      "title": "放弃改动须确认",
      "rule": "dirty 时取消需明确确认“放弃未保存改动”，不是删除原资料。选择否保留草稿。",
      "scope": "编辑与离开保护",
      "check": "修改后取消，否应继续编辑，确认才放弃。",
      "authority": "confirmed"
    },
    {
      "id": "edit.save-confirm",
      "category": "编辑与确认",
      "title": "保存始终二次确认",
      "rule": "可提交的保存须二次确认；确认成功才回到阅读态。",
      "scope": "提交正式变更",
      "check": "点击保存只开确认，否不写，确认才写。",
      "authority": "confirmed"
    },
    {
      "id": "edit.popover",
      "category": "编辑与确认",
      "title": "确认浮层位于图标上方",
      "rule": "确认文案明确，使用确认／否图标，浮层位于触发图标上方并限制在视口内。",
      "scope": "保存、放弃、风险确认",
      "check": "桌面和窄屏检查位置、边界及图标可见性。",
      "authority": "confirmed"
    },
    {
      "id": "edit.focus",
      "category": "编辑与确认",
      "title": "确认不使页面跳动",
      "rule": "默认安全焦点在否；focus 使用 preventScroll；Esc/外部点击只关闭确认并保留草稿，滚动时关闭浮层。",
      "scope": "可滚动页面上的确认",
      "check": "在页面中下部打开确认，比对 scrollY；按否、Esc、手动滚动。",
      "authority": "confirmed"
    },
    {
      "id": "form.patch",
      "category": "表单与持久化",
      "title": "只更新目标字段",
      "rule": "无关字段不能被旧快照覆盖；使用版本校验和明确冲突处理。",
      "scope": "共享资料、多标签编辑",
      "check": "另一标签先保存后，旧标签应冲突而非静默覆盖。",
      "authority": "confirmed"
    },
    {
      "id": "form.draft",
      "category": "表单与持久化",
      "title": "失败保护草稿",
      "rule": "验证、网络、保存或同步失败时保留草稿，明确成功／失败反馈，不假称已保存。",
      "scope": "所有保存入口",
      "check": "模拟错误后检查输入、重试入口及阅读态数据。",
      "authority": "confirmed"
    },
    {
      "id": "form.no-implicit-write",
      "category": "表单与持久化",
      "title": "预览与生成不等于保存",
      "rule": "预览、选择查看、生成建议或切换布局均不自动覆盖正式源。采用草稿后仍走保存确认。",
      "scope": "生成与资料预览",
      "check": "生成或取消后检查正式内容未变化。",
      "authority": "confirmed"
    },
    {
      "id": "form.local-state",
      "category": "表单与持久化",
      "title": "非敏感偏好可本机保存",
      "rule": "声明持久化范围；敏感信息不进入浏览器偏好、日志或导出。升级不得覆盖用户检查状态。",
      "scope": "主题与本检查表",
      "check": "刷新恢复选择；规则升级保留已有ID对应的状态和备注。",
      "authority": "confirmed"
    },
    {
      "id": "button.names",
      "category": "按钮与反馈",
      "title": "图标具有短提示与名称",
      "rule": "可操作图标有简短 tooltip 和可访问名称；不能只用形状或颜色说明状态。",
      "scope": "图标工具栏",
      "check": "悬停和键盘聚焦可理解操作，读屏名称明确。",
      "authority": "confirmed"
    },
    {
      "id": "button.hierarchy",
      "category": "按钮与反馈",
      "title": "一个明确的主操作",
      "rule": "将类型选择与执行分开；主动作突出，取消为次级，历史／查询收进紧凑次级或详情区。",
      "scope": "生成、提交等操作区",
      "check": "不出现数个等宽大按钮互相竞争主次。",
      "authority": "confirmed"
    },
    {
      "id": "button.state",
      "category": "按钮与反馈",
      "title": "可分辨操作状态",
      "rule": "idle、pending、success、failure、unknown 具有明确文字；选中、禁用和悬停能区分，不能只靠颜色。",
      "scope": "异步操作",
      "check": "逐一检查各状态的文案、可点击动作与视觉。",
      "authority": "confirmed"
    },
    {
      "id": "button.cancel-wait",
      "category": "按钮与反馈",
      "title": "取消等待的含义准确",
      "rule": "若供应商可能仍执行，说明取消仅停止等待，不保证未扣费或远端取消。",
      "scope": "收费或远端任务",
      "check": "进行中只有适用取消动作，不显示虚假的取消成功。",
      "authority": "confirmed"
    },
    {
      "id": "layout.stack",
      "category": "导航与布局",
      "title": "同级卡片间距统一",
      "rule": "使用统一 spacing token/stack；重排、切换与条件隐藏后同级卡片仍保持一致间距，隐藏项不留幽灵占位。",
      "scope": "纵向模块、卡片组",
      "check": "桌面、390、320测量实际边界间距；隐藏模块后再测。",
      "authority": "confirmed"
    },
    {
      "id": "layout.sticky-nav",
      "category": "导航与布局",
      "title": "吸顶与回到顶部",
      "rule": "长页正常吸顶；短页即使不能滚动，向下滚轮累计阈值也可贴顶并收为固定宽度靠左图标，主题和设置靠右；反向或回顶部合理恢复。忽略表单、内部滚动与弹层滚轮，避免微抖，保留选中和焦点。 位置、宽度和标签应协调平滑缓变，不使用display瞬切；减少动态偏好时禁用过渡。",
      "scope": "档案式多模块长页",
      "check": "1920/3840短页、长页及390/320实际滚轮；验证表单、图片缩放、设置弹层排除和固定44px紧凑按钮。",
      "authority": "confirmed"
    },
    {
      "id": "layout.modes",
      "category": "导航与布局",
      "title": "分类使用真实页签",
      "rule": "分类按钮采用tab/tabpanel语义，一次只显示选中分类；保留草稿和局部选择，切换关闭确认与图片模态，不能串状态、重复挂载监听或发模型请求。",
      "scope": "含异步任务的布局",
      "check": "点击及方向/Home/End键切换；只有一个panel可见，切回仍保留局部状态，隐藏页不留模态或滚动锁。",
      "authority": "confirmed"
    },
    {
      "id": "choice.unique",
      "category": "选择器与图片",
      "title": "唯一选择职责独立",
      "rule": "S基准与D默认等不同职责独立唯一；可兼任，预览不改变默认，状态不只用颜色表示。",
      "scope": "不同语义的唯一选择",
      "check": "逐项切换与取消；验证各职责唯一而不串写。",
      "authority": "confirmed"
    },
    {
      "id": "choice.restore",
      "category": "选择器与图片",
      "title": "恢复保存项，不回默认",
      "rule": "刷新恢复当前有效保存值；加载失败、已删除或不支持时显示明确状态，不静默换服务／型号。",
      "scope": "模型及其他动态选择器",
      "check": "刷新、加载失败、删除选择项后检查实际值。",
      "authority": "confirmed"
    },
    {
      "id": "upload.lifecycle",
      "category": "选择器与图片",
      "title": "图片可预览与移除",
      "rule": "图片类型、大小和解码须验证；选择后预览、可移除；取消、清空、导航回收临时URL与资源。",
      "scope": "图片上传、聊天附件",
      "check": "选合法／损坏图片；移除、退出后检查生命周期。",
      "authority": "confirmed"
    },
    {
      "id": "upload.reference",
      "category": "选择器与图片",
      "title": "参考图按需要使用",
      "rule": "无角色需求不读取或发送角色图；需要参考而能力不足时明确停止，不悄悄丢图降级。",
      "scope": "有角色参考的图片生成",
      "check": "分别验证无角色、三图缺失、不支持参考三条路径。",
      "authority": "confirmed"
    },
    {
      "id": "async.duplicate",
      "category": "聊天与异步",
      "title": "防止重复提交",
      "rule": "提交中禁用重复动作；取消、异常和超时后复位，不能永久卡住。",
      "scope": "保存、聊天、生成",
      "check": "双击、连续Enter、失败、超时及取消后检查按钮。",
      "authority": "confirmed"
    },
    {
      "id": "async.timeout",
      "category": "聊天与异步",
      "title": "超时与状态同步有界",
      "rule": "每个等待有超时；本地状态同步有界，隐藏／离开停止；不虚构完成百分比。",
      "scope": "请求、轮询",
      "check": "模拟不返回与状态失败，确保可取消并结束等待。",
      "authority": "confirmed"
    },
    {
      "id": "async.late",
      "category": "聊天与异步",
      "title": "隔离迟到响应",
      "rule": "清空、取消、导航或会话切换后，旧响应不可进入新会话或覆盖新草稿。",
      "scope": "异步聊天与编辑",
      "check": "旧请求延迟返回后新会话应保持不变。",
      "authority": "confirmed"
    },
    {
      "id": "async.unknown",
      "category": "聊天与异步",
      "title": "未知结果不自动重试",
      "rule": "保留未知记录和累计成本；不能清账伪成功。仅用户明确确认旧风险后才允许新请求，旧请求不重试。",
      "scope": "可能收费的未知结果",
      "check": "未知态不得自动提交；检查风险确认前后账本保留。",
      "authority": "confirmed"
    },
    {
      "id": "async.local-status",
      "category": "聊天与异步",
      "title": "本地状态刷新不冒充查账",
      "rule": "正常状态自动有界同步；异常才显示紧凑“刷新请求状态”，标明仅本地记录，不查询供应商账单、不生成。",
      "scope": "任务状态区",
      "check": "观察入口显隐及网络目标；点击不新增生成请求。",
      "authority": "confirmed"
    },
    {
      "id": "chat.isolation",
      "category": "聊天与异步",
      "title": "测试与正式记录隔离",
      "rule": "无痕测试不写正式记忆、成长或对象档案；临时附件和对话按声明的生命周期清理。",
      "scope": "沙盒聊天",
      "check": "使用合成输入核对正式写入0及清空流程。",
      "authority": "confirmed"
    },
    {
      "id": "theme.persist",
      "category": "主题与可访问性",
      "title": "明暗选择本机持久化",
      "rule": "无保存值跟随系统；手动选择优先，刷新和下次打开恢复，首屏绘制前应用以防白闪。",
      "scope": "支持明暗模式的工具",
      "check": "切换、刷新；系统偏好变化不覆盖手动选择。",
      "authority": "confirmed"
    },
    {
      "id": "theme.coverage",
      "category": "主题与可访问性",
      "title": "主题覆盖所有组件",
      "rule": "统一citrus-theme.css tokens覆盖浅色柠檬乳白/青柠黄绿与深色深绿黑/柔和黄绿；组件、输入、导航和弹层保持对比，不给图片加滤镜，不重置原主题偏好。",
      "scope": "全界面主题",
      "check": "逐个检查对比和浮层，不出现突兀白底。",
      "authority": "confirmed"
    },
    {
      "id": "a11y.mobile",
      "category": "主题与可访问性",
      "title": "390／320不溢出",
      "rule": "窄屏无横向溢出；浮层、长文可滚动，操作目标足够大且不遮关键图标。",
      "scope": "移动端",
      "check": "在390和320检查长内容、工具栏和确认。",
      "authority": "confirmed"
    },
    {
      "id": "a11y.keyboard",
      "category": "主题与可访问性",
      "title": "键盘与安全焦点",
      "rule": "按钮可键盘操作，focus明显；弹层Tab范围正确，Esc关闭并回到触发图标，避免跳页。",
      "scope": "表单、选择器、浮层",
      "check": "仅使用Tab、Enter、Esc完整操作一次。",
      "authority": "confirmed"
    },
    {
      "id": "advice.contrast",
      "category": "建议验收",
      "title": "量化对比度",
      "rule": "建议正文对比度至少4.5:1，大字及图形控件至少3:1；这是通用验收建议。",
      "scope": "设计与无障碍审查",
      "check": "使用对比度工具检查明暗两种主题。",
      "authority": "recommended"
    },
    {
      "id": "advice.motion",
      "category": "建议验收",
      "title": "尊重低动态偏好",
      "rule": "建议遵守 prefers-reduced-motion，停止隐藏页动画并提供静态降级。",
      "scope": "动画、3D及动效",
      "check": "切换系统低动态及隐藏页面检查。",
      "authority": "recommended"
    },
    {
      "id": "advice.touch",
      "category": "建议验收",
      "title": "触控与错误关联",
      "rule": "建议交互目标至少44px；字段错误与输入关联，焦点移到有意义的错误位置且不丢草稿。",
      "scope": "触屏表单",
      "check": "触控操作及读屏检查错误关联。",
      "authority": "recommended"
    },
    {
      "id": "image.grid",
      "category": "图片浏览",
      "title": "相册四档排列密度",
      "rule": "桌面大2列、中4列默认、标准6列、小8列；窄屏900px及以下最多4列、700px及以下最多2列、350px及以下1列，显示实际列数并保留选择。至少8张示例，原图不变。",
      "scope": "独立图片结果区；聊天流不强制网格",
      "check": "桌面逐档测列数；手机测上限；两种缩略图模式同格、查看器不受影响。",
      "authority": "confirmed"
    },
    {
      "id": "image.thumbnails",
      "category": "图片浏览",
      "title": "方形／原比例切换",
      "rule": "两种模式外层均保持相同正方形格子及网格位置。方形按 cover 等比铺满裁切，原比例按 contain 完整等比抵边居中留白，不拉伸图片、不改变原图。切换只对框内图片内容做 420ms cubic-bezier(.2,.7,.2,1) 非线性缩放；固定使用 contain 加可插值 transform 表达两种适配，不对离散 object-fit 过渡。快速反向从当前动画状态继续，图片加载和容器尺寸变化后重新适配，首次显示无闪跳；prefers-reduced-motion:reduce 时立即切换。",
      "scope": "相册缩略图",
      "check": "横图、竖图、正方图验证 cover/contain 终点、连续中间帧及快速反向；切换全程格子尺寸、位置和卡片高度不变，原比例图长边抵边、短边居中留白。验证 load、resize、四档密度、手机与明暗主题；减少动态效果下无过渡；双击/Enter 全屏、滚轮缩放、空白/Esc 关闭不变。",
      "authority": "confirmed"
    },
    {
      "id": "image.viewer",
      "category": "图片浏览",
      "title": "双击全屏、滚轮缩放",
      "rule": "双击或Enter进入覆盖视口查看器；滚轮以合理锚点缩放，限制上下界，放大后可拖动；触屏提供明确缩放按钮。",
      "scope": "缩略图与聊天图片",
      "check": "双击、Enter、滚轮、按钮、拖动并验证1–6倍限制。",
      "authority": "confirmed"
    },
    {
      "id": "image.close",
      "category": "图片浏览",
      "title": "空白关闭，不误关",
      "rule": "图片外空白、Esc或关闭按钮退出；点击图片本身及拖动后不得误关闭。打开锁背景滚动，退出恢复滚动和触发焦点。",
      "scope": "全屏查看器",
      "check": "点图、拖动、点空白、Esc，重复打开检查焦点与滚动。",
      "authority": "confirmed"
    },
    {
      "id": "layout.wide",
      "category": "导航与布局",
      "title": "合理使用4K宽度",
      "rule": "宽屏用响应式容器和网格使用可用宽度，字体不等比放大，正文限制行长；1920/2560/3840及390/320均无溢出。",
      "scope": "组件参考页与宽屏工具",
      "check": "测量容器宽度与多列布局；窄屏折叠，不横向溢出。",
      "authority": "confirmed"
    },
    {
      "id": "icons.local-registry",
      "category": "图标查询",
      "title": "本项目图标可查询复用",
      "rule": "汇总实际项目已出现的UI图标，按名称/标识查询并复制SVG或标识；注册表与展示同源，不引入无关图标全集，不包含角色私有图片。",
      "scope": "Citrus图标查询及后续组件",
      "check": "核对来源、搜索/空态、复制成功/失败反馈与无障碍名称。",
      "authority": "confirmed"
    },
    {
      "id": "icons.neutral-vector-export",
      "category": "图标查询",
      "title": "去色矢量与应用配色分离",
      "rule": "UI Ref 保存和复制的图标为透明、无固定配色的矢量：fill none、stroke currentColor。实际界面的红底白线等由容器和CSS提供，不写入通用SVG。品牌、查询预览、复制与矢量资产同源；Citrus柠檬和红狼品牌为不同图标。",
      "scope": "Citrus图标库、品牌图标及其他复用图标",
      "check": "检查复制SVG和资产无色底/固定红白，24/48px线条清楚，应用容器配色不污染导出。",
      "authority": "confirmed"
    },
    {
      "id": "components.canonical-build-sync",
      "category": "界面总则",
      "title": "参考库与应用同源同步",
      "rule": "应用采用Citrus交互时使用共享组件或明确的离线构建同步源，避免品牌/预览/复制SVG和实际应用各自手改。顶部收折要协调文字opacity、尺寸与位置缓变，保留选中项/焦点和布局占位；支持短页滚轮，排除表单、内滚动、弹层和图片缩放。应用保留自己的主题与业务，不复制演示专用分类或模型配置。",
      "scope": "档案室与后续复用Citrus的界面",
      "check": "检查构建来源/校验元数据；实际验收桌面/4K短页/手机、反向恢复、焦点、无跳页及既有编辑/相册/异步行为。",
      "authority": "confirmed"
    }
  ]
}
