@jxyszb/jxy-form-designer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ import { JXYFormDesigner as a } from "./designer.js";
2
+ import { useFormDesignerStore as x } from "./designer.js";
3
+ import { J as i, a as n, b as c } from "./chunks/RuntimePreviewPanel-3704c8f8.js";
4
+ import { createRequestDataSourceProvider as l } from "./runtime.js";
5
+ import { C as Y, S as g, c as D, a as T, d as _, e as C, b as E, m as h, n as q } from "./chunks/compositeField-98c1b192.js";
6
+ import { validateJxyFormSchema as M } from "./schema.js";
7
+ import "vue";
8
+ import "pinia";
9
+ import "element-plus";
10
+ import "@element-plus/icons-vue";
11
+ import "vuedraggable";
12
+ import "./chunks/dataSourceUrl-4b17feb8.js";
13
+ function N(e = {}) {
14
+ var o, t;
15
+ const m = {
16
+ dataSourceProvider: e.dataSourceProvider || (e.request ? l(e.request) : null),
17
+ components: {
18
+ fileUpload: ((o = e.components) == null ? void 0 : o.fileUpload) || null,
19
+ editor: ((t = e.components) == null ? void 0 : t.editor) || null
20
+ }
21
+ };
22
+ return {
23
+ install(r) {
24
+ r.provide(i, m), r.component("JXYFormDesigner", a), r.component("JXYFormRuntime", n), r.component("JXYRuntimePreviewPanel", c);
25
+ }
26
+ };
27
+ }
28
+ export {
29
+ Y as COMPONENT_GROUPS,
30
+ a as JXYFormDesigner,
31
+ n as JXYFormRuntime,
32
+ c as JXYRuntimePreviewPanel,
33
+ g as SCHEMA_VERSION,
34
+ D as createDefaultSchema,
35
+ T as createFieldNode,
36
+ _ as createGridNode,
37
+ N as createJxyFormPlugin,
38
+ C as createNodeFromPaletteItem,
39
+ l as createRequestDataSourceProvider,
40
+ E as createTitleNode,
41
+ h as migrateSchema,
42
+ q as normalizeImport,
43
+ x as useFormDesignerStore,
44
+ M as validateJxyFormSchema
45
+ };
@@ -0,0 +1,67 @@
1
+ import { a as w, b as A, a as D } from "./chunks/RuntimePreviewPanel-3704c8f8.js";
2
+ import { a as n } from "./chunks/dataSourceUrl-4b17feb8.js";
3
+ import "vue";
4
+ import "element-plus";
5
+ import "@element-plus/icons-vue";
6
+ import "./chunks/compositeField-98c1b192.js";
7
+ function l(c) {
8
+ if (typeof c != "function")
9
+ throw new TypeError("createRequestDataSourceProvider 需要传入宿主 request 函数");
10
+ const e = /* @__PURE__ */ new Map();
11
+ async function s(a) {
12
+ const r = n(a);
13
+ if (!e.has(r)) {
14
+ const o = c({
15
+ url: r,
16
+ method: "post",
17
+ data: {},
18
+ headers: {
19
+ isNotLoading: !0,
20
+ repeatSubmit: !1
21
+ }
22
+ }).then((t) => {
23
+ const i = t == null ? void 0 : t.data;
24
+ if (!i || typeof i != "object" || Array.isArray(i))
25
+ throw new Error("DICT 总接口返回格式错误,data 必须是以 dictType 为 key 的对象");
26
+ return i;
27
+ }).catch((t) => {
28
+ throw e.delete(r), t;
29
+ });
30
+ e.set(r, o);
31
+ }
32
+ return e.get(r);
33
+ }
34
+ return {
35
+ async loadDictOptions(a, r) {
36
+ const t = (await s(r))[a];
37
+ return Array.isArray(t) ? t : (console.warn(`[JXYRuntime] DICT 总接口未返回字典类型:${a}`), []);
38
+ },
39
+ async loadApiOptions(a, r = {}) {
40
+ const o = n(a), t = await c({
41
+ url: o,
42
+ method: "post",
43
+ data: r,
44
+ headers: {
45
+ isNotLoading: !0,
46
+ repeatSubmit: !1
47
+ }
48
+ });
49
+ if (!Array.isArray(t == null ? void 0 : t.data))
50
+ throw new Error("API 数据源返回格式错误,data 必须是选项数组");
51
+ return t.data;
52
+ },
53
+ clearDictCache(a) {
54
+ a ? e.delete(a) : e.clear();
55
+ },
56
+ // 兼容现有 provider 约定;Runtime 不依赖该方法。
57
+ listApiSources() {
58
+ return [];
59
+ }
60
+ };
61
+ }
62
+ export {
63
+ w as JXYFormRuntime,
64
+ A as JXYRuntimePreviewPanel,
65
+ l as createRequestDataSourceProvider,
66
+ D as default
67
+ };
package/dist/schema.js ADDED
@@ -0,0 +1,266 @@
1
+ import { S as h, N as S, x as A, U as E, D as v, V as b, y as O, g as x, f as C, h as d, z as m, A as T, E as _ } from "./chunks/compositeField-98c1b192.js";
2
+ import { W as ie, G as te, C as ae, K as se, B as re, F as pe, J as ue, I as ne, L as le, X as oe, H as ce, P as fe, T as de, u as ye, q as $e, p as he, c as Se, o as Ae, t as Ee, a as me, d as Te, e as _e, v as ge, w as Ie, s as Fe, b as Ne, Q as Ve, k as Pe, M as De, O as ve, m as be, i as Oe, n as xe, j as Ce, l as Re, R as Le, r as Ue, Y as Ke } from "./chunks/compositeField-98c1b192.js";
3
+ import { v as F } from "./chunks/dataSourceUrl-4b17feb8.js";
4
+ import { a as ke } from "./chunks/dataSourceUrl-4b17feb8.js";
5
+ const g = ["blur", "change"];
6
+ function Q(e, a = {}) {
7
+ const s = a.mode || "publish", p = a.componentRegistry || {}, i = [], t = [];
8
+ return !e || typeof e != "object" ? (i.push("schema 不是有效对象"), { valid: !1, errors: i, warnings: t }) : (R(e, i), L(e, t), U(e, i), K(e, i), Array.isArray(e.nodes) ? N(e.nodes, i, t, s, !1) : i.push("nodes 不是数组"), M(e, i), B(e, i), G(e, i, t), z(e, i), w(e, i, t), W(e, i, p), {
9
+ valid: i.length === 0,
10
+ errors: i,
11
+ warnings: t
12
+ });
13
+ }
14
+ function R(e, a) {
15
+ if (!e.schemaVersion) {
16
+ a.push("schemaVersion 缺失");
17
+ return;
18
+ }
19
+ e.schemaVersion !== h && a.push(`schemaVersion 不支持:${e.schemaVersion},当前支持 ${h}`);
20
+ }
21
+ function L(e, a) {
22
+ e.meta && (e.meta.formName || a.push("表单名称(meta.formName)为空"));
23
+ }
24
+ function U(e, a) {
25
+ if (!e.config)
26
+ return;
27
+ const s = e.config.suffixWidth;
28
+ s !== void 0 && (!Number.isFinite(s) || s < 0) && a.push("表单配置:suffixWidth 必须是大于等于 0 的数字");
29
+ }
30
+ function K(e, a) {
31
+ var u;
32
+ const p = (Array.isArray(e.dataSources) ? e.dataSources : []).some((r) => (r == null ? void 0 : r.type) === "dict"), i = ((u = e.dataSourceConfig) == null ? void 0 : u.dictUrl) || "", t = F(i, { required: p });
33
+ t.valid || a.push(`DICT 总接口地址:${t.message}`);
34
+ }
35
+ function N(e, a, s, p, i) {
36
+ e.forEach((t, u) => {
37
+ if (!t.nodeType || !S.includes(t.nodeType)) {
38
+ a.push(`节点 #${u} 的 nodeType "${t.nodeType}" 非法,支持:${S.join(", ")}`);
39
+ return;
40
+ }
41
+ t.nodeType === "field" ? Y(t, a, s, u) : t.nodeType === "title" ? j(t, s, u) : t.nodeType === "grid" && (i ? a.push(`节点 "${t.id}":grid 内不允许再嵌套 grid`) : q(t, a, s, p, u));
42
+ });
43
+ }
44
+ function Y(e, a, s, p) {
45
+ var u, r, n, o, c, y, $;
46
+ const i = `字段 "${e.id || "#" + p}"`;
47
+ if (e.prop || a.push(`${i}:缺少字段标识(prop)`), e.label || (e.prop ? s.push(`${i}(${e.prop}):label 为空`) : a.push(`${i}:缺少 label`)), (!e.type || !A.includes(e.type)) && a.push(`${i}:type "${e.type}" 不支持,支持:${A.join(", ")}`), !e.placeholder && !["custom", "addressSelector", "linkedSelectList"].includes(e.type) && !E.includes(e.type) && s.push(`${i}(${e.prop || ""}):placeholder 为空`), e.required || s.push(`${i}(${e.prop || ""}):未配置 required`), e.hidden && e.required && s.push(`${i}(${e.prop || ""}):hidden 与 required 同时存在`), v.includes(e.type) && !e.dataSourceId && s.push(`${i}(${e.prop || ""}):选择型字段未绑定数据源`), E.includes(e.type)) {
48
+ const l = e.props || {};
49
+ (!l.fileType || !Array.isArray(l.fileType) || l.fileType.length === 0) && s.push(`${i}(${e.prop || ""}):上传组件未配置 fileType 限制`);
50
+ }
51
+ if (e.defaultValue !== void 0 && e.defaultValue !== "" && e.defaultValue !== null && (["daterange", "datetimerange", "checkBox", "cascader", "file", "dragFile", "imgFile", "linkedSelectList"].includes(e.type) && !Array.isArray(e.defaultValue) && s.push(`${i}(${e.prop || ""}):defaultValue 类型疑似不匹配(期望数组)`), e.type === "addressSelector" && (typeof e.defaultValue != "object" || Array.isArray(e.defaultValue)) && s.push(`${i}(${e.prop || ""}):defaultValue 类型疑似不匹配(期望地址对象)`)), e.type === "linkedSelectList") {
52
+ const l = Number(((u = e.props) == null ? void 0 : u.minItems) ?? 1), f = Number(((r = e.props) == null ? void 0 : r.maxItems) ?? 5);
53
+ (l < 1 || f < 1 || l > f) && a.push(`${i}(${e.prop || ""}):关联选择列表的 minItems/maxItems 配置无效`), I(e, i, a), (n = e.props) != null && n.addButtonAlign && !["left", "center", "right"].includes(e.props.addButtonAlign) && a.push(`${i}(${e.prop || ""}):新增按钮对齐方式不支持`);
54
+ }
55
+ e.type === "addressSelector" && I(e, i, a), ((c = (o = e.extensions) == null ? void 0 : o.suffix) == null ? void 0 : c.enabled) !== void 0 && typeof e.extensions.suffix.enabled != "boolean" && a.push(`${i}:extensions.suffix.enabled 必须是布尔值`);
56
+ const t = ($ = (y = e.extensions) == null ? void 0 : y.suffix) == null ? void 0 : $.width;
57
+ t != null && t !== "" && (!Number.isFinite(t) || t < 0) && a.push(`${i}:extensions.suffix.width 必须是大于等于 0 的数字`), Array.isArray(e.validations) && e.validations.forEach((l, f) => {
58
+ if ((!l.type || !b.includes(l.type)) && a.push(`${i} validations[${f}]:type "${l.type}" 不支持`), l.message || s.push(`${i} validations[${f}]:message 为空`), !k(l.trigger)) {
59
+ const D = Array.isArray(l.trigger) ? l.trigger.join(",") : l.trigger;
60
+ a.push(`${i} validations[${f}]:trigger "${D}" 不支持,支持:blur、change、blur+change`);
61
+ }
62
+ });
63
+ }
64
+ function I(e, a, s) {
65
+ const p = e.type === "addressSelector";
66
+ (p ? [
67
+ ["provinceProp", "省份"],
68
+ ["cityProp", "城市"],
69
+ ["countyProp", "区县"],
70
+ ["detailAddressProp", "详细地址"]
71
+ ] : [
72
+ ["parentValueProp", "一级值"],
73
+ ["childValueProp", "二级值"]
74
+ ]).forEach(([u, r]) => {
75
+ var o;
76
+ const n = (o = e.props) == null ? void 0 : o[u];
77
+ n !== void 0 && (typeof n != "string" || !n.trim()) && s.push(`${a}(${e.prop || ""}):${r}字段标识(prop)不能为空`), O(n) && s.push(`${a}(${e.prop || ""}):${r}字段标识(prop)“${n}”不安全`);
78
+ });
79
+ const t = Object.values(p ? x(e) : C(e));
80
+ new Set(t).size !== t.length && s.push(`${a}(${e.prop || ""}):内部字段标识(prop)不能重复`);
81
+ }
82
+ function k(e) {
83
+ return e == null || e === "" ? !0 : typeof e == "string" ? g.includes(e) : Array.isArray(e) ? e.length > 0 && e.every((a) => g.includes(a)) : !1;
84
+ }
85
+ function j(e, a, s) {
86
+ e.title || a.push(`标题节点 "${e.id || "#" + s}":标题文本为空`);
87
+ }
88
+ function q(e, a, s, p, i) {
89
+ const t = `栅格 "${e.id || "#" + i}"`;
90
+ if (!Array.isArray(e.columns) || e.columns.length === 0) {
91
+ a.push(`${t}:columns 为空`);
92
+ return;
93
+ }
94
+ let u = 0;
95
+ e.columns.forEach((r, n) => {
96
+ const o = `${t} column[${n}]`;
97
+ typeof r.span != "number" || r.span < 1 || r.span > 24 ? a.push(`${o}:span "${r.span}" 非法(1-24)`) : u += r.span, Array.isArray(r.children) && r.children.length > 0 && N(r.children, a, s, p, !0);
98
+ }), u !== 24 && (p === "publish" ? a.push(`${t}:column span 合计 ${u},发布时必须为 24`) : s.push(`${t}:column span 合计 ${u},不等于 24`));
99
+ }
100
+ function M(e, a) {
101
+ const s = /* @__PURE__ */ new Set(), p = /* @__PURE__ */ new Set();
102
+ function i(t) {
103
+ t && (s.has(t) && p.add(t), s.add(t));
104
+ }
105
+ V(e.nodes, i), Array.isArray(e.dataSources) && e.dataSources.forEach((t) => i(t.id)), Array.isArray(e.reactions) && e.reactions.forEach((t) => i(t.id)), p.forEach((t) => {
106
+ a.push(`id 重复:${t}`);
107
+ });
108
+ }
109
+ function V(e, a) {
110
+ Array.isArray(e) && e.forEach((s) => {
111
+ a(s.id), s.nodeType === "grid" && Array.isArray(s.columns) && s.columns.forEach((p) => {
112
+ a(p.id), V(p.children, a);
113
+ });
114
+ });
115
+ }
116
+ function B(e, a) {
117
+ const s = d(e), p = {};
118
+ s.forEach((i) => {
119
+ i.prop && (p[i.prop] ? a.push(`字段标识(prop)重复:${i.prop}(节点 ${p[i.prop]} 与 ${i.id})`) : p[i.prop] = i.id);
120
+ });
121
+ }
122
+ function G(e, a, s) {
123
+ if (!Array.isArray(e.dataSources))
124
+ return;
125
+ const p = /* @__PURE__ */ new Set();
126
+ e.dataSources.forEach((i, t) => {
127
+ const u = `数据源 "${i.id || "#" + t}"`;
128
+ if (i.id && p.has(i.id) && a.push(`${u}:id 重复`), i.id && p.add(i.id), !i.type || !m.includes(i.type)) {
129
+ a.push(`${u}:类型 "${i.type}" 非法,支持:${m.join(", ")}`);
130
+ return;
131
+ }
132
+ if (i.type === "static" && (Array.isArray(i.options) ? P(i.options, `${u} options`, a) : a.push(`${u}:static 类型缺少 options 数组`)), i.type === "dict" && (i.dictType || a.push(`${u}:dict 类型缺少 dictType`)), i.type === "api") {
133
+ const r = F(i.url, { required: !0 });
134
+ if (!r.valid) {
135
+ const n = i.apiKey ? `(旧 apiKey:${i.apiKey})` : "";
136
+ a.push(`${u}:API 地址${n}${r.message}`);
137
+ }
138
+ i.apiKey && s.push(`${u}:仍包含旧 apiKey“${i.apiKey}”,配置有效 URL 后将自动移除`);
139
+ }
140
+ });
141
+ }
142
+ function P(e, a, s) {
143
+ e.forEach((p, i) => {
144
+ const t = `${a}[${i}]`;
145
+ if (!p || typeof p != "object") {
146
+ s.push(`${t}:选项必须是对象`);
147
+ return;
148
+ }
149
+ (p.label === void 0 || p.label === null) && s.push(`${t}:缺少 label`), (p.value === void 0 || p.value === null) && s.push(`${t}:缺少 value`), p.children !== void 0 && (Array.isArray(p.children) ? P(p.children, `${t}.children`, s) : s.push(`${t}:children 必须是数组`));
150
+ });
151
+ }
152
+ function z(e, a, s) {
153
+ if (!Array.isArray(e.dataSources))
154
+ return;
155
+ const p = new Set(e.dataSources.map((t) => t.id));
156
+ d(e).forEach((t) => {
157
+ t.dataSourceId && !p.has(t.dataSourceId) && a.push(`字段 "${t.id}"(${t.prop || ""}):引用的数据源 "${t.dataSourceId}" 不存在`);
158
+ });
159
+ }
160
+ function w(e, a, s) {
161
+ if (!Array.isArray(e.reactions) || e.reactions.length === 0)
162
+ return;
163
+ const p = d(e), i = new Set(p.map((t) => t.prop).filter(Boolean));
164
+ e.reactions.forEach((t, u) => {
165
+ const r = `联动规则 "${t.id || "#" + u}"`;
166
+ t.sourceField ? i.has(t.sourceField) || a.push(`${r}:sourceField "${t.sourceField}" 不存在`) : a.push(`${r}:sourceField 为空`), !t.condition || !t.condition.type ? s.push(`${r}:condition 缺失,默认 always`) : T.includes(t.condition.type) || a.push(`${r}:condition.type "${t.condition.type}" 非法,支持:${T.join(", ")}`), !Array.isArray(t.effects) || t.effects.length === 0 ? a.push(`${r}:effects 为空`) : t.effects.forEach((n, o) => {
167
+ const c = `${r} effects[${o}]`;
168
+ (!n.type || !_.includes(n.type)) && a.push(`${c}:type "${n.type}" 非法,支持:${_.join(", ")}`), n.targetField ? i.has(n.targetField) || a.push(`${c}:targetField "${n.targetField}" 不存在`) : a.push(`${c}:targetField 为空`);
169
+ });
170
+ }), H(e.reactions, a);
171
+ }
172
+ function H(e, a) {
173
+ const s = {}, p = /* @__PURE__ */ new Set();
174
+ e.forEach((r) => {
175
+ !r.sourceField || !Array.isArray(r.effects) || (p.add(r.sourceField), r.effects.forEach((n) => {
176
+ n.targetField && (p.add(n.targetField), s[r.sourceField] || (s[r.sourceField] = /* @__PURE__ */ new Set()), s[r.sourceField].add(n.targetField));
177
+ }));
178
+ });
179
+ const i = {}, t = {};
180
+ function u(r) {
181
+ if (t[r])
182
+ return !0;
183
+ if (i[r])
184
+ return !1;
185
+ i[r] = !0, t[r] = !0;
186
+ const n = s[r];
187
+ if (n) {
188
+ for (const o of n)
189
+ if (s[o] && u(o))
190
+ return !0;
191
+ }
192
+ return t[r] = !1, !1;
193
+ }
194
+ for (const r of p)
195
+ if (s[r] && u(r)) {
196
+ a.push(`联动规则存在循环依赖,涉及字段:${r}`);
197
+ break;
198
+ }
199
+ }
200
+ function W(e, a, s) {
201
+ d(e).forEach((i) => {
202
+ if (i.type === "custom") {
203
+ if (!i.componentKey) {
204
+ a.push(`字段 "${i.id}"(${i.prop || ""}):custom 类型缺少 componentKey`);
205
+ return;
206
+ }
207
+ Object.keys(s).length > 0 && !s[i.componentKey] && a.push(`字段 "${i.id}"(${i.prop || ""}):componentKey "${i.componentKey}" 未在 componentRegistry 中注册`);
208
+ }
209
+ });
210
+ }
211
+ export {
212
+ ie as ADDRESS_VALUE_KEY_DEFAULTS,
213
+ te as BASIC_TYPES,
214
+ ae as COMPONENT_GROUPS,
215
+ T as CONDITION_TYPES,
216
+ se as CUSTOM_TYPES,
217
+ v as DATA_SOURCE_FIELD_TYPES,
218
+ re as DATA_SOURCE_SCHEMA_VERSION,
219
+ m as DATA_SOURCE_TYPES,
220
+ _ as EFFECT_TYPES,
221
+ pe as EXTENSION_FIELD_SCHEMA_VERSION,
222
+ ue as EXTENSION_TYPES,
223
+ ne as LAYOUT_TYPES,
224
+ le as LEGACY_SCHEMA_VERSION,
225
+ oe as LINKED_VALUE_KEY_DEFAULTS,
226
+ S as NODE_TYPES,
227
+ h as SCHEMA_VERSION,
228
+ ce as SELECTION_TYPES,
229
+ A as SUPPORTED_FIELD_TYPES,
230
+ E as UPLOAD_TYPES,
231
+ b as VALIDATION_TYPES,
232
+ ke as assertDataSourceUrl,
233
+ d as collectAllFieldNodes,
234
+ fe as collectAllIds,
235
+ de as collectAllProps,
236
+ ye as createApiDataSource,
237
+ $e as createApiParam,
238
+ he as createColumnNode,
239
+ Se as createDefaultSchema,
240
+ Ae as createDesignerId,
241
+ Ee as createDictDataSource,
242
+ me as createFieldNode,
243
+ Te as createGridNode,
244
+ _e as createNodeFromPaletteItem,
245
+ ge as createReaction,
246
+ Ie as createReactionEffect,
247
+ Fe as createStaticDataSource,
248
+ Ne as createTitleNode,
249
+ Ve as deduplicateIds,
250
+ Pe as findNodeById,
251
+ x as getAddressValueKeys,
252
+ De as getDefaultProps,
253
+ ve as getDefaultValue,
254
+ C as getLinkedValueKeys,
255
+ O as isUnsafeCompositeValueKey,
256
+ be as migrateSchema,
257
+ Oe as normalizeAddressValue,
258
+ xe as normalizeImport,
259
+ Ce as normalizeLinkedValue,
260
+ Re as normalizeSortOrder,
261
+ Le as reassignAllIds,
262
+ Ue as removeNodeById,
263
+ Ke as resolveCompositeValueKey,
264
+ F as validateDataSourceUrl,
265
+ Q as validateJxyFormSchema
266
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .no-options[data-v-dcf61f35],.no-options[data-v-2545dad2]{font-size:12px;color:#c0c4cc}.jxy-host-component-missing[data-v-1e52dc63]{padding:8px 12px;border:1px solid var(--el-color-warning-light-5);border-radius:4px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);font-size:12px}.jxy-editor-field[data-v-620014d1]{width:100%}.jxy-editor-readonly[data-v-620014d1]{border:1px solid #dcdfe6;border-radius:4px;padding:8px 12px;font-size:14px;color:#606266;background:#f5f7fa;overflow:auto;line-height:1.6}.jxy-editor-missing[data-v-620014d1]{padding:8px 12px;border:1px solid var(--el-color-warning-light-5);border-radius:4px;color:var(--el-color-warning);background:var(--el-color-warning-light-9);font-size:12px}.jxy-custom-field[data-v-47936676]{width:100%}.custom-not-found[data-v-47936676]{display:flex;align-items:center;gap:6px;padding:8px 12px;background:#fdf6ec;border:1px solid #f5dab1;border-radius:4px;font-size:12px;color:#e6a23c}.custom-not-found code[data-v-47936676]{background:rgba(0,0,0,.06);padding:1px 4px;border-radius:2px;font-family:monospace}.jxy-address-selector[data-v-7143c4fd]{display:flex;flex-direction:column;gap:10px;width:100%}.jxy-address-selector__selects[data-v-7143c4fd]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.jxy-address-selector[data-v-7143c4fd] .el-select,.jxy-address-selector[data-v-7143c4fd] .el-input{width:100%}@media (max-width: 768px){.jxy-address-selector__selects[data-v-7143c4fd]{grid-template-columns:1fr}}.jxy-integer-uppercase-input[data-v-23d44c1e]{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.jxy-integer-uppercase-input[data-v-23d44c1e] .el-input{width:100%}.jxy-integer-uppercase-input__preview[data-v-23d44c1e]{min-height:32px;padding:6px 12px;box-sizing:border-box;color:var(--el-color-primary);font-weight:600;line-height:20px;background:var(--el-fill-color-light);border:1px solid var(--el-border-color);border-radius:var(--el-border-radius-base)}.jxy-linked-select-list[data-v-dc09a2f0]{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.jxy-linked-select-list__row[data-v-dc09a2f0]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr)) auto;align-items:center;gap:10px;width:100%}.jxy-linked-select-list[data-v-dc09a2f0] .el-select{width:100%;min-width:0}.jxy-linked-select-list__remove[data-v-dc09a2f0],.jxy-linked-select-list__add[data-v-dc09a2f0]{height:auto;padding:0;font-weight:500}.jxy-linked-select-list__add--left[data-v-dc09a2f0]{align-self:flex-start}.jxy-linked-select-list__add--center[data-v-dc09a2f0]{align-self:center}.jxy-linked-select-list__add--right[data-v-dc09a2f0]{align-self:flex-end}@media (max-width: 768px){.jxy-linked-select-list__row[data-v-dc09a2f0]{grid-template-columns:1fr}}.jxy-field-suffix[data-v-8626e24d]{flex:0 0 auto;min-width:0;box-sizing:border-box}.jxy-field-item[data-v-6a13f76c]{width:100%}.jxy-field-content[data-v-6a13f76c]{width:100%;min-width:0}.jxy-field-content--with-suffix[data-v-6a13f76c]{display:flex;align-items:flex-start;gap:8px}.jxy-field-control[data-v-6a13f76c]{flex:1;min-width:0}.jxy-field-unknown[data-v-6a13f76c]{padding:4px 0}.jxy-field-item--composite.is-error[data-v-6a13f76c] .el-input__wrapper,.jxy-field-item--composite.is-error[data-v-6a13f76c] .el-select__wrapper{box-shadow:0 0 0 1px var(--el-border-color) inset!important}.jxy-field-item--composite.is-error[data-v-6a13f76c] .jxy-extension-control--invalid .el-input__wrapper,.jxy-field-item--composite.is-error[data-v-6a13f76c] .jxy-extension-control--invalid .el-select__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset!important}.jxy-title-node[data-v-a3dadfb8]{padding:8px 0 4px;border-bottom:1px solid #ebeef5;margin-bottom:16px}.jxy-title-text[data-v-a3dadfb8]{margin:0;color:#303133;font-weight:600;line-height:1.4}.jxy-title-level-1 .jxy-title-text[data-v-a3dadfb8]{font-size:20px}.jxy-title-level-2 .jxy-title-text[data-v-a3dadfb8]{font-size:17px}.jxy-title-level-3 .jxy-title-text[data-v-a3dadfb8]{font-size:15px}.jxy-title-level-4 .jxy-title-text[data-v-a3dadfb8]{font-size:13px}.jxy-title-description[data-v-a3dadfb8]{margin:4px 0 0;font-size:12px;color:#909399;line-height:1.5}.jxy-grid-node[data-v-df3469b9]{margin-bottom:0}.jxy-grid-col[data-v-df3469b9]{padding:0}.jxy-form-runtime[data-v-c8c6eb87],.jxy-runtime-form[data-v-c8c6eb87]{width:100%}.jxy-runtime-form[data-v-c8c6eb87] .el-form-item{margin-bottom:18px}.jxy-runtime-form[data-v-c8c6eb87] .el-date-editor,.jxy-runtime-form[data-v-c8c6eb87] .el-select,.jxy-runtime-form[data-v-c8c6eb87] .el-cascader,.jxy-runtime-form[data-v-c8c6eb87] .el-input-number{width:100%}.jxy-runtime-form[data-v-c8c6eb87] .el-input.is-disabled .el-input__inner,.jxy-runtime-form[data-v-c8c6eb87] .el-textarea.is-disabled .el-textarea__inner,.jxy-runtime-form[data-v-c8c6eb87] .el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-text-color-regular);-webkit-text-fill-color:var(--el-text-color-regular)}.jxy-runtime-preview-panel[data-v-1eae2f9c]{width:100%}.runtime-preview-form[data-v-1eae2f9c]{min-width:0}.runtime-preview-actions[data-v-1eae2f9c]{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}.runtime-preview-divider[data-v-1eae2f9c]{margin:18px 0}.runtime-preview-data[data-v-1eae2f9c]{margin:0;padding:12px;background:#f5f7fa;border:1px solid #ebeef5;border-radius:4px;font-size:12px;font-family:Cascadia Code,Fira Code,Consolas,monospace;color:#476582;line-height:1.6;max-height:300px;overflow:auto;white-space:pre}.jxy-runtime-preview-panel.is-dialog-layout[data-v-1eae2f9c]{display:flex;align-items:flex-start;gap:24px}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-form[data-v-1eae2f9c]{flex:0 0 calc(70% - 12px);max-width:calc(70% - 12px)}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-side[data-v-1eae2f9c]{flex:0 0 calc(30% - 12px);max-width:calc(30% - 12px);min-width:260px;padding-left:20px;border-left:1px solid #ebeef5;box-sizing:border-box;position:sticky;top:0}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-divider[data-v-1eae2f9c]{display:none}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-actions[data-v-1eae2f9c]{margin-bottom:12px}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-actions .el-button[data-v-1eae2f9c]{margin-left:0}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-data[data-v-1eae2f9c]{max-height:calc(100vh - 190px)}@media (max-width: 960px){.jxy-runtime-preview-panel.is-dialog-layout[data-v-1eae2f9c]{display:block}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-form[data-v-1eae2f9c],.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-side[data-v-1eae2f9c]{max-width:none;min-width:0}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-side[data-v-1eae2f9c]{margin-top:16px;padding-left:0;border-left:0;position:static}.jxy-runtime-preview-panel.is-dialog-layout .runtime-preview-divider[data-v-1eae2f9c]{display:block}}.jxy-designer-toolbar[data-v-d6e3dd8d]{display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 12px;background:#fff;border-bottom:1px solid #e4e7ed;flex-shrink:0}.toolbar-left[data-v-d6e3dd8d],.toolbar-right[data-v-d6e3dd8d]{display:flex;align-items:center;gap:4px}.toolbar-center[data-v-d6e3dd8d]{flex:1;text-align:center}.toolbar-title[data-v-d6e3dd8d]{font-size:15px;font-weight:600;color:#303133}.jxy-publish-error-box .jxy-publish-error-list{margin:0;padding-left:20px;line-height:1.8;text-align:left;white-space:normal}.jxy-component-palette[data-v-20210c01]{padding:8px 0}.palette-group[data-v-20210c01]{margin-bottom:8px}.palette-group-title[data-v-20210c01]{padding:8px 16px 4px;font-size:12px;font-weight:600;color:#909399;text-transform:uppercase;letter-spacing:.5px}.palette-item-list[data-v-20210c01]{display:flex;flex-wrap:wrap;padding:0 8px;gap:6px}.palette-item[data-v-20210c01]{display:flex;align-items:center;gap:4px;padding:6px 10px;border:1px solid #e4e7ed;border-radius:4px;cursor:grab;font-size:12px;color:#606266;background:#fafafa;transition:all .2s;user-select:none;width:calc(50% - 3px);box-sizing:border-box}.palette-item[data-v-20210c01]:hover{border-color:#409eff;color:#409eff;background:#ecf5ff}.palette-item[data-v-20210c01]:active{cursor:grabbing}.palette-item-icon[data-v-20210c01]{font-size:14px}.palette-item-label[data-v-20210c01]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-preview[data-v-5338ecd2]{width:100%}.preview-radio[data-v-5338ecd2],.preview-checkbox[data-v-5338ecd2]{display:flex;gap:12px;padding:4px 0}.preview-upload[data-v-5338ecd2]{padding:4px 0}.preview-editor-box[data-v-5338ecd2]{height:60px;border:1px dashed #dcdfe6;border-radius:4px;display:flex;align-items:center;justify-content:center;color:#c0c4cc;font-size:12px;background:#fafafa}.preview-custom[data-v-5338ecd2]{padding:4px 0}.preview-address[data-v-5338ecd2],.preview-integer-uppercase[data-v-5338ecd2],.preview-linked-select[data-v-5338ecd2]{display:flex;flex-direction:column;gap:6px}.preview-address-selects[data-v-5338ecd2],.preview-linked-select>div[data-v-5338ecd2]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.preview-linked-select>div[data-v-5338ecd2]{grid-template-columns:repeat(2,minmax(0,1fr))}.preview-integer-uppercase span[data-v-5338ecd2]{color:var(--el-color-primary);font-size:12px}.preview-linked-select-add.is-left[data-v-5338ecd2]{align-self:flex-start}.preview-linked-select-add.is-center[data-v-5338ecd2]{align-self:center}.preview-linked-select-add.is-right[data-v-5338ecd2]{align-self:flex-end}.preview-unknown[data-v-5338ecd2]{padding:4px 0}.canvas-node[data-v-b4ea2b4e]{position:relative;margin-bottom:8px;border:1px solid transparent;border-radius:4px;padding:8px;transition:all .15s;cursor:pointer}.canvas-node[data-v-b4ea2b4e]:hover{border-color:#c6e2ff;background:#f5f9ff}.canvas-node.is-selected[data-v-b4ea2b4e]{border-color:#409eff;background:#ecf5ff}.canvas-node-actions[data-v-b4ea2b4e]{position:absolute;top:-1px;right:-1px;display:flex;gap:2px;background:#409eff;border-radius:0 4px;padding:2px 4px;z-index:10}.canvas-node-actions .el-icon[data-v-b4ea2b4e]{color:#fff;font-size:14px;cursor:pointer;padding:2px}.canvas-node-drag-handle[data-v-b4ea2b4e]{cursor:grab!important}.canvas-node-drag-handle[data-v-b4ea2b4e]:active{cursor:grabbing!important}.canvas-field-node[data-v-b4ea2b4e]{display:flex;align-items:flex-start;gap:8px}.canvas-field-label[data-v-b4ea2b4e]{flex-shrink:0;width:100px;text-align:right;font-size:13px;color:#606266;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.required-mark[data-v-b4ea2b4e]{color:#f56c6c;margin-right:2px}.canvas-field-preview[data-v-b4ea2b4e]{flex:1;min-width:0}.canvas-field-suffix-placeholder[data-v-b4ea2b4e]{flex:0 0 auto;box-sizing:border-box;padding:6px 8px;border:1px dashed #a8abb2;border-radius:4px;color:#909399;font-size:12px;line-height:1;overflow:hidden;text-align:center;text-overflow:ellipsis;white-space:nowrap}.canvas-title-node[data-v-b4ea2b4e]{padding:4px 0}.canvas-title-text[data-v-b4ea2b4e]{margin:0;color:#303133}.canvas-title-desc[data-v-b4ea2b4e]{margin:4px 0 0;font-size:12px;color:#909399}.canvas-grid-node[data-v-b4ea2b4e]{padding:4px 0}.canvas-grid-label[data-v-b4ea2b4e]{display:flex;align-items:center;gap:4px;font-size:12px;color:#909399;margin-bottom:8px}.canvas-grid-col[data-v-b4ea2b4e]{position:relative;min-height:120px;border:1px dashed #dcdfe6;border-radius:4px;padding:8px;transition:border-color .15s}.canvas-grid-col[data-v-b4ea2b4e]:hover{border-color:#c6e2ff}.canvas-grid-col.col-selected[data-v-b4ea2b4e]{border-color:#409eff;background:rgba(64,158,255,.04)}.col-span-badge[data-v-b4ea2b4e]{position:absolute;top:2px;left:4px;font-size:10px;color:#c0c4cc}.canvas-col-children[data-v-b4ea2b4e]{min-height:96px}.col-empty[data-v-b4ea2b4e]{display:flex;align-items:center;justify-content:center;min-height:80px;color:#c0c4cc;font-size:12px;pointer-events:none}[data-v-b4ea2b4e] .canvas-drag-ghost{opacity:.4;border:2px dashed #409eff!important}[data-v-b4ea2b4e] .canvas-drag-chosen{box-shadow:0 0 0 2px #409eff}.jxy-designer-canvas[data-v-face1280]{min-height:100%}.canvas-form-wrapper[data-v-face1280]{min-height:400px;background:#fff;border-radius:4px;box-shadow:0 2px 12px #0000000f;padding:20px}.canvas-empty[data-v-face1280]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:300px;color:#c0c4cc}.canvas-empty p[data-v-face1280]{margin-top:12px;font-size:14px}.canvas-node-list[data-v-face1280]{min-height:180px;padding-bottom:80px}.canvas-drag-ghost[data-v-face1280]{opacity:.4;border:2px dashed #409eff!important}.canvas-drag-chosen[data-v-face1280]{box-shadow:0 0 0 2px #409eff}.jxy-props-panel[data-v-8cb9e83e]{min-height:200px}.props-empty[data-v-8cb9e83e]{display:flex;align-items:center;justify-content:center;min-height:200px;color:#c0c4cc;font-size:13px}.props-node-type[data-v-8cb9e83e]{display:flex;align-items:center;gap:8px;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #ebeef5}.props-node-id[data-v-8cb9e83e]{font-size:11px;color:#606266;font-family:monospace;user-select:all}.props-node-copy[data-v-8cb9e83e]{padding:2px;min-height:20px;color:#606266}.props-field-list[data-v-8cb9e83e] .el-form-item{margin-bottom:12px}.props-field-list[data-v-8cb9e83e] .el-form-item__label{font-size:12px;color:#606266;padding-bottom:2px}.props-switch-form-item[data-v-8cb9e83e] .el-form-item__content{width:100%}.props-switch-row[data-v-8cb9e83e]{display:flex;align-items:center;justify-content:space-between;width:100%}.props-switch-label[data-v-8cb9e83e]{font-size:12px;color:#606266;cursor:default;user-select:none}.validation-editor[data-v-8cb9e83e]{width:100%}.validation-row[data-v-8cb9e83e]{padding:8px;margin-bottom:8px;border:1px solid #ebeef5;border-radius:4px;background:#fafafa}.validation-main-row[data-v-8cb9e83e]{display:flex;align-items:center;gap:6px;margin-bottom:6px}.validation-type[data-v-8cb9e83e]{width:92px;flex-shrink:0}.validation-value[data-v-8cb9e83e]{flex:1;min-width:0}.validation-trigger[data-v-8cb9e83e]{width:76px;flex-shrink:0}.validation-delete[data-v-8cb9e83e]{color:#f56c6c;cursor:pointer}.panel-header[data-v-a3a65c84]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;font-size:14px;font-weight:600;color:#303133}.ds-empty[data-v-a3a65c84]{text-align:center;color:#c0c4cc;padding:40px 0;font-size:13px}.ds-item-title[data-v-a3a65c84]{display:flex;align-items:center;gap:8px;width:100%;font-size:13px}.ds-delete-btn[data-v-a3a65c84]{margin-left:auto;color:#f56c6c;cursor:pointer}.static-option-row[data-v-a3a65c84]{display:flex;gap:8px;margin-bottom:8px;align-items:center}.static-editor-mode[data-v-a3a65c84]{margin-bottom:10px}.tree-options-editor[data-v-a3a65c84]{width:100%}.tree-options-error[data-v-a3a65c84]{margin-top:6px;color:#f56c6c;font-size:12px}.tree-options-tip[data-v-a3a65c84]{margin-top:6px;color:#909399;font-size:12px;line-height:1.5}.static-option-row .el-input[data-v-a3a65c84]{flex:1}.opt-delete[data-v-a3a65c84]{color:#f56c6c;cursor:pointer;flex-shrink:0}.api-params-wrap[data-v-a3a65c84]{width:100%}.api-param-header[data-v-a3a65c84]{display:flex;gap:4px;align-items:center;margin-bottom:6px;font-size:11px;color:#909399;font-weight:600}.api-param-row[data-v-a3a65c84]{display:flex;gap:4px;align-items:center;margin-bottom:6px}.param-col-key[data-v-a3a65c84],.param-col-type[data-v-a3a65c84]{flex:2;min-width:0}.param-col-source[data-v-a3a65c84]{flex:3;min-width:0}.param-col-req[data-v-a3a65c84]{flex:0 0 32px;display:flex;justify-content:center}.param-col-del[data-v-a3a65c84]{flex:0 0 18px;display:flex;justify-content:center}.api-param-tip[data-v-a3a65c84]{display:flex;align-items:flex-start;gap:4px;margin-top:8px;font-size:11px;color:#909399;line-height:1.5}.legacy-api-tip[data-v-a3a65c84]{margin-top:4px;color:#e6a23c;font-size:11px;line-height:1.5}.panel-header[data-v-c7063ca9]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;font-size:14px;font-weight:600;color:#303133}.reaction-empty[data-v-c7063ca9]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0;color:#c0c4cc;font-size:13px}.reaction-empty p[data-v-c7063ca9]{margin-top:8px}.reaction-item-title[data-v-c7063ca9]{display:flex;align-items:center;gap:8px;width:100%;font-size:13px;padding-right:8px}.reaction-item-label[data-v-c7063ca9]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#606266}.reaction-delete-btn[data-v-c7063ca9]{color:#f56c6c;cursor:pointer;flex-shrink:0}.reaction-form[data-v-c7063ca9] .el-form-item{margin-bottom:10px}.reaction-form[data-v-c7063ca9] .el-form-item__label{font-size:12px;color:#606266;padding-bottom:2px}.condition-row[data-v-c7063ca9]{display:flex;gap:8px;width:100%;align-items:center}.effects-list[data-v-c7063ca9]{width:100%;display:flex;flex-direction:column;gap:0}.effect-row[data-v-c7063ca9]{display:flex;gap:6px;margin-bottom:8px;align-items:center;flex-wrap:wrap}.effect-delete[data-v-c7063ca9]{color:#f56c6c;cursor:pointer;flex-shrink:0}.effect-json-value[data-v-c7063ca9]{width:100%}.section-title[data-v-99b3e94a]{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#606266;margin-bottom:10px}.section-title .el-icon[data-v-99b3e94a]{font-size:14px;color:#909399}.config-form[data-v-99b3e94a] .el-form-item{margin-bottom:12px}.config-form[data-v-99b3e94a] .el-form-item__label{font-size:12px;color:#606266;padding-bottom:2px}.config-divider[data-v-99b3e94a]{margin:14px 0}.config-tip[data-v-99b3e94a]{margin-top:4px;color:#909399;font-size:11px;line-height:1.5}.schema-info[data-v-99b3e94a]{background:#f5f7fa;border-radius:4px;padding:10px 12px;display:flex;flex-direction:column;gap:8px}.schema-info-row[data-v-99b3e94a]{display:flex;align-items:center;justify-content:space-between}.schema-info-label[data-v-99b3e94a]{font-size:12px;color:#909399}.jxy-designer-right-panel[data-v-82e44664]{padding:0;height:100%}.right-panel-tabs[data-v-82e44664]{height:100%}.right-panel-tabs[data-v-82e44664] .el-tabs__content{padding:12px;overflow-y:auto;height:calc(100% - 55px)}.right-panel-tabs[data-v-82e44664] .el-tabs__header{margin-bottom:0;padding:0 12px}.jxy-preview-content[data-v-0779918e]{padding:16px;min-height:300px}.runtime-wrap[data-v-0779918e]{padding:8px 0}.schema-json-wrap[data-v-0779918e]{border:1px solid #ebeef5;border-radius:4px;overflow:hidden}.json-toolbar[data-v-0779918e]{padding:6px 12px;background:#f5f7fa;border-bottom:1px solid #ebeef5;display:flex;justify-content:flex-end}.schema-json-view[data-v-0779918e]{margin:0;padding:12px;background:#fafafa;font-size:11px;font-family:Cascadia Code,Fira Code,Consolas,monospace;color:#476582;line-height:1.6;max-height:500px;overflow:auto;white-space:pre}.jxy-form-designer[data-v-aaf0899a]{display:flex;flex-direction:column;height:100%;min-height:600px;background:#f5f7fa;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.jxy-designer-body[data-v-aaf0899a]{display:flex;flex:1;overflow:hidden}.jxy-designer-left[data-v-aaf0899a]{width:280px;min-width:280px;background:#fff;border-right:1px solid #e4e7ed;overflow-y:auto}.jxy-designer-center[data-v-aaf0899a]{flex:1;overflow:auto;padding:16px;background:#f5f7fa}.jxy-designer-right[data-v-aaf0899a]{width:340px;min-width:340px;min-height:0;background:#fff;border-left:1px solid #e4e7ed;overflow:hidden}.jxy-designer-preview-dialog .el-dialog__body{padding:20px 40px;width:100%;max-width:none;max-height:calc(100vh - 111px)!important;margin:0 auto;box-sizing:border-box}