@qynpm/ui 1.0.22 → 1.0.24

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.
Files changed (137) hide show
  1. package/README.md +230 -54
  2. package/dist/index.cjs +16 -5
  3. package/dist/index.mjs +53 -34
  4. package/dist/qy-action-bar/index.cjs +1 -1
  5. package/dist/qy-action-bar/index.mjs +1 -1
  6. package/dist/qy-autocomplete/index.cjs +1 -1
  7. package/dist/qy-autocomplete/index.mjs +4 -2
  8. package/dist/qy-button/index.cjs +1 -1
  9. package/dist/qy-button/index.mjs +1 -1
  10. package/dist/qy-checkbox/index.cjs +1 -1
  11. package/dist/qy-checkbox/index.mjs +5 -2
  12. package/dist/qy-checkbox-group/index.cjs +1 -0
  13. package/dist/qy-checkbox-group/index.mjs +7 -0
  14. package/dist/qy-date-picker/index.cjs +1 -1
  15. package/dist/qy-date-picker/index.mjs +5 -2
  16. package/dist/qy-dialog/index.cjs +1 -1
  17. package/dist/qy-dialog/index.mjs +2 -2
  18. package/dist/qy-dropdown/index.cjs +1 -1
  19. package/dist/qy-dropdown/index.mjs +1 -1
  20. package/dist/qy-file-picker/index.cjs +1 -0
  21. package/dist/qy-file-picker/index.mjs +7 -0
  22. package/dist/qy-form-section/index.cjs +1 -1
  23. package/dist/qy-form-section/index.mjs +1 -1
  24. package/dist/qy-image/index.cjs +1 -1
  25. package/dist/qy-image/index.mjs +4 -2
  26. package/dist/qy-image-preview/index.cjs +1 -1
  27. package/dist/qy-image-preview/index.mjs +6 -3
  28. package/dist/qy-image-upload/index.cjs +1 -1
  29. package/dist/qy-image-upload/index.mjs +1 -1
  30. package/dist/qy-input/index.cjs +2 -2
  31. package/dist/qy-input/index.mjs +6 -3
  32. package/dist/qy-input-number/index.cjs +1 -1
  33. package/dist/qy-input-number/index.mjs +5 -2
  34. package/dist/qy-legacy-selection-dialog/index.cjs +1 -1
  35. package/dist/qy-legacy-selection-dialog/index.mjs +2 -2
  36. package/dist/qy-menu-actions/index.cjs +1 -1
  37. package/dist/qy-menu-actions/index.mjs +1 -1
  38. package/dist/qy-money-input/index.cjs +1 -1
  39. package/dist/qy-money-input/index.mjs +2 -2
  40. package/dist/qy-popover/index.cjs +2 -0
  41. package/dist/qy-popover/index.mjs +8 -0
  42. package/dist/qy-radio/index.cjs +1 -0
  43. package/dist/qy-radio/index.mjs +7 -0
  44. package/dist/qy-radio-group/index.cjs +1 -1
  45. package/dist/qy-radio-group/index.mjs +5 -2
  46. package/dist/qy-record-quote-search/index.cjs +1 -1
  47. package/dist/qy-record-quote-search/index.mjs +1 -1
  48. package/dist/qy-remark-image/index.cjs +1 -1
  49. package/dist/qy-remark-image/index.mjs +2 -2
  50. package/dist/qy-remote-select/index.cjs +1 -1
  51. package/dist/qy-remote-select/index.mjs +1 -1
  52. package/dist/qy-search-input/index.cjs +1 -1
  53. package/dist/qy-search-input/index.mjs +2 -2
  54. package/dist/qy-select/index.cjs +1 -1
  55. package/dist/qy-select/index.mjs +5 -2
  56. package/dist/qy-selection-dialog/index.cjs +1 -1
  57. package/dist/qy-selection-dialog/index.mjs +1 -1
  58. package/dist/qy-switch/index.cjs +1 -0
  59. package/dist/qy-switch/index.mjs +7 -0
  60. package/dist/qy-table-column-settings/index.cjs +1 -1
  61. package/dist/qy-table-column-settings/index.mjs +1 -1
  62. package/dist/qy-tag/index.cjs +1 -0
  63. package/dist/qy-tag/index.mjs +7 -0
  64. package/dist/qy-tooltip/index.cjs +2 -0
  65. package/dist/qy-tooltip/index.mjs +8 -0
  66. package/dist/qy-tree-select/index.cjs +1 -1
  67. package/dist/qy-tree-select/index.mjs +4 -2
  68. package/dist/qy-upload/index.cjs +1 -1
  69. package/dist/qy-upload/index.mjs +1 -1
  70. package/dist/shared/index-8u4DJZwd.mjs +90 -0
  71. package/dist/shared/index-9WJeVamR.cjs +1 -0
  72. package/dist/shared/index-BDFscU3G.mjs +72 -0
  73. package/dist/shared/index-BYme5QGm.cjs +1 -0
  74. package/dist/shared/index-B_mI-37S.cjs +1 -0
  75. package/dist/shared/index-BrV6CR4H.mjs +54 -0
  76. package/dist/shared/index-C8CA7nkO.cjs +1 -0
  77. package/dist/shared/index-CTtAQ1LD.cjs +1 -0
  78. package/dist/shared/index-CczrP1H7.mjs +149 -0
  79. package/dist/shared/index-ClmefDi6.cjs +1 -0
  80. package/dist/shared/{index-DaqN69ii.mjs → index-DJnmpqCc.mjs} +63 -63
  81. package/dist/shared/index-DMGXEAyl.mjs +119 -0
  82. package/dist/shared/index-DYohs_aV.mjs +225 -0
  83. package/dist/shared/index-DixSXWJj.mjs +68 -0
  84. package/dist/shared/index-M4vEHYZ_.cjs +1 -0
  85. package/dist/shared/index-aiJ7R6G-.cjs +1 -0
  86. package/dist/shared/index-c7lnX4vT.mjs +3356 -0
  87. package/dist/shared/index-dEWJKTS-.cjs +1 -0
  88. package/dist/shared/index-fBuu4V3A.mjs +129 -0
  89. package/dist/shared/index-wIXCDvwC.cjs +1 -0
  90. package/dist/shared/index.vue_vue_type_script_setup_true_lang-5gku7Zwv.cjs +1 -0
  91. package/dist/shared/index.vue_vue_type_script_setup_true_lang-BF82tses.cjs +1 -0
  92. package/dist/shared/index.vue_vue_type_script_setup_true_lang-BNjoxcAR.mjs +61 -0
  93. package/dist/shared/index.vue_vue_type_script_setup_true_lang-C-Pf9TJ0.mjs +152 -0
  94. package/dist/shared/index.vue_vue_type_script_setup_true_lang-CKp87br2.cjs +1 -0
  95. package/dist/shared/index.vue_vue_type_script_setup_true_lang-DWS8bsiP.cjs +1 -0
  96. package/dist/shared/index.vue_vue_type_script_setup_true_lang-DmmW8UUK.mjs +106 -0
  97. package/dist/shared/index.vue_vue_type_script_setup_true_lang-DoL8xnpo.mjs +48 -0
  98. package/dist/shared/index.vue_vue_type_script_setup_true_lang-EiHoQBXt.mjs +94 -0
  99. package/dist/shared/index.vue_vue_type_script_setup_true_lang-tyM4_aoa.cjs +1 -0
  100. package/dist/shared/index.vue_vue_type_style_index_0_lang-1cTut9Ql.cjs +1 -0
  101. package/dist/shared/index.vue_vue_type_style_index_0_lang-BZQLyvw8.cjs +1 -0
  102. package/dist/shared/index.vue_vue_type_style_index_0_lang-BtbAft4t.cjs +1 -0
  103. package/dist/shared/index.vue_vue_type_style_index_0_lang-CJhIFeBC.mjs +166 -0
  104. package/dist/shared/index.vue_vue_type_style_index_0_lang-DSur831A.mjs +68 -0
  105. package/dist/shared/index.vue_vue_type_style_index_0_lang-DVqGYfD9.mjs +132 -0
  106. package/dist/shared/index.vue_vue_type_style_index_0_lang-Dm1r1WBK.cjs +1 -0
  107. package/dist/shared/index.vue_vue_type_style_index_0_lang-Q2gFF0PP.cjs +1 -0
  108. package/dist/shared/index.vue_vue_type_style_index_0_lang-aqtfjdVm.mjs +140 -0
  109. package/dist/shared/index.vue_vue_type_style_index_0_lang-ztD-It-2.mjs +121 -0
  110. package/dist/shared/utils-D2KAQCCB.cjs +1 -0
  111. package/dist/shared/utils-DUntDntI.mjs +112 -0
  112. package/index.d.ts +155 -17
  113. package/package.json +260 -218
  114. package/qy-checkbox/index.d.ts +42 -2
  115. package/qy-checkbox-group/index.d.ts +48 -0
  116. package/qy-date-picker/index.d.ts +140 -5
  117. package/qy-file-picker/index.d.ts +49 -0
  118. package/qy-input/index.d.ts +50 -5
  119. package/qy-input-number/index.d.ts +45 -5
  120. package/qy-popover/index.d.ts +63 -0
  121. package/qy-radio/index.d.ts +44 -0
  122. package/qy-radio-group/index.d.ts +60 -12
  123. package/qy-select/index.d.ts +67 -5
  124. package/qy-switch/index.d.ts +46 -0
  125. package/qy-tag/index.d.ts +44 -0
  126. package/qy-tooltip/index.d.ts +54 -0
  127. package/dist/shared/index-BMqHC4GE.mjs +0 -4239
  128. package/dist/shared/index-BZ2L7Rch.cjs +0 -1
  129. package/dist/shared/index-BnMUdIAd.cjs +0 -1
  130. package/dist/shared/index-Cuw6WFH3.cjs +0 -1
  131. package/dist/shared/index-D8iNLsjJ.mjs +0 -153
  132. package/dist/shared/index.vue_vue_type_style_index_0_lang-B_A4Nq6v.cjs +0 -1
  133. package/dist/shared/index.vue_vue_type_style_index_0_lang-DKFiK2fQ.mjs +0 -152
  134. /package/dist/shared/{index-CagHZ25z.mjs → index-BYLXkIxS.mjs} +0 -0
  135. /package/dist/shared/{index-CRZsiNVW.cjs → index-C1p86ezL.cjs} +0 -0
  136. /package/dist/shared/{index-BO5aWk3f.cjs → index-ClUqUsAv.cjs} +0 -0
  137. /package/dist/shared/{index-CSxCewXP.mjs → index-Cy_Glkc-.mjs} +0 -0
package/README.md CHANGED
@@ -35,8 +35,13 @@ app.use(QyUI)
35
35
 
36
36
  ```ts
37
37
  import {
38
- QyUpload,
39
- QyImage,
38
+ QyUpload,
39
+ QyFilePicker,
40
+ QySwitch,
41
+ QyTag,
42
+ QyTooltip,
43
+ QyPopover,
44
+ QyImage,
40
45
  QyImagePreview,
41
46
  QyImageUpload,
42
47
  QyDialog,
@@ -46,9 +51,10 @@ import {
46
51
  QyInput,
47
52
  QyInputNumber,
48
53
  QyMoneyInput,
49
- QyDatePicker,
50
- QyCheckbox,
51
- QyAutocomplete,
54
+ QyDatePicker,
55
+ QyCheckbox,
56
+ QyRadio,
57
+ QyAutocomplete,
52
58
  QyMenuActions,
53
59
  QyTableColumnSettings,
54
60
  QyRadioGroup,
@@ -80,20 +86,28 @@ import QyDropdown from '@qynpm/ui/qy-dropdown'
80
86
  import QySearchInput from '@qynpm/ui/qy-search-input'
81
87
  import QyRecordQuoteSearch from '@qynpm/ui/qy-record-quote-search'
82
88
  import QyDialog from '@qynpm/ui/qy-dialog'
83
- import QyUpload from '@qynpm/ui/qy-upload'
89
+ import QyUpload from '@qynpm/ui/qy-upload'
90
+ import QyFilePicker from '@qynpm/ui/qy-file-picker'
91
+ import QySwitch from '@qynpm/ui/qy-switch'
92
+ import QyTag from '@qynpm/ui/qy-tag'
93
+ import QyTooltip from '@qynpm/ui/qy-tooltip'
94
+ import QyPopover from '@qynpm/ui/qy-popover'
84
95
  import QyImage from '@qynpm/ui/qy-image'
85
96
  import QyImagePreview from '@qynpm/ui/qy-image-preview'
86
97
  import QyImageUpload from '@qynpm/ui/qy-image-upload'
87
98
  import QyRemarkImage from '@qynpm/ui/qy-remark-image'
88
99
  import QyInputNumber from '@qynpm/ui/qy-input-number'
89
- import QyDatePicker from '@qynpm/ui/qy-date-picker'
90
- import QyCheckbox from '@qynpm/ui/qy-checkbox'
100
+ import QyDatePicker from '@qynpm/ui/qy-date-picker'
101
+ import QyCheckbox from '@qynpm/ui/qy-checkbox'
102
+ import QyRadio from '@qynpm/ui/qy-radio'
91
103
  import QyAutocomplete from '@qynpm/ui/qy-autocomplete'
92
104
  import QyMenuActions from '@qynpm/ui/qy-menu-actions'
93
- import QyTableColumnSettings from '@qynpm/ui/qy-table-column-settings'
94
- ```
95
-
96
- 本地 file 依赖联调说明:单组件入口的 `package.json exports` 指向 `dist/qy-*/index.mjs` `dist/qy-*/index.cjs`,而 `dist` 不提交到仓库。消费项目如果通过 `file:../qy-components/packages/ui` 引用本包,必须先在 `qy-components` 执行:
105
+ import QyTableColumnSettings from '@qynpm/ui/qy-table-column-settings'
106
+ ```
107
+
108
+ 后台公共包必须通过 `@qynpm/ui/<子组件>` 使用 UI 能力。每个被后台公共包消费的子入口必须是自包含入口,直接组装对应组件并保留该子入口的命名导出,禁止再转发到 `../index.js` 加载 UI 根入口。这样可以保证发布包按需加载,也能让本地源码联调稳定解析到唯一物理模块。
109
+
110
+ 本地 file 依赖联调说明:单组件入口的 `package.json exports` 指向 `dist/qy-*/index.mjs` 和 `dist/qy-*/index.cjs`,而 `dist` 不提交到仓库。消费项目如果通过 `file:../qy-components/packages/ui` 引用本包,必须先在 `qy-components` 执行:
97
111
 
98
112
  ```bash
99
113
  pnpm --filter @qynpm/ui build
@@ -107,9 +121,91 @@ pnpm install --frozen-lockfile --ignore-scripts
107
121
 
108
122
  不要依赖本机残留的 `packages/ui/dist`。如果后续希望免 build 联调,应在消费项目显式配置源码 alias,而不是把包 export 指向未发布源码。
109
123
 
110
- ## 组件说明
111
-
112
- ### `QyUpload`
124
+ ## 组件说明
125
+
126
+ ### `QyFilePicker`
127
+
128
+ 单文件选择组件,支持点击选择、拖拽、替换、清空以及后缀和大小校验。
129
+
130
+ - `v-model` 只输出浏览器原始 `File | null`。
131
+ - `extensions` 忽略大小写,可传 `xls` 或 `.xlsx`。
132
+ - `maxSizeMb` 的边界值允许,默认 20MB。
133
+ - 校验失败触发 `invalid`,并保留原有 `modelValue`。
134
+ - 组件只选择本地文件,不发送请求、不读取 token、不生成或保存 URL,也不复用 `QyUpload` 的业务上传协议。
135
+
136
+ ```vue
137
+ <QyFilePicker
138
+ v-model="file"
139
+ :extensions="['xls', 'xlsx']"
140
+ :max-size-mb="20"
141
+ placeholder="选择或拖拽 Excel 文件"
142
+ @invalid="handleInvalid"
143
+ />
144
+ ```
145
+
146
+ ### `QySwitch`
147
+
148
+ 受控开关组件,`modelValue`、`activeValue`、`inactiveValue` 和 `update:modelValue` / `change` payload 均为 `boolean | string | number`,不进行隐式布尔化。
149
+
150
+ ```vue
151
+ <QySwitch
152
+ v-model="enabled"
153
+ active-text="启用"
154
+ inactive-text="停用"
155
+ @change="handleChange"
156
+ />
157
+ ```
158
+
159
+ 支持 `disabled`、`loading`、`size`、`inlinePrompt`、`name`、`id`、`tabindex` 和 `ariaLabel`,以及 `class`、`style`、`role`、`title`、`data-*`、其它 `aria-*` 安全属性。只发出 `update:modelValue`、`change`、`focus`、`blur`;不提供 `beforeChange`、`input`、图标/slot 或底层实例、focus/blur 等命令式方法。
160
+
161
+ ### `QyTag`
162
+
163
+ 通用紧凑标签,内部使用 `ElTag`,公开 `tone`、`size`、`effect`、`closable`、`round`、`disabled` 和默认 slot。`tone` 支持 `neutral`、`primary`、`success`、`warning`、`danger`、`info`;`size` 为 `sm`、`md`、`lg`,默认分别映射为 Element Plus 的 `small`、`default`、`large`。
164
+
165
+ ```vue
166
+ <QyTag tone="success" size="sm" closable @close="removeTag">
167
+ 已完成
168
+ </QyTag>
169
+ ```
170
+
171
+ `disabled` 会设置 `aria-disabled="true"`、隐藏关闭按钮并抑制 `click` / `close`;非禁用状态下这两个事件各发出一次 `MouseEvent`。支持 `class`、`style`、`title`、`role`、`data-*`、`aria-*` 安全属性,不公开 `color`、`hit`、`disableTransitions` 或底层 Element Plus 实例。QyTag 不是按钮,不新增键盘按钮语义;需要动作语义时使用 `QyButton`。
172
+
173
+ ### `QyTooltip`
174
+
175
+ 只读提示组件。默认插槽是唯一触发内容,不增加触发元素包装 DOM;`content` 插槽(content slot)优先于 `content` 属性。组件支持 hover / focus、完整 `placement`、`light` / `dark` effect、延迟、偏移和可收缩的 `maxWidth`。
176
+
177
+ ```vue
178
+ <QyTooltip content="说明文字" placement="top-start">
179
+ <button type="button">查看提示</button>
180
+ </QyTooltip>
181
+
182
+ <QyTooltip content="属性内容">
183
+ <button type="button">插槽内容</button>
184
+ <template #content>只读插槽内容</template>
185
+ </QyTooltip>
186
+ ```
187
+
188
+ 默认值为 `placement="top"`、`effect="dark"`、`disabled=false`、`showDelay=0`、`hideDelay=200`、`offset=12`、`maxWidth=320`。事件只有 `open` / `close`,且只在实际可见状态转换时各发一次;不公开 `trigger`、受控 `open`、raw HTML、交互内容、Element Plus attrs/listeners 或实例方法。
189
+
190
+ ### `QyPopover`
191
+
192
+ 交互浮层组件。`reference` 插槽是触发元素,默认插槽是可交互面板内容,不增加触发元素包装 DOM;支持 `click`、`hover`、`focus`、`contextmenu`、完整 `placement`、`light` / `dark` effect、数字或 CSS 字符串 `width`、延迟、偏移、箭头和窄视口收缩。
193
+
194
+ ```vue
195
+ <QyPopover placement="bottom-start" :width="280" @open-change="onOpenChange">
196
+ <template #reference><button type="button">打开操作</button></template>
197
+ <button type="button" @click="submit">确认</button>
198
+ </QyPopover>
199
+
200
+ <QyPopover v-model:open="open" trigger="contextmenu">
201
+ <template #reference><div>右键区域</div></template>
202
+ <div>受控交互内容</div>
203
+ </QyPopover>
204
+ ```
205
+
206
+ 默认值为 `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`。
207
+
208
+ ### `QyUpload`
113
209
 
114
210
  上传组件,支持:
115
211
 
@@ -187,7 +283,7 @@ pnpm install --frozen-lockfile --ignore-scripts
187
283
  - `error` 事件。
188
284
  - `placeholder` 空图占位。
189
285
  - `compressor` 压缩缩略图参数。
190
- - 旧域名兼容:`http` 转 `https`,`ys.diansan.com` `admin.qiyinbz.com`。
286
+ - 旧域名兼容:`ys.diansan.com` 地址迁移为 `https://admin.qiyinbz.com`。
191
287
  - 旧缩略图参数:点三域名使用 `?small=true&style=image/resize,h_{h},w_{w}`,其他域名使用 `?w={w}`。
192
288
  - 失败兜底:缩略图请求失败后请求原图 blob,并用浏览器 canvas 压缩成 dataURL 展示。
193
289
  - `preview / previewList / initialIndex` 图片预览。
@@ -240,11 +336,55 @@ type QyImageProps = {
240
336
 
241
337
  该能力是 `@qynpm/table-schema` 完整迁移 image 列的前置能力。table-schema 不应该长期维护一份独立图片预览逻辑。
242
338
 
243
- ### `QyCheckbox`
244
-
245
- 复选框基础组件,基于 `ElCheckbox` 做薄封装,统一 `v-model`、`change`、`focus`、`blur` 事件和单组件入口。
246
-
247
- 主要用于普通表单复选框,以及 `@qynpm/table-schema` `edit-checkbox` 渲染器底座。
339
+ ### `QyCheckbox`
340
+
341
+ 受控复选框基础组件,基于 `ElCheckbox` 做隔离适配,`modelValue`、`trueValue`、`falseValue` 和事件 payload 均保持 `boolean | string | number` 原始类型,不做隐式布尔转换。
342
+
343
+ 支持 `value`(为后续 `QyCheckboxGroup` 保留的选项值)、只读展示状态 `indeterminate`、`disabled`、`size` 和默认 slot。事件只有 `update:modelValue`、`change`、`focus`、`blur`;禁用状态不产生值变更意图,也不公开 Element Plus 实例或命令式方法。
344
+
345
+ ```vue
346
+ <QyCheckbox
347
+ v-model="ticketValue"
348
+ true-value="Y"
349
+ false-value="N"
350
+ aria-label="开票"
351
+ @change="handleChange"
352
+ >
353
+ 开票
354
+ </QyCheckbox>
355
+ ```
356
+
357
+ `class`、`style`、`id`、`name`、`role`、`title`、`data-*` 和 `aria-*` 会安全透传;桌面交互区域保持紧凑,窄屏下提升到至少 40px。`QyCheckboxGroup`、全选/级联和 `CheckboxButton` 不属于 V1。
358
+
359
+ ### `QyRadio`
360
+
361
+ 受控单选框基础组件,基于 `ElRadio` 做隔离适配。`value` 表示选中值,`label` 只负责展示;默认 slot 优先。`modelValue` 与事件 payload 保持 `boolean | string | number` 原始类型,父级不回写时组件不会自行改变状态,也不会通过再次点击取消选中。
362
+
363
+ 支持 `disabled`、`size`、`name`、`border` 以及 `update:modelValue`、`change`、`focus`、`blur` 事件;安全透传 `class`、`style`、`role`、`title`、`data-*` 和 `aria-*`,不公开 Element Plus 实例或命令式方法。
364
+
365
+ ```vue
366
+ <QyRadio
367
+ v-model="ticketType"
368
+ value="invoice"
369
+ label="开票"
370
+ name="ticket-type"
371
+ border
372
+ @change="handleChange"
373
+ />
374
+ ```
375
+
376
+ ### `QyCheckboxGroup`
377
+
378
+ 受控复选框组,统一管理 `QyCheckboxValue[]`。支持默认 slot 或 `options`(两者同时存在时 slot 优先),并透传 `disabled`、`min`、`max`、`size`。事件只有 `update:modelValue` 和 `change`,每次更新都返回新数组。
379
+
380
+ ```vue
381
+ <QyCheckboxGroup v-model="selected" :options="[
382
+ { label: '阅读', value: 'read' },
383
+ { label: '写作', value: 'write', disabled: true }
384
+ ]" />
385
+ ```
386
+
387
+ options 模式物理复用 `QyCheckbox`;不提供 CheckboxButton、全选、indeterminate 推导、树形/层级选择、布局 props 或 Element Plus 实例。
248
388
 
249
389
  ### `QyAutocomplete`
250
390
 
@@ -436,10 +576,14 @@ type QyImageProps = {
436
576
 
437
577
  - 保持和 `ElInput` 接近的使用方式
438
578
  - `removeSpace`
439
- - `trimMode`
440
- - `enter`
441
- - `textarea`
442
- - 兼容常见 slots expose 方法
579
+ - `trimMode`
580
+ - `enter`
581
+ - `textarea`
582
+ - `modelValue` 支持 `string | number | null | undefined`,用户编辑事件统一输出 `string`
583
+ - 兼容 `text`、`textarea`、`password`、`search` 和 Element Plus 常用属性
584
+ - 兼容 `prefix`、`suffix`、`prepend`、`append` slots
585
+ - 类型出口包含 `QyInputValue`、`QyInputModelValue`、`QyInputProps`、`QyInputEmits` 和 `QyInputExposed`
586
+ - 只公开 `focus`、`blur`、`select`、`clear`、`resizeTextarea` 方法
443
587
 
444
588
  ### `QyMoneyInput`
445
589
 
@@ -460,9 +604,13 @@ type QyImageProps = {
460
604
  - `min / max`
461
605
  - `step`
462
606
  - `step-strictly`
463
- - `precision`
464
- - `controls / controls-position`
465
- - 兼容 `focus / blur` expose 方法
607
+ - `precision`
608
+ - `controls / controls-position`
609
+ - `valueOnClear`(默认 `null`,也支持 `min / max / number`)
610
+ - `readonly / disabled / formatter / parser / inputmode / align`
611
+ - `prefix / suffix / increase-icon / decrease-icon` slots
612
+ - `update:modelValue / input / change / focus / blur` 显式事件
613
+ - 兼容 `focus / blur` expose 方法
466
614
 
467
615
  金额、费用、税费等财务录入场景请优先使用 `QyMoneyInput`,不要用 `QyInputNumber` 做金额格式化。
468
616
 
@@ -473,14 +621,16 @@ type QyImageProps = {
473
621
  - 保持和 `ElDatePicker` 接近的使用方式
474
622
  - `date / datetime / daterange / datetimerange` 等常见类型
475
623
  - `format / value-format`
476
- - `default-time`
477
- - `shortcuts`
478
- - `disabled-date`
479
- - 默认弹层挂载到 `body`
480
- - `normalize-range-end-time` 查询场景结束时间归一化
481
- - 兼容 `focus / blur / handleOpen / handleClose` expose 方法
482
-
483
- `normalize-range-end-time` 默认关闭。只有查询表单需要把范围结束值从当天 `00:00:00` 归一为 `23:59:59` 时再显式开启,避免影响普通日期选择。
624
+ - `default-time`
625
+ - `shortcuts`
626
+ - `disabled-date`
627
+ - `year / month / date / dates / datetime / week / daterange / datetimerange / monthrange`
628
+ - `clearable / disabled / readonly / teleported / append-to / popper-class`
629
+ - `update:modelValue / change / clear / calendar-change / panel-change / visible-change / focus / blur`
630
+ - `default / range-separator / prev-month / next-month / prev-year / next-year` slots
631
+ - 仅公开 `focus() / blur() / open() / close()` expose 方法
632
+
633
+ `normalize-range-end-time` 默认关闭。开启后只处理范围第二项:精确 `00:00:00.000` 的 `Date` 克隆为 `23:59:59.000`,带明确午夜时间的普通/ISO 字符串只替换时间并保留格式及 zone suffix;date-only 字符串、number、非午夜和非范围值保持原引用,不修改父数组或父 `Date`。
484
634
 
485
635
  ### `QyRadioGroup`
486
636
 
@@ -493,23 +643,37 @@ type QyImageProps = {
493
643
  - `option` 插槽自定义选项文案
494
644
  - 事件保持 `update:modelValue`、`change`
495
645
 
496
- `option` 插槽由外部传入,组件会透出当前选项的:
646
+ `option` 插槽由外部传入,组件会透出当前选项的:
497
647
 
498
648
  - `option`:原始选项对象
499
649
  - `label`:映射后的展示文案
500
650
  - `value`:映射后的选项值
501
- - `disabled`:是否禁用
502
-
503
- ### `QySelect`
504
-
505
- 选择器组件,第一版定位为 `ElSelect` 的轻量包装层,重点支持:
506
-
507
- - `options` 直出
508
- - `labelKey / valueKey / disabledKey` 映射
509
- - 单选 / 多选
510
- - `collapse-tags`
511
- - 默认弹层挂载策略
512
- - 保留原生 slot 扩展
651
+ - `disabled`:是否禁用
652
+
653
+ 普通 `options` 模式物理复用 `QyRadio`;`type="button"` 继续使用内部 Element Plus button adapter。已发布的 `getRadioGroupInstance()` 仅为兼容保留并标记为 deprecated,不新增实例能力。
654
+
655
+ ### `QySelect`
656
+
657
+ 受控选择器组件。string、number、boolean、对象值和多选数组会原样通过 `update:modelValue` / `change` 返回;组件不会排序、克隆或隐式转换,父级 `modelValue` 始终是最终状态权威。
658
+
659
+ - `options` 支持 `labelKey / valueKey / disabledKey` 字段映射;默认 slot 有实际内容时优先。
660
+ - `valueKey` 只决定 option 的值字段;对象值需要稳定回显时,使用 `objectIdentityKey` 指定对象身份字段。
661
+ - 支持单选、多选、disabled、clearable、filterable、loading、collapse tags、弹层挂载和 popper class。
662
+ - `autoSelectSingle` 只在 options 模式、当前值为空且唯一 option 未禁用时触发一次 `update:modelValue` 后再触发一次 `change`;父值变为非空后再次清空可重新触发。
663
+ - 保留 prefix、empty、loading、tag 和 default slots,以及 clear、visible-change、focus、blur 事件。
664
+ - 只公开 `focus()` / `blur()`,不公开 Element Plus 实例或 DOM 引用。
665
+
666
+ ```vue
667
+ <QySelect
668
+ v-model="selectedUser"
669
+ :options="userOptions"
670
+ label-key="name"
671
+ value-key="user"
672
+ object-identity-key="id"
673
+ />
674
+ ```
675
+
676
+ 远程请求、防抖和已选项缓存仍由 `QyRemoteSelect` 负责;`QySelect` 不承接业务字典或请求状态编排。
513
677
 
514
678
  ### `QyTreeSelect`
515
679
 
@@ -940,11 +1104,23 @@ function handleSelect(item) {
940
1104
  </template>
941
1105
  ```
942
1106
 
943
- ### QyRadioGroup
944
-
945
- ```vue
946
- <template>
947
- <QyRadioGroup
1107
+ ### QyRadio
1108
+
1109
+ ```vue
1110
+ <template>
1111
+ <QyRadio
1112
+ v-model="ticketType"
1113
+ value="invoice"
1114
+ label="开票"
1115
+ />
1116
+ </template>
1117
+ ```
1118
+
1119
+ ### QyRadioGroup
1120
+
1121
+ ```vue
1122
+ <template>
1123
+ <QyRadioGroup
948
1124
  v-model="openTicket"
949
1125
  :options="ticketOptions"
950
1126
  />