@qin-ui/element-plus-pro 1.1.3 → 1.2.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.
Files changed (48) hide show
  1. package/AI-CONTEXT.md +86 -249
  2. package/README.md +36 -28
  3. package/api.json +7 -1
  4. package/bin/init-ai.mjs +132 -40
  5. package/es/components/component-provider/components/index.vue.d.ts +6 -0
  6. package/es/components/component-provider/components/index.vue.d.ts.map +1 -1
  7. package/es/components/component-provider/constants/index.d.ts.map +1 -1
  8. package/es/components/form/components/BaseField/index.vue.d.ts.map +1 -1
  9. package/es/components/form/components/BaseField/utils/index.d.ts +3 -1
  10. package/es/components/form/components/BaseField/utils/index.d.ts.map +1 -1
  11. package/es/components/table/components/ColumnControl.vue.d.ts +2 -1
  12. package/es/components/table/components/ColumnControl.vue.d.ts.map +1 -1
  13. package/es/components/table/components/ProTable.vue.d.ts +3 -2
  14. package/es/components/table/components/ProTable.vue.d.ts.map +1 -1
  15. package/es/components/table/components/SearchForm.vue.d.ts.map +1 -1
  16. package/es/components/table/components/SizeControl.vue.d.ts.map +1 -1
  17. package/es/components/table/types/index.d.ts +22 -0
  18. package/es/components/table/types/index.d.ts.map +1 -1
  19. package/es/components/table/useTable.d.ts.map +1 -1
  20. package/es/element-plus-pro.css +13 -13
  21. package/es/index.d.ts +1 -0
  22. package/es/index.d.ts.map +1 -1
  23. package/es/index.js +285 -125
  24. package/es/index.js.map +1 -1
  25. package/es/locale/en-US.d.ts +26 -0
  26. package/es/locale/en-US.d.ts.map +1 -0
  27. package/es/locale/index.d.ts +31 -0
  28. package/es/locale/index.d.ts.map +1 -0
  29. package/es/locale/zh-CN.d.ts +26 -0
  30. package/es/locale/zh-CN.d.ts.map +1 -0
  31. package/es/locale/zh-TW.d.ts +26 -0
  32. package/es/locale/zh-TW.d.ts.map +1 -0
  33. package/package.json +3 -3
  34. package/src/components/component-provider/components/index.vue +14 -1
  35. package/src/components/component-provider/constants/index.ts +20 -39
  36. package/src/components/form/components/BaseField/index.vue +10 -4
  37. package/src/components/form/components/BaseField/utils/index.ts +66 -3
  38. package/src/components/table/components/ColumnControl.vue +83 -20
  39. package/src/components/table/components/ProTable.vue +36 -10
  40. package/src/components/table/components/SearchForm.vue +6 -3
  41. package/src/components/table/components/SizeControl.vue +9 -5
  42. package/src/components/table/types/index.ts +23 -0
  43. package/src/components/table/useTable.ts +13 -1
  44. package/src/index.ts +1 -0
  45. package/src/locale/en-US.ts +21 -0
  46. package/src/locale/index.ts +68 -0
  47. package/src/locale/zh-CN.ts +21 -0
  48. package/src/locale/zh-TW.ts +21 -0
package/es/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/shared/ui/index.ts","../src/components/component-provider/constants/index.ts","../src/components/form/constants/index.ts","../src/components/form/components/PathProvider/index.vue","../src/components/form/components/GroupedFieldAttrs/index.vue","../src/components/form/components/BaseFormItem/index.vue","../src/components/form/hooks/useForm.ts","../src/components/form/components/BaseField/utils/index.ts","../src/components/form/components/BaseField/index.vue","../src/components/form/components/ContainerFragment/index.vue","../src/components/form/components/SlotComponent/index.vue","../src/components/form/components/ProForm/index.vue","../src/components/form/hooks/useFields.ts","../src/components/form/hooks/useFormRef.ts","../src/components/table/components/icons/DownOutlined.vue","../src/components/table/components/SearchForm.vue","../src/components/table/components/DefaultSearchFormContainer.vue","../src/components/table/components/DefaultTableContainer.vue","../src/components/table/components/icons/ColumnHeightOutlined.vue","../src/components/table/components/SizeControl.vue","../src/components/table/components/icons/FilterOutlined.vue","../src/components/table/components/ColumnControl.vue","../src/components/table/components/TableColumnRenderer.vue","../src/components/table/components/ProTable.vue","../src/components/table/useTable.ts","../src/components/component-provider/components/index.vue","../src/index.ts"],"sourcesContent":["import {\n ElForm as Form,\n ElFormItem as FormItem,\n ElRow as Grid,\n ElCol as GridItem,\n ElTable as Table,\n ElTableColumn as TableColumn,\n ElSpace as Space,\n ElDropdown as Dropdown,\n ElDropdownMenu as DropdownMenu,\n ElDropdownItem as DropdownItem,\n ElCheckbox as Checkbox,\n ElCheckboxGroup as CheckboxGroup,\n ElButton as Button,\n ElAutocomplete as AutoComplete,\n ElCascader as Cascader,\n ElDatePicker as DatePicker,\n ElInput as Input,\n ElInputNumber as InputNumber,\n ElSelect as Select,\n ElSlider as Slider,\n ElSwitch as Switch,\n ElTransfer as Transfer,\n ElTreeSelect as TreeSelect,\n ElRadioGroup as RadioGroup,\n ElTimePicker as TimePicker,\n ElTimeSelect as TimeSelect,\n ElPagination as Pagination,\n useFormDisabled,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type TableProps as _TableProps,\n type TableColumnCtx as ColumnType,\n type PaginationProps,\n type RowProps as GridProps,\n type ColProps as GridItemProps,\n} from 'element-plus';\nimport { type MaybeRefOrGetter, computed, inject, provide, toValue } from 'vue';\n\nexport {\n Form,\n FormItem,\n Grid,\n GridItem,\n Table,\n TableColumn,\n Space,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n CheckboxGroup,\n Button,\n AutoComplete,\n Cascader,\n DatePicker,\n Input,\n InputNumber,\n Select,\n Slider,\n Switch,\n Transfer,\n TreeSelect,\n RadioGroup,\n TimePicker,\n TimeSelect,\n Pagination,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type PaginationProps,\n type GridProps,\n type GridItemProps,\n type ColumnType,\n};\n\nexport type TableProps = _TableProps<any>;\n\nexport const tableProps = () => (Table as any).props || {};\nexport const paginationProps = () => (Pagination as any).props || {};\nexport const gridItemProps = () => (GridItem as any).props || {};\nexport const formItemProps = () => (FormItem as any).props || {};\n\nconst DisabledContextKey = Symbol('pro-form-disabled-context');\n\nexport const useDisabledContext = () => {\n const formDisabled = useFormDisabled();\n return inject(\n DisabledContextKey,\n computed(() => !!formDisabled.value)\n );\n};\n\nexport const useDisabledContextProvider = (\n disabled: MaybeRefOrGetter<boolean | undefined>\n) => {\n provide(\n DisabledContextKey,\n computed(() => !!toValue(disabled))\n );\n};\n\nexport type NamePath = string | number | (string | number)[];\n","import { RequiredComponentVars } from '../types';\nimport { InjectionKey, Component } from 'vue';\n\nexport type InjectConfigEntry<T = any> = {\n injectionKey: InjectionKey<T>;\n default: T;\n};\n\nexport const INJECT_CONFIG: {\n [key in keyof RequiredComponentVars]: {\n injectionKey: InjectionKey<RequiredComponentVars[key]>;\n default: RequiredComponentVars[key];\n };\n} = {\n 'pro-table': {\n injectionKey: Symbol(''),\n default: {\n pagination: {\n layout: 'total, sizes, prev, pager, next, jumper',\n pageSizes: [10, 20, 30, 40, 50, 100],\n background: true,\n },\n searchFormConfig: {\n layout: 'grid',\n expand: { minExpandRows: 2, expandStatus: false },\n },\n control: true,\n addIndexColumn: true,\n },\n },\n 'pro-form': {\n injectionKey: Symbol(''),\n default: { grid: { gutter: 24 } } as any,\n },\n 'pro-form-item': {\n injectionKey: Symbol(''),\n default: { span: 8 } as any,\n },\n input: {\n injectionKey: Symbol(''),\n default: { maxlength: 100, clearable: true, placeholder: '请输入' },\n },\n 'input.textarea': {\n injectionKey: Symbol(''),\n default: {\n maxlength: 200,\n autosize: { minRows: 3, maxRows: 6 },\n showWordLimit: true,\n clearable: true,\n placeholder: '请输入',\n },\n },\n 'input.password': {\n injectionKey: Symbol(''),\n default: {\n showPassword: true,\n maxlength: 100,\n clearable: true,\n placeholder: '请输入',\n },\n },\n 'input-number': {\n injectionKey: Symbol(''),\n default: {\n max: 10 ** 15 - 1,\n min: -(10 ** 15 + 1),\n controls: false,\n placeholder: '请输入',\n style: { width: '100%' },\n },\n },\n autocomplete: {\n injectionKey: Symbol(''),\n default: { clearable: true, placeholder: '请输入' },\n },\n select: {\n injectionKey: Symbol(''),\n default: { clearable: true, placeholder: '请选择' },\n },\n cascader: {\n injectionKey: Symbol(''),\n default: { clearable: true, placeholder: '请选择' },\n },\n 'date-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.date': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.dates': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.daterange': {\n injectionKey: Symbol(''),\n default: {\n style: { width: '100%' },\n startPlaceholder: '开始日期',\n endPlaceholder: '结束日期',\n },\n },\n 'date-picker.week': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.month': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.monthrange': {\n injectionKey: Symbol(''),\n default: {\n style: { width: '100%' },\n startPlaceholder: '开始月份',\n endPlaceholder: '结束月份',\n },\n },\n 'date-picker.months': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.yearrange': {\n injectionKey: Symbol(''),\n default: {\n style: { width: '100%' },\n startPlaceholder: '开始年份',\n endPlaceholder: '结束年份',\n },\n },\n 'date-picker.year': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.years': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.datetime': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'date-picker.datetimerange': {\n injectionKey: Symbol(''),\n default: {\n style: { width: '100%' },\n startPlaceholder: '开始时间',\n endPlaceholder: '结束时间',\n },\n },\n 'time-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'time-select': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' }, placeholder: '请选择' },\n },\n 'checkbox-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'radio-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n switch: {\n injectionKey: Symbol(''),\n default: { modelProp: 'modelValue' },\n },\n slider: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'tree-select': {\n injectionKey: Symbol(''),\n default: { clearable: true, placeholder: '请选择' },\n },\n transfer: {\n injectionKey: Symbol(''),\n default: {},\n },\n};\n\nexport const INJECT_COMPONENTS: InjectionKey<\n Partial<Record<string, Component>>\n> = Symbol('INJECT_COMPONENTS');\n\nconst DYNAMIC_INJECT_CONFIG: Record<string, InjectConfigEntry> =\n Object.create(null);\n\nexport const getInjectConfig = (key: string): InjectConfigEntry | undefined => {\n return (\n (INJECT_CONFIG as Record<string, InjectConfigEntry>)[key] ||\n DYNAMIC_INJECT_CONFIG[key]\n );\n};\n\nexport const ensureInjectConfig = (key: string): InjectConfigEntry => {\n const existing = getInjectConfig(key);\n if (existing) return existing;\n const created: InjectConfigEntry = {\n injectionKey: Symbol(`dynamic:${key}`),\n default: {},\n };\n DYNAMIC_INJECT_CONFIG[key] = created;\n return created;\n};\n","import {\n Cascader,\n CheckboxGroup,\n DatePicker,\n AutoComplete,\n Input,\n InputNumber,\n RadioGroup,\n Select,\n Slider,\n Switch,\n TimePicker,\n TimeSelect,\n Transfer,\n TreeSelect,\n} from '../../../shared/ui';\n\n/**\n * FormItem 插槽名称列表\n * @description 用于在字段配置中透传 FormItem 的插槽(Element Plus 版本)\n */\n// prettier-ignore\nexport const FORM_ITEM_SLOT_KEYS = ['label', 'error'] as const;\n\n/**\n * 内置组件映射表\n * @description Element Plus 内置支持的组件类型映射\n */\n// prettier-ignore\nexport type BaseComponentMap = {\n 'input': typeof Input;\n 'input-number': typeof InputNumber;\n 'autocomplete': typeof AutoComplete;\n 'select': typeof Select;\n 'cascader': typeof Cascader;\n 'date-picker': typeof DatePicker;\n 'time-picker': typeof TimePicker;\n 'time-select': typeof TimeSelect;\n 'checkbox-group': typeof CheckboxGroup;\n 'radio-group': typeof RadioGroup;\n 'switch': typeof Switch;\n 'slider': typeof Slider;\n 'tree-select': typeof TreeSelect;\n 'transfer': typeof Transfer;\n}\n\n/**\n * 组件映射扩展接口\n * @description 暴露给外部扩充自定义组件类型的接口。\n * 用户可通过 TypeScript 的声明合并(module augmentation)添加自定义组件。\n *\n * @example\n * ```ts\n * declare module '@qin-ui/element-plus-pro' {\n * interface ComponentMap {\n * 'my-custom-input': typeof MyCustomInput;\n * }\n * }\n * ```\n \n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ComponentMap {}\n\n/**\n * 组件名称联合类型\n * @description 所有支持的组件名称\n \n * @public\n */\nexport type ComponentName =\n | keyof BaseComponentMap\n | keyof ComponentMap\n | 'custom';\n\n/**\n * 根据组件名获取组件类型\n * @template K - 组件名称\n */\nexport type GetComponentType<K extends ComponentName> =\n K extends keyof ComponentMap\n ? ComponentMap[K]\n : K extends keyof BaseComponentMap\n ? BaseComponentMap[K]\n : never;\n\n/**\n * 组件名称到 Element Plus 组件的映射\n */\n// prettier-ignore\nexport const componentMap: BaseComponentMap = {\n 'input': Input,\n 'input-number': InputNumber,\n 'autocomplete': AutoComplete,\n 'select': Select,\n 'cascader': Cascader,\n 'date-picker': DatePicker,\n 'time-picker': TimePicker,\n 'time-select': TimeSelect,\n 'checkbox-group': CheckboxGroup,\n 'radio-group': RadioGroup,\n 'switch': Switch,\n 'slider': Slider,\n 'tree-select': TreeSelect,\n 'transfer': Transfer,\n}\n\n/**\n * Teleport 组件名称前缀\n * @description 用于通过插槽动态替换指定 path 的组件\n */\nexport const TeleportComponentNamePrefix = 'TeleportComponent_';\n\n// inject keys\nexport { InjectionFormKey, InjectionPathKey } from '../../../shared/core';\n","<script lang=\"ts\" setup>\nimport { computed, provide } from 'vue';\nimport { InjectionPathKey } from '../../constants';\nimport { NamePath } from '../../../../shared/ui';\n\nconst props = defineProps<{ path?: NamePath }>();\n\nconst namePath = computed(() => {\n return Array.isArray(props.path)\n ? props.path.join('.')\n : (props.path as string | undefined);\n});\n\nprovide(InjectionPathKey, namePath);\n</script>\n\n<template>\n <slot :path=\"namePath\" />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component GroupedFieldAttrs\n * @description 字段属性分组器,将 field 配置对象拆分为三类属性\n *\n * ## 属性分发逻辑\n *\n * 单个 field 对象包含多种属性,需要分发到不同的渲染目标:\n *\n * 1. **gridItemProps** — 网格布局属性(span、xs、sm、md、lg、xl、xxl 等),传递给 GridItem\n * 2. **formItemProps** — 表单项属性(label、rules、required 等),传递给 FormItem\n * 3. **componentProps** — 组件属性(placeholder、clearable 等),传递给输入组件\n * 4. **formItemSlots** — FormItem 的具名插槽(label、error 等)\n *\n * 分组依据:\n * - 匹配 element-plus GridItem 的 props key → gridItemProps\n * - 匹配 element-plus FormItem 的 props key → formItemProps\n * - 其余所有属性 → componentProps\n * - 属于 FORM_ITEM_SLOT_KEYS 的插槽 → formItemSlots\n * - 其余插槽 → componentProps.slots\n */\nimport { computed, inject, mergeProps, toValue } from 'vue';\nimport {\n GridItemProps,\n FormItemProps,\n gridItemProps,\n formItemProps,\n} from '../../../../shared/ui';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport type { Base, Field } from '../../types';\nimport { FORM_ITEM_SLOT_KEYS } from '../../constants';\nimport { isPlainObject } from '../../../../shared/core';\n\nconst formItemPropKeys = Object.keys(formItemProps());\nconst gridItemPropKeys = Object.keys(gridItemProps());\n\ntype Props = {\n field: Field;\n};\nconst props = defineProps<Props>();\n\nconst config = INJECT_CONFIG['pro-form-item'];\nconst injectFormItemProps = inject(config.injectionKey, config.default);\n\ntype GroupedFieldAttrs = {\n gridItemProps: GridItemProps;\n formItemProps: FormItemProps & { container?: Base['formItemContainer'] };\n formItemSlots: Record<(typeof FORM_ITEM_SLOT_KEYS)[number], any>;\n componentProps: Record<string, any>;\n};\n\n// 将 field 配置按 key 分发到三类属性分组中\nconst groupedAttributes = computed<GroupedFieldAttrs>(() => {\n let gridItemProps: Record<string, any> = {};\n let formItemProps: Record<string, any> = {};\n const componentProps: Record<string, any> = { slots: {} };\n const formItemSlots: Record<string, any> = {};\n\n if (isPlainObject(props.field)) {\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { path, name, fields, formItemClass, formItemStyle, formItemContainer, hidden, span, getFormItemRef, getComponentRef, getFormItemComputedProps, getComponentComputedProps, slots = {}, formItemDataAttrs = {}, componentDataAttrs = {}, extraProps, ...rest } =\n props.field as any;\n const {\n class: injectClassName,\n style: injectStyle,\n span: injectSpan,\n formItemContainer: injectFormItemContainer,\n xs,\n sm,\n md,\n lg,\n xl,\n ...injectRest\n } = injectFormItemProps;\n\n const initGridItemProps =\n span || span === 0 ? { span } : { xs, sm, md, lg, xl, span: injectSpan };\n\n gridItemProps = fields ? { span: span ?? 24 } : initGridItemProps;\n formItemProps = mergeProps(\n injectRest as any,\n { class: injectClassName, style: injectStyle },\n { class: toValue(formItemClass), style: toValue(formItemStyle) },\n formItemDataAttrs\n );\n formItemProps.container = formItemContainer ?? injectFormItemContainer;\n\n Object.keys(rest).forEach(k => {\n if (gridItemPropKeys.includes(k)) {\n gridItemProps[k] = rest[k];\n } else if (formItemPropKeys.includes(k)) {\n (formItemProps as any)[k] = rest[k];\n } else {\n componentProps[k] = rest[k];\n }\n });\n // 将 componentDataAttrs 展开到组件 props 中\n Object.assign(componentProps, componentDataAttrs);\n Object.keys(slots).forEach(k => {\n if (FORM_ITEM_SLOT_KEYS.includes(k as any)) {\n formItemSlots[k] = slots[k];\n } else {\n componentProps['slots'][k] = slots[k];\n }\n });\n }\n\n return { gridItemProps, formItemProps, componentProps, formItemSlots };\n});\n</script>\n\n<template>\n <slot v-bind=\"groupedAttributes\"></slot>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component BaseFormItem\n * @description 表单字段渲染引擎\n *\n * 负责将字段配置数组渲染为实际的表单项,支持:\n * - 字段分组(嵌套 fields 递归渲染)\n * - 网格布局(grid 属性控制)\n * - FormItem 包装(label、rules、校验等)\n * - 组件绑定(通过 BaseField 渲染具体组件)\n * - 插槽透传(label、error 等 FormItem 插槽)\n *\n * ## 渲染流程\n *\n * 1. 遍历 fields 数组,过滤 hidden 字段\n * 2. 对每个字段:\n * a. 通过 PathProvider 提供当前字段路径\n * b. 通过 GroupedFieldAttrs 将 field 配置拆分为 gridItemProps / formItemProps / componentProps\n * c. 如果字段有 `fields` 子字段 → 递归渲染 BaseFormItem(嵌套表单)\n * d. 否则 → 渲染 BaseField(输入组件)\n * 3. 通过 ref 回调收集 FormItem 和 Component 实例,注入到 field 对象上\n *\n * @param {Fields<D>} [fields] - 字段配置数组\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 是否禁用所有子字段\n *\n * @internal\n */\nimport { getObject, toPath } from '../../../../shared/core';\nimport {\n FormItem,\n Grid as ElGrid,\n GridItem as ElGridItem,\n GridProps,\n useDisabledContextProvider,\n} from '../../../../shared/ui';\nimport { computed, inject, toValue } from 'vue';\nimport type { Fields, Grid } from '../../types';\nimport { BaseField, SlotComponent, ContainerFragment } from '..';\nimport PathProvider from '../PathProvider/index.vue';\nimport GroupedFieldAttrs from '../GroupedFieldAttrs/index.vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\n\ndefineOptions({ name: 'BaseFormItem', inheritAttrs: false });\n\ntype Props = {\n grid?: Grid;\n fields?: Fields;\n disabled?: boolean;\n};\nconst {\n grid = undefined,\n fields = [],\n disabled = undefined,\n} = defineProps<Props>();\n\nconst validFields = computed(() => fields.filter?.(field => !field.hidden));\n\nuseDisabledContextProvider(computed(() => disabled) as any);\n\nconst config = INJECT_CONFIG['pro-form'];\n\nconst { grid: injectGrid } = inject(config.injectionKey, config.default);\n\nconst enableGrid = computed(() => {\n if (grid !== undefined) return !!grid;\n return !!injectGrid;\n});\n\nconst computedGridProps = computed<GridProps>(() => {\n return enableGrid.value\n ? { ...getObject(injectGrid), ...getObject(grid) }\n : {};\n});\n\nconst formItemRefs: any[] = [];\nconst componentRefs: any[] = [];\n\nconst onFormItemMounted = (index: number, formItemProps?: any) => {\n const field = validFields.value[index];\n Object.assign(field, {\n getFormItemRef: () => formItemRefs[index],\n getFormItemComputedProps: () => formItemProps,\n });\n};\n\nconst onComponentMounted = (index: number) => {\n const field = validFields.value[index];\n Object.assign(field, {\n getComponentRef: () => componentRefs[index]?.getComponentRef(),\n getComponentComputedProps: () =>\n componentRefs[index]?.getComponentComputedProps(),\n });\n};\n</script>\n\n<template>\n <ContainerFragment\n :component=\"enableGrid ? ElGrid : undefined\"\n v-bind=\"computedGridProps\"\n style=\"width: 100%\"\n >\n <PathProvider\n v-for=\"({ path: _path, ...field }, index) of validFields\"\n :key=\"toPath(toValue((_path ?? index) as any)).join('.') || index\"\n v-bind=\"{ path: _path as any }\"\n >\n <template #default=\"{ path }\">\n <GroupedFieldAttrs :field=\"field\">\n <template\n #default=\"{\n gridItemProps,\n formItemProps: { container, ...formItemProps },\n componentProps,\n formItemSlots,\n }\"\n >\n <ContainerFragment\n :component=\"enableGrid ? ElGridItem : undefined\"\n v-bind=\"gridItemProps\"\n >\n <ContainerFragment :component=\"container\" :path=\"path\">\n <FormItem\n v-bind=\"formItemProps\"\n :ref=\"el => (formItemRefs[index] = el)\"\n :prop=\"toPath(path).join('.')\"\n :path=\"path\"\n @vue:mounted=\"onFormItemMounted(index, formItemProps)\"\n >\n <template\n v-for=\"(slot, name) in formItemSlots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent\n :path=\"path\"\n :component=\"slot\"\n v-bind=\"scoped\"\n />\n </template>\n <template v-if=\"field.fields\">\n <BaseFormItem\n :grid=\"(field as any).grid ?? grid\"\n :fields=\"field.fields\"\n :disabled=\"toValue(field.disabled)\"\n />\n </template>\n <template v-else>\n <BaseField\n :ref=\"el => (componentRefs[index] = el)\"\n v-bind=\"componentProps\"\n :path=\"path\"\n @vue:mounted=\"onComponentMounted(index)\"\n />\n </template>\n </FormItem>\n </ContainerFragment>\n </ContainerFragment>\n </template>\n </GroupedFieldAttrs>\n </template>\n </PathProvider>\n </ContainerFragment>\n</template>\n\n<style scoped lang=\"less\">\n[class*='-form-item'] [class*='-form-item'] {\n margin-bottom: 18px;\n}\n</style>\n","import {\n useForm as coreUseForm,\n type Form as _Form,\n} from '../../../shared/core';\nimport type { Data, ExtendWithAny, DeepPartial } from '../../../shared/core';\nimport type { Field } from '../types';\nimport type { ComponentName } from '../constants';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单实例类型\n *\n * @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,\n * 将底层表单实例 I 绑定为 Element Plus 的 FormInstance,使 formRef 获得完整的类型提示。\n *\n * @template D - 表单数据类型\n * @template F - 字段配置类型,默认使用本地 Field 类型\n *\n * @property formData - 响应式表单数据对象,可直接读写,支持深层路径如 `formData.address.city`\n * @property getFormData - 获取指定路径的表单数据,支持点号分隔的深层路径,如 `getFormData('address.city')`\n * @property setFormData - 设置表单数据,支持三种调用方式:<br>\n * 1. `setFormData(path, value)` - 设置指定路径的值<br>\n * 2. `setFormData(path, prev => newVal)` - 函数式更新<br>\n * 3. `setFormData({ ... })` - 批量覆盖整个表单\n * @property fields - 字段配置数组(响应式 Ref),ProForm 根据此数组渲染表单字段\n * @property getField - 获取字段配置,支持路径字符串(如 `'name'`)或查找函数(如 `f => f.label === '姓名'`)\n * @property setField - 更新字段配置,默认合并模式(Object.assign),可通过 `{ updateType: 'rewrite' }` 覆盖\n * @property deleteField - 删除字段配置,支持 `{ all: true }` 批量删除所有匹配项\n * @property appendField - 在指定字段后追加新字段,传 `undefined` 则在末尾追加\n * @property prependField - 在指定字段前插入新字段,传 `undefined` 则在开头插入\n * @property getParentField - 获取指定字段的父级字段配置,用于嵌套字段场景\n * @property formRef - 底层 Element Plus Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetFields()` 等方法\n * @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n * const form: Form<User> = useForm({ name: '张三', age: 25 })\n *\n * form.formData.name // 直接读写响应式数据\n * form.getFormData('name') // 通过路径读取\n * form.setFormData('name', '李四') // 更新数据\n * form.formRef.value?.validate() // 访问底层 Form 实例\n * ```\n *\n * @public\n */\nexport type Form<\n D extends Data = Data,\n F extends Field<ComponentName, D> = Field<ComponentName, D>,\n> = _Form<D, F, FormInstance>;\n\n/**\n * 创建表单实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 所有内置组件类型推导)\n * - 表单实例 -> Element Plus 的 `FormInstance`(使 formRef 获得完整的类型提示)\n *\n * 表单实例组合了三个子模块的能力:\n * - **useFormData**:表单数据管理(响应式数据、读写、批量更新)\n * - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)\n * - **useFormRef**:底层 Form 组件实例引用\n *\n * @template D - 表单数据类型\n *\n * @param {ExtendWithAny<DeepPartial<D>>} [initFormData] - 初始表单数据\n * @param {Field<ComponentName, D>[]} [initFields] - 初始字段配置数组\n * @param {boolean} [root=true] - 是否为根表单。设为 `false` 时尝试从父组件注入获取表单实例\n *\n * @returns {Form<D>} 表单实例,包含数据操作、字段操作和 ref 操作\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * // 方式一:同时传入初始数据和字段\n * const form = useForm<User>(\n * { name: '张三', age: 25 },\n * [\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ],\n * true\n * )\n *\n * // 方式二:仅设置 root 标识\n * const form = useForm<User>(true)\n *\n * // 使用\n * const { formData, formRef, fields, setFormData, getField } = form\n * setFormData('name', '李四')\n * await formRef.value?.validate()\n * ```\n *\n * @see {@link coreUseForm} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useForm<D extends Data = Data>(\n initFormData?: ExtendWithAny<DeepPartial<D>>,\n initFields?: Field<ComponentName, D>[],\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm<D extends Data = Data>(\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm(...args: any[]) {\n return coreUseForm(...(args as any));\n}\n","import { Field } from '../../../types';\nimport { getInjectConfig } from '../../../../component-provider/constants';\nimport { inject } from 'vue';\n\nexport const getInitProps = (field: Field): Record<string, any> => {\n const { component, type } = field as any;\n if (typeof component === 'string') {\n const k = [component, type].filter(Boolean).join('.');\n const config = getInjectConfig(k);\n if (!config) return {};\n const injectProps = inject(config.injectionKey, config.default);\n return injectProps;\n }\n return {};\n};\n","<script lang=\"ts\" setup>\n/**\n * @component BaseField\n * @description 字段级渲染组件,负责将 field 配置渲染为实际的输入组件\n *\n * ## 核心职责\n *\n * 1. **组件解析**:按优先级解析要渲染的组件(teleport 插槽 > 自定义组件 > 内置组件映射 > 原始值)\n * 2. **v-model 双向绑定**:通过 computed getter/setter 将组件值与 formData 的深层路径绑定\n * 3. **valueFormatter 处理**:支持 get/set 格式化函数,用于数据转换(如日期格式化)\n * 4. **属性合并**:将注入的默认 props、组件传入的 attrs 合并为最终属性\n *\n * ## 组件解析优先级\n *\n * ```\n * teleport 组件(ProForm 插槽注入)\n * ↓ 未匹配\n * 自定义组件(ProComponentProvider 的 componentMap)\n * ↓ 未匹配\n * 内置组件映射(componentMap: input → Input, select → Select ...)\n * ↓ 未匹配\n * 原始 component 值(可能是字符串或 Vue 组件对象)\n * ```\n *\n * @param {string | Component} [component] - 组件名或组件对象\n * @param {string} [path] - 字段路径,用于绑定表单数据\n *\n * @slot default - 默认插槽(透传给组件)\n */\nimport {\n type Component,\n computed,\n inject,\n mergeProps,\n ref,\n useAttrs,\n} from 'vue';\nimport { cloneDeep, omit } from '../../../../shared/core';\nimport { useDisabledContext } from '../../../../shared/ui';\nimport type { Field } from '../../types';\nimport { ContainerFragment, SlotComponent } from '..';\nimport { componentMap, TeleportComponentNamePrefix } from '../../constants';\nimport { INJECT_COMPONENTS } from '../../../component-provider/constants';\nimport { useForm } from '../../hooks/useForm';\nimport { getInitProps } from './utils';\n\ndefineOptions({ name: 'BaseField', inheritAttrs: false });\n\ntype Props = {\n component?: string | Component;\n path?: string;\n};\nconst { component = undefined, path = '' } = defineProps<Props>();\n\nconst form = useForm(false);\nconst { getFormData, setFormData } = form;\n\nconst componentRef = ref<any>();\n\nconst attrs: any = useAttrs();\n\nfunction getOldValue() {\n return cloneDeep(getFormData?.(path));\n}\n\n// setter: 向 formData 写入值,支持 valueFormatter / valueFormatter.set 转换\nconst value = computed({\n get() {\n let val = getFormData?.(path);\n const { valueFormatter } = groupedAttrs.value;\n if (\n typeof valueFormatter === 'object' &&\n typeof valueFormatter.get === 'function'\n ) {\n val = valueFormatter.get(val);\n }\n return val;\n },\n set(val) {\n let newVal = val;\n const { valueFormatter } = groupedAttrs.value;\n if (valueFormatter) {\n if (typeof valueFormatter === 'function') {\n newVal = valueFormatter(val, getOldValue());\n } else if (typeof valueFormatter.set === 'function') {\n newVal = valueFormatter.set(val, getOldValue());\n }\n }\n setFormData?.(path, newVal);\n },\n});\n\nconst parentDisabled = useDisabledContext();\n\n/*\n * 将注入的默认 props、外部传入的 attrs、field 配置合并为最终属性\n * 属性分为三类:绑定属性(v-model)、组件属性(传递给组件)、插槽(动态渲染)\n */\nconst groupedAttrs = computed(() => {\n const initProps = getInitProps({\n component: component,\n type: attrs.type,\n } as unknown as Field);\n const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';\n const mergedProps = mergeProps(\n initProps,\n attrs,\n { class: attrs.componentClass, style: attrs.componentStyle },\n { class: initProps.componentClass, style: initProps.componentStyle },\n { disabled: attrs.disabled ?? parentDisabled.value ?? initProps.disabled },\n { modelProp: modelPropName }\n ) as Required<Field>;\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { valueFormatter, modelProp, slots, componentClass, componentStyle, componentContainer, ...rest } = mergedProps\n const modelBindingProp = modelProp ?? 'modelValue';\n // 从剩余属性中移除 v-model 绑定属性,避免重复绑定\n const bindAttrs = omit(rest as Record<string, any>, [\n modelBindingProp,\n `onUpdate:${modelBindingProp}`,\n ]);\n return {\n attrs: bindAttrs,\n slots,\n componentContainer,\n modelProp: modelBindingProp,\n valueFormatter,\n };\n});\n\n// 从 ProForm 插槽注入的 teleport 组件(优先级最高)\nconst teleportComponent = inject(\n `${TeleportComponentNamePrefix}${path}`,\n undefined\n);\n\n// 从 ProComponentProvider 注入的自定义组件映射\nconst customComponents = inject(INJECT_COMPONENTS, {});\n\n/*\n * 按优先级解析最终要渲染的组件:\n * teleport 插槽 → 自定义组件映射 → 内置组件映射 → 原始 component 值\n */\nconst is = computed(() => {\n if (teleportComponent) return teleportComponent;\n if (typeof component === 'string') {\n return (\n (customComponents as any)[component] ||\n (componentMap as any)[component] ||\n component\n );\n }\n return component;\n});\n\ndefineExpose({\n getComponentRef: () => componentRef.value,\n getComponentComputedProps: () => groupedAttrs.value.attrs as any,\n});\n</script>\n\n<template>\n <ContainerFragment :component=\"groupedAttrs.componentContainer\" :path=\"path\">\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\n :path=\"path\"\n >\n <template\n v-for=\"(slot, name) in groupedAttrs.slots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent :path=\"path\" v-bind=\"scoped\" :component=\"slot\" />\n </template>\n </component>\n </ContainerFragment>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component ContainerFragment\n * @description 容器分片渲染组件。用于动态渲染表单行或表单项的外部包裹容器(例如 Grid 行、Col 列等布局容器)。\n *\n * @public\n */\nimport type { ContainerComponent } from '../../types';\n\ntype Props = {\n component?: ContainerComponent;\n};\n\ndefineProps<Props>();\n\ndefineOptions({ name: 'ContainerFragment', inheritAttrs: false });\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"component\" v-bind=\"$attrs\">\n <slot />\n </component>\n <slot v-else />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component SlotComponent\n * @description 插槽渲染辅助组件。用于在表单或表格的自定义插槽中动态渲染外部传入的 VNode、渲染函数或静态字符串。\n *\n * @public\n */\nimport { isVNode } from 'vue';\nimport { SlotComponentType } from '../../types';\n\ndefineOptions({ name: 'SlotComponent', inheritAttrs: false });\n\ntype Props = {\n component?: SlotComponentType;\n};\ndefineProps<Props>();\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-if=\"isVNode(component) || typeof component === 'function'\"\n v-bind=\"$attrs\"\n />\n <template v-else>{{ component }}</template>\n</template>\n","<script lang=\"ts\" setup generic=\"F extends Form<any> = Form\">\n/**\n * @component ProForm\n * @description @qin-ui/element-plus-pro 配置驱动表单组件\n *\n * 架构设计说明 (Architecture Overview)\n *\n * [ 数据层 (Core) ] => [ 绑定层 (ProForm) ] => [ 渲染层 (BaseFormItem / BaseField) ]\n *\n * 1. 数据隔离:ProForm 本身不负责存储和管理表单状态,所有核心状态(formData, fields, 校验规则)\n * 均交由底层的 `useForm`(@qin-ui/pro-components-core)驱动。\n * 2. 上下文透传:通过 `provide` 将核心状态下发给子组件,避免了深层嵌套的 Props 传递。\n * 3. 递归渲染:网格布局和具体字段的解析交由 `<BaseFormItem>` 递归完成,实现了 UI 布局与表单逻辑的解耦。\n *\n * 通过配置驱动的方式快速构建表单,支持:\n * - 字段联动、嵌套字段、自定义组件、网格布局\n *\n * @template F - 表单实例类型\n * @param {F} [form] - useForm 返回的表单实例\n * @param {boolean | GridProps} [grid=false] - 是否启用网格布局\n *\n * @slot default - 默认插槽\n * @slot [path] - 以字段 path 命名的动态插槽\n \n * @public\n */\nimport {\n Form as ElForm,\n FormProps as ElFormProps,\n} from '../../../../shared/ui';\nimport {\n inject,\n mergeProps,\n provide,\n type Slot,\n watchEffect,\n computed,\n useAttrs,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport { BaseFormItem } from '..';\nimport { InjectionFormKey, TeleportComponentNamePrefix } from '../../constants';\nimport type { Grid, VModelProps, PathProps } from '../../types';\nimport { Path, camelizeProperties } from '../../../../shared/core';\nimport type { Form } from '../../hooks/useForm';\n\ndefineOptions({ name: 'ProForm', inheritAttrs: false });\n\ntype FormProps = Partial<Omit<ElFormProps, 'model'>>;\n\ntype Props = { grid?: Grid; form?: F } & /* @vue-ignore */ FormProps;\nconst { grid = false, form = {} as F } = defineProps<Props>();\n\n/**\n * 依赖注入中心:\n * 将 Core 包生成的 Form 实例注入到 Vue 的 Context 中。\n * 供深层子组件(如 BaseFormItem, BaseField, 自定义插槽)跨层级直接访问数据和方法。\n */\nprovide(InjectionFormKey, form as F);\n\nconst { formData, fields, setFormRef } = form as F;\nconst _fields = computed(() => fields.value);\n\nconst config = INJECT_CONFIG['pro-form'];\nconst attrs = useAttrs();\n\n// 从 ProComponentProvider 获取全局配置,与传入的 props 合并\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { grid: _injectGrid, ...injectAttrs } = inject(\n config.injectionKey,\n config.default\n);\n\ntype ExtractPath<T> = T extends Form<infer D> ? Path<D> : string;\ntype FieldSlotProps = VModelProps &\n PathProps & { disabled?: boolean; [x: string]: any };\ntype FieldSlots = Record<ExtractPath<F>, Slot<FieldSlotProps>>;\n\nconst slots = defineSlots<Partial<FieldSlots & { default: Slot }>>();\n\n/**\n * 动态插槽映射中心 (Slot Teleporting):\n * 目的:将 ProForm 上以 Field Path 命名的插槽,动态注册为全局可访问的 Context。\n * 实现:BaseField 组件在渲染对应字段时,会通过 inject 尝试获取对应的 Prefix+Path,\n * 如果存在,则将插槽内容渲染到深层的具体位置,从而突破了组件嵌套层级的限制。\n */\nwatchEffect(() => {\n Object.keys(slots).forEach(name => {\n if (name === 'default') return;\n provide(`${TeleportComponentNamePrefix}${name}`, (slots as any)[name]);\n });\n});\n</script>\n\n<template>\n <ElForm\n :ref=\"(el: any) => setFormRef?.(el)\"\n :model=\"formData\"\n v-bind=\"mergeProps(injectAttrs, camelizeProperties(attrs))\"\n class=\"pro-form\"\n @submit.prevent\n >\n <BaseFormItem :fields=\"_fields\" :grid=\"grid\" />\n <slot />\n </ElForm>\n</template>\n","import { FormItemInstance } from '../../../shared/ui';\nimport {\n useFields as coreUseFields,\n type UseFieldsReturn,\n} from '../../../shared/core';\nimport type { Data } from '../../../shared/core';\nimport type { Field, Fields } from '../types';\nimport type { ComponentName } from '../constants';\n\n/**\n * 字段配置管理 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFields`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 组件类型推导)\n * - FormItem 实例 -> Element Plus 的 `FormItemInstance`\n *\n * 提供对字段配置数组的增删改查操作,支持:\n * - 通过路径字符串或查找函数定位字段\n * - 深层嵌套字段的遍历和匹配\n * - 字段配置的合并/覆盖更新\n * - 字段的添加、插入、删除\n * - 父级字段查找\n *\n * @template D - 表单数据类型\n * @param {Fields<D>} [initFields] - 初始字段配置数组\n *\n * @returns 字段操作对象,包含以下属性:\n * - `fields` - 字段配置数组(响应式 Ref\\<F[]\\>)\n * - `getField(path)` - 获取字段配置,支持路径字符串或查找函数\n * - `setField(path, field, options?)` - 更新字段配置,默认合并模式\n * - `deleteField(path, options?)` - 删除字段配置\n * - `appendField(path, field, options?)` - 在指定字段后追加\n * - `prependField(path, field, options?)` - 在指定字段前插入\n * - `getParentField(path, options?)` - 获取父级字段配置\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * const { fields, getField, setField } = useFields<User>([\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ])\n *\n * // 通过路径获取\n * getField('name')\n * // 通过查找函数获取\n * getField(f => f.label === '姓名')\n * // 更新字段(合并模式)\n * setField('name', { label: '用户名', disabled: true })\n * ```\n *\n * @see {@link coreUseFields} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFields<D extends Data = Data>(\n initFields?: Fields<D>\n): UseFieldsReturn<D, Field<ComponentName, D>, FormItemInstance>;\nexport function useFields(initFields?: any) {\n return coreUseFields(initFields);\n}\n\n/** useFields 返回值类型\n * @public\n */\nexport type UseFields<D extends Data = Data> = ReturnType<typeof useFields<D>>;\n","import {\n useFormRef as coreUseFormRef,\n type UseFormRefReturn,\n} from '../../../shared/core';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单组件实例引用 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFormRef`,将泛型参数绑定为 Element Plus 的 `FormInstance`,\n * 使 formRef 获取到完整的 Element Plus Form 组件 API 类型提示(如 `validate()`、`resetFields()` 等)。\n *\n * `formRef` 由 ProForm 组件内部自动通过 `setFormRef` 绑定,无需手动调用。\n *\n * @returns 表单组件实例引用管理对象:\n * - `formRef` — Element Plus Form 组件实例的响应式引用(`Ref<FormInstance | undefined>`)\n * - `setFormRef(inst)` — 设置 Form 组件实例,由 ProForm 内部自动调用\n *\n * @example\n * ```ts\n * const { formRef, setFormRef } = useFormRef()\n *\n * // formRef 由 ProForm 自动绑定,可直接使用\n * await formRef.value?.validate()\n * formRef.value?.resetFields()\n * formRef.value?.scrollToField('username')\n * ```\n *\n * @see {@link coreUseFormRef} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFormRef(): UseFormRefReturn<FormInstance> {\n return coreUseFormRef();\n}\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"down\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"></path></svg>\n</template>\n","<script lang=\"ts\">\ntype Expand = {\n // 网格布局时默认展开行数量\n minExpandRows?: number;\n // 网格布局时展开状态\n expandStatus?: boolean;\n};\n\ntype _FormProps = Pick<\n Partial<FormProps>,\n | 'disabled'\n | 'labelPosition'\n | 'labelWidth'\n | 'inline'\n | 'inlineMessage'\n | 'statusIcon'\n | 'showMessage'\n | 'size'\n>;\n\ntype ButtonProps = { onClick: () => void };\ntype ExpandButtonProps = ButtonProps & { expandStatus: boolean };\n\nexport type SearchFormProps = {\n form: Form;\n layout?: 'grid' | 'inline';\n expand?: boolean | Expand;\n searchButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n resetButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n expandButton?:\n | Component<ExpandButtonProps>\n | DefineComponent<ExpandButtonProps>\n | false;\n rowGap?: number;\n columnGap?: number;\n} & /* @vue-ignore */ _FormProps &\n AllowedComponentProps;\n</script>\n\n<script lang=\"ts\" setup>\n/**\n * @component SearchForm\n * @description ProTable 的搜索表单子组件\n *\n * ## 核心功能\n *\n * 1. 内部渲染 ProForm,使用 table.searchForm 管理搜索条件\n * 2. 支持 grid(网格)和 inline(行内)两种布局\n * 3. 网格布局下支持展开/折叠:通过 IntersectionObserver 自动检测哪些字段溢出\n * 4. 提供搜索、重置、展开/折叠按钮(支持自定义)\n *\n * ## 展开/折叠机制\n *\n * 1. 首次渲染后,测量 ProForm 的实际高度\n * 2. 根据 minExpandRows 计算折叠高度(默认 2 行)\n * 3. 如果实际高度 > 折叠高度,显示展开/折叠按钮\n * 4. 使用 IntersectionObserver 检测隐藏字段是否有值,有值则自动展开\n */\nimport { Space, Button, FormProps } from '../../../shared/ui';\nimport {\n AllowedComponentProps,\n computed,\n ref,\n watch,\n watchEffect,\n type Component,\n type DefineComponent,\n} from 'vue';\nimport ProForm from '../../form';\nimport { type Form } from '../../form';\nimport DownOutlined from './icons/DownOutlined.vue';\n\ndefineOptions({ name: 'SearchForm' });\n\nconst {\n layout = 'grid',\n expand = true,\n searchButton = undefined,\n resetButton = undefined,\n expandButton = undefined,\n rowGap = 16,\n columnGap = 24,\n form,\n} = defineProps<SearchFormProps>();\n\ntype Emits = {\n (e: 'search'): void;\n (e: 'reset'): void;\n};\nconst emit = defineEmits<Emits>();\n\nconst proFormHeight = ref<'unset' | number>('unset');\nconst collapseHeight = ref(0);\nlet rowHeight = 32;\n\nconst computedExpand = computed(() => {\n if (!expand) return false;\n if (expand === true) return { minExpandRows: 2, expandStatus: false };\n return {\n minExpandRows: Math.max(Math.floor(expand.minExpandRows ?? 2), 1),\n expandStatus: expand.expandStatus ?? false,\n };\n});\n\nconst showExpandToggle = ref(false);\n\nconst expandStatus = ref(true);\n\nconst changeExpandStatus = () => {\n expandStatus.value = !expandStatus.value;\n};\n\nconst { formRef, getFormData } = form;\n\n/*\n * 使用 IntersectionObserver 检测折叠状态下隐藏字段是否有值\n * 如果有值则自动展开,让用户看到已填写的搜索条件\n */\nconst setInitExpandStatus = () => {\n expandStatus.value = false;\n if (formRef.value && expand) {\n const formEl = (formRef.value as any).$el;\n const formItemsEl = formEl.querySelectorAll(\n \"[class*='-form-item'] > [path]\"\n );\n const observer = new IntersectionObserver(\n entries => {\n expandStatus.value = entries.some(e => {\n // 如果隐藏字段(intersectionRatio === 0)有值,则自动展开\n if (e.intersectionRatio === 0) {\n const path = e.target.getAttribute('path');\n const searchFieldValue = path ? getFormData?.(path) : undefined;\n return ![null, undefined].includes(searchFieldValue);\n }\n return (expand as any).expandStatus;\n });\n observer.disconnect();\n },\n { root: formEl }\n );\n formItemsEl.forEach((element: Element) => {\n observer.observe(element);\n });\n }\n};\n\nwatch(\n [\n () => form?.fields.value?.filter((f: any) => !f.hidden)?.length,\n () => formRef.value,\n () => expand,\n ],\n () => {\n if (!expand || !expandStatus.value || !formRef.value) return;\n const proFormEl = (formRef.value as any)?.$el;\n const { height = 0 } = proFormEl?.getBoundingClientRect?.() || {};\n proFormHeight.value = height;\n rowHeight = proFormEl\n ?.querySelector(\"[class*='-form-item']\")\n ?.getBoundingClientRect?.()?.height;\n },\n { flush: 'post', immediate: true }\n);\n\n/*\n * 计算折叠高度和是否显示展开按钮\n * 折叠高度 = minExpandRows * 行高 + (minExpandRows - 1) * 行间距\n * 如果实际高度与折叠高度差异 > 1px,说明有字段溢出,显示展开按钮\n */\nwatchEffect(\n () => {\n if (typeof proFormHeight.value !== 'number') return;\n if (layout === 'grid' && computedExpand.value) {\n const { minExpandRows } = computedExpand.value;\n collapseHeight.value = Math.min(\n minExpandRows * rowHeight + (minExpandRows - 1) * rowGap,\n +proFormHeight.value\n );\n showExpandToggle.value = +proFormHeight.value - collapseHeight.value > 1;\n if (showExpandToggle.value) {\n setInitExpandStatus();\n }\n } else {\n showExpandToggle.value = false;\n }\n },\n { flush: 'post' }\n);\n\nconst layoutProps = computed(() =>\n layout === 'grid'\n ? {\n grid: {\n gutter: columnGap,\n style: { rowGap: `${rowGap}px` },\n },\n style: {\n display: 'flex',\n overflow: 'hidden',\n columnGap: `${columnGap}px`,\n height: `${expandStatus.value ? proFormHeight.value : collapseHeight.value}px`,\n },\n }\n : {\n inline: true,\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${rowGap}px ${columnGap}px`,\n },\n grid: false,\n }\n);\n\nconst onReset = () => {\n emit('reset');\n};\n\nconst onSearch = () => {\n emit('search');\n};\n</script>\n\n<template>\n <ProForm\n v-bind=\"layoutProps\"\n :form=\"form\"\n class=\"pro-table_search-form transition\"\n @keyup.enter=\"onSearch\"\n >\n <Space alignment=\"start\" class=\"pro-table_search-form_button-group\">\n <slot name=\"reset-button\" @click=\"onReset\">\n <template v-if=\"resetButton !== false\">\n <component :is=\"resetButton\" v-if=\"resetButton\" @click=\"onReset\" />\n <Button\n v-else\n class=\"pro-table_search-form_reset-button\"\n @click=\"onReset\"\n >重置</Button\n >\n </template>\n </slot>\n <slot name=\"search-button\" @click=\"onSearch\">\n <template v-if=\"searchButton !== false\">\n <component :is=\"searchButton\" v-if=\"searchButton\" @click=\"onSearch\" />\n <Button\n v-else\n class=\"pro-table_search-form_search-button\"\n type=\"primary\"\n native-type=\"submit\"\n @click=\"onSearch\"\n >\n 查询\n </Button>\n </template>\n </slot>\n <slot name=\"expand-button\" @click=\"changeExpandStatus\">\n <template v-if=\"expandButton !== false && showExpandToggle\">\n <component\n :is=\"expandButton\"\n v-if=\"expandButton\"\n :expand-status=\"expandStatus\"\n @click=\"changeExpandStatus\"\n />\n <Button\n v-else\n text\n class=\"pro-table_search-form_expand-toggle-button\"\n @click=\"changeExpandStatus\"\n >\n {{ expandStatus ? '收起' : '展开' }}\n <DownOutlined\n class=\"transition\"\n style=\"margin-left: 4px\"\n :style=\"{ transform: `rotate(${expandStatus ? -180 : 0}deg)` }\"\n />\n </Button>\n </template>\n </slot>\n </Space>\n </ProForm>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form {\n :deep {\n [class*='-form-item'] {\n margin: 0;\n }\n }\n &_expand-toggle-button {\n display: flex;\n align-items: center;\n padding: 0;\n padding-left: 4px;\n }\n\n .transition {\n transition: all 0.25s;\n }\n}\n</style>\n","<template>\n <div class=\"pro-table_search-form-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form-container {\n margin-bottom: 24px;\n padding: 24px;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <div class=\"pro-table_table-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_table-container {\n flex: 1;\n padding: 24px 24px 0;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"column-height\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 00-11.3 0L403.6 366.3a7.23 7.23 0 005.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Button,\n type TableProps,\n} from '../../../shared/ui';\nimport ColumnHeightOutlined from './icons/ColumnHeightOutlined.vue';\n\ntype Size = TableProps['size'];\n\nconst size = defineModel<Size>('size');\n\nsize.value = size.value ?? 'default';\n\nconst items: Array<{ label: string; key: NonNullable<Size> }> = [\n { label: '默认', key: 'default' },\n { label: '中等', key: 'large' },\n { label: '紧凑', key: 'small' },\n];\n</script>\n\n<template>\n <Dropdown trigger=\"click\" @command=\"val => (size = val as any)\">\n <Button text class=\"pro-table_size-control_button\">\n <ColumnHeightOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-for=\"item in items\"\n :key=\"item.key\"\n :command=\"item.key\"\n :disabled=\"item.key === size\"\n >\n {{ item.label }}\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_size-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.3);\n }\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"filter\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n Button,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n} from '../../../shared/ui';\nimport { computed, ref, watch } from 'vue';\nimport type { Column, Columns } from '../types';\nimport { type Table } from '../useTable';\nimport FilterOutlined from './icons/FilterOutlined.vue';\n\ntype Props = {\n columns: Columns;\n table?: Table;\n};\nconst { columns, table = undefined } = defineProps<Props>();\n\nconst open = ref(false);\nconst checkAll = ref(false);\nconst indeterminate = ref(false);\n\nconst getColumnKey = (column: Column, index: number) => {\n const key = column.key ?? column.prop;\n if (key === undefined || key === null) return `__idx_${index}`;\n return Array.isArray(key) ? key.join('.') : String(key);\n};\n\nconst checkedColumnsOptions = computed<\n Array<{ label: string; value: string; checked: boolean; column: Column }>\n>(() =>\n columns.map((item, index) => ({\n label: String(item.label ?? item.prop ?? `列${index + 1}`),\n value: getColumnKey(item, index),\n checked: !item.hidden,\n column: item,\n }))\n);\n\nconst checkedColumnKeys = computed({\n get() {\n return checkedColumnsOptions.value.flatMap(item =>\n item.checked ? item.value : []\n );\n },\n set(val: string[]) {\n checkedColumnsOptions.value.forEach(item => {\n table?.setColumn(item.value as any, {\n hidden: !val.includes(item.value),\n });\n });\n },\n});\n\nconst onCheckAllChange = (value: any) => {\n const checked = !!(value?.target?.checked ?? value);\n checkedColumnKeys.value = checked\n ? checkedColumnsOptions.value.map(item => item.value)\n : [];\n indeterminate.value = false;\n};\n\nconst toggleColumnsItem = (val: string) => {\n if (checkedColumnKeys.value.includes(val)) {\n checkedColumnKeys.value = checkedColumnKeys.value.filter(\n item => item !== val\n );\n } else {\n checkedColumnKeys.value = [...checkedColumnKeys.value, val];\n }\n};\n\nwatch(\n checkedColumnKeys,\n val => {\n indeterminate.value =\n !!val.length && val.length < checkedColumnsOptions.value.length;\n checkAll.value =\n val.length > 0 && val.length === checkedColumnsOptions.value.length;\n },\n { immediate: true }\n);\n</script>\n\n<template>\n <Dropdown\n trigger=\"click\"\n :hide-on-click=\"false\"\n :visible=\"open\"\n @visible-change=\"val => (open = val)\"\n >\n <Button text class=\"pro-table_column-control_button\">\n <FilterOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem :disabled=\"true\" :divided=\"false\">\n <Checkbox\n :model-value=\"checkAll\"\n :indeterminate=\"indeterminate\"\n @change=\"onCheckAllChange\"\n >\n 全选\n </Checkbox>\n </DropdownItem>\n <DropdownItem\n v-for=\"item in checkedColumnsOptions\"\n :key=\"item.value\"\n :command=\"item.value\"\n @click.stop=\"toggleColumnsItem(item.value)\"\n >\n <Checkbox\n :model-value=\"item.checked\"\n @change=\"() => toggleColumnsItem(item.value)\"\n >\n {{ item.label }}\n </Checkbox>\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_column-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.2, 1.4);\n }\n}\n</style>\n","<script\n lang=\"ts\"\n setup\n generic=\"D extends Record<string, any> = Record<string, any>\"\n>\nimport { get, toPath } from '../../../shared/core';\nimport { TableColumn } from '../../../shared/ui';\nimport type { Column, Columns } from '../types';\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TableColumnRenderer' });\n\ntype Props = {\n columns: Columns<D>;\n};\nconst { columns } = defineProps<Props>();\n\nconst getColumnKey = (column: Column<D>, index: number) => {\n const key = column.key ?? column.prop;\n if (key === undefined || key === null) return `__idx_${index}`;\n return Array.isArray(key) ? key.join('.') : String(key);\n};\n\nconst getCellValue = (row: Record<string, any>, column: Column<D>) => {\n const path = column.prop;\n if (!path) return undefined;\n return get(row, toPath(path));\n};\n\nconst normalizedColumns = computed(() => {\n return columns.filter(column => !column.hidden);\n});\n\nconst getColumnProps = (column: Column<D>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { hidden, render, key, ...rest } = column;\n const prop = Array.isArray(column.prop)\n ? column.prop.join('.')\n : column.prop\n ? String(column.prop)\n : undefined;\n return {\n ...rest,\n prop,\n columnKey: key ? String(key) : prop,\n };\n};\n</script>\n\n<template>\n <template\n v-for=\"(column, index) in normalizedColumns\"\n :key=\"getColumnKey(column, index)\"\n >\n <TableColumn v-bind=\"getColumnProps(column)\">\n <template #default=\"scope\">\n <template v-if=\"typeof column.render === 'function'\">\n <component\n :is=\"\n column.render?.({\n ...scope,\n column,\n cellValue: getCellValue(scope.row, column),\n })\n \"\n />\n </template>\n </template>\n </TableColumn>\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"T extends Table<any> = Table\">\n/**\n * @component ProTable\n * @description 配置驱动的表格组件\n *\n * ## 架构概览\n *\n * ProTable 是表格系统的顶层容器,负责:\n * 1. 接收 useTable() 创建的表格实例,驱动列、数据源、分页的渲染\n * 2. 内部集成 SearchForm 搜索区域(基于 ProForm)\n * 3. 支持列动态控制(显示/隐藏)和尺寸控制\n * 4. 将分页变化和搜索事件串联到数据查询流程\n *\n * ## 数据流\n *\n * ```\n * useTable({ columns, dataSource, searchFields, ... })\n * ↓ 传入 :table prop\n * ProTable\n * ├── SearchForm (使用 table.searchForm 管理搜索条件)\n * │ └── ProForm\n * ├── SizeControl (表格尺寸切换)\n * ├── ColumnControl (列显示/隐藏)\n * └── ElTable (element-plus Table)\n * └── 转发所有 table 插槽\n * ```\n *\n * ## 搜索流程\n *\n * 1. 用户点击搜索 → SearchForm @search → searchPage1st()\n * 2. searchPage1st 重置分页到第一页,触发 _search()\n * 3. 分页变化 → onTableChange → setPageParam + _search()\n * 4. 重置 → reset() → resetQueryParams + _search()\n */\nimport {\n Pagination as ElPagination,\n type PaginationProps,\n Table as ElTable,\n type TableProps,\n tableProps,\n paginationProps,\n} from '../../../shared/ui';\nimport {\n computed,\n nextTick,\n useAttrs,\n onMounted,\n inject,\n type Slot,\n useSlots,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport { ContainerFragment } from '../../form';\nimport type { ContainerComponent } from '../../form/types';\nimport SearchForm from './SearchForm.vue';\nimport type { SearchFormProps } from './SearchForm.vue';\nimport type { Table } from '../useTable';\nimport { camelizeProperties, getObject, pick } from '../../../shared/core';\nimport {\n DefaultSearchFormContainer,\n DefaultTableContainer,\n SizeControl,\n ColumnControl,\n} from '.';\nimport type { Columns } from '../types';\nimport TableColumnRenderer from './TableColumnRenderer.vue';\n\ndefineOptions({ name: 'ProTable', inheritAttrs: false });\n\ntype Control = { sizeControl: boolean; columnControl: boolean };\n\ntype SearchFormConfig = Omit<SearchFormProps, 'form'> & {\n // 是否隐藏搜索表单\n hidden?: boolean;\n // 搜索区域包裹容器\n container?: ContainerComponent | false;\n};\n\ntype ReturnTableRecord<V> = V extends Table<any, infer R> ? R : any;\ntype RecordType = ReturnTableRecord<T>;\n\ntype Props = {\n // 列表表格对象,returns from useTable\n table?: T;\n // 列表数据查询方法\n search?: () => Promise<unknown>;\n // 是否在首列插入index列\n addIndexColumn?: boolean;\n // onMounted 时立即触发一次 search 事件\n immediateSearch?: boolean;\n // 是否展示表格 size 和 column 控制按钮\n control?: boolean | Partial<Control>;\n // 搜索栏查询字段表单配置\n searchFormConfig?: SearchFormConfig;\n // 表格区域包裹容器\n tableContainer?: ContainerComponent | false;\n columns?: Columns<RecordType>;\n data?: RecordType[];\n pagination?: false | Partial<PaginationProps>;\n} & Omit<TableProps, 'data'>;\n\nconst {\n table = undefined,\n search = undefined,\n addIndexColumn = undefined,\n control = undefined,\n tableContainer = undefined,\n immediateSearch = undefined,\n searchFormConfig = undefined,\n columns = undefined,\n data = undefined,\n pagination = undefined,\n} = defineProps<Props>();\n\nconst config = INJECT_CONFIG['pro-table'];\nconst injectProps = inject(config.injectionKey, config.default) as any;\n\nconst tableProperties = Object.keys(tableProps());\nconst paginationProperties = Object.keys(paginationProps());\n\nconst attrs = useAttrs() as Record<string, any>;\n\nconst injectTableAttrs = computed(() => {\n return pick(injectProps, tableProperties) as Partial<TableProps>;\n});\n\nconst attrsTableProps = computed(() => {\n return pick(\n camelizeProperties(attrs),\n tableProperties\n ) as Partial<TableProps>;\n});\n\nconst {\n columns: tableColumns,\n data: tableData,\n searchForm,\n pageParam,\n setPageParam,\n} = table || {};\n\nconst size = defineModel<TableProps['size']>('size');\nconst loading = defineModel<boolean>('loading');\n\n// 核心搜索方法:设置 loading 状态,调用外部 search 函数\nconst _search = async () => {\n try {\n loading.value = true;\n await search?.();\n } finally {\n loading.value = false;\n }\n};\n\n// 重置:恢复查询参数到初始值,重新搜索\nconst reset = () => {\n table?.resetQueryParams();\n nextTick(() => {\n _search();\n });\n};\n\ntype CustomSlots = Readonly<\n Partial<Record<'search-form' | 'button-bar' | 'toolbar' | 'table', Slot>>\n>;\n\ntype Slots = CustomSlots & Readonly<Record<string, Slot>>;\n\nconst slots = useSlots() as Slots;\nconst searchFormSlot = slots['search-form'];\nconst buttonBarSlot = slots['button-bar'];\nconst toolbarSlot = slots['toolbar'];\n\nconst tableSlots = computed(() => {\n const customNames = new Set([\n 'search-form',\n 'button-bar',\n 'toolbar',\n 'table',\n ]);\n return Object.fromEntries(\n Object.entries(slots).filter(([name]) => !customNames.has(name))\n ) as Record<string, Slot>;\n});\nconst tableSlotNames = computed(() => Object.keys(tableSlots.value));\n\nconst searchPage1st = () => {\n setPageParam?.({ current: 1 });\n _search();\n};\n\nconst computedSearchFormConfig = computed(() => {\n const container =\n searchFormConfig?.container ??\n injectProps.searchFormConfig?.container ??\n DefaultSearchFormContainer;\n return {\n ...injectProps.searchFormConfig,\n ...getObject(searchFormConfig),\n container: container ? container : undefined,\n };\n});\n\nconst computedTableContainer = computed(() => {\n const container =\n tableContainer ?? injectProps.tableContainer ?? DefaultTableContainer;\n return container ? container : undefined;\n});\n\nconst normalizedRawColumns = computed(() => {\n const source = (columns ?? tableColumns?.value ?? []) as any[];\n\n const normalized = source.map((item, index) => {\n const current: any = { ...item };\n if (current.label === undefined && current.title !== undefined) {\n current.label = current.title;\n }\n if (current.prop === undefined && current.dataIndex !== undefined) {\n current.prop = Array.isArray(current.dataIndex)\n ? current.dataIndex.join('.')\n : current.dataIndex;\n }\n if (current.key === undefined) {\n current.key =\n current.prop ??\n (typeof current.columnKey === 'string'\n ? current.columnKey\n : undefined) ??\n `col-${index}`;\n }\n return current;\n });\n if (addIndexColumn ?? injectProps.addIndexColumn) {\n return [\n {\n key: '_index',\n type: 'index',\n label: '序号',\n width: 80,\n },\n ...normalized,\n ];\n }\n return normalized;\n});\n\nconst computedDataSource = computed<any[]>(() => {\n const attrsData = attrsTableProps.value.data as any[] | undefined;\n return data ?? attrsData ?? tableData?.value ?? [];\n});\n\nconst computedTableProps = computed<TableProps>(() => {\n const merged = {\n ...injectTableAttrs.value,\n ...attrsTableProps.value,\n } as TableProps;\n delete (merged as any).data;\n return merged;\n});\n\nconst computedPagination = computed<false | Partial<PaginationProps>>(() => {\n if (pagination === false) return false;\n const pageConfig = pagination ?? {};\n return {\n ...injectProps.pagination,\n ...pick(pageConfig as Record<string, any>, paginationProperties),\n currentPage: (pageConfig as any).currentPage ?? pageParam?.current ?? 1,\n pageSize: (pageConfig as any).pageSize ?? pageParam?.pageSize ?? 10,\n total: (pageConfig as any).total ?? pageParam?.total ?? 0,\n };\n});\n\nconst showPagination = computed(() => computedPagination.value !== false);\n\nconst onCurrentChange = (current: number) => {\n setPageParam?.({ current });\n _search();\n};\n\nconst onSizeChange = (pageSize: number) => {\n setPageParam?.({ pageSize, current: 1 });\n _search();\n};\n\nconst onPaginationChange = (currentPage: number, pageSize: number) => {\n attrs.onChange?.(currentPage, pageSize);\n};\n\nconst showSearch = computed(() => {\n return !!(\n searchFormSlot ||\n (computedSearchFormConfig.value?.hidden !== true &&\n searchForm &&\n searchForm.fields.value.filter(item => !item.hidden)?.length > 0)\n );\n});\n\nconst computedControl = computed<Control>(() => {\n const mergedControl = control ?? injectProps.control;\n const sizeControl = (mergedControl as Control)?.sizeControl ?? mergedControl;\n const columnControl =\n (mergedControl as Control)?.columnControl ?? mergedControl;\n return { sizeControl: !!sizeControl, columnControl: !!columnControl };\n});\n\nconst resolvedSize = computed(() => {\n return (\n size.value ??\n (attrsTableProps.value.size as any) ??\n injectTableAttrs.value.size\n );\n});\n\nonMounted(() => {\n if (immediateSearch ?? injectProps.immediateSearch) {\n _search();\n }\n});\n</script>\n\n<template>\n <div\n class=\"pro-table\"\n :class=\"($attrs as any).class\"\n :style=\"($attrs as any).style\"\n >\n <ContainerFragment\n v-if=\"showSearch\"\n :component=\"computedSearchFormConfig.container\"\n >\n <slot name=\"search-form\">\n <SearchForm\n v-if=\"searchForm\"\n :form=\"searchForm\"\n v-bind=\"computedSearchFormConfig\"\n @search=\"searchPage1st\"\n @reset=\"reset\"\n />\n </slot>\n </ContainerFragment>\n\n <ContainerFragment :component=\"computedTableContainer\">\n <div class=\"pro-table_header\">\n <div v-if=\"buttonBarSlot\" class=\"pro-table_header_button-bar\">\n <slot name=\"button-bar\" />\n </div>\n <div v-if=\"toolbarSlot\" class=\"pro-table_header_toolbar\">\n <slot name=\"toolbar\" />\n </div>\n <div\n v-if=\"computedControl.sizeControl\"\n class=\"pro-table_header_size-control\"\n >\n <SizeControl v-model:size=\"size\" />\n </div>\n <div\n v-if=\"computedControl.columnControl\"\n class=\"pro-table_header_column-control\"\n >\n <ColumnControl :columns=\"normalizedRawColumns\" :table=\"table\" />\n </div>\n </div>\n\n <slot name=\"table\">\n <ElTable\n v-loading=\"loading\"\n class=\"pro-table_content\"\n v-bind=\"computedTableProps\"\n :size=\"resolvedSize\"\n :data=\"computedDataSource\"\n >\n <TableColumnRenderer :columns=\"normalizedRawColumns\" />\n <template v-for=\"name in tableSlotNames\" :key=\"name\" #[name]=\"scoped\">\n <slot :name=\"name\" v-bind=\"scoped\" />\n </template>\n </ElTable>\n </slot>\n\n <ElPagination\n v-if=\"showPagination\"\n class=\"pro-table_pagination\"\n v-bind=\"computedPagination\"\n @current-change=\"onCurrentChange\"\n @size-change=\"onSizeChange\"\n @change=\"onPaginationChange\"\n />\n </ContainerFragment>\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table {\n &_header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n &:empty {\n display: none;\n }\n\n & + &_content {\n margin-top: 16px;\n }\n\n &_button-bar {\n flex: 1;\n }\n\n &_toolbar {\n margin-left: 12px;\n }\n }\n\n &_pagination {\n justify-content: flex-end;\n padding: 16px 0;\n }\n}\n</style>\n","import {\n useTable as coreUseTable,\n type Table as _Table,\n} from '../../shared/core';\nimport type {\n Data,\n ExtendWithAny,\n DeepPartial,\n PageParam,\n} from '../../shared/core';\nimport { Fields } from '../form/types';\nimport type { Column, Columns } from './types';\nimport type { Ref } from 'vue';\n\n/**\n * 表格实例类型\n *\n * @description 在 core Table 类型的基础上,将列类型 C 绑定为本地 Column<T>,\n * 并将 dataSource 重命名为 data(Element Plus 使用 data 而非 dataSource),\n * 使 columns 操作获得 Element Plus 表格列的完整属性类型提示。\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型(一行数据的类型)\n *\n * @property columns - 列配置数组(响应式 Ref),用于渲染表格列\n * @property data - 表格数据源(响应式 Ref),对应 Element Plus Table 的 data 属性\n * @property pageParam - 分页参数(响应式 reactive),包含 current、pageSize、total\n * @property searchForm - 搜索表单实例(Form 类型),用于管理搜索区域的字段和数据\n * @property setColumn - 更新列配置,支持合并/覆盖两种模式,用法同 setField\n * @property deleteColumn - 删除列,支持路径或查找函数\n * @property appendColumn - 在指定列后追加新列,传 undefined 在末尾追加\n * @property prependColumn - 在指定列前插入新列,传 undefined 在开头插入\n * @property setPageParam - 设置分页参数,支持部分更新和函数式更新\n * @property resetQueryParams - 重置分页到第一页并恢复搜索条件到初始值\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number }\n *\n * const table: Table<SearchParams, User> = useTable({\n * columns: [{ prop: 'name', title: '姓名' }],\n * })\n *\n * table.columns.value // 访问列配置\n * table.setColumn('name', { width: 150 }) // 更新列\n * table.setPageParam({ current: 2 }) // 切换页码\n * table.searchForm.setFormData('keyword', '搜索词') // 操作搜索表单\n * ```\n *\n * @public\n */\nexport type Table<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = Omit<_Table<D, T, Column<T>>, 'dataSource'> & {\n /**\n * Element Plus 数据源(与 core 的 dataSource 对应)\n */\n data: Ref<T[]>;\n};\n\ntype UseTableParams<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = {\n /** 列配置数组 */\n columns?: Columns<T>;\n /** 数据源数组(Element Plus 使用 data 而非 dataSource) */\n data?: T[];\n /** 初始分页参数 */\n pageParam?: PageParam;\n /** 初始搜索参数 */\n searchParam?: ExtendWithAny<DeepPartial<D>>;\n /** 搜索表单字段配置 */\n searchFields?: Fields<D>;\n};\n\n/**\n * 创建表格实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useTable` 封装,适配 Element Plus 的 API 风格:\n * - 数据源使用 `data` 而非 `dataSource`\n *\n * 是 ProTable 组件的核心 Hook,提供了:\n * - 列配置管理(增删改查)\n * - 数据源管理\n * - 分页管理\n * - 搜索表单集成(内部使用 useForm)\n * - 查询参数重置\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型\n *\n * @param {object} params - 表格配置参数\n * @param {Columns<T>} [params.columns] - 初始列配置数组\n * @param {T[]} [params.data] - 初始数据源(Element Plus 风格)\n * @param {PageParam} [params.pageParam] - 初始分页参数,默认 `{ current: 1, pageSize: 10, total: 0 }`\n * @param {ExtendWithAny<DeepPartial<D>>} [params.searchParam] - 初始搜索参数\n * @param {Fields<D>} [params.searchFields] - 搜索表单字段配置\n *\n * @returns {Table<D, T>} 表格实例\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number; email: string }\n *\n * const table = useTable<SearchParams, User>({\n * columns: [\n * { prop: 'name', title: '姓名', width: 120 },\n * { prop: 'age', title: '年龄', width: 80 },\n * ],\n * data: [],\n * pageParam: { current: 1, pageSize: 20, total: 0 },\n * searchParam: { keyword: '' },\n * searchFields: [\n * { path: 'keyword', label: '关键词', component: 'input' },\n * ],\n * })\n * ```\n *\n * @see {@link coreUseTable} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useTable<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n>(params: UseTableParams<D, T> = {}): Table<D, T> {\n const { data, ...rest } = params;\n const coreTable = (coreUseTable as any)({\n ...rest,\n dataSource: data,\n }) as _Table<D, T, Column<T>>;\n\n const { dataSource, ...tableWithoutDataSource } = coreTable as any;\n const table = {\n ...tableWithoutDataSource,\n data: dataSource as Ref<T[]>,\n } as Table<D, T>;\n\n return table;\n}\n","<script lang=\"ts\" setup>\n/**\n * @component ProComponentProvider\n * @description @qin-ui/element-plus-pro 全局配置提供者组件\n *\n * 用于在组件树的顶层配置所有子组件的全局默认属性。\n *\n * @param {ComponentVars} [componentVars] - 组件全局配置变量\n * @param {Record<ComponentName, any>} [componentMap] - 自定义组件映射\n *\n * @slot default - 子组件内容\n *\n * @example\n * ```vue\n * <ProComponentProvider\n * :componentVars=\"{ 'input': { placeholder: '请输入' } }\"\n * >\n * <ProForm :form=\"form\" />\n * </ProComponentProvider>\n * ```\n \n * @public\n */\nimport { ComponentVars } from '../types';\nimport { INJECT_COMPONENTS, ensureInjectConfig } from '../constants';\nimport { provide } from 'vue';\nimport { getObject } from '../../../shared/core';\nimport { ComponentName } from '../../form/constants';\n\ntype ComponentMap = Partial<Record<ComponentName, any>>;\n\ndefineOptions({\n name: 'ProComponentProvider',\n inheritAttrs: false,\n});\n\ntype Props = {\n /** 组件全局配置,可配置所有内置组件的默认属性 */\n componentVars?: ComponentVars;\n /** 自定义组件映射,用于替换或扩展内置组件 */\n componentMap?: ComponentMap;\n};\n\nconst props = defineProps<Props>();\n\n/*\n * 遍历 componentVars 的每个 key,获取或创建对应的 inject 配置\n * 将用户提供的值合并到默认值上,通过 provide 注入到子组件树\n * 子组件通过 inject(config.injectionKey) 获取合并后的配置\n */\nif (props.componentVars) {\n Object.entries(props.componentVars).forEach(([key, val]) => {\n const config = ensureInjectConfig(key);\n // 用户配置覆盖默认值\n provide(config.injectionKey, { ...config.default, ...getObject(val) });\n });\n}\n\n// 注入自定义组件映射,BaseField 在解析组件时会优先使用此映射\nif (props.componentMap) {\n provide(INJECT_COMPONENTS, props.componentMap);\n}\n</script>\n\n<template>\n <slot />\n</template>\n","import type { App } from 'vue';\nimport ProForm from './components/form';\nimport ProTable from './components/table';\nimport ProComponentProvider from './components/component-provider';\n\nexport * from './components/form';\nexport * from './components/table';\nexport * from './components/component-provider';\n\n/**\n * Schema 驱动的表单组件,基于 element-plus Form 封装\n *\n * @description 通过声明式 JSON Schema 配置即可快速生成表单,\n * 提供极致的 TypeScript 类型推导与组件库插槽扩展能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProForm, useForm } from '@qin-ui/element-plus-pro'\n * const form = useForm<User>({ name: '' }, [\n * { path: 'name', label: '姓名', component: 'input' }\n * ])\n * </script>\n * <template>\n * <ProForm :form=\"form\" />\n * </template>\n * ```\n *\n * Schema 驱动的表格组件,基于 element-plus Table 封装\n *\n * @description 通过声明式列配置即可生成功能完整的表格,\n * 支持列动态控制、搜索表单集成、分页管理等企业级能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProTable, useTable } from '@qin-ui/element-plus-pro'\n * const table = useTable<User>({ columns: [{ key: 'name', title: '姓名' }] })\n * </script>\n * <template>\n * <ProTable :table=\"table\" />\n * </template>\n * ```\n *\n * 组件提供者,用于全局配置 ProForm 和 ProTable 的默认行为\n *\n * @description 通过 `ProComponentProvider` 包裹应用根组件,\n * 可以全局覆盖组件的默认属性(如表单布局、表格尺寸等)。\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider :component-props=\"customProps\">\n * <App />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nexport { ProForm, ProTable, ProComponentProvider };\n\nexport default {\n /**\n * @qin-ui/element-plus-pro 安装方法\n * @description 全局注册所有组件(ProForm、ProTable、ProComponentProvider)\n *\n * @param {App} app - Vue 应用实例\n *\n * @example\n * ```ts\n * import { createApp } from 'vue'\n * import ProComponents from '@qin-ui/element-plus-pro'\n * const app = createApp(App)\n * app.use(ProComponents)\n * ```\n */\n install(app: App) {\n app.component(ProForm.name, ProForm);\n app.component(ProTable.name, ProTable);\n app.component(ProComponentProvider.name!, ProComponentProvider);\n },\n};\n"],"names":["Table","Pagination","GridItem","FormItem","Input","InputNumber","AutoComplete","Select","Cascader","DatePicker","TimePicker","TimeSelect","CheckboxGroup","RadioGroup","Switch","Slider","TreeSelect","Transfer","_renderSlot","gridItemProps","formItemProps","index","_openBlock","_createBlock","_unref","_mergeProps","ElGrid","_createElementBlock","_Fragment","PathProvider","_withCtx","_createVNode","GroupedFieldAttrs","ElGridItem","ContainerFragment","coreUseForm","_resolveDynamicComponent","_renderList","SlotComponent","_normalizeProps","$attrs","_useSlots","coreUseFields","coreUseFormRef","_hoisted_1","_createElementVNode","ProForm","Space","Button","_createTextVNode","_toDisplayString","_normalizeStyle","_useModel","Dropdown","DropdownMenu","DropdownItem","Checkbox","_withModifiers","_normalizeClass","_withDirectives","TableColumnRenderer","_guardReactiveProps","coreUseTable","ProComponentProvider"],"mappings":";;;;;AAiFO,MAAM,aAAa,MAAOA,QAAc,SAAS,CAAA;AACjD,MAAM,kBAAkB,MAAOC,aAAmB,SAAS,CAAA;AAC3D,MAAM,gBAAgB,MAAOC,MAAiB,SAAS,CAAA;AACvD,MAAM,gBAAgB,MAAOC,WAAiB,SAAS,CAAA;AAE9D,MAAM,qBAAqB,OAAO,2BAA2B;AAEtD,MAAM,qBAAqB,MAAM;AACtC,QAAM,eAAe,gBAAA;AACrB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM,CAAC,CAAC,aAAa,KAAK;AAAA,EAAA;AAEvC;AAEO,MAAM,6BAA6B,CACxC,aACG;AACH;AAAA,IACE;AAAA,IACA,SAAS,MAAM,CAAC,CAAC,QAAQ,QAAQ,CAAC;AAAA,EAAA;AAEtC;AC/FO,MAAM,gBAKT;AAAA,EACF,aAAa;AAAA,IACX,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,QACnC,YAAY;AAAA,MAAA;AAAA,MAEd,kBAAkB;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ,EAAE,eAAe,GAAG,cAAc,MAAA;AAAA,MAAM;AAAA,MAElD,SAAS;AAAA,MACT,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,YAAY;AAAA,IACV,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,MAAM,EAAE,QAAQ,KAAG;AAAA,EAAE;AAAA,EAElC,iBAAiB;AAAA,IACf,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,MAAM,EAAA;AAAA,EAAE;AAAA,EAErB,OAAO;AAAA,IACL,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,KAAK,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjE,kBAAkB;AAAA,IAChB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,WAAW;AAAA,MACX,UAAU,EAAE,SAAS,GAAG,SAAS,EAAA;AAAA,MACjC,eAAe;AAAA,MACf,WAAW;AAAA,MACX,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,kBAAkB;AAAA,IAChB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,MACX,aAAa;AAAA,IAAA;AAAA,EACf;AAAA,EAEF,gBAAgB;AAAA,IACd,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,KAAK,MAAM,KAAK;AAAA,MAChB,KAAK;AAAA,MACL,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO,EAAE,OAAO,OAAA;AAAA,IAAO;AAAA,EACzB;AAAA,EAEF,cAAc;AAAA,IACZ,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjD,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjD,UAAU;AAAA,IACR,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjD,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,oBAAoB;AAAA,IAClB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,qBAAqB;AAAA,IACnB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,yBAAyB;AAAA,IACvB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,oBAAoB;AAAA,IAClB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,qBAAqB;AAAA,IACnB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,0BAA0B;AAAA,IACxB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,sBAAsB;AAAA,IACpB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,yBAAyB;AAAA,IACvB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,oBAAoB;AAAA,IAClB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,qBAAqB;AAAA,IACnB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,wBAAwB;AAAA,IACtB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,6BAA6B;AAAA,IAC3B,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA;AAAA,EAClB;AAAA,EAEF,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,OAAO,EAAE,OAAO,OAAA,GAAU,aAAa,MAAA;AAAA,EAAM;AAAA,EAE1D,kBAAkB;AAAA,IAChB,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,aAAA;AAAA,EAAa;AAAA,EAErC,QAAQ;AAAA,IACN,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAAA,EAEZ,eAAe;AAAA,IACb,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,EAAE,WAAW,MAAM,aAAa,MAAA;AAAA,EAAM;AAAA,EAEjD,UAAU;AAAA,IACR,cAAc,OAAO,EAAE;AAAA,IACvB,SAAS,CAAA;AAAA,EAAC;AAEd;AAEO,MAAM,oBAET,OAAO,mBAAmB;AAE9B,MAAM,wBACJ,uBAAO,OAAO,IAAI;AAEb,MAAM,kBAAkB,CAAC,QAA+C;AAC7E,SACG,cAAoD,GAAG,KACxD,sBAAsB,GAAG;AAE7B;AAEO,MAAM,qBAAqB,CAAC,QAAmC;AACpE,QAAM,WAAW,gBAAgB,GAAG;AACpC,MAAI,SAAU,QAAO;AACrB,QAAM,UAA6B;AAAA,IACjC,cAAc,OAAO,WAAW,GAAG,EAAE;AAAA,IACrC,SAAS,CAAA;AAAA,EAAC;AAEZ,wBAAsB,GAAG,IAAI;AAC7B,SAAO;AACT;AC1LO,MAAM,sBAAsB,CAAC,SAAS,OAAO;AAqE7C,MAAM,eAAiC;AAAA,EAC5C,SAASC;AAAAA,EACT,gBAAgBC;AAAAA,EAChB,gBAAgBC;AAAAA,EAChB,UAAUC;AAAAA,EACV,YAAYC;AAAAA,EACZ,eAAeC;AAAAA,EACf,eAAeC;AAAAA,EACf,eAAeC;AAAAA,EACf,kBAAkBC;AAAAA,EAClB,eAAeC;AAAAA,EACf,UAAUC;AAAAA,EACV,UAAUC;AAAAA,EACV,eAAeC;AAAAA,EACf,YAAYC;AACd;AAMO,MAAM,8BAA8B;;;;;;;AC3G3C,UAAM,QAAQ;AAEd,UAAM,WAAW,SAAS,MAAM;AAC9B,aAAO,MAAM,QAAQ,MAAM,IAAI,IAC3B,MAAM,KAAK,KAAK,GAAG,IAClB,MAAM;AAAA,IACb,CAAC;AAED,YAAQ,kBAAkB,QAAQ;;aAIhCC,WAAyB,KAAA,QAAA,WAAA,EAAlB,MAAM,SAAA,OAAQ;AAAA;;;;;;;;;ACgBvB,UAAM,mBAAmB,OAAO,KAAK,cAAA,CAAe;AACpD,UAAM,mBAAmB,OAAO,KAAK,cAAA,CAAe;AAKpD,UAAM,QAAQ;AAEd,UAAM,SAAS,cAAc,eAAe;AAC5C,UAAM,sBAAsB,OAAO,OAAO,cAAc,OAAO,OAAO;AAUtE,UAAM,oBAAoB,SAA4B,MAAM;AAC1D,UAAIC,iBAAqC,CAAA;AACzC,UAAIC,iBAAqC,CAAA;AACzC,YAAM,iBAAsC,EAAE,OAAO,GAAC;AACtD,YAAM,gBAAqC,CAAA;AAE3C,UAAI,cAAc,MAAM,KAAK,GAAG;AAG9B,cAAM,EAAE,MAAM,MAAM,QAAQ,eAAe,eAAe,mBAAmB,QAAQ,MAAM,gBAAgB,iBAAiB,0BAA0B,2BAA2B,QAAQ,CAAA,GAAI,oBAAoB,IAAI,qBAAqB,CAAA,GAAI,YAAY,GAAG,KAAA,IAC7P,MAAM;AACN,cAAM;AAAA,UACJ,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,UACN,mBAAmB;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QAAA,IACD;AAEJ,cAAM,oBACJ,QAAQ,SAAS,IAAI,EAAE,KAAA,IAAS,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,WAAA;AAE9DD,yBAAgB,SAAS,EAAE,MAAM,QAAQ,OAAO;AAChDC,yBAAgB;AAAA,UACd;AAAA,UACA,EAAE,OAAO,iBAAiB,OAAO,YAAA;AAAA,UACjC,EAAE,OAAO,QAAQ,aAAa,GAAG,OAAO,QAAQ,aAAa,EAAA;AAAA,UAC7D;AAAA,QAAA;AAEFA,uBAAc,YAAY,qBAAqB;AAE/C,eAAO,KAAK,IAAI,EAAE,QAAQ,CAAA,MAAK;AAC7B,cAAI,iBAAiB,SAAS,CAAC,GAAG;AAChCD,2BAAc,CAAC,IAAI,KAAK,CAAC;AAAA,UAC3B,WAAW,iBAAiB,SAAS,CAAC,GAAG;AACtCC,2BAAsB,CAAC,IAAI,KAAK,CAAC;AAAA,UACpC,OAAO;AACL,2BAAe,CAAC,IAAI,KAAK,CAAC;AAAA,UAC5B;AAAA,QACF,CAAC;AAED,eAAO,OAAO,gBAAgB,kBAAkB;AAChD,eAAO,KAAK,KAAK,EAAE,QAAQ,CAAA,MAAK;AAC9B,cAAI,oBAAoB,SAAS,CAAQ,GAAG;AAC1C,0BAAc,CAAC,IAAI,MAAM,CAAC;AAAA,UAC5B,OAAO;AACL,2BAAe,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC;AAAA,UACtC;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO,EAAE,eAAAD,gBAAe,eAAAC,gBAAe,gBAAgB,cAAA;AAAA,IACzD,CAAC;;AAIC,aAAAF,WAAwC,0DAA1B,kBAAA,KAAiB,CAAA,CAAA;AAAA;;;;;;;;;;;;ACzDjC,UAAM,cAAc,SAAS,MAAA;;AAAM,iCAAA,QAAO,WAAP,4BAAgB,CAAA,UAAS,CAAC,MAAM;AAAA,KAAO;AAE1E,+BAA2B,SAAS,MAAM,QAAA,QAAQ,CAAQ;AAE1D,UAAM,SAAS,cAAc,UAAU;AAEvC,UAAM,EAAE,MAAM,eAAe,OAAO,OAAO,cAAc,OAAO,OAAO;AAEvE,UAAM,aAAa,SAAS,MAAM;AAChC,UAAI,QAAA,SAAS,OAAW,QAAO,CAAC,CAAC,QAAA;AACjC,aAAO,CAAC,CAAC;AAAA,IACX,CAAC;AAED,UAAM,oBAAoB,SAAoB,MAAM;AAClD,aAAO,WAAW,QACd,EAAE,GAAG,UAAU,UAAU,GAAG,GAAG,UAAU,QAAA,IAAI,EAAA,IAC7C,CAAA;AAAA,IACN,CAAC;AAED,UAAM,eAAsB,CAAA;AAC5B,UAAM,gBAAuB,CAAA;AAE7B,UAAM,oBAAoB,CAACG,QAAeD,mBAAwB;AAChE,YAAM,QAAQ,YAAY,MAAMC,MAAK;AACrC,aAAO,OAAO,OAAO;AAAA,QACnB,gBAAgB,MAAM,aAAaA,MAAK;AAAA,QACxC,0BAA0B,MAAMD;AAAA,MAAA,CACjC;AAAA,IACH;AAEA,UAAM,qBAAqB,CAACC,WAAkB;AAC5C,YAAM,QAAQ,YAAY,MAAMA,MAAK;AACrC,aAAO,OAAO,OAAO;AAAA,QACnB,iBAAiB,MAAA;;AAAM,qCAAcA,MAAK,MAAnB,mBAAsB;AAAA;AAAA,QAC7C,2BAA2B,MAAA;;AACzB,qCAAcA,MAAK,MAAnB,mBAAsB;AAAA;AAAA,MAA0B,CACnD;AAAA,IACH;;;AAIE,aAAAC,aAAAC,YAiEoBC,oBAjEpBC,WAiEoB;AAAA,QAhEjB,WAAW,WAAA,QAAaD,MAAAE,KAAA,IAAS;AAAA,MAAA,GAC1B,kBAAA,OAAiB,EACzB,OAAA,EAAA,SAAA,OAAA,EAAA,CAAmB,GAAA;AAAA,yBAGjB,MAAyD;AAAA,WAD3DJ,UAAA,IAAA,GAAAK,mBA2DeC,2BA1DgC,YAAA,OAAW,CAAA,EAAA,MAAxC,OAAK,GAAK,MAAA,GAASP,WAAK;AAD1C,mBAAAC,UAAA,GAAAC,YA2DeM,aA3DfJ,WA2De;AAAA,cAzDZ,KAAKD,MAAA,MAAA,EAAO,QAAS,SAASH,MAAK,CAAA,EAAW,KAAI,GAAA,KAASA;AAAA,YAAA,8BAC5C,MAAA,CAAK,GAAA;AAAA,cAEV,SAAOS,QAChB,CAmDoB,EApDA,WAAI;AAAA,gBACxBC,YAmDoBC,aAAA,EAnDA,SAAY;AAAA,kBAE3B,iBAOD,CAwCoB;AAAA,oBA/CM,eAAAb;AAAA,oBAA8C,eAAA,EAAA,cAAcC,eAAA;AAAA,oBAA+B;AAAA,oBAA8B;AAAA,kBAAA;oBAOnJW,YAwCoBP,oBAxCpBC,WAwCoB;AAAA,sBAvCjB,WAAW,WAAA,QAAaD,MAAAS,KAAA,IAAa;AAAA,oBAAA,sBAC9Bd,cAAa,GAAA;AAAA,uCAErB,MAmCoB;AAAA,wBAnCpBY,YAmCoBP,MAAAU,WAAA,GAAA;AAAA,0BAnCA,WAAW;AAAA,0BAAY;AAAA,wBAAA;2CACzC,MAiCW;AAAA,4BAjCXH,YAiCWP,MAAArB,UAAA,GAjCXsB,WAiCW,EAAA,SAAA,KAAA,GAhCDL,gBAAa;AAAA;8BACpB,KAAK,CAAA,OAAO,aAAaC,MAAK,IAAI;AAAA,8BAClC,MAAMG,MAAA,MAAA,EAAO,IAAI,EAAE,KAAI,GAAA;AAAA,8BACvB;AAAA,8BACA,gBAAW,CAAA,WAAE,kBAAkBH,QAAOD,cAAa;AAAA,4BAAA;+CAapD,MAMW;AAAA,gCANK,MAAM,uBACpBG,YAIE,yBAAA;AAAA;kCAHC,MAAO,MAAc,QAAQ,QAAA;AAAA,kCAC7B,QAAQ,MAAM;AAAA,kCACd,UAAU,QAAQ,MAAM,QAAQ;AAAA,gCAAA,gDAInCD,aAAAC,YAKEC,oBALFC,WAKE;AAAA;;kCAJC,KAAK,CAAA,OAAO,cAAcJ,MAAK,IAAI;AAAA,gCAAA,sBAC5B,gBAAc;AAAA,kCACrB;AAAA,kCACA,gBAAW,CAAA,WAAE,mBAAmBA,MAAK;AAAA,gCAAA;;;;yCAtBjB,eAAa,CAA5B,MAAM,SAAI;;;kCAIlB,IAAAS,QAAA,CAFS,WAAM;AAAA,oCAEfC,YAIEP,oBAJFC,WAIE;AAAA,sCAHC;AAAA,sCACA,WAAW;AAAA,oCAAA,sBACJ,MAAM,GAAA,MAAA,IAAA,CAAA,QAAA,WAAA,CAAA;AAAA,kCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9B7B,SAAS,WAAW,MAAa;AACtC,SAAOU,UAAY,GAAI,IAAY;AACrC;ACzGO,MAAM,eAAe,CAAC,UAAsC;AACjE,QAAM,EAAE,WAAW,KAAA,IAAS;AAC5B,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI,CAAC,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACpD,UAAM,SAAS,gBAAgB,CAAC;AAChC,QAAI,CAAC,OAAQ,QAAO,CAAA;AACpB,UAAM,cAAc,OAAO,OAAO,cAAc,OAAO,OAAO;AAC9D,WAAO;AAAA,EACT;AACA,SAAO,CAAA;AACT;;;;;;;;;ACwCA,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,EAAE,aAAa,YAAA,IAAgB;AAErC,UAAM,eAAe,IAAA;AAErB,UAAM,QAAa,SAAA;AAEnB,aAAS,cAAc;AACrB,aAAO,UAAU,2CAAc,QAAA,KAAK;AAAA,IACtC;AAGA,UAAM,QAAQ,SAAS;AAAA,MACrB,MAAM;AACJ,YAAI,MAAM,2CAAc,QAAA;AACxB,cAAM,EAAE,mBAAmB,aAAa;AACxC,YACE,OAAO,mBAAmB,YAC1B,OAAO,eAAe,QAAQ,YAC9B;AACA,gBAAM,eAAe,IAAI,GAAG;AAAA,QAC9B;AACA,eAAO;AAAA,MACT;AAAA,MACA,IAAI,KAAK;AACP,YAAI,SAAS;AACb,cAAM,EAAE,mBAAmB,aAAa;AACxC,YAAI,gBAAgB;AAClB,cAAI,OAAO,mBAAmB,YAAY;AACxC,qBAAS,eAAe,KAAK,aAAa;AAAA,UAC5C,WAAW,OAAO,eAAe,QAAQ,YAAY;AACnD,qBAAS,eAAe,IAAI,KAAK,YAAA,CAAa;AAAA,UAChD;AAAA,QACF;AACA,mDAAc,QAAA,MAAM;AAAA,MACtB;AAAA,IAAA,CACD;AAED,UAAM,iBAAiB,mBAAA;AAMvB,UAAM,eAAe,SAAS,MAAM;AAClC,YAAM,YAAY,aAAa;AAAA,QAC7B,WAAW,QAAA;AAAA,QACX,MAAM,MAAM;AAAA,MAAA,CACO;AACrB,YAAM,gBAAgB,MAAM,aAAa,UAAU,aAAa;AAChE,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,EAAE,OAAO,MAAM,gBAAgB,OAAO,MAAM,eAAA;AAAA,QAC5C,EAAE,OAAO,UAAU,gBAAgB,OAAO,UAAU,eAAA;AAAA,QACpD,EAAE,UAAU,MAAM,YAAY,eAAe,SAAS,UAAU,SAAA;AAAA,QAChE,EAAE,WAAW,cAAA;AAAA,MAAc;AAI7B,YAAM,EAAE,gBAAgB,WAAW,OAAO,gBAAgB,gBAAgB,oBAAoB,GAAG,KAAA,IAAS;AAC1G,YAAM,mBAAmB,aAAa;AAEtC,YAAM,YAAY,KAAK,MAA6B;AAAA,QAClD;AAAA,QACA,YAAY,gBAAgB;AAAA,MAAA,CAC7B;AACD,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MAAA;AAAA,IAEJ,CAAC;AAGD,UAAM,oBAAoB;AAAA,MACxB,GAAG,2BAA2B,GAAG,QAAA,IAAI;AAAA,MACrC;AAAA,IAAA;AAIF,UAAM,mBAAmB,OAAO,mBAAmB,EAAE;AAMrD,UAAM,KAAK,SAAS,MAAM;AACxB,UAAI,kBAAmB,QAAO;AAC9B,UAAI,OAAO,QAAA,cAAc,UAAU;AACjC,eACG,iBAAyB,QAAA,SAAS,KAClC,aAAqB,QAAA,SAAS,KAC/B,QAAA;AAAA,MAEJ;AACA,aAAO,QAAA;AAAA,IACT,CAAC;AAED,aAAa;AAAA,MACX,iBAAiB,MAAM,aAAa;AAAA,MACpC,2BAA2B,MAAM,aAAa,MAAM;AAAA,IAAA,CACrD;;0BAICZ,YAiBoBC,MAAAU,WAAA,GAAA;AAAA,QAjBA,WAAW,aAAA,MAAa;AAAA,QAAqB,MAAM,QAAA;AAAA,MAAA;yBACrE,MAeY;AAAA,UAbJ,GAAA,SAFRZ,UAAA,GAAAC,YAeYa,wBAdL,GAAA,KAAE,GADTX,WAeY,EAAA,KAAA,EAAA,GAZF,aAAA,MAAa,OAAK;AAAA,qBACtB;AAAA,YAAJ,KAAI;AAAA,gBACO,aAAA,MAAa,SAAS,EAAA,GAAM,MAAA;AAAA,yBAA5B,aAAA,MAAa,SAAS,EAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAM,MAAK,QAAA;AAAA,YAC3C,MAAM,QAAA;AAAA,UAAA;YAGkBY,WAAA,aAAA,MAAa,OAAK,CAAjC,MAAM,SAAI;;;gBAIlB,IAAAP,QAAA,CAFS,WAAM;AAAA,kBAEfC,YAAgEP,MAAAc,WAAA,GAAhEb,WAAgE,EAAhD,MAAM,QAAA,KAAA,GAAc,QAAM,EAAG,WAAW,MAAI,GAAA,MAAA,IAAA,CAAA,QAAA,WAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;aC7JjC,QAAA,0BAAjCF,YAEYa,wBAFI,QAAA,SAAS,GAAAG,eAAAd,WAAA,EAAA,KAAA,EAAA,GAA2Be,KAAAA,MAAM,CAAA,GAAA;AAAA,yBACxD,MAAQ;AAAA,UAARtB,WAAQ,KAAA,QAAA,SAAA;AAAA,QAAA;;gBAEVA,WAAe,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA;AAAA;;;;;;;;;;;aCDP,QAAQ,QAAA,SAAS,KAAA,OAAY,QAAA,cAAS,2BAF9CK,YAIEa,wBAHK,QAAA,SAAS,GAAAG,eAAAd,WAAA,EAAA,KAAA,KAENe,KAAAA,MAAM,CAAA,GAAA,MAAA,EAAA,mBAEhBb,mBAA2CC,UAAA,EAAA,KAAA,KAAA;AAAA,wCAAvB,QAAA,SAAS,GAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;ACkC/B,YAAQ,kBAAkB,QAAA,IAAS;AAEnC,UAAM,EAAE,UAAU,QAAQ,WAAA,IAAe;AACzC,UAAM,UAAU,SAAS,MAAM,OAAO,KAAK;AAE3C,UAAM,SAAS,cAAc,UAAU;AACvC,UAAM,QAAQ,SAAA;AAId,UAAM,EAAE,MAAM,aAAa,GAAG,gBAAgB;AAAA,MAC5C,OAAO;AAAA,MACP,OAAO;AAAA,IAAA;AAQT,UAAM,QAAQa,SAAA;AAQd,gBAAY,MAAM;AAChB,aAAO,KAAK,KAAK,EAAE,QAAQ,CAAA,SAAQ;AACjC,YAAI,SAAS,UAAW;AACxB,gBAAQ,GAAG,2BAA2B,GAAG,IAAI,IAAK,MAAc,IAAI,CAAC;AAAA,MACvE,CAAC;AAAA,IACH,CAAC;;AAIC,aAAAnB,aAAAC,YASSC,eATTC,WASS;AAAA,QARN,KAAG,CAAG,OAAA;;AAAYD,6BAAA,UAAA,MAAAA,mBAAa;AAAA;AAAA,QAC/B,OAAOA,MAAA,QAAA;AAAA,MAAA,GACA,WAAW,aAAaA,MAAA,kBAAA,EAAmBA,MAAA,KAAA,CAAK,CAAA,GAAA;AAAA,QACxD,OAAM;AAAA,QACL,kDAAD,MAAA;AAAA,QAAA,GAAe,CAAA,SAAA,CAAA;AAAA,MAAA;yBAEf,MAA+C;AAAA,UAA/CO,YAA+CP,MAAA,YAAA,GAAA;AAAA,YAAhC,QAAQ,QAAA;AAAA,YAAU,MAAM,QAAA;AAAA,UAAA;UACvCN,WAAQ,KAAA,QAAA,SAAA;AAAA,QAAA;;;;;;AC5CL,SAAS,UAAU,YAAkB;AAC1C,SAAOwB,YAAc,UAAU;AACjC;AC7BO,SAAS,aAA6C;AAC3D,SAAOC,aAAA;AACT;;;EChCO,WAAU;AAAA,EAAQ,aAAU;AAAA,EAAO,OAAM;AAAA,EAAM,QAAO;AAAA,EAAM,MAAK;AAAA,EAAe,eAAY;AAAA,EAAO,SAAQ;;;AAAhH,SAAArB,UAAA,GAAAK,mBAAiV,OAAjViB,cAAiV,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,IAAjNC,mBAA2M,QAAA,EAArM,GAAE,4LAA2L,GAAA,MAAA,EAAA;AAAA;;;;;;;;;;;;;;;;;;;;ACuFrU,UAAM,OAAO;AAEb,UAAM,gBAAgB,IAAsB,OAAO;AACnD,UAAM,iBAAiB,IAAI,CAAC;AAC5B,QAAI,YAAY;AAEhB,UAAM,iBAAiB,SAAS,MAAM;AACpC,UAAI,CAAC,QAAA,OAAQ,QAAO;AACpB,UAAI,QAAA,WAAW,KAAM,QAAO,EAAE,eAAe,GAAG,cAAc,MAAA;AAC9D,aAAO;AAAA,QACL,eAAe,KAAK,IAAI,KAAK,MAAM,QAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC;AAAA,QAChE,cAAc,QAAA,OAAO,gBAAgB;AAAA,MAAA;AAAA,IAEzC,CAAC;AAED,UAAM,mBAAmB,IAAI,KAAK;AAElC,UAAM,eAAe,IAAI,IAAI;AAE7B,UAAM,qBAAqB,MAAM;AAC/B,mBAAa,QAAQ,CAAC,aAAa;AAAA,IACrC;AAEA,UAAM,EAAE,SAAS,YAAA,IAAgB,QAAA;AAMjC,UAAM,sBAAsB,MAAM;AAChC,mBAAa,QAAQ;AACrB,UAAI,QAAQ,SAAS,QAAA,QAAQ;AAC3B,cAAM,SAAU,QAAQ,MAAc;AACtC,cAAM,cAAc,OAAO;AAAA,UACzB;AAAA,QAAA;AAEF,cAAM,WAAW,IAAI;AAAA,UACnB,CAAA,YAAW;AACT,yBAAa,QAAQ,QAAQ,KAAK,CAAA,MAAK;AAErC,kBAAI,EAAE,sBAAsB,GAAG;AAC7B,sBAAM,OAAO,EAAE,OAAO,aAAa,MAAM;AACzC,sBAAM,mBAAmB,OAAO,2CAAc,QAAQ;AACtD,uBAAO,CAAC,CAAC,MAAM,MAAS,EAAE,SAAS,gBAAgB;AAAA,cACrD;AACA,qBAAQ,QAAA,OAAe;AAAA,YACzB,CAAC;AACD,qBAAS,WAAA;AAAA,UACX;AAAA,UACA,EAAE,MAAM,OAAA;AAAA,QAAO;AAEjB,oBAAY,QAAQ,CAAC,YAAqB;AACxC,mBAAS,QAAQ,OAAO;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF;AAEA;AAAA,MACE;AAAA,QACE,MAAA;;AAAM,2CAAA,SAAA,mBAAM,OAAO,UAAb,mBAAoB,OAAO,CAAC,MAAW,CAAC,EAAE,YAA1C,mBAAmD;AAAA;AAAA,QACzD,MAAM,QAAQ;AAAA,QACd,MAAM,QAAA;AAAA,MAAA;AAAA,MAER,MAAM;;AACJ,YAAI,CAAC,QAAA,UAAU,CAAC,aAAa,SAAS,CAAC,QAAQ,MAAO;AACtD,cAAM,aAAa,aAAQ,UAAR,mBAAuB;AAC1C,cAAM,EAAE,SAAS,EAAA,MAAM,4CAAW,0BAAX,uCAAwC,CAAA;AAC/D,sBAAc,QAAQ;AACtB,qBAAY,wDACR,cAAc,6BADN,mBAER,0BAFQ,mDAEmB;AAAA,MACjC;AAAA,MACA,EAAE,OAAO,QAAQ,WAAW,KAAA;AAAA,IAAK;AAQnC;AAAA,MACE,MAAM;AACJ,YAAI,OAAO,cAAc,UAAU,SAAU;AAC7C,YAAI,mBAAW,UAAU,eAAe,OAAO;AAC7C,gBAAM,EAAE,kBAAkB,eAAe;AACzC,yBAAe,QAAQ,KAAK;AAAA,YAC1B,gBAAgB,aAAa,gBAAgB,KAAK,QAAA;AAAA,YAClD,CAAC,cAAc;AAAA,UAAA;AAEjB,2BAAiB,QAAQ,CAAC,cAAc,QAAQ,eAAe,QAAQ;AACvE,cAAI,iBAAiB,OAAO;AAC1B,gCAAA;AAAA,UACF;AAAA,QACF,OAAO;AACL,2BAAiB,QAAQ;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,EAAE,OAAO,OAAA;AAAA,IAAO;AAGlB,UAAM,cAAc;AAAA,MAAS,MAC3B,QAAA,WAAW,SACP;AAAA,QACE,MAAM;AAAA,UACJ,QAAQ,QAAA;AAAA,UACR,OAAO,EAAE,QAAQ,GAAG,cAAM,KAAA;AAAA,QAAK;AAAA,QAEjC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW,GAAG,QAAA,SAAS;AAAA,UACvB,QAAQ,GAAG,aAAa,QAAQ,cAAc,QAAQ,eAAe,KAAK;AAAA,QAAA;AAAA,MAC5E,IAEF;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,KAAK,GAAG,QAAA,MAAM,MAAM,QAAA,SAAS;AAAA,QAAA;AAAA,QAE/B,MAAM;AAAA,MAAA;AAAA,IACR;AAGN,UAAM,UAAU,MAAM;AACpB,WAAK,OAAO;AAAA,IACd;AAEA,UAAM,WAAW,MAAM;AACrB,WAAK,QAAQ;AAAA,IACf;;0BAIEtB,YAwDUC,MAAAsB,WAAA,GAxDVrB,WAwDU,YAAA,OAvDW;AAAA,QAClB,MAAM,QAAA;AAAA,QACP,OAAM;AAAA,QACL,kBAAa,UAAQ,CAAA,OAAA,CAAA;AAAA,MAAA;yBAEtB,MAiDQ;AAAA,UAjDRM,YAiDQP,MAAAuB,OAAA,GAAA;AAAA,YAjDD,WAAU;AAAA,YAAQ,OAAM;AAAA,UAAA;6BAC7B,MAUO;AAAA,cAVP7B,WAUO,KAAA,QAAA,gBAAA,EAVoB,SAAO,QAAA,GAAlC,MAUO;AAAA,gBATW,QAAA,gBAAW,sBAA3BS,mBAQWC,UAAA,EAAA,KAAA,KAAA;AAAA,kBAP0B,QAAA,eAAnCN,UAAA,GAAAC,YAAmEa,wBAAnD,QAAA,WAAW,GAAA;AAAA;oBAAsB,SAAO;AAAA,kBAAA,oBACxDb,YAKCC,MAAAwB,QAAA,GAAA;AAAA;oBAHC,OAAM;AAAA,oBACL,SAAO;AAAA,kBAAA;qCACP,MAAE,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,sCAAF,MAAE,EAAA;AAAA,oBAAA;;;;;cAIT9B,WAaO,KAAA,QAAA,iBAAA,EAbqB,SAAO,SAAA,GAAnC,MAaO;AAAA,gBAZW,QAAA,iBAAY,sBAA5BS,mBAWWC,UAAA,EAAA,KAAA,KAAA;AAAA,kBAV2B,QAAA,gBAApCN,UAAA,GAAAC,YAAsEa,wBAAtD,QAAA,YAAY,GAAA;AAAA;oBAAuB,SAAO;AAAA,kBAAA,oBAC1Db,YAQSC,MAAAwB,QAAA,GAAA;AAAA;oBANP,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,eAAY;AAAA,oBACX,SAAO;AAAA,kBAAA;qCACT,MAED,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,sCAFC,QAED,EAAA;AAAA,oBAAA;;;;;cAGJ9B,WAsBO,KAAA,QAAA,iBAAA,EAtBqB,SAAO,mBAAA,GAAnC,MAsBO;AAAA,gBArBW,QAAA,0BAA0B,iBAAA,sBAA1CS,mBAoBWC,UAAA,EAAA,KAAA,EAAA,GAAA;AAAA,kBAjBD,QAAA,gBAFRN,UAAA,GAAAC,YAKEa,wBAJK,QAAA,YAAY,GAAA;AAAA;oBAEhB,iBAAe,aAAA;AAAA,oBACf,SAAO;AAAA,kBAAA,gDAEVb,YAYSC,MAAAwB,QAAA,GAAA;AAAA;oBAVP,MAAA;AAAA,oBACA,OAAM;AAAA,oBACL,SAAO;AAAA,kBAAA;qCAER,MAAgC;AAAA,sBAA7BC,gBAAAC,gBAAA,aAAA,uBAA6B,KAChC,CAAA;AAAA,sBAAAnB,YAIE,cAAA;AAAA,wBAHA,OAAM;AAAA,wBACN,OAAwBoB,eAAA,CAAxB,EAAA,eAAA,SAAwB,EAAA,WAAA,UACO,aAAA,QAAY,OAAA,CAAA,OAAA,CAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;;;;;ACjRlD,MAAAP,eAAA,EAAA,OAAM,kCAAiC;;AAA5C,SAAAtB,UAAA,GAAAK,mBAEM,OAFNiB,cAEM;AAAA,IADJ1B,WAAQ,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA;;;;ACDL,MAAA0B,eAAA,EAAA,OAAM,4BAA2B;;AAAtC,SAAAtB,UAAA,GAAAK,mBAEM,OAFNiB,cAEM;AAAA,IADJ1B,WAAQ,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA;;;;;ECAL,WAAU;AAAA,EAAQ,aAAU;AAAA,EAAgB,OAAM;AAAA,EAAM,QAAO;AAAA,EAAM,MAAK;AAAA,EAAe,eAAY;AAAA,EAAO,SAAQ;;;AAAzH,SAAAI,UAAA,GAAAK,mBAA0iB,OAA1iBiB,cAA0iB,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,IAAjaC,mBAA2Z,QAAA,EAArZ,GAAE,4YAA2Y,GAAA,MAAA,EAAA;AAAA;;;;;;;;;;;ACU9hB,UAAM,OAAOO,SAAiB,SAAC,MAAM;AAErC,SAAK,QAAQ,KAAK,SAAS;AAE3B,UAAM,QAA0D;AAAA,MAC9D,EAAE,OAAO,MAAM,KAAK,UAAA;AAAA,MACpB,EAAE,OAAO,MAAM,KAAK,QAAA;AAAA,MACpB,EAAE,OAAO,MAAM,KAAK,QAAA;AAAA,IAAQ;;0BAK5B7B,YAgBWC,MAAA6B,UAAA,GAAA;AAAA,QAhBD,SAAQ;AAAA,QAAS,WAAO,OAAA,CAAA,MAAA,OAAA,CAAA,IAAE,CAAA,QAAQ,KAAA,QAAO;AAAA,MAAA;QAItC,kBACT,MASe;AAAA,UATftB,YASeP,MAAA8B,cAAA,GAAA,MAAA;AAAA,6BAPX,MAAqB;AAAA,4BADvB3B,mBAOeC,UAAA,MAAAS,WANE,OAAK,CAAb,SAAI;uBADbN,YAOeP,MAAA+B,cAAA,GAAA;AAAA,kBALZ,KAAK,KAAK;AAAA,kBACV,SAAS,KAAK;AAAA,kBACd,UAAU,KAAK,QAAQ,KAAA;AAAA,gBAAA;mCAExB,MAAgB;AAAA,oBAAbN,gBAAAC,gBAAA,KAAK,KAAK,GAAA,CAAA;AAAA,kBAAA;;;;;;;;yBAXnB,MAES;AAAA,UAFTnB,YAESP,MAAAwB,QAAA,GAAA;AAAA,YAFD,MAAA;AAAA,YAAK,OAAM;AAAA,UAAA;6BACjB,MAAwB;AAAA,cAAxBjB,YAAwB,oBAAA;AAAA,YAAA;;;;;;;;;;;;ECxBvB,WAAU;AAAA,EAAQ,aAAU;AAAA,EAAS,OAAM;AAAA,EAAM,QAAO;AAAA,EAAM,MAAK;AAAA,EAAe,eAAY;AAAA,EAAO,SAAQ;;;AAAlH,SAAAT,UAAA,GAAAK,mBAA+Y,OAA/YiB,cAA+Y,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,IAA7QC,mBAAuQ,QAAA,EAAjQ,GAAE,wPAAuP,GAAA,MAAA,EAAA;AAAA;;;;;;;;;;ACiBnY,UAAM,OAAO,IAAI,KAAK;AACtB,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,gBAAgB,IAAI,KAAK;AAE/B,UAAM,eAAe,CAAC,QAAgBxB,WAAkB;AACtD,YAAM,MAAM,OAAO,OAAO,OAAO;AACjC,UAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO,SAASA,MAAK;AAC5D,aAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG;AAAA,IACxD;AAEA,UAAM,wBAAwB;AAAA,MAE5B,MACA,QAAA,QAAQ,IAAI,CAAC,MAAMA,YAAW;AAAA,QAC5B,OAAO,OAAO,KAAK,SAAS,KAAK,QAAQ,IAAIA,SAAQ,CAAC,EAAE;AAAA,QACxD,OAAO,aAAa,MAAMA,MAAK;AAAA,QAC/B,SAAS,CAAC,KAAK;AAAA,QACf,QAAQ;AAAA,MAAA,EACR;AAAA,IAAA;AAGJ,UAAM,oBAAoB,SAAS;AAAA,MACjC,MAAM;AACJ,eAAO,sBAAsB,MAAM;AAAA,UAAQ,CAAA,SACzC,KAAK,UAAU,KAAK,QAAQ,CAAA;AAAA,QAAC;AAAA,MAEjC;AAAA,MACA,IAAI,KAAe;AACjB,8BAAsB,MAAM,QAAQ,CAAA,SAAQ;;AAC1C,kCAAA,mBAAO,UAAU,KAAK,OAAc;AAAA,YAClC,QAAQ,CAAC,IAAI,SAAS,KAAK,KAAK;AAAA,UAAA;AAAA,QAEpC,CAAC;AAAA,MACH;AAAA,IAAA,CACD;AAED,UAAM,mBAAmB,CAAC,UAAe;;AACvC,YAAM,UAAU,CAAC,IAAE,oCAAO,WAAP,mBAAe,YAAW;AAC7C,wBAAkB,QAAQ,UACtB,sBAAsB,MAAM,IAAI,CAAA,SAAQ,KAAK,KAAK,IAClD,CAAA;AACJ,oBAAc,QAAQ;AAAA,IACxB;AAEA,UAAM,oBAAoB,CAAC,QAAgB;AACzC,UAAI,kBAAkB,MAAM,SAAS,GAAG,GAAG;AACzC,0BAAkB,QAAQ,kBAAkB,MAAM;AAAA,UAChD,UAAQ,SAAS;AAAA,QAAA;AAAA,MAErB,OAAO;AACL,0BAAkB,QAAQ,CAAC,GAAG,kBAAkB,OAAO,GAAG;AAAA,MAC5D;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACA,CAAA,QAAO;AACL,sBAAc,QACZ,CAAC,CAAC,IAAI,UAAU,IAAI,SAAS,sBAAsB,MAAM;AAC3D,iBAAS,QACP,IAAI,SAAS,KAAK,IAAI,WAAW,sBAAsB,MAAM;AAAA,MACjE;AAAA,MACA,EAAE,WAAW,KAAA;AAAA,IAAK;;0BAKlBE,YAmCWC,MAAA6B,UAAA,GAAA;AAAA,QAlCT,SAAQ;AAAA,QACP,iBAAe;AAAA,QACf,SAAS,KAAA;AAAA,QACT,iBAAc,OAAA,CAAA,MAAA,OAAA,CAAA,IAAE,CAAA,QAAQ,KAAA,QAAO;AAAA,MAAA;QAKrB,kBACT,MAuBe;AAAA,UAvBftB,YAuBeP,MAAA8B,cAAA,GAAA,MAAA;AAAA,6BAtBb,MAQe;AAAA,cARfvB,YAQeP,MAAA+B,cAAA,GAAA;AAAA,gBARA,UAAU;AAAA,gBAAO,SAAS;AAAA,cAAA;iCACvC,MAMW;AAAA,kBANXxB,YAMWP,MAAAgC,UAAA,GAAA;AAAA,oBALR,eAAa,SAAA;AAAA,oBACb,eAAe,cAAA;AAAA,oBACf,UAAQ;AAAA,kBAAA;qCACV,MAED,CAAA,GAAA,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA;AAAA,sCAFC,QAED,EAAA;AAAA,oBAAA;;;;;;gCAEF7B,mBAYeC,UAAA,MAAAS,WAXE,sBAAA,OAAqB,CAA7B,SAAI;oCADbd,YAYeC,MAAA+B,cAAA,GAAA;AAAA,kBAVZ,KAAK,KAAK;AAAA,kBACV,SAAS,KAAK;AAAA,kBACd,SAAKE,cAAA,CAAA,WAAO,kBAAkB,KAAK,KAAK,GAAA,CAAA,MAAA,CAAA;AAAA,gBAAA;mCAEzC,MAKW;AAAA,oBALX1B,YAKWP,MAAAgC,UAAA,GAAA;AAAA,sBAJR,eAAa,KAAK;AAAA,sBAClB,UAAM,MAAQ,kBAAkB,KAAK,KAAK;AAAA,oBAAA;uCAE3C,MAAgB;AAAA,wBAAbP,gBAAAC,gBAAA,KAAK,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;yBAxBrB,MAES;AAAA,UAFTnB,YAESP,MAAAwB,QAAA,GAAA;AAAA,YAFD,MAAA;AAAA,YAAK,OAAM;AAAA,UAAA;6BACjB,MAAkB;AAAA,cAAlBjB,YAAkB,cAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;AC5ExB,UAAM,eAAe,CAAC,QAAmBV,WAAkB;AACzD,YAAM,MAAM,OAAO,OAAO,OAAO;AACjC,UAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO,SAASA,MAAK;AAC5D,aAAO,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,OAAO,GAAG;AAAA,IACxD;AAEA,UAAM,eAAe,CAAC,KAA0B,WAAsB;AACpE,YAAM,OAAO,OAAO;AACpB,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO,IAAI,KAAK,OAAO,IAAI,CAAC;AAAA,IAC9B;AAEA,UAAM,oBAAoB,SAAS,MAAM;AACvC,aAAO,QAAA,QAAQ,OAAO,CAAA,WAAU,CAAC,OAAO,MAAM;AAAA,IAChD,CAAC;AAED,UAAM,iBAAiB,CAAC,WAAsB;AAE5C,YAAM,EAAE,QAAQ,QAAQ,KAAK,GAAG,SAAS;AACzC,YAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,IAClC,OAAO,KAAK,KAAK,GAAG,IACpB,OAAO,OACL,OAAO,OAAO,IAAI,IAClB;AACN,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,WAAW,MAAM,OAAO,GAAG,IAAI;AAAA,MAAA;AAAA,IAEnC;;AAIE,aAAAC,UAAA,IAAA,GAAAK,mBAmBWC,UAAA,MAAAS,WAlBiB,kBAAA,OAAiB,CAAnC,QAAQhB,WAAK;AAGrB,eAAAC,aAAAC,YAccC,sBAddC,WAcc;AAAA,eAhBR,aAAa,QAAQJ,MAAK;AAAA;WAEX,eAAe,MAAM,CAAA,GAAA;AAAA,UAC7B,SAAOS,QAChB,CAUW,UAAA;;AAXY;AAAA,cACA,OAAA,OAAO,WAAM,2BAClCP,YAQEa;AAAAA,iBAPoB,YAAO,WAAP,gCAAa;AAAA,qBAAwB;AAAA,kBAAuB;AAAA,kBAAmC,WAAA,aAAa,MAAM,KAAK,MAAM;AAAA,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACwD7J,UAAM,SAAS,cAAc,WAAW;AACxC,UAAM,cAAc,OAAO,OAAO,cAAc,OAAO,OAAO;AAE9D,UAAM,kBAAkB,OAAO,KAAK,WAAA,CAAY;AAChD,UAAM,uBAAuB,OAAO,KAAK,gBAAA,CAAiB;AAE1D,UAAM,QAAQ,SAAA;AAEd,UAAM,mBAAmB,SAAS,MAAM;AACtC,aAAO,KAAK,aAAa,eAAe;AAAA,IAC1C,CAAC;AAED,UAAM,kBAAkB,SAAS,MAAM;AACrC,aAAO;AAAA,QACL,mBAAmB,KAAK;AAAA,QACxB;AAAA,MAAA;AAAA,IAEJ,CAAC;AAED,UAAM;AAAA,MACJ,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE,QAAA,SAAS,CAAA;AAEb,UAAM,OAAOgB,kBAAgC,MAAM;AACnD,UAAM,UAAUA,SAAoB,SAAC,SAAS;AAG9C,UAAM,UAAU,YAAY;;AAC1B,UAAI;AACF,gBAAQ,QAAQ;AAChB,gBAAM,aAAA,WAAA;AAAA,MACR,UAAA;AACE,gBAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAGA,UAAM,QAAQ,MAAM;;AAClB,8BAAA,mBAAO;AACP,eAAS,MAAM;AACb,gBAAA;AAAA,MACF,CAAC;AAAA,IACH;AAQA,UAAM,QAAQ,SAAA;AACd,UAAM,iBAAiB,MAAM,aAAa;AAC1C,UAAM,gBAAgB,MAAM,YAAY;AACxC,UAAM,cAAc,MAAM,SAAS;AAEnC,UAAM,aAAa,SAAS,MAAM;AAChC,YAAM,kCAAkB,IAAI;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AACD,aAAO,OAAO;AAAA,QACZ,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;AAAA,MAAA;AAAA,IAEnE,CAAC;AACD,UAAM,iBAAiB,SAAS,MAAM,OAAO,KAAK,WAAW,KAAK,CAAC;AAEnE,UAAM,gBAAgB,MAAM;AAC1B,mDAAe,EAAE,SAAS;AAC1B,cAAA;AAAA,IACF;AAEA,UAAM,2BAA2B,SAAS,MAAM;;AAC9C,YAAM,cACJ,aAAA,qBAAA,mBAAkB,gBAClB,iBAAY,qBAAZ,mBAA8B,cAC9B;AACF,aAAO;AAAA,QACL,GAAG,YAAY;AAAA,QACf,GAAG,UAAU,wBAAgB;AAAA,QAC7B,WAAW,YAAY,YAAY;AAAA,MAAA;AAAA,IAEvC,CAAC;AAED,UAAM,yBAAyB,SAAS,MAAM;AAC5C,YAAM,YACJ,QAAA,kBAAkB,YAAY,kBAAkB;AAClD,aAAO,YAAY,YAAY;AAAA,IACjC,CAAC;AAED,UAAM,uBAAuB,SAAS,MAAM;AAC1C,YAAM,SAAU,QAAA,YAAW,6CAAc,UAAS,CAAA;AAElD,YAAM,aAAa,OAAO,IAAI,CAAC,MAAM/B,WAAU;AAC7C,cAAM,UAAe,EAAE,GAAG,KAAA;AAC1B,YAAI,QAAQ,UAAU,UAAa,QAAQ,UAAU,QAAW;AAC9D,kBAAQ,QAAQ,QAAQ;AAAA,QAC1B;AACA,YAAI,QAAQ,SAAS,UAAa,QAAQ,cAAc,QAAW;AACjE,kBAAQ,OAAO,MAAM,QAAQ,QAAQ,SAAS,IAC1C,QAAQ,UAAU,KAAK,GAAG,IAC1B,QAAQ;AAAA,QACd;AACA,YAAI,QAAQ,QAAQ,QAAW;AAC7B,kBAAQ,MACN,QAAQ,SACP,OAAO,QAAQ,cAAc,WAC1B,QAAQ,YACR,WACJ,OAAOA,MAAK;AAAA,QAChB;AACA,eAAO;AAAA,MACT,CAAC;AACD,UAAI,0BAAkB,YAAY,gBAAgB;AAChD,eAAO;AAAA,UACL;AAAA,YACE,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,UAAA;AAAA,UAET,GAAG;AAAA,QAAA;AAAA,MAEP;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,qBAAqB,SAAgB,MAAM;AAC/C,YAAM,YAAY,gBAAgB,MAAM;AACxC,aAAO,QAAA,QAAQ,cAAa,uCAAW,UAAS,CAAA;AAAA,IAClD,CAAC;AAED,UAAM,qBAAqB,SAAqB,MAAM;AACpD,YAAM,SAAS;AAAA,QACb,GAAG,iBAAiB;AAAA,QACpB,GAAG,gBAAgB;AAAA,MAAA;AAErB,aAAQ,OAAe;AACvB,aAAO;AAAA,IACT,CAAC;AAED,UAAM,qBAAqB,SAA2C,MAAM;AAC1E,UAAI,QAAA,eAAe,MAAO,QAAO;AACjC,YAAM,aAAa,QAAA,cAAc,CAAA;AACjC,aAAO;AAAA,QACL,GAAG,YAAY;AAAA,QACf,GAAG,KAAK,YAAmC,oBAAoB;AAAA,QAC/D,aAAc,WAAmB,gBAAe,uCAAW,YAAW;AAAA,QACtE,UAAW,WAAmB,aAAY,uCAAW,aAAY;AAAA,QACjE,OAAQ,WAAmB,UAAS,uCAAW,UAAS;AAAA,MAAA;AAAA,IAE5D,CAAC;AAED,UAAM,iBAAiB,SAAS,MAAM,mBAAmB,UAAU,KAAK;AAExE,UAAM,kBAAkB,CAAC,YAAoB;AAC3C,mDAAe,EAAE;AACjB,cAAA;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,aAAqB;AACzC,mDAAe,EAAE,UAAU,SAAS,EAAA;AACpC,cAAA;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,aAAqB,aAAqB;;AACpE,kBAAM,aAAN,+BAAiB,aAAa;AAAA,IAChC;AAEA,UAAM,aAAa,SAAS,MAAM;;AAChC,aAAO,CAAC,EACN,oBACC,8BAAyB,UAAzB,mBAAgC,YAAW,QAC1C,gBACA,gBAAW,OAAO,MAAM,OAAO,CAAA,SAAQ,CAAC,KAAK,MAAM,MAAnD,mBAAsD,UAAS;AAAA,IAErE,CAAC;AAED,UAAM,kBAAkB,SAAkB,MAAM;AAC9C,YAAM,gBAAgB,mBAAW,YAAY;AAC7C,YAAM,eAAe,+CAA2B,gBAAe;AAC/D,YAAM,iBACH,+CAA2B,kBAAiB;AAC/C,aAAO,EAAE,aAAa,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,cAAA;AAAA,IACxD,CAAC;AAED,UAAM,eAAe,SAAS,MAAM;AAClC,aACE,KAAK,SACJ,gBAAgB,MAAM,QACvB,iBAAiB,MAAM;AAAA,IAE3B,CAAC;AAED,cAAU,MAAM;AACd,UAAI,2BAAmB,YAAY,iBAAiB;AAClD,gBAAA;AAAA,MACF;AAAA,IACF,CAAC;;;0BAICM,mBAkEM,OAAA;AAAA,QAjEJ,OAAK+B,eAAA,CAAC,aACGlB,KAAAA,OAAe,KAAK,CAAA;AAAA,QAC5B,OAAKW,eAAGX,KAAAA,OAAe,KAAK;AAAA,MAAA;QAGrB,WAAA,sBADRjB,YAaoBC,MAAAU,WAAA,GAAA;AAAA;UAXjB,WAAW,yBAAA,MAAyB;AAAA,QAAA;2BAErC,MAQO;AAAA,YARPhB,WAQO,gCARP,MAQO;AAAA,cANGM,MAAA,UAAA,KADRF,aAAAC,YAME,YANFE,WAME;AAAA;gBAJC,MAAMD,MAAA,UAAA;AAAA,cAAA,GACC,yBAAA,OAAwB;AAAA,gBAC/B,UAAQ;AAAA,gBACR,SAAO;AAAA,cAAA;;;;;QAKdO,YA6CoBP,MAAAU,WAAA,GAAA,EA7CA,WAAW,uBAAA,SAAsB;AAAA,2BACnD,MAmBM;AAAA,YAnBNW,mBAmBM,OAnBN,YAmBM;AAAA,cAlBOrB,MAAA,aAAA,KAAXF,aAAAK,mBAEM,OAFN,YAEM;AAAA,gBADJT,WAA0B,KAAA,QAAA,cAAA,CAAA,GAAA,QAAA,IAAA;AAAA,cAAA;cAEjBM,MAAA,WAAA,KAAXF,aAAAK,mBAEM,OAFN,YAEM;AAAA,gBADJT,WAAuB,KAAA,QAAA,WAAA,CAAA,GAAA,QAAA,IAAA;AAAA,cAAA;cAGjB,gBAAA,MAAgB,eADxBI,aAAAK,mBAKM,OALN,YAKM;AAAA,gBADJI,YAAmCP,MAAA,WAAA,GAAA;AAAA,kBAAd,MAAM,KAAA;AAAA,yEAAA,KAAI,QAAA;AAAA,gBAAA;;cAGzB,gBAAA,MAAgB,iBADxBF,aAAAK,mBAKM,OALN,YAKM;AAAA,gBADJI,YAAgEP,MAAA,aAAA,GAAA;AAAA,kBAAhD,SAAS,qBAAA;AAAA,kBAAuB,OAAO,QAAA;AAAA,gBAAA;;;YAI3DN,WAaO,0BAbP,MAaO;AAAA,cAZLyC,gBAAArC,UAAA,GAAAC,YAWUC,gBAXVC,WAWU,EATR,OAAM,uBACE,mBAAA,OAAkB;AAAA,gBACzB,MAAM,aAAA;AAAA,gBACN,MAAM,mBAAA;AAAA,cAAA;iCAEP,MAAuD;AAAA,kBAAvDM,YAAuD6B,aAAA,EAAjC,SAAS,qBAAA,MAAA,GAAoB,MAAA,GAAA,CAAA,SAAA,CAAA;AAAA,gBAAA;;;gBAC1BvB,WAAA,eAAA,QAAR,SAAI;;;oBACnB,IAAAP,QAAA,CAD4D,WAAM;AAAA,sBAClEZ,WAAqC,KAAA,QAAxB,MAAIqB,eAAAsB,mBAAU,MAAM,CAAA,GAAA,QAAA,IAAA;AAAA,oBAAA;;;;qCARxB,QAAA,KAAO;AAAA,cAAA;;YAcd,eAAA,SADRvC,UAAA,GAAAC,YAOEC,qBAPFC,WAOE;AAAA;cALA,OAAM;AAAA,YAAA,GACE,mBAAA,OAAkB;AAAA,cACzB;AAAA,cACA;AAAA,cACA,UAAQ;AAAA,YAAA;;;;;;;;;AClQV,SAAS,SAGd,SAA+B,IAAiB;AAChD,QAAM,EAAE,MAAM,GAAG,KAAA,IAAS;AAC1B,QAAM,YAAaqC,WAAqB;AAAA,IACtC,GAAG;AAAA,IACH,YAAY;AAAA,EAAA,CACb;AAED,QAAM,EAAE,YAAY,GAAG,uBAAA,IAA2B;AAClD,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,MAAM;AAAA,EAAA;AAGR,SAAO;AACT;;;;;;;;;;;;ACpGA,UAAM,QAAQ;AAOd,QAAI,MAAM,eAAe;AACvB,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAC1D,cAAM,SAAS,mBAAmB,GAAG;AAErC,gBAAQ,OAAO,cAAc,EAAE,GAAG,OAAO,SAAS,GAAG,UAAU,GAAG,GAAG;AAAA,MACvE,CAAC;AAAA,IACH;AAGA,QAAI,MAAM,cAAc;AACtB,cAAQ,mBAAmB,MAAM,YAAY;AAAA,IAC/C;;aAIE5C,WAAQ,KAAA,QAAA,SAAA;AAAA;;;ACLV,MAAA,QAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeb,QAAQ,KAAU;AAChB,QAAI,UAAU4B,YAAQ,MAAMA,WAAO;AACnC,QAAI,UAAU,SAAS,MAAM,QAAQ;AACrC,QAAI,UAAUiB,UAAqB,MAAOA,SAAoB;AAAA,EAChE;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../src/shared/ui/index.ts","../src/components/component-provider/constants/index.ts","../src/components/form/constants/index.ts","../src/components/form/components/PathProvider/index.vue","../src/components/form/components/GroupedFieldAttrs/index.vue","../src/components/form/components/BaseFormItem/index.vue","../src/components/form/hooks/useForm.ts","../src/components/form/components/BaseField/utils/index.ts","../src/locale/zh-CN.ts","../src/locale/zh-TW.ts","../src/locale/en-US.ts","../src/locale/index.ts","../src/components/form/components/BaseField/index.vue","../src/components/form/components/ContainerFragment/index.vue","../src/components/form/components/SlotComponent/index.vue","../src/components/form/components/ProForm/index.vue","../src/components/form/hooks/useFields.ts","../src/components/form/hooks/useFormRef.ts","../src/components/table/components/icons/DownOutlined.vue","../src/components/table/components/SearchForm.vue","../src/components/table/components/DefaultSearchFormContainer.vue","../src/components/table/components/DefaultTableContainer.vue","../src/components/table/components/icons/ColumnHeightOutlined.vue","../src/components/table/components/SizeControl.vue","../src/components/table/components/icons/FilterOutlined.vue","../src/components/table/components/ColumnControl.vue","../src/components/table/components/TableColumnRenderer.vue","../src/components/table/components/ProTable.vue","../src/components/table/useTable.ts","../src/components/component-provider/components/index.vue","../src/index.ts"],"sourcesContent":["import {\n ElForm as Form,\n ElFormItem as FormItem,\n ElRow as Grid,\n ElCol as GridItem,\n ElTable as Table,\n ElTableColumn as TableColumn,\n ElSpace as Space,\n ElDropdown as Dropdown,\n ElDropdownMenu as DropdownMenu,\n ElDropdownItem as DropdownItem,\n ElCheckbox as Checkbox,\n ElCheckboxGroup as CheckboxGroup,\n ElButton as Button,\n ElAutocomplete as AutoComplete,\n ElCascader as Cascader,\n ElDatePicker as DatePicker,\n ElInput as Input,\n ElInputNumber as InputNumber,\n ElSelect as Select,\n ElSlider as Slider,\n ElSwitch as Switch,\n ElTransfer as Transfer,\n ElTreeSelect as TreeSelect,\n ElRadioGroup as RadioGroup,\n ElTimePicker as TimePicker,\n ElTimeSelect as TimeSelect,\n ElPagination as Pagination,\n useFormDisabled,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type TableProps as _TableProps,\n type TableColumnCtx as ColumnType,\n type PaginationProps,\n type RowProps as GridProps,\n type ColProps as GridItemProps,\n} from 'element-plus';\nimport { type MaybeRefOrGetter, computed, inject, provide, toValue } from 'vue';\n\nexport {\n Form,\n FormItem,\n Grid,\n GridItem,\n Table,\n TableColumn,\n Space,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n CheckboxGroup,\n Button,\n AutoComplete,\n Cascader,\n DatePicker,\n Input,\n InputNumber,\n Select,\n Slider,\n Switch,\n Transfer,\n TreeSelect,\n RadioGroup,\n TimePicker,\n TimeSelect,\n Pagination,\n type FormItemInstance,\n type FormInstance,\n type FormProps,\n type FormItemProps,\n type PaginationProps,\n type GridProps,\n type GridItemProps,\n type ColumnType,\n};\n\nexport type TableProps = _TableProps<any>;\n\nexport const tableProps = () => (Table as any).props || {};\nexport const paginationProps = () => (Pagination as any).props || {};\nexport const gridItemProps = () => (GridItem as any).props || {};\nexport const formItemProps = () => (FormItem as any).props || {};\n\nconst DisabledContextKey = Symbol('pro-form-disabled-context');\n\nexport const useDisabledContext = () => {\n const formDisabled = useFormDisabled();\n return inject(\n DisabledContextKey,\n computed(() => !!formDisabled.value)\n );\n};\n\nexport const useDisabledContextProvider = (\n disabled: MaybeRefOrGetter<boolean | undefined>\n) => {\n provide(\n DisabledContextKey,\n computed(() => !!toValue(disabled))\n );\n};\n\nexport type NamePath = string | number | (string | number)[];\n","import { RequiredComponentVars } from '../types';\nimport { InjectionKey, Component } from 'vue';\n\nexport type InjectConfigEntry<T = any> = {\n injectionKey: InjectionKey<T>;\n default: T;\n};\n\nexport const INJECT_CONFIG: {\n [key in keyof RequiredComponentVars]: {\n injectionKey: InjectionKey<RequiredComponentVars[key]>;\n default: RequiredComponentVars[key];\n };\n} = {\n 'pro-table': {\n injectionKey: Symbol(''),\n default: {\n pagination: {\n layout: 'total, sizes, prev, pager, next, jumper',\n pageSizes: [10, 20, 30, 40, 50, 100],\n background: true,\n },\n searchFormConfig: {\n layout: 'grid',\n expand: { minExpandRows: 2, expandStatus: false },\n },\n control: true,\n addIndexColumn: true,\n },\n },\n 'pro-form': {\n injectionKey: Symbol(''),\n default: { grid: { gutter: 24 } } as any,\n },\n 'pro-form-item': {\n injectionKey: Symbol(''),\n default: { span: 8 } as any,\n },\n input: {\n injectionKey: Symbol(''),\n default: { maxlength: 100, clearable: true },\n },\n 'input.textarea': {\n injectionKey: Symbol(''),\n default: {\n maxlength: 200,\n autosize: { minRows: 3, maxRows: 6 },\n showWordLimit: true,\n clearable: true,\n },\n },\n 'input.password': {\n injectionKey: Symbol(''),\n default: {\n showPassword: true,\n maxlength: 100,\n clearable: true,\n },\n },\n 'input-number': {\n injectionKey: Symbol(''),\n default: {\n max: 10 ** 15 - 1,\n min: -(10 ** 15 + 1),\n controls: false,\n style: { width: '100%' },\n },\n },\n autocomplete: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n select: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n cascader: {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n 'date-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.date': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.dates': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.daterange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.week': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.month': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.monthrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.months': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.yearrange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.year': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.years': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetime': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'date-picker.datetimerange': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-picker': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'time-select': {\n injectionKey: Symbol(''),\n default: { style: { width: '100%' } },\n },\n 'checkbox-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n 'radio-group': {\n injectionKey: Symbol(''),\n default: {},\n },\n switch: {\n injectionKey: Symbol(''),\n default: { modelProp: 'modelValue' },\n },\n slider: {\n injectionKey: Symbol(''),\n default: {},\n },\n 'tree-select': {\n injectionKey: Symbol(''),\n default: { clearable: true },\n },\n transfer: {\n injectionKey: Symbol(''),\n default: {},\n },\n};\n\nexport const INJECT_COMPONENTS: InjectionKey<\n Partial<Record<string, Component>>\n> = Symbol('INJECT_COMPONENTS');\n\nconst DYNAMIC_INJECT_CONFIG: Record<string, InjectConfigEntry> =\n Object.create(null);\n\nexport const getInjectConfig = (key: string): InjectConfigEntry | undefined => {\n return (\n (INJECT_CONFIG as Record<string, InjectConfigEntry>)[key] ||\n DYNAMIC_INJECT_CONFIG[key]\n );\n};\n\nexport const ensureInjectConfig = (key: string): InjectConfigEntry => {\n const existing = getInjectConfig(key);\n if (existing) return existing;\n const created: InjectConfigEntry = {\n injectionKey: Symbol(`dynamic:${key}`),\n default: {},\n };\n DYNAMIC_INJECT_CONFIG[key] = created;\n return created;\n};\n","import {\n Cascader,\n CheckboxGroup,\n DatePicker,\n AutoComplete,\n Input,\n InputNumber,\n RadioGroup,\n Select,\n Slider,\n Switch,\n TimePicker,\n TimeSelect,\n Transfer,\n TreeSelect,\n} from '../../../shared/ui';\n\n/**\n * FormItem 插槽名称列表\n * @description 用于在字段配置中透传 FormItem 的插槽(Element Plus 版本)\n */\n// prettier-ignore\nexport const FORM_ITEM_SLOT_KEYS = ['label', 'error'] as const;\n\n/**\n * 内置组件映射表\n * @description Element Plus 内置支持的组件类型映射\n */\n// prettier-ignore\nexport type BaseComponentMap = {\n 'input': typeof Input;\n 'input-number': typeof InputNumber;\n 'autocomplete': typeof AutoComplete;\n 'select': typeof Select;\n 'cascader': typeof Cascader;\n 'date-picker': typeof DatePicker;\n 'time-picker': typeof TimePicker;\n 'time-select': typeof TimeSelect;\n 'checkbox-group': typeof CheckboxGroup;\n 'radio-group': typeof RadioGroup;\n 'switch': typeof Switch;\n 'slider': typeof Slider;\n 'tree-select': typeof TreeSelect;\n 'transfer': typeof Transfer;\n}\n\n/**\n * 组件映射扩展接口\n * @description 暴露给外部扩充自定义组件类型的接口。\n * 用户可通过 TypeScript 的声明合并(module augmentation)添加自定义组件。\n *\n * @example\n * ```ts\n * declare module '@qin-ui/element-plus-pro' {\n * interface ComponentMap {\n * 'my-custom-input': typeof MyCustomInput;\n * }\n * }\n * ```\n \n * @public\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface ComponentMap {}\n\n/**\n * 组件名称联合类型\n * @description 所有支持的组件名称\n \n * @public\n */\nexport type ComponentName =\n | keyof BaseComponentMap\n | keyof ComponentMap\n | 'custom';\n\n/**\n * 根据组件名获取组件类型\n * @template K - 组件名称\n */\nexport type GetComponentType<K extends ComponentName> =\n K extends keyof ComponentMap\n ? ComponentMap[K]\n : K extends keyof BaseComponentMap\n ? BaseComponentMap[K]\n : never;\n\n/**\n * 组件名称到 Element Plus 组件的映射\n */\n// prettier-ignore\nexport const componentMap: BaseComponentMap = {\n 'input': Input,\n 'input-number': InputNumber,\n 'autocomplete': AutoComplete,\n 'select': Select,\n 'cascader': Cascader,\n 'date-picker': DatePicker,\n 'time-picker': TimePicker,\n 'time-select': TimeSelect,\n 'checkbox-group': CheckboxGroup,\n 'radio-group': RadioGroup,\n 'switch': Switch,\n 'slider': Slider,\n 'tree-select': TreeSelect,\n 'transfer': Transfer,\n}\n\n/**\n * Teleport 组件名称前缀\n * @description 用于通过插槽动态替换指定 path 的组件\n */\nexport const TeleportComponentNamePrefix = 'TeleportComponent_';\n\n// inject keys\nexport { InjectionFormKey, InjectionPathKey } from '../../../shared/core';\n","<script lang=\"ts\" setup>\nimport { computed, provide } from 'vue';\nimport { InjectionPathKey } from '../../constants';\nimport { NamePath } from '../../../../shared/ui';\n\nconst props = defineProps<{ path?: NamePath }>();\n\nconst namePath = computed(() => {\n return Array.isArray(props.path)\n ? props.path.join('.')\n : (props.path as string | undefined);\n});\n\nprovide(InjectionPathKey, namePath);\n</script>\n\n<template>\n <slot :path=\"namePath\" />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component GroupedFieldAttrs\n * @description 字段属性分组器,将 field 配置对象拆分为三类属性\n *\n * ## 属性分发逻辑\n *\n * 单个 field 对象包含多种属性,需要分发到不同的渲染目标:\n *\n * 1. **gridItemProps** — 网格布局属性(span、xs、sm、md、lg、xl、xxl 等),传递给 GridItem\n * 2. **formItemProps** — 表单项属性(label、rules、required 等),传递给 FormItem\n * 3. **componentProps** — 组件属性(placeholder、clearable 等),传递给输入组件\n * 4. **formItemSlots** — FormItem 的具名插槽(label、error 等)\n *\n * 分组依据:\n * - 匹配 element-plus GridItem 的 props key → gridItemProps\n * - 匹配 element-plus FormItem 的 props key → formItemProps\n * - 其余所有属性 → componentProps\n * - 属于 FORM_ITEM_SLOT_KEYS 的插槽 → formItemSlots\n * - 其余插槽 → componentProps.slots\n */\nimport { computed, inject, mergeProps, toValue } from 'vue';\nimport {\n GridItemProps,\n FormItemProps,\n gridItemProps,\n formItemProps,\n} from '../../../../shared/ui';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport type { Base, Field } from '../../types';\nimport { FORM_ITEM_SLOT_KEYS } from '../../constants';\nimport { isPlainObject } from '../../../../shared/core';\n\nconst formItemPropKeys = Object.keys(formItemProps());\nconst gridItemPropKeys = Object.keys(gridItemProps());\n\ntype Props = {\n field: Field;\n};\nconst props = defineProps<Props>();\n\nconst config = INJECT_CONFIG['pro-form-item'];\nconst injectFormItemProps = inject(config.injectionKey, config.default);\n\ntype GroupedFieldAttrs = {\n gridItemProps: GridItemProps;\n formItemProps: FormItemProps & { container?: Base['formItemContainer'] };\n formItemSlots: Record<(typeof FORM_ITEM_SLOT_KEYS)[number], any>;\n componentProps: Record<string, any>;\n};\n\n// 将 field 配置按 key 分发到三类属性分组中\nconst groupedAttributes = computed<GroupedFieldAttrs>(() => {\n let gridItemProps: Record<string, any> = {};\n let formItemProps: Record<string, any> = {};\n const componentProps: Record<string, any> = { slots: {} };\n const formItemSlots: Record<string, any> = {};\n\n if (isPlainObject(props.field)) {\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { path, name, fields, formItemClass, formItemStyle, formItemContainer, hidden, span, getFormItemRef, getComponentRef, getFormItemComputedProps, getComponentComputedProps, slots = {}, formItemDataAttrs = {}, componentDataAttrs = {}, extraProps, ...rest } =\n props.field as any;\n const {\n class: injectClassName,\n style: injectStyle,\n span: injectSpan,\n formItemContainer: injectFormItemContainer,\n xs,\n sm,\n md,\n lg,\n xl,\n ...injectRest\n } = injectFormItemProps;\n\n const initGridItemProps =\n span || span === 0 ? { span } : { xs, sm, md, lg, xl, span: injectSpan };\n\n gridItemProps = fields ? { span: span ?? 24 } : initGridItemProps;\n formItemProps = mergeProps(\n injectRest as any,\n { class: injectClassName, style: injectStyle },\n { class: toValue(formItemClass), style: toValue(formItemStyle) },\n formItemDataAttrs\n );\n formItemProps.container = formItemContainer ?? injectFormItemContainer;\n\n Object.keys(rest).forEach(k => {\n if (gridItemPropKeys.includes(k)) {\n gridItemProps[k] = rest[k];\n } else if (formItemPropKeys.includes(k)) {\n (formItemProps as any)[k] = rest[k];\n } else {\n componentProps[k] = rest[k];\n }\n });\n // 将 componentDataAttrs 展开到组件 props 中\n Object.assign(componentProps, componentDataAttrs);\n Object.keys(slots).forEach(k => {\n if (FORM_ITEM_SLOT_KEYS.includes(k as any)) {\n formItemSlots[k] = slots[k];\n } else {\n componentProps['slots'][k] = slots[k];\n }\n });\n }\n\n return { gridItemProps, formItemProps, componentProps, formItemSlots };\n});\n</script>\n\n<template>\n <slot v-bind=\"groupedAttributes\"></slot>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component BaseFormItem\n * @description 表单字段渲染引擎\n *\n * 负责将字段配置数组渲染为实际的表单项,支持:\n * - 字段分组(嵌套 fields 递归渲染)\n * - 网格布局(grid 属性控制)\n * - FormItem 包装(label、rules、校验等)\n * - 组件绑定(通过 BaseField 渲染具体组件)\n * - 插槽透传(label、error 等 FormItem 插槽)\n *\n * ## 渲染流程\n *\n * 1. 遍历 fields 数组,过滤 hidden 字段\n * 2. 对每个字段:\n * a. 通过 PathProvider 提供当前字段路径\n * b. 通过 GroupedFieldAttrs 将 field 配置拆分为 gridItemProps / formItemProps / componentProps\n * c. 如果字段有 `fields` 子字段 → 递归渲染 BaseFormItem(嵌套表单)\n * d. 否则 → 渲染 BaseField(输入组件)\n * 3. 通过 ref 回调收集 FormItem 和 Component 实例,注入到 field 对象上\n *\n * @param {Fields<D>} [fields] - 字段配置数组\n * @param {boolean | GridProps} [grid] - 是否启用网格布局\n * @param {boolean} [disabled] - 是否禁用所有子字段\n *\n * @internal\n */\nimport { getObject, toPath } from '../../../../shared/core';\nimport {\n FormItem,\n Grid as ElGrid,\n GridItem as ElGridItem,\n GridProps,\n useDisabledContextProvider,\n} from '../../../../shared/ui';\nimport { computed, inject, toValue } from 'vue';\nimport type { Fields, Grid } from '../../types';\nimport { BaseField, SlotComponent, ContainerFragment } from '..';\nimport PathProvider from '../PathProvider/index.vue';\nimport GroupedFieldAttrs from '../GroupedFieldAttrs/index.vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\n\ndefineOptions({ name: 'BaseFormItem', inheritAttrs: false });\n\ntype Props = {\n grid?: Grid;\n fields?: Fields;\n disabled?: boolean;\n};\nconst {\n grid = undefined,\n fields = [],\n disabled = undefined,\n} = defineProps<Props>();\n\nconst validFields = computed(() => fields.filter?.(field => !field.hidden));\n\nuseDisabledContextProvider(computed(() => disabled) as any);\n\nconst config = INJECT_CONFIG['pro-form'];\n\nconst { grid: injectGrid } = inject(config.injectionKey, config.default);\n\nconst enableGrid = computed(() => {\n if (grid !== undefined) return !!grid;\n return !!injectGrid;\n});\n\nconst computedGridProps = computed<GridProps>(() => {\n return enableGrid.value\n ? { ...getObject(injectGrid), ...getObject(grid) }\n : {};\n});\n\nconst formItemRefs: any[] = [];\nconst componentRefs: any[] = [];\n\nconst onFormItemMounted = (index: number, formItemProps?: any) => {\n const field = validFields.value[index];\n Object.assign(field, {\n getFormItemRef: () => formItemRefs[index],\n getFormItemComputedProps: () => formItemProps,\n });\n};\n\nconst onComponentMounted = (index: number) => {\n const field = validFields.value[index];\n Object.assign(field, {\n getComponentRef: () => componentRefs[index]?.getComponentRef(),\n getComponentComputedProps: () =>\n componentRefs[index]?.getComponentComputedProps(),\n });\n};\n</script>\n\n<template>\n <ContainerFragment\n :component=\"enableGrid ? ElGrid : undefined\"\n v-bind=\"computedGridProps\"\n style=\"width: 100%\"\n >\n <PathProvider\n v-for=\"({ path: _path, ...field }, index) of validFields\"\n :key=\"toPath(toValue((_path ?? index) as any)).join('.') || index\"\n v-bind=\"{ path: _path as any }\"\n >\n <template #default=\"{ path }\">\n <GroupedFieldAttrs :field=\"field\">\n <template\n #default=\"{\n gridItemProps,\n formItemProps: { container, ...formItemProps },\n componentProps,\n formItemSlots,\n }\"\n >\n <ContainerFragment\n :component=\"enableGrid ? ElGridItem : undefined\"\n v-bind=\"gridItemProps\"\n >\n <ContainerFragment :component=\"container\" :path=\"path\">\n <FormItem\n v-bind=\"formItemProps\"\n :ref=\"el => (formItemRefs[index] = el)\"\n :prop=\"toPath(path).join('.')\"\n :path=\"path\"\n @vue:mounted=\"onFormItemMounted(index, formItemProps)\"\n >\n <template\n v-for=\"(slot, name) in formItemSlots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent\n :path=\"path\"\n :component=\"slot\"\n v-bind=\"scoped\"\n />\n </template>\n <template v-if=\"field.fields\">\n <BaseFormItem\n :grid=\"(field as any).grid ?? grid\"\n :fields=\"field.fields\"\n :disabled=\"toValue(field.disabled)\"\n />\n </template>\n <template v-else>\n <BaseField\n :ref=\"el => (componentRefs[index] = el)\"\n v-bind=\"componentProps\"\n :path=\"path\"\n @vue:mounted=\"onComponentMounted(index)\"\n />\n </template>\n </FormItem>\n </ContainerFragment>\n </ContainerFragment>\n </template>\n </GroupedFieldAttrs>\n </template>\n </PathProvider>\n </ContainerFragment>\n</template>\n\n<style scoped lang=\"less\">\n[class*='-form-item'] [class*='-form-item'] {\n margin-bottom: 18px;\n}\n</style>\n","import {\n useForm as coreUseForm,\n type Form as _Form,\n} from '../../../shared/core';\nimport type { Data, ExtendWithAny, DeepPartial } from '../../../shared/core';\nimport type { Field } from '../types';\nimport type { ComponentName } from '../constants';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单实例类型\n *\n * @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,\n * 将底层表单实例 I 绑定为 Element Plus 的 FormInstance,使 formRef 获得完整的类型提示。\n *\n * @template D - 表单数据类型\n * @template F - 字段配置类型,默认使用本地 Field 类型\n *\n * @property formData - 响应式表单数据对象,可直接读写,支持深层路径如 `formData.address.city`\n * @property getFormData - 获取指定路径的表单数据,支持点号分隔的深层路径,如 `getFormData('address.city')`\n * @property setFormData - 设置表单数据,支持三种调用方式:<br>\n * 1. `setFormData(path, value)` - 设置指定路径的值<br>\n * 2. `setFormData(path, prev => newVal)` - 函数式更新<br>\n * 3. `setFormData({ ... })` - 批量覆盖整个表单\n * @property fields - 字段配置数组(响应式 Ref),ProForm 根据此数组渲染表单字段\n * @property getField - 获取字段配置,支持路径字符串(如 `'name'`)或查找函数(如 `f => f.label === '姓名'`)\n * @property setField - 更新字段配置,默认合并模式(Object.assign),可通过 `{ updateType: 'rewrite' }` 覆盖\n * @property deleteField - 删除字段配置,支持 `{ all: true }` 批量删除所有匹配项\n * @property appendField - 在指定字段后追加新字段,传 `undefined` 则在末尾追加\n * @property prependField - 在指定字段前插入新字段,传 `undefined` 则在开头插入\n * @property getParentField - 获取指定字段的父级字段配置,用于嵌套字段场景\n * @property formRef - 底层 Element Plus Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetFields()` 等方法\n * @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n * const form: Form<User> = useForm({ name: '张三', age: 25 })\n *\n * form.formData.name // 直接读写响应式数据\n * form.getFormData('name') // 通过路径读取\n * form.setFormData('name', '李四') // 更新数据\n * form.formRef.value?.validate() // 访问底层 Form 实例\n * ```\n *\n * @public\n */\nexport type Form<\n D extends Data = Data,\n F extends Field<ComponentName, D> = Field<ComponentName, D>,\n> = _Form<D, F, FormInstance>;\n\n/**\n * 创建表单实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 所有内置组件类型推导)\n * - 表单实例 -> Element Plus 的 `FormInstance`(使 formRef 获得完整的类型提示)\n *\n * 表单实例组合了三个子模块的能力:\n * - **useFormData**:表单数据管理(响应式数据、读写、批量更新)\n * - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)\n * - **useFormRef**:底层 Form 组件实例引用\n *\n * @template D - 表单数据类型\n *\n * @param {ExtendWithAny<DeepPartial<D>>} [initFormData] - 初始表单数据\n * @param {Field<ComponentName, D>[]} [initFields] - 初始字段配置数组\n * @param {boolean} [root=true] - 是否为根表单。设为 `false` 时尝试从父组件注入获取表单实例\n *\n * @returns {Form<D>} 表单实例,包含数据操作、字段操作和 ref 操作\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * // 方式一:同时传入初始数据和字段\n * const form = useForm<User>(\n * { name: '张三', age: 25 },\n * [\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ],\n * true\n * )\n *\n * // 方式二:仅设置 root 标识\n * const form = useForm<User>(true)\n *\n * // 使用\n * const { formData, formRef, fields, setFormData, getField } = form\n * setFormData('name', '李四')\n * await formRef.value?.validate()\n * ```\n *\n * @see {@link coreUseForm} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useForm<D extends Data = Data>(\n initFormData?: ExtendWithAny<DeepPartial<D>>,\n initFields?: Field<ComponentName, D>[],\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm<D extends Data = Data>(\n root?: boolean\n): Form<D, Field<ComponentName, D>>;\nexport function useForm(...args: any[]) {\n return coreUseForm(...(args as any));\n}\n","import { Field } from '../../../types';\nimport { getInjectConfig } from '../../../../component-provider/constants';\nimport { inject } from 'vue';\n\ntype LocaleT = (\n key: string,\n params?: Record<string, string | number>\n) => string;\n\n/** 单值组件的占位符对应的 locale key */\nconst PLACEHOLDER_KEYS: Record<string, string> = {\n input: 'input.placeholder',\n 'input.textarea': 'input.placeholder',\n 'input.password': 'input.placeholder',\n 'input-number': 'input.placeholder',\n autocomplete: 'input.placeholder',\n select: 'select.placeholder',\n cascader: 'select.placeholder',\n 'tree-select': 'select.placeholder',\n 'date-picker': 'date-picker.placeholder',\n 'date-picker.date': 'date-picker.placeholder',\n 'date-picker.dates': 'date-picker.placeholder',\n 'date-picker.week': 'date-picker.placeholder',\n 'date-picker.month': 'date-picker.placeholder',\n 'date-picker.months': 'date-picker.placeholder',\n 'date-picker.year': 'date-picker.placeholder',\n 'date-picker.years': 'date-picker.placeholder',\n 'date-picker.datetime': 'date-picker.placeholder',\n 'time-picker': 'date-picker.placeholder',\n 'time-select': 'date-picker.placeholder',\n};\n\n/** 区间组件 start/end 占位符对应的 locale key */\nconst RANGE_PLACEHOLDER_KEYS: Record<string, [string, string]> = {\n 'date-picker.daterange': ['date-picker.start', 'date-picker.end'],\n 'date-picker.monthrange': ['date-picker.startMonth', 'date-picker.endMonth'],\n 'date-picker.yearrange': ['date-picker.startYear', 'date-picker.endYear'],\n 'date-picker.datetimerange': ['date-picker.startTime', 'date-picker.endTime'],\n};\n\n/**\n * 根据组件 key 兜底生成 locale 占位符\n *\n * @description 用户通过 componentVars 或字段属性显式设置了占位符时不再兜底。\n */\nconst getPlaceholderProps = (\n key: string,\n injectProps: Record<string, any>,\n t: LocaleT\n): Record<string, string> => {\n const rangeKeys = RANGE_PLACEHOLDER_KEYS[key];\n if (rangeKeys) {\n if (\n injectProps.startPlaceholder !== undefined ||\n injectProps.placeholder !== undefined\n )\n return {};\n return {\n startPlaceholder: t(rangeKeys[0]),\n endPlaceholder: t(rangeKeys[1]),\n };\n }\n const placeholderKey = PLACEHOLDER_KEYS[key];\n if (!placeholderKey || injectProps.placeholder !== undefined) return {};\n return { placeholder: t(placeholderKey) };\n};\n\nexport const getInitProps = (field: Field, t: LocaleT): Record<string, any> => {\n const { component, type } = field as any;\n if (typeof component === 'string') {\n const k = [component, type].filter(Boolean).join('.');\n const config = getInjectConfig(k);\n if (!config) return getPlaceholderProps(k, {}, t);\n const injectProps = inject(config.injectionKey, config.default);\n return { ...injectProps, ...getPlaceholderProps(k, injectProps, t) };\n }\n return {};\n};\n","/**\n * element-plus-pro 语言包(简体中文)\n *\n * @description 在 core 通用语言包基础上,扩展 element-plus 特有的\n * 日期/时间组件占位符文案。\n */\nimport { zhCN } from '@qin-ui/pro-components-core';\n\nexport default {\n ...zhCN,\n // 日期/时间选择器占位符(对应 INJECT_CONFIG 中 date-picker.* 的占位默认值)\n 'date-picker.placeholder': '请选择',\n 'date-picker.start': '开始日期',\n 'date-picker.end': '结束日期',\n 'date-picker.startMonth': '开始月份',\n 'date-picker.endMonth': '结束月份',\n 'date-picker.startYear': '开始年份',\n 'date-picker.endYear': '结束年份',\n 'date-picker.startTime': '开始时间',\n 'date-picker.endTime': '结束时间',\n} as const;\n","/**\n * element-plus-pro 语言包(繁體中文)\n *\n * @description 在 core 通用語言包基礎上,擴展 element-plus 特有的\n * 日期/時間元件佔位符文案。\n */\nimport { zhTW } from '@qin-ui/pro-components-core';\n\nexport default {\n ...zhTW,\n // 日期/時間選擇器佔位符(對應 INJECT_CONFIG 中 date-picker.* 的佔位預設值)\n 'date-picker.placeholder': '請選擇',\n 'date-picker.start': '開始日期',\n 'date-picker.end': '結束日期',\n 'date-picker.startMonth': '開始月份',\n 'date-picker.endMonth': '結束月份',\n 'date-picker.startYear': '開始年份',\n 'date-picker.endYear': '結束年份',\n 'date-picker.startTime': '開始時間',\n 'date-picker.endTime': '結束時間',\n} as const;\n","/**\n * element-plus-pro language pack (English)\n *\n * @description Extends the core language pack with element-plus specific\n * date/time picker placeholder texts.\n */\nimport { enUS } from '@qin-ui/pro-components-core';\n\nexport default {\n ...enUS,\n // Date/time picker placeholders (defaults of date-picker.* in INJECT_CONFIG)\n 'date-picker.placeholder': 'Please select',\n 'date-picker.start': 'Start date',\n 'date-picker.end': 'End date',\n 'date-picker.startMonth': 'Start month',\n 'date-picker.endMonth': 'End month',\n 'date-picker.startYear': 'Start year',\n 'date-picker.endYear': 'End year',\n 'date-picker.startTime': 'Start time',\n 'date-picker.endTime': 'End time',\n} as const;\n","/**\n * element-plus-pro locale 模块\n *\n * @description 提供 useLocale 组合式函数与语言包。\n * 语言自动跟随宿主应用的 element-plus `el-config-provider` locale 切换,\n * 也可通过 ProComponentProvider 的 `locale` prop 覆盖任意文案。\n */\nimport {\n computed,\n inject,\n toValue,\n type InjectionKey,\n type MaybeRef,\n} from 'vue';\nimport { useLocale as useElLocale } from 'element-plus';\nimport {\n format,\n resolveLocaleName,\n type ProLocaleName,\n} from '@qin-ui/pro-components-core';\nimport zhCN from './zh-CN';\nimport zhTW from './zh-TW';\nimport enUS from './en-US';\n\nexport { zhCN, zhTW, enUS };\n\nexport type ProLocale = typeof zhCN;\n\n/** ProComponentProvider 通过该 key 注入局部覆盖文案 */\nexport const LOCALE_INJECT_KEY: InjectionKey<\n MaybeRef<Partial<ProLocale> | undefined>\n> = Symbol('pro-locale');\n\n/**\n * 获取响应式 locale 文案\n *\n * @description 返回 `t` 翻译函数与当前语言名。\n * `t` 在 computed / 模板中调用时会随宿主语言切换自动更新。\n *\n * @returns\n * - `t(key, params?)` - 翻译函数,支持 `{placeholder}` 参数\n * - `lang` - 当前解析出的语言名('zh-CN' | 'zh-TW' | 'en-US')\n *\n * @example\n * ```ts\n * const { t } = useLocale();\n * t('table.query') // '查询' / '查詢' / 'Search'\n * t('pagination.total', { total: 100 }) // '共 100 条'\n * ```\n */\nexport const useLocale = () => {\n const { lang: elLang } = useElLocale();\n const override = inject(LOCALE_INJECT_KEY, undefined);\n\n const lang = computed<ProLocaleName>(() => resolveLocaleName(elLang.value));\n const pack = computed<Record<string, string>>(() =>\n lang.value === 'zh-TW' ? zhTW : lang.value === 'en-US' ? enUS : zhCN\n );\n\n const t = (key: string, params?: Record<string, string | number>): string => {\n const overrides = toValue(override) as Record<string, string> | undefined;\n const text =\n overrides?.[key] ?? (pack.value as Record<string, string>)[key] ?? key;\n return format(text, params);\n };\n\n return { t, lang };\n};\n","<script lang=\"ts\" setup>\n/**\n * @component BaseField\n * @description 字段级渲染组件,负责将 field 配置渲染为实际的输入组件\n *\n * ## 核心职责\n *\n * 1. **组件解析**:按优先级解析要渲染的组件(teleport 插槽 > 自定义组件 > 内置组件映射 > 原始值)\n * 2. **v-model 双向绑定**:通过 computed getter/setter 将组件值与 formData 的深层路径绑定\n * 3. **valueFormatter 处理**:支持 get/set 格式化函数,用于数据转换(如日期格式化)\n * 4. **属性合并**:将注入的默认 props、组件传入的 attrs 合并为最终属性\n *\n * ## 组件解析优先级\n *\n * ```\n * teleport 组件(ProForm 插槽注入)\n * ↓ 未匹配\n * 自定义组件(ProComponentProvider 的 componentMap)\n * ↓ 未匹配\n * 内置组件映射(componentMap: input → Input, select → Select ...)\n * ↓ 未匹配\n * 原始 component 值(可能是字符串或 Vue 组件对象)\n * ```\n *\n * @param {string | Component} [component] - 组件名或组件对象\n * @param {string} [path] - 字段路径,用于绑定表单数据\n *\n * @slot default - 默认插槽(透传给组件)\n */\nimport {\n type Component,\n computed,\n inject,\n mergeProps,\n ref,\n useAttrs,\n} from 'vue';\nimport { cloneDeep, omit } from '../../../../shared/core';\nimport { useDisabledContext } from '../../../../shared/ui';\nimport type { Field } from '../../types';\nimport { ContainerFragment, SlotComponent } from '..';\nimport { componentMap, TeleportComponentNamePrefix } from '../../constants';\nimport { INJECT_COMPONENTS } from '../../../component-provider/constants';\nimport { useForm } from '../../hooks/useForm';\nimport { getInitProps } from './utils';\nimport { useLocale } from '../../../../locale';\n\ndefineOptions({ name: 'BaseField', inheritAttrs: false });\n\ntype Props = {\n component?: string | Component;\n path?: string;\n};\nconst { component = undefined, path = '' } = defineProps<Props>();\n\nconst { t } = useLocale();\n\nconst form = useForm(false);\nconst { getFormData, setFormData } = form;\n\nconst componentRef = ref<any>();\n\nconst attrs: any = useAttrs();\n\nfunction getOldValue() {\n return cloneDeep(getFormData?.(path));\n}\n\n// setter: 向 formData 写入值,支持 valueFormatter / valueFormatter.set 转换\nconst value = computed({\n get() {\n let val = getFormData?.(path);\n const { valueFormatter } = groupedAttrs.value;\n if (\n typeof valueFormatter === 'object' &&\n typeof valueFormatter.get === 'function'\n ) {\n val = valueFormatter.get(val);\n }\n return val;\n },\n set(val) {\n let newVal = val;\n const { valueFormatter } = groupedAttrs.value;\n if (valueFormatter) {\n if (typeof valueFormatter === 'function') {\n newVal = valueFormatter(val, getOldValue());\n } else if (typeof valueFormatter.set === 'function') {\n newVal = valueFormatter.set(val, getOldValue());\n }\n }\n setFormData?.(path, newVal);\n },\n});\n\nconst parentDisabled = useDisabledContext();\n\n/*\n * 将注入的默认 props、外部传入的 attrs、field 配置合并为最终属性\n * 属性分为三类:绑定属性(v-model)、组件属性(传递给组件)、插槽(动态渲染)\n */\nconst groupedAttrs = computed(() => {\n const initProps = getInitProps(\n {\n component: component,\n type: attrs.type,\n } as unknown as Field,\n t\n );\n const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';\n const mergedProps = mergeProps(\n initProps,\n attrs,\n { class: attrs.componentClass, style: attrs.componentStyle },\n { class: initProps.componentClass, style: initProps.componentStyle },\n { disabled: attrs.disabled ?? parentDisabled.value ?? initProps.disabled },\n { modelProp: modelPropName }\n ) as Required<Field>;\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { valueFormatter, modelProp, slots, componentClass, componentStyle, componentContainer, ...rest } = mergedProps\n const modelBindingProp = modelProp ?? 'modelValue';\n // 从剩余属性中移除 v-model 绑定属性,避免重复绑定\n const bindAttrs = omit(rest as Record<string, any>, [\n modelBindingProp,\n `onUpdate:${modelBindingProp}`,\n ]);\n return {\n attrs: bindAttrs,\n slots,\n componentContainer,\n modelProp: modelBindingProp,\n valueFormatter,\n };\n});\n\n// 从 ProForm 插槽注入的 teleport 组件(优先级最高)\nconst teleportComponent = inject(\n `${TeleportComponentNamePrefix}${path}`,\n undefined\n);\n\n// 从 ProComponentProvider 注入的自定义组件映射\nconst customComponents = inject(INJECT_COMPONENTS, {});\n\n/*\n * 按优先级解析最终要渲染的组件:\n * teleport 插槽 → 自定义组件映射 → 内置组件映射 → 原始 component 值\n */\nconst is = computed(() => {\n if (teleportComponent) return teleportComponent;\n if (typeof component === 'string') {\n return (\n (customComponents as any)[component] ||\n (componentMap as any)[component] ||\n component\n );\n }\n return component;\n});\n\ndefineExpose({\n getComponentRef: () => componentRef.value,\n getComponentComputedProps: () => groupedAttrs.value.attrs as any,\n});\n</script>\n\n<template>\n <ContainerFragment :component=\"groupedAttrs.componentContainer\" :path=\"path\">\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\n :path=\"path\"\n >\n <template\n v-for=\"(slot, name) in groupedAttrs.slots\"\n :key=\"name\"\n #[name]=\"scoped\"\n >\n <SlotComponent :path=\"path\" v-bind=\"scoped\" :component=\"slot\" />\n </template>\n </component>\n </ContainerFragment>\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component ContainerFragment\n * @description 容器分片渲染组件。用于动态渲染表单行或表单项的外部包裹容器(例如 Grid 行、Col 列等布局容器)。\n *\n * @public\n */\nimport type { ContainerComponent } from '../../types';\n\ntype Props = {\n component?: ContainerComponent;\n};\n\ndefineProps<Props>();\n\ndefineOptions({ name: 'ContainerFragment', inheritAttrs: false });\n</script>\n\n<template>\n <component :is=\"component\" v-if=\"component\" v-bind=\"$attrs\">\n <slot />\n </component>\n <slot v-else />\n</template>\n","<script lang=\"ts\" setup>\n/**\n * @component SlotComponent\n * @description 插槽渲染辅助组件。用于在表单或表格的自定义插槽中动态渲染外部传入的 VNode、渲染函数或静态字符串。\n *\n * @public\n */\nimport { isVNode } from 'vue';\nimport { SlotComponentType } from '../../types';\n\ndefineOptions({ name: 'SlotComponent', inheritAttrs: false });\n\ntype Props = {\n component?: SlotComponentType;\n};\ndefineProps<Props>();\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-if=\"isVNode(component) || typeof component === 'function'\"\n v-bind=\"$attrs\"\n />\n <template v-else>{{ component }}</template>\n</template>\n","<script lang=\"ts\" setup generic=\"F extends Form<any> = Form\">\n/**\n * @component ProForm\n * @description @qin-ui/element-plus-pro 配置驱动表单组件\n *\n * 架构设计说明 (Architecture Overview)\n *\n * [ 数据层 (Core) ] => [ 绑定层 (ProForm) ] => [ 渲染层 (BaseFormItem / BaseField) ]\n *\n * 1. 数据隔离:ProForm 本身不负责存储和管理表单状态,所有核心状态(formData, fields, 校验规则)\n * 均交由底层的 `useForm`(@qin-ui/pro-components-core)驱动。\n * 2. 上下文透传:通过 `provide` 将核心状态下发给子组件,避免了深层嵌套的 Props 传递。\n * 3. 递归渲染:网格布局和具体字段的解析交由 `<BaseFormItem>` 递归完成,实现了 UI 布局与表单逻辑的解耦。\n *\n * 通过配置驱动的方式快速构建表单,支持:\n * - 字段联动、嵌套字段、自定义组件、网格布局\n *\n * @template F - 表单实例类型\n * @param {F} [form] - useForm 返回的表单实例\n * @param {boolean | GridProps} [grid=false] - 是否启用网格布局\n *\n * @slot default - 默认插槽\n * @slot [path] - 以字段 path 命名的动态插槽\n \n * @public\n */\nimport {\n Form as ElForm,\n FormProps as ElFormProps,\n} from '../../../../shared/ui';\nimport {\n inject,\n mergeProps,\n provide,\n type Slot,\n watchEffect,\n computed,\n useAttrs,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport { BaseFormItem } from '..';\nimport { InjectionFormKey, TeleportComponentNamePrefix } from '../../constants';\nimport type { Grid, VModelProps, PathProps } from '../../types';\nimport { Path, camelizeProperties } from '../../../../shared/core';\nimport type { Form } from '../../hooks/useForm';\n\ndefineOptions({ name: 'ProForm', inheritAttrs: false });\n\ntype FormProps = Partial<Omit<ElFormProps, 'model'>>;\n\ntype Props = { grid?: Grid; form?: F } & /* @vue-ignore */ FormProps;\nconst { grid = false, form = {} as F } = defineProps<Props>();\n\n/**\n * 依赖注入中心:\n * 将 Core 包生成的 Form 实例注入到 Vue 的 Context 中。\n * 供深层子组件(如 BaseFormItem, BaseField, 自定义插槽)跨层级直接访问数据和方法。\n */\nprovide(InjectionFormKey, form as F);\n\nconst { formData, fields, setFormRef } = form as F;\nconst _fields = computed(() => fields.value);\n\nconst config = INJECT_CONFIG['pro-form'];\nconst attrs = useAttrs();\n\n// 从 ProComponentProvider 获取全局配置,与传入的 props 合并\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst { grid: _injectGrid, ...injectAttrs } = inject(\n config.injectionKey,\n config.default\n);\n\ntype ExtractPath<T> = T extends Form<infer D> ? Path<D> : string;\ntype FieldSlotProps = VModelProps &\n PathProps & { disabled?: boolean; [x: string]: any };\ntype FieldSlots = Record<ExtractPath<F>, Slot<FieldSlotProps>>;\n\nconst slots = defineSlots<Partial<FieldSlots & { default: Slot }>>();\n\n/**\n * 动态插槽映射中心 (Slot Teleporting):\n * 目的:将 ProForm 上以 Field Path 命名的插槽,动态注册为全局可访问的 Context。\n * 实现:BaseField 组件在渲染对应字段时,会通过 inject 尝试获取对应的 Prefix+Path,\n * 如果存在,则将插槽内容渲染到深层的具体位置,从而突破了组件嵌套层级的限制。\n */\nwatchEffect(() => {\n Object.keys(slots).forEach(name => {\n if (name === 'default') return;\n provide(`${TeleportComponentNamePrefix}${name}`, (slots as any)[name]);\n });\n});\n</script>\n\n<template>\n <ElForm\n :ref=\"(el: any) => setFormRef?.(el)\"\n :model=\"formData\"\n v-bind=\"mergeProps(injectAttrs, camelizeProperties(attrs))\"\n class=\"pro-form\"\n @submit.prevent\n >\n <BaseFormItem :fields=\"_fields\" :grid=\"grid\" />\n <slot />\n </ElForm>\n</template>\n","import { FormItemInstance } from '../../../shared/ui';\nimport {\n useFields as coreUseFields,\n type UseFieldsReturn,\n} from '../../../shared/core';\nimport type { Data } from '../../../shared/core';\nimport type { Field, Fields } from '../types';\nimport type { ComponentName } from '../constants';\n\n/**\n * 字段配置管理 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFields`,将泛型参数绑定为 Element Plus 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Element Plus 组件类型推导)\n * - FormItem 实例 -> Element Plus 的 `FormItemInstance`\n *\n * 提供对字段配置数组的增删改查操作,支持:\n * - 通过路径字符串或查找函数定位字段\n * - 深层嵌套字段的遍历和匹配\n * - 字段配置的合并/覆盖更新\n * - 字段的添加、插入、删除\n * - 父级字段查找\n *\n * @template D - 表单数据类型\n * @param {Fields<D>} [initFields] - 初始字段配置数组\n *\n * @returns 字段操作对象,包含以下属性:\n * - `fields` - 字段配置数组(响应式 Ref\\<F[]\\>)\n * - `getField(path)` - 获取字段配置,支持路径字符串或查找函数\n * - `setField(path, field, options?)` - 更新字段配置,默认合并模式\n * - `deleteField(path, options?)` - 删除字段配置\n * - `appendField(path, field, options?)` - 在指定字段后追加\n * - `prependField(path, field, options?)` - 在指定字段前插入\n * - `getParentField(path, options?)` - 获取父级字段配置\n *\n * @example\n * ```ts\n * interface User { name: string; age: number }\n *\n * const { fields, getField, setField } = useFields<User>([\n * { path: 'name', label: '姓名', component: 'input' },\n * { path: 'age', label: '年龄', component: 'input-number' },\n * ])\n *\n * // 通过路径获取\n * getField('name')\n * // 通过查找函数获取\n * getField(f => f.label === '姓名')\n * // 更新字段(合并模式)\n * setField('name', { label: '用户名', disabled: true })\n * ```\n *\n * @see {@link coreUseFields} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFields<D extends Data = Data>(\n initFields?: Fields<D>\n): UseFieldsReturn<D, Field<ComponentName, D>, FormItemInstance>;\nexport function useFields(initFields?: any) {\n return coreUseFields(initFields);\n}\n\n/** useFields 返回值类型\n * @public\n */\nexport type UseFields<D extends Data = Data> = ReturnType<typeof useFields<D>>;\n","import {\n useFormRef as coreUseFormRef,\n type UseFormRefReturn,\n} from '../../../shared/core';\nimport type { FormInstance } from '../../../shared/ui';\n\n/**\n * 表单组件实例引用 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useFormRef`,将泛型参数绑定为 Element Plus 的 `FormInstance`,\n * 使 formRef 获取到完整的 Element Plus Form 组件 API 类型提示(如 `validate()`、`resetFields()` 等)。\n *\n * `formRef` 由 ProForm 组件内部自动通过 `setFormRef` 绑定,无需手动调用。\n *\n * @returns 表单组件实例引用管理对象:\n * - `formRef` — Element Plus Form 组件实例的响应式引用(`Ref<FormInstance | undefined>`)\n * - `setFormRef(inst)` — 设置 Form 组件实例,由 ProForm 内部自动调用\n *\n * @example\n * ```ts\n * const { formRef, setFormRef } = useFormRef()\n *\n * // formRef 由 ProForm 自动绑定,可直接使用\n * await formRef.value?.validate()\n * formRef.value?.resetFields()\n * formRef.value?.scrollToField('username')\n * ```\n *\n * @see {@link coreUseFormRef} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useFormRef(): UseFormRefReturn<FormInstance> {\n return coreUseFormRef();\n}\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"down\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z\"></path></svg>\n</template>\n","<script lang=\"ts\">\ntype Expand = {\n // 网格布局时默认展开行数量\n minExpandRows?: number;\n // 网格布局时展开状态\n expandStatus?: boolean;\n};\n\ntype _FormProps = Pick<\n Partial<FormProps>,\n | 'disabled'\n | 'labelPosition'\n | 'labelWidth'\n | 'inline'\n | 'inlineMessage'\n | 'statusIcon'\n | 'showMessage'\n | 'size'\n>;\n\ntype ButtonProps = { onClick: () => void };\ntype ExpandButtonProps = ButtonProps & { expandStatus: boolean };\n\nexport type SearchFormProps = {\n form: Form;\n layout?: 'grid' | 'inline';\n expand?: boolean | Expand;\n searchButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n resetButton?: Component<ButtonProps> | DefineComponent<ButtonProps> | false;\n expandButton?:\n | Component<ExpandButtonProps>\n | DefineComponent<ExpandButtonProps>\n | false;\n rowGap?: number;\n columnGap?: number;\n} & /* @vue-ignore */ _FormProps &\n AllowedComponentProps;\n</script>\n\n<script lang=\"ts\" setup>\n/**\n * @component SearchForm\n * @description ProTable 的搜索表单子组件\n *\n * ## 核心功能\n *\n * 1. 内部渲染 ProForm,使用 table.searchForm 管理搜索条件\n * 2. 支持 grid(网格)和 inline(行内)两种布局\n * 3. 网格布局下支持展开/折叠:通过 IntersectionObserver 自动检测哪些字段溢出\n * 4. 提供搜索、重置、展开/折叠按钮(支持自定义)\n *\n * ## 展开/折叠机制\n *\n * 1. 首次渲染后,测量 ProForm 的实际高度\n * 2. 根据 minExpandRows 计算折叠高度(默认 2 行)\n * 3. 如果实际高度 > 折叠高度,显示展开/折叠按钮\n * 4. 使用 IntersectionObserver 检测隐藏字段是否有值,有值则自动展开\n */\nimport { Space, Button, FormProps } from '../../../shared/ui';\nimport {\n AllowedComponentProps,\n computed,\n ref,\n watch,\n watchEffect,\n type Component,\n type DefineComponent,\n} from 'vue';\nimport ProForm from '../../form';\nimport { type Form } from '../../form';\nimport DownOutlined from './icons/DownOutlined.vue';\nimport { useLocale } from '../../../locale';\n\ndefineOptions({ name: 'SearchForm' });\n\nconst { t } = useLocale();\n\nconst {\n layout = 'grid',\n expand = true,\n searchButton = undefined,\n resetButton = undefined,\n expandButton = undefined,\n rowGap = 16,\n columnGap = 24,\n form,\n} = defineProps<SearchFormProps>();\n\ntype Emits = {\n (e: 'search'): void;\n (e: 'reset'): void;\n};\nconst emit = defineEmits<Emits>();\n\nconst proFormHeight = ref<'unset' | number>('unset');\nconst collapseHeight = ref(0);\nlet rowHeight = 32;\n\nconst computedExpand = computed(() => {\n if (!expand) return false;\n if (expand === true) return { minExpandRows: 2, expandStatus: false };\n return {\n minExpandRows: Math.max(Math.floor(expand.minExpandRows ?? 2), 1),\n expandStatus: expand.expandStatus ?? false,\n };\n});\n\nconst showExpandToggle = ref(false);\n\nconst expandStatus = ref(true);\n\nconst changeExpandStatus = () => {\n expandStatus.value = !expandStatus.value;\n};\n\nconst { formRef, getFormData } = form;\n\n/*\n * 使用 IntersectionObserver 检测折叠状态下隐藏字段是否有值\n * 如果有值则自动展开,让用户看到已填写的搜索条件\n */\nconst setInitExpandStatus = () => {\n expandStatus.value = false;\n if (formRef.value && expand) {\n const formEl = (formRef.value as any).$el;\n const formItemsEl = formEl.querySelectorAll(\n \"[class*='-form-item'] > [path]\"\n );\n const observer = new IntersectionObserver(\n entries => {\n expandStatus.value = entries.some(e => {\n // 如果隐藏字段(intersectionRatio === 0)有值,则自动展开\n if (e.intersectionRatio === 0) {\n const path = e.target.getAttribute('path');\n const searchFieldValue = path ? getFormData?.(path) : undefined;\n return ![null, undefined].includes(searchFieldValue);\n }\n return (expand as any).expandStatus;\n });\n observer.disconnect();\n },\n { root: formEl }\n );\n formItemsEl.forEach((element: Element) => {\n observer.observe(element);\n });\n }\n};\n\nwatch(\n [\n () => form?.fields.value?.filter((f: any) => !f.hidden)?.length,\n () => formRef.value,\n () => expand,\n ],\n () => {\n if (!expand || !expandStatus.value || !formRef.value) return;\n const proFormEl = (formRef.value as any)?.$el;\n const { height = 0 } = proFormEl?.getBoundingClientRect?.() || {};\n proFormHeight.value = height;\n rowHeight = proFormEl\n ?.querySelector(\"[class*='-form-item']\")\n ?.getBoundingClientRect?.()?.height;\n },\n { flush: 'post', immediate: true }\n);\n\n/*\n * 计算折叠高度和是否显示展开按钮\n * 折叠高度 = minExpandRows * 行高 + (minExpandRows - 1) * 行间距\n * 如果实际高度与折叠高度差异 > 1px,说明有字段溢出,显示展开按钮\n */\nwatchEffect(\n () => {\n if (typeof proFormHeight.value !== 'number') return;\n if (layout === 'grid' && computedExpand.value) {\n const { minExpandRows } = computedExpand.value;\n collapseHeight.value = Math.min(\n minExpandRows * rowHeight + (minExpandRows - 1) * rowGap,\n +proFormHeight.value\n );\n showExpandToggle.value = +proFormHeight.value - collapseHeight.value > 1;\n if (showExpandToggle.value) {\n setInitExpandStatus();\n }\n } else {\n showExpandToggle.value = false;\n }\n },\n { flush: 'post' }\n);\n\nconst layoutProps = computed(() =>\n layout === 'grid'\n ? {\n grid: {\n gutter: columnGap,\n style: { rowGap: `${rowGap}px` },\n },\n style: {\n display: 'flex',\n overflow: 'hidden',\n columnGap: `${columnGap}px`,\n height: `${expandStatus.value ? proFormHeight.value : collapseHeight.value}px`,\n },\n }\n : {\n inline: true,\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: `${rowGap}px ${columnGap}px`,\n },\n grid: false,\n }\n);\n\nconst onReset = () => {\n emit('reset');\n};\n\nconst onSearch = () => {\n emit('search');\n};\n</script>\n\n<template>\n <ProForm\n v-bind=\"layoutProps\"\n :form=\"form\"\n class=\"pro-table_search-form transition\"\n @keyup.enter=\"onSearch\"\n >\n <Space alignment=\"start\" class=\"pro-table_search-form_button-group\">\n <slot name=\"reset-button\" @click=\"onReset\">\n <template v-if=\"resetButton !== false\">\n <component :is=\"resetButton\" v-if=\"resetButton\" @click=\"onReset\" />\n <Button\n v-else\n class=\"pro-table_search-form_reset-button\"\n @click=\"onReset\"\n >{{ t('table.reset') }}</Button\n >\n </template>\n </slot>\n <slot name=\"search-button\" @click=\"onSearch\">\n <template v-if=\"searchButton !== false\">\n <component :is=\"searchButton\" v-if=\"searchButton\" @click=\"onSearch\" />\n <Button\n v-else\n class=\"pro-table_search-form_search-button\"\n type=\"primary\"\n native-type=\"submit\"\n @click=\"onSearch\"\n >\n {{ t('table.query') }}\n </Button>\n </template>\n </slot>\n <slot name=\"expand-button\" @click=\"changeExpandStatus\">\n <template v-if=\"expandButton !== false && showExpandToggle\">\n <component\n :is=\"expandButton\"\n v-if=\"expandButton\"\n :expand-status=\"expandStatus\"\n @click=\"changeExpandStatus\"\n />\n <Button\n v-else\n text\n class=\"pro-table_search-form_expand-toggle-button\"\n @click=\"changeExpandStatus\"\n >\n {{ expandStatus ? t('table.collapse') : t('table.expand') }}\n <DownOutlined\n class=\"transition\"\n style=\"margin-left: 4px\"\n :style=\"{ transform: `rotate(${expandStatus ? -180 : 0}deg)` }\"\n />\n </Button>\n </template>\n </slot>\n </Space>\n </ProForm>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form {\n :deep {\n [class*='-form-item'] {\n margin: 0;\n }\n }\n &_expand-toggle-button {\n display: flex;\n align-items: center;\n padding: 0;\n padding-left: 4px;\n }\n\n .transition {\n transition: all 0.25s;\n }\n}\n</style>\n","<template>\n <div class=\"pro-table_search-form-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_search-form-container {\n margin-bottom: 24px;\n padding: 24px;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <div class=\"pro-table_table-container\">\n <slot />\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_table-container {\n flex: 1;\n padding: 24px 24px 0;\n background-color: var(--el-bg-color, #fff);\n border-radius: 4px;\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"column-height\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 00-11.3 0L403.6 366.3a7.23 7.23 0 005.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Button,\n type TableProps,\n} from '../../../shared/ui';\nimport ColumnHeightOutlined from './icons/ColumnHeightOutlined.vue';\nimport { computed } from 'vue';\nimport { useLocale } from '../../../locale';\n\ntype Size = TableProps['size'];\n\nconst { t } = useLocale();\n\nconst size = defineModel<Size>('size');\n\nsize.value = size.value ?? 'default';\n\nconst items = computed<Array<{ label: string; key: NonNullable<Size> }>>(() => [\n { label: t('table.sizeDefault'), key: 'default' },\n { label: t('table.sizeMiddle'), key: 'large' },\n { label: t('table.sizeCompact'), key: 'small' },\n]);\n</script>\n\n<template>\n <Dropdown trigger=\"click\" @command=\"val => (size = val as any)\">\n <Button text class=\"pro-table_size-control_button\">\n <ColumnHeightOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-for=\"item in items\"\n :key=\"item.key\"\n :command=\"item.key\"\n :disabled=\"item.key === size\"\n >\n {{ item.label }}\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_size-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.3);\n }\n}\n</style>\n","<template>\n <!-- prettier-ignore -->\n <svg focusable=\"false\" data-icon=\"filter\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\" viewBox=\"64 64 896 896\"><path d=\"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z\"></path></svg>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n Button,\n Dropdown,\n DropdownMenu,\n DropdownItem,\n Checkbox,\n} from '../../../shared/ui';\nimport { computed, onMounted, ref, watch } from 'vue';\nimport type { Column, Columns, ColumnControlConfig } from '../types';\nimport { type Table } from '../useTable';\nimport FilterOutlined from './icons/FilterOutlined.vue';\nimport { useLocale } from '../../../locale';\n\ntype Props = {\n columns: Columns;\n table?: Table;\n columnControl?: ColumnControlConfig;\n};\nconst {\n columns,\n table = undefined,\n columnControl = undefined,\n} = defineProps<Props>();\n\nconst { t } = useLocale();\n\nconst open = ref(false);\nconst checkAll = ref(false);\nconst indeterminate = ref(false);\n\nconst getColumnKey = (column: Column, index: number) => {\n const key = column.key ?? column.prop;\n if (key === undefined || key === null) return `__idx_${index}`;\n return Array.isArray(key) ? key.join('.') : String(key);\n};\n\nconst checkedColumnsOptions = computed<\n Array<{\n label: string;\n value: string;\n checked: boolean;\n disabled: boolean;\n column: Column;\n }>\n>(() =>\n columns\n .map((item, index) => {\n const key = getColumnKey(item, index);\n const excluded = columnControl?.excludedKeys?.some(\n ek => String(ek) === key\n );\n const disabled = columnControl?.disabledKeys?.some(\n dk => String(dk) === key\n );\n const label = String(\n item.label ??\n item.prop ??\n t('table.columnFallback', { index: index + 1 })\n );\n return {\n label,\n value: key,\n checked: !item.hidden || !!disabled,\n disabled: !!disabled,\n column: item,\n excluded,\n };\n })\n .filter(item => !item.excluded)\n);\n\n/** 可被用户勾选/取消的列(非 disabled) */\nconst controllableOptions = computed(() =>\n checkedColumnsOptions.value.filter(item => !item.disabled)\n);\n\nconst checkedColumnKeys = computed({\n get() {\n return checkedColumnsOptions.value.flatMap(item =>\n item.checked ? item.value : []\n );\n },\n set(val: string[]) {\n checkedColumnsOptions.value.forEach(item => {\n if (item.disabled) return;\n table?.setColumn(item.value as any, {\n hidden: !val.includes(item.value),\n });\n });\n },\n});\n\nconst onCheckAllChange = (value: any) => {\n const checked = !!(value?.target?.checked ?? value);\n checkedColumnKeys.value = checked\n ? controllableOptions.value.map(item => item.value)\n : [];\n indeterminate.value = false;\n};\n\nconst toggleColumnsItem = (val: string) => {\n const item = checkedColumnsOptions.value.find(o => o.value === val);\n if (item?.disabled) return;\n if (checkedColumnKeys.value.includes(val)) {\n checkedColumnKeys.value = checkedColumnKeys.value.filter(\n item => item !== val\n );\n } else {\n checkedColumnKeys.value = [...checkedColumnKeys.value, val];\n }\n};\n\nwatch(\n checkedColumnKeys,\n () => {\n const controllableChecked = controllableOptions.value.filter(\n item => item.checked\n );\n indeterminate.value =\n !!controllableChecked.length &&\n controllableChecked.length < controllableOptions.value.length;\n checkAll.value =\n controllableChecked.length === controllableOptions.value.length &&\n controllableOptions.value.length > 0;\n },\n { immediate: true }\n);\n\n// 强制 disabledKeys 列始终展示\nonMounted(() => {\n columnControl?.disabledKeys?.forEach(key => {\n table?.setColumn(String(key), { hidden: false });\n });\n});\n\nwatch(\n () => columnControl?.disabledKeys,\n keys => {\n keys?.forEach(key => {\n table?.setColumn(String(key), { hidden: false });\n });\n },\n { deep: true }\n);\n</script>\n\n<template>\n <Dropdown\n trigger=\"click\"\n :hide-on-click=\"false\"\n :visible=\"open\"\n @visible-change=\"val => (open = val)\"\n >\n <Button text class=\"pro-table_column-control_button\">\n <FilterOutlined />\n </Button>\n <template #dropdown>\n <DropdownMenu>\n <DropdownItem\n v-if=\"!columnControl?.disableCheckAll\"\n :disabled=\"true\"\n :divided=\"false\"\n >\n <Checkbox\n :model-value=\"checkAll\"\n :indeterminate=\"indeterminate\"\n @change=\"onCheckAllChange\"\n >\n {{ t('table.selectAll') }}\n </Checkbox>\n </DropdownItem>\n <DropdownItem\n v-for=\"item in checkedColumnsOptions\"\n :key=\"item.value\"\n :command=\"item.value\"\n @click.stop=\"toggleColumnsItem(item.value)\"\n >\n <Checkbox :model-value=\"item.checked\" :disabled=\"item.disabled\">\n {{ item.label }}\n </Checkbox>\n </DropdownItem>\n </DropdownMenu>\n </template>\n </Dropdown>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table_column-control_button {\n display: flex;\n align-items: center;\n padding-right: 12px;\n padding-left: 12px;\n\n :deep(svg) {\n transform: scale(1.2, 1.4);\n }\n}\n</style>\n","<script\n lang=\"ts\"\n setup\n generic=\"D extends Record<string, any> = Record<string, any>\"\n>\nimport { get, toPath } from '../../../shared/core';\nimport { TableColumn } from '../../../shared/ui';\nimport type { Column, Columns } from '../types';\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'TableColumnRenderer' });\n\ntype Props = {\n columns: Columns<D>;\n};\nconst { columns } = defineProps<Props>();\n\nconst getColumnKey = (column: Column<D>, index: number) => {\n const key = column.key ?? column.prop;\n if (key === undefined || key === null) return `__idx_${index}`;\n return Array.isArray(key) ? key.join('.') : String(key);\n};\n\nconst getCellValue = (row: Record<string, any>, column: Column<D>) => {\n const path = column.prop;\n if (!path) return undefined;\n return get(row, toPath(path));\n};\n\nconst normalizedColumns = computed(() => {\n return columns.filter(column => !column.hidden);\n});\n\nconst getColumnProps = (column: Column<D>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { hidden, render, key, ...rest } = column;\n const prop = Array.isArray(column.prop)\n ? column.prop.join('.')\n : column.prop\n ? String(column.prop)\n : undefined;\n return {\n ...rest,\n prop,\n columnKey: key ? String(key) : prop,\n };\n};\n</script>\n\n<template>\n <template\n v-for=\"(column, index) in normalizedColumns\"\n :key=\"getColumnKey(column, index)\"\n >\n <TableColumn v-bind=\"getColumnProps(column)\">\n <template #default=\"scope\">\n <template v-if=\"typeof column.render === 'function'\">\n <component\n :is=\"\n column.render?.({\n ...scope,\n column,\n cellValue: getCellValue(scope.row, column),\n })\n \"\n />\n </template>\n </template>\n </TableColumn>\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"T extends Table<any> = Table\">\n/**\n * @component ProTable\n * @description 配置驱动的表格组件\n *\n * ## 架构概览\n *\n * ProTable 是表格系统的顶层容器,负责:\n * 1. 接收 useTable() 创建的表格实例,驱动列、数据源、分页的渲染\n * 2. 内部集成 SearchForm 搜索区域(基于 ProForm)\n * 3. 支持列动态控制(显示/隐藏)和尺寸控制\n * 4. 将分页变化和搜索事件串联到数据查询流程\n *\n * ## 数据流\n *\n * ```\n * useTable({ columns, dataSource, searchFields, ... })\n * ↓ 传入 :table prop\n * ProTable\n * ├── SearchForm (使用 table.searchForm 管理搜索条件)\n * │ └── ProForm\n * ├── SizeControl (表格尺寸切换)\n * ├── ColumnControl (列显示/隐藏)\n * └── ElTable (element-plus Table)\n * └── 转发所有 table 插槽\n * ```\n *\n * ## 搜索流程\n *\n * 1. 用户点击搜索 → SearchForm @search → searchPage1st()\n * 2. searchPage1st 重置分页到第一页,触发 _search()\n * 3. 分页变化 → onTableChange → setPageParam + _search()\n * 4. 重置 → reset() → resetQueryParams + _search()\n */\nimport {\n Pagination as ElPagination,\n type PaginationProps,\n Table as ElTable,\n type TableProps,\n tableProps,\n paginationProps,\n} from '../../../shared/ui';\nimport {\n computed,\n nextTick,\n useAttrs,\n onMounted,\n inject,\n type Slot,\n useSlots,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../component-provider/constants';\nimport { ContainerFragment } from '../../form';\nimport type { ContainerComponent } from '../../form/types';\nimport SearchForm from './SearchForm.vue';\nimport type { SearchFormProps } from './SearchForm.vue';\nimport type { Table } from '../useTable';\nimport { useLocale } from '../../../locale';\nimport {\n camelizeProperties,\n getObject,\n pick,\n Path,\n} from '../../../shared/core';\nimport {\n DefaultSearchFormContainer,\n DefaultTableContainer,\n SizeControl,\n ColumnControl,\n} from '.';\nimport type { Columns, ColumnControlConfig } from '../types';\nimport TableColumnRenderer from './TableColumnRenderer.vue';\n\ndefineOptions({ name: 'ProTable', inheritAttrs: false });\n\ntype Control = {\n sizeControl: boolean;\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n};\n\ntype SearchFormConfig = Omit<SearchFormProps, 'form'> & {\n // 是否隐藏搜索表单\n hidden?: boolean;\n // 搜索区域包裹容器\n container?: ContainerComponent | false;\n};\n\ntype ReturnTableRecord<V> = V extends Table<any, infer R> ? R : any;\ntype RecordType = ReturnTableRecord<T>;\n\ntype Props = {\n // 列表表格对象,returns from useTable\n table?: T;\n // 列表数据查询方法\n search?: () => Promise<unknown>;\n // 是否在首列插入index列\n addIndexColumn?: boolean;\n // onMounted 时立即触发一次 search 事件\n immediateSearch?: boolean;\n // 是否展示表格 size 和 column 控制按钮\n control?: boolean | Partial<Control>;\n // 搜索栏查询字段表单配置\n searchFormConfig?: SearchFormConfig;\n // 表格区域包裹容器\n tableContainer?: ContainerComponent | false;\n columns?: Columns<RecordType>;\n data?: RecordType[];\n pagination?: false | Partial<PaginationProps>;\n} & Omit<TableProps, 'data'>;\n\nconst {\n table = undefined,\n search = undefined,\n addIndexColumn = undefined,\n control = undefined,\n tableContainer = undefined,\n immediateSearch = undefined,\n searchFormConfig = undefined,\n columns = undefined,\n data = undefined,\n pagination = undefined,\n} = defineProps<Props>();\n\nconst { t } = useLocale();\n\nconst config = INJECT_CONFIG['pro-table'];\nconst injectProps = inject(config.injectionKey, config.default) as any;\n\nconst tableProperties = Object.keys(tableProps());\nconst paginationProperties = Object.keys(paginationProps());\n\nconst attrs = useAttrs() as Record<string, any>;\n\nconst injectTableAttrs = computed(() => {\n return pick(injectProps, tableProperties) as Partial<TableProps>;\n});\n\nconst attrsTableProps = computed(() => {\n return pick(\n camelizeProperties(attrs),\n tableProperties\n ) as Partial<TableProps>;\n});\n\nconst {\n columns: tableColumns,\n data: tableData,\n searchForm,\n pageParam,\n setPageParam,\n} = table || {};\n\nconst size = defineModel<TableProps['size']>('size');\nconst loading = defineModel<boolean>('loading');\n\n// 核心搜索方法:设置 loading 状态,调用外部 search 函数\nconst _search = async () => {\n try {\n loading.value = true;\n await search?.();\n } finally {\n loading.value = false;\n }\n};\n\n// 重置:恢复查询参数到初始值,重新搜索\nconst reset = () => {\n table?.resetQueryParams();\n nextTick(() => {\n _search();\n });\n};\n\ntype CustomSlots = Readonly<\n Partial<Record<'search-form' | 'button-bar' | 'toolbar' | 'table', Slot>>\n>;\n\ntype Slots = CustomSlots & Readonly<Record<string, Slot>>;\n\nconst slots = useSlots() as Slots;\nconst searchFormSlot = slots['search-form'];\nconst buttonBarSlot = slots['button-bar'];\nconst toolbarSlot = slots['toolbar'];\n\nconst tableSlots = computed(() => {\n const customNames = new Set([\n 'search-form',\n 'button-bar',\n 'toolbar',\n 'table',\n ]);\n return Object.fromEntries(\n Object.entries(slots).filter(([name]) => !customNames.has(name))\n ) as Record<string, Slot>;\n});\nconst tableSlotNames = computed(() => Object.keys(tableSlots.value));\n\nconst searchPage1st = () => {\n setPageParam?.({ current: 1 });\n _search();\n};\n\nconst computedSearchFormConfig = computed(() => {\n const container =\n searchFormConfig?.container ??\n injectProps.searchFormConfig?.container ??\n DefaultSearchFormContainer;\n return {\n ...injectProps.searchFormConfig,\n ...getObject(searchFormConfig),\n container: container ? container : undefined,\n };\n});\n\nconst computedTableContainer = computed(() => {\n const container =\n tableContainer ?? injectProps.tableContainer ?? DefaultTableContainer;\n return container ? container : undefined;\n});\n\nconst normalizedRawColumns = computed(() => {\n const source = (columns ?? tableColumns?.value ?? []) as any[];\n\n const normalized = source.map((item, index) => {\n const current: any = { ...item };\n if (current.label === undefined && current.title !== undefined) {\n current.label = current.title;\n }\n if (current.prop === undefined && current.dataIndex !== undefined) {\n current.prop = Array.isArray(current.dataIndex)\n ? current.dataIndex.join('.')\n : current.dataIndex;\n }\n if (current.key === undefined) {\n current.key =\n current.prop ??\n (typeof current.columnKey === 'string'\n ? current.columnKey\n : undefined) ??\n `col-${index}`;\n }\n return current;\n });\n if (addIndexColumn ?? injectProps.addIndexColumn) {\n return [\n {\n key: '_index',\n type: 'index',\n label: t('table.index'),\n width: 80,\n },\n ...normalized,\n ];\n }\n return normalized;\n});\n\nconst computedDataSource = computed<any[]>(() => {\n const attrsData = attrsTableProps.value.data as any[] | undefined;\n return data ?? attrsData ?? tableData?.value ?? [];\n});\n\nconst computedTableProps = computed<TableProps>(() => {\n const merged = {\n ...injectTableAttrs.value,\n ...attrsTableProps.value,\n } as TableProps;\n delete (merged as any).data;\n return merged;\n});\n\nconst computedPagination = computed<false | Partial<PaginationProps>>(() => {\n if (pagination === false) return false;\n const pageConfig = pagination ?? {};\n return {\n ...injectProps.pagination,\n ...pick(pageConfig as Record<string, any>, paginationProperties),\n currentPage: (pageConfig as any).currentPage ?? pageParam?.current ?? 1,\n pageSize: (pageConfig as any).pageSize ?? pageParam?.pageSize ?? 10,\n total: (pageConfig as any).total ?? pageParam?.total ?? 0,\n };\n});\n\nconst showPagination = computed(() => computedPagination.value !== false);\n\nconst onCurrentChange = (current: number) => {\n setPageParam?.({ current });\n _search();\n};\n\nconst onSizeChange = (pageSize: number) => {\n setPageParam?.({ pageSize, current: 1 });\n _search();\n};\n\nconst onPaginationChange = (currentPage: number, pageSize: number) => {\n attrs.onChange?.(currentPage, pageSize);\n};\n\nconst showSearch = computed(() => {\n return !!(\n searchFormSlot ||\n (computedSearchFormConfig.value?.hidden !== true &&\n searchForm &&\n searchForm.fields.value.filter(item => !item.hidden)?.length > 0)\n );\n});\n\nconst computedControl = computed<{\n sizeControl: boolean;\n columnControl: boolean | ColumnControlConfig<Path<RecordType>>;\n}>(() => {\n const mergedControl = control ?? injectProps.control;\n if (typeof mergedControl === 'boolean') {\n return { sizeControl: mergedControl, columnControl: mergedControl };\n }\n const c = mergedControl as Control;\n const sizeControl = c.sizeControl ?? true;\n const columnControl = c.columnControl ?? true;\n return { sizeControl: !!sizeControl, columnControl };\n});\n\nconst columnControlConfig = computed(() => {\n const cc = computedControl.value.columnControl;\n return typeof cc === 'object' ? cc : undefined;\n});\n\nconst resolvedSize = computed(() => {\n return (\n size.value ??\n (attrsTableProps.value.size as any) ??\n injectTableAttrs.value.size\n );\n});\n\nonMounted(() => {\n if (immediateSearch ?? injectProps.immediateSearch) {\n _search();\n }\n});\n</script>\n\n<template>\n <div\n class=\"pro-table\"\n :class=\"($attrs as any).class\"\n :style=\"($attrs as any).style\"\n >\n <ContainerFragment\n v-if=\"showSearch\"\n :component=\"computedSearchFormConfig.container\"\n >\n <slot name=\"search-form\">\n <SearchForm\n v-if=\"searchForm\"\n :form=\"searchForm\"\n v-bind=\"computedSearchFormConfig\"\n @search=\"searchPage1st\"\n @reset=\"reset\"\n />\n </slot>\n </ContainerFragment>\n\n <ContainerFragment :component=\"computedTableContainer\">\n <div class=\"pro-table_header\">\n <div v-if=\"buttonBarSlot\" class=\"pro-table_header_button-bar\">\n <slot name=\"button-bar\" />\n </div>\n <div v-if=\"toolbarSlot\" class=\"pro-table_header_toolbar\">\n <slot name=\"toolbar\" />\n </div>\n <div\n v-if=\"computedControl.sizeControl\"\n class=\"pro-table_header_size-control\"\n >\n <SizeControl v-model:size=\"size\" />\n </div>\n <div\n v-if=\"computedControl.columnControl\"\n class=\"pro-table_header_column-control\"\n >\n <ColumnControl\n :columns=\"normalizedRawColumns\"\n :table=\"table\"\n :column-control=\"columnControlConfig\"\n />\n </div>\n </div>\n\n <slot name=\"table\">\n <ElTable\n v-loading=\"loading\"\n class=\"pro-table_content\"\n v-bind=\"computedTableProps\"\n :size=\"resolvedSize\"\n :data=\"computedDataSource\"\n >\n <TableColumnRenderer :columns=\"normalizedRawColumns\" />\n <template v-for=\"name in tableSlotNames\" :key=\"name\" #[name]=\"scoped\">\n <slot :name=\"name\" v-bind=\"scoped\" />\n </template>\n </ElTable>\n </slot>\n\n <ElPagination\n v-if=\"showPagination\"\n class=\"pro-table_pagination\"\n v-bind=\"computedPagination\"\n @current-change=\"onCurrentChange\"\n @size-change=\"onSizeChange\"\n @change=\"onPaginationChange\"\n />\n </ContainerFragment>\n </div>\n</template>\n\n<style scoped lang=\"less\">\n.pro-table {\n &_header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n &:empty {\n display: none;\n }\n\n & + &_content {\n margin-top: 16px;\n }\n\n &_button-bar {\n flex: 1;\n }\n\n &_toolbar {\n margin-left: 12px;\n }\n }\n\n &_pagination {\n justify-content: flex-end;\n padding: 16px 0;\n }\n}\n</style>\n","import {\n useTable as coreUseTable,\n type Table as _Table,\n} from '../../shared/core';\nimport type {\n Data,\n ExtendWithAny,\n DeepPartial,\n PageParam,\n} from '../../shared/core';\nimport { Fields } from '../form/types';\nimport type { Column, Columns } from './types';\nimport type { Ref } from 'vue';\n\n/**\n * 表格实例类型\n *\n * @description 在 core Table 类型的基础上,将列类型 C 绑定为本地 Column<T>,\n * 并将 dataSource 重命名为 data(Element Plus 使用 data 而非 dataSource),\n * 使 columns 操作获得 Element Plus 表格列的完整属性类型提示。\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型(一行数据的类型)\n *\n * @property columns - 列配置数组(响应式 Ref),用于渲染表格列\n * @property data - 表格数据源(响应式 Ref),对应 Element Plus Table 的 data 属性\n * @property pageParam - 分页参数(响应式 reactive),包含 current、pageSize、total\n * @property searchForm - 搜索表单实例(Form 类型),用于管理搜索区域的字段和数据\n * @property setColumn - 更新列配置,支持合并/覆盖两种模式,用法同 setField\n * @property deleteColumn - 删除列,支持路径或查找函数\n * @property appendColumn - 在指定列后追加新列,传 undefined 在末尾追加\n * @property prependColumn - 在指定列前插入新列,传 undefined 在开头插入\n * @property setPageParam - 设置分页参数,支持部分更新和函数式更新\n * @property resetQueryParams - 重置分页到第一页并恢复搜索条件到初始值\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number }\n *\n * const table: Table<SearchParams, User> = useTable({\n * columns: [{ prop: 'name', title: '姓名' }],\n * })\n *\n * table.columns.value // 访问列配置\n * table.setColumn('name', { width: 150 }) // 更新列\n * table.setPageParam({ current: 2 }) // 切换页码\n * table.searchForm.setFormData('keyword', '搜索词') // 操作搜索表单\n * ```\n *\n * @public\n */\nexport type Table<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = Omit<_Table<D, T, Column<T>>, 'dataSource'> & {\n /**\n * Element Plus 数据源(与 core 的 dataSource 对应)\n */\n data: Ref<T[]>;\n};\n\ntype UseTableParams<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n> = {\n /** 列配置数组 */\n columns?: Columns<T>;\n /** 数据源数组(Element Plus 使用 data 而非 dataSource) */\n data?: T[];\n /** 初始分页参数 */\n pageParam?: PageParam;\n /** 初始搜索参数 */\n searchParam?: ExtendWithAny<DeepPartial<D>>;\n /** 搜索表单字段配置 */\n searchFields?: Fields<D>;\n};\n\n/**\n * 创建表格实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useTable` 封装,适配 Element Plus 的 API 风格:\n * - 数据源使用 `data` 而非 `dataSource`\n *\n * 是 ProTable 组件的核心 Hook,提供了:\n * - 列配置管理(增删改查)\n * - 数据源管理\n * - 分页管理\n * - 搜索表单集成(内部使用 useForm)\n * - 查询参数重置\n *\n * @template D - 搜索表单数据类型\n * @template T - 表格行数据类型\n *\n * @param {object} params - 表格配置参数\n * @param {Columns<T>} [params.columns] - 初始列配置数组\n * @param {T[]} [params.data] - 初始数据源(Element Plus 风格)\n * @param {PageParam} [params.pageParam] - 初始分页参数,默认 `{ current: 1, pageSize: 10, total: 0 }`\n * @param {ExtendWithAny<DeepPartial<D>>} [params.searchParam] - 初始搜索参数\n * @param {Fields<D>} [params.searchFields] - 搜索表单字段配置\n *\n * @returns {Table<D, T>} 表格实例\n *\n * @example\n * ```ts\n * interface SearchParams { keyword: string }\n * interface User { name: string; age: number; email: string }\n *\n * const table = useTable<SearchParams, User>({\n * columns: [\n * { prop: 'name', title: '姓名', width: 120 },\n * { prop: 'age', title: '年龄', width: 80 },\n * ],\n * data: [],\n * pageParam: { current: 1, pageSize: 20, total: 0 },\n * searchParam: { keyword: '' },\n * searchFields: [\n * { path: 'keyword', label: '关键词', component: 'input' },\n * ],\n * })\n * ```\n *\n * @see {@link coreUseTable} 底层核心实现(来自 @qin-ui/pro-components-core)\n *\n * @public\n */\nexport function useTable<\n D extends Data = Data,\n T extends Data = ExtendWithAny<D>,\n>(params: UseTableParams<D, T> = {}): Table<D, T> {\n const { data, columns, ...rest } = params;\n const coreTable = (coreUseTable as any)({\n ...rest,\n dataSource: data,\n // 补齐列 key(key ?? prop ?? columnKey),\n // 使 setColumn 等按 key 匹配的 API 对 Element Plus 的 prop 列生效\n columns: columns?.map(column => {\n if (column.key !== undefined && column.key !== null) return column;\n const prop = Array.isArray(column.prop)\n ? column.prop.join('.')\n : column.prop;\n const fallback =\n prop ??\n (typeof column.columnKey === 'string' ? column.columnKey : undefined);\n return { ...column, key: fallback };\n }),\n }) as _Table<D, T, Column<T>>;\n\n const { dataSource, ...tableWithoutDataSource } = coreTable as any;\n const table = {\n ...tableWithoutDataSource,\n data: dataSource as Ref<T[]>,\n } as Table<D, T>;\n\n return table;\n}\n","<script lang=\"ts\" setup>\n/**\n * @component ProComponentProvider\n * @description @qin-ui/element-plus-pro 全局配置提供者组件\n *\n * 用于在组件树的顶层配置所有子组件的全局默认属性。\n *\n * @param {ComponentVars} [componentVars] - 组件全局配置变量\n * @param {Record<ComponentName, any>} [componentMap] - 自定义组件映射\n * @param {Partial<ProLocale>} [locale] - 内置文案覆盖,可覆盖任意 locale 文案(如查询/重置/序号/占位符等)\n *\n * @slot default - 子组件内容\n *\n * @example\n * ```vue\n * <ProComponentProvider\n * :componentVars=\"{ 'input': { placeholder: '请输入' } }\"\n * >\n * <ProForm :form=\"form\" />\n * </ProComponentProvider>\n * ```\n \n * @public\n */\nimport { ComponentVars } from '../types';\nimport { INJECT_COMPONENTS, ensureInjectConfig } from '../constants';\nimport { computed, provide } from 'vue';\nimport { getObject } from '../../../shared/core';\nimport { ComponentName } from '../../form/constants';\nimport { LOCALE_INJECT_KEY, type ProLocale } from '../../../locale';\n\ntype ComponentMap = Partial<Record<ComponentName, any>>;\n\ndefineOptions({\n name: 'ProComponentProvider',\n inheritAttrs: false,\n});\n\ntype Props = {\n /** 组件全局配置,可配置所有内置组件的默认属性 */\n componentVars?: ComponentVars;\n /** 自定义组件映射,用于替换或扩展内置组件 */\n componentMap?: ComponentMap;\n /**\n * 内置文案覆盖,可覆盖任意 locale 文案(如查询/重置/序号/占位符等),\n * 未覆盖的文案默认跟随宿主组件库语言自动切换\n */\n locale?: Partial<ProLocale>;\n};\n\nconst props = defineProps<Props>();\n\n/*\n * 遍历 componentVars 的每个 key,获取或创建对应的 inject 配置\n * 将用户提供的值合并到默认值上,通过 provide 注入到子组件树\n * 子组件通过 inject(config.injectionKey) 获取合并后的配置\n */\nif (props.componentVars) {\n Object.entries(props.componentVars).forEach(([key, val]) => {\n const config = ensureInjectConfig(key);\n // 用户配置覆盖默认值\n provide(config.injectionKey, { ...config.default, ...getObject(val) });\n });\n}\n\n// 注入自定义组件映射,BaseField 在解析组件时会优先使用此映射\nif (props.componentMap) {\n provide(INJECT_COMPONENTS, props.componentMap);\n}\n\n// 注入内置文案覆盖,useLocale 在解析文案时会优先使用\nprovide(\n LOCALE_INJECT_KEY,\n computed(() => props.locale)\n);\n</script>\n\n<template>\n <slot />\n</template>\n","import type { App } from 'vue';\nimport ProForm from './components/form';\nimport ProTable from './components/table';\nimport ProComponentProvider from './components/component-provider';\n\nexport * from './components/form';\nexport * from './components/table';\nexport * from './components/component-provider';\nexport * from './locale';\n\n/**\n * Schema 驱动的表单组件,基于 element-plus Form 封装\n *\n * @description 通过声明式 JSON Schema 配置即可快速生成表单,\n * 提供极致的 TypeScript 类型推导与组件库插槽扩展能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProForm, useForm } from '@qin-ui/element-plus-pro'\n * const form = useForm<User>({ name: '' }, [\n * { path: 'name', label: '姓名', component: 'input' }\n * ])\n * </script>\n * <template>\n * <ProForm :form=\"form\" />\n * </template>\n * ```\n *\n * Schema 驱动的表格组件,基于 element-plus Table 封装\n *\n * @description 通过声明式列配置即可生成功能完整的表格,\n * 支持列动态控制、搜索表单集成、分页管理等企业级能力。\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ProTable, useTable } from '@qin-ui/element-plus-pro'\n * const table = useTable<User>({ columns: [{ key: 'name', title: '姓名' }] })\n * </script>\n * <template>\n * <ProTable :table=\"table\" />\n * </template>\n * ```\n *\n * 组件提供者,用于全局配置 ProForm 和 ProTable 的默认行为\n *\n * @description 通过 `ProComponentProvider` 包裹应用根组件,\n * 可以全局覆盖组件的默认属性(如表单布局、表格尺寸等)。\n *\n * @example\n * ```vue\n * <template>\n * <ProComponentProvider :component-props=\"customProps\">\n * <App />\n * </ProComponentProvider>\n * </template>\n * ```\n */\nexport { ProForm, ProTable, ProComponentProvider };\n\nexport default {\n /**\n * @qin-ui/element-plus-pro 安装方法\n * @description 全局注册所有组件(ProForm、ProTable、ProComponentProvider)\n *\n * @param {App} app - Vue 应用实例\n *\n * @example\n * ```ts\n * import { createApp } from 'vue'\n * import ProComponents from '@qin-ui/element-plus-pro'\n * const app = createApp(App)\n * app.use(ProComponents)\n * ```\n */\n install(app: App) {\n app.component(ProForm.name, ProForm);\n app.component(ProTable.name, ProTable);\n app.component(ProComponentProvider.name!, ProComponentProvider);\n },\n};\n"],"names":["Table","Pagination","GridItem","FormItem","Input","InputNumber","AutoComplete","Select","Cascader","DatePicker","TimePicker","TimeSelect","CheckboxGroup","RadioGroup","Switch","Slider","TreeSelect","Transfer","_renderSlot","gridItemProps","formItemProps","index","_openBlock","_createBlock","_unref","_mergeProps","ElGrid","_createElementBlock","_Fragment","PathProvider","_withCtx","_createVNode","GroupedFieldAttrs","ElGridItem","ContainerFragment","coreUseForm","zhCN","zhTW","enUS","useElLocale","_resolveDynamicComponent","_renderList","SlotComponent","_normalizeProps","$attrs","_useSlots","coreUseFields","coreUseFormRef","_hoisted_1","_createElementVNode","ProForm","Space","Button","_createTextVNode","_toDisplayString","_normalizeStyle","_useModel","Dropdown","DropdownMenu","DropdownItem","item","_a","Checkbox","_withModifiers","_normalizeClass","_withDirectives","TableColumnRenderer","_guardReactiveProps","coreUseTable","ProComponentProvider"],"mappings":"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"}