## 1. 组件概述 - **名称**:BimTab - **位置**:`src/components/tab/` - **功能**:渲染固定标签页(不支持运行期增删),支持点击切换、禁用、可选内容托管。主题由全局 `ThemeManager` 提供,文案通过 `t()` 翻译。 - **使用方式**:直接通过构造函数 + `init()` 创建;本项目内目前仅在 `ConstructTreeManagerBtn` 弹窗中使用(无专门 Manager)。 ## 2. 组件类 API(BimTab) - `constructor(options: TabOptions)`:创建实例并挂载到 `options.container`。 - `init(): void`:渲染头部与内容,订阅主题/语言。 - `activateTab(tabId: string): void`:切换激活标签,触发 `onChange`。 - `setTheme(theme: ThemeConfig): void`:应用主题变量。 - `setLocales(): void`:刷新标题文案。 - `destroy(): void`:解绑事件、取消订阅、移除 DOM。 ## 3. 分化组件 - 当前无子类或变体,后续可扩展滚动、溢出折叠等能力。 ## 4. 使用场景说明 - **ConstructTreeManagerBtn 弹窗**:顶部三段标签(构件/系统/空间),构件标签承载原有 Tree,系统/空间暂为空容器。 - 适用于固定分区切换,内容简单或由外部回调控制。 ## 5. UI 结构 ``` div.bim-tab div.bim-tab__nav [role=tablist] button.bim-tab__item[role=tab][aria-selected][aria-disabled?] span.bim-tab__icon? (可选) span.bim-tab__title div.bim-tab__content div.bim-tab__panel[role=tabpanel][aria-labelledby=tab-xxx] ... ``` - 状态类:`.is-active`、`.is-disabled`。 - 内容区:仅切换显示,不强制填充(可为空)。 ## 6. 逻辑流程 1) `constructor`:创建根节点、头部、内容容器;缓存 tab 数据;挂载到传入容器。 2) `init`:渲染头部按钮与内容面板,设置初始激活;应用当前主题/语言;订阅主题、语言变更。 3) 交互:点击非禁用按钮 → `activateTab` 更新头部/面板状态 → 回调 `onChange`。 4) 销毁:解绑点击监听、取消订阅、清空映射并移除 DOM。 ## 7. 国际化 - 标题:`t(tab.title)`,若翻译键不存在则回退原文。 - 新增翻译键:`tab.component` / `tab.system` / `tab.space`(已在 `zh-CN.ts`、`en-US.ts` 注册)。 - `setLocales()`:遍历头部按钮刷新标题文案;订阅 `localeManager` 自动响应语言切换。 ## 8. 主题支持 - 来自 `themeManager`,不从配置传入。 - 使用的变量(设置在根节点上): - `--bim-tab-bg`、`--bim-tab-nav-bg` - `--bim-tab-text`、`--bim-tab-text-secondary`、`--bim-tab-text-active` - `--bim-tab-border`、`--bim-tab-hover-bg`、`--bim-tab-active-bg` - `--bim-tab-icon` - `setTheme(theme)`:根据 `ThemeConfig` 写入上述 CSS 变量。 ## 9. 使用示例 ```ts const tabMount = document.createElement('div'); const tab = new BimTab({ container: tabMount, tabs: [ { id: 'component', title: 'tab.component', content: componentEl }, { id: 'system', title: 'tab.system', content: systemEl }, { id: 'space', title: 'tab.space', content: spaceEl }, ], activeId: 'component', onChange: (id) => { // 根据 id 做额外逻辑(如埋点、动态加载) }, }); tab.init(); ``` ## 10. 实现细节 - 仅支持固定 tabs:`TabOptions.tabs` 为初始化列表,不提供新增/删除接口。 - 内容托管两种方式:`content: HTMLElement`(append)或 `content: string`(innerHTML)。未提供内容时面板为空。 - 事件绑定:头部使用事件委托绑定 click,销毁时移除。 - 访问性:头部 `role=tab`、`aria-selected`、`aria-disabled`;面板 `role=tabpanel` 且 `aria-labelledby` 对应头部 id。 - 主题/语言订阅:`localeManager.subscribe`、`themeManager.subscribe`,销毁时必须取消。 ## 11. 类型定义 - 位置:`src/components/tab/index.type.ts` - 主要类型: - `TabItem`: `{ id; title; disabled?; icon?; content?; meta? }` - `TabOptions`: `{ container; tabs; activeId?; onChange? }` ## 12. 文件清单 - `src/components/tab/index.ts`:组件实现 - `src/components/tab/index.type.ts`:类型定义 - `src/components/tab/index.css`:样式 - (无 Manager)当前仅在 `ConstructTreeManagerBtn` 中直接使用