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
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# Steps AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`Steps`;模型:v-model:current;已核对事件:change。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/steps`(包含 base.css、steps.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/steps)。子组件的公开名称是 `Step`。使用 `v-model:current`,序号从 **1** 开始,`defaultCurrent=1`、`status='process'`、`type='default'`、`direction='horizontal'`;点击切换需开启 `changeable`,默认关闭。
|
|
11
|
+
|
|
12
|
+
`change(step, event)` 返回步骤号和 `Event`。Step 支持 `title`、`description`、`disabled`、`status`;`node` / `icon` 插槽提供步骤与状态,默认 / `description` 插槽可替换文案。业务完成状态由业务自身维护。
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { ref } from 'vue';
|
|
17
|
+
import { Steps, Step } from 'x-next';
|
|
18
|
+
import 'x-next/dist/style.css';
|
|
19
|
+
const current = ref(1);
|
|
20
|
+
const feedback = ref('正在填写');
|
|
21
|
+
function changed(step: number, _event: Event) { feedback.value = `已切换到第 ${step} 步`; }
|
|
22
|
+
</script>
|
|
23
|
+
<template>
|
|
24
|
+
<Steps v-model:current="current" changeable @change="changed">
|
|
25
|
+
<Step title="填写" description="准备安排" />
|
|
26
|
+
<Step title="核对" description="检查内容" />
|
|
27
|
+
<Step title="完成" description="提交结果" />
|
|
28
|
+
</Steps>
|
|
29
|
+
<p role="status">{{ feedback }}</p>
|
|
30
|
+
</template>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# Switch AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
5
|
+
|
|
6
|
+
先读 [通用接入](../core.md)。公开导出:`Switch`;模型:v-model;已核对事件:change。
|
|
7
|
+
|
|
8
|
+
按需样式:`x-next/style/form-switch`(包含 base.css、form-switch.css)。代码块未单独引样式时在应用入口加载全量样式,或按实际所有组件加载 JS 入口;不要仅因复制一个组件页就漏掉其中的 Button 等组合依赖。
|
|
9
|
+
|
|
10
|
+
[组件文档与 live demo](https://x-next.yjmf.com/components/switch)。普通 `v-model` 支持 `boolean | string | number`;`checkedValue=true`、`uncheckedValue=false`、`defaultChecked=false`,默认 `type='circle'`。`disabled` / `loading` 阻止切换。
|
|
11
|
+
|
|
12
|
+
`change(value, event)` 返回新值和 `Event`;`beforeChange(newValue)` 可返回布尔值或 Promise,`false` 或拒绝阻止切换。`checked` / `unchecked` 插槽及 `checkedText` / `uncheckedText` 显示两态文案;`type='line'` 或有效尺寸为 `'mini'`(含继承尺寸)时均不显示文案。
|
|
13
|
+
|
|
14
|
+
```vue
|
|
15
|
+
<script setup lang="ts">
|
|
16
|
+
import { ref } from 'vue';
|
|
17
|
+
import { Switch } from 'x-next';
|
|
18
|
+
import 'x-next/dist/style.css';
|
|
19
|
+
const enabled = ref(false);
|
|
20
|
+
const controlAttrs = { 'aria-label': '通知开关' };
|
|
21
|
+
const feedback = ref('通知关闭');
|
|
22
|
+
function changed(value: boolean | string | number, _event: Event) {
|
|
23
|
+
feedback.value = value === true ? '通知开启' : '通知关闭';
|
|
24
|
+
}
|
|
25
|
+
</script>
|
|
26
|
+
<template>
|
|
27
|
+
<Switch v-model="enabled" checked-text="开" unchecked-text="关" v-bind="controlAttrs" @change="changed" />
|
|
28
|
+
<p role="status">{{ feedback }}</p>
|
|
29
|
+
</template>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
返回 [AI 索引](../index.md)。精选示例不是完整 API 表,新能力先查同版本公开类型与组件文档。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# Tabs AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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 script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# Textarea AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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 script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# TimePicker AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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`。清空发出 `update:modelValue(undefined)` 和 `change(undefined, undefined)`;本例的业务 `update()` 才归一化为 `''` 保持单值字符串受控。支持 `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 script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# Upload AI 使用
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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 时,即使 Promise resolve 也按失败处理,`error.status` 为状态码;成功响应仅对 JSON/text 内容类型解析,二进制等其他类型保留 Response 本体,不自动转为 Blob。需要进度与取消时,把 option 的 `signal`(取消 / 移除 / 卸载时触发)与 `onProgress`(0 ~ 1)透传给底层请求。返回 `{ abort }` 并手动回调的旧写法仍然支持。
|
|
13
|
+
|
|
14
|
+
列表默认非受控,用 `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。
|
|
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 script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# x-next AI 通用接入
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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` 可能切换到内部状态。DatePicker / TimePicker 清空实际发出 `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 script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# x-next AI 按需入口
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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,45 @@
|
|
|
1
|
+
<!-- Generated by pnpm generate:ai-usage. Edit script/ai-usage/content.md and script/ai-usage/. -->
|
|
2
|
+
# 按需样式与表单接入
|
|
3
|
+
|
|
4
|
+
适用版本:x-next@1.11.1;来源指纹:`ad9d8731c632355a30f4f53643b1e2bcd861a36f1ed67631339334be1eda0b76`。
|
|
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,原生属性按各组件真实路由传入。表单控件是行内级元素且宽度 100%,裸放在普通块级容器里会参与行内排版,父级行高会在相邻控件之间留下不均匀间距;示例用 `Space` 纵向堆叠并开启 `fill`,控件撑满父容器且间距一致,业务里也应放进 Space、Form 这类布局容器。
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
```vue
|
|
16
|
+
<script setup lang="ts">
|
|
17
|
+
import { ref } from 'vue';
|
|
18
|
+
import { ConfigProvider, Input, Textarea, Select, Checkbox, Space } 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
|
+
import 'x-next/style/space';
|
|
24
|
+
const title = ref('');
|
|
25
|
+
const summary = ref('只读接入说明');
|
|
26
|
+
const scopes = ref<string[]>(['read']);
|
|
27
|
+
const accepted = ref(false);
|
|
28
|
+
const titleAttrs = { id: 'cms-title', name: 'title', 'aria-label': '标题', required: true };
|
|
29
|
+
const summaryAttrs = { id: 'cms-summary', name: 'summary', 'aria-label': '说明', readonly: true };
|
|
30
|
+
const selectAttrs = { id: 'cms-scopes', 'aria-label': '授权范围' };
|
|
31
|
+
const checkboxAttrs = { name: 'agreement', 'aria-label': '同意条款' };
|
|
32
|
+
const options = [{ value: 'read', label: '读取' }, { value: 'write', label: '写入' }];
|
|
33
|
+
</script>
|
|
34
|
+
<template>
|
|
35
|
+
<ConfigProvider theme-color="#0f766e">
|
|
36
|
+
<Space direction="vertical" fill size="medium">
|
|
37
|
+
<Input v-model="title" :input-attrs="titleAttrs" allow-clear />
|
|
38
|
+
<Textarea v-model="summary" :textarea-attrs="summaryAttrs" />
|
|
39
|
+
<Select v-model="scopes" :options="options" multiple v-bind="selectAttrs" />
|
|
40
|
+
<Checkbox v-model="accepted" v-bind="checkboxAttrs">同意条款</Checkbox>
|
|
41
|
+
</Space>
|
|
42
|
+
<p role="status">标题:{{ title || '空' }};范围:{{ scopes.join(', ') }};同意:{{ accepted }}</p>
|
|
43
|
+
</ConfigProvider>
|
|
44
|
+
</template>
|
|
45
|
+
```
|