{
  "_meta": {
    "title": "Component Affordances — AI 组合组件语义层 (SoT)",
    "purpose": "让 AI 在设计产品（生成 Vue 代码 / 生成 Figma mockup）时，先知道每个 canonical 组件内置了什么能力，避免把已有组件（如 InputNumber 的 step / DropDownListSelect 的 multi）拆开自己用 primitive 拼。对标图标的 affordance-categories.json：图标解决「别自画 SVG」，本文件解决「别自拼组合组件」。",
    "is_source_of_truth": true,
    "generated_view": "docs/internal/component-affordances.md（由 `pnpm generate:component-affordances` 生成，勿手改）",
    "audited_by": "pnpm audit:component-affordances（校验 code_name 存在 + 双向覆盖 canonical/ + npm_export 与 canonical/index.ts 一致 + code_props 真实存在于 defineProps）",
    "source_refs": {
      "canonical_components": "src/canonical/*.vue",
      "npm_exports": "src/canonical/index.ts",
      "figma_manifest": "figma-data/normalized/components.manifest.json",
      "mockup_catalog": "docs/internal/figma-component-catalog.md（mockup 任务专属：library key / frame used-by / extension scenarios）"
    },
    "field_docs": {
      "code_name": "canonical 组件名 = src/canonical/<code_name>.vue",
      "npm_export": "npm 包公开导出名（消费方 `import { <npm_export> }`）；null = 内部 base 组件，不直接消费",
      "figma_name": "Figma 组件名（取自该 canonical 的 data-figma-component）",
      "category": "form-input | data-display | navigation | feedback | general",
      "built_in_features": "★ 核心。该组件已内置、AI 容易没看到而去自拼的能力 → controlled_by 指明用哪个 prop/轴开",
      "do_not_hand_compose": "★ 反模式：别用什么 primitive 自拼，应该用本组件的哪个能力",
      "composition": "组合关系：contained_by = 通常被谁包；contains = 内部用了哪些 canonical 组件",
      "code_props": "公开 props（实证自 defineProps）；audit 校验存在性",
      "status": "verified = 语义已填实并核对 props；skeleton = 仅基础信息"
    },
    "last_authored": "2026-06-01",
    "authored_by": "Claude Code (plan owner)"
  },
  "components": [
    {
      "code_name": "InputNumber",
      "npm_export": "InputNumber",
      "figma_name": "InputNumber",
      "category": "form-input",
      "summary": "数字步进输入框（spinbox）—— 输入框 + 内置加减按钮 + 上下界约束。",
      "synonyms_en": [
        "number input",
        "stepper",
        "spinbox",
        "spinner",
        "quantity input",
        "numeric field",
        "counter input"
      ],
      "synonyms_zh": [
        "数字输入框",
        "步进器",
        "数量输入",
        "计数器",
        "数值输入"
      ],
      "when_to_use": "需要受约束的整数/数值录入并希望提供加减微调时（如数量、并发数、时长）。需要连续区间拖动用 Slider。",
      "built_in_features": [
        {
          "feature": "加减步进按钮（+/-）",
          "controlled_by": "组件自带，无需外接按钮；步长用 prop:step（默认 1）"
        },
        {
          "feature": "上下界约束",
          "controlled_by": "prop:min（默认 0）/ prop:max（默认 10），到界自动禁用对应按钮"
        },
        {
          "feature": "只增 / 只减 / 只读形态",
          "controlled_by": "prop:property1 = Default | Only Add | Only Reduce | Readonly"
        },
        {
          "feature": "禁用态",
          "controlled_by": "prop:disabled"
        }
      ],
      "do_not_hand_compose": "别用 InputBox + 两个 Button(+/-) 自拼步进器，也别用裸 <input type=number>。直接用 InputNumber，步长/边界走 step/min/max，单向用 type=Only Add|Only Reduce。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "number"
        },
        {
          "name": "type",
          "type": "Default | Only Add | Only Reduce | Readonly",
          "default": "Default"
        },
        {
          "name": "min",
          "type": "number",
          "default": 0
        },
        {
          "name": "max",
          "type": "number",
          "default": 10
        },
        {
          "name": "step",
          "type": "number",
          "default": 1
        },
        {
          "name": "disabled",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { InputNumber } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Slider",
        "InputBoxLine"
      ],
      "status": "verified"
    },
    {
      "code_name": "Slider",
      "npm_export": "Slider",
      "figma_name": "Slider",
      "category": "form-input",
      "summary": "连续数值滑块 —— 拖动选值 + 内置 step/min/max + 可选数值显示。",
      "synonyms_en": [
        "slider",
        "range",
        "range input",
        "track",
        "volume control",
        "seek bar"
      ],
      "synonyms_zh": [
        "滑块",
        "滑动条",
        "区间选择",
        "音量条",
        "进度拖拽"
      ],
      "when_to_use": "在连续区间内选一个值、且拖动比键入更自然时（音量、亮度、百分比）。需要精确键入用 InputNumber。",
      "built_in_features": [
        {
          "feature": "步进 / 区间",
          "controlled_by": "prop:step / prop:min / prop:max"
        },
        {
          "feature": "当前值显示",
          "controlled_by": "prop:showValue（默认 true）"
        },
        {
          "feature": "尺寸 / 主题",
          "controlled_by": "prop:size = M ... / prop:theme = dark|light"
        },
        {
          "feature": "禁用态",
          "controlled_by": "prop:disabled"
        }
      ],
      "do_not_hand_compose": "别用 <input type=range> 裸控件或自画轨道+滑块 div。用 Slider，值标签走 showValue 而非外接一个 <span>。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "number",
          "default": 60
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "theme",
          "type": "dark | light",
          "default": "dark"
        },
        {
          "name": "min",
          "type": "number",
          "default": 0
        },
        {
          "name": "max",
          "type": "number",
          "default": 100
        },
        {
          "name": "step",
          "type": "number",
          "default": 1
        },
        {
          "name": "showValue",
          "type": "boolean",
          "default": true
        },
        {
          "name": "disabled",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { Slider } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "InputNumber",
        "Progress"
      ],
      "status": "verified"
    },
    {
      "code_name": "DropDownListSelect",
      "npm_export": "DropDownListSelect",
      "figma_name": "Drop down List/Select",
      "category": "form-input",
      "summary": "下拉列表面板 —— 渲染 items 列表，支持单选/多选/操作列表/排序四种列表语义，内置键盘 roving focus。",
      "synonyms_en": [
        "dropdown",
        "dropdown list",
        "listbox",
        "option list",
        "menu list",
        "multi select list",
        "operation list"
      ],
      "synonyms_zh": [
        "下拉列表",
        "下拉面板",
        "选项列表",
        "多选列表",
        "操作菜单",
        "排序菜单"
      ],
      "when_to_use": "需要展示一组可选行（单选/多选/带勾选/操作项）。整体「输入框+下拉」选择器用 SelectBoxLine/Filled；本组件是下拉里的列表面板本体。",
      "built_in_features": [
        {
          "feature": "列表语义（单选/多选/操作/排序）",
          "controlled_by": "prop:type = Radio | Multi | Operation List | Sort By"
        },
        {
          "feature": "多选勾选标记",
          "controlled_by": "type=Multi 时内置勾选，无需手撸 <span class=check>（见 CANONICAL-012）"
        },
        {
          "feature": "禁用单项",
          "controlled_by": "items[].disabled"
        },
        {
          "feature": "键盘 roving focus + aria-activedescendant",
          "controlled_by": "组件内置（CANONICAL-016），无需自管 tabindex"
        }
      ],
      "do_not_hand_compose": "别用 <ul><li> + 自撸勾选 <span> 拼下拉列表，也别给每行自管 tabindex。用 DropDownListSelect，多选走 type=Multi（勾选已内置），禁用项走 items[].disabled。",
      "composition": {
        "contained_by": [
          "SelectBoxBase",
          "SelectBoxLine",
          "SelectBoxFilled"
        ],
        "contains": [
          "CheckBox"
        ]
      },
      "code_props": [
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "type",
          "type": "Radio | Multi | Operation List | Sort By",
          "default": "Radio"
        },
        {
          "name": "items",
          "type": "readonly Item[]",
          "default": "[]"
        }
      ],
      "key_events": [
        "select",
        "close"
      ],
      "code_import": "import { DropDownListSelect } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "SelectBoxLine",
        "SelectBoxFilled",
        "CheckBox"
      ],
      "status": "verified"
    },
    {
      "code_name": "SelectBoxBase",
      "npm_export": null,
      "figma_name": "select box/{variant}",
      "category": "form-input",
      "summary": "下拉选择器底层实现（输入框 + 下拉面板）。内部 base，消费方请用 SelectBoxLine / SelectBoxFilled。",
      "synonyms_en": [
        "select",
        "select box",
        "combobox base"
      ],
      "synonyms_zh": [
        "选择器底层",
        "下拉选择基类"
      ],
      "when_to_use": "内部 base 组件，不直接消费。需要 select 时用 SelectBoxLine（线框）或 SelectBoxFilled（填充）。",
      "built_in_features": [
        {
          "feature": "单选/多选",
          "controlled_by": "prop:multiple 或 status=multi select"
        },
        {
          "feature": "可编辑（搜索/筛选）",
          "controlled_by": "prop:editable 或 ux=editable"
        },
        {
          "feature": "线框/填充形态",
          "controlled_by": "prop:variant = line | filled"
        }
      ],
      "do_not_hand_compose": "不要直接 import SelectBoxBase。用 SelectBoxLine / SelectBoxFilled。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": [
          "DropDownListSelect"
        ]
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string | number | Array<string|number>"
        },
        {
          "name": "options",
          "type": "Option[]",
          "default": "[]"
        },
        {
          "name": "variant",
          "type": "line | filled",
          "default": "line"
        },
        {
          "name": "multiple",
          "type": "boolean",
          "default": false
        },
        {
          "name": "editable",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "default"
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": null,
      "related": [
        "SelectBoxLine",
        "SelectBoxFilled",
        "DropDownListSelect"
      ],
      "status": "verified"
    },
    {
      "code_name": "SelectBoxLine",
      "npm_export": "SelectBoxLine",
      "figma_name": "select box/line",
      "category": "form-input",
      "summary": "线框下拉选择器（输入框 + 下拉面板，单选/多选/可搜索）。",
      "synonyms_en": [
        "select",
        "select box",
        "combobox",
        "dropdown select",
        "picker"
      ],
      "synonyms_zh": [
        "选择器",
        "下拉框",
        "下拉选择",
        "选择框"
      ],
      "when_to_use": "从选项中选一个或多个值，线框（透明底）风格。深底填充风格用 SelectBoxFilled。",
      "built_in_features": [
        {
          "feature": "多选",
          "controlled_by": "prop:multiple（内置多选 chip + 勾选）"
        },
        {
          "feature": "可编辑/搜索",
          "controlled_by": "prop:editable"
        },
        {
          "feature": "尺寸 / 状态 / 禁用",
          "controlled_by": "prop:size / prop:status / prop:enable"
        }
      ],
      "do_not_hand_compose": "别用 input + 浮层 div + 自撸 chip 拼 select。用 SelectBoxLine，多选走 multiple（chip 与勾选已内置），可搜索走 editable。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": [
          "DropDownListSelect"
        ]
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string | number | Array<string|number>"
        },
        {
          "name": "options",
          "type": "{label;value}[]",
          "default": "[]"
        },
        {
          "name": "multiple",
          "type": "boolean",
          "default": false
        },
        {
          "name": "editable",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "default"
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { SelectBoxLine } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "SelectBoxFilled",
        "DropDownListSelect",
        "InputBoxLine"
      ],
      "status": "verified"
    },
    {
      "code_name": "SelectBoxFilled",
      "npm_export": "SelectBoxFilled",
      "figma_name": "select box/filled",
      "category": "form-input",
      "summary": "填充底下拉选择器（输入框 + 下拉面板，单选/多选/可搜索）。",
      "synonyms_en": [
        "select",
        "select box",
        "combobox",
        "dropdown select",
        "filled select"
      ],
      "synonyms_zh": [
        "选择器",
        "下拉框",
        "填充选择框"
      ],
      "when_to_use": "从选项中选值，填充（深底）风格。透明线框风格用 SelectBoxLine。",
      "built_in_features": [
        {
          "feature": "多选",
          "controlled_by": "prop:multiple"
        },
        {
          "feature": "可编辑/搜索",
          "controlled_by": "prop:editable"
        },
        {
          "feature": "尺寸 / 状态 / 禁用",
          "controlled_by": "prop:size / prop:status / prop:enable"
        }
      ],
      "do_not_hand_compose": "同 SelectBoxLine：别自拼 select，用本组件 + multiple/editable。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": [
          "DropDownListSelect"
        ]
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string | number | Array<string|number>"
        },
        {
          "name": "options",
          "type": "{label;value}[]",
          "default": "[]"
        },
        {
          "name": "multiple",
          "type": "boolean",
          "default": false
        },
        {
          "name": "editable",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "default"
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { SelectBoxFilled } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "SelectBoxLine",
        "DropDownListSelect",
        "InputBoxFilled"
      ],
      "status": "verified"
    },
    {
      "code_name": "InputBoxBase",
      "npm_export": null,
      "figma_name": "input box/{variant}",
      "category": "form-input",
      "summary": "文本输入框底层实现。内部 base，消费方请用 InputBoxLine / InputBoxFilled。",
      "synonyms_en": [
        "input",
        "text input",
        "text field",
        "input base"
      ],
      "synonyms_zh": [
        "输入框底层",
        "文本输入基类"
      ],
      "when_to_use": "内部 base，不直接消费。需要文本输入用 InputBoxLine（线框）或 InputBoxFilled（填充）。",
      "built_in_features": [
        {
          "feature": "线框/填充",
          "controlled_by": "prop:variant = line | filled"
        },
        {
          "feature": "清除按钮 / feature 图标",
          "controlled_by": "prop:feature = yes（配合 ux=click 显示 clear）"
        },
        {
          "feature": "只读 / 禁用",
          "controlled_by": "prop:readonly / prop:enable"
        }
      ],
      "do_not_hand_compose": "不要直接 import InputBoxBase。用 InputBoxLine / InputBoxFilled。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string",
          "default": ""
        },
        {
          "name": "variant",
          "type": "line | filled",
          "default": "line"
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "no"
        },
        {
          "name": "readonly",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": null,
      "related": [
        "InputBoxLine",
        "InputBoxFilled"
      ],
      "status": "verified"
    },
    {
      "code_name": "InputBoxLine",
      "npm_export": "InputBoxLine",
      "figma_name": "input box/line",
      "category": "form-input",
      "summary": "线框文本输入框（透明底 + 下划线/边框）。",
      "synonyms_en": [
        "input",
        "text input",
        "text field",
        "line input",
        "underline input"
      ],
      "synonyms_zh": [
        "输入框",
        "文本框",
        "线框输入框"
      ],
      "when_to_use": "单行文本录入，线框风格。深底填充风格用 InputBoxFilled；数值用 InputNumber。",
      "built_in_features": [
        {
          "feature": "清除按钮",
          "controlled_by": "prop:feature=yes + ux=click（有值时显示 clear）"
        },
        {
          "feature": "尺寸 / 状态 / 只读 / 禁用",
          "controlled_by": "prop:size / prop:status / prop:readonly / prop:enable"
        }
      ],
      "do_not_hand_compose": "别用裸 <input> + 自定义边框样式。用 InputBoxLine，清除图标走 feature=yes 而非外接一个 close icon。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string",
          "default": ""
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "no"
        },
        {
          "name": "readonly",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { InputBoxLine } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "InputBoxFilled",
        "InputNumber",
        "SelectBoxLine"
      ],
      "status": "verified"
    },
    {
      "code_name": "InputBoxFilled",
      "npm_export": "InputBoxFilled",
      "figma_name": "input box/filled",
      "category": "form-input",
      "summary": "填充底文本输入框（深底）。",
      "synonyms_en": [
        "input",
        "text input",
        "text field",
        "filled input"
      ],
      "synonyms_zh": [
        "输入框",
        "文本框",
        "填充输入框"
      ],
      "when_to_use": "单行文本录入，填充风格。透明线框风格用 InputBoxLine。",
      "built_in_features": [
        {
          "feature": "清除按钮",
          "controlled_by": "prop:feature=yes + ux=click"
        },
        {
          "feature": "尺寸 / 状态 / 只读 / 禁用",
          "controlled_by": "prop:size / prop:status / prop:readonly / prop:enable"
        }
      ],
      "do_not_hand_compose": "同 InputBoxLine：别自拼输入框，用本组件。",
      "composition": {
        "contained_by": [
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string",
          "default": ""
        },
        {
          "name": "placeholder",
          "type": "string",
          "default": ""
        },
        {
          "name": "feature",
          "type": "Feature",
          "default": "no"
        },
        {
          "name": "readonly",
          "type": "boolean",
          "default": false
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "on"
        },
        {
          "name": "ux",
          "type": "UX",
          "default": "default"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { InputBoxFilled } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "InputBoxLine",
        "InputNumber",
        "SelectBoxFilled"
      ],
      "status": "verified"
    },
    {
      "code_name": "FormItem",
      "npm_export": "FormItem",
      "figma_name": "FormItem",
      "category": "form-input",
      "summary": "表单行容器 —— label + 控件插槽 + required 星号 + error/hint 文案 + 布局对齐。",
      "synonyms_en": [
        "form item",
        "form field",
        "form row",
        "field wrapper",
        "label input group"
      ],
      "synonyms_zh": [
        "表单项",
        "表单行",
        "字段",
        "标签输入组",
        "表单字段"
      ],
      "when_to_use": "给任意表单控件加标签、必填标记、错误/提示文案并统一对齐。包裹 InputBox / SelectBox / InputNumber 等。",
      "built_in_features": [
        {
          "feature": "标签 + 必填星号",
          "controlled_by": "prop:label / prop:required"
        },
        {
          "feature": "错误 / 提示文案",
          "controlled_by": "prop:error / prop:hint（无需自己加一行红字 <span>）"
        },
        {
          "feature": "标签宽度 + 单/双行布局",
          "controlled_by": "prop:labelWidth / prop:layout"
        },
        {
          "feature": "label 命名插槽（富标签）",
          "controlled_by": "#label slot（v0.4.0 dual-form）"
        }
      ],
      "do_not_hand_compose": "别用 <label> + 控件 + 红字 <div> 手拼表单行。用 FormItem 包控件，必填走 required，报错走 error，对齐走 labelWidth/layout。",
      "composition": {
        "contained_by": [],
        "contains": [
          "InputBoxLine",
          "InputBoxFilled",
          "InputNumber",
          "SelectBoxLine",
          "SelectBoxFilled",
          "CheckBox",
          "Radio",
          "Switch"
        ]
      },
      "code_props": [
        {
          "name": "label",
          "type": "string",
          "default": "Form Label"
        },
        {
          "name": "required",
          "type": "boolean",
          "default": false
        },
        {
          "name": "error",
          "type": "string"
        },
        {
          "name": "hint",
          "type": "string",
          "default": ""
        },
        {
          "name": "labelWidth",
          "type": "LabelWidth",
          "default": "120 px"
        },
        {
          "name": "layout",
          "type": "Layout",
          "default": "1 line"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "Normal"
        },
        {
          "name": "theme",
          "type": "Theme",
          "default": "Dark"
        },
        {
          "name": "type",
          "type": "Type",
          "default": "Label & Input"
        }
      ],
      "key_events": [],
      "code_import": "import { FormItem } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "InputBoxLine",
        "SelectBoxLine",
        "InputNumber"
      ],
      "status": "verified"
    },
    {
      "code_name": "CheckBox",
      "npm_export": "CheckBox",
      "figma_name": "check box",
      "category": "form-input",
      "summary": "复选框 —— 勾选/未勾选/半选三态，支持只读展示态。",
      "synonyms_en": [
        "checkbox",
        "check",
        "tick box",
        "multi select toggle",
        "indeterminate"
      ],
      "synonyms_zh": [
        "复选框",
        "勾选框",
        "多选",
        "半选"
      ],
      "when_to_use": "布尔多选 / 三态勾选。下拉列表里的勾选请用 DropDownListSelect type=Multi（已内置 CheckBox）。",
      "built_in_features": [
        {
          "feature": "三态（勾/未勾/半选）",
          "controlled_by": "prop:status = on | off | some"
        },
        {
          "feature": "只读展示态",
          "controlled_by": "prop:readonly（行本身是点击目标时用，CANONICAL-012）"
        },
        {
          "feature": "禁用态",
          "controlled_by": "prop:enable = no"
        }
      ],
      "do_not_hand_compose": "别用裸 <input type=checkbox> 或自画方块+对勾。用 CheckBox，半选走 status=some，纯展示走 readonly。",
      "composition": {
        "contained_by": [
          "FormItem",
          "DropDownListSelect",
          "Table"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "status",
          "type": "on | off | some",
          "default": "off"
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "yes"
        },
        {
          "name": "readonly",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [
        "update:status"
      ],
      "code_import": "import { CheckBox } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Radio",
        "Switch",
        "DropDownListSelect"
      ],
      "status": "verified"
    },
    {
      "code_name": "Radio",
      "npm_export": "Radio",
      "figma_name": "radio",
      "category": "form-input",
      "summary": "单选按钮 —— 选中/未选中两态。",
      "synonyms_en": [
        "radio",
        "radio button",
        "option button",
        "single select"
      ],
      "synonyms_zh": [
        "单选按钮",
        "单选框",
        "单选"
      ],
      "when_to_use": "一组互斥选项里选一个。下拉里的单选用 DropDownListSelect type=Radio。",
      "built_in_features": [
        {
          "feature": "选中态",
          "controlled_by": "prop:status = on | off"
        },
        {
          "feature": "禁用态",
          "controlled_by": "prop:enable = no"
        }
      ],
      "do_not_hand_compose": "别用裸 <input type=radio> 或自画圆圈。用 Radio，选中走 status=on。",
      "composition": {
        "contained_by": [
          "FormItem",
          "DropDownListSelect"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "status",
          "type": "on | off",
          "default": "off"
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "yes"
        }
      ],
      "key_events": [
        "update:status"
      ],
      "code_import": "import { Radio } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "CheckBox",
        "Switch"
      ],
      "status": "verified"
    },
    {
      "code_name": "Switch",
      "npm_export": "Switch",
      "figma_name": "switch",
      "category": "form-input",
      "summary": "开关 —— 开/关/直播(live) 态 + 内置 loading。",
      "synonyms_en": [
        "switch",
        "toggle",
        "on off",
        "toggle switch"
      ],
      "synonyms_zh": [
        "开关",
        "切换",
        "拨动开关",
        "切换开关"
      ],
      "when_to_use": "即时生效的布尔开关（启用/停用某功能）。需要确认后才生效的多选用 CheckBox。",
      "built_in_features": [
        {
          "feature": "开/关/直播态",
          "controlled_by": "prop:status = on | off | live"
        },
        {
          "feature": "加载中（异步切换）",
          "controlled_by": "prop:loading = yes（无需外接 spinner）"
        },
        {
          "feature": "禁用态",
          "controlled_by": "prop:enable = no"
        }
      ],
      "do_not_hand_compose": "别用 div + transition 自画拨钮，也别在切换时外接一个 spinner。用 Switch，异步等待走 loading=yes。",
      "composition": {
        "contained_by": [
          "FormItem",
          "Table"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "status",
          "type": "on | off | live",
          "default": "off"
        },
        {
          "name": "loading",
          "type": "yes | no",
          "default": "no"
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "on"
        },
        {
          "name": "enable",
          "type": "Enable",
          "default": "yes"
        }
      ],
      "key_events": [
        "update:status"
      ],
      "code_import": "import { Switch } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "CheckBox",
        "Radio"
      ],
      "status": "verified"
    },
    {
      "code_name": "Rating",
      "npm_export": "Rating",
      "figma_name": "Rating",
      "category": "form-input",
      "summary": "星级评分 —— 显示/选择 1-5 星，默认只读。",
      "synonyms_en": [
        "rating",
        "stars",
        "star rating",
        "score"
      ],
      "synonyms_zh": [
        "评分",
        "星级",
        "打分",
        "星星"
      ],
      "when_to_use": "展示或采集星级评分。",
      "built_in_features": [
        {
          "feature": "星值",
          "controlled_by": "prop:value（'1'..'5'）"
        },
        {
          "feature": "只读/可选",
          "controlled_by": "prop:readonly（默认 true 只读）"
        }
      ],
      "do_not_hand_compose": "别用循环画 star 图标拼评分。用 Rating，值走 value，可交互走 readonly=false。",
      "composition": {
        "contained_by": [
          "Table",
          "FormItem"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "value",
          "type": "'1' | '2' | '3' | '4' | '5'",
          "default": "1"
        },
        {
          "name": "readonly",
          "type": "boolean",
          "default": true
        }
      ],
      "key_events": [
        "update:value"
      ],
      "code_import": "import { Rating } from '@nancyzeng0210/tvu-design-system'",
      "related": [],
      "status": "verified"
    },
    {
      "code_name": "Table",
      "npm_export": "Table",
      "figma_name": "Table",
      "category": "data-display",
      "summary": "数据表格 —— 列定义 + 数据驱动渲染 + 对齐 + 斑马纹；分页请配 Pagination。",
      "synonyms_en": [
        "table",
        "data table",
        "grid",
        "datagrid",
        "list table"
      ],
      "synonyms_zh": [
        "表格",
        "数据表",
        "列表表格",
        "数据网格"
      ],
      "when_to_use": "结构化行列数据展示。分页用 Pagination 配合（不要 Table 内自实现）。",
      "built_in_features": [
        {
          "feature": "列定义 + 数据驱动",
          "controlled_by": "prop:columns / prop:data（无需手写 <tr><td>）"
        },
        {
          "feature": "对齐",
          "controlled_by": "prop:align（列可单独 column.align 覆盖）"
        },
        {
          "feature": "斑马纹",
          "controlled_by": "prop:striped"
        },
        {
          "feature": "表头形态",
          "controlled_by": "prop:type"
        }
      ],
      "do_not_hand_compose": "别手写 <table><thead><tbody> 拼数据表。用 Table，列走 columns、数据走 data；分页另配 Pagination。",
      "composition": {
        "contained_by": [],
        "contains": [
          "Pagination",
          "Badge",
          "Switch",
          "CheckBox",
          "Rating"
        ]
      },
      "code_props": [
        {
          "name": "columns",
          "type": "readonly TableColumn[]",
          "default": "[]"
        },
        {
          "name": "data",
          "type": "Record<string,unknown>[]",
          "default": "[]"
        },
        {
          "name": "align",
          "type": "Align",
          "default": "Center"
        },
        {
          "name": "type",
          "type": "Type",
          "default": "Header"
        },
        {
          "name": "striped",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [],
      "code_import": "import { Table } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Pagination"
      ],
      "status": "verified"
    },
    {
      "code_name": "Pagination",
      "npm_export": "Pagination",
      "figma_name": "Pagination",
      "category": "navigation",
      "summary": "分页器 —— 页码导航 + 总数/页大小驱动，支持经典/其它形态。",
      "synonyms_en": [
        "pagination",
        "pager",
        "page nav",
        "page navigation"
      ],
      "synonyms_zh": [
        "分页",
        "分页器",
        "翻页",
        "页码"
      ],
      "when_to_use": "长列表 / 表格分页。通常放 Table 下方。",
      "built_in_features": [
        {
          "feature": "页码计算",
          "controlled_by": "prop:total / prop:pageSize（自动算页数）"
        },
        {
          "feature": "当前页双向绑定",
          "controlled_by": "v-model（update:modelValue）"
        },
        {
          "feature": "形态",
          "controlled_by": "prop:type = Classic | ..."
        }
      ],
      "do_not_hand_compose": "别用 button 列表自拼页码。用 Pagination，页数由 total/pageSize 自动算，当前页 v-model。",
      "composition": {
        "contained_by": [
          "Table"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "number",
          "default": 3
        },
        {
          "name": "total",
          "type": "number",
          "default": 120
        },
        {
          "name": "pageSize",
          "type": "number",
          "default": 10
        },
        {
          "name": "type",
          "type": "Type",
          "default": "Classic"
        }
      ],
      "key_events": [
        "update:modelValue",
        "update:pageSize"
      ],
      "code_import": "import { Pagination } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Table"
      ],
      "status": "verified"
    },
    {
      "code_name": "Tab",
      "npm_export": "Tab",
      "figma_name": "Tab",
      "category": "navigation",
      "summary": "单个 Tab 触发器（单标签）。多标签用 TabList 一次给一组。",
      "synonyms_en": [
        "tab",
        "tab trigger"
      ],
      "synonyms_zh": [
        "标签页",
        "选项卡",
        "单个标签"
      ],
      "when_to_use": "需要单独一个标签时。整组标签优先用 TabList（数据驱动）。",
      "built_in_features": [
        {
          "feature": "线框/文字/填充形态",
          "controlled_by": "prop:fill = Line | Text | Filled"
        },
        {
          "feature": "白/绿配色",
          "controlled_by": "prop:color = White | Green"
        }
      ],
      "do_not_hand_compose": "整组标签别用一排 button 自拼；用 TabList。单个用 Tab。",
      "composition": {
        "contained_by": [
          "TabList"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "modelValue",
          "type": "string | number",
          "default": "overview"
        },
        {
          "name": "fill",
          "type": "Line | Text | Filled",
          "default": "Line"
        },
        {
          "name": "color",
          "type": "White | Green",
          "default": "White"
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { Tab } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "TabList",
        "TabItem"
      ],
      "status": "verified"
    },
    {
      "code_name": "TabList",
      "npm_export": "TabList",
      "figma_name": "TabList",
      "category": "navigation",
      "summary": "标签组 —— items 数组驱动整组 tab，内置当前选中 v-model。",
      "synonyms_en": [
        "tabs",
        "tab list",
        "tab bar",
        "tab group",
        "segmented"
      ],
      "synonyms_zh": [
        "标签组",
        "选项卡组",
        "标签栏",
        "分段切换"
      ],
      "when_to_use": "一组互斥视图切换。这是 tab 的首选入口（数据驱动整组）。",
      "built_in_features": [
        {
          "feature": "整组渲染",
          "controlled_by": "prop:items（[{label,value,disabled?}]）"
        },
        {
          "feature": "当前选中双向绑定",
          "controlled_by": "v-model（update:modelValue）"
        },
        {
          "feature": "形态",
          "controlled_by": "prop:fill = Line | Text | Filled"
        }
      ],
      "do_not_hand_compose": "别用一排 button + 自管 active class 拼 tab。用 TabList，整组走 items，当前页 v-model。",
      "composition": {
        "contained_by": [],
        "contains": [
          "TabItem"
        ]
      },
      "code_props": [
        {
          "name": "items",
          "type": "{label;value;disabled?}[]"
        },
        {
          "name": "modelValue",
          "type": "string | number",
          "default": "overview"
        },
        {
          "name": "fill",
          "type": "Line | Text | Filled",
          "default": "Line"
        }
      ],
      "key_events": [
        "update:modelValue"
      ],
      "code_import": "import { TabList } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Tab",
        "TabItem"
      ],
      "status": "verified"
    },
    {
      "code_name": "TabItem",
      "npm_export": "TabItem",
      "figma_name": "TabItem",
      "category": "navigation",
      "summary": "TabList 内的单个标签项（通常由 TabList 内部渲染）。",
      "synonyms_en": [
        "tab item",
        "tab"
      ],
      "synonyms_zh": [
        "标签项",
        "单个选项卡"
      ],
      "when_to_use": "一般不直接用，由 TabList 渲染；需要细粒度控制单项时用。",
      "built_in_features": [
        {
          "feature": "普通/激活态",
          "controlled_by": "prop:state = Normal | Active"
        },
        {
          "feature": "禁用",
          "controlled_by": "prop:disabled"
        },
        {
          "feature": "形态 / 配色",
          "controlled_by": "prop:fill / prop:color"
        }
      ],
      "do_not_hand_compose": "优先用 TabList 整组；单项才用 TabItem，激活走 state=Active。",
      "composition": {
        "contained_by": [
          "TabList"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "value",
          "type": "string | number",
          "default": "overview"
        },
        {
          "name": "state",
          "type": "Normal | Active",
          "default": "Normal"
        },
        {
          "name": "color",
          "type": "White | Green",
          "default": "White"
        },
        {
          "name": "fill",
          "type": "Line | Text | Filled",
          "default": "Line"
        },
        {
          "name": "disabled",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [],
      "code_import": "import { TabItem } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "TabList",
        "Tab"
      ],
      "status": "verified"
    },
    {
      "code_name": "Breadcrumb",
      "npm_export": "Breadcrumb",
      "figma_name": "Breadcrumb/Item",
      "category": "navigation",
      "summary": "面包屑容器 —— slot 放一组 BreadcrumbItem，分隔符内置。",
      "synonyms_en": [
        "breadcrumb",
        "breadcrumbs",
        "path nav",
        "trail"
      ],
      "synonyms_zh": [
        "面包屑",
        "路径导航",
        "层级导航"
      ],
      "when_to_use": "展示当前页在层级结构中的位置路径。",
      "built_in_features": [
        {
          "feature": "分隔符",
          "controlled_by": "BreadcrumbItem.showSeparator（容器自动串联）"
        }
      ],
      "do_not_hand_compose": "别用 <a> + '/' 字符自拼路径。用 Breadcrumb 包 BreadcrumbItem，分隔符内置。",
      "composition": {
        "contained_by": [
          "TopBar"
        ],
        "contains": [
          "BreadcrumbItem"
        ]
      },
      "code_props": [],
      "key_events": [],
      "code_import": "import { Breadcrumb } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "BreadcrumbItem"
      ],
      "status": "verified"
    },
    {
      "code_name": "BreadcrumbItem",
      "npm_export": "BreadcrumbItem",
      "figma_name": "Breadcrumb/Item",
      "category": "navigation",
      "summary": "面包屑单项 —— 链接 + 状态（当前/hover/disabled）+ 分隔符开关。",
      "synonyms_en": [
        "breadcrumb item",
        "crumb",
        "path segment"
      ],
      "synonyms_zh": [
        "面包屑项",
        "路径段"
      ],
      "when_to_use": "Breadcrumb 内的每一级。最后一级通常 state=current。",
      "built_in_features": [
        {
          "feature": "状态",
          "controlled_by": "prop:state = Default | hover | current | disabled"
        },
        {
          "feature": "链接",
          "controlled_by": "prop:href"
        },
        {
          "feature": "分隔符显隐",
          "controlled_by": "prop:showSeparator（最后一项设 false）"
        }
      ],
      "do_not_hand_compose": "用 BreadcrumbItem，当前页走 state=current（不要用纯文本 + 手动去掉链接）。",
      "composition": {
        "contained_by": [
          "Breadcrumb"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "href",
          "type": "string"
        },
        {
          "name": "state",
          "type": "Default | hover | current | disabled",
          "default": "current"
        },
        {
          "name": "showSeparator",
          "type": "boolean",
          "default": true
        }
      ],
      "key_events": [],
      "code_import": "import { BreadcrumbItem } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Breadcrumb"
      ],
      "status": "verified"
    },
    {
      "code_name": "Steps",
      "npm_export": "Steps",
      "figma_name": "Step/Item",
      "category": "navigation",
      "summary": "步骤条容器 —— 横/竖方向 + 当前步 + 数字/图标样式，内部串联 StepItem。",
      "synonyms_en": [
        "steps",
        "stepper",
        "wizard",
        "progress steps",
        "stepline"
      ],
      "synonyms_zh": [
        "步骤条",
        "步骤",
        "向导",
        "流程步骤"
      ],
      "when_to_use": "多步流程/向导的进度指示。注意区别 InputNumber 的「步进」——那是数值不是流程。",
      "built_in_features": [
        {
          "feature": "当前步高亮 + 连接线",
          "controlled_by": "prop:current（连接线由容器自动算）"
        },
        {
          "feature": "横/竖方向",
          "controlled_by": "prop:direction = horizontal | vertical"
        },
        {
          "feature": "数字/图标样式",
          "controlled_by": "prop:type = number | icon"
        }
      ],
      "do_not_hand_compose": "别用 circle + 连线 div 自拼步骤条。用 Steps，当前步走 current，方向走 direction。",
      "composition": {
        "contained_by": [],
        "contains": [
          "StepItem"
        ]
      },
      "code_props": [
        {
          "name": "current",
          "type": "number",
          "default": 0
        },
        {
          "name": "active",
          "type": "number"
        },
        {
          "name": "direction",
          "type": "horizontal | vertical",
          "default": "horizontal"
        },
        {
          "name": "type",
          "type": "number | icon",
          "default": "number"
        }
      ],
      "key_events": [],
      "code_import": "import { Steps } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "StepItem"
      ],
      "status": "verified"
    },
    {
      "code_name": "StepItem",
      "npm_export": "StepItem",
      "figma_name": "Step/Item",
      "category": "navigation",
      "summary": "步骤条单步 —— 标题/描述 + 状态 + 前后连接线 + 数字/图标。",
      "synonyms_en": [
        "step item",
        "step",
        "wizard step"
      ],
      "synonyms_zh": [
        "步骤项",
        "单步"
      ],
      "when_to_use": "Steps 内的每一步；一般由 Steps 串联，需要细控时单用。",
      "built_in_features": [
        {
          "feature": "状态",
          "controlled_by": "prop:state"
        },
        {
          "feature": "前后连接线显隐",
          "controlled_by": "prop:showLeadingConnector / prop:showTrailingConnector"
        },
        {
          "feature": "图标 / 数字",
          "controlled_by": "prop:iconName / prop:type"
        }
      ],
      "do_not_hand_compose": "优先用 Steps 串联；单步才用 StepItem。",
      "composition": {
        "contained_by": [
          "Steps"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "title",
          "type": "string",
          "default": "Step Title"
        },
        {
          "name": "description",
          "type": "string",
          "default": ""
        },
        {
          "name": "index",
          "type": "number",
          "default": 0
        },
        {
          "name": "state",
          "type": "State"
        },
        {
          "name": "direction",
          "type": "Direction"
        },
        {
          "name": "type",
          "type": "StepStyle"
        },
        {
          "name": "iconName",
          "type": "string"
        },
        {
          "name": "showLeadingConnector",
          "type": "boolean",
          "default": true
        },
        {
          "name": "showTrailingConnector",
          "type": "boolean",
          "default": true
        }
      ],
      "key_events": [],
      "code_import": "import { StepItem } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Steps"
      ],
      "status": "verified"
    },
    {
      "code_name": "TopBar",
      "npm_export": "TopBar",
      "figma_name": "TopBar",
      "category": "navigation",
      "summary": "顶部应用栏 —— 标题 + 可选菜单按钮 + 可选搜索框 + 登录前/后形态。",
      "synonyms_en": [
        "top bar",
        "app bar",
        "header bar",
        "navbar",
        "title bar"
      ],
      "synonyms_zh": [
        "顶栏",
        "顶部栏",
        "应用栏",
        "导航栏",
        "标题栏"
      ],
      "when_to_use": "页面/应用顶部全局栏。",
      "built_in_features": [
        {
          "feature": "菜单按钮显隐",
          "controlled_by": "prop:showMenu"
        },
        {
          "feature": "搜索框显隐",
          "controlled_by": "prop:showSearchBox"
        },
        {
          "feature": "登录前/后形态",
          "controlled_by": "prop:tag = After Login | ..."
        }
      ],
      "do_not_hand_compose": "别用 header + flex 自拼顶栏。用 TopBar，菜单/搜索走 showMenu/showSearchBox。",
      "composition": {
        "contained_by": [],
        "contains": [
          "Breadcrumb"
        ]
      },
      "code_props": [
        {
          "name": "title",
          "type": "string",
          "default": "Product Name"
        },
        {
          "name": "tag",
          "type": "Tag",
          "default": "After Login"
        },
        {
          "name": "showMenu",
          "type": "boolean",
          "default": true
        },
        {
          "name": "showSearchBox",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [],
      "code_import": "import { TopBar } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Breadcrumb"
      ],
      "status": "verified"
    },
    {
      "code_name": "Notification",
      "npm_export": "Notification",
      "figma_name": "Notification",
      "category": "feedback",
      "summary": "通知 —— 双轴 form×type：dialog/alert/pop confirm 居中模态（按钮按 form 固定）、slide 侧边被动 toast；分类图标随 type 内置。",
      "synonyms_en": [
        "notification",
        "alert",
        "toast",
        "banner",
        "callout",
        "confirm dialog"
      ],
      "synonyms_zh": [
        "通知",
        "提示卡",
        "告警",
        "横幅",
        "消息卡",
        "确认弹窗"
      ],
      "when_to_use": "状态反馈/告警/轻确认：被动告知用 form=slide；需决策用 form=dialog 或 pop confirm；单一确认用 form=alert。轻量行内提示用 Message；表单类模态用 PopupBox。",
      "built_in_features": [
        {
          "feature": "交互形态",
          "controlled_by": "prop:form = dialog | alert | pop confirm | slide（按钮按 form 固定：dialog/pop confirm=Cancel+Confirm、alert=单 OK、slide=无）"
        },
        {
          "feature": "严重度图标",
          "controlled_by": "prop:type = warning | secondary warning | error | info | success | none（图标随 type 内置）"
        },
        {
          "feature": "关闭按钮",
          "controlled_by": "prop:closable（默认 true，无需外接 close icon）"
        },
        {
          "feature": "按钮文案",
          "controlled_by": "prop:cancelText / prop:confirmText / prop:okText（仅改文案，按钮有无由 form 决定）"
        }
      ],
      "do_not_hand_compose": "别用带图标的 div + close × + button 自拼通知/确认框。用 Notification，形态走 form、严重度走 type，按钮是 form 固定的不要外拼。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "form",
          "type": "Form",
          "default": "dialog"
        },
        {
          "name": "type",
          "type": "Type",
          "default": "none"
        },
        {
          "name": "theme",
          "type": "Theme",
          "default": "dark"
        },
        {
          "name": "title",
          "type": "string"
        },
        {
          "name": "description",
          "type": "string"
        },
        {
          "name": "closable",
          "type": "boolean",
          "default": true
        },
        {
          "name": "cancelText",
          "type": "string"
        },
        {
          "name": "confirmText",
          "type": "string"
        },
        {
          "name": "okText",
          "type": "string"
        }
      ],
      "key_events": [],
      "code_import": "import { Notification } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Message",
        "PopupBox"
      ],
      "status": "verified"
    },
    {
      "code_name": "Message",
      "npm_export": "Message",
      "figma_name": "Message",
      "category": "feedback",
      "summary": "行内提示条 —— 状态色 + 尺寸 + 可关闭，比 Notification 轻。",
      "synonyms_en": [
        "prompt",
        "inline message",
        "hint message",
        "alert inline",
        "tip",
        "toast"
      ],
      "synonyms_zh": [
        "提示信息",
        "行内提示",
        "消息条",
        "提示条"
      ],
      "when_to_use": "轻量行内状态提示（表单上方一行提示、页面内联反馈）。成块带操作用 Notification。",
      "built_in_features": [
        {
          "feature": "状态色 + 图标",
          "controlled_by": "prop:status = info | ..."
        },
        {
          "feature": "尺寸",
          "controlled_by": "prop:size = L | ..."
        },
        {
          "feature": "关闭",
          "controlled_by": "prop:closable（默认 true）"
        }
      ],
      "do_not_hand_compose": "别用 icon + 文本 div 自拼行内提示。用 Message。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "status",
          "type": "MessageStatus",
          "default": "info"
        },
        {
          "name": "size",
          "type": "MessageSize",
          "default": "L"
        },
        {
          "name": "closable",
          "type": "boolean",
          "default": true
        }
      ],
      "key_events": [],
      "code_import": "import { Message } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Notification",
        "Tooltip"
      ],
      "status": "verified"
    },
    {
      "code_name": "PopupBox",
      "npm_export": "PopupBox",
      "figma_name": "Popup Box",
      "category": "feedback",
      "summary": "模态弹窗 —— 标题 + 内容插槽 + footer(取消/确认) + 背板/Esc 关闭控制。",
      "synonyms_en": [
        "modal",
        "dialog",
        "popup",
        "popup box",
        "overlay dialog"
      ],
      "synonyms_zh": [
        "弹窗",
        "对话框",
        "模态框",
        "模态弹窗"
      ],
      "when_to_use": "需要打断流程的模态对话（确认、表单、详情）。非模态轻提示用 Notification/Message。",
      "built_in_features": [
        {
          "feature": "显隐双向绑定",
          "controlled_by": "prop:visible + v-model:visible"
        },
        {
          "feature": "关闭手段",
          "controlled_by": "prop:closable / prop:closeOnBackdrop / prop:closeOnEscape"
        },
        {
          "feature": "footer 取消/确认",
          "controlled_by": "prop:showFooter + cancelText/confirmText，或 #footer slot"
        },
        {
          "feature": "宽度",
          "controlled_by": "prop:width（默认 680）"
        }
      ],
      "do_not_hand_compose": "别用 fixed 遮罩 div + 自管 z-index/Esc 拼模态。用 PopupBox，显隐 v-model:visible，关闭走 closeOnBackdrop/closeOnEscape，按钮走 footer。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "visible",
          "type": "boolean",
          "default": false
        },
        {
          "name": "title",
          "type": "string"
        },
        {
          "name": "width",
          "type": "string | number",
          "default": 680
        },
        {
          "name": "theme",
          "type": "Theme",
          "default": "dark"
        },
        {
          "name": "closable",
          "type": "boolean",
          "default": true
        },
        {
          "name": "closeOnBackdrop",
          "type": "boolean",
          "default": false
        },
        {
          "name": "closeOnEscape",
          "type": "boolean",
          "default": true
        },
        {
          "name": "showFooter",
          "type": "boolean",
          "default": true
        },
        {
          "name": "cancelText",
          "type": "string"
        },
        {
          "name": "confirmText",
          "type": "string"
        }
      ],
      "key_events": [
        "update:visible",
        "close",
        "cancel",
        "confirm"
      ],
      "code_import": "import { PopupBox } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Notification"
      ],
      "status": "verified"
    },
    {
      "code_name": "Tooltip",
      "npm_export": "Tooltip",
      "figma_name": "Tooltip",
      "category": "data-display",
      "summary": "气泡提示 —— 悬浮文案 + 6 个指向方位，内置定位。",
      "synonyms_en": [
        "tooltip",
        "hint",
        "popover",
        "hover hint",
        "bubble"
      ],
      "synonyms_zh": [
        "气泡提示",
        "悬浮提示",
        "工具提示",
        "提示气泡"
      ],
      "when_to_use": "hover/focus 时补充说明。常驻行内提示用 Message。",
      "built_in_features": [
        {
          "feature": "指向方位",
          "controlled_by": "prop:pointing（6 向，内部映射到 placement）"
        },
        {
          "feature": "文案",
          "controlled_by": "prop:content 或 #content slot（v0.4.0 dual-form）"
        },
        {
          "feature": "受控显隐 / 禁用",
          "controlled_by": "prop:open / prop:disabled"
        }
      ],
      "do_not_hand_compose": "别用 title 属性或自管绝对定位 div 拼 tooltip。用 Tooltip，方位走 pointing。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "content",
          "type": "string",
          "default": "Description"
        },
        {
          "name": "pointing",
          "type": "Pointing",
          "default": "Center down"
        },
        {
          "name": "darkTheme",
          "type": "DarkTheme",
          "default": "off"
        },
        {
          "name": "open",
          "type": "boolean",
          "default": false
        },
        {
          "name": "disabled",
          "type": "boolean",
          "default": false
        }
      ],
      "key_events": [],
      "code_import": "import { Tooltip } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Message"
      ],
      "status": "verified"
    },
    {
      "code_name": "Badge",
      "npm_export": "Badge",
      "figma_name": "Badge",
      "category": "data-display",
      "summary": "状态/计数标记 —— 圆形/矩形 × 5 色 × 填充/线框，只读指示。",
      "synonyms_en": [
        "badge",
        "tag",
        "pill",
        "status dot",
        "count badge",
        "label"
      ],
      "synonyms_zh": [
        "徽标",
        "标签",
        "状态点",
        "计数标记",
        "角标"
      ],
      "when_to_use": "只读的状态/计数指示（行内状态、计数角标）。可点击的 chip/选择用 Tab；运行态会话指示用 PillStatus。",
      "built_in_features": [
        {
          "feature": "形状",
          "controlled_by": "prop:type = Circle | Rectangle"
        },
        {
          "feature": "状态色",
          "controlled_by": "prop:color = Green | Blue | Orange | Red | Neutral"
        },
        {
          "feature": "填充/线框",
          "controlled_by": "prop:fill = Filled | Line"
        }
      ],
      "do_not_hand_compose": "别用带背景色的 <span> 自拼状态标。用 Badge，色走 color、形态走 type/fill。",
      "composition": {
        "contained_by": [
          "Table",
          "TopBar"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "type",
          "type": "Circle | Rectangle",
          "default": "Circle"
        },
        {
          "name": "color",
          "type": "Green | Blue | Orange | Red | Neutral",
          "default": "Green"
        },
        {
          "name": "fill",
          "type": "Filled | Line",
          "default": "Filled"
        }
      ],
      "key_events": [],
      "code_import": "import { Badge } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "PillStatus",
        "PillCounter"
      ],
      "status": "verified"
    },
    {
      "code_name": "PillStatus",
      "npm_export": "PillStatus",
      "figma_name": "Pill Status",
      "category": "data-display",
      "summary": "会话运行状态药丸 —— On-air/Preview/Analyzing/Inactive + active 态 + 可选计数。",
      "synonyms_en": [
        "status pill",
        "session status",
        "live pill",
        "state badge"
      ],
      "synonyms_zh": [
        "状态药丸",
        "会话状态",
        "直播状态",
        "运行状态"
      ],
      "when_to_use": "TVU 会话/流的运行状态指示（直播/预览/分析中/未激活）。通用状态/计数用 Badge。",
      "built_in_features": [
        {
          "feature": "状态语义色",
          "controlled_by": "prop:status = On-air(red) | Preview(brand) | Analyzing(blue) | Inactive(grey)"
        },
        {
          "feature": "激活/未激活态",
          "controlled_by": "prop:active（false 时统一灰态）"
        },
        {
          "feature": "计数",
          "controlled_by": "prop:count"
        }
      ],
      "do_not_hand_compose": "别自拼带圆点的状态药丸。用 PillStatus，运行语义走 status，未激活走 active=false。",
      "composition": {
        "contained_by": [
          "Table",
          "TopBar"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "status",
          "type": "On-air | Preview | Analyzing | Inactive",
          "default": "On-air"
        },
        {
          "name": "active",
          "type": "boolean",
          "default": true
        },
        {
          "name": "count",
          "type": "number | string"
        }
      ],
      "key_events": [],
      "code_import": "import { PillStatus } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Badge",
        "PillCounter"
      ],
      "status": "verified"
    },
    {
      "code_name": "PillCounter",
      "npm_export": null,
      "figma_name": "Pill/Counter",
      "category": "data-display",
      "summary": "计数药丸（neutral/success/warning/info 配色）。内部组件，未在 npm 公开导出。",
      "synonyms_en": [
        "counter pill",
        "count badge"
      ],
      "synonyms_zh": [
        "计数药丸",
        "计数标记"
      ],
      "when_to_use": "内部组件，当前未公开导出。通用计数标记请用 Badge。",
      "built_in_features": [
        {
          "feature": "配色语义",
          "controlled_by": "prop:kind = neutral | success | warning | info"
        }
      ],
      "do_not_hand_compose": "当前不在 npm 公开 API；通用计数用 Badge。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "kind",
          "type": "neutral | success | warning | info",
          "default": "neutral"
        }
      ],
      "key_events": [],
      "code_import": null,
      "related": [
        "Badge",
        "PillStatus"
      ],
      "status": "verified"
    },
    {
      "code_name": "Progress",
      "npm_export": "Progress",
      "figma_name": "Progress",
      "category": "data-display",
      "summary": "进度条 —— 百分比值 + 状态色 + 可选标签。",
      "synonyms_en": [
        "progress",
        "progress bar",
        "loading bar",
        "percentage bar"
      ],
      "synonyms_zh": [
        "进度条",
        "进度",
        "百分比条",
        "加载条"
      ],
      "when_to_use": "展示任务完成百分比（只读）。可拖动选值用 Slider。",
      "built_in_features": [
        {
          "feature": "进度值",
          "controlled_by": "prop:value（0-100）"
        },
        {
          "feature": "状态色",
          "controlled_by": "prop:status"
        },
        {
          "feature": "百分比标签",
          "controlled_by": "prop:showLabel（默认 true）"
        }
      ],
      "do_not_hand_compose": "别用嵌套 div + width% 自画进度条。用 Progress，值走 value，标签走 showLabel。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "value",
          "type": "number",
          "default": 60
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "status",
          "type": "Status",
          "default": "default"
        },
        {
          "name": "theme",
          "type": "Theme",
          "default": "dark"
        },
        {
          "name": "showLabel",
          "type": "boolean",
          "default": true
        }
      ],
      "key_events": [],
      "code_import": "import { Progress } from '@nancyzeng0210/tvu-design-system'",
      "related": [
        "Slider"
      ],
      "status": "verified"
    },
    {
      "code_name": "Chart",
      "npm_export": "Chart",
      "figma_name": "Chart",
      "category": "data-display",
      "summary": "图表 —— Chart.js 封装，按 type 渲染多种图，datasets 驱动 + 12 色调色板。",
      "synonyms_en": [
        "chart",
        "graph",
        "plot",
        "bar chart",
        "line chart",
        "pie chart"
      ],
      "synonyms_zh": [
        "图表",
        "图形",
        "统计图",
        "柱状图",
        "折线图",
        "饼图"
      ],
      "when_to_use": "数据可视化（柱/线/饼等，按 type）。",
      "built_in_features": [
        {
          "feature": "图表类型",
          "controlled_by": "prop:type"
        },
        {
          "feature": "数据集 + 标签",
          "controlled_by": "prop:datasets / prop:labels"
        },
        {
          "feature": "尺寸",
          "controlled_by": "prop:width / prop:height"
        }
      ],
      "do_not_hand_compose": "别直接引 Chart.js 或自画 svg 图表。用 Chart，类型走 type、数据走 datasets（内置 12 色 palette）。",
      "composition": {
        "contained_by": [],
        "contains": []
      },
      "code_props": [
        {
          "name": "type",
          "type": "ChartType"
        },
        {
          "name": "datasets",
          "type": "ChartDatasetInput[]"
        },
        {
          "name": "labels",
          "type": "string[]",
          "default": "[]"
        },
        {
          "name": "height",
          "type": "number",
          "default": 200
        },
        {
          "name": "width",
          "type": "number",
          "default": 320
        }
      ],
      "key_events": [],
      "code_import": "import { Chart } from '@nancyzeng0210/tvu-design-system'",
      "related": [],
      "status": "verified"
    },
    {
      "code_name": "ButtonBridge",
      "npm_export": "Button",
      "figma_name": "Button",
      "category": "general",
      "summary": "按钮 —— 8 轴覆盖 Figma 全部 Button sets（色/尺寸/形态/图标/状态/圆角/定宽/主题）。npm 导出名为 Button。",
      "synonyms_en": [
        "button",
        "btn",
        "cta",
        "action button"
      ],
      "synonyms_zh": [
        "按钮",
        "操作按钮",
        "主按钮"
      ],
      "when_to_use": "任何点击操作。导出名是 Button（不是 ButtonBridge）。",
      "built_in_features": [
        {
          "feature": "配色",
          "controlled_by": "prop:color = green | red | orange | gray 1"
        },
        {
          "feature": "形态",
          "controlled_by": "prop:fill = filling | ghost | rimless"
        },
        {
          "feature": "图标位",
          "controlled_by": "prop:icon = no | left | right | loading"
        },
        {
          "feature": "尺寸/圆角/定宽/状态",
          "controlled_by": "prop:size / prop:radius / prop:fixedWidth / prop:status"
        },
        {
          "feature": "主题（跟随 docs 或显式）",
          "controlled_by": "prop:theme（缺省 inject docsTheme）"
        }
      ],
      "do_not_hand_compose": "别用裸 <button> + 自定义样式。用 Button（`import { Button }`），loading 走 icon=loading 而非外接 spinner。",
      "composition": {
        "contained_by": [
          "Notification",
          "PopupBox",
          "Pagination"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "color",
          "type": "green | red | orange | gray 1",
          "default": "gray 1"
        },
        {
          "name": "fill",
          "type": "filling | ghost | rimless",
          "default": "filling"
        },
        {
          "name": "icon",
          "type": "no | left | right | loading",
          "default": "no"
        },
        {
          "name": "size",
          "type": "Size",
          "default": "M"
        },
        {
          "name": "radius",
          "type": "square | round",
          "default": "square"
        },
        {
          "name": "fixedWidth",
          "type": "yes | no",
          "default": "no"
        },
        {
          "name": "status",
          "type": "default | hover | disable | loading",
          "default": "default"
        },
        {
          "name": "theme",
          "type": "dark | light"
        }
      ],
      "key_events": [],
      "code_import": "import { Button } from '@nancyzeng0210/tvu-design-system'",
      "related": [],
      "status": "verified"
    },
    {
      "code_name": "Logo",
      "npm_export": null,
      "figma_name": "—（无独立 Figma 组件；等价物 = TopBar 内部 logo 图层 + 品牌图标资产 icon/logo/TVU · icon/logo/ts；见 divergence logo-menulist-usermenu-code-first-2026-07-02）",
      "category": "general",
      "summary": "品牌 Logo —— 渲染 registry 品牌 SVG（tvu 全称 / ts 简写）。双框架库 code-first 组件（tvu-logo），不经 src/index.ts（已发布 Vue 包未含）。",
      "synonyms_en": [
        "logo",
        "brand",
        "brand mark",
        "wordmark"
      ],
      "synonyms_zh": [
        "标志",
        "品牌标识",
        "商标",
        "logo"
      ],
      "when_to_use": "顶栏或页面品牌标识。别手搓 SVG——用 Logo，type 切换 tvu/ts。",
      "built_in_features": [
        {
          "feature": "品牌变体",
          "controlled_by": "prop:type = tvu | ts"
        },
        {
          "feature": "尺寸",
          "controlled_by": "prop:size（px）"
        }
      ],
      "do_not_hand_compose": "别内联/自画品牌 SVG。用 Logo，图形走 icon registry（icon/logo/TVU · icon/logo/ts）。",
      "composition": {
        "contained_by": [
          "TopBar",
          "UserMenu"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "type",
          "type": "tvu | ts",
          "default": "tvu"
        },
        {
          "name": "size",
          "type": "number",
          "default": "16"
        }
      ],
      "key_events": [],
      "related": [
        "TopBar",
        "UserMenu"
      ],
      "status": "verified"
    },
    {
      "code_name": "MenuList",
      "npm_export": null,
      "figma_name": "—（无独立 Figma 组件；等价物 = TopBar 内部 \"Menu List\" 图层；见 divergence logo-menulist-usermenu-code-first-2026-07-02）",
      "category": "navigation",
      "summary": "菜单列表 —— topbar 菜单模式抽取。horizontal（品牌下划线）/ vertical（品牌色 + 末尾 action/selected 勾选）。双框架 code-first 组件（tvu-menu-list），不经 src/index.ts。",
      "synonyms_en": [
        "menu",
        "menu list",
        "nav list",
        "menu items"
      ],
      "synonyms_zh": [
        "菜单",
        "菜单列表",
        "导航列表",
        "菜单项"
      ],
      "when_to_use": "顶栏/下拉面板里的菜单项分组。别用 ul+li 自拼——用 MenuList，items 驱动，选中态走 item.selected。",
      "built_in_features": [
        {
          "feature": "方向",
          "controlled_by": "prop:orientation = horizontal | vertical"
        },
        {
          "feature": "菜单项（含 action/selected 勾选）",
          "controlled_by": "prop:items[]"
        }
      ],
      "do_not_hand_compose": "别用 ul/li + flex 自拼菜单。用 MenuList，图标走 registry，勾选态走 item.selected。",
      "composition": {
        "contained_by": [
          "TopBar",
          "UserMenu"
        ],
        "contains": []
      },
      "code_props": [
        {
          "name": "items",
          "type": "MenuListItem[]",
          "default": "[]"
        },
        {
          "name": "orientation",
          "type": "horizontal | vertical",
          "default": "vertical"
        }
      ],
      "key_events": [],
      "related": [
        "TopBar",
        "UserMenu"
      ],
      "status": "verified"
    },
    {
      "code_name": "UserMenu",
      "npm_export": null,
      "figma_name": "—（无独立 Figma 组件；等价物 = TopBar 内部账号区 PM 头像 + Account Name；下拉壳 code-first；见 divergence logo-menulist-usermenu-code-first-2026-07-02）",
      "category": "navigation",
      "summary": "用户菜单 —— 实心首字母/图片头像 → 下拉面板（账号头 name+role+email · custom actions[MenuList] · 行内语言切换 · 退出）。双框架 code-first 组件（tvu-user-menu），不经 src/index.ts。",
      "synonyms_en": [
        "user menu",
        "account menu",
        "avatar menu",
        "profile menu"
      ],
      "synonyms_zh": [
        "用户菜单",
        "账号菜单",
        "头像菜单",
        "个人菜单"
      ],
      "when_to_use": "登录后顶栏右侧账号入口（§3：after-login TopBar rightContent 必须是 UserMenu，别手搓头像+菜单）。",
      "built_in_features": [
        {
          "feature": "头像（首字母底色或图片）",
          "controlled_by": "prop:name / prop:image / prop:color"
        },
        {
          "feature": "账号头（name+role+email）",
          "controlled_by": "prop:name / prop:role / prop:email"
        },
        {
          "feature": "自定义操作",
          "controlled_by": "prop:actions[]（渲染为 MenuList 面板体）"
        },
        {
          "feature": "行内语言切换",
          "controlled_by": "prop:languages[] / prop:lang"
        }
      ],
      "do_not_hand_compose": "别手搓头像+下拉菜单。登录后顶栏右区用 UserMenu，操作走 actions（MenuList），语言切换走内建 languages/lang（别外接切换器）。",
      "composition": {
        "contained_by": [
          "TopBar"
        ],
        "contains": [
          "Logo",
          "MenuList"
        ]
      },
      "code_props": [
        {
          "name": "name",
          "type": "string",
          "default": "''"
        },
        {
          "name": "email",
          "type": "string"
        },
        {
          "name": "role",
          "type": "string"
        },
        {
          "name": "image",
          "type": "string"
        },
        {
          "name": "color",
          "type": "string"
        },
        {
          "name": "actions",
          "type": "MenuListItem[]",
          "default": "[]"
        },
        {
          "name": "languages",
          "type": "UserMenuLanguage[]",
          "default": "[]"
        },
        {
          "name": "lang",
          "type": "string"
        }
      ],
      "key_events": [],
      "related": [
        "TopBar",
        "MenuList",
        "Logo"
      ],
      "status": "verified"
    }
  ]
}
