diff --git a/apps/core-ant-design-vue/src/types/components.d.ts b/apps/core-ant-design-vue/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-ant-design-vue/src/types/components.d.ts +++ b/apps/core-ant-design-vue/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/core-antdv-next/src/types/components.d.ts b/apps/core-antdv-next/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-antdv-next/src/types/components.d.ts +++ b/apps/core-antdv-next/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/core-arco-design-vue/src/types/components.d.ts b/apps/core-arco-design-vue/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-arco-design-vue/src/types/components.d.ts +++ b/apps/core-arco-design-vue/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/core-naive-ui/src/types/components.d.ts b/apps/core-naive-ui/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-naive-ui/src/types/components.d.ts +++ b/apps/core-naive-ui/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/core-tdesign/src/types/components.d.ts b/apps/core-tdesign/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-tdesign/src/types/components.d.ts +++ b/apps/core-tdesign/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/core-vexip-ui/src/types/components.d.ts b/apps/core-vexip-ui/src/types/components.d.ts index aed426a3..13f933c6 100755 --- a/apps/core-vexip-ui/src/types/components.d.ts +++ b/apps/core-vexip-ui/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/example/src/router/modules/component.example.ts b/apps/example/src/router/modules/component.example.ts index 633f3cbb..29186710 100755 --- a/apps/example/src/router/modules/component.example.ts +++ b/apps/example/src/router/modules/component.example.ts @@ -93,6 +93,14 @@ const routes: RouteRecordRaw = { title: '右键菜单', }, }, + { + path: 'descriptions', + name: 'componentExampleDescriptions', + component: () => import('@/views/component_example/descriptions.vue'), + meta: { + title: '描述列表', + }, + }, { path: 'divider', name: 'componentExampleDivider', diff --git a/apps/example/src/types/components.d.ts b/apps/example/src/types/components.d.ts index aed426a3..13f933c6 100644 --- a/apps/example/src/types/components.d.ts +++ b/apps/example/src/types/components.d.ts @@ -29,6 +29,7 @@ declare module 'vue' { FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] @@ -86,6 +87,7 @@ declare global { const FaCheckboxGroup: typeof import('@fantastic-admin/components')['FaCheckboxGroup'] const FaCollapsible: typeof import('@fantastic-admin/components')['FaCollapsible'] const FaContextMenu: typeof import('@fantastic-admin/components')['FaContextMenu'] + const FaDescriptions: typeof import('@fantastic-admin/components')['FaDescriptions'] const FaDivider: typeof import('@fantastic-admin/components')['FaDivider'] const FaDrawer: typeof import('@fantastic-admin/components')['FaDrawer'] const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown'] diff --git a/apps/example/src/views/component_example/descriptions.vue b/apps/example/src/views/component_example/descriptions.vue new file mode 100644 index 00000000..6fa29f1f --- /dev/null +++ b/apps/example/src/views/component_example/descriptions.vue @@ -0,0 +1,17 @@ + + + diff --git a/packages/components/resolver.ts b/packages/components/resolver.ts index 1a0dbd65..e8651585 100755 --- a/packages/components/resolver.ts +++ b/packages/components/resolver.ts @@ -16,6 +16,7 @@ const BASIC_COMPONENT_NAMES = [ 'FaCheckboxGroup', 'FaCollapsible', 'FaContextMenu', + 'FaDescriptions', 'FaDivider', 'FaDrawer', 'FaDropdown', diff --git a/packages/components/src/basic/descriptions/README.md b/packages/components/src/basic/descriptions/README.md new file mode 100644 index 00000000..c93a2803 --- /dev/null +++ b/packages/components/src/basic/descriptions/README.md @@ -0,0 +1,55 @@ +# FaDescriptions 描述列表 + +纯展示信息组件,用于详情页、资料卡片、审核信息等只读数据场景。支持横向与纵向布局、边框、跨列、具名插槽和单项扩展字段。 + +## 使用场景 + +- 用户、订单、商品等详情信息展示 +- 表单提交后的只读确认信息 +- 弹窗中的轻量信息摘要 +- 卡片内的结构化字段展示 + +## Props + +| 属性 | 类型 | 默认值 | 说明 | +|------|------|--------|------| +| `items` | `DescriptionItem[]` | `[]` | 描述项配置 | +| `column` | `number` | `3` | 每行展示的描述项数量 | +| `direction` | `'horizontal' \| 'vertical'` | `'horizontal'` | 布局方向 | +| `border` | `boolean` | `false` | 是否显示边框和单元格分割线 | +| `labelWidth` | `string \| number` | - | label 区域宽度,仅横向布局生效 | +| `size` | `'sm' \| 'default' \| 'lg'` | `'default'` | 单元格密度 | +| `emptyText` | `string` | `'-'` | value 为空时的占位文本 | +| `class` | `HTMLAttributes['class']` | - | 根节点 class | +| `labelClass` | `HTMLAttributes['class']` | - | 全局 label 单元格 class | +| `valueClass` | `HTMLAttributes['class']` | - | 全局 value 单元格 class | + +## DescriptionItem + +| 属性 | 类型 | 说明 | +|------|------|------| +| `key` | `string` | 插槽标识。使用具名插槽时需要提供,组件不会自动转换 | +| `label` | `string` | label 文本 | +| `value` | `string \| number \| boolean \| null \| undefined` | value 文本 | +| `span` | `number` | 占用几个描述项列,默认 `1` | +| `class` | `HTMLAttributes['class']` | 当前项 label 和 value 的公共 class | +| `labelClass` | `HTMLAttributes['class']` | 当前项 label 单元格 class | +| `valueClass` | `HTMLAttributes['class']` | 当前项 value 单元格 class | + +`DescriptionItem` 支持扩展字段,扩展字段会原样保留在插槽参数的 `item` 中。 + +## Slots + +| 名称 | 说明 | 作用域参数 | +|------|------|------------| +| `label-{key}` | 自定义指定项 label | `item`、`index`、`label`、`value` | +| `value-{key}` | 自定义指定项 value | `item`、`index`、`label`、`value` | + +## 注意事项 + +1. `key` 只用于生成具名插槽,不用于读取数据。 +2. `key` 不会自动转换,建议使用字母、数字、短横线和下划线。 +3. `value` 为 `null`、`undefined` 或空字符串时显示 `emptyText`;`0` 和 `false` 会正常显示。 +4. `span` 表示占用几个描述项列,超出 `column` 时会按 `column` 处理。 +5. 最后一行不足 `column` 时会自动补齐空单元格,保证边框网格完整。 +6. 组件不内置标题、空状态和点击事件,可与 `FaCard`、`FaEmpty` 等组件组合使用。 diff --git a/packages/components/src/basic/descriptions/_examples/_basic.vue b/packages/components/src/basic/descriptions/_examples/_basic.vue new file mode 100644 index 00000000..5124a77d --- /dev/null +++ b/packages/components/src/basic/descriptions/_examples/_basic.vue @@ -0,0 +1,16 @@ + + + diff --git a/packages/components/src/basic/descriptions/_examples/_border.vue b/packages/components/src/basic/descriptions/_examples/_border.vue new file mode 100644 index 00000000..fd45de79 --- /dev/null +++ b/packages/components/src/basic/descriptions/_examples/_border.vue @@ -0,0 +1,16 @@ + + + diff --git a/packages/components/src/basic/descriptions/_examples/_slot.vue b/packages/components/src/basic/descriptions/_examples/_slot.vue new file mode 100644 index 00000000..c9834f76 --- /dev/null +++ b/packages/components/src/basic/descriptions/_examples/_slot.vue @@ -0,0 +1,65 @@ + + + diff --git a/packages/components/src/basic/descriptions/_examples/_vertical.vue b/packages/components/src/basic/descriptions/_examples/_vertical.vue new file mode 100644 index 00000000..47accff8 --- /dev/null +++ b/packages/components/src/basic/descriptions/_examples/_vertical.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/components/src/basic/descriptions/_examples/index.ts b/packages/components/src/basic/descriptions/_examples/index.ts new file mode 100644 index 00000000..2a250090 --- /dev/null +++ b/packages/components/src/basic/descriptions/_examples/index.ts @@ -0,0 +1,31 @@ +import Basic from './_basic.vue' +import BasicRaw from './_basic.vue?raw' +import Border from './_border.vue' +import BorderRaw from './_border.vue?raw' +import Slot from './_slot.vue' +import SlotRaw from './_slot.vue?raw' +import Vertical from './_vertical.vue' +import VerticalRaw from './_vertical.vue?raw' + +export default [ + { + title: '基础', + component: Basic, + componentRaw: BasicRaw, + }, + { + title: '边框', + component: Border, + componentRaw: BorderRaw, + }, + { + title: '纵向布局', + component: Vertical, + componentRaw: VerticalRaw, + }, + { + title: '自定义插槽', + component: Slot, + componentRaw: SlotRaw, + }, +] diff --git a/packages/components/src/basic/descriptions/index.vue b/packages/components/src/basic/descriptions/index.vue new file mode 100644 index 00000000..dfefdb36 --- /dev/null +++ b/packages/components/src/basic/descriptions/index.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/packages/components/src/examples.ts b/packages/components/src/examples.ts index e3e588d8..468a93a1 100644 --- a/packages/components/src/examples.ts +++ b/packages/components/src/examples.ts @@ -8,6 +8,7 @@ export { default as checkboxGroup } from './basic/checkbox-group/_examples' export { default as checkbox } from './basic/checkbox/_examples' export { default as collapsible } from './basic/collapsible/_examples' export { default as contextMenu } from './basic/context-menu/_examples' +export { default as descriptions } from './basic/descriptions/_examples' export { default as divider } from './basic/divider/_examples' export { default as drawer } from './basic/drawer/_examples' export { default as dropdown } from './basic/dropdown/_examples' diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 8e0ce161..2290ab7c 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -9,6 +9,8 @@ export { default as FaCheckboxGroup } from './basic/checkbox-group/index.vue' export { default as FaCheckbox } from './basic/checkbox/index.vue' export { default as FaCollapsible } from './basic/collapsible/index.vue' export { default as FaContextMenu } from './basic/context-menu/index.vue' +export { default as FaDescriptions } from './basic/descriptions/index.vue' +export type { DescriptionDirection, DescriptionItem, DescriptionItemBase, DescriptionSize, DescriptionSlotProps, DescriptionsProps, DescriptionValue } from './basic/descriptions/index.vue' export { default as FaDivider } from './basic/divider/index.vue' export type { DrawerEmits, DrawerProps } from './basic/drawer/index' export { useDrawer as useFaDrawer } from './basic/drawer/index'