@qin-ui/vant-pro 1.0.5 → 1.1.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 (87) hide show
  1. package/AI-CONTEXT.md +48 -33
  2. package/LICENSE +9 -0
  3. package/README.md +1 -1
  4. package/api.json +27 -22
  5. package/es/component-provider/{index-DC_k4_R3.js → index-cldbPMDQ.js} +5 -4
  6. package/es/component-provider/index-cldbPMDQ.js.map +1 -0
  7. package/es/component-provider/index.js +2 -1
  8. package/es/component-provider/index.js.map +1 -0
  9. package/es/components/component-provider/components/index.vue.d.ts +27 -0
  10. package/es/components/component-provider/components/index.vue.d.ts.map +1 -0
  11. package/es/components/component-provider/constants/index.d.ts +16 -0
  12. package/es/components/component-provider/constants/index.d.ts.map +1 -0
  13. package/es/components/component-provider/index.d.ts +4 -0
  14. package/es/components/component-provider/index.d.ts.map +1 -0
  15. package/es/components/component-provider/types/index.d.ts +16 -0
  16. package/es/components/component-provider/types/index.d.ts.map +1 -0
  17. package/es/components/form/components/BaseField/index.vue.d.ts +1323 -0
  18. package/es/components/form/components/BaseField/index.vue.d.ts.map +1 -0
  19. package/es/components/form/components/BaseField/utils/index.d.ts +3 -0
  20. package/es/components/form/components/BaseField/utils/index.d.ts.map +1 -0
  21. package/es/components/form/components/BaseFormItem/index.vue.d.ts +7 -0
  22. package/es/components/form/components/BaseFormItem/index.vue.d.ts.map +1 -0
  23. package/es/components/form/components/ContainerFragment/index.vue.d.ts +23 -0
  24. package/es/components/form/components/ContainerFragment/index.vue.d.ts.map +1 -0
  25. package/es/components/form/components/GroupedFieldAttrs/index.vue.d.ts +24 -0
  26. package/es/components/form/components/GroupedFieldAttrs/index.vue.d.ts.map +1 -0
  27. package/es/components/form/components/PathProvider/index.vue.d.ts +23 -0
  28. package/es/components/form/components/PathProvider/index.vue.d.ts.map +1 -0
  29. package/es/components/form/components/ProForm/index.vue.d.ts +34 -0
  30. package/es/components/form/components/ProForm/index.vue.d.ts.map +1 -0
  31. package/es/components/form/components/SlotComponent/index.vue.d.ts +7 -0
  32. package/es/components/form/components/SlotComponent/index.vue.d.ts.map +1 -0
  33. package/es/components/form/components/index.d.ts +12 -0
  34. package/es/components/form/components/index.d.ts.map +1 -0
  35. package/es/components/form/constants/index.d.ts +62 -0
  36. package/es/components/form/constants/index.d.ts.map +1 -0
  37. package/es/components/form/hooks/index.d.ts +6 -0
  38. package/es/components/form/hooks/index.d.ts.map +1 -0
  39. package/es/components/form/hooks/useFields.d.ts +57 -0
  40. package/es/components/form/hooks/useFields.d.ts.map +1 -0
  41. package/es/components/form/hooks/useForm.d.ts +101 -0
  42. package/es/components/form/hooks/useForm.d.ts.map +1 -0
  43. package/es/components/form/hooks/useFormPopup.d.ts +57 -0
  44. package/es/components/form/hooks/useFormPopup.d.ts.map +1 -0
  45. package/es/components/form/hooks/useFormRef.d.ts +30 -0
  46. package/es/components/form/hooks/useFormRef.d.ts.map +1 -0
  47. package/es/components/form/index.d.ts +7 -0
  48. package/es/components/form/index.d.ts.map +1 -0
  49. package/es/components/form/types/index.d.ts +152 -0
  50. package/es/components/form/types/index.d.ts.map +1 -0
  51. package/es/form/index.js +11 -7
  52. package/es/form/index.js.map +1 -0
  53. package/es/index.d.ts +58 -954
  54. package/es/index.d.ts.map +1 -0
  55. package/es/index.js +10 -21
  56. package/es/index.js.map +1 -0
  57. package/es/shared/core/index.d.ts +6 -0
  58. package/es/shared/core/index.d.ts.map +1 -0
  59. package/es/shared/ui/index.d.ts +2 -0
  60. package/es/shared/ui/index.d.ts.map +1 -0
  61. package/package.json +11 -12
  62. package/src/components/component-provider/components/index.vue +67 -0
  63. package/src/components/component-provider/constants/index.ts +110 -0
  64. package/src/components/component-provider/index.ts +6 -0
  65. package/src/components/component-provider/types/index.ts +31 -0
  66. package/src/components/form/components/BaseField/index.vue +340 -0
  67. package/src/components/form/components/BaseField/utils/index.ts +14 -0
  68. package/src/components/form/components/BaseFormItem/index.vue +77 -0
  69. package/src/components/form/components/ContainerFragment/index.vue +24 -0
  70. package/src/components/form/components/GroupedFieldAttrs/index.vue +51 -0
  71. package/src/components/form/components/PathProvider/index.vue +18 -0
  72. package/src/components/form/components/ProForm/index.vue +114 -0
  73. package/src/components/form/components/SlotComponent/index.vue +26 -0
  74. package/src/components/form/components/index.ts +15 -0
  75. package/src/components/form/constants/index.ts +109 -0
  76. package/src/components/form/hooks/index.ts +6 -0
  77. package/src/components/form/hooks/useFields.ts +67 -0
  78. package/src/components/form/hooks/useForm.ts +126 -0
  79. package/src/components/form/hooks/useFormPopup.ts +111 -0
  80. package/src/components/form/hooks/useFormRef.ts +35 -0
  81. package/src/components/form/index.ts +27 -0
  82. package/src/components/form/types/index.ts +220 -0
  83. package/src/index.ts +62 -0
  84. package/src/shared/core/index.ts +37 -0
  85. package/src/shared/ui/index.ts +26 -0
  86. package/es/core/index-B5vvm4Fj.js +0 -236
  87. package/es/vendor/utils/lodash-es-DN4QDiDm.js +0 -1079
@@ -0,0 +1,152 @@
1
+ import { FormInstance, FieldProps } from '../../../shared/ui';
2
+ import { ComponentProps, ComponentSlots } from 'vue-component-type-helpers';
3
+ import { CSSProperties, Component, Raw, MaybeRef, ComputedRef, VNodeProps, DefineComponent, VNodeTypes, VNode } from 'vue';
4
+ import { ComponentName, GetComponentType } from '../constants';
5
+ import { Data, Path } from '../../../shared/core';
6
+ import { PopupProps } from '../hooks/useFormPopup';
7
+ export type { FormInstance };
8
+ export type PathProps = {
9
+ path?: string;
10
+ } & Data;
11
+ export type VModelProps<T = any> = {
12
+ modelValue?: T;
13
+ 'onUpdate:modelValue'?: (val: T) => void;
14
+ };
15
+ export type ValueFormatter = {
16
+ (val: any, oldVal: any): any;
17
+ } | {
18
+ get?: (val: any) => any;
19
+ set?: (val: any, oldVal: any) => any;
20
+ };
21
+ export type DisplayFormatter = (val: any) => string;
22
+ /**
23
+ * @description 自定义组件
24
+ */
25
+ export type RenderComponentType = Component<VModelProps & PathProps>;
26
+ /**
27
+ * @description 插槽组件类型
28
+ */
29
+ export type SlotComponentType = Component<PathProps> | VNode | string | number | boolean | null | undefined | ((...args: any[]) => SlotComponentType);
30
+ /**
31
+ * @description 容器组件类型
32
+ */
33
+ export type ContainerComponent = Component<PathProps> | DefineComponent<PathProps> | VNodeTypes | symbol;
34
+ /**
35
+ * @description 插槽对象类型
36
+ */
37
+ export type Slots = {
38
+ [name: string]: SlotComponentType;
39
+ };
40
+ type BaseCommon<D extends Data = Data> = {
41
+ /**
42
+ * @description 字段标识namePath, 同name
43
+ */
44
+ path?: Path<D>;
45
+ /**
46
+ * @description 字段是否隐藏
47
+ */
48
+ hidden?: boolean;
49
+ /**
50
+ * @description 字段是否禁用
51
+ */
52
+ disabled?: boolean;
53
+ /**
54
+ * @description 字段中文名称,支持字符串或组件
55
+ */
56
+ label?: SlotComponentType;
57
+ /**
58
+ * @description 字段插槽配置
59
+ */
60
+ slots?: Slots;
61
+ /**
62
+ * @description 嵌套 fields 容器包裹组件
63
+ */
64
+ fieldContainer?: ContainerComponent;
65
+ /**
66
+ * @description 额外的自定义属性,不会被当作组件参数
67
+ */
68
+ extraProps?: Record<string, any>;
69
+ };
70
+ type BaseWithFields<D extends Data = Data> = BaseCommon<D> & {
71
+ /**
72
+ * @description 嵌套子字段配置 (Vant 中主要用于分组,或者通过 CellGroup 包裹)
73
+ */
74
+ fields: Fields<D>;
75
+ component?: never;
76
+ componentStyle?: never;
77
+ componentClass?: never;
78
+ componentContainer?: never;
79
+ fieldStyle?: never;
80
+ fieldClass?: never;
81
+ valueFormatter?: never;
82
+ displayFormatter?: never;
83
+ modelProp?: never;
84
+ popup?: never;
85
+ };
86
+ type BaseWithoutFields<D extends Data = Data> = BaseCommon<D> & {
87
+ fields?: undefined;
88
+ /**
89
+ * @description 表单字段component样式属性
90
+ */
91
+ componentStyle?: CSSProperties;
92
+ /**
93
+ * @description 表单字段component样式类名
94
+ */
95
+ componentClass?: any;
96
+ /**
97
+ * @description 表单字段外层 van-field 样式属性
98
+ */
99
+ fieldStyle?: CSSProperties;
100
+ /**
101
+ * @description 表单字段外层 van-field 样式类名
102
+ */
103
+ fieldClass?: any;
104
+ /**
105
+ * @description 字段component容器包裹组件
106
+ */
107
+ componentContainer?: ContainerComponent;
108
+ /**
109
+ * @description 字段值处理函数,在onUpdateValue前执行
110
+ */
111
+ valueFormatter?: ValueFormatter;
112
+ /**
113
+ * @description 针对 Popup 展现形式的组件,将选中值转化为输入框展示文字
114
+ */
115
+ displayFormatter?: DisplayFormatter;
116
+ /**
117
+ * @description 组件v-model双向绑定更新属性名
118
+ */
119
+ modelProp?: string;
120
+ /**
121
+ * @description 是否通过 Popup 弹窗展示该组件(为 true 或传递 PopupProps 配置对象时开启)
122
+ */
123
+ popup?: boolean | Partial<PopupProps>;
124
+ };
125
+ export type Base<D extends Data = Data> = BaseWithFields<D> | BaseWithoutFields<D>;
126
+ /**
127
+ * @type {FieldTypeMap} 字段类型集合
128
+ */
129
+ export type FieldTypeMap<D extends Data = Data> = {
130
+ [K in ComponentName]: K extends 'custom' ? WithCommon<{
131
+ slots?: Slots;
132
+ [x: string]: any;
133
+ }, D> & {
134
+ component?: RenderComponentType | Raw<RenderComponentType>;
135
+ } : WithComponent<GetComponentType<K>, D> & {
136
+ component?: K;
137
+ };
138
+ };
139
+ type NotSupportedRefOrGetterProps = 'component' | 'fieldContainer' | 'componentContainer' | 'valueFormatter' | 'displayFormatter' | 'fields' | 'slots' | 'modelProp' | 'popup';
140
+ type MaybeRefOrComputedRef<T = any> = MaybeRef<T> | ComputedRef<T>;
141
+ export type WithRef<T> = {
142
+ [P in keyof T]: P extends NotSupportedRefOrGetterProps ? T[P] : T[P] extends (...args: any[]) => any ? T[P] : MaybeRefOrComputedRef<T[P]>;
143
+ };
144
+ type WithCommonBase<T = unknown> = T & Partial<Omit<FieldProps, 'label' | 'name' | 'type'>>;
145
+ type WithCommon<T, D extends Data = Data> = WithRef<WithCommonBase<T> & BaseWithoutFields<D>>;
146
+ type WithFields<D extends Data = Data> = WithRef<WithCommonBase & BaseWithFields<D>>;
147
+ type WithComponent<T extends abstract new (...args: any) => any, D extends Data = Data> = WithCommon<{
148
+ slots?: Partial<ComponentSlots<T>>;
149
+ } & Partial<Omit<ComponentProps<T>, keyof VNodeProps>>, D>;
150
+ export type Field<C extends ComponentName = ComponentName, D extends Data = Data> = FieldTypeMap<D>[C] | WithFields<D>;
151
+ export type Fields<D extends Data = Data> = Array<Field<ComponentName, D>>;
152
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/form/types/index.ts"],"names":[],"mappings":"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"}
package/es/form/index.js CHANGED
@@ -1,9 +1,8 @@
1
1
  import { Button, Signature, Area, Cascader, TimePicker, DatePicker, Picker, RadioGroup, CheckboxGroup, Uploader, Slider, Rate, Stepper, Switch, Field, Form, Popup } from "vant";
2
2
  import { inject, reactive, ref, computed, provide, defineComponent, useAttrs, mergeProps, createBlock, openBlock, unref, withCtx, createElementBlock, Fragment, createVNode, createCommentVNode, Teleport, resolveDynamicComponent, isRef, createSlots, renderList, renderSlot, normalizeProps, isVNode, createTextVNode, toDisplayString, guardReactiveProps, toValue, resolveComponent, useSlots, watchEffect, createElementVNode } from "vue";
3
- import { g as getInjectConfig, I as INJECT_COMPONENTS, a as INJECT_CONFIG } from "../component-provider/index-DC_k4_R3.js";
4
- import { u as useForm$1, I as InjectionPathKey, a as InjectionFormKey, c as camelizeProperties, b as useFields$1, d as useFormRef$1 } from "../core/index-B5vvm4Fj.js";
5
- import { e } from "../core/index-B5vvm4Fj.js";
6
- import { o as omit, c as cloneDeep, i as isPlainObject, t as toPath } from "../vendor/utils/lodash-es-DN4QDiDm.js";
3
+ import { g as getInjectConfig, I as INJECT_COMPONENTS, a as INJECT_CONFIG } from "../component-provider/index-cldbPMDQ.js";
4
+ import { useForm as useForm$1, omit, cloneDeep, InjectionPathKey, isPlainObject, toPath, InjectionFormKey, camelizeProperties, useFields as useFields$1, useFormRef as useFormRef$1 } from "@qin-ui/pro-components-core";
5
+ import { useFormData } from "@qin-ui/pro-components-core";
7
6
  const componentMap = {
8
7
  field: Field,
9
8
  switch: Switch,
@@ -504,14 +503,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
504
503
  };
505
504
  }
506
505
  });
507
- const useFields = useFields$1;
508
- const useFormRef = useFormRef$1;
506
+ function useFields(initFields) {
507
+ return useFields$1(initFields);
508
+ }
509
+ function useFormRef() {
510
+ return useFormRef$1();
511
+ }
509
512
  export {
510
513
  _sfc_main$5 as ContainerFragment,
511
514
  _sfc_main$4 as SlotComponent,
512
515
  _sfc_main as default,
513
516
  useFields,
514
517
  useForm,
515
- e as useFormData,
518
+ useFormData,
516
519
  useFormRef
517
520
  };
521
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/components/form/constants/index.ts","../../src/components/form/hooks/useFormPopup.ts","../../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/PathProvider/index.vue","../../src/components/form/components/GroupedFieldAttrs/index.vue","../../src/components/form/components/BaseFormItem/index.vue","../../src/components/form/components/ProForm/index.vue","../../src/components/form/hooks/useFields.ts","../../src/components/form/hooks/useFormRef.ts"],"sourcesContent":["import {\n Field,\n Button,\n Picker,\n DatePicker,\n TimePicker,\n Cascader,\n Area,\n Signature,\n Switch,\n Stepper,\n Rate,\n Slider,\n Uploader,\n CheckboxGroup,\n RadioGroup,\n} from '../../../shared/ui';\n\n/**\n * 内置组件映射表\n * @description Vant 内置支持的组件类型映射\n */\nexport type BaseComponentMap = {\n field: typeof Field;\n switch: typeof Switch;\n stepper: typeof Stepper;\n rate: typeof Rate;\n slider: typeof Slider;\n uploader: typeof Uploader;\n 'checkbox-group': typeof CheckboxGroup;\n 'radio-group': typeof RadioGroup;\n picker: typeof Picker;\n 'date-picker': typeof DatePicker;\n 'time-picker': typeof TimePicker;\n cascader: typeof Cascader;\n area: typeof Area;\n signature: typeof Signature;\n button: typeof Button;\n};\n\n/**\n * 组件映射扩展接口\n * @description 通过 TypeScript 声明合并添加自定义组件\n *\n * @example\n * ```ts\n * declare module '@qin-ui/vant-pro' {\n * interface ComponentMap {\n * 'my-custom': typeof MyComponent;\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 * 组件名称到 Vant 组件的映射\n */\nexport const componentMap: BaseComponentMap = {\n field: Field,\n switch: Switch,\n stepper: Stepper,\n rate: Rate,\n slider: Slider,\n uploader: Uploader,\n 'checkbox-group': CheckboxGroup,\n 'radio-group': RadioGroup,\n picker: Picker,\n 'date-picker': DatePicker,\n 'time-picker': TimePicker,\n cascader: Cascader,\n area: Area,\n signature: Signature,\n button: Button,\n};\n\n/**\n * Teleport 组件名称前缀\n * @description 用于通过插槽动态替换指定 path 的组件\n */\nexport const TeleportComponentNamePrefix = 'TeleportComponent_';\n\n// inject keys\nexport { InjectionFormKey, InjectionPathKey } from '../../../shared/core';\n","import {\n computed,\n ComputedRef,\n inject,\n provide,\n reactive,\n Ref,\n ref,\n} from 'vue';\nimport { Popup } from '../../../shared/ui';\nimport { ComponentProps } from 'vue-component-type-helpers';\nimport { ContainerComponent } from '../types';\n\n/**\n * Vant Popup 组件属性类型\n * @description 用于配置表单弹出层的属性\n \n * @public\n */\nexport type PopupProps = ComponentProps<typeof Popup> & {\n container: ContainerComponent;\n};\n\n/**\n * 表单弹出层管理对象\n * @description Vant 移动端特有的表单弹出层功能\n \n * @public\n */\nexport type FormPopup = {\n /** Popup 组件属性 */\n props: PopupProps;\n /** 打开指定路径字段的弹出层 */\n open: (path: string) => void;\n /** 关闭弹出层 */\n close: () => void;\n /** 更新 Popup 组件属性 */\n updateProps: (props: Partial<PopupProps>) => void;\n /** 弹出层是否可见 */\n visible: ComputedRef<boolean>;\n /** 当前弹出层对应的字段路径 */\n popupFieldPath: Ref<string | undefined>;\n /** 当前弹出层字段的值 */\n popupFieldValue: Ref<any | undefined>;\n};\n\n/** 弹出层注入 key */\nexport const InjectionPopupKey = Symbol('form-popup');\n\n/**\n * @qin-ui/vant-pro 表单弹出层管理 Hook\n *\n * @description 用于管理 Vant 移动端的表单弹出层(Popup)。\n * 在移动端表单中,某些字段(如地址选择、日期选择)需要以弹出层形式展示。\n *\n * @returns {FormPopup} 弹出层管理对象\n *\n * @example\n * ```ts\n * const formPopup = useFormPopup(true)\n * formPopup.open('address') // 打开地址选择弹出层\n * formPopup.close() // 关闭\n * formPopup.updateProps({ position: 'top' })\n * ```\n \n * @public\n */\nexport function useFormPopup(root?: boolean): FormPopup;\n\nexport function useFormPopup(initRoot?: boolean) {\n if (!initRoot) {\n const injectStore = inject(InjectionPopupKey, undefined);\n if (injectStore) return injectStore as never;\n }\n\n const props = reactive<Partial<PopupProps>>({\n safeAreaInsetBottom: true,\n position: 'bottom',\n round: true,\n });\n\n const popupFieldPath = ref<string>();\n const popupFieldValue = ref();\n\n function open(path: string) {\n popupFieldPath.value = path;\n }\n\n function close() {\n popupFieldPath.value = undefined;\n popupFieldValue.value = undefined;\n }\n\n const visible = computed(() => !!popupFieldPath.value);\n\n function updateProps(_props: Partial<PopupProps>) {\n Object.assign(props, _props);\n }\n\n const store = {\n props,\n open,\n close,\n updateProps,\n visible,\n popupFieldPath,\n popupFieldValue,\n };\n provide(InjectionPopupKey, store);\n return store;\n}\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';\nimport { useFormPopup, type FormPopup } from './useFormPopup';\n\n/**\n * 表单实例类型\n *\n * @description 在 core Form 类型的基础上,将字段类型 F 绑定为本地 Field<ComponentName, D>,\n * 将底层表单实例 I 绑定为 Vant 的 FormInstance,使 formRef 获得完整的类型提示。\n * 额外包含 formPopup 对象,用于管理弹出层表单。\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 - 底层 Vant Form 组件实例的响应式引用(Ref),可调用 `validate()`、`resetValidation()` 等方法\n * @property setFormRef - 设置底层 Form 组件实例,由 ProForm 内部自动调用,一般无需手动使用\n * @property formPopup - 弹出层表单管理对象,提供 `open(path)`、`close()` 等方法,用于移动端弹窗表单\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 * form.formPopup.open('address') // 打开弹出层表单\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> & { formPopup: FormPopup };\n\n/**\n * 创建表单实例的 Hook\n *\n * @description 基于 `@qin-ui/pro-components-core` 的 `useForm`,将泛型参数绑定为 Vant 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Vant 组件类型推导)\n * - 表单实例 -> Vant 的 `FormInstance`(使 formRef 获得完整的类型提示)\n *\n * 在 core useForm 基础上额外提供 formPopup,用于移动端弹窗表单场景。\n *\n * 表单实例组合了四个子模块的能力:\n * - **useFormData**:表单数据管理(响应式数据、读写、批量更新)\n * - **useFields**:字段配置管理(增删改查字段配置,支持嵌套)\n * - **useFormRef**:底层 Form 组件实例引用\n * - **useFormPopup**:弹出层表单管理(Vant 专属)\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: 'field' },\n * ],\n * true\n * )\n *\n * // 方式二:仅设置 root 标识\n * const form = useForm<User>(true)\n *\n * // 使用\n * const { formData, formRef, fields, setFormData, formPopup } = form\n * setFormData('name', '李四')\n * formPopup.open('address') // 打开弹出层表单\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 let root = true;\n if (args.length === 1) {\n root = args[0] as boolean;\n } else if (args.length >= 2) {\n root = (args[2] as boolean) ?? root;\n }\n\n const form = coreUseForm(...args);\n const formPopup = useFormPopup(root);\n\n return { ...form, formPopup };\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 } = field as any;\n if (typeof component === 'string') {\n const config = getInjectConfig(component);\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 Teleport,\n useAttrs,\n} from 'vue';\nimport { cloneDeep, omit } from '../../../../shared/core';\nimport type { Field as FieldType } 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 { Field as VanField } from '../../../../shared/ui';\n\ndefineOptions({ name: 'BaseField', inheritAttrs: false });\n\nconst uiFieldPropsKeys = Object.keys(VanField.props || {});\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, formPopup } = form;\nconst { popupFieldPath, popupFieldValue } = formPopup;\n\nconst componentRef = ref<any>();\nconst fieldRef = 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 popupCloseEventName = computed(() => {\n let confirm = 'onConfirm';\n let cancel = 'onCancel';\n if (component === 'cascader') {\n confirm = 'onFinish';\n cancel = 'onClose';\n } else if (component === 'signature') {\n confirm = 'onSubmit';\n }\n return { confirm, cancel };\n});\n\n/*\n * 将注入的默认 props、外部传入的 attrs、field 配置合并为最终属性\n * 属性分为多类:组件绑定属性、Field UI 属性等\n */\nconst groupedAttrs = computed(() => {\n const initProps = getInitProps({\n component: component,\n type: attrs.type,\n } as unknown as FieldType);\n const modelPropName = attrs.modelProp ?? initProps.modelProp ?? 'modelValue';\n const mergedProps = mergeProps(\n initProps,\n attrs,\n { disabled: attrs.disabled ?? initProps.disabled },\n { modelProp: modelPropName }\n ) as Required<FieldType>;\n\n // prettier-ignore\n const { valueFormatter, displayFormatter, modelProp, slots, fieldClass, fieldStyle, componentContainer, popup, ...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 if (popup) {\n const {\n [popupCloseEventName.value.confirm]: confirmEvent,\n [popupCloseEventName.value.cancel]: cancelEvent,\n } = bindAttrs as any;\n Object.assign(bindAttrs, {\n [popupCloseEventName.value.confirm]: (...args: any[]) => {\n value.value = popupFieldValue.value;\n formPopup.close();\n confirmEvent?.(...args);\n },\n [popupCloseEventName.value.cancel]: (...args: any[]) => {\n formPopup.close();\n cancelEvent?.(...args);\n },\n });\n }\n\n const fieldAttrs = Object.keys(bindAttrs).reduce(\n (acc, key) => {\n if (\n (uiFieldPropsKeys.includes(key) || key.startsWith('on')) &&\n key !== 'type'\n ) {\n acc[key] = (bindAttrs as any)[key];\n }\n return acc;\n },\n { class: fieldClass, style: fieldStyle } as Record<string, any>\n );\n\n return {\n attrs: bindAttrs,\n fieldAttrs,\n slots,\n componentContainer,\n modelProp: modelBindingProp,\n valueFormatter,\n displayFormatter,\n popup,\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\n// 处理 Popup 相关的逻辑\nconst popupAble = computed(() => !!groupedAttrs.value.popup);\nconst popupContainer = computed(() =>\n typeof groupedAttrs.value.popup === 'boolean'\n ? undefined\n : groupedAttrs.value.popup?.container\n);\n\n// 获取要展示在只读 Field 上的文字\nconst displayValue = computed(() => {\n const { displayFormatter } = groupedAttrs.value;\n if (displayFormatter && typeof displayFormatter === 'function') {\n return displayFormatter(value.value);\n }\n return value.value;\n});\n\nconst onFieldClick = () => {\n const attrs = groupedAttrs.value.attrs as any;\n if (!popupAble.value || attrs.disabled || attrs.readonly) return;\n\n const popupProps =\n typeof groupedAttrs.value.popup === 'object'\n ? groupedAttrs.value.popup\n : {};\n formPopup.updateProps(popupProps);\n popupFieldValue.value = value.value;\n formPopup.open(path);\n};\n\ndefineExpose({\n getComponentRef: () => componentRef.value || fieldRef.value,\n getComponentComputedProps: () => groupedAttrs.value.attrs as any,\n});\n</script>\n\n<template>\n <ContainerFragment :component=\"groupedAttrs.componentContainer\" :path=\"path\">\n <template v-if=\"popupAble\">\n <VanField\n ref=\"fieldRef\"\n v-bind=\"{\n readonly: true,\n clickable: true,\n isLink: true,\n ...groupedAttrs.fieldAttrs,\n }\"\n :model-value=\"displayValue\"\n @click=\"onFieldClick\"\n />\n <ContainerFragment\n v-if=\"popupFieldPath === path\"\n :component=\"Teleport\"\n to=\"#pro-form-popup-content\"\n defer\n >\n <ContainerFragment :component=\"popupContainer\" :path=\"path\">\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n v-model:[`${groupedAttrs.modelProp}`]=\"popupFieldValue\"\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 </ContainerFragment>\n </template>\n\n <template v-else-if=\"typeof component === 'string'\">\n <component\n :is=\"is\"\n v-if=\"component === 'field'\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\n :name=\"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\n <VanField\n v-else\n ref=\"fieldRef\"\n v-bind=\"groupedAttrs.fieldAttrs\"\n :name=\"path\"\n >\n <template #input>\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\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 </template>\n </VanField>\n </template>\n\n <template v-else>\n <component\n :is=\"is\"\n v-if=\"is\"\n v-bind=\"groupedAttrs.attrs\"\n ref=\"componentRef\"\n v-model:[`${groupedAttrs.modelProp}`]=\"value\"\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 </template>\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>\nimport { computed, provide } from 'vue';\nimport { InjectionPathKey } from '../../constants';\n\nconst props = defineProps<{ path?: string | number | (string | number)[] }>();\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. **fieldAttrs** — 字段包装层属性(label、rules、required 等),传递给 VanField\n * 2. **componentProps** — 组件属性(placeholder、clearable 等),传递给内部组件\n * 3. **fieldSlots** — VanField 的具名插槽\n *\n * 分组依据:\n * - 匹配 vant Field 的 props key → fieldAttrs\n * - 其余所有属性 → componentProps\n * - 属于 FIELD_SLOT_KEYS 的插槽 → fieldSlots\n * - 其余插槽 → componentProps.slots\n */\nimport { computed } from 'vue';\nimport type { Field } from '../../types';\nimport { isPlainObject } from '../../../../shared/core';\n\ntype Props = {\n field: Field;\n};\nconst props = defineProps<Props>();\n\ntype GroupedFieldAttrs = {\n componentProps: Record<string, any>;\n};\n\n// 将 field 配置按 key 分发到各属性分组中\nconst groupedAttributes = computed<GroupedFieldAttrs>(() => {\n let componentProps: 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, formItemContainer, fields, hidden, extraProps, ...rest } =\n props.field as any;\n componentProps = rest;\n }\n\n return { componentProps };\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 * - Field 包装(label、rules、校验等)\n * - 组件绑定(通过 BaseField 渲染具体组件,如 Popup 选择器等)\n * - 插槽透传(label 等 Field 插槽)\n *\n * ## 渲染流程\n *\n * 1. 遍历 fields 数组,过滤 hidden 字段\n * 2. 对每个字段:\n * a. 通过 PathProvider 提供当前字段路径\n * b. 通过 GroupedFieldAttrs 将 field 配置拆分\n * c. 如果字段有 `fields` 子字段 → 递归渲染 BaseFormItem(嵌套表单)\n * d. 否则 → 渲染 BaseField(输入组件)\n * 3. 通过 ref 回调收集 Field 实例,注入到 field 对象上\n *\n * @param {Fields<D>} [fields] - 字段配置数组\n *\n * @internal\n */\nimport { computed, toValue } from 'vue';\nimport { toPath } from '../../../../shared/core';\nimport type { Fields } from '../../types';\nimport {\n BaseField,\n ContainerFragment,\n GroupedFieldAttrs,\n PathProvider,\n} from '..';\n\ndefineOptions({ name: 'BaseFormItem', inheritAttrs: false });\n\ntype Props = {\n fields?: Fields;\n};\n\nconst props = defineProps<Props>();\n\nconst validFields = computed(() => {\n const f = toValue(props.fields);\n if (!Array.isArray(f)) return [];\n return f.filter(field => !toValue(field.hidden));\n});\n</script>\n\n<template>\n <template\n v-for=\"(field, index) in validFields\"\n :key=\"toPath(toValue(field.path || index)).join('.') || index\"\n >\n <PathProvider :path=\"toValue(field.path) as any\">\n <template #default=\"{ path }\">\n <GroupedFieldAttrs :field=\"field\">\n <template #default=\"{ componentProps }\">\n <template v-if=\"field.fields\">\n <ContainerFragment\n :component=\"field.fieldContainer\"\n :path=\"path\"\n v-bind=\"componentProps\"\n >\n <BaseFormItem :fields=\"field.fields\" />\n </ContainerFragment>\n </template>\n <template v-else>\n <BaseField v-bind=\"componentProps\" :path=\"path\" />\n </template>\n </template>\n </GroupedFieldAttrs>\n </template>\n </PathProvider>\n </template>\n</template>\n","<script lang=\"ts\" setup generic=\"F extends Form<any> = Form\">\n/**\n * @component ProForm\n * @description @qin-ui/vant-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 * - 弹出层表单(Popup,适用于移动端选择器场景)\n *\n * @template F - 表单实例类型\n * @param {Form<D>} [form] - useForm 返回的表单实例\n *\n * @slot default - 默认插槽\n * @slot [path] - 以字段 path 命名的动态插槽\n \n * @public\n */\nimport { Form as VanForm, Popup } from '../../../../shared/ui';\nimport {\n inject,\n mergeProps,\n provide,\n type Slot,\n watchEffect,\n toValue,\n computed,\n} from 'vue';\nimport { INJECT_CONFIG } from '../../../component-provider/constants';\nimport { BaseFormItem } from '..';\nimport { InjectionFormKey, TeleportComponentNamePrefix } from '../../constants';\nimport type { VModelProps, PathProps } from '../../types';\nimport { Path, camelizeProperties } from '../../../../shared/core';\nimport type { Form } from '../../hooks/useForm';\nimport { useForm } from '../../hooks/useForm';\n\ndefineOptions({ name: 'ProForm', inheritAttrs: false });\n\ntype Props = { form?: F };\nconst props = defineProps<Props>();\n\nconst form = props.form || (useForm(true) as F);\n\n/**\n * 依赖注入中心:\n * 将 Core 包生成的 Form 实例注入到 Vue 的 Context 中。\n * 供深层子组件(如 BaseFormItem, BaseField, 自定义插槽)跨层级直接访问数据和方法。\n */\nprovide(InjectionFormKey, form as F);\n\nconst { fields, setFormRef, formPopup } = form as F;\n\nconst formFields = computed(() => {\n const f = toValue(fields);\n return Array.isArray(f) ? f : [];\n});\n\nconst config = INJECT_CONFIG['pro-form'];\nconst injectAttrs = inject(config.injectionKey, config.default);\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 * 动态插槽映射中心 (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\nconst popupProps = computed(() => {\n // 从 ProComponentProvider 获取全局配置,与传入的 props 合并\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { container, ...rest } = formPopup.props;\n return rest;\n});\n</script>\n\n<template>\n <VanForm\n :ref=\"(el: any) => setFormRef?.(el)\"\n v-bind=\"mergeProps(injectAttrs, camelizeProperties($attrs))\"\n class=\"pro-form\"\n >\n <BaseFormItem :fields=\"formFields\" />\n\n <Popup\n v-bind=\"popupProps\"\n :show=\"formPopup.visible.value\"\n @close=\"formPopup.close\"\n >\n <div id=\"pro-form-popup-content\"></div>\n </Popup>\n\n <slot />\n </VanForm>\n</template>\n","import { FieldInstance } 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`,将泛型参数绑定为 Vant 的本地类型:\n * - 字段类型 F -> `Field<ComponentName, D>`(支持 Vant 组件类型推导)\n * - Field 实例 -> Vant 的 `FieldInstance`\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: 'field' },\n * { path: 'age', label: '年龄', component: 'stepper' },\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>, FieldInstance>;\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`,将泛型参数绑定为 Vant 的 `FormInstance`,\n * 使 formRef 获取到完整的 Vant Form 组件 API 类型提示(如 `validate()`、`resetValidation()` 等)。\n *\n * `formRef` 由 ProForm 组件内部自动通过 `setFormRef` 绑定,无需手动调用。\n *\n * @returns 表单组件实例引用管理对象:\n * - `formRef` — Vant 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?.resetValidation()\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"],"names":["coreUseForm","VanField","attrs","_createBlock","_unref","ContainerFragment","_createElementBlock","_Fragment","_createVNode","_mergeProps","_openBlock","_resolveDynamicComponent","_isRef","_renderList","_withCtx","SlotComponent","_normalizeProps","$attrs","_renderSlot","PathProvider","GroupedFieldAttrs","_useSlots","BaseFormItem","_createElementVNode","coreUseFields","coreUseFormRef"],"mappings":"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"}