treege 3.0.0-beta.9 → 3.0.0-beta.91

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 (225) hide show
  1. package/LICENSE +18 -12
  2. package/README.md +598 -79
  3. package/dist/DefaultSubmitButton-NeSDqyzv.js +1909 -0
  4. package/dist/ThemeContext-CPsC8QIP.js +1008 -0
  5. package/dist/editor/components/input/ComboboxWithCreate.d.ts +2 -1
  6. package/dist/editor/components/styles/EditorStyles.d.ts +2 -0
  7. package/dist/editor/constants/defaultNode.d.ts +1 -1
  8. package/dist/editor/constants/edgeTypes.d.ts +3 -2
  9. package/dist/editor/constants/inputTypeIcons.d.ts +3 -0
  10. package/dist/editor/constants/nodeSpacing.d.ts +25 -0
  11. package/dist/editor/constants/nodeTypes.d.ts +4 -5
  12. package/dist/editor/context/OpenApiContext.d.ts +79 -0
  13. package/dist/editor/context/TreegeEditorRuntimeProvider.d.ts +78 -0
  14. package/dist/editor/features/TreegeEditor/TreegeEditor.d.ts +1 -1
  15. package/dist/editor/features/TreegeEditor/controls/MiniMapControl.d.ts +6 -0
  16. package/dist/editor/features/TreegeEditor/dialogs/AuthorizeDialog.d.ts +20 -0
  17. package/dist/editor/features/TreegeEditor/dialogs/ChangeNodeTypeDialog.d.ts +2 -0
  18. package/dist/editor/features/TreegeEditor/dialogs/DeleteNodeDialog.d.ts +2 -0
  19. package/dist/editor/features/TreegeEditor/dialogs/HeadersDialog.d.ts +19 -0
  20. package/dist/editor/features/TreegeEditor/dialogs/OpenApiDialog.d.ts +6 -0
  21. package/dist/editor/features/TreegeEditor/edges/ConditionalEdge.d.ts +2 -2
  22. package/dist/editor/features/TreegeEditor/edges/DefaultEdge.d.ts +3 -0
  23. package/dist/editor/features/TreegeEditor/forms/HttpConfigForm.d.ts +4 -1
  24. package/dist/editor/features/TreegeEditor/forms/JsonTemplateEditor.d.ts +13 -0
  25. package/dist/editor/features/TreegeEditor/forms/OptionsMappingFields.d.ts +34 -0
  26. package/dist/editor/features/TreegeEditor/forms/OptionsSourceForm.d.ts +7 -0
  27. package/dist/editor/features/TreegeEditor/forms/SensitiveHeaderWarning.d.ts +13 -0
  28. package/dist/editor/features/TreegeEditor/forms/SubmitConfigForm.d.ts +7 -0
  29. package/dist/editor/features/TreegeEditor/inputs/ApiUrlCombobox.d.ts +20 -0
  30. package/dist/editor/features/TreegeEditor/inputs/ComboboxPattern.d.ts +2 -1
  31. package/dist/editor/features/TreegeEditor/inputs/DefaultFileValueField.d.ts +14 -0
  32. package/dist/editor/features/TreegeEditor/inputs/OptionImageField.d.ts +6 -0
  33. package/dist/editor/features/TreegeEditor/inputs/SelectNodeGroup.d.ts +22 -1
  34. package/dist/editor/features/TreegeEditor/inputs/TranslatableInput.d.ts +20 -0
  35. package/dist/editor/features/TreegeEditor/layout/AutoLayout.d.ts +15 -0
  36. package/dist/editor/features/TreegeEditor/listeners/FlowChangeEmitter.d.ts +19 -0
  37. package/dist/editor/features/TreegeEditor/nodes/TreegeNode.d.ts +5 -0
  38. package/dist/editor/features/TreegeEditor/nodes/components/BottomHandleDropdown.d.ts +25 -0
  39. package/dist/editor/features/TreegeEditor/nodes/components/NodeGroupBadge.d.ts +6 -0
  40. package/dist/editor/features/TreegeEditor/nodes/components/NodeImage.d.ts +5 -0
  41. package/dist/editor/features/TreegeEditor/nodes/components/NodeImageButton.d.ts +6 -0
  42. package/dist/editor/features/TreegeEditor/nodes/components/NodeInputPreview.d.ts +12 -0
  43. package/dist/editor/features/TreegeEditor/nodes/components/NodeLabelInput.d.ts +10 -0
  44. package/dist/editor/features/TreegeEditor/nodes/components/NodeMoreMenu.d.ts +6 -0
  45. package/dist/editor/features/TreegeEditor/nodes/components/NodeRequiredButton.d.ts +6 -0
  46. package/dist/editor/features/TreegeEditor/nodes/components/NodeStackOrderButtons.d.ts +6 -0
  47. package/dist/editor/features/TreegeEditor/nodes/components/NodeTypeBadge.d.ts +7 -0
  48. package/dist/editor/features/TreegeEditor/nodes/components/NodeTypePickerMenuContent.d.ts +12 -0
  49. package/dist/editor/features/TreegeEditor/nodes/layout/NodeWrapper.d.ts +4 -2
  50. package/dist/editor/features/TreegeEditor/panel/AIGeneratorDialog.d.ts +16 -0
  51. package/dist/editor/features/TreegeEditor/panel/ActionsPanel.d.ts +7 -2
  52. package/dist/editor/features/TreegeEditor/panel/MultiSelectionPanel.d.ts +7 -0
  53. package/dist/editor/hooks/useAvailableParentFields.d.ts +13 -0
  54. package/dist/editor/hooks/useFlowActions.d.ts +6 -2
  55. package/dist/editor/hooks/useFlowConnections.d.ts +14 -0
  56. package/dist/editor/hooks/useFlowContent.d.ts +16 -0
  57. package/dist/editor/hooks/useHistoryStore.d.ts +26 -0
  58. package/dist/editor/hooks/useIsStackedEdge.d.ts +8 -0
  59. package/dist/editor/hooks/useKeyValueRows.d.ts +15 -0
  60. package/dist/editor/hooks/useNodesSelection.d.ts +5 -5
  61. package/dist/editor/hooks/useStackPosition.d.ts +14 -0
  62. package/dist/editor/hooks/useTranslate.d.ts +1 -1
  63. package/dist/editor/hooks/useUndoRedo.d.ts +31 -0
  64. package/dist/editor/types/ai.d.ts +65 -0
  65. package/dist/editor/types/editor.d.ts +106 -10
  66. package/dist/editor/types/openapi.d.ts +106 -0
  67. package/dist/editor/utils/aiFlowGenerator.d.ts +5 -0
  68. package/dist/editor/utils/cleanEmptyData.d.ts +18 -0
  69. package/dist/editor/utils/cleanNodeConfig.d.ts +5 -0
  70. package/dist/editor/utils/dagreLayout.d.ts +8 -0
  71. package/dist/editor/utils/edge.d.ts +50 -0
  72. package/dist/editor/utils/groupColor.d.ts +14 -0
  73. package/dist/editor/utils/image.d.ts +7 -0
  74. package/dist/editor/utils/inputTypeIcon.d.ts +6 -0
  75. package/dist/editor/utils/jsonBindTarget.d.ts +15 -0
  76. package/dist/editor/utils/openApiPayload.d.ts +12 -0
  77. package/dist/editor/utils/openapi.d.ts +35 -0
  78. package/dist/editor/utils/sensitiveHeaders.d.ts +20 -0
  79. package/dist/editor/utils/stackPositionIndex.d.ts +9 -0
  80. package/dist/editor-DJbNgLSF.js +6485 -0
  81. package/dist/editor.js +3 -7
  82. package/dist/main.js +6 -52
  83. package/dist/renderer/context/TreegeRenderRuntimeProvider.d.ts +135 -0
  84. package/dist/renderer/context/TreegeRendererProvider.d.ts +15 -0
  85. package/dist/renderer/context/TreegeViewerProvider.d.ts +28 -0
  86. package/dist/renderer/features/TreegeRenderer/native/TreegeRenderer.d.ts +19 -11
  87. package/dist/renderer/features/TreegeRenderer/native/components/DefaultFormWrapper.d.ts +7 -7
  88. package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputLabel.d.ts +10 -0
  89. package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputWrapper.d.ts +9 -0
  90. package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputs.d.ts +20 -15
  91. package/dist/renderer/features/TreegeRenderer/native/components/DefaultLoadingSkeleton.d.ts +8 -0
  92. package/dist/renderer/features/TreegeRenderer/native/components/DefaultStep.d.ts +3 -0
  93. package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButton.d.ts +9 -7
  94. package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper.d.ts +11 -0
  95. package/dist/renderer/features/TreegeRenderer/native/components/DefaultUI.d.ts +8 -7
  96. package/dist/renderer/features/TreegeRenderer/native/components/DependencyHint.d.ts +15 -0
  97. package/dist/renderer/features/TreegeRenderer/native/components/OptionItemContent.d.ts +17 -0
  98. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAddressInput.d.ts +3 -0
  99. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAutocompleteInput.d.ts +3 -0
  100. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultCheckboxInput.d.ts +3 -0
  101. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateInput.d.ts +3 -0
  102. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateRangeInput.d.ts +3 -0
  103. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultFileInput.d.ts +3 -0
  104. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHiddenInput.d.ts +3 -0
  105. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHttpInput.d.ts +3 -0
  106. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultNumberInput.d.ts +3 -0
  107. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultPasswordInput.d.ts +3 -0
  108. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultRadioInput.d.ts +3 -0
  109. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSelectInput.d.ts +3 -0
  110. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSubmitInput.d.ts +11 -0
  111. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSwitchInput.d.ts +3 -0
  112. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextInput.d.ts +3 -0
  113. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextareaInput.d.ts +3 -0
  114. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeInput.d.ts +3 -0
  115. package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeRangeInput.d.ts +3 -0
  116. package/dist/renderer/features/TreegeRenderer/useTreegeRenderer.d.ts +97 -24
  117. package/dist/renderer/features/TreegeRenderer/web/TreegeRenderer.d.ts +1 -1
  118. package/dist/renderer/features/TreegeRenderer/web/components/DefaultFormWrapper.d.ts +3 -2
  119. package/dist/renderer/features/TreegeRenderer/web/components/DefaultInputLabel.d.ts +9 -0
  120. package/dist/renderer/features/TreegeRenderer/web/components/DefaultInputWrapper.d.ts +9 -0
  121. package/dist/renderer/features/TreegeRenderer/web/components/DefaultLoadingSkeleton.d.ts +7 -0
  122. package/dist/renderer/features/TreegeRenderer/web/components/DefaultStep.d.ts +3 -0
  123. package/dist/renderer/features/TreegeRenderer/web/components/DefaultSubmitButton.d.ts +5 -1
  124. package/dist/renderer/features/TreegeRenderer/web/components/DependencyHint.d.ts +22 -0
  125. package/dist/renderer/features/TreegeRenderer/web/components/OptionItemContent.d.ts +17 -0
  126. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultAddressInput.d.ts +1 -1
  127. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultAutocompleteInput.d.ts +1 -1
  128. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultCheckboxInput.d.ts +1 -1
  129. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultDateInput.d.ts +1 -1
  130. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultDateRangeInput.d.ts +1 -1
  131. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultFileInput.d.ts +1 -1
  132. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultHiddenInput.d.ts +1 -1
  133. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultHttpInput.d.ts +1 -1
  134. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultNumberInput.d.ts +1 -1
  135. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultPasswordInput.d.ts +1 -1
  136. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultRadioInput.d.ts +1 -1
  137. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSelectInput.d.ts +1 -1
  138. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSubmitInput.d.ts +11 -0
  139. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSwitchInput.d.ts +1 -1
  140. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTextAreaInput.d.ts +1 -1
  141. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTextInput.d.ts +1 -1
  142. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTimeInput.d.ts +1 -1
  143. package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTimeRangeInput.d.ts +1 -1
  144. package/dist/renderer/features/TreegeRenderer/web/components/styles/RendererStyles.d.ts +2 -0
  145. package/dist/renderer/features/TreegeViewer/utils/viewerFields.d.ts +102 -0
  146. package/dist/renderer/features/TreegeViewer/web/TreegeViewer.d.ts +94 -0
  147. package/dist/renderer/hooks/useInputOptions.d.ts +28 -0
  148. package/dist/renderer/hooks/useRenderNode.d.ts +62 -0
  149. package/dist/renderer/hooks/useSubmitHandler.d.ts +37 -0
  150. package/dist/renderer/hooks/useTranslate.d.ts +7 -5
  151. package/dist/renderer/index.d.ts +10 -2
  152. package/dist/renderer/index.native.d.ts +20 -0
  153. package/dist/renderer/types/renderer.d.ts +332 -49
  154. package/dist/renderer/utils/extraPayload.d.ts +21 -0
  155. package/dist/renderer/utils/file.d.ts +24 -10
  156. package/dist/renderer/utils/flow.d.ts +1 -18
  157. package/dist/renderer/utils/form.d.ts +54 -2
  158. package/dist/renderer/utils/http.d.ts +177 -0
  159. package/dist/renderer/utils/jsonTemplate.d.ts +30 -0
  160. package/dist/renderer/utils/node.d.ts +29 -1
  161. package/dist/renderer/utils/sanitize.d.ts +85 -0
  162. package/dist/renderer/utils/sanitize.native.d.ts +69 -0
  163. package/dist/renderer/utils/step.d.ts +27 -0
  164. package/dist/renderer/utils/submit.d.ts +50 -0
  165. package/dist/renderer/utils/templateDependencies.d.ts +17 -0
  166. package/dist/renderer-CNbSt_QW.js +446 -0
  167. package/dist/renderer-native.d.ts +2 -0
  168. package/dist/renderer-native.js +3696 -0
  169. package/dist/renderer.js +5 -45
  170. package/dist/shared/components/ui/badge.d.ts +2 -2
  171. package/dist/shared/components/ui/button.d.ts +3 -3
  172. package/dist/shared/components/ui/collapsible.d.ts +1 -1
  173. package/dist/shared/components/ui/command.d.ts +1 -1
  174. package/dist/shared/components/ui/dropdown-menu.d.ts +1 -1
  175. package/dist/shared/components/ui/field.d.ts +24 -0
  176. package/dist/shared/components/ui/form.d.ts +1 -1
  177. package/dist/shared/components/ui/item.d.ts +23 -0
  178. package/dist/shared/components/ui/popover.d.ts +10 -2
  179. package/dist/shared/components/ui/select.d.ts +3 -1
  180. package/dist/shared/components/ui/sheet.d.ts +1 -1
  181. package/dist/shared/components/ui/skeleton.d.ts +3 -0
  182. package/dist/shared/components/ui/toggle-group.d.ts +7 -0
  183. package/dist/shared/components/ui/toggle.d.ts +9 -0
  184. package/dist/shared/components/ui/tooltip.d.ts +1 -1
  185. package/dist/shared/constants/colors.d.ts +45 -0
  186. package/dist/shared/constants/inputType.d.ts +6 -0
  187. package/dist/shared/constants/node.d.ts +0 -1
  188. package/dist/shared/context/PortalContainerContext.d.ts +5 -0
  189. package/dist/shared/context/ThemeContext.d.ts +2 -0
  190. package/dist/shared/context/ThemeContext.native.d.ts +22 -0
  191. package/dist/shared/hooks/useMediaQuery.d.ts +12 -0
  192. package/dist/shared/hooks/useThemeColors.d.ts +37 -0
  193. package/dist/shared/locales/ar.json.d.ts +259 -19
  194. package/dist/shared/locales/de.json.d.ts +260 -20
  195. package/dist/shared/locales/en.json.d.ts +261 -21
  196. package/dist/shared/locales/es.json.d.ts +260 -20
  197. package/dist/shared/locales/fr.json.d.ts +260 -20
  198. package/dist/shared/locales/it.json.d.ts +260 -20
  199. package/dist/shared/locales/pt.json.d.ts +260 -20
  200. package/dist/shared/types/edge.d.ts +6 -0
  201. package/dist/shared/types/file.d.ts +14 -0
  202. package/dist/shared/types/node.d.ts +155 -19
  203. package/dist/shared/utils/httpRecord.d.ts +20 -0
  204. package/dist/shared/utils/inputTypeGuards.d.ts +7 -0
  205. package/dist/shared/utils/nodeTypeGuards.d.ts +1 -6
  206. package/dist/shared/utils/normalizeLabel.d.ts +22 -0
  207. package/dist/shared/utils/translations.d.ts +21 -1
  208. package/dist/useRenderNode-CG466pNk.js +538 -0
  209. package/package.json +54 -22
  210. package/dist/ThemeContext-BIvs8Kw-.js +0 -758
  211. package/dist/TreegeEditor-Lv5Tn9_F.js +0 -2152
  212. package/dist/TreegeRenderer-BVaqgInZ.js +0 -1405
  213. package/dist/editor/context/TreegeEditorContext.d.ts +0 -12
  214. package/dist/editor/features/TreegeEditor/forms/FlowNodeForm.d.ts +0 -2
  215. package/dist/editor/features/TreegeEditor/inputs/SelectInputType.d.ts +0 -7
  216. package/dist/editor/features/TreegeEditor/nodes/FlowNode.d.ts +0 -6
  217. package/dist/editor/features/TreegeEditor/nodes/GroupNode.d.ts +0 -6
  218. package/dist/editor/features/TreegeEditor/nodes/InputNode.d.ts +0 -6
  219. package/dist/editor/features/TreegeEditor/nodes/UINode.d.ts +0 -6
  220. package/dist/editor/hooks/useEdgesSelection.d.ts +0 -11
  221. package/dist/renderer/context/TreegeConfigContext.d.ts +0 -39
  222. package/dist/renderer/context/TreegeRendererContext.d.ts +0 -25
  223. package/dist/renderer/features/TreegeRenderer/native/components/DefaultGroup.d.ts +0 -7
  224. package/dist/renderer/features/TreegeRenderer/web/components/DefaultGroup.d.ts +0 -6
  225. /package/dist/editor/components/{data-display/logo.d.ts → branding/Logo.d.ts} +0 -0
@@ -0,0 +1,1008 @@
1
+ import { createContext as e, useContext as t, useEffect as n, useMemo as r, useState as i } from "react";
2
+ import { jsx as a } from "react/jsx-runtime";
3
+ import o from "dompurify";
4
+ //#region src/shared/utils/nodeTypeGuards.ts
5
+ var s = (e) => e?.type === "input", c = (e) => e?.type === "ui", l = (e) => e?.type === "group", u = {
6
+ common: {
7
+ cancel: "إلغاء",
8
+ clear: "مسح",
9
+ close: "إغلاق",
10
+ create: "إنشاء",
11
+ delete: "حذف",
12
+ other: "أخرى",
13
+ retry: "إعادة المحاولة",
14
+ save: "حفظ",
15
+ settings: "الإعدادات",
16
+ submit: "إرسال",
17
+ toggle: "تبديل"
18
+ },
19
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"إضافة عنصر\",\"authorize\":\"Authorize\",\"clear\":\"مسح التدفق\",\"clearSuccess\":\"تم مسح التدفق!\",\"clearSuccessDesc\":\"تم إزالة جميع العقد والحواف.\",\"downloadSuccess\":\"تم التنزيل بنجاح.\",\"downloadSuccessDesc\":\"تم تصدير التدفق بنجاح.\",\"exportJson\":\"تصدير JSON\",\"globalHeaders\":\"Global headers\",\"importJson\":\"استيراد JSON\",\"importSuccess\":\"تم الاستيراد بنجاح!\",\"importSuccessDesc\":\"تم استيراد التدفق بنجاح.\",\"invalidJson\":\"ملف JSON غير صالح.\",\"invalidJsonDesc\":\"يجب أن يحتوي الملف على مصفوفات من العقد والحواف.\",\"language\":\"اللغة\",\"openApi\":\"OpenAPI\",\"parseError\":\"خطأ في تحليل ملف JSON.\",\"parseErrorDesc\":\"حاول إصلاح الملف واستيراده مرة أخرى.\",\"sensitiveHeadersStripped\":\"تمت إزالة الترويسات الحساسة\",\"sensitiveHeadersStrippedDesc\":\"تمت إزالة ترويسات بيانات الاعتماد لتجنّب تسريب الأسرار.\"},\"aiGenerator\":{\"aiNotConfigured\":\"الذكاء الاصطناعي غير مُهيأ\",\"aiNotConfiguredDesc\":\"أضف خاصية {code} إلى TreegeEditor\",\"buttonLabel\":\"إنشاء باستخدام الذكاء الاصطناعي\",\"cancel\":\"إلغاء\",\"description\":\"الوصف\",\"descriptionPlaceholder\":\"مثال: إنشاء نموذج اتصال مع الاسم والبريد الإلكتروني ورقم الهاتف والرسالة\",\"enterDescription\":\"الرجاء إدخال وصف\",\"failedToGenerate\":\"فشل في إنشاء الشجرة\",\"generate\":\"إنشاء\",\"generating\":\"جارٍ الإنشاء...\",\"keyboardShortcut\":\"اضغط {cmdEnter} أو {ctrlEnter} للإنشاء\",\"missingApiKey\":\"تكوين الذكاء الاصطناعي مفقود\",\"missingApiKeyDesc\":\"الرجاء تكوين مفتاح API الخاص بالذكاء الاصطناعي في TreegeEditor\",\"successDescription\":\"تم إنشاء {nodes} عقدة و {edges} حافة\",\"successTitle\":\"تم إنشاء الشجرة بنجاح!\",\"title\":\"إنشاء تدفق باستخدام الذكاء الاصطناعي\",\"titleDescription\":\"صف النموذج أو شجرة القرار التي تريد إنشاءها، وسيقوم الذكاء الاصطناعي بإنشائها لك.\",\"unknownError\":\"حدث خطأ غير معروف\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"إضافة عنوان URL الأساسي\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"استخدام مسار نسبي\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"يحتوي هذا العنصر على عدة فروع صادرة. النوع الجديد يدعم فرعاً واحداً فقط. اختر الفرع الذي تريد الاحتفاظ به؛ سيتم حذف الفروع الأخرى.\",\"keepBranch\":\"الاحتفاظ بهذا الفرع\",\"noConditions\":\"لا توجد شروط\",\"title\":\"تغيير نوع العنصر\"},\"comboboxPattern\":{\"custom\":\"مخصص: {value}\",\"search\":\"البحث عن أنماط...\",\"selectOrCreate\":\"اختر أو أنشئ نمطاً\",\"usePattern\":\"استخدم النمط: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"مسح التحديد\",\"noResults\":\"لم يتم العثور على نتائج\"},\"conditionalEdge\":{\"addCondition\":\"إضافة شرط\",\"advanced\":\"متقدم\",\"and\":\"و\",\"basic\":\"أساسي\",\"basicConditionLabel\":\"إذا كان \\\"{name}\\\" يساوي\",\"condition\":\"شرط\",\"conditions\":\"الشروط\",\"conditionsAnd\":\"شروط (و)\",\"conditionsMixed\":\"شروط (مختلطة)\",\"conditionsOr\":\"شروط (أو)\",\"defineCondition\":\"تعريف شرط\",\"displayConditions\":\"عرض الشروط\",\"displayConditionsDesc\":\"سيتم عرض هذا الحقل إذا تم استيفاء الشروط التالية.\",\"fallback\":\"افتراضي\",\"fallbackPath\":\"المسار الافتراضي / الاحتياطي\",\"fallbackPathDesc\":\"سيتم اتباع هذا المسار عندما لا تتطابق أي شروط أخرى\",\"field\":\"حقل\",\"labelDesc\":\"تسمية مخصصة لزر الشرط\",\"labelOptional\":\"التسمية (اختياري)\",\"labelPlaceholder\":\"مثال: إذا كان مؤهلاً\",\"noFieldsAvailable\":\"لا توجد حقول متاحة\",\"operator\":\"عامل التشغيل\",\"or\":\"أو\",\"removeCondition\":\"إزالة الشرط\",\"selectField\":\"اختر حقلاً\",\"selectValue\":\"اختر قيمة\",\"value\":\"قيمة\",\"valuePlaceholder\":\"مثال: 18\"},\"groupNodeForm\":{\"label\":\"التسمية\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"إضافة رأس\",\"addQueryParam\":\"إضافة معامل\",\"apiUrl\":\"رابط API\",\"apiUrlDesc\":\"استخدم متغيرات القالب مثل {{fieldId}} للإشارة إلى الحقول الأخرى\",\"apiUrlPlaceholder\":\"https://api.example.com/data\",\"behavior\":\"السلوك\",\"fetchOnMount\":\"جلب عند التحميل\",\"headerName\":\"اسم الرأس\",\"headers\":\"رؤوس\",\"headerValue\":\"قيمة الرأس\",\"httpMethod\":\"طريقة HTTP\",\"insertVariable\":\"إدراج متغير\",\"labelField\":\"حقل التسمية\",\"labelFieldDesc\":\"الحقل المستخدم كتسمية خيار (مثال: الاسم)\",\"labelFieldPlaceholder\":\"الاسم\",\"mapToOptions\":\"تعيين إلى الخيارات\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"لا توجد حقول متاحة\",\"queryParamName\":\"اسم المعامل\",\"queryParams\":\"معاملات الاستعلام\",\"queryParamValue\":\"قيمة المعامل\",\"requestBody\":\"جسم الطلب (JSON)\",\"requestBodyDesc\":\"استخدم {{fieldId}} للإشارة إلى حقول أخرى. تأكد من تنسيق JSON الصحيح بما في ذلك علامات الاقتباس حول القيم النصية.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{userName}}\\\", \\\"age\\\": {{userAge}}}\",\"responseConfiguration\":\"تكوين الاستجابة\",\"responsePath\":\"مسار الاستجابة\",\"responsePathDesc\":\"استخراج البيانات من الاستجابة باستخدام نقطة التدوين أو فهرسة المصفوفة\",\"responsePathPlaceholder\":\"data.users أو results[0]\",\"searchParameter\":\"معامل البحث (اختياري)\",\"searchParameterDesc\":\"إذا تم تعيينه، يتم تمكين مربع بحث يضيف هذا المعامل إلى استدعاءات API (مثال: ?q=باريس)\",\"searchParameterPlaceholder\":\"q، بحث، استعلام...\",\"selectMethod\":\"اختر الطريقة\",\"sendAllFormValues\":\"إرسال جميع بيانات النموذج\",\"sendAllFormValuesDesc\":\"إرسال جميع قيم النموذج تلقائياً كمحتوى JSON\",\"showLoadingState\":\"إظهار حالة التحميل\",\"valueField\":\"حقل القيمة\",\"valueFieldDesc\":\"الحقل المستخدم كقيمة خيار (مثال: id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"أضف حقول إدخال قبل هذه العقدة للإشارة إليها\",\"addMapping\":\"إضافة تعيين\",\"addOption\":\"+ إضافة خيار\",\"advancedConfiguration\":\"تكوين متقدم\",\"defaultChecked\":\"محدد افتراضياً\",\"defaultValuesCommaSeparated\":\"القيم الافتراضية (مفصولة بفواصل)\",\"defaultValuesPlaceholder\":\"قيمة1، قيمة2، قيمة3\",\"defaultValueType\":\"نوع القيمة الافتراضية\",\"defaultValueTypeNone\":\"لا شيء\",\"defaultValueTypeReference\":\"حقل مرجعي\",\"defaultValueTypeStatic\":\"قيمة ثابتة\",\"deleteOption\":\"حذف الخيار\",\"disablePast\":\"تعطيل التواريخ الماضية\",\"editOption\":\"تعديل الخيار\",\"errorMessage\":\"رسالة خطأ\",\"helperText\":\"نص مساعد\",\"httpConfiguration\":\"تكوين HTTP\",\"label\":\"التسمية\",\"multipleFiles\":\"ملفات متعددة\",\"multipleSelection\":\"اختيار متعدد\",\"name\":\"الاسم\",\"nameDescription\":\"اسم حقل مخصص اختياري لتصدير النموذج. إذا كان فارغاً، سيتم استخدام التسمية كمفتاح.\",\"noParentFieldsAvailable\":\"لا توجد حقول أصلية متاحة\",\"normalizeLabels\":\"توحيد التسميات\",\"normalizeLabelsHint\":\"تنسيق التسميات الواردة من واجهة برمجة التطبيقات (مثل الأحرف الكبيرة) إلى شكل موحّد وسهل القراءة. لا تتأثر الخيارات المُدخلة يدويًا.\",\"objectMapping\":\"تعيين الكائن\",\"objectMappingDesc\":\"تعيين خصائص الكائن المصدر إلى بنية جديدة\",\"optional\":\"اختياري\",\"optionDescription\":\"الوصف\",\"optionImageAdd\":\"إضافة صورة\",\"optionImageError\":\"تعذر معالجة الصورة.\",\"optionImageInvalid\":\"تنسيق صورة غير مدعوم.\",\"optionImageRemove\":\"إزالة الصورة\",\"optionImageReplace\":\"استبدال الصورة\",\"optionImageTooLarge\":\"الصورة كبيرة جدًا (الحد الأقصى 5 ميجابايت).\",\"optionImageUpload\":\"تحميل ملف\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"التسمية\",\"options\":\"خيارات\",\"optionValue\":\"القيمة\",\"pattern\":\"نمط\",\"placeholder\":\"نص توضيحي\",\"referenceField\":\"حقل مرجعي\",\"required\":\"مطلوب\",\"selectReferenceField\":\"اختر حقلاً\",\"selectTransformation\":\"اختر التحويل\",\"selectType\":\"اختر النوع\",\"sourceKey\":\"مفتاح المصدر\",\"staticValue\":\"قيمة ثابتة\",\"staticValuePlaceholder\":\"أدخل القيمة الافتراضية\",\"submitConfiguration\":\"إعداد الإرسال\",\"targetKey\":\"مفتاح الوجهة\",\"transformArray\":\"تحويل إلى مصفوفة\",\"transformBoolean\":\"تحويل إلى منطقي\",\"transformDesc\":\"تحويل القيمة المرجعية لتتطابق مع نوع هذا الحقل\",\"transformMapToObject\":\"تعيين إلى كائن\",\"transformNone\":\"بدون تحويل\",\"transformNumber\":\"تحويل إلى رقم\",\"transformString\":\"تحويل إلى نص\",\"transformType\":\"نوع التحويل\",\"validation\":\"التحقق\",\"variant\":\"متغير\",\"variantCard\":\"بطاقة\",\"variantDefault\":\"افتراضي\"},\"jsonTemplate\":{\"hint\":\"اكتب أو الصق JSON، ثم انقر على مفتاح أو قيمة لربطه بحقل — أو اكتب {{اسم_الحقل}} أو {{معرّف_الحقل}}.\",\"invalidJson\":\"JSON غير صالح — صحّح الصياغة حتى يصبح القالب فعّالاً.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"إلغاء الربط\"},\"multiSelectionPanel\":{\"clearSelection\":\"إلغاء التحديد\",\"deleteSelected\":\"حذف العقد المحددة\",\"nodesSelected\":\"عقدة محددة\"},\"nodeActionsSheet\":{\"deleteNode\":\"حذف العقدة\",\"deleteNodeConfirm\":\"هل أنت متأكد من أنك تريد حذف هذه العقدة؟\",\"deleteNodeSuccess\":\"تم حذف العقدة بنجاح\",\"editNode\":\"تعديل العقدة\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"لا تزال الطلبية تحتوي على متغيّرات غير مُحَلّة. استبدلها بقيمة مثال ثابتة للاكتشاف ثم أعدها.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"تستخدم هذه الطلبية متغيّرات ديناميكية ({vars}) ليست لها قيمة في المحرّر. يستدعي زر «اكتشاف الحقول» واجهة الـAPI كما هي، لذا قد يفشل. استبدلها مؤقتًا بقيمة مثال ثابتة لاكتشاف الاستجابة، ثم أعد المتغيّرات.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"النوع\"},\"selectNodeGroup\":{\"createNewGroup\":\"إنشاء مجموعة جديدة\",\"group\":\"مجموعة\",\"groupAlreadyExists\":\"هذه المجموعة موجودة بالفعل\",\"groupAlreadyExistsDesc\":\"استخدم المحدد لإضافة العقدة إلى مجموعة موجودة.\",\"groupCreated\":\"تم إنشاء المجموعة\",\"groupCreatedDesc\":\"تم إنشاء المجموعة \\\"{groupName}\\\" بنجاح.\",\"groupName\":\"اسم المجموعة\",\"groupNamePlaceholder\":\"مثال: الخطوة 1 - معلومات شخصية\",\"mixed\":\"مجموعات مختلطة\",\"newGroup\":\"مجموعة جديدة\",\"newGroupDescription\":\"سيتم إنشاء المجموعة حول العقدة المحددة.\",\"noGroup\":\"بدون مجموعة\",\"renameGroup\":\"إعادة تسمية المجموعة\"},\"selectNodeType\":{\"nodeType\":\"نوع العقدة\",\"options\":{\"group\":\"مجموعة\",\"input\":\"سؤال\",\"ui\":\"عنصر تصميم\"}},\"sensitiveHeaderWarning\":{\"message\":\"تجنّب وضع بيانات الاعتماد (Authorization، مفاتيح API) في ترويسات الحقل، فهي تُحفظ في الشجرة المُصدَّرة. استخدم الترويسات العامة (تفويض) للمصادقة بدلاً من ذلك.\"},\"stackedEdge\":{\"addNode\":\"إضافة عنصر\",\"createBranch\":\"إنشاء فرع\",\"insertNode\":\"إدراج عنصر هنا\"},\"stackOrder\":{\"moveDown\":\"نقل لأسفل\",\"moveUp\":\"نقل لأعلى\"},\"submitConfigForm\":{\"addHeader\":\"إضافة رأس\",\"addQueryParam\":\"إضافة معامل\",\"apiUrl\":\"رابط API\",\"apiUrlDesc\":\"استخدم {{fieldId}} للإشارة إلى حقول أخرى\",\"apiUrlPlaceholder\":\"https://api.example.com/submit\",\"behavior\":\"السلوك\",\"errorMessage\":\"رسالة الخطأ\",\"errorMessageDesc\":\"الرسالة المعروضة عند فشل الإرسال\",\"errorMessagePlaceholder\":\"حدث خطأ. يرجى المحاولة مرة أخرى.\",\"fillFromApi\":\"التعبئة من واجهة API\",\"fillFromApiHint\":\"يملأ الحمولة من جسم طلب مسار OpenAPI. متاح عندما يطابق عنوان URL مسارًا يحدّد جسم طلب.\",\"headerName\":\"اسم الرأس\",\"headers\":\"الرؤوس\",\"headerValue\":\"قيمة الرأس\",\"httpMethod\":\"طريقة HTTP\",\"insertVariable\":\"إدراج متغير\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"لا توجد حقول متاحة\",\"payload\":\"حمولة الإخراج (JSON)\",\"payloadDesc\":\"الحمولة التي تُسلَّم إلى onSubmit، وتُرسَل كجسم لطلب HTTP عند تحديد عنوان URL. ولها الأولوية على «إرسال جميع بيانات النموذج».\",\"postSubmission\":\"بعد الإرسال\",\"queryParamName\":\"اسم المعامل\",\"queryParams\":\"معاملات الاستعلام\",\"queryParamValue\":\"قيمة المعامل\",\"redirectUrl\":\"رابط إعادة التوجيه\",\"redirectUrlDesc\":\"الرابط الذي سيتم التوجيه إليه بعد نجاح الإرسال\",\"redirectUrlPlaceholder\":\"/success أو https://example.com/thank-you\",\"requestBody\":\"محتوى الطلب (JSON)\",\"requestBodyDesc\":\"استخدم {{fieldId}} للإشارة إلى حقول أخرى. تأكد من تنسيق JSON الصحيح بما في ذلك علامات الاقتباس حول القيم النصية.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{userName}}\\\", \\\"email\\\": \\\"{{userEmail}}\\\"}\",\"selectMethod\":\"اختر الطريقة\",\"sendAllFormValues\":\"إرسال جميع بيانات النموذج\",\"sendAllFormValuesDesc\":\"إرسال جميع قيم النموذج تلقائياً كمحتوى JSON\",\"showLoadingState\":\"إظهار حالة التحميل\",\"successMessage\":\"رسالة النجاح\",\"successMessageDesc\":\"الرسالة المعروضة عند نجاح الإرسال\",\"successMessagePlaceholder\":\"تم إرسال النموذج بنجاح!\"},\"treegeNode\":{\"labelPlaceholder\":\"تسمية...\"},\"uiNodeForm\":{\"label\":\"التسمية\",\"type\":\"النوع\",\"typeDivider\":\"فاصل\",\"typeTitle\":\"عنوان\"}}"),
20
+ renderer: {
21
+ defaultAddressInput: {
22
+ enterAddress: "أدخل عنواناً...",
23
+ noAddressesFound: "لم يتم العثور على عناوين.",
24
+ searching: "جاري البحث...",
25
+ typeMinChars: "اكتب 3 أحرف على الأقل للبحث"
26
+ },
27
+ defaultAutocompleteInput: {
28
+ noResults: "لم يتم العثور على نتائج.",
29
+ search: "بحث...",
30
+ selectOption: "اختر خياراً"
31
+ },
32
+ defaultCheckboxInput: { loadingOptions: "جاري تحميل الخيارات..." },
33
+ defaultHttpInput: {
34
+ fetchFailed: "فشل في جلب البيانات. يرجى التحقق من اتصالك بالشبكة.",
35
+ httpError: "خطأ HTTP {status}: {statusText}",
36
+ invalidJson: "استجابة الخادم ليست JSON صالحة. تحقق من عنوان URL وعنوان URL الأساسي والمصادقة.",
37
+ noDataAvailable: "لا توجد بيانات متاحة. قم بتكوين \"جلب عند التحميل\" أو أضف معامل بحث.",
38
+ noResults: "لم يتم العثور على نتائج.",
39
+ noUrlConfigured: "لم يتم تكوين رابط. يرجى إضافة عنوان URL في إعدادات HTTP.",
40
+ retry: "إعادة المحاولة",
41
+ search: "بحث...",
42
+ searching: "جاري البحث...",
43
+ selectOption: "اختر خياراً",
44
+ waitingForRequiredFields: "في انتظار الحقول المطلوبة"
45
+ },
46
+ defaultInputs: {
47
+ addMoreFiles: "إضافة المزيد من الملفات",
48
+ endDate: "تاريخ الانتهاء",
49
+ endTime: "وقت الانتهاء",
50
+ filePickerError: "فشل في اختيار الملف",
51
+ filePickerUnavailable: "اختيار الملفات غير متاح. يرجى تثبيت react-native-document-picker.",
52
+ newAnswer: "إجابة جديدة...",
53
+ removeFile: "إزالة الملف",
54
+ replaceFile: "استبدال الملف",
55
+ required: "*",
56
+ selectDate: "اختر التاريخ",
57
+ selectDateRange: "اختر نطاق التاريخ",
58
+ selectFile: "اختر ملف",
59
+ selectFiles: "اختر ملفات",
60
+ selectTime: "اختر الوقت",
61
+ selectTimeRange: "اختر نطاق الوقت",
62
+ startDate: "تاريخ البدء",
63
+ startTime: "وقت البدء"
64
+ },
65
+ defaultRadioInput: { loadingOptions: "جاري تحميل الخيارات..." },
66
+ defaultSelectInput: { selectOption: "اختر خياراً" },
67
+ defaultSubmitButton: {
68
+ requiredFieldsMissing: "حقول مطلوبة مفقودة:",
69
+ submit: "إرسال"
70
+ },
71
+ dependencyHint: { title: "يرجى ملء الحقول التالية أولاً:" },
72
+ step: {
73
+ back: "رجوع",
74
+ continue: "متابعة"
75
+ }
76
+ },
77
+ validation: {
78
+ invalidFormat: "تنسيق غير صالح",
79
+ required: "هذا الحقل مطلوب"
80
+ }
81
+ }, d = {
82
+ common: {
83
+ cancel: "Abbrechen",
84
+ clear: "Löschen",
85
+ close: "Schließen",
86
+ create: "Erstellen",
87
+ delete: "Löschen",
88
+ other: "Sonstige",
89
+ retry: "Erneut versuchen",
90
+ save: "Speichern",
91
+ settings: "Einstellungen",
92
+ submit: "Senden",
93
+ toggle: "Umschalten"
94
+ },
95
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Element hinzufügen\",\"authorize\":\"Authorize\",\"clear\":\"Löschen\",\"clearSuccess\":\"Fluss geleert!\",\"clearSuccessDesc\":\"Alle Knoten und Kanten wurden entfernt.\",\"downloadSuccess\":\"Download erfolgreich.\",\"downloadSuccessDesc\":\"Der Ablauf wurde erfolgreich exportiert.\",\"exportJson\":\"JSON exportieren\",\"globalHeaders\":\"Global headers\",\"importJson\":\"JSON importieren\",\"importSuccess\":\"Import erfolgreich!\",\"importSuccessDesc\":\"Der Ablauf wurde erfolgreich importiert.\",\"invalidJson\":\"Ungültige JSON-Datei.\",\"invalidJsonDesc\":\"Die Datei muss Knoten- und Kanten-Arrays enthalten.\",\"language\":\"Sprache\",\"openApi\":\"OpenAPI\",\"parseError\":\"Fehler beim Parsen der JSON-Datei.\",\"parseErrorDesc\":\"Versuchen Sie, die Datei zu korrigieren und erneut zu importieren.\",\"sensitiveHeadersStripped\":\"Sensible Header entfernt\",\"sensitiveHeadersStrippedDesc\":\"Anmelde-Header wurden entfernt, um das Offenlegen von Geheimnissen zu vermeiden.\"},\"aiGenerator\":{\"aiNotConfigured\":\"KI nicht konfiguriert\",\"aiNotConfiguredDesc\":\"Fügen Sie {code} Prop zu TreegeEditor hinzu\",\"buttonLabel\":\"Mit KI generieren\",\"cancel\":\"Abbrechen\",\"description\":\"Beschreibung\",\"descriptionPlaceholder\":\"Beispiel: Erstellen Sie ein Kontaktformular mit Name, E-Mail, Telefonnummer und Nachricht\",\"enterDescription\":\"Bitte geben Sie eine Beschreibung ein\",\"failedToGenerate\":\"Fehler beim Generieren des Baums\",\"generate\":\"Generieren\",\"generating\":\"Wird generiert...\",\"keyboardShortcut\":\"Drücken Sie {cmdEnter} oder {ctrlEnter} zum Generieren\",\"missingApiKey\":\"KI-Konfiguration fehlt\",\"missingApiKeyDesc\":\"Bitte konfigurieren Sie Ihren KI-API-Schlüssel in TreegeEditor\",\"successDescription\":\"{nodes} Knoten und {edges} Kanten erstellt\",\"successTitle\":\"Baum erfolgreich generiert!\",\"title\":\"Flow mit KI generieren\",\"titleDescription\":\"Beschreiben Sie das Formular oder den Entscheidungsbaum, den Sie erstellen möchten, und die KI wird ihn für Sie generieren.\",\"unknownError\":\"Unbekannter Fehler aufgetreten\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Basis-URL voranstellen\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"Relativen Pfad verwenden\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"Dieser Knoten hat mehrere ausgehende Verzweigungen. Der neue Typ unterstützt nur eine. Wählen Sie, welche Verzweigung beibehalten werden soll; die anderen werden entfernt.\",\"keepBranch\":\"Diese Verzweigung behalten\",\"noConditions\":\"Keine Bedingungen\",\"title\":\"Knotentyp ändern\"},\"comboboxPattern\":{\"custom\":\"Benutzerdefiniert: {value}\",\"search\":\"Muster suchen...\",\"selectOrCreate\":\"Muster auswählen oder erstellen\",\"usePattern\":\"Muster verwenden: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Auswahl löschen\",\"noResults\":\"Keine Ergebnisse gefunden\"},\"conditionalEdge\":{\"addCondition\":\"Bedingung hinzufügen\",\"advanced\":\"Erweitert\",\"and\":\"UND\",\"basic\":\"Einfach\",\"basicConditionLabel\":\"Wenn \\\"{name}\\\" gleich\",\"condition\":\"Bedingung\",\"conditions\":\"Bedingungen\",\"conditionsAnd\":\"Bedingungen (UND)\",\"conditionsMixed\":\"Bedingungen (gemischt)\",\"conditionsOr\":\"Bedingungen (ODER)\",\"defineCondition\":\"Bedingung definieren\",\"displayConditions\":\"Bedingungen anzeigen\",\"displayConditionsDesc\":\"Dieses Feld wird angezeigt, wenn die folgenden Bedingungen erfüllt sind.\",\"fallback\":\"Standard\",\"fallbackPath\":\"Standard- / Fallback-Pfad\",\"fallbackPathDesc\":\"Dieser Pfad wird befolgt, wenn keine andere Bedingung zutrifft\",\"field\":\"Feld\",\"labelDesc\":\"Benutzerdefinierte Bezeichnung für die Bedingungsschaltfläche\",\"labelOptional\":\"Bezeichnung (optional)\",\"labelPlaceholder\":\"z.B.: Wenn berechtigt\",\"noFieldsAvailable\":\"Keine Felder verfügbar\",\"operator\":\"Operator\",\"or\":\"ODER\",\"removeCondition\":\"Bedingung entfernen\",\"selectField\":\"Feld auswählen\",\"selectValue\":\"Wert auswählen\",\"value\":\"Wert\",\"valuePlaceholder\":\"z.B.: 18\"},\"groupNodeForm\":{\"label\":\"Bezeichnung\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Header hinzufügen\",\"addQueryParam\":\"Parameter hinzufügen\",\"apiUrl\":\"API-URL\",\"apiUrlDesc\":\"Verwenden Sie Vorlagenvariablen wie {{fieldId}}, um andere Felder zu referenzieren\",\"apiUrlPlaceholder\":\"https://api.beispiel.com/data\",\"behavior\":\"Verhalten\",\"fetchOnMount\":\"Beim Laden abrufen\",\"headerName\":\"Header-Name\",\"headers\":\"Header\",\"headerValue\":\"Header-Wert\",\"httpMethod\":\"HTTP-Methode\",\"insertVariable\":\"Variable einfügen\",\"labelField\":\"Bezeichnungsfeld\",\"labelFieldDesc\":\"Feld, das als Optionsbezeichnung verwendet werden soll (z.B. name)\",\"labelFieldPlaceholder\":\"name\",\"mapToOptions\":\"Auf Optionen abbilden\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Keine Felder verfügbar\",\"queryParamName\":\"Parametername\",\"queryParams\":\"Query-Parameter\",\"queryParamValue\":\"Parameterwert\",\"requestBody\":\"Anfrage-Body (JSON)\",\"requestBodyDesc\":\"Verwenden Sie {{fieldId}}, um andere Felder zu referenzieren. Stellen Sie sicher, dass die JSON-Formatierung korrekt ist, einschließlich Anführungszeichen um Zeichenkettenwerte.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{benutzername}}\\\", \\\"alter\\\": {{benutzeralter}}}\",\"responseConfiguration\":\"Antwort-Konfiguration\",\"responsePath\":\"Antwortpfad\",\"responsePathDesc\":\"Daten aus der Antwort mit Punktnotation oder Array-Indizierung extrahieren\",\"responsePathPlaceholder\":\"data.users oder results[0]\",\"searchParameter\":\"Suchparameter (optional)\",\"searchParameterDesc\":\"Wenn festgelegt, aktiviert eine Suchbox, die diesen Parameter zu API-Aufrufen hinzufügt (z.B. ?q=Paris)\",\"searchParameterPlaceholder\":\"q, suche, abfrage...\",\"selectMethod\":\"Methode auswählen\",\"sendAllFormValues\":\"Alle Formulardaten senden\",\"sendAllFormValuesDesc\":\"Alle Formularwerte automatisch als JSON-Body senden\",\"showLoadingState\":\"Ladezustand anzeigen\",\"valueField\":\"Wertfeld\",\"valueFieldDesc\":\"Feld, das als Optionswert verwendet werden soll (z.B. id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Fügen Sie Eingabefelder vor diesem Knoten hinzu, um sie zu referenzieren\",\"addMapping\":\"Zuordnung hinzufügen\",\"addOption\":\"Option hinzufügen\",\"advancedConfiguration\":\"Erweiterte Konfiguration\",\"defaultChecked\":\"Standardmäßig aktiviert\",\"defaultValuesCommaSeparated\":\"Standardwerte (durch Kommas getrennt)\",\"defaultValuesPlaceholder\":\"wert1, wert2, wert3\",\"defaultValueType\":\"Standardwerttyp\",\"defaultValueTypeNone\":\"Keiner\",\"defaultValueTypeReference\":\"Referenzfeld\",\"defaultValueTypeStatic\":\"Statischer Wert\",\"deleteOption\":\"Option löschen\",\"disablePast\":\"Vergangene Daten deaktivieren\",\"editOption\":\"Option bearbeiten\",\"errorMessage\":\"Fehlermeldung\",\"helperText\":\"Hilfetext\",\"httpConfiguration\":\"HTTP-Konfiguration\",\"label\":\"Bezeichnung\",\"multipleFiles\":\"Mehrere Dateien\",\"multipleSelection\":\"Mehrfachauswahl\",\"name\":\"Name\",\"nameDescription\":\"Optionaler benutzerdefinierter Feldname für den Formularexport. Falls leer, wird die Bezeichnung als Schlüssel verwendet.\",\"noParentFieldsAvailable\":\"Keine übergeordneten Felder verfügbar\",\"normalizeLabels\":\"Beschriftungen normalisieren\",\"normalizeLabelsHint\":\"Bereinigt von der API gelieferte Beschriftungen (z. B. GROSSBUCHSTABEN) zu einer einheitlichen, lesbaren Form. Manuell eingegebene Optionen sind nicht betroffen.\",\"objectMapping\":\"Objektzuordnung\",\"objectMappingDesc\":\"Eigenschaften des Quellobjekts auf eine neue Struktur abbilden\",\"optional\":\"Optional\",\"optionDescription\":\"Beschreibung\",\"optionImageAdd\":\"Bild hinzufügen\",\"optionImageError\":\"Bild konnte nicht verarbeitet werden.\",\"optionImageInvalid\":\"Nicht unterstütztes Bildformat.\",\"optionImageRemove\":\"Bild entfernen\",\"optionImageReplace\":\"Bild ersetzen\",\"optionImageTooLarge\":\"Bild zu groß (max. 5 MB).\",\"optionImageUpload\":\"Datei hochladen\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Bezeichnung\",\"options\":\"Optionen\",\"optionValue\":\"Wert\",\"pattern\":\"Muster\",\"placeholder\":\"Platzhalter\",\"referenceField\":\"Referenzfeld\",\"required\":\"Erforderlich\",\"selectReferenceField\":\"Feld auswählen\",\"selectTransformation\":\"Transformation auswählen\",\"selectType\":\"Typ auswählen\",\"sourceKey\":\"Quellschlüssel\",\"staticValue\":\"Statischer Wert\",\"staticValuePlaceholder\":\"Standardwert eingeben\",\"submitConfiguration\":\"Übermittlungskonfiguration\",\"targetKey\":\"Zielschlüssel\",\"transformArray\":\"In Array konvertieren\",\"transformBoolean\":\"In Boolean konvertieren\",\"transformDesc\":\"Den referenzierten Wert transformieren, um dem Typ dieses Feldes zu entsprechen\",\"transformMapToObject\":\"Auf Objekt abbilden\",\"transformNone\":\"Keine Transformation\",\"transformNumber\":\"In Zahl konvertieren\",\"transformString\":\"In String konvertieren\",\"transformType\":\"Transformationstyp\",\"validation\":\"Validierung\",\"variant\":\"Variante\",\"variantCard\":\"Karte\",\"variantDefault\":\"Standard\"},\"jsonTemplate\":{\"hint\":\"JSON eingeben oder einfügen, dann auf einen Schlüssel oder Wert klicken, um ihn mit einem Feld zu verknüpfen — oder {{feldname}} bzw. {{feld_id}} tippen.\",\"invalidJson\":\"Ungültiges JSON – korrigieren Sie die Syntax, damit die Vorlage wirksam wird.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Verknüpfung aufheben\"},\"multiSelectionPanel\":{\"clearSelection\":\"Auswahl aufheben\",\"deleteSelected\":\"Ausgewählte Knoten löschen\",\"nodesSelected\":\"Knoten ausgewählt\"},\"nodeActionsSheet\":{\"deleteNode\":\"Knoten löschen\",\"deleteNodeConfirm\":\"Sind Sie sicher, dass Sie diesen Knoten löschen möchten?\",\"deleteNodeSuccess\":\"Knoten erfolgreich gelöscht\",\"editNode\":\"Knoten bearbeiten\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"Die Anfrage enthält noch nicht aufgelöste Variablen. Ersetzen Sie sie durch einen statischen Beispielwert, um sie zu erkennen, und stellen Sie sie dann wieder her.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"Diese Anfrage verwendet dynamische Variablen ({vars}), die im Editor keinen Wert haben. „Felder erkennen“ ruft die API unverändert auf und kann daher fehlschlagen. Ersetzen Sie sie vorübergehend durch einen statischen Beispielwert, um die Antwort zu erkennen, und stellen Sie die Variablen anschließend wieder her.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"Typ\"},\"selectNodeGroup\":{\"createNewGroup\":\"Neue Gruppe erstellen\",\"group\":\"Gruppe\",\"groupAlreadyExists\":\"Diese Gruppe existiert bereits\",\"groupAlreadyExistsDesc\":\"Verwenden Sie den Selektor, um den Knoten zu einer vorhandenen Gruppe hinzuzufügen.\",\"groupCreated\":\"Gruppe erstellt\",\"groupCreatedDesc\":\"Die Gruppe \\\"{groupName}\\\" wurde erfolgreich erstellt.\",\"groupName\":\"Gruppenname\",\"groupNamePlaceholder\":\"z.B.: Schritt 1 - Persönliche Informationen\",\"mixed\":\"Gemischte Gruppen\",\"newGroup\":\"Neue Gruppe\",\"newGroupDescription\":\"Die Gruppe wird um den ausgewählten Knoten herum erstellt.\",\"noGroup\":\"Keine Gruppe\",\"renameGroup\":\"Gruppe umbenennen\"},\"selectNodeType\":{\"nodeType\":\"Knotentyp\",\"options\":{\"group\":\"Gruppe\",\"input\":\"Frage\",\"ui\":\"Designelement\"}},\"sensitiveHeaderWarning\":{\"message\":\"Speichern Sie keine Anmeldedaten (Authorization, API-Schlüssel) in Feld-Headern – sie werden im exportierten Baum gespeichert. Verwenden Sie stattdessen globale Header (Autorisieren) zur Authentifizierung.\"},\"stackedEdge\":{\"addNode\":\"Element hinzufügen\",\"createBranch\":\"Verzweigung erstellen\",\"insertNode\":\"Element hier einfügen\"},\"stackOrder\":{\"moveDown\":\"Nach unten verschieben\",\"moveUp\":\"Nach oben verschieben\"},\"submitConfigForm\":{\"addHeader\":\"Header hinzufügen\",\"addQueryParam\":\"Parameter hinzufügen\",\"apiUrl\":\"API-URL\",\"apiUrlDesc\":\"Verwenden Sie {{fieldId}}, um andere Felder zu referenzieren\",\"apiUrlPlaceholder\":\"https://api.beispiel.de/submit\",\"behavior\":\"Verhalten\",\"errorMessage\":\"Fehlermeldung\",\"errorMessageDesc\":\"Nachricht, die bei fehlgeschlagener Übermittlung angezeigt wird\",\"errorMessagePlaceholder\":\"Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.\",\"fillFromApi\":\"Aus API befüllen\",\"fillFromApiHint\":\"Füllt das Payload aus dem Request-Body der OpenAPI-Route. Verfügbar, wenn die URL einer Route entspricht, die einen definiert.\",\"headerName\":\"Header-Name\",\"headers\":\"Header\",\"headerValue\":\"Header-Wert\",\"httpMethod\":\"HTTP-Methode\",\"insertVariable\":\"Variable einfügen\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Keine Felder verfügbar\",\"payload\":\"Ausgabe-Payload (JSON)\",\"payloadDesc\":\"Die Nutzlast, die an onSubmit übergeben und – wenn eine URL gesetzt ist – als HTTP-Anfragetext gesendet wird. Hat Vorrang vor „Alle Formulardaten senden“.\",\"postSubmission\":\"Nach dem Absenden\",\"queryParamName\":\"Parametername\",\"queryParams\":\"Query-Parameter\",\"queryParamValue\":\"Parameterwert\",\"redirectUrl\":\"Weiterleitungs-URL\",\"redirectUrlDesc\":\"URL, zu der nach erfolgreicher Übermittlung weitergeleitet wird\",\"redirectUrlPlaceholder\":\"/success oder https://beispiel.de/danke\",\"requestBody\":\"Anfragekörper (JSON)\",\"requestBodyDesc\":\"Verwenden Sie {{fieldId}}, um andere Felder zu referenzieren. Stellen Sie sicher, dass die JSON-Formatierung korrekt ist, einschließlich Anführungszeichen um Zeichenkettenwerte.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{benutzername}}\\\", \\\"email\\\": \\\"{{benutzeremail}}\\\"}\",\"selectMethod\":\"Methode auswählen\",\"sendAllFormValues\":\"Alle Formulardaten senden\",\"sendAllFormValuesDesc\":\"Alle Formularwerte automatisch als JSON-Body senden\",\"showLoadingState\":\"Ladezustand anzeigen\",\"successMessage\":\"Erfolgsmeldung\",\"successMessageDesc\":\"Nachricht, die bei erfolgreicher Übermittlung angezeigt wird\",\"successMessagePlaceholder\":\"Formular erfolgreich übermittelt!\"},\"treegeNode\":{\"labelPlaceholder\":\"Bezeichnung...\"},\"uiNodeForm\":{\"label\":\"Bezeichnung\",\"type\":\"Typ\",\"typeDivider\":\"Trennlinie\",\"typeTitle\":\"Titel\"}}"),
96
+ renderer: {
97
+ defaultAddressInput: {
98
+ enterAddress: "Geben Sie eine Adresse ein...",
99
+ noAddressesFound: "Keine Adressen gefunden.",
100
+ searching: "Suche läuft...",
101
+ typeMinChars: "Geben Sie mindestens 3 Zeichen ein, um zu suchen"
102
+ },
103
+ defaultAutocompleteInput: {
104
+ noResults: "Keine Ergebnisse gefunden.",
105
+ search: "Suchen...",
106
+ selectOption: "Option auswählen"
107
+ },
108
+ defaultCheckboxInput: { loadingOptions: "Optionen werden geladen..." },
109
+ defaultHttpInput: {
110
+ fetchFailed: "Fehler beim Abrufen der Daten. Bitte überprüfen Sie Ihre Netzwerkverbindung.",
111
+ httpError: "HTTP-Fehler {status}: {statusText}",
112
+ invalidJson: "Die Serverantwort ist kein gültiges JSON. Überprüfen Sie die URL, die Basis-URL und die Authentifizierung.",
113
+ noDataAvailable: "Keine Daten verfügbar. Konfigurieren Sie \"Beim Laden abrufen\" oder fügen Sie einen Suchparameter hinzu.",
114
+ noResults: "Keine Ergebnisse gefunden.",
115
+ noUrlConfigured: "Keine URL konfiguriert. Bitte fügen Sie eine URL in der HTTP-Konfiguration hinzu.",
116
+ retry: "Erneut versuchen",
117
+ search: "Suchen...",
118
+ searching: "Suche läuft...",
119
+ selectOption: "Option auswählen",
120
+ waitingForRequiredFields: "Warten auf erforderliche Felder"
121
+ },
122
+ defaultInputs: {
123
+ addMoreFiles: "Weitere Dateien hinzufügen",
124
+ endDate: "Enddatum",
125
+ endTime: "Endzeit",
126
+ filePickerError: "Fehler beim Auswählen der Datei",
127
+ filePickerUnavailable: "Dateiauswahl nicht verfügbar. Bitte installieren Sie react-native-document-picker.",
128
+ newAnswer: "Neue Antwort...",
129
+ removeFile: "Datei entfernen",
130
+ replaceFile: "Datei ersetzen",
131
+ required: "*",
132
+ selectDate: "Datum auswählen",
133
+ selectDateRange: "Datumsbereich auswählen",
134
+ selectFile: "Datei auswählen",
135
+ selectFiles: "Dateien auswählen",
136
+ selectTime: "Uhrzeit auswählen",
137
+ selectTimeRange: "Zeitbereich auswählen",
138
+ startDate: "Startdatum",
139
+ startTime: "Startzeit"
140
+ },
141
+ defaultRadioInput: { loadingOptions: "Optionen werden geladen..." },
142
+ defaultSelectInput: { selectOption: "Option auswählen" },
143
+ defaultSubmitButton: {
144
+ requiredFieldsMissing: "Erforderliche Felder fehlen",
145
+ submit: "Senden"
146
+ },
147
+ dependencyHint: { title: "Bitte füllen Sie zuerst die folgenden Felder aus:" },
148
+ step: {
149
+ back: "Zurück",
150
+ continue: "Weiter"
151
+ }
152
+ },
153
+ validation: {
154
+ invalidFormat: "Ungültiges Format",
155
+ required: "Dieses Feld ist erforderlich"
156
+ }
157
+ }, f = {
158
+ common: {
159
+ cancel: "Cancel",
160
+ clear: "Clear",
161
+ close: "Close",
162
+ create: "Create",
163
+ delete: "Delete",
164
+ other: "Other",
165
+ retry: "Retry",
166
+ save: "Save",
167
+ settings: "Settings",
168
+ submit: "Submit",
169
+ toggle: "Toggle"
170
+ },
171
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Add Element\",\"authorize\":\"Authorize\",\"clear\":\"Clear\",\"clearSuccess\":\"Flow cleared!\",\"clearSuccessDesc\":\"All nodes and edges have been removed.\",\"downloadSuccess\":\"Download successfully.\",\"downloadSuccessDesc\":\"The flow has been exported successfully.\",\"exportJson\":\"Export JSON\",\"globalHeaders\":\"Global headers\",\"importJson\":\"Import JSON\",\"importSuccess\":\"Import successful!\",\"importSuccessDesc\":\"The flow has been imported successfully.\",\"invalidJson\":\"Invalid JSON file.\",\"invalidJsonDesc\":\"The file must contain nodes and edges arrays.\",\"language\":\"Language\",\"openApi\":\"OpenAPI\",\"parseError\":\"Error parsing JSON file.\",\"parseErrorDesc\":\"Try to fix the file and import it again.\",\"sensitiveHeadersStripped\":\"Sensitive headers removed\",\"sensitiveHeadersStrippedDesc\":\"Credential headers were stripped to avoid leaking secrets.\"},\"aiGenerator\":{\"aiNotConfigured\":\"AI not configured\",\"aiNotConfiguredDesc\":\"Add {code} prop to TreegeEditor\",\"buttonLabel\":\"Generate with AI\",\"cancel\":\"Cancel\",\"description\":\"Description\",\"descriptionPlaceholder\":\"Example: Create a contact form with name, email, phone number, and message fields\",\"enterDescription\":\"Please enter a description\",\"failedToGenerate\":\"Failed to generate tree\",\"generate\":\"Generate\",\"generating\":\"Generating...\",\"keyboardShortcut\":\"Press {cmdEnter} or {ctrlEnter} to generate\",\"missingApiKey\":\"AI configuration missing\",\"missingApiKeyDesc\":\"Please configure your AI API key in TreegeEditor\",\"successDescription\":\"Created {nodes} nodes and {edges} edges\",\"successTitle\":\"Tree generated successfully!\",\"title\":\"Generate Flow with AI\",\"titleDescription\":\"Describe the form or decision tree you want to create, and AI will generate it for you.\",\"unknownError\":\"Unknown error occurred\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Prepend the base URL\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"Use a relative path\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"This node has several outgoing branches. The new type only supports one. Choose which branch to keep; the others will be removed.\",\"keepBranch\":\"Keep this branch\",\"noConditions\":\"No conditions\",\"title\":\"Change node type\"},\"comboboxPattern\":{\"custom\":\"Custom: {value}\",\"search\":\"Search patterns...\",\"selectOrCreate\":\"Select or create a pattern\",\"usePattern\":\"Use pattern: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Clear selection\",\"noResults\":\"No results found\"},\"conditionalEdge\":{\"addCondition\":\"Add condition\",\"advanced\":\"Advanced\",\"and\":\"AND\",\"basic\":\"Basic\",\"basicConditionLabel\":\"If \\\"{name}\\\" equals\",\"condition\":\"Condition\",\"conditions\":\"Conditions\",\"conditionsAnd\":\"conditions (AND)\",\"conditionsMixed\":\"conditions (mixed)\",\"conditionsOr\":\"conditions (OR)\",\"defineCondition\":\"Define a condition\",\"displayConditions\":\"Display conditions\",\"displayConditionsDesc\":\"This field will be shown if the following conditions are met.\",\"fallback\":\"Fallback\",\"fallbackPath\":\"Fallback / Default path\",\"fallbackPathDesc\":\"This path will be followed when no other conditions match\",\"field\":\"Field\",\"labelDesc\":\"Custom label for the condition button\",\"labelOptional\":\"Label (optional)\",\"labelPlaceholder\":\"Ex: If eligible\",\"noFieldsAvailable\":\"No fields available\",\"operator\":\"Operator\",\"or\":\"OR\",\"removeCondition\":\"Remove condition\",\"selectField\":\"Select a field\",\"selectValue\":\"Select a value\",\"value\":\"Value\",\"valuePlaceholder\":\"Ex: 18\"},\"groupNodeForm\":{\"label\":\"Label\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Add header\",\"addQueryParam\":\"Add parameter\",\"apiUrl\":\"API URL\",\"apiUrlDesc\":\"Use template variables like {{fieldId}} to reference form fields\",\"apiUrlPlaceholder\":\"https://api.example.com/data\",\"behavior\":\"Behavior\",\"fetchOnMount\":\"Fetch on mount\",\"headerName\":\"Header name\",\"headers\":\"Headers\",\"headerValue\":\"Header value\",\"httpMethod\":\"HTTP Method\",\"insertVariable\":\"Insert variable\",\"labelField\":\"Label Field\",\"labelFieldDesc\":\"Field to use as option label (e.g., name)\",\"labelFieldPlaceholder\":\"name\",\"mapToOptions\":\"Map to Options\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"No fields available\",\"queryParamName\":\"Parameter name\",\"queryParams\":\"Query parameters\",\"queryParamValue\":\"Parameter value\",\"requestBody\":\"Request Body (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} to reference form fields. Ensure proper JSON formatting including quotes around string values.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{userName}}\\\", \\\"age\\\": {{userAge}}}\",\"responseConfiguration\":\"Response Configuration\",\"responsePath\":\"Response Path\",\"responsePathDesc\":\"Extract data from response using dot notation or array indexing\",\"responsePathPlaceholder\":\"data.users or results[0]\",\"searchParameter\":\"Search Parameter (optional)\",\"searchParameterDesc\":\"If set, enables combobox with search that adds this param to API calls (e.g., ?q=Paris)\",\"searchParameterPlaceholder\":\"q, search, query...\",\"selectMethod\":\"Select method\",\"sendAllFormValues\":\"Send all form data\",\"sendAllFormValuesDesc\":\"Automatically send all form values as JSON body\",\"showLoadingState\":\"Show loading state\",\"valueField\":\"Value Field\",\"valueFieldDesc\":\"Field to use as option value (e.g., id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Add input fields before this node to reference them\",\"addMapping\":\"Add Mapping\",\"addOption\":\"Add option\",\"advancedConfiguration\":\"Advanced Configuration\",\"defaultChecked\":\"Default Checked\",\"defaultValuesCommaSeparated\":\"Default Values (comma-separated)\",\"defaultValuesPlaceholder\":\"value1, value2, value3\",\"defaultValueType\":\"Default Value Type\",\"defaultValueTypeNone\":\"None\",\"defaultValueTypeReference\":\"Reference Field\",\"defaultValueTypeStatic\":\"Static Value\",\"deleteOption\":\"Delete option\",\"disablePast\":\"Disable past dates\",\"editOption\":\"Edit option\",\"errorMessage\":\"Error message\",\"helperText\":\"Helper text\",\"httpConfiguration\":\"HTTP Configuration\",\"label\":\"Label\",\"multipleFiles\":\"Multiple files\",\"multipleSelection\":\"Multiple selection\",\"name\":\"Name\",\"nameDescription\":\"Optional custom field name for form export. If empty, the label will be used as the key.\",\"noParentFieldsAvailable\":\"No parent fields available\",\"normalizeLabels\":\"Normalize labels\",\"normalizeLabelsHint\":\"Clean up labels coming from the API (e.g. ALL CAPS) into a uniform, readable form. Manually-typed options are not affected.\",\"objectMapping\":\"Object Mapping\",\"objectMappingDesc\":\"Map properties from the source object to a new structure\",\"optional\":\"Optional\",\"optionDescription\":\"Description\",\"optionImageAdd\":\"Add image\",\"optionImageError\":\"Unable to process image.\",\"optionImageInvalid\":\"Unsupported image format.\",\"optionImageRemove\":\"Remove image\",\"optionImageReplace\":\"Replace image\",\"optionImageTooLarge\":\"Image too large (max 5 MB).\",\"optionImageUpload\":\"Upload file\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Label\",\"options\":\"Options\",\"optionValue\":\"Value\",\"pattern\":\"Pattern\",\"placeholder\":\"Placeholder\",\"referenceField\":\"Reference Field\",\"required\":\"Required\",\"selectReferenceField\":\"Select a field\",\"selectTransformation\":\"Select transformation\",\"selectType\":\"Select type\",\"sourceKey\":\"Source key\",\"staticValue\":\"Static Value\",\"staticValuePlaceholder\":\"Enter default value\",\"submitConfiguration\":\"Submit Configuration\",\"targetKey\":\"Target key\",\"transformArray\":\"Convert to Array\",\"transformBoolean\":\"Convert to Boolean\",\"transformDesc\":\"Transform the referenced value to match this field's type\",\"transformMapToObject\":\"Map to Object\",\"transformNone\":\"No transformation\",\"transformNumber\":\"Convert to Number\",\"transformString\":\"Convert to String\",\"transformType\":\"Transform Type\",\"validation\":\"Validation\",\"variant\":\"Variant\",\"variantCard\":\"Card\",\"variantDefault\":\"Default\"},\"jsonTemplate\":{\"hint\":\"Type or paste JSON, then click a key or value to bind it to a field — or type {{field_name}} or {{field_id}}.\",\"invalidJson\":\"Invalid JSON — fix the syntax for the template to take effect.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Unbind\"},\"multiSelectionPanel\":{\"clearSelection\":\"Clear selection\",\"deleteSelected\":\"Delete selected nodes\",\"nodesSelected\":\"nodes selected\"},\"nodeActionsSheet\":{\"deleteNode\":\"Delete node\",\"deleteNodeConfirm\":\"Are you sure you want to delete this node?\",\"deleteNodeSuccess\":\"Node deleted successfully\",\"editNode\":\"Edit node\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"The request still contains unresolved variables. Replace them with a static example value to detect, then restore them.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"This request uses dynamic variables ({vars}) that have no value in the editor. \\\"Detect fields\\\" calls the API as-is, so it may fail. Temporarily replace them with a static example value to detect the response, then restore the variables.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"Type\"},\"selectNodeGroup\":{\"createNewGroup\":\"Create a new group\",\"group\":\"Group\",\"groupAlreadyExists\":\"This group already exists\",\"groupAlreadyExistsDesc\":\"Use the selector to add the node to an existing group.\",\"groupCreated\":\"Group created\",\"groupCreatedDesc\":\"The group \\\"{groupName}\\\" has been created successfully.\",\"groupName\":\"Group name\",\"groupNamePlaceholder\":\"Ex: Step 1 - Personal info\",\"mixed\":\"Mixed groups\",\"newGroup\":\"New group\",\"newGroupDescription\":\"The group will be created around the selected node.\",\"noGroup\":\"No group\",\"renameGroup\":\"Rename group\"},\"selectNodeType\":{\"nodeType\":\"Node Type\",\"options\":{\"group\":\"Group\",\"input\":\"Question\",\"ui\":\"Design Element\"}},\"sensitiveHeaderWarning\":{\"message\":\"Avoid storing credentials (Authorization, API keys) in field headers — they are saved into the exported tree. Use global headers (Authorize) for authentication instead.\"},\"stackedEdge\":{\"addNode\":\"Add an element\",\"createBranch\":\"Create a branch\",\"insertNode\":\"Insert an element here\"},\"stackOrder\":{\"moveDown\":\"Move down\",\"moveUp\":\"Move up\"},\"submitConfigForm\":{\"addHeader\":\"Add header\",\"addQueryParam\":\"Add parameter\",\"apiUrl\":\"API URL\",\"apiUrlDesc\":\"Use {{fieldId}} to reference form fields\",\"apiUrlPlaceholder\":\"https://api.example.com/submit\",\"behavior\":\"Behavior\",\"errorMessage\":\"Error Message\",\"errorMessageDesc\":\"Message displayed when submission fails\",\"errorMessagePlaceholder\":\"An error occurred. Please try again.\",\"fillFromApi\":\"Fill from API\",\"fillFromApiHint\":\"Fills the payload from the selected OpenAPI route's request body. Available when the URL matches a route that defines one.\",\"headerName\":\"Header name\",\"headers\":\"Headers\",\"headerValue\":\"Header value\",\"httpMethod\":\"HTTP Method\",\"insertVariable\":\"Insert variable\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"No fields available\",\"payload\":\"Output payload (JSON)\",\"payloadDesc\":\"The payload delivered to onSubmit and, when a URL is set, sent as the HTTP request body. Takes precedence over \\\"Send all form data\\\".\",\"postSubmission\":\"Post Submission\",\"queryParamName\":\"Parameter name\",\"queryParams\":\"Query parameters\",\"queryParamValue\":\"Parameter value\",\"redirectUrl\":\"Redirect URL\",\"redirectUrlDesc\":\"URL to redirect to after successful submission\",\"redirectUrlPlaceholder\":\"/success or https://example.com/thank-you\",\"requestBody\":\"Request Body (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} to reference form fields. Ensure proper JSON formatting including quotes around string values.\",\"requestBodyPlaceholder\":\"{\\\"name\\\": \\\"{{userName}}\\\", \\\"email\\\": \\\"{{userEmail}}\\\"}\",\"selectMethod\":\"Select method\",\"sendAllFormValues\":\"Send all form data\",\"sendAllFormValuesDesc\":\"Automatically send all form values as JSON body\",\"showLoadingState\":\"Show loading state\",\"successMessage\":\"Success Message\",\"successMessageDesc\":\"Message displayed when submission succeeds\",\"successMessagePlaceholder\":\"Form submitted successfully!\"},\"treegeNode\":{\"labelPlaceholder\":\"Label...\"},\"uiNodeForm\":{\"label\":\"Label\",\"type\":\"Type\",\"typeDivider\":\"Divider\",\"typeTitle\":\"Title\"}}"),
172
+ renderer: {
173
+ defaultAddressInput: {
174
+ enterAddress: "Enter an address...",
175
+ noAddressesFound: "No addresses found.",
176
+ searching: "Searching...",
177
+ typeMinChars: "Type at least 3 characters to search"
178
+ },
179
+ defaultAutocompleteInput: {
180
+ noResults: "No results found.",
181
+ search: "Search...",
182
+ selectOption: "Select an option"
183
+ },
184
+ defaultCheckboxInput: { loadingOptions: "Loading options..." },
185
+ defaultHttpInput: {
186
+ fetchFailed: "Failed to fetch data. Please check your network connection.",
187
+ httpError: "HTTP Error {status}: {statusText}",
188
+ invalidJson: "The server response is not valid JSON. Check the URL, base URL and authentication.",
189
+ noDataAvailable: "No data available. Configure \"Fetch on mount\" or add a search parameter.",
190
+ noResults: "No results found.",
191
+ noUrlConfigured: "No URL configured. Please add a URL in the HTTP configuration.",
192
+ retry: "Retry",
193
+ search: "Search...",
194
+ searching: "Search...",
195
+ selectOption: "Select an option",
196
+ waitingForRequiredFields: "Waiting for required fields"
197
+ },
198
+ defaultInputs: {
199
+ addMoreFiles: "Add more files",
200
+ endDate: "End date",
201
+ endTime: "End time",
202
+ filePickerError: "Failed to select file",
203
+ filePickerUnavailable: "File selection unavailable. Please install react-native-document-picker.",
204
+ newAnswer: "New answer...",
205
+ removeFile: "Remove file",
206
+ replaceFile: "Replace file",
207
+ required: "*",
208
+ selectDate: "Select date",
209
+ selectDateRange: "Select date range",
210
+ selectFile: "Select file",
211
+ selectFiles: "Select files",
212
+ selectTime: "Select time",
213
+ selectTimeRange: "Select time range",
214
+ startDate: "Start date",
215
+ startTime: "Start time"
216
+ },
217
+ defaultRadioInput: { loadingOptions: "Loading options..." },
218
+ defaultSelectInput: { selectOption: "Select an option" },
219
+ defaultSubmitButton: {
220
+ requiredFieldsMissing: "Required fields missing",
221
+ submit: "Submit"
222
+ },
223
+ dependencyHint: { title: "Please fill in the following fields first:" },
224
+ step: {
225
+ back: "Back",
226
+ continue: "Continue"
227
+ }
228
+ },
229
+ validation: {
230
+ invalidFormat: "Invalid format",
231
+ required: "This field is required"
232
+ }
233
+ }, p = {
234
+ common: {
235
+ cancel: "Cancelar",
236
+ clear: "Limpiar",
237
+ close: "Cerrar",
238
+ create: "Crear",
239
+ delete: "Eliminar",
240
+ other: "Otro",
241
+ retry: "Reintentar",
242
+ save: "Guardar",
243
+ settings: "Configuración",
244
+ submit: "Enviar",
245
+ toggle: "Alternar"
246
+ },
247
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Agregar elemento\",\"authorize\":\"Authorize\",\"clear\":\"Limpiar\",\"clearSuccess\":\"¡Flujo limpiado!\",\"clearSuccessDesc\":\"Todos los nodos y aristas han sido eliminados.\",\"downloadSuccess\":\"Descarga exitosa.\",\"downloadSuccessDesc\":\"El flujo se ha exportado correctamente.\",\"exportJson\":\"Exportar JSON\",\"globalHeaders\":\"Global headers\",\"importJson\":\"Importar JSON\",\"importSuccess\":\"¡Importación exitosa!\",\"importSuccessDesc\":\"El flujo se ha importado correctamente.\",\"invalidJson\":\"Archivo JSON inválido.\",\"invalidJsonDesc\":\"El archivo debe contener matrices de nodos y aristas.\",\"language\":\"Idioma\",\"openApi\":\"OpenAPI\",\"parseError\":\"Error al analizar el archivo JSON.\",\"parseErrorDesc\":\"Intenta corregir el archivo e importarlo nuevamente.\",\"sensitiveHeadersStripped\":\"Encabezados sensibles eliminados\",\"sensitiveHeadersStrippedDesc\":\"Se eliminaron los encabezados de credenciales para evitar filtrar secretos.\"},\"aiGenerator\":{\"aiNotConfigured\":\"IA no configurada\",\"aiNotConfiguredDesc\":\"Agregue la prop {code} a TreegeEditor\",\"buttonLabel\":\"Generar con IA\",\"cancel\":\"Cancelar\",\"description\":\"Descripción\",\"descriptionPlaceholder\":\"Ejemplo: Crear un formulario de contacto con nombre, correo electrónico, teléfono y mensaje\",\"enterDescription\":\"Por favor ingrese una descripción\",\"failedToGenerate\":\"Error al generar el árbol\",\"generate\":\"Generar\",\"generating\":\"Generando...\",\"keyboardShortcut\":\"Presione {cmdEnter} o {ctrlEnter} para generar\",\"missingApiKey\":\"Falta configuración de IA\",\"missingApiKeyDesc\":\"Por favor configure su clave API de IA en TreegeEditor\",\"successDescription\":\"{nodes} nodos y {edges} aristas creados\",\"successTitle\":\"¡Árbol generado exitosamente!\",\"title\":\"Generar flujo con IA\",\"titleDescription\":\"Describa el formulario o árbol de decisión que desea crear, y la IA lo generará por usted.\",\"unknownError\":\"Error desconocido\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Anteponer la URL base\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"Usar una ruta relativa\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"Este nodo tiene varias ramas salientes. El nuevo tipo solo admite una. Elige qué rama conservar; las demás serán eliminadas.\",\"keepBranch\":\"Conservar esta rama\",\"noConditions\":\"Sin condiciones\",\"title\":\"Cambiar tipo de nodo\"},\"comboboxPattern\":{\"custom\":\"Personalizado: {value}\",\"search\":\"Buscar patrones...\",\"selectOrCreate\":\"Seleccionar o crear un patrón\",\"usePattern\":\"Usar patrón: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Limpiar selección\",\"noResults\":\"No se encontraron resultados\"},\"conditionalEdge\":{\"addCondition\":\"Agregar condición\",\"advanced\":\"Avanzado\",\"and\":\"Y\",\"basic\":\"Básico\",\"basicConditionLabel\":\"Si \\\"{name}\\\" es\",\"condition\":\"Condición\",\"conditions\":\"Condiciones\",\"conditionsAnd\":\"condiciones (Y)\",\"conditionsMixed\":\"condiciones (mixtas)\",\"conditionsOr\":\"condiciones (O)\",\"defineCondition\":\"Definir una condición\",\"displayConditions\":\"Mostrar condiciones\",\"displayConditionsDesc\":\"Este campo se mostrará si se cumplen las siguientes condiciones.\",\"fallback\":\"Predeterminado\",\"fallbackPath\":\"Ruta predeterminada / de respaldo\",\"fallbackPathDesc\":\"Esta ruta se seguirá cuando ninguna otra condición coincida\",\"field\":\"Campo\",\"labelDesc\":\"Etiqueta personalizada para el botón de condición\",\"labelOptional\":\"Etiqueta (opcional)\",\"labelPlaceholder\":\"Ej: Si es elegible\",\"noFieldsAvailable\":\"No hay campos disponibles\",\"operator\":\"Operador\",\"or\":\"O\",\"removeCondition\":\"Eliminar condición\",\"selectField\":\"Seleccionar un campo\",\"selectValue\":\"Seleccionar un valor\",\"value\":\"Valor\",\"valuePlaceholder\":\"Ej: 18\"},\"groupNodeForm\":{\"label\":\"Etiqueta\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Agregar encabezado\",\"addQueryParam\":\"Agregar parámetro\",\"apiUrl\":\"URL de la API\",\"apiUrlDesc\":\"Use variables de plantilla como {{fieldId}} para referenciar otros campos\",\"apiUrlPlaceholder\":\"https://api.ejemplo.com/data\",\"behavior\":\"Comportamiento\",\"fetchOnMount\":\"Cargar al montar\",\"headerName\":\"Nombre del encabezado\",\"headers\":\"Encabezados\",\"headerValue\":\"Valor del encabezado\",\"httpMethod\":\"Método HTTP\",\"insertVariable\":\"Insertar variable\",\"labelField\":\"Campo de etiqueta\",\"labelFieldDesc\":\"Campo a usar como etiqueta de opción (ej: nombre)\",\"labelFieldPlaceholder\":\"nombre\",\"mapToOptions\":\"Mapear a opciones\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"No hay campos disponibles\",\"queryParamName\":\"Nombre del parámetro\",\"queryParams\":\"Parámetros de consulta\",\"queryParamValue\":\"Valor del parámetro\",\"requestBody\":\"Cuerpo de la solicitud (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} para referenciar otros campos. Asegúrese de un formato JSON adecuado, incluyendo comillas alrededor de los valores de cadena.\",\"requestBodyPlaceholder\":\"{\\\"nombre\\\": \\\"{{nombreUsuario}}\\\", \\\"edad\\\": {{edadUsuario}}}\",\"responseConfiguration\":\"Configuración de respuesta\",\"responsePath\":\"Ruta de respuesta\",\"responsePathDesc\":\"Extraer datos de la respuesta usando notación de puntos o indexación de matriz\",\"responsePathPlaceholder\":\"data.users o results[0]\",\"searchParameter\":\"Parámetro de búsqueda (opcional)\",\"searchParameterDesc\":\"Si se configura, habilita un cuadro de búsqueda que agrega este parámetro a las llamadas API (ej: ?q=París)\",\"searchParameterPlaceholder\":\"q, buscar, consulta...\",\"selectMethod\":\"Seleccionar método\",\"sendAllFormValues\":\"Enviar todos los datos del formulario\",\"sendAllFormValuesDesc\":\"Enviar automáticamente todos los valores del formulario como cuerpo JSON\",\"showLoadingState\":\"Mostrar estado de carga\",\"valueField\":\"Campo de valor\",\"valueFieldDesc\":\"Campo a usar como valor de opción (ej: id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Agregue campos de entrada antes de este nodo para referenciarlos\",\"addMapping\":\"Agregar mapeo\",\"addOption\":\"Agregar opción\",\"advancedConfiguration\":\"Configuración avanzada\",\"defaultChecked\":\"Marcado por defecto\",\"defaultValuesCommaSeparated\":\"Valores predeterminados (separados por comas)\",\"defaultValuesPlaceholder\":\"valor1, valor2, valor3\",\"defaultValueType\":\"Tipo de valor predeterminado\",\"defaultValueTypeNone\":\"Ninguno\",\"defaultValueTypeReference\":\"Campo de referencia\",\"defaultValueTypeStatic\":\"Valor estático\",\"deleteOption\":\"Eliminar opción\",\"disablePast\":\"Desactivar fechas pasadas\",\"editOption\":\"Editar opción\",\"errorMessage\":\"Mensaje de error\",\"helperText\":\"Texto de ayuda\",\"httpConfiguration\":\"Configuración HTTP\",\"label\":\"Etiqueta\",\"multipleFiles\":\"Archivos múltiples\",\"multipleSelection\":\"Selección múltiple\",\"name\":\"Nombre\",\"nameDescription\":\"Nombre de campo personalizado opcional para la exportación del formulario. Si está vacío, la etiqueta se usará como clave.\",\"noParentFieldsAvailable\":\"No hay campos principales disponibles\",\"normalizeLabels\":\"Normalizar etiquetas\",\"normalizeLabelsHint\":\"Limpia las etiquetas que vienen de la API (p. ej. EN MAYÚSCULAS) a una forma uniforme y legible. Las opciones escritas a mano no se ven afectadas.\",\"objectMapping\":\"Mapeo de objetos\",\"objectMappingDesc\":\"Mapear las propiedades del objeto de origen a una nueva estructura\",\"optional\":\"Opcional\",\"optionDescription\":\"Descripción\",\"optionImageAdd\":\"Agregar imagen\",\"optionImageError\":\"No se pudo procesar la imagen.\",\"optionImageInvalid\":\"Formato de imagen no compatible.\",\"optionImageRemove\":\"Quitar imagen\",\"optionImageReplace\":\"Reemplazar imagen\",\"optionImageTooLarge\":\"Imagen demasiado grande (máx. 5 MB).\",\"optionImageUpload\":\"Subir archivo\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Etiqueta\",\"options\":\"Opciones\",\"optionValue\":\"Valor\",\"pattern\":\"Patrón\",\"placeholder\":\"Marcador de posición\",\"referenceField\":\"Campo de referencia\",\"required\":\"Obligatorio\",\"selectReferenceField\":\"Seleccionar un campo\",\"selectTransformation\":\"Seleccionar transformación\",\"selectType\":\"Seleccionar tipo\",\"sourceKey\":\"Clave de origen\",\"staticValue\":\"Valor estático\",\"staticValuePlaceholder\":\"Ingrese el valor predeterminado\",\"submitConfiguration\":\"Configuración de envío\",\"targetKey\":\"Clave de destino\",\"transformArray\":\"Convertir a matriz\",\"transformBoolean\":\"Convertir a booleano\",\"transformDesc\":\"Transformar el valor referenciado para que coincida con el tipo de este campo\",\"transformMapToObject\":\"Mapear a objeto\",\"transformNone\":\"Sin transformación\",\"transformNumber\":\"Convertir a número\",\"transformString\":\"Convertir a texto\",\"transformType\":\"Tipo de transformación\",\"validation\":\"Validación\",\"variant\":\"Variante\",\"variantCard\":\"Tarjeta\",\"variantDefault\":\"Predeterminado\"},\"jsonTemplate\":{\"hint\":\"Escribe o pega JSON y haz clic en una clave o valor para vincularlo a un campo — o escribe {{nombre_del_campo}} o {{id_del_campo}}.\",\"invalidJson\":\"JSON no válido — corrige la sintaxis para que la plantilla surta efecto.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Desvincular\"},\"multiSelectionPanel\":{\"clearSelection\":\"Borrar selección\",\"deleteSelected\":\"Eliminar nodos seleccionados\",\"nodesSelected\":\"nodos seleccionados\"},\"nodeActionsSheet\":{\"deleteNode\":\"Eliminar nodo\",\"deleteNodeConfirm\":\"¿Estás seguro de que quieres eliminar este nodo?\",\"deleteNodeSuccess\":\"Nodo eliminado exitosamente\",\"editNode\":\"Editar nodo\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"La solicitud aún contiene variables sin resolver. Reemplázalas por un valor de ejemplo estático para detectar y luego restáuralas.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"Esta solicitud usa variables dinámicas ({vars}) que no tienen valor en el editor. «Detectar campos» llama a la API tal cual, por lo que puede fallar. Reemplázalas temporalmente por un valor de ejemplo estático para detectar la respuesta y luego restaura las variables.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"Tipo\"},\"selectNodeGroup\":{\"createNewGroup\":\"Crear un nuevo grupo\",\"group\":\"Grupo\",\"groupAlreadyExists\":\"Este grupo ya existe\",\"groupAlreadyExistsDesc\":\"Use el selector para agregar el nodo a un grupo existente.\",\"groupCreated\":\"Grupo creado\",\"groupCreatedDesc\":\"El grupo \\\"{groupName}\\\" se ha creado correctamente.\",\"groupName\":\"Nombre del grupo\",\"groupNamePlaceholder\":\"Ej: Paso 1 - Información personal\",\"mixed\":\"Grupos mixtos\",\"newGroup\":\"Nuevo grupo\",\"newGroupDescription\":\"El grupo se creará alrededor del nodo seleccionado.\",\"noGroup\":\"Sin grupo\",\"renameGroup\":\"Renombrar grupo\"},\"selectNodeType\":{\"nodeType\":\"Tipo de nodo\",\"options\":{\"group\":\"Grupo\",\"input\":\"Pregunta\",\"ui\":\"Elemento de diseño\"}},\"sensitiveHeaderWarning\":{\"message\":\"Evite almacenar credenciales (Authorization, claves de API) en los encabezados del campo: se guardan en el árbol exportado. Use encabezados globales (Autorizar) para la autenticación.\"},\"stackedEdge\":{\"addNode\":\"Añadir un elemento\",\"createBranch\":\"Crear una rama\",\"insertNode\":\"Insertar un elemento aquí\"},\"stackOrder\":{\"moveDown\":\"Mover abajo\",\"moveUp\":\"Mover arriba\"},\"submitConfigForm\":{\"addHeader\":\"Agregar encabezado\",\"addQueryParam\":\"Agregar parámetro\",\"apiUrl\":\"URL de la API\",\"apiUrlDesc\":\"Use {{fieldId}} para referenciar otros campos\",\"apiUrlPlaceholder\":\"https://api.ejemplo.com/submit\",\"behavior\":\"Comportamiento\",\"errorMessage\":\"Mensaje de error\",\"errorMessageDesc\":\"Mensaje mostrado cuando falla el envío\",\"errorMessagePlaceholder\":\"Ocurrió un error. Por favor, intente nuevamente.\",\"fillFromApi\":\"Rellenar desde la API\",\"fillFromApiHint\":\"Rellena el payload desde el cuerpo de la solicitud de la ruta OpenAPI. Disponible cuando la URL coincide con una ruta que lo define.\",\"headerName\":\"Nombre del encabezado\",\"headers\":\"Encabezados\",\"headerValue\":\"Valor del encabezado\",\"httpMethod\":\"Método HTTP\",\"insertVariable\":\"Insertar variable\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"No hay campos disponibles\",\"payload\":\"Payload de salida (JSON)\",\"payloadDesc\":\"El payload entregado a onSubmit y, cuando se define una URL, enviado como cuerpo de la solicitud HTTP. Tiene prioridad sobre «Enviar todos los datos del formulario».\",\"postSubmission\":\"Después del envío\",\"queryParamName\":\"Nombre del parámetro\",\"queryParams\":\"Parámetros de consulta\",\"queryParamValue\":\"Valor del parámetro\",\"redirectUrl\":\"URL de redirección\",\"redirectUrlDesc\":\"URL a la que redirigir después de un envío exitoso\",\"redirectUrlPlaceholder\":\"/success o https://ejemplo.com/gracias\",\"requestBody\":\"Cuerpo de la solicitud (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} para referenciar otros campos. Asegúrese de un formato JSON adecuado, incluyendo comillas alrededor de los valores de cadena.\",\"requestBodyPlaceholder\":\"{\\\"nombre\\\": \\\"{{nombreUsuario}}\\\", \\\"email\\\": \\\"{{emailUsuario}}\\\"}\",\"selectMethod\":\"Seleccionar método\",\"sendAllFormValues\":\"Enviar todos los datos del formulario\",\"sendAllFormValuesDesc\":\"Enviar automáticamente todos los valores del formulario como cuerpo JSON\",\"showLoadingState\":\"Mostrar estado de carga\",\"successMessage\":\"Mensaje de éxito\",\"successMessageDesc\":\"Mensaje mostrado cuando el envío es exitoso\",\"successMessagePlaceholder\":\"¡Formulario enviado exitosamente!\"},\"treegeNode\":{\"labelPlaceholder\":\"Etiqueta...\"},\"uiNodeForm\":{\"label\":\"Etiqueta\",\"type\":\"Tipo\",\"typeDivider\":\"Divisor\",\"typeTitle\":\"Título\"}}"),
248
+ renderer: {
249
+ defaultAddressInput: {
250
+ enterAddress: "Ingrese una dirección...",
251
+ noAddressesFound: "No se encontraron direcciones.",
252
+ searching: "Buscando...",
253
+ typeMinChars: "Escribe al menos 3 caracteres para buscar"
254
+ },
255
+ defaultAutocompleteInput: {
256
+ noResults: "No se encontraron resultados.",
257
+ search: "Buscar...",
258
+ selectOption: "Seleccionar una opción"
259
+ },
260
+ defaultCheckboxInput: { loadingOptions: "Cargando opciones..." },
261
+ defaultHttpInput: {
262
+ fetchFailed: "Error al obtener los datos. Por favor, verifique su conexión de red.",
263
+ httpError: "Error HTTP {status}: {statusText}",
264
+ invalidJson: "La respuesta del servidor no es un JSON válido. Verifica la URL, la URL base y la autenticación.",
265
+ noDataAvailable: "No hay datos disponibles. Configure \"Cargar al montar\" o agregue un parámetro de búsqueda.",
266
+ noResults: "No se encontraron resultados.",
267
+ noUrlConfigured: "No hay URL configurada. Por favor, agregue una URL en la configuración HTTP.",
268
+ retry: "Reintentar",
269
+ search: "Buscar...",
270
+ searching: "Buscando...",
271
+ selectOption: "Seleccionar una opción",
272
+ waitingForRequiredFields: "Esperando campos requeridos"
273
+ },
274
+ defaultInputs: {
275
+ addMoreFiles: "Agregar más archivos",
276
+ endDate: "Fecha de fin",
277
+ endTime: "Hora de fin",
278
+ filePickerError: "Error al seleccionar archivo",
279
+ filePickerUnavailable: "Selección de archivos no disponible. Instale react-native-document-picker.",
280
+ newAnswer: "Nueva respuesta...",
281
+ removeFile: "Eliminar archivo",
282
+ replaceFile: "Reemplazar archivo",
283
+ required: "*",
284
+ selectDate: "Seleccionar fecha",
285
+ selectDateRange: "Seleccionar rango de fechas",
286
+ selectFile: "Seleccionar archivo",
287
+ selectFiles: "Seleccionar archivos",
288
+ selectTime: "Seleccionar hora",
289
+ selectTimeRange: "Seleccionar rango de horas",
290
+ startDate: "Fecha de inicio",
291
+ startTime: "Hora de inicio"
292
+ },
293
+ defaultRadioInput: { loadingOptions: "Cargando opciones..." },
294
+ defaultSelectInput: { selectOption: "Seleccionar una opción" },
295
+ defaultSubmitButton: {
296
+ requiredFieldsMissing: "Faltan campos obligatorios",
297
+ submit: "Enviar"
298
+ },
299
+ dependencyHint: { title: "Complete primero los siguientes campos:" },
300
+ step: {
301
+ back: "Atrás",
302
+ continue: "Continuar"
303
+ }
304
+ },
305
+ validation: {
306
+ invalidFormat: "Formato inválido",
307
+ required: "Este campo es obligatorio"
308
+ }
309
+ }, m = {
310
+ common: {
311
+ cancel: "Annuler",
312
+ clear: "Effacer",
313
+ close: "Fermer",
314
+ create: "Créer",
315
+ delete: "Supprimer",
316
+ other: "Autre",
317
+ retry: "Réessayer",
318
+ save: "Enregistrer",
319
+ settings: "Paramètres",
320
+ submit: "Soumettre",
321
+ toggle: "Basculer"
322
+ },
323
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Ajouter un élément\",\"authorize\":\"Autoriser\",\"clear\":\"Supprimer\",\"clearSuccess\":\"Flux vidé !\",\"clearSuccessDesc\":\"Tous les nœuds et arêtes ont été supprimés.\",\"downloadSuccess\":\"Téléchargement réussi.\",\"downloadSuccessDesc\":\"Le flux a été exporté avec succès.\",\"exportJson\":\"Exporter JSON\",\"globalHeaders\":\"Headers globaux\",\"importJson\":\"Importer JSON\",\"importSuccess\":\"Importation réussie !\",\"importSuccessDesc\":\"Le flux a été importé avec succès.\",\"invalidJson\":\"Fichier JSON invalide.\",\"invalidJsonDesc\":\"Le fichier doit contenir des tableaux de nœuds et d'arêtes.\",\"language\":\"Langue\",\"openApi\":\"OpenAPI\",\"parseError\":\"Erreur d'analyse du fichier JSON.\",\"parseErrorDesc\":\"Essayez de corriger le fichier et de l'importer à nouveau.\",\"sensitiveHeadersStripped\":\"En-têtes sensibles supprimés\",\"sensitiveHeadersStrippedDesc\":\"Les en-têtes d'identification ont été retirés pour éviter toute fuite de secrets.\"},\"aiGenerator\":{\"aiNotConfigured\":\"IA non configurée\",\"aiNotConfiguredDesc\":\"Ajoutez la prop {code} à TreegeEditor\",\"buttonLabel\":\"Générer avec l'IA\",\"cancel\":\"Annuler\",\"description\":\"Description\",\"descriptionPlaceholder\":\"Exemple : Créer un formulaire de contact avec nom, email, téléphone et message\",\"enterDescription\":\"Veuillez entrer une description\",\"failedToGenerate\":\"Échec de la génération de l'arbre\",\"generate\":\"Générer\",\"generating\":\"Génération...\",\"keyboardShortcut\":\"Appuyez sur {cmdEnter} ou {ctrlEnter} pour générer\",\"missingApiKey\":\"Configuration IA manquante\",\"missingApiKeyDesc\":\"Veuillez configurer votre clé API IA dans TreegeEditor\",\"successDescription\":\"{nodes} nœuds et {edges} arêtes créés\",\"successTitle\":\"Arbre généré avec succès !\",\"title\":\"Générer un flux avec l'IA\",\"titleDescription\":\"Décrivez le formulaire ou l'arbre de décision que vous souhaitez créer, et l'IA le générera pour vous.\",\"unknownError\":\"Erreur inconnue\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Préfixer avec l'URL de base\",\"browseRoutes\":\"Parcourir les routes OpenAPI\",\"noRoutes\":\"Aucune route correspondante\",\"searchRoutes\":\"Rechercher par méthode, chemin ou résumé\",\"useRelativePath\":\"Utiliser un chemin relatif\"},\"authorizeDialog\":{\"apiKeyLabel\":\"Clé d'API\",\"apply\":\"Appliquer\",\"bearerLabel\":\"Jeton Bearer\",\"clear\":\"Effacer\",\"description\":\"Authentifiez-vous auprès de l'API pour transmettre les identifiants à chaque requête émise par le formulaire.\",\"exchangeFailed\":\"Échec de l'obtention du token d'accès\",\"noSchemes\":\"Aucun schéma de sécurité supporté n'est déclaré dans ce document OpenAPI.\",\"oauth2PasswordLabel\":\"OAuth2 mot de passe\",\"passwordPlaceholder\":\"Mot de passe\",\"title\":\"Autoriser\",\"usernamePlaceholder\":\"Nom d'utilisateur\"},\"changeNodeTypeDialog\":{\"description\":\"Ce nœud possède plusieurs branches sortantes. Le nouveau type n'en supporte qu'une seule. Choisissez la branche à conserver ; les autres seront supprimées.\",\"keepBranch\":\"Conserver cette branche\",\"noConditions\":\"Aucune condition\",\"title\":\"Changer le type de nœud\"},\"comboboxPattern\":{\"custom\":\"Personnalisé : {value}\",\"search\":\"Rechercher des motifs...\",\"selectOrCreate\":\"Sélectionner ou créer un motif\",\"usePattern\":\"Utiliser le motif : {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Effacer la sélection\",\"noResults\":\"Aucun résultat trouvé\"},\"conditionalEdge\":{\"addCondition\":\"Ajouter une condition\",\"advanced\":\"Avancé\",\"and\":\"ET\",\"basic\":\"Simple\",\"basicConditionLabel\":\"Si \\\"{name}\\\" vaut\",\"condition\":\"Condition\",\"conditions\":\"Conditions\",\"conditionsAnd\":\"conditions (ET)\",\"conditionsMixed\":\"conditions (mixtes)\",\"conditionsOr\":\"conditions (OU)\",\"defineCondition\":\"Définir une condition\",\"displayConditions\":\"Afficher les conditions\",\"displayConditionsDesc\":\"Ce champ sera affiché si les conditions suivantes sont remplies.\",\"fallback\":\"Par défaut\",\"fallbackPath\":\"Chemin par défaut / de secours\",\"fallbackPathDesc\":\"Ce chemin sera suivi lorsqu'aucune autre condition ne correspond\",\"field\":\"Champ\",\"labelDesc\":\"Libellé personnalisé pour le bouton de condition\",\"labelOptional\":\"Libellé (optionnel)\",\"labelPlaceholder\":\"Ex : Si éligible\",\"noFieldsAvailable\":\"Aucun champ disponible\",\"operator\":\"Opérateur\",\"or\":\"OU\",\"removeCondition\":\"Supprimer la condition\",\"selectField\":\"Sélectionner un champ\",\"selectValue\":\"Sélectionner une valeur\",\"value\":\"Valeur\",\"valuePlaceholder\":\"Ex : 18\"},\"groupNodeForm\":{\"label\":\"Libellé\"},\"headersDialog\":{\"addHeader\":\"Ajouter un header\",\"description\":\"Ces headers sont transmis à chaque requête HTTP émise par le formulaire (inputs HTTP, submit, sources d'options). Les headers field-level avec la même clé prennent le dessus.\",\"empty\":\"Aucun header pour l'instant.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Supprimer le header\",\"title\":\"Headers globaux\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Ajouter un en-tête\",\"addQueryParam\":\"Ajouter un paramètre\",\"apiUrl\":\"URL de l'API\",\"apiUrlDesc\":\"Utilisez des variables de modèle comme {{fieldId}} pour référencer d'autres champs\",\"apiUrlPlaceholder\":\"https://api.exemple.com/data\",\"behavior\":\"Comportement\",\"fetchOnMount\":\"Charger au montage\",\"headerName\":\"Nom de l'en-tête\",\"headers\":\"En-têtes\",\"headerValue\":\"Valeur de l'en-tête\",\"httpMethod\":\"Méthode HTTP\",\"insertVariable\":\"Insérer une variable\",\"labelField\":\"Champ de libellé\",\"labelFieldDesc\":\"Champ à utiliser comme libellé d'option (ex : nom)\",\"labelFieldPlaceholder\":\"nom\",\"mapToOptions\":\"Mapper vers les options\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Aucun champ disponible\",\"queryParamName\":\"Nom du paramètre\",\"queryParams\":\"Paramètres de requête\",\"queryParamValue\":\"Valeur du paramètre\",\"requestBody\":\"Corps de la requête (JSON)\",\"requestBodyDesc\":\"Utilisez {{fieldId}} pour référencer d'autres champs. Assurez-vous d'un formatage JSON approprié, incluant les guillemets autour des valeurs de chaîne.\",\"requestBodyPlaceholder\":\"{\\\"nom\\\": \\\"{{nomUtilisateur}}\\\", \\\"age\\\": {{ageUtilisateur}}}\",\"responseConfiguration\":\"Configuration de la réponse\",\"responsePath\":\"Chemin de la réponse\",\"responsePathDesc\":\"Extraire les données de la réponse en utilisant la notation par points ou l'indexation de tableau\",\"responsePathPlaceholder\":\"data.users ou results[0]\",\"searchParameter\":\"Paramètre de recherche (optionnel)\",\"searchParameterDesc\":\"Si défini, active une zone de recherche qui ajoute ce paramètre aux appels API (ex : ?q=Paris)\",\"searchParameterPlaceholder\":\"q, recherche, requête...\",\"selectMethod\":\"Sélectionner une méthode\",\"sendAllFormValues\":\"Envoyer toutes les données du formulaire\",\"sendAllFormValuesDesc\":\"Envoyer automatiquement toutes les valeurs du formulaire en tant que corps JSON\",\"showLoadingState\":\"Afficher l'état de chargement\",\"valueField\":\"Champ de valeur\",\"valueFieldDesc\":\"Champ à utiliser comme valeur d'option (ex : id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Ajoutez des champs de saisie avant ce nœud pour les référencer\",\"addMapping\":\"Ajouter un mappage\",\"addOption\":\"Ajouter une option\",\"advancedConfiguration\":\"Configuration avancée\",\"defaultChecked\":\"Coché par défaut\",\"defaultValuesCommaSeparated\":\"Valeurs par défaut (séparées par des virgules)\",\"defaultValuesPlaceholder\":\"valeur1, valeur2, valeur3\",\"defaultValueType\":\"Type de valeur par défaut\",\"defaultValueTypeNone\":\"Aucun\",\"defaultValueTypeReference\":\"Champ de référence\",\"defaultValueTypeStatic\":\"Valeur statique\",\"deleteOption\":\"Supprimer l'option\",\"disablePast\":\"Désactiver les dates passées\",\"editOption\":\"Modifier l'option\",\"errorMessage\":\"Message d'erreur\",\"helperText\":\"Texte d'aide\",\"httpConfiguration\":\"Configuration HTTP\",\"label\":\"Libellé\",\"multipleFiles\":\"Fichiers multiples\",\"multipleSelection\":\"Sélection multiple\",\"name\":\"Nom\",\"nameDescription\":\"Nom de champ personnalisé optionnel pour l'export du formulaire. Si vide, le libellé sera utilisé comme clé.\",\"noParentFieldsAvailable\":\"Aucun champ parent disponible\",\"normalizeLabels\":\"Normaliser les libellés\",\"normalizeLabelsHint\":\"Nettoie les libellés venant de l'API (ex : EN MAJUSCULES) pour un rendu uniforme et lisible. Les options saisies à la main ne sont pas affectées.\",\"objectMapping\":\"Mappage d'objet\",\"objectMappingDesc\":\"Mapper les propriétés de l'objet source vers une nouvelle structure\",\"optional\":\"Optionnel\",\"optionDescription\":\"Description\",\"optionImageAdd\":\"Ajouter une image\",\"optionImageError\":\"Impossible de traiter l'image.\",\"optionImageInvalid\":\"Format d'image non pris en charge.\",\"optionImageRemove\":\"Retirer l'image\",\"optionImageReplace\":\"Remplacer l'image\",\"optionImageTooLarge\":\"Image trop volumineuse (max 5 Mo).\",\"optionImageUpload\":\"Importer un fichier\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Libellé\",\"options\":\"Options\",\"optionValue\":\"Valeur\",\"pattern\":\"Motif\",\"placeholder\":\"Texte indicatif\",\"referenceField\":\"Champ de référence\",\"required\":\"Requis\",\"selectReferenceField\":\"Sélectionner un champ\",\"selectTransformation\":\"Sélectionner une transformation\",\"selectType\":\"Sélectionner un type\",\"sourceKey\":\"Clé source\",\"staticValue\":\"Valeur statique\",\"staticValuePlaceholder\":\"Entrer une valeur par défaut\",\"submitConfiguration\":\"Configuration de soumission\",\"targetKey\":\"Clé cible\",\"transformArray\":\"Convertir en tableau\",\"transformBoolean\":\"Convertir en booléen\",\"transformDesc\":\"Transformer la valeur référencée pour correspondre au type de ce champ\",\"transformMapToObject\":\"Mapper vers un objet\",\"transformNone\":\"Aucune transformation\",\"transformNumber\":\"Convertir en nombre\",\"transformString\":\"Convertir en chaîne\",\"transformType\":\"Type de transformation\",\"validation\":\"Validation\",\"variant\":\"Variante\",\"variantCard\":\"Carte\",\"variantDefault\":\"Par défaut\"},\"jsonTemplate\":{\"hint\":\"Tapez ou collez du JSON, puis cliquez sur une clé ou une valeur pour la lier à un champ — ou tapez {{nom_du_champ}} ou {{id_du_champ}}.\",\"invalidJson\":\"JSON invalide — corrigez la syntaxe pour que le template s'applique.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Délier\"},\"multiSelectionPanel\":{\"clearSelection\":\"Effacer la sélection\",\"deleteSelected\":\"Supprimer les nœuds sélectionnés\",\"nodesSelected\":\"nœuds sélectionnés\"},\"nodeActionsSheet\":{\"deleteNode\":\"Supprimer le nœud\",\"deleteNodeConfirm\":\"Êtes-vous sûr de vouloir supprimer ce nœud ?\",\"deleteNodeSuccess\":\"Nœud supprimé avec succès\",\"editNode\":\"Modifier le nœud\"},\"openApiDialog\":{\"baseUrlHint\":\"Optionnel. Remplace l'URL du premier serveur du document — utile quand la spec pointe vers un autre environnement.\",\"baseUrlLabel\":\"Override de l'URL de base\",\"clear\":\"Effacer\",\"cleared\":\"OpenAPI effacé.\",\"description\":\"Fournissez un document OpenAPI 3.x pour activer les suggestions d'URL et l'autorisation.\",\"emptyInput\":\"Veuillez fournir une URL ou coller un document JSON.\",\"jsonLabel\":\"Collez votre OpenAPI JSON\",\"load\":\"Charger\",\"loadFailed\":\"Échec du chargement du document OpenAPI\",\"loadSuccess\":\"OpenAPI chargé.\",\"modeJson\":\"Coller JSON\",\"modeUrl\":\"Depuis URL\",\"title\":\"Source OpenAPI\",\"urlLabel\":\"URL du document OpenAPI\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Chemin vers la description (optionnel)\",\"detect\":\"Détecter les champs\",\"detectDynamicHint\":\"La requête contient encore des variables non résolues. Remplacez-les par une valeur d'exemple statique pour détecter, puis rétablissez-les.\",\"detectFailed\":\"Échec de la requête.\",\"detectSuccess\":\"Champs détectés.\",\"disable\":\"Utiliser des options statiques\",\"dynamicHint\":\"Les options sont récupérées depuis cette API au runtime.\",\"dynamicVarsWarning\":\"Cette requête utilise des variables dynamiques ({vars}) qui n'ont pas de valeur dans l'éditeur. « Détecter les champs » appelle l'API telle quelle et peut donc échouer. Remplacez-les temporairement par une valeur d'exemple statique pour détecter la réponse, puis rétablissez les variables.\",\"enable\":\"Récupérer depuis une API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Chemin vers l'URL de l'image (optionnel)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Chemin vers le label (ex. name)\",\"noFieldsDetected\":\"Aucun champ détecté — vérifiez l'URL ou le chemin de réponse.\",\"none\":\"— Aucun —\",\"previewCount\":\"{count} options détectées\",\"responsePath\":\"Chemin de réponse\",\"responsePathHint\":\"Optionnel. Utilisez un chemin comme \\\"data.users\\\" si le tableau est imbriqué.\",\"responsePathPlaceholder\":\"ex. data.users\",\"staticOptions\":\"Options statiques\",\"staticOptionsHint\":\"Les options sont définies manuellement dans l'éditeur.\",\"title\":\"Source des options\",\"urlRequired\":\"L'URL est requise.\",\"valueField\":\"Valeur\",\"valueFieldPlaceholder\":\"Chemin vers la valeur (ex. id)\"},\"selectInputType\":{\"type\":\"Type\"},\"selectNodeGroup\":{\"createNewGroup\":\"Créer un nouveau groupe\",\"group\":\"Groupe\",\"groupAlreadyExists\":\"Ce groupe existe déjà\",\"groupAlreadyExistsDesc\":\"Utilisez le sélecteur pour ajouter le nœud à un groupe existant.\",\"groupCreated\":\"Groupe créé\",\"groupCreatedDesc\":\"Le groupe \\\"{groupName}\\\" a été créé avec succès.\",\"groupName\":\"Nom du groupe\",\"groupNamePlaceholder\":\"Ex : Étape 1 - Informations personnelles\",\"mixed\":\"Groupes mixtes\",\"newGroup\":\"Nouveau groupe\",\"newGroupDescription\":\"Le groupe sera créé autour du nœud sélectionné.\",\"noGroup\":\"Aucun groupe\",\"renameGroup\":\"Renommer le groupe\"},\"selectNodeType\":{\"nodeType\":\"Type de nœud\",\"options\":{\"group\":\"Groupe\",\"input\":\"Question\",\"ui\":\"Élément de design\"}},\"sensitiveHeaderWarning\":{\"message\":\"Évitez de mettre des identifiants (Authorization, clés d'API) dans les en-têtes du champ : ils sont enregistrés dans l'arbre exporté. Utilisez plutôt les en-têtes globaux (Autoriser) pour l'authentification.\"},\"stackedEdge\":{\"addNode\":\"Ajouter un élément\",\"createBranch\":\"Créer une branche\",\"insertNode\":\"Insérer un élément ici\"},\"stackOrder\":{\"moveDown\":\"Déplacer vers le bas\",\"moveUp\":\"Déplacer vers le haut\"},\"submitConfigForm\":{\"addHeader\":\"Ajouter un en-tête\",\"addQueryParam\":\"Ajouter un paramètre\",\"apiUrl\":\"URL de l'API\",\"apiUrlDesc\":\"Utilisez {{fieldId}} pour référencer d'autres champs\",\"apiUrlPlaceholder\":\"https://api.exemple.com/submit\",\"behavior\":\"Comportement\",\"errorMessage\":\"Message d'erreur\",\"errorMessageDesc\":\"Message affiché en cas d'échec de la soumission\",\"errorMessagePlaceholder\":\"Une erreur s'est produite. Veuillez réessayer.\",\"fillFromApi\":\"Pré-remplir depuis l'API\",\"fillFromApiHint\":\"Pré-remplit le payload depuis le corps de requête de la route OpenAPI. Disponible quand l'URL correspond à une route qui en définit un.\",\"headerName\":\"Nom de l'en-tête\",\"headers\":\"En-têtes\",\"headerValue\":\"Valeur de l'en-tête\",\"httpMethod\":\"Méthode HTTP\",\"insertVariable\":\"Insérer une variable\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Aucun champ disponible\",\"payload\":\"Payload de sortie (JSON)\",\"payloadDesc\":\"La charge utile transmise à onSubmit et, si une URL est renseignée, envoyée comme corps de requête HTTP. Prioritaire sur « Envoyer toutes les données du formulaire ».\",\"postSubmission\":\"Après soumission\",\"queryParamName\":\"Nom du paramètre\",\"queryParams\":\"Paramètres de requête\",\"queryParamValue\":\"Valeur du paramètre\",\"redirectUrl\":\"URL de redirection\",\"redirectUrlDesc\":\"URL vers laquelle rediriger après une soumission réussie\",\"redirectUrlPlaceholder\":\"/success ou https://exemple.com/merci\",\"requestBody\":\"Corps de la requête (JSON)\",\"requestBodyDesc\":\"Utilisez {{fieldId}} pour référencer d'autres champs. Assurez-vous d'un formatage JSON approprié, incluant les guillemets autour des valeurs de chaîne.\",\"requestBodyPlaceholder\":\"{\\\"nom\\\": \\\"{{nomUtilisateur}}\\\", \\\"email\\\": \\\"{{emailUtilisateur}}\\\"}\",\"selectMethod\":\"Sélectionner une méthode\",\"sendAllFormValues\":\"Envoyer toutes les données du formulaire\",\"sendAllFormValuesDesc\":\"Envoyer automatiquement toutes les valeurs du formulaire en tant que corps JSON\",\"showLoadingState\":\"Afficher l'état de chargement\",\"successMessage\":\"Message de succès\",\"successMessageDesc\":\"Message affiché en cas de soumission réussie\",\"successMessagePlaceholder\":\"Formulaire soumis avec succès !\"},\"treegeNode\":{\"labelPlaceholder\":\"Libellé...\"},\"uiNodeForm\":{\"label\":\"Libellé\",\"type\":\"Type\",\"typeDivider\":\"Séparateur\",\"typeTitle\":\"Titre\"}}"),
324
+ renderer: {
325
+ defaultAddressInput: {
326
+ enterAddress: "Entrez une adresse...",
327
+ noAddressesFound: "Aucune adresse trouvée.",
328
+ searching: "Recherche...",
329
+ typeMinChars: "Tapez au moins 3 caractères pour rechercher"
330
+ },
331
+ defaultAutocompleteInput: {
332
+ noResults: "Aucun résultat trouvé.",
333
+ search: "Recherche...",
334
+ selectOption: "Sélectionner une option"
335
+ },
336
+ defaultCheckboxInput: { loadingOptions: "Chargement des options..." },
337
+ defaultHttpInput: {
338
+ fetchFailed: "Échec de la récupération des données. Veuillez vérifier votre connexion réseau.",
339
+ httpError: "Erreur HTTP {status} : {statusText}",
340
+ invalidJson: "La réponse du serveur n'est pas un JSON valide. Vérifiez l'URL, le baseUrl et l'authentification.",
341
+ noDataAvailable: "Aucune donnée disponible. Configurez \"Charger au montage\" ou ajoutez un paramètre de recherche.",
342
+ noResults: "Aucun résultat trouvé.",
343
+ noUrlConfigured: "Aucune URL configurée. Veuillez ajouter une URL dans la configuration HTTP.",
344
+ retry: "Réessayer",
345
+ search: "Recherche...",
346
+ searching: "Recherche...",
347
+ selectOption: "Sélectionner une option",
348
+ waitingForRequiredFields: "En attente des champs requis"
349
+ },
350
+ defaultInputs: {
351
+ addMoreFiles: "Ajouter plus de fichiers",
352
+ endDate: "Date de fin",
353
+ endTime: "Heure de fin",
354
+ filePickerError: "Échec de la sélection du fichier",
355
+ filePickerUnavailable: "Sélection de fichier indisponible. Veuillez installer react-native-document-picker.",
356
+ newAnswer: "Nouvelle réponse...",
357
+ removeFile: "Supprimer le fichier",
358
+ replaceFile: "Remplacer le fichier",
359
+ required: "*",
360
+ selectDate: "Sélectionner une date",
361
+ selectDateRange: "Sélectionner une plage de dates",
362
+ selectFile: "Sélectionner un fichier",
363
+ selectFiles: "Sélectionner des fichiers",
364
+ selectTime: "Sélectionner une heure",
365
+ selectTimeRange: "Sélectionner une plage horaire",
366
+ startDate: "Date de début",
367
+ startTime: "Heure de début"
368
+ },
369
+ defaultRadioInput: { loadingOptions: "Chargement des options..." },
370
+ defaultSelectInput: { selectOption: "Sélectionner une option" },
371
+ defaultSubmitButton: {
372
+ requiredFieldsMissing: "Champs requis manquants",
373
+ submit: "Envoyer"
374
+ },
375
+ dependencyHint: { title: "Veuillez d'abord remplir les champs suivants :" },
376
+ step: {
377
+ back: "Retour",
378
+ continue: "Continuer"
379
+ }
380
+ },
381
+ validation: {
382
+ invalidFormat: "Format invalide",
383
+ required: "Ce champ est requis"
384
+ }
385
+ }, h = {
386
+ common: {
387
+ cancel: "Annulla",
388
+ clear: "Cancella",
389
+ close: "Chiudi",
390
+ create: "Crea",
391
+ delete: "Elimina",
392
+ other: "Altro",
393
+ retry: "Riprova",
394
+ save: "Salva",
395
+ settings: "Impostazioni",
396
+ submit: "Invia",
397
+ toggle: "Attiva/Disattiva"
398
+ },
399
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Aggiungi elemento\",\"authorize\":\"Authorize\",\"clear\":\"Pulisci\",\"clearSuccess\":\"Flusso pulito!\",\"clearSuccessDesc\":\"Tutti i nodi e gli archi sono stati rimossi.\",\"downloadSuccess\":\"Download riuscito.\",\"downloadSuccessDesc\":\"Il flusso è stato esportato con successo.\",\"exportJson\":\"Esporta JSON\",\"globalHeaders\":\"Global headers\",\"importJson\":\"Importa JSON\",\"importSuccess\":\"Importazione riuscita!\",\"importSuccessDesc\":\"Il flusso è stato importato con successo.\",\"invalidJson\":\"File JSON non valido.\",\"invalidJsonDesc\":\"Il file deve contenere array di nodi e archi.\",\"language\":\"Lingua\",\"openApi\":\"OpenAPI\",\"parseError\":\"Errore nell'analisi del file JSON.\",\"parseErrorDesc\":\"Prova a correggere il file e importarlo di nuovo.\",\"sensitiveHeadersStripped\":\"Header sensibili rimossi\",\"sensitiveHeadersStrippedDesc\":\"Gli header con credenziali sono stati rimossi per evitare di esporre segreti.\"},\"aiGenerator\":{\"aiNotConfigured\":\"IA non configurata\",\"aiNotConfiguredDesc\":\"Aggiungi la prop {code} a TreegeEditor\",\"buttonLabel\":\"Genera con IA\",\"cancel\":\"Annulla\",\"description\":\"Descrizione\",\"descriptionPlaceholder\":\"Esempio: Crea un modulo di contatto con nome, email, telefono e messaggio\",\"enterDescription\":\"Inserisci una descrizione\",\"failedToGenerate\":\"Errore nella generazione dell'albero\",\"generate\":\"Genera\",\"generating\":\"Generazione...\",\"keyboardShortcut\":\"Premi {cmdEnter} o {ctrlEnter} per generare\",\"missingApiKey\":\"Configurazione IA mancante\",\"missingApiKeyDesc\":\"Configura la tua chiave API IA in TreegeEditor\",\"successDescription\":\"{nodes} nodi e {edges} archi creati\",\"successTitle\":\"Albero generato con successo!\",\"title\":\"Genera flusso con IA\",\"titleDescription\":\"Descrivi il modulo o l'albero decisionale che vuoi creare, e l'IA lo genererà per te.\",\"unknownError\":\"Errore sconosciuto\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Anteporre l'URL di base\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"Usa un percorso relativo\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"Questo nodo ha più rami in uscita. Il nuovo tipo ne supporta solo uno. Scegli quale ramo mantenere; gli altri verranno rimossi.\",\"keepBranch\":\"Mantieni questo ramo\",\"noConditions\":\"Nessuna condizione\",\"title\":\"Cambia tipo di nodo\"},\"comboboxPattern\":{\"custom\":\"Personalizzato: {value}\",\"search\":\"Cerca schemi...\",\"selectOrCreate\":\"Seleziona o crea uno schema\",\"usePattern\":\"Usa schema: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Cancella selezione\",\"noResults\":\"Nessun risultato trovato\"},\"conditionalEdge\":{\"addCondition\":\"Aggiungi condizione\",\"advanced\":\"Avanzato\",\"and\":\"E\",\"basic\":\"Base\",\"basicConditionLabel\":\"Se \\\"{name}\\\" è\",\"condition\":\"Condizione\",\"conditions\":\"Condizioni\",\"conditionsAnd\":\"condizioni (E)\",\"conditionsMixed\":\"condizioni (miste)\",\"conditionsOr\":\"condizioni (O)\",\"defineCondition\":\"Definisci una condizione\",\"displayConditions\":\"Mostra condizioni\",\"displayConditionsDesc\":\"Questo campo verrà mostrato se vengono soddisfatte le seguenti condizioni.\",\"fallback\":\"Predefinito\",\"fallbackPath\":\"Percorso predefinito / di fallback\",\"fallbackPathDesc\":\"Questo percorso verrà seguito quando nessun'altra condizione corrisponde\",\"field\":\"Campo\",\"labelDesc\":\"Etichetta personalizzata per il pulsante della condizione\",\"labelOptional\":\"Etichetta (opzionale)\",\"labelPlaceholder\":\"Es: Se idoneo\",\"noFieldsAvailable\":\"Nessun campo disponibile\",\"operator\":\"Operatore\",\"or\":\"O\",\"removeCondition\":\"Rimuovi condizione\",\"selectField\":\"Seleziona un campo\",\"selectValue\":\"Seleziona un valore\",\"value\":\"Valore\",\"valuePlaceholder\":\"Es: 18\"},\"groupNodeForm\":{\"label\":\"Etichetta\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Aggiungi intestazione\",\"addQueryParam\":\"Aggiungi parametro\",\"apiUrl\":\"URL API\",\"apiUrlDesc\":\"Usa variabili template come {{fieldId}} per riferire altri campi\",\"apiUrlPlaceholder\":\"https://api.esempio.com/data\",\"behavior\":\"Comportamento\",\"fetchOnMount\":\"Carica al montaggio\",\"headerName\":\"Nome intestazione\",\"headers\":\"Intestazioni\",\"headerValue\":\"Valore intestazione\",\"httpMethod\":\"Metodo HTTP\",\"insertVariable\":\"Inserisci variabile\",\"labelField\":\"Campo etichetta\",\"labelFieldDesc\":\"Campo da usare come etichetta dell'opzione (es: nome)\",\"labelFieldPlaceholder\":\"nome\",\"mapToOptions\":\"Mappa su opzioni\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Nessun campo disponibile\",\"queryParamName\":\"Nome parametro\",\"queryParams\":\"Parametri di query\",\"queryParamValue\":\"Valore parametro\",\"requestBody\":\"Corpo della richiesta (JSON)\",\"requestBodyDesc\":\"Usa {{fieldId}} per riferire altri campi. Assicurati che la formattazione JSON sia corretta, comprese le virgolette attorno ai valori stringa.\",\"requestBodyPlaceholder\":\"{\\\"nome\\\": \\\"{{nomeUtente}}\\\", \\\"eta\\\": {{etaUtente}}}\",\"responseConfiguration\":\"Configurazione della risposta\",\"responsePath\":\"Percorso della risposta\",\"responsePathDesc\":\"Estrai dati dalla risposta usando la notazione a punti o l'indicizzazione dell'array\",\"responsePathPlaceholder\":\"data.users o results[0]\",\"searchParameter\":\"Parametro di ricerca (opzionale)\",\"searchParameterDesc\":\"Se impostato, abilita una casella di ricerca che aggiunge questo parametro alle chiamate API (es: ?q=Parigi)\",\"searchParameterPlaceholder\":\"q, ricerca, query...\",\"selectMethod\":\"Seleziona metodo\",\"sendAllFormValues\":\"Invia tutti i dati del modulo\",\"sendAllFormValuesDesc\":\"Invia automaticamente tutti i valori del modulo come corpo JSON\",\"showLoadingState\":\"Mostra stato di caricamento\",\"valueField\":\"Campo valore\",\"valueFieldDesc\":\"Campo da usare come valore dell'opzione (es: id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Aggiungi campi di input prima di questo nodo per riferirli\",\"addMapping\":\"Aggiungi mappatura\",\"addOption\":\"Aggiungi opzione\",\"advancedConfiguration\":\"Configurazione avanzata\",\"defaultChecked\":\"Selezionato per impostazione predefinita\",\"defaultValuesCommaSeparated\":\"Valori predefiniti (separati da virgole)\",\"defaultValuesPlaceholder\":\"valore1, valore2, valore3\",\"defaultValueType\":\"Tipo di valore predefinito\",\"defaultValueTypeNone\":\"Nessuno\",\"defaultValueTypeReference\":\"Campo di riferimento\",\"defaultValueTypeStatic\":\"Valore statico\",\"deleteOption\":\"Elimina opzione\",\"disablePast\":\"Disabilita date passate\",\"editOption\":\"Modifica opzione\",\"errorMessage\":\"Messaggio di errore\",\"helperText\":\"Testo di aiuto\",\"httpConfiguration\":\"Configurazione HTTP\",\"label\":\"Etichetta\",\"multipleFiles\":\"File multipli\",\"multipleSelection\":\"Selezione multipla\",\"name\":\"Nome\",\"nameDescription\":\"Nome campo personalizzato opzionale per l'esportazione del modulo. Se vuoto, l'etichetta verrà utilizzata come chiave.\",\"noParentFieldsAvailable\":\"Nessun campo genitore disponibile\",\"normalizeLabels\":\"Normalizza le etichette\",\"normalizeLabelsHint\":\"Uniforma le etichette provenienti dall'API (es. TUTTO MAIUSCOLO) in una forma leggibile. Le opzioni inserite manualmente non vengono modificate.\",\"objectMapping\":\"Mappatura oggetto\",\"objectMappingDesc\":\"Mappa le proprietà dell'oggetto sorgente su una nuova struttura\",\"optional\":\"Opzionale\",\"optionDescription\":\"Descrizione\",\"optionImageAdd\":\"Aggiungi immagine\",\"optionImageError\":\"Impossibile elaborare l'immagine.\",\"optionImageInvalid\":\"Formato immagine non supportato.\",\"optionImageRemove\":\"Rimuovi immagine\",\"optionImageReplace\":\"Sostituisci immagine\",\"optionImageTooLarge\":\"Immagine troppo grande (max 5 MB).\",\"optionImageUpload\":\"Carica file\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Etichetta\",\"options\":\"Opzioni\",\"optionValue\":\"Valore\",\"pattern\":\"Schema\",\"placeholder\":\"Segnaposto\",\"referenceField\":\"Campo di riferimento\",\"required\":\"Obbligatorio\",\"selectReferenceField\":\"Seleziona un campo\",\"selectTransformation\":\"Seleziona trasformazione\",\"selectType\":\"Seleziona tipo\",\"sourceKey\":\"Chiave sorgente\",\"staticValue\":\"Valore statico\",\"staticValuePlaceholder\":\"Inserisci valore predefinito\",\"submitConfiguration\":\"Configurazione di invio\",\"targetKey\":\"Chiave destinazione\",\"transformArray\":\"Converti in array\",\"transformBoolean\":\"Converti in booleano\",\"transformDesc\":\"Trasforma il valore riferito per corrispondere al tipo di questo campo\",\"transformMapToObject\":\"Mappa su oggetto\",\"transformNone\":\"Nessuna trasformazione\",\"transformNumber\":\"Converti in numero\",\"transformString\":\"Converti in stringa\",\"transformType\":\"Tipo di trasformazione\",\"validation\":\"Validazione\",\"variant\":\"Variante\",\"variantCard\":\"Scheda\",\"variantDefault\":\"Predefinito\"},\"jsonTemplate\":{\"hint\":\"Scrivi o incolla il JSON, poi fai clic su una chiave o un valore per associarlo a un campo — oppure digita {{nome_campo}} o {{id_campo}}.\",\"invalidJson\":\"JSON non valido — correggi la sintassi affinché il template abbia effetto.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Dissocia\"},\"multiSelectionPanel\":{\"clearSelection\":\"Cancella selezione\",\"deleteSelected\":\"Elimina nodi selezionati\",\"nodesSelected\":\"nodi selezionati\"},\"nodeActionsSheet\":{\"deleteNode\":\"Elimina nodo\",\"deleteNodeConfirm\":\"Sei sicuro di voler eliminare questo nodo?\",\"deleteNodeSuccess\":\"Nodo eliminato con successo\",\"editNode\":\"Modifica nodo\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"La richiesta contiene ancora variabili non risolte. Sostituiscile con un valore di esempio statico per rilevare, poi ripristinale.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"Questa richiesta usa variabili dinamiche ({vars}) che non hanno valore nell'editor. «Rileva campi» chiama l'API così com'è, quindi può fallire. Sostituiscile temporaneamente con un valore di esempio statico per rilevare la risposta, poi ripristina le variabili.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"Tipo\"},\"selectNodeGroup\":{\"createNewGroup\":\"Crea un nuovo gruppo\",\"group\":\"Gruppo\",\"groupAlreadyExists\":\"Questo gruppo esiste già\",\"groupAlreadyExistsDesc\":\"Usa il selettore per aggiungere il nodo a un gruppo esistente.\",\"groupCreated\":\"Gruppo creato\",\"groupCreatedDesc\":\"Il gruppo \\\"{groupName}\\\" è stato creato con successo.\",\"groupName\":\"Nome del gruppo\",\"groupNamePlaceholder\":\"Es: Passo 1 - Informazioni personali\",\"mixed\":\"Gruppi misti\",\"newGroup\":\"Nuovo gruppo\",\"newGroupDescription\":\"Il gruppo verrà creato attorno al nodo selezionato.\",\"noGroup\":\"Nessun gruppo\",\"renameGroup\":\"Rinomina gruppo\"},\"selectNodeType\":{\"nodeType\":\"Tipo di nodo\",\"options\":{\"group\":\"Gruppo\",\"input\":\"Domanda\",\"ui\":\"Elemento di design\"}},\"sensitiveHeaderWarning\":{\"message\":\"Evita di inserire credenziali (Authorization, chiavi API) negli header del campo: vengono salvate nell'albero esportato. Usa invece gli header globali (Autorizza) per l'autenticazione.\"},\"stackedEdge\":{\"addNode\":\"Aggiungi un elemento\",\"createBranch\":\"Crea un ramo\",\"insertNode\":\"Inserisci un elemento qui\"},\"stackOrder\":{\"moveDown\":\"Sposta giù\",\"moveUp\":\"Sposta su\"},\"submitConfigForm\":{\"addHeader\":\"Aggiungi intestazione\",\"addQueryParam\":\"Aggiungi parametro\",\"apiUrl\":\"URL dell'API\",\"apiUrlDesc\":\"Usa {{fieldId}} per riferire altri campi\",\"apiUrlPlaceholder\":\"https://api.esempio.it/submit\",\"behavior\":\"Comportamento\",\"errorMessage\":\"Messaggio di errore\",\"errorMessageDesc\":\"Messaggio visualizzato quando l'invio fallisce\",\"errorMessagePlaceholder\":\"Si è verificato un errore. Riprova.\",\"fillFromApi\":\"Compila dall'API\",\"fillFromApiHint\":\"Compila il payload dal corpo della richiesta della rotta OpenAPI. Disponibile quando l'URL corrisponde a una rotta che ne definisce uno.\",\"headerName\":\"Nome intestazione\",\"headers\":\"Intestazioni\",\"headerValue\":\"Valore intestazione\",\"httpMethod\":\"Metodo HTTP\",\"insertVariable\":\"Inserisci variabile\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Nessun campo disponibile\",\"payload\":\"Payload di output (JSON)\",\"payloadDesc\":\"Il payload inviato a onSubmit e, se è impostata un'URL, come corpo della richiesta HTTP. Ha la precedenza su «Invia tutti i dati del modulo».\",\"postSubmission\":\"Dopo l'invio\",\"queryParamName\":\"Nome parametro\",\"queryParams\":\"Parametri di query\",\"queryParamValue\":\"Valore parametro\",\"redirectUrl\":\"URL di reindirizzamento\",\"redirectUrlDesc\":\"URL a cui reindirizzare dopo un invio riuscito\",\"redirectUrlPlaceholder\":\"/success o https://esempio.it/grazie\",\"requestBody\":\"Corpo della richiesta (JSON)\",\"requestBodyDesc\":\"Usa {{fieldId}} per riferire altri campi. Assicurati che la formattazione JSON sia corretta, comprese le virgolette attorno ai valori stringa.\",\"requestBodyPlaceholder\":\"{\\\"nome\\\": \\\"{{nomeUtente}}\\\", \\\"email\\\": \\\"{{emailUtente}}\\\"}\",\"selectMethod\":\"Seleziona metodo\",\"sendAllFormValues\":\"Invia tutti i dati del modulo\",\"sendAllFormValuesDesc\":\"Invia automaticamente tutti i valori del modulo come corpo JSON\",\"showLoadingState\":\"Mostra stato di caricamento\",\"successMessage\":\"Messaggio di successo\",\"successMessageDesc\":\"Messaggio visualizzato quando l'invio ha successo\",\"successMessagePlaceholder\":\"Modulo inviato con successo!\"},\"treegeNode\":{\"labelPlaceholder\":\"Etichetta...\"},\"uiNodeForm\":{\"label\":\"Etichetta\",\"type\":\"Tipo\",\"typeDivider\":\"Divisore\",\"typeTitle\":\"Titolo\"}}"),
400
+ renderer: {
401
+ defaultAddressInput: {
402
+ enterAddress: "Inserisci un indirizzo...",
403
+ noAddressesFound: "Nessun indirizzo trovato.",
404
+ searching: "Ricerca in corso...",
405
+ typeMinChars: "Digita almeno 3 caratteri per cercare"
406
+ },
407
+ defaultAutocompleteInput: {
408
+ noResults: "Nessun risultato trovato.",
409
+ search: "Cerca...",
410
+ selectOption: "Seleziona un'opzione"
411
+ },
412
+ defaultCheckboxInput: { loadingOptions: "Caricamento opzioni..." },
413
+ defaultHttpInput: {
414
+ fetchFailed: "Impossibile recuperare i dati. Controlla la tua connessione di rete.",
415
+ httpError: "Errore HTTP {status}: {statusText}",
416
+ invalidJson: "La risposta del server non è un JSON valido. Verifica l'URL, l'URL di base e l'autenticazione.",
417
+ noDataAvailable: "Nessun dato disponibile. Configura \"Carica al montaggio\" o aggiungi un parametro di ricerca.",
418
+ noResults: "Nessun risultato trovato.",
419
+ noUrlConfigured: "Nessun URL configurato. Aggiungi un URL nella configurazione HTTP.",
420
+ retry: "Riprova",
421
+ search: "Cerca...",
422
+ searching: "Ricerca in corso...",
423
+ selectOption: "Seleziona un'opzione",
424
+ waitingForRequiredFields: "In attesa dei campi richiesti"
425
+ },
426
+ defaultInputs: {
427
+ addMoreFiles: "Aggiungi altri file",
428
+ endDate: "Data di fine",
429
+ endTime: "Ora di fine",
430
+ filePickerError: "Errore nella selezione del file",
431
+ filePickerUnavailable: "Selezione file non disponibile. Installare react-native-document-picker.",
432
+ newAnswer: "Nuova risposta...",
433
+ removeFile: "Rimuovi file",
434
+ replaceFile: "Sostituisci file",
435
+ required: "*",
436
+ selectDate: "Seleziona data",
437
+ selectDateRange: "Seleziona intervallo di date",
438
+ selectFile: "Seleziona file",
439
+ selectFiles: "Seleziona file",
440
+ selectTime: "Seleziona ora",
441
+ selectTimeRange: "Seleziona intervallo di orari",
442
+ startDate: "Data di inizio",
443
+ startTime: "Ora di inizio"
444
+ },
445
+ defaultRadioInput: { loadingOptions: "Caricamento opzioni..." },
446
+ defaultSelectInput: { selectOption: "Seleziona un'opzione" },
447
+ defaultSubmitButton: {
448
+ requiredFieldsMissing: "Campi obbligatori mancanti",
449
+ submit: "Invia"
450
+ },
451
+ dependencyHint: { title: "Compila prima i seguenti campi:" },
452
+ step: {
453
+ back: "Indietro",
454
+ continue: "Continua"
455
+ }
456
+ },
457
+ validation: {
458
+ invalidFormat: "Formato non valido",
459
+ required: "Questo campo è obbligatorio"
460
+ }
461
+ }, ee = {
462
+ common: {
463
+ cancel: "Cancelar",
464
+ clear: "Limpar",
465
+ close: "Fechar",
466
+ create: "Criar",
467
+ delete: "Excluir",
468
+ other: "Outro",
469
+ retry: "Tentar novamente",
470
+ save: "Salvar",
471
+ settings: "Configurações",
472
+ submit: "Enviar",
473
+ toggle: "Alternar"
474
+ },
475
+ editor: /* @__PURE__ */ JSON.parse("{\"actionsPanel\":{\"addNode\":\"Adicionar elemento\",\"authorize\":\"Authorize\",\"clear\":\"Limpar\",\"clearSuccess\":\"Fluxo limpo!\",\"clearSuccessDesc\":\"Todos os nós e arestas foram removidos.\",\"downloadSuccess\":\"Download bem-sucedido.\",\"downloadSuccessDesc\":\"O fluxo foi exportado com sucesso.\",\"exportJson\":\"Exportar JSON\",\"globalHeaders\":\"Global headers\",\"importJson\":\"Importar JSON\",\"importSuccess\":\"Importação bem-sucedida!\",\"importSuccessDesc\":\"O fluxo foi importado com sucesso.\",\"invalidJson\":\"Arquivo JSON inválido.\",\"invalidJsonDesc\":\"O arquivo deve conter arrays de nós e arestas.\",\"language\":\"Idioma\",\"openApi\":\"OpenAPI\",\"parseError\":\"Erro ao analisar o arquivo JSON.\",\"parseErrorDesc\":\"Tente corrigir o arquivo e importá-lo novamente.\",\"sensitiveHeadersStripped\":\"Cabeçalhos sensíveis removidos\",\"sensitiveHeadersStrippedDesc\":\"Os cabeçalhos de credenciais foram removidos para evitar o vazamento de segredos.\"},\"aiGenerator\":{\"aiNotConfigured\":\"IA não configurada\",\"aiNotConfiguredDesc\":\"Adicione a prop {code} ao TreegeEditor\",\"buttonLabel\":\"Gerar com IA\",\"cancel\":\"Cancelar\",\"description\":\"Descrição\",\"descriptionPlaceholder\":\"Exemplo: Criar um formulário de contato com nome, email, telefone e mensagem\",\"enterDescription\":\"Por favor insira uma descrição\",\"failedToGenerate\":\"Falha ao gerar árvore\",\"generate\":\"Gerar\",\"generating\":\"Gerando...\",\"keyboardShortcut\":\"Pressione {cmdEnter} ou {ctrlEnter} para gerar\",\"missingApiKey\":\"Configuração de IA ausente\",\"missingApiKeyDesc\":\"Por favor configure sua chave API de IA no TreegeEditor\",\"successDescription\":\"{nodes} nós e {edges} arestas criados\",\"successTitle\":\"Árvore gerada com sucesso!\",\"title\":\"Gerar fluxo com IA\",\"titleDescription\":\"Descreva o formulário ou árvore de decisão que deseja criar, e a IA irá gerá-lo para você.\",\"unknownError\":\"Erro desconhecido\"},\"apiUrlCombobox\":{\"applyBaseUrl\":\"Adicionar a URL base\",\"browseRoutes\":\"Browse OpenAPI routes\",\"noRoutes\":\"No matching route\",\"searchRoutes\":\"Search by method, path, or summary\",\"useRelativePath\":\"Usar um caminho relativo\"},\"authorizeDialog\":{\"apiKeyLabel\":\"API key\",\"apply\":\"Apply\",\"bearerLabel\":\"Bearer token\",\"clear\":\"Clear\",\"description\":\"Authenticate against the API to forward credentials to every request issued by the form.\",\"exchangeFailed\":\"Failed to fetch access token\",\"noSchemes\":\"No supported security schemes are declared in this OpenAPI document.\",\"oauth2PasswordLabel\":\"OAuth2 password\",\"passwordPlaceholder\":\"Password\",\"title\":\"Authorize\",\"usernamePlaceholder\":\"Username\"},\"changeNodeTypeDialog\":{\"description\":\"Este nó possui várias ramificações de saída. O novo tipo suporta apenas uma. Escolha qual ramificação manter; as outras serão removidas.\",\"keepBranch\":\"Manter esta ramificação\",\"noConditions\":\"Sem condições\",\"title\":\"Alterar tipo de nó\"},\"comboboxPattern\":{\"custom\":\"Personalizado: {value}\",\"search\":\"Pesquisar padrões...\",\"selectOrCreate\":\"Selecionar ou criar um padrão\",\"usePattern\":\"Usar padrão: {query}\"},\"comboboxWithCreate\":{\"clearSelection\":\"Limpar seleção\",\"noResults\":\"Nenhum resultado encontrado\"},\"conditionalEdge\":{\"addCondition\":\"Adicionar condição\",\"advanced\":\"Avançado\",\"and\":\"E\",\"basic\":\"Básico\",\"basicConditionLabel\":\"Se \\\"{name}\\\" for igual a\",\"condition\":\"Condição\",\"conditions\":\"Condições\",\"conditionsAnd\":\"condições (E)\",\"conditionsMixed\":\"condições (mistas)\",\"conditionsOr\":\"condições (OU)\",\"defineCondition\":\"Definir uma condição\",\"displayConditions\":\"Exibir condições\",\"displayConditionsDesc\":\"Este campo será exibido se as seguintes condições forem atendidas.\",\"fallback\":\"Padrão\",\"fallbackPath\":\"Caminho padrão / de fallback\",\"fallbackPathDesc\":\"Este caminho será seguido quando nenhuma outra condição corresponder\",\"field\":\"Campo\",\"labelDesc\":\"Rótulo personalizado para o botão de condição\",\"labelOptional\":\"Rótulo (opcional)\",\"labelPlaceholder\":\"Ex: Se elegível\",\"noFieldsAvailable\":\"Nenhum campo disponível\",\"operator\":\"Operador\",\"or\":\"OU\",\"removeCondition\":\"Remover condição\",\"selectField\":\"Selecione um campo\",\"selectValue\":\"Selecione um valor\",\"value\":\"Valor\",\"valuePlaceholder\":\"Ex: 18\"},\"groupNodeForm\":{\"label\":\"Rótulo\"},\"headersDialog\":{\"addHeader\":\"Add header\",\"description\":\"These headers are forwarded to every HTTP request issued by the form (HTTP inputs, submit, options sources). Field-level headers with the same key override these.\",\"empty\":\"No headers yet.\",\"keyPlaceholder\":\"Authorization\",\"removeHeader\":\"Remove header\",\"title\":\"Global headers\",\"valuePlaceholder\":\"Bearer ...\"},\"httpConfigForm\":{\"addHeader\":\"Adicionar cabeçalho\",\"addQueryParam\":\"Adicionar parâmetro\",\"apiUrl\":\"URL da API\",\"apiUrlDesc\":\"Use variáveis de modelo como {{fieldId}} para referenciar outros campos\",\"apiUrlPlaceholder\":\"https://api.exemplo.com/data\",\"behavior\":\"Comportamento\",\"fetchOnMount\":\"Buscar na montagem\",\"headerName\":\"Nome do cabeçalho\",\"headers\":\"Cabeçalhos\",\"headerValue\":\"Valor do cabeçalho\",\"httpMethod\":\"Método HTTP\",\"insertVariable\":\"Inserir variável\",\"labelField\":\"Campo de rótulo\",\"labelFieldDesc\":\"Campo a ser usado como rótulo da opção (ex: nome)\",\"labelFieldPlaceholder\":\"nome\",\"mapToOptions\":\"Mapear para opções\",\"methodDelete\":\"DELETE\",\"methodGet\":\"GET\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Nenhum campo disponível\",\"queryParamName\":\"Nome do parâmetro\",\"queryParams\":\"Parâmetros de consulta\",\"queryParamValue\":\"Valor do parâmetro\",\"requestBody\":\"Corpo da requisição (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} para referenciar outros campos. Certifique-se de que a formatação JSON está correta, incluindo aspas ao redor de valores de string.\",\"requestBodyPlaceholder\":\"{\\\"nome\\\": \\\"{{nomeUsuario}}\\\", \\\"idade\\\": {{idadeUsuario}}}\",\"responseConfiguration\":\"Configuração da resposta\",\"responsePath\":\"Caminho da resposta\",\"responsePathDesc\":\"Extrair dados da resposta usando notação de ponto ou indexação de array\",\"responsePathPlaceholder\":\"data.users ou results[0]\",\"searchParameter\":\"Parâmetro de pesquisa (opcional)\",\"searchParameterDesc\":\"Se definido, habilita uma caixa de pesquisa que adiciona este parâmetro às chamadas de API (ex: ?q=Paris)\",\"searchParameterPlaceholder\":\"q, pesquisa, consulta...\",\"selectMethod\":\"Selecionar método\",\"sendAllFormValues\":\"Enviar todos os dados do formulário\",\"sendAllFormValuesDesc\":\"Enviar automaticamente todos os valores do formulário como corpo JSON\",\"showLoadingState\":\"Mostrar estado de carregamento\",\"valueField\":\"Campo de valor\",\"valueFieldDesc\":\"Campo a ser usado como valor da opção (ex: id)\",\"valueFieldPlaceholder\":\"id\"},\"inputNodeForm\":{\"addInputFieldsBeforeReference\":\"Adicione campos de entrada antes deste nó para referenciá-los\",\"addMapping\":\"Adicionar mapeamento\",\"addOption\":\"Adicionar opção\",\"advancedConfiguration\":\"Configuração avançada\",\"defaultChecked\":\"Marcado por padrão\",\"defaultValuesCommaSeparated\":\"Valores padrão (separados por vírgulas)\",\"defaultValuesPlaceholder\":\"valor1, valor2, valor3\",\"defaultValueType\":\"Tipo de valor padrão\",\"defaultValueTypeNone\":\"Nenhum\",\"defaultValueTypeReference\":\"Campo de referência\",\"defaultValueTypeStatic\":\"Valor estático\",\"deleteOption\":\"Excluir opção\",\"disablePast\":\"Desativar datas passadas\",\"editOption\":\"Editar opção\",\"errorMessage\":\"Mensagem de erro\",\"helperText\":\"Texto de ajuda\",\"httpConfiguration\":\"Configuração HTTP\",\"label\":\"Rótulo\",\"multipleFiles\":\"Arquivos múltiplos\",\"multipleSelection\":\"Seleção múltipla\",\"name\":\"Nome\",\"nameDescription\":\"Nome de campo personalizado opcional para exportação de formulário. Se vazio, o rótulo será usado como chave.\",\"noParentFieldsAvailable\":\"Nenhum campo pai disponível\",\"normalizeLabels\":\"Normalizar rótulos\",\"normalizeLabelsHint\":\"Limpa os rótulos vindos da API (ex.: MAIÚSCULAS) para um formato uniforme e legível. As opções digitadas manualmente não são afetadas.\",\"objectMapping\":\"Mapeamento de objeto\",\"objectMappingDesc\":\"Mapear as propriedades do objeto de origem para uma nova estrutura\",\"optional\":\"Opcional\",\"optionDescription\":\"Descrição\",\"optionImageAdd\":\"Adicionar imagem\",\"optionImageError\":\"Não foi possível processar a imagem.\",\"optionImageInvalid\":\"Formato de imagem não suportado.\",\"optionImageRemove\":\"Remover imagem\",\"optionImageReplace\":\"Substituir imagem\",\"optionImageTooLarge\":\"Imagem muito grande (máx. 5 MB).\",\"optionImageUpload\":\"Enviar arquivo\",\"optionImageUrlPlaceholder\":\"https://...\",\"optionLabel\":\"Rótulo\",\"options\":\"Opções\",\"optionValue\":\"Valor\",\"pattern\":\"Padrão\",\"placeholder\":\"Espaço reservado\",\"referenceField\":\"Campo de referência\",\"required\":\"Obrigatório\",\"selectReferenceField\":\"Selecione um campo\",\"selectTransformation\":\"Selecionar transformação\",\"selectType\":\"Selecionar tipo\",\"sourceKey\":\"Chave de origem\",\"staticValue\":\"Valor estático\",\"staticValuePlaceholder\":\"Digite o valor padrão\",\"submitConfiguration\":\"Configuração de envio\",\"targetKey\":\"Chave de destino\",\"transformArray\":\"Converter para array\",\"transformBoolean\":\"Converter para booleano\",\"transformDesc\":\"Transformar o valor referenciado para corresponder ao tipo deste campo\",\"transformMapToObject\":\"Mapear para objeto\",\"transformNone\":\"Sem transformação\",\"transformNumber\":\"Converter para número\",\"transformString\":\"Converter para string\",\"transformType\":\"Tipo de transformação\",\"validation\":\"Validação\",\"variant\":\"Variante\",\"variantCard\":\"Cartão\",\"variantDefault\":\"Padrão\"},\"jsonTemplate\":{\"hint\":\"Digite ou cole o JSON e clique em uma chave ou valor para vinculá-lo a um campo — ou digite {{nome_do_campo}} ou {{id_do_campo}}.\",\"invalidJson\":\"JSON inválido — corrija a sintaxe para o template ter efeito.\",\"placeholder\":\"{\\n \\\"data\\\": {\\n \\\"name\\\": \\\"{{firstName}}\\\",\\n \\\"age\\\": \\\"{{age}}\\\"\\n }\\n}\",\"unbind\":\"Desvincular\"},\"multiSelectionPanel\":{\"clearSelection\":\"Limpar seleção\",\"deleteSelected\":\"Excluir nós selecionados\",\"nodesSelected\":\"nós selecionados\"},\"nodeActionsSheet\":{\"deleteNode\":\"Excluir nó\",\"deleteNodeConfirm\":\"Tem certeza de que deseja excluir este nó?\",\"deleteNodeSuccess\":\"Nó excluído com sucesso\",\"editNode\":\"Editar nó\"},\"openApiDialog\":{\"baseUrlHint\":\"Optional. Overrides the document's first server URL — useful when the spec points at a different environment.\",\"baseUrlLabel\":\"Base URL override\",\"clear\":\"Clear\",\"cleared\":\"OpenAPI cleared.\",\"description\":\"Provide an OpenAPI 3.x document to power URL suggestions and Authorize.\",\"emptyInput\":\"Please provide a URL or paste a JSON document.\",\"jsonLabel\":\"Paste your OpenAPI JSON\",\"load\":\"Load\",\"loadFailed\":\"Failed to load OpenAPI document\",\"loadSuccess\":\"OpenAPI loaded.\",\"modeJson\":\"Paste JSON\",\"modeUrl\":\"From URL\",\"title\":\"OpenAPI source\",\"urlLabel\":\"OpenAPI document URL\"},\"optionsSourceForm\":{\"descriptionField\":\"Description\",\"descriptionFieldPlaceholder\":\"Path to description (optional)\",\"detect\":\"Detect fields\",\"detectDynamicHint\":\"A requisição ainda contém variáveis não resolvidas. Substitua-as por um valor de exemplo estático para detectar e depois restaure-as.\",\"detectFailed\":\"Failed to fetch the API.\",\"detectSuccess\":\"Fields detected.\",\"disable\":\"Use static options\",\"dynamicHint\":\"Options are fetched from this API at runtime.\",\"dynamicVarsWarning\":\"Esta requisição usa variáveis dinâmicas ({vars}) que não têm valor no editor. «Detectar campos» chama a API como está, portanto pode falhar. Substitua-as temporariamente por um valor de exemplo estático para detectar a resposta e depois restaure as variáveis.\",\"enable\":\"Fetch from API\",\"imageField\":\"Image\",\"imageFieldPlaceholder\":\"Path to image URL (optional)\",\"labelField\":\"Label\",\"labelFieldPlaceholder\":\"Path to label (e.g., name)\",\"noFieldsDetected\":\"No fields detected — check the URL or response path.\",\"none\":\"— None —\",\"previewCount\":\"{count} options detected\",\"responsePath\":\"Response path\",\"responsePathHint\":\"Optional. Use a path like \\\"data.users\\\" if the array is nested.\",\"responsePathPlaceholder\":\"e.g., data.users\",\"staticOptions\":\"Static options\",\"staticOptionsHint\":\"Options are defined manually in the editor.\",\"title\":\"Options source\",\"urlRequired\":\"URL is required.\",\"valueField\":\"Value\",\"valueFieldPlaceholder\":\"Path to value (e.g., id)\"},\"selectInputType\":{\"type\":\"Tipo\"},\"selectNodeGroup\":{\"createNewGroup\":\"Criar um novo grupo\",\"group\":\"Grupo\",\"groupAlreadyExists\":\"Este grupo já existe\",\"groupAlreadyExistsDesc\":\"Use o seletor para adicionar o nó a um grupo existente.\",\"groupCreated\":\"Grupo criado\",\"groupCreatedDesc\":\"O grupo \\\"{groupName}\\\" foi criado com sucesso.\",\"groupName\":\"Nome do grupo\",\"groupNamePlaceholder\":\"Ex: Passo 1 - Informações pessoais\",\"mixed\":\"Grupos mistos\",\"newGroup\":\"Novo grupo\",\"newGroupDescription\":\"O grupo será criado em torno do nó selecionado.\",\"noGroup\":\"Sem grupo\",\"renameGroup\":\"Renomear grupo\"},\"selectNodeType\":{\"nodeType\":\"Tipo de nó\",\"options\":{\"group\":\"Grupo\",\"input\":\"Pergunta\",\"ui\":\"Elemento de design\"}},\"sensitiveHeaderWarning\":{\"message\":\"Evite armazenar credenciais (Authorization, chaves de API) nos cabeçalhos do campo: elas são salvas na árvore exportada. Use cabeçalhos globais (Autorizar) para autenticação.\"},\"stackedEdge\":{\"addNode\":\"Adicionar um elemento\",\"createBranch\":\"Criar uma ramificação\",\"insertNode\":\"Inserir um elemento aqui\"},\"stackOrder\":{\"moveDown\":\"Mover para baixo\",\"moveUp\":\"Mover para cima\"},\"submitConfigForm\":{\"addHeader\":\"Adicionar cabeçalho\",\"addQueryParam\":\"Adicionar parâmetro\",\"apiUrl\":\"URL da API\",\"apiUrlDesc\":\"Use {{fieldId}} para referenciar outros campos\",\"apiUrlPlaceholder\":\"https://api.exemplo.com/submit\",\"behavior\":\"Comportamento\",\"errorMessage\":\"Mensagem de erro\",\"errorMessageDesc\":\"Mensagem exibida quando o envio falha\",\"errorMessagePlaceholder\":\"Ocorreu um erro. Por favor, tente novamente.\",\"fillFromApi\":\"Preencher a partir da API\",\"fillFromApiHint\":\"Preenche o payload a partir do corpo da requisição da rota OpenAPI. Disponível quando a URL corresponde a uma rota que define um.\",\"headerName\":\"Nome do cabeçalho\",\"headers\":\"Cabeçalhos\",\"headerValue\":\"Valor do cabeçalho\",\"httpMethod\":\"Método HTTP\",\"insertVariable\":\"Inserir variável\",\"methodDelete\":\"DELETE\",\"methodPatch\":\"PATCH\",\"methodPost\":\"POST\",\"methodPut\":\"PUT\",\"noFieldsAvailable\":\"Nenhum campo disponível\",\"payload\":\"Payload de saída (JSON)\",\"payloadDesc\":\"O payload entregue ao onSubmit e, quando uma URL está definida, enviado como corpo da requisição HTTP. Tem precedência sobre «Enviar todos os dados do formulário».\",\"postSubmission\":\"Após o envio\",\"queryParamName\":\"Nome do parâmetro\",\"queryParams\":\"Parâmetros de consulta\",\"queryParamValue\":\"Valor do parâmetro\",\"redirectUrl\":\"URL de redirecionamento\",\"redirectUrlDesc\":\"URL para redirecionar após envio bem-sucedido\",\"redirectUrlPlaceholder\":\"/success ou https://exemplo.com/obrigado\",\"requestBody\":\"Corpo da requisição (JSON)\",\"requestBodyDesc\":\"Use {{fieldId}} para referenciar outros campos. Certifique-se de que a formatação JSON está correta, incluindo aspas ao redor de valores de string.\",\"requestBodyPlaceholder\":\"{\\\"nome\\\": \\\"{{nomeUsuario}}\\\", \\\"email\\\": \\\"{{emailUsuario}}\\\"}\",\"selectMethod\":\"Selecionar método\",\"sendAllFormValues\":\"Enviar todos os dados do formulário\",\"sendAllFormValuesDesc\":\"Enviar automaticamente todos os valores do formulário como corpo JSON\",\"showLoadingState\":\"Mostrar estado de carregamento\",\"successMessage\":\"Mensagem de sucesso\",\"successMessageDesc\":\"Mensagem exibida quando o envio é bem-sucedido\",\"successMessagePlaceholder\":\"Formulário enviado com sucesso!\"},\"treegeNode\":{\"labelPlaceholder\":\"Rótulo...\"},\"uiNodeForm\":{\"label\":\"Rótulo\",\"type\":\"Tipo\",\"typeDivider\":\"Divisor\",\"typeTitle\":\"Título\"}}"),
476
+ renderer: {
477
+ defaultAddressInput: {
478
+ enterAddress: "Digite um endereço...",
479
+ noAddressesFound: "Nenhum endereço encontrado.",
480
+ searching: "Pesquisando...",
481
+ typeMinChars: "Digite pelo menos 3 caracteres para pesquisar"
482
+ },
483
+ defaultAutocompleteInput: {
484
+ noResults: "Nenhum resultado encontrado.",
485
+ search: "Pesquisar...",
486
+ selectOption: "Selecione uma opção"
487
+ },
488
+ defaultCheckboxInput: { loadingOptions: "Carregando opções..." },
489
+ defaultHttpInput: {
490
+ fetchFailed: "Falha ao buscar dados. Por favor, verifique sua conexão de rede.",
491
+ httpError: "Erro HTTP {status}: {statusText}",
492
+ invalidJson: "A resposta do servidor não é um JSON válido. Verifique a URL, a URL base e a autenticação.",
493
+ noDataAvailable: "Nenhum dado disponível. Configure \"Buscar na montagem\" ou adicione um parâmetro de pesquisa.",
494
+ noResults: "Nenhum resultado encontrado.",
495
+ noUrlConfigured: "Nenhuma URL configurada. Por favor, adicione uma URL na configuração HTTP.",
496
+ retry: "Tentar novamente",
497
+ search: "Pesquisar...",
498
+ searching: "Pesquisando...",
499
+ selectOption: "Selecione uma opção",
500
+ waitingForRequiredFields: "Aguardando campos obrigatórios"
501
+ },
502
+ defaultInputs: {
503
+ addMoreFiles: "Adicionar mais arquivos",
504
+ endDate: "Data de fim",
505
+ endTime: "Hora de fim",
506
+ filePickerError: "Falha ao selecionar arquivo",
507
+ filePickerUnavailable: "Seleção de arquivo indisponível. Instale react-native-document-picker.",
508
+ newAnswer: "Nova resposta...",
509
+ removeFile: "Remover arquivo",
510
+ replaceFile: "Substituir arquivo",
511
+ required: "*",
512
+ selectDate: "Selecionar data",
513
+ selectDateRange: "Selecionar intervalo de datas",
514
+ selectFile: "Selecionar arquivo",
515
+ selectFiles: "Selecionar arquivos",
516
+ selectTime: "Selecionar hora",
517
+ selectTimeRange: "Selecionar intervalo de horas",
518
+ startDate: "Data de início",
519
+ startTime: "Hora de início"
520
+ },
521
+ defaultRadioInput: { loadingOptions: "Carregando opções..." },
522
+ defaultSelectInput: { selectOption: "Selecione uma opção" },
523
+ defaultSubmitButton: {
524
+ requiredFieldsMissing: "Campos obrigatórios ausentes",
525
+ submit: "Enviar"
526
+ },
527
+ dependencyHint: { title: "Preencha primeiro os seguintes campos:" },
528
+ step: {
529
+ back: "Voltar",
530
+ continue: "Continuar"
531
+ }
532
+ },
533
+ validation: {
534
+ invalidFormat: "Formato inválido",
535
+ required: "Este campo é obrigatório"
536
+ }
537
+ }, g = (e, t = "en") => e && (e[t] || e.en || Object.values(e).find(Boolean)) || "", _ = (e, t) => e?.[t] ?? "", v = (e, t, n) => ({
538
+ ...e && typeof e == "object" ? e : {},
539
+ [t]: n
540
+ }), y = {
541
+ ar: u,
542
+ de: d,
543
+ en: f,
544
+ es: p,
545
+ fr: m,
546
+ it: h,
547
+ pt: ee
548
+ }, b = (e, t = "") => Object.keys(e).reduce((n, r) => {
549
+ let i = e[r], a = t ? `${t}.${r}` : r;
550
+ return typeof i == "object" && i && !Array.isArray(i) ? Object.assign(n, b(i, a)) : n[a] = String(i), n;
551
+ }, {}), x = (e) => b(y[e] || y.en), S = (e) => {
552
+ let t = r(() => x(e), [e]);
553
+ return r(() => (n) => n ? typeof n == "object" ? g(n, e) : n in t ? t[n] : n : "", [e, t]);
554
+ }, te = {
555
+ AND: "AND",
556
+ OR: "OR"
557
+ }, ne = {
558
+ group: "group",
559
+ input: "input",
560
+ ui: "ui"
561
+ }, C = {
562
+ baseUrl: void 0,
563
+ flow: null,
564
+ formErrors: {},
565
+ formValues: {},
566
+ googleApiKey: void 0,
567
+ headers: void 0,
568
+ inputNodes: [],
569
+ language: "",
570
+ optionsDisplayLimit: void 0,
571
+ setFieldValue: () => {}
572
+ }, w = e(null), re = ({ children: e, value: t }) => {
573
+ let n = r(() => ({
574
+ ...C,
575
+ ...t
576
+ }), [t]);
577
+ return /* @__PURE__ */ a(w.Provider, {
578
+ value: n,
579
+ children: e
580
+ });
581
+ }, T = () => {
582
+ let e = t(w) ?? C, n = r(() => e.flow?.edges ?? [], [e.flow]);
583
+ return {
584
+ ...e,
585
+ edges: n
586
+ };
587
+ }, ie = (e) => e.replace(/<[^>]*>/g, ""), ae = (e) => e.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"").replace(/&#x27;/g, "'").replace(/&#x2F;/g, "/"), E = (e, t = {}) => e == null || e === "" ? "" : ae(ie(String(e))), D = 100, O = (e, t = {}, n = 0, r = /* @__PURE__ */ new WeakSet()) => {
588
+ if (n > D) return console.warn(`sanitizeHttpResponse: Maximum depth (${D}) exceeded.`), typeof e == "string" ? E(e, t) : "[Max Depth Exceeded]";
589
+ if (e == null) return e;
590
+ if (typeof e == "string") return E(e, t);
591
+ if (Array.isArray(e)) return e.map((e) => O(e, t, n + 1, r));
592
+ if (typeof e == "object") {
593
+ if (r.has(e)) return console.warn("sanitizeHttpResponse: Circular reference detected. Breaking cycle to prevent infinite recursion."), "[Circular Reference]";
594
+ r.add(e);
595
+ let i = {};
596
+ for (let [a, o] of Object.entries(e)) i[a] = O(o, t, n + 1, r);
597
+ return r.delete(e), i;
598
+ }
599
+ return e;
600
+ }, oe = [
601
+ "b",
602
+ "i",
603
+ "em",
604
+ "strong",
605
+ "u",
606
+ "br",
607
+ "p",
608
+ "span"
609
+ ], se = ["class"], k = (e, t = {}) => {
610
+ if (e == null || e === "") return "";
611
+ let n = String(e);
612
+ if (!o.isSupported || typeof o.sanitize != "function") return E(n);
613
+ let { plainTextOnly: r = !0, allowedTags: i, allowedAttributes: a } = t;
614
+ if (r) return o.sanitize(n, {
615
+ ALLOWED_ATTR: [],
616
+ ALLOWED_TAGS: []
617
+ });
618
+ let s = i ?? oe, c = a ?? se;
619
+ return o.sanitize(n, {
620
+ ALLOW_DATA_ATTR: !1,
621
+ ALLOW_UNKNOWN_PROTOCOLS: !1,
622
+ ALLOWED_ATTR: c,
623
+ ALLOWED_TAGS: s,
624
+ FORBID_ATTR: ["style"],
625
+ FORBID_TAGS: ["style", "script"],
626
+ KEEP_CONTENT: !0,
627
+ RETURN_DOM: !1,
628
+ RETURN_DOM_FRAGMENT: !1
629
+ });
630
+ }, A = 100, j = (e, t = {}, n = 0, r = /* @__PURE__ */ new WeakSet()) => {
631
+ if (n > A) return console.warn(`sanitizeHttpResponse: Maximum depth (${A}) exceeded.`), typeof e == "string" ? k(e, t) : "[Max Depth Exceeded]";
632
+ if (e == null) return e;
633
+ if (typeof e == "string") return k(e, t);
634
+ if (Array.isArray(e)) return e.map((e) => j(e, t, n + 1, r));
635
+ if (typeof e == "object") {
636
+ if (r.has(e)) return console.warn("sanitizeHttpResponse: Circular reference detected. Breaking cycle to prevent infinite recursion."), "[Circular Reference]";
637
+ r.add(e);
638
+ let i = {};
639
+ for (let [a, o] of Object.entries(e)) i[a] = j(o, t, n + 1, r);
640
+ return r.delete(e), i;
641
+ }
642
+ return e;
643
+ }, ce = (e) => {
644
+ let t = T(), n = S(e ?? t.language);
645
+ return r(() => (e) => {
646
+ let t = n(e);
647
+ return typeof e == "object" && e ? k(t) : t;
648
+ }, [n]);
649
+ }, M = (...e) => {
650
+ let t = /* @__PURE__ */ new Map();
651
+ return e.forEach((e) => {
652
+ e && Object.entries(e).forEach(([e, n]) => {
653
+ e && t.set(e.toLowerCase(), {
654
+ key: e,
655
+ value: n
656
+ });
657
+ });
658
+ }), Object.fromEntries(Array.from(t.values(), ({ key: e, value: t }) => [e, t]));
659
+ }, le = (e, t, n) => e && Object.fromEntries(Object.entries(e).map(([e, r]) => [e, P(r, t, n)])), N = (e, t) => {
660
+ let n = Object.entries(t ?? {}).filter(([e]) => e);
661
+ if (n.length === 0) return e;
662
+ let r = n.map(([e, t]) => `${encodeURIComponent(e)}=${encodeURIComponent(t ?? "")}`).join("&");
663
+ return r ? `${e}${e.includes("?") ? "&" : "?"}${r}` : e;
664
+ }, ue = (e, t) => !(t && e) || /^(https?:)?\/\//i.test(e) ? e : `${t.replace(/\/+$/, "")}/${e.replace(/^\/+/, "")}`, de = (e) => {
665
+ try {
666
+ return {
667
+ ok: !0,
668
+ value: JSON.parse(e)
669
+ };
670
+ } catch {
671
+ return { ok: !1 };
672
+ }
673
+ }, fe = async (e) => {
674
+ try {
675
+ let { url: t, method: n = "GET", headers: r, queryParams: i, body: a, signal: o } = e;
676
+ if (!t || t.trim() === "") return {
677
+ error: "No URL provided",
678
+ success: !1
679
+ };
680
+ let s = N(t, i), c = M({ "Content-Type": "application/json" }, r), l = {
681
+ headers: Object.fromEntries(Object.entries(c).filter(([, e]) => e)),
682
+ method: n,
683
+ signal: o
684
+ };
685
+ a && n && [
686
+ "POST",
687
+ "PUT",
688
+ "PATCH"
689
+ ].includes(n) && (l.body = a);
690
+ let u = await fetch(s, l), d;
691
+ return d = u.headers.get("content-type")?.includes("application/json") ? await u.json() : await u.text(), u.ok ? {
692
+ data: d,
693
+ status: u.status,
694
+ statusText: u.statusText,
695
+ success: !0
696
+ } : {
697
+ data: d,
698
+ error: `HTTP ${u.status}: ${u.statusText}`,
699
+ status: u.status,
700
+ statusText: u.statusText,
701
+ success: !1
702
+ };
703
+ } catch (e) {
704
+ return {
705
+ error: e instanceof Error ? e.message : "An unknown error occurred",
706
+ success: !1
707
+ };
708
+ }
709
+ }, P = (e, t, n = {}) => {
710
+ if (!e) return "";
711
+ let { encode: r = !1, json: i = !1 } = n;
712
+ return e.replace(/\{\{([\w-]+)}}/g, (e, n) => {
713
+ let a = t[n.trim()];
714
+ if (a == null) return i ? "null" : "";
715
+ let o = typeof a == "string" ? k(a) : a;
716
+ if (r) return encodeURIComponent(String(o));
717
+ if (i) {
718
+ if (typeof o == "string") return `"${o.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
719
+ if (typeof o == "number" || typeof o == "boolean") return String(o);
720
+ if (typeof o == "object") return JSON.stringify(o);
721
+ }
722
+ return String(o);
723
+ });
724
+ }, pe = (e, t) => e ? e.replace(/\{\{response\.([\w.-]+)}}/g, (e, n) => {
725
+ let r = F(t, n.trim());
726
+ return r == null ? "" : String(r);
727
+ }) : "", F = (e, t) => {
728
+ if (!(!e || typeof e != "object")) return t.split(".").reduce((e, t) => {
729
+ if (!(typeof e != "object" || !e)) return e[t];
730
+ }, e);
731
+ }, I = (e, t) => t ? t.split(".").reduce((e, t) => {
732
+ if (e == null) return;
733
+ let n = t.match(/^(\w+)\[(\d+)]$/);
734
+ if (n) {
735
+ let [, t, r] = n, i = e[t];
736
+ return Array.isArray(i) ? i[Number.parseInt(r, 10)] : i;
737
+ }
738
+ return e[t];
739
+ }, e) : e, L = (e, t, n) => {
740
+ let r = I(e, t ?? "");
741
+ return Array.isArray(r) ? r.map((e) => {
742
+ let t = I(e, n.valueField), r = I(e, n.labelField);
743
+ if (t == null) return null;
744
+ let i = {
745
+ label: { en: String(r ?? t) },
746
+ value: String(t)
747
+ };
748
+ if (n.descriptionField) {
749
+ let t = I(e, n.descriptionField);
750
+ t != null && t !== "" && (i.description = { en: String(t) });
751
+ }
752
+ if (n.imageField) {
753
+ let t = I(e, n.imageField);
754
+ typeof t == "string" && t !== "" && (i.image = t);
755
+ }
756
+ return i;
757
+ }).filter((e) => e !== null) : [];
758
+ }, R = /^[\w-]+$/, z = /^\{\{([\w-]+)}}$/, B = /\{\{([\w-]+)}}/g, me = (e, t) => {
759
+ let n = { ...e };
760
+ for (let r of t) {
761
+ let t = r.data?.name?.trim();
762
+ t && R.test(t) && e[r.id] !== void 0 && n[t] === void 0 && (n[t] = e[r.id]);
763
+ }
764
+ return n;
765
+ }, V = (e, t) => e.replace(B, (e, n) => {
766
+ let r = t[n];
767
+ return r == null ? "" : typeof r == "object" ? JSON.stringify(r) : String(r);
768
+ }), H = (e, t) => {
769
+ if (typeof e == "string") {
770
+ let n = e.match(z);
771
+ if (n) {
772
+ let e = t[n[1]];
773
+ return e === void 0 ? null : e;
774
+ }
775
+ return V(e, t);
776
+ }
777
+ if (Array.isArray(e)) return e.map((e) => H(e, t));
778
+ if (e && typeof e == "object") {
779
+ let n = {};
780
+ for (let [r, i] of Object.entries(e)) n[V(r, t)] = H(i, t);
781
+ return n;
782
+ }
783
+ return e;
784
+ }, he = (e) => {
785
+ try {
786
+ return JSON.parse(e);
787
+ } catch {
788
+ return;
789
+ }
790
+ }, U = (e, t, n) => {
791
+ if (!e || e.trim() === "") return;
792
+ let r = he(e);
793
+ if (r !== void 0) return H(r, me(t, n));
794
+ }, ge = (e, t, n) => {
795
+ let r = U(e, t, n);
796
+ return r === void 0 ? void 0 : JSON.stringify(r);
797
+ }, W = (e) => e.trim() ? e.replace(/[_-]+/g, " ").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/\s+/g, " ").trim().split(" ").map((e) => e.charAt(0).toUpperCase() + e.slice(1).toLowerCase()).join(" ") : e, _e = (e) => Object.fromEntries(Object.entries(e).map(([e, t]) => [e, typeof t == "string" ? W(t) : t])), G = (e) => new Promise((t, n) => {
798
+ let r = new FileReader();
799
+ r.onload = () => {
800
+ let n = r.result;
801
+ t({
802
+ data: n,
803
+ lastModified: e.lastModified,
804
+ name: e.name,
805
+ size: e.size,
806
+ type: e.type
807
+ });
808
+ }, r.onerror = () => {
809
+ n(/* @__PURE__ */ Error(`Failed to read file: ${e.name}`));
810
+ }, r.readAsDataURL(e);
811
+ }), ve = (e) => {
812
+ let t = e.data.split(",")[1], n = atob(t), r = new ArrayBuffer(n.length), i = new Uint8Array(r);
813
+ for (let e = 0; e < n.length; e++) i[e] = n.charCodeAt(e);
814
+ let a = new Blob([r], { type: e.type });
815
+ return new File([a], e.name, {
816
+ lastModified: e.lastModified,
817
+ type: e.type
818
+ });
819
+ }, ye = (e) => Promise.all(e.map((e) => G(e))), K = (e) => {
820
+ try {
821
+ let { pathname: t } = new URL(e, "http://_"), n = t.split("/").filter(Boolean).pop();
822
+ return n ? decodeURIComponent(n) : e;
823
+ } catch {
824
+ return e;
825
+ }
826
+ }, be = (e) => !!e && !e.startsWith("data:") && !e.startsWith("blob:"), xe = (e) => (Array.isArray(e) ? e : e == null ? [] : [e]).flatMap((e) => typeof e == "string" ? e.trim() === "" ? [] : [{
827
+ data: e,
828
+ lastModified: 0,
829
+ name: K(e),
830
+ size: 0,
831
+ type: ""
832
+ }] : [e]), Se = (e) => e < 1024 ? `${e} B` : e < 1024 * 1024 ? `${(e / 1024).toFixed(1)} KB` : `${(e / (1024 * 1024)).toFixed(1)} MB`, Ce = new Set([
833
+ "text",
834
+ "number",
835
+ "password",
836
+ "textarea",
837
+ "time"
838
+ ]), we = (e) => e.filter(s), q = (e) => e.data.name ? e.data.name : g(e.data.label) || e.id, Te = (e, t) => g(e.data.label, t) || e.data.name || e.id, J = (e, t) => {
839
+ let n = e.type ?? "text";
840
+ return !_(e.placeholder, t) && Ce.has(n) ? x(t)["renderer.defaultInputs.newAnswer"] ?? "" : g(e.placeholder, t);
841
+ }, Ee = (e) => e == null || typeof e == "string" && e.trim() === "" ? !0 : Array.isArray(e) && e.length === 0, De = (e, t) => e ? t[e] != null : !1, Y = (e, t) => {
842
+ let { defaultValue: n } = e.data;
843
+ if (n) {
844
+ if (n.type === "static" && n.staticValue !== void 0) return n.staticValue;
845
+ if (n.type === "reference" && n.referenceField) {
846
+ let e = t[n.referenceField];
847
+ if (e !== void 0) return e;
848
+ }
849
+ }
850
+ }, Oe = (e, t) => {
851
+ let n = {};
852
+ return t.forEach((t) => {
853
+ if (e[t.id] !== void 0) {
854
+ n[t.id] = e[t.id];
855
+ return;
856
+ }
857
+ let r = q(t);
858
+ e[r] !== void 0 && (n[t.id] = e[r]);
859
+ }), t.forEach((e) => {
860
+ if (n[e.id] !== void 0) return;
861
+ let t = Y(e, n);
862
+ t !== void 0 && (n[e.id] = t);
863
+ }), n;
864
+ }, ke = (e, t) => {
865
+ let n = {};
866
+ return t.forEach((t) => {
867
+ let r = t.id, i = q(t);
868
+ e[r] !== void 0 && (n[i] = e[r]);
869
+ }), n;
870
+ }, X = (e, t, n) => {
871
+ if (!t) return e;
872
+ switch (t) {
873
+ case "toString": return String(e);
874
+ case "toNumber": return Number(e);
875
+ case "toBoolean":
876
+ if (typeof e == "string") {
877
+ let t = e.trim().toLowerCase();
878
+ if ([
879
+ "true",
880
+ "1",
881
+ "yes",
882
+ "on"
883
+ ].includes(t)) return !0;
884
+ if ([
885
+ "false",
886
+ "0",
887
+ "no",
888
+ "off",
889
+ ""
890
+ ].includes(t)) return !1;
891
+ }
892
+ return typeof e == "number" ? e !== 0 : typeof e == "boolean" ? e : !!e;
893
+ case "toArray": return Array.isArray(e) ? e : [e];
894
+ case "toObject":
895
+ if (n && Array.isArray(n)) {
896
+ if (typeof e != "object" || !e) return e;
897
+ let t = {};
898
+ return n.forEach((n) => {
899
+ n.sourceKey && n.targetKey && (t[n.targetKey] = e[n.sourceKey]);
900
+ }), t;
901
+ }
902
+ return e;
903
+ default: return e;
904
+ }
905
+ }, Z = (e, t) => {
906
+ if (Object.is(e, t)) return !0;
907
+ if (!(e && t) || typeof e != "object" || typeof t != "object") return !1;
908
+ try {
909
+ return JSON.stringify(e) === JSON.stringify(t);
910
+ } catch {
911
+ return !1;
912
+ }
913
+ }, Ae = (e, t, n) => {
914
+ let r = {};
915
+ return e.forEach((e) => {
916
+ let { defaultValue: i } = e.data;
917
+ if (!i || i.type !== "reference" || !i.referenceField) return;
918
+ let a = e.id, { referenceField: o, transformFunction: s, objectMapping: c } = i, l = t[o], u = n[o];
919
+ if (l === u || l == null) return;
920
+ let d = X(l, s, c), f = X(u, s, c), p = t[a], m = Z(p, f), h = Z(p, d);
921
+ !m || h || (r[a] = d);
922
+ }), r;
923
+ }, Q = {
924
+ dark: {
925
+ background: "#0A0A0A",
926
+ border: "#262626",
927
+ borderFocus: "#60A5FA",
928
+ card: "#171717",
929
+ error: "#FF6467",
930
+ errorBg: "#2A1010",
931
+ errorLight: "#2A1010",
932
+ input: "#171717",
933
+ muted: "#262626",
934
+ primary: "#60A5FA",
935
+ primaryDisabled: "#404040",
936
+ primaryForeground: "#0A0A0A",
937
+ primaryLight: "#1E3A5F",
938
+ separator: "#262626",
939
+ success: "#10B981",
940
+ successBg: "#1A3A24",
941
+ text: "#FAFAFA",
942
+ textMuted: "#A1A1A1",
943
+ textSecondary: "#A1A1A1"
944
+ },
945
+ light: {
946
+ background: "#FFFFFF",
947
+ border: "#E5E5E5",
948
+ borderFocus: "#3B82F6",
949
+ card: "#FFFFFF",
950
+ error: "#E7000B",
951
+ errorBg: "#FEE2E2",
952
+ errorLight: "#FEE2E2",
953
+ input: "#FFFFFF",
954
+ muted: "#F5F5F5",
955
+ primary: "#3B82F6",
956
+ primaryDisabled: "#A1A1A1",
957
+ primaryForeground: "#FFFFFF",
958
+ primaryLight: "#EFF6FF",
959
+ separator: "#E5E5E5",
960
+ success: "#10B981",
961
+ successBg: "#D1FAE5",
962
+ text: "#0A0A0A",
963
+ textMuted: "#737373",
964
+ textSecondary: "#525252"
965
+ }
966
+ }, $ = e({
967
+ colors: Q.light,
968
+ setTheme: () => null,
969
+ theme: "system"
970
+ }), je = ({ children: e, defaultTheme: t = "system", storageKey: o = "treege-theme", theme: s, ...c }) => {
971
+ let [l, u] = i(() => s || typeof localStorage < "u" && localStorage.getItem(o) || t), d = s ?? l, f = Q[d === "system" ? typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : d], p = r(() => ({
972
+ colors: f,
973
+ setTheme: (e) => {
974
+ !s && typeof localStorage < "u" && localStorage.setItem(o, e), u(e);
975
+ },
976
+ theme: d
977
+ }), [
978
+ o,
979
+ d,
980
+ s,
981
+ f
982
+ ]);
983
+ return n(() => {
984
+ s && u(s);
985
+ }, [s]), n(() => {
986
+ if (typeof window > "u" || window.document === void 0) return;
987
+ let e = window.document.documentElement;
988
+ if (e.classList.remove("light", "dark"), d === "system") {
989
+ let t = window.matchMedia("(prefers-color-scheme: dark)"), n = t.matches ? "dark" : "light";
990
+ e.classList.add(n);
991
+ let r = (t) => {
992
+ e.classList.remove("light", "dark"), e.classList.add(t.matches ? "dark" : "light");
993
+ };
994
+ return t.addEventListener("change", r), () => t.removeEventListener("change", r);
995
+ }
996
+ e.classList.add(d);
997
+ }, [d]), /* @__PURE__ */ a($.Provider, {
998
+ ...c,
999
+ value: p,
1000
+ children: e
1001
+ });
1002
+ }, Me = () => {
1003
+ let e = t($);
1004
+ if (e === void 0) throw Error("useTheme must be used within a ThemeProvider");
1005
+ return e;
1006
+ };
1007
+ //#endregion
1008
+ export { pe as A, re as B, U as C, I as D, L as E, ce as F, x as G, ne as H, k as I, v as J, _ as K, j as L, le as M, ue as N, fe as O, de as P, E as R, _e as S, N as T, te as U, T as V, S as W, s as X, l as Y, c as Z, Se as _, Ae as a, ve as b, Ee as c, J as d, q as f, ye as g, G as h, Oe as i, P as j, M as k, Y as l, K as m, Me as n, De as o, Te as p, g as q, X as r, ke as s, je as t, we as u, be as v, ge as w, W as x, xe as y, O as z };