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.
- package/AI_CODING.md +114 -0
- package/AI_USAGE/catalog.md +111 -0
- package/AI_USAGE/components/alert.md +33 -0
- package/AI_USAGE/components/bar-chart.md +48 -0
- package/AI_USAGE/components/button.md +35 -0
- package/AI_USAGE/components/checkbox.md +34 -0
- package/AI_USAGE/components/color-picker.md +36 -0
- package/AI_USAGE/components/config-provider.md +58 -0
- package/AI_USAGE/components/date-picker.md +34 -0
- package/AI_USAGE/components/dialog.md +37 -0
- package/AI_USAGE/components/dropdown.md +38 -0
- package/AI_USAGE/components/empty.md +30 -0
- package/AI_USAGE/components/input.md +32 -0
- package/AI_USAGE/components/line-chart.md +47 -0
- package/AI_USAGE/components/message-box.md +39 -0
- package/AI_USAGE/components/message.md +36 -0
- package/AI_USAGE/components/notification.md +39 -0
- package/AI_USAGE/components/pagination.md +32 -0
- package/AI_USAGE/components/pie-chart.md +55 -0
- package/AI_USAGE/components/popconfirm.md +33 -0
- package/AI_USAGE/components/popover.md +35 -0
- package/AI_USAGE/components/progress.md +33 -0
- package/AI_USAGE/components/radio.md +35 -0
- package/AI_USAGE/components/rate.md +30 -0
- package/AI_USAGE/components/select.md +38 -0
- package/AI_USAGE/components/slider.md +34 -0
- package/AI_USAGE/components/steps.md +33 -0
- package/AI_USAGE/components/switch.md +32 -0
- package/AI_USAGE/components/tabs.md +33 -0
- package/AI_USAGE/components/textarea.md +31 -0
- package/AI_USAGE/components/time-picker.md +34 -0
- package/AI_USAGE/components/upload.md +60 -0
- package/AI_USAGE/core.md +37 -0
- package/AI_USAGE/index.md +52 -0
- package/AI_USAGE/recipes/form-on-demand.md +45 -0
- package/AI_USAGE.md +182 -64
- package/CHANGELOG.md +39 -0
- package/README.md +15 -2
- package/dist/_container/resize-trigger.vue.d.ts +1 -1
- package/dist/_hooks/use-dialog-focus.d.ts +7 -0
- package/dist/_hooks/use-pointer-drag.d.ts +6 -0
- package/dist/_hooks/use-popup-close.d.ts +11 -0
- package/dist/_hooks/use-popup-theme.d.ts +5 -0
- package/dist/_utils/palette.d.ts +2 -0
- package/dist/components/_components/picker/input-range.vue.d.ts +1 -3
- package/dist/components/_components/picker/input.vue.d.ts +1 -3
- package/dist/components/alert/Alert.vue.d.ts +1 -1
- package/dist/components/alert/index.d.ts +3 -3
- package/dist/components/bar-chart/BarChart.d.ts +3 -3
- package/dist/components/bar-chart/index.d.ts +9 -9
- package/dist/components/color-picker/ColorPicker.d.ts +2 -1
- package/dist/components/color-picker/index.d.ts +2 -0
- package/dist/components/color-picker/panel.d.ts +6 -0
- package/dist/components/config-provider/context.d.ts +7 -1
- package/dist/components/date-picker/DatePicker.vue.d.ts +9 -12
- package/dist/components/date-picker/index.d.ts +19 -27
- package/dist/components/drawer/index.d.ts +51 -9
- package/dist/components/drawer/src/Drawer.vue.d.ts +19 -4
- package/dist/components/dropdown/Dropdown.vue.d.ts +6 -3
- package/dist/components/dropdown/DropdownButton.vue.d.ts +6 -3
- package/dist/components/dropdown/DropdownSubmenu.vue.d.ts +6 -3
- package/dist/components/dropdown/dropdown-panel.vue.d.ts +6 -3
- package/dist/components/dropdown/index.d.ts +36 -18
- package/dist/components/form-select/SelectDropdown.vue.d.ts +6 -3
- package/dist/components/form-select/SelectOption.vue.d.ts +1 -0
- package/dist/components/form-select/index.d.ts +15 -6
- package/dist/components/form-slider/Slider.vue.d.ts +1 -1
- package/dist/components/form-slider/index.d.ts +3 -3
- package/dist/components/form-textarea/Textarea.vue.d.ts +2 -4
- package/dist/components/form-textarea/index.d.ts +6 -12
- package/dist/components/image/Image.vue.d.ts +2 -4
- package/dist/components/image/index.d.ts +6 -12
- package/dist/components/layout/LayoutSidebar.vue.d.ts +5 -5
- package/dist/components/layout/index.d.ts +10 -10
- package/dist/components/line-chart/LineChart.d.ts +3 -3
- package/dist/components/line-chart/index.d.ts +9 -9
- package/dist/components/menu/Menu.d.ts +6 -3
- package/dist/components/menu/base-menu.vue.d.ts +6 -3
- package/dist/components/menu/index.d.ts +12 -6
- package/dist/components/menu/sub-menu-pop.vue.d.ts +6 -3
- package/dist/components/network/Network.vue.d.ts +1 -1
- package/dist/components/network/index.d.ts +3 -3
- package/dist/components/pie-chart/PieChart.d.ts +1 -1
- package/dist/components/pie-chart/index.d.ts +3 -3
- package/dist/components/resize-box/ResizeBox.vue.d.ts +2 -2
- package/dist/components/resize-box/index.d.ts +5 -5
- package/dist/components/scrollbar-v2/Scrollbar.vue.d.ts +2 -1
- package/dist/components/scrollbar-v2/index.d.ts +6 -3
- package/dist/components/table/Table.d.ts +1 -1
- package/dist/components/table/index.d.ts +3 -3
- package/dist/components/tabs/Tabs.d.ts +1 -1
- package/dist/components/tabs/index.d.ts +3 -3
- package/dist/components/time-picker/TimeColumn.vue.d.ts +6 -3
- package/dist/components/time-picker/TimePanel.vue.d.ts +6 -3
- package/dist/components/time-picker/TimePicker.vue.d.ts +9 -12
- package/dist/components/time-picker/index.d.ts +19 -27
- package/dist/components/trend-chart/components/TrendChart.d.ts +5 -5
- package/dist/components/trend-chart/components/trend-chart-curve.d.ts +1 -1
- package/dist/components/trend-chart/index.d.ts +14 -14
- package/dist/components/virtual-list-v2/virtual-list.vue.d.ts +7 -4
- package/dist/es/_hooks/use-dialog-focus.js +69 -0
- package/dist/es/_hooks/use-pointer-drag.js +18 -0
- package/dist/es/_hooks/use-popup-close.js +27 -0
- package/dist/es/_hooks/use-popup-manager.js +26 -24
- package/dist/es/_hooks/use-popup-theme.js +18 -0
- package/dist/es/_hooks/use-teleport-container.js +9 -10
- package/dist/es/_utils/palette.js +57 -52
- package/dist/es/components/color-picker/ColorPicker.js +131 -102
- package/dist/es/components/color-picker/gradient-slider.js +38 -40
- package/dist/es/components/color-picker/panel.js +221 -192
- package/dist/es/components/color-picker/sv-panel.js +51 -50
- package/dist/es/components/config-provider/ConfigProvider.js +58 -41
- package/dist/es/components/dialog/Dialog.js +133 -186
- package/dist/es/components/drawer/src/Drawer.vue.js +59 -51
- package/dist/es/components/drawer/src/Drawer.vue2.js +117 -107
- package/dist/es/components/form/FormItem.vue.js +12 -12
- package/dist/es/components/form-select/SelectDropdown.vue.js +7 -7
- package/dist/es/components/form-select/SelectOption.vue.js +20 -17
- package/dist/es/components/form-select/SelectOption.vue2.js +39 -36
- package/dist/es/components/form-switch/Switch.vue.js +24 -24
- package/dist/es/components/image/Image.vue.js +12 -12
- package/dist/es/components/link/Link.vue.js +6 -6
- package/dist/es/components/menu/sub-menu-inline.vue.js +11 -11
- package/dist/es/components/menu/sub-menu-pop.vue.js +12 -12
- package/dist/es/components/notification/Notification.js +59 -59
- package/dist/es/components/resize-box/ResizeBox.vue.js +19 -22
- package/dist/es/components/skeleton/Skeleton.vue.js +9 -9
- package/dist/es/components/tag/Tag.vue.js +7 -7
- package/dist/es/components/trigger/Trigger.js +171 -163
- package/dist/es/style.css +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.umd.js +3 -3
- package/dist/style/bar-chart.js +1 -0
- package/dist/style/base.css +1 -1
- package/dist/style/color-picker.css +1 -1
- package/dist/style/color-picker.js +4 -0
- package/dist/style/date-picker.js +4 -0
- package/dist/style/dependencies.json +296 -0
- package/dist/style/dialog.js +2 -0
- package/dist/style/drawer.js +3 -0
- package/dist/style/dropdown.js +5 -0
- package/dist/style/form-checkbox.css +1 -1
- package/dist/style/form-input-number.js +2 -0
- package/dist/style/form-input.css +1 -1
- package/dist/style/form-input.js +1 -0
- package/dist/style/form-select.css +1 -1
- package/dist/style/form-select.js +5 -0
- package/dist/style/form-slider.js +5 -0
- package/dist/style/form.js +3 -0
- package/dist/style/heatmap.js +1 -0
- package/dist/style/image.js +2 -0
- package/dist/style/layout.js +1 -0
- package/dist/style/line-chart.js +1 -0
- package/dist/style/menu.js +3 -0
- package/dist/style/message-box.js +3 -0
- package/dist/style/pagination.js +9 -0
- package/dist/style/pie-chart.js +1 -0
- package/dist/style/popconfirm.js +3 -0
- package/dist/style/popover.js +1 -0
- package/dist/style/popup.js +2 -0
- package/dist/style/space.css +1 -1
- package/dist/style/table.js +12 -0
- package/dist/style/time-picker.js +3 -0
- package/dist/style/tooltip.js +1 -0
- package/dist/style/upload.js +4 -0
- package/dist/style.css +1 -1
- package/package.json +17 -7
package/AI_USAGE.md
CHANGED
|
@@ -1,48 +1,53 @@
|
|
|
1
|
-
<!-- Generated by pnpm generate:ai-usage. Edit
|
|
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.
|
|
4
|
+
适用版本:**x-next@1.11.1**。Vue:`^3.5.0`;Node:`>=20.19.0`。
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
来源指纹(精选示例、映射、样式依赖、版本与公开类型声明):`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
7
7
|
|
|
8
|
-
本手册覆盖
|
|
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
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
-
|
|
68
|
-
- **保持受控值稳定**:`v-model`
|
|
69
|
-
- **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo
|
|
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
|
|
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
|
|
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'
|
|
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`
|
|
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`
|
|
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
|
|
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()`
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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<
|
|
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
|
+
};
|
package/dist/_utils/palette.d.ts
CHANGED
|
@@ -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<
|
|
75
|
+
cls: import('vue').ComputedRef<import('vue').ClassValue[]>;
|
|
76
76
|
rootAttrs: import('vue').ComputedRef<{
|
|
77
77
|
[x: string]: unknown;
|
|
78
78
|
}>;
|