@xbeeant/form-engine-designer 0.0.3 → 0.0.4
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/es/Canvas.js +42 -47
- package/dist/es/Canvas.js.map +1 -1
- package/dist/es/Designer.js +121 -98
- package/dist/es/Designer.js.map +1 -1
- package/dist/es/DesignerContext.js +86 -73
- package/dist/es/DesignerContext.js.map +1 -1
- package/dist/es/Palette.js +3 -3
- package/dist/es/Palette.js.map +1 -1
- package/dist/es/PropertyPanel.js +99 -100
- package/dist/es/PropertyPanel.js.map +1 -1
- package/dist/es/catalog.js +17 -10
- package/dist/es/catalog.js.map +1 -1
- package/dist/es/designer-context.js +110 -0
- package/dist/es/designer-context.js.map +1 -0
- package/dist/es/history.js +73 -0
- package/dist/es/history.js.map +1 -0
- package/dist/es/index.css +1 -1
- package/dist/es/index.js +3 -3
- package/dist/es/property/basic-property.js +6 -0
- package/dist/es/property/basic-property.js.map +1 -1
- package/dist/es/property-panel.js +294 -0
- package/dist/es/property-panel.js.map +1 -0
- package/dist/es/resizable-panel.js +103 -0
- package/dist/es/resizable-panel.js.map +1 -0
- package/dist/es/schema-utils.js +286 -0
- package/dist/es/schema-utils.js.map +1 -0
- package/dist/es/widgets/BindEditor.js +60 -49
- package/dist/es/widgets/BindEditor.js.map +1 -1
- package/dist/es/widgets/CodeEditor.js +41 -49
- package/dist/es/widgets/CodeEditor.js.map +1 -1
- package/dist/es/widgets/DefaultEditor.js +25 -30
- package/dist/es/widgets/DefaultEditor.js.map +1 -1
- package/dist/es/widgets/DependenciesEditor.js +21 -21
- package/dist/es/widgets/DependenciesEditor.js.map +1 -1
- package/dist/es/widgets/EnumEditor.js +25 -31
- package/dist/es/widgets/EnumEditor.js.map +1 -1
- package/dist/es/widgets/ExpressionSwitch.js +32 -30
- package/dist/es/widgets/ExpressionSwitch.js.map +1 -1
- package/dist/es/widgets/ReactionsEditor.js +103 -103
- package/dist/es/widgets/ReactionsEditor.js.map +1 -1
- package/dist/es/widgets/RemoteDataEditor.js +63 -63
- package/dist/es/widgets/RemoteDataEditor.js.map +1 -1
- package/dist/es/widgets/ValidateEditor.js +49 -49
- package/dist/es/widgets/ValidateEditor.js.map +1 -1
- package/dist/es/widgets/bind-editor.js +78 -0
- package/dist/es/widgets/bind-editor.js.map +1 -0
- package/dist/es/widgets/code-editor.js +76 -0
- package/dist/es/widgets/code-editor.js.map +1 -0
- package/dist/es/widgets/default-editor.js +50 -0
- package/dist/es/widgets/default-editor.js.map +1 -0
- package/dist/es/widgets/dependencies-editor.js +36 -0
- package/dist/es/widgets/dependencies-editor.js.map +1 -0
- package/dist/es/widgets/enum-editor.js +43 -0
- package/dist/es/widgets/enum-editor.js.map +1 -0
- package/dist/es/widgets/expression-builder.js +367 -0
- package/dist/es/widgets/expression-builder.js.map +1 -0
- package/dist/es/widgets/expression-model.js +340 -0
- package/dist/es/widgets/expression-model.js.map +1 -0
- package/dist/es/widgets/expression-switch.js +49 -0
- package/dist/es/widgets/expression-switch.js.map +1 -0
- package/dist/es/widgets/index.js +13 -13
- package/dist/es/widgets/index.js.map +1 -1
- package/dist/es/widgets/options-editor.js +102 -0
- package/dist/es/widgets/options-editor.js.map +1 -0
- package/dist/es/widgets/reactions-editor.js +401 -0
- package/dist/es/widgets/reactions-editor.js.map +1 -0
- package/dist/es/widgets/reactions-model.js +107 -0
- package/dist/es/widgets/reactions-model.js.map +1 -0
- package/dist/es/widgets/remote-data-editor.js +314 -0
- package/dist/es/widgets/remote-data-editor.js.map +1 -0
- package/dist/es/widgets/use-form-data-fields.js +16 -0
- package/dist/es/widgets/use-form-data-fields.js.map +1 -0
- package/dist/es/widgets/validate-editor.js +118 -0
- package/dist/es/widgets/validate-editor.js.map +1 -0
- package/package.json +4 -5
- package/dist/es/react/src/components/FormController.js +0 -160
- package/dist/es/react/src/components/FormController.js.map +0 -1
- package/dist/es/react/src/components/NexusField.js +0 -98
- package/dist/es/react/src/components/NexusField.js.map +0 -1
- package/dist/es/react/src/components/NexusForm.js +0 -128
- package/dist/es/react/src/components/NexusForm.js.map +0 -1
- package/dist/es/react/src/components/NexusFormProvider.js +0 -19
- package/dist/es/react/src/components/NexusFormProvider.js.map +0 -1
- package/dist/es/react/src/components/NexusLayout.js +0 -49
- package/dist/es/react/src/components/NexusLayout.js.map +0 -1
- package/dist/es/react/src/components/NexusObject.js +0 -65
- package/dist/es/react/src/components/NexusObject.js.map +0 -1
- package/dist/es/react/src/contexts/FieldInheritContext.js +0 -6
- package/dist/es/react/src/contexts/FieldInheritContext.js.map +0 -1
- package/dist/es/react/src/contexts/GridContext.js +0 -6
- package/dist/es/react/src/contexts/GridContext.js.map +0 -1
- package/dist/es/react/src/contexts/LayoutConfigContext.js +0 -6
- package/dist/es/react/src/contexts/LayoutConfigContext.js.map +0 -1
- package/dist/es/react/src/contexts/NexusContext.js +0 -13
- package/dist/es/react/src/contexts/NexusContext.js.map +0 -1
- package/dist/es/react/src/hooks/useForm.js +0 -13
- package/dist/es/react/src/hooks/useForm.js.map +0 -1
- package/dist/es/react/src/utils/renderTreeNode.js +0 -18
- package/dist/es/react/src/utils/renderTreeNode.js.map +0 -1
- package/dist/es/react/src/utils/resolveColSpan.js +0 -10
- package/dist/es/react/src/utils/resolveColSpan.js.map +0 -1
- package/src/Canvas.tsx +0 -1111
- package/src/Designer.css +0 -206
- package/src/Designer.tsx +0 -254
- package/src/DesignerContext.tsx +0 -192
- package/src/Palette.tsx +0 -261
- package/src/PropertyPanel.tsx +0 -486
- package/src/ResizablePanel.tsx +0 -210
- package/src/catalog.ts +0 -527
- package/src/index.ts +0 -25
- package/src/property/basic-property.ts +0 -126
- package/src/schemaUtils.test.ts +0 -261
- package/src/schemaUtils.ts +0 -627
- package/src/types.ts +0 -38
- package/src/vite-env.d.ts +0 -1
- package/src/widgets/BindEditor.tsx +0 -105
- package/src/widgets/CodeEditor.tsx +0 -114
- package/src/widgets/DefaultEditor.tsx +0 -73
- package/src/widgets/DependenciesEditor.tsx +0 -56
- package/src/widgets/EnumEditor.tsx +0 -66
- package/src/widgets/ExpressionBuilder.tsx +0 -509
- package/src/widgets/ExpressionSwitch.tsx +0 -62
- package/src/widgets/OptionsEditor.tsx +0 -141
- package/src/widgets/ReactionsEditor.tsx +0 -532
- package/src/widgets/RemoteDataEditor.tsx +0 -382
- package/src/widgets/ValidateEditor.tsx +0 -162
- package/src/widgets/expressionModel.test.ts +0 -262
- package/src/widgets/expressionModel.ts +0 -573
- package/src/widgets/index.ts +0 -45
- package/src/widgets/reactionsModel.ts +0 -190
- package/src/widgets/useFormDataFields.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.js","sources":["../../../src/widgets/CodeEditor.tsx"],"sourcesContent":["// ============================================================================\n// CodeEditor — 属性面板专用 JSON 编辑器\n// 供 remoteData 等对象配置使用:支持语法校验、格式化与占位符示例\n// 值格式:object | array(非法 JSON 不写回,光标处自动提示)\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Button,
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","sources":["../../../src/widgets/CodeEditor.tsx"],"sourcesContent":["// ============================================================================\n// CodeEditor — 属性面板专用 JSON 编辑器\n// 供 remoteData 等对象配置使用:支持语法校验、格式化与占位符示例\n// 值格式:object | array(非法 JSON 不写回,光标处自动提示)\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Button, Input, Space, Typography } from 'antd';\nimport { useMemo, useState } from 'react';\n\nexport function CodeEditor({\n value,\n onChange,\n title,\n description,\n placeholder,\n ...rest\n}: WidgetProps) {\n const fieldProps = rest as Record<string, unknown>;\n const lines = (fieldProps?.lines as number) ?? 10;\n\n const [error, setError] = useState<string | null>(null);\n\n // 编辑态文案:初始为 JSON 字符串;解析失败时保留原文(不打断输入)\n const [draft, setDraft] = useState<string | undefined>(undefined);\n\n const text = useMemo(() => {\n if (draft !== undefined) {\n return draft;\n }\n if (value === undefined || value === null) {\n return '';\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }, [draft, value]);\n\n const handleChange = (raw: string) => {\n setDraft(raw);\n const trimmed = raw.trim();\n if (!trimmed) {\n setError(null);\n onChange(undefined);\n return;\n }\n try {\n const parsed = JSON.parse(trimmed);\n setError(null);\n onChange(parsed);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'JSON 解析失败');\n }\n };\n\n const handleFormat = () => {\n try {\n const formatted = JSON.stringify(JSON.parse(text), null, 2);\n setDraft(formatted);\n setError(null);\n } catch {\n // 语法非法时静默,保留原文\n }\n };\n\n return (\n <>\n <Input.TextArea\n value={text}\n rows={lines}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={\n placeholder\n ? `示例:\\n${typeof placeholder === 'string' ? placeholder : JSON.stringify(placeholder, null, 2)}`\n : '{}'\n }\n style={{ fontFamily: 'monospace', fontSize: 12 }}\n />\n <Space.Compact style={{ marginTop: 6, width: '100%' }}>\n <Button size='small' onClick={handleFormat} disabled={!!error}>\n 格式化\n </Button>\n <Button\n size='small'\n onClick={() => {\n setDraft('');\n setError(null);\n onChange(undefined);\n }}\n >\n 清空\n </Button>\n </Space.Compact>\n {error && (\n <Typography.Text type='danger' style={{ fontSize: 11 }}>\n {error}\n </Typography.Text>\n )}\n {description && !error && (\n <span style={{ fontSize: 11, color: '#999' }}>{description}</span>\n )}\n </>\n );\n}\n\nexport const codeEditorWidget = CodeEditor;\n"],"names":["CodeEditor","value","onChange","title","description","placeholder","rest","lines","error","setError","useState","draft","setDraft","text","useMemo","handleChange","raw","trimmed","parsed","e","handleFormat","formatted","jsxs","Fragment","jsx","Input","Space","Button","Typography","codeEditorWidget"],"mappings":";;;AAUO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,GAAGC;AACL,GAAgB;AAEd,QAAMC,IADaD,GACQ,SAAoB,IAEzC,CAACE,GAAOC,CAAQ,IAAIC,EAAwB,IAAI,GAGhD,CAACC,GAAOC,CAAQ,IAAIF,EAA6B,MAAS,GAE1DG,IAAOC,EAAQ,MAAM;AACzB,QAAIH,MAAU;AACZ,aAAOA;AAET,QAA2BV,KAAU;AACnC,aAAO;AAET,QAAI;AACF,aAAO,KAAK,UAAUA,GAAO,MAAM,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO,OAAOA,CAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAACU,GAAOV,CAAK,CAAC,GAEXc,IAAe,CAACC,MAAgB;AACpC,IAAAJ,EAASI,CAAG;AACZ,UAAMC,IAAUD,EAAI,KAAA;AACpB,QAAI,CAACC,GAAS;AACZ,MAAAR,EAAS,IAAI,GACbP,EAAS,MAAS;AAClB;AAAA,IACF;AACA,QAAI;AACF,YAAMgB,IAAS,KAAK,MAAMD,CAAO;AACjC,MAAAR,EAAS,IAAI,GACbP,EAASgB,CAAM;AAAA,IACjB,SAASC,GAAG;AACV,MAAAV,EAASU,aAAa,QAAQA,EAAE,UAAU,WAAW;AAAA,IACvD;AAAA,EACF,GAEMC,IAAe,MAAM;AACzB,QAAI;AACF,YAAMC,IAAY,KAAK,UAAU,KAAK,MAAMR,CAAI,GAAG,MAAM,CAAC;AAC1D,MAAAD,EAASS,CAAS,GAClBZ,EAAS,IAAI;AAAA,IACf,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SACE,gBAAAa,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC,EAAM;AAAA,MAAN;AAAA,QACC,OAAOZ;AAAA,QACP,MAAMN;AAAA,QACN,UAAU,CAACY,MAAMJ,EAAaI,EAAE,OAAO,KAAK;AAAA,QAC5C,aACEd,IACI;AAAA,EAAQ,OAAOA,KAAgB,WAAWA,IAAc,KAAK,UAAUA,GAAa,MAAM,CAAC,CAAC,KAC5F;AAAA,QAEN,OAAO,EAAE,YAAY,aAAa,UAAU,GAAA;AAAA,MAAG;AAAA,IAAA;AAAA,IAEjD,gBAAAiB,EAACI,EAAM,SAAN,EAAc,OAAO,EAAE,WAAW,GAAG,OAAO,OAAA,GAC3C,UAAA;AAAA,MAAA,gBAAAF,EAACG,GAAA,EAAO,MAAK,SAAQ,SAASP,GAAc,UAAU,CAAC,CAACZ,GAAO,UAAA,MAAA,CAE/D;AAAA,MACA,gBAAAgB;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM;AACb,YAAAf,EAAS,EAAE,GACXH,EAAS,IAAI,GACbP,EAAS,MAAS;AAAA,UACpB;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAAA,IACCM,KACC,gBAAAgB,EAACI,EAAW,MAAX,EAAgB,MAAK,UAAS,OAAO,EAAE,UAAU,GAAA,GAC/C,UAAApB,EAAA,CACH;AAAA,IAEDJ,KAAe,CAACI,KACf,gBAAAgB,EAAC,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAO,OAAA,GAAW,UAAApB,EAAA,CAAY;AAAA,EAAA,GAE/D;AAEJ;AAEO,MAAMyB,IAAmB7B;"}
|
|
@@ -1,55 +1,50 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
if (n === "boolean")
|
|
11
|
-
return /* @__PURE__ */ t(d.Item, { label: o, style: { width: "100%" }, children: /* @__PURE__ */ t(u, { checked: !!r, onChange: (e) => i(e) }) });
|
|
12
|
-
if (n === "number" || n === "integer")
|
|
13
|
-
return /* @__PURE__ */ t(d.Item, { label: o, style: { width: "100%" }, children: /* @__PURE__ */ t(
|
|
14
|
-
f,
|
|
2
|
+
import { Switch as l, InputNumber as a, Input as o } from "antd";
|
|
3
|
+
function u({ value: e, onChange: i, ...s }) {
|
|
4
|
+
const d = s?.dataType ?? "string";
|
|
5
|
+
if (d === "boolean")
|
|
6
|
+
return /* @__PURE__ */ t("div", { style: { width: "100%" }, children: /* @__PURE__ */ t(l, { checked: !!e, onChange: (r) => i(r) }) });
|
|
7
|
+
if (d === "number" || d === "integer")
|
|
8
|
+
return /* @__PURE__ */ t("div", { style: { width: "100%" }, children: /* @__PURE__ */ t(
|
|
9
|
+
a,
|
|
15
10
|
{
|
|
16
|
-
value:
|
|
17
|
-
onChange: (
|
|
11
|
+
value: e,
|
|
12
|
+
onChange: (r) => i(r ?? void 0),
|
|
18
13
|
style: { width: "100%" }
|
|
19
14
|
}
|
|
20
15
|
) });
|
|
21
|
-
if (
|
|
22
|
-
const
|
|
23
|
-
return /* @__PURE__ */ t(
|
|
24
|
-
|
|
16
|
+
if (d === "object" || d === "array") {
|
|
17
|
+
const r = e !== void 0 ? JSON.stringify(e, null, 2) : "";
|
|
18
|
+
return /* @__PURE__ */ t("div", { style: { width: "100%" }, children: /* @__PURE__ */ t(
|
|
19
|
+
o.TextArea,
|
|
25
20
|
{
|
|
26
21
|
rows: 3,
|
|
27
|
-
value:
|
|
22
|
+
value: r,
|
|
28
23
|
onChange: (c) => {
|
|
29
|
-
const
|
|
30
|
-
if (!
|
|
24
|
+
const n = c.target.value.trim();
|
|
25
|
+
if (!n) {
|
|
31
26
|
i(void 0);
|
|
32
27
|
return;
|
|
33
28
|
}
|
|
34
29
|
try {
|
|
35
|
-
i(JSON.parse(
|
|
30
|
+
i(JSON.parse(n));
|
|
36
31
|
} catch {
|
|
37
32
|
}
|
|
38
33
|
}
|
|
39
34
|
}
|
|
40
35
|
) });
|
|
41
36
|
}
|
|
42
|
-
return /* @__PURE__ */ t(
|
|
43
|
-
|
|
37
|
+
return /* @__PURE__ */ t("div", { style: { width: "100%" }, children: /* @__PURE__ */ t(
|
|
38
|
+
o,
|
|
44
39
|
{
|
|
45
|
-
value:
|
|
46
|
-
onChange: (
|
|
40
|
+
value: e ?? "",
|
|
41
|
+
onChange: (r) => i(r.target.value || void 0)
|
|
47
42
|
}
|
|
48
43
|
) });
|
|
49
44
|
}
|
|
50
|
-
const
|
|
45
|
+
const y = u;
|
|
51
46
|
export {
|
|
52
|
-
|
|
53
|
-
|
|
47
|
+
u as DefaultEditor,
|
|
48
|
+
y as defaultEditorWidget
|
|
54
49
|
};
|
|
55
50
|
//# sourceMappingURL=DefaultEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultEditor.js","sources":["../../../src/widgets/DefaultEditor.tsx"],"sourcesContent":["// ============================================================================\n// DefaultEditor — 按字段类型编辑默认值\n// string → Input, number/integer → InputNumber, boolean → Switch, object/array → JSON TextArea\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport {
|
|
1
|
+
{"version":3,"file":"DefaultEditor.js","sources":["../../../src/widgets/DefaultEditor.tsx"],"sourcesContent":["// ============================================================================\n// DefaultEditor — 按字段类型编辑默认值\n// string → Input, number/integer → InputNumber, boolean → Switch, object/array → JSON TextArea\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Input, InputNumber, Switch } from 'antd';\n\nexport function DefaultEditor({ value, onChange, ...rest }: WidgetProps) {\n const fieldProps = rest as Record<string, unknown>;\n const dataType = (fieldProps?.dataType as string) ?? 'string';\n\n if (dataType === 'boolean') {\n return (\n <div style={{ width: '100%' }}>\n <Switch checked={!!value} onChange={(v) => onChange(v)} />\n </div>\n );\n }\n\n if (dataType === 'number' || dataType === 'integer') {\n return (\n <div style={{ width: '100%' }}>\n <InputNumber\n value={value as number}\n onChange={(v) => onChange(v ?? undefined)}\n style={{ width: '100%' }}\n />\n </div>\n );\n }\n\n if (dataType === 'object' || dataType === 'array') {\n const text = value !== undefined ? JSON.stringify(value, null, 2) : '';\n return (\n <div style={{ width: '100%' }}>\n <Input.TextArea\n rows={3}\n value={text}\n onChange={(e) => {\n const t = e.target.value.trim();\n if (!t) {\n onChange(undefined);\n return;\n }\n try {\n onChange(JSON.parse(t));\n } catch {\n // JSON 解析失败时不更新\n }\n }}\n />\n </div>\n );\n }\n\n // string\n return (\n <div style={{ width: '100%' }}>\n <Input\n value={(value as string) ?? ''}\n onChange={(e) => onChange(e.target.value || undefined)}\n />\n </div>\n );\n}\n\nexport const defaultEditorWidget = DefaultEditor;\n"],"names":["DefaultEditor","value","onChange","rest","dataType","jsx","Switch","v","InputNumber","text","Input","e","t","defaultEditorWidget"],"mappings":";;AAQO,SAASA,EAAc,EAAE,OAAAC,GAAO,UAAAC,GAAU,GAAGC,KAAqB;AAEvE,QAAMC,IADaD,GACW,YAAuB;AAErD,MAAIC,MAAa;AACf,6BACG,OAAA,EAAI,OAAO,EAAE,OAAO,OAAA,GACnB,UAAA,gBAAAC,EAACC,GAAA,EAAO,SAAS,CAAC,CAACL,GAAO,UAAU,CAACM,MAAML,EAASK,CAAC,GAAG,GAC1D;AAIJ,MAAIH,MAAa,YAAYA,MAAa;AACxC,6BACG,OAAA,EAAI,OAAO,EAAE,OAAO,UACnB,UAAA,gBAAAC;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,OAAAP;AAAA,QACA,UAAU,CAACM,MAAML,EAASK,KAAK,MAAS;AAAA,QACxC,OAAO,EAAE,OAAO,OAAA;AAAA,MAAO;AAAA,IAAA,GAE3B;AAIJ,MAAIH,MAAa,YAAYA,MAAa,SAAS;AACjD,UAAMK,IAAOR,MAAU,SAAY,KAAK,UAAUA,GAAO,MAAM,CAAC,IAAI;AACpE,6BACG,OAAA,EAAI,OAAO,EAAE,OAAO,UACnB,UAAA,gBAAAI;AAAA,MAACK,EAAM;AAAA,MAAN;AAAA,QACC,MAAM;AAAA,QACN,OAAOD;AAAA,QACP,UAAU,CAACE,MAAM;AACf,gBAAMC,IAAID,EAAE,OAAO,MAAM,KAAA;AACzB,cAAI,CAACC,GAAG;AACN,YAAAV,EAAS,MAAS;AAClB;AAAA,UACF;AACA,cAAI;AACF,YAAAA,EAAS,KAAK,MAAMU,CAAC,CAAC;AAAA,UACxB,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ;AAGA,2BACG,OAAA,EAAI,OAAO,EAAE,OAAO,UACnB,UAAA,gBAAAP;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,OAAQT,KAAoB;AAAA,MAC5B,UAAU,CAACU,MAAMT,EAASS,EAAE,OAAO,SAAS,MAAS;AAAA,IAAA;AAAA,EAAA,GAEzD;AAEJ;AAEO,MAAME,IAAsBb;"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import {
|
|
3
|
-
import { useState as
|
|
4
|
-
import { useFormDataFieldOptions as
|
|
5
|
-
function
|
|
6
|
-
const
|
|
7
|
-
() => Array.isArray(
|
|
8
|
-
),
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}, [
|
|
12
|
-
const
|
|
13
|
-
e(
|
|
1
|
+
import { jsxs as a, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { Select as l } from "antd";
|
|
3
|
+
import { useState as y, useRef as n, useEffect as g } from "react";
|
|
4
|
+
import { useFormDataFieldOptions as h } from "./useFormDataFields.js";
|
|
5
|
+
function A({ value: r, onChange: c }) {
|
|
6
|
+
const d = h(), [m, e] = y(
|
|
7
|
+
() => Array.isArray(r) ? [...r] : []
|
|
8
|
+
), i = n(r), o = n(r);
|
|
9
|
+
g(() => {
|
|
10
|
+
i.current !== r && (i.current = r, r !== o.current && e(Array.isArray(r) ? [...r] : []));
|
|
11
|
+
}, [r]);
|
|
12
|
+
const p = (t) => {
|
|
13
|
+
e(t), o.current = t, c(t.length > 0 ? t : void 0);
|
|
14
14
|
};
|
|
15
|
-
return /* @__PURE__ */
|
|
15
|
+
return /* @__PURE__ */ a("div", { style: { width: "100%" }, children: [
|
|
16
16
|
/* @__PURE__ */ s(
|
|
17
|
-
|
|
17
|
+
l,
|
|
18
18
|
{
|
|
19
19
|
size: "small",
|
|
20
20
|
mode: "tags",
|
|
21
|
-
value:
|
|
22
|
-
onChange: (
|
|
23
|
-
options:
|
|
21
|
+
value: m,
|
|
22
|
+
onChange: (t) => p(t.map((f) => f.trim()).filter(Boolean)),
|
|
23
|
+
options: d,
|
|
24
24
|
placeholder: "选择或输入依赖字段路径",
|
|
25
25
|
style: { width: "100%" }
|
|
26
26
|
}
|
|
@@ -28,9 +28,9 @@ function E({ value: t, onChange: c, title: d }) {
|
|
|
28
28
|
/* @__PURE__ */ s("div", { style: { fontSize: 11, color: "#999", marginTop: 4 }, children: "提示:依赖字段值变化时,触发该字段重新求值与渲染。支持相对路径(如 处于 address.city 时填 province 表示 address.province)。" })
|
|
29
29
|
] });
|
|
30
30
|
}
|
|
31
|
-
const
|
|
31
|
+
const j = A;
|
|
32
32
|
export {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
A as DependenciesEditor,
|
|
34
|
+
j as dependenciesEditorWidget
|
|
35
35
|
};
|
|
36
36
|
//# sourceMappingURL=DependenciesEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DependenciesEditor.js","sources":["../../../src/widgets/DependenciesEditor.tsx"],"sourcesContent":["// ============================================================================\n// DependenciesEditor — 编辑 dependencies 依赖字段路径(string[])\n// 通过标签选择器从表单字段中选择依赖路径,也支持手动输入自定义路径\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport {
|
|
1
|
+
{"version":3,"file":"DependenciesEditor.js","sources":["../../../src/widgets/DependenciesEditor.tsx"],"sourcesContent":["// ============================================================================\n// DependenciesEditor — 编辑 dependencies 依赖字段路径(string[])\n// 通过标签选择器从表单字段中选择依赖路径,也支持手动输入自定义路径\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Select } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { useFormDataFieldOptions } from './useFormDataFields';\n\nexport function DependenciesEditor({ value, onChange }: WidgetProps) {\n const fieldOptions = useFormDataFieldOptions();\n const [tags, setTags] = useState<string[]>(() =>\n Array.isArray(value) ? [...value] : [],\n );\n const prevValueRef = useRef(value);\n const lastEmittedRef = useRef(value);\n\n // 外部 value 变化(切换节点等)时重置,自身 onChange 回传不重置\n useEffect(() => {\n if (prevValueRef.current !== value) {\n prevValueRef.current = value;\n if (value !== lastEmittedRef.current) {\n setTags(Array.isArray(value) ? [...value] : []);\n }\n }\n }, [value]);\n\n const commit = (next: string[]) => {\n setTags(next);\n lastEmittedRef.current = next;\n onChange(next.length > 0 ? next : undefined);\n };\n\n return (\n <div style={{ width: '100%' }}>\n <Select\n size='small'\n mode='tags'\n value={tags}\n onChange={(v) =>\n commit((v as string[]).map((s) => s.trim()).filter(Boolean))\n }\n options={fieldOptions}\n placeholder='选择或输入依赖字段路径'\n style={{ width: '100%' }}\n />\n <div style={{ fontSize: 11, color: '#999', marginTop: 4 }}>\n 提示:依赖字段值变化时,触发该字段重新求值与渲染。支持相对路径(如 处于\n address.city 时填 province 表示 address.province)。\n </div>\n </div>\n );\n}\n\nexport const dependenciesEditorWidget = DependenciesEditor;\n"],"names":["DependenciesEditor","value","onChange","fieldOptions","useFormDataFieldOptions","tags","setTags","useState","prevValueRef","useRef","lastEmittedRef","useEffect","commit","next","jsx","Select","v","s","dependenciesEditorWidget"],"mappings":";;;;AAUO,SAASA,EAAmB,EAAE,OAAAC,GAAO,UAAAC,KAAyB;AACnE,QAAMC,IAAeC,EAAA,GACf,CAACC,GAAMC,CAAO,IAAIC;AAAA,IAAmB,MACzC,MAAM,QAAQN,CAAK,IAAI,CAAC,GAAGA,CAAK,IAAI,CAAA;AAAA,EAAC,GAEjCO,IAAeC,EAAOR,CAAK,GAC3BS,IAAiBD,EAAOR,CAAK;AAGnC,EAAAU,EAAU,MAAM;AACd,IAAIH,EAAa,YAAYP,MAC3BO,EAAa,UAAUP,GACnBA,MAAUS,EAAe,WAC3BJ,EAAQ,MAAM,QAAQL,CAAK,IAAI,CAAC,GAAGA,CAAK,IAAI,EAAE;AAAA,EAGpD,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMW,IAAS,CAACC,MAAmB;AACjC,IAAAP,EAAQO,CAAI,GACZH,EAAe,UAAUG,GACzBX,EAASW,EAAK,SAAS,IAAIA,IAAO,MAAS;AAAA,EAC7C;AAEA,2BACG,OAAA,EAAI,OAAO,EAAE,OAAO,UACnB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAOV;AAAA,QACP,UAAU,CAACW,MACTJ,EAAQI,EAAe,IAAI,CAACC,MAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO,CAAC;AAAA,QAE7D,SAASd;AAAA,QACT,aAAY;AAAA,QACZ,OAAO,EAAE,OAAO,OAAA;AAAA,MAAO;AAAA,IAAA;AAAA,IAEzB,gBAAAW,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,WAAW,KAAK,UAAA,sFAAA,CAG3D;AAAA,EAAA,GACF;AAEJ;AAEO,MAAMI,IAA2BlB;"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import {
|
|
3
|
-
function
|
|
4
|
-
return /* @__PURE__ */
|
|
5
|
-
/* @__PURE__ */
|
|
6
|
-
|
|
1
|
+
import { jsxs as i, Fragment as a, jsx as o } from "react/jsx-runtime";
|
|
2
|
+
import { Input as n } from "antd";
|
|
3
|
+
function m({ value: t, onChange: e }) {
|
|
4
|
+
return /* @__PURE__ */ i(a, { children: [
|
|
5
|
+
/* @__PURE__ */ o(
|
|
6
|
+
n.TextArea,
|
|
7
7
|
{
|
|
8
8
|
rows: 3,
|
|
9
|
-
value: typeof
|
|
10
|
-
onChange: (
|
|
11
|
-
placeholder: "每行一个枚举值"
|
|
9
|
+
value: typeof t == "string" ? t : "",
|
|
10
|
+
onChange: (r) => e(r.target.value),
|
|
11
|
+
placeholder: "每行一个枚举值",
|
|
12
|
+
style: { marginBottom: 4 }
|
|
12
13
|
}
|
|
13
|
-
)
|
|
14
|
-
/* @__PURE__ */
|
|
14
|
+
),
|
|
15
|
+
/* @__PURE__ */ o(
|
|
15
16
|
"div",
|
|
16
17
|
{
|
|
17
18
|
style: { fontSize: 11, color: "#999", marginTop: -12, marginBottom: 8 },
|
|
@@ -20,30 +21,23 @@ function l({ value: e, onChange: r }) {
|
|
|
20
21
|
)
|
|
21
22
|
] });
|
|
22
23
|
}
|
|
23
|
-
const
|
|
24
|
-
function
|
|
25
|
-
return /* @__PURE__ */
|
|
26
|
-
|
|
24
|
+
const l = m;
|
|
25
|
+
function s({ value: t, onChange: e }) {
|
|
26
|
+
return /* @__PURE__ */ o(
|
|
27
|
+
n.TextArea,
|
|
27
28
|
{
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{
|
|
33
|
-
rows: 3,
|
|
34
|
-
value: typeof e == "string" ? e : "",
|
|
35
|
-
onChange: (n) => r(n.target.value),
|
|
36
|
-
placeholder: "每行一个枚举文案,与枚举值一一对应"
|
|
37
|
-
}
|
|
38
|
-
)
|
|
29
|
+
rows: 3,
|
|
30
|
+
value: typeof t == "string" ? t : "",
|
|
31
|
+
onChange: (r) => e(r.target.value),
|
|
32
|
+
placeholder: "每行一个枚举文案,与枚举值一一对应"
|
|
39
33
|
}
|
|
40
34
|
);
|
|
41
35
|
}
|
|
42
|
-
const
|
|
36
|
+
const u = s;
|
|
43
37
|
export {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
m as EnumEditor,
|
|
39
|
+
s as EnumNamesEditor,
|
|
40
|
+
l as enumEditorWidget,
|
|
41
|
+
u as enumNamesEditorWidget
|
|
48
42
|
};
|
|
49
43
|
//# sourceMappingURL=EnumEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnumEditor.js","sources":["../../../src/widgets/EnumEditor.tsx"],"sourcesContent":["// ============================================================================\n// EnumEditor — 编辑 enum 枚举值及 enumNames 枚举文案\n// 使用两个 TextArea,值按行分隔\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport {
|
|
1
|
+
{"version":3,"file":"EnumEditor.js","sources":["../../../src/widgets/EnumEditor.tsx"],"sourcesContent":["// ============================================================================\n// EnumEditor — 编辑 enum 枚举值及 enumNames 枚举文案\n// 使用两个 TextArea,值按行分隔\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Input } from 'antd';\n\nexport function EnumEditor({ value, onChange }: WidgetProps) {\n // value 是一个包含 _enum 和 _enumNames 的对象(由 engine 传入)\n // 实际上 engine 传入的 value 是字段存储的原始值\n // 这里我们使用单独的 _enum 和 _enumNames key\n // 实际上这个 widget 对应 schema 中的 _enum 字段\n // 但 engine 只传单个 value\n\n // 这里简化处理:value 是 _enum 的序列化字符串\n // _enumNames 通过 props 或 dependValues 传递\n // 但更简洁的方式是让 schema 中有两个独立字段\n\n // 这个 widget 实际上应该对应两个字段。让我们重新考虑...\n // 在 schema 中,我们只定义了一个 _enum 字段,这个 widget 渲染时\n // value 是 _enum 的值(序列化字符串)\n\n return (\n <>\n <Input.TextArea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder='每行一个枚举值'\n style={{ marginBottom: 4 }}\n />\n <div\n style={{ fontSize: 11, color: '#999', marginTop: -12, marginBottom: 8 }}\n >\n 提示:枚举值用于选项的值,枚举文案见下方字段\n </div>\n </>\n );\n}\n\nexport const enumEditorWidget = EnumEditor;\n\n// ────────────────────────────────────────────────────────────────────────────\n// EnumNamesEditor — 编辑 enumNames(与 _enum 配对使用)\n// ────────────────────────────────────────────────────────────────────────────\n\nexport function EnumNamesEditor({ value, onChange }: WidgetProps) {\n return (\n <Input.TextArea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder='每行一个枚举文案,与枚举值一一对应'\n />\n );\n}\n\nexport const enumNamesEditorWidget = EnumNamesEditor;\n"],"names":["EnumEditor","value","onChange","jsxs","Fragment","jsx","Input","e","enumEditorWidget","EnumNamesEditor","enumNamesEditorWidget"],"mappings":";;AAQO,SAASA,EAAW,EAAE,OAAAC,GAAO,UAAAC,KAAyB;AAe3D,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC,EAAM;AAAA,MAAN;AAAA,QACC,MAAM;AAAA,QACN,OAAO,OAAOL,KAAU,WAAWA,IAAQ;AAAA,QAC3C,UAAU,CAACM,MAAML,EAASK,EAAE,OAAO,KAAK;AAAA,QACxC,aAAY;AAAA,QACZ,OAAO,EAAE,cAAc,EAAA;AAAA,MAAE;AAAA,IAAA;AAAA,IAE3B,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,WAAW,KAAK,cAAc,EAAA;AAAA,QACrE,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF;AAEJ;AAEO,MAAMG,IAAmBR;AAMzB,SAASS,EAAgB,EAAE,OAAAR,GAAO,UAAAC,KAAyB;AAChE,SACE,gBAAAG;AAAA,IAACC,EAAM;AAAA,IAAN;AAAA,MACC,MAAM;AAAA,MACN,OAAO,OAAOL,KAAU,WAAWA,IAAQ;AAAA,MAC3C,UAAU,CAACM,MAAML,EAASK,EAAE,OAAO,KAAK;AAAA,MACxC,aAAY;AAAA,IAAA;AAAA,EAAA;AAGlB;AAEO,MAAMG,IAAwBD;"}
|
|
@@ -1,47 +1,49 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import {
|
|
3
|
-
import { ExpressionBuilder as
|
|
4
|
-
import { useFormDataFields as
|
|
5
|
-
function
|
|
6
|
-
value:
|
|
7
|
-
onChange:
|
|
8
|
-
|
|
9
|
-
displayType: n
|
|
1
|
+
import { jsx as r, jsxs as d } from "react/jsx-runtime";
|
|
2
|
+
import { Switch as c } from "antd";
|
|
3
|
+
import { ExpressionBuilder as f } from "./ExpressionBuilder.js";
|
|
4
|
+
import { useFormDataFields as h } from "./useFormDataFields.js";
|
|
5
|
+
function l({
|
|
6
|
+
value: o,
|
|
7
|
+
onChange: i,
|
|
8
|
+
displayType: s
|
|
10
9
|
}) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return /* @__PURE__ */ i(
|
|
15
|
-
f.Item,
|
|
10
|
+
const t = typeof o == "string" && o.length > 0, n = h();
|
|
11
|
+
return /* @__PURE__ */ r(
|
|
12
|
+
"div",
|
|
16
13
|
{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
style: {
|
|
15
|
+
display: "flex",
|
|
16
|
+
flexDirection: s === "row" ? "row" : "column",
|
|
17
|
+
gap: s === "row" ? 8 : 0,
|
|
18
|
+
marginBottom: 0
|
|
19
|
+
},
|
|
20
|
+
children: /* @__PURE__ */ d("div", { className: `flex gap-2 ${t ? "flex-col" : "flex-row"}`, children: [
|
|
21
|
+
t ? /* @__PURE__ */ r(
|
|
22
|
+
f,
|
|
23
23
|
{
|
|
24
|
-
value:
|
|
25
|
-
onChange: (
|
|
26
|
-
fields:
|
|
24
|
+
value: o,
|
|
25
|
+
onChange: (e) => i(e),
|
|
26
|
+
fields: n
|
|
27
27
|
}
|
|
28
|
-
) : /* @__PURE__ */
|
|
29
|
-
/* @__PURE__ */
|
|
30
|
-
|
|
28
|
+
) : /* @__PURE__ */ r(c, { checked: !!o, onChange: (e) => i(e) }),
|
|
29
|
+
/* @__PURE__ */ r(
|
|
30
|
+
c,
|
|
31
31
|
{
|
|
32
|
-
checked:
|
|
32
|
+
checked: t,
|
|
33
33
|
checkedChildren: "表达式",
|
|
34
34
|
unCheckedChildren: "静态",
|
|
35
|
-
onChange:
|
|
35
|
+
onChange: (e) => {
|
|
36
|
+
i(e ? typeof o == "string" ? o : "{{ }}" : typeof o == "boolean" ? o : !1);
|
|
37
|
+
}
|
|
36
38
|
}
|
|
37
39
|
)
|
|
38
40
|
] })
|
|
39
41
|
}
|
|
40
42
|
);
|
|
41
43
|
}
|
|
42
|
-
const k =
|
|
44
|
+
const k = l;
|
|
43
45
|
export {
|
|
44
|
-
|
|
46
|
+
l as ExpressionSwitch,
|
|
45
47
|
k as expressionSwitchWidget
|
|
46
48
|
};
|
|
47
49
|
//# sourceMappingURL=ExpressionSwitch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpressionSwitch.js","sources":["../../../src/widgets/ExpressionSwitch.tsx"],"sourcesContent":["// ============================================================================\n// ExpressionSwitch — 编辑 ExpressionOr<boolean> 属性\n// 支持静态布尔值(Switch)与表达式(可视化构建器 / 高级手写)之间的切换\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport {
|
|
1
|
+
{"version":3,"file":"ExpressionSwitch.js","sources":["../../../src/widgets/ExpressionSwitch.tsx"],"sourcesContent":["// ============================================================================\n// ExpressionSwitch — 编辑 ExpressionOr<boolean> 属性\n// 支持静态布尔值(Switch)与表达式(可视化构建器 / 高级手写)之间的切换\n// ============================================================================\n\nimport type { WidgetProps } from '@xbeeant/form-engine-ui';\nimport { Switch } from 'antd';\nimport { ExpressionBuilder } from './ExpressionBuilder';\nimport { useFormDataFields } from './useFormDataFields';\n\nexport function ExpressionSwitch({\n value,\n onChange,\n displayType,\n}: WidgetProps) {\n // ExpressionOr<boolean>: 非空字符串=表达式模式,其他=静态模式\n // 直接由 value 派生(受控),外部 value 变化(如切换选中节点)自动同步;\n // 不再维护内部 isExpr state,避免与外部值脱节\n const isExpr = typeof value === 'string' && value.length > 0;\n\n const fields = useFormDataFields();\n\n // 模式切换必须写回一个对应形态的值,否则状态只是视觉变化、无法持久化\n const switchMode = (exprMode: boolean) => {\n if (exprMode) {\n // 切到表达式:保留已有表达式,静态布尔值则以空模板起步\n onChange(typeof value === 'string' ? value : '{{ }}');\n } else {\n // 切到静态:reset 为布尔值\n onChange(typeof value === 'boolean' ? value : false);\n }\n };\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: displayType === 'row' ? 'row' : 'column',\n gap: displayType === 'row' ? 8 : 0,\n marginBottom: 0,\n }}\n >\n <div className={`flex gap-2 ${isExpr ? 'flex-col' : 'flex-row'}`}>\n {isExpr ? (\n <ExpressionBuilder\n value={value as string}\n onChange={(s) => onChange(s)}\n fields={fields}\n />\n ) : (\n <Switch checked={!!value} onChange={(v) => onChange(v)} />\n )}\n <Switch\n checked={isExpr}\n checkedChildren='表达式'\n unCheckedChildren='静态'\n onChange={switchMode}\n />\n </div>\n </div>\n );\n}\n\nexport const expressionSwitchWidget = ExpressionSwitch;\n"],"names":["ExpressionSwitch","value","onChange","displayType","isExpr","fields","useFormDataFields","jsx","ExpressionBuilder","s","Switch","v","exprMode","expressionSwitchWidget"],"mappings":";;;;AAUO,SAASA,EAAiB;AAAA,EAC/B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AACF,GAAgB;AAId,QAAMC,IAAS,OAAOH,KAAU,YAAYA,EAAM,SAAS,GAErDI,IAASC,EAAA;AAaf,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAeJ,MAAgB,QAAQ,QAAQ;AAAA,QAC/C,KAAKA,MAAgB,QAAQ,IAAI;AAAA,QACjC,cAAc;AAAA,MAAA;AAAA,MAGhB,4BAAC,OAAA,EAAI,WAAW,cAAcC,IAAS,aAAa,UAAU,IAC3D,UAAA;AAAA,QAAAA,IACC,gBAAAG;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,OAAAP;AAAA,YACA,UAAU,CAACQ,MAAMP,EAASO,CAAC;AAAA,YAC3B,QAAAJ;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAAE,EAACG,GAAA,EAAO,SAAS,CAAC,CAACT,GAAO,UAAU,CAACU,MAAMT,EAASS,CAAC,EAAA,CAAG;AAAA,QAE1D,gBAAAJ;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,SAASN;AAAA,YACT,iBAAgB;AAAA,YAChB,mBAAkB;AAAA,YAClB,UAjCW,CAACQ,MAAsB;AACxC,cAEEV,EAFEU,IAEO,OAAOX,KAAU,WAAWA,IAAQ,WAGpC,OAAOA,KAAU,YAAYA,IAAQ,EAHO;AAAA,YAKzD;AAAA,UAyBkB;AAAA,QAAA;AAAA,MACZ,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAMY,IAAyBb;"}
|