@zl-ui-kit/components 0.6.1 → 0.6.3

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/README.md CHANGED
@@ -53,15 +53,17 @@ import { ZlEditor, ZlSqlEditor } from '@zl-ui-kit/components/editor'
53
53
  import { ZlFilePreview, ZlFileViewer } from '@zl-ui-kit/components/file-preview'
54
54
  ```
55
55
 
56
- > 例外:`ZlPdfViewer` 没有重型依赖,仍留在主入口,`import { ZlPdfViewer } from '@zl-ui-kit/components'`。
56
+ > 例外:`ZlPdfViewer` 没有重型依赖,仍留在主入口,`import { ZlPdfViewer } from '@zl-ui-kit/components'`。
57
57
  > `app.use(ZlUI)` 全量注册**不含**上述子入口组件,需要的话手动 `app.component('ZlChart', ZlChart)`。
58
58
 
59
- **关于 `echarts` 版本**(`peerDependencies: "^5.6.0 || ^6.0.0"`,5.6+ 与 6.x 均支持):
59
+ | | | |
60
+ | ---------------------------------------------------- | --- | --------------------------------- |
61
+ | **关于 `echarts` 版本**(\`peerDependencies: "^5.6.0 | | ^6.0.0"\`,5.6+ 与 6.x 均支持): |
60
62
 
61
- - `ZlChart` 内部是 `import * as echarts from 'echarts'`(全量包,开箱即用、无需自己 `use()` 注册图表类型);
62
- 若宿主用 `echarts/core` + 按需注册,两者是两份独立实例,产物会同时含两份 echarts(实测约 +600KB)。
63
+ - `ZlChart` 内部是 `import * as echarts from 'echarts'`(全量包,开箱即用、无需自己 `use()` 注册图表类型);
64
+ 若宿主用 `echarts/core` + 按需注册,两者是两份独立实例,产物会同时含两份 echarts(实测约 +600KB)。
63
65
  此时可按需改用宿主实例自绘,或在构建里把 `echarts` 设为 external 由宿主提供。
64
- - 升级到 **echarts 6** 后默认主题变了(配色、legend 默认挪到画布底部、轴标签防溢出默认开启),
66
+ - 升级到 **echarts 6** 后默认主题变了(配色、legend 默认挪到画布底部、轴标签防溢出默认开启),
65
67
  想保持 v5 观感:`import 'echarts/theme/v5'` + `<ZlChart theme="v5" ... />`(`theme` prop 见 §6 ⑧)。
66
68
 
67
69
  接入:
@@ -108,20 +110,20 @@ import '@zl-ui-kit/theme/themes.css'
108
110
 
109
111
  > **`0.5.0` 起不再包含任何微前端依赖**
110
112
  >
111
- > 微前端通信层(`useMicroApp` / `useMicroAction` / `usePageTabs` / `useMicroGlobalData`)与
112
- > `formatMicroUrl` 工具已全部移除,`@micro-zoe/micro-app` 不再是 peer 依赖 —— 安装本库不会
113
- > 再拉入这个约 2.4MB 的包,`@zl-ui-kit/composables` 的产物里也没有它的静态 import
114
- > (旧版在 Node 原生 ESM / SSR 下会因这条 import 报 `ERR_MODULE_NOT_FOUND`)。
115
- > 全局数据(`locale` / `theme` / `token` / 用户 / 权限 / `config`)改用 `useGlobalData()`,
113
+ > 微前端通信层(`useMicroApp` / `useMicroAction` / `usePageTabs` / `useMicroGlobalData`)与
114
+ > `formatMicroUrl` 工具已全部移除,`@micro-zoe/micro-app` 不再是 peer 依赖 —— 安装本库不会
115
+ > 再拉入这个约 2.4MB 的包,`@zl-ui-kit/composables` 的产物里也没有它的静态 import
116
+ > (旧版在 Node 原生 ESM / SSR 下会因这条 import 报 `ERR_MODULE_NOT_FOUND`)。
117
+ > 全局数据(`locale` / `theme` / `token` / 用户 / 权限 / `config`)改用 `useGlobalData()`,
116
118
  > 纯 `localStorage` 持久化;`useLocale`、主题、字典等能力的用法与行为不变。
117
119
 
118
120
  > **两个「看起来像错、其实正常」的现象**
119
121
  >
120
- > 1. 只 import 主入口、没装 `echarts` / `monaco-editor` 时,Vite 会打印
121
- > `"xxx" is not exported by "__vite-optional-peer-dep:monaco-editor"`。
122
+ > 1. 只 import 主入口、没装 `echarts` / `monaco-editor` 时,Vite 会打印
123
+ > `"xxx" is not exported by "__vite-optional-peer-dep:monaco-editor"`。
122
124
  > 这是 Vite 对 optional peer 的内置 stub 机制:**警告不阻断构建**,装好对应依赖后警告消失。
123
- > 2. `@zl-ui-kit/icons` 与 `@zl-ui-kit/utils` 在 **Node 原生 ESM** 下直接 import 会报错
124
- > (前者是 JSON 缺 import attribute,后者依赖 CJS 包 `file-saver` 的具名导出)。
125
+ > 2. `@zl-ui-kit/icons` 与 `@zl-ui-kit/utils` 在 **Node 原生 ESM** 下直接 import 会报错
126
+ > (前者是 JSON 缺 import attribute,后者依赖 CJS 包 `file-saver` 的具名导出)。
125
127
  > Vite / webpack 打包的 Vue 项目不受影响;做 Node SSR 时把这两个包加进 `ssr.noExternal`。
126
128
 
127
129
  ---
@@ -161,9 +163,9 @@ playground 的界面按 **Element Plus 官网的信息架构**组织(顶栏 +
161
163
  | 组件页 | `/#/component/ZlTable`,依次是「基础用法」实时示例 → 用法示例 / 插槽用法代码块 → props/事件/插槽/暴露方法表(props 与插槽表各带一列「示例」) |
162
164
  | 接口手册 | `/#/manual`,跨组件检索(按 props 名 / 事件名反查组件),支持 `?name=ZlTable` 直接定位 |
163
165
 
164
- > 组件页的示例来自 `apps/playground/src/pages/gallery-demos.ts`(与冒烟测试同一份渲染函数),
165
- > 接口表来自 `pnpm docs:api` 产物 —— 与本文件第 14 章同源:改完组件源码记得重跑,否则 `pnpm check` 会报产物过期。
166
- > 两处的 **用法示例 / 插槽用法** 代码块也是同一份字符串,页面里可一键复制;
166
+ > 组件页的示例来自 `apps/playground/src/pages/gallery-demos.ts`(与冒烟测试同一份渲染函数),
167
+ > 接口表来自 `pnpm docs:api` 产物 —— 与本文件第 14 章同源:改完组件源码记得重跑,否则 `pnpm check` 会报产物过期。
168
+ > 两处的 **用法示例 / 插槽用法** 代码块也是同一份字符串,页面里可一键复制;
167
169
  > 每个 prop / 插槽的「示例」列同样是同一份字符串(可直接粘贴的属性写法 / `<template #name>` 片段)。
168
170
 
169
171
  > 注意:`@zl-ui-kit/theme/light`、`@zl-ui-kit/theme/themes.css` 等 CSS 子路径不走别名,读取 `src/generated/` 生成物——改主题 token 后需先 `pnpm --filter @zl-ui-kit/theme gen`。
@@ -249,7 +251,7 @@ setTheme('dark') // 切换主题(light/dark/red-light/red-dark/blue)
249
251
 
250
252
  ### 4.1 必须先注册图标集(否则一个图标都不显示)
251
253
 
252
- `ZlIcon` 走 `@iconify/vue/offline`,**库不会自动把 444 个图标塞进打包结果**(否则不用图标的宿主也会白扛 ~150KB)。
254
+ `ZlIcon` 走 `@iconify/vue/offline`,**库不会自动把 444 个图标塞进打包结果**(否则不用图标的宿主也会白扛 ~150KB)。
253
255
  消费方需要在应用启动时把内置图标集注册进 offline 集合,只需一次:
254
256
 
255
257
  ```ts
@@ -260,11 +262,11 @@ import { icons } from '@zl-ui-kit/icons'
260
262
  presetIconifyIcon(icons)
261
263
  ```
262
264
 
263
- > **漏掉这一步的表现**:`ZlIcon` 只渲染出一个空的 `<div class="zl-icon">`,不报错、不告警,
264
- > 组件内部(查询条的「查询/重置/展开」按钮、表单 label 后的问号、空态插画等)的图标同样全部空白——
265
+ > **漏掉这一步的表现**:`ZlIcon` 只渲染出一个空的 `<div class="zl-icon">`,不报错、不告警,
266
+ > 组件内部(查询条的「查询/重置/展开」按钮、表单 label 后的问号、空态插画等)的图标同样全部空白——
265
267
  > 排查时容易误判成图标名写错或样式问题。
266
268
  >
267
- > `@zl-ui-kit/icons` 需要作为**直接依赖**安装(`pnpm add @zl-ui-kit/icons`),不要依赖它被 `components` 间接带进 `node_modules`:
269
+ > `@zl-ui-kit/icons` 需要作为**直接依赖**安装(`pnpm add @zl-ui-kit/icons`),不要依赖它被 `components` 间接带进 `node_modules`:
268
270
  > 幽灵依赖在提升规则变化或切换包管理器后会直接解析失败。
269
271
 
270
272
  `presetIconifyIcon(...collections)` 接受多个集合,可叠加自建图标:`presetIconifyIcon(icons, myIcons)`。
@@ -312,7 +314,6 @@ presetIconifyIcon(icons)
312
314
  ```vue
313
315
  <ZlEmpty description="暂无数据" />
314
316
  <ZlEmpty :image="customImg" />
315
- <!-- 传入自定义图,缺省为内置轻量 SVG 线稿 -->
316
317
  ```
317
318
 
318
319
  ### ZlDictTag — 字典标签
@@ -320,7 +321,6 @@ presetIconifyIcon(icons)
320
321
  经 `useDict(dictKey)` 解析独立字典 store(`useDictStore`,Vue3 状态管理缓存,不依赖全局数据)。**支持三种数据注入方式**(详见第 12.1.3 节与第 6.3 节 ⑤):
321
322
 
322
323
  ```vue
323
- <!-- 1. 组件级直传(最轻量,无需任何全局配置即可翻译) -->
324
324
  <ZlDictTag
325
325
  dict-key="resourceType"
326
326
  :value="row.type"
@@ -330,16 +330,45 @@ presetIconifyIcon(icons)
330
330
  ]"
331
331
  />
332
332
 
333
- <!-- 2. 全局/局部数据源(应用入口注册一次,全项目共享) -->
334
333
  <ZlDictTag dict-key="resourceType" :value="row.type" />
335
334
  <ZlDictTag dict-key="resourceType" :value="row.type" simple />
336
335
  ```
337
336
 
338
337
  详见第 6.3 节 ⑤。
339
338
 
339
+ ### ZlCard / ZlPagination — 卡片与分页的视觉约定
340
+
341
+ `ZlCard` 的外观对齐设计稿(`DnCard`):圆角 6px、轻阴影、右上角一张很淡的蓝紫渐变装饰底图。
342
+ 底图**随包内联**(构建期转 base64,不额外产出图片文件),消费方无需配 `assetsInclude` 或图片服务。
343
+
344
+ ```vue
345
+ <ZlCard style="max-width: 280px">
346
+ <template #icon><StrategyIcon :icon="row.icon" size="40px" /></template>
347
+ <template #title><ZlAutoTooltip>{{ row.name }}</ZlAutoTooltip></template>
348
+ <template #title-append><ZlSwitch v-model="row.status" /></template>
349
+ <template #footer>策略数:{{ row.num }}</template>
350
+ </ZlCard>
351
+ ```
352
+
353
+ | CSS 变量 | 默认值 | 说明 |
354
+ | ------------------------- | ------------ | --------------------------------------------------- |
355
+ | `--zl-card-bg-image` | 内置渐变底图 | 右上角装饰图;设为 `none` 即关闭 |
356
+ | `--zl-pagination-justify` | `flex-end` | 分页器水平对齐(`flex-start` 靠左 / `center` 居中) |
357
+
358
+ 其余颜色、圆角、阴影统一走 token(`--zl-bg-1` / `--zl-shadow` / `--zl-radius-large` / `--zl-text-1` / `--zl-border-2`),
359
+ 随主题切换。深色主题下装饰底图会自动关闭——浅色渐变压在深底上会发白。
360
+
361
+ `ZlPagination` **默认靠右对齐**(EP 的 `.el-pagination` 是 flex 容器但没设 `justify-content`,默认会挤在左侧)。
362
+ 单处分页需要居中/靠左时用 `align`,整站统一时覆盖 `--zl-pagination-justify` 即可:
363
+
364
+ ```vue
365
+ <ZlPagination :total="total" align="center" />
366
+ <ZlPagination :total="total" :page-num="1" :page-size="30" />
367
+ ```
368
+
340
369
  ### 其余
341
370
 
342
- `ZlText`(文本省略)、`ZlAutoTooltip`(超长省略 + tooltip)、`ZlDescription`(描述列表)、`ZlSection`(分区容器)、`ZlCard`(卡片,背景图已改为纯 CSS)、`ZlAvatar`(+Group)、`ZlAppSlogan`(品牌标语,字体走 `--zl-slogan-font-family`)、`ZlIconLabel`/`ZlIconHover`(图标 + 文字组合)。
371
+ `ZlText`(文本省略)、`ZlAutoTooltip`(超长省略 + tooltip)、`ZlDescription`(描述列表)、`ZlSection`(分区容器)、`ZlAvatar`(+Group)、`ZlAppSlogan`(品牌标语,字体走 `--zl-slogan-font-family`)、`ZlIconLabel`/`ZlIconHover`(图标 + 文字组合)。
343
372
 
344
373
  ---
345
374
 
@@ -360,18 +389,18 @@ const { loading, data, error, status, run, runAsync, refresh, refreshAsync, canc
360
389
  )
361
390
  ```
362
391
 
363
- | 返回/选项 | 说明 |
364
- | ---------------------------------------------- | --------------------------------------------------------- |
365
- | `loading` / `data` / `error` / `status` | 响应式状态(`status`: `''`/`pending`/`finished`/`error`) |
366
- | `run(...args)` | 同步触发,错误被吞(除非传 `onError`) |
367
- | `runAsync(...args)` | 返回 Promise,可 await 捕获 |
368
- | `refresh()` / `refreshAsync()` | 用上次参数重跑 |
369
- | `cancel()` | 取消进行中请求(结果丢弃) |
370
- | `mutate(data \| prev => R)` | 本地立即改 `data`,不触网 |
371
- | `options.manual` | `true` 时不自动执行 |
372
- | `options.defaultParams` / `initialData` | 首参 / 初始占位 |
373
- | `options.onBefore/onSuccess/onError/onFinally` | 生命周期回调 |
374
- | `options.loadingDelay` / `refreshDeps` | 延迟 loading / 依赖变更刷新 |
392
+ | 返回/选项 | 说明 |
393
+ | ---------------------------------------------- | ----------------------------------------------------------- |
394
+ | `loading` / `data` / `error` / `status` | 响应式状态(`status`: `''`/`pending`/`finished`/`error`) |
395
+ | `run(...args)` | 同步触发,错误被吞(除非传 `onError`) |
396
+ | `runAsync(...args)` | 返回 Promise,可 await 捕获 |
397
+ | `refresh()` / `refreshAsync()` | 用上次参数重跑 |
398
+ | `cancel()` | 取消进行中请求(结果丢弃) |
399
+ | `mutate(data \| prev => R)` | 本地立即改 `data`,不触网 |
400
+ | `options.manual` | `true` 时不自动执行(只影响挂载首跑,不影响 `refreshDeps`) |
401
+ | `options.defaultParams` / `initialData` | 首参 / 初始占位 |
402
+ | `options.onBefore/onSuccess/onError/onFinally` | 生命周期回调 |
403
+ | `options.loadingDelay` / `refreshDeps` | 延迟 loading / 依赖变更刷新 |
375
404
 
376
405
  #### `useDataRequest(service, { dataKey = 'data' })` —— 自动解包信封
377
406
 
@@ -435,6 +464,49 @@ const { data } = useDataRequest(getChartDataApi, { dataKey: 'data' })
435
464
 
436
465
  内部组合 `usePageableRequest + ZlSearch + ZlPagination + ZlEmpty`。
437
466
 
467
+ **条件查询 / 页签切换怎么重查**:把变化源放进 `request.options.refreshDeps`(ref / getter 数组),
468
+ 依赖变化会自动重查**并回到第 1 页**——卡片页的请求是 `manual` 的(首屏由 `ZlSearch` 触发),
469
+ 组件内部已把 `refreshDeps` 接到自己的 `search()` 上,不需要自己写 `watch`:
470
+
471
+ ```vue
472
+ <script setup lang="ts">
473
+ const activeTab = ref('all')
474
+ const cardPageRef = ref<InstanceType<typeof ZlCardPage>>()
475
+
476
+ const pageRequest = {
477
+ service: getStrategyPage,
478
+ options: {
479
+ // 页签/分类这类「筛选条件」变化 → 自动重查并回第 1 页
480
+ refreshDeps: [() => activeTab.value],
481
+ },
482
+ }
483
+
484
+ /** 行内改状态后重查:走 refresh() 沿用当前页与查询条件 */
485
+ const onStatusChange = () => cardPageRef.value?.refresh()
486
+ </script>
487
+
488
+ <template>
489
+ <ZlCardPage
490
+ ref="cardPageRef"
491
+ :request="pageRequest"
492
+ :query-items="queryItems"
493
+ :pagination="{ pageSize: 30 }"
494
+ >
495
+ <!-- `search-` 前缀插槽透传给 ZlSearch;search-actions 在表单网格之外,适合放 tabs -->
496
+ <template #search-actions>
497
+ <ZlTabs v-model="activeTab" :tabs="tabItems" :dark-nav="false" />
498
+ </template>
499
+ <template #default="{ data }">
500
+ <ZlCard>{{ data.name }}</ZlCard>
501
+ </template>
502
+ </ZlCardPage>
503
+ </template>
504
+ ```
505
+
506
+ > `service` 内部按当前筛选条件(含页签值)组装入参即可,`refreshDeps` 只负责「什么时候查」。
507
+ > 两种刷新语义别混用:`refreshDeps` 变化**一律回第 1 页**(换条件后停在旧页码没有意义);
508
+ > 需要「原地重查、页码不变」(行内改状态、删除后刷新)用 `ref.refresh()` / `ref.search.search(params)`。
509
+
438
510
  #### ③ `ZlTable` + `ZlPagination` —— 自行 `usePaginationRequest`
439
511
 
440
512
  ```ts
@@ -664,6 +736,9 @@ const items: FormItem[] = [
664
736
  ### ZlTabs / ZlDynamicComponent / ZlGrid
665
737
 
666
738
  - `ZlTabs`:`el-tabs` 封装,schema `{ key, title, lazy }`,extra 经外层绝对定位承载。
739
+ 页签内容用具名插槽 `#<tab.key>`(如 `tabs=[{ key: 'all' }]` → `<template #all>`),
740
+ 插槽内容接入父组件的渲染上下文,数据变化会正常更新;`v-model` 双向绑定当前页签 key。常用场景
741
+ (分页卡片的分类筛选)见 §6.3 ②。
667
742
  - `ZlDynamicComponent`:schema→VNode 渲染引擎,默认 `el-input`。
668
743
  - `ZlGrid`(+`ZlGridItem`):自绘栅格,label 自适应/跨列/省略提示/字典。
669
744
 
@@ -841,7 +916,10 @@ import { useRequest, useGlobalData, useDict /* … */ } from '@zl-ui-kit/composa
841
916
  - **内置插件自动装载**,通过 `options` 开启(无需 import):
842
917
  - **loading**:`loadingDelay`(ms,延迟显示 loading,避免闪烁) / `loadingKeep`(ms,最短保持时间)
843
918
  - **ready**:`ready: Ref<boolean>`,为假时拦截请求,为真后自动 `run`(适合依赖前置条件就绪后再请求)
844
- - **refreshDeps**:`refreshDeps: WatchSource | WatchSource[]`,依赖变化自动 `refresh`;可用 `refreshDepsAction` 自定义动作
919
+ | | |
920
+ | --- | --- |
921
+ - **refreshDeps**:`refreshDeps: WatchSource | WatchSource[]`,依赖变化自动 `refresh`;可用 `refreshDepsAction` 自定义动作。
922
+ 与 `manual` 不冲突——`manual: true` 只表示「挂载时不自动发请求」,依赖变化照样会重查(唯一例外是从未 `run` 过的请求,没有可复用参数,会跳过)
845
923
  - **download**:`outputFile: MaybeRefOrGetter<string>`,`service` 返回 `Blob`(非 JSON)时自动下载保存
846
924
  - **自定义插件**:`defineUseRequestPlugin(plugin)` 返回 `PluginImplementType`,经 `useRequest(service, options, [myPlugin])` 第三参注入,可实现 `onBefore / onRequest / onSuccess / onError / onFinally / onCancel / onMutate` 钩子。
847
925
  - **全局默认项**:
@@ -890,8 +968,13 @@ g.resetUser() // 登出:清 user / roles / permissions / token
890
968
 
891
969
  #### 12.1.3 字典与国际化
892
970
 
971
+ | | |
972
+ | --- | --- |
973
+
893
974
  - `useDictStore`(全局字典 store,基于 Vue3 `createGlobalState` 单例):`dictStore`(缓存 `Record<key, DictItem[]>`)、`loadingKeys`、`setDictSource(source|null)`、`getDictSource()`、`ensureDict(key, localSource?)`。同一 key 仅在缓存未命中且未在加载时触发一次加载,结果缓存复用。
894
975
  - `useDict(key, options?)` → `ComputedRef<DictItem[]>`(附带 `.label: Record<value,label>`):读 `useDictStore` 并解析。数据解析优先级:组件级 `options.data` → 局部 `useDictProvider({ source })` → 全局 `setDictSource(source)`。`DictItem = { label, value, icon?, type? }`(亦可用 `type DictItem` 导入)。
976
+ | | | |
977
+ | --- | --- | --- |
895
978
  - `setDictSource(source | null)`:全局注册字典数据源(应用入口调用一次)。`source` 为静态表 `Record<string, DictItem[]>` 或函数 `(key) => DictItem[] | Promise<DictItem[]>`;传 `null` 清空。`getDictSource()` 可读取当前值。
896
979
  - `useDictProvider(source)`:子树根提供局部字典数据源(覆盖全局)。
897
980
  - `useLocale(options?, loader?)` → `{ i18n, locale, isI18nKeyVisible }`:创建与全局语言联动的 vue-i18n 实例;`loader(locale)` 按需返回 `{ localeMessages, elLocaleMessages }`(业务包 + Element Plus locale)。`elLocaleMessages` 写入全局数据后,**必须**由 `ZlI18nProvider` 经 `<el-config-provider>` 挂载到 Element Plus 才生效(分页 / 日期选择器等内置组件才本地化)。详见第 13 章。
@@ -984,6 +1067,8 @@ api.get('/resources', { params: { pageNum: 1, pageSize: 10 } })
984
1067
  - `fileSave`(re-export `file-saver` 的 `saveAs`)。
985
1068
  - `joinFilePrefix(path, prefix = '/_file')`:拼接文件服务前缀路径。
986
1069
  - `downloadFileByUrl(url, prefix?)`:创建临时 `<a>` 触发浏览器下载。
1070
+ | | | | | |
1071
+ | --- | --- | --- | --- | --- |
987
1072
  - `fileUrlPreviewType(path)` → `'image' | 'pdf' | 'word' | 'ppt' | 'excel'`(按扩展名判断)。
988
1073
  - `formatFilesize(size, { precision = 2, units })`:文件大小格式化(B/KB/MB/GB)。
989
1074
 
@@ -1188,7 +1273,7 @@ const { i18n } = useLocale({ messages })
1188
1273
  | `ZlIconLabel` | 主入口 | 1 | 1 | 1 | 0 |
1189
1274
  | `ZlCornerTag` | 主入口 | 3 | 0 | 1 | 0 |
1190
1275
  | `ZlLayoutSwitch` | 主入口 | 2 | 1 | 0 | 0 |
1191
- | `ZlPagination` | 主入口 | 3 | 3 | 0 | 0 |
1276
+ | `ZlPagination` | 主入口 | 4 | 3 | 0 | 0 |
1192
1277
  | `ZlPermission` | 主入口 | 1 | 0 | 1 | 0 |
1193
1278
  | `ZlPopconfirm` | 主入口 | 4 | 2 | 3 | 0 |
1194
1279
  | `ZlRadioTag` | 主入口 | 3 | 1 | 1 | 0 |
@@ -1212,7 +1297,7 @@ const { i18n } = useLocale({ messages })
1212
1297
  | `ZlFilePreview` | 子入口 file-preview | 1 | 0 | 0 | 0 |
1213
1298
  | `ZlFileViewer` | 子入口 file-preview | 1 | 0 | 0 | 0 |
1214
1299
 
1215
- > 说明列为 `—` 表示该属性在源码里没写 `/** */` 注释(当前 133/189 个);补完注释重跑 `pnpm docs:api` 即可同步。
1300
+ > 说明列为 `—` 表示该属性在源码里没写 `/** */` 注释(当前 133/190 个);补完注释重跑 `pnpm docs:api` 即可同步。
1216
1301
 
1217
1302
  ### 14.1 主入口组件(`@zl-ui-kit/components`)
1218
1303
 
@@ -1604,6 +1689,8 @@ import { ZlCard } from '@zl-ui-kit/components'
1604
1689
  | `footer` | — | `<template #footer>…</template>` | — |
1605
1690
  | `extra` | — | `<template #extra>…</template>` | — |
1606
1691
 
1692
+ **完整示例**:见 §5 通用展示组件 › ZlCard / ZlPagination — 卡片与分页的视觉约定
1693
+
1607
1694
  #### `ZlCardPage`
1608
1695
 
1609
1696
  <sub>入口 `@zl-ui-kit/components` · 源码 `packages/components/src/components/ZlCardPage/index.vue`</sub>
@@ -2586,9 +2673,9 @@ import { ZlLayoutSwitch } from '@zl-ui-kit/components'
2586
2673
 
2587
2674
  <sub>入口 `@zl-ui-kit/components` · 源码 `packages/components/src/components/ZlPagination/index.vue`</sub>
2588
2675
 
2589
- **简介**:自行 usePaginationRequest
2676
+ **简介**:分页器(el-pagination 封装):默认靠右对齐,分页入参(pageNum/pageSize/showTotal…) 经 `$attrs` 透传,`align` 控制水平对齐(left/center/right)
2590
2677
 
2591
- **接口概览**:3 props · 3 事件
2678
+ **接口概览**:4 props · 3 事件
2592
2679
 
2593
2680
  **用法示例**
2594
2681
 
@@ -2606,6 +2693,7 @@ import { ZlPagination } from '@zl-ui-kit/components'
2606
2693
 
2607
2694
  | 属性 | 类型 | 默认值 | 必填 | 示例 | 说明 |
2608
2695
  | ------------- | ------------ | ------ | ---- | ----------------------------- | ---------------------------------- |
2696
+ | `align` | `(未声明)` | — | 否 | `:align="align"` | 运行时从 `$attrs` 读取,无类型约束 |
2609
2697
  | `pageNum` | `(未声明)` | — | 否 | `:page-num="pageNum"` | 运行时从 `$attrs` 读取,无类型约束 |
2610
2698
  | `pageSize` | `(未声明)` | — | 否 | `:page-size="pageSize"` | 运行时从 `$attrs` 读取,无类型约束 |
2611
2699
  | `currentPage` | `(未声明)` | — | 否 | `:current-page="currentPage"` | 运行时从 `$attrs` 读取,无类型约束 |
@@ -2620,7 +2708,7 @@ import { ZlPagination } from '@zl-ui-kit/components'
2620
2708
  | `page-change` | `number` | 仅页码变化(区别于 pageSize 变化) |
2621
2709
  | `page-size-change` | `number` | 仅每页条数变化 |
2622
2710
 
2623
- **完整示例**:见 §6 数据型组件 + useRequest 体系(核心) › ③ ZlTable + ZlPagination —— 自行 usePaginationRequest
2711
+ **完整示例**:见 §5 通用展示组件 › ZlCard / ZlPagination — 卡片与分页的视觉约定
2624
2712
 
2625
2713
  #### `ZlPermission`
2626
2714
 
@@ -1 +1 @@
1
- .zl-card{position:relative;border-radius:var(--zl-radius-large, 6px);background-color:var(--zl-bg-1, #fff);box-shadow:0 2px 5px 0 var(--zl-shadow, rgba(36, 46, 67, .1))}.zl-card__header{display:grid;grid-template-columns:44px 1fr;padding:16px 16px 12px;align-items:center;gap:2px 12px}.zl-card__icon{grid-row:1/span 2;aspect-ratio:1/1;overflow:hidden;display:flex;align-items:center;justify-content:center;border-radius:6px}.zl-card__icon>img{width:40px;height:40px}.zl-card__icon>.zl-icon{font-size:32px}.zl-card__title{display:flex;align-items:center;gap:12px;overflow:hidden}.zl-card__title-text{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zl-text-1, #242e43);font-size:14px;font-weight:600;line-height:22px}.zl-card__title-append{flex:1 0 auto}.zl-card__subtitle{color:var(--zl-text-3, #79879c);font-size:12px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zl-card__body{padding:0 16px 12px}.zl-card__footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable{border:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable:hover{border-color:var(--zl-primary-6, var(--el-color-primary, #0066ff));box-shadow:0 4px 10px #00223e14}
1
+ @charset "UTF-8";.zl-card{position:relative;border-radius:var(--zl-radius-large, 6px);--zl-card-bg-image: url(data:image/png;base64,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);background-color:var(--zl-bg-1, #fff);background-image:var(--zl-card-bg-image);background-position:top right;background-repeat:no-repeat;box-shadow:0 2px 5px 0 var(--zl-shadow, rgba(36, 46, 67, .1));transition:border-color .2s ease,box-shadow .2s ease}.zl-card__header{display:grid;grid-template-columns:44px 1fr;padding:16px 16px 12px;align-items:center;gap:2px 12px}.zl-card__icon{grid-row:1/span 2;aspect-ratio:1/1;overflow:hidden;display:flex;align-items:center;justify-content:center;border-radius:6px}.zl-card__icon>img{width:40px;height:40px}.zl-card__icon>.zl-icon{font-size:32px}.zl-card__title{display:flex;align-items:center;gap:12px;overflow:hidden}.zl-card__title-text{flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--zl-text-1, #242e43);font-size:14px;font-weight:600;line-height:22px}.zl-card__title-append{flex:1 0 auto}.zl-card__subtitle{color:var(--zl-text-3, #79879c);font-size:12px;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zl-card__body{padding:0 16px 12px}.zl-card__footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable{border:1px solid var(--zl-border-2, #e3e9ef)}.zl-card-hoverable:hover{border-color:var(--zl-primary-6, var(--el-color-primary, #0066ff));box-shadow:0 4px 10px #00223e14}[data-theme*=dark] .zl-card{--zl-card-bg-image: none}
@@ -1,4 +1,4 @@
1
- import { defineComponent as Z, useSlots as x, ref as K, computed as i, watch as M, resolveDirective as V, withDirectives as A, openBlock as o, createElementBlock as q, normalizeStyle as F, createBlock as p, createSlots as L, withCtx as P, renderSlot as g, renderList as S, normalizeProps as G, guardReactiveProps as H, createCommentVNode as k, createElementVNode as z, Fragment as J, mergeProps as $, unref as h } from "vue";
1
+ import { defineComponent as Z, useSlots as j, ref as x, computed as l, watch as K, resolveDirective as M, withDirectives as V, openBlock as u, createElementBlock as q, normalizeStyle as F, createBlock as p, createSlots as L, withCtx as P, renderSlot as h, renderList as S, normalizeProps as G, guardReactiveProps as H, createCommentVNode as k, createElementVNode as z, Fragment as J, mergeProps as $, unref as g } from "vue";
2
2
  import { usePageableRequest as Q } from "@zl-ui-kit/composables";
3
3
  import { isArray as w } from "@zl-ui-kit/utils";
4
4
  import T from "../ZlEmpty/index.vue.mjs";
@@ -6,7 +6,7 @@ import U from "../ZlPagination/index.vue.mjs";
6
6
  import X from "../ZlSearch/index.vue.mjs";
7
7
  import '../ZlSearch/index.css';/* empty css */
8
8
  import { usePagination as Y } from "../ZlPagination/usePagination.mjs";
9
- const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list" }, B = "search-", ce = /* @__PURE__ */ Z({
9
+ const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list" }, D = "search-", ce = /* @__PURE__ */ Z({
10
10
  name: "ZlCardPage",
11
11
  __name: "index",
12
12
  props: {
@@ -18,106 +18,118 @@ const ee = { class: "zl-card-page__content" }, te = { class: "zl-card-page__list
18
18
  cardMinWidth: {}
19
19
  },
20
20
  emits: ["search-reset"],
21
- setup(s, { expose: C, emit: R }) {
22
- const a = s, b = R, D = x(), l = K(null), v = i(() => {
23
- const e = { manual: !0, initialData: [] };
24
- return typeof a.request == "function" ? { service: a.request, options: e } : {
25
- ...a.request,
26
- options: Object.assign({ initialData: [] }, a.request.options, { manual: !0 })
21
+ setup(s, { expose: B, emit: C }) {
22
+ const r = s, R = C, E = j(), c = x(null), v = l(() => {
23
+ const t = { manual: !0, initialData: [] };
24
+ if (typeof r.request == "function")
25
+ return { service: r.request, options: t };
26
+ const {
27
+ refreshDeps: e,
28
+ refreshDepsAction: o,
29
+ ...a
30
+ } = r.request.options ?? {};
31
+ return {
32
+ ...r.request,
33
+ options: {
34
+ ...t,
35
+ ...a,
36
+ manual: !0,
37
+ ...e ? { refreshDeps: e, refreshDepsAction: o ?? (() => i()) } : {}
38
+ }
27
39
  };
28
40
  }), {
29
- loading: E,
41
+ loading: I,
30
42
  data: n,
31
- run: I,
32
- params: N,
33
- refresh: _
34
- } = Q(v.value.service, v.value.options), j = i(() => N.value?.[0]), O = i(() => {
43
+ run: N,
44
+ params: _,
45
+ refresh: b
46
+ } = Q(v.value.service, v.value.options), A = l(() => _.value?.[0]), O = l(() => {
35
47
  if (w(n.value))
36
- return a.pagination && { total: n.value.length, ...a.pagination };
48
+ return r.pagination && { total: n.value.length, ...r.pagination };
37
49
  {
38
- const { pageNum: e, pageSize: t, total: d = 0 } = n.value;
39
- return { pageNum: e, pageSize: t, total: d };
50
+ const { pageNum: t, pageSize: e, total: o = 0 } = n.value;
51
+ return { pageNum: t, pageSize: e, total: o };
40
52
  }
41
- }), u = Y(() => O.value ?? !1), y = i(
53
+ }), m = Y(() => O.value ?? !1), y = l(
42
54
  () => w(n.value) ? n.value : n.value?.rows ?? []
43
- ), W = i(() => {
44
- const e = [];
45
- return Object.keys(D).forEach((t) => {
46
- t.startsWith(B) && t !== "search-actions" && e.push(t.slice(B.length));
47
- }), e;
55
+ ), W = l(() => {
56
+ const t = [];
57
+ return Object.keys(E).forEach((e) => {
58
+ e.startsWith(D) && e !== "search-actions" && t.push(e.slice(D.length));
59
+ }), t;
48
60
  });
49
- let m;
50
- function c(e, t = {
61
+ let d;
62
+ function i(t, e = {
51
63
  pageNum: 1,
52
- pageSize: u.value !== !1 ? u.value.pageSize : 30
64
+ pageSize: m.value !== !1 ? m.value.pageSize : 30
53
65
  }) {
54
- m = {
55
- ...m,
56
- ...e,
57
- ...t
58
- }, I(m);
66
+ d = {
67
+ ...d,
68
+ ...t,
69
+ ...e
70
+ }, N(d);
59
71
  }
60
- return M(
61
- () => a.immediate,
62
- (e) => {
63
- e && !a.queryItems.length && c();
72
+ return K(
73
+ () => r.immediate,
74
+ (t) => {
75
+ t && !r.queryItems.length && i();
64
76
  },
65
77
  { immediate: !0, once: !0 }
66
- ), C({
67
- refresh: _,
68
- params: j,
78
+ ), B({
79
+ refresh: b,
80
+ params: A,
69
81
  search: new Proxy(
70
82
  {},
71
83
  {
72
- get(e, t) {
73
- return !l.value && t === "search" ? c : l.value?.[t];
84
+ get(t, e) {
85
+ return !c.value && e === "search" ? i : c.value?.[e];
74
86
  },
75
- has(e, t) {
76
- return t in (l.value ?? {});
87
+ has(t, e) {
88
+ return e in (c.value ?? {});
77
89
  }
78
90
  }
79
91
  )
80
- }), (e, t) => {
81
- const d = V("loading");
82
- return A((o(), q("div", {
92
+ }), (t, e) => {
93
+ const o = M("loading");
94
+ return V((u(), q("div", {
83
95
  class: "zl-card-page",
84
96
  style: F({ "--card-min-width": s.cardMinWidth })
85
97
  }, [
86
- s.queryItems.length || e.$slots["search-actions"] ? (o(), p(X, {
98
+ s.queryItems.length || t.$slots["search-actions"] ? (u(), p(X, {
87
99
  key: 0,
88
100
  ref_key: "searchRef",
89
- ref: l,
101
+ ref: c,
90
102
  items: s.queryItems,
91
103
  immediate: s.immediate,
92
- onSearch: c,
93
- onReset: t[0] || (t[0] = (r) => b("search-reset"))
104
+ onSearch: i,
105
+ onReset: e[0] || (e[0] = (a) => R("search-reset"))
94
106
  }, L({ _: 2 }, [
95
- e.$slots["search-actions"] ? {
107
+ t.$slots["search-actions"] ? {
96
108
  name: "actions",
97
109
  fn: P(() => [
98
- g(e.$slots, "search-actions")
110
+ h(t.$slots, "search-actions")
99
111
  ]),
100
112
  key: "0"
101
113
  } : void 0,
102
- S(W.value, (r) => ({
103
- name: r,
114
+ S(W.value, (a) => ({
115
+ name: a,
104
116
  fn: P((f) => [
105
- g(e.$slots, `search-${r}`, G(H(f)))
117
+ h(t.$slots, `search-${a}`, G(H(f)))
106
118
  ])
107
119
  }))
108
120
  ]), 1032, ["items", "immediate"])) : k("", !0),
109
121
  z("div", ee, [
110
122
  z("div", te, [
111
- y.value.length ? (o(!0), q(J, { key: 0 }, S(y.value, (r, f) => g(e.$slots, "default", $({
112
- key: r[s.itemKey] || f
113
- }, { ref_for: !0 }, { data: r }))), 128)) : (o(), p(T, { key: 1 }))
123
+ y.value.length ? (u(!0), q(J, { key: 0 }, S(y.value, (a, f) => h(t.$slots, "default", $({
124
+ key: a[s.itemKey] || f
125
+ }, { ref_for: !0 }, { data: a }))), 128)) : (u(), p(T, { key: 1 }))
114
126
  ])
115
127
  ]),
116
- s.pagination && h(u) !== !1 ? (o(), p(U, $({ key: 1 }, h(u), {
117
- onChange: t[1] || (t[1] = (r) => c(void 0, r))
128
+ s.pagination && g(m) !== !1 ? (u(), p(U, $({ key: 1 }, g(m), {
129
+ onChange: e[1] || (e[1] = (a) => i(void 0, a))
118
130
  }), null, 16)) : k("", !0)
119
131
  ], 4)), [
120
- [d, h(E)]
132
+ [o, g(I)]
121
133
  ]);
122
134
  };
123
135
  }
@@ -1 +1 @@
1
- .zl-pagination[data-v-5ba9d585]{padding:6px 16px;background-color:var(--zl-fill-1, #f9fbfd)}
1
+ @charset "UTF-8";.zl-pagination[data-v-5eee61b9]{padding:6px 16px;background-color:var(--zl-fill-1, #f9fbfd);justify-content:var(--zl-pagination-justify, flex-end)}.zl-pagination--left[data-v-5eee61b9]{--zl-pagination-justify: flex-start}.zl-pagination--center[data-v-5eee61b9]{--zl-pagination-justify: center}.zl-pagination--right[data-v-5eee61b9]{--zl-pagination-justify: flex-end}
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.mjs";
2
2
  import './index.css';/* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-5ba9d585"]]);
4
+ const i = /* @__PURE__ */ t(o, [["__scopeId", "data-v-5eee61b9"]]);
5
5
  export {
6
- m as default
6
+ i as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.mjs.map
@@ -1,48 +1,49 @@
1
- import { defineComponent as f, useAttrs as z, ref as p, watch as r, computed as v, resolveComponent as _, openBlock as h, createBlock as S, mergeProps as d, createCommentVNode as C } from "vue";
2
- import { usePagination as N } from "./usePagination.mjs";
3
- const B = /* @__PURE__ */ f({
1
+ import { defineComponent as v, useAttrs as h, computed as r, ref as l, watch as p, resolveComponent as _, openBlock as d, createBlock as S, mergeProps as C, createCommentVNode as N } from "vue";
2
+ import { usePagination as P } from "./usePagination.mjs";
3
+ const B = /* @__PURE__ */ v({
4
4
  name: "ZlPagination",
5
+ inheritAttrs: !1,
5
6
  __name: "index",
6
7
  emits: ["change", "page-change", "page-size-change"],
7
- setup(P, { emit: c }) {
8
- const t = c, a = z(), n = N(() => a), i = p(
8
+ setup(k, { emit: s }) {
9
+ const t = s, a = h(), n = P(() => a), c = r(() => a.align ?? "right"), i = l(
9
10
  a.pageNum ?? (n.value === !1 ? void 0 : n.value.currentPage) ?? 1
10
- ), u = p(
11
+ ), g = l(
11
12
  a.pageSize ?? (n.value === !1 ? void 0 : n.value.pageSize) ?? 30
12
13
  );
13
- r(
14
+ p(
14
15
  () => a.pageNum ?? a.currentPage,
15
16
  (e) => {
16
17
  e != null && (i.value = e);
17
18
  }
18
- ), r(
19
+ ), p(
19
20
  () => a.pageSize,
20
21
  (e) => {
21
- e != null && (u.value = e);
22
+ e != null && (g.value = e);
22
23
  }
23
24
  );
24
- function s(e) {
25
- i.value = e, t("change", { pageNum: e, pageSize: u.value }), t("page-change", e);
25
+ function m(e) {
26
+ i.value = e, t("change", { pageNum: e, pageSize: g.value }), t("page-change", e);
26
27
  }
27
- function l(e) {
28
- u.value = e, i.value = 1, t("change", { pageNum: 1, pageSize: e }), t("page-size-change", e);
28
+ function f(e) {
29
+ g.value = e, i.value = 1, t("change", { pageNum: 1, pageSize: e }), t("page-size-change", e);
29
30
  }
30
- const o = v(() => {
31
+ const u = r(() => {
31
32
  if (n.value === !1) return !1;
32
- const { currentPage: e, pageSize: m, ...g } = n.value;
33
- return g;
33
+ const { currentPage: e, pageSize: z, ...o } = n.value;
34
+ return delete o.align, o;
34
35
  });
35
- return (e, m) => {
36
- const g = _("el-pagination");
37
- return o.value !== !1 ? (h(), S(g, d({
36
+ return (e, z) => {
37
+ const o = _("el-pagination");
38
+ return u.value !== !1 ? (d(), S(o, C({
38
39
  key: 0,
39
- class: "zl-pagination"
40
- }, o.value, {
40
+ class: ["zl-pagination", `zl-pagination--${c.value}`]
41
+ }, u.value, {
41
42
  "current-page": i.value,
42
- "page-size": u.value,
43
- onCurrentChange: s,
44
- onSizeChange: l
45
- }), null, 16, ["current-page", "page-size"])) : C("", !0);
43
+ "page-size": g.value,
44
+ onCurrentChange: m,
45
+ onSizeChange: f
46
+ }), null, 16, ["class", "current-page", "page-size"])) : N("", !0);
46
47
  };
47
48
  }
48
49
  });
@@ -2,9 +2,15 @@
2
2
  * 标签页(el-tabs 封装):tabs schema 驱动,每 tab 内容经具名插槽(#tab.key)渲染
3
3
  * EP 映射:tab.key→el-tab-pane name、tab.title→label、lazyLoad→lazy
4
4
  *
5
- * 注意:这里必须 import 组件本体,不能写 `h('el-tabs')` ——h() 收到字符串只会当成
5
+ * 注意 1:这里必须 import 组件本体,不能写 `h('el-tabs')` ——h() 收到字符串只会当成
6
6
  * 原生标签(shapeFlag=ELEMENT),既不解析组件、也不会渲染出页签,且没有任何告警。
7
7
  * 只有模板里的 `<el-tabs>` 才会被编译成 resolveComponent。
8
+ *
9
+ * 注意 2:这里用 `withCtx()` 包住手写的 slot 函数。模板编译出的组件 slot 都是 withCtx
10
+ * 包装过的(`_n = true`,自带渲染上下文),而 `h(Comp, props, { default: () => [...] })`
11
+ * 里手写的裸函数没有上下文:EP 的 ElTabs / ElTabPane 在各自 render 里调用它时,
12
+ * Vue 会告警 `Slot "default" invoked outside of the render function`,且 slot 内的
13
+ * 响应式依赖不会被追踪(数据变了页签内容不更新)。withCtx 补齐上下文后与模板写法等价。
8
14
  */
9
15
  declare const _default: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
10
16
  tabs: {
@@ -1,6 +1,6 @@
1
- import { ElTabs as s, ElTabPane as b } from "element-plus";
2
- import { defineComponent as u, h as r, renderSlot as l } from "vue";
3
- const p = u({
1
+ import { ElTabs as b, ElTabPane as i } from "element-plus";
2
+ import { defineComponent as m, getCurrentInstance as c, h as r, withCtx as o, renderSlot as l } from "vue";
3
+ const z = m({
4
4
  name: "ZlTabs",
5
5
  inheritAttrs: !1,
6
6
  props: {
@@ -9,41 +9,47 @@ const p = u({
9
9
  fit: Boolean,
10
10
  darkNav: { type: Boolean, default: !0 }
11
11
  },
12
- setup(a, { slots: e, attrs: d }) {
12
+ setup(t, { slots: e, attrs: d }) {
13
+ const n = c();
13
14
  return () => r("div", { class: "zl-tabs-wrap" }, [
14
15
  r(
15
- s,
16
+ b,
16
17
  {
17
18
  class: [
18
19
  "zl-tabs",
19
20
  {
20
- "zl-tabs-no-border": !a.border,
21
- "zl-tabs-fit": a.fit,
22
- "zl-tabs-dark-nav": a.darkNav
21
+ "zl-tabs-no-border": !t.border,
22
+ "zl-tabs-fit": t.fit,
23
+ "zl-tabs-dark-nav": t.darkNav
23
24
  }
24
25
  ],
25
26
  ...d
26
27
  },
27
28
  {
28
- default: () => [
29
- ...a.tabs.map((n) => {
30
- const { key: t, title: o, ...f } = n;
31
- return r(
32
- b,
33
- {
34
- key: t,
35
- name: t,
36
- label: o,
37
- lazy: !0,
38
- ...f
39
- },
40
- {
41
- default: () => l(e, t, { tab: n })
42
- }
43
- );
44
- }),
45
- l(e, "default")
46
- ]
29
+ default: o(
30
+ () => [
31
+ ...t.tabs.map((s) => {
32
+ const { key: a, title: f, ...u } = s;
33
+ return r(
34
+ i,
35
+ {
36
+ key: a,
37
+ name: a,
38
+ label: f,
39
+ lazy: !0,
40
+ ...u
41
+ },
42
+ {
43
+ // 必须返回数组:ElTabPane 用 renderSlot 渲染内容,内部 ensureValidVNode
44
+ // 会对返回值调用 .some(),拿到单个 vnode 会直接抛 TypeError。
45
+ default: o(() => [l(e, a, { tab: s })], n)
46
+ }
47
+ );
48
+ }),
49
+ l(e, "default")
50
+ ],
51
+ n
52
+ )
47
53
  }
48
54
  ),
49
55
  l(e, "extra")
@@ -51,6 +57,6 @@ const p = u({
51
57
  }
52
58
  });
53
59
  export {
54
- p as default
60
+ z as default
55
61
  };
56
62
  //# sourceMappingURL=index.vue.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zl-ui-kit/components",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "type": "module",
5
5
  "description": "ZL UI 业务组件库(Element Plus 体系,Zl 前缀)——首批:Icon/AutoTooltip/Tag/CornerTag/Text/Title/Copy/Empty/Pagination/DictTag",
6
6
  "license": "MIT",
@@ -39,9 +39,9 @@
39
39
  "file-type": "^20.4.1",
40
40
  "dt-sql-parser": "^4.3.1",
41
41
  "sql-formatter": "^15.4.2",
42
- "@zl-ui-kit/composables": "0.6.1",
43
- "@zl-ui-kit/utils": "0.6.1",
44
- "@zl-ui-kit/icons": "0.6.1"
42
+ "@zl-ui-kit/composables": "0.6.3",
43
+ "@zl-ui-kit/utils": "0.6.3",
44
+ "@zl-ui-kit/icons": "0.6.3"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@vueuse/core": "^12.3.0",
@@ -98,10 +98,10 @@
98
98
  "@vue-office/pdf": "^2.0.10",
99
99
  "@vue-office/pptx": "1.0.1",
100
100
  "echarts": "^5.6.0",
101
- "@jichuang/tsconfig": "1.0.0",
102
101
  "@jichuang/vite-config": "1.0.0",
103
- "@zl-ui-kit/theme": "0.6.1",
104
- "@jichuang/eslint-config": "1.0.0"
102
+ "@jichuang/eslint-config": "1.0.0",
103
+ "@zl-ui-kit/theme": "0.6.3",
104
+ "@jichuang/tsconfig": "1.0.0"
105
105
  },
106
106
  "repository": {
107
107
  "type": "git",