sky-ui-kit 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/llms-full.txt CHANGED
@@ -1,11 +1,18 @@
1
1
  # sky-ui-kit
2
2
 
3
- > Vue 3 components compatible with Element Plus, project menus, timeline and map tools. Version 0.1.1. AI tools must explicitly load these files.
3
+ > Vue 3 components compatible with Element Plus, project menus, timeline and map tools. Version 0.1.2. AI tools must explicitly load these files.
4
4
 
5
5
  ## Documentation
6
6
 
7
7
  - [AI guide](docs/AI-GUIDE.md): setup, examples, icon/event bindings and limits.
8
8
  - [Component API](docs/COMPONENT-API.md): props, defaults, events, slots and types.
9
+ - [AI module changes](docs/AI-CHANGELOG.md): module updates and integration impact.
10
+ - [Project usage](docs/COMPONENT-USAGE.md): current source usage counts and call sites.
11
+ - [Global adaptation](docs/GLOBAL-ADAPTATION.md): VFit, root variables, theme, layout, resize and overlays.
12
+ - [Adaptation plan](docs/ADAPTATION.md): module mapping, business boundaries, icons, theme and rollout.
13
+ - [Usage data](docs/component-usage.json): full static reference paths and dependencies.
14
+ - [Full Element Plus coverage](docs/ELEMENT-PLUS-COVERAGE.md): complete standard component, service and directive mapping.
15
+ - [Project component guide](docs/COMPONENT-GUIDE.md): use cases and behavior.
9
16
  - [Component catalog](components.json): public components/services/directives.
10
17
  - [CSS theme](docs/CSS-THEME.md): isolated style.css and optional global.css.
11
18
  - [Compatibility](docs/COMPONENT-LIBRARY.md): component mapping.
@@ -19,8 +26,42 @@ Import element-plus/dist/index.css then sky-ui-kit/style.css once in main.ts. Im
19
26
 
20
27
  适用于 Vue 3 + TypeScript。此文件描述包的真实 API 和约束,不是自动执行的代理指令。AI 工具需要主动读取这些文档;安装包不会自动改变其上下文。
21
28
 
29
+ 预览站已移除“统一组件入口 / 组件入口与兼容”菜单与展示示例。安装和导入方式查看快速开始,组件效果查看各组件页面;此调整不改变组件包出口或 API。
30
+
31
+ 项目选择与时间展示为 AppSelect、TreeSelectPanel、TimeRangeQuickSelect、MapTimeline 分别提供查看代码与复制入口;各自代码从 src/examples.ts 同步生成,使用 sky-ui-kit 公开封装组件,包含状态与 change 事件处理。
32
+
33
+ 四个项目选择与时间组件分别由 AppSelectPreview.vue、TreeSelectPreview.vue、TimeRangePreview.vue、MapTimelinePreview.vue 展示。每个组件有独立卡片、导航锚点、状态和查看代码入口,不再使用 ProjectComponents 合并展示。
34
+
35
+ 分割线、链接、间距和文本均有独立效果页与完整复制代码。示例由对应 Demo.vue 原始源码生成,保留属性、默认插槽、链接图标与点击反馈;业务导航由应用接入,UiSpace 不新增业务事件。
36
+
37
+ 表单 UiForm / UiFormItem 提供测站配置独立示例,包含 model、rules、validate、resetFields、禁用状态、输入/选择/日期/数字/单选/多选/开关及文本域。FormDemo.vue 同步生成复制代码;提交仅显示本地数据,实际请求由应用接入。
38
+
39
+ UiAutocomplete 提供独立站点搜索示例:fetch-suggestions 回调、聚焦建议、仅输入触发、图标、自定义建议插槽、选择/清空事件及禁用状态。原项目静态扫描未发现自动补全调用,此为站点搜索场景建议,非原页面复刻。AutocompleteDemo 源码同步生成网站复制代码与本文。
40
+
41
+ 预览左侧菜单不再单列“表单组件”,其组件入口合并到“基础组件”;组件、子组件关系、示例和公开 API 保留。底层组件目录元数据仍保留原分类,导航使用合并显示。
42
+
43
+ 选择、时间、级联、颜色、日期、数字、标签、验证码、评分、输入和折叠动画入口提供各自独立 Demo 与代码,不再只展示导入语句。示例演示本地状态和 change 反馈,实际请求由应用接入;面板使用对应 Panel 组件。
44
+
45
+ 已完成的基础及表单控件示例常驻同一长页面,每项独立展示、独立状态、独立代码入口;菜单点击滚动定位,避免复用顶部单一展示区。尚未完成的组件保留 API 索引入口。
46
+
47
+ 时间下拉选择、穿梭框、树选择器、上传、提及也有常驻独立示例与复制代码。上传演示使用 auto-upload=false,只处理本地文件选择/移除/数量限制,真实上传通过应用 http-request 接入;不虚构服务器上传成功。
48
+
49
+ 数据展示、导航、反馈、其他配置的主组件与服务/指令连续展示独立示例,子组件在父组件组合中展示,菜单定位父示例。UiPopper 是底层定位出口,页面通过 UiPopover 展示使用场景,不宣称提供完整底层交互示例。全部示例从 CatalogDemo 源码生成复制代码。
50
+
51
+ 项目 SVG 图标菜单定位到图标页面内的 SvgIcon 独立锚点,不再跳到 UiIcon 通用入口;两个菜单的 hash 分开,保持项目图标选择状态。
52
+
22
53
  ## 文档读取顺序
23
54
 
55
+ 安装或升级最新正式版使用 `npm install sky-ui-kit@latest`。latest 指向 npm 的正式发布标签,尚未发布的源码修改不在安装包内;依据当前已安装包的版本和文档使用组件。
56
+
57
+ 团队先读取 llms.txt,并结合 AI-CHANGELOG.md 了解模块变更及接入影响。后续所有代码、预览页面、样式和接入说明修改均同步相关 AI 文档,并运行 npm run docs:ai;快速开始代码与页面使用同一份源文件生成。
58
+
59
+ 预览站导航按“使用指南 / 团队专用组件 / 项目特色组件”分区;团队专用组件基于 Element Plus 封装。一级分类使用手风琴展开,二级列出主组件,结构子组件收在对应主组件下并可单独展开。搜索子组件时保留父组件上下文,选择后自动展开所在分类及父组件。
60
+
61
+ 预览站目录支持中文 / Ui 名称 / El 名称搜索及分类折叠。Element Plus 全部标准组件、服务和指令入口来自 src/element-plus-catalog.ts,每项提供导入名称与官方 API 索引;完整分类见 ELEMENT-PLUS-COVERAGE.md。API 索引不代表该组件已具备独立交互示例。“待补充”用于尚无页面的指南入口。SiteNavigation 仅用于预览网站,不属于组件包公开 API。
62
+
63
+ 基础层基准为 Element Plus 2.14.7,项目特色组件保留原名。结构子组件放在对应 Ui 父组件内部,不独立提供主题边界。UiLoading 使用 service(options) / directive,不提供 install;vUiInfiniteScroll、vUiPopover 保留官方指令语义。不要将内部工具函数作为 Ui 组件导入。
64
+
24
65
  1. llms.txt:入口和文档索引。
25
66
  2. components.json:完整公开组件、服务和指令清单;项目组件属性、事件、插槽、默认表达式。
26
67
  3. COMPONENT-API.md:项目组件精确 API 与类型定义。
@@ -29,6 +70,8 @@ Import element-plus/dist/index.css then sky-ui-kit/style.css once in main.ts. Im
29
70
 
30
71
  ## 生成代码的规则
31
72
 
73
+ - 滚动条直接 `import { ElScrollbar } from 'element-plus'`,不定义 UiScrollbar 或从 sky-ui-kit 导入滚动条。预览目录保留滚动条入口以索引官方 API;它没有库包装层,样式取决于已有应用主题范围。
74
+
32
75
  - 在 main.ts 只引入一次 element-plus/dist/index.css 和 sky-ui-kit/style.css。
33
76
  - 按需从 sky-ui-kit 导入组件,不需要库主题 store、Pinia 或全局插件注册。项目已有插件注册继续保留。
34
77
  - style.css 默认隔离;global.css 是主动整站换肤入口,不能默认添加。
@@ -40,9 +83,39 @@ Import element-plus/dist/index.css then sky-ui-kit/style.css once in main.ts. Im
40
83
  - MapTools 的 context-change 返回布尔值;当前没有外部受控右键状态 prop,不要虚构 v-model:contextEnabled。
41
84
  - AtlasRightToggleButton 使用 open + toggle;不是 v-model:open。TreeSelectPanel 的 select 参数为 node, category,change 参数为 { node, category }。
42
85
  - MapTimeline 的 modelValue 是索引;change 返回 TimelinePoint。不要把日期字符串传给 modelValue。
43
- - 本包并不覆盖 Element Plus 全部组件。components.json 不存在的 Ui 名称不能假定可导入,例如链接和面包屑可直接导入 Element Plus。
86
+ - 标准层覆盖基准版本的官方组件、服务与指令;以 components.json 核对实际出口,不假定导出内部工具或未来版本组件。链接与面包屑使用 UiLink / UiBreadcrumb / UiBreadcrumbItem。
44
87
  - 保留项目现有业务代码和注释,先局部迁移核对,不能用组件示例替换整个业务页面。
45
88
 
89
+ ## 按钮独立示例
90
+
91
+ ## 布局容器与目录
92
+
93
+ 布局容器及其四个子组件统一显示完整布局页;目录新增“地图业务布局”子项,直接定位 project-template-layout 示例。
94
+
95
+ TemplateLayoutPreview 独立说明地图业务布局,TemplateLayoutDemo 提供可操作右栏、时间轴及避让轮廓;组合示例使用库按钮与应用侧 CSS,不假定 sky-ui-kit 导出 TemplateLayout。原地图实例、ui store、工具栏、图层和主题弹窗仍由应用维护。
96
+
97
+ 布局容器先展示顶栏、左侧栏、主体、底栏齐全的整体布局及代码,再依此顺序展示四个区域。整体示例 fullLayoutExample 同步网站和 AI 文档。
98
+
99
+ 点击任何布局子组件均同时显示侧栏、顶栏、底栏、主体四个独立示例,菜单定位各自锚点。演示使用明确外框、区域虚线和主色高亮;包装组件转发 class 时预览局部样式通过原生外框与 :deep 选择器匹配。示意边框为展示样式。
100
+
101
+ UiAside、UiHeader、UiFooter、UiMain 的目录入口分别提供实际布局效果与独立可复制代码,由 ContainerPartPreview 展示;使用 UiContainer 保留上下文,分别演示 width、height 和主体剩余空间。结构组件无新增业务事件,使用默认插槽放置内容。
102
+
103
+ 全局融合以 GLOBAL-ADAPTATION.md 为准:原 main.ts VFit 1920×912 auto → App.vue 根 --cp-vfit-scale → cp 尺寸 token → 原 theme store 与布局 → 库组件。保留原 VFit 注册、两个 watch、高度链、中文 locale 和业务地图样式;库不注册 VFit,也不接管 resize。不要额外叠加 transform/zoom。布局页与下方生成代码共用 global-adaptation-examples.ts;body 浮层、地图/图表 resize 和窄屏重排由应用处理。
104
+
105
+ 布局示例共六种:系统侧栏、无菜单整宽、地图浮动、横向导航、双侧栏、上下分区。后三种由 LayoutVariants 演示,菜单切换、信息栏和过程区可操作,完整代码自动同步到本文。系统/无菜单/地图布局对应原项目,双侧栏和普通上下分区是组合建议,不宣称原项目已使用相同容器实现;Footer 为可选状态或过程区域。
106
+
107
+ 布局容器新增 BusinessLayoutExamples:系统页菜单切换、测站筛选与表格、无菜单整宽页,以及地图菜单/工具/图例/时间轴/测站面板组合。菜单、工具、测站与时间轴事件展示反馈;右面板开关改变工具和时间轴避让。可复制代码直接来自预览组件源码,AI 示例同步生成。业务地图宿主为示意背景,不接地图或请求;图例阈值颜色为业务示例,不作为通用主题变量。
108
+
109
+ 左侧移除 UiRow / UiCol(栅格行 / 栅格列)入口,仅调整预览目录,已有公开 API 保留。UiContainer 页面参考原项目 MainLayout、ContentLayoutSystem、MainLayoutMap、ContentLayoutMap、ContentLayoutNomenu 与 TemplateLayout,提供系统管理布局、地图浮动布局、侧栏收起和右面板避让示例;containerExample 为可复制基础容器示例,滚动直接使用 ElScrollbar。地图示意不创建地图实例。
110
+
111
+ TemplateLayout 仍由原项目维护,不是 sky-ui-kit 出口;实际 props 为 rightPanelWidth / rightPanelDefaultOpen / rightPanelEnabled。插槽 top / toolbar / right / legend / timeline / content / right-toggle / map-toolbar-info,right-toggle 提供 open / toggle。地图、图层、区域定位、ui store、RouterView、权限和监听释放保留应用侧。部分原页面传 timeline-visible,但当前 TemplateLayout 没声明该 prop,实际时间轴依据 timeline 插槽是否存在;不要将它写入库 API。
112
+
113
+ 原地图布局为底层地图 + pointer-events:none 的覆盖层,只有工具、图例、面板恢复交互;迁移时保留该规则,避免透明层挡住地图。尺寸继承 --header-height / --sidebar-width / --rightpanel-width / --layout-gutter 和 VFit 变量;容器高度链及 min-width/min-height:0 要核对。
114
+
115
+ ## 按钮效果
116
+
117
+ UiButton 页面提供语义色、plain、round、text/bg/link、图标/circle、尺寸、disabled/loading 和可结束的模拟保存。源例 buttonModuleExample 与下方生成代码同步。点击事件由应用处理,真实请求在 finally 中恢复 loading;纯图标按钮提供 aria-label。主题只来自已有变量,不增加业务请求或权限行为。
118
+
46
119
  ## 默认样式
47
120
 
48
121
  明亮六色:#ffffff / #1f2937 / #1677ff / #dbe3ef99 / #ffffffd9 / #ffffff。
@@ -57,9 +130,401 @@ Import element-plus/dist/index.css then sky-ui-kit/style.css once in main.ts. Im
57
130
  ## 主题与业务示例
58
131
 
59
132
  以下完整代码由预览站示例生成;公共入口完成后,各页面不重复引入 CSS。
60
-
133
+
134
+ ## 图标模块
135
+
136
+ 自有 SVG 必须按下方“图标安装 / Vite 配置 / 入口注册 / 页面配置”完成接入:安装 vite-plugin-svg-icons,合并 Vite plugins,在 main.ts 导入 virtual:svg-icons-register,SvgIcon 传 prefix="icon-"。新项目推荐 icon-[dir]-[name];原项目已配置 icon-[name],迁移首轮保留规则。库内置资源自动注册不需要该插件。两种来源不能混淆。
137
+
138
+ ## 原项目使用依据与适配
139
+
140
+ COMPONENT-USAGE.md / component-usage.json 为 2026-10-12 只读扫描结果,覆盖 590 个 Vue / TS / JS 文件、57 种 EP 模板组件、3 种显式服务导入和 56 个公共 Vue 组件。频次是引用文件数;动态、别名、自动注册和间接调用可能漏计。含原工作区未提交源码,仅作为参考。ADAPTATION.md 给出逐模块方案、业务边界、SVG 路由转换、依赖、主题、VFit、浮层和验证顺序。原项目接入页展示当前清单与方案,不再是占位页。
141
+
142
+ 生成业务替换代码前先核对 COMPONENT-USAGE.md 的原路径和 ADAPTATION.md:基础 Ui 成组迁移;common 组件沿用实际 props/events;菜单/地图工具经应用薄适配层接路由、权限、请求;TableLayout、图表、图层、图例、用户权限等尚未公开的组件仍留在应用。原项目 EP 声明 ^2.14.2 不代表实际安装低于 2.14.7,检查 lockfile 与已安装版本再决定升级。
143
+
144
+ UiIcon 保留 ElIcon 的 size、color、默认插槽;通用图标从 @element-plus/icons-vue 导入。SvgIcon 是项目 SVG 组件,274 个内置图标来自原项目 src/assets/icons。projectIcons 提供 name、category、source、followsColor、svg 清单;ProjectIconName 是内置名称类型。内置图标在挂载及名称变化时按需注册,无需使用方安装 Vite SVG 插件。registerProjectIcons(names?, document?) 可显式注册指定名称,不传 names 注册全部;SSR 导入安全,SVG sprite 在客户端创建。
145
+
146
+ SvgIcon 保留 name、size、title、decorative,新增 color 和 prefix。默认 prefix 为 sky-icon-,防止与原项目 icon- 冲突;原项目已有 sprite 或使用方自定义 sprite 可传 prefix="icon-"。此时资源注册由使用方负责,库不覆盖图标。数字尺寸按 --cp-font-1(默认 1px)缩放。属性及原生事件透传 SVG,无内容插槽。未知名称不显示图形。固定色和多色 SVG 保留原配色,color 只影响使用 currentColor 的路径。子目录图标采用目录前缀(如 threeDivision-measure),以 projectIcons 清单为准。
147
+
148
+ 菜单和工具栏的 icon 属性仍接收 Vue 组件,项目图标可用 () => h(SvgIcon, { name: 'ii_rain' }) 绑定。不要把项目名称字符串直接传给 Element Plus 的 icon 属性。地图点位 PNG、Logo 等业务图片未纳入 SVG 组件。
149
+
150
+ 维护 SVG 快照:node scripts/sync-project-icons.mjs "原项目/src/assets/icons",仅只读读取参考项目;生成后核对重复名称与配色并运行 npm run docs:ai。
151
+
61
152
  <!-- GENERATED EXAMPLES -->
62
153
 
154
+ ### 快速开始:安装最新正式版本
155
+
156
+ ```sh
157
+ # 安装或升级到 npm 已发布的最新正式版本
158
+ npm install sky-ui-kit@latest
159
+
160
+ # 项目缺少这些依赖时再安装(Vue 3 项目)
161
+ npm install "element-plus@^2.14.7" @element-plus/icons-vue motion-v
162
+ ```
163
+
164
+ ### 快速开始:公共入口
165
+
166
+ ```ts
167
+ // main.ts:公共样式只引入一次
168
+ import { createApp } from 'vue'
169
+ import App from './App.vue'
170
+ import 'element-plus/dist/index.css'
171
+ import 'sky-ui-kit/style.css'
172
+
173
+ // 已有项目保留原插件注册、路由和挂载逻辑
174
+ createApp(App).mount('#app')
175
+ ```
176
+
177
+ ### 快速开始:首个组件
178
+
179
+ ```vue
180
+ <script setup lang="ts">
181
+ import { ref } from 'vue'
182
+ import { UiButton, AppSelect, UiMessage } from 'sky-ui-kit'
183
+ const station = ref('hankou')
184
+ const options = [
185
+ { label: '汉口站', value: 'hankou' },
186
+ { label: '宜昌站', value: 'yichang' }
187
+ ]
188
+ function confirm() { UiMessage.success('当前站点:' + station.value) }
189
+ </script>
190
+ <template>
191
+ <AppSelect v-model="station" :options="options" />
192
+ <UiButton type="primary" @click="confirm">确认选择</UiButton>
193
+ </template>
194
+ ```
195
+
196
+ ### 快速开始:团队 AI 读取提示
197
+
198
+ ```text
199
+ 请先读取 node_modules/sky-ui-kit/llms.txt,并按索引读取:
200
+ - components.json:当前已安装版本的公开组件与 API 清单
201
+ - docs/AI-GUIDE.md:使用规则和完整示例
202
+ - docs/AI-CHANGELOG.md:模块变更及接入影响
203
+ - docs/COMPONENT-API.md:属性、事件、插槽与类型
204
+ - docs/CSS-THEME.md:主题变量、样式隔离与浮层限制
205
+ - docs/INTEGRATION.md:原项目替换和业务接线
206
+ - docs/COMPONENT-USAGE.md:原项目实际使用的组件与调用位置
207
+ - docs/ADAPTATION.md:逐模块替换、Vite 图标配置、主题及业务适配方案
208
+
209
+ 请依据当前已安装包的版本与文档生成代码,不要虚构组件名称或 API。
210
+ 公共 CSS 仅在 main.ts 引入一次;业务请求、路由、权限由应用接入。
211
+ ```
212
+
213
+ ### 图标安装:内置与自有资源
214
+
215
+ ```sh
216
+ # 仅使用库内置 SVG:安装组件库即可
217
+ npm install sky-ui-kit@latest
218
+
219
+ # 项目要维护自己的 src/assets/icons/*.svg 时,再安装 Vite 插件
220
+ npm install -D vite-plugin-svg-icons
221
+ ```
222
+
223
+ ### 自有 SVG:Vite 配置
224
+
225
+ ```js
226
+ // vite.config.js / vite.config.ts
227
+ import { defineConfig } from 'vite'
228
+ import vue from '@vitejs/plugin-vue'
229
+ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
230
+ import path from 'node:path'
231
+
232
+ export default defineConfig({
233
+ plugins: [
234
+ vue(),
235
+ // 合并到现有 plugins;保留原来的自动导入、代理、别名等配置。
236
+ createSvgIconsPlugin({
237
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
238
+ symbolId: 'icon-[dir]-[name]',
239
+ svgoOptions: false,
240
+ }),
241
+ ],
242
+ })
243
+ ```
244
+
245
+ ### 自有 SVG:入口注册
246
+
247
+ ```ts
248
+ // main.ts:各资源只引入一次;保留原路由、Pinia、VFit 等注册。
249
+ import 'virtual:svg-icons-register'
250
+ import 'element-plus/dist/index.css'
251
+ import 'sky-ui-kit/style.css'
252
+ // TypeScript 虚拟模块声明放在 src/vite-env.d.ts,见下一段。
253
+ ```
254
+
255
+ ### 自有 SVG:TypeScript 虚拟模块声明
256
+
257
+ ```ts
258
+ // src/vite-env.d.ts:已有文件追加此声明,不覆盖原有声明。
259
+ declare module 'virtual:svg-icons-register'
260
+ ```
261
+
262
+ ### 自有 SVG:页面配置
263
+
264
+ ```vue
265
+ <script setup lang="ts">
266
+ import { SvgIcon } from 'sky-ui-kit'
267
+ </script>
268
+ <template>
269
+ <!-- 库内置图标:自动注册,无需 Vite SVG 插件 -->
270
+ <SvgIcon name="ii_rain" size="24px" />
271
+ <!-- 使用方 src/assets/icons/company.svg -->
272
+ <SvgIcon name="company" prefix="icon-" size="24px" />
273
+ <!-- 使用方 src/assets/icons/weather/rain.svg -->
274
+ <SvgIcon name="weather-rain" prefix="icon-" title="降水" :decorative="false" />
275
+ </template>
276
+ ```
277
+
278
+ ### 原项目 SVG 命名适配
279
+
280
+ ```js
281
+ // 原业务项目已有配置:保留即可,无需重复安装和注册。
282
+ createSvgIconsPlugin({
283
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
284
+ symbolId: 'icon-[name]',
285
+ svgoOptions: false,
286
+ })
287
+
288
+ // 替换原 SvgIcon 的 import 后,原 sprite 用 prefix="icon-":
289
+ // <SvgIcon name="ii_rain" prefix="icon-" />
290
+ // 若切换为库内置图标:<SvgIcon name="ii_rain" />
291
+ // 新项目推荐 icon-[dir]-[name],同名子目录不会冲突。
292
+ // 旧项目改命名规则前必须检查所有 name 和路由 meta.icon。
293
+ ```
294
+
295
+ ### 全局适配:fitBridgeExample
296
+
297
+ ```ts
298
+ // 原项目 App.vue 已有这段桥接,直接保留。
299
+ import { watch, onBeforeUnmount } from 'vue'
300
+ import { useFitScale } from 'vfit'
301
+ import { useThemeStore } from '@/stores/theme'
302
+ const fitScale = useFitScale()
303
+ const theme = useThemeStore()
304
+ const stopScaleWatch = watch(fitScale, scale => {
305
+ document.documentElement.style.setProperty('--cp-vfit-scale', String(scale))
306
+ }, { immediate: true })
307
+ const stopThemeWatch = watch(() => theme.$state, () => theme.applyCssVars(), {
308
+ immediate: true, deep: true,
309
+ })
310
+ onBeforeUnmount(() => {
311
+ stopScaleWatch()
312
+ stopThemeWatch()
313
+ document.documentElement.style.removeProperty('--cp-vfit-scale')
314
+ })
315
+ ```
316
+
317
+ ### 全局适配:fitEntryExample
318
+
319
+ ```ts
320
+ // 原项目 main.ts 已配置,融合时保留,不重复 app.use。
321
+ import { createFitScale } from 'vfit'
322
+ import 'vfit/style.css'
323
+ import 'element-plus/dist/index.css'
324
+ import './styles/theme.css'
325
+ import './styles/base.css'
326
+ import 'sky-ui-kit/style.css'
327
+
328
+ // 放在现有 app 注册链中;路由和 Pinia 等注册保留。
329
+ app.use(createFitScale({
330
+ target: '#app',
331
+ designWidth: 1920,
332
+ designHeight: 912,
333
+ scaleMode: 'auto',
334
+ }))
335
+ ```
336
+
337
+ ### 全局适配:fitLayoutExample
338
+
339
+ ```css
340
+ /* 应用侧布局样式;全局 reset 仍留在原 base.css。 */
341
+ html, body, #app { height: 100%; margin: 0; }
342
+ .app-shell { height: 100%; min-width: 0; overflow: hidden; }
343
+ .workspace {
344
+ position: relative;
345
+ height: calc(100% - var(--header-height, calc(58px * var(--cp-vfit-scale, 1))));
346
+ min-width: 0;
347
+ min-height: 0;
348
+ }
349
+ .page-content { min-width: 0; min-height: 0; overflow: hidden; }
350
+ .business-panel {
351
+ width: var(--rightpanel-width, calc(320px * var(--cp-vfit-scale, 1)));
352
+ padding: var(--layout-gutter, calc(10px * var(--cp-vfit-scale, 1)));
353
+ font-size: var(--font-size-body, calc(14px * var(--cp-vfit-scale, 1)));
354
+ }
355
+ /* 不再对这些已消费缩放变量的组件添加第二套 transform:scale / zoom。 */
356
+ ```
357
+
358
+ ### UiAsideExample
359
+
360
+ ```vue
361
+ <script setup lang="ts">
362
+ import { UiContainer, UiAside, UiHeader, UiFooter, UiMain } from 'sky-ui-kit'
363
+ </script>
364
+ <template>
365
+ <UiContainer direction="horizontal" class="layout-demo">
366
+ <UiAside width="160px" class="focus-region">业务菜单</UiAside>
367
+ <UiMain>内容区域</UiMain>
368
+ </UiContainer>
369
+ </template>
370
+ <style scoped>
371
+ .layout-demo { height: 240px; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; overflow: hidden; }
372
+ .layout-demo :deep(.el-main), .layout-demo :deep(.el-aside), .layout-demo :deep(.el-header), .layout-demo :deep(.el-footer) { display: flex; align-items: center; justify-content: center; box-sizing: border-box; border: 1px dashed var(--color-border, #c5d2e5); padding: 16px; }
373
+ .layout-demo :deep(.focus-region) { color: var(--color-primary, #1677ff); background: color-mix(in srgb, var(--color-primary, #1677ff) 14%, var(--color-panel, white)); border: 2px solid var(--color-primary, #1677ff); font-weight: 700; }
374
+ </style>
375
+ ```
376
+
377
+ ### UiFooterExample
378
+
379
+ ```vue
380
+ <script setup lang="ts">
381
+ import { UiContainer, UiAside, UiHeader, UiFooter, UiMain } from 'sky-ui-kit'
382
+ </script>
383
+ <template>
384
+ <UiContainer direction="vertical" class="layout-demo">
385
+ <UiMain>内容区域</UiMain>
386
+ <UiFooter height="48px" class="focus-region">状态与辅助信息</UiFooter>
387
+ </UiContainer>
388
+ </template>
389
+ <style scoped>
390
+ .layout-demo { height: 240px; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; overflow: hidden; }
391
+ .layout-demo :deep(.el-main), .layout-demo :deep(.el-aside), .layout-demo :deep(.el-header), .layout-demo :deep(.el-footer) { display: flex; align-items: center; justify-content: center; box-sizing: border-box; border: 1px dashed var(--color-border, #c5d2e5); padding: 16px; }
392
+ .layout-demo :deep(.focus-region) { color: var(--color-primary, #1677ff); background: color-mix(in srgb, var(--color-primary, #1677ff) 14%, var(--color-panel, white)); border: 2px solid var(--color-primary, #1677ff); font-weight: 700; }
393
+ </style>
394
+ ```
395
+
396
+ ### UiHeaderExample
397
+
398
+ ```vue
399
+ <script setup lang="ts">
400
+ import { UiContainer, UiAside, UiHeader, UiFooter, UiMain } from 'sky-ui-kit'
401
+ </script>
402
+ <template>
403
+ <UiContainer direction="vertical" class="layout-demo">
404
+ <UiHeader height="56px" class="focus-region">顶部导航</UiHeader>
405
+ <UiMain>内容区域</UiMain>
406
+ </UiContainer>
407
+ </template>
408
+ <style scoped>
409
+ .layout-demo { height: 240px; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; overflow: hidden; }
410
+ .layout-demo :deep(.el-main), .layout-demo :deep(.el-aside), .layout-demo :deep(.el-header), .layout-demo :deep(.el-footer) { display: flex; align-items: center; justify-content: center; box-sizing: border-box; border: 1px dashed var(--color-border, #c5d2e5); padding: 16px; }
411
+ .layout-demo :deep(.focus-region) { color: var(--color-primary, #1677ff); background: color-mix(in srgb, var(--color-primary, #1677ff) 14%, var(--color-panel, white)); border: 2px solid var(--color-primary, #1677ff); font-weight: 700; }
412
+ </style>
413
+ ```
414
+
415
+ ### UiMainExample
416
+
417
+ ```vue
418
+ <script setup lang="ts">
419
+ import { UiContainer, UiAside, UiHeader, UiFooter, UiMain } from 'sky-ui-kit'
420
+ </script>
421
+ <template>
422
+ <UiContainer direction="horizontal" class="layout-demo">
423
+ <UiAside width="120px">侧栏</UiAside>
424
+ <UiMain class="focus-region">页面内容</UiMain>
425
+ </UiContainer>
426
+ </template>
427
+ <style scoped>
428
+ .layout-demo { height: 240px; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; overflow: hidden; }
429
+ .layout-demo :deep(.el-main), .layout-demo :deep(.el-aside), .layout-demo :deep(.el-header), .layout-demo :deep(.el-footer) { display: flex; align-items: center; justify-content: center; box-sizing: border-box; border: 1px dashed var(--color-border, #c5d2e5); padding: 16px; }
430
+ .layout-demo :deep(.focus-region) { color: var(--color-primary, #1677ff); background: color-mix(in srgb, var(--color-primary, #1677ff) 14%, var(--color-panel, white)); border: 2px solid var(--color-primary, #1677ff); font-weight: 700; }
431
+ </style>
432
+ ```
433
+
434
+ ### appSelectExample
435
+
436
+ ```vue
437
+ <script setup lang="ts">
438
+ import { ref } from 'vue'
439
+ import { AppSelect } from 'sky-ui-kit'
440
+ const selected = ref('hankou')
441
+ const multiple = ref(['hankou'])
442
+ const options = [{ label: '汉口站', value: 'hankou' }, { label: '宜昌站', value: 'yichang' }, { label: '维护中的站点', value: 'disabled', disabled: true }]
443
+ const message = ref('尚未操作')
444
+ // 将事件接入应用自己的查询或地图逻辑。
445
+ </script>
446
+ <template>
447
+ <AppSelect v-model="selected" :options="options" filterable clearable placeholder="搜索站点" @change="message = '单选:' + String($event)" />
448
+ <AppSelect v-model="multiple" :options="options" multiple collapse-tags placeholder="选择多个站点" @change="message = '多选:' + String($event)" />
449
+ <AppSelect model-value="hankou" :options="options" disabled />
450
+ <AppSelect :options="[]" placeholder="暂无可选站点" />
451
+ <p role="status">{{ message }}</p>
452
+ </template>
453
+ ```
454
+
455
+ ### buttonModuleExample
456
+
457
+ ```vue
458
+ <script setup lang="ts">
459
+ import { ref } from 'vue'
460
+ import { Search, Plus, Download, Delete } from '@element-plus/icons-vue'
461
+ import { UiButton } from 'sky-ui-kit'
462
+ const saving = ref(false)
463
+ const message = ref('尚未操作')
464
+ function save() { saving.value = true; message.value = '正在保存' }
465
+ function finish() { saving.value = false; message.value = '保存完成' }
466
+ </script>
467
+ <template>
468
+ <UiButton @click="message = '取消'">取消</UiButton>
469
+ <UiButton type="primary" :icon="Search" @click="message = '查询'">查询</UiButton>
470
+ <UiButton type="success" plain>确认</UiButton>
471
+ <UiButton type="warning">提醒</UiButton>
472
+ <UiButton type="info">详情</UiButton>
473
+ <UiButton type="primary" plain>主色描边</UiButton>
474
+ <UiButton type="primary" round>圆角按钮</UiButton>
475
+ <UiButton type="primary" text>文字操作</UiButton>
476
+ <UiButton type="primary" text bg>文字带背景</UiButton>
477
+ <UiButton type="primary" link>查看详情</UiButton>
478
+ <UiButton :icon="Plus" @click="message = '新增'">新增</UiButton>
479
+ <UiButton :icon="Download" @click="message = '导出'">导出</UiButton>
480
+ <UiButton type="danger" :icon="Delete" circle aria-label="删除记录" @click="message = '删除'" />
481
+ <UiButton size="small">小按钮</UiButton><UiButton>默认按钮</UiButton><UiButton size="large">大按钮</UiButton>
482
+ <UiButton disabled>禁用</UiButton><UiButton type="primary" disabled>禁用主按钮</UiButton>
483
+ <UiButton loading>加载中</UiButton>
484
+ <UiButton type="primary" :loading="saving" @click="save">保存配置</UiButton>
485
+ <UiButton :disabled="!saving" @click="finish">完成模拟保存</UiButton>
486
+ <p role="status">{{ message }}</p>
487
+ </template>
488
+ ```
489
+
490
+ ### completeElementPlusExample
491
+
492
+ ```vue
493
+ <script setup lang="ts">
494
+ import { ref } from 'vue'
495
+ import { DataAnalysis, Location } from '@element-plus/icons-vue'
496
+ import { UiAvatar, UiBreadcrumb, UiBreadcrumbItem, UiButton, UiCarousel, UiCarouselItem, UiIcon, UiInputTag, UiMenu, UiMenuItem, UiSegmented, UiSkeleton, UiSpace, UiStatistic, UiStep, UiSteps, UiSubMenu, UiText, UiTimeline, UiTimelineItem, UiTimePicker } from 'sky-ui-kit'
497
+ const menu = ref('stations')
498
+ const segment = ref('实况')
499
+ const tags = ref(['汉口站', '宜昌站'])
500
+ const time = ref<Date>()
501
+ const step = ref(1)
502
+ </script>
503
+ <template>
504
+ <UiMenu :default-active="menu" @select="menu = $event">
505
+ <UiMenuItem index="stations"><UiIcon><Location /></UiIcon><span>站点管理</span></UiMenuItem>
506
+ <UiSubMenu index="analysis">
507
+ <template #title><UiIcon><DataAnalysis /></UiIcon><span>数据分析</span></template>
508
+ <UiMenuItem index="rain">降雨分析</UiMenuItem>
509
+ <UiMenuItem index="flow">径流分析</UiMenuItem>
510
+ </UiSubMenu>
511
+ </UiMenu>
512
+ <p>菜单选择事件:{{ menu }}</p>
513
+ <UiBreadcrumb separator="/"><UiBreadcrumbItem>监测中心</UiBreadcrumbItem><UiBreadcrumbItem>站点管理</UiBreadcrumbItem></UiBreadcrumb>
514
+ <UiSegmented v-model="segment" :options="['实况', '预报', '历史']" />
515
+ <p>当前模式:{{ segment }}</p>
516
+ <UiInputTag v-model="tags" placeholder="添加站点标签" />
517
+ <UiTimePicker v-model="time" placeholder="选择观测时间" />
518
+ <UiSteps :active="step" finish-status="success"><UiStep title="选择数据" /><UiStep title="配置分析" /><UiStep title="查看结果" /></UiSteps>
519
+ <UiButton @click="step = (step + 1) % 4">下一步</UiButton>
520
+ <UiTimeline><UiTimelineItem timestamp="08:00" type="primary">接收观测数据</UiTimelineItem><UiTimelineItem timestamp="09:00" type="success">完成质量检查</UiTimelineItem><UiTimelineItem timestamp="10:00">生成分析结果</UiTimelineItem></UiTimeline>
521
+ <UiSpace><UiAvatar>水</UiAvatar><UiText type="primary">实时监测</UiText></UiSpace>
522
+ <UiStatistic title="正常站点" :value="128" />
523
+ <UiSkeleton :rows="2" animated />
524
+ <UiCarousel height="100px" :autoplay="false"><UiCarouselItem v-for="label in ['实时监测', '趋势分析', '预报产品']" :key="label"><div style="display: grid; place-items: center; height: 100%">{{ label }}</div></UiCarouselItem></UiCarousel>
525
+ </template>
526
+ ```
527
+
63
528
  ### componentsExample
64
529
 
65
530
  ```vue
@@ -91,6 +556,107 @@ const ranges = [{ key: '1h', label: '近1小时' }, { key: '24h', label: '近24
91
556
  <!-- 这些组件保留 v-model 交互;可通过 @change 接收值变化。 -->
92
557
  ```
93
558
 
559
+ ### containerExample
560
+
561
+ ```vue
562
+ <script setup lang="ts">
563
+ import { ref } from 'vue'
564
+ import { ElScrollbar } from 'element-plus'
565
+ import { UiContainer, UiHeader, UiAside, UiMain, UiButton } from 'sky-ui-kit'
566
+ const collapsed = ref(false)
567
+ </script>
568
+ <template>
569
+ <UiContainer direction="vertical" class="app-layout">
570
+ <UiHeader height="var(--header-height, 58px)">应用导航</UiHeader>
571
+ <UiContainer>
572
+ <UiAside :width="collapsed ? '64px' : 'var(--sidebar-width, 244px)'">业务菜单</UiAside>
573
+ <UiMain>
574
+ <UiButton @click="collapsed = !collapsed">切换侧栏</UiButton>
575
+ <ElScrollbar height="200px"><p v-for="index in 10" :key="index">页面内容 {{ index }}</p></ElScrollbar>
576
+ <!-- 业务项目可在此放 RouterView,保留自己的路由和权限。 -->
577
+ </UiMain>
578
+ </UiContainer>
579
+ </UiContainer>
580
+ </template>
581
+ <style scoped>
582
+ .app-layout { min-height: 300px; color: var(--color-text, #1f2937); background: var(--color-panel, white); }
583
+ .app-layout :deep(.el-main) { min-width: 0; min-height: 0; }
584
+ .app-layout :deep(.el-header), .app-layout :deep(.el-aside) { background: var(--surface-control, #eef5ff); }
585
+ </style>
586
+ ```
587
+
588
+ ### fullLayoutExample
589
+
590
+ ```vue
591
+ <script setup lang="ts">
592
+ import { UiContainer, UiHeader, UiAside, UiMain, UiFooter } from 'sky-ui-kit'
593
+ </script>
594
+ <template>
595
+ <UiContainer direction="vertical" class="full-layout">
596
+ <UiHeader height="56px">顶栏 · 顶部导航</UiHeader>
597
+ <UiContainer class="content-row">
598
+ <UiAside width="160px">左侧栏 · 业务菜单</UiAside>
599
+ <UiMain>主体 · 页面内容</UiMain>
600
+ </UiContainer>
601
+ <UiFooter height="48px">底栏 · 状态信息</UiFooter>
602
+ </UiContainer>
603
+ </template>
604
+ <style scoped>
605
+ .full-layout { height: 320px; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; overflow: hidden; }
606
+ .full-layout :deep(.content-row) { flex: 1; min-height: 0; }
607
+ .full-layout :deep(.el-header), .full-layout :deep(.el-footer), .full-layout :deep(.el-aside), .full-layout :deep(.el-main) { display: flex; align-items: center; justify-content: center; border: 1px dashed var(--color-border, #c5d2e5); box-sizing: border-box; }
608
+ .full-layout :deep(.el-header), .full-layout :deep(.el-footer) { background: color-mix(in srgb, var(--color-primary, #1677ff) 14%, var(--color-panel, white)); }
609
+ .full-layout :deep(.el-aside) { background: var(--color-surface, #f4f7fb); }
610
+ .full-layout :deep(.el-main) { background: var(--color-panel, white); }
611
+ </style>
612
+ ```
613
+
614
+ ### iconsExample
615
+
616
+ ```vue
617
+ <script setup lang="ts">
618
+ import { ref, h } from 'vue'
619
+ import { Search } from '@element-plus/icons-vue'
620
+ import { UiIcon, UiButton, SvgIcon, MapSideMenu } from 'sky-ui-kit'
621
+ const active = ref('rain')
622
+ const message = ref('尚未操作')
623
+ // 菜单 icon 接收 Vue 组件,用 h 绑定项目 SVG 名称。
624
+ const RainIcon = () => h(SvgIcon, { name: 'ii_rain' })
625
+ const items = [{ key: 'rain', label: '降水', icon: RainIcon }]
626
+ </script>
627
+ <template>
628
+ <UiIcon :size="24" color="var(--color-primary, #1677ff)"><Search /></UiIcon>
629
+ <SvgIcon name="ii_rain" :size="24" :decorative="false" title="降水" />
630
+ <UiButton :icon="Search" @click="message = '搜索事件由业务方处理'">搜索</UiButton>
631
+ <UiButton @click="message = '查看降水'"><SvgIcon name="ii_rain" />查看降水</UiButton>
632
+ <UiButton disabled :icon="Search">不可用</UiButton>
633
+ <UiButton loading>加载中</UiButton>
634
+ <MapSideMenu v-model:active="active" :items="items" @select="message = '选择:' + $event.label" />
635
+ <p role="status">{{ message }}</p>
636
+ </template>
637
+ ```
638
+
639
+ ### mapTimelineExample
640
+
641
+ ```vue
642
+ <script setup lang="ts">
643
+ import { ref } from 'vue'
644
+ import { MapTimeline } from 'sky-ui-kit'
645
+ const frame = ref(6)
646
+ const playing = ref(false)
647
+ const message = ref('尚未操作')
648
+ // 将事件接入应用自己的查询或地图逻辑。
649
+ </script>
650
+ <template>
651
+ <MapTimeline v-model="frame" v-model:playing="playing"
652
+ start-time="2026-10-08T08:00:00+08:00" time-zone="Asia/Shanghai"
653
+ :past-steps="6" :future-steps="12" :page-size="18"
654
+ @change="message = '当前时间:' + $event.label" />
655
+ <p>当前帧:{{ frame }} · {{ playing ? '播放中' : '已暂停' }}</p>
656
+ <p role="status">{{ message }}</p>
657
+ </template>
658
+ ```
659
+
94
660
  ### mapToolsExample
95
661
 
96
662
  ```vue
@@ -183,45 +749,2326 @@ function onSelect(item: { key: string; label: string }) {
183
749
  <!-- MapSideMenu 的搜索、分组收起和图标模式切换由组件内部完成。 -->
184
750
  ```
185
751
 
186
- # Component API reference
752
+ ### timeRangeExample
187
753
 
188
- Generated from Vue/TypeScript source; defaultExpression is source text, not evaluated JSON. Types refer to declarations below. Unlisted props must not be invented. For Element Plus components use upstream documentation and shipped typings.
754
+ ```vue
755
+ <script setup lang="ts">
756
+ import { ref } from 'vue'
757
+ import { TimeRangeQuickSelect } from 'sky-ui-kit'
758
+ const range = ref('24h')
759
+ const options = [{ key: '1h', label: '近1小时' }, { key: '24h', label: '近24小时' }, { key: '3d', label: '近3天' }, { key: '7d', label: '近7天' }]
760
+ const message = ref('尚未操作')
761
+ // 将事件接入应用自己的查询或地图逻辑。
762
+ </script>
763
+ <template>
764
+ <TimeRangeQuickSelect v-model="range" :options="options" @change="message = '切换范围:' + $event.label" />
765
+ <p>当前范围:{{ range }}</p>
766
+ <p role="status">{{ message }}</p>
767
+ </template>
768
+ ```
189
769
 
190
- ## AppSelect
770
+ ### treeSelectExample
191
771
 
192
- ### Props
772
+ ```vue
773
+ <script setup lang="ts">
774
+ import { ref } from 'vue'
775
+ import { TreeSelectPanel } from 'sky-ui-kit'
776
+ const region = ref<string | number | null>('hubei')
777
+ const dark = ref(false)
778
+ const categories = [
779
+ { type: 'region', label: '行政区', children: [{ id: 'hubei', label: '湖北省', children: [{ id: 'wuhan', label: '武汉市', tag: '市' }] }, { id: 'hunan', label: '湖南省' }] },
780
+ { type: 'basin', label: '流域', children: [{ id: 'yangtze', label: '长江流域', children: [{ id: 'dongting', label: '洞庭湖', tag: '湖区' }] }] }
781
+ ]
782
+ const message = ref('尚未操作')
783
+ // 将事件接入应用自己的查询或地图逻辑。
784
+ </script>
785
+ <template>
786
+ <TreeSelectPanel v-model="region" :categories="categories" :dark="dark" close-on-select
787
+ @change="message = $event.category.label + ':' + $event.node.label" />
788
+ <p>当前节点:{{ region }}</p>
789
+ <p role="status">{{ message }}</p>
790
+ </template>
791
+ ```
193
792
 
194
- | Name | Type | Required | Default expression |
195
- |---|---|---|---|
196
- | modelValue | AppSelectValue | false | undefined |
197
- | options | AppSelectOption[] | false | () => [] |
198
- | emptyLabel | string | false | '暂无可选项' |
199
- | popperClass | string | false | '' |
200
- | teleported | boolean | false | false |
793
+ ### 完整项目布局组合示例
201
794
 
202
- ### Events
795
+ ```vue
796
+ <script setup lang="ts">
797
+ import { computed, ref } from 'vue'
798
+ import { ElScrollbar } from 'element-plus'
799
+ import { UiContainer, UiHeader, UiAside, UiMain, UiButton, UiInput, UiTable, UiTableColumn, ProjectMenu, MapSideMenu, MapTools, MapTimeline, SvgIcon } from 'sky-ui-kit'
800
+ const page = ref('stations')
801
+ const collapsed = ref(false)
802
+ const keyword = ref('')
803
+ const rightOpen = ref(true)
804
+ const activeLayer = ref('rain')
805
+ const tool = ref('layers')
806
+ const frame = ref(0)
807
+ const message = ref('请选择菜单或工具')
808
+ const navigation = [{ key: 'stations', label: '测站管理' }, { key: 'users', label: '用户管理' }]
809
+ const layers = [{ key: 'rain', label: '降水' }, { key: 'water', label: '水位' }]
810
+ const rows = [{ name: '汉口站', region: '长江流域', value: 28.6 }, { name: '宜昌站', region: '长江流域', value: 42.3 }, { name: '城陵矶站', region: '洞庭湖流域', value: 16.8 }]
811
+ const filtered = computed(() => rows.filter(row => `${row.name}${row.region}`.includes(keyword.value)))
812
+ const startTime = '2026-10-12T00:00:00+08:00'
813
+ </script>
814
+ <template>
815
+ <h3>项目系统页:导航、查询与数据列表</h3>
816
+ <UiContainer direction="vertical" class="business-system">
817
+ <UiHeader height="58px" class="system-header"><strong>一体化平台</strong><span>数据维护 / {{ page === 'stations' ? '测站管理' : '用户管理' }}</span><UiButton size="small" @click="collapsed = !collapsed">{{ collapsed ? '展开菜单' : '收起菜单' }}</UiButton></UiHeader>
818
+ <UiContainer><UiAside :width="collapsed ? '0px' : '160px'" class="system-aside"><ProjectMenu direction="vertical" :groups="[{ label: '数据维护', items: navigation }]" v-model:active="page" /></UiAside><UiMain class="system-main"><ElScrollbar height="260px"><template v-if="page === 'stations'"><h4>测站管理</h4><div class="query-row"><UiInput v-model="keyword" clearable placeholder="输入测站或流域名称" /><UiButton type="primary" @click="message = '查询结果:' + filtered.length + ' 个测站'">查询</UiButton><UiButton @click="keyword = ''">重置</UiButton></div><UiTable :data="filtered" empty-text="没有匹配测站"><UiTableColumn prop="name" label="测站" /><UiTableColumn prop="region" label="流域" /><UiTableColumn prop="value" label="水位 (m)" /></UiTable></template><template v-else><h4>用户管理</h4><p>此区域由应用的 RouterView 渲染;用户、角色和权限继续由业务项目管理。</p><UiButton @click="page = 'stations'">返回测站</UiButton></template></ElScrollbar></UiMain></UiContainer>
819
+ </UiContainer>
820
+ <h3>项目无菜单页:顶部导航与整宽内容</h3>
821
+ <UiContainer direction="vertical" class="no-menu"><UiHeader height="58px" class="system-header"><strong>一体化平台</strong><span>专题概览</span></UiHeader><UiMain><h4>专题内容</h4><p>对应 MainLayoutNoMenu / ContentLayoutNomenu,内容不预留左栏宽度,保留原路由和主题。</p></UiMain></UiContainer>
822
+ <h3>项目地图页:菜单、工具、图例、时间轴与业务面板</h3>
823
+ <p class="muted">参考降水页面的 content / legend / timeline / right 插槽组合。底层为示意背景;真实地图实例和数据查询由应用接入。</p>
824
+ <div class="business-map" :class="{ 'with-right': rightOpen }">
825
+ <div class="map-host">地图宿主 · 当前图层:{{ activeLayer === 'rain' ? '降水' : '水位' }}</div>
826
+ <div class="map-overlay">
827
+ <header class="map-header"><strong>实况(测站)</strong><UiButton size="small" @click="rightOpen = !rightOpen">{{ rightOpen ? '收起业务面板' : '展开业务面板' }}</UiButton></header>
828
+ <div class="map-menu"><MapSideMenu title="监测要素" :items="layers" v-model:active="activeLayer" @select="message = '已选择:' + $event.label" /></div>
829
+ <div class="map-tools"><MapTools v-model:active="tool" @tool-click="message = '地图工具:' + $event" @context-change="message = '右键菜单:' + ($event ? '开启' : '关闭')" /></div>
830
+ <aside v-if="rightOpen" class="map-panel"><h4>测站数据</h4><ElScrollbar height="200px"><button v-for="row in rows" :key="row.name" class="station-row" @click="message = '定位请求由应用处理:' + row.name"><SvgIcon name="ii_water" />{{ row.name }}<strong>{{ row.value }} m</strong></button></ElScrollbar><p>点击测站查看事件反馈</p></aside>
831
+ <div class="map-legend"><strong>降水图例(mm)</strong><span v-for="(level, index) in ['0–10', '10–25', '25–50']" :key="level"><i :style="{ background: ['#b8e7ff', '#4aa3df', '#2563a7'][index] }" />{{ level }}</span></div>
832
+ <div class="map-timeline"><MapTimeline v-model="frame" :start-time="startTime" :steps="12" @change="message = '时间帧:' + $event.index" /></div>
833
+ </div>
834
+ </div>
835
+ <p role="status">{{ message }}</p>
836
+ </template>
837
+ <style scoped>
838
+ .business-system, .no-menu { border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow: hidden; margin: 16px 0 28px; background: var(--color-panel, white); }
839
+ .system-header { display: flex; align-items: center; gap: 16px; background: var(--surface-control, #eef5ff); border-bottom: 1px solid var(--color-border, #dbe3ef); }
840
+ .system-header span { flex: 1; } .system-aside { background: var(--app-sidebar-bg, #eef5ff); overflow: hidden; } .system-main { min-width: 0; min-height: 0; } .query-row { display: flex; gap: 8px; margin-bottom: 16px; }
841
+ .business-map { height: 560px; position: relative; overflow: hidden; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; --preview-right: 0px; }
842
+ .business-map.with-right { --preview-right: 220px; } .map-host { position: absolute; inset: 0; display: grid; place-items: center; color: var(--color-muted, #64748b); background: var(--surface-control, #eef5ff); }
843
+ .map-overlay { position: absolute; inset: 0; pointer-events: none; } .map-overlay > * { pointer-events: auto; }
844
+ .map-header { position: absolute; left: 12px; right: 12px; top: 12px; display: flex; justify-content: space-between; align-items: center; }
845
+ .map-menu { position: absolute; left: 12px; top: 64px; width: 160px; } .map-tools { position: absolute; top: 64px; right: calc(var(--preview-right) + 12px); }
846
+ .map-panel { position: absolute; right: 12px; top: 64px; width: 196px; padding: 10px; border-radius: 8px; background: var(--color-panel, white); box-sizing: border-box; }
847
+ .station-row { display: flex; gap: 8px; align-items: center; width: 100%; padding: 12px 4px; border: 0; border-bottom: 1px solid var(--color-border, #dbe3ef); background: transparent; color: var(--color-text, #1f2937); cursor: pointer; } .station-row strong { margin-left: auto; }
848
+ .map-legend { position: absolute; left: 12px; bottom: 138px; padding: 10px; background: var(--color-panel, white); border-radius: 8px; display: grid; gap: 6px; } .map-legend i { display: inline-block; width: 20px; height: 8px; margin-right: 8px; }
849
+ .map-timeline { position: absolute; left: 12px; right: calc(var(--preview-right) + 12px); bottom: 12px; background: var(--color-panel, white); border-radius: 8px; overflow: auto; padding: 8px; }
850
+ @media (max-width: 700px) { .business-map { height: 740px; } .business-map.with-right { --preview-right: 0px; } .map-panel { top: 350px; } .map-legend { bottom: 150px; } .system-header { flex-wrap: wrap; gap: 6px; font-size: 12px; } .query-row { flex-wrap: wrap; } }
851
+ </style>
203
852
 
204
- - `update:modelValue` — `[value: AppSelectValue]`
205
- - `change` — `[value: AppSelectValue]`
853
+ ```
206
854
 
207
- Slots: No declared content slots.
855
+ ### 布局变体:横向导航、双侧栏与上下分区
856
+
857
+ ```vue
858
+ <script setup lang="ts">
859
+ import { ref } from 'vue'
860
+ import { UiContainer, UiHeader, UiAside, UiMain, UiFooter, UiButton, ProjectMenu } from 'sky-ui-kit'
861
+ const active = ref('overview')
862
+ const rightOpen = ref(true)
863
+ const bottomOpen = ref(true)
864
+ const items = [{ key: 'overview', label: '运行概览' }, { key: 'data', label: '数据维护' }, { key: 'analysis', label: '分析报表' }]
865
+ </script>
866
+ <template>
867
+ <h3>横向导航布局:顶部菜单 + 整宽工作区</h3>
868
+ <p class="muted">参考原 Header 的横向应用菜单;适合导航较少的专题与工作台。ProjectMenu 只负责菜单展示,select 由业务方接路由。</p>
869
+ <UiContainer direction="vertical" class="variant"><UiHeader height="auto" class="top"><strong>一体化平台</strong><ProjectMenu :items="items" v-model:active="active" /></UiHeader><UiMain><h4>{{ items.find(item => item.key === active)?.label }}</h4><p>整宽内容区域,不预留左侧菜单。</p></UiMain><UiFooter height="40px" class="foot">可选状态栏 · 当前模块 {{ active }}</UiFooter></UiContainer>
870
+ <h3>双侧栏布局:功能导航 + 主内容 + 信息面板</h3>
871
+ <p class="muted">适合列表与详情并列、参数配置与结果展示。右侧是普通信息区;地图浮动业务面板使用上方地图布局。</p>
872
+ <UiButton size="small" @click="rightOpen = !rightOpen">{{ rightOpen ? '隐藏信息栏' : '显示信息栏' }}</UiButton>
873
+ <UiContainer direction="vertical" class="variant"><UiHeader height="58px" class="top">数据分析工作台</UiHeader><UiContainer><UiAside width="130px" class="side">功能导航<br>测站 / 数据 / 分析</UiAside><UiMain><h4>主工作区</h4><p>查询结果、业务表格或图表。</p></UiMain><UiAside v-if="rightOpen" width="170px" class="side">信息与参数<br>当前测站:汉口站<br>业务详情由页面传入</UiAside></UiContainer></UiContainer>
874
+ <h3>上下分区布局:主视图 + 底部过程区</h3>
875
+ <p class="muted">参考地图页的过程图/时间轴位置;用于主视图与辅助结果分区。这里采用普通文档布局,底部开关由页面控制。</p>
876
+ <UiButton size="small" @click="bottomOpen = !bottomOpen">{{ bottomOpen ? '收起过程区' : '展开过程区' }}</UiButton>
877
+ <UiContainer direction="vertical" class="variant"><UiHeader height="58px" class="top">监测分析</UiHeader><UiMain class="main-view"><h4>主视图</h4><p>地图、图表或数据概览宿主</p></UiMain><UiFooter v-if="bottomOpen" height="100px" class="bottom"><strong>过程区</strong><p>时间轴 / 过程曲线 / 结果摘要</p></UiFooter></UiContainer>
878
+ </template>
879
+ <style scoped>
880
+ .variant { margin: 16px 0 28px; overflow: hidden; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; background: var(--color-panel, white); color: var(--color-text, #1f2937); }
881
+ .top { display: flex; align-items: center; gap: 16px; padding: 14px; background: var(--surface-control, #eef5ff); border-bottom: 1px solid var(--color-border, #dbe3ef); }
882
+ .side { padding: 16px; line-height: 2; background: var(--app-sidebar-bg, #eef5ff); }
883
+ .foot, .bottom { padding: 12px; background: var(--surface-control, #eef5ff); border-top: 1px solid var(--color-border, #dbe3ef); }
884
+ .main-view { min-height: 180px; } .variant :deep(.el-main) { min-width: 0; min-height: 0; }
885
+ @media (max-width: 600px) { .top { flex-wrap: wrap; } .variant :deep(.el-container) { flex-wrap: wrap; } .side { max-width: 30%; padding: 8px; font-size: 12px; } }
886
+ </style>
208
887
 
209
- ```ts
210
- export type AppSelectValue = string | number | boolean | Record<string, unknown> | AppSelectValue[] | null | undefined
211
- export type AppSelectOption = {
212
- label: string
213
- value: AppSelectValue
214
- disabled?: boolean
215
- } | string | number
216
888
  ```
217
889
 
218
- ## MapTimeline
890
+ ### 地图业务布局轮廓示例
219
891
 
220
- ### Props
892
+ ```vue
893
+ <script setup lang="ts">
894
+ import { ref } from 'vue'
895
+ import { UiButton } from 'sky-ui-kit'
896
+ const rightOpen = ref(true)
897
+ const timelineVisible = ref(true)
898
+ </script>
899
+ <template>
900
+ <div class="template-demo" :class="{ 'right-open': rightOpen }">
901
+ <div class="map-placeholder">地图宿主(由 MainLayoutMap 提供)</div>
902
+ <div class="top-region">top · 标题 / 查询条件</div>
903
+ <div class="toolbar-region"><span>toolbar · 地图工具</span><UiButton size="small" @click="rightOpen = !rightOpen">{{ rightOpen ? '收起右栏' : '展开右栏' }}</UiButton><UiButton size="small" @click="timelineVisible = !timelineVisible">切换时间轴</UiButton></div>
904
+ <aside v-if="rightOpen" class="right-region">right · 业务面板<br>测站详情 / 过程数据</aside>
905
+ <div class="content-region">content · 业务浮层</div>
906
+ <div class="legend-region" :class="{ 'above-timeline': timelineVisible }">legend · 图例</div>
907
+ <div v-if="timelineVisible" class="timeline-region">timeline · 实况 / 预报时间轴</div>
908
+ </div>
909
+ </template>
910
+ <style scoped>
911
+ .template-demo { position: relative; height: 360px; overflow: hidden; border: 2px solid var(--color-border, #c5d2e5); border-radius: 8px; --demo-panel-width: min(220px, 30%); --demo-right-offset: 12px; }
912
+ .right-open { --demo-right-offset: calc(var(--demo-panel-width) + 24px); }
913
+ .map-placeholder { position: absolute; inset: 0; display: grid; place-items: center; color: var(--color-muted, #748096); background-color: var(--color-surface, #f4f7fb); background-image: linear-gradient(var(--color-border, #dbe3ef) 1px, transparent 1px), linear-gradient(90deg, var(--color-border, #dbe3ef) 1px, transparent 1px); background-size: 32px 32px; }
914
+ .top-region, .toolbar-region, .right-region, .content-region, .legend-region, .timeline-region { position: absolute; padding: 12px; box-sizing: border-box; border: 1px solid var(--color-primary, #1677ff); border-radius: 6px; background: var(--color-panel, white); color: var(--color-text, #1f2937); }
915
+ .top-region { top: 12px; left: 12px; }
916
+ .toolbar-region { top: 64px; right: var(--demo-right-offset); display: flex; gap: 8px; align-items: center; flex-wrap: wrap; max-width: 65%; }
917
+ .right-region { top: 12px; right: 12px; bottom: 12px; width: var(--demo-panel-width); }
918
+ .content-region { top: 124px; left: 12px; }
919
+ .legend-region { bottom: 12px; right: var(--demo-right-offset); }
920
+ .legend-region.above-timeline { bottom: 76px; }
921
+ .timeline-region { bottom: 12px; left: 12px; right: var(--demo-right-offset); text-align: center; }
922
+ </style>
221
923
 
222
- | Name | Type | Required | Default expression |
223
- |---|---|---|---|
224
- | modelValue | number | false | 0 |
924
+ ```
925
+
926
+ ### UiDivider 独立使用示例
927
+
928
+ ```vue
929
+ <script setup lang="ts">
930
+ import { UiDivider } from 'sky-ui-kit'
931
+ </script>
932
+ <template>
933
+ <p>测站基础信息</p><UiDivider /><p>监测数据</p>
934
+ <UiDivider content-position="left">左侧标题</UiDivider>
935
+ <UiDivider>居中标题</UiDivider>
936
+ <UiDivider content-position="right" border-style="dashed">虚线分隔</UiDivider>
937
+ <div>实况<UiDivider direction="vertical" />预报<UiDivider direction="vertical" />历史</div>
938
+ </template>
939
+
940
+ ```
941
+
942
+ ### UiLink 独立使用示例
943
+
944
+ ```vue
945
+ <script setup lang="ts">
946
+ import { ref } from 'vue'
947
+ import { View } from '@element-plus/icons-vue'
948
+ import { UiLink, UiSpace } from 'sky-ui-kit'
949
+ const message = ref('尚未操作')
950
+ </script>
951
+ <template>
952
+ <UiSpace wrap :size="16">
953
+ <UiLink @click="message = '查看测站详情'">默认链接</UiLink>
954
+ <UiLink v-for="type in ['primary', 'success', 'warning', 'danger', 'info'] as const" :key="type" :type="type" @click="message = type">{{ type }}</UiLink>
955
+ <UiLink disabled>禁用链接</UiLink>
956
+ <UiLink type="primary" :underline="false" :icon="View" @click="message = '查看详情'">查看详情</UiLink>
957
+ <UiLink href="https://element-plus.org/" target="_blank" rel="noopener noreferrer">外部文档</UiLink>
958
+ </UiSpace>
959
+ <p role="status">{{ message }}</p>
960
+ </template>
961
+
962
+ ```
963
+
964
+ ### UiSpace 独立使用示例
965
+
966
+ ```vue
967
+ <script setup lang="ts">
968
+ import { ref } from 'vue'
969
+ import { UiSpace, UiButton } from 'sky-ui-kit'
970
+ const gap = ref(16)
971
+ </script>
972
+ <template>
973
+ <UiButton @click="gap = gap === 16 ? 32 : 16">切换间距:{{ gap }} px</UiButton>
974
+ <h3>水平排列与自动换行</h3>
975
+ <UiSpace wrap :size="gap"><UiButton v-for="name in ['查询', '重置', '导出']" :key="name">{{ name }}</UiButton></UiSpace>
976
+ <h3>垂直排列</h3>
977
+ <UiSpace direction="vertical" alignment="start" :size="gap"><span>测站信息</span><span>监测数据</span><span>更新时间</span></UiSpace>
978
+ </template>
979
+
980
+ ```
981
+
982
+ ### UiText 独立使用示例
983
+
984
+ ```vue
985
+ <script setup lang="ts">
986
+ import { UiText, UiSpace } from 'sky-ui-kit'
987
+ </script>
988
+ <template>
989
+ <UiSpace wrap :size="16">
990
+ <UiText>默认正文</UiText>
991
+ <UiText v-for="type in ['primary', 'success', 'warning', 'danger', 'info'] as const" :key="type" :type="type">{{ type }} 文本</UiText>
992
+ </UiSpace>
993
+ <p><UiText size="small">小号文本</UiText> <UiText>默认尺寸</UiText> <UiText size="large">大号文本</UiText></p>
994
+ <p><UiText tag="b">重要说明</UiText> <UiText tag="i">辅助说明</UiText></p>
995
+ <div style="width: 180px"><UiText truncated>汉口站实时监测数据与历史过程信息,超出宽度省略</UiText></div>
996
+ <div style="width: 220px"><UiText :line-clamp="2">多行数据说明:这里展示测站监测情况、更新时间和数据来源,超出两行的内容将自动省略。</UiText></div>
997
+ </template>
998
+
999
+ ```
1000
+
1001
+ ### UiForm 独立使用示例
1002
+
1003
+ ```vue
1004
+ <script setup lang="ts">
1005
+ import { reactive, ref } from 'vue'
1006
+ import type { FormInstance, FormRules } from 'element-plus'
1007
+ import { Search } from '@element-plus/icons-vue'
1008
+ import { UiForm, UiFormItem, UiInput, UiSelect, UiOption, UiDatePicker, UiInputNumber, UiRadioGroup, UiRadio, UiCheckboxGroup, UiCheckbox, UiSwitch, UiButton } from 'sky-ui-kit'
1009
+ const formRef = ref<FormInstance>()
1010
+ const disabled = ref(false)
1011
+ const result = ref('填写表单后提交,查看校验和数据反馈')
1012
+ const model = reactive({ name: '', basin: '', date: '', threshold: 20, mode: 'observed', elements: ['rain'], enabled: true, remark: '' })
1013
+ const rules: FormRules = {
1014
+ name: [{ required: true, message: '请输入测站名称', trigger: 'blur' }],
1015
+ basin: [{ required: true, message: '请选择流域', trigger: 'change' }],
1016
+ }
1017
+ async function submit() {
1018
+ if (!formRef.value) return
1019
+ const valid = await formRef.value.validate().catch(() => false)
1020
+ result.value = valid ? '模拟提交:' + JSON.stringify(model) : '校验未通过,请补全必填项'
1021
+ // 实际保存请求由业务方接入。
1022
+ }
1023
+ function reset() { formRef.value?.resetFields(); result.value = '表单已重置' }
1024
+ </script>
1025
+ <template>
1026
+ <UiSwitch v-model="disabled" active-text="禁用表单" />
1027
+ <UiForm ref="formRef" :model="model" :rules="rules" :disabled="disabled" label-width="100px" class="station-form" @submit.prevent="submit">
1028
+ <UiFormItem label="测站名称" prop="name"><UiInput v-model="model.name" clearable placeholder="请输入测站名称" /></UiFormItem>
1029
+ <UiFormItem label="所属流域" prop="basin"><UiSelect v-model="model.basin" clearable placeholder="选择流域"><UiOption label="长江流域" value="yangtze" /><UiOption label="黄河流域" value="yellow" /></UiSelect></UiFormItem>
1030
+ <UiFormItem label="观测日期" prop="date"><UiDatePicker v-model="model.date" type="date" value-format="YYYY-MM-DD" placeholder="选择日期" /></UiFormItem>
1031
+ <UiFormItem label="预警阈值" prop="threshold"><UiInputNumber v-model="model.threshold" :min="0" :max="200" :step="5" /></UiFormItem>
1032
+ <UiFormItem label="数据类型" prop="mode"><UiRadioGroup v-model="model.mode"><UiRadio value="observed">实况</UiRadio><UiRadio value="forecast">预报</UiRadio></UiRadioGroup></UiFormItem>
1033
+ <UiFormItem label="监测要素" prop="elements"><UiCheckboxGroup v-model="model.elements"><UiCheckbox value="rain">降雨</UiCheckbox><UiCheckbox value="water">水位</UiCheckbox></UiCheckboxGroup></UiFormItem>
1034
+ <UiFormItem label="启用监测" prop="enabled"><UiSwitch v-model="model.enabled" /></UiFormItem>
1035
+ <UiFormItem label="备注" prop="remark"><UiInput v-model="model.remark" type="textarea" :rows="3" maxlength="200" show-word-limit /></UiFormItem>
1036
+ <UiFormItem><UiButton type="primary" :icon="Search" native-type="submit">校验并提交</UiButton><UiButton @click="reset">重置</UiButton></UiFormItem>
1037
+ </UiForm>
1038
+ <p role="status" class="form-result">{{ result }}</p>
1039
+ </template>
1040
+ <style scoped>
1041
+ .station-form { max-width: 640px; margin-top: 20px; }
1042
+ .form-result { overflow-wrap: anywhere; padding: 12px; background: var(--color-surface, #f4f7fb); border: 1px solid var(--color-border, #dbe3ef); border-radius: 6px; }
1043
+ </style>
1044
+
1045
+ ```
1046
+
1047
+ ### UiAutocomplete 独立使用示例
1048
+
1049
+ ```vue
1050
+ <script setup lang="ts">
1051
+ import { ref } from 'vue'
1052
+ import { Search } from '@element-plus/icons-vue'
1053
+ import { UiAutocomplete } from 'sky-ui-kit'
1054
+ const station = ref('')
1055
+ const onInputStation = ref('')
1056
+ const message = ref('输入站名或流域,选择建议项')
1057
+ const stations = [
1058
+ { value: '汉口站', basin: '长江流域', id: 'hankou' },
1059
+ { value: '宜昌站', basin: '长江流域', id: 'yichang' },
1060
+ { value: '城陵矶站', basin: '洞庭湖流域', id: 'chenglingji' },
1061
+ ]
1062
+ function suggestions(query: string, callback: (items: typeof stations) => void) {
1063
+ const keyword = query.trim().toLowerCase()
1064
+ callback(stations.filter(item => (item.value + item.basin).toLowerCase().includes(keyword)))
1065
+ // 实际远程查询由应用提供,查询结束后调用 callback。
1066
+ }
1067
+ function selected(item: Record<string, any>) { message.value = '已选择:' + item.value + ' · ' + item.basin + ' · ' + item.id }
1068
+ </script>
1069
+ <template>
1070
+ <h3>站点搜索 · 聚焦显示建议</h3>
1071
+ <UiAutocomplete v-model="station" :fetch-suggestions="suggestions" :prefix-icon="Search" clearable
1072
+ placeholder="输入汉口、宜昌或长江" @select="selected" @clear="message = '已清空站点'">
1073
+ <template #default="{ item }"><strong>{{ item.value }}</strong><span class="basin-label">{{ item.basin }}</span></template>
1074
+ </UiAutocomplete>
1075
+ <p role="status">{{ message }}</p>
1076
+ <h3>仅输入后显示建议</h3>
1077
+ <UiAutocomplete v-model="onInputStation" :fetch-suggestions="suggestions" :trigger-on-focus="false" clearable placeholder="输入站点关键词" @select="selected" />
1078
+ <h3>禁用状态</h3>
1079
+ <UiAutocomplete model-value="汉口站" :fetch-suggestions="suggestions" disabled />
1080
+ </template>
1081
+ <style scoped>
1082
+ .basin-label { margin-left: 16px; color: var(--color-muted, #748096); }
1083
+ </style>
1084
+
1085
+ ```
1086
+
1087
+ ### UiTimePicker 独立交互示例
1088
+
1089
+ ```vue
1090
+ <script setup lang="ts">
1091
+ import { ref } from 'vue'
1092
+ import { UiTimePicker } from 'sky-ui-kit'
1093
+ const value = ref<Date>()
1094
+ const message = ref('尚未操作')
1095
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1096
+ </script>
1097
+ <template>
1098
+ <div class="control-demo">
1099
+ <UiTimePicker v-model="value" placeholder="选择观测时间" clearable @change="record" />
1100
+ <p>当前值:{{ value }}</p>
1101
+ <p role="status">{{ message }}</p>
1102
+ </div>
1103
+ </template>
1104
+ <style scoped>
1105
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1106
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1107
+ </style>
1108
+
1109
+ ```
1110
+
1111
+ ### UiSelect 独立交互示例
1112
+
1113
+ ```vue
1114
+ <script setup lang="ts">
1115
+ import { ref } from 'vue'
1116
+ import { UiSelect, UiOption } from 'sky-ui-kit'
1117
+ const value = ref('rain')
1118
+ const message = ref('尚未操作')
1119
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1120
+ </script>
1121
+ <template>
1122
+ <div class="control-demo">
1123
+ <UiSelect v-model="value" filterable clearable placeholder="选择要素" @change="record"><UiOption label="降雨" value="rain" /><UiOption label="水位" value="water" /><UiOption label="不可用" value="disabled" disabled /></UiSelect>
1124
+ <p>当前值:{{ value }}</p>
1125
+ <p role="status">{{ message }}</p>
1126
+ </div>
1127
+ </template>
1128
+ <style scoped>
1129
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1130
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1131
+ </style>
1132
+
1133
+ ```
1134
+
1135
+ ### UiCheckbox 独立交互示例
1136
+
1137
+ ```vue
1138
+ <script setup lang="ts">
1139
+ import { ref } from 'vue'
1140
+ import { UiCheckbox, UiCheckboxGroup } from 'sky-ui-kit'
1141
+ const value = ref(['rain'])
1142
+ const message = ref('尚未操作')
1143
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1144
+ </script>
1145
+ <template>
1146
+ <div class="control-demo">
1147
+ <UiCheckboxGroup v-model="value" @change="record"><UiCheckbox value="rain">降雨</UiCheckbox><UiCheckbox value="water">水位</UiCheckbox><UiCheckbox value="disabled" disabled>禁用</UiCheckbox></UiCheckboxGroup>
1148
+ <p>当前值:{{ value }}</p>
1149
+ <p role="status">{{ message }}</p>
1150
+ </div>
1151
+ </template>
1152
+ <style scoped>
1153
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1154
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1155
+ </style>
1156
+
1157
+ ```
1158
+
1159
+ ### UiRadio 独立交互示例
1160
+
1161
+ ```vue
1162
+ <script setup lang="ts">
1163
+ import { ref } from 'vue'
1164
+ import { UiRadio, UiRadioGroup } from 'sky-ui-kit'
1165
+ const value = ref('observed')
1166
+ const message = ref('尚未操作')
1167
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1168
+ </script>
1169
+ <template>
1170
+ <div class="control-demo">
1171
+ <UiRadioGroup v-model="value" @change="record"><UiRadio value="observed">实况</UiRadio><UiRadio value="forecast">预报</UiRadio><UiRadio value="disabled" disabled>禁用</UiRadio></UiRadioGroup>
1172
+ <p>当前值:{{ value }}</p>
1173
+ <p role="status">{{ message }}</p>
1174
+ </div>
1175
+ </template>
1176
+ <style scoped>
1177
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1178
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1179
+ </style>
1180
+
1181
+ ```
1182
+
1183
+ ### UiCascaderPanel 独立交互示例
1184
+
1185
+ ```vue
1186
+ <script setup lang="ts">
1187
+ import { ref } from 'vue'
1188
+ import { UiCascaderPanel } from 'sky-ui-kit'
1189
+ const value = ref<string[]>([])
1190
+ const message = ref('尚未操作')
1191
+ const options = [{ value: 'hubei', label: '湖北省', children: [{ value: 'wuhan', label: '武汉市', children: [{ value: 'hankou', label: '汉口站' }] }] }]
1192
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1193
+ </script>
1194
+ <template>
1195
+ <div class="control-demo">
1196
+ <UiCascaderPanel v-model="value" :options="options" @change="record" />
1197
+ <p>当前值:{{ value }}</p>
1198
+ <p role="status">{{ message }}</p>
1199
+ </div>
1200
+ </template>
1201
+ <style scoped>
1202
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1203
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1204
+ </style>
1205
+
1206
+ ```
1207
+
1208
+ ### UiCascader 独立交互示例
1209
+
1210
+ ```vue
1211
+ <script setup lang="ts">
1212
+ import { ref } from 'vue'
1213
+ import { UiCascader } from 'sky-ui-kit'
1214
+ const value = ref<string[]>([])
1215
+ const message = ref('尚未操作')
1216
+ const options = [{ value: 'hubei', label: '湖北省', children: [{ value: 'wuhan', label: '武汉市', children: [{ value: 'hankou', label: '汉口站' }] }] }]
1217
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1218
+ </script>
1219
+ <template>
1220
+ <div class="control-demo">
1221
+ <UiCascader v-model="value" :options="options" filterable clearable placeholder="选择区域与测站" @change="record" />
1222
+ <p>当前值:{{ value }}</p>
1223
+ <p role="status">{{ message }}</p>
1224
+ </div>
1225
+ </template>
1226
+ <style scoped>
1227
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1228
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1229
+ </style>
1230
+
1231
+ ```
1232
+
1233
+ ### UiColorPickerPanel 独立交互示例
1234
+
1235
+ ```vue
1236
+ <script setup lang="ts">
1237
+ import { ref } from 'vue'
1238
+ import { UiColorPickerPanel } from 'sky-ui-kit'
1239
+ const value = ref('#1677ff')
1240
+ const message = ref('尚未操作')
1241
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1242
+ </script>
1243
+ <template>
1244
+ <div class="control-demo">
1245
+ <UiColorPickerPanel v-model="value" show-alpha @change="record" /><div :style="{ background: value, height: '32px', width: '120px' }">颜色效果</div>
1246
+ <p>当前值:{{ value }}</p>
1247
+ <p role="status">{{ message }}</p>
1248
+ </div>
1249
+ </template>
1250
+ <style scoped>
1251
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1252
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1253
+ </style>
1254
+
1255
+ ```
1256
+
1257
+ ### UiColorPicker 独立交互示例
1258
+
1259
+ ```vue
1260
+ <script setup lang="ts">
1261
+ import { ref } from 'vue'
1262
+ import { UiColorPicker } from 'sky-ui-kit'
1263
+ const value = ref('#1677ff')
1264
+ const message = ref('尚未操作')
1265
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1266
+ </script>
1267
+ <template>
1268
+ <div class="control-demo">
1269
+ <UiColorPicker v-model="value" show-alpha @change="record" /><div :style="{ background: value, height: '32px', width: '120px' }">颜色效果</div>
1270
+ <p>当前值:{{ value }}</p>
1271
+ <p role="status">{{ message }}</p>
1272
+ </div>
1273
+ </template>
1274
+ <style scoped>
1275
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1276
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1277
+ </style>
1278
+
1279
+ ```
1280
+
1281
+ ### UiDatePickerPanel 独立交互示例
1282
+
1283
+ ```vue
1284
+ <script setup lang="ts">
1285
+ import { ref } from 'vue'
1286
+ import { UiDatePickerPanel } from 'sky-ui-kit'
1287
+ const value = ref<Date>()
1288
+ const message = ref('尚未操作')
1289
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1290
+ </script>
1291
+ <template>
1292
+ <div class="control-demo">
1293
+ <UiDatePickerPanel v-model="value" type="date" @change="record" />
1294
+ <p>当前值:{{ value }}</p>
1295
+ <p role="status">{{ message }}</p>
1296
+ </div>
1297
+ </template>
1298
+ <style scoped>
1299
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1300
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1301
+ </style>
1302
+
1303
+ ```
1304
+
1305
+ ### UiDatePicker 独立交互示例
1306
+
1307
+ ```vue
1308
+ <script setup lang="ts">
1309
+ import { ref } from 'vue'
1310
+ import { UiDatePicker } from 'sky-ui-kit'
1311
+ const value = ref('')
1312
+ const message = ref('尚未操作')
1313
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1314
+ </script>
1315
+ <template>
1316
+ <div class="control-demo">
1317
+ <UiDatePicker v-model="value" type="date" value-format="YYYY-MM-DD" clearable placeholder="选择日期" @change="record" />
1318
+ <p>当前值:{{ value }}</p>
1319
+ <p role="status">{{ message }}</p>
1320
+ </div>
1321
+ </template>
1322
+ <style scoped>
1323
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1324
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1325
+ </style>
1326
+
1327
+ ```
1328
+
1329
+ ### UiInputNumber 独立交互示例
1330
+
1331
+ ```vue
1332
+ <script setup lang="ts">
1333
+ import { ref } from 'vue'
1334
+ import { UiInputNumber } from 'sky-ui-kit'
1335
+ const value = ref(20)
1336
+ const message = ref('尚未操作')
1337
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1338
+ </script>
1339
+ <template>
1340
+ <div class="control-demo">
1341
+ <UiInputNumber v-model="value" :min="0" :max="100" :step="5" @change="record" />
1342
+ <p>当前值:{{ value }}</p>
1343
+ <p role="status">{{ message }}</p>
1344
+ </div>
1345
+ </template>
1346
+ <style scoped>
1347
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1348
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1349
+ </style>
1350
+
1351
+ ```
1352
+
1353
+ ### UiInputTag 独立交互示例
1354
+
1355
+ ```vue
1356
+ <script setup lang="ts">
1357
+ import { ref } from 'vue'
1358
+ import { UiInputTag } from 'sky-ui-kit'
1359
+ const value = ref(['汉口站', '宜昌站'])
1360
+ const message = ref('尚未操作')
1361
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1362
+ </script>
1363
+ <template>
1364
+ <div class="control-demo">
1365
+ <UiInputTag v-model="value" clearable placeholder="输入站名后按回车" @change="record" />
1366
+ <p>当前值:{{ value }}</p>
1367
+ <p role="status">{{ message }}</p>
1368
+ </div>
1369
+ </template>
1370
+ <style scoped>
1371
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1372
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1373
+ </style>
1374
+
1375
+ ```
1376
+
1377
+ ### UiInputOtp 独立交互示例
1378
+
1379
+ ```vue
1380
+ <script setup lang="ts">
1381
+ import { ref } from 'vue'
1382
+ import { UiInputOtp } from 'sky-ui-kit'
1383
+ const value = ref('')
1384
+ const message = ref('尚未操作')
1385
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1386
+ </script>
1387
+ <template>
1388
+ <div class="control-demo">
1389
+ <UiInputOtp v-model="value" :length="6" @change="record" />
1390
+ <p>当前值:{{ value }}</p>
1391
+ <p role="status">{{ message }}</p>
1392
+ </div>
1393
+ </template>
1394
+ <style scoped>
1395
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1396
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1397
+ </style>
1398
+
1399
+ ```
1400
+
1401
+ ### UiRate 独立交互示例
1402
+
1403
+ ```vue
1404
+ <script setup lang="ts">
1405
+ import { ref } from 'vue'
1406
+ import { UiRate } from 'sky-ui-kit'
1407
+ const value = ref(3)
1408
+ const message = ref('尚未操作')
1409
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1410
+ </script>
1411
+ <template>
1412
+ <div class="control-demo">
1413
+ <UiRate v-model="value" show-score @change="record" />
1414
+ <p>当前值:{{ value }}</p>
1415
+ <p role="status">{{ message }}</p>
1416
+ </div>
1417
+ </template>
1418
+ <style scoped>
1419
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1420
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1421
+ </style>
1422
+
1423
+ ```
1424
+
1425
+ ### UiInput 独立交互示例
1426
+
1427
+ ```vue
1428
+ <script setup lang="ts">
1429
+ import { ref } from 'vue'
1430
+ import { UiInput } from 'sky-ui-kit'
1431
+ const value = ref('')
1432
+ const message = ref('尚未操作')
1433
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1434
+ </script>
1435
+ <template>
1436
+ <div class="control-demo">
1437
+ <UiInput v-model="value" clearable placeholder="输入测站名称" @change="record" /><UiInput model-value="禁用状态" disabled />
1438
+ <p>当前值:{{ value }}</p>
1439
+ <p role="status">{{ message }}</p>
1440
+ </div>
1441
+ </template>
1442
+ <style scoped>
1443
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1444
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1445
+ </style>
1446
+
1447
+ ```
1448
+
1449
+ ### UiCollapseTransition 独立交互示例
1450
+
1451
+ ```vue
1452
+ <script setup lang="ts">
1453
+ import { ref } from 'vue'
1454
+ import { UiCollapseTransition, UiButton } from 'sky-ui-kit'
1455
+ const value = ref(true)
1456
+ const message = ref('尚未操作')
1457
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1458
+ </script>
1459
+ <template>
1460
+ <div class="control-demo">
1461
+ <UiButton @click="value = !value">展开 / 收起</UiButton><UiCollapseTransition><div v-show="value" class="collapse-content">测站信息 · 点击按钮查看折叠过渡效果</div></UiCollapseTransition>
1462
+ <p>当前值:{{ value }}</p>
1463
+ <p role="status">{{ message }}</p>
1464
+ </div>
1465
+ </template>
1466
+ <style scoped>
1467
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1468
+ .collapse-content { padding: 24px; background: var(--color-surface, #eef5ff); margin-top: 12px; }
1469
+ </style>
1470
+
1471
+ ```
1472
+
1473
+ ### UiTimeSelect 独立交互示例
1474
+
1475
+ ```vue
1476
+ <script setup lang="ts">
1477
+ import { ref } from 'vue'
1478
+ import { UiTimeSelect } from 'sky-ui-kit'
1479
+ const message = ref('尚未操作')
1480
+ const value = ref('09:00')
1481
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1482
+ </script>
1483
+ <template>
1484
+ <div class="control-demo">
1485
+ <UiTimeSelect v-model="value" start="08:00" step="00:30" end="18:00" clearable placeholder="选择时间" @change="record" />
1486
+ <p>当前值:{{ value }}</p>
1487
+ <p role="status">{{ message }}</p>
1488
+ </div>
1489
+ </template>
1490
+ <style scoped>
1491
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1492
+ </style>
1493
+
1494
+ ```
1495
+
1496
+ ### UiTransfer 独立交互示例
1497
+
1498
+ ```vue
1499
+ <script setup lang="ts">
1500
+ import { ref } from 'vue'
1501
+ import { UiTransfer } from 'sky-ui-kit'
1502
+ const message = ref('尚未操作')
1503
+ const value = ref([1])
1504
+ const data = [{ key: 1, label: '汉口站' }, { key: 2, label: '宜昌站' }, { key: 3, label: '城陵矶站' }, { key: 4, label: '维护站点', disabled: true }]
1505
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1506
+ </script>
1507
+ <template>
1508
+ <div class="control-demo">
1509
+ <UiTransfer v-model="value" :data="data" filterable :titles="['可选测站', '已选测站']" @change="record" />
1510
+ <p>当前值:{{ value }}</p>
1511
+ <p role="status">{{ message }}</p>
1512
+ </div>
1513
+ </template>
1514
+ <style scoped>
1515
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1516
+ </style>
1517
+
1518
+ ```
1519
+
1520
+ ### UiTreeSelect 独立交互示例
1521
+
1522
+ ```vue
1523
+ <script setup lang="ts">
1524
+ import { ref } from 'vue'
1525
+ import { UiTreeSelect } from 'sky-ui-kit'
1526
+ const message = ref('尚未操作')
1527
+ const value = ref('hankou')
1528
+ const data = [{ value: 'yangtze', label: '长江流域', children: [{ value: 'hankou', label: '汉口站' }, { value: 'yichang', label: '宜昌站' }] }, { value: 'dongting', label: '洞庭湖流域', children: [{ value: 'chenglingji', label: '城陵矶站' }] }]
1529
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1530
+ </script>
1531
+ <template>
1532
+ <div class="control-demo">
1533
+ <UiTreeSelect v-model="value" :data="data" filterable clearable placeholder="搜索测站" @change="record" />
1534
+ <p>当前值:{{ value }}</p>
1535
+ <p role="status">{{ message }}</p>
1536
+ </div>
1537
+ </template>
1538
+ <style scoped>
1539
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1540
+ </style>
1541
+
1542
+ ```
1543
+
1544
+ ### UiMention 独立交互示例
1545
+
1546
+ ```vue
1547
+ <script setup lang="ts">
1548
+ import { ref } from 'vue'
1549
+ import { UiMention } from 'sky-ui-kit'
1550
+ const message = ref('尚未操作')
1551
+ const value = ref('')
1552
+ const options = [{ value: 'zhang', label: '张工' }, { value: 'li', label: '李工' }, { value: 'wang', label: '王工' }]
1553
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1554
+ </script>
1555
+ <template>
1556
+ <div class="control-demo">
1557
+ <UiMention v-model="value" :options="options" type="textarea" placeholder="输入 @ 选择团队成员" @select="record" />
1558
+ <p>当前值:{{ value }}</p>
1559
+ <p role="status">{{ message }}</p>
1560
+ </div>
1561
+ </template>
1562
+ <style scoped>
1563
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1564
+ </style>
1565
+
1566
+ ```
1567
+
1568
+ ### UiUpload 独立交互示例
1569
+
1570
+ ```vue
1571
+ <script setup lang="ts">
1572
+ import { ref } from 'vue'
1573
+ import type { UploadUserFile, UploadProps } from 'element-plus'
1574
+ import { Upload } from '@element-plus/icons-vue'
1575
+ import { UiUpload, UiButton } from 'sky-ui-kit'
1576
+ const message = ref('尚未操作')
1577
+ const files = ref<UploadUserFile[]>([])
1578
+ const value = ref('尚未选择文件')
1579
+ const changed: UploadProps['onChange'] = file => { value.value = file.name; message.value = '已选择本地文件:' + file.name }
1580
+ function record(next: unknown) { message.value = '变化:' + JSON.stringify(next) }
1581
+ </script>
1582
+ <template>
1583
+ <div class="control-demo">
1584
+ <UiUpload v-model:file-list="files" :auto-upload="false" :on-change="changed" multiple accept=".csv,.xlsx" :limit="3" :on-exceed="() => message = '最多选择 3 个文件'" :on-remove="() => message = '已移除文件'">
1585
+ <UiButton type="primary" :icon="Upload">选择数据文件</UiButton>
1586
+ <template #tip><p>支持 CSV / XLSX,最多 3 个文件。演示仅选择和移除文件;真实上传由应用配置 http-request。</p></template>
1587
+ </UiUpload>
1588
+ <p>当前值:{{ value }}</p>
1589
+ <p role="status">{{ message }}</p>
1590
+ </div>
1591
+ </template>
1592
+ <style scoped>
1593
+ .control-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1594
+ </style>
1595
+
1596
+ ```
1597
+
1598
+ ### UiAffix 分类独立示例
1599
+
1600
+ ```vue
1601
+ <script setup lang="ts">
1602
+ import { ref } from 'vue'
1603
+ import { UiAffix, UiButton } from 'sky-ui-kit'
1604
+ const message = ref('尚未操作')
1605
+ const open = ref(false)
1606
+
1607
+
1608
+ </script>
1609
+ <template>
1610
+ <div class="catalog-demo affix-example-host">
1611
+ <div class="scroll-host"><div style="height: 500px"><UiAffix target=".affix-example-host" :offset="20"><UiButton>固定操作</UiButton></UiAffix><p>滚动页面观察固定效果</p></div></div>
1612
+ <p role="status">{{ message }}</p>
1613
+ </div>
1614
+ </template>
1615
+ <style scoped>
1616
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1617
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1618
+ .scroll-host { height: 180px; overflow: auto; }
1619
+ </style>
1620
+
1621
+ ```
1622
+
1623
+ ### UiAlert 分类独立示例
1624
+
1625
+ ```vue
1626
+ <script setup lang="ts">
1627
+ import { ref } from 'vue'
1628
+ import { UiAlert } from 'sky-ui-kit'
1629
+ const message = ref('尚未操作')
1630
+ const open = ref(false)
1631
+
1632
+
1633
+ </script>
1634
+ <template>
1635
+ <div class="catalog-demo affix-example-host">
1636
+ <UiAlert title="数据已更新" type="success" show-icon @close="message = '提示已关闭'" /><UiAlert title="部分测站数据缺失" type="warning" show-icon />
1637
+ <p role="status">{{ message }}</p>
1638
+ </div>
1639
+ </template>
1640
+ <style scoped>
1641
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1642
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1643
+ .scroll-host { height: 180px; overflow: auto; }
1644
+ </style>
1645
+
1646
+ ```
1647
+
1648
+ ### UiPopper 分类独立示例
1649
+
1650
+ ```vue
1651
+ <script setup lang="ts">
1652
+ import { ref } from 'vue'
1653
+ import { UiButton, UiPopover } from 'sky-ui-kit'
1654
+ const message = ref('尚未操作')
1655
+ const open = ref(false)
1656
+
1657
+
1658
+ </script>
1659
+ <template>
1660
+ <div class="catalog-demo affix-example-host">
1661
+ <p>UiPopper 为浮层底层定位组件,应用通常通过 UiPopover / UiTooltip 使用。</p><UiPopover content="通过公开浮层组件使用定位能力" trigger="click"><template #reference><UiButton>查看定位效果</UiButton></template></UiPopover>
1662
+ <p role="status">{{ message }}</p>
1663
+ </div>
1664
+ </template>
1665
+ <style scoped>
1666
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1667
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1668
+ .scroll-host { height: 180px; overflow: auto; }
1669
+ </style>
1670
+
1671
+ ```
1672
+
1673
+ ### UiTooltip 分类独立示例
1674
+
1675
+ ```vue
1676
+ <script setup lang="ts">
1677
+ import { ref } from 'vue'
1678
+ import { UiButton, UiTooltip } from 'sky-ui-kit'
1679
+ const message = ref('尚未操作')
1680
+ const open = ref(false)
1681
+
1682
+
1683
+ </script>
1684
+ <template>
1685
+ <div class="catalog-demo affix-example-host">
1686
+ <UiTooltip content="查询最新监测数据" placement="top"><UiButton>悬停查看说明</UiButton></UiTooltip>
1687
+ <p role="status">{{ message }}</p>
1688
+ </div>
1689
+ </template>
1690
+ <style scoped>
1691
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1692
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1693
+ .scroll-host { height: 180px; overflow: auto; }
1694
+ </style>
1695
+
1696
+ ```
1697
+
1698
+ ### UiAvatar 分类独立示例
1699
+
1700
+ ```vue
1701
+ <script setup lang="ts">
1702
+ import { ref } from 'vue'
1703
+ import { UiAvatar, UiAvatarGroup } from 'sky-ui-kit'
1704
+ const message = ref('尚未操作')
1705
+ const open = ref(false)
1706
+
1707
+
1708
+ </script>
1709
+ <template>
1710
+ <div class="catalog-demo affix-example-host">
1711
+ <UiAvatar>张</UiAvatar><UiAvatar :size="48">团队</UiAvatar><UiAvatarGroup><UiAvatar>李</UiAvatar><UiAvatar>王</UiAvatar></UiAvatarGroup>
1712
+ <p role="status">{{ message }}</p>
1713
+ </div>
1714
+ </template>
1715
+ <style scoped>
1716
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1717
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1718
+ .scroll-host { height: 180px; overflow: auto; }
1719
+ </style>
1720
+
1721
+ ```
1722
+
1723
+ ### UiBacktop 分类独立示例
1724
+
1725
+ ```vue
1726
+ <script setup lang="ts">
1727
+ import { ref } from 'vue'
1728
+ import { UiBacktop } from 'sky-ui-kit'
1729
+ const message = ref('尚未操作')
1730
+ const open = ref(false)
1731
+
1732
+
1733
+ </script>
1734
+ <template>
1735
+ <div class="catalog-demo affix-example-host">
1736
+ <div class="backtop-host" style="height: 160px; overflow: auto"><div style="height: 600px">在这里向下滚动<UiBacktop target=".backtop-host" :visibility-height="60" :right="40" :bottom="40" /></div></div>
1737
+ <p role="status">{{ message }}</p>
1738
+ </div>
1739
+ </template>
1740
+ <style scoped>
1741
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1742
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1743
+ .scroll-host { height: 180px; overflow: auto; }
1744
+ </style>
1745
+
1746
+ ```
1747
+
1748
+ ### UiBadge 分类独立示例
1749
+
1750
+ ```vue
1751
+ <script setup lang="ts">
1752
+ import { ref } from 'vue'
1753
+ import { UiBadge, UiButton } from 'sky-ui-kit'
1754
+ const message = ref('尚未操作')
1755
+ const open = ref(false)
1756
+
1757
+
1758
+ </script>
1759
+ <template>
1760
+ <div class="catalog-demo affix-example-host">
1761
+ <UiBadge :value="12"><UiButton>消息</UiButton></UiBadge>
1762
+ <p role="status">{{ message }}</p>
1763
+ </div>
1764
+ </template>
1765
+ <style scoped>
1766
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1767
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1768
+ .scroll-host { height: 180px; overflow: auto; }
1769
+ </style>
1770
+
1771
+ ```
1772
+
1773
+ ### UiBreadcrumb 分类独立示例
1774
+
1775
+ ```vue
1776
+ <script setup lang="ts">
1777
+ import { ref } from 'vue'
1778
+ import { UiBreadcrumb, UiBreadcrumbItem } from 'sky-ui-kit'
1779
+ const message = ref('尚未操作')
1780
+ const open = ref(false)
1781
+
1782
+
1783
+ </script>
1784
+ <template>
1785
+ <div class="catalog-demo affix-example-host">
1786
+ <UiBreadcrumb separator="/"><UiBreadcrumbItem>平台</UiBreadcrumbItem><UiBreadcrumbItem>数据维护</UiBreadcrumbItem><UiBreadcrumbItem>测站管理</UiBreadcrumbItem></UiBreadcrumb>
1787
+ <p role="status">{{ message }}</p>
1788
+ </div>
1789
+ </template>
1790
+ <style scoped>
1791
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1792
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1793
+ .scroll-host { height: 180px; overflow: auto; }
1794
+ </style>
1795
+
1796
+ ```
1797
+
1798
+ ### UiConfigProvider 分类独立示例
1799
+
1800
+ ```vue
1801
+ <script setup lang="ts">
1802
+ import { ref } from 'vue'
1803
+ import { UiButton, UiConfigProvider, UiRadio, UiRadioGroup } from 'sky-ui-kit'
1804
+ const message = ref('尚未操作')
1805
+ const open = ref(false)
1806
+ const size = ref<'small' | 'default' | 'large'>('default')
1807
+
1808
+ </script>
1809
+ <template>
1810
+ <div class="catalog-demo affix-example-host">
1811
+ <UiConfigProvider :size="size"><UiRadioGroup v-model="size"><UiRadio value="small">小</UiRadio><UiRadio value="default">默认</UiRadio><UiRadio value="large">大</UiRadio></UiRadioGroup><UiButton>跟随配置尺寸</UiButton></UiConfigProvider>
1812
+ <p role="status">{{ message }}</p>
1813
+ </div>
1814
+ </template>
1815
+ <style scoped>
1816
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1817
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1818
+ .scroll-host { height: 180px; overflow: auto; }
1819
+ </style>
1820
+
1821
+ ```
1822
+
1823
+ ### UiTag 分类独立示例
1824
+
1825
+ ```vue
1826
+ <script setup lang="ts">
1827
+ import { ref } from 'vue'
1828
+ import { UiTag } from 'sky-ui-kit'
1829
+ const message = ref('尚未操作')
1830
+ const open = ref(false)
1831
+ const tags = ref(['降雨', '水位'])
1832
+
1833
+ </script>
1834
+ <template>
1835
+ <div class="catalog-demo affix-example-host">
1836
+ <UiTag v-for="tag in tags" :key="tag" closable @close="tags = tags.filter(item => item !== tag)">{{ tag }}</UiTag>
1837
+ <p role="status">{{ message }}</p>
1838
+ </div>
1839
+ </template>
1840
+ <style scoped>
1841
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1842
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1843
+ .scroll-host { height: 180px; overflow: auto; }
1844
+ </style>
1845
+
1846
+ ```
1847
+
1848
+ ### UiCalendar 分类独立示例
1849
+
1850
+ ```vue
1851
+ <script setup lang="ts">
1852
+ import { ref } from 'vue'
1853
+ import { UiCalendar } from 'sky-ui-kit'
1854
+ const message = ref('尚未操作')
1855
+ const open = ref(false)
1856
+ const date = ref(new Date())
1857
+
1858
+ </script>
1859
+ <template>
1860
+ <div class="catalog-demo affix-example-host">
1861
+ <UiCalendar v-model="date" />
1862
+ <p role="status">{{ message }}</p>
1863
+ </div>
1864
+ </template>
1865
+ <style scoped>
1866
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1867
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1868
+ .scroll-host { height: 180px; overflow: auto; }
1869
+ </style>
1870
+
1871
+ ```
1872
+
1873
+ ### UiCard 分类独立示例
1874
+
1875
+ ```vue
1876
+ <script setup lang="ts">
1877
+ import { ref } from 'vue'
1878
+ import { UiCard } from 'sky-ui-kit'
1879
+ const message = ref('尚未操作')
1880
+ const open = ref(false)
1881
+
1882
+
1883
+ </script>
1884
+ <template>
1885
+ <div class="catalog-demo affix-example-host">
1886
+ <UiCard><template #header>测站信息</template>汉口站 · 长江流域<template #footer>更新于 08:00</template></UiCard>
1887
+ <p role="status">{{ message }}</p>
1888
+ </div>
1889
+ </template>
1890
+ <style scoped>
1891
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1892
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1893
+ .scroll-host { height: 180px; overflow: auto; }
1894
+ </style>
1895
+
1896
+ ```
1897
+
1898
+ ### UiCarousel 分类独立示例
1899
+
1900
+ ```vue
1901
+ <script setup lang="ts">
1902
+ import { ref } from 'vue'
1903
+ import { UiCarousel, UiCarouselItem } from 'sky-ui-kit'
1904
+ const message = ref('尚未操作')
1905
+ const open = ref(false)
1906
+
1907
+
1908
+ </script>
1909
+ <template>
1910
+ <div class="catalog-demo affix-example-host">
1911
+ <UiCarousel height="160px" :autoplay="false"><UiCarouselItem v-for="name in ['实况', '预报', '历史']" :key="name"><div class="demo-block">{{ name }}</div></UiCarouselItem></UiCarousel>
1912
+ <p role="status">{{ message }}</p>
1913
+ </div>
1914
+ </template>
1915
+ <style scoped>
1916
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1917
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1918
+ .scroll-host { height: 180px; overflow: auto; }
1919
+ </style>
1920
+
1921
+ ```
1922
+
1923
+ ### UiCheckTag 分类独立示例
1924
+
1925
+ ```vue
1926
+ <script setup lang="ts">
1927
+ import { ref } from 'vue'
1928
+ import { UiCheckTag } from 'sky-ui-kit'
1929
+ const message = ref('尚未操作')
1930
+ const open = ref(false)
1931
+ const checked = ref(true)
1932
+
1933
+ </script>
1934
+ <template>
1935
+ <div class="catalog-demo affix-example-host">
1936
+ <UiCheckTag :checked="checked" @change="checked = $event">降雨图层</UiCheckTag>
1937
+ <p role="status">{{ message }}</p>
1938
+ </div>
1939
+ </template>
1940
+ <style scoped>
1941
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1942
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1943
+ .scroll-host { height: 180px; overflow: auto; }
1944
+ </style>
1945
+
1946
+ ```
1947
+
1948
+ ### UiCollapse 分类独立示例
1949
+
1950
+ ```vue
1951
+ <script setup lang="ts">
1952
+ import { ref } from 'vue'
1953
+ import { UiCollapse, UiCollapseItem } from 'sky-ui-kit'
1954
+ const message = ref('尚未操作')
1955
+ const open = ref(false)
1956
+ const active = ref(['station'])
1957
+
1958
+ </script>
1959
+ <template>
1960
+ <div class="catalog-demo affix-example-host">
1961
+ <UiCollapse v-model="active"><UiCollapseItem title="测站信息" name="station">汉口站 · 长江流域</UiCollapseItem><UiCollapseItem title="监测数据" name="data">水位 28.6 m</UiCollapseItem></UiCollapse>
1962
+ <p role="status">{{ message }}</p>
1963
+ </div>
1964
+ </template>
1965
+ <style scoped>
1966
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1967
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1968
+ .scroll-host { height: 180px; overflow: auto; }
1969
+ </style>
1970
+
1971
+ ```
1972
+
1973
+ ### UiStatistic 分类独立示例
1974
+
1975
+ ```vue
1976
+ <script setup lang="ts">
1977
+ import { ref } from 'vue'
1978
+ import { UiStatistic } from 'sky-ui-kit'
1979
+ const message = ref('尚未操作')
1980
+ const open = ref(false)
1981
+
1982
+
1983
+ </script>
1984
+ <template>
1985
+ <div class="catalog-demo affix-example-host">
1986
+ <UiStatistic title="监测站数量" :value="128" />
1987
+ <p role="status">{{ message }}</p>
1988
+ </div>
1989
+ </template>
1990
+ <style scoped>
1991
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
1992
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
1993
+ .scroll-host { height: 180px; overflow: auto; }
1994
+ </style>
1995
+
1996
+ ```
1997
+
1998
+ ### UiCountdown 分类独立示例
1999
+
2000
+ ```vue
2001
+ <script setup lang="ts">
2002
+ import { ref } from 'vue'
2003
+ import { UiCountdown } from 'sky-ui-kit'
2004
+ const message = ref('尚未操作')
2005
+ const open = ref(false)
2006
+ const deadline = Date.now() + 3600000
2007
+
2008
+ </script>
2009
+ <template>
2010
+ <div class="catalog-demo affix-example-host">
2011
+ <UiCountdown title="下次更新" :value="deadline" @finish="message = '倒计时结束'" />
2012
+ <p role="status">{{ message }}</p>
2013
+ </div>
2014
+ </template>
2015
+ <style scoped>
2016
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2017
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2018
+ .scroll-host { height: 180px; overflow: auto; }
2019
+ </style>
2020
+
2021
+ ```
2022
+
2023
+ ### UiDescriptions 分类独立示例
2024
+
2025
+ ```vue
2026
+ <script setup lang="ts">
2027
+ import { ref } from 'vue'
2028
+ import { UiDescriptions, UiDescriptionsItem } from 'sky-ui-kit'
2029
+ const message = ref('尚未操作')
2030
+ const open = ref(false)
2031
+
2032
+
2033
+ </script>
2034
+ <template>
2035
+ <div class="catalog-demo affix-example-host">
2036
+ <UiDescriptions title="测站档案" :column="2" border><UiDescriptionsItem label="测站">汉口站</UiDescriptionsItem><UiDescriptionsItem label="流域">长江流域</UiDescriptionsItem></UiDescriptions>
2037
+ <p role="status">{{ message }}</p>
2038
+ </div>
2039
+ </template>
2040
+ <style scoped>
2041
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2042
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2043
+ .scroll-host { height: 180px; overflow: auto; }
2044
+ </style>
2045
+
2046
+ ```
2047
+
2048
+ ### UiDialog 分类独立示例
2049
+
2050
+ ```vue
2051
+ <script setup lang="ts">
2052
+ import { ref } from 'vue'
2053
+ import { UiButton, UiDialog } from 'sky-ui-kit'
2054
+ const message = ref('尚未操作')
2055
+ const open = ref(false)
2056
+
2057
+
2058
+ </script>
2059
+ <template>
2060
+ <div class="catalog-demo affix-example-host">
2061
+ <UiButton @click="open = true">打开对话框</UiButton><UiDialog v-model="open" title="测站详情" width="480px"><p>汉口站 · 水位 28.6 m</p><template #footer><UiButton @click="open = false">关闭</UiButton></template></UiDialog>
2062
+ <p role="status">{{ message }}</p>
2063
+ </div>
2064
+ </template>
2065
+ <style scoped>
2066
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2067
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2068
+ .scroll-host { height: 180px; overflow: auto; }
2069
+ </style>
2070
+
2071
+ ```
2072
+
2073
+ ### UiDrawer 分类独立示例
2074
+
2075
+ ```vue
2076
+ <script setup lang="ts">
2077
+ import { ref } from 'vue'
2078
+ import { UiButton, UiDrawer } from 'sky-ui-kit'
2079
+ const message = ref('尚未操作')
2080
+ const open = ref(false)
2081
+
2082
+
2083
+ </script>
2084
+ <template>
2085
+ <div class="catalog-demo affix-example-host">
2086
+ <UiButton @click="open = true">打开抽屉</UiButton><UiDrawer v-model="open" title="测站详情" size="320px">汉口站 · 长江流域</UiDrawer>
2087
+ <p role="status">{{ message }}</p>
2088
+ </div>
2089
+ </template>
2090
+ <style scoped>
2091
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2092
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2093
+ .scroll-host { height: 180px; overflow: auto; }
2094
+ </style>
2095
+
2096
+ ```
2097
+
2098
+ ### UiDropdown 分类独立示例
2099
+
2100
+ ```vue
2101
+ <script setup lang="ts">
2102
+ import { ref } from 'vue'
2103
+ import { UiButton, UiDropdown, UiDropdownItem, UiDropdownMenu } from 'sky-ui-kit'
2104
+ const message = ref('尚未操作')
2105
+ const open = ref(false)
2106
+
2107
+
2108
+ </script>
2109
+ <template>
2110
+ <div class="catalog-demo affix-example-host">
2111
+ <UiDropdown @command="message = '操作:' + $event"><UiButton>更多操作</UiButton><template #dropdown><UiDropdownMenu><UiDropdownItem command="export">导出</UiDropdownItem><UiDropdownItem command="refresh">刷新</UiDropdownItem></UiDropdownMenu></template></UiDropdown>
2112
+ <p role="status">{{ message }}</p>
2113
+ </div>
2114
+ </template>
2115
+ <style scoped>
2116
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2117
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2118
+ .scroll-host { height: 180px; overflow: auto; }
2119
+ </style>
2120
+
2121
+ ```
2122
+
2123
+ ### UiEmpty 分类独立示例
2124
+
2125
+ ```vue
2126
+ <script setup lang="ts">
2127
+ import { ref } from 'vue'
2128
+ import { UiButton, UiEmpty } from 'sky-ui-kit'
2129
+ const message = ref('尚未操作')
2130
+ const open = ref(false)
2131
+
2132
+
2133
+ </script>
2134
+ <template>
2135
+ <div class="catalog-demo affix-example-host">
2136
+ <UiEmpty description="暂无监测数据"><UiButton @click="message = '刷新事件由应用接入'">刷新</UiButton></UiEmpty>
2137
+ <p role="status">{{ message }}</p>
2138
+ </div>
2139
+ </template>
2140
+ <style scoped>
2141
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2142
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2143
+ .scroll-host { height: 180px; overflow: auto; }
2144
+ </style>
2145
+
2146
+ ```
2147
+
2148
+ ### UiImageViewer 分类独立示例
2149
+
2150
+ ```vue
2151
+ <script setup lang="ts">
2152
+ import { ref } from 'vue'
2153
+ import { UiButton, UiImageViewer } from 'sky-ui-kit'
2154
+ const message = ref('尚未操作')
2155
+ const open = ref(false)
2156
+
2157
+ const imageUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="360" height="200"><rect width="360" height="200" fill="#e8f2ff"/><path d="M0 150L90 60L180 120L270 40L360 150" fill="none" stroke="#1677ff" stroke-width="6"/></svg>')
2158
+ </script>
2159
+ <template>
2160
+ <div class="catalog-demo affix-example-host">
2161
+ <UiButton @click="open = true">打开图片预览</UiButton><UiImageViewer v-if="open" :url-list="[imageUrl]" @close="open = false" />
2162
+ <p role="status">{{ message }}</p>
2163
+ </div>
2164
+ </template>
2165
+ <style scoped>
2166
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2167
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2168
+ .scroll-host { height: 180px; overflow: auto; }
2169
+ </style>
2170
+
2171
+ ```
2172
+
2173
+ ### UiImage 分类独立示例
2174
+
2175
+ ```vue
2176
+ <script setup lang="ts">
2177
+ import { ref } from 'vue'
2178
+ import { UiImage } from 'sky-ui-kit'
2179
+ const message = ref('尚未操作')
2180
+ const open = ref(false)
2181
+
2182
+ const imageUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="360" height="200"><rect width="360" height="200" fill="#e8f2ff"/><path d="M0 150L90 60L180 120L270 40L360 150" fill="none" stroke="#1677ff" stroke-width="6"/></svg>')
2183
+ </script>
2184
+ <template>
2185
+ <div class="catalog-demo affix-example-host">
2186
+ <UiImage style="width: 180px; height: 100px" :src="imageUrl" :preview-src-list="[imageUrl]" fit="cover" />
2187
+ <p role="status">{{ message }}</p>
2188
+ </div>
2189
+ </template>
2190
+ <style scoped>
2191
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2192
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2193
+ .scroll-host { height: 180px; overflow: auto; }
2194
+ </style>
2195
+
2196
+ ```
2197
+
2198
+ ### UiMenu 分类独立示例
2199
+
2200
+ ```vue
2201
+ <script setup lang="ts">
2202
+ import { ref } from 'vue'
2203
+ import { UiMenu, UiMenuItem, UiSubMenu } from 'sky-ui-kit'
2204
+ const message = ref('尚未操作')
2205
+ const open = ref(false)
2206
+
2207
+
2208
+ </script>
2209
+ <template>
2210
+ <div class="catalog-demo affix-example-host">
2211
+ <UiMenu default-active="station" @select="message = $event"><UiMenuItem index="station">测站管理</UiMenuItem><UiSubMenu index="data"><template #title>数据管理</template><UiMenuItem index="rain">降雨数据</UiMenuItem></UiSubMenu></UiMenu>
2212
+ <p role="status">{{ message }}</p>
2213
+ </div>
2214
+ </template>
2215
+ <style scoped>
2216
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2217
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2218
+ .scroll-host { height: 180px; overflow: auto; }
2219
+ </style>
2220
+
2221
+ ```
2222
+
2223
+ ### UiPageHeader 分类独立示例
2224
+
2225
+ ```vue
2226
+ <script setup lang="ts">
2227
+ import { ref } from 'vue'
2228
+ import { UiPageHeader } from 'sky-ui-kit'
2229
+ const message = ref('尚未操作')
2230
+ const open = ref(false)
2231
+
2232
+
2233
+ </script>
2234
+ <template>
2235
+ <div class="catalog-demo affix-example-host">
2236
+ <UiPageHeader @back="message = '返回列表事件'"><template #content>测站详情</template></UiPageHeader>
2237
+ <p role="status">{{ message }}</p>
2238
+ </div>
2239
+ </template>
2240
+ <style scoped>
2241
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2242
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2243
+ .scroll-host { height: 180px; overflow: auto; }
2244
+ </style>
2245
+
2246
+ ```
2247
+
2248
+ ### UiPagination 分类独立示例
2249
+
2250
+ ```vue
2251
+ <script setup lang="ts">
2252
+ import { ref } from 'vue'
2253
+ import { UiPagination } from 'sky-ui-kit'
2254
+ const message = ref('尚未操作')
2255
+ const open = ref(false)
2256
+ const page = ref(1)
2257
+
2258
+ </script>
2259
+ <template>
2260
+ <div class="catalog-demo affix-example-host">
2261
+ <UiPagination v-model:current-page="page" :page-size="10" :total="100" layout="prev, pager, next, total" @current-change="message = '页码:' + $event" />
2262
+ <p role="status">{{ message }}</p>
2263
+ </div>
2264
+ </template>
2265
+ <style scoped>
2266
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2267
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2268
+ .scroll-host { height: 180px; overflow: auto; }
2269
+ </style>
2270
+
2271
+ ```
2272
+
2273
+ ### UiPopconfirm 分类独立示例
2274
+
2275
+ ```vue
2276
+ <script setup lang="ts">
2277
+ import { ref } from 'vue'
2278
+ import { UiButton, UiPopconfirm } from 'sky-ui-kit'
2279
+ const message = ref('尚未操作')
2280
+ const open = ref(false)
2281
+
2282
+
2283
+ </script>
2284
+ <template>
2285
+ <div class="catalog-demo affix-example-host">
2286
+ <UiPopconfirm title="确认删除该记录?" @confirm="message = '已确认删除(演示)'" @cancel="message = '已取消'"><template #reference><UiButton type="danger">删除记录</UiButton></template></UiPopconfirm>
2287
+ <p role="status">{{ message }}</p>
2288
+ </div>
2289
+ </template>
2290
+ <style scoped>
2291
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2292
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2293
+ .scroll-host { height: 180px; overflow: auto; }
2294
+ </style>
2295
+
2296
+ ```
2297
+
2298
+ ### UiProgress 分类独立示例
2299
+
2300
+ ```vue
2301
+ <script setup lang="ts">
2302
+ import { ref } from 'vue'
2303
+ import { UiButton, UiProgress } from 'sky-ui-kit'
2304
+ const message = ref('尚未操作')
2305
+ const open = ref(false)
2306
+ const percent = ref(40)
2307
+
2308
+ </script>
2309
+ <template>
2310
+ <div class="catalog-demo affix-example-host">
2311
+ <UiProgress :percentage="percent" /><UiProgress type="circle" :percentage="percent" /><UiButton @click="percent = (percent + 10) % 110">更新进度</UiButton>
2312
+ <p role="status">{{ message }}</p>
2313
+ </div>
2314
+ </template>
2315
+ <style scoped>
2316
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2317
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2318
+ .scroll-host { height: 180px; overflow: auto; }
2319
+ </style>
2320
+
2321
+ ```
2322
+
2323
+ ### UiResult 分类独立示例
2324
+
2325
+ ```vue
2326
+ <script setup lang="ts">
2327
+ import { ref } from 'vue'
2328
+ import { UiButton, UiResult } from 'sky-ui-kit'
2329
+ const message = ref('尚未操作')
2330
+ const open = ref(false)
2331
+
2332
+
2333
+ </script>
2334
+ <template>
2335
+ <div class="catalog-demo affix-example-host">
2336
+ <UiResult icon="success" title="保存完成" sub-title="测站配置已更新"><template #extra><UiButton @click="message = '返回列表'">返回</UiButton></template></UiResult>
2337
+ <p role="status">{{ message }}</p>
2338
+ </div>
2339
+ </template>
2340
+ <style scoped>
2341
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2342
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2343
+ .scroll-host { height: 180px; overflow: auto; }
2344
+ </style>
2345
+
2346
+ ```
2347
+
2348
+ ### UiSkeleton 分类独立示例
2349
+
2350
+ ```vue
2351
+ <script setup lang="ts">
2352
+ import { ref } from 'vue'
2353
+ import { UiSkeleton, UiSkeletonItem, UiSwitch } from 'sky-ui-kit'
2354
+ const message = ref('尚未操作')
2355
+ const open = ref(false)
2356
+ const loading = ref(true)
2357
+
2358
+ </script>
2359
+ <template>
2360
+ <div class="catalog-demo affix-example-host">
2361
+ <UiSwitch v-model="loading" active-text="加载状态" /><UiSkeleton :loading="loading" animated><template #template><UiSkeletonItem variant="text" /></template><template #default>汉口站数据已加载</template></UiSkeleton>
2362
+ <p role="status">{{ message }}</p>
2363
+ </div>
2364
+ </template>
2365
+ <style scoped>
2366
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2367
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2368
+ .scroll-host { height: 180px; overflow: auto; }
2369
+ </style>
2370
+
2371
+ ```
2372
+
2373
+ ### UiSteps 分类独立示例
2374
+
2375
+ ```vue
2376
+ <script setup lang="ts">
2377
+ import { ref } from 'vue'
2378
+ import { UiButton, UiStep, UiSteps } from 'sky-ui-kit'
2379
+ const message = ref('尚未操作')
2380
+ const open = ref(false)
2381
+ const step = ref(1)
2382
+
2383
+ </script>
2384
+ <template>
2385
+ <div class="catalog-demo affix-example-host">
2386
+ <UiSteps :active="step" finish-status="success"><UiStep title="选择测站" /><UiStep title="配置数据" /><UiStep title="完成" /></UiSteps><UiButton @click="step = (step + 1) % 4">下一步</UiButton>
2387
+ <p role="status">{{ message }}</p>
2388
+ </div>
2389
+ </template>
2390
+ <style scoped>
2391
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2392
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2393
+ .scroll-host { height: 180px; overflow: auto; }
2394
+ </style>
2395
+
2396
+ ```
2397
+
2398
+ ### UiTable 分类独立示例
2399
+
2400
+ ```vue
2401
+ <script setup lang="ts">
2402
+ import { ref } from 'vue'
2403
+ import { UiTable, UiTableColumn } from 'sky-ui-kit'
2404
+ const message = ref('尚未操作')
2405
+ const open = ref(false)
2406
+
2407
+ const rows = [{ id: '1', name: '汉口站', value: 28.6 }, { id: '2', name: '宜昌站', value: 42.3 }]
2408
+ </script>
2409
+ <template>
2410
+ <div class="catalog-demo affix-example-host">
2411
+ <UiTable :data="rows" stripe @row-click="message = $event.name"><UiTableColumn prop="name" label="测站" /><UiTableColumn prop="value" label="水位 (m)" /></UiTable>
2412
+ <p role="status">{{ message }}</p>
2413
+ </div>
2414
+ </template>
2415
+ <style scoped>
2416
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2417
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2418
+ .scroll-host { height: 180px; overflow: auto; }
2419
+ </style>
2420
+
2421
+ ```
2422
+
2423
+ ### UiTableV2 分类独立示例
2424
+
2425
+ ```vue
2426
+ <script setup lang="ts">
2427
+ import { ref } from 'vue'
2428
+ import { UiTableV2 } from 'sky-ui-kit'
2429
+ const message = ref('尚未操作')
2430
+ const open = ref(false)
2431
+ const columns = [{ key: 'name', dataKey: 'name', title: '测站', width: 300 }, { key: 'value', dataKey: 'value', title: '水位', width: 300 }]
2432
+ const rows = [{ id: '1', name: '汉口站', value: 28.6 }, { id: '2', name: '宜昌站', value: 42.3 }]
2433
+ </script>
2434
+ <template>
2435
+ <div class="catalog-demo affix-example-host">
2436
+ <UiTableV2 :columns="columns" :data="rows" :width="600" :height="220" />
2437
+ <p role="status">{{ message }}</p>
2438
+ </div>
2439
+ </template>
2440
+ <style scoped>
2441
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2442
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2443
+ .scroll-host { height: 180px; overflow: auto; }
2444
+ </style>
2445
+
2446
+ ```
2447
+
2448
+ ### UiTabs 分类独立示例
2449
+
2450
+ ```vue
2451
+ <script setup lang="ts">
2452
+ import { ref } from 'vue'
2453
+ import { UiTabPane, UiTabs } from 'sky-ui-kit'
2454
+ const message = ref('尚未操作')
2455
+ const open = ref(false)
2456
+ const tab = ref('observed')
2457
+
2458
+ </script>
2459
+ <template>
2460
+ <div class="catalog-demo affix-example-host">
2461
+ <UiTabs v-model="tab"><UiTabPane label="实况" name="observed">实况监测数据</UiTabPane><UiTabPane label="预报" name="forecast">预报数据</UiTabPane></UiTabs>
2462
+ <p role="status">{{ message }}</p>
2463
+ </div>
2464
+ </template>
2465
+ <style scoped>
2466
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2467
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2468
+ .scroll-host { height: 180px; overflow: auto; }
2469
+ </style>
2470
+
2471
+ ```
2472
+
2473
+ ### UiTimeline 分类独立示例
2474
+
2475
+ ```vue
2476
+ <script setup lang="ts">
2477
+ import { ref } from 'vue'
2478
+ import { UiTimeline, UiTimelineItem } from 'sky-ui-kit'
2479
+ const message = ref('尚未操作')
2480
+ const open = ref(false)
2481
+
2482
+
2483
+ </script>
2484
+ <template>
2485
+ <div class="catalog-demo affix-example-host">
2486
+ <UiTimeline><UiTimelineItem timestamp="08:00">收到监测数据</UiTimelineItem><UiTimelineItem timestamp="09:00" type="success">完成数据校验</UiTimelineItem></UiTimeline>
2487
+ <p role="status">{{ message }}</p>
2488
+ </div>
2489
+ </template>
2490
+ <style scoped>
2491
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2492
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2493
+ .scroll-host { height: 180px; overflow: auto; }
2494
+ </style>
2495
+
2496
+ ```
2497
+
2498
+ ### UiTree 分类独立示例
2499
+
2500
+ ```vue
2501
+ <script setup lang="ts">
2502
+ import { ref } from 'vue'
2503
+ import { UiTree } from 'sky-ui-kit'
2504
+ const message = ref('尚未操作')
2505
+ const open = ref(false)
2506
+
2507
+ const tree = [{ id: 'basin', label: '长江流域', children: [{ id: 'hankou', label: '汉口站' }] }]
2508
+ </script>
2509
+ <template>
2510
+ <div class="catalog-demo affix-example-host">
2511
+ <UiTree :data="tree" node-key="id" show-checkbox @node-click="message = $event.label" />
2512
+ <p role="status">{{ message }}</p>
2513
+ </div>
2514
+ </template>
2515
+ <style scoped>
2516
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2517
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2518
+ .scroll-host { height: 180px; overflow: auto; }
2519
+ </style>
2520
+
2521
+ ```
2522
+
2523
+ ### UiTreeV2 分类独立示例
2524
+
2525
+ ```vue
2526
+ <script setup lang="ts">
2527
+ import { ref } from 'vue'
2528
+ import { UiTreeV2 } from 'sky-ui-kit'
2529
+ const message = ref('尚未操作')
2530
+ const open = ref(false)
2531
+
2532
+ const tree = [{ id: 'basin', label: '长江流域', children: [{ id: 'hankou', label: '汉口站' }] }]
2533
+ </script>
2534
+ <template>
2535
+ <div class="catalog-demo affix-example-host">
2536
+ <UiTreeV2 :data="tree" :height="180" show-checkbox @node-click="message = $event.label" />
2537
+ <p role="status">{{ message }}</p>
2538
+ </div>
2539
+ </template>
2540
+ <style scoped>
2541
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2542
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2543
+ .scroll-host { height: 180px; overflow: auto; }
2544
+ </style>
2545
+
2546
+ ```
2547
+
2548
+ ### UiWatermark 分类独立示例
2549
+
2550
+ ```vue
2551
+ <script setup lang="ts">
2552
+ import { ref } from 'vue'
2553
+ import { UiWatermark } from 'sky-ui-kit'
2554
+ const message = ref('尚未操作')
2555
+ const open = ref(false)
2556
+
2557
+
2558
+ </script>
2559
+ <template>
2560
+ <div class="catalog-demo affix-example-host">
2561
+ <UiWatermark content="一体化平台"><div class="demo-block">监测数据 · 水印区域</div></UiWatermark>
2562
+ <p role="status">{{ message }}</p>
2563
+ </div>
2564
+ </template>
2565
+ <style scoped>
2566
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2567
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2568
+ .scroll-host { height: 180px; overflow: auto; }
2569
+ </style>
2570
+
2571
+ ```
2572
+
2573
+ ### UiTour 分类独立示例
2574
+
2575
+ ```vue
2576
+ <script setup lang="ts">
2577
+ import { ref } from 'vue'
2578
+ import { UiButton, UiTour, UiTourStep } from 'sky-ui-kit'
2579
+ const message = ref('尚未操作')
2580
+ const open = ref(false)
2581
+ const tourTarget = ref()
2582
+
2583
+ </script>
2584
+ <template>
2585
+ <div class="catalog-demo affix-example-host">
2586
+ <UiButton ref="tourTarget" @click="open = true">开始引导</UiButton><UiTour v-model="open"><UiTourStep :target="tourTarget?.$el" title="数据查询" description="通过这里查询测站数据" /></UiTour>
2587
+ <p role="status">{{ message }}</p>
2588
+ </div>
2589
+ </template>
2590
+ <style scoped>
2591
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2592
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2593
+ .scroll-host { height: 180px; overflow: auto; }
2594
+ </style>
2595
+
2596
+ ```
2597
+
2598
+ ### UiAnchor 分类独立示例
2599
+
2600
+ ```vue
2601
+ <script setup lang="ts">
2602
+ import { ref } from 'vue'
2603
+ import { UiAnchor, UiAnchorLink } from 'sky-ui-kit'
2604
+ const message = ref('尚未操作')
2605
+ const open = ref(false)
2606
+
2607
+
2608
+ </script>
2609
+ <template>
2610
+ <div class="catalog-demo affix-example-host">
2611
+ <UiAnchor><UiAnchorLink href="#anchor-demo-one" title="测站信息" /><UiAnchorLink href="#anchor-demo-two" title="监测数据" /></UiAnchor><div id="anchor-demo-one" class="demo-block">测站信息</div><div id="anchor-demo-two" class="demo-block">监测数据</div>
2612
+ <p role="status">{{ message }}</p>
2613
+ </div>
2614
+ </template>
2615
+ <style scoped>
2616
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2617
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2618
+ .scroll-host { height: 180px; overflow: auto; }
2619
+ </style>
2620
+
2621
+ ```
2622
+
2623
+ ### UiSegmented 分类独立示例
2624
+
2625
+ ```vue
2626
+ <script setup lang="ts">
2627
+ import { ref } from 'vue'
2628
+ import { UiSegmented } from 'sky-ui-kit'
2629
+ const message = ref('尚未操作')
2630
+ const open = ref(false)
2631
+ const selected = ref('实况')
2632
+
2633
+ </script>
2634
+ <template>
2635
+ <div class="catalog-demo affix-example-host">
2636
+ <UiSegmented v-model="selected" :options="['实况', '预报', '历史']" /><p>当前:{{ selected }}</p>
2637
+ <p role="status">{{ message }}</p>
2638
+ </div>
2639
+ </template>
2640
+ <style scoped>
2641
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2642
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2643
+ .scroll-host { height: 180px; overflow: auto; }
2644
+ </style>
2645
+
2646
+ ```
2647
+
2648
+ ### UiSplitter 分类独立示例
2649
+
2650
+ ```vue
2651
+ <script setup lang="ts">
2652
+ import { ref } from 'vue'
2653
+ import { UiSplitter, UiSplitterPanel } from 'sky-ui-kit'
2654
+ const message = ref('尚未操作')
2655
+ const open = ref(false)
2656
+
2657
+
2658
+ </script>
2659
+ <template>
2660
+ <div class="catalog-demo affix-example-host">
2661
+ <UiSplitter style="height: 200px"><UiSplitterPanel size="30%"><div class="demo-block">拖动分隔条 · 左栏</div></UiSplitterPanel><UiSplitterPanel><div class="demo-block">主体</div></UiSplitterPanel></UiSplitter>
2662
+ <p role="status">{{ message }}</p>
2663
+ </div>
2664
+ </template>
2665
+ <style scoped>
2666
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2667
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2668
+ .scroll-host { height: 180px; overflow: auto; }
2669
+ </style>
2670
+
2671
+ ```
2672
+
2673
+ ### UiPopover 分类独立示例
2674
+
2675
+ ```vue
2676
+ <script setup lang="ts">
2677
+ import { ref } from 'vue'
2678
+ import { UiButton, UiPopover } from 'sky-ui-kit'
2679
+ const message = ref('尚未操作')
2680
+ const open = ref(false)
2681
+
2682
+
2683
+ </script>
2684
+ <template>
2685
+ <div class="catalog-demo affix-example-host">
2686
+ <UiPopover title="测站信息" content="汉口站 · 长江流域" trigger="click"><template #reference><UiButton>点击查看浮层</UiButton></template></UiPopover>
2687
+ <p role="status">{{ message }}</p>
2688
+ </div>
2689
+ </template>
2690
+ <style scoped>
2691
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2692
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2693
+ .scroll-host { height: 180px; overflow: auto; }
2694
+ </style>
2695
+
2696
+ ```
2697
+
2698
+ ### UiMessage 分类独立示例
2699
+
2700
+ ```vue
2701
+ <script setup lang="ts">
2702
+ import { ref } from 'vue'
2703
+ import { UiButton, UiMessage } from 'sky-ui-kit'
2704
+ const message = ref('尚未操作')
2705
+ const open = ref(false)
2706
+
2707
+
2708
+ </script>
2709
+ <template>
2710
+ <div class="catalog-demo affix-example-host">
2711
+ <UiButton @click="UiMessage.success('保存成功')">成功消息</UiButton><UiButton @click="UiMessage.warning('请检查数据')">警告消息</UiButton>
2712
+ <p role="status">{{ message }}</p>
2713
+ </div>
2714
+ </template>
2715
+ <style scoped>
2716
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2717
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2718
+ .scroll-host { height: 180px; overflow: auto; }
2719
+ </style>
2720
+
2721
+ ```
2722
+
2723
+ ### UiMessageBox 分类独立示例
2724
+
2725
+ ```vue
2726
+ <script setup lang="ts">
2727
+ import { ref } from 'vue'
2728
+ import { UiButton, UiMessage, UiMessageBox } from 'sky-ui-kit'
2729
+ const message = ref('尚未操作')
2730
+ const open = ref(false)
2731
+ async function confirm() { try { await UiMessageBox.confirm('确认更新测站数据?', '操作确认'); message.value = '已确认' } catch { message.value = '已取消' } }
2732
+
2733
+ </script>
2734
+ <template>
2735
+ <div class="catalog-demo affix-example-host">
2736
+ <UiButton @click="confirm">打开确认框</UiButton>
2737
+ <p role="status">{{ message }}</p>
2738
+ </div>
2739
+ </template>
2740
+ <style scoped>
2741
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2742
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2743
+ .scroll-host { height: 180px; overflow: auto; }
2744
+ </style>
2745
+
2746
+ ```
2747
+
2748
+ ### UiNotification 分类独立示例
2749
+
2750
+ ```vue
2751
+ <script setup lang="ts">
2752
+ import { ref } from 'vue'
2753
+ import { UiButton, UiNotification } from 'sky-ui-kit'
2754
+ const message = ref('尚未操作')
2755
+ const open = ref(false)
2756
+
2757
+
2758
+ </script>
2759
+ <template>
2760
+ <div class="catalog-demo affix-example-host">
2761
+ <UiButton @click="UiNotification({ title: '数据更新', message: '监测数据已刷新', type: 'success' })">显示通知</UiButton>
2762
+ <p role="status">{{ message }}</p>
2763
+ </div>
2764
+ </template>
2765
+ <style scoped>
2766
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2767
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2768
+ .scroll-host { height: 180px; overflow: auto; }
2769
+ </style>
2770
+
2771
+ ```
2772
+
2773
+ ### UiLoading 分类独立示例
2774
+
2775
+ ```vue
2776
+ <script setup lang="ts">
2777
+ import { ref } from 'vue'
2778
+ import { UiButton, UiLoading } from 'sky-ui-kit'
2779
+ const message = ref('尚未操作')
2780
+ const open = ref(false)
2781
+ const loadingTarget = ref<HTMLElement>()
2782
+ async function showLoading() { const instance = UiLoading.service({ target: loadingTarget.value, text: '正在加载' }); try { await new Promise(resolve => setTimeout(resolve, 1000)) } finally { instance.close() } }
2783
+
2784
+ </script>
2785
+ <template>
2786
+ <div class="catalog-demo affix-example-host">
2787
+ <UiButton @click="showLoading">显示加载服务</UiButton><div ref="loadingTarget" class="demo-block">加载目标区域</div>
2788
+ <p role="status">{{ message }}</p>
2789
+ </div>
2790
+ </template>
2791
+ <style scoped>
2792
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2793
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2794
+ .scroll-host { height: 180px; overflow: auto; }
2795
+ </style>
2796
+
2797
+ ```
2798
+
2799
+ ### vUiLoading 分类独立示例
2800
+
2801
+ ```vue
2802
+ <script setup lang="ts">
2803
+ import { ref } from 'vue'
2804
+ import { UiSwitch, vUiLoading } from 'sky-ui-kit'
2805
+ const message = ref('尚未操作')
2806
+ const open = ref(false)
2807
+ const loading = ref(false)
2808
+
2809
+ </script>
2810
+ <template>
2811
+ <div class="catalog-demo affix-example-host">
2812
+ <UiSwitch v-model="loading" active-text="切换加载" /><div v-ui-loading="loading" class="demo-block">数据内容</div>
2813
+ <p role="status">{{ message }}</p>
2814
+ </div>
2815
+ </template>
2816
+ <style scoped>
2817
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2818
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2819
+ .scroll-host { height: 180px; overflow: auto; }
2820
+ </style>
2821
+
2822
+ ```
2823
+
2824
+ ### vUiInfiniteScroll 分类独立示例
2825
+
2826
+ ```vue
2827
+ <script setup lang="ts">
2828
+ import { ref } from 'vue'
2829
+ import { vUiInfiniteScroll } from 'sky-ui-kit'
2830
+ const message = ref('尚未操作')
2831
+ const open = ref(false)
2832
+ const count = ref(8)
2833
+ function loadMore() { count.value = Math.min(30, count.value + 4) }
2834
+
2835
+ </script>
2836
+ <template>
2837
+ <div class="catalog-demo affix-example-host">
2838
+ <div style="height: 160px; overflow: auto"><ul v-ui-infinite-scroll="loadMore" :infinite-scroll-disabled="count >= 30"><li v-for="n in count" :key="n">测站记录 {{ n }}</li></ul></div><p>最多演示 30 条</p>
2839
+ <p role="status">{{ message }}</p>
2840
+ </div>
2841
+ </template>
2842
+ <style scoped>
2843
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2844
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2845
+ .scroll-host { height: 180px; overflow: auto; }
2846
+ </style>
2847
+
2848
+ ```
2849
+
2850
+ ### vUiPopover 分类独立示例
2851
+
2852
+ ```vue
2853
+ <script setup lang="ts">
2854
+ import { ref } from 'vue'
2855
+ import { UiButton, UiPopover, vUiPopover } from 'sky-ui-kit'
2856
+ const message = ref('尚未操作')
2857
+ const open = ref(false)
2858
+ const popoverRef = ref()
2859
+
2860
+ </script>
2861
+ <template>
2862
+ <div class="catalog-demo affix-example-host">
2863
+ <UiButton v-ui-popover="popoverRef">指令绑定浮层</UiButton><UiPopover ref="popoverRef" trigger="click" title="测站说明" content="汉口站 · 长江流域" />
2864
+ <p role="status">{{ message }}</p>
2865
+ </div>
2866
+ </template>
2867
+ <style scoped>
2868
+ .catalog-demo { padding: 20px; border: 1px solid var(--color-border, #dbe3ef); border-radius: 8px; overflow-x: auto; }
2869
+ .demo-block { min-height: 140px; display: grid; place-items: center; background: var(--color-surface, #eef5ff); padding: 16px; }
2870
+ .scroll-host { height: 180px; overflow: auto; }
2871
+ </style>
2872
+
2873
+ ```
2874
+
2875
+ # 团队 AI 模块变更记录
2876
+
2877
+ 本文件记录源码模块调整与接入影响,不作为 npm 发布完成的依据。团队使用安装包时以包内文档及 package.json 版本为准;使用当前源码时读取仓库中的同名文档。
2878
+
2879
+ ## 2026-10-13 · 0.1.2 发布准备
2880
+
2881
+ - 核对并重新生成组件 API、AI 指南、llms 索引和完整文档,包含项目图标、全局适配、独立常驻示例和导航调整。
2882
+ - 修正 README 默认 CSS 作用域描述;版本更新为 0.1.2。发布是否完成以 npm 注册表为准。
2883
+
2884
+ ## 2026-10-13 · 修正项目图标定位
2885
+
2886
+ - 移除 SvgIcon 到 UiIcon 的导航重映射,给项目 SVG 图库添加独立锚点,点击项目菜单直接定位项目图标。
2887
+
2888
+ ## 2026-10-13 · 四类连续展示
2889
+
2890
+ - 数据展示、导航、反馈和其他配置主入口补充独立常驻示例、代码和交互;结构子组件跟随父示例。
2891
+ - 菜单只定位,不替换同一展示区,源码同步 AI 文档。
2892
+
2893
+ ## 2026-10-13 · 补全五项独立示例
2894
+
2895
+ - 时间下拉选择、穿梭框、树选择器、上传和提及补充常驻效果、事件反馈及各自代码。
2896
+ - 上传只选择本地文件,不发起请求;示例源码同步生成团队 AI 文档。
2897
+
2898
+ ## 2026-10-13 · 示例连续展示
2899
+
2900
+ - 已完成的基础和表单示例全部常驻页面,每项保留独立交互状态及代码入口;菜单只定位,不再替换顶部示例。
2901
+
2902
+ ## 2026-10-13 · 补全控件独立示例
2903
+
2904
+ - 为截图中的时间、选择、单复选、级联、颜色、日期、数字、标签、验证码、评分及折叠动画补充各自效果、状态反馈与复制代码。
2905
+ - 每项 Demo 源码同步生成 AI 示例,公开组件 API 不变。
2906
+
2907
+ ## 2026-10-13 · 合并表单导航分组
2908
+
2909
+ - 移除左侧“表单组件”独立分组,将相关入口合并到“基础组件”;原有示例、子组件关系及公开 API 保留。
2910
+
2911
+ ## 2026-10-13 · 自动补全效果
2912
+
2913
+ - 自动补全入口替换为真实 UiAutocomplete 示例,支持站点/流域筛选、建议选择、清空、禁用、输入触发和自定义建议插槽。
2914
+ - 源码同步生成可复制代码与 AI 示例;远程查询仍由应用接入。
2915
+
2916
+ ## 2026-10-13 · 表单交互示例
2917
+
2918
+ - UiForm 和 UiFormItem 入口展示完整测站配置表单,提供必填校验、重置、禁用及提交数据反馈。
2919
+ - 示例保留控件状态和图标绑定,源码同步代码展示与 AI 指南,真实请求由使用方接入。
2920
+
2921
+ ## 2026-10-13 · 基础组件使用示例
2922
+
2923
+ - 分割线补充方向、标题位置和虚线;链接补充类型、禁用、图标与点击反馈;间距补充换行、垂直排列与间距切换;文本补充类型、尺寸与省略。
2924
+ - 四个独立展示页共用真实 Demo 源码生成复制代码和 AI 示例,公开 API 不变。
2925
+
2926
+ ## 2026-10-13 · 地图业务布局入口
2927
+
2928
+ - 布局容器下新增地图业务布局子项;顶栏、侧栏、主体、底栏统一进入完整布局页,避免切换后看不到地图布局示例。
2929
+
2930
+ ## 2026-10-13 · 地图业务布局说明
2931
+
2932
+ - 新增 TemplateLayout 独立布局说明及交互轮廓示例,展示 top、toolbar、right、legend、timeline、content 区域与右栏避让。
2933
+ - 记录真实 props、默认值和作用域插槽,明确原组件及业务依赖仍在应用侧;不新增库 API。
2934
+
2935
+ ## 2026-10-13 · 整体布局优先
2936
+
2937
+ - 布局容器先展示四区完整结构,再按顶栏、左侧栏、主体、底栏排列独立示例;补充完整布局复制代码。
2938
+
2939
+ ## 2026-10-13 · 布局区域轮廓与完整展示
2940
+
2941
+ - 布局子组件页面同时展示四个独立区域示例,菜单按锚点定位。
2942
+ - 添加外框、区域分隔和主色高亮,修复包装组件下局部演示样式匹配,复制代码同步轮廓样式。
2943
+
2944
+ ## 2026-10-13 · 布局子组件效果
2945
+
2946
+ - 侧栏、顶栏、底栏、主体入口补充真实封装组件效果和各自代码,替代仅有导入与 API 索引的展示。
2947
+ - 示例在 UiContainer 内演示宽高和剩余空间,代码同步 AI 指南;公开 API 不变。
2948
+
2949
+ ## 2026-10-13 · 项目组件独立展示
2950
+
2951
+ - 将四个项目选择与时间组件拆成独立 Vue 预览模块,每个模块拥有独立展示卡片、导航锚点、状态和代码入口。
2952
+ - 移除合并展示模块,保持原导航地址和组件包 API。
2953
+
2954
+ ## 2026-10-13 · 项目选择与时间示例代码
2955
+
2956
+ - 四个展示模块各自增加查看代码和复制代码,替代页面底部唯一的组合示例入口。
2957
+ - 示例包含公开组件导入、单选多选和禁用空状态、分类树数据、时间范围与时间轴状态,以及 change 事件;代码同步到 AI 指南。
2958
+
2959
+ ## 2026-10-13 · 移除统一组件入口展示
2960
+
2961
+ - 删除开发指南中的组件入口与兼容菜单及统一组件入口展示组件,同时移除组件索引页的相关跳转链接。
2962
+ - 安装和导入方式继续查看快速开始,组件效果放在对应模块;组件库出口与 API 保留。
2963
+
2964
+ ## 2026-10-12 · 开发指南 / 快速开始
2965
+
2966
+ - 安装和升级命令统一为 `npm install sky-ui-kit@latest`,移除固定 0.1.1 和“等待注册表处理”的过时描述。latest 表示 npm 已发布的最新正式版本,不包含尚未发布的工作区修改。
2967
+ - 新增团队可复制的 AI 文档读取提示,涵盖公开组件、API、主题及业务接入规则。
2968
+ - 网站与 AI 文档共用 src/quick-start-examples.ts;文档生成会同步安装、入口、首个组件示例和 AI 读取提示。
2969
+ - 每次后续模块修改均需更新相关说明、本变更记录及生成文档;仓库 AGENTS.md 保存此约定。
2970
+
2971
+ ## 2026-10-12 · 预览站 / 左侧导航
2972
+
2973
+ - 分区名称为“使用指南 / 团队专用组件 / 项目特色组件”。团队专用组件基于 Element Plus 封装。
2974
+ - 一级分类采用手风琴展开,二级为主组件,子组件收在对应主组件下;搜索保留父级上下文。
2975
+ - 此调整只影响预览网站,不改变组件包 API。
2976
+
2977
+ ## 2026-10-12 · 团队专用组件 / 完整目录
2978
+
2979
+ - 源码以 Element Plus 2.14.7 为基准,提供 111 个主 / 子组件、4 个服务出口和 3 个指令;保留 10 个项目特色组件。
2980
+ - 完整映射见 ELEMENT-PLUS-COVERAGE.md。组件出口与 API 索引覆盖不代表全部独立示例及视觉状态已验证。
2981
+ - 新增组件使用方需要 Element Plus 至少 2.14.7;业务请求、路由和权限仍由应用接入。
2982
+ # 2026-10-12 按钮、滚动条与图标
2983
+
2984
+ ## 按钮独立示例
2985
+
2986
+ - 读取原 main.ts / App.vue / base.css / VFit token / 地图布局,新增 GLOBAL-ADAPTATION.md;布局页加入全局适配链路、入口/变量桥接/尺寸代码与浮层、resize、窄屏边界,AI 文档同步。
2987
+
2988
+ - 布局页扩展为六种结构,新增横向导航、双侧栏及上下分区,保留业务边界并提供共享源码及 AI 示例。
2989
+
2990
+ - 布局容器补充实际组件组合:系统查询表格、菜单切换、无菜单页、地图菜单/工具/图例/时间轴/右面板与操作反馈;完整示例代码与 AI 文档共用源码。
2991
+
2992
+ - 左侧去掉栅格行 / 栅格列;布局容器补充原系统、无菜单与地图布局对应关系、插槽和业务边界,新增侧栏/右面板交互和共享示例;原业务项目未修改。
2993
+
2994
+ - 按用户要求移除按钮页的按钮组效果和对应可复制代码,保留其他按钮示例。
2995
+
2996
+ - UiButton 页面新增语义色、描边、圆角、文字/链接、图标、尺寸、禁用和加载示例;保存交互带操作反馈,源码可复制并生成到 AI 文档。
2997
+
2998
+ ## 滚动条直接使用约定
2999
+
3000
+ - 滚动条页面、菜单名称、导入示例改为 ElScrollbar,直接从 element-plus 导入。
3001
+ - 删除 UiScrollbar 包装出口;同步生成目录、API、使用清单与 AI 文档。滚动条沿用应用现有样式范围,不新增主题包装层。
3002
+
3003
+ ## 图标与业务适配
3004
+
3005
+ - 补齐自有 SVG 插件安装、Vite 配置、main.ts 注册、TS 声明、页面 prefix 与原项目命名规则适配;共享示例保证页面与 AI 文档一致。
3006
+ - 重扫原项目:590 个 Vue / TS / JS 文件、57 种 EP 模板组件、3 种服务、56 个公共 Vue 组件;新增 COMPONENT-USAGE.md / component-usage.json 与 ADAPTATION.md。
3007
+ - 原项目接入页新增实际清单、使用位置和适配边界;同步 npm 文档文件及 llms 索引。静态扫描不等于业务运行验收。
3008
+
3009
+ - 新增 SvgIcon、projectIcons、ProjectIconName、registerProjectIcons;导入 274 个业务 SVG,子目录名称加前缀,隔离 sprite 和内部 ID。
3010
+ - UiIcon 页面补充 Element Plus 全量图标、业务 SVG 分类搜索、名称复制、尺寸颜色、按钮状态和菜单绑定示例;项目特色组件新增 SVG 入口。
3011
+ - 同步生成 API、AI 示例、主题及原项目反向接入说明。未构建、发布或提交,原业务项目未修改。
3012
+
3013
+
3014
+ # Component API reference
3015
+
3016
+ Generated from Vue/TypeScript source; defaultExpression is source text, not evaluated JSON. Types refer to declarations below. Unlisted props must not be invented. For Element Plus components use upstream documentation and shipped typings.
3017
+
3018
+ ## SvgIcon
3019
+
3020
+ ### Props
3021
+
3022
+ | Name | Type | Required | Default expression |
3023
+ |---|---|---|---|
3024
+ | name | string | true | undefined / no declared default |
3025
+ | size | number &#124; string | false | '1em' |
3026
+ | title | string | false | undefined / no declared default |
3027
+ | decorative | boolean | false | true |
3028
+ | color | string | false | undefined / no declared default |
3029
+ | prefix | string | false | 'sky-icon-' |
3030
+
3031
+ ### Events
3032
+
3033
+ No declared events.
3034
+
3035
+ Slots: No declared content slots.
3036
+
3037
+ ## AppSelect
3038
+
3039
+ ### Props
3040
+
3041
+ | Name | Type | Required | Default expression |
3042
+ |---|---|---|---|
3043
+ | modelValue | AppSelectValue | false | undefined |
3044
+ | options | AppSelectOption[] | false | () => [] |
3045
+ | emptyLabel | string | false | '暂无可选项' |
3046
+ | popperClass | string | false | '' |
3047
+ | teleported | boolean | false | false |
3048
+
3049
+ ### Events
3050
+
3051
+ - `update:modelValue` — `[value: AppSelectValue]`
3052
+ - `change` — `[value: AppSelectValue]`
3053
+
3054
+ Slots: No declared content slots.
3055
+
3056
+ ```ts
3057
+ export type AppSelectValue = string | number | boolean | Record<string, unknown> | AppSelectValue[] | null | undefined
3058
+ export type AppSelectOption = {
3059
+ label: string
3060
+ value: AppSelectValue
3061
+ disabled?: boolean
3062
+ } | string | number
3063
+ ```
3064
+
3065
+ ## MapTimeline
3066
+
3067
+ ### Props
3068
+
3069
+ | Name | Type | Required | Default expression |
3070
+ |---|---|---|---|
3071
+ | modelValue | number | false | 0 |
225
3072
  | startTime | TimelineTimeInput | false | () => new Date() |
226
3073
  | points | TimelinePoint[] | false | () => [] |
227
3074
  | steps | number | false | 24 |
@@ -338,367 +3185,1260 @@ export type TimeRangeQuickOption = {
338
3185
  }
339
3186
  ```
340
3187
 
341
- ## ProjectMenu
3188
+ ## ProjectMenu
3189
+
3190
+ ### Props
3191
+
3192
+ | Name | Type | Required | Default expression |
3193
+ |---|---|---|---|
3194
+ | direction | 'horizontal' &#124; 'vertical' | false | 'horizontal' |
3195
+ | active | string | false | '' |
3196
+ | items | ProjectMenuItem[] | false | () => [] |
3197
+ | groups | ProjectMenuGroup[] | false | () => [] |
3198
+
3199
+ ### Events
3200
+
3201
+ - `update:active` — `[key: string]`
3202
+ - `select` — `[item: ProjectMenuItem]`
3203
+
3204
+ Slots: No declared content slots.
3205
+
3206
+ ```ts
3207
+ export interface ProjectMenuItem { key: string; label: string; disabled?: boolean; icon?: Component }
3208
+ export interface ProjectMenuGroup { label: string; items: ProjectMenuItem[] }
3209
+ ```
3210
+
3211
+ ## MapSideMenu
3212
+
3213
+ ### Props
3214
+
3215
+ | Name | Type | Required | Default expression |
3216
+ |---|---|---|---|
3217
+ | title | string | false | '实况(测站)' |
3218
+ | active | string | false | 'rain' |
3219
+ | dark | boolean | false | false |
3220
+ | compact | boolean | false | false |
3221
+ | items | MapMenuItem[] | false | () => [
3222
+ { key: 'rain', label: '降水', icon: Pouring },
3223
+ { key: 'reservoir-level', label: '水库水位', icon: List },
3224
+ { key: 'reservoir-flow', label: '水库径流', icon: TrendCharts },
3225
+ { key: 'river-level', label: '河道水位', icon: List },
3226
+ { key: 'river-flow', label: '河道径流', icon: TrendCharts },
3227
+ { key: 'temperature', label: '气温', icon: Sunny },
3228
+ { key: 'wind', label: '风速', icon: WindPower }
3229
+ ] |
3230
+
3231
+ ### Events
3232
+
3233
+ - `update:active` — `[key: string]`
3234
+ - `update:compact` — `[value: boolean]`
3235
+ - `select` — `[item: MapMenuItem]`
3236
+
3237
+ Slots: No declared content slots.
3238
+
3239
+ ```ts
3240
+ export interface MapMenuItem { key: string; label: string; icon?: Component }
3241
+ ```
3242
+
3243
+ ## MapTools
3244
+
3245
+ ### Props
3246
+
3247
+ | Name | Type | Required | Default expression |
3248
+ |---|---|---|---|
3249
+ | active | string | false | 'layers' |
3250
+ | horizontal | boolean | false | false |
3251
+ | icons | Record<string, Component> | false | () => ({}) |
3252
+
3253
+ ### Events
3254
+
3255
+ - `update:active` — `[key: string]`
3256
+ - `tool-click` — `[key: string]`
3257
+ - `context-change` — `[enabled: boolean]`
3258
+
3259
+ Slots: No declared content slots.
3260
+
3261
+ ## AtlasMapTitle
3262
+
3263
+ ### Props
3264
+
3265
+ | Name | Type | Required | Default expression |
3266
+ |---|---|---|---|
3267
+ | title | string | true | undefined / no declared default |
3268
+ | subtitle | string | false | '' |
3269
+ | rightOpen | boolean | false | false |
3270
+
3271
+ ### Events
3272
+
3273
+ No declared events.
3274
+
3275
+ Slots: No declared content slots.
3276
+
3277
+ ## AtlasRightToggleButton
3278
+
3279
+ ### Props
3280
+
3281
+ | Name | Type | Required | Default expression |
3282
+ |---|---|---|---|
3283
+ | open | boolean | false | false |
3284
+ | openTitle | string | false | '展开右侧面板' |
3285
+ | closeTitle | string | false | '收起右侧面板' |
3286
+
3287
+ ### Events
3288
+
3289
+ - `toggle` — `[]`
3290
+
3291
+ Slots: No declared content slots.
3292
+
3293
+ ## ProcessDataTable
3294
+
3295
+ ### Props
3296
+
3297
+ | Name | Type | Required | Default expression |
3298
+ |---|---|---|---|
3299
+ | times | string[] | true | undefined / no declared default |
3300
+ | series | { name: string; data: (number &#124; null)[] }[] | true | undefined / no declared default |
3301
+ | loading | boolean | false | undefined / no declared default |
3302
+
3303
+ ### Events
3304
+
3305
+ No declared events.
3306
+
3307
+ Slots: No declared content slots.
3308
+
3309
+ ## UiAffix
3310
+
3311
+ 固钉 · 导航组件. Original: ElAffix. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/affix.html). See dist/components/element-plus.d.ts.
3312
+
3313
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3314
+
3315
+ ## UiIcon
3316
+
3317
+ 图标 · 基础组件. Original: ElIcon. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/icon.html). See dist/components/element-plus.d.ts.
3318
+
3319
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3320
+
3321
+ ## UiAlert
3322
+
3323
+ 警告提示 · 反馈组件. Original: ElAlert. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/alert.html). See dist/components/element-plus.d.ts.
3324
+
3325
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3326
+
3327
+ ## UiForm
3328
+
3329
+ 表单 · 表单组件. Original: ElForm. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/form.html). See dist/components/element-plus.d.ts.
3330
+
3331
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3332
+
3333
+ ## UiFormItem
3334
+
3335
+ 表单项 · 表单组件. Original: ElFormItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/form.html). See dist/components/element-plus.d.ts.
3336
+
3337
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3338
+
3339
+ ## UiPopper
3340
+
3341
+ 底层浮层 · 其他与配置. Original: ElPopper. Import from: sky-ui-kit. [API](https://github.com/element-plus/element-plus/tree/2.14.7/packages/components/popper). See dist/components/element-plus.d.ts.
3342
+
3343
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3344
+
3345
+ ## UiTooltip
3346
+
3347
+ 文字提示 · 反馈组件. Original: ElTooltip. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tooltip.html). See dist/components/element-plus.d.ts.
3348
+
3349
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3350
+
3351
+ ## UiInput
3352
+
3353
+ 输入框 · 表单组件. Original: ElInput. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/input.html). See dist/components/element-plus.d.ts.
3354
+
3355
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3356
+
3357
+ ## ElScrollbar
3358
+
3359
+ 滚动条 · 基础组件. Original: ElScrollbar. Import from: element-plus. [API](https://element-plus.org/zh-CN/component/scrollbar.html). See element-plus/es/components/scrollbar/index.d.ts.
3360
+
3361
+ Import ElScrollbar directly from element-plus. No sky-ui-kit wrapper or alias export; styles follow its existing application scope.
3362
+
3363
+ ## UiAutocomplete
3364
+
3365
+ 自动补全 · 表单组件. Original: ElAutocomplete. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/autocomplete.html). See dist/components/element-plus.d.ts.
3366
+
3367
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3368
+
3369
+ ## UiAvatar
3370
+
3371
+ 头像 · 数据展示. Original: ElAvatar. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/avatar.html). See dist/components/element-plus.d.ts.
3372
+
3373
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3374
+
3375
+ ## UiAvatarGroup
3376
+
3377
+ 头像组 · 数据展示. Original: ElAvatarGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/avatar.html). See dist/components/element-plus.d.ts.
3378
+
3379
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3380
+
3381
+ ## UiBacktop
3382
+
3383
+ 回到顶部 · 导航组件. Original: ElBacktop. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/backtop.html). See dist/components/element-plus.d.ts.
3384
+
3385
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3386
+
3387
+ ## UiBadge
3388
+
3389
+ 徽标 · 数据展示. Original: ElBadge. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/badge.html). See dist/components/element-plus.d.ts.
3390
+
3391
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3392
+
3393
+ ## UiBreadcrumb
3394
+
3395
+ 面包屑 · 导航组件. Original: ElBreadcrumb. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/breadcrumb.html). See dist/components/element-plus.d.ts.
3396
+
3397
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3398
+
3399
+ ## UiBreadcrumbItem
3400
+
3401
+ 面包屑项 · 导航组件. Original: ElBreadcrumbItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/breadcrumb.html). See dist/components/element-plus.d.ts.
3402
+
3403
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3404
+
3405
+ ## UiConfigProvider
3406
+
3407
+ 全局配置 · 其他与配置. Original: ElConfigProvider. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/config-provider.html). See dist/components/element-plus.d.ts.
3408
+
3409
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3410
+
3411
+ ## UiButton
3412
+
3413
+ 按钮 · 基础组件. Original: ElButton. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/button.html). See dist/components/element-plus.d.ts.
3414
+
3415
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3416
+
3417
+ ## UiButtonGroup
3418
+
3419
+ 按钮组 · 基础组件. Original: ElButtonGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/button.html). See dist/components/element-plus.d.ts.
3420
+
3421
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3422
+
3423
+ ## UiTimePicker
3424
+
3425
+ 时间选择器 · 表单组件. Original: ElTimePicker. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/time-picker.html). See dist/components/element-plus.d.ts.
3426
+
3427
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3428
+
3429
+ ## UiTag
3430
+
3431
+ 标签 · 数据展示. Original: ElTag. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tag.html). See dist/components/element-plus.d.ts.
3432
+
3433
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3434
+
3435
+ ## UiSelect
3436
+
3437
+ 选择器 · 表单组件. Original: ElSelect. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/select.html). See dist/components/element-plus.d.ts.
3438
+
3439
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3440
+
3441
+ ## UiOption
3442
+
3443
+ 选项 · 表单组件. Original: ElOption. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/select.html). See dist/components/element-plus.d.ts.
3444
+
3445
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3446
+
3447
+ ## UiOptionGroup
3448
+
3449
+ 选项组 · 表单组件. Original: ElOptionGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/select.html). See dist/components/element-plus.d.ts.
3450
+
3451
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3452
+
3453
+ ## UiCalendar
3454
+
3455
+ 日历 · 数据展示. Original: ElCalendar. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/calendar.html). See dist/components/element-plus.d.ts.
3456
+
3457
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3458
+
3459
+ ## UiCard
3460
+
3461
+ 卡片 · 数据展示. Original: ElCard. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/card.html). See dist/components/element-plus.d.ts.
3462
+
3463
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3464
+
3465
+ ## UiCarousel
3466
+
3467
+ 轮播 · 数据展示. Original: ElCarousel. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/carousel.html). See dist/components/element-plus.d.ts.
3468
+
3469
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3470
+
3471
+ ## UiCarouselItem
3472
+
3473
+ 轮播项 · 数据展示. Original: ElCarouselItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/carousel.html). See dist/components/element-plus.d.ts.
3474
+
3475
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3476
+
3477
+ ## UiCheckbox
3478
+
3479
+ 复选框 · 表单组件. Original: ElCheckbox. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/checkbox.html). See dist/components/element-plus.d.ts.
3480
+
3481
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
342
3482
 
343
- ### Props
3483
+ ## UiCheckboxButton
344
3484
 
345
- | Name | Type | Required | Default expression |
346
- |---|---|---|---|
347
- | direction | 'horizontal' &#124; 'vertical' | false | 'horizontal' |
348
- | active | string | false | '' |
349
- | items | ProjectMenuItem[] | false | () => [] |
350
- | groups | ProjectMenuGroup[] | false | () => [] |
3485
+ 复选按钮 · 表单组件. Original: ElCheckboxButton. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/checkbox.html). See dist/components/element-plus.d.ts.
351
3486
 
352
- ### Events
3487
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
353
3488
 
354
- - `update:active` — `[key: string]`
355
- - `select` — `[item: ProjectMenuItem]`
3489
+ ## UiCheckboxGroup
356
3490
 
357
- Slots: No declared content slots.
3491
+ 复选框组 · 表单组件. Original: ElCheckboxGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/checkbox.html). See dist/components/element-plus.d.ts.
358
3492
 
359
- ```ts
360
- export interface ProjectMenuItem { key: string; label: string; disabled?: boolean; icon?: Component }
361
- export interface ProjectMenuGroup { label: string; items: ProjectMenuItem[] }
362
- ```
3493
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
363
3494
 
364
- ## MapSideMenu
3495
+ ## UiRadio
365
3496
 
366
- ### Props
3497
+ 单选框 · 表单组件. Original: ElRadio. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/radio.html). See dist/components/element-plus.d.ts.
367
3498
 
368
- | Name | Type | Required | Default expression |
369
- |---|---|---|---|
370
- | title | string | false | '实况(测站)' |
371
- | active | string | false | 'rain' |
372
- | dark | boolean | false | false |
373
- | compact | boolean | false | false |
374
- | items | MapMenuItem[] | false | () => [
375
- { key: 'rain', label: '降水', icon: Pouring },
376
- { key: 'reservoir-level', label: '水库水位', icon: List },
377
- { key: 'reservoir-flow', label: '水库径流', icon: TrendCharts },
378
- { key: 'river-level', label: '河道水位', icon: List },
379
- { key: 'river-flow', label: '河道径流', icon: TrendCharts },
380
- { key: 'temperature', label: '气温', icon: Sunny },
381
- { key: 'wind', label: '风速', icon: WindPower }
382
- ] |
3499
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
383
3500
 
384
- ### Events
3501
+ ## UiRadioButton
385
3502
 
386
- - `update:active` — `[key: string]`
387
- - `update:compact` — `[value: boolean]`
388
- - `select` — `[item: MapMenuItem]`
3503
+ 单选按钮 · 表单组件. Original: ElRadioButton. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/radio.html). See dist/components/element-plus.d.ts.
389
3504
 
390
- Slots: No declared content slots.
3505
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
391
3506
 
392
- ```ts
393
- export interface MapMenuItem { key: string; label: string; icon?: Component }
394
- ```
3507
+ ## UiRadioGroup
395
3508
 
396
- ## MapTools
3509
+ 单选框组 · 表单组件. Original: ElRadioGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/radio.html). See dist/components/element-plus.d.ts.
397
3510
 
398
- ### Props
3511
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
399
3512
 
400
- | Name | Type | Required | Default expression |
401
- |---|---|---|---|
402
- | active | string | false | 'layers' |
403
- | horizontal | boolean | false | false |
404
- | icons | Record<string, Component> | false | () => ({}) |
3513
+ ## UiCascaderPanel
405
3514
 
406
- ### Events
3515
+ 级联面板 · 表单组件. Original: ElCascaderPanel. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/cascader.html). See dist/components/element-plus.d.ts.
407
3516
 
408
- - `update:active` — `[key: string]`
409
- - `tool-click` — `[key: string]`
410
- - `context-change` — `[enabled: boolean]`
3517
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
411
3518
 
412
- Slots: No declared content slots.
3519
+ ## UiCascader
413
3520
 
414
- ## AtlasMapTitle
3521
+ 级联选择器 · 表单组件. Original: ElCascader. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/cascader.html). See dist/components/element-plus.d.ts.
415
3522
 
416
- ### Props
3523
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
417
3524
 
418
- | Name | Type | Required | Default expression |
419
- |---|---|---|---|
420
- | title | string | true | undefined / no declared default |
421
- | subtitle | string | false | '' |
422
- | rightOpen | boolean | false | false |
3525
+ ## UiCheckTag
423
3526
 
424
- ### Events
3527
+ 可选标签 · 数据展示. Original: ElCheckTag. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/check-tag.html). See dist/components/element-plus.d.ts.
425
3528
 
426
- No declared events.
3529
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
427
3530
 
428
- Slots: No declared content slots.
3531
+ ## UiRow
429
3532
 
430
- ## AtlasRightToggleButton
3533
+ 栅格行 · 基础组件. Original: ElRow. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/layout.html). See dist/components/element-plus.d.ts.
431
3534
 
432
- ### Props
3535
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
433
3536
 
434
- | Name | Type | Required | Default expression |
435
- |---|---|---|---|
436
- | open | boolean | false | false |
437
- | openTitle | string | false | '展开右侧面板' |
438
- | closeTitle | string | false | '收起右侧面板' |
3537
+ ## UiCol
439
3538
 
440
- ### Events
3539
+ 栅格列 · 基础组件. Original: ElCol. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/layout.html). See dist/components/element-plus.d.ts.
441
3540
 
442
- - `toggle` — `[]`
3541
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
443
3542
 
444
- Slots: No declared content slots.
3543
+ ## UiCollapseTransition
445
3544
 
446
- ## ProcessDataTable
3545
+ 折叠动画 · 基础组件. Original: ElCollapseTransition. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/transition.html). See dist/components/element-plus.d.ts.
447
3546
 
448
- ### Props
3547
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
449
3548
 
450
- | Name | Type | Required | Default expression |
451
- |---|---|---|---|
452
- | times | string[] | true | undefined / no declared default |
453
- | series | { name: string; data: (number &#124; null)[] }[] | true | undefined / no declared default |
454
- | loading | boolean | false | undefined / no declared default |
3549
+ ## UiCollapse
455
3550
 
456
- ### Events
3551
+ 折叠面板 · 数据展示. Original: ElCollapse. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/collapse.html). See dist/components/element-plus.d.ts.
457
3552
 
458
- No declared events.
3553
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
459
3554
 
460
- Slots: No declared content slots.
3555
+ ## UiCollapseItem
461
3556
 
462
- ## UiAlert
3557
+ 折叠项 · 数据展示. Original: ElCollapseItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/collapse.html). See dist/components/element-plus.d.ts.
463
3558
 
464
- Original: ElAlert. [API](https://element-plus.org/en-US/component/alert.html). See dist/components/element-plus.d.ts.
3559
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
465
3560
 
466
- ## UiBadge
3561
+ ## UiColorPickerPanel
467
3562
 
468
- Original: ElBadge. [API](https://element-plus.org/en-US/component/badge.html). See dist/components/element-plus.d.ts.
3563
+ 颜色面板 · 表单组件. Original: ElColorPickerPanel. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/color-picker-panel.html). See dist/components/element-plus.d.ts.
469
3564
 
470
- ## UiButton
3565
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3566
+
3567
+ ## UiColorPicker
471
3568
 
472
- Original: ElButton. [API](https://element-plus.org/en-US/component/button.html). See dist/components/element-plus.d.ts.
3569
+ 颜色选择器 · 表单组件. Original: ElColorPicker. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/color-picker.html). See dist/components/element-plus.d.ts.
473
3570
 
474
- ## UiButtonGroup
3571
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
475
3572
 
476
- Original: ElButtonGroup. [API](https://element-plus.org/en-US/component/button-group.html). See dist/components/element-plus.d.ts.
3573
+ ## UiContainer
477
3574
 
478
- ## UiCard
3575
+ 布局容器 · 基础组件. Original: ElContainer. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/container.html). See dist/components/element-plus.d.ts.
479
3576
 
480
- Original: ElCard. [API](https://element-plus.org/en-US/component/card.html). See dist/components/element-plus.d.ts.
3577
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
481
3578
 
482
- ## UiCarousel
3579
+ ## UiAside
483
3580
 
484
- Original: ElCarousel. [API](https://element-plus.org/en-US/component/carousel.html). See dist/components/element-plus.d.ts.
3581
+ 侧栏 · 基础组件. Original: ElAside. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/container.html). See dist/components/element-plus.d.ts.
485
3582
 
486
- ## UiCarouselItem
3583
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
487
3584
 
488
- Original: ElCarouselItem. [API](https://element-plus.org/en-US/component/carousel-item.html). See dist/components/element-plus.d.ts.
3585
+ ## UiFooter
489
3586
 
490
- ## UiCascader
3587
+ 底栏 · 基础组件. Original: ElFooter. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/container.html). See dist/components/element-plus.d.ts.
491
3588
 
492
- Original: ElCascader. [API](https://element-plus.org/en-US/component/cascader.html). See dist/components/element-plus.d.ts.
3589
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
493
3590
 
494
- ## UiCheckbox
3591
+ ## UiHeader
495
3592
 
496
- Original: ElCheckbox. [API](https://element-plus.org/en-US/component/checkbox.html). See dist/components/element-plus.d.ts.
3593
+ 顶栏 · 基础组件. Original: ElHeader. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/container.html). See dist/components/element-plus.d.ts.
497
3594
 
498
- ## UiCol
3595
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
499
3596
 
500
- Original: ElCol. [API](https://element-plus.org/en-US/component/col.html). See dist/components/element-plus.d.ts.
3597
+ ## UiMain
501
3598
 
502
- ## UiCollapse
3599
+ 主体 · 基础组件. Original: ElMain. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/container.html). See dist/components/element-plus.d.ts.
503
3600
 
504
- Original: ElCollapse. [API](https://element-plus.org/en-US/component/collapse.html). See dist/components/element-plus.d.ts.
3601
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
505
3602
 
506
- ## UiCollapseItem
3603
+ ## UiStatistic
507
3604
 
508
- Original: ElCollapseItem. [API](https://element-plus.org/en-US/component/collapse-item.html). See dist/components/element-plus.d.ts.
3605
+ 统计数值 · 数据展示. Original: ElStatistic. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/statistic.html). See dist/components/element-plus.d.ts.
509
3606
 
510
- ## UiColorPicker
3607
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
511
3608
 
512
- Original: ElColorPicker. [API](https://element-plus.org/en-US/component/color-picker.html). See dist/components/element-plus.d.ts.
3609
+ ## UiCountdown
513
3610
 
514
- ## UiConfigProvider
3611
+ 倒计时 · 数据展示. Original: ElCountdown. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/statistic.html). See dist/components/element-plus.d.ts.
3612
+
3613
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3614
+
3615
+ ## UiDatePickerPanel
3616
+
3617
+ 日期面板 · 表单组件. Original: ElDatePickerPanel. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/date-picker-panel.html). See dist/components/element-plus.d.ts.
515
3618
 
516
- Original: ElConfigProvider. [API](https://element-plus.org/en-US/component/config-provider.html). See dist/components/element-plus.d.ts.
3619
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
517
3620
 
518
3621
  ## UiDatePicker
519
3622
 
520
- Original: ElDatePicker. [API](https://element-plus.org/en-US/component/date-picker.html). See dist/components/element-plus.d.ts.
3623
+ 日期选择器 · 表单组件. Original: ElDatePicker. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/date-picker.html). See dist/components/element-plus.d.ts.
3624
+
3625
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
521
3626
 
522
3627
  ## UiDescriptions
523
3628
 
524
- Original: ElDescriptions. [API](https://element-plus.org/en-US/component/descriptions.html). See dist/components/element-plus.d.ts.
3629
+ 描述列表 · 数据展示. Original: ElDescriptions. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/descriptions.html). See dist/components/element-plus.d.ts.
3630
+
3631
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
525
3632
 
526
3633
  ## UiDescriptionsItem
527
3634
 
528
- Original: ElDescriptionsItem. [API](https://element-plus.org/en-US/component/descriptions-item.html). See dist/components/element-plus.d.ts.
3635
+ 描述项 · 数据展示. Original: ElDescriptionsItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/descriptions.html). See dist/components/element-plus.d.ts.
3636
+
3637
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
529
3638
 
530
3639
  ## UiDialog
531
3640
 
532
- Original: ElDialog. [API](https://element-plus.org/en-US/component/dialog.html). See dist/components/element-plus.d.ts.
3641
+ 对话框 · 反馈组件. Original: ElDialog. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/dialog.html). See dist/components/element-plus.d.ts.
3642
+
3643
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3644
+
3645
+ ## UiDivider
3646
+
3647
+ 分割线 · 基础组件. Original: ElDivider. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/divider.html). See dist/components/element-plus.d.ts.
3648
+
3649
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
533
3650
 
534
3651
  ## UiDrawer
535
3652
 
536
- Original: ElDrawer. [API](https://element-plus.org/en-US/component/drawer.html). See dist/components/element-plus.d.ts.
3653
+ 抽屉 · 反馈组件. Original: ElDrawer. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/drawer.html). See dist/components/element-plus.d.ts.
3654
+
3655
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
537
3656
 
538
3657
  ## UiDropdown
539
3658
 
540
- Original: ElDropdown. [API](https://element-plus.org/en-US/component/dropdown.html). See dist/components/element-plus.d.ts.
3659
+ 下拉菜单 · 导航组件. Original: ElDropdown. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/dropdown.html). See dist/components/element-plus.d.ts.
3660
+
3661
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
541
3662
 
542
3663
  ## UiDropdownItem
543
3664
 
544
- Original: ElDropdownItem. [API](https://element-plus.org/en-US/component/dropdown-item.html). See dist/components/element-plus.d.ts.
3665
+ 下拉菜单项 · 导航组件. Original: ElDropdownItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/dropdown.html). See dist/components/element-plus.d.ts.
3666
+
3667
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
545
3668
 
546
3669
  ## UiDropdownMenu
547
3670
 
548
- Original: ElDropdownMenu. [API](https://element-plus.org/en-US/component/dropdown-menu.html). See dist/components/element-plus.d.ts.
3671
+ 下拉菜单面板 · 导航组件. Original: ElDropdownMenu. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/dropdown.html). See dist/components/element-plus.d.ts.
3672
+
3673
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
549
3674
 
550
3675
  ## UiEmpty
551
3676
 
552
- Original: ElEmpty. [API](https://element-plus.org/en-US/component/empty.html). See dist/components/element-plus.d.ts.
3677
+ 空状态 · 数据展示. Original: ElEmpty. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/empty.html). See dist/components/element-plus.d.ts.
553
3678
 
554
- ## UiFooter
3679
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
555
3680
 
556
- Original: ElFooter. [API](https://element-plus.org/en-US/component/footer.html). See dist/components/element-plus.d.ts.
3681
+ ## UiImageViewer
557
3682
 
558
- ## UiForm
3683
+ 图片预览 · 数据展示. Original: ElImageViewer. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/image.html). See dist/components/element-plus.d.ts.
559
3684
 
560
- Original: ElForm. [API](https://element-plus.org/en-US/component/form.html). See dist/components/element-plus.d.ts.
3685
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
561
3686
 
562
- ## UiFormItem
3687
+ ## UiImage
563
3688
 
564
- Original: ElFormItem. [API](https://element-plus.org/en-US/component/form-item.html). See dist/components/element-plus.d.ts.
3689
+ 图片 · 数据展示. Original: ElImage. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/image.html). See dist/components/element-plus.d.ts.
565
3690
 
566
- ## UiIcon
3691
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
567
3692
 
568
- Original: ElIcon. [API](https://element-plus.org/en-US/component/icon.html). See dist/components/element-plus.d.ts.
3693
+ ## UiInputNumber
569
3694
 
570
- ## UiImage
3695
+ 数字输入框 · 表单组件. Original: ElInputNumber. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/input-number.html). See dist/components/element-plus.d.ts.
571
3696
 
572
- Original: ElImage. [API](https://element-plus.org/en-US/component/image.html). See dist/components/element-plus.d.ts.
3697
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
573
3698
 
574
- ## UiInput
3699
+ ## UiInputTag
575
3700
 
576
- Original: ElInput. [API](https://element-plus.org/en-US/component/input.html). See dist/components/element-plus.d.ts.
3701
+ 标签输入框 · 表单组件. Original: ElInputTag. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/input-tag.html). See dist/components/element-plus.d.ts.
577
3702
 
578
- ## UiInputNumber
3703
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
579
3704
 
580
- Original: ElInputNumber. [API](https://element-plus.org/en-US/component/input-number.html). See dist/components/element-plus.d.ts.
3705
+ ## UiInputOtp
581
3706
 
582
- ## UiMessage
3707
+ 验证码输入框 · 表单组件. Original: ElInputOtp. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/input-otp.html). See dist/components/element-plus.d.ts.
583
3708
 
584
- Original: ElMessage. [API](https://element-plus.org/en-US/component/message.html). See dist/components/element-plus.d.ts.
3709
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
585
3710
 
586
- ## UiMessageBox
3711
+ ## UiLink
587
3712
 
588
- Original: ElMessageBox. [API](https://element-plus.org/en-US/component/message-box.html). See dist/components/element-plus.d.ts.
3713
+ 链接 · 基础组件. Original: ElLink. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/link.html). See dist/components/element-plus.d.ts.
589
3714
 
590
- ## UiNotification
3715
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
591
3716
 
592
- Original: ElNotification. [API](https://element-plus.org/en-US/component/notification.html). See dist/components/element-plus.d.ts.
3717
+ ## UiMenu
593
3718
 
594
- ## UiOption
3719
+ 菜单 · 导航组件. Original: ElMenu. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/menu.html). See dist/components/element-plus.d.ts.
3720
+
3721
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3722
+
3723
+ ## UiMenuItem
3724
+
3725
+ 菜单项 · 导航组件. Original: ElMenuItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/menu.html). See dist/components/element-plus.d.ts.
3726
+
3727
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3728
+
3729
+ ## UiMenuItemGroup
3730
+
3731
+ 菜单分组 · 导航组件. Original: ElMenuItemGroup. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/menu.html). See dist/components/element-plus.d.ts.
3732
+
3733
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
595
3734
 
596
- Original: ElOption. [API](https://element-plus.org/en-US/component/option.html). See dist/components/element-plus.d.ts.
3735
+ ## UiSubMenu
3736
+
3737
+ 子菜单 · 导航组件. Original: ElSubMenu. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/menu.html). See dist/components/element-plus.d.ts.
3738
+
3739
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3740
+
3741
+ ## UiPageHeader
3742
+
3743
+ 页头 · 导航组件. Original: ElPageHeader. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/page-header.html). See dist/components/element-plus.d.ts.
3744
+
3745
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
597
3746
 
598
3747
  ## UiPagination
599
3748
 
600
- Original: ElPagination. [API](https://element-plus.org/en-US/component/pagination.html). See dist/components/element-plus.d.ts.
3749
+ 分页 · 数据展示. Original: ElPagination. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/pagination.html). See dist/components/element-plus.d.ts.
601
3750
 
602
- ## UiPopconfirm
3751
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
603
3752
 
604
- Original: ElPopconfirm. [API](https://element-plus.org/en-US/component/popconfirm.html). See dist/components/element-plus.d.ts.
3753
+ ## UiPopconfirm
605
3754
 
606
- ## UiPopover
3755
+ 气泡确认 · 反馈组件. Original: ElPopconfirm. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/popconfirm.html). See dist/components/element-plus.d.ts.
607
3756
 
608
- Original: ElPopover. [API](https://element-plus.org/en-US/component/popover.html). See dist/components/element-plus.d.ts.
3757
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
609
3758
 
610
3759
  ## UiProgress
611
3760
 
612
- Original: ElProgress. [API](https://element-plus.org/en-US/component/progress.html). See dist/components/element-plus.d.ts.
3761
+ 进度条 · 数据展示. Original: ElProgress. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/progress.html). See dist/components/element-plus.d.ts.
613
3762
 
614
- ## UiRadio
3763
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
615
3764
 
616
- Original: ElRadio. [API](https://element-plus.org/en-US/component/radio.html). See dist/components/element-plus.d.ts.
3765
+ ## UiRate
617
3766
 
618
- ## UiRadioGroup
3767
+ 评分 · 表单组件. Original: ElRate. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/rate.html). See dist/components/element-plus.d.ts.
619
3768
 
620
- Original: ElRadioGroup. [API](https://element-plus.org/en-US/component/radio-group.html). See dist/components/element-plus.d.ts.
3769
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
621
3770
 
622
- ## UiRate
3771
+ ## UiResult
623
3772
 
624
- Original: ElRate. [API](https://element-plus.org/en-US/component/rate.html). See dist/components/element-plus.d.ts.
3773
+ 结果 · 数据展示. Original: ElResult. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/result.html). See dist/components/element-plus.d.ts.
625
3774
 
626
- ## UiRow
3775
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
627
3776
 
628
- Original: ElRow. [API](https://element-plus.org/en-US/component/row.html). See dist/components/element-plus.d.ts.
3777
+ ## UiSelectV2
629
3778
 
630
- ## UiScrollbar
3779
+ 虚拟选择器 · 表单组件. Original: ElSelectV2. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/select-v2.html). See dist/components/element-plus.d.ts.
631
3780
 
632
- Original: ElScrollbar. [API](https://element-plus.org/en-US/component/scrollbar.html). See dist/components/element-plus.d.ts.
3781
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
633
3782
 
634
- ## UiSelect
3783
+ ## UiSkeleton
635
3784
 
636
- Original: ElSelect. [API](https://element-plus.org/en-US/component/select.html). See dist/components/element-plus.d.ts.
3785
+ 骨架屏 · 数据展示. Original: ElSkeleton. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/skeleton.html). See dist/components/element-plus.d.ts.
637
3786
 
638
- ## UiSelectV2
3787
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
639
3788
 
640
- Original: ElSelectV2. [API](https://element-plus.org/en-US/component/select-v2.html). See dist/components/element-plus.d.ts.
3789
+ ## UiSkeletonItem
3790
+
3791
+ 骨架元素 · 数据展示. Original: ElSkeletonItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/skeleton.html). See dist/components/element-plus.d.ts.
3792
+
3793
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
641
3794
 
642
3795
  ## UiSlider
643
3796
 
644
- Original: ElSlider. [API](https://element-plus.org/en-US/component/slider.html). See dist/components/element-plus.d.ts.
3797
+ 滑块 · 表单组件. Original: ElSlider. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/slider.html). See dist/components/element-plus.d.ts.
645
3798
 
646
- ## UiSwitch
3799
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
647
3800
 
648
- Original: ElSwitch. [API](https://element-plus.org/en-US/component/switch.html). See dist/components/element-plus.d.ts.
3801
+ ## UiSpace
649
3802
 
650
- ## UiTabPane
3803
+ 间距 · 基础组件. Original: ElSpace. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/space.html). See dist/components/element-plus.d.ts.
3804
+
3805
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3806
+
3807
+ ## UiSteps
3808
+
3809
+ 步骤条 · 导航组件. Original: ElSteps. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/steps.html). See dist/components/element-plus.d.ts.
3810
+
3811
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
651
3812
 
652
- Original: ElTabPane. [API](https://element-plus.org/en-US/component/tab-pane.html). See dist/components/element-plus.d.ts.
3813
+ ## UiStep
3814
+
3815
+ 步骤项 · 导航组件. Original: ElStep. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/steps.html). See dist/components/element-plus.d.ts.
3816
+
3817
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3818
+
3819
+ ## UiSwitch
3820
+
3821
+ 开关 · 表单组件. Original: ElSwitch. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/switch.html). See dist/components/element-plus.d.ts.
3822
+
3823
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
653
3824
 
654
3825
  ## UiTable
655
3826
 
656
- Original: ElTable. [API](https://element-plus.org/en-US/component/table.html). See dist/components/element-plus.d.ts.
3827
+ 表格 · 数据展示. Original: ElTable. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/table.html). See dist/components/element-plus.d.ts.
3828
+
3829
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
657
3830
 
658
3831
  ## UiTableColumn
659
3832
 
660
- Original: ElTableColumn. [API](https://element-plus.org/en-US/component/table-column.html). See dist/components/element-plus.d.ts.
3833
+ 表格列 · 数据展示. Original: ElTableColumn. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/table.html). See dist/components/element-plus.d.ts.
3834
+
3835
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3836
+
3837
+ ## UiTableV2
3838
+
3839
+ 虚拟表格 · 数据展示. Original: ElTableV2. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/table-v2.html). See dist/components/element-plus.d.ts.
3840
+
3841
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3842
+
3843
+ ## UiAutoResizer
3844
+
3845
+ 自动尺寸容器 · 数据展示. Original: ElAutoResizer. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/table-v2.html). See dist/components/element-plus.d.ts.
3846
+
3847
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
661
3848
 
662
3849
  ## UiTabs
663
3850
 
664
- Original: ElTabs. [API](https://element-plus.org/en-US/component/tabs.html). See dist/components/element-plus.d.ts.
3851
+ 标签页 · 导航组件. Original: ElTabs. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tabs.html). See dist/components/element-plus.d.ts.
665
3852
 
666
- ## UiTag
3853
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3854
+
3855
+ ## UiTabPane
667
3856
 
668
- Original: ElTag. [API](https://element-plus.org/en-US/component/tag.html). See dist/components/element-plus.d.ts.
3857
+ 标签页面板 · 导航组件. Original: ElTabPane. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tabs.html). See dist/components/element-plus.d.ts.
669
3858
 
670
- ## UiTooltip
3859
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3860
+
3861
+ ## UiText
3862
+
3863
+ 文本 · 基础组件. Original: ElText. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/text.html). See dist/components/element-plus.d.ts.
3864
+
3865
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3866
+
3867
+ ## UiTimeSelect
3868
+
3869
+ 时间下拉选择 · 表单组件. Original: ElTimeSelect. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/time-select.html). See dist/components/element-plus.d.ts.
3870
+
3871
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
671
3872
 
672
- Original: ElTooltip. [API](https://element-plus.org/en-US/component/tooltip.html). See dist/components/element-plus.d.ts.
3873
+ ## UiTimeline
3874
+
3875
+ 时间线 · 数据展示. Original: ElTimeline. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/timeline.html). See dist/components/element-plus.d.ts.
3876
+
3877
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3878
+
3879
+ ## UiTimelineItem
3880
+
3881
+ 时间线项 · 数据展示. Original: ElTimelineItem. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/timeline.html). See dist/components/element-plus.d.ts.
3882
+
3883
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3884
+
3885
+ ## UiTransfer
3886
+
3887
+ 穿梭框 · 表单组件. Original: ElTransfer. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/transfer.html). See dist/components/element-plus.d.ts.
3888
+
3889
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
673
3890
 
674
3891
  ## UiTree
675
3892
 
676
- Original: ElTree. [API](https://element-plus.org/en-US/component/tree.html). See dist/components/element-plus.d.ts.
3893
+ 树 · 数据展示. Original: ElTree. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tree.html). See dist/components/element-plus.d.ts.
3894
+
3895
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
677
3896
 
678
3897
  ## UiTreeSelect
679
3898
 
680
- Original: ElTreeSelect. [API](https://element-plus.org/en-US/component/tree-select.html). See dist/components/element-plus.d.ts.
3899
+ 树选择器 · 表单组件. Original: ElTreeSelect. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tree-select.html). See dist/components/element-plus.d.ts.
3900
+
3901
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3902
+
3903
+ ## UiTreeV2
3904
+
3905
+ 虚拟树 · 数据展示. Original: ElTreeV2. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tree-v2.html). See dist/components/element-plus.d.ts.
3906
+
3907
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
681
3908
 
682
3909
  ## UiUpload
683
3910
 
684
- Original: ElUpload. [API](https://element-plus.org/en-US/component/upload.html). See dist/components/element-plus.d.ts.
3911
+ 上传 · 表单组件. Original: ElUpload. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/upload.html). See dist/components/element-plus.d.ts.
685
3912
 
686
- ## UiCheckboxGroup
3913
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
687
3914
 
688
- Original: ElCheckboxGroup. [API](https://element-plus.org/en-US/component/checkbox-group.html). See dist/components/element-plus.d.ts.
3915
+ ## UiWatermark
689
3916
 
690
- ## UiRadioButton
3917
+ 水印 · 其他与配置. Original: ElWatermark. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/watermark.html). See dist/components/element-plus.d.ts.
691
3918
 
692
- Original: ElRadioButton. [API](https://element-plus.org/en-US/component/radio-button.html). See dist/components/element-plus.d.ts.
3919
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
693
3920
 
694
- ## UiDivider
3921
+ ## UiTour
3922
+
3923
+ 引导 · 反馈组件. Original: ElTour. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tour.html). See dist/components/element-plus.d.ts.
3924
+
3925
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3926
+
3927
+ ## UiTourStep
3928
+
3929
+ 引导步骤 · 反馈组件. Original: ElTourStep. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/tour.html). See dist/components/element-plus.d.ts.
3930
+
3931
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3932
+
3933
+ ## UiAnchor
3934
+
3935
+ 锚点 · 导航组件. Original: ElAnchor. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/anchor.html). See dist/components/element-plus.d.ts.
3936
+
3937
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3938
+
3939
+ ## UiAnchorLink
3940
+
3941
+ 锚点链接 · 导航组件. Original: ElAnchorLink. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/anchor.html). See dist/components/element-plus.d.ts.
3942
+
3943
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3944
+
3945
+ ## UiSegmented
3946
+
3947
+ 分段控制器 · 数据展示. Original: ElSegmented. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/segmented.html). See dist/components/element-plus.d.ts.
3948
+
3949
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3950
+
3951
+ ## UiMention
3952
+
3953
+ 提及 · 表单组件. Original: ElMention. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/mention.html). See dist/components/element-plus.d.ts.
695
3954
 
696
- Original: ElDivider. [API](https://element-plus.org/en-US/component/divider.html). See dist/components/element-plus.d.ts.
3955
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3956
+
3957
+ ## UiSplitter
3958
+
3959
+ 分割面板 · 其他与配置. Original: ElSplitter. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/splitter.html). See dist/components/element-plus.d.ts.
3960
+
3961
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3962
+
3963
+ ## UiSplitterPanel
3964
+
3965
+ 分割区域 · 其他与配置. Original: ElSplitterPanel. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/splitter.html). See dist/components/element-plus.d.ts.
3966
+
3967
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
3968
+
3969
+ ## UiPopover
3970
+
3971
+ 气泡卡片 · 反馈组件. Original: ElPopover. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/popover.html). See dist/components/element-plus.d.ts.
3972
+
3973
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3974
+
3975
+ ## UiMessage
3976
+
3977
+ 消息提示 · 反馈组件. Original: ElMessage. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/message.html). See dist/components/element-plus.d.ts.
3978
+
3979
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3980
+
3981
+ ## UiMessageBox
3982
+
3983
+ 消息确认 · 反馈组件. Original: ElMessageBox. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/message-box.html). See dist/components/element-plus.d.ts.
3984
+
3985
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3986
+
3987
+ ## UiNotification
3988
+
3989
+ 通知 · 反馈组件. Original: ElNotification. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/notification.html). See dist/components/element-plus.d.ts.
3990
+
3991
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
3992
+
3993
+ ## UiLoading
3994
+
3995
+ 加载 · 反馈组件. Original: ElLoading. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/loading.html). See dist/components/element-plus.d.ts.
3996
+
3997
+ Use UiLoading.service(options) or UiLoading.directive; no global plugin install.
697
3998
 
698
3999
  ## vUiLoading
699
4000
 
700
- Original: ElLoadingDirective. [API](https://element-plus.org/en-US/component/loading.html). See dist/components/element-plus.d.ts.
4001
+ 加载指令 · 反馈组件. Original: ElLoadingDirective. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/loading.html). See dist/components/element-plus.d.ts.
4002
+
4003
+ Use upstream API and installed typings. Scoped wrapper may add display:contents container; supported teleported defaults to false; scoped floating classes are merged.
4004
+
4005
+ ## vUiInfiniteScroll
4006
+
4007
+ 无限滚动 · 其他与配置. Original: ElInfiniteScroll. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/infinite-scroll.html). See dist/components/element-plus.d.ts.
4008
+
4009
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
4010
+
4011
+ ## vUiPopover
4012
+
4013
+ 气泡触发指令 · 其他与配置. Original: ElPopoverDirective. Import from: sky-ui-kit. [API](https://element-plus.org/zh-CN/component/popover.html). See dist/components/element-plus.d.ts.
4014
+
4015
+ Preserves upstream structure and context. Structural children inherit theme from Ui parent; invisible components/directives retain upstream behavior.
4016
+
4017
+ ## 图标资源与注册
4018
+
4019
+ `projectIcons`:内置 SVG 清单(name、category、source、followsColor、svg)。`ProjectIconName`:内置名称联合类型。
4020
+
4021
+ `registerProjectIcons(names?: readonly string[], target?: Document): void`:按名称注册到指定文档,不传 names 注册全部;SSR 无文档时不执行。默认命名空间 sky-icon-,重复调用不重复插入。SvgIcon 自动注册当前内置图标;prefix 非 sky-icon- 时由使用方提供 sprite。未知名称不显示图形。
4022
+
4023
+
4024
+ # Element Plus 完整组件目录
4025
+
4026
+ 基准版本:2.14.7。共 111 个主 / 子组件、4 个服务出口、3 个指令出口。另保留 11 个项目特色组件。
4027
+
4028
+ 清单覆盖官方组件注册表及服务 / 指令,不包含内部工具函数。出口覆盖不代表所有组件的交互、独立示例和视觉状态均已验证。网站每项均提供导入和官方 API 索引,新增组合示例见 AI-GUIDE.md。
4029
+
4030
+ 组件使用 Ui 前缀;滚动条例外,直接从 element-plus 使用 ElScrollbar,不提供库出口。项目组件保持原名。结构子组件应放在相应 Ui 父组件下;配置组件和无界面指令保留官方语义。UiLoading 提供 service / directive,不提供 install。
4031
+
4032
+ ## 导航组件
4033
+
4034
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4035
+ |---|---|---|---|---|
4036
+ | 固钉 | UiAffix | ElAffix | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/affix.html) |
4037
+ | 回到顶部 | UiBacktop | ElBacktop | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/backtop.html) |
4038
+ | 面包屑 | UiBreadcrumb | ElBreadcrumb | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/breadcrumb.html) |
4039
+ | 面包屑项 | UiBreadcrumbItem | ElBreadcrumbItem | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/breadcrumb.html) |
4040
+ | 下拉菜单 | UiDropdown | ElDropdown | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/dropdown.html) |
4041
+ | 下拉菜单项 | UiDropdownItem | ElDropdownItem | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/dropdown.html) |
4042
+ | 下拉菜单面板 | UiDropdownMenu | ElDropdownMenu | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/dropdown.html) |
4043
+ | 菜单 | UiMenu | ElMenu | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/menu.html) |
4044
+ | 菜单项 | UiMenuItem | ElMenuItem | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/menu.html) |
4045
+ | 菜单分组 | UiMenuItemGroup | ElMenuItemGroup | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/menu.html) |
4046
+ | 子菜单 | UiSubMenu | ElSubMenu | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/menu.html) |
4047
+ | 页头 | UiPageHeader | ElPageHeader | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/page-header.html) |
4048
+ | 步骤条 | UiSteps | ElSteps | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/steps.html) |
4049
+ | 步骤项 | UiStep | ElStep | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/steps.html) |
4050
+ | 标签页 | UiTabs | ElTabs | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tabs.html) |
4051
+ | 标签页面板 | UiTabPane | ElTabPane | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tabs.html) |
4052
+ | 锚点 | UiAnchor | ElAnchor | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/anchor.html) |
4053
+ | 锚点链接 | UiAnchorLink | ElAnchorLink | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/anchor.html) |
4054
+
4055
+ ## 基础组件
4056
+
4057
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4058
+ |---|---|---|---|---|
4059
+ | 图标 | UiIcon | ElIcon | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/icon.html) |
4060
+ | 滚动条 | ElScrollbar | ElScrollbar | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/scrollbar.html) |
4061
+ | 按钮 | UiButton | ElButton | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/button.html) |
4062
+ | 按钮组 | UiButtonGroup | ElButtonGroup | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/button.html) |
4063
+ | 栅格行 | UiRow | ElRow | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/layout.html) |
4064
+ | 栅格列 | UiCol | ElCol | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/layout.html) |
4065
+ | 折叠动画 | UiCollapseTransition | ElCollapseTransition | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/transition.html) |
4066
+ | 布局容器 | UiContainer | ElContainer | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/container.html) |
4067
+ | 侧栏 | UiAside | ElAside | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/container.html) |
4068
+ | 底栏 | UiFooter | ElFooter | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/container.html) |
4069
+ | 顶栏 | UiHeader | ElHeader | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/container.html) |
4070
+ | 主体 | UiMain | ElMain | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/container.html) |
4071
+ | 分割线 | UiDivider | ElDivider | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/divider.html) |
4072
+ | 链接 | UiLink | ElLink | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/link.html) |
4073
+ | 间距 | UiSpace | ElSpace | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/space.html) |
4074
+ | 文本 | UiText | ElText | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/text.html) |
4075
+
4076
+ ## 反馈组件
4077
+
4078
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4079
+ |---|---|---|---|---|
4080
+ | 警告提示 | UiAlert | ElAlert | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/alert.html) |
4081
+ | 文字提示 | UiTooltip | ElTooltip | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tooltip.html) |
4082
+ | 对话框 | UiDialog | ElDialog | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/dialog.html) |
4083
+ | 抽屉 | UiDrawer | ElDrawer | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/drawer.html) |
4084
+ | 气泡确认 | UiPopconfirm | ElPopconfirm | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/popconfirm.html) |
4085
+ | 引导 | UiTour | ElTour | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tour.html) |
4086
+ | 引导步骤 | UiTourStep | ElTourStep | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tour.html) |
4087
+ | 气泡卡片 | UiPopover | ElPopover | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/popover.html) |
4088
+ | 消息提示 | UiMessage | ElMessage | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/message.html) |
4089
+ | 消息确认 | UiMessageBox | ElMessageBox | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/message-box.html) |
4090
+ | 通知 | UiNotification | ElNotification | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/notification.html) |
4091
+ | 加载 | UiLoading | ElLoading | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/loading.html) |
4092
+ | 加载指令 | vUiLoading | ElLoadingDirective | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/loading.html) |
4093
+
4094
+ ## 表单组件
4095
+
4096
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4097
+ |---|---|---|---|---|
4098
+ | 表单 | UiForm | ElForm | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/form.html) |
4099
+ | 表单项 | UiFormItem | ElFormItem | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/form.html) |
4100
+ | 输入框 | UiInput | ElInput | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/input.html) |
4101
+ | 自动补全 | UiAutocomplete | ElAutocomplete | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/autocomplete.html) |
4102
+ | 时间选择器 | UiTimePicker | ElTimePicker | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/time-picker.html) |
4103
+ | 选择器 | UiSelect | ElSelect | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/select.html) |
4104
+ | 选项 | UiOption | ElOption | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/select.html) |
4105
+ | 选项组 | UiOptionGroup | ElOptionGroup | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/select.html) |
4106
+ | 复选框 | UiCheckbox | ElCheckbox | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/checkbox.html) |
4107
+ | 复选按钮 | UiCheckboxButton | ElCheckboxButton | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/checkbox.html) |
4108
+ | 复选框组 | UiCheckboxGroup | ElCheckboxGroup | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/checkbox.html) |
4109
+ | 单选框 | UiRadio | ElRadio | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/radio.html) |
4110
+ | 单选按钮 | UiRadioButton | ElRadioButton | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/radio.html) |
4111
+ | 单选框组 | UiRadioGroup | ElRadioGroup | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/radio.html) |
4112
+ | 级联面板 | UiCascaderPanel | ElCascaderPanel | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/cascader.html) |
4113
+ | 级联选择器 | UiCascader | ElCascader | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/cascader.html) |
4114
+ | 颜色面板 | UiColorPickerPanel | ElColorPickerPanel | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/color-picker-panel.html) |
4115
+ | 颜色选择器 | UiColorPicker | ElColorPicker | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/color-picker.html) |
4116
+ | 日期面板 | UiDatePickerPanel | ElDatePickerPanel | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/date-picker-panel.html) |
4117
+ | 日期选择器 | UiDatePicker | ElDatePicker | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/date-picker.html) |
4118
+ | 数字输入框 | UiInputNumber | ElInputNumber | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/input-number.html) |
4119
+ | 标签输入框 | UiInputTag | ElInputTag | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/input-tag.html) |
4120
+ | 验证码输入框 | UiInputOtp | ElInputOtp | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/input-otp.html) |
4121
+ | 评分 | UiRate | ElRate | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/rate.html) |
4122
+ | 虚拟选择器 | UiSelectV2 | ElSelectV2 | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/select-v2.html) |
4123
+ | 滑块 | UiSlider | ElSlider | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/slider.html) |
4124
+ | 开关 | UiSwitch | ElSwitch | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/switch.html) |
4125
+ | 时间下拉选择 | UiTimeSelect | ElTimeSelect | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/time-select.html) |
4126
+ | 穿梭框 | UiTransfer | ElTransfer | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/transfer.html) |
4127
+ | 树选择器 | UiTreeSelect | ElTreeSelect | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tree-select.html) |
4128
+ | 上传 | UiUpload | ElUpload | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/upload.html) |
4129
+ | 提及 | UiMention | ElMention | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/mention.html) |
4130
+
4131
+ ## 其他与配置
4132
+
4133
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4134
+ |---|---|---|---|---|
4135
+ | 底层浮层 | UiPopper | ElPopper | 保留结构 / 无界面行为 | [官方文档 / 源码](https://github.com/element-plus/element-plus/tree/2.14.7/packages/components/popper) |
4136
+ | 全局配置 | UiConfigProvider | ElConfigProvider | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/config-provider.html) |
4137
+ | 水印 | UiWatermark | ElWatermark | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/watermark.html) |
4138
+ | 分割面板 | UiSplitter | ElSplitter | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/splitter.html) |
4139
+ | 分割区域 | UiSplitterPanel | ElSplitterPanel | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/splitter.html) |
4140
+ | 无限滚动 | vUiInfiniteScroll | ElInfiniteScroll | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/infinite-scroll.html) |
4141
+ | 气泡触发指令 | vUiPopover | ElPopoverDirective | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/popover.html) |
4142
+
4143
+ ## 数据展示
4144
+
4145
+ | 名称 | 库出口 | 官方实现 | 方式 | API |
4146
+ |---|---|---|---|---|
4147
+ | 头像 | UiAvatar | ElAvatar | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/avatar.html) |
4148
+ | 头像组 | UiAvatarGroup | ElAvatarGroup | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/avatar.html) |
4149
+ | 徽标 | UiBadge | ElBadge | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/badge.html) |
4150
+ | 标签 | UiTag | ElTag | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tag.html) |
4151
+ | 日历 | UiCalendar | ElCalendar | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/calendar.html) |
4152
+ | 卡片 | UiCard | ElCard | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/card.html) |
4153
+ | 轮播 | UiCarousel | ElCarousel | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/carousel.html) |
4154
+ | 轮播项 | UiCarouselItem | ElCarouselItem | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/carousel.html) |
4155
+ | 可选标签 | UiCheckTag | ElCheckTag | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/check-tag.html) |
4156
+ | 折叠面板 | UiCollapse | ElCollapse | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/collapse.html) |
4157
+ | 折叠项 | UiCollapseItem | ElCollapseItem | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/collapse.html) |
4158
+ | 统计数值 | UiStatistic | ElStatistic | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/statistic.html) |
4159
+ | 倒计时 | UiCountdown | ElCountdown | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/statistic.html) |
4160
+ | 描述列表 | UiDescriptions | ElDescriptions | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/descriptions.html) |
4161
+ | 描述项 | UiDescriptionsItem | ElDescriptionsItem | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/descriptions.html) |
4162
+ | 空状态 | UiEmpty | ElEmpty | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/empty.html) |
4163
+ | 图片预览 | UiImageViewer | ElImageViewer | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/image.html) |
4164
+ | 图片 | UiImage | ElImage | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/image.html) |
4165
+ | 分页 | UiPagination | ElPagination | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/pagination.html) |
4166
+ | 进度条 | UiProgress | ElProgress | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/progress.html) |
4167
+ | 结果 | UiResult | ElResult | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/result.html) |
4168
+ | 骨架屏 | UiSkeleton | ElSkeleton | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/skeleton.html) |
4169
+ | 骨架元素 | UiSkeletonItem | ElSkeletonItem | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/skeleton.html) |
4170
+ | 表格 | UiTable | ElTable | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/table.html) |
4171
+ | 表格列 | UiTableColumn | ElTableColumn | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/table.html) |
4172
+ | 虚拟表格 | UiTableV2 | ElTableV2 | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/table-v2.html) |
4173
+ | 自动尺寸容器 | UiAutoResizer | ElAutoResizer | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/table-v2.html) |
4174
+ | 时间线 | UiTimeline | ElTimeline | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/timeline.html) |
4175
+ | 时间线项 | UiTimelineItem | ElTimelineItem | 保留结构 / 无界面行为 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/timeline.html) |
4176
+ | 树 | UiTree | ElTree | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tree.html) |
4177
+ | 虚拟树 | UiTreeV2 | ElTreeV2 | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/tree-v2.html) |
4178
+ | 分段控制器 | UiSegmented | ElSegmented | 主题封装 | [官方文档 / 源码](https://element-plus.org/zh-CN/component/segmented.html) |
4179
+
4180
+ ## 维护
4181
+
4182
+ 升级 Element Plus 后运行 `npm run components:sync`,审查新增组件、中文名称、分类、父子关系及最低依赖版本,再运行 `npm run docs:ai`。仅同步源码与文档,不构建或发布。
4183
+
4184
+ # 原项目全局适配与组件库融合
4185
+
4186
+ ## 已读取的实际链路
4187
+
4188
+ - main.ts:createFitScale,target #app,设计尺寸 1920×912,scaleMode auto;注册 Pinia / router,注册 SVG sprite。
4189
+ - App.vue:useFitScale → watch → document.documentElement 的 --cp-vfit-scale;主题 store 的 deep watch 调用 applyCssVars,卸载释放 watch 并移除 scale。根 ElConfigProvider 保留中文 locale。
4190
+ - styles/vfit-vars.scss:--cp-size-1…360 与 --cp-font-1…40 按缩放值计算;部分图表高度使用 clamp 与视口约束。
4191
+ - styles/theme.css / stores/theme.ts:六色与派生主题、--header-height / --sidebar-width / --rightpanel-width / --layout-gutter,以及 Element Plus 变量;主题 store 保留为唯一控制者。
4192
+ - styles/base.css / MainLayout:html/body/#app 的高度链、box-sizing、字体继承、workspace 扣除 header 高度。
4193
+ - MainLayoutMap / TemplateLayout:地图与 pointer-events:none 覆盖层分离,交互区域恢复事件;右栏开关影响浮层位置,ResizeObserver 测量时间轴和图例并在卸载释放。map/index.vue 挂载后 nextTick 调用 map.resize。
4194
+
4195
+ ## 融合分工
4196
+
4197
+ | 内容 | 原项目维护 | 组件库消费 |
4198
+ |---|---|---|
4199
+ | 视口与设计尺寸 | VFit 单次注册,1920×912 auto | 不注册 VFit,不管理窗口缩放 |
4200
+ | 全局缩放 | App.vue 写根 --cp-vfit-scale | 局部尺寸 token 根据该变量计算,缺失按 1 |
4201
+ | 主题 | 原主题 store、六色、暗色、字体与 localStorage | 读取变量并提供缺失默认值;不迁入预览站 store |
4202
+ | 页面结构 | RouterView、权限、ui store、布局开关 | Ui 容器及项目展示组件组合 |
4203
+ | 地图与图表 | 地图实例、resize、图层订阅、图表 resize、释放 | 工具、菜单、时间轴事件由页面接回原逻辑 |
4204
+ | 浮层 | 根主题变量与现有弹窗配置 | 默认主题范围;显式 body 浮层另核对主题和缩放 |
4205
+
4206
+ 默认 style.css 的 scoped-vfit.scss 不把 --cp-vfit-scale 重置为 1;其低优先级默认 token 在 .userssite-theme 内计算。原项目根节点已有的六色与布局变量由 --userssite-* 桥接读取。库没有全局 html/body reset,保留原 base.css。ElScrollbar 直接从 element-plus 使用;它的主题来自应用已有作用域,不额外包装。
4207
+
4208
+ ## 接入步骤
4209
+
4210
+ 1. 保留原 main.ts 的 VFit、Pinia、路由、SVG、字体与主题导入,公共库 CSS 追加一次;默认不引入 global.css。原项目已有 VFit,不重新安装、注册或另设设计尺寸。
4211
+ 2. 保留 App.vue 的 scale 和 theme 两个 watch;不要在单个页面重复写根变量或引入组件库预览 store。复制代码见 AI-GUIDE.md 的全局适配示例,布局页面也提供相同代码。
4212
+ 3. 页面容器用 --header-height / --sidebar-width / --rightpanel-width / --layout-gutter,内容 min-width/min-height:0。系统页内部滚动用 ElScrollbar;地图页面保持地图与覆盖层分离,避免整层拦截鼠标。
4213
+ 4. 组件已通过 --cp-font-* / --cp-size-* 消费比例时,不再添加第二套 transform:scale / zoom。原项目 VFit 本身的行为保留;这里只禁止迁移时额外引入新的缩放层。
4214
+ 5. 右栏、左栏或底部过程区改变地图宿主尺寸时,由应用在 DOM 更新/过渡完成后调用地图 resize;ECharts 在容器尺寸变化时调用实例 resize。原 map/index.vue 的挂载 resize 不等于已覆盖所有后续布局变化,不把这项能力宣称为库自动处理。
4215
+ 6. body 上的 dialog / drawer / select / image preview 不能读取局部容器独有变量。原项目根 scale/theme 可被它们继承;局部主题需显式传 class/style 或保持浮层在容器内,并检查 overflow 裁剪。
4216
+
4217
+ ## 窄屏与验证
4218
+
4219
+ 全局比例适配解决设计尺寸缩放,内容重排仍由布局负责;必要时收起侧栏、把业务面板改为抽屉、允许表格水平滚动。演示布局的紧凑宽度为预览用途,不等于原生产布局参数;真实页面优先使用原布局变量。地图色带、业务阈值和图片点位不随六色替换。
4220
+
4221
+ 在 1920×912、较小桌面和窄屏下核对:根 scale 值、控件字体和高度、左右面板避让、时间轴/图例重叠、地图/图表 resize、弹窗与图片预览、键盘焦点和滚动。明暗主题分别验证,关闭页面确认 watch / ResizeObserver / 地图图表监听释放。当前只读审查与文档示例不替代原项目运行回归;本次未修改原项目。
4222
+
4223
+ # 原项目组件适配方案
4224
+
4225
+ ## 范围与依据
4226
+
4227
+ 本方案对应 2026-10-12 原项目当前工作区的只读源码扫描。实际使用数量和路径以 COMPONENT-USAGE.md / component-usage.json 为准;全页面调用见 LEGACY-USAGE.md。扫描包括未提交源码,只用于理解调用方式,不把这些业务改动迁入库。当前库源码尚未构建发布,安装 npm latest 不会自动得到这些新功能。
4228
+
4229
+ ## 分模块适配
4230
+
4231
+ | 模块与原调用 | 库出口 / 处理方式 | 要保留的接线与验证 |
4232
+ |---|---|---|
4233
+ | global/SvgIcon.vue;SideMenuMap 读取 route.meta.icon | SvgIcon;内置资源自动注册,原 sprite 用 prefix="icon-" | name / size / title / decorative;主题继承、固定色与多色、选中图标、同名子目录;详见下文图标方案 |
4234
+ | common/AppSelect.vue(ElSelectV2) | AppSelect;保留 options 数据形式 | v-model 的值类型、multiple、filterable、clearable、change;不要改成 UiSelect 的 Option 插槽 |
4235
+ | common/TreeSelectPanel.vue | TreeSelectPanel | categories / v-model;select(node, category)、change({ node, category });行政区/流域数据由页面准备,保留 motion-v |
4236
+ | common/TimeRangeQuickSelect.vue | TimeRangeQuickSelect | key 值 v-model;change 返回选项,页面据此查询,不把请求放进库 |
4237
+ | common/MapTimeline.vue | MapTimeline | v-model 是索引;change 返回 TimelinePoint。保留时区、范围、播放/暂停、步进、日期跳转;业务方清理查询与地图订阅 |
4238
+ | atlas/AtlasMapTitle.vue | AtlasMapTitle | title/subtitle/rightOpen;父容器 relative,右面板宽度由主题变量提供 |
4239
+ | atlas/AtlasRightToggleButton.vue | AtlasRightToggleButton | open + toggle,保留 ui store;不是 v-model:open |
4240
+ | atlas/ProcessDataTable.vue | ProcessDataTable | times / series / loading;缺测值、单位、分页、请求状态;不是 TableLayout 的替代品 |
4241
+ | Header / SideMenu 的菜单部分 | ProjectMenu horizontal / vertical + 薄适配层 | routes 转 items/groups,select 返回 item;路由、权限过滤、用户信息、区域选择、布局折叠留应用。横向当前纯文字,不承诺 item.icon 显示 |
4242
+ | SideMenuMap 多分类树、meta.icon | MapSideMenu + 单分类选择适配 | 当前库只支持一个 title + 扁平 items。父子分类、动态路由和自动展开仍在业务层;不能把原 sections 原样传入,也不应承诺整组件替换 |
4243
+ | MapToolbar 的按钮部分 | MapTools,icons 可覆盖 | active 双向绑定;tool-click(key) 接刷新/定位/面板,context-change(boolean) 接右键开关。没有外部 contextEnabled prop;外部状态同步需求须另行设计 |
4244
+ | ElSelect / ElOption、ElCascader 等标准表单 | 对应 Ui 出口,成组替换父子组件 | value-key / props 映射、懒加载、联动、校验、disabled;原 common/index.vue 的行政区 JSON、请求、区域绘制仍在应用 |
4245
+ | ElForm / ElTable / ElTableV2 / ElUpload | UiForm / UiTable / UiTableV2 / UiUpload | rules、ref 方法、分页、排序、selection、columns cellRenderer、上传 action/http-request、鉴权与回调。表格类型 Columns、TableV2Alignment 等仍从 element-plus 导入 |
4246
+ | ElDialog / ElDrawer / ElPopover / ElImage | UiDialog / UiDrawer / UiPopover / UiImage | v-model、footer/reference/placeholder/error 插槽、关闭事件、图片预览;浮层 teleport 单独核对主题与裁剪 |
4247
+ | ElMessage / ElMessageBox / ElNotification;v-loading | UiMessage / UiMessageBox / UiNotification;vUiLoading | 服务参数、确认/取消 promise、目标容器;指令通过 script setup 导入后用 v-ui-loading,不能只改模板却漏 import |
4248
+ | TableLayout / EchartLayout / AtlasProcessChart / RainfallRankingTable | 暂留业务组件;未来先抽纯展示层 | 数据格式、雨量等级、单位、虚拟滚动、图表 option 和站点定位,仍由原模块处理;当前不导出同名库组件 |
4249
+ | LayerControl / LayerTreeNode / MapValueLegend / MapLegend / SpaceAnalysisPanel | 暂留应用,后续单模块提取 | MapLibre 引用、图层 store、GIS 文件、色带阈值、图层显隐、监听与释放。业务色带不替换成通用主题主色 |
4250
+ | EngineeringDetails / GateDetails / ReservoirDetails / MediaLayerDetails / PanoramaViewer | 暂留应用;内部基础控件可局部用 Ui | 请求、字段映射、全景实例、图片/视频 URL、错误重试;不得认为地图详情已由包提供 |
4251
+ | MainLayout / TemplateLayout / RightPanel / AsyncRoutePage | 暂留应用 | RouterView、异步路由、缓存、布局状态、地图生命周期、主题 store、VFit |
4252
+ | PersonalInfo / UserRegionAccess / RegionDrawDialog / AccessManage | 暂留应用;内部标准表单可局部替换 | 用户、角色、权限、密码处理、行政区绑定与绘制;这些工作区新业务能力不属于组件包 |
4253
+ | BatchInfoPopover / timeline/index / titlebar/index / widgets/Legend / status/* | 暂留应用并按源码逐项核对 | 气象批次转换、旧组件调用、模型状态查询;没有直接引用也不能直接删除 |
4254
+
4255
+ ## 图标两种资源来源
4256
+
4257
+ 库内置图标:安装 sky-ui-kit,页面从包导入 SvgIcon,使用默认 sky-icon- 前缀;组件按需注册资源,不安装 Vite SVG 插件。维护自有图标:安装 vite-plugin-svg-icons,在 Vite 配置 iconDirs / symbolId,在 main.ts 导入 virtual:svg-icons-register,页面传 prefix="icon-"。两套可并存,避免重复全局注册 SvgIcon。
4258
+
4259
+ 新项目推荐 symbolId: 'icon-[dir]-[name]':根目录 company.svg 对应 name="company",weather/rain.svg 对应 name="weather-rain"。原项目已使用 'icon-[name]',首轮保留规则;变更前检查全部 SvgIcon.name 和路由 meta.icon。库内置子目录名称按 projectIcons.source/name 对照,不默认与旧 sprite 同名。禁止直接把未验证的 SVG 名称字符串传给菜单 icon 属性;应转换为 Vue 组件。
4260
+
4261
+ 页面配置示例和 Vite 完整步骤由 src/icon-setup-examples.ts 生成到 AI-GUIDE.md,也展示在图标页面。单色 SVG 用 currentColor 继承颜色;固定 fill/stroke 需保留或经确认后修改。CSS 的 color 不会覆盖硬编码路径颜色。
4262
+
4263
+ ## 路由与 SVG 图标适配示例
4264
+
4265
+ 以下为应用侧转换函数,可复制到应用自己的 adapter.ts;库不依赖 vue-router。只转换当前分类的直接叶子节点,权限与可见性由调用方先过滤。
4266
+
4267
+ ```ts
4268
+ import { h } from 'vue'
4269
+ import type { RouteRecordRaw } from 'vue-router'
4270
+ import { SvgIcon } from 'sky-ui-kit'
4271
+
4272
+ export function toMapMenuItems(visibleLeaves: RouteRecordRaw[]) {
4273
+ return visibleLeaves.map(route => ({
4274
+ key: String(route.name ?? route.path),
4275
+ label: String(route.meta?.title ?? route.path),
4276
+ // 保留原 icon-[name] sprite;若用库快照,核对 name 后移除 prefix。
4277
+ icon: () => h(SvgIcon, {
4278
+ name: String(route.meta?.icon || 'site'),
4279
+ prefix: 'icon-',
4280
+ }),
4281
+ }))
4282
+ }
4283
+ ```
701
4284
 
4285
+ 页面用 `MapSideMenu v-model:active="active" :items="items" @select="onSelect"`,onSelect 按 item.key 找回原路由,调用应用已有导航方法。当前分类切换、权限过滤、活动路由同步仍由应用控制。用 `MapTools :icons="{ layers: () => h(SvgIcon, { name: '已核对的图标名' }) }"` 覆盖工具图标前,先从 projectIcons 检查名称。
4286
+
4287
+ ## 主题、缩放和浮层
4288
+
4289
+ ### 布局容器页面
4290
+
4291
+ UiContainer 展示系统顶部/侧栏/内容和地图浮动区域示例。原 MainLayoutMap 将地图与内容覆盖层分开,覆盖层 pointer-events:none,交互区域恢复 pointer-events;不要用全屏透明容器拦截地图。ContentLayoutSystem 保留 SideMenu、RouterView 和 ui 左栏状态;ContentLayoutNomenu 不新增菜单。TemplateLayout 保留原组件及其 top、toolbar、right、legend、timeline、content、right-toggle、map-toolbar-info 插槽,right-toggle 提供 open/toggle。rightPanelWidth、rightPanelDefaultOpen、rightPanelEnabled 是实际属性;部分原调用传 timeline-visible,但当前组件未声明它,不能把它当成库支持的属性。图层事件、resize、区域定位及 ResizeObserver 清理仍由原项目负责。
4292
+
4293
+ 1. 依赖声明:原项目 Element Plus ^2.14.2,库最低 ^2.14.7;范围有交集,先检查实际 lockfile/安装版本,低于最低版本才安排升级和回归。Vue、motion-v、icons 继续使用应用已有依赖。
4294
+ 2. main.ts 中 Element Plus CSS 在前、sky-ui-kit/style.css 在后,仅引入一次。保留原主题 store、字体、base.css、VFit 和业务地图 popup / btn 样式。默认不用 global.css。
4295
+ 3. 六色变量沿用 --color-bg / text / primary / border / surface / panel;--cp-font-* 与 VFit 保持原来源。预览站 store 和 localStorage 配置不迁入业务项目。
4296
+ 4. 包装层可能增加 display:contents 容器,核对依赖直接子节点的 CSS 和 :deep(.el-*) 覆盖。结构子组件与父组件一起换为 Ui;ref 的 validate / clear / toggleRowSelection 等仍须页面验证。
4297
+ 5. 默认浮层尽量留在主题范围,可能被 overflow 裁剪;显式 teleport / append-to-body 时检查根主题变量、浮层专用 class、层级与弹窗内下拉。UiImage 的预览浮层也要核对。
4298
+
4299
+ ## 迁移顺序与验证记录
4300
+
4301
+ 先接入公共 CSS 和一个独立页面,依次迁移图标与基础表单、四个 common 组件、地图标题/面板开关/过程表格,再做菜单与工具适配。地图、权限、视频等业务外壳最后逐模块评估。每次记录原路径、库版本、保留 API、主题差异、页面验证结果与回退点;只恢复本次修改的 imports 和适配层,不重置整个原项目。
4302
+
4303
+ 验收覆盖空/加载/失败/禁用、键盘焦点、明暗主题、VFit 与窄屏、浮层、表格 ref 方法、时间轴播放/时区、地图事件及资源释放。当前扫描和库类型检查不代表业务页面运行验证;本轮不执行构建、发布或修改原项目。
4304
+
4305
+ # 原项目实际组件使用清单
4306
+
4307
+ 扫描日期:2026-10-12。只读扫描 src 下 590 个 Vue / TS / JS 文件(其中 424 个 Vue),排除生成 .d.ts。Element Plus 57 种模板组件,3 种服务导入,1 种指令;56 个公共 Vue 组件。次数表示引用文件数,不是实例数或调用次数。
4308
+
4309
+ 模板标签合并 ElXxx / el-xxx;服务统计显式导入,公共组件统计静态导入与全局 SvgIcon 标签。动态组件、别名标签、字符串拼接、自动注册和间接使用可能漏计;零直接引用不等于未使用。包含参考项目当前未提交源码,但未复制这些业务改动。详细路径见 component-usage.json,替换策略见 ADAPTATION.md。
4310
+
4311
+ ## Element Plus 模板组件
4312
+
4313
+ | 原组件 | 库出口 | 引用文件数 | 使用位置示例 |
4314
+ |---|---|---:|---|
4315
+ | ElOption | UiOption | 184 | src/components/layout/RightPanel.vue<br>src/components/layout/UserRegionAccess.vue<br>src/components/map/StationLayerDetails.vue |
4316
+ | ElSelect | UiSelect | 184 | src/components/layout/RightPanel.vue<br>src/components/layout/UserRegionAccess.vue<br>src/components/map/StationLayerDetails.vue |
4317
+ | ElCascader | UiCascader | 143 | src/components/common/index.vue<br>src/components/layout/UserRegionAccess.vue<br>src/views/atlas/climateChange/ClimatePrec.vue |
4318
+ | ElIcon | UiIcon | 67 | src/components/atlas/AtlasRightToggleButton.vue<br>src/components/common/BatchInfoPopover.vue<br>src/components/common/MapTimeline.vue |
4319
+ | ElButton | UiButton | 60 | src/components/layout/PersonalInfo.vue<br>src/components/layout/RegionDrawDialog.vue<br>src/components/layout/RightPanel.vue |
4320
+ | ElDatePicker | UiDatePicker | 34 | src/components/common/MapTimeline.vue<br>src/components/echarts/EchartLayout.vue<br>src/components/map/StationLayerDetails.vue |
4321
+ | ElDialog | UiDialog | 27 | src/components/layout/PersonalInfo.vue<br>src/components/layout/RegionDrawDialog.vue<br>src/components/layout/TemplateLayout.vue |
4322
+ | ElInput | UiInput | 24 | src/components/layout/PersonalInfo.vue<br>src/components/layout/RightPanel.vue<br>src/components/table/TableLayout.vue |
4323
+ | ElUpload | UiUpload | 23 | src/views/atlas/video/dialog/dataMaintenance/components/BaseFormDrawer.vue<br>src/views/atlas/video/dialog/dataMaintenance/components/DefaultFormContent.vue<br>src/views/datamaint/maintenance/ImageList.vue |
4324
+ | ElForm | UiForm | 18 | src/components/layout/PersonalInfo.vue<br>src/components/layout/UserRegionAccess.vue<br>src/views/AccessSession.vue |
4325
+ | ElFormItem | UiFormItem | 18 | src/components/layout/PersonalInfo.vue<br>src/components/layout/UserRegionAccess.vue<br>src/views/AccessSession.vue |
4326
+ | ElImage | UiImage | 16 | src/components/map/EngineeringDetails.vue<br>src/components/map/MediaLayerDetails.vue<br>src/views/atlas/video/dialog/ImageViewer/index.vue |
4327
+ | ElTable | UiTable | 13 | src/components/map/StationLayerDetails.vue<br>src/views/atlas/video/dialog/flowWarningRecord.vue<br>src/views/atlas/video/dialog/flowWarningSettings.vue |
4328
+ | ElTableColumn | UiTableColumn | 13 | src/components/map/StationLayerDetails.vue<br>src/views/atlas/video/dialog/flowWarningRecord.vue<br>src/views/atlas/video/dialog/flowWarningSettings.vue |
4329
+ | ElEmpty | UiEmpty | 12 | src/components/common/TreeSelectPanel.vue<br>src/components/map/EngineeringDetails.vue<br>src/components/map/GateDetails.vue |
4330
+ | ElPagination | UiPagination | 11 | src/views/atlas/video/dialog/flowWarningRecord.vue<br>src/views/atlas/video/dialog/flowWarningSettings.vue<br>src/views/atlas/video/dialog/moreContentView/index.vue |
4331
+ | ElTag | UiTag | 11 | src/components/layout/PersonalInfo.vue<br>src/components/layout/UserRegionAccess.vue<br>src/views/atlas/video/dialog/detectionTask.vue |
4332
+ | ElScrollbar | ElScrollbar(直接从 element-plus 导入) | 10 | src/components/layout/RightPanel.vue<br>src/components/map/EngineeringDetails.vue<br>src/components/map/GateDetails.vue |
4333
+ | ElInputNumber | UiInputNumber | 6 | src/components/layout/RightPanel.vue<br>src/views/atlas/video/dialog/components/ThresholdDetailDialog.vue<br>src/views/atlas/video/dialog/videoModel.vue |
4334
+ | ElTooltip | UiTooltip | 6 | src/components/layout/SideMenu.vue<br>src/views/atlas/video/dialog/components/ImageViewer/index.vue<br>src/views/atlas/video/dialog/components/ThresholdDetailDialog.vue |
4335
+ | ElAlert | UiAlert | 5 | src/components/layout/RegionDrawDialog.vue<br>src/components/map/EngineeringDetails.vue<br>src/components/map/StationLayerDetails.vue |
4336
+ | ElDescriptions | UiDescriptions | 5 | src/components/map/EngineeringDetails.vue<br>src/components/map/StationLayerDetails.vue<br>src/components/status/wrfHydro/wrfHydroStatus.vue |
4337
+ | ElDescriptionsItem | UiDescriptionsItem | 5 | src/components/map/EngineeringDetails.vue<br>src/components/map/StationLayerDetails.vue<br>src/components/status/wrfHydro/wrfHydroStatus.vue |
4338
+ | ElSwitch | UiSwitch | 5 | src/components/layout/UserRegionAccess.vue<br>src/views/DefenseMapLinkage.vue<br>src/views/atlas/video/dialog/baseCanvas/index.vue |
4339
+ | ElButtonGroup | UiButtonGroup | 4 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue<br>src/views/atlas/video/dialog/detectionTask.vue |
4340
+ | ElSelectV2 | UiSelectV2 | 3 | src/components/common/AppSelect.vue<br>src/components/echarts/EchartLayout.vue<br>src/views/atlas/elments/components/RainfallProcessChart.vue |
4341
+ | ElCard | UiCard | 2 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue |
4342
+ | ElCheckbox | UiCheckbox | 2 | src/views/datamaint/system/AccessManage.vue<br>src/views/hydroforecast/mapHydro/map/components/layerControl.vue |
4343
+ | ElCol | UiCol | 2 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue |
4344
+ | ElDrawer | UiDrawer | 2 | src/views/DefenseMapLinkage.vue<br>src/views/atlas/video/dialog/dataMaintenance/components/BaseFormDrawer.vue |
4345
+ | ElFooter | UiFooter | 2 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue |
4346
+ | ElPopover | UiPopover | 2 | src/components/common/BatchInfoPopover.vue<br>src/views/hydroforecast/mapHydro/map/components/layerControl.vue |
4347
+ | ElProgress | UiProgress | 2 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue |
4348
+ | ElRadioGroup | UiRadioGroup | 2 | src/views/atlas/video/dialog/components/WarningProcessDialog.vue<br>src/views/datamaint/system/AccessManage.vue |
4349
+ | ElRow | UiRow | 2 | src/components/status/wrfHydro/wrfHydroStatus.vue<br>src/components/status/wrf/wrfStatus.vue |
4350
+ | ElSlider | UiSlider | 2 | src/views/atlas/video/dialog/videoModel.vue<br>src/views/atlas/video/dialog/videoZ.vue |
4351
+ | ElTabPane | UiTabPane | 2 | src/components/map/StationLayerDetails.vue<br>src/views/atlas/video/dialog/MapDialog.vue |
4352
+ | ElTabs | UiTabs | 2 | src/components/map/StationLayerDetails.vue<br>src/views/atlas/video/dialog/MapDialog.vue |
4353
+ | ElTree | UiTree | 2 | src/components/common/TreeSelectPanel.vue<br>src/views/datamaint/system/AccessManage.vue |
4354
+ | ElTreeSelect | UiTreeSelect | 2 | src/views/atlas/video/dialog/taskConfiguration.vue<br>src/views/datamaint/system/AccessManage.vue |
4355
+ | ElAutoResizer | UiAutoResizer | 1 | src/views/datamaint/system/AccessManage.vue |
4356
+ | ElBadge | UiBadge | 1 | src/views/atlas/video/dialog/detectionTask.vue |
4357
+ | ElCarousel | UiCarousel | 1 | src/components/map/EngineeringDetails.vue |
4358
+ | ElCarouselItem | UiCarouselItem | 1 | src/components/map/EngineeringDetails.vue |
4359
+ | ElCheckboxGroup | UiCheckboxGroup | 1 | src/views/datamaint/system/AccessManage.vue |
4360
+ | ElCollapse | UiCollapse | 1 | src/views/hydroforecast/mapHydro/map/components/layerControl.vue |
4361
+ | ElCollapseItem | UiCollapseItem | 1 | src/views/hydroforecast/mapHydro/map/components/layerControl.vue |
4362
+ | ElColorPicker | UiColorPicker | 1 | src/components/layout/RightPanel.vue |
4363
+ | ElConfigProvider | UiConfigProvider | 1 | src/App.vue |
4364
+ | ElDropdown | UiDropdown | 1 | src/views/atlas/video/dialog/components/ImageViewer/index.vue |
4365
+ | ElDropdownItem | UiDropdownItem | 1 | src/views/atlas/video/dialog/components/ImageViewer/index.vue |
4366
+ | ElDropdownMenu | UiDropdownMenu | 1 | src/views/atlas/video/dialog/components/ImageViewer/index.vue |
4367
+ | ElPopconfirm | UiPopconfirm | 1 | src/views/atlas/video/dialog/videoZ.vue |
4368
+ | ElRadio | UiRadio | 1 | src/views/atlas/video/dialog/components/WarningProcessDialog.vue |
4369
+ | ElRadioButton | UiRadioButton | 1 | src/views/datamaint/system/AccessManage.vue |
4370
+ | ElRate | UiRate | 1 | src/views/atlas/video/dialog/dataMaintenance/components/DefaultFormContent.vue |
4371
+ | ElTableV2 | UiTableV2 | 1 | src/views/datamaint/system/AccessManage.vue |
4372
+
4373
+ ## 服务与指令
4374
+
4375
+ | 原接口 | 库接口 | 引用文件数 |
4376
+ |---|---|---:|
4377
+ | ElMessage | UiMessage | 111 |
4378
+ | ElMessageBox | UiMessageBox | 13 |
4379
+ | ElNotification | UiNotification | 2 |
4380
+ | v-loading | vUiLoading | 18 |
4381
+
4382
+ ## 项目公共组件
4383
+
4384
+ | 原源码 | 直接引用文件数 | 使用位置示例 | 依赖 |
4385
+ |---|---:|---|---|
4386
+ | src/components/layout/TemplateLayout.vue | 268 | src/components/layout/EmptyMapLayout.vue<br>src/views/Blank.vue<br>src/views/atlas/climateChange/ClimatePrec.vue | vue<br>vue-router<br>@/map/core/MapLibreMap<br>@/components/map/MapToolbar.vue<br>@/components/map/MapLegend.vue<br>@/stores/mapLayers<br>@/stores/ui<br>@/stores/regionBoundary<br>./RightPanel.vue |
4387
+ | src/components/atlas/AtlasMapTitle.vue | 264 | src/views/atlas/climateChange/ClimatePrec.vue<br>src/views/atlas/climateChange/ClimateTem.vue<br>src/views/atlas/dem/Dem30m.vue | — |
4388
+ | src/components/map/MapValueLegend.vue | 251 | src/views/DefenseMapLinkage.vue<br>src/views/atlas/climateChange/ClimatePrec.vue<br>src/views/atlas/climateChange/ClimateTem.vue | vue<br>@element-plus/icons-vue |
4389
+ | src/components/common/MapTimeline.vue | 236 | src/views/DefenseMapLinkage.vue<br>src/views/atlas/climateChange/ClimatePrec.vue<br>src/views/atlas/climateChange/ClimateTem.vue | vue<br>@element-plus/icons-vue |
4390
+ | src/components/echarts/EchartLayout.vue | 183 | src/views/atlas/climateChange/ClimatePrec.vue<br>src/views/atlas/climateChange/ClimateTem.vue<br>src/views/atlas/dem/Dem30m.vue | vue<br>echarts<br>@/components/atlas/AtlasProcessChart.vue<br>@/components/atlas/ProcessDataTable.vue<br>@/components/atlas/AtlasProcessPanel.vue<br>@/components/common/AppSelect.vue<br>@/utils/valueFormat |
4391
+ | src/components/atlas/AtlasRightToggleButton.vue | 109 | src/views/atlas/elments/Pres.vue<br>src/views/atlas/elments/Rain.vue<br>src/views/atlas/elments/RunoffHd.vue | @element-plus/icons-vue |
4392
+ | src/components/common/AppSelect.vue | 64 | src/components/echarts/EchartLayout.vue<br>src/components/timeline/index.vue<br>src/views/DefenseMapLinkage.vue | vue<br>element-plus |
4393
+ | src/components/table/TableLayout.vue | 34 | src/views/atlas/climateGrid/components/ClimateGridInfoPanel.vue<br>src/views/atlas/elments/Pres.vue<br>src/views/atlas/elments/RunoffHd.vue | vue<br>@element-plus/icons-vue<br>@/components/atlas/AtlasRankingPanel.vue<br>@/utils/valueFormat |
4394
+ | src/components/common/BatchInfoPopover.vue | 17 | src/views/meteo/RainDaily.vue<br>src/views/meteo/index.vue<br>src/views/meteo/lradDaily.vue | vue<br>@element-plus/icons-vue<br>@/views/meteo/batchInfo |
4395
+ | src/components/status/wrf/index.vue | 17 | src/views/meteo/RainDaily.vue<br>src/views/meteo/index.vue<br>src/views/meteo/lradDaily.vue | vue<br>./wrfStatus.vue |
4396
+ | src/components/common/TimeRangeQuickSelect.vue | 14 | src/views/atlas/groundwater/GroundwaterFb.vue<br>src/views/atlas/landWater/LandWaterCSRMon.vue<br>src/views/atlas/runoffDepth/RunoffDepth.vue | — |
4397
+ | src/components/atlas/AtlasRankingPanel.vue | 4 | src/components/table/TableLayout.vue<br>src/views/atlas/common/AtlasModuleInfoPanel.vue<br>src/views/atlas/elments/components/RainfallRankingTable.vue | — |
4398
+ | src/components/layout/Header.vue | 4 | src/components/layout/MainLayout.vue<br>src/components/layout/MainLayoutMap.vue<br>src/components/layout/MainLayoutNoMenu.vue | vue<br>vue-router<br>@element-plus/icons-vue<br>element-plus<br>motion-v<br>@/router<br>@/stores/access<br>./PersonalInfo.vue<br>@/stores/theme<br>@/stores/regionBoundary<br>@/components/common/index.vue<br>@/map/core/MapLibreMap |
4399
+ | src/components/atlas/AtlasProcessChart.vue | 3 | src/components/echarts/EchartLayout.vue<br>src/components/map/StationLayerDetails.vue<br>src/views/atlas/elments/components/RainfallProcessChart.vue | echarts<br>vue |
4400
+ | src/components/atlas/AtlasProcessPanel.vue | 2 | src/components/echarts/EchartLayout.vue<br>src/views/atlas/elments/components/RainfallProcessChart.vue | — |
4401
+ | src/components/atlas/ProcessDataTable.vue | 2 | src/components/echarts/EchartLayout.vue<br>src/views/atlas/elments/components/RainfallProcessChart.vue | vue |
4402
+ | src/components/common/index.vue | 2 | src/components/layout/Header.vue<br>src/views/DefenseMapLinkage.vue | vue<br>@element-plus/icons-vue<br>@/stores/access<br>@/assets/json/pcas-code.json<br>axios<br>@/stores/regionBoundary<br>@/stores/gisSelection |
4403
+ | src/components/global/SvgIcon.vue | 2 | src/components/layout/SideMenuMap.vue<br>src/main.ts | vue |
4404
+ | src/components/layout/RightPanel.vue | 2 | src/components/layout/TemplateLayout.vue<br>src/views/Blank.vue | vue<br>@/stores/ui<br>@/stores/theme<br>@/map/state |
4405
+ | src/components/layout/SideMenu.vue | 2 | src/components/layout/ContentLayoutNomenu.vue<br>src/components/layout/ContentLayoutSystem.vue | vue<br>vue-router<br>motion-v<br>@element-plus/icons-vue<br>@/router<br>@/stores/access<br>@/stores/ui |
4406
+ | src/components/map/LayerControl.vue | 2 | src/components/map/MapToolbar.vue<br>src/views/DefenseMapLinkage.vue | vue<br>@element-plus/icons-vue<br>./LayerTreeNode.vue<br>@/map/core/MapLibreMap<br>@/stores/mapLayers<br>@/map/core/basemaps |
4407
+ | src/components/map/PanoramaViewer.vue | 2 | src/components/map/MediaLayerDetails.vue<br>src/components/map/StationLayerDetails.vue | vue<br>element-plus<br>@photo-sphere-viewer/core<br>@photo-sphere-viewer/core/index.css |
4408
+ | src/components/layout/AsyncRoutePage.vue | 1 | src/router/deferRoutePages.ts | vue<br>vue-router<br>@/router/useRoutePage |
4409
+ | src/components/layout/ContentLayoutMap.vue | 1 | src/components/layout/MainLayoutMap.vue | vue<br>vue-router<br>@/router<br>@/stores/ui<br>./SideMenuMap.vue<br>./EmptyMapLayout.vue<br>./mapPageSelection |
4410
+ | src/components/layout/ContentLayoutNomenu.vue | 1 | src/components/layout/MainLayoutNoMenu.vue | vue<br>vue-router<br>@/router<br>@/stores/ui<br>./SideMenu.vue |
4411
+ | src/components/layout/ContentLayoutSystem.vue | 1 | src/components/layout/MainLayout.vue | vue<br>vue-router<br>@/router<br>@/stores/ui<br>./SideMenu.vue |
4412
+ | src/components/layout/EmptyMapLayout.vue | 1 | src/components/layout/ContentLayoutMap.vue | ./TemplateLayout.vue |
4413
+ | src/components/layout/MainLayout.vue | 1 | src/router/index.ts | vue<br>vue-router<br>@/router<br>./Header.vue<br>./ContentLayoutSystem.vue |
4414
+ | src/components/layout/MainLayoutMap.vue | 1 | src/router/index.ts | vue<br>vue-router<br>@/router<br>./Header.vue<br>./ContentLayoutMap.vue<br>../map/index.vue |
4415
+ | src/components/layout/MainLayoutNoMenu.vue | 1 | src/router/index.ts | vue<br>vue-router<br>@/router<br>./Header.vue<br>./ContentLayoutNomenu.vue |
4416
+ | src/components/layout/PersonalInfo.vue | 1 | src/components/layout/Header.vue | vue<br>element-plus<br>@/stores/access |
4417
+ | src/components/layout/RegionDrawDialog.vue | 1 | src/components/layout/UserRegionAccess.vue | vue<br>maplibre-gl<br>maplibre-gl/dist/maplibre-gl.css<br>terra-draw<br>terra-draw-maplibre-gl-adapter<br>element-plus<br>@/map/core/basemaps<br>@/stores/regionBoundary |
4418
+ | src/components/layout/RouterViewLayout.vue | 1 | src/router/index.ts | vue |
4419
+ | src/components/layout/SideMenuMap.vue | 1 | src/components/layout/ContentLayoutMap.vue | vue<br>vue-router<br>@element-plus/icons-vue<br>@/router<br>@/stores/access<br>@/stores/theme<br>./mapPageSelection |
4420
+ | src/components/layout/UserRegionAccess.vue | 1 | src/views/datamaint/system/AccessManage.vue | vue<br>element-plus<br>./RegionDrawDialog.vue<br>@/utils/userRegions<br>@/assets/json/pcas-code.json<br>@/components/map/GisFileImport<br>@/stores/access |
4421
+ | src/components/map/EngineeringDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>@/map/engineeringDetails<br>@/map/config/engineeringFields<br>@/utils/request |
4422
+ | src/components/map/GateDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>@/map/gateDetails |
4423
+ | src/components/map/index.vue | 1 | src/components/layout/MainLayoutMap.vue | ./MediaLayerDetails.vue<br>./StationLayerDetails.vue<br>./GateDetails.vue<br>./RubberDamDetails.vue<br>./ReservoirDetails.vue<br>./EngineeringDetails.vue<br>vue<br>vue-router<br>@/map/core/MapLibreMap<br>@/stores/mapLayers<br>@/stores/ui<br>@/map/pageContextMenu<br>@/map/mapContextMenu<br>maplibre-gl/dist/maplibre-gl.css |
4424
+ | src/components/map/LayerTreeNode.vue | 1 | src/components/map/LayerControl.vue | vue<br>@element-plus/icons-vue<br>@/map/core/basemaps<br>@/stores/mapLayers |
4425
+ | src/components/map/MapLegend.vue | 1 | src/components/layout/TemplateLayout.vue | vue<br>vue-router<br>@element-plus/icons-vue |
4426
+ | src/components/map/MapOperationPanel.vue | 1 | src/components/map/MapToolbar.vue | vue<br>element-plus<br>./MapOperationTools |
4427
+ | src/components/map/MapToolbar.vue | 1 | src/components/layout/TemplateLayout.vue | vue<br>@element-plus/icons-vue<br>element-plus<br>./LayerControl.vue<br>./MapOperationPanel.vue<br>./ModuleOperationPanel.vue<br>./SpaceAnalysisPanel.vue<br>./MapOperationTools<br>./GisFileImport<br>@/map/core/MapLibreMap<br>@/map/core/basemaps<br>@/stores/mapLayers<br>@/stores/ui<br>@/stores/gisSelection |
4428
+ | src/components/map/MediaLayerDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>./PanoramaViewer.vue<br>@/map/mediaLayerDetails |
4429
+ | src/components/map/ModuleOperationPanel.vue | 1 | src/components/map/MapToolbar.vue | vue<br>vue-router<br>@element-plus/icons-vue |
4430
+ | src/components/map/ReservoirDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>@/utils/request<br>@/map/reservoirDetails |
4431
+ | src/components/map/RubberDamDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>@/map/rubberDamDetails |
4432
+ | src/components/map/SpaceAnalysisPanel.vue | 1 | src/components/map/MapToolbar.vue | vue<br>@/stores/gisSelection<br>@/stores/spaceAnalysis |
4433
+ | src/components/map/StationLayerDetails.vue | 1 | src/components/map/index.vue | vue<br>element-plus<br>echarts<br>moment<br>./PanoramaViewer.vue<br>@/components/atlas/AtlasProcessChart.vue<br>@/map/stationLayerDetails<br>@/config/server<br>@/utils/request |
4434
+ | src/components/status/wrf/wrfStatus.vue | 1 | src/components/status/wrf/index.vue | vue<br>moment<br>@/api/oneMap/status |
4435
+ | src/components/status/wrfHydro/index.vue | 1 | src/views/meteo/glofas.vue | vue<br>./wrfHydroStatus.vue |
4436
+ | src/components/status/wrfHydro/wrfHydroStatus.vue | 1 | src/components/status/wrfHydro/index.vue | vue<br>@vueuse/core<br>@/api/oneMap/status |
4437
+ | src/components/common/TreeSelectPanel.vue | 0 | 未发现直接引用,需检查间接 / 动态使用 | vue<br>element-plus<br>motion-v |
4438
+ | src/components/layout/Toolbar.vue | 0 | 未发现直接引用,需检查间接 / 动态使用 | @/stores/ui<br>@/map/useMapBus |
4439
+ | src/components/timeline/index.vue | 0 | 未发现直接引用,需检查间接 / 动态使用 | vue<br>@/components/common/AppSelect.vue |
4440
+ | src/components/titlebar/index.vue | 0 | 未发现直接引用,需检查间接 / 动态使用 | — |
4441
+ | src/components/widgets/Legend.vue | 0 | 未发现直接引用,需检查间接 / 动态使用 | vue<br>vue-router |
702
4442
 
703
4443
  # CSS 变量主题与样式隔离
704
4444
 
@@ -759,3 +4499,8 @@ import 'sky-ui-kit/global.css'
759
4499
  ## 示例代码组织
760
4500
 
761
4501
  公共 CSS 只在项目 main.ts 引入一次。预览站的公共接入代码单独维护在 src/setup-examples.ts,各组件的查看代码只列组件 import、状态、事件与模板。查看代码中的接入链接指向公共配置;复制组件代码不会附带重复 CSS。已有 Element Plus CSS 引入时无需再添加。
4502
+ # 项目 SVG 图标
4503
+
4504
+ 全局缩放/主题融合以 GLOBAL-ADAPTATION.md 为准:原 App.vue 写根 --cp-vfit-scale,scoped-vfit 不重置它;保留原主题 store。不要在已消费 cp token 的组件外再增加第二套缩放。body 浮层核对根变量,局部变量需显式接入。
4505
+
4506
+ SvgIcon 样式仅作用于 scoped 的 .sky-svg-icon,不覆盖原生 ElIcon 或原项目 .svg-icon。默认继承 currentColor;数字 size 读取 --cp-font-1,缺失回退 1px;固定色 / 多色路径保持原配色。公共样式仍只在 main.ts 引入一次。