x-next 1.10.1 → 1.11.1

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 (167) hide show
  1. package/AI_CODING.md +114 -0
  2. package/AI_USAGE/catalog.md +111 -0
  3. package/AI_USAGE/components/alert.md +33 -0
  4. package/AI_USAGE/components/bar-chart.md +48 -0
  5. package/AI_USAGE/components/button.md +35 -0
  6. package/AI_USAGE/components/checkbox.md +34 -0
  7. package/AI_USAGE/components/color-picker.md +36 -0
  8. package/AI_USAGE/components/config-provider.md +58 -0
  9. package/AI_USAGE/components/date-picker.md +34 -0
  10. package/AI_USAGE/components/dialog.md +37 -0
  11. package/AI_USAGE/components/dropdown.md +38 -0
  12. package/AI_USAGE/components/empty.md +30 -0
  13. package/AI_USAGE/components/input.md +32 -0
  14. package/AI_USAGE/components/line-chart.md +47 -0
  15. package/AI_USAGE/components/message-box.md +39 -0
  16. package/AI_USAGE/components/message.md +36 -0
  17. package/AI_USAGE/components/notification.md +39 -0
  18. package/AI_USAGE/components/pagination.md +32 -0
  19. package/AI_USAGE/components/pie-chart.md +55 -0
  20. package/AI_USAGE/components/popconfirm.md +33 -0
  21. package/AI_USAGE/components/popover.md +35 -0
  22. package/AI_USAGE/components/progress.md +33 -0
  23. package/AI_USAGE/components/radio.md +35 -0
  24. package/AI_USAGE/components/rate.md +30 -0
  25. package/AI_USAGE/components/select.md +38 -0
  26. package/AI_USAGE/components/slider.md +34 -0
  27. package/AI_USAGE/components/steps.md +33 -0
  28. package/AI_USAGE/components/switch.md +32 -0
  29. package/AI_USAGE/components/tabs.md +33 -0
  30. package/AI_USAGE/components/textarea.md +31 -0
  31. package/AI_USAGE/components/time-picker.md +34 -0
  32. package/AI_USAGE/components/upload.md +60 -0
  33. package/AI_USAGE/core.md +37 -0
  34. package/AI_USAGE/index.md +52 -0
  35. package/AI_USAGE/recipes/form-on-demand.md +45 -0
  36. package/AI_USAGE.md +182 -64
  37. package/CHANGELOG.md +39 -0
  38. package/README.md +15 -2
  39. package/dist/_container/resize-trigger.vue.d.ts +1 -1
  40. package/dist/_hooks/use-dialog-focus.d.ts +7 -0
  41. package/dist/_hooks/use-pointer-drag.d.ts +6 -0
  42. package/dist/_hooks/use-popup-close.d.ts +11 -0
  43. package/dist/_hooks/use-popup-theme.d.ts +5 -0
  44. package/dist/_utils/palette.d.ts +2 -0
  45. package/dist/components/_components/picker/input-range.vue.d.ts +1 -3
  46. package/dist/components/_components/picker/input.vue.d.ts +1 -3
  47. package/dist/components/alert/Alert.vue.d.ts +1 -1
  48. package/dist/components/alert/index.d.ts +3 -3
  49. package/dist/components/bar-chart/BarChart.d.ts +3 -3
  50. package/dist/components/bar-chart/index.d.ts +9 -9
  51. package/dist/components/color-picker/ColorPicker.d.ts +2 -1
  52. package/dist/components/color-picker/index.d.ts +2 -0
  53. package/dist/components/color-picker/panel.d.ts +6 -0
  54. package/dist/components/config-provider/context.d.ts +7 -1
  55. package/dist/components/date-picker/DatePicker.vue.d.ts +9 -12
  56. package/dist/components/date-picker/index.d.ts +19 -27
  57. package/dist/components/drawer/index.d.ts +51 -9
  58. package/dist/components/drawer/src/Drawer.vue.d.ts +19 -4
  59. package/dist/components/dropdown/Dropdown.vue.d.ts +6 -3
  60. package/dist/components/dropdown/DropdownButton.vue.d.ts +6 -3
  61. package/dist/components/dropdown/DropdownSubmenu.vue.d.ts +6 -3
  62. package/dist/components/dropdown/dropdown-panel.vue.d.ts +6 -3
  63. package/dist/components/dropdown/index.d.ts +36 -18
  64. package/dist/components/form-select/SelectDropdown.vue.d.ts +6 -3
  65. package/dist/components/form-select/SelectOption.vue.d.ts +1 -0
  66. package/dist/components/form-select/index.d.ts +15 -6
  67. package/dist/components/form-slider/Slider.vue.d.ts +1 -1
  68. package/dist/components/form-slider/index.d.ts +3 -3
  69. package/dist/components/form-textarea/Textarea.vue.d.ts +2 -4
  70. package/dist/components/form-textarea/index.d.ts +6 -12
  71. package/dist/components/image/Image.vue.d.ts +2 -4
  72. package/dist/components/image/index.d.ts +6 -12
  73. package/dist/components/layout/LayoutSidebar.vue.d.ts +5 -5
  74. package/dist/components/layout/index.d.ts +10 -10
  75. package/dist/components/line-chart/LineChart.d.ts +3 -3
  76. package/dist/components/line-chart/index.d.ts +9 -9
  77. package/dist/components/menu/Menu.d.ts +6 -3
  78. package/dist/components/menu/base-menu.vue.d.ts +6 -3
  79. package/dist/components/menu/index.d.ts +12 -6
  80. package/dist/components/menu/sub-menu-pop.vue.d.ts +6 -3
  81. package/dist/components/network/Network.vue.d.ts +1 -1
  82. package/dist/components/network/index.d.ts +3 -3
  83. package/dist/components/pie-chart/PieChart.d.ts +1 -1
  84. package/dist/components/pie-chart/index.d.ts +3 -3
  85. package/dist/components/resize-box/ResizeBox.vue.d.ts +2 -2
  86. package/dist/components/resize-box/index.d.ts +5 -5
  87. package/dist/components/scrollbar-v2/Scrollbar.vue.d.ts +2 -1
  88. package/dist/components/scrollbar-v2/index.d.ts +6 -3
  89. package/dist/components/table/Table.d.ts +1 -1
  90. package/dist/components/table/index.d.ts +3 -3
  91. package/dist/components/tabs/Tabs.d.ts +1 -1
  92. package/dist/components/tabs/index.d.ts +3 -3
  93. package/dist/components/time-picker/TimeColumn.vue.d.ts +6 -3
  94. package/dist/components/time-picker/TimePanel.vue.d.ts +6 -3
  95. package/dist/components/time-picker/TimePicker.vue.d.ts +9 -12
  96. package/dist/components/time-picker/index.d.ts +19 -27
  97. package/dist/components/trend-chart/components/TrendChart.d.ts +5 -5
  98. package/dist/components/trend-chart/components/trend-chart-curve.d.ts +1 -1
  99. package/dist/components/trend-chart/index.d.ts +14 -14
  100. package/dist/components/virtual-list-v2/virtual-list.vue.d.ts +7 -4
  101. package/dist/es/_hooks/use-dialog-focus.js +69 -0
  102. package/dist/es/_hooks/use-pointer-drag.js +18 -0
  103. package/dist/es/_hooks/use-popup-close.js +27 -0
  104. package/dist/es/_hooks/use-popup-manager.js +26 -24
  105. package/dist/es/_hooks/use-popup-theme.js +18 -0
  106. package/dist/es/_hooks/use-teleport-container.js +9 -10
  107. package/dist/es/_utils/palette.js +57 -52
  108. package/dist/es/components/color-picker/ColorPicker.js +131 -102
  109. package/dist/es/components/color-picker/gradient-slider.js +38 -40
  110. package/dist/es/components/color-picker/panel.js +221 -192
  111. package/dist/es/components/color-picker/sv-panel.js +51 -50
  112. package/dist/es/components/config-provider/ConfigProvider.js +58 -41
  113. package/dist/es/components/dialog/Dialog.js +133 -186
  114. package/dist/es/components/drawer/src/Drawer.vue.js +59 -51
  115. package/dist/es/components/drawer/src/Drawer.vue2.js +117 -107
  116. package/dist/es/components/form/FormItem.vue.js +12 -12
  117. package/dist/es/components/form-select/SelectDropdown.vue.js +7 -7
  118. package/dist/es/components/form-select/SelectOption.vue.js +20 -17
  119. package/dist/es/components/form-select/SelectOption.vue2.js +39 -36
  120. package/dist/es/components/form-switch/Switch.vue.js +24 -24
  121. package/dist/es/components/image/Image.vue.js +12 -12
  122. package/dist/es/components/link/Link.vue.js +6 -6
  123. package/dist/es/components/menu/sub-menu-inline.vue.js +11 -11
  124. package/dist/es/components/menu/sub-menu-pop.vue.js +12 -12
  125. package/dist/es/components/notification/Notification.js +59 -59
  126. package/dist/es/components/resize-box/ResizeBox.vue.js +19 -22
  127. package/dist/es/components/skeleton/Skeleton.vue.js +9 -9
  128. package/dist/es/components/tag/Tag.vue.js +7 -7
  129. package/dist/es/components/trigger/Trigger.js +171 -163
  130. package/dist/es/style.css +1 -1
  131. package/dist/index.cjs +3 -3
  132. package/dist/index.umd.js +3 -3
  133. package/dist/style/bar-chart.js +1 -0
  134. package/dist/style/base.css +1 -1
  135. package/dist/style/color-picker.css +1 -1
  136. package/dist/style/color-picker.js +4 -0
  137. package/dist/style/date-picker.js +4 -0
  138. package/dist/style/dependencies.json +296 -0
  139. package/dist/style/dialog.js +2 -0
  140. package/dist/style/drawer.js +3 -0
  141. package/dist/style/dropdown.js +5 -0
  142. package/dist/style/form-checkbox.css +1 -1
  143. package/dist/style/form-input-number.js +2 -0
  144. package/dist/style/form-input.css +1 -1
  145. package/dist/style/form-input.js +1 -0
  146. package/dist/style/form-select.css +1 -1
  147. package/dist/style/form-select.js +5 -0
  148. package/dist/style/form-slider.js +5 -0
  149. package/dist/style/form.js +3 -0
  150. package/dist/style/heatmap.js +1 -0
  151. package/dist/style/image.js +2 -0
  152. package/dist/style/layout.js +1 -0
  153. package/dist/style/line-chart.js +1 -0
  154. package/dist/style/menu.js +3 -0
  155. package/dist/style/message-box.js +3 -0
  156. package/dist/style/pagination.js +9 -0
  157. package/dist/style/pie-chart.js +1 -0
  158. package/dist/style/popconfirm.js +3 -0
  159. package/dist/style/popover.js +1 -0
  160. package/dist/style/popup.js +2 -0
  161. package/dist/style/space.css +1 -1
  162. package/dist/style/table.js +12 -0
  163. package/dist/style/time-picker.js +3 -0
  164. package/dist/style/tooltip.js +1 -0
  165. package/dist/style/upload.js +4 -0
  166. package/dist/style.css +1 -1
  167. package/package.json +17 -7
package/AI_USAGE.md CHANGED
@@ -1,48 +1,53 @@
1
- <!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/manifest.js. -->
1
+ <!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/manifest.js. -->
2
2
  # x-next AI 使用手册
3
3
 
4
- 适用版本:**x-next@1.10.1**。Vue:`^3.5.0`;Node:`>=20.19.0`。
4
+ 适用版本:**x-next@1.11.1**。Vue:`^3.5.0`;Node:`>=20.19.0`。
5
5
 
6
- 来源指纹(精选示例、映射、版本与公开类型声明):`c37fbf755e64965a7c5f31201af1884cbf1bf81fedb0a8210ed326b16e14709c`。
6
+ 来源指纹(精选示例、映射、样式依赖、版本与公开类型声明):`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
7
7
 
8
- 本手册覆盖 27 个常用组件与服务;包内还有更多导出可用,只是未在此逐个展开。按业务需要选择即可,不必全部使用。
8
+ 本手册覆盖 30 个常用组件与服务;包内还有更多导出可用,只是未在此逐个展开。按业务需要选择即可,不必全部使用。
9
9
 
10
10
  读取入口:`node_modules/x-next/AI_USAGE.md`;可用 `require.resolve('x-next/AI_USAGE.md')` 定位。这个文件名不会自动让所有 AI 工具加载,消费项目应在自己的指令中明确引用。
11
11
 
12
12
  ## 组件选择索引
13
13
 
14
- | 组件/服务 | 公共导出 | 全局标签/形式 | 受控模型 | 详细文档 |
15
- | --- | --- | --- | --- | --- |
16
- | ConfigProvider | `ConfigProvider` | `<x-config-provider>` | 无 | [组件文档](https://x-next.yjmf.com/components/config-provider) |
17
- | Button | `Button` | `<x-button>` | 无 | [组件文档](https://x-next.yjmf.com/components/button) |
18
- | Checkbox | `Checkbox` | `<x-checkbox>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/checkbox) |
19
- | Radio | `Radio` | `<x-radio>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/radio) |
20
- | Select | `Select` | `<x-select>` | `v-model`, `v-model:popup-visible` | [组件文档](https://x-next.yjmf.com/components/select) |
21
- | Slider | `Slider` | `<x-slider>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/slider) |
22
- | Rate | `Rate` | `<x-rate>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/rate) |
23
- | Switch | `Switch` | `<x-switch>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/switch) |
24
- | DatePicker | `DatePicker` | `<x-date-picker>` | `v-model`, `v-model:popup-visible` | [组件文档](https://x-next.yjmf.com/components/date-picker) |
25
- | TimePicker | `TimePicker` | `<x-time-picker>` | `v-model`, `v-model:popup-visible` | [组件文档](https://x-next.yjmf.com/components/time-picker) |
26
- | Alert | `Alert` | `<x-alert>` | `v-model:visible` | [组件文档](https://x-next.yjmf.com/components/alert) |
27
- | Dialog | `DialogComponent`, `Dialog` | `<x-dialog>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/dialog) |
28
- | Message | `Message`, `MessageComponent` | 命令式服务 | 无 | [组件文档](https://x-next.yjmf.com/components/message) |
29
- | MessageBox | `MessageBox` | 命令式服务 | 无 | [组件文档](https://x-next.yjmf.com/components/message-box) |
30
- | Notification | `Notification`, `NotificationComponent` | 命令式服务 | 无 | [组件文档](https://x-next.yjmf.com/components/notification) |
31
- | Popconfirm | `Popconfirm` | `<x-popconfirm>` | `v-model` | [组件文档](https://x-next.yjmf.com/components/popconfirm) |
32
- | Popover | `Popover` | `<x-popover>` | `v-model:popup-visible` | [组件文档](https://x-next.yjmf.com/components/popover) |
33
- | Progress | `Progress` | `<x-progress>` | 无 | [组件文档](https://x-next.yjmf.com/components/progress) |
34
- | Dropdown | `Dropdown` | `<x-dropdown>` | `v-model:popup-visible` | [组件文档](https://x-next.yjmf.com/components/dropdown) |
35
- | Pagination | `Pagination` | `<x-pagination>` | `v-model:current`, `v-model:page-size` | [组件文档](https://x-next.yjmf.com/components/pagination) |
36
- | Steps | `Steps` | `<x-steps>` | `v-model:current` | [组件文档](https://x-next.yjmf.com/components/steps) |
37
- | Tabs | `Tabs` | `<x-tabs>` | `v-model:active-key` | [组件文档](https://x-next.yjmf.com/components/tabs) |
38
- | Empty | `Empty` | `<x-empty>` | 无 | [组件文档](https://x-next.yjmf.com/components/empty) |
39
- | Upload | `Upload` | `<x-upload>` | `v-model:file-list` | [组件文档](https://x-next.yjmf.com/components/upload) |
40
- | BarChart | `BarChart` | `<x-bar-chart>` | 无 | [组件文档](https://x-next.yjmf.com/components/bar-chart) |
41
- | LineChart | `LineChart` | `<x-line-chart>` | 无 | [组件文档](https://x-next.yjmf.com/components/line-chart) |
42
- | PieChart | `PieChart` | `<x-pie-chart>` | 无 | [组件文档](https://x-next.yjmf.com/components/pie-chart) |
43
- 本页为每个组件提供一段可直接复制的 Vue SFC,从 `x-next` 根入口导入。把这些示例交给 AI 编程助手作为上下文,它生成的代码就会使用真实的 props 与事件,而不是照搬其他组件库的属性名。
44
-
45
- 每节开头链接到对应的组件文档,那里有可交互的在线示例和完整 API 表;本页代码聚焦用法要点。随包分发的 `node_modules/x-next/AI_USAGE.md` 是本页的完整版本,可直接提供给 AI 工具读取。
14
+ 样式入口自动包含 base、内部依赖及自身 CSS;依赖列用于直接消费 CSS 时核对,base 只需引入一次。
15
+
16
+ | 组件/服务 | 公共导出 | 全局标签/形式 | 受控模型 | 样式入口 | 内部依赖 CSS | 详细文档 |
17
+ | --- | --- | --- | --- | --- | --- | --- |
18
+ | ConfigProvider | `ConfigProvider` | `<x-config-provider>` | 无 | `x-next/style/base.css` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/config-provider) |
19
+ | ColorPicker | `ColorPicker` | `<x-color-picker>` | `v-model`, `v-model:show` | `x-next/style/color-picker` | `button.css`, `form-input.css`, `form-input-number.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/color-picker) |
20
+ | Button | `Button` | `<x-button>` | 无 | `x-next/style/button` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/button) |
21
+ | Input | `Input` | `<x-input>` | `v-model` | `x-next/style/form-input` | `button.css` | [组件文档](https://x-next.yjmf.com/components/input) |
22
+ | Textarea | `Textarea` | `<x-textarea>` | `v-model` | `x-next/style/form-textarea` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/textarea) |
23
+ | Checkbox | `Checkbox` | `<x-checkbox>` | `v-model` | `x-next/style/form-checkbox` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/checkbox) |
24
+ | Radio | `Radio` | `<x-radio>` | `v-model` | `x-next/style/form-radio` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/radio) |
25
+ | Select | `Select` | `<x-select>` | `v-model`, `v-model:popup-visible` | `x-next/style/form-select` | `empty.css`, `form-checkbox.css`, `scrollbar-v2.css`, `spin.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/select) |
26
+ | Slider | `Slider` | `<x-slider>` | `v-model` | `x-next/style/form-slider` | `button.css`, `form-input.css`, `form-input-number.css`, `trigger.css`, `tooltip.css` | [组件文档](https://x-next.yjmf.com/components/slider) |
27
+ | Rate | `Rate` | `<x-rate>` | `v-model` | `x-next/style/rate` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/rate) |
28
+ | Switch | `Switch` | `<x-switch>` | `v-model` | `x-next/style/form-switch` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/switch) |
29
+ | DatePicker | `DatePicker` | `<x-date-picker>` | `v-model`, `v-model:popup-visible` | `x-next/style/date-picker` | `button.css`, `scrollbar-v2.css`, `time-picker.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/date-picker) |
30
+ | TimePicker | `TimePicker` | `<x-time-picker>` | `v-model`, `v-model:popup-visible` | `x-next/style/time-picker` | `button.css`, `scrollbar-v2.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/time-picker) |
31
+ | Alert | `Alert` | `<x-alert>` | `v-model:visible` | `x-next/style/alert` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/alert) |
32
+ | Dialog | `DialogComponent`, `Dialog` | `<x-dialog>` | `v-model` | `x-next/style/dialog` | `button.css`, `space.css` | [组件文档](https://x-next.yjmf.com/components/dialog) |
33
+ | Message | `Message`, `MessageComponent` | 命令式服务 | 无 | `x-next/style/message` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/message) |
34
+ | MessageBox | `MessageBox` | 命令式服务 | 无 | `x-next/style/message-box` | `button.css`, `dialog.css`, `space.css` | [组件文档](https://x-next.yjmf.com/components/message-box) |
35
+ | Notification | `Notification`, `NotificationComponent` | 命令式服务 | 无 | `x-next/style/notification` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/notification) |
36
+ | Popconfirm | `Popconfirm` | `<x-popconfirm>` | `v-model` | `x-next/style/popconfirm` | `button.css`, `space.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/popconfirm) |
37
+ | Popover | `Popover` | `<x-popover>` | `v-model:popup-visible` | `x-next/style/popover` | `trigger.css` | [组件文档](https://x-next.yjmf.com/components/popover) |
38
+ | Progress | `Progress` | `<x-progress>` | 无 | `x-next/style/progress` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/progress) |
39
+ | Dropdown | `Dropdown` | `<x-dropdown>` | `v-model:popup-visible` | `x-next/style/dropdown` | `button.css`, `empty.css`, `scrollbar-v2.css`, `spin.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/dropdown) |
40
+ | Pagination | `Pagination` | `<x-pagination>` | `v-model:current`, `v-model:page-size` | `x-next/style/pagination` | `button.css`, `empty.css`, `form-checkbox.css`, `form-input.css`, `form-input-number.css`, `form-select.css`, `scrollbar-v2.css`, `spin.css`, `trigger.css` | [组件文档](https://x-next.yjmf.com/components/pagination) |
41
+ | Steps | `Steps` | `<x-steps>` | `v-model:current` | `x-next/style/steps` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/steps) |
42
+ | Tabs | `Tabs` | `<x-tabs>` | `v-model:active-key` | `x-next/style/tabs` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/tabs) |
43
+ | Empty | `Empty` | `<x-empty>` | 无 | `x-next/style/empty` | 无独立依赖 | [组件文档](https://x-next.yjmf.com/components/empty) |
44
+ | Upload | `Upload` | `<x-upload>` | `v-model:file-list` | `x-next/style/upload` | `image.css`, `progress.css`, `trigger.css`, `tooltip.css` | [组件文档](https://x-next.yjmf.com/components/upload) |
45
+ | BarChart | `BarChart` | `<x-bar-chart>` | 无 | `x-next/style/bar-chart` | `spin.css` | [组件文档](https://x-next.yjmf.com/components/bar-chart) |
46
+ | LineChart | `LineChart` | `<x-line-chart>` | 无 | `x-next/style/line-chart` | `spin.css` | [组件文档](https://x-next.yjmf.com/components/line-chart) |
47
+ | PieChart | `PieChart` | `<x-pie-chart>` | 无 | `x-next/style/pie-chart` | `spin.css` | [组件文档](https://x-next.yjmf.com/components/pie-chart) |
48
+ 此文件只维护 AI 使用内容,不用于文档站渲染。组件契约须对照实现、公开类型和行为验证,不能仅凭 JSDoc 推断。完整 Vue SFC 从 `x-next` 根入口导入,生成后接受严格模板检查。
49
+
50
+ 消费方从 `AI_USAGE/index.md` 和 `core.md` 开始,再读所需组件/场景;`AI_USAGE.md` 保留完整兼容版本。组件文档链接供扩展阅读,若说明与当前实现有冲突,应核实实际消费版本与行为,而非机械照抄。
46
51
 
47
52
  ## 安装与初始化
48
53
 
@@ -64,16 +69,57 @@ createApp(App).mount('#app');
64
69
 
65
70
  接入时遵循这些约定:
66
71
 
67
- - **原生属性直接传**:`id`、`name`、`aria-*` 等原生属性不在组件的 props 类型里,需要时用属性对象 `v-bind` 传入;组件 props 和事件照常直接绑定。
68
- - **保持受控值稳定**:`v-model` 要初始化为明确的布尔值、字符串、数字或数组。非受控初始化用 `defaultValue` / `defaultChecked`;把受控值改成 `undefined` 可能切换到内部状态。清空日期、时间统一保存 `''`。
69
- - **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo`。容器须已挂载;局部容器要留意定位、滚动和裁剪,Teleport 到 `body` 的弹层不继承原局部容器的主题变量。
72
+ - **按组件路由传原生属性**:Checkbox / Select 用已核实的 `id/name/aria-*` 属性对象 `v-bind`;Input 用 `inputAttrs`,Textarea 用 `textareaAttrs`。Textarea 的 readonly 也放在 `textareaAttrs` 中。组件 props 和事件直接绑定,不把未知组件 API 塞进 attrs。
73
+ - **保持受控值稳定**:`v-model` 要初始化为明确的布尔值、字符串、数字或数组。非受控初始化用组件实际支持的 `defaultValue` / `defaultChecked`;把受控值改成 `undefined` 可能切换到内部状态。DatePicker / TimePicker 清空实际发出 `undefined`,下方单值字符串示例在业务回调中保存 `''` 以保持受控;这不是组件自动归一化,也不能直接套用于范围模型。
74
+ - **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo`。容器须已挂载;局部容器要留意定位、滚动和裁剪。ConfigProvider 的主题会同步到 Trigger 浮层及组件形态 Dialog / Drawer;单独调用 applyThemeColor 或独立创建命令式实例时,仍需按实际 DOM 宿主处理主题。
70
75
  - **优先用公开主题变量**:参考[样式与主题](https://x-next.yjmf.com/guide/theme)。暗色容器上的 alias 链会重新声明;`themeColor` 写入的内联 primary alias 有覆盖边界,按主题文档设置相关公开 alias。
71
76
  - **约束业务全局 CSS**:reset 用 `:where(...)` 降低优先级并限定作用域;宽泛的原生元素选择器可能覆盖组件样式。自定义内容用插槽和公开属性,不依赖内部结构类名。
72
77
  - **清理页面创建的服务**:保留句柄,在路由页面卸载时调用 `close()`;KeepAlive 页面可在停用时清理。Dialog / MessageBox 的命令式关闭不触发确认、取消回调,业务取消逻辑需自行调用;Message / Notification 的关闭会触发各自的 `onClose`。
73
78
 
79
+ ## 按需样式与表单接入
80
+
81
+ 使用无扩展名的公开 JS 样式入口,例如 `x-next/style/form-select`。它自动引入共享 base、Select 自身及 Trigger、Scrollbar、Empty、Spin、Checkbox 的 CSS;业务不需要逐个维护内部依赖。多个入口由打包器按文件去重。Input / Textarea 的样式路径分别是 `form-input` / `form-textarea`,不要根据组件名猜 `style/input`。
82
+
83
+ 若直接导入 `.css`,需要自己引入 base、自身和全部内部依赖;精选手册索引列出了依赖,发布包 `dist/style/dependencies.json` 提供完整组件映射。全量 `x-next/style.css` 仍可使用。不要同时混用全量与按需方案。
84
+
85
+ 下面是可独立复制的按需表单 SFC,原生属性按各组件真实路由传入。表单控件是行内级元素且宽度 100%,裸放在普通块级容器里会参与行内排版,父级行高会在相邻控件之间留下不均匀间距;示例用 `Space` 纵向堆叠并开启 `fill`,控件撑满父容器且间距一致,业务里也应放进 Space、Form 这类布局容器。
86
+
87
+
88
+ ```vue
89
+ <script setup lang="ts">
90
+ import { ref } from 'vue';
91
+ import { ConfigProvider, Input, Textarea, Select, Checkbox, Space } from 'x-next';
92
+ import 'x-next/style/form-input';
93
+ import 'x-next/style/form-textarea';
94
+ import 'x-next/style/form-select';
95
+ import 'x-next/style/form-checkbox';
96
+ import 'x-next/style/space';
97
+ const title = ref('');
98
+ const summary = ref('只读接入说明');
99
+ const scopes = ref<string[]>(['read']);
100
+ const accepted = ref(false);
101
+ const titleAttrs = { id: 'cms-title', name: 'title', 'aria-label': '标题', required: true };
102
+ const summaryAttrs = { id: 'cms-summary', name: 'summary', 'aria-label': '说明', readonly: true };
103
+ const selectAttrs = { id: 'cms-scopes', 'aria-label': '授权范围' };
104
+ const checkboxAttrs = { name: 'agreement', 'aria-label': '同意条款' };
105
+ const options = [{ value: 'read', label: '读取' }, { value: 'write', label: '写入' }];
106
+ </script>
107
+ <template>
108
+ <ConfigProvider theme-color="#0f766e">
109
+ <Space direction="vertical" fill size="medium">
110
+ <Input v-model="title" :input-attrs="titleAttrs" allow-clear />
111
+ <Textarea v-model="summary" :textarea-attrs="summaryAttrs" />
112
+ <Select v-model="scopes" :options="options" multiple v-bind="selectAttrs" />
113
+ <Checkbox v-model="accepted" v-bind="checkboxAttrs">同意条款</Checkbox>
114
+ </Space>
115
+ <p role="status">标题:{{ title || '空' }};范围:{{ scopes.join(', ') }};同意:{{ accepted }}</p>
116
+ </ConfigProvider>
117
+ </template>
118
+ ```
119
+
74
120
  ## ConfigProvider
75
121
 
76
- 局部品牌色用 `themeColor`,它一次生成色阶并重绑定组件别名;不必逐个覆盖 Button、Switch 的颜色。将弹层宿主放在同一主题子树内,Teleport 后仍能继承。Select 默认跟随祖先滚动;要滚动关闭可传 `triggerProps.scrollToClose`。
122
+ 局部品牌色用 `themeColor`,它一次生成色阶并重绑定组件别名;不必逐个覆盖 Button、Switch 的颜色。默认 body 浮层也会同步当前配置;更换 popupContainer 只用于业务定位和裁剪需要。Select 默认跟随祖先滚动;要滚动关闭可传 `triggerProps.scrollToClose`。
77
123
 
78
124
  ```vue
79
125
  <script setup lang="ts">
@@ -83,7 +129,6 @@ import { Button, ConfigProvider, Select, Switch } from 'x-next';
83
129
  const brand = ref('#2f6feb');
84
130
  const dark = ref(false);
85
131
  const value = ref('day');
86
- const overlayHost = ref<HTMLElement>();
87
132
  const switchAttrs = { 'aria-label': '局部暗色' };
88
133
  const selectAttrs = { 'aria-label': '统计粒度' };
89
134
  const options = [
@@ -99,14 +144,11 @@ const options = [
99
144
  </Button>
100
145
  <Switch v-model="dark" v-bind="switchAttrs" />
101
146
  <Select
102
- v-if="overlayHost"
103
147
  v-model="value"
104
148
  :options="options"
105
- :popup-container="overlayHost"
106
149
  v-bind="selectAttrs"
107
150
  style="width: 160px"
108
151
  />
109
- <div ref="overlayHost" class="brand-overlay" />
110
152
  </ConfigProvider>
111
153
  </template>
112
154
 
@@ -120,20 +162,42 @@ const options = [
120
162
  color: var(--x-color-text-primary);
121
163
  background: var(--x-color-bg-surface);
122
164
  }
123
- .brand-overlay {
124
- position: fixed;
125
- inset: 0;
126
- pointer-events: none;
127
- z-index: 2000;
128
- }
129
165
  </style>
130
166
  ```
131
167
 
132
- 已有主题容器时,也可调用公开 `applyThemeColor(seed, { target, dark })`;切换暗色后需重新调用。只改后代的几条 semantic CSS 变量不会重算祖先 alias;`:tag="null"` 的 ConfigProvider 没有承载局部主题的 DOM。
168
+ 已有主题容器时,也可调用公开 `applyThemeColor(seed, { target, dark })`;切换暗色后需重新调用。只改后代的几条 semantic CSS 变量不会重算祖先 alias;`:tag="null"` 的 ConfigProvider 不创建本级主题边界,仍继承父级配置。
169
+
170
+ ## ColorPicker
171
+
172
+ [组件文档与 live demo](https://x-next.yjmf.com/components/color-picker)。`v-model` 输出 hex 字符串;`v-model:show` 控制面板。清除恢复显式 defaultValue,未提供则提交空字符串;change、clear、confirm 都通知 Form 的 change 通道。自定义触发器将 triggerAttrs 绑定到原生按钮,保留键盘、ARIA、禁用与焦点行为。
173
+
174
+ ```vue
175
+ <script setup lang="ts">
176
+ import { ref } from 'vue';
177
+ import { ColorPicker } from 'x-next';
178
+ const color = ref('#0f766e');
179
+ const show = ref(false);
180
+ const log = ref('等待操作');
181
+ const pickerAttrs = { id: 'brand-color', 'aria-label': '品牌色' };
182
+ </script>
183
+
184
+ <template>
185
+ <ColorPicker v-model="color" v-model:show="show" size="small" v-bind="pickerAttrs"
186
+ :swatches="['#0f766e', '#1c61ff']"
187
+ @change="(value) => log = `change: ${value}`"
188
+ @clear="log = '已清除'"
189
+ @confirm="(value) => log = `confirm: ${value}`">
190
+ <template #trigger="{ value, visible, triggerAttrs }">
191
+ <button v-bind="triggerAttrs">{{ visible ? '选择中' : value }}</button>
192
+ </template>
193
+ </ColorPicker>
194
+ <p role="status">{{ log }};保存值:{{ color || '空' }}</p>
195
+ </template>
196
+ ```
133
197
 
134
198
  ## Button
135
199
 
136
- [组件文档与 live demo](https://x-next.yjmf.com/components/button)。`type` 默认 `'default'`,视觉主按钮用 `'primary'`;`htmlType` 默认 `'button'`,原生提交用 `'submit'`。独立使用时尺寸回退为 `'medium'`,`disabled` / `loading` 默认关闭。
200
+ [组件文档与 live demo](https://x-next.yjmf.com/components/button)。`type` 默认 `'default'`,视觉主按钮用 `'primary'`;`htmlType` 默认 `'button'`,原生提交用 `'submit'`。尺寸优先级为显式 `size` → ButtonGroup → ConfigProvider → `'medium'`;Button 不通过 FormItem 继承尺寸。`disabled` / `loading` 默认关闭。
137
201
 
138
202
  `click` 载荷为 `MouseEvent`,禁用或加载中不会触发。`default`、`prefix`、`suffix`、`icon` 插槽可组合内容;异步业务自行维护 `loading`。
139
203
 
@@ -158,6 +222,53 @@ async function save(_event: MouseEvent) {
158
222
  </template>
159
223
  ```
160
224
 
225
+ ## Input
226
+
227
+ [组件文档与 live demo](https://x-next.yjmf.com/components/input)。`v-model` 为字符串,`input` 随输入触发;失焦、回车或清空时,值相对聚焦时/上次 change 的记录发生变化才触发 `change(value, event)`。`clear(event)` 通知清空按钮操作;readonly 是组件 prop。原生 id、name、aria、required 用 `inputAttrs`,外部 class / style 落在容器。内部装饰用 prefix / suffix,外侧标签用 prepend / append。
228
+
229
+ ```vue
230
+ <script setup lang="ts">
231
+ import { ref } from 'vue';
232
+ import { Input } from 'x-next';
233
+ import 'x-next/style/form-input';
234
+ const title = ref('');
235
+ const log = ref('等待输入');
236
+ const nativeAttrs = { id: 'article-title', name: 'title', 'aria-label': '文章标题', required: true };
237
+ </script>
238
+ <template>
239
+ <label for="article-title">文章标题</label>
240
+ <Input v-model="title" :input-attrs="nativeAttrs" allow-clear
241
+ @input="value => log = `input: ${value}`" @clear="log = '已清空'">
242
+ <template #prefix>标题</template>
243
+ </Input>
244
+ <Input model-value="只读标题" readonly :input-attrs="{ 'aria-label': '只读标题' }" />
245
+ <p role="status">{{ log }};当前值:{{ title }}</p>
246
+ </template>
247
+ ```
248
+
249
+ ## Textarea
250
+
251
+ [组件文档与 live demo](https://x-next.yjmf.com/components/textarea)。`v-model` 为字符串,`input/change/clear` 与输入生命周期联动。原生 id、name、aria、rows、readonly 用 `textareaAttrs`,不支持组件层的 readonly prop;autoSize 控制自动高度。
252
+
253
+ ```vue
254
+ <script setup lang="ts">
255
+ import { ref } from 'vue';
256
+ import { Textarea } from 'x-next';
257
+ import 'x-next/style/form-textarea';
258
+ const summary = ref('');
259
+ const log = ref('等待输入');
260
+ const nativeAttrs = { id: 'article-summary', name: 'summary', 'aria-label': '文章摘要', rows: 3 };
261
+ const readonlyAttrs = { id: 'saved-summary', name: 'savedSummary', 'aria-label': '只读摘要', readonly: true };
262
+ </script>
263
+ <template>
264
+ <label for="article-summary">文章摘要</label>
265
+ <Textarea v-model="summary" :textarea-attrs="nativeAttrs" :auto-size="{ minRows: 3, maxRows: 6 }"
266
+ @input="value => log = `input: ${value}`" />
267
+ <Textarea model-value="已保存的摘要" :textarea-attrs="readonlyAttrs" />
268
+ <p role="status">{{ log }};当前值:{{ summary }}</p>
269
+ </template>
270
+ ```
271
+
161
272
  ## Checkbox
162
273
 
163
274
  [组件文档与 live demo](https://x-next.yjmf.com/components/checkbox)。使用普通 `v-model`;模型支持 `boolean` 或 `(string | number | boolean)[]`,数组模式配合 `value`。`defaultChecked`、`disabled`、`indeterminate` 默认 `false`;半选状态不会替代模型值。
@@ -213,7 +324,7 @@ function changed(value: string | number | boolean, _event: Event) {
213
324
 
214
325
  ## Select
215
326
 
216
- [组件文档与 live demo](https://x-next.yjmf.com/components/select)。`v-model` 返回选项的 `value`;单选通常为标量,多选为数组,也支持对象值。`multiple=false`、`allowClear=false`;单选搜索默认关闭,多选默认开启。`options` 使用可变数组,常用字段是 `label`、`value`、`disabled`。
327
+ [组件文档与 live demo](https://x-next.yjmf.com/components/select)。`v-model` 返回选项的 `value`;单选通常为标量,多选为数组,也支持对象值。`multiple=false`、`allowClear=false`;单选搜索默认关闭,多选默认开启。`options` 是选项对象数组,常用字段是 `label`、`value`、`disabled`。静态数组可直接传入;动态选项用 `ref` / `reactive` 等响应式状态更新,支持替换数组,不要求原地修改;公开类型不接受 readonly 数组时先复制成普通数组。
217
328
 
218
329
  `change(value)` 返回新值,`clear(event)` 返回 `Event`;单选清空通常为 `''`,多选为 `[]`,已选禁用项可能保留。`v-model:popup-visible` 控制弹层,`option` / `empty` / `header` / `footer` 等插槽见组件文档。
219
330
 
@@ -293,7 +404,7 @@ function changed(value: number) { feedback.value = value ? `评分 ${value}` : '
293
404
 
294
405
  [组件文档与 live demo](https://x-next.yjmf.com/components/switch)。普通 `v-model` 支持 `boolean | string | number`;`checkedValue=true`、`uncheckedValue=false`、`defaultChecked=false`,默认 `type='circle'`。`disabled` / `loading` 阻止切换。
295
406
 
296
- `change(value, event)` 返回新值和 `Event`;`beforeChange(newValue)` 可返回布尔值或 Promise,`false` 或拒绝阻止切换。`checked` / `unchecked` 插槽及 `checkedText` / `uncheckedText` 显示两态文案,line 类型不显示文案。
407
+ `change(value, event)` 返回新值和 `Event`;`beforeChange(newValue)` 可返回布尔值或 Promise,`false` 或拒绝阻止切换。`checked` / `unchecked` 插槽及 `checkedText` / `uncheckedText` 显示两态文案;`type='line'` 或有效尺寸为 `'mini'`(含继承尺寸)时均不显示文案。
297
408
 
298
409
  ```vue
299
410
  <script setup lang="ts">
@@ -343,7 +454,7 @@ function changed(value: DatePickerModelValue, _date: unknown, _text: unknown) {
343
454
 
344
455
  [组件文档与 live demo](https://x-next.yjmf.com/components/time-picker)。默认 `type='time'`、`allowClear=true`、`disableConfirm=false`,默认格式为 `'HH:mm:ss'`。`format` 同时决定显示与输出;`step` 用 `{ hour, minute, second }`,各步长默认 `1`。
345
456
 
346
- `change(timeString, time)` 是确认值变化,`select` 是面板选择;字符串载荷为 `string | (string | undefined)[] | undefined`,第二参数为 `unknown`。清空归一化为 `''`;支持 `prefix` / `suffix-icon` / `extra` 插槽及 `disabledHours` 等限制。
457
+ `change(timeString, time)` 是确认值变化,`select` 是面板选择;字符串载荷为 `string | (string | undefined)[] | undefined`,第二参数为 `unknown`。清空发出 `update:modelValue(undefined)` 和 `change(undefined, undefined)`;本例的业务 `update()` 才归一化为 `''` 保持单值字符串受控。支持 `prefix` / `suffix-icon` / `extra` 插槽及 `disabledHours` 等限制。
347
458
 
348
459
  ```vue
349
460
  <script setup lang="ts">
@@ -421,7 +532,7 @@ function cancel() { feedback.value = '已取消'; visible.value = false; }
421
532
 
422
533
  ## Message
423
534
 
424
- [组件文档与 live demo](https://x-next.yjmf.com/components/message)。`Message(options)` 或 `.success()` / `.error()` / `.loading()` 等显示提示。默认 `type='info'`、`duration=3000` 毫秒、`position='top'`、`showClose=false`;`duration=0` 持续显示,内容用 `message` 或 `content`。
535
+ [组件文档与 live demo](https://x-next.yjmf.com/components/message)。`Message(options)` 或 `.success()` / `.error()` / `.loading()` 等显示提示。服务默认 `type='info'`、`duration=3000` 毫秒、`position='top'`、`showClose=false`;`duration=0` 持续显示,内容用 `message` 或 `content`。根入口的 `MessageComponent` 是模板组件,默认 `type='success'`,不要把服务默认值套给组件;需要统一效果时显式传 `type`。
425
536
 
426
537
  返回句柄只有 `close()`;同一容器和位置下再次传相同 `id` 更新消息,没有句柄 `update()`。`onClose(id?)` 在自动或手动关闭时触发;自定义内容可用 VNode / 渲染函数。页面只清理自己持有的句柄。
427
538
 
@@ -482,6 +593,8 @@ onBeforeUnmount(() => handle?.close());
482
593
 
483
594
  [组件文档与 live demo](https://x-next.yjmf.com/components/notification)。`Notification(options)` 或 `.success()` 等显示通知。服务默认 `type='info'`、`duration=3000` 毫秒、`position='top-right'`、`offset=20`、`showClose=true`;四角位置可选,`duration=0` 持续显示。
484
595
 
596
+ 根入口 `NotificationComponent` 是模板组件,默认 `offset=0`,与命令式服务不同;模板组件和服务选项按各自公开类型使用。
597
+
485
598
  `title` 和 `message` / `content` 是内容,`footer` / `icon` 可用 VNode 或渲染函数。返回句柄只有 `close()`;同一容器与位置下复用 `id` 更新。`onClick()` 无参数,`onClose(id?)` 接收标识;`.remove(id)` / `.clear(position?)` 是服务级方法。
486
599
 
487
600
  ```vue
@@ -536,7 +649,7 @@ function cancel(_event: Event) { feedback.value = '已取消删除'; }
536
649
 
537
650
  [组件文档与 live demo](https://x-next.yjmf.com/components/popover)。使用 `v-model:popup-visible`;默认 `trigger='click'`、`position='bottom'`、`showArrow=false`、`defaultPopupVisible=false`、`unmountOnClose=true`。默认插槽是触发器,`title` / `content` 插槽放浮层内容。
538
651
 
539
- `popup-visible-change(visible)` 返回布尔值,`show` / `hide` 无参数。点击触发器或外部默认可以关闭;`popupContainer` 和 `renderToBody` 决定宿主,局部主题下按实际挂载位置核对样式。
652
+ `popup-visible-change(visible)` 返回布尔值,`show` / `hide` 无参数。点击触发器或外部默认可以关闭;`popupContainer` 和 `renderToBody` 决定宿主,用于定位、滚动及裁剪。通过 ConfigProvider 配置的主题会由 Trigger 同步到浮层根,默认挂到 body 也生效;任意业务 CSS 变量或仅在局部 DOM 调用 applyThemeColor 不等于该注入协议,仍要核对实际继承。
540
653
 
541
654
  ```vue
542
655
  <script setup lang="ts">
@@ -563,7 +676,7 @@ function changed(value: boolean) { feedback.value = value ? '说明已打开' :
563
676
 
564
677
  [组件文档与 live demo](https://x-next.yjmf.com/components/progress)。`percent` 为 **0 到 1** 的比例,默认 `0`,不是 0 到 100;超出范围会裁剪,非有限值显示为 0。默认 `type='line'`、`showText=true`、`animation=false`,`steps>0` 使用分段模式。
565
678
 
566
- 无模型和业务 change 事件,由业务更新 `percent`。`status` 为 normal、success、warning、danger,未设置时达到 1 自动为 success;`text` 插槽提供 `{ percent }`。
679
+ 无模型和业务 change 事件,由业务更新 `percent`。`status` 为 `'normal' | 'success' | 'warning' | 'strong' | 'danger'`,未设置时达到 1 自动为 success;显式 status 优先,`strong` 不表示完成。`text` 插槽提供 `{ percent }`。
567
680
 
568
681
  ```vue
569
682
  <script setup lang="ts">
@@ -578,6 +691,7 @@ function advance() { percent.value = Math.min(1, percent.value + 0.25); }
578
691
  <Progress :percent="percent">
579
692
  <template #text="scope">已完成 {{ Math.round(scope.percent * 100) }}%</template>
580
693
  </Progress>
694
+ <Progress :percent="percent" status="strong" />
581
695
  <Button :disabled="percent >= 1" @click="advance">推进任务</Button>
582
696
  </div>
583
697
  </template>
@@ -713,9 +827,9 @@ function refresh() { refreshed.value = true; }
713
827
 
714
828
  [组件文档与 live demo](https://x-next.yjmf.com/components/upload)。`action` 是上传地址,也可用 `customRequest` 接管请求;两者都没提供时组件不会发起上传。`name` 是 FormData 字段名,默认 `'file'`;`method` 默认 `'post'`,`withCredentials` 默认 `false`。
715
829
 
716
- **接入已有上传方法的推荐写法**:`customRequest` 返回 Promise 时组件自动接管状态,resolve 即成功(结果写入 `file.response`,可用 `responseUrlKey` 提取 url,字符串支持 `data.url` 嵌套路径)、reject 即失败并出现重试入口,无需手动调用 `onSuccess` / `onError`。axios、flyio、fetch 或任何返回 Promise 的方法都适用。返回值是 fetch `Response` 时组件读取响应体;非 2xx 按失败处理,`error.status` 为状态码。需要进度与取消时,把 option 的 `signal`(取消 / 移除 / 卸载时触发)与 `onProgress`(0 ~ 1)透传给底层请求。返回 `{ abort }` 并手动回调的旧写法仍然支持。
830
+ **接入已有上传方法的推荐写法**:`customRequest` 返回 Promise 时组件自动接管状态,通常 resolve 成功(结果写入 `file.response`,可用 `responseUrlKey` 提取 url,字符串支持 `data.url` 嵌套路径)、reject 失败并出现重试入口,无需手动调用 `onSuccess` / `onError`。axios、flyio、fetch 或任何返回 Promise 的方法都适用。fetch `Response` 为非 2xx 时,即使 Promise resolve 也按失败处理,`error.status` 为状态码;成功响应仅对 JSON/text 内容类型解析,二进制等其他类型保留 Response 本体,不自动转为 Blob。需要进度与取消时,把 option 的 `signal`(取消 / 移除 / 卸载时触发)与 `onProgress`(0 ~ 1)透传给底层请求。返回 `{ abort }` 并手动回调的旧写法仍然支持。
717
831
 
718
- 列表默认非受控,用 `defaultFileList` 给初值;需要外部驱动时用 `v-model:file-list`,列表项以 `uid` 为稳定标识。`listType` 取 `'text' | 'picture' | 'picture-card'`。`limit` 为数量上限,超出会触发 `exceed`,超出部分不进入列表;`beforeUpload` 返回 `false` 拦截、返回新 `File` 替换,支持 Promise。
832
+ 列表默认非受控,用 `defaultFileList` 给初值;需要外部驱动时用 `v-model:file-list`,列表项以 `uid` 为稳定标识。`listType` 取 `'text' | 'picture' | 'picture-card'`。`limit` 为数量上限,超出会触发 `exceed`,超出部分不进入列表。`beforeUpload` 返回 `false`、抛错或 Promise reject 都会拒绝入列并触发 `reject`;返回 `File` 替换文件,返回 `Blob` / string 则用原文件名生成新 File。string 是文件内容而非下载 URL;以上返回形式支持 Promise。
719
833
 
720
834
  `change({ file, fileList })` 覆盖加入、进度、成功、失败和移除;`success` / `error` / `remove` / `progress` 是更细粒度的补充。`autoUpload=false` 时文件先以 `init` 入列,再用组件 `submit()` 上传、`abort()` 取消、`retry()` 重试。图片卡场景可加 `image-preview` 用内置 `ImagePreview` 看图。
721
835
 
@@ -763,11 +877,13 @@ function beforeUpload(file: File) {
763
877
 
764
878
  ## BarChart
765
879
 
766
- [组件文档与 live demo](https://x-next.yjmf.com/components/bar-chart)。按天 / 小时聚合的柱状趋势图:`categories` 是类目轴标签,`series` 是数据系列(`{ name, data, color }`),两者按下标对应。单系列就是普通柱状图;多系列默认并排,加 `stack` 变成堆叠并显示合计。轻量迷你走势用 TrendChart,需要坐标轴与读数用本组件。
880
+ [组件文档与 live demo](https://x-next.yjmf.com/components/bar-chart)。按天 / 小时聚合的柱状趋势图:`categories` 是类目轴标签,`series` 是数据系列(`{ name, data, color }`),两者按下标对应。单系列就是普通柱状图;多系列默认并排,加 `stack` 变成堆叠。默认提示在当前类目有效条目多于一项时显示合计,与 stack 无直接关联;多系列时零值条目会过滤,隐藏系列不参与提示。轻量迷你走势用 TrendChart,需要坐标轴与读数用本组件。
767
881
 
768
882
  数值轴自动取 1/2/5 步长的整洁刻度(所以刻度行数可能少于 `grid.horizontalLinesNumber`);传 `max` 可锁定上界。`loading` 显示加载遮罩;数据全为 0 时显示空态,可用 `empty` 插槽替换。`null` / 负数按 0 处理且不画柱体。
769
883
 
770
- `tooltip` 默认开启,`legend` 开启后点击图例可隐藏系列并触发 `legendChange`;点击柱体触发 `barClick`,命中具体柱体时带 `seriesIndex` / `value`,未命中时为 `null`。`valueFormatter` 统一控制提示、图例与数值轴的数字格式。
884
+ `tooltip` 默认开启,`legend` 开启后点击图例可隐藏系列并触发 `legendChange`。默认图例只显示色块和系列名,不显示数值;`valueFormatter` 作用于默认提示与数值轴,`labels.yFormatter` 可单独覆盖数值轴,不改变图例。
885
+
886
+ SVG 点击的 x 落在横向类目范围内才触发 `barClick`;直接命中柱体时带 `seriesIndex` / `value`,该范围内未命中柱体则这两个字段为 `null`。x 在类目范围外不触发;不要把此逻辑当成完整二维绘图区边界判断。
771
887
 
772
888
  ```vue
773
889
  <script setup lang="ts">
@@ -805,7 +921,9 @@ function onBarClick(data: { label: string; total: number; value: number | null }
805
921
 
806
922
  **缺测要显式表达**:把没有数据的点写成 `null`,默认会在该处**断开**折线(不会画成跌到 0);确需连线时传 `:connect-nulls="true"`。数值轴对纯正数数据保持 0 基线,出现负值才向下扩展;`min` / `max` 可锁定区间。`smooth` 默认开启,`show-points` 默认 `'auto'`(点数少时常显)。
807
923
 
808
- `tooltip` 默认开启,`legend` 开启后点击图例可隐藏系列并触发 `legendChange`(数值轴会按剩余可见系列重算);点击触发 `lineClick`,命中数据点时带 `seriesIndex` / `value`。`valueFormatter` 同时作用于提示与图例,`labels.yFormatter` 只作用于数值轴。
924
+ `tooltip` 默认开启,`legend` 开启后点击图例可隐藏系列并触发 `legendChange`(数值轴会按剩余可见系列重算)。默认图例只显示色块和系列名,不显示数值;`valueFormatter` 作用于默认提示与数值轴,`labels.yFormatter` 可单独覆盖数值轴。
925
+
926
+ SVG 点击的 x 落在横向类目范围内才触发 `lineClick`。直接命中圆点时带该点的 `seriesIndex` / `value`;未直接命中时取对应类目中 y 距离最近的可见数据点,只有没有候选点时这两个字段才为 `null`,不是“点空白必为 null”。x 在类目范围外不触发;这不是完整二维绘图区边界判断。
809
927
 
810
928
  ```vue
811
929
  <script setup lang="ts">
@@ -813,7 +931,7 @@ import { ref } from 'vue';
813
931
  import { LineChart } from 'x-next';
814
932
  import 'x-next/dist/style.css';
815
933
  const categories = ref(['09-28', '09-29', '09-30', '10-01', '10-02']);
816
- // 10-01 当天缺测:null 会让折线在该处断开
934
+ // 09-30 当天缺测:null 会让折线在该处断开
817
935
  const series = ref([
818
936
  { name: '请求量', data: [820, 932, null, 934, 1290] },
819
937
  { name: '错误数', data: [12, 18, null, 9, 22] },
package/CHANGELOG.md CHANGED
@@ -2,6 +2,45 @@
2
2
 
3
3
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [1.11.1] - 2026-10-07
6
+
7
+ ### 修复
8
+
9
+ - Space `fill` 的间距项规则此前编译成 `.x-space-fill--item`,与运行时类名 `.x-space--item` 不符,`flex: 1` 从未生效;改为直接命中子项后,「撑满父容器并等分可用空间」的公开语义恢复。
10
+ - Space 垂直方向 `fill` 补 `align-items: stretch`,宽度 100% 的表单控件不再被默认 `align="center"` 收缩成内容宽度;文档「撑满宽度」示例的输入框由实测 26px 恢复为满宽,间距项同时改为 flex 容器,控件不再参与行内排版。
11
+
12
+ ### 文档
13
+
14
+ - AI 使用指南的按需表单示例改用 `Space` 纵向堆叠并引入 `style/space`,说明表单控件是行内级元素、需放进 Space / Form 这类布局容器,避免裸放在块级容器时因父级行高产生 `0 / 6 / 0` 式不均匀间距。完整 SFC、精选手册按需表单片段与文档站 live demo 同步。
15
+
16
+ ### 工程与验证
17
+
18
+ - 新增 Space 填充的编译产物守卫,拦截「SCSS 可编译但选择器永不适配」这类单元测试与构建都发现不了的静默缺陷;已用还原旧写法的负向验证确认守卫有效。
19
+ - 新增 Space 单组件缺陷与示例修复记录;`pnpm run build`、`check:compiled-css`、`docs:build`、`check:ai-usage`、`test:ai-usage`、Space 单测(25 例)通过。
20
+
21
+ ## [1.11.0] - 2026-10-06
22
+
23
+ ### 新增
24
+
25
+ - 随包提供 `AI_CODING.md` 官方编程使用规范和可复制到业务 AGENTS.md 的规则,明确版本定位、按章节检索、API 核实、验证和同团队双仓交付。保留完整 `AI_USAGE.md`,不要求 Agent 每次全文读取;精选手册补 Input、Textarea、ColorPicker 及完整按需表单示例。
26
+ - 新增独立 `AI_USAGE/`:短索引、通用规则、30 个精选组件/服务文件、按需表单完整 SFC 和公共类型导航;从已校验内容自动生成,检查来源、类型、示例、路径与发布完整性。文档站组件说明不因 AI 拆分修改。
27
+ - 按需 JS 样式入口自动引入传递依赖,并按全量 Sass 顺序生成;提供 `dist/style/dependencies.json`,加入真实生产消费、浏览器及负向回归门禁。
28
+
29
+ ### 修复
30
+
31
+ - 精确声明按需 JS 样式入口的副作用,避免生产 tree-shaking 丢失 CSS;补齐 Select 的浮层、滚动、空态、加载和多选 Checkbox 样式。
32
+ - Checkbox 原生输入恢复有效透明点击盒与默认/自定义图形焦点外框;Select 内嵌 Checkbox 的输入、文案和选项点击只提交一次,保留禁用和受控回写。
33
+ - ConfigProvider 响应式继承语言、尺寸、空态和主题配置;局部主题随 Trigger、Dialog、Drawer 的 Teleport 根同步,显式业务 token 保持优先。
34
+ - 修复弹层登记卸载、宿主迁移监听及定位;Dialog / Drawer 加强模态焦点、原生 radio 与 tabindex 顺序、焦点恢复和异步关闭防重。
35
+ - ColorPicker 补齐四档尺寸、Form 联动、自定义触发器契约、键盘语义及指针生命周期;Notification 原生属性和鼠标事件保留根结构。
36
+ - InputGroup 修复 Select 类名、接缝与内侧圆角;系统色焦点覆盖局部主题及浮层,共享动画响应减少动效;去除重复基础主题声明。
37
+
38
+ ### 工程与验证
39
+
40
+ - 扩充源码、样式、文档 API、覆盖率、发布包与安全审计门禁,保持现有体积预算。
41
+ - 修补可升级的传递开发依赖;生产审计无告警,两个无上游补丁的开发工具例外精确登记,2026-11-06 到期。
42
+ - 本次验收范围和剩余的平台、文档及业务回归任务见 `完整审查/`。尚未宣称所有组件、浏览器或宿主业务 E2E 全面验收。
43
+
5
44
  ## [1.10.1] - 2026-10-06
6
45
 
7
46
  ### 修复
package/README.md CHANGED
@@ -233,13 +233,26 @@ import {
233
233
 
234
234
  ## AI 辅助开发
235
235
 
236
- 包内附带 `AI_USAGE.md`,包含常用组件的真实 props、事件与可直接复制的 Vue 示例,可作为 AI 编程助手的上下文:
236
+ AI 编程资料独立随包分发,文档站组件说明仍保持完整。推荐先读 `AI_CODING.md` 中的使用流程,并把其中的 x-next 规则合并到业务仓库 `AGENTS.md`;模型不需要预先了解 x-next。
237
+
238
+ ```text
239
+ node_modules/x-next/AI_CODING.md
240
+ node_modules/x-next/AI_USAGE/index.md
241
+ node_modules/x-next/AI_USAGE/core.md
242
+ node_modules/x-next/AI_USAGE/components/select.md
243
+ ```
244
+
245
+ Agent 先读短索引与通用规则,再按任务读取组件/场景文件。组件页包含真实 API 约束、模型、事件、样式及完整 Vue SFC,与严格校验的手册同源;不要把全文或整个目录反复加入上下文。未收录的能力通过 `AI_USAGE/catalog.md` 查公开类型。
246
+
247
+ 这些文件可用 `require.resolve('x-next/AI_USAGE/index.md')` 等公开路径定位。文件名不会让所有 AI 工具自动加载,业务项目应在自己的指令中明确引用。
248
+
249
+ 完整 `AI_USAGE.md` 继续兼容提供,旧包按章节读取:
237
250
 
238
251
  ```text
239
252
  node_modules/x-next/AI_USAGE.md
240
253
  ```
241
254
 
242
- 可用 `require.resolve('x-next/AI_USAGE.md')` 定位该文件。建议在项目自己的 AI 指令里写明这个路径——文件名本身不会让工具自动加载。文档站的 [AI 使用指南](https://x-next.yjmf.com/guide/ai-usage) 是同一份内容。
255
+ 文档站的 [AI 使用指南](https://x-next.yjmf.com/guide/ai-usage) 保留完整示例内容。
243
256
 
244
257
  ## 类型提示
245
258
 
@@ -13,7 +13,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
13
13
  wrapperAttrs: import('vue').ComputedRef<{
14
14
  [x: string]: unknown;
15
15
  }>;
16
- classNames: import('vue').ComputedRef<unknown[]>;
16
+ classNames: import('vue').ComputedRef<import('vue').ClassValue[]>;
17
17
  iconClassName: import('vue').ComputedRef<string>;
18
18
  onMousedown: (event: MouseEvent) => void;
19
19
  onKeydown: (event: KeyboardEvent) => void;
@@ -0,0 +1,7 @@
1
+ import { Ref } from 'vue';
2
+ export declare const getTabbableElements: (container: HTMLElement) => HTMLElement[];
3
+ export declare const useDialogFocus: (visible: Ref<boolean>, root: Ref<HTMLElement | undefined>, container: Ref<HTMLElement | undefined>, modal: Ref<boolean>, isTop: () => boolean) => {
4
+ focus: () => void;
5
+ restore: () => void;
6
+ onKeydown: (event: KeyboardEvent) => void;
7
+ };
@@ -0,0 +1,6 @@
1
+ import { Ref } from 'vue';
2
+ /** Pointer input (mouse/touch/pen), with a mouse fallback for older hosts. */
3
+ export declare const usePointerDrag: (disabled: Ref<boolean>, pick: (x: number, y: number) => void) => {
4
+ dragging: Ref<boolean, boolean>;
5
+ start: (event: MouseEvent | PointerEvent) => void;
6
+ };
@@ -0,0 +1,11 @@
1
+ import { Ref } from 'vue';
2
+ type CloseAction = 'ok' | 'cancel';
3
+ /** One close attempt across footer, mask, close icon and Escape. */
4
+ export declare const usePopupClose: (visible: Ref<boolean>, before: (action: CloseAction, event?: Event) => boolean | Promise<boolean>, close: (action: CloseAction, event?: Event) => void) => {
5
+ loading: {
6
+ ok: boolean;
7
+ cancel: boolean;
8
+ };
9
+ requestClose: (action: CloseAction, event?: Event) => void;
10
+ };
11
+ export {};
@@ -0,0 +1,5 @@
1
+ /** Vue injection survives Teleport; reapply its CSS boundary on the actual popup root. */
2
+ export declare const usePopupTheme: () => {
3
+ popupThemeStyle: import('vue').ComputedRef<import('vue').CSSProperties | undefined>;
4
+ popupThemeName: import('vue').ComputedRef<"dark" | undefined>;
5
+ };
@@ -70,6 +70,8 @@ export declare const applyThemeColor: (seed: string, options?: PaletteOptions &
70
70
  name?: string;
71
71
  target?: HTMLElement | null;
72
72
  }) => string[];
73
+ /** Internal declarative counterpart, also usable during SSR and by Teleport roots. */
74
+ export declare const getThemeColorStyles: (seed: string, dark?: boolean) => Record<string, string>;
73
75
  /**
74
76
  * 返回指定色名会写入的全部变量名。
75
77
  * 供 ConfigProvider 在换色/卸载时精确清理,避免残留失效变量。
@@ -46,9 +46,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
46
46
  required: true;
47
47
  };
48
48
  }>, {
49
- wrapperAttrs: import('vue').ComputedRef<Omit<{
50
- [x: string]: unknown;
51
- }, string>>;
49
+ wrapperAttrs: import('vue').ComputedRef<Omit<import('vue').Attrs, string>>;
52
50
  formControlAttrs0: import('vue').ComputedRef<Record<string, unknown>>;
53
51
  formControlAttrs1: import('vue').ComputedRef<Record<string, unknown>>;
54
52
  t: (key: import('../../../locale').LocaleKey | (string & {}), params?: Record<string, string | number>) => string;
@@ -40,9 +40,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
40
40
  required: true;
41
41
  };
42
42
  }>, {
43
- wrapperAttrs: import('vue').ComputedRef<Omit<{
44
- [x: string]: unknown;
45
- }, string>>;
43
+ wrapperAttrs: import('vue').ComputedRef<Omit<import('vue').Attrs, string>>;
46
44
  formControlAttrs: import('vue').ComputedRef<Record<string, unknown>>;
47
45
  t: (key: import('../../../locale').LocaleKey | (string & {}), params?: Record<string, string | number>) => string;
48
46
  feedback: import('vue').Ref<string | undefined, string | undefined>;
@@ -72,7 +72,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
72
72
  modifier: (className: string) => string;
73
73
  is: (className: string) => string;
74
74
  };
75
- cls: import('vue').ComputedRef<unknown[]>;
75
+ cls: import('vue').ComputedRef<import('vue').ClassValue[]>;
76
76
  rootAttrs: import('vue').ComputedRef<{
77
77
  [x: string]: unknown;
78
78
  }>;