@qynpm/ui 1.0.27 → 1.0.29
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 +401 -313
- package/dist/index.cjs +6 -3
- package/dist/index.mjs +80 -61
- package/dist/qy-action-bar/index.cjs +1 -1
- package/dist/qy-action-bar/index.mjs +1 -1
- package/dist/qy-aside/index.cjs +1 -0
- package/dist/qy-aside/index.mjs +7 -0
- package/dist/qy-button/index.cjs +1 -1
- package/dist/qy-button/index.mjs +1 -1
- package/dist/qy-cascader/index.cjs +1 -1
- package/dist/qy-cascader/index.mjs +1 -1
- package/dist/qy-col/index.cjs +1 -0
- package/dist/qy-col/index.mjs +7 -0
- package/dist/qy-collapse/index.cjs +1 -1
- package/dist/qy-collapse/index.mjs +1 -1
- package/dist/qy-container/index.cjs +1 -0
- package/dist/qy-container/index.mjs +7 -0
- package/dist/qy-date-picker/index.cjs +1 -1
- package/dist/qy-date-picker/index.mjs +1 -1
- package/dist/qy-dialog/index.cjs +1 -1
- package/dist/qy-dialog/index.mjs +1 -1
- package/dist/qy-dropdown/index.cjs +1 -1
- package/dist/qy-dropdown/index.mjs +1 -1
- package/dist/qy-form-section/index.cjs +1 -1
- package/dist/qy-form-section/index.mjs +2 -2
- package/dist/qy-fullscreen/index.cjs +1 -0
- package/dist/qy-fullscreen/index.mjs +7 -0
- package/dist/qy-icon/index.cjs +1 -0
- package/dist/qy-icon/index.mjs +11 -0
- package/dist/qy-icon-picker/index.cjs +5 -0
- package/dist/qy-icon-picker/index.mjs +11 -0
- package/dist/qy-image/index.cjs +1 -1
- package/dist/qy-image/index.mjs +1 -1
- package/dist/qy-image-upload/index.cjs +1 -1
- package/dist/qy-image-upload/index.mjs +1 -1
- package/dist/qy-input/index.cjs +1 -1
- package/dist/qy-input/index.mjs +4 -5
- package/dist/qy-input-number/index.cjs +3 -1
- package/dist/qy-input-number/index.mjs +3 -1
- package/dist/qy-legacy-selection-dialog/index.cjs +1 -1
- package/dist/qy-legacy-selection-dialog/index.mjs +1 -1
- package/dist/qy-link/index.cjs +1 -1
- package/dist/qy-link/index.mjs +1 -1
- package/dist/qy-main/index.cjs +1 -0
- package/dist/qy-main/index.mjs +7 -0
- package/dist/qy-menu-actions/index.cjs +1 -1
- package/dist/qy-menu-actions/index.mjs +1 -1
- package/dist/qy-money-input/index.cjs +1 -1
- package/dist/qy-money-input/index.mjs +1 -1
- package/dist/qy-popover/index.cjs +1 -1
- package/dist/qy-popover/index.mjs +1 -1
- package/dist/qy-record-quote-search/index.cjs +1 -1
- package/dist/qy-record-quote-search/index.mjs +1 -1
- package/dist/qy-remark-image/index.cjs +1 -1
- package/dist/qy-remark-image/index.mjs +1 -1
- package/dist/qy-remote-select/index.cjs +1 -1
- package/dist/qy-remote-select/index.mjs +1 -1
- package/dist/qy-row/index.cjs +1 -0
- package/dist/qy-row/index.mjs +7 -0
- package/dist/qy-scrollbar/index.cjs +1 -1
- package/dist/qy-scrollbar/index.mjs +1 -1
- package/dist/qy-search-input/index.cjs +1 -1
- package/dist/qy-search-input/index.mjs +1 -1
- package/dist/qy-select/index.cjs +1 -1
- package/dist/qy-select/index.mjs +1 -1
- package/dist/qy-selection-dialog/index.cjs +1 -1
- package/dist/qy-selection-dialog/index.mjs +1 -1
- package/dist/qy-statistic/index.cjs +1 -0
- package/dist/qy-statistic/index.mjs +7 -0
- package/dist/qy-tabs/index.cjs +1 -1
- package/dist/qy-tabs/index.mjs +1 -1
- package/dist/qy-tooltip/index.cjs +1 -1
- package/dist/qy-tooltip/index.mjs +1 -1
- package/dist/qy-tree/index.cjs +1 -1
- package/dist/qy-tree/index.mjs +1 -1
- package/dist/qy-upload/index.cjs +1 -1
- package/dist/qy-upload/index.mjs +1 -1
- package/dist/shared/index-4cLP6sJP.cjs +1 -0
- package/dist/shared/index-AirHUQwm.cjs +1 -0
- package/dist/shared/index-B6xIO6kg.cjs +1 -0
- package/dist/shared/index-BNQxyXzB.cjs +1 -0
- package/dist/shared/{index-T9Om5Csd.mjs → index-BQj_q6rA.mjs} +999 -972
- package/dist/shared/{index-BbDWedqW.mjs → index-BSxEaYHx.mjs} +10 -10
- package/dist/shared/index-Bs6yjkZ5.cjs +1 -0
- package/dist/shared/{index.vue_vue_type_style_index_0_lang-aqtfjdVm.mjs → index-C2n0R6rA.mjs} +33 -31
- package/dist/shared/{index-CYn7TvRx.mjs → index-CR6yQfR2.mjs} +1 -1
- package/dist/shared/index-CaNxcPSD.mjs +254 -0
- package/dist/shared/index-Czrv5jUt.mjs +222 -0
- package/dist/shared/{index-DEkng5wh.cjs → index-YM4DcbBZ.cjs} +1 -1
- package/dist/shared/index-qwzyfx9S.cjs +1 -0
- package/dist/shared/index-xuTVtF4x.mjs +6 -0
- package/dist/shared/index.vue_vue_type_script_lang-8AT3-xU-.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-BaIOvoQn.mjs +43 -0
- package/dist/shared/index.vue_vue_type_script_lang-BgapsQjI.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-Bk0kLg5l.mjs +34 -0
- package/dist/shared/index.vue_vue_type_script_lang-BnmY1ndj.mjs +77 -0
- package/dist/shared/index.vue_vue_type_script_lang-By3jd4gw.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-CCL57H5c.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-CKZUcaZ5.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-CWnNQBPN.mjs +31 -0
- package/dist/shared/index.vue_vue_type_script_lang-CfjfZCT3.cjs +1 -0
- package/dist/shared/index.vue_vue_type_script_lang-ChS-3_vl.mjs +43 -0
- package/dist/shared/index.vue_vue_type_script_lang-DRvk4-_O.mjs +43 -0
- package/dist/shared/index.vue_vue_type_script_setup_true_lang-BXnZt9UT.mjs +63 -0
- package/dist/shared/index.vue_vue_type_script_setup_true_lang-D7BlbHN5.cjs +1 -0
- package/dist/shared/index.vue_vue_type_style_index_0_lang-BJXS2dVf.mjs +126 -0
- package/dist/shared/index.vue_vue_type_style_index_0_lang-BTqKOZ4L.cjs +1 -0
- package/dist/shared/index.vue_vue_type_style_index_0_lang-Bc-Ya_zS.mjs +286 -0
- package/dist/shared/index.vue_vue_type_style_index_0_lang-M0qKRXd2.cjs +1 -0
- package/index.d.ts +373 -272
- package/package.json +55 -1
- package/qy-aside/index.d.ts +47 -0
- package/qy-col/index.d.ts +65 -0
- package/qy-container/index.d.ts +49 -0
- package/qy-fullscreen/index.d.ts +72 -0
- package/qy-icon/index.d.ts +105 -0
- package/qy-icon-picker/index.d.ts +56 -0
- package/qy-main/index.d.ts +45 -0
- package/qy-row/index.d.ts +59 -0
- package/qy-statistic/index.d.ts +61 -0
- package/dist/shared/index-CnZNcnTs.cjs +0 -1
- package/dist/shared/index-ceTTRCGJ.cjs +0 -1
- package/dist/shared/index.vue_vue_type_script_setup_true_lang-CmQLfhRo.cjs +0 -1
- package/dist/shared/index.vue_vue_type_script_setup_true_lang-DobP199g.mjs +0 -63
- package/dist/shared/index.vue_vue_type_style_index_0_lang-C6urLjSf.cjs +0 -1
- package/dist/shared/index.vue_vue_type_style_index_0_lang-CVxWn-Vs.mjs +0 -121
- package/dist/shared/index.vue_vue_type_style_index_0_lang-Dm1r1WBK.cjs +0 -1
- /package/dist/shared/{index-CpvFUems.cjs → index-C509sCx9.cjs} +0 -0
- /package/dist/shared/{index-DEZF-Fkt.mjs → index-CtF8Nz3g.mjs} +0 -0
- /package/dist/shared/{index-seQHtqdh.mjs → index-D0L-u1nt.mjs} +0 -0
- /package/dist/shared/{index-DIs6iPjF.cjs → index-D30m6gKz.cjs} +0 -0
- /package/dist/shared/{index-BDdhBEFr.cjs → index-D7A0RzWH.cjs} +0 -0
- /package/dist/shared/{index-hEy-3mcr.mjs → index-DJT4yz0h.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-CWz689KH.cjs → index.vue_vue_type_style_index_0_lang-1cTut9Ql.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-DVqGYfD9.mjs → index.vue_vue_type_style_index_0_lang-B0CXLnL1.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-DOfJV2oz.cjs → index.vue_vue_type_style_index_0_lang-CC2-igG3.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-B-FeHatv.mjs → index.vue_vue_type_style_index_0_lang-CJaF7Ecm.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-DIMCVnQm.mjs → index.vue_vue_type_style_index_0_lang-CPxbKjvY.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-CJhIFeBC.mjs → index.vue_vue_type_style_index_0_lang-CcVf5MXE.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-Cn3P9d4L.cjs → index.vue_vue_type_style_index_0_lang-CqKs13Fp.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-CnL4aeg1.cjs → index.vue_vue_type_style_index_0_lang-D9DraThL.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-Cb4yMk-r.cjs → index.vue_vue_type_style_index_0_lang-DFAaBzkW.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-D1kpIund.mjs → index.vue_vue_type_style_index_0_lang-DSur831A.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-BXTkWo5P.cjs → index.vue_vue_type_style_index_0_lang-DUgOOzEZ.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-C1n-zAZh.mjs → index.vue_vue_type_style_index_0_lang-DWiolYb3.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-DzfGx6ce.mjs → index.vue_vue_type_style_index_0_lang-Dc84vYSd.mjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-BtbAft4t.cjs → index.vue_vue_type_style_index_0_lang-DccRGtZE.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-Q2gFF0PP.cjs → index.vue_vue_type_style_index_0_lang-RiwA2WPO.cjs} +0 -0
- /package/dist/shared/{index.vue_vue_type_style_index_0_lang-dLpQXf6x.mjs → index.vue_vue_type_style_index_0_lang-gs0YJI91.mjs} +0 -0
package/README.md
CHANGED
|
@@ -37,24 +37,26 @@ app.use(QyUI)
|
|
|
37
37
|
import {
|
|
38
38
|
QyUpload,
|
|
39
39
|
QyFilePicker,
|
|
40
|
-
QySwitch,
|
|
41
|
-
QyTag,
|
|
42
|
-
QyBadge,
|
|
43
|
-
QyCascader,
|
|
44
|
-
QyTooltip,
|
|
45
|
-
QyPopover,
|
|
46
|
-
QySkeleton,
|
|
47
|
-
QySkeletonItem,
|
|
48
|
-
QyTabs,
|
|
49
|
-
QyTabPane,
|
|
50
|
-
QySteps,
|
|
51
|
-
QyStep,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
40
|
+
QySwitch,
|
|
41
|
+
QyTag,
|
|
42
|
+
QyBadge,
|
|
43
|
+
QyCascader,
|
|
44
|
+
QyTooltip,
|
|
45
|
+
QyPopover,
|
|
46
|
+
QySkeleton,
|
|
47
|
+
QySkeletonItem,
|
|
48
|
+
QyTabs,
|
|
49
|
+
QyTabPane,
|
|
50
|
+
QySteps,
|
|
51
|
+
QyStep,
|
|
52
|
+
QyIcon,
|
|
53
|
+
QyIconPicker,
|
|
54
|
+
QyLink,
|
|
55
|
+
QyDivider,
|
|
56
|
+
QyEmpty,
|
|
57
|
+
QyScrollbar,
|
|
58
|
+
QyProgress,
|
|
59
|
+
QyImage,
|
|
58
60
|
QyImagePreview,
|
|
59
61
|
QyImageUpload,
|
|
60
62
|
QyDialog,
|
|
@@ -96,29 +98,30 @@ import QyFormSection from '@qynpm/ui/qy-form-section'
|
|
|
96
98
|
import QyActionBar from '@qynpm/ui/qy-action-bar'
|
|
97
99
|
import QyButton from '@qynpm/ui/qy-button'
|
|
98
100
|
import QyDropdown from '@qynpm/ui/qy-dropdown'
|
|
101
|
+
import QyIconPicker from '@qynpm/ui/qy-icon-picker'
|
|
99
102
|
import QySearchInput from '@qynpm/ui/qy-search-input'
|
|
100
103
|
import QyRecordQuoteSearch from '@qynpm/ui/qy-record-quote-search'
|
|
101
104
|
import QyDialog from '@qynpm/ui/qy-dialog'
|
|
102
105
|
import QyUpload from '@qynpm/ui/qy-upload'
|
|
103
106
|
import QyFilePicker from '@qynpm/ui/qy-file-picker'
|
|
104
107
|
import QySwitch from '@qynpm/ui/qy-switch'
|
|
105
|
-
import QyTag from '@qynpm/ui/qy-tag'
|
|
106
|
-
import QyBadge from '@qynpm/ui/qy-badge'
|
|
107
|
-
import QyCascader from '@qynpm/ui/qy-cascader'
|
|
108
|
-
import QyTree from '@qynpm/ui/qy-tree'
|
|
109
|
-
import QyTooltip from '@qynpm/ui/qy-tooltip'
|
|
110
|
-
import QyPopover from '@qynpm/ui/qy-popover'
|
|
111
|
-
import QySkeleton from '@qynpm/ui/qy-skeleton'
|
|
112
|
-
import QySkeletonItem from '@qynpm/ui/qy-skeleton-item'
|
|
113
|
-
import QyTabs from '@qynpm/ui/qy-tabs'
|
|
114
|
-
import QyTabPane from '@qynpm/ui/qy-tab-pane'
|
|
115
|
-
import QySteps from '@qynpm/ui/qy-steps'
|
|
116
|
-
import QyStep from '@qynpm/ui/qy-step'
|
|
117
|
-
import QyLink from '@qynpm/ui/qy-link'
|
|
118
|
-
import QyEmpty from '@qynpm/ui/qy-empty'
|
|
119
|
-
import QyScrollbar from '@qynpm/ui/qy-scrollbar'
|
|
120
|
-
import QyProgress from '@qynpm/ui/qy-progress'
|
|
121
|
-
import QyImage from '@qynpm/ui/qy-image'
|
|
108
|
+
import QyTag from '@qynpm/ui/qy-tag'
|
|
109
|
+
import QyBadge from '@qynpm/ui/qy-badge'
|
|
110
|
+
import QyCascader from '@qynpm/ui/qy-cascader'
|
|
111
|
+
import QyTree from '@qynpm/ui/qy-tree'
|
|
112
|
+
import QyTooltip from '@qynpm/ui/qy-tooltip'
|
|
113
|
+
import QyPopover from '@qynpm/ui/qy-popover'
|
|
114
|
+
import QySkeleton from '@qynpm/ui/qy-skeleton'
|
|
115
|
+
import QySkeletonItem from '@qynpm/ui/qy-skeleton-item'
|
|
116
|
+
import QyTabs from '@qynpm/ui/qy-tabs'
|
|
117
|
+
import QyTabPane from '@qynpm/ui/qy-tab-pane'
|
|
118
|
+
import QySteps from '@qynpm/ui/qy-steps'
|
|
119
|
+
import QyStep from '@qynpm/ui/qy-step'
|
|
120
|
+
import QyLink from '@qynpm/ui/qy-link'
|
|
121
|
+
import QyEmpty from '@qynpm/ui/qy-empty'
|
|
122
|
+
import QyScrollbar from '@qynpm/ui/qy-scrollbar'
|
|
123
|
+
import QyProgress from '@qynpm/ui/qy-progress'
|
|
124
|
+
import QyImage from '@qynpm/ui/qy-image'
|
|
122
125
|
import QyImagePreview from '@qynpm/ui/qy-image-preview'
|
|
123
126
|
import QyImageUpload from '@qynpm/ui/qy-image-upload'
|
|
124
127
|
import QyRemarkImage from '@qynpm/ui/qy-remark-image'
|
|
@@ -147,81 +150,81 @@ pnpm install --frozen-lockfile --ignore-scripts
|
|
|
147
150
|
|
|
148
151
|
不要依赖本机残留的 `packages/ui/dist`。如果后续希望免 build 联调,应在消费项目显式配置源码 alias,而不是把包 export 指向未发布源码。
|
|
149
152
|
|
|
150
|
-
## 组件说明
|
|
151
|
-
|
|
152
|
-
### `QyEmpty`
|
|
153
|
-
|
|
154
|
-
`QyEmpty` 使用 Element Plus `ElEmpty` 渲染只读空状态,支持 `image`、`imageSize` 和 `description` 属性,以及 `image`、`description`、默认三个原生插槽。组件不判断数据,不内置加载、错误、重试或按钮点击逻辑。
|
|
155
|
-
|
|
156
|
-
```vue
|
|
157
|
-
<QyEmpty description="暂无记录">
|
|
158
|
-
<template #image><img src="/empty.svg" alt="暂无记录" /></template>
|
|
159
|
-
<template #default>
|
|
160
|
-
<QyButton @click="createRecord">新建记录</QyButton>
|
|
161
|
-
</template>
|
|
162
|
-
</QyEmpty>
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
`imageSize` 直接沿用 Element Plus 的数值语义;`image` / `description` 插槽遵循 Element Plus 的属性优先级。`class`、`style`、`id`、`title`、`role`、`data-*` 和 `aria-*` 安全透传到根节点,消费者传入的宽度、高度、margin、padding 均可覆盖,事件监听器和底层实例不对外暴露。
|
|
166
|
-
|
|
167
|
-
### `QyScrollbar`
|
|
168
|
-
|
|
169
|
-
`QyScrollbar` 以 Element Plus 2.14.3 的 `ElScrollbar` 作为唯一滚动实现。默认插槽直接承载滚动内容,支持固定高度、最大高度、纵向/横向滚动、原生/自定义滚动模式、`always`、滚动层样式与类名,以及 `tabindex`、`id`、`role`、`ariaLabel` 和 `ariaOrientation`。
|
|
170
|
-
|
|
171
|
-
```vue
|
|
172
|
-
<QyScrollbar height="240px" max-height="360px" always aria-label="消息列表">
|
|
173
|
-
<div v-for="message in messages" :key="message.id">{{ message.text }}</div>
|
|
174
|
-
</QyScrollbar>
|
|
175
|
-
|
|
176
|
-
<QyScrollbar
|
|
177
|
-
height="160px"
|
|
178
|
-
:distance="12"
|
|
179
|
-
@scroll="handleScroll"
|
|
180
|
-
@end-reached="loadMore"
|
|
181
|
-
>
|
|
182
|
-
<div class="wide-content">横向内容由局部容器滚动</div>
|
|
183
|
-
</QyScrollbar>
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
`scroll` 只返回只读快照 `{ scrollTop, scrollLeft }`;`end-reached` 返回 `top`、`bottom`、`left` 或 `right`,阈值由 Element Plus 的 `distance` 处理。实例只公开 `scrollTo(x, y)`、`scrollTo(options)`、`setScrollTop(value)`、`setScrollLeft(value)` 和 `update()`,挂载前或卸载后调用均为空操作。不显式暴露内部 `ElScrollbar` 实例、`wrapRef`、`handleScroll` 或 DOM ref;Vue 公共实例自带的 `$el` 不属于适配器承诺的稳定 API,消费者不得依赖。
|
|
187
|
-
|
|
188
|
-
根节点仅安全透传 `class`、`style`、`title`、`data-*` 和不冲突的 `aria-*`;旧的 `width`、`vertical` 属性及未知 `on*` 监听器会被过滤。自定义模式只映射 `--el-scrollbar-bg-color` / `--el-scrollbar-hover-bg-color` 到 admin-theme 的 `--qy-scrollbar-thumb` / `--qy-scrollbar-thumb-hover`,不覆盖 Element Plus 滑块尺寸、定位、圆角、显隐或动画;原生模式继续使用 admin-theme 的全局原生滚动条规则。
|
|
189
|
-
|
|
190
|
-
### `QyCascader`
|
|
191
|
-
|
|
192
|
-
`QyCascader` 是 Element Plus Cascader 的受控适配器,保留单值、路径值和多选值的原始形状,不自动改写业务 options。支持 `expandTrigger`、`multiple`、`checkStrictly`、`emitPath`、`lazyLoad`、过滤、折叠标签、浮层定位、虚拟滚动及键盘操作。
|
|
193
|
-
|
|
194
|
-
节点默认插槽、`suggestion-item`、过滤、懒加载以及 `disabled` / `leaf` 回调接收只读的 `QyCascaderNodeSnapshot`,不会泄漏 Element Plus Node 或组件实例。组件仅暴露 `focus()`、`blur()`、`open()`、`close()` 四个方法。
|
|
195
|
-
|
|
196
|
-
```vue
|
|
197
|
-
<QyCascader
|
|
198
|
-
v-model="value"
|
|
199
|
-
:options="options"
|
|
200
|
-
:props="{ emitPath: true, checkStrictly: true }"
|
|
201
|
-
filterable
|
|
202
|
-
placeholder="选择地区"
|
|
203
|
-
/>
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
完整交互 playground 覆盖基础/路径、严格检查、多选折叠、过滤、懒加载、禁用、插槽、键盘、浮层和移动端 40px 触控目标。
|
|
207
|
-
|
|
208
|
-
### `QyTree`
|
|
209
|
-
|
|
210
|
-
`QyTree` 以 Element Plus `ElTree` 作为唯一的树结构、勾选/半选、键盘、懒加载和拖拽实现。`data` 始终是业务唯一数据权威;节点回调、事件、默认插槽和 `QyTreeRef.getNode()` 都返回当前只读 Qy 快照,不泄漏 Element Node、Store、组件实例或私有 DOM。
|
|
211
|
-
|
|
212
|
-
```vue
|
|
213
|
-
<QyTree
|
|
214
|
-
ref="treeRef"
|
|
215
|
-
:data="departments"
|
|
216
|
-
node-key="id"
|
|
217
|
-
show-checkbox
|
|
218
|
-
default-expand-all
|
|
219
|
-
:filter-node-method="(value, data, node) => node.label.includes(value)"
|
|
220
|
-
@check="(_, info) => console.log(info.checkedKeys, info.halfCheckedKeys)"
|
|
221
|
-
/>
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
支持字段映射、展开/当前节点、联动和严格勾选、筛选、懒加载、拖拽、自定义节点插槽及本地键盘导航。公开引用仅包含筛选、当前节点、节点路径、勾选/半选读取与设置方法;不提供 `append`、`remove`、`insert` 或 `updateKeyChildren` 等内部数据修改方法。键值方法需要 `nodeKey`;未提供筛选函数时调用 `filter()` 会抛出 QyTree 自有错误。
|
|
153
|
+
## 组件说明
|
|
154
|
+
|
|
155
|
+
### `QyEmpty`
|
|
156
|
+
|
|
157
|
+
`QyEmpty` 使用 Element Plus `ElEmpty` 渲染只读空状态,支持 `image`、`imageSize` 和 `description` 属性,以及 `image`、`description`、默认三个原生插槽。组件不判断数据,不内置加载、错误、重试或按钮点击逻辑。
|
|
158
|
+
|
|
159
|
+
```vue
|
|
160
|
+
<QyEmpty description="暂无记录">
|
|
161
|
+
<template #image><img src="/empty.svg" alt="暂无记录" /></template>
|
|
162
|
+
<template #default>
|
|
163
|
+
<QyButton @click="createRecord">新建记录</QyButton>
|
|
164
|
+
</template>
|
|
165
|
+
</QyEmpty>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`imageSize` 直接沿用 Element Plus 的数值语义;`image` / `description` 插槽遵循 Element Plus 的属性优先级。`class`、`style`、`id`、`title`、`role`、`data-*` 和 `aria-*` 安全透传到根节点,消费者传入的宽度、高度、margin、padding 均可覆盖,事件监听器和底层实例不对外暴露。
|
|
169
|
+
|
|
170
|
+
### `QyScrollbar`
|
|
171
|
+
|
|
172
|
+
`QyScrollbar` 以 Element Plus 2.14.3 的 `ElScrollbar` 作为唯一滚动实现。默认插槽直接承载滚动内容,支持固定高度、最大高度、纵向/横向滚动、原生/自定义滚动模式、`always`、滚动层样式与类名,以及 `tabindex`、`id`、`role`、`ariaLabel` 和 `ariaOrientation`。
|
|
173
|
+
|
|
174
|
+
```vue
|
|
175
|
+
<QyScrollbar height="240px" max-height="360px" always aria-label="消息列表">
|
|
176
|
+
<div v-for="message in messages" :key="message.id">{{ message.text }}</div>
|
|
177
|
+
</QyScrollbar>
|
|
178
|
+
|
|
179
|
+
<QyScrollbar
|
|
180
|
+
height="160px"
|
|
181
|
+
:distance="12"
|
|
182
|
+
@scroll="handleScroll"
|
|
183
|
+
@end-reached="loadMore"
|
|
184
|
+
>
|
|
185
|
+
<div class="wide-content">横向内容由局部容器滚动</div>
|
|
186
|
+
</QyScrollbar>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
`scroll` 只返回只读快照 `{ scrollTop, scrollLeft }`;`end-reached` 返回 `top`、`bottom`、`left` 或 `right`,阈值由 Element Plus 的 `distance` 处理。实例只公开 `scrollTo(x, y)`、`scrollTo(options)`、`setScrollTop(value)`、`setScrollLeft(value)` 和 `update()`,挂载前或卸载后调用均为空操作。不显式暴露内部 `ElScrollbar` 实例、`wrapRef`、`handleScroll` 或 DOM ref;Vue 公共实例自带的 `$el` 不属于适配器承诺的稳定 API,消费者不得依赖。
|
|
190
|
+
|
|
191
|
+
根节点仅安全透传 `class`、`style`、`title`、`data-*` 和不冲突的 `aria-*`;旧的 `width`、`vertical` 属性及未知 `on*` 监听器会被过滤。自定义模式只映射 `--el-scrollbar-bg-color` / `--el-scrollbar-hover-bg-color` 到 admin-theme 的 `--qy-scrollbar-thumb` / `--qy-scrollbar-thumb-hover`,不覆盖 Element Plus 滑块尺寸、定位、圆角、显隐或动画;原生模式继续使用 admin-theme 的全局原生滚动条规则。
|
|
192
|
+
|
|
193
|
+
### `QyCascader`
|
|
194
|
+
|
|
195
|
+
`QyCascader` 是 Element Plus Cascader 的受控适配器,保留单值、路径值和多选值的原始形状,不自动改写业务 options。支持 `expandTrigger`、`multiple`、`checkStrictly`、`emitPath`、`lazyLoad`、过滤、折叠标签、浮层定位、虚拟滚动及键盘操作。
|
|
196
|
+
|
|
197
|
+
节点默认插槽、`suggestion-item`、过滤、懒加载以及 `disabled` / `leaf` 回调接收只读的 `QyCascaderNodeSnapshot`,不会泄漏 Element Plus Node 或组件实例。组件仅暴露 `focus()`、`blur()`、`open()`、`close()` 四个方法。
|
|
198
|
+
|
|
199
|
+
```vue
|
|
200
|
+
<QyCascader
|
|
201
|
+
v-model="value"
|
|
202
|
+
:options="options"
|
|
203
|
+
:props="{ emitPath: true, checkStrictly: true }"
|
|
204
|
+
filterable
|
|
205
|
+
placeholder="选择地区"
|
|
206
|
+
/>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
完整交互 playground 覆盖基础/路径、严格检查、多选折叠、过滤、懒加载、禁用、插槽、键盘、浮层和移动端 40px 触控目标。
|
|
210
|
+
|
|
211
|
+
### `QyTree`
|
|
212
|
+
|
|
213
|
+
`QyTree` 以 Element Plus `ElTree` 作为唯一的树结构、勾选/半选、键盘、懒加载和拖拽实现。`data` 始终是业务唯一数据权威;节点回调、事件、默认插槽和 `QyTreeRef.getNode()` 都返回当前只读 Qy 快照,不泄漏 Element Node、Store、组件实例或私有 DOM。
|
|
214
|
+
|
|
215
|
+
```vue
|
|
216
|
+
<QyTree
|
|
217
|
+
ref="treeRef"
|
|
218
|
+
:data="departments"
|
|
219
|
+
node-key="id"
|
|
220
|
+
show-checkbox
|
|
221
|
+
default-expand-all
|
|
222
|
+
:filter-node-method="(value, data, node) => node.label.includes(value)"
|
|
223
|
+
@check="(_, info) => console.log(info.checkedKeys, info.halfCheckedKeys)"
|
|
224
|
+
/>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
支持字段映射、展开/当前节点、联动和严格勾选、筛选、懒加载、拖拽、自定义节点插槽及本地键盘导航。公开引用仅包含筛选、当前节点、节点路径、勾选/半选读取与设置方法;不提供 `append`、`remove`、`insert` 或 `updateKeyChildren` 等内部数据修改方法。键值方法需要 `nodeKey`;未提供筛选函数时调用 `filter()` 会抛出 QyTree 自有错误。
|
|
225
228
|
|
|
226
229
|
### `QyFilePicker`
|
|
227
230
|
|
|
@@ -268,26 +271,26 @@ pnpm install --frozen-lockfile --ignore-scripts
|
|
|
268
271
|
</QyTag>
|
|
269
272
|
```
|
|
270
273
|
|
|
271
|
-
`disabled` 会设置 `aria-disabled="true"`、隐藏关闭按钮并抑制 `click` / `close`;非禁用状态下这两个事件各发出一次 `MouseEvent`。支持 `class`、`style`、`title`、`role`、`data-*`、`aria-*` 安全属性,不公开 `color`、`hit`、`disableTransitions` 或底层 Element Plus 实例。QyTag 不是按钮,不新增键盘按钮语义;需要动作语义时使用 `QyButton`。
|
|
272
|
-
|
|
273
|
-
### `QyBadge`
|
|
274
|
-
|
|
275
|
-
`QyBadge` 基于 Element Plus `ElBadge` 渲染只读徽标,不管理未读状态、通知或点击逻辑。支持数字与文字、数字上限、圆点、隐藏、零值策略、五种语义类型、自定义颜色、偏移以及徽标内部样式和类名。
|
|
276
|
-
|
|
277
|
-
```vue
|
|
278
|
-
<QyBadge :value="unreadCount" :max="99" type="danger">
|
|
279
|
-
<QyButton>消息</QyButton>
|
|
280
|
-
</QyBadge>
|
|
281
|
-
|
|
282
|
-
<QyBadge value="!" is-dot>
|
|
283
|
-
<span>待处理</span>
|
|
284
|
-
<template #content="{ value }">数量:{{ value }}</template>
|
|
285
|
-
</QyBadge>
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
`value` 默认为空字符串,`max` 默认为 `99`,`type` 默认为 `danger`,`showZero` 默认为 `true`,`offset` 默认为 `[0, 0]`。上限只作用于数字,字符串原样显示;`content` 插槽收到经过圆点和上限规则处理后的只读 `{ value: string }`,组件公开的 `content` 也只有最终显示内容,不暴露 Element Plus 实例。根节点安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,不声明事件、`v-model` 或尺寸参数。
|
|
289
|
-
|
|
290
|
-
### `QyTooltip`
|
|
274
|
+
`disabled` 会设置 `aria-disabled="true"`、隐藏关闭按钮并抑制 `click` / `close`;非禁用状态下这两个事件各发出一次 `MouseEvent`。支持 `class`、`style`、`title`、`role`、`data-*`、`aria-*` 安全属性,不公开 `color`、`hit`、`disableTransitions` 或底层 Element Plus 实例。QyTag 不是按钮,不新增键盘按钮语义;需要动作语义时使用 `QyButton`。
|
|
275
|
+
|
|
276
|
+
### `QyBadge`
|
|
277
|
+
|
|
278
|
+
`QyBadge` 基于 Element Plus `ElBadge` 渲染只读徽标,不管理未读状态、通知或点击逻辑。支持数字与文字、数字上限、圆点、隐藏、零值策略、五种语义类型、自定义颜色、偏移以及徽标内部样式和类名。
|
|
279
|
+
|
|
280
|
+
```vue
|
|
281
|
+
<QyBadge :value="unreadCount" :max="99" type="danger">
|
|
282
|
+
<QyButton>消息</QyButton>
|
|
283
|
+
</QyBadge>
|
|
284
|
+
|
|
285
|
+
<QyBadge value="!" is-dot>
|
|
286
|
+
<span>待处理</span>
|
|
287
|
+
<template #content="{ value }">数量:{{ value }}</template>
|
|
288
|
+
</QyBadge>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
`value` 默认为空字符串,`max` 默认为 `99`,`type` 默认为 `danger`,`showZero` 默认为 `true`,`offset` 默认为 `[0, 0]`。上限只作用于数字,字符串原样显示;`content` 插槽收到经过圆点和上限规则处理后的只读 `{ value: string }`,组件公开的 `content` 也只有最终显示内容,不暴露 Element Plus 实例。根节点安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,不声明事件、`v-model` 或尺寸参数。
|
|
292
|
+
|
|
293
|
+
### `QyTooltip`
|
|
291
294
|
|
|
292
295
|
只读提示组件。默认插槽是唯一触发内容,不增加触发元素包装 DOM;`content` 插槽(content slot)优先于 `content` 属性。组件支持 hover / focus、完整 `placement`、`light` / `dark` effect、延迟、偏移和可收缩的 `maxWidth`。
|
|
293
296
|
|
|
@@ -320,52 +323,52 @@ pnpm install --frozen-lockfile --ignore-scripts
|
|
|
320
323
|
</QyPopover>
|
|
321
324
|
```
|
|
322
325
|
|
|
323
|
-
默认值为 `trigger="click"`、`placement="bottom"`、`effect="light"`、`width=240`、`offset=12`、`showDelay=0`、`hideDelay=200`、`showArrow=true`、`disabled=false`。`open` 未传时组件内部管理状态,传入时通过 `v-model:open` 由父级回传决定状态;`update:open` 是状态意图,`open-change` / `open` / `close` 只在实际显隐转换时发出。唯一暴露的方法是 `close()`,不公开 Element Plus 实例、定位更新、`teleported`、`appendTo` 或 `popperOptions`。
|
|
324
|
-
|
|
325
|
-
### `QySkeleton` 与 `QySkeletonItem`
|
|
326
|
-
|
|
327
|
-
加载骨架组件基于 Element Plus 的 `ElSkeleton` / `ElSkeletonItem` 渲染。`loading` 由业务受控,加载期间使用 `template` 插槽,加载完成后使用默认插槽;支持 `animated`、`count`、`rows` 及数字或对象形式的 `throttle`。
|
|
328
|
-
|
|
329
|
-
```vue
|
|
330
|
-
<QySkeleton :loading="loading" animated :count="2">
|
|
331
|
-
<template #template>
|
|
332
|
-
<QySkeletonItem variant="rect" style="height: 120px" />
|
|
333
|
-
</template>
|
|
334
|
-
<div>真实内容</div>
|
|
335
|
-
</QySkeleton>
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
`QySkeletonItem` 的 `variant` 支持 `p`、`text`、`h1`、`h3`、`caption`、`button`、`image`、`circle`、`rect`,默认值为 `text`。两者均支持 `class`、`style`、`role`、`title`、`data-*` 和 `aria-*`,不公开 Element Plus 实例。
|
|
339
|
-
|
|
340
|
-
### `QyTabs` 与 `QyTabPane`
|
|
341
|
-
|
|
342
|
-
`QyTabs` 使用 Element Plus 的 `ElTabs` / `ElTabPane` 处理渲染、焦点与键盘行为。`modelValue` 传入时保持受控;`defaultValue` 仅提供初始选择。`tab-change`、`tab-remove`、`tab-add` 与 `edit` 都是意图事件,不会改写业务页签数组、路由或 AdminShell 运行时。
|
|
343
|
-
|
|
344
|
-
```vue
|
|
345
|
-
<QyTabs v-model="current" editable @tab-add="addTab" @tab-remove="removeTab">
|
|
346
|
-
<QyTabPane label="概览" name="overview">概览内容</QyTabPane>
|
|
347
|
-
<QyTabPane label="详情" :name="2" lazy closable>详情内容</QyTabPane>
|
|
348
|
-
</QyTabs>
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
支持 `type`(`'' | 'card' | 'border-card')、`tabPosition`、`stretch`、`closable`、`addable`、`editable`、`beforeLeave` 和 `tabindex`。`QyTabPane` 支持 `label`、字符串或数字 `name`、`closable`、`disabled`、`lazy` 与 `label` 插槽。`tab-click` 的首个参数是冻结的 `QyTabPaneSnapshot`,只包含 `name`、`label`、`disabled`、`closable`、`lazy`、`active`、`index`,不会泄漏 Element Plus 页签上下文或实例。
|
|
352
|
-
|
|
353
|
-
### `QyDescriptions` 与 `QyDescriptionsItem`
|
|
354
|
-
|
|
355
|
-
`QyDescriptions` 使用 Element Plus 的 `ElDescriptions` / `ElDescriptionsItem` 处理描述列表的行列和单元格渲染。`QyDescriptionsItem` 是无 DOM 声明节点,父组件会递归处理直接子项、`v-if`、`v-for` 和 `template`/Fragment,再交给 Element Plus 完成 `span`、`rowspan`、宽度和对齐计算。
|
|
356
|
-
|
|
357
|
-
```vue
|
|
358
|
-
<QyDescriptions border :column="3" title="订单详情">
|
|
359
|
-
<template #extra><QyLink href="/orders">查看全部</QyLink></template>
|
|
360
|
-
<QyDescriptionsItem label="编号">SO-2026-001</QyDescriptionsItem>
|
|
361
|
-
<QyDescriptionsItem label="摘要" :span="2" :rowspan="2">复杂内容也可放入默认插槽。</QyDescriptionsItem>
|
|
362
|
-
<QyDescriptionsItem label="金额" align="right">¥12,800.00</QyDescriptionsItem>
|
|
363
|
-
</QyDescriptions>
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
父级支持 `border`、`column`、`direction`、`size`(`'' | 'large' | 'default' | 'small'`)、`title`、`extra`、`labelWidth` 以及默认、`title`、`extra` 插槽;插槽优先于同名文本属性。描述项支持 `label`、`span`、`rowspan`、`width`、`minWidth`、`labelWidth`、`align`、`labelAlign`、`className`、`labelClassName` 以及默认和 `label` 插槽。组件只安全透传根节点的 `class`、`style`、`id`、`title`、`role`、`data-*`、`aria-*`,不公开事件、状态或 Element Plus 实例。
|
|
367
|
-
|
|
368
|
-
### `QyUpload`
|
|
326
|
+
默认值为 `trigger="click"`、`placement="bottom"`、`effect="light"`、`width=240`、`offset=12`、`showDelay=0`、`hideDelay=200`、`showArrow=true`、`disabled=false`。`open` 未传时组件内部管理状态,传入时通过 `v-model:open` 由父级回传决定状态;`update:open` 是状态意图,`open-change` / `open` / `close` 只在实际显隐转换时发出。唯一暴露的方法是 `close()`,不公开 Element Plus 实例、定位更新、`teleported`、`appendTo` 或 `popperOptions`。
|
|
327
|
+
|
|
328
|
+
### `QySkeleton` 与 `QySkeletonItem`
|
|
329
|
+
|
|
330
|
+
加载骨架组件基于 Element Plus 的 `ElSkeleton` / `ElSkeletonItem` 渲染。`loading` 由业务受控,加载期间使用 `template` 插槽,加载完成后使用默认插槽;支持 `animated`、`count`、`rows` 及数字或对象形式的 `throttle`。
|
|
331
|
+
|
|
332
|
+
```vue
|
|
333
|
+
<QySkeleton :loading="loading" animated :count="2">
|
|
334
|
+
<template #template>
|
|
335
|
+
<QySkeletonItem variant="rect" style="height: 120px" />
|
|
336
|
+
</template>
|
|
337
|
+
<div>真实内容</div>
|
|
338
|
+
</QySkeleton>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
`QySkeletonItem` 的 `variant` 支持 `p`、`text`、`h1`、`h3`、`caption`、`button`、`image`、`circle`、`rect`,默认值为 `text`。两者均支持 `class`、`style`、`role`、`title`、`data-*` 和 `aria-*`,不公开 Element Plus 实例。
|
|
342
|
+
|
|
343
|
+
### `QyTabs` 与 `QyTabPane`
|
|
344
|
+
|
|
345
|
+
`QyTabs` 使用 Element Plus 的 `ElTabs` / `ElTabPane` 处理渲染、焦点与键盘行为。`modelValue` 传入时保持受控;`defaultValue` 仅提供初始选择。`tab-change`、`tab-remove`、`tab-add` 与 `edit` 都是意图事件,不会改写业务页签数组、路由或 AdminShell 运行时。
|
|
346
|
+
|
|
347
|
+
```vue
|
|
348
|
+
<QyTabs v-model="current" editable @tab-add="addTab" @tab-remove="removeTab">
|
|
349
|
+
<QyTabPane label="概览" name="overview">概览内容</QyTabPane>
|
|
350
|
+
<QyTabPane label="详情" :name="2" lazy closable>详情内容</QyTabPane>
|
|
351
|
+
</QyTabs>
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
支持 `type`(`'' | 'card' | 'border-card')、`tabPosition`、`stretch`、`closable`、`addable`、`editable`、`beforeLeave` 和 `tabindex`。`QyTabPane` 支持 `label`、字符串或数字 `name`、`closable`、`disabled`、`lazy` 与 `label` 插槽。`tab-click` 的首个参数是冻结的 `QyTabPaneSnapshot`,只包含 `name`、`label`、`disabled`、`closable`、`lazy`、`active`、`index`,不会泄漏 Element Plus 页签上下文或实例。
|
|
355
|
+
|
|
356
|
+
### `QyDescriptions` 与 `QyDescriptionsItem`
|
|
357
|
+
|
|
358
|
+
`QyDescriptions` 使用 Element Plus 的 `ElDescriptions` / `ElDescriptionsItem` 处理描述列表的行列和单元格渲染。`QyDescriptionsItem` 是无 DOM 声明节点,父组件会递归处理直接子项、`v-if`、`v-for` 和 `template`/Fragment,再交给 Element Plus 完成 `span`、`rowspan`、宽度和对齐计算。
|
|
359
|
+
|
|
360
|
+
```vue
|
|
361
|
+
<QyDescriptions border :column="3" title="订单详情">
|
|
362
|
+
<template #extra><QyLink href="/orders">查看全部</QyLink></template>
|
|
363
|
+
<QyDescriptionsItem label="编号">SO-2026-001</QyDescriptionsItem>
|
|
364
|
+
<QyDescriptionsItem label="摘要" :span="2" :rowspan="2">复杂内容也可放入默认插槽。</QyDescriptionsItem>
|
|
365
|
+
<QyDescriptionsItem label="金额" align="right">¥12,800.00</QyDescriptionsItem>
|
|
366
|
+
</QyDescriptions>
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
父级支持 `border`、`column`、`direction`、`size`(`'' | 'large' | 'default' | 'small'`)、`title`、`extra`、`labelWidth` 以及默认、`title`、`extra` 插槽;插槽优先于同名文本属性。描述项支持 `label`、`span`、`rowspan`、`width`、`minWidth`、`labelWidth`、`align`、`labelAlign`、`className`、`labelClassName` 以及默认和 `label` 插槽。组件只安全透传根节点的 `class`、`style`、`id`、`title`、`role`、`data-*`、`aria-*`,不公开事件、状态或 Element Plus 实例。
|
|
370
|
+
|
|
371
|
+
### `QyUpload`
|
|
369
372
|
|
|
370
373
|
上传组件,支持:
|
|
371
374
|
|
|
@@ -837,18 +840,18 @@ options 模式物理复用 `QyCheckbox`;不提供 CheckboxButton、全选、in
|
|
|
837
840
|
|
|
838
841
|
### `QyTreeSelect`
|
|
839
842
|
|
|
840
|
-
树选择组件以 `ElTreeSelect` 作为唯一树、勾选、过滤、键盘和浮层实现,重点支持:
|
|
843
|
+
树选择组件以 `ElTreeSelect` 作为唯一树、勾选、过滤、键盘和浮层实现,重点支持:
|
|
841
844
|
|
|
842
|
-
- `data` 树数据直出,`options` 作为兼容入口;同时传入时 `data` 优先,节点与数组保持原始引用
|
|
843
|
-
- `labelKey / valueKey / childrenKey / disabledKey` 快捷字段与 `props` 映射(显式 `props` 优先)
|
|
844
|
-
- string、number、boolean、对象和多选数组的受控值;对象值必须配置稳定的 `nodeKey`
|
|
845
|
+
- `data` 树数据直出,`options` 作为兼容入口;同时传入时 `data` 优先,节点与数组保持原始引用
|
|
846
|
+
- `labelKey / valueKey / childrenKey / disabledKey` 快捷字段与 `props` 映射(显式 `props` 优先)
|
|
847
|
+
- string、number、boolean、对象和多选数组的受控值;对象值必须配置稳定的 `nodeKey`
|
|
845
848
|
- 单选 / 多选
|
|
846
849
|
- `check-strictly`
|
|
847
850
|
- `collapse-tags`
|
|
848
851
|
- 默认弹层挂载策略
|
|
849
852
|
- 保留原始节点字段,便于业务 slot 和后续透传使用
|
|
850
853
|
|
|
851
|
-
`QyTreeSelect` 只处理树选择器的通用 UI 协议,不内置远程请求、权限过滤或业务接口格式化。节点插槽、回调和事件只提供原始数据与安全快照;公开实例只有 `focus()` 和 `blur()`,不会暴露 Element Node、Store 或组件实例。
|
|
854
|
+
`QyTreeSelect` 只处理树选择器的通用 UI 协议,不内置远程请求、权限过滤或业务接口格式化。节点插槽、回调和事件只提供原始数据与安全快照;公开实例只有 `focus()` 和 `blur()`,不会暴露 Element Node、Store 或组件实例。
|
|
852
855
|
|
|
853
856
|
为降低迁移成本,`QyTreeSelect` 的 `clearable`、`filterable`、`check-strictly`、`render-after-expand`、`fit-input-width` 等默认行为尽量跟随 `ElTreeSelect`。业务需要搜索、清空、父子不联动时应显式传参。
|
|
854
857
|
|
|
@@ -1369,7 +1372,7 @@ function handleSelect(item) {
|
|
|
1369
1372
|
</template>
|
|
1370
1373
|
```
|
|
1371
1374
|
|
|
1372
|
-
### QyRecordQuoteSearch
|
|
1375
|
+
### QyRecordQuoteSearch
|
|
1373
1376
|
|
|
1374
1377
|
```vue
|
|
1375
1378
|
<template>
|
|
@@ -1379,118 +1382,129 @@ function handleSelect(item) {
|
|
|
1379
1382
|
:search-method="handleQuoteSearch"
|
|
1380
1383
|
@search="handleSearch"
|
|
1381
1384
|
/>
|
|
1382
|
-
</template>
|
|
1383
|
-
```
|
|
1384
|
-
|
|
1385
|
-
### QyCollapse
|
|
1386
|
-
|
|
1387
|
-
`QyCollapse` 与 `QyCollapseItem` 是 Element Plus 折叠面板的受控适配器。普通模式使用数组值,手风琴模式使用单个字符串或数字;`beforeCollapse` 同时拦截展开和收起。
|
|
1388
|
-
|
|
1389
|
-
```vue
|
|
1390
|
-
<template>
|
|
1391
|
-
<QyCollapse v-model="activeNames" :before-collapse="beforeCollapse">
|
|
1392
|
-
<QyCollapseItem title="基本信息" name="base">内容</QyCollapseItem>
|
|
1393
|
-
<QyCollapseItem title="数字名称" :name="2" />
|
|
1394
|
-
</QyCollapse>
|
|
1395
|
-
</template>
|
|
1396
|
-
|
|
1397
|
-
<script setup>
|
|
1398
|
-
import { ref } from 'vue'
|
|
1399
|
-
import { QyCollapse, QyCollapseItem } from '@qynpm/ui'
|
|
1400
|
-
|
|
1401
|
-
const activeNames = ref(['base'])
|
|
1402
|
-
function beforeCollapse(name) {
|
|
1403
|
-
return name !== 'locked'
|
|
1404
|
-
}
|
|
1405
|
-
</script>
|
|
1406
|
-
```
|
|
1407
|
-
|
|
1408
|
-
通过 `ref` 可读取只读的 `activeNames`,并调用 `setActiveNames(value)` 设置完整公共值;标题和图标插槽都接收 `{ isActive }`。
|
|
1409
|
-
|
|
1410
|
-
### QyLink
|
|
1411
|
-
|
|
1412
|
-
`QyLink` 基于 Element Plus `ElLink`,保留真实 `<a href>` 的浏览器焦点、Enter 激活和默认导航语义。支持六种语义类型、`always` / `never` / `hover` 下划线策略、禁用、原生链接地址和属性、图标属性及默认/图标插槽。
|
|
1413
|
-
|
|
1414
|
-
```vue
|
|
1415
|
-
<QyLink
|
|
1416
|
-
href="https://example.com"
|
|
1417
|
-
target="_blank"
|
|
1418
|
-
rel="noopener noreferrer"
|
|
1419
|
-
type="primary"
|
|
1420
|
-
underline="hover"
|
|
1421
|
-
>
|
|
1422
|
-
打开外部文档
|
|
1423
|
-
<template #icon>↗</template>
|
|
1424
|
-
</QyLink>
|
|
1425
|
-
```
|
|
1426
|
-
|
|
1427
|
-
`disabled` 会移除有效 `href` 与 `target` 并抑制 `click`;非禁用点击只转发一次原生 `MouseEvent`。`type` 和 `underline` 未传时可继承 Element Plus ConfigProvider;布尔下划线仅作兼容,`true` 等同 `hover`、`false` 等同 `never`。不自动改写 `target` 或 `rel`,外部新窗口链接请显式提供 `rel="noopener noreferrer"`。无 href、只监听 `click` 的旧用法可以兼容,但新业务动作应使用 `QyButton`,路由导航应使用 RouterLink。
|
|
1428
|
-
|
|
1429
|
-
### QyDivider
|
|
1430
|
-
|
|
1431
|
-
`QyDivider` 基于 Element Plus `ElDivider`,支持水平/垂直方向、左中右标题位置和标准 CSS `border-style` 值。水平模式渲染默认插槽,垂直模式即使传入插槽也保持 Element Plus 行为而不渲染;消费者传入的 `width`、`height`、`margin` 等根样式会与 Element Plus 的边框 CSS 变量合并。
|
|
1432
|
-
|
|
1433
|
-
```vue
|
|
1434
|
-
<QyDivider content-position="left" border-style="dashed">
|
|
1435
|
-
分组标题
|
|
1436
|
-
</QyDivider>
|
|
1437
|
-
<QyDivider direction="vertical" :style="{ height: '130px', margin: '0 8px' }" />
|
|
1438
|
-
```
|
|
1439
|
-
|
|
1440
|
-
根节点保留 `role="separator"`,只安全透传 `class`、`style`、`id`、`title`、`role`、`data-*` 和 `aria-*`;组件没有事件、尺寸参数、公开实例或额外布局规则。
|
|
1441
|
-
|
|
1442
|
-
### QyProgress
|
|
1443
|
-
|
|
1444
|
-
`QyProgress` 基于 Element Plus `ElProgress`,用于文件上传、批处理和任务进度的受控展示。支持 line / circle / dashboard 三种形态、percentage、四种 status、显示/隐藏/内部/自定义文字、固定/分段/函数颜色、线宽、端点、圆形画布宽度、不确定动画、条纹、流动条纹和默认插槽;不接管上传、轮询、暂停、恢复、重试或任务状态映射。
|
|
1445
|
-
|
|
1446
|
-
```vue
|
|
1447
|
-
<QyProgress :percentage="progress" status="success" />
|
|
1448
|
-
<QyProgress type="circle" :percentage="progress" :color="colorStops" />
|
|
1449
|
-
<QyProgress :percentage="progress" :style="{ width: '720px', margin: '8px auto' }">
|
|
1450
|
-
<template #default="{ percentage }">已完成 {{ percentage }}%</template>
|
|
1451
|
-
</QyProgress>
|
|
1452
|
-
```
|
|
1453
|
-
|
|
1454
|
-
颜色、文字优先级、合法 percentage、图形和动画全部沿用 Element Plus;根级只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,未知属性、事件监听器、实例、DOM ref 和方法不对外暴露。文档演示位于 `src/docs/QyProgressDoc.vue`,API 表使用局部横向滚动,不产生页面级横向溢出。
|
|
1455
|
-
|
|
1456
|
-
###
|
|
1457
|
-
|
|
1458
|
-
`
|
|
1459
|
-
|
|
1460
|
-
```vue
|
|
1461
|
-
<
|
|
1462
|
-
<
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1385
|
+
</template>
|
|
1386
|
+
```
|
|
1387
|
+
|
|
1388
|
+
### QyCollapse
|
|
1389
|
+
|
|
1390
|
+
`QyCollapse` 与 `QyCollapseItem` 是 Element Plus 折叠面板的受控适配器。普通模式使用数组值,手风琴模式使用单个字符串或数字;`beforeCollapse` 同时拦截展开和收起。
|
|
1391
|
+
|
|
1392
|
+
```vue
|
|
1393
|
+
<template>
|
|
1394
|
+
<QyCollapse v-model="activeNames" :before-collapse="beforeCollapse">
|
|
1395
|
+
<QyCollapseItem title="基本信息" name="base">内容</QyCollapseItem>
|
|
1396
|
+
<QyCollapseItem title="数字名称" :name="2" />
|
|
1397
|
+
</QyCollapse>
|
|
1398
|
+
</template>
|
|
1399
|
+
|
|
1400
|
+
<script setup>
|
|
1401
|
+
import { ref } from 'vue'
|
|
1402
|
+
import { QyCollapse, QyCollapseItem } from '@qynpm/ui'
|
|
1403
|
+
|
|
1404
|
+
const activeNames = ref(['base'])
|
|
1405
|
+
function beforeCollapse(name) {
|
|
1406
|
+
return name !== 'locked'
|
|
1407
|
+
}
|
|
1408
|
+
</script>
|
|
1409
|
+
```
|
|
1410
|
+
|
|
1411
|
+
通过 `ref` 可读取只读的 `activeNames`,并调用 `setActiveNames(value)` 设置完整公共值;标题和图标插槽都接收 `{ isActive }`。
|
|
1412
|
+
|
|
1413
|
+
### QyLink
|
|
1414
|
+
|
|
1415
|
+
`QyLink` 基于 Element Plus `ElLink`,保留真实 `<a href>` 的浏览器焦点、Enter 激活和默认导航语义。支持六种语义类型、`always` / `never` / `hover` 下划线策略、禁用、原生链接地址和属性、图标属性及默认/图标插槽。
|
|
1416
|
+
|
|
1417
|
+
```vue
|
|
1418
|
+
<QyLink
|
|
1419
|
+
href="https://example.com"
|
|
1420
|
+
target="_blank"
|
|
1421
|
+
rel="noopener noreferrer"
|
|
1422
|
+
type="primary"
|
|
1423
|
+
underline="hover"
|
|
1424
|
+
>
|
|
1425
|
+
打开外部文档
|
|
1426
|
+
<template #icon>↗</template>
|
|
1427
|
+
</QyLink>
|
|
1428
|
+
```
|
|
1429
|
+
|
|
1430
|
+
`disabled` 会移除有效 `href` 与 `target` 并抑制 `click`;非禁用点击只转发一次原生 `MouseEvent`。`type` 和 `underline` 未传时可继承 Element Plus ConfigProvider;布尔下划线仅作兼容,`true` 等同 `hover`、`false` 等同 `never`。不自动改写 `target` 或 `rel`,外部新窗口链接请显式提供 `rel="noopener noreferrer"`。无 href、只监听 `click` 的旧用法可以兼容,但新业务动作应使用 `QyButton`,路由导航应使用 RouterLink。
|
|
1431
|
+
|
|
1432
|
+
### QyDivider
|
|
1433
|
+
|
|
1434
|
+
`QyDivider` 基于 Element Plus `ElDivider`,支持水平/垂直方向、左中右标题位置和标准 CSS `border-style` 值。水平模式渲染默认插槽,垂直模式即使传入插槽也保持 Element Plus 行为而不渲染;消费者传入的 `width`、`height`、`margin` 等根样式会与 Element Plus 的边框 CSS 变量合并。
|
|
1435
|
+
|
|
1436
|
+
```vue
|
|
1437
|
+
<QyDivider content-position="left" border-style="dashed">
|
|
1438
|
+
分组标题
|
|
1439
|
+
</QyDivider>
|
|
1440
|
+
<QyDivider direction="vertical" :style="{ height: '130px', margin: '0 8px' }" />
|
|
1441
|
+
```
|
|
1442
|
+
|
|
1443
|
+
根节点保留 `role="separator"`,只安全透传 `class`、`style`、`id`、`title`、`role`、`data-*` 和 `aria-*`;组件没有事件、尺寸参数、公开实例或额外布局规则。
|
|
1444
|
+
|
|
1445
|
+
### QyProgress
|
|
1446
|
+
|
|
1447
|
+
`QyProgress` 基于 Element Plus `ElProgress`,用于文件上传、批处理和任务进度的受控展示。支持 line / circle / dashboard 三种形态、percentage、四种 status、显示/隐藏/内部/自定义文字、固定/分段/函数颜色、线宽、端点、圆形画布宽度、不确定动画、条纹、流动条纹和默认插槽;不接管上传、轮询、暂停、恢复、重试或任务状态映射。
|
|
1448
|
+
|
|
1449
|
+
```vue
|
|
1450
|
+
<QyProgress :percentage="progress" status="success" />
|
|
1451
|
+
<QyProgress type="circle" :percentage="progress" :color="colorStops" />
|
|
1452
|
+
<QyProgress :percentage="progress" :style="{ width: '720px', margin: '8px auto' }">
|
|
1453
|
+
<template #default="{ percentage }">已完成 {{ percentage }}%</template>
|
|
1454
|
+
</QyProgress>
|
|
1455
|
+
```
|
|
1456
|
+
|
|
1457
|
+
颜色、文字优先级、合法 percentage、图形和动画全部沿用 Element Plus;根级只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,未知属性、事件监听器、实例、DOM ref 和方法不对外暴露。文档演示位于 `src/docs/QyProgressDoc.vue`,API 表使用局部横向滚动,不产生页面级横向溢出。
|
|
1458
|
+
|
|
1459
|
+
### QyStatistic
|
|
1460
|
+
|
|
1461
|
+
`QyStatistic` 基于 Element Plus `ElStatistic` 展示数值。`value`、`precision`、`decimalSeparator`、`groupSeparator`、`formatter`、`valueStyle` 以及 `title`、`prefix`、`suffix` 属性和同名插槽均沿用 Element Plus;插槽优先级不变。
|
|
1462
|
+
|
|
1463
|
+
```vue
|
|
1464
|
+
<QyStatistic title="成交额" :value="123456.78" :precision="2" prefix="¥" suffix="元" />
|
|
1465
|
+
<QyStatistic :value="target" animated :duration="800" :start-value="100" />
|
|
1466
|
+
```
|
|
1467
|
+
|
|
1468
|
+
动画首次从 `startValue` 过渡,目标变化时从当前显示值平滑衔接;`animated=false`、`duration<=0` 和 `prefers-reduced-motion: reduce` 时立即显示目标值。根级只安全透传 `class`、`style`、`id`、`role`、`data-*` 和 `aria-*`,未知属性与事件监听器不会透传,也不暴露 Element Plus 实例、DOM ref 或方法。
|
|
1469
|
+
|
|
1470
|
+
### QyAvatar
|
|
1471
|
+
|
|
1472
|
+
`QyAvatar` 基于 Element Plus `ElAvatar`,用于用户头像及自定义头像内容展示。支持数字尺寸、`small` / `default` / `large` 命名尺寸、圆形和方形、图片 `src` / `srcSet` / `alt` / `fit`、图标、默认插槽和图片加载失败后的原生回退。
|
|
1473
|
+
|
|
1474
|
+
```vue
|
|
1475
|
+
<QyAvatar :size="80" src="/avatar.png" alt="用户头像" />
|
|
1476
|
+
<QyAvatar size="large" shape="square" :icon="UserFilled" />
|
|
1477
|
+
<QyAvatar src="/missing.png" @error="handleAvatarError">
|
|
1478
|
+
张三
|
|
1479
|
+
</QyAvatar>
|
|
1480
|
+
```
|
|
1481
|
+
|
|
1482
|
+
图片加载、失败回退、图标与默认插槽优先级全部沿用 Element Plus;`error` 只转发标准图片 `Event`。根级只安全透传 `class`、`style`、`id`、`role`、`title`、`tabindex`、`data-*` 和 `aria-*`,未知属性、未声明事件、实例、DOM ref 和方法不对外暴露。QyAvatar 不接管上传、裁剪、预览、缓存、用户资料保存或头像组;文档演示位于 `src/docs/QyAvatarDoc.vue`,API 表使用局部横向滚动。
|
|
1483
|
+
|
|
1484
|
+
### QyAlert
|
|
1485
|
+
|
|
1486
|
+
`QyAlert` 基于 Element Plus `ElAlert`,用于页面模板中的常驻成功、警告、信息和错误提示。支持 `title`、`description`、五种 `type`、关闭入口、图标、居中和明暗效果,以及 `icon`、`title`、默认三个插槽;关闭时只触发无参数 `close` 事件,隐藏状态由 Element Plus 管理。
|
|
1487
|
+
|
|
1488
|
+
```vue
|
|
1489
|
+
<QyAlert type="warning" title="请检查填写内容" description="修改后即可继续提交" @close="handleClose" />
|
|
1490
|
+
```
|
|
1491
|
+
|
|
1492
|
+
根级只安全透传 `class`、`style`、`id`、`role`、`data-*` 和 `aria-*`;不透传原生 `title`、未知属性、原始鼠标事件或 Element Plus 实例。`QyAlert` 只负责常驻提示,不替代 `@qynpm/hooks` feedback runtime,也不改动 `QyFormSection` 的现有 tip 协议。
|
|
1493
|
+
|
|
1494
|
+
### QyCard
|
|
1495
|
+
|
|
1496
|
+
`QyCard` 基于 Element Plus `ElCard`,用于页面内部可独立识别的小型内容面板。支持 `header`、`footer`、`shadow`、`bodyStyle` 以及三个区域类名入口,原生转发 `header`、默认和 `footer` 插槽;插槽存在时由 Element Plus 优先于同名文本属性渲染。
|
|
1497
|
+
|
|
1498
|
+
```vue
|
|
1499
|
+
<QyCard header="订单概览" shadow="hover" @click="handleCardClick">
|
|
1500
|
+
<template #footer>更新于刚刚</template>
|
|
1501
|
+
面板正文
|
|
1502
|
+
</QyCard>
|
|
1503
|
+
```
|
|
1504
|
+
|
|
1505
|
+
根级只安全透传 `class`、`style`、`id`、`role`、`title`、`tabindex`、`data-*` 和 `aria-*`;`click` 只转发一次原生 `MouseEvent`,不把普通卡片自动改成按钮或链接。`QyCard` 不替代 `QyPage` 的页面语义根和页面节奏,也不替代 `QyFormSection` 的表单标题、说明、动作或折叠;标准列表页和完整页面不要再套一层卡片 workspace。
|
|
1506
|
+
|
|
1507
|
+
## 说明
|
|
1494
1508
|
|
|
1495
1509
|
- 当前版本更适合体系内拆包复用
|
|
1496
1510
|
- 上传默认值仍然保留了现有项目约定,后续如果完全独立对外,可以再继续抽离
|
|
@@ -1535,23 +1549,97 @@ const ENABLE_LOCAL_QIYIN_DEBUG = true
|
|
|
1535
1549
|
|
|
1536
1550
|
1. 停掉当前 dev 服务
|
|
1537
1551
|
2. 清理消费项目的 `node_modules/.vite`
|
|
1538
|
-
3. 重新启动
|
|
1539
|
-
|
|
1540
|
-
### QySteps 与 QyStep
|
|
1541
|
-
|
|
1542
|
-
`QySteps` 和 `QyStep` 是 Element Plus `ElSteps` / `ElStep` 的安全公共入口。布局、父子注册、排序、状态计算和过渡全部由 Element Plus 负责;Qy 层只隔离公共属性、插槽、根级安全属性和 `change(newValue, oldValue)` 事件。
|
|
1543
|
-
|
|
1544
|
-
```vue
|
|
1545
|
-
<QySteps :active="active" direction="horizontal" @change="handleChange">
|
|
1546
|
-
<QyStep title="创建订单" description="填写订单信息" />
|
|
1547
|
-
<QyStep title="确认信息">
|
|
1548
|
-
<template #title><button type="button" @click="openOrder">查看订单</button></template>
|
|
1549
|
-
</QyStep>
|
|
1550
|
-
<QyStep title="完成" status="success" />
|
|
1551
|
-
</QySteps>
|
|
1552
|
-
```
|
|
1553
|
-
|
|
1554
|
-
支持自动、像素和百分比 `space`,横向/纵向、居中、简洁模式、五种步骤状态以及受控 `active`。`QyStep` 支持 `title`、`description`、`icon`、显式 `status` 和 `icon` / `title` / `description` 插槽;插槽内容优先于同名属性。组件不提供 `update:active`、自动导航或步骤点击事件,业务跳转应在插槽中放置真实按钮或链接并自行处理。
|
|
1555
|
-
|
|
1556
|
-
两个入口分别为 `@qynpm/ui/qy-steps` 与 `@qynpm/ui/qy-step`;根入口也导出 `QySteps`、`QyStep` 及其 Qy 自有类型。根级只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,未知属性、未声明事件、Element Plus 实例、内部注册对象和 DOM 方法不对外暴露。文档演示位于 `src/docs/QyStepsDoc.vue`,宽步骤条和 API 表使用局部横向滚动。
|
|
1552
|
+
3. 重新启动
|
|
1553
|
+
|
|
1554
|
+
### QySteps 与 QyStep
|
|
1555
|
+
|
|
1556
|
+
`QySteps` 和 `QyStep` 是 Element Plus `ElSteps` / `ElStep` 的安全公共入口。布局、父子注册、排序、状态计算和过渡全部由 Element Plus 负责;Qy 层只隔离公共属性、插槽、根级安全属性和 `change(newValue, oldValue)` 事件。
|
|
1557
|
+
|
|
1558
|
+
```vue
|
|
1559
|
+
<QySteps :active="active" direction="horizontal" @change="handleChange">
|
|
1560
|
+
<QyStep title="创建订单" description="填写订单信息" />
|
|
1561
|
+
<QyStep title="确认信息">
|
|
1562
|
+
<template #title><button type="button" @click="openOrder">查看订单</button></template>
|
|
1563
|
+
</QyStep>
|
|
1564
|
+
<QyStep title="完成" status="success" />
|
|
1565
|
+
</QySteps>
|
|
1566
|
+
```
|
|
1567
|
+
|
|
1568
|
+
支持自动、像素和百分比 `space`,横向/纵向、居中、简洁模式、五种步骤状态以及受控 `active`。`QyStep` 支持 `title`、`description`、`icon`、显式 `status` 和 `icon` / `title` / `description` 插槽;插槽内容优先于同名属性。组件不提供 `update:active`、自动导航或步骤点击事件,业务跳转应在插槽中放置真实按钮或链接并自行处理。
|
|
1569
|
+
|
|
1570
|
+
两个入口分别为 `@qynpm/ui/qy-steps` 与 `@qynpm/ui/qy-step`;根入口也导出 `QySteps`、`QyStep` 及其 Qy 自有类型。根级只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`,未知属性、未声明事件、Element Plus 实例、内部注册对象和 DOM 方法不对外暴露。文档演示位于 `src/docs/QyStepsDoc.vue`,宽步骤条和 API 表使用局部横向滚动。
|
|
1571
|
+
|
|
1572
|
+
### QyRow 与 QyCol
|
|
1573
|
+
|
|
1574
|
+
`QyRow` 与 `QyCol` 是 Element Plus `ElRow` / `ElCol` 的安全公共入口。栅格、gutter、对齐、位移、嵌套和五档响应式全部沿用 Element Plus;Qy 层不手写 24 栅格、断点、负边距或列 padding。
|
|
1575
|
+
|
|
1576
|
+
```vue
|
|
1577
|
+
<QyRow :gutter="16" justify="space-between" align="middle">
|
|
1578
|
+
<QyCol :span="12" :xs="24" :md="12">左侧内容</QyCol>
|
|
1579
|
+
<QyCol :span="12" :offset="1">右侧内容</QyCol>
|
|
1580
|
+
</QyRow>
|
|
1581
|
+
```
|
|
1582
|
+
|
|
1583
|
+
两个入口分别为 `@qynpm/ui/qy-row` 与 `@qynpm/ui/qy-col`;根入口也导出 `QyRow`、`QyCol` 及其 Qy 自有类型。`QyRow` 支持 `tag`、`gutter`、`justify`、`align` 和默认插槽;`QyCol` 支持 `tag`、`span`、`offset`、`push`、`pull`、`xs`、`sm`、`md`、`lg`、`xl` 和默认插槽。数值合法性和异常值表现交由 Element Plus 负责,不对旧项目非法值做兼容映射。
|
|
1584
|
+
|
|
1585
|
+
两者根级只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*` 和 `aria-*`;未知属性、监听器、Element Plus 实例、DOM ref 和方法不对外暴露。完整演示位于 `src/docs/QyGridDoc.vue`,包含等分列、gutter、justify/align、offset/push/pull、嵌套、自定义 tag、五档响应式和局部横向滚动 API 表。
|
|
1586
|
+
|
|
1587
|
+
### QyFullscreen
|
|
1588
|
+
|
|
1589
|
+
`QyFullscreen` 统一承接整页或指定局部 `HTMLElement` 的浏览器全屏进入、退出和状态同步。它使用 QyButton 保留按钮、loading、尺寸和可访问语义,使用 QyIcon 渲染图标;图标未在当前 registry 注册时显示当前 label 文字,不会产生空白按钮。
|
|
1590
|
+
|
|
1591
|
+
```vue
|
|
1592
|
+
<QyFullscreen @change="isFullscreen = $event" @error="handleFullscreenError" />
|
|
1593
|
+
<QyFullscreen :target="previewElement" enter-label="进入局部全屏" />
|
|
1594
|
+
```
|
|
1595
|
+
|
|
1596
|
+
`target` 未传时使用 `document.documentElement`,显式传入 `null` 表示目标暂不可用。全屏期间 target 变化不会自动退出或切换,退出后下一次进入才使用新目标。`enter()`、`exit()`、`toggle()` 通过模板 ref 命令式调用并返回 `Promise<boolean>`;`change` 只在浏览器确认实际状态变化后触发,`error` 返回不含原始 `DOMException` 的只读快照。完整示例位于 `src/docs/QyFullscreenDoc.vue`,入口为 `@qynpm/ui/qy-fullscreen`。
|
|
1597
|
+
|
|
1598
|
+
### QyIcon 与应用图标注册表
|
|
1599
|
+
|
|
1600
|
+
`QyIcon` 是应用级统一图标入口。每个 Vue app 通过 `createQyIconRegistry` 与 `createQyIconPlugin` 提供自己的 registry,支持同文档 SVG symbol、直接 Vue component 和宿主已经生成样式的静态 class;不依赖 Element Plus/Iconify renderer,也不进行远程加载或 `v-html`。
|
|
1601
|
+
|
|
1602
|
+
```ts
|
|
1603
|
+
import { createQyIconPlugin, createQyIconRegistry } from '@qynpm/ui/qy-icon'
|
|
1604
|
+
|
|
1605
|
+
const registry = createQyIconRegistry({
|
|
1606
|
+
icons: [
|
|
1607
|
+
{ name: 'system', source: 'symbol', value: '#icon-system' },
|
|
1608
|
+
{ name: 'close', source: 'class', value: 'icon-[mdi--close]' }
|
|
1609
|
+
],
|
|
1610
|
+
aliases: { 'el-icon-s-home': 'system' }
|
|
1611
|
+
})
|
|
1612
|
+
app.use(createQyIconPlugin(registry))
|
|
1613
|
+
```
|
|
1614
|
+
|
|
1615
|
+
名称大小写不敏感;`#icon-system` 规范为 `system`,`icon-[mdi--close]` 规范为 `iconify:mdi:close`。冲突、未注册 alias 目标和不安全 symbol/class 值会在注册或合并时抛出错误。QyIcon 默认尺寸为 `1em`、颜色为 `currentColor`;提供 `label` 或消费方 `aria-label` 时作为 `role="img"`,否则为装饰图标。完整演示位于 `src/docs/QyIconDoc.vue`,入口为 `@qynpm/ui/qy-icon`。
|
|
1616
|
+
|
|
1617
|
+
### QyIconPicker
|
|
1618
|
+
|
|
1619
|
+
`QyIconPicker` 从当前 Vue app 注入的 `QyIconRegistry` 读取允许图标,统一支持 symbol、Vue component 和静态 class 三种来源。它是单值受控选择器:默认展示 registry 全量,也可以通过 `allowedNames` 白名单限制;搜索匹配名称、label 和 keywords,旧 alias 当前值只用于解析 active 图标,不会静默改写 modelValue,未知当前值也会保留到消费者主动选择或清空。
|
|
1620
|
+
|
|
1621
|
+
```vue
|
|
1622
|
+
<QyIconPicker
|
|
1623
|
+
v-model="menuIcon"
|
|
1624
|
+
:allowed-names="['system', 'settings']"
|
|
1625
|
+
clearable
|
|
1626
|
+
aria-label="菜单图标"
|
|
1627
|
+
/>
|
|
1628
|
+
```
|
|
1629
|
+
|
|
1630
|
+
公开事件为 `update:modelValue`、`change`、`clear`、`update:open` 和 `open-change`;实例只暴露 `focus()`、`blur()`、`open()`、`close()`。面板使用 listbox/option 语义,支持 Enter/Space 打开、方向键移动、Enter 选择和 Escape 回焦;触摸窄屏网格为两列且每个选项至少 40px。完整演示位于 `src/docs/QyIconPickerDoc.vue`,入口为 `@qynpm/ui/qy-icon-picker`。
|
|
1631
|
+
|
|
1632
|
+
### QyContainer、QyAside 与 QyMain
|
|
1633
|
+
|
|
1634
|
+
三个组件是通用布局原语,入口分别为 `@qynpm/ui/qy-container`、`@qynpm/ui/qy-aside` 与 `@qynpm/ui/qy-main`;根入口也导出 `QyContainer`、`QyAside`、`QyMain` 及其 Qy 自有类型。V1 使用内部 Element Plus renderer,公共 wrapper 和声明文件不要求消费者感知 Element Plus。
|
|
1635
|
+
|
|
1636
|
+
```vue
|
|
1637
|
+
<QyContainer>
|
|
1638
|
+
<QyAside width="240px">侧栏</QyAside>
|
|
1639
|
+
<QyMain>主内容</QyMain>
|
|
1640
|
+
</QyContainer>
|
|
1641
|
+
```
|
|
1642
|
+
|
|
1643
|
+
`QyContainer` 的 `direction` 默认是 `horizontal`,只有显式传入 `vertical` 才进入纵向布局;`QyAside` 的 `width` 是默认 `300px` 的原样字符串,支持合法 CSS 宽度值;`QyMain` 是语义 `main`,填充剩余空间、内容溢出时局部滚动并使用默认 `20px` padding。三者只提供默认插槽,不提供 emits、expose、ref 或实例能力,并且只安全透传 `class`、`style`、`id`、`role`、`title`、`data-*`、`aria-*`。
|
|
1557
1644
|
|
|
1645
|
+
完整演示位于 `src/docs/QyContainerDoc.vue`,覆盖默认横向、自定义侧栏宽度、显式纵向、嵌套组合、安全属性和局部横向滚动 API 表。它们不替代 `QyAdminContent`:后者仍负责后台页面级内容编排、workspace 和相关页面语义。
|