form-design-v3 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{CodeEditor-B7PzbdP9.js → CodeEditor-CJeYvarM.js} +1 -2
- package/form-design-v3.css +1 -0
- package/form-design-v3.es.js +13 -0
- package/form-design-v3.umd.cjs +4 -0
- package/index-BNitnTdB.js +3578 -0
- package/index.d.ts +83 -19
- package/package.json +2 -2
- package/CodeEditor-B7PzbdP9.js.map +0 -1
- package/CodeEditor-d-AMHZfA.js +0 -56
- package/CodeEditor-d-AMHZfA.js.map +0 -1
- package/form-designer.css +0 -1
- package/index-DCHlgXXr.js +0 -3033
- package/index-DCHlgXXr.js.map +0 -1
- package/index-oUADtA5r.js +0 -3016
- package/index-oUADtA5r.js.map +0 -1
- package/mt-form-designer.es.js +0 -12
- package/mt-form-designer.es.js.map +0 -1
- package/mt-form-designer.umd.cjs +0 -5
- package/mt-form-designer.umd.cjs.map +0 -1
package/index-oUADtA5r.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-oUADtA5r.js","sources":["../src/widgets/registry.ts","../src/widgets/label/LabelDesign.vue","../src/widgets/label/LabelRender.vue","../src/widgets/label/LabelPanel.vue","../src/widgets/label/index.ts","../src/components/LucideIcon.vue","../src/widgets/card/CardDesign.vue","../src/widgets/visibility.ts","../src/widgets/card/CardRender.vue","../src/components/FdSwitch.vue","../src/widgets/card/icons.ts","../src/widgets/card/CardPanel.vue","../src/widgets/card/index.ts","../src/widgets/slot/SlotDesign.vue","../src/widgets/slot/SlotRender.vue","../src/widgets/slot/SlotPanel.vue","../src/widgets/slot/index.ts","../src/widgets/subtable/SubtableDesign.vue","../src/widgets/subtable/SubtableRender.vue","../src/api/mock.ts","../src/widgets/subtable/SubtablePanel.vue","../src/widgets/subtable/index.ts","../src/widgets/grid/GridDesign.vue","../src/components/WidgetHost.vue","../src/widgets/grid/corner.ts","../src/widgets/grid/GridRender.vue","../src/widgets/grid/GridPanel.vue","../src/widgets/grid/index.ts","../src/widgets/text/TextDesign.vue","../src/widgets/text/TextRender.vue","../src/widgets/text/TextPanel.vue","../src/widgets/text/index.ts","../src/widgets/index.ts","../src/stores/designer.ts","../src/api/index.ts","../src/storage/formStorage.ts","../src/utils/formEvents.ts","../src/components/renderer/Renderer.vue","../src/components/designer/ComponentTree.vue","../src/components/designer/Toolbar.vue","../src/components/designer/WidgetPalette.vue","../src/types/schema.ts","../src/components/designer/FormEventsPanel.vue","../src/components/designer/PropertyPanel.vue","../src/components/designer/CanvasNode.vue","../src/components/designer/Designer.vue","../src/components/renderer/renderForm.ts","../src/index.ts"],"sourcesContent":["import type { WidgetType, WidgetProps } from '@/types'\nimport type { WidgetDefinition } from './types'\n\nconst registry = new Map<WidgetType, WidgetDefinition>()\n\nexport function registerComponent(def: WidgetDefinition): void {\n registry.set(def.type, def)\n}\n\nexport function getWidgetDef(type: WidgetType): WidgetDefinition | undefined {\n return registry.get(type)\n}\n\nexport function getAllWidgetDefs(): WidgetDefinition[] {\n return Array.from(registry.values())\n}\n\nexport function isRegistered(type: WidgetType): boolean {\n return registry.has(type)\n}\n\n/** 创建控件默认节点(生成唯一 id) */\nexport function createWidget(type: WidgetType): WidgetProps {\n const def = getWidgetDef(type)\n if (!def) throw new Error(`未注册的控件类型: ${type}`)\n const base = def.createDefaultProps()\n return { ...base, id: `${type}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}` }\n}\n","<script setup lang=\"ts\">\nimport { useDesignerStore } from '@/stores/designer'\nimport type { LabelWidgetProps } from '@/types'\n\ndefineProps<{ node: LabelWidgetProps }>()\n\nconst store = useDesignerStore()\n</script>\n\n<template>\n <div class=\"fd-label-design\" :class=\"{ 'is-mobile': store.device === 'mobile' }\">\n <span class=\"fd-label-name\">{{ node.label || '标题' }}</span>\n <span class=\"fd-label-value\" :class=\"{ 'fd-label-value--link': !!node.bindLink }\" :style=\"node.color ? { color: node.color } : undefined\">\n <template v-if=\"node.bindLink\">{{ node.bindField || node.bindLink }}</template>\n <template v-else>{{ node.bindField || '未绑定字段' }}</template>\n </span>\n </div>\n</template>\n\n<style scoped>\n.fd-label-design {\n display: flex;\n align-items: stretch;\n font-size: 1.4rem;\n line-height: 1.5;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n overflow: hidden;\n}\n.fd-label-name {\n width: 16rem;\n flex-shrink: 0;\n padding: 1.1rem 1.2rem;\n background: var(--fd-color-bg-hover);\n border-right: 1px solid var(--fd-color-border);\n color: var(--fd-color-text-secondary);\n text-align: right;\n font-weight: 500;\n}\n.fd-label-design.is-mobile .fd-label-name {\n width: 12rem;\n}\n.fd-label-value {\n flex: 1;\n min-width: 0;\n padding: 1.1rem 1.2rem;\n background: var(--fd-color-bg-panel);\n color: var(--fd-color-text);\n white-space: pre-wrap;\n word-break: break-all;\n}\n.fd-label-value--link {\n color: var(--fd-color-primary);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, onMounted, onUnmounted } from 'vue'\nimport { useDesignerStore } from '@/stores/designer'\nimport type { LabelWidgetProps } from '@/types'\n\nconst props = defineProps<{\n node: LabelWidgetProps\n /** 绑定字段运行时的值(来自 formData) */\n value?: unknown\n /** 运行态字段值映射(bindLink 取链接 URL) */\n formData?: Record<string, unknown>\n}>()\n\n/** 是否绑定链接:值以主题色展示并可点击 */\nconst isLink = computed(() => !!props.node.bindLink)\n/** 链接 URL:来自绑定链接字段的运行态值 */\nconst linkUrl = computed(() => {\n const raw = props.node.bindLink ? props.formData?.[props.node.bindLink] : undefined\n return raw == null ? '' : String(raw)\n})\n/** 展示文本:优先绑定字段值,其次链接地址 */\nconst display = computed(() => {\n if (props.value !== undefined && props.value !== null && props.value !== '') return String(props.value)\n if (linkUrl.value) return linkUrl.value\n return ''\n})\n\n/** 响应式移动端检测:设计器设备切换 + 独立渲染时视口宽度 */\nconst designerStore = useDesignerStore()\nconst _mqMobile = ref(false)\nlet _mq: MediaQueryList | null = null\n\nonMounted(() => {\n _mq = window.matchMedia('(max-width: 768px)')\n _mqMobile.value = _mq.matches\n _mq.addEventListener('change', (e) => { _mqMobile.value = e.matches })\n})\nonUnmounted(() => {\n if (_mq) _mq.removeEventListener('change', () => {})\n})\n\nconst isMobile = computed(() => designerStore.device === 'mobile' || _mqMobile.value)\n</script>\n\n<template>\n <div class=\"fd-label-render\" :class=\"{ 'is-mobile': isMobile }\">\n <span class=\"fd-label-name\">{{ node.label || '标题' }}</span>\n <span class=\"fd-label-value\" :class=\"{ 'fd-label-value--link': isLink }\" :data-key=\"node.bindField\" :style=\"node.color ? { color: node.color } : undefined\">\n <a v-if=\"linkUrl\" class=\"fd-label-link\" :href=\"linkUrl\" target=\"_blank\" rel=\"noopener noreferrer\">{{ display }}</a>\n <template v-else>{{ display }}</template>\n </span>\n </div>\n</template>\n\n<style scoped>\n.fd-label-render {\n display: flex;\n align-items: stretch;\n font-size: 1.4rem;\n line-height: 1.5;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n overflow: hidden;\n}\n.fd-label-name {\n width: 16rem;\n flex-shrink: 0;\n padding: 1.1rem 1.2rem;\n background: var(--fd-color-bg-hover);\n border-right: 1px solid var(--fd-color-border);\n color: var(--fd-color-text-secondary);\n text-align: right;\n font-weight: 500;\n}\n.fd-label-render.is-mobile .fd-label-name {\n width: 12rem;\n}\n.fd-label-value {\n flex: 1;\n min-width: 0;\n padding: 1.1rem 1.2rem;\n background: var(--fd-color-bg-panel);\n color: var(--fd-color-text);\n white-space: pre-wrap;\n word-break: break-all;\n}\n.fd-label-value--link {\n color: var(--fd-color-primary);\n}\n.fd-label-link {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n word-break: break-all;\n}\n.fd-label-link:hover {\n text-decoration: underline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { ElSelect, ElOption } from 'element-plus'\nimport 'element-plus/es/components/select/style/css'\nimport type { LabelWidgetProps, FieldMeta } from '@/types'\n\nconst props = defineProps<{\n node: LabelWidgetProps\n fields: FieldMeta[]\n}>()\n\nconst emit = defineEmits<{\n (e: 'update', patch: Partial<LabelWidgetProps>): void\n}>()\n\n/** 表单字段中的链接类型字段(dataType === 'link'),供「绑定链接」下拉 */\nconst linkFields = computed(() => props.fields.filter((f) => f.dataType === 'link'))\n\n/** 默认字体颜色(与 --fd-color-text 一致) */\nconst DEFAULT_COLOR = '#344054'\n\n/** 颜色输入:非 hex 时回退默认色,保证 color picker 不报错 */\nfunction hexOf(v?: string): string {\n return v && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(v) ? v : DEFAULT_COLOR\n}\n\n/** 色板选择变更 */\nfunction onColorChange(e: Event) {\n emit('update', { color: (e.target as HTMLInputElement).value })\n}\n\n/** 绑定字段变更(el-select 返回类型较宽,统一转为字符串) */\nconst onBindFieldChange = (val: unknown) => {\n emit('update', { bindField: (val as string) ?? '' })\n}\n\n/** 绑定链接变更(el-select 返回类型较宽,统一转为字符串) */\nconst onBindLinkChange = (val: unknown) => {\n emit('update', { bindLink: (val as string) ?? '' })\n}\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>标题</label>\n <input :value=\"node.label\" @input=\"emit('update', { label: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>绑定字段</label>\n <el-select\n :model-value=\"node.bindField\"\n filterable\n clearable\n placeholder=\"搜索并选择字段\"\n style=\"width: 100%\"\n @update:model-value=\"onBindFieldChange\"\n >\n <el-option label=\"不绑定\" value=\"\" />\n <el-option v-for=\"f in fields\" :key=\"f.name\" :label=\"`${f.label}(${f.name})`\" :value=\"f.name\" />\n </el-select>\n </div>\n <div class=\"fd-panel-item\">\n <label>绑定链接</label>\n <el-select\n :model-value=\"node.bindLink\"\n filterable\n clearable\n placeholder=\"搜索并选择链接字段\"\n style=\"width: 100%\"\n @update:model-value=\"onBindLinkChange\"\n >\n <el-option label=\"不绑定\" value=\"\" />\n <el-option v-for=\"f in linkFields\" :key=\"f.name\" :label=\"`${f.label}(${f.name})`\" :value=\"f.name\" />\n </el-select>\n </div>\n <div class=\"fd-panel-item\">\n <label>字体颜色</label>\n <div class=\"fd-color-row\">\n <input type=\"color\" :value=\"hexOf(node.color)\" @input=\"onColorChange\" />\n <input\n type=\"text\"\n :value=\"node.color\"\n @input=\"emit('update', { color: ($event.target as HTMLInputElement).value })\"\n placeholder=\"默认 #344054\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-panel {\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n}\n.fd-panel-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-panel-item label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-panel-item input,\n.fd-panel-item select {\n height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n background: var(--fd-color-bg-panel);\n}\n\n/* 颜色输入:色板 + 文本输入(与 SubtablePanel 一致) */\n.fd-color-row {\n display: flex;\n gap: 0.6rem;\n align-items: center;\n}\n.fd-panel .fd-panel-item .fd-color-row input[type='color'] {\n width: 3.6rem;\n height: 3.2rem;\n padding: 0.2rem;\n flex-shrink: 0;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel);\n cursor: pointer;\n}\n.fd-color-row input:not([type='color']) {\n flex: 1;\n min-width: 0;\n}\n</style>\n","import type { WidgetProps } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport LabelDesign from './LabelDesign.vue'\nimport LabelRender from './LabelRender.vue'\nimport LabelPanel from './LabelPanel.vue'\n\nexport const labelDefinition: WidgetDefinition = {\n type: 'label',\n title: 'Label 文本',\n design: LabelDesign,\n render: LabelRender,\n panel: LabelPanel,\n isContainer: false,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'label',\n label: 'Label 文本',\n bindField: '',\n bindLink: '',\n color: '#344054',\n }),\n serialize: (props: WidgetProps) => props,\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { Component } from 'vue'\nimport { icons } from 'lucide-vue-next'\n\n/**\n * 通用 lucide 图标组件:按名称动态渲染 lucide-vue-next 图标。\n * 继承父元素 color(lucide 默认 stroke=currentColor)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 图标名(PascalCase,如 ScanSearch / Download) */\n name: string\n /** 图标尺寸(px 或任意 CSS 尺寸) */\n size?: number | string\n /** 描边宽度 */\n strokeWidth?: number\n }>(),\n {\n size: 18,\n strokeWidth: 2,\n },\n)\n\nconst icon = computed<Component | null>(() => {\n if (!props.name) return null\n return (icons as Record<string, Component>)[props.name] || null\n})\n</script>\n\n<template>\n <component :is=\"icon\" v-if=\"icon\" :size=\"size\" :stroke-width=\"strokeWidth\" />\n</template>\n","<script setup lang=\"ts\">\nimport type { CardWidgetProps } from '@/types'\nimport { useDesignerStore } from '@/stores/designer'\nimport LucideIcon from '@/components/LucideIcon.vue'\n\nconst props = defineProps<{ node: CardWidgetProps }>()\nconst store = useDesignerStore()\n\n/** 设计器中点击箭头展开/收起(视图操作,不计入撤销) */\nfunction toggleExpanded() {\n store.setExpanded(props.node.id, !props.node.expanded)\n}\n</script>\n\n<template>\n <div class=\"fd-card-design\">\n <div class=\"fd-card-head\">\n <span v-if=\"node.icon\" class=\"fd-card-icon\" :style=\"{ background: node.iconBgColor || undefined }\">\n <LucideIcon :name=\"node.icon\" :size=\"18\" />\n </span>\n <span class=\"fd-card-title\">{{ node.label || '卡片标题' }}</span>\n <span\n class=\"fd-card-arrow\"\n :class=\"{ 'is-open': node.expanded }\"\n :title=\"node.expanded ? '收起' : '展开'\"\n @click.stop=\"toggleExpanded\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </span>\n </div>\n <div v-show=\"node.expanded\" class=\"fd-card-body\">\n <slot name=\"children\">\n <div class=\"fd-card-empty\">拖拽子控件到此处</div>\n </slot>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-card-design {\n border: 1px solid var(--fd-color-border);\n border-radius: 14px;\n background: var(--fd-color-bg-panel);\n box-shadow: 0 2px 10px rgba(25, 55, 95, 0.06);\n overflow: hidden;\n}\n.fd-card-head {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 64px;\n padding: 0 22px;\n background: transparent;\n}\n.fd-card-icon {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--fd-color-primary);\n background: var(--fd-color-primary-light);\n border-radius: 9px;\n}\n.fd-card-title {\n flex: 1;\n font-size: 17px;\n font-weight: 700;\n color: var(--fd-color-text);\n}\n.fd-card-arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border-radius: 8px;\n color: var(--fd-color-text-tertiary);\n cursor: pointer;\n transition: transform 0.3s, background 0.2s;\n}\n.fd-card-arrow:hover {\n background: var(--fd-color-bg-hover);\n}\n.fd-card-arrow svg {\n width: 16px;\n height: 16px;\n display: block;\n}\n.fd-card-arrow.is-open {\n transform: rotate(180deg);\n}\n.fd-card-body {\n padding: 0 22px 22px;\n min-height: 6rem;\n background: var(--fd-color-bg-panel);\n}\n.fd-card-empty {\n border: 1px dashed var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n padding: 1.6rem;\n text-align: center;\n color: var(--fd-color-text-tertiary);\n font-size: 1.3rem;\n}\n</style>\n","import type { HiddenMode } from '@/types'\n\n/**\n * 依据「是否隐藏」模式与流程状态 status 判断控件是否应隐藏。\n *\n * status 源自渲染器接收到的表单数据:\n * - 查看 0\n * - 发起 10\n * - 审批 20\n *\n * 隐藏规则:\n * - none 不隐藏\n * - not-start 非发起时隐藏(status != 10)\n * - not-approval 非审批时隐藏(status != 20)\n */\nexport function isWidgetHidden(hiddenMode: HiddenMode | undefined, status: unknown): boolean {\n if (!hiddenMode || hiddenMode === 'none') return false\n const s = Number(status)\n if (hiddenMode === 'start') return s === 10\n if (hiddenMode === 'not-start') return s !== 10\n if (hiddenMode === 'not-approval') return s !== 20\n return false\n}\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { CardWidgetProps } from '@/types'\nimport LucideIcon from '@/components/LucideIcon.vue'\nimport { isWidgetHidden } from '../visibility'\n\nconst props = defineProps<{\n node: CardWidgetProps\n /** 运行态表单数据(取 status 判断是否隐藏) */\n formData?: Record<string, unknown>\n}>()\nconst expanded = ref(props.node.expanded)\n</script>\n\n<template>\n <div v-if=\"!isWidgetHidden(node.hiddenMode, formData?.status)\" class=\"fd-card-render\">\n <div class=\"fd-card-head\" @click=\"expanded = !expanded\">\n <span v-if=\"node.icon\" class=\"fd-card-icon\" :style=\"{ background: node.iconBgColor || undefined }\">\n <LucideIcon :name=\"node.icon\" :size=\"18\" />\n </span>\n <span class=\"fd-card-title\">{{ node.label || '卡片标题' }}</span>\n <span class=\"fd-card-arrow\" :class=\"{ 'is-open': expanded }\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </span>\n </div>\n <div v-show=\"expanded\" class=\"fd-card-body\">\n <slot name=\"children\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-card-render {\n border: 1px solid var(--fd-color-border);\n border-radius: 14px;\n background: var(--fd-color-bg-panel);\n box-shadow: 0 2px 10px rgba(25, 55, 95, 0.06);\n overflow: hidden;\n}\n.fd-card-head {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 64px;\n padding: 0 22px;\n background: transparent;\n cursor: pointer;\n user-select: none;\n}\n.fd-card-icon {\n width: 28px;\n height: 28px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--fd-color-primary);\n background: var(--fd-color-primary-light);\n border-radius: 9px;\n}\n.fd-card-title {\n flex: 1;\n font-size: 17px;\n font-weight: 700;\n color: var(--fd-color-text);\n}\n.fd-card-arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 28px;\n height: 28px;\n border-radius: 8px;\n color: var(--fd-color-text-tertiary);\n transition: transform 0.3s;\n}\n.fd-card-arrow svg {\n width: 16px;\n height: 16px;\n display: block;\n}\n.fd-card-arrow.is-open {\n transform: rotate(180deg);\n}\n.fd-card-body {\n padding: 0 22px 22px;\n min-height: 6rem;\n background: var(--fd-color-bg-panel);\n}\n</style>\n","<script setup lang=\"ts\">\ndefineProps<{ modelValue: boolean; disabled?: boolean }>()\nconst emit = defineEmits<{ (e: 'update:modelValue', value: boolean): void }>()\n</script>\n\n<template>\n <button\n type=\"button\"\n class=\"fd-switch\"\n :class=\"{ 'is-on': modelValue }\"\n :disabled=\"disabled\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n @click=\"emit('update:modelValue', !modelValue)\"\n >\n <span class=\"fd-switch-dot\"></span>\n </button>\n</template>\n\n<style scoped>\n.fd-switch {\n position: relative;\n width: 3.6rem;\n height: 2rem;\n padding: 0;\n border: none;\n border-radius: 1rem;\n background: var(--fd-color-border-hover);\n cursor: pointer;\n flex-shrink: 0;\n transition: background var(--fd-transition);\n}\n.fd-switch.is-on {\n background: var(--fd-color-primary);\n}\n.fd-switch:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.fd-switch-dot {\n position: absolute;\n top: 0.2rem;\n left: 0.2rem;\n width: 1.6rem;\n height: 1.6rem;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n transition: transform var(--fd-transition);\n}\n.fd-switch.is-on .fd-switch-dot {\n transform: translateX(1.6rem);\n}\n</style>\n","/**\n * 卡片组件图标枚举(lucide 图标名)\n * 引入 approval-lease.html 使用的 lucide 图标依赖(lucide-vue-next),\n * 图标按名称动态渲染,避免使用图片资源。\n */\n\n/** 卡片组件可选 lucide 图标名(PascalCase,对应 lucide-vue-next 的图标组件) */\nexport const cardIconNames = [\n // 卡片 / 布局通用\n 'LayoutGrid',\n 'PanelTop',\n 'Folder',\n 'FolderOpen',\n 'FileText',\n 'ClipboardList',\n 'ClipboardCheck',\n // 业务语义(源自 approval-lease.html 卡片:铺位/品牌/合同/递增/免租/计费/预算/招调/指导价)\n 'MapPin',\n 'Store',\n 'Building2',\n 'Badge',\n 'Tag',\n 'CalendarDays',\n 'TrendingUp',\n 'Clock',\n 'Calculator',\n 'Receipt',\n 'Target',\n 'ChartPie',\n 'ChartLine',\n 'CircleDollarSign',\n // 通用 / 状态\n 'Briefcase',\n 'Scale',\n 'ShieldCheck',\n 'Sparkles',\n 'ScanSearch',\n 'MessageSquareText',\n 'GitBranch',\n 'Paperclip',\n 'Download',\n 'Upload',\n 'Network',\n 'Printer',\n 'CircleCheck',\n 'CircleAlert',\n 'Info',\n 'Bell',\n 'Settings',\n 'User',\n 'Users',\n 'Heart',\n 'Star',\n 'Lightbulb',\n 'Award',\n 'BookOpen',\n 'Coins',\n 'Wallet',\n] as const\n\nexport type CardIconName = (typeof cardIconNames)[number]\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { CardWidgetProps, FieldMeta, HiddenMode } from '@/types'\nimport FdSwitch from '@/components/FdSwitch.vue'\nimport LucideIcon from '@/components/LucideIcon.vue'\nimport { cardIconNames } from './icons'\n\ndefineProps<{ node: CardWidgetProps; fields: FieldMeta[] }>()\nconst emit = defineEmits<{ (e: 'update', patch: Partial<CardWidgetProps>): void }>()\n\n/** 图标选择弹层开关 */\nconst iconOpen = ref(false)\n\nfunction selectIcon(icon: string) {\n emit('update', { icon })\n iconOpen.value = false\n}\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>标题</label>\n <input :value=\"node.label\" @input=\"emit('update', { label: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>图标</label>\n <div class=\"fd-icon-picker\">\n <button type=\"button\" class=\"fd-icon-trigger\" @click=\"iconOpen = !iconOpen\">\n <LucideIcon v-if=\"node.icon\" :name=\"node.icon\" :size=\"16\" />\n <span v-else class=\"fd-icon-placeholder\">无图标</span>\n <svg class=\"fd-icon-caret\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n <div v-if=\"iconOpen\" class=\"fd-icon-popover\" @click.stop>\n <div class=\"fd-icon-grid\">\n <button type=\"button\" class=\"fd-icon-option\" :class=\"{ active: !node.icon }\" title=\"无图标\" @click=\"selectIcon('')\">\n <span class=\"fd-icon-none\">无</span>\n </button>\n <button\n v-for=\"ic in cardIconNames\"\n :key=\"ic\"\n type=\"button\"\n class=\"fd-icon-option\"\n :class=\"{ active: node.icon === ic }\"\n :title=\"ic\"\n @click=\"selectIcon(ic)\"\n >\n <LucideIcon :name=\"ic\" :size=\"18\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"fd-panel-item\">\n <label>图标底色</label>\n <input :value=\"node.iconBgColor\" @input=\"emit('update', { iconBgColor: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item fd-panel-item--row\">\n <label>初始展开</label>\n <FdSwitch :model-value=\"node.expanded\" @update:model-value=\"emit('update', { expanded: $event })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>宽度</label>\n <input :value=\"node.width\" @input=\"emit('update', { width: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>是否隐藏</label>\n <select :value=\"node.hiddenMode || 'none'\" @change=\"emit('update', { hiddenMode: ($event.target as HTMLSelectElement).value as HiddenMode })\">\n <option value=\"none\">不隐藏</option>\n <option value=\"start\">发起时隐藏</option>\n <option value=\"not-start\">非发起时隐藏</option>\n <option value=\"not-approval\">非审批时隐藏</option>\n </select>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-panel {\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n}\n.fd-panel-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-panel-item--row {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n}\n.fd-panel-item label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-panel-item input,\n.fd-panel-item select {\n height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n background: var(--fd-color-bg-panel);\n}\n.fd-panel-item select {\n color: var(--fd-color-text);\n cursor: pointer;\n}\n/* 图标选择器 */\n.fd-icon-picker {\n position: relative;\n}\n.fd-icon-trigger {\n width: 100%;\n height: 3.2rem;\n padding: 0 0.8rem;\n display: flex;\n align-items: center;\n gap: 0.6rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel);\n color: var(--fd-color-text);\n cursor: pointer;\n}\n.fd-icon-trigger:hover {\n border-color: var(--fd-color-border-hover);\n}\n.fd-icon-placeholder {\n flex: 1;\n text-align: left;\n font-size: 1.4rem;\n color: var(--fd-color-text-tertiary);\n}\n.fd-icon-caret {\n width: 1.4rem;\n height: 1.4rem;\n margin-left: auto;\n color: var(--fd-color-text-tertiary);\n}\n.fd-icon-popover {\n position: absolute;\n z-index: 20;\n top: calc(100% + 0.4rem);\n left: 0;\n right: 0;\n padding: 0.8rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel);\n box-shadow: var(--fd-shadow-pop);\n max-height: 26rem;\n overflow-y: auto;\n}\n.fd-icon-grid {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 0.4rem;\n}\n.fd-icon-option {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 3.2rem;\n border: 1px solid transparent;\n border-radius: var(--fd-radius-base);\n background: transparent;\n color: var(--fd-color-text);\n cursor: pointer;\n}\n.fd-icon-option:hover {\n background: var(--fd-color-bg-hover);\n}\n.fd-icon-option.active {\n border-color: var(--fd-color-primary);\n background: var(--fd-color-bg-active);\n color: var(--fd-color-primary);\n}\n.fd-icon-none {\n font-size: 1.2rem;\n}\n</style>\n","import type { WidgetProps } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport CardDesign from './CardDesign.vue'\nimport CardRender from './CardRender.vue'\nimport CardPanel from './CardPanel.vue'\n\nexport const cardDefinition: WidgetDefinition = {\n type: 'card',\n title: '卡片容器',\n design: CardDesign,\n render: CardRender,\n panel: CardPanel,\n isContainer: true,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'card',\n label: '卡片标题',\n bindField: '',\n icon: '',\n iconBgColor: '',\n expanded: true,\n width: '',\n hiddenMode: 'none',\n children: [],\n }),\n serialize: (props: WidgetProps) => props,\n}\n","<script setup lang=\"ts\">\nimport type { SlotWidgetProps } from '@/types'\n\ndefineProps<{ node: SlotWidgetProps }>()\n</script>\n\n<template>\n <div class=\"fd-slot-design\">\n <span class=\"fd-slot-tag\">插槽</span>\n <span class=\"fd-slot-name\">{{ node.slotName || '未命名插槽' }}</span>\n <span class=\"fd-slot-hint\">宿主注入:{{ node.slotName }}</span>\n </div>\n</template>\n\n<style scoped>\n.fd-slot-design {\n display: flex;\n align-items: center;\n gap: 0.8rem;\n padding: 1.2rem 1.6rem;\n border: 1px dashed var(--fd-color-border-hover);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-hover);\n}\n.fd-slot-tag {\n padding: 0.2rem 0.8rem;\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-primary-light);\n color: var(--fd-color-primary);\n font-size: 1.2rem;\n}\n.fd-slot-name {\n font-weight: 600;\n color: var(--fd-color-text);\n}\n.fd-slot-hint {\n margin-left: auto;\n color: var(--fd-color-text-tertiary);\n font-size: 1.2rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { SlotWidgetProps, FormMode } from '@/types'\nimport { isWidgetHidden } from '../visibility'\n\ndefineProps<{\n node: SlotWidgetProps\n mode?: FormMode\n formId?: string\n formData?: Record<string, unknown>\n}>()\n</script>\n\n<template>\n <div v-if=\"!isWidgetHidden(node.hiddenMode, formData?.status)\" class=\"fd-slot-render\">\n <!-- 渲染时转为命名插槽,宿主按 slotName 注入内容(作用域插槽透传 node/formData 等) -->\n <slot\n :name=\"node.slotName\"\n :node=\"node\"\n :form-data=\"formData\"\n :mode=\"mode\"\n :form-id=\"formId\"\n >\n <div class=\"fd-slot-missing\">未注入插槽:{{ node.slotName }}</div>\n </slot>\n </div>\n</template>\n\n<style scoped>\n.fd-slot-render {\n margin: 0;\n}\n.fd-slot-missing {\n padding: 1.2rem 1.6rem;\n border: 1px dashed var(--fd-color-border-hover);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-hover);\n color: var(--fd-color-text-tertiary);\n font-size: 1.3rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { SlotWidgetProps, FieldMeta, HiddenMode } from '@/types'\n\ndefineProps<{ node: SlotWidgetProps; fields: FieldMeta[] }>()\nconst emit = defineEmits<{ (e: 'update', patch: Partial<SlotWidgetProps>): void }>()\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>标题</label>\n <input :value=\"node.label\" @input=\"emit('update', { label: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>插槽名</label>\n <input :value=\"node.slotName\" placeholder=\"如 header / basic-info\" @input=\"emit('update', { slotName: ($event.target as HTMLInputElement).value })\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>是否隐藏</label>\n <select :value=\"node.hiddenMode || 'none'\" @change=\"emit('update', { hiddenMode: ($event.target as HTMLSelectElement).value as HiddenMode })\">\n <option value=\"none\">不隐藏</option>\n <option value=\"start\">发起时隐藏</option>\n <option value=\"not-start\">非发起时隐藏</option>\n <option value=\"not-approval\">非审批时隐藏</option>\n </select>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-panel {\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n}\n.fd-panel-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-panel-item label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-panel-item input,\n.fd-panel-item select {\n height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n background: var(--fd-color-bg-panel);\n}\n.fd-panel-item select {\n color: var(--fd-color-text);\n cursor: pointer;\n}\n</style>\n","import type { WidgetProps } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport SlotDesign from './SlotDesign.vue'\nimport SlotRender from './SlotRender.vue'\nimport SlotPanel from './SlotPanel.vue'\n\nexport const slotDefinition: WidgetDefinition = {\n type: 'slot',\n title: '插槽',\n design: SlotDesign,\n render: SlotRender,\n panel: SlotPanel,\n isContainer: false,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'slot',\n label: '插槽',\n bindField: '',\n slotName: '',\n slotProps: {},\n hiddenMode: 'none',\n }),\n serialize: (props: WidgetProps) => props,\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { SubtableWidgetProps } from '@/types'\n\nconst props = defineProps<{ node: SubtableWidgetProps }>()\n\n/**\n * 展示形态:仅由「表格样式」配置决定(cards=卡片列表,其它=表格),不做响应式处理。\n */\nconst showTable = computed(() => props.node.tablestyle !== 'cards')\n</script>\n\n<template>\n <div class=\"fd-st-design\">\n <!-- 表格(表格样式 = table 时展示) -->\n <div v-if=\"showTable\" class=\"fd-st-table-wrap\">\n <table class=\"fd-st-table\">\n <thead>\n <tr>\n <th v-if=\"node.secondtableindex === '1'\" class=\"fd-st-seq\">序号</th>\n <th v-for=\"col in node.colnums.filter((c) => c.isshow === 1)\" :key=\"col.name\" :style=\"{ width: col.showwidth || undefined }\">\n {{ col.showname || col.major || col.name }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td v-if=\"node.secondtableindex === '1'\" class=\"fd-st-seq\">1</td>\n <td\n v-for=\"col in node.colnums.filter((c) => c.isshow === 1)\"\n :key=\"col.name\"\n class=\"fd-st-cell\"\n :class=\"{ 'fd-st-cell--link': !!col.bindLink }\"\n >\n {{ col.name }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- 卡片列表(表格样式 = cards 时展示) -->\n <div v-else class=\"fd-st-cards\">\n <div class=\"fd-st-card\">\n <div\n v-for=\"col in node.colnums.filter((c) => c.isshow === 1)\"\n :key=\"col.name\"\n class=\"fd-st-card-row\"\n >\n <span class=\"fd-st-card-label\">{{ col.showname || col.major }}</span>\n <span class=\"fd-st-card-value\" :class=\"{ 'fd-st-card-value--link': !!col.bindLink }\">{{ col.name }}</span>\n </div>\n </div>\n <div v-if=\"node.colnums.filter((c) => c.isshow === 1).length === 0\" class=\"fd-st-cards-empty\">\n 暂无列配置\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-st-design {\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel);\n overflow: hidden;\n}\n/* 表格外层容器:宽度不足时横向滚动 */\n.fd-st-table-wrap {\n overflow-x: auto;\n}\n.fd-st-table {\n /* 内容宽于容器时按内容撑开(触发横向滚动),窄时仍撑满容器 */\n width: max-content;\n min-width: 100%;\n border-collapse: collapse;\n}\n.fd-st-table th {\n background: var(--fd-color-bg-hover);\n color: var(--fd-color-text-secondary);\n font-weight: 600;\n}\n.fd-st-table th,\n.fd-st-table td {\n border: 1px solid var(--fd-color-border);\n padding: 0.8rem 1rem;\n font-size: 1.3rem;\n text-align: left;\n}\n.fd-st-seq {\n width: 5rem;\n text-align: center !important;\n}\n.fd-st-cell {\n color: var(--fd-color-text-secondary);\n}\n/* 链接列:高亮 + pointer(设计态仅预览样式,不跳转) */\n.fd-st-cell--link {\n color: var(--fd-color-primary);\n cursor: pointer;\n}\n\n/* ===== 移动端:卡片列表(参考 image 3.png 风格) ===== */\n.fd-st-cards {\n display: flex;\n flex-direction: column;\n gap: .8rem;\n}\n.fd-st-card {\n display: flex;\n flex-direction: column;\n gap: 0.6rem;\n background: var(--fd-color-bg-panel);\n border-radius: var(--fd-radius-base);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);\n border: 1px solid var(--fd-color-border);\n}\n.fd-st-card-row {\n display: flex;\n align-items: flex-start;\n padding: 1rem 1.4rem;\n border-bottom: 1px solid var(--fd-color-border);\n}\n.fd-st-card-row:last-child {\n border-bottom: none\n}\n.fd-st-card-label {\n flex: 0 0 11.5rem;\n max-width: 11.5rem;\n color: var(--fd-color-text-secondary);\n font-size: 1.3rem;\n}\n.fd-st-card-value {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--fd-color-text);\n font-size: 1.3rem;\n word-break: break-all;\n display: flex;\n align-items: center\n}\n.fd-st-card-value--link {\n color: var(--fd-color-primary);\n cursor: pointer;\n}\n.fd-st-cards-empty {\n text-align: center;\n font-size: 1.3rem;\n color: var(--fd-color-text-tertiary);\n padding: 2rem 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { SubtableWidgetProps, ColumnConfig } from '@/types'\n\nconst props = defineProps<{\n node: SubtableWidgetProps\n formData?: Record<string, unknown>\n}>()\n\nconst cols = computed(() => props.node.colnums.filter((c) => c.isshow === 1))\nconst readonly = computed(() => props.node.isreadonly === '1')\n\nconst rows = computed<Record<string, unknown>[]>(() => {\n const raw = props.formData?.[props.node.secondtable]\n if (Array.isArray(raw)) return raw as Record<string, unknown>[]\n return []\n})\n\nconst visible = computed(() => {\n if (props.node.nodatahidetable === '1' && rows.value.length === 0) return false\n return true\n})\n\n/**\n * 展示形态:仅由「表格样式」配置决定(cards=卡片列表,其它=表格),不做响应式处理。\n */\nconst showTable = computed(() => props.node.tablestyle !== 'cards')\n\nfunction addRow() {\n if (readonly.value) return\n const blank: Record<string, unknown> = {}\n cols.value.forEach((c) => (blank[c.name] = ''))\n if (props.formData && Array.isArray(props.formData[props.node.secondtable])) {\n ;(props.formData[props.node.secondtable] as Record<string, unknown>[]).push(blank)\n }\n}\n\nfunction delRow(idx: number) {\n if (readonly.value) return\n if (props.formData && Array.isArray(props.formData[props.node.secondtable])) {\n ;(props.formData[props.node.secondtable] as Record<string, unknown>[]).splice(idx, 1)\n }\n}\n\nfunction cellText(row: Record<string, unknown>, name: string): string {\n const v = row[name]\n return v === undefined || v === null ? '' : String(v)\n}\n\n/** 链接地址:列绑定链接字段时取该字段在当前行的值;未绑定或空值返回 ''(按文本渲染) */\nfunction linkUrl(col: ColumnConfig, row: Record<string, unknown>): string {\n return col.bindLink ? cellText(row, col.bindLink) : ''\n}\n\n/**\n * 同内容合并:列开启(issamecolmerge === 1)时,同列相邻内容相同的单元格合并为一个(rowspan)。\n * spans[ci][ri]:该单元格纵向占据的行数;skipped[ci][ri]:是否被上方合并覆盖(不渲染 td)。\n * 空值不参与合并,避免整列空白被合成一格。\n */\nconst mergeInfo = computed(() => {\n const list = rows.value\n const spans: number[][] = []\n const skipped: boolean[][] = []\n cols.value.forEach((col, ci) => {\n spans[ci] = []\n skipped[ci] = []\n const enable = col.issamecolmerge === 1\n let start = 0\n for (let ri = 0; ri < list.length; ri++) {\n const cur = cellText(list[ri], col.name)\n const same =\n enable && cur !== '' && ri > 0 && cur === cellText(list[ri - 1], col.name)\n if (same) {\n skipped[ci][ri] = true\n spans[ci][start] += 1\n } else {\n skipped[ci][ri] = false\n spans[ci][ri] = 1\n start = ri\n }\n }\n })\n return { spans, skipped }\n})\n\n/** 单元格是否被上方合并覆盖(true 则不渲染该 td) */\nfunction isMerged(ci: number, ri: number): boolean {\n return mergeInfo.value.skipped[ci]?.[ri] === true\n}\n\n/** 合并单元格的 rowspan(1 时不输出属性) */\nfunction rowspanOf(ci: number, ri: number): number | undefined {\n const s = mergeInfo.value.spans[ci]?.[ri]\n return s && s > 1 ? s : undefined\n}\n</script>\n\n<template>\n <div v-if=\"visible\" class=\"fd-st-render\" :subtable-key=\"node.secondtable\">\n <!-- 表格 / 卡片列表(由「表格样式」配置决定) -->\n <div v-if=\"showTable\" class=\"fd-st-table-wrap\">\n <table class=\"fd-st-table\">\n <thead>\n <tr>\n <th v-if=\"node.secondtableindex === '1'\" class=\"fd-st-seq\">序号</th>\n <th v-for=\"col in cols\" :key=\"col.name\" :subtable-val=\"col.name\" :style=\"{ width: col.showwidth || undefined, textAlign: col.align || 'left' }\">\n {{ col.showname || col.major || col.name }}\n </th>\n <th v-if=\"!readonly\" class=\"fd-st-op\">操作</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, idx) in rows\" :key=\"idx\">\n <td v-if=\"node.secondtableindex === '1'\" class=\"fd-st-seq\">{{ idx + 1 }}</td>\n <template v-for=\"(col, ci) in cols\" :key=\"col.name\">\n <td\n v-if=\"!isMerged(ci, idx)\"\n :rowspan=\"rowspanOf(ci, idx)\"\n :subtable-val=\"col.name\"\n :style=\"{ textAlign: col.align || 'left', color: col.prospect || undefined, background: col.background || undefined }\"\n >\n <a\n v-if=\"linkUrl(col, row)\"\n class=\"fd-st-link\"\n :href=\"linkUrl(col, row)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >{{ cellText(row, col.name) }}</a>\n <template v-else>{{ cellText(row, col.name) }}</template>\n </td>\n </template>\n <td v-if=\"!readonly\" class=\"fd-st-op\">\n <button class=\"fd-btn fd-btn--danger\" @click=\"delRow(idx)\">删除</button>\n </td>\n </tr>\n <tr v-if=\"rows.length === 0\">\n <td :colspan=\"cols.length + (node.secondtableindex === '1' ? 1 : 0) + (readonly ? 0 : 1)\" class=\"fd-st-empty\">\n {{ node.nodatatitle === '1' ? '暂无数据' : '' }}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- 卡片列表(表格样式 = cards 时展示) -->\n <div v-else class=\"fd-st-cards\">\n <div v-for=\"(row, idx) in rows\" :key=\"idx\" class=\"fd-st-card\">\n <div\n v-for=\"col in cols\"\n :key=\"col.name\"\n class=\"fd-st-card-row\"\n >\n <span class=\"fd-st-card-label\">{{ col.showname || col.major || col.name }}</span>\n <span class=\"fd-st-card-value\" :subtable-val=\"col.name\">\n <a\n v-if=\"linkUrl(col, row)\"\n class=\"fd-st-link\"\n :href=\"linkUrl(col, row)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >{{ cellText(row, col.name) }}</a>\n <template v-else>{{ cellText(row, col.name) }}</template>\n </span>\n </div>\n <div v-if=\"!readonly\" class=\"fd-st-card-actions\">\n <button class=\"fd-btn fd-btn--danger fd-btn--sm\" @click=\"delRow(idx)\">删除</button>\n </div>\n </div>\n <div v-if=\"rows.length === 0\" class=\"fd-st-cards-empty\">\n {{ node.nodatatitle === '1' ? '暂无数据' : '' }}\n </div>\n </div>\n\n <button v-if=\"!readonly\" class=\"fd-btn fd-btn--primary fd-st-add\" @click=\"addRow\">新增一行</button>\n </div>\n</template>\n\n<style scoped>\n.fd-st-render {\n background: var(--fd-color-bg-panel);\n}\n/* 表格外层容器:宽度不足时横向滚动 */\n.fd-st-table-wrap {\n overflow-x: auto;\n}\n.fd-st-table {\n /* 内容宽于容器时按内容撑开(触发横向滚动),窄时仍撑满容器 */\n width: max-content;\n min-width: 100%;\n border-spacing: 0;\n border-collapse: separate;\n border: 1px solid #e4eaf2;\n border-radius: 1rem;\n overflow: hidden;\n background: #fff;\n}\n.fd-st-table th,\n.fd-st-table td {\n border: 0;\n border-right: 1px solid #e4eaf2;\n border-bottom: 1px solid #e4eaf2;\n padding: 1.1rem 1.2rem;\n line-height: 1.45;\n font-size: 1.3rem;\n}\n.fd-st-table tr > *:last-child {\n border-right: 0;\n}\n.fd-st-table th {\n color: #667085;\n background: #f8fafc;\n font-weight: 500;\n}\n.fd-st-table thead th {\n color: #475467;\n background: #f6f8fb;\n font-weight: 600;\n}\n.fd-st-seq {\n width: 5rem;\n text-align: center !important;\n}\n.fd-st-op {\n width: 8rem;\n text-align: center;\n}\n.fd-st-empty {\n text-align: center;\n color: var(--fd-color-text-secondary);\n padding: 1.6rem;\n}\n/* 链接列:主题色高亮 + pointer,点击新窗口打开 */\n.fd-st-link {\n color: var(--fd-color-primary);\n cursor: pointer;\n text-decoration: none;\n word-break: break-all;\n}\n.fd-st-link:hover {\n text-decoration: underline;\n}\n.fd-st-add {\n margin: 1rem 1.2rem;\n}\n\n/* ===== 移动端:卡片列表 ===== */\n.fd-st-cards {\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n}\n.fd-st-card {\n display: flex;\n flex-direction: column;\n background: var(--fd-color-bg-panel);\n border-radius: var(--fd-radius-base);\n box-shadow: 0 0.1rem 0.2rem rgba(0, 0, 0, 0.06);\n border: 1px solid var(--fd-color-border);\n}\n.fd-st-card-row {\n display: flex;\n align-items: flex-start;\n padding: 1rem 1.4rem;\n border-bottom: 1px solid var(--fd-color-border);\n}\n.fd-st-card-row:last-child {\n border-bottom: none;\n}\n.fd-st-card-label {\n flex: 0 0 11.5rem;\n max-width: 11.5rem;\n color: var(--fd-color-text-secondary);\n font-size: 1.3rem;\n}\n.fd-st-card-value {\n flex: 1 1 auto;\n min-width: 0;\n color: var(--fd-color-text);\n font-size: 1.3rem;\n word-break: break-all;\n}\n.fd-st-card-actions {\n display: flex;\n justify-content: flex-end;\n padding: 0.8rem 1.4rem;\n border-top: 1px solid var(--fd-color-border);\n}\n.fd-st-cards-empty {\n text-align: center;\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n padding: 2rem 1rem;\n}\n</style>\n","import template from '../../template_mock.json'\nimport type { FormSchema, ColumnConfig } from '@/types'\n\n/** 子表字段(用于生成默认列与预览行数据) */\nexport interface SubtableField {\n name: string\n label: string\n dataType: 'string' | 'date' | 'number' | 'money' | 'file' | 'link'\n}\n\n/** 子表定义:可绑定到子表组件的数据源 */\nexport interface SubtableDef {\n /** 子表名 / 业务对象标识(即 secondtable 取值) */\n name: string\n /** 子表显示名 */\n label: string\n /** 子表字段(决定默认展示列) */\n fields: SubtableField[]\n}\n\n/**\n * 可选子表枚举(后续由子表元数据接口下发;此处 mock)。\n * 字段整理自 approval-lease.html 各子表区块。\n */\nexport const mockSubtables: SubtableDef[] = [\n {\n name: 'SG_ZL_YYQHTSPC',\n label: '原合同退租信息',\n fields: [\n { name: 'shop_no', label: '铺位号', dataType: 'string' },\n { name: 'brand_name', label: '品牌名称', dataType: 'string' },\n { name: 'quit_reason', label: '合同退租原因', dataType: 'string' },\n { name: 'quit_date', label: '合同退租日期', dataType: 'date' },\n { name: 'deduct_amount', label: '合同扣款金额', dataType: 'money' },\n { name: 'detail', label: '详情', dataType: 'string' },\n { name: 'detail_url', label: '详情链接', dataType: 'link' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTYS',\n label: '预算完成情况预测',\n fields: [\n { name: 'calibers', label: '测算口径', dataType: 'string' },\n { name: 'fee_item', label: '费项', dataType: 'string' },\n { name: 'annual_budget', label: '年度预算(A)', dataType: 'money' },\n { name: 'contract_receivable', label: '合同应收(B)', dataType: 'money' },\n { name: 'budget_gap', label: '预算缺口(C=B-A)', dataType: 'money' },\n { name: 'forecast_income', label: '预测收入(D)', dataType: 'money' },\n { name: 'forecast_gap', label: '预测缺口(E=D-A)', dataType: 'money' },\n { name: 'light', label: '亮灯提示', dataType: 'string' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTHT',\n label: '合同列表',\n fields: [\n { name: 'seq', label: '序号', dataType: 'number' },\n { name: 'contract_type', label: '合同类型', dataType: 'string' },\n { name: 'contract_name', label: '合同名称', dataType: 'string' },\n { name: 'party_a', label: '甲方', dataType: 'string' },\n { name: 'party_b', label: '乙方', dataType: 'string' },\n { name: 'use_template', label: '使用合同模版', dataType: 'string' },\n { name: 'operate', label: '操作', dataType: 'string' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTJB',\n label: '交办记录',\n fields: [\n { name: 'original_approver', label: '原审批人', dataType: 'string' },\n { name: 'delegate_to', label: '交办人', dataType: 'string' },\n { name: 'delegate_time', label: '交办时间', dataType: 'date' },\n { name: 'delegate_opinion', label: '交办意见', dataType: 'string' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTFJ',\n label: '附件信息',\n fields: [\n { name: 'seq', label: '序号', dataType: 'number' },\n { name: 'attachment_type', label: '附件类型', dataType: 'string' },\n { name: 'file_name', label: '文件名称', dataType: 'file' },\n { name: 'upload_user', label: '上传人', dataType: 'string' },\n { name: 'upload_time', label: '上传时间', dataType: 'date' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTTH',\n label: '退回详情',\n fields: [\n { name: 'approver', label: '审批人', dataType: 'string' },\n { name: 'description', label: '说明', dataType: 'string' },\n { name: 'reject_reason', label: '退回原因', dataType: 'string' },\n { name: 'reject_time', label: '时间', dataType: 'date' },\n ],\n },\n {\n name: 'SG_ZL_YYQHTFK',\n label: '合同付款计划',\n fields: [\n { name: 'pay_phase', label: '期次', dataType: 'string' },\n { name: 'pay_amount', label: '金额', dataType: 'money' },\n { name: 'pay_date', label: '计划付款日', dataType: 'date' },\n { name: 'pay_status', label: '状态', dataType: 'string' },\n ],\n },\n]\n\n/** 供「选择子表」下拉使用的选项 */\nexport const subtableOptions = mockSubtables.map((s) => ({ name: s.name, label: s.label }))\n\n/** 按子表名取定义 */\nexport function getSubtableDef(name: string): SubtableDef | undefined {\n return mockSubtables.find((s) => s.name === name)\n}\n\n/** 由子表字段生成默认列配置(不同子表默认展示字段不同) */\nexport function buildDefaultColumns(def: SubtableDef): ColumnConfig[] {\n return def.fields.map((f, i) => {\n const isFile = f.dataType === 'file'\n return {\n name: f.name,\n isshow: 1,\n major: '',\n showname: f.label,\n showwidth: '',\n background: '',\n prospect: '',\n issum: 0,\n index: i + 1,\n align: '',\n iscompletehide: 0,\n iscompletehidecode: '',\n issamecolmerge: 0,\n bindLink: '',\n editmode: { editmode: isFile ? 'files' : 'text', title: isFile ? '文件' : '文本' },\n events: [],\n }\n })\n}\n\n/** mock 默认表单模板(来自 template_mock.json) */\nexport function mockSchema(formId: string): FormSchema {\n return {\n ...(template as unknown as FormSchema),\n formId,\n }\n}\n","<script setup lang=\"ts\">\nimport { reactive, computed, nextTick } from 'vue'\nimport { ElSelect, ElOption } from 'element-plus'\nimport 'element-plus/es/components/select/style/css'\nimport type { SubtableWidgetProps, FieldMeta, ColumnConfig } from '@/types'\nimport FdSwitch from '@/components/FdSwitch.vue'\nimport { subtableOptions, getSubtableDef, buildDefaultColumns } from '@/api/mock'\n\nconst props = defineProps<{ node: SubtableWidgetProps; fields: FieldMeta[] }>()\nconst emit = defineEmits<{ (e: 'update', patch: Partial<SubtableWidgetProps>): void }>()\n\nfunction set<K extends keyof SubtableWidgetProps>(key: K, value: SubtableWidgetProps[K]) {\n emit('update', { [key]: value } as Partial<SubtableWidgetProps>)\n}\n\n/** 选择子表:写入 secondtable,并按该子表字段生成默认展示列(不同子表默认字段不同) */\nfunction onSelectSubtable(val: unknown) {\n const name = (val as string) ?? ''\n const def = getSubtableDef(name)\n const patch: Partial<SubtableWidgetProps> = { secondtable: name }\n if (def) {\n patch.displaytitle = def.label\n patch.colnums = buildDefaultColumns(def)\n }\n emit('update', patch)\n}\n\n/** 弹窗编辑态:克隆列对象,确定时写回 */\nconst dialog = reactive<{ open: boolean; index: number; draft: ColumnConfig | null }>({\n open: false,\n index: -1,\n draft: null,\n})\n\nfunction clone(col: ColumnConfig): ColumnConfig {\n return JSON.parse(JSON.stringify(col))\n}\n\nfunction openCol(idx: number) {\n dialog.index = idx\n dialog.draft = clone(props.node.colnums[idx])\n dialog.open = true\n}\n\nfunction closeDialog() {\n dialog.open = false\n dialog.draft = null\n dialog.index = -1\n}\n\nfunction saveCol() {\n if (dialog.draft && dialog.index >= 0) {\n const next = [...props.node.colnums]\n next[dialog.index] = dialog.draft\n emit('update', { colnums: next })\n }\n closeDialog()\n}\n\nfunction toggleCol(col: ColumnConfig, visible: boolean) {\n col.isshow = visible ? 1 : 0\n emit('update', { colnums: [...props.node.colnums] })\n}\n\nasync function addCol() {\n const col: ColumnConfig = {\n name: `col_${Date.now().toString(36)}`,\n isshow: 1,\n major: '',\n showname: '新列',\n showwidth: '',\n background: '',\n prospect: '',\n issum: 0,\n index: props.node.colnums.length + 1,\n align: '',\n iscompletehide: 0,\n iscompletehidecode: '',\n issamecolmerge: 0,\n bindLink: '',\n editmode: { editmode: 'text', title: '文本' },\n events: [],\n }\n emit('update', { colnums: [...props.node.colnums, col] })\n await nextTick()\n openCol(props.node.colnums.length - 1)\n}\n\nfunction delCol(idx: number) {\n const next = props.node.colnums.slice()\n next.splice(idx, 1)\n emit('update', { colnums: next })\n}\n\n/** 颜色输入:非 hex 时回退,保证 color picker 不报错 */\nfunction hexOf(v: string): string {\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(v) ? v : '#ffffff'\n}\nfunction setColor(key: 'background' | 'prospect', e: Event) {\n if (dialog.draft) dialog.draft[key] = (e.target as HTMLInputElement).value\n}\n\n/** 当前子表字段集合(供列字段下拉选择) */\nconst subtableFields = computed(() => getSubtableDef(props.node.secondtable)?.fields ?? [])\n\n/** 子表字段中的链接类型字段(dataType === 'link'),供「链接」下拉绑定跳转地址 */\nconst linkFields = computed(() => subtableFields.value.filter((f) => f.dataType === 'link'))\n\n/** 绑定链接字段变更(空字符串表示不绑定) */\nfunction onBindLink(val: unknown) {\n if (!dialog.draft) return\n dialog.draft.bindLink = (val as string) ?? ''\n}\n\n/** 表格样式变更(空值回退 table) */\nfunction onTablestyle(val: unknown) {\n set('tablestyle', ((val as string) || 'table') as SubtableWidgetProps['tablestyle'])\n}\n\n/** 选择列字段:写入 name,并联动填充显示标题与编辑控件 */\nfunction onColField(e: Event) {\n if (!dialog.draft) return\n const name = (e.target as HTMLSelectElement).value\n dialog.draft.name = name\n const f = subtableFields.value.find((x) => x.name === name)\n if (f) {\n dialog.draft.showname = f.label\n const isFile = f.dataType === 'file'\n dialog.draft.editmode.editmode = isFile ? 'files' : 'text'\n dialog.draft.editmode.title = isFile ? '文件' : '文本'\n }\n}\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>选择子表</label>\n <el-select\n :model-value=\"node.secondtable\"\n filterable\n clearable\n placeholder=\"请选择子表\"\n style=\"width: 100%\"\n @update:model-value=\"onSelectSubtable\"\n >\n <el-option v-for=\"opt in subtableOptions\" :key=\"opt.name\" :label=\"`${opt.label}(${opt.name})`\" :value=\"opt.name\" />\n </el-select>\n </div>\n <div class=\"fd-panel-item fd-panel-item--row\">\n <label>只读</label>\n <FdSwitch :model-value=\"node.isreadonly === '1'\" @update:model-value=\"set('isreadonly', $event ? '1' : '0')\" />\n </div>\n <div class=\"fd-panel-item fd-panel-item--row\">\n <label>序号列</label>\n <FdSwitch :model-value=\"node.secondtableindex === '1'\" @update:model-value=\"set('secondtableindex', $event ? '1' : '0')\" />\n </div>\n <div class=\"fd-panel-item\">\n <label>表格样式</label>\n <el-select\n :model-value=\"node.tablestyle || 'table'\"\n style=\"width: 100%\"\n @update:model-value=\"onTablestyle\"\n >\n <el-option label=\"表格\" value=\"table\" />\n <el-option label=\"卡片列表\" value=\"cards\" />\n </el-select>\n </div>\n\n <!-- 列配置:精简卡片列表 -->\n <div class=\"fd-panel-item\">\n <div class=\"fd-cols-head\">\n <span>列配置({{ node.colnums.length }})</span>\n <button class=\"fd-btn fd-btn--primary fd-btn--sm\" @click=\"addCol\">+ 新增列</button>\n </div>\n\n <div v-if=\"node.colnums.length === 0\" class=\"fd-cols-empty\">\n 暂无列,点击「新增列」添加\n </div>\n\n <div v-for=\"(col, idx) in node.colnums\" :key=\"col.name\" class=\"fd-col-card\">\n <div class=\"fd-col-card-top\">\n <span class=\"fd-col-order\">{{ idx + 1 }}</span>\n <div class=\"fd-col-meta\">\n <span class=\"fd-col-title\">{{ col.showname || '未命名列' }}</span>\n <span class=\"fd-col-name-sub\">{{ col.name }}</span>\n </div>\n <span class=\"fd-col-tag\">{{ col.bindLink ? '链接' : '文本' }}</span>\n </div>\n <div class=\"fd-col-card-bottom\">\n <label class=\"fd-col-switch\">\n <span>显示</span>\n <FdSwitch :model-value=\"col.isshow === 1\" @update:model-value=\"toggleCol(col, $event)\" />\n </label>\n <div class=\"fd-col-actions\">\n <button class=\"fd-btn fd-btn--ghost fd-btn--sm\" @click=\"openCol(idx)\">设置</button>\n <button class=\"fd-btn fd-btn--danger fd-btn--sm\" @click=\"delCol(idx)\">删除</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- 列设置弹窗 -->\n <Teleport to=\"body\">\n <div v-if=\"dialog.open && dialog.draft\" class=\"fd-dialog-mask\" @click.self=\"closeDialog\">\n <div class=\"fd-dialog\" style=\"max-width: 560px;\">\n <div class=\"fd-dialog-head\">\n <span>列设置 · {{ dialog.draft.showname || dialog.draft.name || '新列' }}</span>\n <button class=\"fd-dialog-close\" @click=\"closeDialog\" title=\"关闭\">×</button>\n </div>\n <div class=\"fd-dialog-body\">\n <!-- 基本信息 -->\n <section class=\"fd-form-section\">\n <h5 class=\"fd-form-section-h\">基本信息</h5>\n <div class=\"fd-form-grid\">\n <div class=\"fd-form-item\">\n <label>列字段</label>\n <select :value=\"dialog.draft.name\" @change=\"onColField($event)\">\n <option value=\"\">请选择字段</option>\n <option v-for=\"f in subtableFields\" :key=\"f.name\" :value=\"f.name\">{{ f.label }}({{ f.name }})</option>\n </select>\n </div>\n <div class=\"fd-form-item\">\n <label>显示标题</label>\n <input :value=\"dialog.draft.showname\" @input=\"dialog.draft!.showname = ($event.target as HTMLInputElement).value\" placeholder=\"如 姓名\" />\n </div>\n <div class=\"fd-form-item\">\n <label>主表头分组</label>\n <input :value=\"dialog.draft.major\" @input=\"dialog.draft!.major = ($event.target as HTMLInputElement).value\" placeholder=\"可合并表头分组名\" />\n </div>\n <div class=\"fd-form-item\">\n <label>列序号</label>\n <input type=\"number\" min=\"1\" :value=\"dialog.draft.index\" @input=\"dialog.draft!.index = Number(($event.target as HTMLInputElement).value)\" />\n </div>\n </div>\n </section>\n\n <!-- 显示与样式 -->\n <section class=\"fd-form-section\">\n <h5 class=\"fd-form-section-h\">显示与样式</h5>\n <div class=\"fd-form-grid\">\n <div class=\"fd-form-item\">\n <label>列宽</label>\n <input :value=\"dialog.draft.showwidth\" @input=\"dialog.draft!.showwidth = ($event.target as HTMLInputElement).value\" placeholder=\"如 120px 或 20%\" />\n </div>\n <div class=\"fd-form-item\">\n <label>对齐方式</label>\n <select :value=\"dialog.draft.align\" @change=\"dialog.draft!.align = ($event.target as HTMLSelectElement).value as ColumnConfig['align']\">\n <option value=\"\">默认(左)</option>\n <option value=\"left\">左对齐</option>\n <option value=\"center\">居中</option>\n <option value=\"right\">右对齐</option>\n </select>\n </div>\n <div class=\"fd-form-item\">\n <label>背景色</label>\n <div class=\"fd-color-row\">\n <input type=\"color\" :value=\"hexOf(dialog.draft.background)\" @input=\"setColor('background', $event)\" />\n <input :value=\"dialog.draft.background\" @input=\"dialog.draft!.background = ($event.target as HTMLInputElement).value\" placeholder=\"如 #f5f7fa 或空\" />\n </div>\n </div>\n <div class=\"fd-form-item\">\n <label>字体色</label>\n <div class=\"fd-color-row\">\n <input type=\"color\" :value=\"hexOf(dialog.draft.prospect)\" @input=\"setColor('prospect', $event)\" />\n <input :value=\"dialog.draft.prospect\" @input=\"dialog.draft!.prospect = ($event.target as HTMLInputElement).value\" placeholder=\"如 #f5523a 或空\" />\n </div>\n </div>\n </div>\n </section>\n\n <!-- 编辑模式 -->\n <section class=\"fd-form-section\">\n <h5 class=\"fd-form-section-h\">编辑模式</h5>\n <div class=\"fd-form-grid\">\n <div class=\"fd-form-item\">\n <label>同内容合并</label>\n <FdSwitch :model-value=\"dialog.draft.issamecolmerge === 1\" @update:model-value=\"dialog.draft!.issamecolmerge = $event ? 1 : 0\" />\n </div>\n <div class=\"fd-form-item\">\n <label>链接</label>\n <select :value=\"dialog.draft.bindLink ?? ''\" @change=\"onBindLink(($event.target as HTMLSelectElement).value)\">\n <option value=\"\">不绑定</option>\n <option v-for=\"f in linkFields\" :key=\"f.name\" :value=\"f.name\">{{ f.label }}({{ f.name }})</option>\n </select>\n </div>\n </div>\n </section>\n </div>\n <div class=\"fd-dialog-foot\">\n <button class=\"fd-btn fd-btn--ghost\" @click=\"closeDialog\">取消</button>\n <button class=\"fd-btn fd-btn--primary\" @click=\"saveCol\">确定</button>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n\n<style scoped>\n.fd-panel { display: flex; flex-direction: column; gap: 1.2rem; }\n.fd-panel-item { display: flex; flex-direction: column; gap: 0.4rem; }\n.fd-panel-item--row { flex-direction: row; align-items: center; justify-content: space-between; }\n.fd-panel-item label { font-size: 1.3rem; color: var(--fd-color-text-secondary); }\n\n/* 列卡片列表 */\n.fd-cols-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.8rem; font-weight: 600; }\n.fd-cols-empty {\n font-size: 1.3rem; color: var(--fd-color-text-placeholder); text-align: center;\n padding: 1.6rem; border: 1px dashed var(--fd-color-border); border-radius: var(--fd-radius-base);\n}\n.fd-col-card {\n display: flex; flex-direction: column; gap: 0.8rem;\n padding: 1rem 1.2rem; margin-bottom: 0.8rem;\n border: 1px solid var(--fd-color-border); border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel); transition: border-color var(--fd-transition);\n}\n.fd-col-card:hover { border-color: var(--fd-color-primary); }\n.fd-col-card-top { display: flex; align-items: center; gap: 0.8rem; }\n.fd-col-order {\n flex-shrink: 0; width: 2.2rem; height: 2.2rem; border-radius: 50%;\n display: flex; align-items: center; justify-content: center;\n font-size: 1.2rem; font-weight: 600; color: var(--fd-color-primary);\n background: var(--fd-color-primary-light);\n}\n.fd-col-meta { flex: 1; display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }\n.fd-col-title { font-size: 1.4rem; font-weight: 600; color: var(--fd-color-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-col-name-sub { font-size: 1.1rem; color: var(--fd-color-text-tertiary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.fd-col-tag {\n flex-shrink: 0; font-size: 1.1rem; color: var(--fd-color-text-secondary);\n background: var(--fd-color-bg); border: 1px solid var(--fd-color-border);\n padding: 0.2rem 0.6rem; border-radius: var(--fd-radius-base);\n}\n.fd-col-card-bottom { display: flex; align-items: center; justify-content: space-between; }\n.fd-col-switch { display: flex; align-items: center; gap: 0.6rem; font-size: 1.3rem; color: var(--fd-color-text-secondary); }\n.fd-col-actions { display: flex; gap: 0.6rem; }\n\n/* 弹窗内表单:分组 + 两列网格 */\n.fd-form-section { margin-bottom: 1.6rem; }\n.fd-form-section:last-child { margin-bottom: 0; }\n.fd-form-section-h { margin: 0 0 0.8rem; font-size: 1.3rem; font-weight: 600; color: var(--fd-color-text-secondary); }\n.fd-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem 1.6rem; }\n.fd-form-item { display: flex; flex-direction: column; gap: 0.4rem; }\n.fd-form-item label { font-size: 1.3rem; color: var(--fd-color-text-secondary); }\n.fd-color-row { display: flex; gap: 0.6rem; align-items: center; }\n.fd-form-section .fd-form-item .fd-color-row input[type='color'] {\n width: 3.6rem; height: 3.2rem; padding: 0.2rem; flex-shrink: 0;\n border: 1px solid var(--fd-color-border); border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel); cursor: pointer;\n}\n.fd-form-section .fd-form-item .fd-switch { margin-top: .6rem; }\n.fd-color-row input[type='text'] { flex: 1; min-width: 0; }\n\n/* 按钮变体 */\n.fd-btn--sm { height: 2.6rem; padding: 0 1rem; font-size: 1.2rem; }\n.fd-btn--ghost { background: transparent; color: var(--fd-color-primary); border: 1px solid var(--fd-color-primary); }\n.fd-btn--ghost:hover { background: var(--fd-color-primary-light); }\n\n/* 弹窗(与项目 .fd-dialog 风格一致) */\n.fd-dialog-mask {\n position: fixed; inset: 0; z-index: 100;\n background: rgba(0, 0, 0, 0.45);\n display: flex; align-items: center; justify-content: center;\n}\n.fd-dialog {\n width: min(56rem, 92vw); max-height: 82vh;\n display: flex; flex-direction: column;\n background: var(--fd-color-bg-panel); border-radius: var(--fd-radius-lg);\n box-shadow: var(--fd-shadow-pop); overflow: hidden;\n}\n.fd-dialog-head {\n display: flex; align-items: center; gap: 1.2rem;\n padding: 1.2rem 1.6rem; border-bottom: 1px solid var(--fd-color-border);\n font-weight: 600; font-size: 1.5rem;\n}\n.fd-dialog-head span { margin-right: auto; }\n.fd-dialog-close {\n width: 3rem; height: 3rem; padding: 0; font-size: 2rem; line-height: 1;\n border: none; border-radius: var(--fd-radius-base);\n background: transparent; color: var(--fd-color-text-secondary); cursor: pointer;\n}\n.fd-dialog-close:hover { background: var(--fd-color-bg); color: var(--fd-color-text); }\n.fd-dialog-body { padding: 1.6rem; overflow: auto; }\n.fd-dialog-foot {\n display: flex; justify-content: flex-end; gap: 1rem;\n padding: 1.2rem 1.6rem; border-top: 1px solid var(--fd-color-border);\n}\n</style>\n","import type { WidgetProps, SubtableWidgetProps, ColumnConfig } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport SubtableDesign from './SubtableDesign.vue'\nimport SubtableRender from './SubtableRender.vue'\nimport SubtablePanel from './SubtablePanel.vue'\n\nfunction defaultColnums(): ColumnConfig[] {\n return [\n {\n name: 'field1',\n isshow: 1,\n major: '',\n showname: '字段一',\n showwidth: '',\n background: '',\n prospect: '',\n issum: 0,\n index: 1,\n align: '',\n iscompletehide: 0,\n iscompletehidecode: '',\n issamecolmerge: 0,\n bindLink: '',\n editmode: { editmode: 'text', title: '文本' },\n events: [],\n },\n {\n name: 'field2',\n isshow: 1,\n major: '',\n showname: '字段二',\n showwidth: '',\n background: '',\n prospect: '',\n issum: 0,\n index: 2,\n align: '',\n iscompletehide: 0,\n iscompletehidecode: '',\n issamecolmerge: 0,\n bindLink: '',\n editmode: { editmode: 'text', title: '文本' },\n events: [],\n },\n ]\n}\n\nexport const subtableDefinition: WidgetDefinition = {\n type: 'subtable',\n title: '子表',\n design: SubtableDesign,\n render: SubtableRender,\n panel: SubtablePanel,\n isContainer: false,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'subtable',\n label: '子表',\n bindField: '',\n firsttable: '',\n secondtable: '',\n primarytablefiled: '',\n secondtableprimarykey: '',\n secondtablerelationfield: '',\n tabletype: 'subtable',\n displaytitle: '',\n tablestyle: 'table',\n isreadonly: '1',\n isnull: '0',\n issave: '0',\n secondtableindex: '0',\n nodatahidetable: '0',\n nodatatitle: '1',\n fixedcolumn: 0,\n tablewidth: 0,\n tableheight: 0,\n iscompletehide: '0',\n iscompletehidecode: '',\n colnums: defaultColnums(),\n events: [],\n } as SubtableWidgetProps),\n serialize: (props: WidgetProps) => props,\n}\n","<script setup lang=\"ts\">\nimport { useDesignerStore } from '@/stores/designer'\nimport type { GridWidgetProps } from '@/types'\n\ndefineProps<{ node: GridWidgetProps }>()\n\nconst store = useDesignerStore()\n</script>\n\n<template>\n <div class=\"fd-grid-design\" :class=\"{ 'is-mobile': store.device === 'mobile' }\">\n <slot name=\"children\" />\n </div>\n</template>\n\n<style scoped>\n.fd-grid-design {\n display: grid;\n grid-template-columns: repeat(24, 1fr);\n align-items: start;\n}\n.fd-grid-design.is-mobile {\n grid-template-columns: 1fr;\n}\n/* 栅栏格内 label 圆角贴合规则见 src/styles/base.css(按行定位类 is-g-corner-* 控制) */\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { WidgetNode, RenderMode, FormMode } from '@/types'\nimport { getWidgetDef } from '@/widgets/registry'\n\nconst props = defineProps<{\n node: WidgetNode\n mode: RenderMode\n /** 运行态表单模式 */\n formMode?: FormMode\n /** 运行态字段值映射(bindField -> value) */\n formData?: Record<string, unknown>\n /** 表单标识(透传给插槽等需要宿主上下文的控件) */\n formId?: string\n}>()\n\n// 显式声明插槽类型:打断递归组件中动态插槽(#[name])作用域参数的自引用推断。\ndefineSlots<Record<string, (scope: any) => any>>()\n\nconst def = computed(() => getWidgetDef(props.node.type))\nconst Comp = computed(() => {\n if (!def.value) return null\n return props.mode === 'design' ? def.value.design : def.value.render\n})\n\nconst valueOf = (bindField?: string) =>\n bindField && props.formData ? props.formData[bindField] : undefined\n</script>\n\n<template>\n <component\n :is=\"Comp\"\n v-if=\"Comp\"\n :node=\"node\"\n :value=\"valueOf(node.bindField)\"\n :form-data=\"formData\"\n v-bind=\"mode === 'render' ? { formMode, formId } : null\"\n >\n <!-- 将父级传入的插槽全部透传给控件组件(业务插槽最终流入 SlotRender) -->\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"scope\">\n <slot :name=\"name\" v-bind=\"scope || {}\" />\n </template>\n\n <!--\n 容器:父级已提供 children 插槽时(设计态 CanvasNode)由上方 v-for 透传;\n 否则回退为内置递归渲染,并继续向下透传插槽与 formId。\n -->\n <template v-if=\"def?.isContainer && !$slots.children\" #children>\n <WidgetHost\n v-for=\"child in node.children\"\n :key=\"child.id\"\n :node=\"child\"\n :mode=\"mode\"\n :form-mode=\"formMode\"\n :form-data=\"formData\"\n :form-id=\"formId\"\n >\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"scope\">\n <slot :name=\"name\" v-bind=\"scope || {}\" />\n </template>\n </WidgetHost>\n </template>\n </component>\n</template>\n","import type { WidgetNode } from '@/types'\n\n/** 栅栏格总列数:PC 24 等分;移动端单列(每项独占一行) */\nconst PC_COLUMNS = 24\n\ninterface ItemFlag {\n /** 所在行号(从 0 开始) */\n row: number\n /** 是否行首(位于该行最左) */\n rowFirst: boolean\n /** 是否行尾(位于该行最右) */\n rowLast: boolean\n}\n\n/**\n * 计算栅栏格子项的圆角定位类名。\n * 结合各子项 gridSpan 模拟换行摆放,得到每个子项所在行与行首/行尾位置,\n * 仅整体表格四角(首行行首/首行行尾/末行行首/末行行尾)对应的\n * label 子项需要 1rem 圆角,其余子项直角拼接。\n */\nexport function gridCornerClass(\n child: WidgetNode,\n index: number,\n siblings: WidgetNode[],\n layout: number,\n mobile = false,\n): string {\n if (child.type !== 'label' || !siblings.length) return ''\n const total = mobile ? 1 : PC_COLUMNS\n const spanOf = (n: WidgetNode): number => Math.min(Math.max(n.gridSpan || layout || total, 1), total)\n\n // 逐个模拟摆放,记录行号与行首/行尾\n const flags: ItemFlag[] = []\n let col = 0\n let row = 0\n for (const n of siblings) {\n const span = spanOf(n)\n if (col + span > total) {\n col = 0\n row++\n }\n const rowFirst = col === 0\n col += span\n const rowLast = col >= total\n flags.push({ row, rowFirst, rowLast })\n if (col >= total) {\n col = 0\n row++\n }\n }\n\n const f = flags[index]\n if (!f) return ''\n const lastRow = flags[flags.length - 1].row\n const isFirstRow = f.row === 0\n const isLastRow = f.row === lastRow\n\n const cls: string[] = []\n if (f.rowFirst && isFirstRow) cls.push('is-g-corner-tl')\n if (f.rowLast && isFirstRow) cls.push('is-g-corner-tr')\n if (f.rowFirst && isLastRow) cls.push('is-g-corner-bl')\n if (f.rowLast && isLastRow) cls.push('is-g-corner-br')\n return cls.join(' ')\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, onMounted, onUnmounted } from 'vue'\nimport { useDesignerStore } from '@/stores/designer'\nimport type { GridWidgetProps, FormMode } from '@/types'\nimport WidgetHost from '@/components/WidgetHost.vue'\nimport { gridCornerClass } from './corner'\n\ndefineProps<{\n node: GridWidgetProps\n formMode?: FormMode\n formData?: Record<string, unknown>\n formId?: string\n}>()\n\nconst designerStore = useDesignerStore()\nconst _mqMobile = ref(false)\nlet _mq: MediaQueryList | null = null\n\nonMounted(() => {\n _mq = window.matchMedia('(max-width: 768px)')\n _mqMobile.value = _mq.matches\n _mq.addEventListener('change', (e) => { _mqMobile.value = e.matches })\n})\nonUnmounted(() => {\n if (_mq) _mq.removeEventListener('change', () => {})\n})\n\nconst isMobile = computed(() => designerStore.device === 'mobile' || _mqMobile.value)\n</script>\n\n<template>\n <div class=\"fd-grid-render\" :class=\"{ 'is-mobile': isMobile }\">\n <div\n v-for=\"(child, ci) in node.children\"\n :key=\"child.id\"\n class=\"fd-grid-cell\"\n :class=\"gridCornerClass(child, ci, node.children || [], node.layout || 24, isMobile)\"\n :style=\"{ gridColumn: `span ${child.gridSpan || node.layout}` }\"\n >\n <WidgetHost :node=\"child\" mode=\"render\" :form-mode=\"formMode\" :form-data=\"formData\" :form-id=\"formId\">\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"scope\">\n <slot :name=\"name\" v-bind=\"scope || {}\" />\n </template>\n </WidgetHost>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-grid-render {\n display: grid;\n grid-template-columns: repeat(24, 1fr);\n align-items: start;\n}\n.fd-grid-render.is-mobile {\n grid-template-columns: 1fr;\n}\n.fd-grid-cell {\n min-width: 0;\n}\n/* 栅栏格子项默认无间隔:消除子控件自身的下外边距 */\n.fd-grid-cell > :deep(*) {\n margin-bottom: 0;\n}\n/* 栅栏格内 label 圆角贴合规则见 src/styles/base.css(按行定位类 is-g-corner-* 控制) */\n</style>\n","<script setup lang=\"ts\">\nimport type { GridWidgetProps, FieldMeta } from '@/types'\n\nconst props = defineProps<{ node: GridWidgetProps; fields: FieldMeta[] }>()\nconst emit = defineEmits<{ (e: 'update', patch: Partial<GridWidgetProps>): void }>()\n\n/** 布局选项:标签 -> 子组件默认占比(24 栅格制) */\nconst layoutOptions = [\n { label: '2列布局', value: 24 },\n { label: '4列布局', value: 12 },\n { label: '6列布局', value: 8 },\n { label: '8列布局', value: 6 },\n]\n\n/** 一键布局:按当前选中的布局(layout 即每项占比)批量更新所有子组件 */\nfunction applyLayout() {\n const span = props.node.layout || 24\n const children = (props.node.children ?? []).map((c) => ({ ...c, gridSpan: span }))\n emit('update', { children })\n}\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>布局</label>\n <select :value=\"node.layout\" @change=\"emit('update', { layout: Number(($event.target as HTMLSelectElement).value) })\">\n <option v-for=\"opt in layoutOptions\" :key=\"opt.value\" :value=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n <div class=\"fd-panel-item\">\n <label>一键布局</label>\n <button class=\"fd-btn fd-btn--primary fd-btn--sm fd-grid-apply\" @click=\"applyLayout\">\n 应用到全部子组件(每项占比 {{ node.layout || 24 }}/24)\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-panel {\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n}\n.fd-panel-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-panel-item label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-panel-item select {\n height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n background: var(--fd-color-bg-panel);\n}\n.fd-grid-apply {\n width: 100%;\n}\n</style>\n","import type { WidgetProps } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport GridDesign from './GridDesign.vue'\nimport GridRender from './GridRender.vue'\nimport GridPanel from './GridPanel.vue'\n\nexport const gridDefinition: WidgetDefinition = {\n type: 'grid',\n title: '栅栏格',\n design: GridDesign,\n render: GridRender,\n panel: GridPanel,\n isContainer: true,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'grid',\n label: '栅栏格',\n bindField: '',\n // 默认 6 列布局\n layout: 8,\n children: [],\n }),\n serialize: (props: WidgetProps) => props,\n}\n","<script setup lang=\"ts\">\nimport type { TextWidgetProps } from '@/types'\n\ndefineProps<{ node: TextWidgetProps }>()\n</script>\n\n<template>\n <div class=\"fd-text-design\" :style=\"{ display: node.display }\">{{ node.text || '文本内容' }}</div>\n</template>\n\n<style scoped>\n.fd-text-design {\n display: inline-block;\n padding: 0.4rem 0;\n font-size: 1.4rem;\n line-height: 1.5;\n color: var(--fd-color-text);\n white-space: pre-wrap;\n word-break: break-word;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { TextWidgetProps } from '@/types'\n\nconst props = defineProps<{ node: TextWidgetProps; value?: unknown }>()\n\n/** 绑定字段时展示字段值,未绑定时展示文本内容 */\nconst display = computed(() => {\n if (!props.node.bindField) return props.node.text\n const v = props.value\n return v === undefined || v === null ? '' : String(v)\n})\n</script>\n\n<template>\n <div class=\"fd-text-render\" :style=\"{ display: node.display }\">{{ display }}</div>\n</template>\n\n<style scoped>\n.fd-text-render {\n display: inline-block;\n padding: 0.4rem 0;\n font-size: 1.4rem;\n line-height: 1.5;\n color: var(--fd-color-text);\n white-space: pre-wrap;\n word-break: break-word;\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { TextWidgetProps, FieldMeta } from '@/types'\n\ndefineProps<{ node: TextWidgetProps; fields: FieldMeta[] }>()\nconst emit = defineEmits<{ (e: 'update', patch: Partial<TextWidgetProps>): void }>()\n</script>\n\n<template>\n <div class=\"fd-panel\">\n <div class=\"fd-panel-item\">\n <label>文本</label>\n <textarea\n rows=\"4\"\n :value=\"node.text\"\n @input=\"emit('update', { text: ($event.target as HTMLTextAreaElement).value })\"\n />\n </div>\n <div class=\"fd-panel-item\">\n <label>绑定字段</label>\n <select :value=\"node.bindField\" @change=\"emit('update', { bindField: ($event.target as HTMLSelectElement).value })\">\n <option value=\"\">不绑定</option>\n <option v-for=\"f in fields\" :key=\"f.name\" :value=\"f.name\">{{ f.label }}({{ f.name }})</option>\n </select>\n </div>\n <div class=\"fd-panel-item\">\n <label>对齐方式</label>\n <select\n :value=\"node.display\"\n @change=\"emit('update', { display: ($event.target as HTMLSelectElement).value as TextWidgetProps['display'] })\"\n >\n <option value=\"inline-block\">对齐</option>\n <option value=\"block\">换行</option>\n </select>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-panel {\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n}\n.fd-panel-item {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-panel-item label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-panel-item textarea,\n.fd-panel-item select {\n padding: 0.8rem 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n font-family: inherit;\n line-height: 1.5;\n background: var(--fd-color-bg-panel);\n}\n.fd-panel-item textarea {\n resize: vertical;\n}\n.fd-panel-item select {\n height: 3.2rem;\n}\n</style>\n","import type { WidgetProps } from '@/types'\nimport type { WidgetDefinition } from '../types'\nimport TextDesign from './TextDesign.vue'\nimport TextRender from './TextRender.vue'\nimport TextPanel from './TextPanel.vue'\n\nexport const textDefinition: WidgetDefinition = {\n type: 'text',\n title: '文本',\n design: TextDesign,\n render: TextRender,\n panel: TextPanel,\n isContainer: false,\n createDefaultProps: (): WidgetProps => ({\n id: '',\n type: 'text',\n label: '文本',\n bindField: '',\n text: '文本内容',\n display: 'inline-block',\n }),\n serialize: (props: WidgetProps) => props,\n}\n","import { registerComponent } from './registry'\nimport { labelDefinition } from './label'\nimport { cardDefinition } from './card'\nimport { slotDefinition } from './slot'\nimport { subtableDefinition } from './subtable'\nimport { gridDefinition } from './grid'\nimport { textDefinition } from './text'\n\nlet registered = false\n\n/** 注册内置控件(幂等) */\nexport function registerBuiltinWidgets(): void {\n if (registered) return\n registered = true\n registerComponent(labelDefinition)\n registerComponent(cardDefinition)\n registerComponent(slotDefinition)\n registerComponent(subtableDefinition)\n registerComponent(gridDefinition)\n registerComponent(textDefinition)\n}\n\nexport * from './registry'\nexport * from './types'\n\n// 模块加载即注册内置控件,保证直接使用 Designer/Renderer(未走插件 install)时控件可用\nregisterBuiltinWidgets()\n","import { defineStore } from 'pinia'\nimport type {\n WidgetType,\n WidgetNode,\n FieldMeta,\n FormSchema,\n FormEvents,\n LifecycleHook,\n CustomEvent,\n} from '@/types'\nimport { createWidget, getWidgetDef } from '@/widgets'\n\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v))\n\ninterface State {\n formId: string\n dbtable: string\n fields: FieldMeta[]\n widgets: WidgetNode[]\n selectedId: string | null\n past: WidgetNode[][]\n future: WidgetNode[][]\n /** 拖拽来源 id(设计器内部拖拽用) */\n draggingId: string | null\n /** 画布设备预览(仅影响宽度,不进 Schema) */\n device: 'pc' | 'mobile'\n /** 拖拽插入指示:目标节点 id 与是否插在其前 */\n dragOverId: string | null\n dragBefore: boolean\n /** 拖拽放入容器高亮 */\n dropContainerId: string | null\n /** 是否选中「表单」本身(点击画板空白处) */\n selectedForm: boolean\n /** 表单级事件配置(全局事件) */\n events: FormEvents\n /** 是否由 formId 参数(prop / 路径)打开,决定保存时覆盖还是新建 */\n openedWithParam: boolean\n}\n\nfunction findNode(list: WidgetNode[], id: string): WidgetNode | null {\n for (const n of list) {\n if (n.id === id) return n\n if (n.children) {\n const f = findNode(n.children, id)\n if (f) return f\n }\n }\n return null\n}\n\nfunction removeNode(list: WidgetNode[], id: string): boolean {\n const i = list.findIndex((n) => n.id === id)\n if (i >= 0) {\n list.splice(i, 1)\n return true\n }\n for (const n of list) {\n if (n.children && removeNode(n.children, id)) return true\n }\n return false\n}\n\n/**\n * 显式声明 getters / actions 形状:\n * pinia 对 options store 的推断类型过大,生成 d.ts 时会触发 TS7056\n * (推断类型超出编译器序列化上限),故通过显式泛型参数固定 store 类型。\n */\ntype DesignerGetters = {\n selectedNode: (state: State) => WidgetNode | null\n canUndo: (state: State) => boolean\n canRedo: (state: State) => boolean\n customEventOptions: (state: State) => CustomEvent[]\n}\n\ninterface DesignerActions {\n commit(): void\n undo(): void\n redo(): void\n select(id: string | null): void\n selectForm(): void\n setLifecycleHook(hook: LifecycleHook, code: string): void\n addCustomEvent(): void\n updateCustomEvent(index: number, patch: Partial<CustomEvent>): void\n removeCustomEvent(index: number): void\n addWidget(type: WidgetType, parentId?: string | null, index?: number): void\n isDescendant(node: WidgetNode, maybeChildId: string): boolean\n moveNode(id: string, toParentId: string | null, index: number): void\n removeWidget(id: string): void\n moveSibling(id: string, delta: number): void\n updateNode(id: string, patch: Record<string, unknown>): void\n setDragging(id: string | null): void\n setExpanded(id: string, expanded: boolean): void\n dropTo(targetId: string | null): void\n loadSchema(schema: FormSchema): void\n toSchema(): FormSchema\n setFields(fields: FieldMeta[]): void\n}\n\nexport const useDesignerStore = defineStore<'designer', State, DesignerGetters, DesignerActions>('designer', {\n state: (): State => ({\n formId: 'SG_ZL_YYQHTSP',\n dbtable: 'SG_ZL_YYQHTSP',\n fields: [],\n widgets: [],\n selectedId: null,\n past: [],\n future: [],\n draggingId: null,\n device: 'pc',\n dragOverId: null,\n dragBefore: false,\n dropContainerId: null,\n selectedForm: false,\n events: { lifecycle: {}, custom: [] },\n openedWithParam: false,\n }),\n getters: {\n selectedNode: (s): WidgetNode | null => (s.selectedId ? findNode(s.widgets, s.selectedId) : null),\n canUndo: (s) => s.past.length > 0,\n canRedo: (s) => s.future.length > 0,\n /** 供控件「事件」下拉选择使用的自定义事件列表 */\n customEventOptions: (s): CustomEvent[] => s.events.custom,\n },\n actions: {\n /** 提交一次变更快照(用于撤销重做) */\n commit() {\n this.past.push(clone(this.widgets))\n if (this.past.length > 50) this.past.shift()\n this.future = []\n },\n undo() {\n const prev = this.past.pop()\n if (!prev) return\n this.future.push(clone(this.widgets))\n this.widgets = prev\n if (this.selectedId && !findNode(this.widgets, this.selectedId)) this.selectedId = null\n },\n redo() {\n const next = this.future.pop()\n if (!next) return\n this.past.push(clone(this.widgets))\n this.widgets = next\n },\n select(id: string | null) {\n this.selectedId = id\n this.selectedForm = false\n },\n /** 点击画板空白处:选中表单本身(用于配置表单级属性) */\n selectForm() {\n this.selectedId = null\n this.selectedForm = true\n },\n /** 设置生命周期事件代码片段 */\n setLifecycleHook(hook: LifecycleHook, code: string) {\n this.events.lifecycle[hook] = code\n },\n /** 新增一条自定义事件(默认占位) */\n addCustomEvent() {\n const n = this.events.custom.length + 1\n this.events.custom.push({ name: `event_${n}`, title: `自定义事件${n}`, handler: '' })\n },\n /** 更新某条自定义事件 */\n updateCustomEvent(index: number, patch: Partial<CustomEvent>) {\n const item = this.events.custom[index]\n if (item) Object.assign(item, patch)\n },\n /** 删除某条自定义事件 */\n removeCustomEvent(index: number) {\n this.events.custom.splice(index, 1)\n },\n /** 新增控件:parentId 指定容器,index 指定插入位置(不传则末尾) */\n addWidget(type: WidgetType, parentId?: string | null, index?: number) {\n const node = createWidget(type) as WidgetNode\n this.commit()\n const parent = parentId ? findNode(this.widgets, parentId) : null\n if (parent && getWidgetDef(parent.type)?.isContainer) {\n parent.children = parent.children || []\n // 拖入栅栏格:默认占比 = 栅栏格布局\n if (parent.type === 'grid' && node.gridSpan == null) {\n node.gridSpan = (parent as { layout?: number }).layout || 24\n }\n if (index == null || index > parent.children.length) parent.children.push(node)\n else parent.children.splice(Math.max(0, index), 0, node)\n } else {\n if (index == null || index > this.widgets.length) this.widgets.push(node)\n else this.widgets.splice(Math.max(0, index), 0, node)\n }\n this.selectedId = node.id\n },\n /** 判断 maybeChild 是否为 node 的后代(防止把容器拖进自己) */\n isDescendant(node: WidgetNode, maybeChildId: string): boolean {\n if (!node.children) return false\n for (const c of node.children) {\n if (c.id === maybeChildId) return true\n if (this.isDescendant(c, maybeChildId)) return true\n }\n return false\n },\n /** 移动已有控件到指定容器 / 根,插入位置 index */\n moveNode(id: string, toParentId: string | null, index: number) {\n if (id === toParentId) return\n const srcNode = findNode(this.widgets, id)\n if (!srcNode) return\n // 不能把节点拖入它自己的后代(否则形成循环);同容器内重排是允许的\n if (toParentId && this.isDescendant(srcNode, toParentId)) return\n const target = toParentId ? findNode(this.widgets, toParentId) : null\n\n // 定位源节点所在的兄弟列表与下标\n const locate = (list: WidgetNode[]): { list: WidgetNode[]; index: number } | null => {\n const i = list.findIndex((n) => n.id === id)\n if (i >= 0) return { list, index: i }\n for (const n of list) {\n if (n.children) {\n const r = locate(n.children)\n if (r) return r\n }\n }\n return null\n }\n const src = locate(this.widgets)\n if (!src) return\n\n // 目标兄弟列表\n let destList: WidgetNode[]\n if (target && getWidgetDef(target.type)?.isContainer) {\n target.children = target.children || []\n destList = target.children\n } else {\n destList = this.widgets\n }\n\n this.commit()\n // 同一列表内移动:源在插入点之前时,先移除源会使目标下标前移一位\n let idx = index\n if (destList === src.list && src.index < index) idx = index - 1\n const [node] = src.list.splice(src.index, 1)\n idx = Math.max(0, Math.min(idx, destList.length))\n destList.splice(idx, 0, node)\n // 栅栏格内保留/初始化「占比」;移出栅栏格则清除\n if (target && target.type === 'grid') {\n const def = (target as { layout?: number }).layout || 24\n // 从别处进入栅栏格 → 取目标栅栏格布局;格内重排 → 保留手动占比\n if (src.list !== destList || node.gridSpan == null) node.gridSpan = def\n } else {\n delete node.gridSpan\n }\n this.selectedId = node.id\n },\n removeWidget(id: string) {\n this.commit()\n removeNode(this.widgets, id)\n if (this.selectedId === id) this.selectedId = null\n },\n moveSibling(id: string, delta: number) {\n const findParent = (list: WidgetNode[]): WidgetNode[] | null => {\n const i = list.findIndex((n) => n.id === id)\n if (i >= 0) return list\n for (const n of list) {\n if (n.children) {\n const r = findParent(n.children)\n if (r) return r\n }\n }\n return null\n }\n const parent = findParent(this.widgets)\n if (!parent) return\n const i = parent.findIndex((n) => n.id === id)\n const j = i + delta\n if (j < 0 || j >= parent.length) return\n this.commit()\n const [item] = parent.splice(i, 1)\n parent.splice(j, 0, item)\n },\n updateNode(id: string, patch: Record<string, unknown>) {\n const node = findNode(this.widgets, id)\n if (!node) return\n Object.assign(node, patch)\n // 子节点整体替换(属性面板传 colnums 等)\n this.commit()\n },\n setDragging(id: string | null) {\n this.draggingId = id\n },\n /** 展开/收起容器(设计器视图操作,不写入撤销历史) */\n setExpanded(id: string, expanded: boolean) {\n const node = findNode(this.widgets, id)\n if (node && 'expanded' in node) node.expanded = expanded\n },\n /** 将 draggingId 控件移动到 targetId(容器)或根 */\n dropTo(targetId: string | null) {\n const dragId = this.draggingId\n if (!dragId) return\n if (dragId === targetId) return\n this.commit()\n const detach = (list: WidgetNode[]): WidgetNode | null => {\n const i = list.findIndex((n) => n.id === dragId)\n if (i >= 0) {\n const [found] = list.splice(i, 1)\n return found\n }\n for (const n of list) {\n if (n.children) {\n const found = detach(n.children)\n if (found) return found\n }\n }\n return null\n }\n const node = detach(this.widgets)\n if (!node) {\n this.draggingId = null\n return\n }\n if (targetId) {\n const target = findNode(this.widgets, targetId)\n if (target && getWidgetDef(target.type)?.isContainer) {\n target.children = target.children || []\n target.children.push(node)\n } else {\n this.widgets.push(node)\n }\n } else {\n this.widgets.push(node)\n }\n this.draggingId = null\n this.selectedId = node.id\n },\n loadSchema(schema: FormSchema) {\n this.formId = schema.formId\n this.dbtable = schema.dbtable\n this.fields = schema.fields\n this.widgets = clone(schema.widgets)\n this.events = schema.events ? clone(schema.events) : { lifecycle: {}, custom: [] }\n this.selectedId = null\n this.selectedForm = false\n this.past = []\n this.future = []\n },\n toSchema(): FormSchema {\n return {\n formId: this.formId,\n dbtable: this.dbtable,\n fields: this.fields,\n widgets: this.widgets,\n events: clone(this.events),\n }\n },\n setFields(fields: FieldMeta[]) {\n this.fields = fields\n },\n },\n})\n","import type { FormSchema } from '@/types'\nimport { mockSchema } from './mock'\n\n/**\n * 接口模块动态配置(四级优先级:props > install options > setApiModule > 默认值)\n */\ninterface ApiConfig {\n baseModule: string\n apiModule: string\n}\nconst DEFAULT: ApiConfig = { baseModule: '', apiModule: 'form-designer' }\nlet runtime: Partial<ApiConfig> = {}\nlet installOptions: Partial<ApiConfig> = {}\n/** props 由调用方在每次请求时传入,优先级最高 */\nlet propsOverride: Partial<ApiConfig> = {}\n\nexport function configureApi(options: Partial<ApiConfig>): void {\n installOptions = { ...installOptions, ...options }\n}\n\nexport function setApiModule(module: string): void {\n runtime.apiModule = module\n}\n\nexport function setBaseModule(module: string): void {\n runtime.baseModule = module\n}\n\nexport function setApiProps(props: Partial<ApiConfig>): void {\n propsOverride = props\n}\n\n/** 计算最终取值(高 -> 低) */\nexport function resolveApiConfig(): ApiConfig {\n return {\n baseModule: propsOverride.baseModule ?? runtime.baseModule ?? installOptions.baseModule ?? DEFAULT.baseModule,\n apiModule: propsOverride.apiModule ?? runtime.apiModule ?? installOptions.apiModule ?? DEFAULT.apiModule,\n }\n}\n\n/** 拼装请求路径:{baseModule}/api/{apiModule}/{action}/{id} */\nexport function buildUrl(action: string, id = ''): string {\n const { baseModule, apiModule } = resolveApiConfig()\n const base = baseModule ? `/${baseModule}` : ''\n return `${base}/api/${apiModule}/${action}${id ? `/${id}` : ''}`\n}\n\n/**\n * 获取表单 JSON Schema(初版 mock,后续替换为真实请求)\n */\nexport async function getSchema(formId: string, props?: Partial<ApiConfig>): Promise<FormSchema> {\n if (props) setApiProps(props)\n const url = buildUrl('getschema', formId)\n // TODO: 对接后端时替换为真实请求:return http.get(url)\n void url\n return JSON.parse(JSON.stringify(mockSchema(formId)))\n}\n\n/**\n * 保存表单 Schema\n */\nexport async function saveSchema(schema: FormSchema, props?: Partial<ApiConfig>): Promise<void> {\n if (props) setApiProps(props)\n const url = buildUrl('saveschema', schema.formId)\n // TODO: 对接后端时替换为真实请求:return http.post(url, schema)\n void url\n void schema\n}\n","import type { FormSchema } from '@/types'\n\n/** 本地存储 key 前缀 */\nconst KEY_PREFIX = 'fd:form:'\n\n/** 生成 GUID(RFC4122 v4),优先使用原生 crypto.randomUUID */\nexport function genGuid(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n // 降级实现\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n/** 将表单 Schema 存至本地(key 为 formId) */\nexport function saveFormToLocal(formId: string, schema: FormSchema): void {\n localStorage.setItem(KEY_PREFIX + formId, JSON.stringify(schema))\n}\n\n/** 从本地读取表单 Schema;不存在或解析失败返回 null */\nexport function loadFormFromLocal(formId: string): FormSchema | null {\n const raw = localStorage.getItem(KEY_PREFIX + formId)\n if (!raw) return null\n try {\n return JSON.parse(raw) as FormSchema\n } catch {\n return null\n }\n}\n","/**\n * 表单事件处理代码片段的安全执行器。\n * handler 为设计态编写的代码字符串,运行态在此沙箱内执行,避免直接 eval 散落各处。\n */\n\n/** 注入 key:自定义事件触发器,运行态组件可通过 inject 调用 */\nexport const INJECT_FIRE_EVENT = 'fdFireEvent'\n\nexport interface HandlerContext {\n /** 表单数据(bindField -> value) */\n formData?: Record<string, unknown>\n /** 触发事件名(自定义事件) */\n event?: string\n /** 变化字段名(onValueChange) */\n field?: string\n /** 变化后的值(onValueChange) */\n value?: unknown\n /** 透传给业务的其他上下文 */\n [key: string]: unknown\n}\n\nexport function runHandler(code: string | undefined, ctx: HandlerContext = {}): unknown {\n if (!code || !code.trim()) return undefined\n try {\n // 以 ctx 为唯一入参,严格模式隔离全局污染\n const fn = new Function('ctx', `\"use strict\";\\n${code}`)\n return fn(ctx)\n } catch (e) {\n console.error('[form-designer] 事件处理函数执行失败:', e)\n return undefined\n }\n}\n\n/**\n * 执行「自定义方法」代码:将代码作为独立 <script> 注入文档执行,\n * 顶层的 function 声明会挂载为 window 上的全局方法,\n * 从而可在其他事件处理代码中直接调用(如 myMethod(ctx))。\n * 脚本同步执行后即移除节点,已挂载的方法不受影响。\n *\n * 注意:不能用 new Function 包裹——函数声明只存在于该函数作用域,不会挂载全局。\n */\nexport function mountGlobalMethods(code: string | undefined): void {\n if (!code || !code.trim() || typeof document === 'undefined') return\n try {\n const script = document.createElement('script')\n script.text = code\n document.head.appendChild(script)\n // 同步执行已完成,移除节点(顶层函数声明已挂至 window)\n script.remove()\n } catch (e) {\n console.error('[form-designer] 自定义方法挂载失败:', e)\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, onMounted, provide, watch } from 'vue'\nimport type { WidgetNode, FormMode, FormEvents, LifecycleHook } from '@/types'\nimport { getWidgetDef } from '@/widgets'\nimport WidgetHost from '@/components/WidgetHost.vue'\nimport { runHandler, mountGlobalMethods, INJECT_FIRE_EVENT } from '@/utils/formEvents'\n\nconst props = defineProps<{\n widgets: WidgetNode[]\n formMode?: FormMode\n formData?: Record<string, unknown>\n /** 表单级事件配置(全局事件),由宿主从 Schema 透传 */\n events?: FormEvents\n /** 表单标识(透传给插槽等需要宿主上下文的控件) */\n formId?: string\n}>()\n\n/** 按控件声明的 visibleModes 做粗粒度显隐控制 */\nconst visibleWidgets = computed(() =>\n props.widgets.filter((node) => {\n const modes = getWidgetDef(node.type)?.visibleModes\n if (!modes || modes.length === 0) return true\n return props.formMode ? modes.includes(props.formMode) : true\n }),\n)\n\n/** 运行指定生命周期钩子 */\nfunction runLifecycle(hook: LifecycleHook): void {\n const code = props.events?.lifecycle[hook]\n runHandler(code, { formData: props.formData, event: hook })\n}\n\n/** 触发自定义事件:执行对应 name 的 handler */\nfunction fireEvent(name: string, payload?: unknown): void {\n const ev = props.events?.custom.find((e) => e.name === name)\n if (!ev) return\n runHandler(ev.handler, { formData: props.formData, event: name, payload })\n}\n\n// 渲染时绑定至对应钩子函数\nprovide(INJECT_FIRE_EVENT, fireEvent)\nonMounted(() => {\n runLifecycle('onLoad')\n runLifecycle('onMounted')\n // 自定义方法:代码中声明的方法挂载至 window,供其他事件处理调用\n mountGlobalMethods(props.events?.lifecycle.custom)\n})\nwatch(\n () => props.formData,\n () => runLifecycle('onValueChange'),\n { deep: true },\n)\n\ndefineExpose({ fireEvent, runLifecycle })\n</script>\n\n<template>\n <div class=\"fd-renderer\">\n <WidgetHost\n v-for=\"node in visibleWidgets\"\n :key=\"node.id\"\n :node=\"node\"\n mode=\"render\"\n :form-mode=\"formMode\"\n :form-data=\"formData\"\n :form-id=\"formId\"\n >\n <!-- 将宿主传入的命名插槽透传给每个控件(插槽控件最终以 <slot> 消费) -->\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"scope\">\n <slot :name=\"name\" v-bind=\"scope || {}\" />\n </template>\n </WidgetHost>\n </div>\n</template>\n\n<style scoped>\n.fd-renderer {\n display: block;\n padding: 1.6rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from 'vue'\nimport { ElTree } from 'element-plus'\nimport 'element-plus/es/components/tree/style/css'\nimport { useDesignerStore } from '@/stores/designer'\nimport { getWidgetDef } from '@/widgets'\nimport type { WidgetNode } from '@/types'\n\ninterface TreeNode {\n id: string\n label: string\n name: string\n sub: string\n children?: TreeNode[]\n}\n\nconst store = useDesignerStore()\n\n/** 控件节点 -> ElTree 节点 */\nfunction toTreeNode(node: WidgetNode): TreeNode {\n const def = getWidgetDef(node.type)\n const label = (node as { label?: string }).label\n const name = def?.title ?? node.type\n return {\n id: node.id,\n label: label ? `${name} · ${label}` : name,\n name,\n sub: label ?? '',\n children: node.children?.map(toTreeNode),\n }\n}\n\nconst treeData = computed<TreeNode[]>(() => store.widgets.map(toTreeNode))\n\n/** 递归统计节点总数 */\nconst totalCount = computed(() => {\n const walk = (list: WidgetNode[]): number =>\n list.reduce((n, x) => n + 1 + walk(x.children ?? []), 0)\n return walk(store.widgets)\n})\n\n/** 点击节点:选中对应控件,并将画布滚动至该组件处 */\nfunction onNodeClick(data: TreeNode) {\n store.select(data.id)\n nextTick(() => {\n document\n .querySelector('.fd-canvas-node.is-selected')\n ?.scrollIntoView({ block: 'nearest' })\n })\n}\n</script>\n\n<template>\n <div class=\"fd-tree\">\n <div class=\"fd-tree-head\">\n <svg class=\"fd-tree-head-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n <span class=\"fd-tree-title\">组件树</span>\n <span v-if=\"totalCount\" class=\"fd-tree-count\">{{ totalCount }}</span>\n </div>\n\n <div v-if=\"!totalCount\" class=\"fd-tree-empty\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <span>暂无组件,从左侧拖拽控件到画布</span>\n </div>\n\n <el-tree\n v-else\n class=\"fd-tree-el\"\n :data=\"treeData\"\n node-key=\"id\"\n :current-node-key=\"store.selectedId || ''\"\n highlight-current\n default-expand-all\n show-line\n :expand-on-click-node=\"false\"\n @node-click=\"onNodeClick\"\n >\n <template #default=\"{ data }\">\n <span class=\"fd-tree-name\">{{ data.name }}</span>\n <span v-if=\"data.sub\" class=\"fd-tree-sub\" :title=\"data.sub\">{{ data.sub }}</span>\n </template>\n </el-tree>\n </div>\n</template>\n\n<style scoped>\n.fd-tree {\n padding: 1.2rem;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n/* ===== 头部:图标 + 标题 + 计数 ===== */\n.fd-tree-head {\n display: flex;\n align-items: center;\n gap: 0.8rem;\n padding: 0 0.4rem 0.8rem;\n margin-bottom: 0.8rem;\n border-bottom: 1px solid var(--fd-color-border);\n flex-shrink: 0;\n}\n.fd-tree-head-icon {\n width: 1.6rem;\n height: 1.6rem;\n color: var(--fd-color-primary);\n flex-shrink: 0;\n}\n.fd-tree-title {\n font-weight: 600;\n font-size: 1.5rem;\n}\n.fd-tree-count {\n margin-left: auto;\n padding: 0.1rem 0.7rem;\n border-radius: 1rem;\n font-size: 1.2rem;\n color: var(--fd-color-text-tertiary);\n background: var(--fd-color-info-light);\n}\n\n/* ===== 空状态 ===== */\n.fd-tree-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.8rem;\n padding: 4rem 2rem;\n color: var(--fd-color-text-tertiary);\n font-size: 1.3rem;\n text-align: center;\n}\n.fd-tree-empty svg {\n width: 3.2rem;\n height: 3.2rem;\n opacity: 0.6;\n}\n\n/* ===== ElTree:贴合项目主题 ===== */\n.fd-tree-el {\n background: transparent;\n --el-tree-node-hover-bg-color: transparent;\n}\n/* 行高与圆角 */\n.fd-tree-el :deep(.el-tree-node__content) {\n height: auto;\n min-height: 2.8rem;\n border-radius: var(--fd-radius-base);\n padding-left: 0.4rem;\n}\n.fd-tree-el :deep(.el-tree-node__content:hover) {\n background: var(--fd-color-info-light);\n}\n/* 选中态:主题色浅底 + 主题色文字 */\n.fd-tree-el :deep(.el-tree-node.is-current > .el-tree-node__content) {\n background: var(--fd-color-primary-light);\n color: var(--fd-color-primary);\n}\n/* 展开图标配色 */\n.fd-tree-el :deep(.el-tree-node__expand-icon) {\n color: var(--fd-color-text-tertiary);\n}\n.fd-tree-el :deep(.el-tree-node.is-current > .el-tree-node__content .el-tree-node__expand-icon) {\n color: var(--fd-color-primary);\n}\n\n/* ===== 自定义节点内容:名称 + 次级 label ===== */\n.fd-tree-name {\n font-size: 1.3rem;\n}\n.fd-tree-sub {\n margin-left: 0.6rem;\n color: var(--fd-color-text-tertiary);\n font-size: 1.2rem;\n max-width: 12rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.el-tree-node.is-current > .el-tree-node__content .fd-tree-sub {\n color: var(--fd-color-primary);\n opacity: 0.75;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, onMounted, onBeforeUnmount } from 'vue'\nimport { ElInputNumber } from 'element-plus'\nimport 'element-plus/es/components/input-number/style/css'\nimport { useDesignerStore } from '@/stores/designer'\nimport { getSchema } from '@/api'\nimport { genGuid, saveFormToLocal, loadFormFromLocal } from '@/storage/formStorage'\nimport Renderer from '@/components/renderer/Renderer.vue'\nimport ComponentTree from './ComponentTree.vue'\nimport type { WidgetNode } from '@/types'\n\nconst store = useDesignerStore()\n\n/** 暗色主题开关(作用于根元素 data-theme) */\n// const dark = ref(false)\n// function toggleDark() {\n// dark.value = !dark.value\n// document.documentElement.dataset.theme = dark.value ? 'dark' : ''\n// }\n\n/** 弹层控制 */\nconst showPreview = ref(false)\nconst showCode = ref(false)\nconst showTree = ref(false)\nconst showImport = ref(false)\n\n/**\n * 预览区宽度设置(px,270 ~ 1200):\n * 默认值随 templateType 模式——电脑端 1200,移动端 375。\n */\nfunction isMobileTemplate(): boolean {\n const t = new URLSearchParams(window.location.search).get('templateType') || ''\n return t === 'mobile' || t === '2'\n}\nconst previewWidth = ref(isMobileTemplate() ? 375 : 1200)\nfunction clampPreviewWidth() {\n const w = Number(previewWidth.value)\n previewWidth.value = Math.min(1200, Math.max(270, Number.isFinite(w) ? w : 1200))\n}\n\n/** 导入弹层:粘贴的 JSON 文本 */\nconst importText = ref('')\n\n/** 导入确认:解析粘贴的 JSON 并覆盖当前表单 */\nfunction onImportConfirm() {\n const text = importText.value.trim()\n if (!text) {\n window.alert('请先粘贴表单 JSON')\n return\n }\n try {\n store.loadSchema(JSON.parse(text))\n } catch {\n window.alert('JSON 解析失败')\n return\n }\n importText.value = ''\n showImport.value = false\n}\n\nconst codeJson = computed(() => JSON.stringify(store.toSchema(), null, 2))\n\n/**\n * 预览用运行态数据:\n * - 顶层字段:值取字段名本身作为占位,不填充「示例xxx」等假数据;\n * - 子表:按 secondtable 生成预览行,每列单元格值取列绑定字段名(col.name);\n * 预览不传 formMode,所有表单内容均展示。\n */\nconst mockFormData = computed<Record<string, unknown>>(() => {\n const data: Record<string, unknown> = {}\n store.fields.forEach((f) => {\n data[f.name] = f.name\n })\n // 递归收集子表控件(含容器嵌套),生成预览行数据\n const collectSubtables = (list: WidgetNode[], out: WidgetNode[]): WidgetNode[] => {\n list.forEach((n) => {\n if (n.type === 'subtable') out.push(n)\n if (n.children?.length) collectSubtables(n.children, out)\n })\n return out\n }\n collectSubtables(store.widgets, []).forEach((node) => {\n if (node.type !== 'subtable' || !node.secondtable) return\n const row: Record<string, unknown> = {}\n ;(node.colnums ?? []).forEach((c) => {\n row[c.name] = c.name\n // 列绑定了链接字段时同步填值,保证预览中链接列按链接渲染(高亮可点)\n if (c.bindLink) row[c.bindLink] = c.bindLink\n })\n data[node.secondtable] = [row]\n })\n return data\n})\n\nasync function onSave() {\n // 保存:已有 id(含由 formId 参数打开)则覆盖;全新表单则生成 GUID\n let id = store.formId\n if (!store.openedWithParam && !id) {\n id = genGuid()\n }\n store.formId = id\n saveFormToLocal(id, store.toSchema())\n store.openedWithParam = true\n window.alert(`已保存(本地)\\nformId: ${id}`)\n}\n\n/** 另存为:始终以新 GUID 存至本地;有 formId 参数时为复制保留原表单,无参数时为新表单 */\nfunction onSaveAs() {\n const id = genGuid()\n store.formId = id\n store.openedWithParam = true\n saveFormToLocal(id, store.toSchema())\n window.alert(`已另存为新表单(本地)\\nformId: ${id}`)\n}\n\nasync function onReload() {\n const local = loadFormFromLocal(store.formId)\n if (local) {\n store.loadSchema(local)\n } else {\n const schema = await getSchema(store.formId)\n store.loadSchema(schema)\n }\n}\n\nfunction onPublish() {\n window.alert('发布成功(mock)')\n}\n\n/** 组件树抽屉:打开时点击抽屉与触发按钮之外的区域关闭(不用全屏遮罩,避免拦截页面滚动) */\nconst treeDrawerRef = ref<HTMLElement | null>(null)\nconst treeBtnRef = ref<HTMLElement | null>(null)\nfunction onDocClick(e: MouseEvent) {\n if (!showTree.value) return\n const target = e.target as Node\n if (treeDrawerRef.value?.contains(target)) return\n if (treeBtnRef.value?.contains(target)) return\n showTree.value = false\n}\nonMounted(() => document.addEventListener('click', onDocClick))\nonBeforeUnmount(() => document.removeEventListener('click', onDocClick))\n</script>\n\n<template>\n <div class=\"fd-toolbar\">\n <div class=\"fd-toolbar-left flex-align-center\">\n <span class=\"fd-toolbar-title\">表单设计器</span>\n <input class=\"fd-toolbar-name\" :value=\"store.formId\" @input=\"store.formId = ($event.target as HTMLInputElement).value\" />\n <!-- 电脑端/移动端比例:由 URL query templateType 决定,此处仅展示当前比例 -->\n <!-- 电脑端/移动端比例:由 URL query templateType 决定,仅显示当前模式标识,不支持手动切换 -->\n <div class=\"fd-device\">\n <button v-if=\"store.device === 'mobile'\" class=\"is-active\" title=\"移动端比例(由 URL 参数 templateType 决定)\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" />\n <line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\" />\n </svg>\n 移动端\n </button>\n <button v-else class=\"is-active\" title=\"电脑端比例(由 URL 参数 templateType 决定)\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n 电脑端\n </button>\n </div>\n </div>\n <div class=\"fd-toolbar-right flex-align-center\">\n <button class=\"fd-tool-btn\" @click=\"showPreview = true\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n 预览\n </button>\n <button class=\"fd-tool-btn\" @click=\"showCode = true\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n 查看代码\n </button>\n <button class=\"fd-tool-btn\" @click=\"showImport = true\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n 导入\n </button>\n <button class=\"fd-tool-btn\" @click=\"onReload\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </svg>\n 加载\n </button>\n <button class=\"fd-tool-btn\" @click=\"onSave\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </svg>\n 保存\n </button>\n <button class=\"fd-tool-btn\" @click=\"onSaveAs\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n 另存为\n </button>\n <button class=\"fd-tool-btn fd-tool-btn--primary\" @click=\"onPublish\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n 发布\n </button>\n <span class=\"fd-toolbar-divider\"></span>\n <button class=\"fd-tool-btn fd-tool-icon-btn\" :disabled=\"!store.canUndo\" title=\"撤销\" @click=\"store.undo()\">\n <svg class=\"fd-tool-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 14 4 9 9 4\" />\n <path d=\"M20 20v-7a4 4 0 0 0-4-4H4\" />\n </svg>\n </button>\n <button class=\"fd-tool-btn fd-tool-icon-btn\" :disabled=\"!store.canRedo\" title=\"重做\" @click=\"store.redo()\">\n <svg class=\"fd-tool-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"15 14 20 9 15 4\" />\n <path d=\"M4 20v-7a4 4 0 0 1 4-4h12\" />\n </svg>\n </button>\n <!-- <button class=\"fd-tool-btn\" @click=\"toggleDark\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n 暗色\n </button> -->\n <button ref=\"treeBtnRef\" class=\"fd-tool-btn\" @click=\"showTree = !showTree\">\n <svg class=\"fd-tool-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n </svg>\n 组件树\n </button>\n </div>\n\n <!-- 预览弹层 -->\n <Teleport to=\"body\">\n <div v-if=\"showPreview\" class=\"fd-dialog-mask\" @click.self=\"showPreview = false\">\n <div class=\"fd-dialog fd-dialog--preview\">\n <div class=\"fd-dialog-head\">\n <span>预览</span>\n <div class=\"fd-preview-width\">\n <label for=\"fd-preview-width-input\">宽度</label>\n <el-input-number\n id=\"fd-preview-width-input\"\n v-model=\"previewWidth\"\n :min=\"270\"\n :max=\"1200\"\n :step=\"10\"\n size=\"small\"\n controls-position=\"right\"\n @change=\"clampPreviewWidth\"\n />\n <span class=\"fd-preview-width-unit\">px</span>\n </div>\n <button class=\"fd-tool-btn\" @click=\"showPreview = false\">关闭</button>\n </div>\n <div class=\"fd-dialog-body\">\n <div class=\"fd-preview-stage\" :style=\"{ width: previewWidth + 'px' }\">\n <Renderer :widgets=\"store.widgets\" :form-data=\"mockFormData\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- 查看代码弹层 -->\n <div v-if=\"showCode\" class=\"fd-dialog-mask\" @click.self=\"showCode = false\">\n <div class=\"fd-dialog\">\n <div class=\"fd-dialog-head\">\n <span>JSON Schema</span>\n <button class=\"fd-tool-btn\" @click=\"showCode = false\">关闭</button>\n </div>\n <pre class=\"fd-dialog-code\">{{ codeJson }}</pre>\n </div>\n </div>\n\n <!-- 导入弹层:粘贴 JSON,确认后覆盖当前表单 -->\n <div v-if=\"showImport\" class=\"fd-dialog-mask\" @click.self=\"showImport = false\">\n <div class=\"fd-dialog\">\n <div class=\"fd-dialog-head\">\n <span>导入(粘贴 JSON)</span>\n <button class=\"fd-tool-btn\" @click=\"showImport = false\">取消</button>\n <button class=\"fd-tool-btn fd-tool-btn--primary\" @click=\"onImportConfirm\">确认</button>\n </div>\n <div class=\"fd-dialog-body\">\n <textarea\n v-model=\"importText\"\n class=\"fd-dialog-import-text\"\n placeholder=\"请粘贴表单 JSON(可从「查看代码」复制),确认后将覆盖当前表单\"\n ></textarea>\n </div>\n </div>\n </div>\n\n <!-- 组件树抽屉 -->\n <!-- 组件树抽屉:点击抽屉外区域关闭(document 监听,不拦截页面滚动) -->\n <div v-if=\"showTree\" ref=\"treeDrawerRef\" class=\"fd-tree-drawer\">\n <ComponentTree />\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped>\n.fd-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1.2rem;\n height: var(--fd-header-height);\n padding: 0 2rem;\n background: var(--fd-color-bg-panel);\n border-bottom: 1px solid var(--fd-color-border);\n flex-shrink: 0;\n}\n.fd-toolbar-title {\n font-weight: 600;\n font-size: 1.8rem;\n color: var(--fd-color-text);\n white-space: nowrap;\n}\n.fd-toolbar-left {\n gap: 1.6rem;\n}\n.fd-toolbar-divider {\n width: 1px;\n height: 2rem;\n background: var(--fd-color-border);\n flex-shrink: 0;\n}\n.fd-toolbar-name {\n height: 3.2rem;\n width: 16rem;\n padding: 0 1.2rem;\n border: 1px solid transparent;\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-info-light);\n color: var(--fd-color-text-secondary);\n font-size: 1.4rem;\n transition: all var(--fd-transition);\n}\n.fd-toolbar-name:hover {\n background: var(--fd-color-bg-panel);\n border-color: var(--fd-color-primary);\n}\n.fd-toolbar-name:focus {\n outline: none;\n background: var(--fd-color-bg-panel);\n border-color: var(--fd-color-primary);\n box-shadow: 0 0 0 0.2rem rgba(76, 142, 255, 0.2);\n}\n.fd-device {\n display: inline-flex;\n background: var(--fd-color-info-light);\n border-radius: 0.6rem;\n padding: 0.2rem;\n}\n.fd-device button {\n height: 2.8rem;\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0 1rem;\n border: none;\n background: transparent;\n border-radius: var(--fd-radius-base);\n color: var(--fd-color-text-secondary);\n font-size: 1.3rem;\n /* 仅作比例标识,不支持手动切换 */\n cursor: default;\n white-space: nowrap;\n transition: all var(--fd-transition);\n}\n.fd-device button.is-active {\n background: var(--fd-color-bg-panel);\n color: var(--fd-color-primary);\n box-shadow: var(--fd-shadow-card);\n font-weight: 600;\n}\n.fd-toolbar-right {\n gap: 0.8rem;\n flex-wrap: nowrap;\n overflow-x: auto;\n}\n.fd-tool-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n height: 3.4rem;\n padding: 0 1rem;\n border: none;\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-info-light);\n color: #4a4f59;\n font-size: 1.3rem;\n cursor: pointer;\n white-space: nowrap;\n flex-shrink: 0;\n transition: all var(--fd-transition);\n}\n.fd-tool-btn-icon {\n width: 1.4rem;\n height: 1.4rem;\n flex-shrink: 0;\n display: block;\n}\n.fd-tool-btn:hover {\n background: #e8e9eb;\n}\n.fd-tool-btn:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.fd-tool-btn--primary {\n background: var(--fd-color-primary);\n color: #fff;\n}\n.fd-tool-btn--primary:hover {\n background: var(--fd-color-primary-hover);\n color: #fff;\n}\n.fd-tool-icon-btn {\n width: 3.4rem;\n padding: 0;\n}\n.fd-tool-icon {\n width: 1.8rem;\n height: 1.8rem;\n display: block;\n}\n\n/* 弹层 */\n.fd-dialog-mask {\n position: fixed;\n inset: 0;\n z-index: 100;\n background: rgba(0, 0, 0, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.fd-dialog {\n width: min(86rem, 90vw);\n max-height: 82vh;\n display: flex;\n flex-direction: column;\n background: var(--fd-color-bg-panel);\n border-radius: var(--fd-radius-lg);\n box-shadow: var(--fd-shadow-pop);\n overflow: hidden;\n}\n/* 预览弹层加宽,容纳最大 1200px 的预览区 */\n.fd-dialog--preview {\n width: min(128rem, 94vw);\n}\n/* 预览宽度设置框 */\n.fd-preview-width {\n display: inline-flex;\n align-items: center;\n gap: 0.6rem;\n font-size: 1.3rem;\n font-weight: 400;\n color: var(--fd-color-text-secondary);\n}\n.fd-preview-width :deep(.el-input-number) {\n width: 11rem;\n}\n.fd-preview-width :deep(.el-input-number .el-input__wrapper) {\n background: var(--fd-color-bg);\n box-shadow: 0 0 0 1px var(--fd-color-border) inset;\n}\n.fd-preview-width :deep(.el-input-number .el-input__wrapper:hover) {\n box-shadow: 0 0 0 1px var(--fd-color-border-hover) inset;\n}\n.fd-preview-width :deep(.el-input-number .el-input__wrapper.is-focus) {\n box-shadow: 0 0 0 1px var(--fd-color-primary) inset;\n}\n.fd-preview-width label { white-space: nowrap; }\n.fd-preview-width-unit {\n color: var(--fd-color-text-tertiary);\n}\n/* 预览舞台:CSS 硬限制 270 ~ 1200px,与控件 min/max 双重保险 */\n.fd-preview-stage {\n min-width: 27rem;\n max-width: 120rem;\n margin: 0 auto;\n}\n.fd-dialog-head {\n display: flex;\n align-items: center;\n gap: 1.2rem;\n padding: 1.2rem 1.6rem;\n border-bottom: 1px solid var(--fd-color-border);\n font-weight: 600;\n font-size: 1.5rem;\n}\n.fd-dialog-head span {\n margin-right: auto;\n}\n.fd-dialog-body {\n padding: 1.6rem;\n overflow: auto;\n}\n.fd-dialog-code {\n margin: 0;\n padding: 1.6rem;\n overflow: auto;\n font-size: 1.2rem;\n line-height: 1.6;\n color: var(--fd-color-text);\n}\n.fd-dialog-import-text {\n width: 100%;\n min-height: 32rem;\n padding: 1.2rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.2rem;\n line-height: 1.6;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n background: var(--fd-color-bg);\n color: var(--fd-color-text);\n resize: vertical;\n}\n\n/* 组件树抽屉 */\n.fd-tree-drawer {\n position: fixed;\n top: 5.6rem;\n right: 0;\n bottom: 0;\n width: 30rem;\n z-index: 90;\n background: var(--fd-color-bg-panel);\n border-left: 1px solid var(--fd-color-border);\n box-shadow: var(--fd-shadow-pop);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useDesignerStore } from '@/stores/designer'\nimport { getAllWidgetDefs } from '@/widgets'\nimport type { WidgetType } from '@/types'\n\nconst store = useDesignerStore()\nconst defs = getAllWidgetDefs()\n\n/** 控件库分组(与文档控件范围一致) */\nconst groups = [\n {\n title: '基础控件',\n types: ['label', 'text'] as WidgetType[],\n },\n {\n title: '高级控件',\n types: ['subtable'] as WidgetType[],\n },\n {\n title: '布局控件',\n types: ['grid', 'card', 'slot'] as WidgetType[],\n },\n]\n\n/** 类型 -> 图标字符(统一线性风格,禁止 emoji) */\nconst icons: Record<WidgetType, string> = {\n grid: '▦',\n card: '▤',\n slot: '⧉',\n label: 'T',\n text: '¶',\n subtable: '☰',\n}\n\nfunction defOf(type: WidgetType) {\n return defs.find((d) => d.type === type)\n}\n\nfunction onDragStart(e: DragEvent, type: WidgetType) {\n e.dataTransfer?.setData('application/x-fd-new', type)\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'copy'\n}\n\nfunction onAdd(type: WidgetType) {\n store.addWidget(type)\n}\n</script>\n\n<template>\n <div class=\"fd-palette\">\n <div class=\"fd-palette-title\">控件库</div>\n <div v-for=\"g in groups\" :key=\"g.title\" class=\"fd-palette-group\">\n <div class=\"fd-palette-group-title\">{{ g.title }}</div>\n <template v-for=\"t in g.types\" :key=\"t\">\n <div\n v-if=\"defOf(t)\"\n class=\"fd-palette-item\"\n draggable=\"true\"\n @dragstart=\"onDragStart($event, t)\"\n @click=\"onAdd(t)\"\n >\n <span class=\"fd-palette-icon\">{{ icons[t] }}</span>\n <span>{{ defOf(t)!.title }}</span>\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-palette {\n padding: 1.2rem;\n display: flex;\n flex-direction: column;\n gap: 1.2rem;\n overflow: auto;\n height: 100%;\n}\n.fd-palette-title {\n font-weight: 600;\n font-size: 1.4rem;\n color: var(--fd-color-text);\n padding: 0 0.4rem;\n}\n.fd-palette-group {\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n}\n.fd-palette-group-title {\n font-size: 1.2rem;\n color: var(--fd-color-text-tertiary);\n margin-bottom: 0.2rem;\n padding-left: 0.4rem;\n}\n.fd-palette-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.2rem;\n border: 1px solid transparent;\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-hover);\n font-size: 1.3rem;\n color: var(--fd-color-text);\n cursor: grab;\n user-select: none;\n transition: all var(--fd-transition);\n}\n.fd-palette-item:hover {\n background: var(--fd-color-primary-bg);\n border-color: var(--fd-color-primary);\n}\n.fd-palette-item:active {\n cursor: grabbing;\n}\n.fd-palette-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2.2rem;\n height: 2.2rem;\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-icon-bg);\n color: var(--fd-color-icon);\n font-size: 1.3rem;\n font-weight: 600;\n}\n</style>\n","import type { WidgetNode } from './widget'\n\n/** 字段枚举项 */\nexport interface EnumItem {\n label: string\n value: string\n}\n\n/** 表单生命周期钩子名 */\nexport type LifecycleHook = 'onLoad' | 'onMounted' | 'onValueChange' | 'custom'\n\n/** 各生命周期钩子的展示信息 */\nexport const LIFECYCLE_HOOKS: { key: LifecycleHook; label: string; desc: string }[] = [\n { key: 'onLoad', label: '加载完成', desc: '表单数据就绪后触发' },\n { key: 'onMounted', label: '渲染挂载', desc: '渲染完成并挂载到 DOM 后触发' },\n { key: 'onValueChange', label: '值变化', desc: '任意字段值变化时触发' },\n { key: 'custom', label: '自定义方法', desc: '写入的方法将挂载至全局 window,可在其他事件处理中调用' },\n]\n\n/** 生命周期事件:钩子名 -> 处理代码片段 */\nexport interface FormLifecycleEvents {\n onLoad?: string\n onMounted?: string\n onValueChange?: string\n /** 自定义方法代码:其中声明的方法挂载至 window */\n custom?: string\n}\n\n/** 自定义事件(可供组件选择绑定) */\nexport interface CustomEvent {\n /** 事件标识,组件通过此 name 引用 */\n name: string\n /** 事件显示名 */\n title: string\n /** 事件处理代码片段 */\n handler: string\n}\n\n/** 表单级事件配置 */\nexport interface FormEvents {\n /** 生命周期事件 */\n lifecycle: FormLifecycleEvents\n /** 自定义事件列表 */\n custom: CustomEvent[]\n}\n\n/** 可绑定字段元数据(从 formData 中筛选而来) */\nexport interface FieldMeta {\n /** 字段名 */\n name: string\n /** 字段中文名 */\n label: string\n /** 字段类型 */\n dataType: string\n /** 字段枚举(可选) */\n enums?: EnumItem[]\n}\n\n/** 表单初始化接口返回的结构(mock,后续与后端对齐) */\nexport interface FormSchema {\n /** 表单标识 */\n formId: string\n /** 主表名 */\n dbtable: string\n /** 可绑定字段列表 */\n fields: FieldMeta[]\n /** 控件树 */\n widgets: WidgetNode[]\n /** 表单级事件配置(全局事件) */\n events: FormEvents\n}\n","<script setup lang=\"ts\">\nimport { reactive, defineAsyncComponent } from 'vue'\nimport { useDesignerStore } from '@/stores/designer'\nimport { LIFECYCLE_HOOKS } from '@/types'\n\n/**\n * Monaco 编辑器体积较大,按需异步加载:\n * 仅在用户点击「编写处理函数」弹出编辑弹层时才拉取对应 chunk,避免首屏加载。\n */\nconst CodeEditor = defineAsyncComponent(() => import('./CodeEditor.vue'))\n\nconst store = useDesignerStore()\n\n/** 代码编辑器:触发器 + modal。参照 demo 的 event-handler-trigger / event-handler-editor */\nconst editor = reactive({\n open: false,\n type: '' as 'lifecycle' | 'custom' | '',\n hookKey: '',\n index: -1,\n title: '',\n draft: '',\n})\n\nfunction openLifecycle(h: (typeof LIFECYCLE_HOOKS)[number]) {\n editor.open = true\n editor.type = 'lifecycle'\n editor.hookKey = h.key\n editor.title = `${h.label}(${h.key})`\n editor.draft = store.events.lifecycle[h.key] ?? ''\n}\n\nfunction confirmEditor() {\n if (editor.type === 'lifecycle' && editor.hookKey) {\n store.setLifecycleHook(editor.hookKey as never, editor.draft)\n } else if (editor.type === 'custom' && editor.index >= 0) {\n store.updateCustomEvent(editor.index, { handler: editor.draft } as never)\n }\n editor.open = false\n}\n\nfunction closeEditor() {\n editor.open = false\n}\n</script>\n\n<template>\n <div class=\"fd-form-events\">\n <div class=\"fd-property-title\">表单属性</div>\n <div class=\"fd-form-meta\">\n <span>表单:{{ store.formId }}</span>\n <span>主表:{{ store.dbtable }}</span>\n </div>\n\n <section class=\"fd-events-section\">\n <h4 class=\"fd-events-h\">全局事件 · 生命周期</h4>\n <p class=\"fd-events-tip\">渲染时绑定至对应钩子函数中执行</p>\n <div v-for=\"h in LIFECYCLE_HOOKS\" :key=\"h.key\" class=\"fd-event-row\">\n <div class=\"fd-event-head\">\n <label :title=\"h.desc\">{{ h.label }}</label>\n <code class=\"fd-event-key\">{{ h.key }}</code>\n </div>\n <div\n class=\"fd-event-trigger\"\n @click=\"openLifecycle(h)\"\n :title=\"store.events.lifecycle[h.key] || '点击编写处理函数'\"\n >\n <span v-if=\"store.events.lifecycle[h.key]\" class=\"fd-event-trigger-text\">{{\n store.events.lifecycle[h.key]\n }}</span>\n <span v-else class=\"fd-event-trigger-placeholder\">点击编写</span>\n <span class=\"fd-event-trigger-arrow\">›</span>\n </div>\n </div>\n </section>\n\n <!-- <section class=\"fd-events-section\">\n <div class=\"fd-events-head\">\n <h4 class=\"fd-events-h\">全局事件 · 自定义事件</h4>\n <button class=\"fd-btn fd-btn--primary fd-btn--sm\" @click=\"store.addCustomEvent()\">+ 新增</button>\n </div>\n <p class=\"fd-events-tip\">自定义事件可在运行态被触发执行</p>\n <div v-if=\"store.events.custom.length === 0\" class=\"fd-events-empty\">暂无自定义事件</div>\n <div v-for=\"(ev, i) in store.events.custom\" :key=\"i\" class=\"fd-custom-card\">\n <div class=\"fd-custom-head\">\n <span class=\"fd-custom-index\">#{{ i + 1 }}</span>\n <button class=\"fd-btn fd-btn--danger fd-btn--sm\" @click=\"store.removeCustomEvent(i)\">删除</button>\n </div>\n <div class=\"fd-event-row\">\n <label>事件名(标识)</label>\n <input :value=\"ev.name\" @input=\"onCustom(i, 'name', $event)\" placeholder=\"如 onButtonClick\" />\n </div>\n <div class=\"fd-event-row\">\n <label>显示名</label>\n <input :value=\"ev.title\" @input=\"onCustom(i, 'title', $event)\" placeholder=\"如 点击按钮\" />\n </div>\n <div class=\"fd-event-row\">\n <label>处理代码</label>\n <div\n class=\"fd-event-trigger\"\n @click=\"openCustom(i)\"\n :title=\"ev.handler || '点击编写处理函数'\"\n >\n <span v-if=\"ev.handler\" class=\"fd-event-trigger-text\">{{ ev.handler }}</span>\n <span v-else class=\"fd-event-trigger-placeholder\">点击编写</span>\n <span class=\"fd-event-trigger-arrow\">›</span>\n </div>\n </div>\n </div>\n </section> -->\n\n <!-- 代码编辑弹层:触发器点击后弹出,编写处理函数 -->\n <Teleport to=\"body\">\n <div v-if=\"editor.open\" class=\"fd-dialog-mask\" @click.self=\"closeEditor\">\n <div class=\"fd-dialog\" style=\"max-width: 600px;\">\n <div class=\"fd-dialog-head\">\n <span>编写处理函数 - {{ editor.title }}</span>\n <button class=\"fd-dialog-close\" @click=\"closeEditor\" title=\"关闭\">×</button>\n </div>\n <div class=\"fd-dialog-body\">\n <CodeEditor v-model=\"editor.draft\" language=\"javascript\" />\n </div>\n <div class=\"fd-dialog-foot\">\n <button class=\"fd-btn fd-btn--primary\" @click=\"confirmEditor\">确定</button>\n </div>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<style scoped>\n.fd-form-events {\n display: flex;\n flex-direction: column;\n gap: 1.6rem;\n}\n.fd-form-meta {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n font-size: 1.2rem;\n color: var(--fd-color-text-secondary);\n padding: 0.8rem 1rem;\n background: var(--fd-color-bg);\n border-radius: var(--fd-radius-base);\n}\n.fd-events-section {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n.fd-events-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.fd-events-h {\n margin: 0;\n font-size: 1.4rem;\n font-weight: 600;\n}\n.fd-events-tip {\n margin: 0;\n font-size: 1.2rem;\n color: var(--fd-color-text-tertiary);\n}\n.fd-events-empty {\n font-size: 1.3rem;\n color: var(--fd-color-text-placeholder);\n text-align: center;\n padding: 1.2rem;\n border: 1px dashed var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n}\n.fd-event-row {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n}\n.fd-event-head {\n display: flex;\n align-items: center;\n gap: 0.8rem;\n}\n.fd-event-row label {\n font-size: 1.3rem;\n color: var(--fd-color-text-secondary);\n}\n.fd-event-key {\n font-size: 1.1rem;\n color: var(--fd-color-primary);\n background: var(--fd-color-primary-light);\n padding: 0.1rem 0.6rem;\n border-radius: var(--fd-radius-base);\n}\n\n/* 触发器:参照 demo .event-handler-trigger —— 展示已有代码或「点击编写」,点击打开弹层 */\n.fd-event-trigger {\n display: flex;\n align-items: center;\n gap: 0.6rem;\n width: 100%;\n min-height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.3rem;\n background: var(--fd-color-bg-panel);\n cursor: pointer;\n transition: border-color var(--fd-transition), background-color var(--fd-transition);\n overflow: hidden;\n}\n.fd-event-trigger:hover {\n border-color: var(--fd-color-primary);\n background: var(--fd-color-primary-light);\n}\n.fd-event-trigger-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--fd-color-text);\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n}\n.fd-event-trigger-placeholder {\n flex: 1;\n color: var(--fd-color-text-placeholder);\n}\n.fd-event-trigger-arrow {\n flex-shrink: 0;\n color: var(--fd-color-text-tertiary);\n font-size: 1.8rem;\n line-height: 1;\n}\n\n/* 代码编辑弹层:使用 Monaco 编辑器(CodeEditor.vue) */\n\n.fd-custom-card {\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n padding: 1.2rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg);\n}\n.fd-custom-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.fd-custom-index {\n font-size: 1.3rem;\n font-weight: 600;\n color: var(--fd-color-text-secondary);\n}\n.fd-event-row input {\n width: 100%;\n height: 3.2rem;\n font-size: 1.4rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n background: var(--fd-color-bg-panel);\n color: var(--fd-color-text);\n}\n.fd-event-row input:focus {\n border-color: var(--fd-color-primary);\n outline: none;\n}\n.fd-btn {\n height: 3.2rem;\n padding: 0 1.4rem;\n border: none;\n border-radius: var(--fd-radius-base);\n font-size: 1.3rem;\n cursor: pointer;\n}\n.fd-btn--sm {\n height: 2.6rem;\n padding: 0 1rem;\n font-size: 1.2rem;\n}\n.fd-btn--primary {\n background: var(--fd-color-primary);\n color: #fff;\n}\n.fd-btn--danger {\n background: var(--fd-color-danger-light);\n color: var(--fd-color-danger);\n}\n\n/* 弹层(与项目 .fd-dialog 风格一致,scoped 内自包含) */\n.fd-dialog-mask {\n position: fixed;\n inset: 0;\n z-index: 100;\n background: rgba(0, 0, 0, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.fd-dialog {\n width: min(60rem, 92vw);\n max-height: 82vh;\n display: flex;\n flex-direction: column;\n background: var(--fd-color-bg-panel);\n border-radius: var(--fd-radius-lg);\n box-shadow: var(--fd-shadow-pop);\n overflow: hidden;\n}\n.fd-dialog-head {\n display: flex;\n align-items: center;\n gap: 1.2rem;\n padding: 1.2rem 1.6rem;\n border-bottom: 1px solid var(--fd-color-border);\n font-weight: 600;\n font-size: 1.5rem;\n}\n.fd-dialog-head span {\n margin-right: auto;\n}\n.fd-dialog-close {\n width: 3rem;\n height: 3rem;\n padding: 0;\n font-size: 2rem;\n line-height: 1;\n border: none;\n border-radius: var(--fd-radius-base);\n background: transparent;\n color: var(--fd-color-text-secondary);\n cursor: pointer;\n}\n.fd-dialog-close:hover {\n background: var(--fd-color-bg);\n color: var(--fd-color-text);\n}\n.fd-dialog-body {\n padding: 1.6rem;\n overflow: auto;\n}\n.fd-dialog-foot {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n padding: 1.2rem 1.6rem;\n border-top: 1px solid var(--fd-color-border);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useDesignerStore } from '@/stores/designer'\nimport { getWidgetDef } from '@/widgets'\nimport FormEventsPanel from './FormEventsPanel.vue'\n\nconst store = useDesignerStore()\nconst node = computed(() => store.selectedNode)\nconst def = computed(() => (node.value ? getWidgetDef(node.value.type) : undefined))\nconst Panel = computed(() => def.value?.panel)\n\nfunction onUpdate(patch: Record<string, unknown>) {\n if (node.value) store.updateNode(node.value.id, patch)\n}\n\n/** 位于栅栏格内的子节点:可设置占比 */\nconst inGrid = computed(() => node.value != null && node.value.gridSpan != null)\n\nfunction onSpan(e: Event) {\n if (!node.value) return\n const raw = Number((e.target as HTMLInputElement).value)\n const span = Math.min(24, Math.max(1, Number.isFinite(raw) ? Math.round(raw) : 24))\n store.updateNode(node.value.id, { gridSpan: span })\n}\n</script>\n\n<template>\n <div class=\"fd-property\">\n <div class=\"fd-property-title\">属性</div>\n\n <!-- 选中表单本身:表单级属性(全局事件) -->\n <FormEventsPanel v-if=\"store.selectedForm\" />\n\n <!-- 空状态 -->\n <div v-else-if=\"!node\" class=\"fd-property-empty\">\n <span class=\"fd-property-empty-icon\">⚙</span>\n <span>请选择左侧控件<br />或点击画板空白处设置表单属性</span>\n </div>\n\n <!-- 选中控件 -->\n <template v-else>\n <component :is=\"Panel\" v-if=\"Panel\" :node=\"node\" :fields=\"store.fields\" @update=\"onUpdate\" />\n\n <div v-if=\"inGrid\" class=\"fd-property-item\">\n <label>占比</label>\n <input type=\"number\" min=\"1\" max=\"24\" :value=\"node.gridSpan\" @change=\"onSpan\" />\n </div>\n\n <div class=\"fd-property-foot\">\n <span class=\"fd-property-type\">类型:{{ def?.title }}</span>\n <!-- <button class=\"fd-btn fd-btn--danger\" @click=\"store.removeWidget(node.id)\">删除控件</button> -->\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n.fd-property { padding: 1.2rem; display: flex; flex-direction: column; gap: 1.2rem; height: 100%; overflow: auto; }\n.fd-property-title { font-weight: 600; font-size: 1.4rem; }\n.fd-property-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1.2rem;\n color: var(--fd-color-text-secondary);\n font-size: 1.3rem;\n text-align: center;\n}\n.fd-property-empty-icon {\n font-size: 3.6rem;\n color: var(--fd-color-border);\n}\n.fd-property-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 1.2rem; padding-top: 1.2rem; border-top: 1px solid var(--fd-color-border); }\n.fd-property-type { font-size: 1.2rem; color: var(--fd-color-text-secondary); }\n.fd-property-item { display: flex; flex-direction: column; gap: 0.4rem; }\n.fd-property-item label { font-size: 1.3rem; color: var(--fd-color-text-secondary); }\n.fd-property-item input,\n.fd-property-item select {\n height: 3.2rem;\n padding: 0 1rem;\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n font-size: 1.4rem;\n background: var(--fd-color-bg-panel);\n}\n.fd-btn { height: 3.2rem; padding: 0 1.4rem; border: none; border-radius: var(--fd-radius-base); font-size: 1.3rem; cursor: pointer; }\n.fd-btn--danger { background: var(--fd-color-danger-light); color: var(--fd-color-danger); }\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { WidgetNode, WidgetType } from '@/types'\nimport { useDesignerStore } from '@/stores/designer'\nimport { getWidgetDef } from '@/widgets'\nimport { gridCornerClass } from '@/widgets/grid/corner'\nimport WidgetHost from '@/components/WidgetHost.vue'\n\nconst props = defineProps<{ node: WidgetNode; parentId: string | null; index: number }>()\nconst store = useDesignerStore()\nconst rootEl = ref<HTMLElement | null>(null)\n\n/** 栅栏格内按占据格数跨列;text 控件按对齐方式设置 display */\nconst nodeStyle = computed(() => {\n const styles: Record<string, string> = {}\n if (props.node.gridSpan != null) {\n styles.gridColumn = `span ${props.node.gridSpan}`\n }\n if (props.node.type === 'text') {\n styles.display = (props.node as { display?: string }).display || 'inline-block'\n }\n return Object.keys(styles).length ? styles : undefined\n})\n\nconst isContainer = () => getWidgetDef(props.node.type)?.isContainer\n\n/** 栅栏格内子项圆角定位:结合 gridSpan 计算行首/行尾,仅整体表格四角对应 label 有圆角 */\nfunction gridCorner(child: WidgetNode, index: number): string {\n if (props.node.type !== 'grid') return ''\n const layout = (props.node as { layout?: number }).layout || 24\n return gridCornerClass(child, index, props.node.children || [], layout, store.device === 'mobile')\n}\n\nfunction hasDragData(e: DragEvent): boolean {\n const t = e.dataTransfer\n return !!t && (t.types.includes('application/x-fd-new') || t.types.includes('application/x-fd-move'))\n}\n\nfunction onSelect() {\n store.select(props.node.id)\n}\n\nfunction onDragStart(e: DragEvent) {\n // 阻止冒泡,避免嵌套拖拽时父容器的 dragstart 覆盖来源节点\n e.stopPropagation()\n store.setDragging(props.node.id)\n e.dataTransfer?.setData('application/x-fd-move', props.node.id)\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'\n}\n\nfunction clearAll() {\n store.dragOverId = null\n store.dropContainerId = null\n store.dragBefore = false\n store.setDragging(null)\n}\n\nfunction onDragEnd(e: DragEvent) {\n e.stopPropagation()\n clearAll()\n}\n\nfunction clearIndicator() {\n if (store.dragOverId === props.node.id) store.dragOverId = null\n if (store.dropContainerId === props.node.id) store.dropContainerId = null\n}\n\nfunction onDragOver(e: DragEvent) {\n if (!hasDragData(e)) return\n e.preventDefault()\n e.stopPropagation()\n if (isContainer()) {\n store.dragOverId = null\n store.dragBefore = false\n store.dropContainerId = props.node.id\n } else {\n store.dropContainerId = null\n store.dragOverId = props.node.id\n const el = rootEl.value\n if (el) {\n const rect = el.getBoundingClientRect()\n store.dragBefore = e.clientY - rect.top < rect.height / 2\n }\n }\n}\n\nfunction onDragLeave() {\n clearIndicator()\n}\n\nfunction onDrop(e: DragEvent) {\n if (!hasDragData(e)) return\n e.preventDefault()\n e.stopPropagation()\n const newType = e.dataTransfer?.getData('application/x-fd-new')\n const moveId = e.dataTransfer?.getData('application/x-fd-move')\n if (isContainer()) {\n if (newType) store.addWidget(newType as WidgetType, props.node.id)\n else if (moveId) store.moveNode(moveId, props.node.id, props.node.children?.length ?? 0)\n } else {\n const idx = store.dragBefore ? props.index : props.index + 1\n if (newType) store.addWidget(newType as WidgetType, props.parentId, idx)\n else if (moveId) store.moveNode(moveId, props.parentId, idx)\n }\n store.dragOverId = null\n store.dragBefore = false\n store.dropContainerId = null\n}\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"fd-canvas-node\"\n :class=\"[\n `fd-canvas-node--${node.type}`,\n {\n 'is-selected': store.selectedId === node.id,\n 'drop-before': store.dragOverId === node.id && store.dragBefore,\n 'drop-target': store.dropContainerId === node.id,\n 'dragging-source': store.draggingId === node.id,\n },\n ]\"\n :style=\"nodeStyle\"\n draggable=\"true\"\n @mousedown.stop=\"onSelect\"\n @click.stop\n @dragstart=\"onDragStart\"\n @dragend=\"onDragEnd\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n >\n <div class=\"fd-canvas-node-actions\" @mousedown.stop>\n <span class=\"fd-node-action\" title=\"上移\" @click.stop=\"store.moveSibling(node.id, -1)\">\n <svg class=\"fd-node-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"5\" />\n <polyline points=\"6 11 12 5 18 11\" />\n </svg>\n </span>\n <span class=\"fd-node-action\" title=\"下移\" @click.stop=\"store.moveSibling(node.id, 1)\">\n <svg class=\"fd-node-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"19\" />\n <polyline points=\"6 13 12 19 18 13\" />\n </svg>\n </span>\n <span class=\"fd-node-action delete\" title=\"删除\" @click.stop=\"store.removeWidget(node.id)\">\n <svg class=\"fd-node-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 7h16\" />\n <path d=\"M9 7V5.5a1.5 1.5 0 0 1 1.5-1.5h3A1.5 1.5 0 0 1 15 5.5V7\" />\n <path d=\"M6.5 7l1 12.5h9l1-12.5\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"16.5\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"16.5\" />\n </svg>\n </span>\n </div>\n <WidgetHost :node=\"node\" mode=\"design\">\n <template v-if=\"isContainer() && node.children\" #children>\n <CanvasNode\n v-for=\"(child, ci) in node.children\"\n :key=\"child.id\"\n :node=\"child\"\n :parent-id=\"node.id\"\n :index=\"ci\"\n :class=\"gridCorner(child, ci)\"\n />\n <div v-if=\"!node.children || node.children.length === 0\" class=\"fd-canvas-dropzone\">拖拽控件到此容器</div>\n </template>\n </WidgetHost>\n </div>\n</template>\n\n<style scoped>\n.fd-canvas-node {\n position: relative;\n /* margin-bottom: var(--fd-gap-base);\n padding: 1rem 1.2rem; */\n border-radius: var(--fd-radius-base);\n cursor: pointer;\n /* 仅过渡背景/阴影/透明度;拖拽高亮用 box-shadow / ::before,不占布局边框 */\n transition: background-color var(--fd-transition), box-shadow var(--fd-transition), opacity var(--fd-transition);\n}\n.fd-canvas-node:hover {\n background: var(--fd-color-bg-hover);\n}\n/* text 文本控件的 display 由 nodeStyle 内联控制 */\n.fd-canvas-node.is-selected {\n background: var(--fd-color-primary-bg);\n outline: 1px solid var(--fd-color-primary);\n z-index: 1;\n}\n/* 放置位置指示条:绝对定位覆盖在节点上边界,不影响布局 */\n.fd-canvas-node.drop-before::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: -0.15rem;\n height: 0.3rem;\n border-radius: 0.15rem;\n background: var(--fd-color-primary);\n z-index: 2;\n}\n.fd-canvas-node.drop-target {\n background: rgba(76, 142, 255, 0.08) !important;\n box-shadow: 0 0 0 1px var(--fd-color-primary), 0 0 0.6rem rgba(76, 142, 255, 0.25);\n}\n.fd-canvas-node.dragging-source {\n opacity: 0.4;\n}\n.fd-canvas-node-actions {\n position: absolute;\n top: 0.6rem;\n right: 0.6rem;\n display: none;\n gap: 0.4rem;\n z-index: 5;\n}\n.fd-canvas-node:hover > .fd-canvas-node-actions {\n display: flex;\n}\n/* 悬停到更深层子节点时,隐藏祖先节点的操作按钮,仅保留最内层当前组件的按钮 */\n.fd-canvas-node:hover:has(.fd-canvas-node:hover) > .fd-canvas-node-actions {\n display: none;\n}\n.fd-node-action {\n width: 2.6rem;\n height: 2.6rem;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--fd-color-bg-panel);\n border: 1px solid var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n cursor: pointer;\n color: var(--fd-color-text-tertiary);\n transition: all var(--fd-transition);\n}\n.fd-node-icon {\n width: 1.4rem;\n height: 1.4rem;\n display: block;\n}\n.fd-node-action:hover {\n background: var(--fd-color-bg-hover);\n border-color: var(--fd-color-border-hover);\n color: var(--fd-color-primary);\n}\n.fd-node-action.delete:hover {\n color: var(--fd-color-danger);\n}\n.fd-canvas-dropzone {\n grid-column: 1 / -1;\n border: 1px dashed var(--fd-color-border);\n border-radius: var(--fd-radius-base);\n padding: 0.8rem;\n text-align: center;\n color: var(--fd-color-text-tertiary);\n font-size: 1.2rem;\n margin-top: 0.6rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { useDesignerStore } from '@/stores/designer'\nimport { getSchema } from '@/api'\nimport { loadFormFromLocal } from '@/storage/formStorage'\nimport Toolbar from './Toolbar.vue'\nimport WidgetPalette from './WidgetPalette.vue'\nimport PropertyPanel from './PropertyPanel.vue'\nimport CanvasNode from './CanvasNode.vue'\n\nconst props = defineProps<{ formId?: string }>()\n\nconst store = useDesignerStore()\n\nonMounted(async () => {\n // 电脑端/移动端比例:由 URL query templateType 决定(mobile / 2 = 移动端,其它 = 电脑端)\n const templateType = new URLSearchParams(window.location.search).get('templateType') || ''\n store.device = templateType === 'mobile' || templateType === '2' ? 'mobile' : 'pc'\n\n // formId 参数优先级:prop > 路径参数(?formId=);无则初始化新表单\n const pathFormId = new URLSearchParams(window.location.search).get('formId') || ''\n const fid = props.formId || pathFormId || ''\n if (fid) {\n // 回显:优先本地存储,缺省回退到初始化接口\n const local = loadFormFromLocal(fid)\n if (local) {\n // 控件树回显本地缓存,但可绑定字段枚举始终取最新接口,避免旧缓存导致下拉枚举过期\n const fresh = await getSchema(fid)\n store.loadSchema({ ...local, fields: fresh.fields, dbtable: fresh.dbtable })\n } else {\n store.loadSchema(await getSchema(fid))\n }\n store.openedWithParam = true\n } else {\n const schema = await getSchema('')\n store.loadSchema(schema)\n store.openedWithParam = false\n // 标记为未保存的新表单:formId 置空,保存时再生成 GUID\n store.formId = ''\n }\n})\n\nfunction onCanvasDrop(e: DragEvent) {\n e.preventDefault()\n const newType = e.dataTransfer?.getData('application/x-fd-new')\n const moveId = e.dataTransfer?.getData('application/x-fd-move')\n if (newType) store.addWidget(newType as never, null, store.widgets.length)\n else if (moveId) store.moveNode(moveId, null, store.widgets.length)\n}\n</script>\n\n<template>\n <div class=\"fd-designer\">\n <Toolbar />\n <div class=\"fd-designer-body\">\n <aside class=\"fd-designer-left\">\n <WidgetPalette />\n </aside>\n <main class=\"fd-designer-center\" @dragover.prevent @drop=\"onCanvasDrop\">\n <div\n class=\"fd-canvas\"\n :class=\"{ 'is-mobile': store.device === 'mobile', 'is-selected': store.selectedForm }\"\n @click=\"store.selectForm()\"\n >\n <div v-if=\"store.widgets.length === 0\" class=\"fd-canvas-empty\">\n <span class=\"fd-canvas-empty-icon\">▦</span>\n <span>从左侧拖拽控件到此处</span>\n </div>\n <CanvasNode\n v-for=\"(node, i) in store.widgets\"\n :key=\"node.id\"\n :node=\"node\"\n :parent-id=\"null\"\n :index=\"i\"\n />\n </div>\n </main>\n <aside class=\"fd-designer-right\">\n <PropertyPanel />\n </aside>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fd-designer {\n display: flex;\n flex-direction: column;\n height: 100vh;\n}\n.fd-designer-body {\n flex: 1;\n display: flex;\n min-height: 0;\n}\n.fd-designer-left {\n width: var(--fd-sidebar-width);\n border-right: 1px solid var(--fd-color-border);\n background: var(--fd-color-bg-panel);\n overflow: hidden;\n}\n.fd-designer-center {\n flex: 1;\n padding: 2.4rem;\n overflow: auto;\n background: var(--fd-color-bg);\n}\n.fd-canvas {\n width: 100%;\n max-width: var(--fd-canvas-max);\n min-height: calc(100vh - 16rem);\n margin: 0 auto;\n padding: 1.6rem;\n background: var(--fd-color-bg-panel);\n border-radius: var(--fd-radius-lg);\n box-shadow: var(--fd-shadow-card);\n}\n.fd-canvas.is-mobile {\n max-width: 37.5rem;\n}\n.fd-canvas.is-selected {\n outline: 2px solid var(--fd-color-primary);\n outline-offset: -2px;\n}\n.fd-canvas-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 8rem 2.4rem;\n color: var(--fd-color-text-tertiary);\n}\n.fd-canvas-empty-icon {\n font-size: 4.8rem;\n margin-bottom: 1.6rem;\n color: var(--fd-color-text-placeholder);\n}\n.fd-canvas-empty span:last-child {\n font-size: 1.4rem;\n}\n.fd-designer-right {\n width: var(--fd-property-width);\n border-left: 1px solid var(--fd-color-border);\n background: var(--fd-color-bg-panel);\n}\n</style>\n","import { createApp, h } from 'vue'\nimport type { App } from 'vue'\nimport Renderer from '@/components/renderer/Renderer.vue'\nimport { registerBuiltinWidgets } from '@/widgets'\nimport { configureApi } from '@/api'\nimport type { WidgetNode, FormMode, FormEvents } from '@/types'\n\n/** 渲染表单所需的全部入参(供外部调用方传递) */\nexport interface RenderFormOptions {\n /** 挂载容器(必填)。渲染内容将挂载到该元素内部 */\n container: HTMLElement\n /** 控件节点数组(即表单 schema) */\n widgets: WidgetNode[]\n /** 表单模式:view / start / approval 等,缺省按控件 visibleModes 全显 */\n formMode?: FormMode\n /** 表单初始数据 */\n formData?: Record<string, unknown>\n /** 表单级事件配置(生命周期 + 自定义事件) */\n events?: FormEvents\n /** 表单标识(透传给插槽等需要宿主上下文的控件),可选 */\n formId?: string\n /** 接口模块(apiModule),可选 */\n apiModule?: string\n /** 基础模块(baseModule),可选 */\n baseModule?: string\n}\n\n/** 渲染实例句柄,供外部在挂载后调用 */\nexport interface RenderFormHandle {\n /** 触发指定自定义事件 */\n fireEvent(name: string, payload?: unknown): void\n /** 销毁渲染实例、释放 DOM 与资源 */\n unmount(): void\n}\n\n/**\n * 命令式渲染表单:不依赖页面/组件,由外部传入容器与参数挂载。\n * 返回句柄可触发事件与卸载。\n */\nexport function renderForm(options: RenderFormOptions): RenderFormHandle {\n // 确保内置控件已注册(幂等)\n registerBuiltinWidgets()\n if (options.apiModule || options.baseModule) {\n configureApi({ apiModule: options.apiModule, baseModule: options.baseModule })\n }\n\n // 以 Renderer 为根组件,并通过 ref 拿到其对外暴露的方法\n let exposed: Record<string, (...args: unknown[]) => unknown> | null = null\n const Root = {\n render: () =>\n h(Renderer, {\n widgets: options.widgets,\n formMode: options.formMode,\n formData: options.formData,\n events: options.events,\n formId: options.formId,\n ref: (inst: unknown) => {\n exposed = inst as Record<string, (...args: unknown[]) => unknown>\n },\n }),\n }\n\n const app: App = createApp(Root)\n app.mount(options.container)\n\n return {\n fireEvent: (name, payload) => exposed?.fireEvent?.(name, payload),\n unmount: () => app.unmount(),\n }\n}\n","import type { App } from 'vue'\nimport Designer from '@/components/designer/Designer.vue'\nimport { registerBuiltinWidgets } from '@/widgets'\nimport { configureApi } from '@/api'\n// 全局样式(CSS 变量 / 基础样式):随库产物输出为 dist-lib/style.css\nimport '@/styles/index.css'\n\nexport interface InstallOptions {\n /** 接口模块(apiModule) */\n apiModule?: string\n /** 基础模块(baseModule) */\n baseModule?: string\n}\n\nconst DesignerPlugin = {\n install(app: App, options: InstallOptions = {}) {\n registerBuiltinWidgets()\n if (options.apiModule || options.baseModule) {\n configureApi({ apiModule: options.apiModule, baseModule: options.baseModule })\n }\n app.component('FdDesigner', Designer)\n },\n}\n\nexport default DesignerPlugin\nexport { Designer }\n/** 命令式渲染接口:外部通过 renderForm(options) 挂载,而非页面/组件形式 */\nexport { renderForm } from '@/components/renderer/renderForm'\nexport type { RenderFormOptions, RenderFormHandle } from '@/components/renderer/renderForm'\nexport { registerComponent } from '@/widgets'\nexport { setApiModule, setBaseModule, configureApi } from '@/api'\nexport * from '@/types'\n"],"names":["registry","registerComponent","def","getWidgetDef","type","getAllWidgetDefs","createWidget","store","useDesignerStore","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_toDisplayString","__props","_normalizeStyle","_Fragment","_createTextVNode","props","isLink","computed","linkUrl","raw","_a","display","designerStore","_mqMobile","ref","_mq","onMounted","e","onUnmounted","isMobile","_hoisted_3","DEFAULT_COLOR","emit","__emit","linkFields","f","hexOf","v","onColorChange","onBindFieldChange","val","onBindLinkChange","_openBlock","_hoisted_2","_cache","$event","_hoisted_4","_createVNode","ElSelect","ElOption","_renderList","_createBlock","_hoisted_5","_hoisted_6","_hoisted_7","labelDefinition","LabelDesign","LabelRender","LabelPanel","icon","icons","_resolveDynamicComponent","toggleExpanded","LucideIcon","_withDirectives","_renderSlot","_ctx","_vShow","isWidgetHidden","hiddenMode","status","s","expanded","cardIconNames","iconOpen","selectIcon","ic","_hoisted_9","_hoisted_11","FdSwitch","_hoisted_12","_hoisted_14","cardDefinition","CardDesign","CardRender","CardPanel","slotDefinition","SlotDesign","SlotRender","SlotPanel","showTable","c","col","_hoisted_8","cols","readonly","rows","visible","addRow","blank","delRow","idx","cellText","row","name","mergeInfo","list","spans","skipped","ci","enable","start","ri","cur","isMerged","rowspanOf","_hoisted_10","_hoisted_13","_hoisted_15","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","mockSubtables","subtableOptions","getSubtableDef","buildDefaultColumns","i","isFile","mockSchema","formId","template","set","key","value","onSelectSubtable","patch","dialog","reactive","clone","openCol","closeDialog","saveCol","next","toggleCol","addCol","nextTick","delCol","setColor","subtableFields","onBindLink","onTablestyle","onColField","x","opt","_hoisted_16","_Teleport","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_27","_hoisted_28","_hoisted_30","_hoisted_32","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_38","_hoisted_40","_hoisted_41","_hoisted_44","_hoisted_45","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_53","defaultColnums","subtableDefinition","SubtableDesign","SubtableRender","SubtablePanel","Comp","valueOf","bindField","_mergeProps","_createSlots","$slots","_","_withCtx","scope","_normalizeProps","_guardReactiveProps","child","_component_WidgetHost","PC_COLUMNS","gridCornerClass","index","siblings","layout","mobile","total","spanOf","n","flags","span","rowFirst","rowLast","lastRow","isFirstRow","isLastRow","cls","WidgetHost","layoutOptions","applyLayout","children","gridDefinition","GridDesign","GridRender","GridPanel","textDefinition","TextDesign","TextRender","TextPanel","registered","registerBuiltinWidgets","findNode","id","removeNode","defineStore","prev","hook","code","item","parentId","node","parent","maybeChildId","toParentId","srcNode","target","locate","r","src","destList","delta","findParent","j","targetId","dragId","detach","found","schema","fields","DEFAULT","runtime","installOptions","propsOverride","configureApi","options","setApiModule","module","setBaseModule","resolveApiConfig","buildUrl","action","baseModule","apiModule","getSchema","KEY_PREFIX","genGuid","saveFormToLocal","loadFormFromLocal","INJECT_FIRE_EVENT","runHandler","ctx","mountGlobalMethods","script","visibleWidgets","modes","runLifecycle","fireEvent","payload","ev","provide","watch","__expose","toTreeNode","label","treeData","totalCount","walk","onNodeClick","data","ElTree","showPreview","showCode","showTree","showImport","isMobileTemplate","t","previewWidth","clampPreviewWidth","w","importText","onImportConfirm","text","codeJson","mockFormData","collectSubtables","out","onSave","onSaveAs","onReload","local","onPublish","treeDrawerRef","treeBtnRef","onDocClick","_b","onBeforeUnmount","ElInputNumber","Renderer","ComponentTree","defs","groups","defOf","d","onDragStart","onAdd","g","LIFECYCLE_HOOKS","CodeEditor","defineAsyncComponent","editor","openLifecycle","h","confirmEditor","closeEditor","Panel","onUpdate","inGrid","onSpan","FormEventsPanel","rootEl","nodeStyle","styles","isContainer","gridCorner","hasDragData","onSelect","clearAll","onDragEnd","clearIndicator","onDragOver","el","rect","onDragLeave","onDrop","newType","moveId","_c","_component_CanvasNode","templateType","pathFormId","fid","fresh","onCanvasDrop","Toolbar","WidgetPalette","CanvasNode","PropertyPanel","renderForm","exposed","app","createApp","inst","DesignerPlugin","Designer"],"mappings":"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"}
|