x-next 1.10.0 → 1.11.0
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 +97 -0
- package/AI_USAGE/catalog.md +111 -0
- package/AI_USAGE/components/alert.md +33 -0
- package/AI_USAGE/components/bar-chart.md +46 -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 +45 -0
- package/AI_USAGE/components/message-box.md +39 -0
- package/AI_USAGE/components/message.md +36 -0
- package/AI_USAGE/components/notification.md +37 -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 +32 -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 +42 -0
- package/AI_USAGE.md +173 -46
- package/CHANGELOG.md +36 -1
- 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/_components/select-view/select-view.d.ts +9 -0
- 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/Select.d.ts +18 -5
- 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/SelectOptionGroup.vue.d.ts +1 -0
- package/dist/components/form-select/hooks/use-options.d.ts +1 -1
- package/dist/components/form-select/hooks/use-select.d.ts +1 -1
- package/dist/components/form-select/index.d.ts +57 -17
- package/dist/components/form-select/interface.d.ts +8 -0
- 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/pagination/page-options.vue.d.ts +60 -32
- 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/trigger/interface.d.ts +2 -0
- 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/_components/select-view/select-view.js +89 -78
- package/dist/es/components/button/Button.js +1 -1
- 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-input-tag/InputTag.js +1 -1
- package/dist/es/components/form-select/Select.js +348 -300
- package/dist/es/components/form-select/SelectDropdown.vue.js +7 -7
- package/dist/es/components/form-select/SelectOption.vue.js +22 -17
- package/dist/es/components/form-select/SelectOption.vue2.js +59 -51
- package/dist/es/components/form-select/SelectOptionGroup.vue.js +17 -13
- package/dist/es/components/form-select/SelectOptionGroup.vue2.js +8 -5
- package/dist/es/components/form-select/hooks/use-options.js +40 -40
- package/dist/es/components/form-select/hooks/use-select.js +76 -71
- 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/button.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.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/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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# Tabs AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`Tabs`;模型:v-model:active-key;已核对事件:change。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/tabs`(包含 base.css、tabs.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/tabs)。使用 `v-model:active-key`,类型为 `string | number`;TabPane 用 Vue 的 `key` 标识页签,键类型须与模型一致。默认 `type='line'`、`position='top'`、`trigger='click'`、`lazyLoad=false`、`destroyOnHide=false`。
|
|
11
|
+
|
|
12
|
+
`change(key)` 返回键值,`tab-click(key, event)` 还返回 `Event`。禁用配置放在 TabPane;TabPane 默认插槽放正文,`title` 插槽自定义标题,Tabs 的 `extra` 放额外内容。可编辑模式的 `add` / `delete` 事件需要业务维护页签数据。
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { ref } from 'vue';
|
|
17
|
+
import { Tabs, TabPane } from 'x-next';
|
|
18
|
+
import 'x-next/dist/style.css';
|
|
19
|
+
const active = ref<string | number>('overview');
|
|
20
|
+
const feedback = ref('当前概览');
|
|
21
|
+
function changed(key: string | number) { feedback.value = `当前页签:${key}`; }
|
|
22
|
+
</script>
|
|
23
|
+
<template>
|
|
24
|
+
<Tabs v-model:active-key="active" @change="changed">
|
|
25
|
+
<TabPane key="overview" title="概览">查看当前安排。</TabPane>
|
|
26
|
+
<TabPane key="history" title="历史">查看已完成记录。</TabPane>
|
|
27
|
+
<TabPane key="restricted" title="未开放" disabled>此内容暂不可选。</TabPane>
|
|
28
|
+
</Tabs>
|
|
29
|
+
<p role="status">{{ feedback }}</p>
|
|
30
|
+
</template>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# Textarea AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`Textarea`;模型:v-model;已核对事件:input、change、clear。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/form-textarea`(包含 base.css、form-textarea.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/textarea)。`v-model` 为字符串,`input/change/clear` 与输入生命周期联动。原生 id、name、aria、rows、readonly 用 `textareaAttrs`,不支持组件层的 readonly prop;autoSize 控制自动高度。
|
|
11
|
+
|
|
12
|
+
```vue
|
|
13
|
+
<script setup lang="ts">
|
|
14
|
+
import { ref } from 'vue';
|
|
15
|
+
import { Textarea } from 'x-next';
|
|
16
|
+
import 'x-next/style/form-textarea';
|
|
17
|
+
const summary = ref('');
|
|
18
|
+
const log = ref('等待输入');
|
|
19
|
+
const nativeAttrs = { id: 'article-summary', name: 'summary', 'aria-label': '文章摘要', rows: 3 };
|
|
20
|
+
const readonlyAttrs = { id: 'saved-summary', name: 'savedSummary', 'aria-label': '只读摘要', readonly: true };
|
|
21
|
+
</script>
|
|
22
|
+
<template>
|
|
23
|
+
<label for="article-summary">文章摘要</label>
|
|
24
|
+
<Textarea v-model="summary" :textarea-attrs="nativeAttrs" :auto-size="{ minRows: 3, maxRows: 6 }"
|
|
25
|
+
@input="value => log = `input: ${value}`" />
|
|
26
|
+
<Textarea model-value="已保存的摘要" :textarea-attrs="readonlyAttrs" />
|
|
27
|
+
<p role="status">{{ log }};当前值:{{ summary }}</p>
|
|
28
|
+
</template>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# TimePicker AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`TimePicker`;模型:v-model、v-model:popup-visible;已核对事件:change。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/time-picker`(包含 base.css、button.css、scrollbar-v2.css、time-picker.css、trigger.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 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`。
|
|
11
|
+
|
|
12
|
+
`change(timeString, time)` 是确认值变化,`select` 是面板选择;字符串载荷为 `string | (string | undefined)[] | undefined`,第二参数为 `unknown`。清空归一化为 `''`;支持 `prefix` / `suffix-icon` / `extra` 插槽及 `disabledHours` 等限制。
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { ref } from 'vue';
|
|
17
|
+
import { TimePicker } from 'x-next';
|
|
18
|
+
import 'x-next/dist/style.css';
|
|
19
|
+
const time = ref('');
|
|
20
|
+
const feedback = ref('尚未选择时间');
|
|
21
|
+
function update(value: unknown) { time.value = typeof value === 'string' ? value : ''; }
|
|
22
|
+
function changed(value: string | (string | undefined)[] | undefined, _time: unknown) {
|
|
23
|
+
update(value);
|
|
24
|
+
feedback.value = time.value ? `时间:${time.value}` : '已清空时间';
|
|
25
|
+
}
|
|
26
|
+
</script>
|
|
27
|
+
<template>
|
|
28
|
+
<TimePicker :model-value="time" format="HH:mm" :step="{ minute: 15 }" placeholder="选择时间"
|
|
29
|
+
@update:model-value="update" @change="changed" />
|
|
30
|
+
<p role="status">{{ feedback }}</p>
|
|
31
|
+
</template>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# Upload AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`Upload`;模型:v-model:file-list;已核对事件:change、success、error、remove、exceed、reject、progress。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/upload`(包含 base.css、image.css、progress.css、trigger.css、tooltip.css、upload.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/upload)。`action` 是上传地址,也可用 `customRequest` 接管请求;两者都没提供时组件不会发起上传。`name` 是 FormData 字段名,默认 `'file'`;`method` 默认 `'post'`,`withCredentials` 默认 `false`。
|
|
11
|
+
|
|
12
|
+
**接入已有上传方法的推荐写法**:`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 }` 并手动回调的旧写法仍然支持。
|
|
13
|
+
|
|
14
|
+
列表默认非受控,用 `defaultFileList` 给初值;需要外部驱动时用 `v-model:file-list`,列表项以 `uid` 为稳定标识。`listType` 取 `'text' | 'picture' | 'picture-card'`。`limit` 为数量上限,超出会触发 `exceed`,超出部分不进入列表;`beforeUpload` 返回 `false` 拦截、返回新 `File` 替换,支持 Promise。
|
|
15
|
+
|
|
16
|
+
`change({ file, fileList })` 覆盖加入、进度、成功、失败和移除;`success` / `error` / `remove` / `progress` 是更细粒度的补充。`autoUpload=false` 时文件先以 `init` 入列,再用组件 `submit()` 上传、`abort()` 取消、`retry()` 重试。图片卡场景可加 `image-preview` 用内置 `ImagePreview` 看图。
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<script setup lang="ts">
|
|
20
|
+
import { ref } from 'vue';
|
|
21
|
+
import { Upload, type UploadFile } from 'x-next';
|
|
22
|
+
import 'x-next/dist/style.css';
|
|
23
|
+
const fileList = ref<UploadFile[]>([]);
|
|
24
|
+
const status = ref('尚未选择文件');
|
|
25
|
+
// 项目里已封装好的上传方法:返回 Promise 即可,组件自动显示成功与失败
|
|
26
|
+
function uploadAttachment(params: { file: File; orderId: string }) {
|
|
27
|
+
const form = new FormData();
|
|
28
|
+
form.append('file', params.file);
|
|
29
|
+
form.append('orderId', params.orderId);
|
|
30
|
+
return fetch('/api/upload', { method: 'POST', body: form }).then((response) => {
|
|
31
|
+
if (!response.ok) throw new Error(`上传失败:${response.status}`);
|
|
32
|
+
return response.json() as Promise<{ data: { url: string } }>;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function changed(info: { file: UploadFile; fileList: UploadFile[] }) {
|
|
36
|
+
status.value = `${info.file.name}:${info.file.status ?? 'unknown'}`;
|
|
37
|
+
}
|
|
38
|
+
function beforeUpload(file: File) {
|
|
39
|
+
// 超过 2MB 直接拦截,文件不会进入列表
|
|
40
|
+
return file.size <= 2 * 1024 * 1024;
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
<template>
|
|
44
|
+
<Upload
|
|
45
|
+
v-model:file-list="fileList"
|
|
46
|
+
:custom-request="({ file }) => uploadAttachment({ file, orderId: 'SO-20261003' })"
|
|
47
|
+
response-url-key="data.url"
|
|
48
|
+
name="file"
|
|
49
|
+
multiple
|
|
50
|
+
list-type="picture"
|
|
51
|
+
accept="image/*"
|
|
52
|
+
:limit="5"
|
|
53
|
+
:before-upload="beforeUpload"
|
|
54
|
+
@change="changed"
|
|
55
|
+
/>
|
|
56
|
+
<p role="status">{{ status }}</p>
|
|
57
|
+
</template>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
package/AI_USAGE/core.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# x-next AI 通用接入
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
npm install x-next
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
应用需已有 Vue 3、TypeScript 和 Vue SFC 构建支持。按需具名导入无需安装全局插件;在 `main.ts` 引入一次样式:
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { createApp } from 'vue';
|
|
14
|
+
import App from './App.vue';
|
|
15
|
+
import 'x-next/dist/style.css';
|
|
16
|
+
|
|
17
|
+
createApp(App).mount('#app');
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
下方各节使用局部具名导入。需要全局注册时可另用 `app.use(XNext)`(默认导出),它会注册全部组件。根入口的 `Dialog` 是命令式服务,模板组件是 `DialogComponent`;MessageBox 使用服务函数。
|
|
21
|
+
|
|
22
|
+
接入时遵循这些约定:
|
|
23
|
+
|
|
24
|
+
- **按组件路由传原生属性**:Checkbox / Select 用已核实的 `id/name/aria-*` 属性对象 `v-bind`;Input 用 `inputAttrs`,Textarea 用 `textareaAttrs`。Textarea 的 readonly 也放在 `textareaAttrs` 中。组件 props 和事件直接绑定,不把未知组件 API 塞进 attrs。
|
|
25
|
+
- **保持受控值稳定**:`v-model` 要初始化为明确的布尔值、字符串、数字或数组。非受控初始化用 `defaultValue` / `defaultChecked`;把受控值改成 `undefined` 可能切换到内部状态。清空日期、时间统一保存 `''`。
|
|
26
|
+
- **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo`。容器须已挂载;局部容器要留意定位、滚动和裁剪。ConfigProvider 的主题会同步到 Trigger 浮层及组件形态 Dialog / Drawer;单独调用 applyThemeColor 或独立创建命令式实例时,仍需按实际 DOM 宿主处理主题。
|
|
27
|
+
- **优先用公开主题变量**:参考[样式与主题](https://x-next.yjmf.com/guide/theme)。暗色容器上的 alias 链会重新声明;`themeColor` 写入的内联 primary alias 有覆盖边界,按主题文档设置相关公开 alias。
|
|
28
|
+
- **约束业务全局 CSS**:reset 用 `:where(...)` 降低优先级并限定作用域;宽泛的原生元素选择器可能覆盖组件样式。自定义内容用插槽和公开属性,不依赖内部结构类名。
|
|
29
|
+
- **清理页面创建的服务**:保留句柄,在路由页面卸载时调用 `close()`;KeepAlive 页面可在停用时清理。Dialog / MessageBox 的命令式关闭不触发确认、取消回调,业务取消逻辑需自行调用;Message / Notification 的关闭会触发各自的 `onClose`。
|
|
30
|
+
|
|
31
|
+
## 按需样式
|
|
32
|
+
|
|
33
|
+
使用无扩展名的公开 JS 样式入口,例如 `x-next/style/form-select`。它自动引入共享 base、Select 自身及 Trigger、Scrollbar、Empty、Spin、Checkbox 的 CSS;业务不需要逐个维护内部依赖。多个入口由打包器按文件去重。Input / Textarea 的样式路径分别是 `form-input` / `form-textarea`,不要根据组件名猜 `style/input`。
|
|
34
|
+
|
|
35
|
+
若直接导入 `.css`,需要自己引入 base、自身和全部内部依赖;精选手册索引列出了依赖,发布包 `dist/style/dependencies.json` 提供完整组件映射。全量 `x-next/style.css` 仍可使用。不要同时混用全量与按需方案。
|
|
36
|
+
|
|
37
|
+
完整组合:[按需表单 SFC](./recipes/form-on-demand.md)。回到 [索引](./index.md) 按需读取组件;已读且仍在上下文、消费内容未变时复用。规则模板在 [AI_CODING.md](../AI_CODING.md)。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# x-next AI 按需入口
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
AI 专用资料,与文档站独立分发。先读 [core.md](./core.md),再只读本任务需要的组件页;每页提供真实约束、公共导出、模型/事件/样式和完整 Vue SFC。代码与同版本完整手册同源并严格检查;本索引不塞入完整示例。
|
|
7
|
+
|
|
8
|
+
用 `require.resolve('x-next/AI_USAGE/index.md')` 定位本页,组件例如 `require.resolve('x-next/AI_USAGE/components/select.md')`。升级或本地 dist 重建后重新核对;文件不会被所有工具自动加载,消费项目须合并 [AI_CODING.md](../AI_CODING.md) 中的 AGENTS 建议。
|
|
9
|
+
|
|
10
|
+
## 组件检索
|
|
11
|
+
|
|
12
|
+
| 组件/服务 | 按需内容 | 模型 | 样式入口 |
|
|
13
|
+
| --- | --- | --- | --- |
|
|
14
|
+
| ConfigProvider | [config-provider](./components/config-provider.md) | 无 | `x-next/style/base.css` |
|
|
15
|
+
| ColorPicker | [color-picker](./components/color-picker.md) | v-model、v-model:show | `x-next/style/color-picker` |
|
|
16
|
+
| Button | [button](./components/button.md) | 无 | `x-next/style/button` |
|
|
17
|
+
| Input | [input](./components/input.md) | v-model | `x-next/style/form-input` |
|
|
18
|
+
| Textarea | [textarea](./components/textarea.md) | v-model | `x-next/style/form-textarea` |
|
|
19
|
+
| Checkbox | [checkbox](./components/checkbox.md) | v-model | `x-next/style/form-checkbox` |
|
|
20
|
+
| Radio | [radio](./components/radio.md) | v-model | `x-next/style/form-radio` |
|
|
21
|
+
| Select | [select](./components/select.md) | v-model、v-model:popup-visible | `x-next/style/form-select` |
|
|
22
|
+
| Slider | [slider](./components/slider.md) | v-model | `x-next/style/form-slider` |
|
|
23
|
+
| Rate | [rate](./components/rate.md) | v-model | `x-next/style/rate` |
|
|
24
|
+
| Switch | [switch](./components/switch.md) | v-model | `x-next/style/form-switch` |
|
|
25
|
+
| DatePicker | [date-picker](./components/date-picker.md) | v-model、v-model:popup-visible | `x-next/style/date-picker` |
|
|
26
|
+
| TimePicker | [time-picker](./components/time-picker.md) | v-model、v-model:popup-visible | `x-next/style/time-picker` |
|
|
27
|
+
| Alert | [alert](./components/alert.md) | v-model:visible | `x-next/style/alert` |
|
|
28
|
+
| Dialog | [dialog](./components/dialog.md) | v-model | `x-next/style/dialog` |
|
|
29
|
+
| Message | [message](./components/message.md) | 无 | `x-next/style/message` |
|
|
30
|
+
| MessageBox | [message-box](./components/message-box.md) | 无 | `x-next/style/message-box` |
|
|
31
|
+
| Notification | [notification](./components/notification.md) | 无 | `x-next/style/notification` |
|
|
32
|
+
| Popconfirm | [popconfirm](./components/popconfirm.md) | v-model | `x-next/style/popconfirm` |
|
|
33
|
+
| Popover | [popover](./components/popover.md) | v-model:popup-visible | `x-next/style/popover` |
|
|
34
|
+
| Progress | [progress](./components/progress.md) | 无 | `x-next/style/progress` |
|
|
35
|
+
| Dropdown | [dropdown](./components/dropdown.md) | v-model:popup-visible | `x-next/style/dropdown` |
|
|
36
|
+
| Pagination | [pagination](./components/pagination.md) | v-model:current、v-model:page-size | `x-next/style/pagination` |
|
|
37
|
+
| Steps | [steps](./components/steps.md) | v-model:current | `x-next/style/steps` |
|
|
38
|
+
| Tabs | [tabs](./components/tabs.md) | v-model:active-key | `x-next/style/tabs` |
|
|
39
|
+
| Empty | [empty](./components/empty.md) | 无 | `x-next/style/empty` |
|
|
40
|
+
| Upload | [upload](./components/upload.md) | v-model:file-list | `x-next/style/upload` |
|
|
41
|
+
| BarChart | [bar-chart](./components/bar-chart.md) | 无 | `x-next/style/bar-chart` |
|
|
42
|
+
| LineChart | [line-chart](./components/line-chart.md) | 无 | `x-next/style/line-chart` |
|
|
43
|
+
| PieChart | [pie-chart](./components/pie-chart.md) | 无 | `x-next/style/pie-chart` |
|
|
44
|
+
|
|
45
|
+
## 组合和未收录能力
|
|
46
|
+
|
|
47
|
+
- [按需表单完整 SFC](./recipes/form-on-demand.md):Input + Textarea + Select + Checkbox + ConfigProvider。
|
|
48
|
+
- 编辑弹窗:读 Dialog、Input、Select;需要 Form 时再查 [公开组件导航](./catalog.md) 中的类型与组件文档。不要因手册缺节就判断没有组件。
|
|
49
|
+
- [公开组件/服务导航](./catalog.md):更多组件、子组件、别名和声明定位;精选覆盖 30 个契约,不代表全部导出。
|
|
50
|
+
- [完整兼容手册](../AI_USAGE.md):旧用法保留;新任务不默认读取全文。
|
|
51
|
+
|
|
52
|
+
按需读取不能保证模型绝不读多或 API 绝不出错。保留通用规则和组件完整约束,并用严格类型、构建及真实浏览器验证;不以“读取过”代替验收。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/. -->
|
|
2
|
+
# 按需样式与表单接入
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.0;来源指纹:`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md),相关组件规则:[config-provider](../components/config-provider.md)、[input](../components/input.md)、[textarea](../components/textarea.md)、[select](../components/select.md)、[checkbox](../components/checkbox.md)。
|
|
7
|
+
|
|
8
|
+
使用无扩展名的公开 JS 样式入口,例如 `x-next/style/form-select`。它自动引入共享 base、Select 自身及 Trigger、Scrollbar、Empty、Spin、Checkbox 的 CSS;业务不需要逐个维护内部依赖。多个入口由打包器按文件去重。Input / Textarea 的样式路径分别是 `form-input` / `form-textarea`,不要根据组件名猜 `style/input`。
|
|
9
|
+
|
|
10
|
+
若直接导入 `.css`,需要自己引入 base、自身和全部内部依赖;精选手册索引列出了依赖,发布包 `dist/style/dependencies.json` 提供完整组件映射。全量 `x-next/style.css` 仍可使用。不要同时混用全量与按需方案。
|
|
11
|
+
|
|
12
|
+
下面是可独立复制的按需表单 SFC,原生属性按各组件真实路由传入:
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
```vue
|
|
16
|
+
<script setup lang="ts">
|
|
17
|
+
import { ref } from 'vue';
|
|
18
|
+
import { ConfigProvider, Input, Textarea, Select, Checkbox } from 'x-next';
|
|
19
|
+
import 'x-next/style/form-input';
|
|
20
|
+
import 'x-next/style/form-textarea';
|
|
21
|
+
import 'x-next/style/form-select';
|
|
22
|
+
import 'x-next/style/form-checkbox';
|
|
23
|
+
const title = ref('');
|
|
24
|
+
const summary = ref('只读接入说明');
|
|
25
|
+
const scopes = ref<string[]>(['read']);
|
|
26
|
+
const accepted = ref(false);
|
|
27
|
+
const titleAttrs = { id: 'cms-title', name: 'title', 'aria-label': '标题', required: true };
|
|
28
|
+
const summaryAttrs = { id: 'cms-summary', name: 'summary', 'aria-label': '说明', readonly: true };
|
|
29
|
+
const selectAttrs = { id: 'cms-scopes', 'aria-label': '授权范围' };
|
|
30
|
+
const checkboxAttrs = { name: 'agreement', 'aria-label': '同意条款' };
|
|
31
|
+
const options = [{ value: 'read', label: '读取' }, { value: 'write', label: '写入' }];
|
|
32
|
+
</script>
|
|
33
|
+
<template>
|
|
34
|
+
<ConfigProvider theme-color="#0f766e">
|
|
35
|
+
<Input v-model="title" :input-attrs="titleAttrs" allow-clear />
|
|
36
|
+
<Textarea v-model="summary" :textarea-attrs="summaryAttrs" />
|
|
37
|
+
<Select v-model="scopes" :options="options" multiple v-bind="selectAttrs" />
|
|
38
|
+
<Checkbox v-model="accepted" v-bind="checkboxAttrs">同意条款</Checkbox>
|
|
39
|
+
<p role="status">标题:{{ title || '空' }};范围:{{ scopes.join(', ') }};同意:{{ accepted }}</p>
|
|
40
|
+
</ConfigProvider>
|
|
41
|
+
</template>
|
|
42
|
+
```
|
package/AI_USAGE.md
CHANGED
|
@@ -1,45 +1,58 @@
|
|
|
1
1
|
<!-- Generated by pnpm generate:ai-usage. Edit src/docs/guide/ai-usage.md and script/ai-usage/manifest.js. -->
|
|
2
2
|
# x-next AI 使用手册
|
|
3
3
|
|
|
4
|
-
适用版本:**x-next@1.
|
|
4
|
+
适用版本:**x-next@1.11.0**。Vue:`^3.5.0`;Node:`>=20.19.0`。
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
来源指纹(精选示例、映射、样式依赖、版本与公开类型声明):`eec9ec4e05970a1f3325c873b8858e1fcb84282fa4c09d4eda8d5044c833f82a`。
|
|
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
|
-
|
|
|
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
|
+
<script setup lang="ts">
|
|
49
|
+
import { ref } from 'vue';
|
|
50
|
+
const cmsTitleDemo = ref('');
|
|
51
|
+
const cmsScopesDemo = ref(['read']);
|
|
52
|
+
const cmsAcceptedDemo = ref(false);
|
|
53
|
+
const cmsOptionsDemo = [{ value: 'read', label: '读取' }, { value: 'write', label: '写入' }];
|
|
54
|
+
</script>
|
|
55
|
+
|
|
43
56
|
本页为每个组件提供一段可直接复制的 Vue SFC,从 `x-next` 根入口导入。把这些示例交给 AI 编程助手作为上下文,它生成的代码就会使用真实的 props 与事件,而不是照搬其他组件库的属性名。
|
|
44
57
|
|
|
45
58
|
每节开头链接到对应的组件文档,那里有可交互的在线示例和完整 API 表;本页代码聚焦用法要点。随包分发的 `node_modules/x-next/AI_USAGE.md` 是本页的完整版本,可直接提供给 AI 工具读取。
|
|
@@ -64,16 +77,63 @@ createApp(App).mount('#app');
|
|
|
64
77
|
|
|
65
78
|
接入时遵循这些约定:
|
|
66
79
|
|
|
67
|
-
-
|
|
80
|
+
- **按组件路由传原生属性**:Checkbox / Select 用已核实的 `id/name/aria-*` 属性对象 `v-bind`;Input 用 `inputAttrs`,Textarea 用 `textareaAttrs`。Textarea 的 readonly 也放在 `textareaAttrs` 中。组件 props 和事件直接绑定,不把未知组件 API 塞进 attrs。
|
|
68
81
|
- **保持受控值稳定**:`v-model` 要初始化为明确的布尔值、字符串、数字或数组。非受控初始化用 `defaultValue` / `defaultChecked`;把受控值改成 `undefined` 可能切换到内部状态。清空日期、时间统一保存 `''`。
|
|
69
|
-
- **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo
|
|
82
|
+
- **选择正确的弹层宿主**:Select、DatePicker、TimePicker、Popover、Dropdown 用 `popupContainer`;Dialog、Message、MessageBox、Notification、Popconfirm 用 `renderTo`。容器须已挂载;局部容器要留意定位、滚动和裁剪。ConfigProvider 的主题会同步到 Trigger 浮层及组件形态 Dialog / Drawer;单独调用 applyThemeColor 或独立创建命令式实例时,仍需按实际 DOM 宿主处理主题。
|
|
70
83
|
- **优先用公开主题变量**:参考[样式与主题](https://x-next.yjmf.com/guide/theme)。暗色容器上的 alias 链会重新声明;`themeColor` 写入的内联 primary alias 有覆盖边界,按主题文档设置相关公开 alias。
|
|
71
84
|
- **约束业务全局 CSS**:reset 用 `:where(...)` 降低优先级并限定作用域;宽泛的原生元素选择器可能覆盖组件样式。自定义内容用插槽和公开属性,不依赖内部结构类名。
|
|
72
85
|
- **清理页面创建的服务**:保留句柄,在路由页面卸载时调用 `close()`;KeepAlive 页面可在停用时清理。Dialog / MessageBox 的命令式关闭不触发确认、取消回调,业务取消逻辑需自行调用;Message / Notification 的关闭会触发各自的 `onClose`。
|
|
73
86
|
|
|
87
|
+
## 按需样式与表单接入
|
|
88
|
+
|
|
89
|
+
使用无扩展名的公开 JS 样式入口,例如 `x-next/style/form-select`。它自动引入共享 base、Select 自身及 Trigger、Scrollbar、Empty、Spin、Checkbox 的 CSS;业务不需要逐个维护内部依赖。多个入口由打包器按文件去重。Input / Textarea 的样式路径分别是 `form-input` / `form-textarea`,不要根据组件名猜 `style/input`。
|
|
90
|
+
|
|
91
|
+
若直接导入 `.css`,需要自己引入 base、自身和全部内部依赖;精选手册索引列出了依赖,发布包 `dist/style/dependencies.json` 提供完整组件映射。全量 `x-next/style.css` 仍可使用。不要同时混用全量与按需方案。
|
|
92
|
+
|
|
93
|
+
下面是可独立复制的按需表单 SFC,原生属性按各组件真实路由传入:
|
|
94
|
+
|
|
95
|
+
<div class="example-box example-box-column">
|
|
96
|
+
<x-config-provider theme-color="#0f766e">
|
|
97
|
+
<x-input v-model="cmsTitleDemo" :input-attrs="{ id: 'cms-title-demo', name: 'title', 'aria-label': '接入标题' }" allow-clear />
|
|
98
|
+
<x-textarea model-value="只读接入说明" :textarea-attrs="{ name: 'summary', 'aria-label': '接入说明', readonly: true }" />
|
|
99
|
+
<x-select v-model="cmsScopesDemo" :options="cmsOptionsDemo" multiple aria-label="接入授权范围" />
|
|
100
|
+
<x-checkbox v-model="cmsAcceptedDemo" aria-label="接入同意条款">同意条款</x-checkbox>
|
|
101
|
+
</x-config-provider>
|
|
102
|
+
<span role="status">标题:{{ cmsTitleDemo || '空' }};范围:{{ cmsScopesDemo.join(', ') }};同意:{{ cmsAcceptedDemo }}</span>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
```vue
|
|
106
|
+
<script setup lang="ts">
|
|
107
|
+
import { ref } from 'vue';
|
|
108
|
+
import { ConfigProvider, Input, Textarea, Select, Checkbox } from 'x-next';
|
|
109
|
+
import 'x-next/style/form-input';
|
|
110
|
+
import 'x-next/style/form-textarea';
|
|
111
|
+
import 'x-next/style/form-select';
|
|
112
|
+
import 'x-next/style/form-checkbox';
|
|
113
|
+
const title = ref('');
|
|
114
|
+
const summary = ref('只读接入说明');
|
|
115
|
+
const scopes = ref<string[]>(['read']);
|
|
116
|
+
const accepted = ref(false);
|
|
117
|
+
const titleAttrs = { id: 'cms-title', name: 'title', 'aria-label': '标题', required: true };
|
|
118
|
+
const summaryAttrs = { id: 'cms-summary', name: 'summary', 'aria-label': '说明', readonly: true };
|
|
119
|
+
const selectAttrs = { id: 'cms-scopes', 'aria-label': '授权范围' };
|
|
120
|
+
const checkboxAttrs = { name: 'agreement', 'aria-label': '同意条款' };
|
|
121
|
+
const options = [{ value: 'read', label: '读取' }, { value: 'write', label: '写入' }];
|
|
122
|
+
</script>
|
|
123
|
+
<template>
|
|
124
|
+
<ConfigProvider theme-color="#0f766e">
|
|
125
|
+
<Input v-model="title" :input-attrs="titleAttrs" allow-clear />
|
|
126
|
+
<Textarea v-model="summary" :textarea-attrs="summaryAttrs" />
|
|
127
|
+
<Select v-model="scopes" :options="options" multiple v-bind="selectAttrs" />
|
|
128
|
+
<Checkbox v-model="accepted" v-bind="checkboxAttrs">同意条款</Checkbox>
|
|
129
|
+
<p role="status">标题:{{ title || '空' }};范围:{{ scopes.join(', ') }};同意:{{ accepted }}</p>
|
|
130
|
+
</ConfigProvider>
|
|
131
|
+
</template>
|
|
132
|
+
```
|
|
133
|
+
|
|
74
134
|
## ConfigProvider
|
|
75
135
|
|
|
76
|
-
局部品牌色用 `themeColor`,它一次生成色阶并重绑定组件别名;不必逐个覆盖 Button、Switch
|
|
136
|
+
局部品牌色用 `themeColor`,它一次生成色阶并重绑定组件别名;不必逐个覆盖 Button、Switch 的颜色。默认 body 浮层也会同步当前配置;更换 popupContainer 只用于业务定位和裁剪需要。Select 默认跟随祖先滚动;要滚动关闭可传 `triggerProps.scrollToClose`。
|
|
77
137
|
|
|
78
138
|
```vue
|
|
79
139
|
<script setup lang="ts">
|
|
@@ -83,7 +143,6 @@ import { Button, ConfigProvider, Select, Switch } from 'x-next';
|
|
|
83
143
|
const brand = ref('#2f6feb');
|
|
84
144
|
const dark = ref(false);
|
|
85
145
|
const value = ref('day');
|
|
86
|
-
const overlayHost = ref<HTMLElement>();
|
|
87
146
|
const switchAttrs = { 'aria-label': '局部暗色' };
|
|
88
147
|
const selectAttrs = { 'aria-label': '统计粒度' };
|
|
89
148
|
const options = [
|
|
@@ -99,14 +158,11 @@ const options = [
|
|
|
99
158
|
</Button>
|
|
100
159
|
<Switch v-model="dark" v-bind="switchAttrs" />
|
|
101
160
|
<Select
|
|
102
|
-
v-if="overlayHost"
|
|
103
161
|
v-model="value"
|
|
104
162
|
:options="options"
|
|
105
|
-
:popup-container="overlayHost"
|
|
106
163
|
v-bind="selectAttrs"
|
|
107
164
|
style="width: 160px"
|
|
108
165
|
/>
|
|
109
|
-
<div ref="overlayHost" class="brand-overlay" />
|
|
110
166
|
</ConfigProvider>
|
|
111
167
|
</template>
|
|
112
168
|
|
|
@@ -120,16 +176,38 @@ const options = [
|
|
|
120
176
|
color: var(--x-color-text-primary);
|
|
121
177
|
background: var(--x-color-bg-surface);
|
|
122
178
|
}
|
|
123
|
-
.brand-overlay {
|
|
124
|
-
position: fixed;
|
|
125
|
-
inset: 0;
|
|
126
|
-
pointer-events: none;
|
|
127
|
-
z-index: 2000;
|
|
128
|
-
}
|
|
129
179
|
</style>
|
|
130
180
|
```
|
|
131
181
|
|
|
132
|
-
已有主题容器时,也可调用公开 `applyThemeColor(seed, { target, dark })`;切换暗色后需重新调用。只改后代的几条 semantic CSS 变量不会重算祖先 alias;`:tag="null"` 的 ConfigProvider
|
|
182
|
+
已有主题容器时,也可调用公开 `applyThemeColor(seed, { target, dark })`;切换暗色后需重新调用。只改后代的几条 semantic CSS 变量不会重算祖先 alias;`:tag="null"` 的 ConfigProvider 不创建本级主题边界,仍继承父级配置。
|
|
183
|
+
|
|
184
|
+
## ColorPicker
|
|
185
|
+
|
|
186
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/color-picker)。`v-model` 输出 hex 字符串;`v-model:show` 控制面板。清除恢复显式 defaultValue,未提供则提交空字符串;change、clear、confirm 都通知 Form 的 change 通道。自定义触发器将 triggerAttrs 绑定到原生按钮,保留键盘、ARIA、禁用与焦点行为。
|
|
187
|
+
|
|
188
|
+
```vue
|
|
189
|
+
<script setup lang="ts">
|
|
190
|
+
import { ref } from 'vue';
|
|
191
|
+
import { ColorPicker } from 'x-next';
|
|
192
|
+
const color = ref('#0f766e');
|
|
193
|
+
const show = ref(false);
|
|
194
|
+
const log = ref('等待操作');
|
|
195
|
+
const pickerAttrs = { id: 'brand-color', 'aria-label': '品牌色' };
|
|
196
|
+
</script>
|
|
197
|
+
|
|
198
|
+
<template>
|
|
199
|
+
<ColorPicker v-model="color" v-model:show="show" size="small" v-bind="pickerAttrs"
|
|
200
|
+
:swatches="['#0f766e', '#1c61ff']"
|
|
201
|
+
@change="(value) => log = `change: ${value}`"
|
|
202
|
+
@clear="log = '已清除'"
|
|
203
|
+
@confirm="(value) => log = `confirm: ${value}`">
|
|
204
|
+
<template #trigger="{ value, visible, triggerAttrs }">
|
|
205
|
+
<button v-bind="triggerAttrs">{{ visible ? '选择中' : value }}</button>
|
|
206
|
+
</template>
|
|
207
|
+
</ColorPicker>
|
|
208
|
+
<p role="status">{{ log }};保存值:{{ color || '空' }}</p>
|
|
209
|
+
</template>
|
|
210
|
+
```
|
|
133
211
|
|
|
134
212
|
## Button
|
|
135
213
|
|
|
@@ -158,6 +236,53 @@ async function save(_event: MouseEvent) {
|
|
|
158
236
|
</template>
|
|
159
237
|
```
|
|
160
238
|
|
|
239
|
+
## Input
|
|
240
|
+
|
|
241
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/input)。`v-model` 为字符串,`input` 随输入触发,`change` 在失焦或回车时触发,`clear` 通知清空;readonly 是组件 prop。原生 id、name、aria、required 用 `inputAttrs`,外部 class / style 落在容器。内部装饰用 prefix / suffix,外侧标签用 prepend / append。
|
|
242
|
+
|
|
243
|
+
```vue
|
|
244
|
+
<script setup lang="ts">
|
|
245
|
+
import { ref } from 'vue';
|
|
246
|
+
import { Input } from 'x-next';
|
|
247
|
+
import 'x-next/style/form-input';
|
|
248
|
+
const title = ref('');
|
|
249
|
+
const log = ref('等待输入');
|
|
250
|
+
const nativeAttrs = { id: 'article-title', name: 'title', 'aria-label': '文章标题', required: true };
|
|
251
|
+
</script>
|
|
252
|
+
<template>
|
|
253
|
+
<label for="article-title">文章标题</label>
|
|
254
|
+
<Input v-model="title" :input-attrs="nativeAttrs" allow-clear
|
|
255
|
+
@input="value => log = `input: ${value}`" @clear="log = '已清空'">
|
|
256
|
+
<template #prefix>标题</template>
|
|
257
|
+
</Input>
|
|
258
|
+
<Input model-value="只读标题" readonly :input-attrs="{ 'aria-label': '只读标题' }" />
|
|
259
|
+
<p role="status">{{ log }};当前值:{{ title }}</p>
|
|
260
|
+
</template>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Textarea
|
|
264
|
+
|
|
265
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/textarea)。`v-model` 为字符串,`input/change/clear` 与输入生命周期联动。原生 id、name、aria、rows、readonly 用 `textareaAttrs`,不支持组件层的 readonly prop;autoSize 控制自动高度。
|
|
266
|
+
|
|
267
|
+
```vue
|
|
268
|
+
<script setup lang="ts">
|
|
269
|
+
import { ref } from 'vue';
|
|
270
|
+
import { Textarea } from 'x-next';
|
|
271
|
+
import 'x-next/style/form-textarea';
|
|
272
|
+
const summary = ref('');
|
|
273
|
+
const log = ref('等待输入');
|
|
274
|
+
const nativeAttrs = { id: 'article-summary', name: 'summary', 'aria-label': '文章摘要', rows: 3 };
|
|
275
|
+
const readonlyAttrs = { id: 'saved-summary', name: 'savedSummary', 'aria-label': '只读摘要', readonly: true };
|
|
276
|
+
</script>
|
|
277
|
+
<template>
|
|
278
|
+
<label for="article-summary">文章摘要</label>
|
|
279
|
+
<Textarea v-model="summary" :textarea-attrs="nativeAttrs" :auto-size="{ minRows: 3, maxRows: 6 }"
|
|
280
|
+
@input="value => log = `input: ${value}`" />
|
|
281
|
+
<Textarea model-value="已保存的摘要" :textarea-attrs="readonlyAttrs" />
|
|
282
|
+
<p role="status">{{ log }};当前值:{{ summary }}</p>
|
|
283
|
+
</template>
|
|
284
|
+
```
|
|
285
|
+
|
|
161
286
|
## Checkbox
|
|
162
287
|
|
|
163
288
|
[组件文档与 live demo](https://x-next.yjmf.com/components/checkbox)。使用普通 `v-model`;模型支持 `boolean` 或 `(string | number | boolean)[]`,数组模式配合 `value`。`defaultChecked`、`disabled`、`indeterminate` 默认 `false`;半选状态不会替代模型值。
|
|
@@ -217,6 +342,8 @@ function changed(value: string | number | boolean, _event: Event) {
|
|
|
217
342
|
|
|
218
343
|
`change(value)` 返回新值,`clear(event)` 返回 `Event`;单选清空通常为 `''`,多选为 `[]`,已选禁用项可能保留。`v-model:popup-visible` 控制弹层,`option` / `empty` / `header` / `footer` 等插槽见组件文档。
|
|
219
344
|
|
|
345
|
+
有值且可清空时,右侧 × 与箭头共用位置,点击 × 不切换面板。`v-model:input-value` 控制搜索输入;远程搜索设置 `filterOption=false`,用 `@search` 请求数据并由业务取消旧请求。对象值用 `valueKey` 标识,`fallbackOption` 处理暂时缺失的候选项。默认触发器 ref 类型为 `SelectInstance`,提供 `focus()` / `blur()`;自定义 `trigger` 插槽将 `onKeydown` 绑定到自己的可聚焦节点。
|
|
346
|
+
|
|
220
347
|
```vue
|
|
221
348
|
<script setup lang="ts">
|
|
222
349
|
import { ref } from 'vue';
|