@xbeeant/form-engine-designer 0.0.2 → 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.
Files changed (137) hide show
  1. package/dist/es/Canvas.js +42 -46
  2. package/dist/es/Canvas.js.map +1 -1
  3. package/dist/es/Designer.js +121 -98
  4. package/dist/es/Designer.js.map +1 -1
  5. package/dist/es/DesignerContext.js +86 -73
  6. package/dist/es/DesignerContext.js.map +1 -1
  7. package/dist/es/Palette.js +3 -3
  8. package/dist/es/Palette.js.map +1 -1
  9. package/dist/es/PropertyPanel.js +97 -97
  10. package/dist/es/PropertyPanel.js.map +1 -1
  11. package/dist/es/catalog.js +19 -11
  12. package/dist/es/catalog.js.map +1 -1
  13. package/dist/es/designer-context.js +110 -0
  14. package/dist/es/designer-context.js.map +1 -0
  15. package/dist/es/history.js +73 -0
  16. package/dist/es/history.js.map +1 -0
  17. package/dist/es/index.js +3 -3
  18. package/dist/es/property/basic-property.js +6 -0
  19. package/dist/es/property/basic-property.js.map +1 -1
  20. package/dist/es/property-panel.js +294 -0
  21. package/dist/es/property-panel.js.map +1 -0
  22. package/dist/es/resizable-panel.js +103 -0
  23. package/dist/es/resizable-panel.js.map +1 -0
  24. package/dist/es/schema-utils.js +286 -0
  25. package/dist/es/schema-utils.js.map +1 -0
  26. package/dist/es/widgets/BindEditor.js +60 -49
  27. package/dist/es/widgets/BindEditor.js.map +1 -1
  28. package/dist/es/widgets/CodeEditor.js +41 -49
  29. package/dist/es/widgets/CodeEditor.js.map +1 -1
  30. package/dist/es/widgets/DefaultEditor.js +25 -30
  31. package/dist/es/widgets/DefaultEditor.js.map +1 -1
  32. package/dist/es/widgets/DependenciesEditor.js +21 -21
  33. package/dist/es/widgets/DependenciesEditor.js.map +1 -1
  34. package/dist/es/widgets/EnumEditor.js +25 -31
  35. package/dist/es/widgets/EnumEditor.js.map +1 -1
  36. package/dist/es/widgets/ExpressionSwitch.js +32 -30
  37. package/dist/es/widgets/ExpressionSwitch.js.map +1 -1
  38. package/dist/es/widgets/ReactionsEditor.js +103 -103
  39. package/dist/es/widgets/ReactionsEditor.js.map +1 -1
  40. package/dist/es/widgets/RemoteDataEditor.js +63 -63
  41. package/dist/es/widgets/RemoteDataEditor.js.map +1 -1
  42. package/dist/es/widgets/ValidateEditor.js +49 -49
  43. package/dist/es/widgets/ValidateEditor.js.map +1 -1
  44. package/dist/es/widgets/bind-editor.js +78 -0
  45. package/dist/es/widgets/bind-editor.js.map +1 -0
  46. package/dist/es/widgets/code-editor.js +76 -0
  47. package/dist/es/widgets/code-editor.js.map +1 -0
  48. package/dist/es/widgets/default-editor.js +50 -0
  49. package/dist/es/widgets/default-editor.js.map +1 -0
  50. package/dist/es/widgets/dependencies-editor.js +36 -0
  51. package/dist/es/widgets/dependencies-editor.js.map +1 -0
  52. package/dist/es/widgets/enum-editor.js +43 -0
  53. package/dist/es/widgets/enum-editor.js.map +1 -0
  54. package/dist/es/widgets/expression-builder.js +367 -0
  55. package/dist/es/widgets/expression-builder.js.map +1 -0
  56. package/dist/es/widgets/expression-model.js +340 -0
  57. package/dist/es/widgets/expression-model.js.map +1 -0
  58. package/dist/es/widgets/expression-switch.js +49 -0
  59. package/dist/es/widgets/expression-switch.js.map +1 -0
  60. package/dist/es/widgets/index.js +13 -13
  61. package/dist/es/widgets/index.js.map +1 -1
  62. package/dist/es/widgets/options-editor.js +102 -0
  63. package/dist/es/widgets/options-editor.js.map +1 -0
  64. package/dist/es/widgets/reactions-editor.js +401 -0
  65. package/dist/es/widgets/reactions-editor.js.map +1 -0
  66. package/dist/es/widgets/reactions-model.js +107 -0
  67. package/dist/es/widgets/reactions-model.js.map +1 -0
  68. package/dist/es/widgets/remote-data-editor.js +314 -0
  69. package/dist/es/widgets/remote-data-editor.js.map +1 -0
  70. package/dist/es/widgets/use-form-data-fields.js +16 -0
  71. package/dist/es/widgets/use-form-data-fields.js.map +1 -0
  72. package/dist/es/widgets/validate-editor.js +118 -0
  73. package/dist/es/widgets/validate-editor.js.map +1 -0
  74. package/package.json +4 -5
  75. package/dist/es/react/src/components/FormController.js +0 -154
  76. package/dist/es/react/src/components/FormController.js.map +0 -1
  77. package/dist/es/react/src/components/NexusField.js +0 -99
  78. package/dist/es/react/src/components/NexusField.js.map +0 -1
  79. package/dist/es/react/src/components/NexusForm.js +0 -121
  80. package/dist/es/react/src/components/NexusForm.js.map +0 -1
  81. package/dist/es/react/src/components/NexusFormProvider.js +0 -19
  82. package/dist/es/react/src/components/NexusFormProvider.js.map +0 -1
  83. package/dist/es/react/src/components/NexusLayout.js +0 -49
  84. package/dist/es/react/src/components/NexusLayout.js.map +0 -1
  85. package/dist/es/react/src/components/NexusObject.js +0 -65
  86. package/dist/es/react/src/components/NexusObject.js.map +0 -1
  87. package/dist/es/react/src/contexts/FieldInheritContext.js +0 -6
  88. package/dist/es/react/src/contexts/FieldInheritContext.js.map +0 -1
  89. package/dist/es/react/src/contexts/GridContext.js +0 -6
  90. package/dist/es/react/src/contexts/GridContext.js.map +0 -1
  91. package/dist/es/react/src/contexts/LayoutConfigContext.js +0 -6
  92. package/dist/es/react/src/contexts/LayoutConfigContext.js.map +0 -1
  93. package/dist/es/react/src/contexts/NexusContext.js +0 -13
  94. package/dist/es/react/src/contexts/NexusContext.js.map +0 -1
  95. package/dist/es/react/src/hooks/useForm.js +0 -10
  96. package/dist/es/react/src/hooks/useForm.js.map +0 -1
  97. package/dist/es/react/src/utils/renderTreeNode.js +0 -18
  98. package/dist/es/react/src/utils/renderTreeNode.js.map +0 -1
  99. package/dist/es/react/src/utils/resolveColSpan.js +0 -10
  100. package/dist/es/react/src/utils/resolveColSpan.js.map +0 -1
  101. package/dist/es/schemaUtils.test.js +0 -188
  102. package/dist/es/schemaUtils.test.js.map +0 -1
  103. package/dist/es/vite-env.d.js +0 -2
  104. package/dist/es/vite-env.d.js.map +0 -1
  105. package/dist/es/widgets/expressionModel.test.js +0 -193
  106. package/dist/es/widgets/expressionModel.test.js.map +0 -1
  107. package/src/Canvas.tsx +0 -1111
  108. package/src/Designer.css +0 -206
  109. package/src/Designer.tsx +0 -254
  110. package/src/DesignerContext.tsx +0 -192
  111. package/src/Palette.tsx +0 -261
  112. package/src/PropertyPanel.tsx +0 -486
  113. package/src/ResizablePanel.tsx +0 -210
  114. package/src/catalog.ts +0 -526
  115. package/src/index.ts +0 -25
  116. package/src/property/basic-property.ts +0 -126
  117. package/src/schemaUtils.test.ts +0 -261
  118. package/src/schemaUtils.ts +0 -627
  119. package/src/types.ts +0 -38
  120. package/src/vite-env.d.ts +0 -1
  121. package/src/widgets/BindEditor.tsx +0 -105
  122. package/src/widgets/CodeEditor.tsx +0 -114
  123. package/src/widgets/DefaultEditor.tsx +0 -73
  124. package/src/widgets/DependenciesEditor.tsx +0 -56
  125. package/src/widgets/EnumEditor.tsx +0 -66
  126. package/src/widgets/ExpressionBuilder.tsx +0 -509
  127. package/src/widgets/ExpressionSwitch.tsx +0 -62
  128. package/src/widgets/OptionsEditor.tsx +0 -141
  129. package/src/widgets/ReactionsEditor.tsx +0 -532
  130. package/src/widgets/RemoteDataEditor.tsx +0 -382
  131. package/src/widgets/ValidateEditor.tsx +0 -162
  132. package/src/widgets/expressionModel.test.ts +0 -262
  133. package/src/widgets/expressionModel.ts +0 -573
  134. package/src/widgets/index.ts +0 -45
  135. package/src/widgets/reactionsModel.ts +0 -190
  136. package/src/widgets/useFormDataFields.ts +0 -21
  137. /package/dist/es/{form-engine-designer.css → index.css} +0 -0
@@ -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, Form, 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 <Form.Item\n label={title}\n layout={'vertical'}\n style={{ width: '100%' }}\n help={\n error ? (\n <Typography.Text type='danger' style={{ fontSize: 11 }}>\n {error}\n </Typography.Text>\n ) : description ? (\n <span style={{ fontSize: 11, color: '#999' }}>{description}</span>\n ) : undefined\n }\n validateStatus={error ? 'error' : undefined}\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 </Form.Item>\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","Form","jsx","Typography","Input","Space","Button","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;AAAA,IAACC,EAAK;AAAA,IAAL;AAAA,MACC,OAAOpB;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,OAAO,OAAA;AAAA,MAChB,MACEK,IACE,gBAAAgB,EAACC,EAAW,MAAX,EAAgB,MAAK,UAAS,OAAO,EAAE,UAAU,GAAA,GAC/C,aACH,IACErB,IACF,gBAAAoB,EAAC,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAO,OAAA,GAAW,UAAApB,EAAA,CAAY,IACzD;AAAA,MAEN,gBAAgBI,IAAQ,UAAU;AAAA,MAElC,UAAA;AAAA,QAAA,gBAAAgB;AAAA,UAACE,EAAM;AAAA,UAAN;AAAA,YACC,OAAOb;AAAA,YACP,MAAMN;AAAA,YACN,UAAU,CAACY,MAAMJ,EAAaI,EAAE,OAAO,KAAK;AAAA,YAC5C,aACEd,IACI;AAAA,EAAQ,OAAOA,KAAgB,WAAWA,IAAc,KAAK,UAAUA,GAAa,MAAM,CAAC,CAAC,KAC5F;AAAA,YAEN,OAAO,EAAE,YAAY,aAAa,UAAU,GAAA;AAAA,UAAG;AAAA,QAAA;AAAA,QAEjD,gBAAAiB,EAACK,EAAM,SAAN,EAAc,OAAO,EAAE,WAAW,GAAG,OAAO,OAAA,GAC3C,UAAA;AAAA,UAAA,gBAAAH,EAACI,GAAA,EAAO,MAAK,SAAQ,SAASR,GAAc,UAAU,CAAC,CAACZ,GAAO,UAAA,MAAA,CAE/D;AAAA,UACA,gBAAAgB;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;AACb,gBAAAhB,EAAS,EAAE,GACXH,EAAS,IAAI,GACbP,EAAS,MAAS;AAAA,cACpB;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAM2B,IAAmB7B;"}
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 { Form as d, Switch as u, InputNumber as f, Input as a } from "antd";
3
- function h({
4
- value: r,
5
- onChange: i,
6
- title: o,
7
- ...s
8
- }) {
9
- const n = s?.dataType ?? "string";
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: r,
17
- onChange: (e) => i(e ?? void 0),
11
+ value: e,
12
+ onChange: (r) => i(r ?? void 0),
18
13
  style: { width: "100%" }
19
14
  }
20
15
  ) });
21
- if (n === "object" || n === "array") {
22
- const e = r !== void 0 ? JSON.stringify(r, null, 2) : "";
23
- return /* @__PURE__ */ t(d.Item, { label: `${o}(JSON)`, style: { width: "100%" }, children: /* @__PURE__ */ t(
24
- a.TextArea,
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: e,
22
+ value: r,
28
23
  onChange: (c) => {
29
- const l = c.target.value.trim();
30
- if (!l) {
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(l));
30
+ i(JSON.parse(n));
36
31
  } catch {
37
32
  }
38
33
  }
39
34
  }
40
35
  ) });
41
36
  }
42
- return /* @__PURE__ */ t(d.Item, { label: o, style: { width: "100%" }, children: /* @__PURE__ */ t(
43
- a,
37
+ return /* @__PURE__ */ t("div", { style: { width: "100%" }, children: /* @__PURE__ */ t(
38
+ o,
44
39
  {
45
- value: r ?? "",
46
- onChange: (e) => i(e.target.value || void 0)
40
+ value: e ?? "",
41
+ onChange: (r) => i(r.target.value || void 0)
47
42
  }
48
43
  ) });
49
44
  }
50
- const b = h;
45
+ const y = u;
51
46
  export {
52
- h as DefaultEditor,
53
- b as defaultEditorWidget
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 { Form, Input, InputNumber, Switch } from 'antd';\n\nexport function DefaultEditor({\n value,\n onChange,\n title,\n ...rest\n}: 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 <Form.Item label={title} style={{ width: '100%' }}>\n <Switch checked={!!value} onChange={(v) => onChange(v)} />\n </Form.Item>\n );\n }\n\n if (dataType === 'number' || dataType === 'integer') {\n return (\n <Form.Item label={title} style={{ width: '100%' }}>\n <InputNumber\n value={value as number}\n onChange={(v) => onChange(v ?? undefined)}\n style={{ width: '100%' }}\n />\n </Form.Item>\n );\n }\n\n if (dataType === 'object' || dataType === 'array') {\n const text = value !== undefined ? JSON.stringify(value, null, 2) : '';\n return (\n <Form.Item label={`${title}(JSON)`} 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 </Form.Item>\n );\n }\n\n // string\n return (\n <Form.Item label={title} style={{ width: '100%' }}>\n <Input\n value={(value as string) ?? ''}\n onChange={(e) => onChange(e.target.value || undefined)}\n />\n </Form.Item>\n );\n}\n\nexport const defaultEditorWidget = DefaultEditor;\n"],"names":["DefaultEditor","value","onChange","title","rest","dataType","jsx","Form","Switch","v","InputNumber","text","Input","e","t","defaultEditorWidget"],"mappings":";;AAQO,SAASA,EAAc;AAAA,EAC5B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GAAgB;AAEd,QAAMC,IADaD,GACW,YAAuB;AAErD,MAAIC,MAAa;AACf,WACE,gBAAAC,EAACC,EAAK,MAAL,EAAU,OAAOJ,GAAO,OAAO,EAAE,OAAO,OAAA,GACvC,4BAACK,GAAA,EAAO,SAAS,CAAC,CAACP,GAAO,UAAU,CAACQ,MAAMP,EAASO,CAAC,EAAA,CAAG,EAAA,CAC1D;AAIJ,MAAIJ,MAAa,YAAYA,MAAa;AACxC,WACE,gBAAAC,EAACC,EAAK,MAAL,EAAU,OAAOJ,GAAO,OAAO,EAAE,OAAO,OAAA,GACvC,UAAA,gBAAAG;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,OAAAT;AAAA,QACA,UAAU,CAACQ,MAAMP,EAASO,KAAK,MAAS;AAAA,QACxC,OAAO,EAAE,OAAO,OAAA;AAAA,MAAO;AAAA,IAAA,GAE3B;AAIJ,MAAIJ,MAAa,YAAYA,MAAa,SAAS;AACjD,UAAMM,IAAOV,MAAU,SAAY,KAAK,UAAUA,GAAO,MAAM,CAAC,IAAI;AACpE,WACE,gBAAAK,EAACC,EAAK,MAAL,EAAU,OAAO,GAAGJ,CAAK,UAAU,OAAO,EAAE,OAAO,OAAA,GAClD,UAAA,gBAAAG;AAAA,MAACM,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,YAAAZ,EAAS,MAAS;AAClB;AAAA,UACF;AACA,cAAI;AACF,YAAAA,EAAS,KAAK,MAAMY,CAAC,CAAC;AAAA,UACxB,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ;AAGA,SACE,gBAAAR,EAACC,EAAK,MAAL,EAAU,OAAOJ,GAAO,OAAO,EAAE,OAAO,OAAA,GACvC,UAAA,gBAAAG;AAAA,IAACM;AAAA,IAAA;AAAA,MACC,OAAQX,KAAoB;AAAA,MAC5B,UAAU,CAAC,MAAMC,EAAS,EAAE,OAAO,SAAS,MAAS;AAAA,IAAA;AAAA,EAAA,GAEzD;AAEJ;AAEO,MAAMa,IAAsBf;"}
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 l, jsx as s } from "react/jsx-runtime";
2
- import { Form as y, Select as g } from "antd";
3
- import { useState as h, useRef as n, useEffect as u } from "react";
4
- import { useFormDataFieldOptions as A } from "./useFormDataFields.js";
5
- function E({ value: t, onChange: c, title: d }) {
6
- const m = A(), [p, e] = h(
7
- () => Array.isArray(t) ? [...t] : []
8
- ), o = n(t), i = n(t);
9
- u(() => {
10
- o.current !== t && (o.current = t, t !== i.current && e(Array.isArray(t) ? [...t] : []));
11
- }, [t]);
12
- const a = (r) => {
13
- e(r), i.current = r, c(r.length > 0 ? r : void 0);
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__ */ l(y.Item, { layout: "vertical", label: d, style: { width: "100%" }, children: [
15
+ return /* @__PURE__ */ a("div", { style: { width: "100%" }, children: [
16
16
  /* @__PURE__ */ s(
17
- g,
17
+ l,
18
18
  {
19
19
  size: "small",
20
20
  mode: "tags",
21
- value: p,
22
- onChange: (r) => a(r.map((f) => f.trim()).filter(Boolean)),
23
- options: m,
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 w = E;
31
+ const j = A;
32
32
  export {
33
- E as DependenciesEditor,
34
- w as dependenciesEditorWidget
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 { Form, Select } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { useFormDataFieldOptions } from './useFormDataFields';\n\nexport function DependenciesEditor({ value, onChange, title }: 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 <Form.Item layout={'vertical'} label={title} 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 </Form.Item>\n );\n}\n\nexport const dependenciesEditorWidget = DependenciesEditor;\n"],"names":["DependenciesEditor","value","onChange","title","fieldOptions","useFormDataFieldOptions","tags","setTags","useState","prevValueRef","useRef","lastEmittedRef","useEffect","commit","next","jsxs","Form","jsx","Select","v","s","dependenciesEditorWidget"],"mappings":";;;;AAUO,SAASA,EAAmB,EAAE,OAAAC,GAAO,UAAAC,GAAU,OAAAC,KAAsB;AAC1E,QAAMC,IAAeC,EAAA,GACf,CAACC,GAAMC,CAAO,IAAIC;AAAA,IAAmB,MACzC,MAAM,QAAQP,CAAK,IAAI,CAAC,GAAGA,CAAK,IAAI,CAAA;AAAA,EAAC,GAEjCQ,IAAeC,EAAOT,CAAK,GAC3BU,IAAiBD,EAAOT,CAAK;AAGnC,EAAAW,EAAU,MAAM;AACd,IAAIH,EAAa,YAAYR,MAC3BQ,EAAa,UAAUR,GACnBA,MAAUU,EAAe,WAC3BJ,EAAQ,MAAM,QAAQN,CAAK,IAAI,CAAC,GAAGA,CAAK,IAAI,EAAE;AAAA,EAGpD,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMY,IAAS,CAACC,MAAmB;AACjC,IAAAP,EAAQO,CAAI,GACZH,EAAe,UAAUG,GACzBZ,EAASY,EAAK,SAAS,IAAIA,IAAO,MAAS;AAAA,EAC7C;AAEA,SACE,gBAAAC,EAACC,EAAK,MAAL,EAAU,QAAQ,YAAY,OAAOb,GAAO,OAAO,EAAE,OAAO,OAAA,GAC3D,UAAA;AAAA,IAAA,gBAAAc;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAOZ;AAAA,QACP,UAAU,CAACa,MACTN,EAAQM,EAAe,IAAI,CAACC,MAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO,CAAC;AAAA,QAE7D,SAAShB;AAAA,QACT,aAAY;AAAA,QACZ,OAAO,EAAE,OAAO,OAAA;AAAA,MAAO;AAAA,IAAA;AAAA,IAEzB,gBAAAa,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,IAAI,OAAO,QAAQ,WAAW,KAAK,UAAA,sFAAA,CAG3D;AAAA,EAAA,GACF;AAEJ;AAEO,MAAMI,IAA2BrB;"}
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 m, Fragment as a, jsx as t } from "react/jsx-runtime";
2
- import { Form as o, Input as i } from "antd";
3
- function l({ value: e, onChange: r }) {
4
- return /* @__PURE__ */ m(a, { children: [
5
- /* @__PURE__ */ t(o.Item, { label: "枚举值(enum,每行一个)", style: { width: "100%" }, children: /* @__PURE__ */ t(
6
- i.TextArea,
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 e == "string" ? e : "",
10
- onChange: (n) => r(n.target.value),
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__ */ t(
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 c = l;
24
- function d({ value: e, onChange: r }) {
25
- return /* @__PURE__ */ t(
26
- o.Item,
24
+ const l = m;
25
+ function s({ value: t, onChange: e }) {
26
+ return /* @__PURE__ */ o(
27
+ n.TextArea,
27
28
  {
28
- label: "枚举文案(enumNames,每行一个)",
29
- style: { width: "100%" },
30
- children: /* @__PURE__ */ t(
31
- i.TextArea,
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 g = d;
36
+ const u = s;
43
37
  export {
44
- l as EnumEditor,
45
- d as EnumNamesEditor,
46
- c as enumEditorWidget,
47
- g as enumNamesEditorWidget
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 { Form, 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 <Form.Item label='枚举值(enum,每行一个)' style={{ width: '100%' }}>\n <Input.TextArea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder='每行一个枚举值'\n />\n </Form.Item>\n {/* _enumNames 由调用方通过额外逻辑处理 */}\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 <Form.Item\n label='枚举文案(enumNames,每行一个)'\n style={{ width: '100%' }}\n >\n <Input.TextArea\n rows={3}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder='每行一个枚举文案,与枚举值一一对应'\n />\n </Form.Item>\n );\n}\n\nexport const enumNamesEditorWidget = EnumNamesEditor;\n"],"names":["EnumEditor","value","onChange","jsxs","Fragment","jsx","Form","Input","e","enumEditorWidget","EnumNamesEditor","enumNamesEditorWidget"],"mappings":";;AAQO,SAASA,EAAW,EAAE,OAAAC,GAAO,UAAAC,KAAyB;AAe3D,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,EAAK,MAAL,EAAU,OAAM,kBAAiB,OAAO,EAAE,OAAO,OAAA,GAChD,UAAA,gBAAAD;AAAA,MAACE,EAAM;AAAA,MAAN;AAAA,QACC,MAAM;AAAA,QACN,OAAO,OAAON,KAAU,WAAWA,IAAQ;AAAA,QAC3C,UAAU,CAACO,MAAMN,EAASM,EAAE,OAAO,KAAK;AAAA,QACxC,aAAY;AAAA,MAAA;AAAA,IAAA,GAEhB;AAAA,IAEA,gBAAAH;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,MAAMI,IAAmBT;AAMzB,SAASU,EAAgB,EAAE,OAAAT,GAAO,UAAAC,KAAyB;AAChE,SACE,gBAAAG;AAAA,IAACC,EAAK;AAAA,IAAL;AAAA,MACC,OAAM;AAAA,MACN,OAAO,EAAE,OAAO,OAAA;AAAA,MAEhB,UAAA,gBAAAD;AAAA,QAACE,EAAM;AAAA,QAAN;AAAA,UACC,MAAM;AAAA,UACN,OAAO,OAAON,KAAU,WAAWA,IAAQ;AAAA,UAC3C,UAAU,CAACO,MAAMN,EAASM,EAAE,OAAO,KAAK;AAAA,UACxC,aAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IACd;AAAA,EAAA;AAGN;AAEO,MAAMG,IAAwBD;"}
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 i, jsxs as l } from "react/jsx-runtime";
2
- import { Form as f, Switch as s } from "antd";
3
- import { ExpressionBuilder as p } from "./ExpressionBuilder.js";
4
- import { useFormDataFields as m } from "./useFormDataFields.js";
5
- function x({
6
- value: e,
7
- onChange: t,
8
- title: c,
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 r = typeof e == "string" && e.length > 0, d = m(), h = (o) => {
12
- t(o ? typeof e == "string" ? e : "{{ }}" : typeof e == "boolean" ? e : !1);
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
- layout: n === "row" ? "horizontal" : "vertical",
18
- label: c,
19
- style: { width: "100%" },
20
- children: /* @__PURE__ */ l("div", { className: `flex gap-2 ${r ? "flex-col" : "flex-row"}`, children: [
21
- r ? /* @__PURE__ */ i(
22
- p,
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: e,
25
- onChange: (o) => t(o),
26
- fields: d
24
+ value: o,
25
+ onChange: (e) => i(e),
26
+ fields: n
27
27
  }
28
- ) : /* @__PURE__ */ i(s, { checked: !!e, onChange: (o) => t(o) }),
29
- /* @__PURE__ */ i(
30
- s,
28
+ ) : /* @__PURE__ */ r(c, { checked: !!o, onChange: (e) => i(e) }),
29
+ /* @__PURE__ */ r(
30
+ c,
31
31
  {
32
- checked: r,
32
+ checked: t,
33
33
  checkedChildren: "表达式",
34
34
  unCheckedChildren: "静态",
35
- onChange: h
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 = x;
44
+ const k = l;
43
45
  export {
44
- x as ExpressionSwitch,
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 { Form, Switch } from 'antd';\nimport { ExpressionBuilder } from './ExpressionBuilder';\nimport { useFormDataFields } from './useFormDataFields';\n\nexport function ExpressionSwitch({\n value,\n onChange,\n title,\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 <Form.Item\n layout={displayType === 'row' ? 'horizontal' : 'vertical'}\n label={title}\n style={{ width: '100%' }}\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 </Form.Item>\n );\n}\n\nexport const expressionSwitchWidget = ExpressionSwitch;\n"],"names":["ExpressionSwitch","value","onChange","title","displayType","isExpr","fields","useFormDataFields","switchMode","exprMode","jsx","Form","ExpressionBuilder","s","Switch","v","expressionSwitchWidget"],"mappings":";;;;AAUO,SAASA,EAAiB;AAAA,EAC/B,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AACF,GAAgB;AAId,QAAMC,IAAS,OAAOJ,KAAU,YAAYA,EAAM,SAAS,GAErDK,IAASC,EAAA,GAGTC,IAAa,CAACC,MAAsB;AACxC,IAEEP,EAFEO,IAEO,OAAOR,KAAU,WAAWA,IAAQ,WAGpC,OAAOA,KAAU,YAAYA,IAAQ,EAHO;AAAA,EAKzD;AAEA,SACE,gBAAAS;AAAA,IAACC,EAAK;AAAA,IAAL;AAAA,MACC,QAAQP,MAAgB,QAAQ,eAAe;AAAA,MAC/C,OAAOD;AAAA,MACP,OAAO,EAAE,OAAO,OAAA;AAAA,MAEhB,4BAAC,OAAA,EAAI,WAAW,cAAcE,IAAS,aAAa,UAAU,IAC3D,UAAA;AAAA,QAAAA,IACC,gBAAAK;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,OAAAX;AAAA,YACA,UAAU,CAACY,MAAMX,EAASW,CAAC;AAAA,YAC3B,QAAAP;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAAI,EAACI,GAAA,EAAO,SAAS,CAAC,CAACb,GAAO,UAAU,CAACc,MAAMb,EAASa,CAAC,EAAA,CAAG;AAAA,QAE1D,gBAAAL;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAST;AAAA,YACT,iBAAgB;AAAA,YAChB,mBAAkB;AAAA,YAClB,UAAUG;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEO,MAAMQ,IAAyBhB;"}
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;"}