@formitiva/react 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.full.md +456 -0
  3. package/README.md +114 -0
  4. package/dist/components/fields/advanced/ColorInput.d.ts +5 -0
  5. package/dist/components/fields/advanced/EmailInput.d.ts +6 -0
  6. package/dist/components/fields/advanced/FileInput.d.ts +5 -0
  7. package/dist/components/fields/advanced/PasswordInput.d.ts +6 -0
  8. package/dist/components/fields/advanced/PhoneInput.d.ts +7 -0
  9. package/dist/components/fields/advanced/RatingInput.d.ts +9 -0
  10. package/dist/components/fields/advanced/SliderInput.d.ts +5 -0
  11. package/dist/components/fields/advanced/UnitValueInput.d.ts +5 -0
  12. package/dist/components/fields/advanced/UrlInput.d.ts +9 -0
  13. package/dist/components/fields/base/PopupOptionMenu.d.ts +16 -0
  14. package/dist/components/fields/base/Tooltip.d.ts +8 -0
  15. package/dist/components/fields/choices/CheckboxInput.d.ts +5 -0
  16. package/dist/components/fields/choices/DropdownInput.d.ts +8 -0
  17. package/dist/components/fields/choices/MultiSelection.d.ts +9 -0
  18. package/dist/components/fields/choices/RadioInput.d.ts +8 -0
  19. package/dist/components/fields/choices/SwitchInput.d.ts +5 -0
  20. package/dist/components/fields/date-time/DateInput.d.ts +6 -0
  21. package/dist/components/fields/date-time/TimeInput.d.ts +6 -0
  22. package/dist/components/fields/text-numeric/FloatArrayInput.d.ts +5 -0
  23. package/dist/components/fields/text-numeric/FloatInput.d.ts +9 -0
  24. package/dist/components/fields/text-numeric/IntegerArrayInput.d.ts +6 -0
  25. package/dist/components/fields/text-numeric/IntegerInput.d.ts +6 -0
  26. package/dist/components/fields/text-numeric/MultilineTextInput.d.ts +6 -0
  27. package/dist/components/fields/text-numeric/NumericStepperInput.d.ts +6 -0
  28. package/dist/components/fields/text-numeric/TextInput.d.ts +8 -0
  29. package/dist/components/fields/ui-elements/Button.d.ts +14 -0
  30. package/dist/components/fields/ui-elements/Description.d.ts +10 -0
  31. package/dist/components/fields/ui-elements/ImageDisplay.d.ts +5 -0
  32. package/dist/components/fields/ui-elements/Separator.d.ts +21 -0
  33. package/dist/components/form/Formitiva.d.ts +16 -0
  34. package/dist/components/form/FormitivaProvider.d.ts +18 -0
  35. package/dist/components/form/FormitivaRenderer.d.ts +20 -0
  36. package/dist/components/form/SubmissionButton.d.ts +8 -0
  37. package/dist/components/form/SubmissionMessage.d.ts +7 -0
  38. package/dist/components/layout/FieldGroup.d.ts +16 -0
  39. package/dist/components/layout/FieldRenderer.d.ts +14 -0
  40. package/dist/components/layout/LayoutComponents.d.ts +77 -0
  41. package/dist/core/env.d.ts +1 -0
  42. package/dist/core/fieldVisibility.d.ts +13 -0
  43. package/dist/core/formitivaModel.d.ts +31 -0
  44. package/dist/core/formitivaTypes.d.ts +128 -0
  45. package/dist/core/registries/baseRegistry.d.ts +15 -0
  46. package/dist/core/registries/buttonHandlerRegistry.d.ts +44 -0
  47. package/dist/core/registries/componentRegistry.d.ts +15 -0
  48. package/dist/core/registries/pluginRegistry.d.ts +45 -0
  49. package/dist/core/registries/submissionHandlerRegistry.d.ts +7 -0
  50. package/dist/core/registries/validationHandlerRegistry.d.ts +20 -0
  51. package/dist/core/submitForm.d.ts +9 -0
  52. package/dist/formitiva.cjs.js +404 -0
  53. package/dist/formitiva.es.js +5626 -0
  54. package/dist/hooks/useDebouncedCallback.d.ts +27 -0
  55. package/dist/hooks/useDropdownPosition.d.ts +6 -0
  56. package/dist/hooks/useFieldValidator.d.ts +3 -0
  57. package/dist/hooks/useFormitivaContext.d.ts +4 -0
  58. package/dist/hooks/useUncontrolledValidatedInput.d.ts +21 -0
  59. package/dist/hooks/useUnitValueField.d.ts +13 -0
  60. package/dist/index.d.ts +27 -0
  61. package/dist/react.css +1 -0
  62. package/dist/styles/cssClasses.d.ts +15 -0
  63. package/dist/styles/themeUtils.d.ts +31 -0
  64. package/dist/themes/ant-design-dark.css +31 -0
  65. package/dist/themes/ant-design.css +42 -0
  66. package/dist/themes/blueprint-dark.css +31 -0
  67. package/dist/themes/blueprint.css +43 -0
  68. package/dist/themes/compact-variant.css +8 -0
  69. package/dist/themes/fluent.css +40 -0
  70. package/dist/themes/glass-morphism.css +25 -0
  71. package/dist/themes/high-contrast-accessible.css +22 -0
  72. package/dist/themes/ios-mobile.css +32 -0
  73. package/dist/themes/macos-native.css +32 -0
  74. package/dist/themes/material-dark.css +27 -0
  75. package/dist/themes/material.css +46 -0
  76. package/dist/themes/midnight-dark.css +24 -0
  77. package/dist/themes/modern-light.css +23 -0
  78. package/dist/themes/neon-cyber-dark.css +24 -0
  79. package/dist/themes/shadcn.css +40 -0
  80. package/dist/themes/soft-pastel.css +24 -0
  81. package/dist/themes/spacious-variant.css +9 -0
  82. package/dist/themes/tailwind-dark.css +30 -0
  83. package/dist/themes/tailwind.css +50 -0
  84. package/dist/utils/definitionSerializers.d.ts +62 -0
  85. package/dist/utils/groupingHelpers.d.ts +24 -0
  86. package/dist/utils/translationUtils.d.ts +52 -0
  87. package/dist/utils/unitValueMapper.d.ts +14 -0
  88. package/dist/validation/registerBuiltinTypeValidators.d.ts +11 -0
  89. package/dist/validation/validation.d.ts +12 -0
  90. package/dist/validation/validators/validateColorField.d.ts +2 -0
  91. package/dist/validation/validators/validateDateField.d.ts +2 -0
  92. package/dist/validation/validators/validateEmailField.d.ts +2 -0
  93. package/dist/validation/validators/validateFieldPattern.d.ts +3 -0
  94. package/dist/validation/validators/validateFileField.d.ts +2 -0
  95. package/dist/validation/validators/validateFloatField.d.ts +3 -0
  96. package/dist/validation/validators/validateIntegerField.d.ts +3 -0
  97. package/dist/validation/validators/validatePhoneField.d.ts +2 -0
  98. package/dist/validation/validators/validateRatingField.d.ts +2 -0
  99. package/dist/validation/validators/validateSelectionFields.d.ts +3 -0
  100. package/dist/validation/validators/validateSliderField.d.ts +2 -0
  101. package/dist/validation/validators/validateTextField.d.ts +2 -0
  102. package/dist/validation/validators/validateTimeField.d.ts +2 -0
  103. package/dist/validation/validators/validateUnitValueField.d.ts +2 -0
  104. package/dist/validation/validators/validateUrlField.d.ts +2 -0
  105. package/package.json +92 -0
@@ -0,0 +1,404 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),J=require("react"),fr=require("react-dom");function it(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const l=it(J),fe=it(fr),pr=`/*/* formitiva CSS Custom Properties (CSS Variables) */\r
2
+ \r
3
+ /* Default Light Theme */\r
4
+ :root {\r
5
+ /* Colors */\r
6
+ --formitiva-primary-bg: #f9f9f9;\r
7
+ --formitiva-secondary-bg: #fff;\r
8
+ --formitiva-text-color: #000;\r
9
+ --formitiva-text-muted: #666;\r
10
+ --formitiva-label-text-color: #000000;\r
11
+ --formitiva-form-border-color: #000000;\r
12
+ --formitiva-border-color: #ccc;\r
13
+ --formitiva-border-hover: #999;\r
14
+ --formitiva-border-focus: #4CAF50;\r
15
+ --formitiva-error-color: #e11d48;\r
16
+ --formitiva-success-color: #4CAF50;\r
17
+ \r
18
+ /* Spacing */\r
19
+ --formitiva-space: 8px;\r
20
+ --formitiva-space-lg: 12px;\r
21
+ /* Hover background for option menus */\r
22
+ --formitiva-option-menu-hover-bg: #80FFFF;\r
23
+ \r
24
+ /* Gap variables\r
25
+ - --formitiva-field-gap: vertical gap between fields (default uses --formitiva-space)\r
26
+ - --formitiva-column-gap: horizontal gap between label and control in row layout\r
27
+ - --formitiva-inline-gap: inline horizontal gap used inside control groups\r
28
+ - --formitiva-label-gap: vertical gap between label and control in column layout\r
29
+ */\r
30
+ --formitiva-field-gap: var(--formitiva-space);\r
31
+ --formitiva-column-gap: var(--formitiva-space);\r
32
+ --formitiva-inline-gap: var(--formitiva-space);\r
33
+ --formitiva-label-gap: 0px;\r
34
+ \r
35
+ /* Typography */\r
36
+ --formitiva-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\r
37
+ --formitiva-font-size: 14px;\r
38
+ --formitiva-font-weight: 500;\r
39
+ \r
40
+ --formitiva-label-font-family: var(--formitiva-font-family);\r
41
+ --formitiva-label-font-size: 14px;\r
42
+ --formitiva-label-font-weight: 600;\r
43
+ \r
44
+ /* Layout */\r
45
+ --formitiva-border-radius: 0px;\r
46
+ --formitiva-border-width: 1px;\r
47
+ --formitiva-border-style: solid;\r
48
+ \r
49
+ --formitiva-form-border-radius: 0px;\r
50
+ --formitiva-form-border-style: solid;\r
51
+ --formitiva-form-border-width: 0px;\r
52
+ \r
53
+ --formitiva-group-border-radius: var(--formitiva-border-radius);\r
54
+ --formitiva-group-border-style: var(--formitiva-border-style);\r
55
+ --formitiva-group-border-width: var(--formitiva-border-width);\r
56
+ \r
57
+ /* Shadows */\r
58
+ --formitiva-form-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r
59
+ \r
60
+ /* Button Variables */\r
61
+ --formitiva-button-bg: var(--formitiva-success-color);\r
62
+ --formitiva-button-text: #ffffff;\r
63
+ --formitiva-button-padding: var(--formitiva-space) 12px;\r
64
+ --formitiva-button-border-radius: 6px;\r
65
+ --formitiva-button-font-size: 14px;\r
66
+ --formitiva-button-font-weight: var(--formitiva-font-weight);\r
67
+ --formitiva-button-hover-opacity: 0.9;\r
68
+ --formitiva-button-disabled-opacity: 0.6;\r
69
+ --formitiva-button-disabled-bg: #cccccc;\r
70
+ --formitiva-button-disabled-cursor: not-allowed;\r
71
+ --formitiva-button-margin-top: 0.5em;\r
72
+ --formitiva-button-shadow: none;\r
73
+ \r
74
+ /* Form specific */\r
75
+ --formitiva-input-padding: var(--formitiva-space);\r
76
+ --formitiva-container-padding: var(--formitiva-space-lg);\r
77
+ --formitiva-field-gap: var(--formitiva-space);\r
78
+ \r
79
+ /* Input background (can be overridden per theme) */\r
80
+ --formitiva-input-bg: var(--formitiva-secondary-bg);\r
81
+ \r
82
+ --formitiva-field-text-color: #0000ff;\r
83
+ \r
84
+ /* Tooltip defaults */\r
85
+ --formitiva-tooltip-color-bg: rgba(60,60,60,0.92);\r
86
+ --formitiva-tooltip-color: #ffffff;\r
87
+ \r
88
+ --formitiva-field-grid-columns: 1fr 2fr;\r
89
+ \r
90
+ }\r
91
+ \r
92
+ /* Dark Theme */\r
93
+ [data-formitiva-theme="dark"] {\r
94
+ \r
95
+ /* Layered Background System */\r
96
+ --formitiva-primary-bg: #121212; /* App background */\r
97
+ --formitiva-secondary-bg: #1A1A1A; /* Card / container surface */\r
98
+ --formitiva-input-bg: #262626; /* Component surface */\r
99
+ \r
100
+ /* Text */\r
101
+ --formitiva-text-color: #EDEDED; /* Primary text */\r
102
+ --formitiva-text-muted: #A5A5A5; /* Secondary text */\r
103
+ --formitiva-field-text-color: #C8C8E5; /* Optional tint for labels */\r
104
+ \r
105
+ /* Borders */\r
106
+ --formitiva-border-color: #3A3A3A; /* Default border */\r
107
+ --formitiva-border-hover: #4A4A4A; /* Hover */\r
108
+ --formitiva-border-focus: #4DA6FF; /* Accent blue focus */\r
109
+ \r
110
+ --formitiva-form-border-color: #333333;\r
111
+ \r
112
+ /* Status colors */\r
113
+ --formitiva-error-color: #FF6B6B;\r
114
+ --formitiva-success-color: #4CAF6A;\r
115
+ \r
116
+ /* Interactive / Hover */\r
117
+ --formitiva-option-menu-hover-bg: rgba(255, 255, 255, 0.06);\r
118
+ \r
119
+ /* Shadows (subtle for dark mode) */\r
120
+ --formitiva-form-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);\r
121
+ \r
122
+ /* Tooltip */\r
123
+ --formitiva-tooltip-color-bg: rgba(40, 40, 40, 0.95);\r
124
+ --formitiva-tooltip-color: #F5F5F5;\r
125
+ }\r
126
+ \r
127
+ /* Base/* formitiva Container */\r
128
+ .formitiva-container {\r
129
+ font-family: var(--formitiva-font-family, sans-serif);\r
130
+ font-size: var(--formitiva-font-size, 14px);\r
131
+ background: var(--formitiva-primary-bg, #f9f9f9);\r
132
+ color: var(--formitiva-text-color, #000000);\r
133
+ padding: var(--formitiva-container-padding, 12px);\r
134
+ border-radius: var(--formitiva-form-border-radius, 0px);\r
135
+ border-color: var(--formitiva-form-border-color, #000000);\r
136
+ border-style: var(--formitiva-form-border-style, solid);\r
137
+ border-width: var(--formitiva-form-border-width, 0px);\r
138
+ box-shadow: var(--formitiva-form-shadow, none);\r
139
+ gap: var(--formitiva-space-lg, 12px);\r
140
+ max-width: 100%;\r
141
+ margin: 0 auto;\r
142
+ /* Removed internal scrolling - let parent container handle it */\r
143
+ }\r
144
+ \r
145
+ /* Field Container\r
146
+ - Uses a two-column grid: label (left) and control (right)\r
147
+ - \`--formitiva-column-gap\` controls the horizontal gap between label and control\r
148
+ - \`--formitiva-field-gap\` controls the vertical spacing between fields (margin-bottom)\r
149
+ */\r
150
+ .formitiva-field {\r
151
+ display: grid;\r
152
+ grid-template-columns: var(--formitiva-field-grid-columns, 1fr 2fr);\r
153
+ align-items: start;\r
154
+ padding: 0;\r
155
+ gap: var(--formitiva-column-gap, 8px);\r
156
+ margin-bottom: var(--formitiva-field-gap, 8px);\r
157
+ }\r
158
+ \r
159
+ /* Fieldset / Group */\r
160
+ .formitiva-group {\r
161
+ border: 1px solid var(--formitiva-border-color, #bbb);\r
162
+ padding: var(--formitiva-fieldset-padding, 0.5em);\r
163
+ border-radius: var(--formitiva-group-border-radius, var(--formitiva-border-radius, 4px));\r
164
+ border-style: var(--formitiva-group-border-style, var(--formitiva-border-style, solid));\r
165
+ border-width: var(--formitiva-group-border-width, var(--formitiva-border-width, 1px));\r
166
+ margin-bottom: var(--formitiva-space, 8px);\r
167
+ }\r
168
+ \r
169
+ .formitiva-group_legend {\r
170
+ font-weight: bold;\r
171
+ cursor: pointer;\r
172
+ display: flex;\r
173
+ justify-content: space-between;\r
174
+ align-items: center;\r
175
+ padding: 0 var(--formitiva-space, 8px);\r
176
+ color: var(--formitiva-text-color, inherit);\r
177
+ margin-left: 0.4em;\r
178
+ }\r
179
+ \r
180
+ .formitiva-group_legend_arrow\r
181
+ {\r
182
+ margin-left: 0.4em;\r
183
+ }\r
184
+ \r
185
+ /* Labels */\r
186
+ .formitiva-label {\r
187
+ justify-self: start;\r
188
+ align-self: center;\r
189
+ white-space: normal;\r
190
+ line-height: 1.4;\r
191
+ min-width: 100px;\r
192
+ color: var(--formitiva-label-text-color, var(--formitiva-text-color, #000000));\r
193
+ font-family: var(--formitiva-label-font-family, var(--formitiva-font-family, sans-serif));\r
194
+ font-weight: var(--formitiva-label-font-weight, var(--formitiva-font-weight, 600));\r
195
+ font-size: var(--formitiva-label-font-size, var(--formitiva-font-size, 14px));\r
196
+ user-select: none;\r
197
+ }\r
198
+ \r
199
+ /* Description (UI-only display text) */\r
200
+ .formitiva-description {\r
201
+ font-size: var(--formitiva-font-size, 14px);\r
202
+ font-weight: var(--formitiva-font-weight, 500);\r
203
+ margin: var(--formitiva-space, 8px) 0;\r
204
+ color: var(--formitiva-text-color, #000000);\r
205
+ user-select: none;\r
206
+ }\r
207
+ \r
208
+ /* Ensure row layout labels are left-aligned */\r
209
+ \r
210
+ \r
211
+ /* Input Base */\r
212
+ .formitiva-input {\r
213
+ width: 100%;\r
214
+ color: var(--formitiva-text-color, #000000);\r
215
+ border: 1px solid var(--formitiva-border-color, #ccc);\r
216
+ border-radius: var(--formitiva-border-radius, 0px);\r
217
+ border-style: var(--formitiva-border-style, solid);\r
218
+ border-width: var(--formitiva-border-width, 1px);\r
219
+ padding: var(--formitiva-input-padding, 8px);\r
220
+ box-sizing: border-box;\r
221
+ background-color: var(--formitiva-input-bg, #ffffff);\r
222
+ font-size: var(--formitiva-font-size, 14px);\r
223
+ font-weight: var(--formitiva-font-weight, 400);\r
224
+ transition: border-color 0.2s ease;\r
225
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.03);\r
226
+ }\r
227
+ \r
228
+ .formitiva-input:hover {\r
229
+ border-color: var(--formitiva-border-hover, #4A4A4A);\r
230
+ }\r
231
+ \r
232
+ .formitiva-input:focus {\r
233
+ outline: none;\r
234
+ border-color: var(--formitiva-border-focus, #4DA6FF);\r
235
+ /* Bright, prominent focus ring with cyan glow for maximum visibility on dark backgrounds */\r
236
+ box-shadow: 0 0 0 3px rgba(34,211,238,0.4),\r
237
+ 0 0 16px rgba(34,211,238,0.25),\r
238
+ inset 0 1px 0 rgba(255,255,255,0.05);\r
239
+ }\r
240
+ \r
241
+ /* Input Variants */\r
242
+ .formitiva-input--text {\r
243
+ text-align: left;\r
244
+ }\r
245
+ \r
246
+ .formitiva-input--number {\r
247
+ text-align: right;\r
248
+ }\r
249
+ \r
250
+ .formitiva-input--select {\r
251
+ text-align: left;\r
252
+ appearance: none;\r
253
+ background-image: url("data:image/svg+xml;utf8,<svg fill='%23666' height='8' viewBox='0 0 24 24' width='8' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");\r
254
+ background-repeat: no-repeat;\r
255
+ background-position: right var(--formitiva-space) center;\r
256
+ background-size: 20px;\r
257
+ padding-right: 32px;\r
258
+ }\r
259
+ \r
260
+ /* Select component (multiselection, dropdown) */\r
261
+ .formitiva-select {\r
262
+ text-align: left;\r
263
+ appearance: none;\r
264
+ background-image: url("data:image/svg+xml;utf8,<svg fill='%23666' height='8' viewBox='0 0 24 24' width='8' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/></svg>");\r
265
+ background-repeat: no-repeat;\r
266
+ background-position: right var(--formitiva-space) center;\r
267
+ background-size: 2.5em;\r
268
+ padding-right: 32px;\r
269
+ background-color: var(--formitiva-input-bg);\r
270
+ }\r
271
+ \r
272
+ .formitiva-textarea {\r
273
+ width: 100%;\r
274
+ background-color: var(--formitiva-input-bg);\r
275
+ color: var(--formitiva-text-color);\r
276
+ border: 1px solid var(--formitiva-border-color);\r
277
+ border-radius: var(--formitiva-border-radius);\r
278
+ padding: var(--formitiva-input-padding);\r
279
+ box-sizing: border-box;\r
280
+ }\r
281
+ \r
282
+ .formitiva-chip {\r
283
+ display: flex;\r
284
+ align-items: center;\r
285
+ justify-content: space-between;\r
286
+ padding: 6px 10px;\r
287
+ background-color: var(--formitiva-input-bg);\r
288
+ border: 1px solid var(--formitiva-border-color);\r
289
+ border-radius: var(--formitiva-border-radius);\r
290
+ color: var(--formitiva-text-color);\r
291
+ font-size: 0.875rem;\r
292
+ gap: 8px;\r
293
+ }\r
294
+ \r
295
+ /* Button */\r
296
+ .formitiva-button {\r
297
+ background-color: var(--formitiva-button-bg, var(--formitiva-success-color, #4CAF50));\r
298
+ color: var(--formitiva-button-text, var(--formitiva-text-color, #000000));\r
299
+ padding: var(--formitiva-button-padding);\r
300
+ border-radius: var(--formitiva-button-border-radius, 6px);\r
301
+ font-size: var(--formitiva-button-font-size);\r
302
+ font-weight: var(--formitiva-button-font-weight);\r
303
+ box-shadow: var(--formitiva-button-shadow);\r
304
+ margin-top: var(--formitiva-button-margin-top);\r
305
+ border: none;\r
306
+ cursor: pointer;\r
307
+ transition: opacity 0.2s ease;\r
308
+ width: 100%;\r
309
+ display: flex;\r
310
+ justify-content: center;\r
311
+ align-items: center;\r
312
+ }\r
313
+ \r
314
+ .formitiva-button:hover:not(:disabled) {\r
315
+ opacity: var(--formitiva-button-hover-opacity);\r
316
+ background-color: var(--formitiva-button-bg-hover, #0056b3);\r
317
+ }\r
318
+ \r
319
+ .formitiva-button:disabled {\r
320
+ opacity: var(--formitiva-button-disabled-opacity);\r
321
+ background-color: var(--formitiva-button-disabled-bg);\r
322
+ cursor: var(--formitiva-button-disabled-cursor);\r
323
+ }\r
324
+ \r
325
+ /* Responsive Design */\r
326
+ @media (max-width: 1024px) {\r
327
+ .formitiva-container {\r
328
+ padding: calc(var(--formitiva-space) * 0.8);\r
329
+ }\r
330
+ \r
331
+ .formitiva-field {\r
332
+ gap: calc(var(--formitiva-column-gap) * 0.8);\r
333
+ }\r
334
+ }\r
335
+ \r
336
+ @media (max-width: 768px) {\r
337
+ .formitiva-field {\r
338
+ grid-template-columns: 1fr;\r
339
+ gap: 6px;\r
340
+ }\r
341
+ \r
342
+ .formitiva-label {\r
343
+ justify-self: start;\r
344
+ margin-bottom: 4px;\r
345
+ font-size: 0.9rem;\r
346
+ }\r
347
+ \r
348
+ .formitiva-container {\r
349
+ padding: var(--formitiva-space);\r
350
+ }\r
351
+ \r
352
+ .formitiva-input,\r
353
+ .formitiva-textarea,\r
354
+ .formitiva-select {\r
355
+ font-size: 16px; /* Prevent zoom on iOS */\r
356
+ padding: var(--formitiva-input-padding);\r
357
+ }\r
358
+ \r
359
+ .formitiva-checkbox-wrapper,\r
360
+ .formitiva-radio-wrapper {\r
361
+ padding: 8px 0;\r
362
+ min-height: 44px;\r
363
+ align-items: center;\r
364
+ }\r
365
+ \r
366
+ .formitiva-group {\r
367
+ margin-bottom: calc(var(--formitiva-space) * 1.5);\r
368
+ }\r
369
+ }\r
370
+ \r
371
+ @media (max-width: 480px) {\r
372
+ .formitiva-container {\r
373
+ padding: calc(var(--formitiva-space) * 0.7);\r
374
+ }\r
375
+ \r
376
+ .formitiva-field {\r
377
+ gap: 8px;\r
378
+ }\r
379
+ \r
380
+ .formitiva-label {\r
381
+ font-size: 0.85rem;\r
382
+ line-height: 1.3;\r
383
+ }\r
384
+ \r
385
+ .formitiva-input,\r
386
+ .formitiva-textarea,\r
387
+ .formitiva-select {\r
388
+ padding: 14px;\r
389
+ }\r
390
+ \r
391
+ \r
392
+ }\r
393
+ `,je=J.createContext(void 0),L=()=>{const e=J.useContext(je);if(!e)throw new Error("useFormitivaContext must be used within a <FormitivaProvider>");return e};class ie{map={};register(t,r){if(!t||typeof t!="string")throw new Error("Registry key must be a non-empty string");this.map[t]=r}get(t){if(!(!t||typeof t!="string"))return this.map[t]}has(t){return!t||typeof t!="string"?!1:t in this.map}list(){return Object.keys(this.map)}entries(){return Object.entries(this.map)}values(){return Object.values(this.map)}size(){return Object.keys(this.map).length}unregister(t){return t in this.map?(delete this.map[t],!0):!1}clear(){this.map={}}registerAll(t){Array.isArray(t)?t.forEach(([r,n])=>{r&&typeof r=="string"&&this.register(r,n)}):t&&typeof t=="object"&&Object.entries(t).forEach(([r,n])=>{r&&typeof r=="string"&&this.register(r,n)})}getOrDefault(t,r){const n=this.get(t);return n!==void 0?n:r}}const at=typeof process<"u"&&process.env.NODE_ENV==="test";function st(e,t=300,r){const n=J.useRef(),o=J.useRef(e),i=J.useRef(null),s=r?.leading===!0,c=r?.trailing!==!1;J.useEffect(()=>{o.current=e},[e]),J.useEffect(()=>()=>{n.current&&clearTimeout(n.current)},[]);const a=p=>{o.current(...p)},u=J.useCallback(()=>{n.current&&(clearTimeout(n.current),n.current=void 0),i.current=null},[]),m=J.useCallback(()=>{n.current&&(clearTimeout(n.current),n.current=void 0),c&&i.current&&(a(i.current),i.current=null)},[c]);return{callback:J.useCallback((...p)=>{if(at){a(p);return}const v=s&&!n.current;i.current=p,v&&a(p),n.current&&clearTimeout(n.current),n.current=setTimeout(()=>{n.current=void 0,c&&i.current&&(a(i.current),i.current=null)},t)},[s,c,t]),cancel:u,flush:m}}const $={field:"formitiva-field",label:"formitiva-label",input:"formitiva-input",textInput:"formitiva-input--text",inputNumber:"formitiva-input--number",inputSelect:"formitiva-select",rangeInput:"formitiva-input--range",button:"formitiva-button",description:"formitiva-description"},H=(...e)=>{const t=[];for(const r of e)r&&(typeof r=="string"?t.push(r):typeof r=="object"&&Object.entries(r).forEach(([n,o])=>{o&&t.push(n)}));return t.join(" ")};function ae(e){return e.toLowerCase().includes("dark")}function gr(e){if(!e)return!1;const t=e.trim();let r=0,n=0,o=0;if(t.startsWith("#")){const s=t.substring(1);s.length===3||s.length===4?(r=parseInt(s[0]+s[0],16),n=parseInt(s[1]+s[1],16),o=parseInt(s[2]+s[2],16)):(s.length===6||s.length===8)&&(r=parseInt(s.substring(0,2),16),n=parseInt(s.substring(2,4),16),o=parseInt(s.substring(4,6),16))}else if(t.startsWith("rgb")){const s=t.match(/\d+(\.\d+)?/g);s&&s.length>=3&&(r=Math.min(255,Math.max(0,parseFloat(s[0]))),n=Math.min(255,Math.max(0,parseFloat(s[1]))),o=Math.min(255,Math.max(0,parseFloat(s[2]))))}else return!1;return(r*299+n*587+o*114)/1e3<128}const vr=()=>f.jsxs("svg",{width:"1em",height:"1em",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:[f.jsx("path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"}),f.jsx("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]}),hr=({content:e,size:t="medium",animation:r=!0})=>{const{t:n,theme:o,formStyle:i,fieldStyle:s}=L(),[c,a]=l.useState(!1),[u,m]=l.useState({x:0,y:0}),[d,p]=l.useState(!1),v=l.useRef(null),k=l.useRef(null),y=l.useRef(null),g=l.useId(),b=ae(o),[C,M]=l.useState(void 0);l.useLayoutEffect(()=>{if(!v.current)return;const I="rgba(255,255,255,0.1)",x=getComputedStyle(v.current).getPropertyValue("--formitiva-primary-bg").trim();if(x&&typeof CSS<"u"&&CSS.supports?.("color: color-mix(in srgb, red, blue)")){const j=gr(x)?"black":"white";M(`color-mix(in srgb, var(--formitiva-primary-bg) 85%, ${j} 15%)`)}else M(I)},[]);const R=l.useMemo(()=>{const h={icon:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:"1.2em",height:"1.2em",fontSize:"0.9em",fontWeight:"bold",borderRadius:"50%",backgroundColor:C??(b?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.1)"),color:`var(--formitiva-text-color, ${b?"#f0f0f0":"#333"})`,border:`1px solid ${b?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.1)"}`,cursor:"pointer",transition:r?"all 0.2s ease":void 0,marginLeft:"0.3em"},text:{...{small:{padding:"4px 8px",fontSize:"11px",maxWidth:"200px"},medium:{padding:"6px 10px",fontSize:"12px",maxWidth:"240px"},large:{padding:"8px 12px",fontSize:"13px",maxWidth:"280px"}}[t],position:"fixed",backgroundColor:`var(--formitiva-tooltip-color-bg, ${b?"rgba(45,45,45,0.95)":"rgba(34, 10, 170, 0.92)"})`,color:`var(--formitiva-tooltip-color, ${b?"#f0f0f0":"#fff"})`,borderRadius:"6px",border:`1px solid ${b?"rgba(255,255,255,0.1)":"rgba(0,0,0,0.1)"}`,boxShadow:b?"0 8px 16px rgba(0,0,0,0.4)":"0 6px 18px rgba(0,0,0,0.12)",zIndex:2147483647,opacity:0,pointerEvents:"none",transition:r?"opacity 0.2s ease":void 0,whiteSpace:"normal",wordBreak:"break-word",boxSizing:"border-box"},textVisible:{opacity:1,pointerEvents:"auto"}},x=(w,S,N)=>{const O=w?.[S];return(N&&O?O[N]:void 0)??{}};return{icon:{...h.icon,...x(i,"tooltip","icon"),...x(s,"tooltip","icon")},text:{...h.text,...x(i,"tooltip","text"),...x(s,"tooltip","text")},textVisible:h.textVisible}},[b,t,r,i,s,C]);l.useLayoutEffect(()=>{if(!c||!v.current||!k.current){p(!1);return}const I=v.current.getBoundingClientRect();y.current=I;const h=k.current.getBoundingClientRect(),x=8,j=window.innerWidth,w=window.innerHeight,S=-4;let N=I.right+x,V=I.top+I.height/2-h.height/2+S;N+h.width>j-x&&(N=I.left-x-h.width),N=Math.max(x,Math.min(N,j-h.width-x)),V=Math.max(x,Math.min(V,w-h.height-x)),m({x:N,y:V}),p(!0);const O=v.current.closest("[data-formitiva-theme]"),q=document.getElementById("popup-root");if(O&&q){const X=getComputedStyle(O);q.style.setProperty("--formitiva-tooltip-color-bg",X.getPropertyValue("--formitiva-tooltip-color-bg")),q.style.setProperty("--formitiva-tooltip-color",X.getPropertyValue("--formitiva-tooltip-color"))}},[c]);const E=typeof document<"u"?document.getElementById("popup-root"):null,F=f.jsx("div",{ref:k,"data-tooltip-id":g,style:{...R.text,transform:d?"translateY(0) scale(1)":"translateY(-4px) scale(0.98)",transition:"opacity 120ms ease, transform 120ms ease, visibility 120ms ease",width:240,...d?R.textVisible:{},top:u.y,left:u.x},children:n(e)});return f.jsxs(f.Fragment,{children:[f.jsx("span",{"data-testid":"tooltip-icon",ref:v,"aria-describedby":c?g:void 0,onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),style:{...R.icon},children:f.jsx(vr,{})}),c&&(E?fe.createPortal(F,E):F)]})},lt=l.memo(hr),be=l.memo(({field:e,error:t,children:r,showLabel:n=!0})=>{const{t:o}=L(),i=e.labelLayout==="column-center"?"center":"left",s=l.useMemo(()=>{const u={display:"flex",flexDirection:"column",gap:"var(--formitiva-label-gap, 4px)"};return u["--label-align"]=i,u},[i]),c=l.useMemo(()=>({textAlign:i,width:"100%",minWidth:"unset",display:"block",marginBottom:"10px"}),[i]),a=l.useMemo(()=>({display:"flex",alignItems:"center",gap:"var(--formitiva-inline-gap, 8px)",width:"100%"}),[]);return f.jsxs("div",{className:`${$.field} column-layout`,style:s,children:[n&&f.jsx("label",{id:`${e.name}-label`,className:$.label,htmlFor:e.name,style:c,children:o(e.displayName)}),f.jsxs("div",{style:a,children:[f.jsx("div",{style:{flex:1,minWidth:0},children:r}),e.tooltip&&f.jsx(lt,{content:e.tooltip})]}),t&&f.jsx(Ee,{id:`${e.name}-error`,children:t})]})});be.displayName="ColumnFieldLayout";const ct=l.memo(({field:e,error:t,children:r,rightAlign:n=!1})=>{const{t:o}=L(),i=l.useMemo(()=>({display:"flex",alignItems:"center",gap:"3px"}),[]);return f.jsxs("div",{className:`${$.field} row-layout`,children:[f.jsx("label",{id:`${e.name}-label`,className:$.label,htmlFor:e.name,style:{textAlign:"left"},children:o(e.displayName)}),f.jsxs("div",{children:[f.jsxs("div",{style:i,children:[n?f.jsx("div",{style:{display:"flex",flex:1,justifyContent:"flex-end"},children:r}):r,e.tooltip&&f.jsx(lt,{content:e.tooltip})]}),t&&f.jsx(Ee,{id:`${e.name}-error`,children:t})]})]})});ct.displayName="RowFieldLayout";const z=l.memo(({field:e,error:t,children:r,rightAlign:n=!1})=>e.labelLayout==="column-left"||e.labelLayout==="column-center"?f.jsx(be,{field:e,error:t,showLabel:!0,children:r}):e.type==="checkbox"||e.type==="switch"?f.jsx(be,{field:e,error:t,showLabel:!1,children:r}):f.jsx(ct,{field:e,error:t,rightAlign:n,children:r}));z.displayName="StandardFieldLayout";const Ee=l.memo(({children:e,id:t})=>{const r=l.useMemo(()=>({color:"var(--formitiva-error-color, red)",fontSize:"13px",marginTop:"4px",fontWeight:"var(--formitiva-font-weight)",display:"flex",flex:1,justifyContent:"flex-start",alignItems:"flex-start",userSelect:"none"}),[]);return f.jsx("div",{id:t,style:r,children:e})});Ee.displayName="ErrorDiv";const ut=l.memo(({name:e,onChange:t})=>{const{t:r}=L();return f.jsxs("div",{style:{marginBottom:16},children:[f.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 2fr",gap:12,alignItems:"center"},children:[f.jsx("label",{htmlFor:"instance-name-input",style:{margin:0,fontSize:"0.95em",fontWeight:500,color:"var(--formitiva-text-color, #333)"},children:r("Instance Name")}),f.jsx("input",{id:"instance-name-input",type:"text",value:e,className:H($.input,$.textInput),onChange:n=>t(n.target.value),placeholder:r("Enter instance name")})]}),f.jsx("div",{style:{height:"1px",backgroundColor:"var(--formitiva-separator, #e6e6e6)",marginTop:12,marginBottom:12}})]})});ut.displayName="InstanceName";class br extends ie{registerInCategory(t,r,n){this.get(t)||this.register(t,{});const o=this.get(t);o[r]=n}getFromCategory(t,r){return this.get(t)?.[r]}listFromCategory(t){return Object.keys(this.get(t)||{})}listCategories(){return this.list()}}const mt=new ie,dt=new br,Ie=new ie;function ft(e,t){mt.register(e,t)}function pt(e,t,r){dt.registerInCategory(e,t,r)}function gt(e,t){if(dn(e)){console.warn(`[Formitiva] Can't override builtin type field validation handler for type "${e}".`);return}Ie.register(e,t)}function T(e,t){Ie.register(e,t)}function vt(e,t){return dt.getFromCategory(e,t)||null}function ht(e){return mt.get(e)||null}function bt(e){return Ie.get(e)||null}function yr(e){return(typeof e=="object"||typeof e=="function")&&e!==null&&typeof e.then=="function"}const _e=new Map,Ke=new Map;function Fe(e,t,r,n){if(!t||!t.validationHandlerName)return null;let o,i;if(typeof t.validationHandlerName=="string")o=e,i=t.validationHandlerName;else if(Array.isArray(t.validationHandlerName)){const[a,u]=t.validationHandlerName;if(u)o=a,i=u;else if(a)o=e,i=a;else return null}else return null;const s=`${o}:${i}`;let c=_e.get(s);if(c===void 0&&(c=vt(o,i)||null,_e.set(s,c)),c)try{return c(t.name,r,n)||null}catch(a){return String(a instanceof Error?a.message:a)}return null}function xr(e,t,r,n){return Fe(e,t,r,n)}function ye(e,t,r,n){const o=bt(t.type);if(o){const i=o(t,r,n);if(i)return i}else if(String(r??"").trim()==="")return t.required?n("Value required"):null;return Fe(e,t,r,n)}async function wr(e,t,r){if(!e||typeof e.validationHandlerName!="string")return null;const n=e.validationHandlerName;let o=Ke.get(n);if(o===void 0&&(o=ht(n)||null,Ke.set(n,o)),o)try{const i=o(t,r);return yr(i)?await i||null:i||null}catch(i){return[String(i instanceof Error?i.message:i)]}return null}function B(e,t){const{definitionName:r,t:n,fieldValidationMode:o}=L();return l.useCallback((i,s="change")=>o==="onEdit"||o==="realTime"||o==="onBlur"&&s==="blur"?ye(r,e,i,n):t??null,[r,e,n,o,t])}const yt=({field:e,value:t=!1,onChange:r,onError:n,error:o})=>{const{t:i}=L(),s=B(e,o),c=l.useRef(n),[a,u]=l.useState(null),m=l.useRef(null);l.useEffect(()=>{c.current=n},[n]),l.useEffect(()=>{const g=s(t,"sync");g!==m.current&&(m.current=g,u(g),o||c.current?.(g??null))},[t,s,o]);const d=l.useCallback(g=>{g!==m.current&&(m.current=g,u(g),o||c.current?.(g??null))},[o]),p=l.useCallback(g=>{const b=g.target.checked;d(s(b,"change")),r?.(b)},[r,d,s]),v=l.useCallback(g=>{if(g.key===" "||g.key==="Space"||g.key==="Spacebar"||g.code==="Space"||g.key==="Enter"){g.preventDefault();const C=!t;d(s(C,"change")),r?.(C)}},[r,t,d,s]),k=l.useCallback(g=>{d(s(g.target.checked,"blur"))},[d,s]),y=e.name;return f.jsx(z,{field:e,rightAlign:!1,error:a,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%"},children:[f.jsx("label",{className:$.label,htmlFor:y,style:{textAlign:"left",justifyContent:"flex-start"},children:i(e.displayName)}),f.jsx("input",{id:y,"data-testid":"boolean-checkbox",type:"checkbox",checked:t,onChange:p,onKeyDown:v,onBlur:k,"aria-checked":t,"aria-invalid":!!a,"aria-describedby":a?`${e.name}-error`:void 0,style:{cursor:"pointer",margin:"8px 0",width:"1.2em",height:"1.2em",verticalAlign:"middle",accentColor:"#0000FF"}})]})})};yt.displayName="CheckboxInput";const Sr=l.memo(yt);function _({value:e,disabled:t,onChange:r,onError:n,validate:o}){const i=l.useRef(null),s=l.useRef(null),c=l.useRef(n),[a,u]=l.useState(null);l.useEffect(()=>{c.current=n},[n]),l.useEffect(()=>{if(t){s.current!==null&&(s.current=null,c.current?.(null),u(null));return}const p=String(e??"");if(!(document.activeElement===i.current)){const k=o(p,"sync");k!==s.current&&(s.current=k,c.current?.(k??null),u(k)),i.current&&i.current.value!==p&&(i.current.value=p)}},[e,o,t]);const m=l.useCallback(p=>{if(t)return;const v=p.target.value,k=o(v,"change");k!==s.current&&(s.current=k,u(k),c.current?.(k??null)),r?.(v)},[r,o,t]),d=l.useCallback(()=>{if(t)return;const p=String(i.current?.value??e??""),v=o(p,"blur");v!==s.current&&(s.current=v,u(v),c.current?.(v??null))},[o,e,t]);return l.useEffect(()=>{const p=i.current;if(p)return p.addEventListener("blur",d),()=>{p.removeEventListener("blur",d)}},[d]),{inputRef:i,error:a,handleChange:m,handleBlur:d}}const Ge=[{label:"Black",value:"#000000"},{label:"White",value:"#ffffff"},{label:"Red",value:"#ff0000"},{label:"Green",value:"#008000"},{label:"Blue",value:"#0000ff"},{label:"Yellow",value:"#ffff00"},{label:"Cyan",value:"#00ffff"},{label:"Magenta",value:"#ff00ff"},{label:"Orange",value:"#ffa500"},{label:"Purple",value:"#800080"},{label:"Brown",value:"#a52a2a"},{label:"Gray",value:"#808080"},{label:"Light Gray",value:"#d3d3d3"},{label:"Pink",value:"#ffc0cb"}],Cr=/^#([0-9A-F]{3}){1,2}$/i,kr="#000000",Nr=e=>Cr.test(e),ge=e=>{if(!e||!Nr(e))return kr;const t=e.toLowerCase();return t.length===4?"#"+t.slice(1).split("").map(r=>r+r).join(""):t},jr=e=>{const t=parseInt(e.slice(1),16);return{r:t>>16&255,g:t>>8&255,b:t&255}},xt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i}=L(),s=B(e,o),c=l.useMemo(()=>ge(t),[t]),{inputRef:a,error:u,handleChange:m,handleBlur:d}=_({value:c,onChange:r,onError:n,validate:s}),[p,v]=l.useState(c);l.useEffect(()=>{v(c)},[c]);const k=l.useCallback(E=>{const F=ge(E.target.value);v(F),m({target:{value:F}})},[m]),y=l.useCallback(E=>{const F=ge(E.target.value);v(F),m({target:{value:F}})},[m]),b=l.useMemo(()=>new Set(Ge.map(E=>E.value)),[]).has(p),{r:C,g:M,b:R}=l.useMemo(()=>jr(p),[p]);return f.jsx(z,{field:e,error:u,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,width:"100%"},children:[f.jsxs("select",{id:e.name,value:p,onChange:y,onBlur:d,className:H($.input,$.inputSelect),"aria-invalid":!!u,children:[Ge.map(E=>f.jsx("option",{value:E.value,children:i(E.label)},E.value)),!b&&f.jsxs("option",{value:p,children:["(",C,", ",M,", ",R,")"]})]}),f.jsx("label",{style:{width:"2.5em",height:"1.8em",border:"1px solid #ccc",borderRadius:4,backgroundColor:p,cursor:"pointer",overflow:"hidden",flexShrink:0},children:f.jsx("input",{ref:a,id:`${e.name}-color`,type:"color",defaultValue:p,onChange:k,onBlur:d,style:{opacity:0,width:"100%",height:"100%"},"aria-invalid":!!u})})]})})};xt.displayName="ColorInput";const Er=l.memo(xt),Je=e=>{if(!e)return null;const t=new Date(e);return isNaN(t.getTime())?null:t},Ye=e=>{if(!e)return"";if(/^\d{4}-\d{2}-\d{2}$/.test(e))return Je(e)?e:"";const r=Je(e);if(r){const n=r.getUTCFullYear(),o=String(r.getUTCMonth()+1).padStart(2,"0"),i=String(r.getUTCDate()).padStart(2,"0");return`${n}-${o}-${i}`}return""},wt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),s=Ye(t),{inputRef:c,error:a,handleChange:u}=_({value:s,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:a,children:f.jsx("input",{id:e.name,type:"date",ref:c,defaultValue:Ye(t),onChange:u,className:H($.input,$.textInput),...e.minDate?{min:e.minDate}:{},...e.maxDate?{max:e.maxDate}:{},"aria-invalid":!!a,"aria-describedby":a?`${e.name}-error`:void 0})})};wt.displayName="DateInput";const Ir=l.memo(wt),St=({field:e})=>{const{t}=L(),{displayText:r="",textAlign:n="left",allowHtml:o=!1}=e;return f.jsx("div",{className:$.description,style:{textAlign:n},...o?{dangerouslySetInnerHTML:{__html:t(r)}}:{children:t(r)}})};St.displayName="Description";const Fr=l.memo(St),Ct=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i,theme:s,formStyle:c,fieldStyle:a}=L(),u=l.useRef(null),m=l.useRef(n),[d,p]=l.useState(!1),[v,k]=l.useState(null);l.useEffect(()=>{m.current=n},[n]);const y=B(e,o),[g,b]=l.useState(null),C=l.useRef(null);l.useEffect(()=>{const j=String(t??"");let w=y(j,"sync");if(w&&e.options.length>0){const S=String(e.options[0].value);r?.(S),w=null}w!==C.current&&(C.current=w,b(w),m.current?.(w??null))},[t,y,r,e.options]);const M=()=>{if(!u.current)return;const j=u.current.getBoundingClientRect();k({x:j.left,y:j.bottom}),p(w=>!w)},R=j=>{const w=y(j,"change");w!==C.current&&(C.current=w,b(w),m.current?.(w??null)),r?.(j),p(!1)},E=l.useCallback(()=>{const j=y(String(t??""),"blur");j!==C.current&&(C.current=j,b(j),m.current?.(j??null))},[y,t]),F=l.useMemo(()=>{const j=e.options.find(w=>String(w.value)===String(t));return j?i(j.label):""},[e.options,t,i]),I=(j,w,S)=>{if(!w)return{};const V=j?.[w];return(S&&V?V[S]:void 0)??{}},h=l.useMemo(()=>({height:"var(--formitiva-input-height, 2.5em)",display:"flex",alignItems:"center",boxSizing:"border-box",padding:"0 0.75em",cursor:"pointer",position:"relative",textAlign:"left",...I(c,"dropdown","control"),...I(a,void 0,"control")}),[c,a]),x=l.useMemo(()=>({position:"absolute",right:"0.7em",top:"50%",transform:"translateY(-50%)",pointerEvents:"none",fontSize:"0.8em",color:"var(--formitiva-text-muted, #999)",...I(c,"dropdown","arrow"),...I(a,void 0,"arrow")}),[c,a]);return f.jsxs("div",{children:[f.jsx(z,{field:e,error:g,children:f.jsxs("div",{ref:u,className:"formitiva-input",style:h,onClick:M,tabIndex:0,role:"combobox","aria-haspopup":"listbox","aria-expanded":d,"aria-invalid":!!g,"aria-describedby":g?`${e.name}-error`:void 0,onKeyDown:j=>{(j.key==="Enter"||j.key===" ")&&(j.preventDefault(),M())},onBlur:E,children:[f.jsx("span",{style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",paddingRight:"1.8em",display:"block"},children:F}),f.jsx("span",{style:x,"aria-hidden":!0,children:"▼"})]})}),d&&v&&f.jsx(Mr,{position:v,options:e.options,selectedValue:String(t),onSelect:R,onClose:()=>p(!1),controlRef:u,theme:s,t:i})]})},Mr=({position:e,options:t,selectedValue:r,onSelect:n,onClose:o,controlRef:i,theme:s,t:c})=>{const a=l.useRef(null),[u,m]=l.useState(-1),{formStyle:d,fieldStyle:p}=L(),v=ae(s??"light");l.useLayoutEffect(()=>{if(!i.current)return;const h=i.current.closest("[data-formitiva-theme]"),x=document.getElementById("popup-root");if(h&&x){const j=getComputedStyle(h);x.style.setProperty("--formitiva-secondary-bg",j.getPropertyValue("--formitiva-secondary-bg")),x.style.setProperty("--formitiva-text-color",j.getPropertyValue("--formitiva-text-color")),x.style.setProperty("--formitiva-option-menu-hover-bg",j.getPropertyValue("--formitiva-option-menu-hover-bg"))}},[i]);const k=(h,x,j)=>{if(!x)return{};const S=h?.[x];return(j&&S?S[j]:void 0)??{}},y=l.useMemo(()=>({maxHeight:200,overflowY:"auto",background:"var(--formitiva-secondary-bg, #fff)",border:"1px solid var(--formitiva-border-color, #ccc)",borderRadius:4,zIndex:2e3,boxShadow:"var(--formitiva-shadow, 0 2px 8px rgba(0,0,0,0.15))",pointerEvents:"auto",color:"var(--formitiva-text-color, #000)",fontSize:"var(--formitiva-popup-font-size, 0.875rem)",...k(d,"dropdown","popup"),...k(p,void 0,"popup")}),[d,p]),g=l.useMemo(()=>({padding:"6px 8px",cursor:"pointer",display:"flex",alignItems:"center",background:"transparent",color:"var(--formitiva-text-color, #000)",...k(d,"dropdown","option"),...k(p,void 0,"option")}),[d,p]);l.useEffect(()=>{const h=x=>{const j=x.target;!a.current?.contains(j)&&!i.current?.contains(j)&&o()};return document.addEventListener("mousedown",h),()=>document.removeEventListener("mousedown",h)},[o,i]),l.useEffect(()=>{if(a.current&&t.length>0){const h=t.findIndex(x=>String(x.value)===r);requestAnimationFrame(()=>m(h>=0?h:0))}},[t,r]),l.useEffect(()=>{if(!a.current||u<0)return;const h=a.current.querySelector(`#opt-${u}`);h&&requestAnimationFrame(()=>h.focus())},[u]);const b=250,C=200,[M,R]=l.useState(null),[E,F]=l.useState(null);if(l.useEffect(()=>{if(typeof window>"u")return;const h=()=>{let w=e.x,S=e.y,N=b;const V=i?.current;if(V){const O=V.getBoundingClientRect();w=O.left,S=O.bottom,N=Math.max(80,Math.round(O.width))}w=Math.min(w,window.innerWidth-N),S=Math.min(S,window.innerHeight-C),R({left:w,top:S}),F(N)};h(),window.addEventListener("scroll",h,!0),window.addEventListener("resize",h);let x=null;const j=i?.current;return typeof ResizeObserver<"u"&&j&&(x=new ResizeObserver(()=>h()),x.observe(j)),()=>{window.removeEventListener("scroll",h,!0),window.removeEventListener("resize",h),x&&j&&x.unobserve(j)}},[i,e.x,e.y]),typeof window>"u")return null;let I=document.getElementById("popup-root");return I||(I=document.createElement("div"),I.id="popup-root",document.body.appendChild(I)),fe.createPortal(f.jsx("div",{ref:a,role:"listbox","aria-activedescendant":u>=0?`opt-${u}`:void 0,style:{position:"fixed",top:M?M.top:e.y,left:M?M.left:e.x,width:E??b,...y},"data-formitiva-theme":s??"light",children:t.map((h,x)=>{const j=String(h.value)===r,w=v?"var(--formitiva-option-menu-hover-bg, rgba(255,255,255,0.01))":"var(--formitiva-option-menu-hover-bg, #eee)",S={...g,background:x===u?w:g.background,fontWeight:j?"bold":"normal"};return f.jsx("div",{id:`opt-${x}`,onMouseDown:N=>{N.stopPropagation(),n(String(h.value))},onKeyDown:N=>{const V=t.length;switch(N.key){case"ArrowDown":N.preventDefault(),m(O=>(O+1)%V);break;case"ArrowUp":N.preventDefault(),m(O=>(O-1+V)%V);break;case"Home":N.preventDefault(),m(0);break;case"End":N.preventDefault(),m(V-1);break;case"Enter":case" ":N.preventDefault(),N.stopPropagation(),n(String(h.value));break;case"Escape":N.preventDefault(),o(),i?.current?.focus();break}},tabIndex:x===u?0:-1,role:"option","aria-selected":j,style:S,onMouseEnter:N=>{N.currentTarget.style.background=w,m(x)},onMouseLeave:N=>{N.currentTarget.style.background="transparent",m(V=>V===x?-1:V)},children:c(h.label)},String(h.value))})}),I)};Ct.displayName="DropdownInput";const Vr=l.memo(Ct),kt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"email",defaultValue:String(t??""),ref:s,onChange:a,className:H($.input,$.textInput),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};kt.displayName="EmailInput";const $r=l.memo(kt),Nt=({field:e})=>{const{theme:t}=L(),{color:r=ae(t)?"#444444":"#CCCCCC",thickness:n=1,margin:o="8px 0"}=e;return f.jsx("div",{style:{width:"auto",height:"0",borderTop:`${n}px solid ${r}`,margin:o}})};Nt.displayName="FieldSeparator";const Rr=l.memo(Nt),jt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i,theme:s}=L(),[c,a]=l.useState(!1),u=l.useRef(null),m=l.useRef(n),d=l.useRef(null),[p,v]=l.useState(null),k=ae(s);l.useEffect(()=>{m.current=n},[n]);const y=(w,S)=>S.some(N=>N.name===w.name&&N.size===w.size&&N.lastModified===w.lastModified),g=B(e,o),b=l.useCallback(w=>{w!==d.current&&(d.current=w,v(w),m.current?.(w??null))},[]);l.useEffect(()=>{const w=g(t??[],"sync");r?.(t),b(w)},[t,g,b]);const C=w=>{const S=w.target.files;let N=null;if(S&&S.length>0){const O=Array.from(S);if(e.multiple){const q=Array.isArray(t)?t:[],X=O.filter(re=>!y(re,q));N=[...q,...X]}else N=O[0]}const V=g(N??[],"change");b(V),r?.(N),w.target&&(w.target.value="")},M=w=>{w.preventDefault(),w.stopPropagation(),a(!1);const S=w.dataTransfer.files;if(S&&S.length>0){const N=Array.from(S);let V=null;if(e.multiple){const q=Array.isArray(t)?t:[],X=N.filter(re=>!y(re,q));V=[...q,...X]}else V=N[0];const O=g(V,"change");b(O),r?.(V)}},R=w=>{w.preventDefault(),w.stopPropagation(),a(!0)},E=w=>{w.preventDefault(),w.stopPropagation(),a(!1)},F=w=>{if(Array.isArray(t)&&typeof w=="number"){const S=t.filter((O,q)=>q!==w),N=S.length>0?S:null,V=g(N??[],"change");b(V),r?.(N)}else{const S=g([],"change");b(S),r?.(null)}},I=l.useCallback(()=>{b(g(t??[],"blur"))},[b,g,t]),h=()=>{const w=Array.isArray(t)?t:t?[t]:[];return w.length===0?null:f.jsx("div",{style:{marginTop:"8px",marginLeft:"20px",display:"flex",flexDirection:"column",gap:"6px",maxHeight:"200px",overflowY:"auto"},children:w.map((S,N)=>f.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"center"},children:[f.jsx("input",{type:"text",value:S.name,disabled:!0,readOnly:!0,title:S.name,className:"formitiva-input",style:{flex:1,cursor:"default",opacity:.8,minWidth:0}}),f.jsx("button",{type:"button",onClick:()=>F(Array.isArray(t)?N:void 0),"aria-label":i("Remove file"),style:{background:"transparent",border:"none",color:"var(--formitiva-color-error, #ef4444)",cursor:"pointer",padding:"2px 6px",fontSize:"1.125rem",lineHeight:1,borderRadius:"4px",transition:"background-color 0.2s",flexShrink:0},onMouseEnter:V=>{V.currentTarget.style.backgroundColor="var(--formitiva-bg-hover, #fee)"},onMouseLeave:V=>{V.currentTarget.style.backgroundColor="transparent"},children:"��"})]},`${S.name}-${N}`))})},[x,j]=l.useState(!1);return f.jsx(z,{field:e,error:p,children:f.jsxs("div",{style:{width:"100%"},children:[f.jsxs("div",{className:"formitiva-input",onDrop:M,onDragOver:R,onDragLeave:E,onMouseEnter:()=>j(!0),onMouseLeave:()=>j(!1),onBlur:I,style:{position:"relative",borderStyle:"dashed",borderColor:c?"var(--formitiva-color-primary, #2563eb)":x?"var(--formitiva-border-hover, #4A4A4A)":p?"var(--formitiva-color-error, #ef4444)":void 0,borderWidth:"1px",borderRadius:"var(--formitiva-border-radius, 4px)",padding:"8px 12px",textAlign:"center",backgroundColor:c?`var(--formitiva-bg-hover, ${k?"#070707":"#eff6ff"})`:void 0,transition:"all 0.2s ease",cursor:"pointer",minHeight:"var(--formitiva-input-height, 34px)",width:"100%",maxWidth:"100%",alignSelf:"stretch",boxSizing:"border-box",display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",userSelect:"none"},onClick:()=>u.current?.click(),onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),u.current?.click())},role:"button",tabIndex:0,"aria-label":e.multiple?i("Choose Files or Drag & Drop"):i("Choose File or Drag & Drop"),"aria-invalid":!!p,"aria-describedby":p?`${e.name}-error`:void 0,children:[f.jsx("input",{id:e.name,ref:u,type:"file",accept:e.accept,multiple:e.multiple,style:{display:"none"},onChange:C}),f.jsx("div",{style:{fontSize:"1.25rem",opacity:.6,lineHeight:1,flexShrink:0},children:"📁"}),f.jsx("div",{style:{fontSize:"0.875rem",fontWeight:400,color:"var(--formitiva-text-color, #111827)",flex:1,textAlign:"left"},children:c?i("Drop files here"):e.multiple?i("Choose Files or Drag & Drop"):i("Choose File or Drag & Drop")})]}),h()]})})};jt.displayName="FileInput";const Ar=l.memo(jt),Et=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),s=Array.isArray(t)?t.join(", "):String(t??""),{inputRef:c,error:a,handleChange:u}=_({value:s,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:a,children:f.jsx("input",{id:e.name,type:"text",defaultValue:s,ref:c,onChange:u,className:H($.input,$.textInput),style:{flex:1},"aria-invalid":!!a,"aria-describedby":a?`${e.name}-error`:void 0})})};Et.displayName="FloatArrayInput";const Dr=l.memo(Et),It=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"text",ref:s,defaultValue:String(t??""),onChange:a,className:H($.input,$.inputNumber),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};It.displayName="FloatInput";const Pr=l.memo(It);function zr(){try{return"/"}catch{}try{if(typeof process<"u"&&process?.env?.PUBLIC_URL)return process.env.PUBLIC_URL}catch{}return"/"}const Ft=({field:e,value:t})=>{const{language:r,t:n}=L(),o=e.alignment||"center",i={left:"flex-start",center:"center",right:"flex-end"},s=typeof t=="string"?t:"";let c=s&&s.trim()!==""?s:typeof e.defaultValue=="string"?e.defaultValue:"";c&&!c.startsWith("/")&&(c=`${zr()}${c}`);const a=e.localized?.split(";").map(g=>g.trim()),[u,m]=l.useState(c||""),d=l.useRef(c||null);if(l.useEffect(()=>{if(!c)return;const g=c.split("/"),b=g.pop(),C=b.lastIndexOf(".");if(C===-1)return;const M=b.substring(0,C),R=b.substring(C);let E=null;a?.includes(r)&&(E=`${M}_${r}${R}`);const F=new AbortController;if(E){const I=[...g,E].join("/");fetch(I,{method:"HEAD",signal:F.signal}).then(h=>{const x=h.ok?I:c;x!==d.current&&(d.current=x,m(x))}).catch(()=>{c!==d.current&&(d.current=c,m(c))})}else{const I=c;I!==d.current&&(d.current=I,requestAnimationFrame(()=>m(I)))}return()=>{F.abort()}},[c,r,a]),!u)return null;const{width:p,height:v}=e,k={},y={borderRadius:"8px",objectFit:"contain",boxShadow:"0 2px 6px rgba(0,0,0,0.1)",margin:"0 0 8px 0"};return p&&v?(k.width=p,k.height=v,y.width=`${p}px`,y.height=`${v}px`):p&&!v?(k.width=p,y.width=`${p}px`,y.height="auto"):!p&&v&&(k.height=v,y.width="auto",y.height=`${v}px`),f.jsx(z,{field:e,children:f.jsx("div",{"data-testid":"image-wrapper",style:{display:"flex",justifyContent:i[o]||"center",margin:"0 0"},children:f.jsx("img",{src:u,alt:n?.(e.displayName||"Image")||e.displayName||"Image",...k,style:y})})})};Ft.displayName="ImageDisplay";const Or=l.memo(Ft),Mt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),s=Array.isArray(t)?t.join(", "):String(t??""),{inputRef:c,error:a,handleChange:u}=_({value:s,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:a,children:f.jsx("input",{id:e.name,type:"text",defaultValue:s,ref:c,onChange:u,className:H($.input,$.textInput),style:{flex:1},"aria-invalid":!!a,"aria-describedby":a?`${e.name}-error`:void 0})})};Mt.displayName="IntegerArrayInput";const Br=l.memo(Mt),Vt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"text",defaultValue:String(t??""),ref:s,onChange:a,className:H($.input,$.inputNumber),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};Vt.displayName="IntegerInput";const Lr=l.memo(Vt),$t=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("textarea",{id:e.name,defaultValue:String(t??""),ref:s,onChange:a,style:{resize:"vertical",minHeight:e.minHeight??"80px",width:"100%",boxSizing:"border-box"},className:H($.input,$.textInput),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};$t.displayName="MultilineTextInput";const Tr=l.memo($t),Rt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=l.useRef(n);l.useEffect(()=>{i.current=n},[n]);const{t:s,theme:c,formStyle:a,fieldStyle:u}=L(),m=(S,N,V)=>{if(!N)return{};const q=S?.[N];return(V&&q?q[V]:void 0)??{}},d=l.useRef(null),[p,v]=l.useState(!1),[k,y]=l.useState(null),g=l.useMemo(()=>e.options.map(S=>({value:S.value,label:s(S.label)})),[e.options,s]),b=l.useMemo(()=>{const S=Array.isArray(t)?t:[],N=new Set(g.map(V=>V.value));return S.filter(V=>N.has(V))},[t,g]),C=B(e,o),[M,R]=l.useState(null),E=l.useRef(null);l.useEffect(()=>{const S=C(Array.isArray(t)?t:[],"sync");S!==E.current&&(E.current=S,R(S),i.current?.(S??null))},[t,C]);const F=()=>{if(!d.current)return;const S=d.current.getBoundingClientRect();y({x:S.left,y:S.bottom}),v(N=>!N)},I=S=>{const N=b.includes(S)?b.filter(O=>O!==S):[...b,S],V=C(N,"change");V!==E.current&&(E.current=V,R(V),i.current?.(V??null)),r?.(N)},h=l.useCallback(()=>{const S=C(b,"blur");S!==E.current&&(E.current=S,R(S),i.current?.(S??null))},[b,C]),x=l.useMemo(()=>({height:"var(--formitiva-input-height, 2.5rem)",display:"flex",alignItems:"center",cursor:"pointer",position:"relative",textAlign:"left",...m(a,"multiSelect","control"),...m(u,void 0,"control")}),[a,u]),j=l.useMemo(()=>({position:"absolute",right:"1.5em",top:"50%",transform:"translateY(-50%)",background:"none",border:"none",cursor:"pointer",fontSize:"0.8em",color:"var(--formitiva-text-muted, #999)",padding:0,...m(a,"multiSelect","clearButton"),...m(u,void 0,"clearButton")}),[a,u]),w=l.useMemo(()=>({position:"absolute",right:"0.7em",top:"50%",transform:"translateY(-50%)",pointerEvents:"none",fontSize:"0.8em",color:"var(--formitiva-text-muted, #999)",...m(a,"multiSelect","arrow"),...m(u,void 0,"arrow")}),[a,u]);return f.jsxs("div",{children:[f.jsx(z,{field:e,error:M,children:f.jsx("div",{style:{width:"100%"},children:f.jsxs("div",{ref:d,className:"formitiva-multiselection-control formitiva-input",style:x,onClick:F,onBlur:h,tabIndex:0,role:"button","aria-haspopup":"listbox","aria-expanded":p,"aria-invalid":!!M,"aria-describedby":M?`${e.name}-error`:void 0,onKeyDown:S=>{(S.key==="Enter"||S.key===" ")&&(S.preventDefault(),F())},children:[f.jsxs("span",{style:{flex:1,color:"var(--formitiva-text-muted, #888)"},children:[b.length," / ",g.length," selected"]}),b.length>0&&f.jsx("button",{type:"button","aria-label":"Clear selections",onClick:S=>{S.stopPropagation();const N=C([],"change");N!==E.current&&(E.current=N,R(N),i.current?.(N??null)),r?.([])},style:j,children:f.jsx("span",{style:j,"aria-hidden":!0,children:"✖"})}),f.jsx("span",{style:w,"aria-hidden":!0,children:"▼"})]})})}),p&&k&&f.jsx(Hr,{position:k,options:g,selectedValues:b,onToggleOption:I,onClose:()=>v(!1),controlRef:d,theme:c})]})},Hr=({position:e,options:t,selectedValues:r,onToggleOption:n,onClose:o,controlRef:i,theme:s})=>{const c=l.useRef(null),[a,u]=l.useState(-1),{formStyle:m,fieldStyle:d}=L(),p=ae(s??"light");l.useLayoutEffect(()=>{if(!i.current)return;const I=i.current.closest("[data-formitiva-theme]"),h=document.getElementById("popup-root");if(I&&h){const x=getComputedStyle(I);h.style.setProperty("--formitiva-secondary-bg",x.getPropertyValue("--formitiva-secondary-bg")),h.style.setProperty("--formitiva-text-color",x.getPropertyValue("--formitiva-text-color")),h.style.setProperty("--formitiva-option-menu-hover-bg",x.getPropertyValue("--formitiva-option-menu-hover-bg"))}},[i]);const v=(I,h,x)=>{if(!h)return{};const w=I?.[h];return(x&&w?w[x]:void 0)??{}},k=l.useMemo(()=>({maxHeight:200,overflowY:"auto",background:"var(--formitiva-secondary-bg, #fff)",border:"1px solid var(--formitiva-border-color, #ccc)",borderRadius:4,zIndex:2e3,boxShadow:"var(--formitiva-shadow, 0 2px 8px rgba(0,0,0,0.15))",pointerEvents:"auto",color:"var(--formitiva-text-color, #000)",fontSize:"var(--formitiva-popup-font-size, 0.875rem)",...v(m,"multiSelect","popup"),...v(d,void 0,"popup")}),[m,d]),y=l.useMemo(()=>({padding:"6px 8px",cursor:"pointer",display:"flex",alignItems:"center",background:"transparent",color:"var(--formitiva-text-color, #000)",...v(m,"multiSelect","option"),...v(d,void 0,"option")}),[m,d]);l.useEffect(()=>{const I=h=>{const x=h.target;!c.current?.contains(x)&&!i.current?.contains(x)&&o()};return document.addEventListener("mousedown",I),()=>document.removeEventListener("mousedown",I)},[o,i]),l.useEffect(()=>{c.current&&t.length>0&&requestAnimationFrame(()=>u(I=>I===-1?0:I))},[t.length]),l.useEffect(()=>{if(!c.current||a<0)return;const I=c.current.querySelector(`#multi-opt-${a}`);I&&requestAnimationFrame(()=>I.focus())},[a]);const g=250,b=200,[C,M]=l.useState(null),[R,E]=l.useState(null);if(l.useEffect(()=>{if(typeof window>"u")return;const I=()=>{let j=e.x,w=e.y,S=g;const N=i?.current;if(N){const V=N.getBoundingClientRect();j=V.left,w=V.bottom,S=Math.max(80,Math.round(V.width))}j=Math.min(j,window.innerWidth-S),w=Math.min(w,window.innerHeight-b),M({left:j,top:w}),E(S)};I(),window.addEventListener("scroll",I,!0),window.addEventListener("resize",I);let h=null;const x=i?.current;return typeof ResizeObserver<"u"&&x&&(h=new ResizeObserver(()=>I()),h.observe(x)),()=>{window.removeEventListener("scroll",I,!0),window.removeEventListener("resize",I),h&&x&&h.unobserve(x)}},[i,e.x,e.y]),typeof window>"u")return null;let F=document.getElementById("popup-root");return F||(F=document.createElement("div"),F.id="popup-root",document.body.appendChild(F)),fe.createPortal(f.jsx("div",{ref:c,role:"listbox","aria-activedescendant":a>=0?`multi-opt-${a}`:void 0,style:{position:"fixed",top:C?C.top:e.y,left:C?C.left:e.x,width:R??g,...k},"data-formitiva-theme":s??"light",children:t.map((I,h)=>{const x=r.includes(I.value),j=p?"var(--formitiva-option-menu-hover-bg, rgba(255,255,255,0.01))":"var(--formitiva-option-menu-hover-bg, #eee)",w={...y,background:h===a?j:y.background};return f.jsxs("div",{id:`multi-opt-${h}`,onMouseDown:S=>{S.stopPropagation(),n(I.value)},onKeyDown:S=>{const N=t.length;switch(S.key){case"ArrowDown":S.preventDefault(),u(V=>(V+1)%N);break;case"ArrowUp":S.preventDefault(),u(V=>(V-1+N)%N);break;case"Home":S.preventDefault(),u(0);break;case"End":S.preventDefault(),u(N-1);break;case"Enter":case" ":S.preventDefault(),S.stopPropagation(),n(I.value);break;case"Escape":S.preventDefault(),o(),i?.current?.focus();break}},tabIndex:h===a?0:-1,role:"option","aria-selected":x,style:w,onMouseEnter:S=>{S.currentTarget.style.background=j,u(h)},onMouseLeave:S=>{S.currentTarget.style.background="transparent",u(N=>N===h?-1:N)},children:[f.jsx("input",{type:"checkbox",checked:x,readOnly:!0,style:{marginRight:8,width:"1.125em",height:"1.125em",verticalAlign:"middle",accentColor:p?"#10b981":"#22c55e",cursor:"pointer"}}),I.label]},I.value)})}),F)};Rt.displayName="MultiSelect";const qr=l.memo(Rt),At=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:String(t??""),onChange:r,onError:n,validate:i}),u=Math.max(1,Math.round(e.step??1));return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"number",defaultValue:String(t??""),ref:s,min:e.min??void 0,max:e.max??void 0,step:u,onChange:a,style:{width:"100%",height:"100%"},className:$.input,"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};At.displayName="NumericStepperInput";const Ur=l.memo(At),Dt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"tel",defaultValue:String(t??""),ref:s,onChange:a,className:H($.input,$.textInput),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};Dt.displayName="PhoneInput";const Wr=l.memo(Dt),Pt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i}=L(),s=B(e,o),c=e.layout?.toLowerCase()==="horizontal"?"row":"column",a=l.useRef(n);l.useEffect(()=>{a.current=n},[n]);const[u,m]=l.useState(null),d=l.useRef(null),p=l.useCallback(b=>{b!==d.current&&(d.current=b,m(b),a.current?.(b))},[]);l.useEffect(()=>{const b=t!=null?String(t):"",C=s(b,"sync");if(C&&e.options.length>0){const M=String(e.options[0].value);r?.(M)}p(C)},[t,e.options,s,r,p]);const v=b=>{const C=b.target.value,M=s(C,"change");p(M),r?.(C)},k=l.useCallback(b=>{const C=s(b.target.value,"blur");p(C)},[s,p]),y={display:"flex",flexDirection:c,flexWrap:c==="row"?"wrap":"nowrap",gap:c==="row"?"12px":"4px",alignItems:c==="row"?"center":"stretch",width:"100%",padding:c==="row"?"8px":void 0,boxSizing:"border-box"},g={display:c==="column"?"flex":"inline-flex",gap:"8px",alignItems:"center",whiteSpace:"nowrap",marginBottom:c==="column"?6:0,cursor:"pointer",width:c==="column"?"100%":void 0,justifyContent:"flex-start"};return f.jsx(z,{field:e,error:u,children:f.jsx("div",{className:$.input,"aria-labelledby":`${e.name}-label`,"aria-invalid":!!u,style:y,children:e.options.map(b=>{const C=String(b.value),M=`${e.name}-${C}`;return f.jsxs("label",{className:H($.label),style:g,onMouseDown:R=>R.preventDefault(),onClick:()=>{String(t??"")!==C&&v({target:{value:C}})},children:[f.jsx("input",{id:M,type:"radio",name:e.name,value:C,checked:String(t??"")===C,onChange:v,onBlur:k,style:{width:"1.1em",height:"1.1em"}}),f.jsx("span",{style:{userSelect:"none",textAlign:c==="column"?"left":void 0,flex:c==="column"?1:void 0,fontWeight:400},children:i(b.label)})]},C)})})})};Pt.displayName="RadioInput";const _r=l.memo(Pt),Kr={display:"flex",gap:4},Gr={cursor:"pointer",fontSize:"1.5rem",lineHeight:1,display:"inline-block",marginRight:"0.25rem",userSelect:"none",transition:"color 0.12s ease"},zt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i}=L(),s=B(e,o),c=e.max??5,a=e.icon?.trim()||"★",[u,m]=l.useState(null),d=l.useRef([]),[p,v]=l.useState(null),k=l.useRef(null),y=l.useRef(n);l.useEffect(()=>{y.current=n},[n]);const g=l.useCallback(E=>{E!==k.current&&(k.current=E,v(E),y.current?.(E??null))},[]),b=l.useMemo(()=>Math.min(Math.max(t??0,0),c),[t,c]);l.useEffect(()=>{g(s(b,"sync")??null)},[s,b,g]);const C=l.useCallback(E=>{const F=Math.min(Math.max(E,0),c);g(s(F,"change")??null),r?.(F)},[c,r,g,s]),M=l.useCallback(E=>{E.currentTarget.contains(E.relatedTarget)||g(s(b,"blur")??null)},[b,g,s]),R=l.useCallback((E,F)=>{switch(E.key){case"Enter":case" ":E.preventDefault(),C(F+1);break;case"ArrowRight":case"ArrowUp":E.preventDefault(),d.current[Math.min(c-1,F+1)]?.focus();break;case"ArrowLeft":case"ArrowDown":E.preventDefault(),d.current[Math.max(0,F-1)]?.focus();break}},[c,C]);return f.jsx(z,{field:e,error:p,children:f.jsx("div",{role:"radiogroup","aria-labelledby":`${e.name}-label`,"aria-invalid":!!p,"aria-describedby":p?`${e.name}-error`:void 0,style:Kr,onBlur:M,children:Array.from({length:c},(E,F)=>{const I=F<b,x=u!==null&&F<=u||I?"gold":"lightgray";return f.jsx("span",{ref:j=>d.current[F]=j,role:"radio",tabIndex:b>0?F===b-1?0:-1:F===0?0:-1,"aria-checked":I,"aria-label":`Rating ${F+1}`,title:i(`${e.displayName} ${F+1}`),onClick:()=>C(F+1),onKeyDown:j=>R(j,F),onMouseEnter:()=>m(F),onMouseLeave:()=>m(null),style:{...Gr,color:x},children:a},F)})})})};zt.displayName="RatingInput";const Jr=l.memo(zt),Ot=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i}=L(),s=B(e,o),{inputRef:c,error:a,handleChange:u}=_({value:t,onChange:r,onError:n,validate:s}),[m,d]=l.useState(!1),p=()=>d(v=>!v);return f.jsx(z,{field:e,error:a,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,width:"100%"},children:[f.jsx("input",{id:e.name,type:m?"text":"password",defaultValue:String(t??""),ref:c,onChange:u,className:H($.input,$.textInput),style:{flex:1,minWidth:0},"aria-invalid":!!a,"aria-describedby":a?`${e.name}-error`:void 0}),f.jsx("button",{type:"button",onClick:p,"aria-label":i(m?"Hide password":"Show password"),style:{background:"transparent",border:"none",cursor:"pointer",fontSize:16,lineHeight:1,padding:"4px 6px",flexShrink:0},children:m?"??":"???"})]})})};Ot.displayName="PasswordInput";const Yr=l.memo(Ot),Bt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),s=e.min??0,c=e.max??100,[a,u]=l.useState(()=>isNaN(Number(t))?String(s):String(Number(t)));l.useEffect(()=>{const C=isNaN(Number(t))?String(s):String(Number(t));u(C)},[t,s]);const[m,d]=l.useState(null),p=l.useRef(null),v=l.useRef(n);l.useEffect(()=>{v.current=n},[n]);const k=l.useCallback(C=>{C!==p.current&&(p.current=C,d(C),v.current?.(C??null))},[]);l.useEffect(()=>{k(i(a,"sync")??null)},[i,a,k]);const y=l.useCallback(C=>{const M=C.target.value;u(M),k(i(M,"change")??null),r?.(M)},[r,k,i]),g=l.useCallback(C=>{k(i(C.target.value,"blur")??null)},[k,i]),b=isNaN(Number(a))?String(s):String(Number(a));return f.jsx(z,{field:e,error:m,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",width:"100%"},children:[f.jsx("input",{id:`${e.name}-range`,type:"range",value:b,onChange:y,onBlur:g,min:s,max:c,step:"1.0",style:{padding:0,flex:1},className:$.rangeInput,"aria-invalid":!!m,"aria-describedby":m?`${e.name}-error`:void 0}),f.jsx("input",{id:e.name,type:"text",value:a,onChange:y,onBlur:g,required:!0,style:{width:"40px",minWidth:"40px",height:"2.3em",textAlign:"center",flexShrink:0},className:H($.input,$.textInput),"aria-invalid":!!m,"aria-describedby":m?`${e.name}-error`:void 0})]})})};Bt.displayName="SliderInput";const Xr=l.memo(Bt),Lt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const{t:i,formStyle:s,fieldStyle:c}=L(),a=B(e,o),[u,m]=l.useState(null),d=l.useRef(null),p=l.useRef(n);l.useEffect(()=>{p.current=n},[n]);const v=l.useCallback(h=>{h!==d.current&&(d.current=h,m(h),p.current?.(h??null))},[]);l.useEffect(()=>{v(a(!!t,"sync"))},[t,a,v]);const k=s,y=c,g=(h,x,j)=>{if(!x)return{};const w=h?.[x];return(j&&w?w[j]:void 0)??{}},b=l.useMemo(()=>({display:"inline-block",position:"relative",width:44,height:24,...g(k,"switch","label"),...g(y,void 0,"label")}),[k,y]),C=l.useMemo(()=>({position:"absolute",opacity:0,top:0,left:0,width:"100%",height:"100%",margin:0,cursor:"pointer",pointerEvents:"none",...g(k,"switch","hiddenInput"),...g(y,void 0,"hiddenInput")}),[k,y]),M=l.useMemo(()=>({position:"absolute",cursor:"pointer",top:0,left:0,right:0,bottom:0,backgroundColor:"var(--formitiva-switch-off-bg, #ccc)",transition:"0.3s",borderRadius:24,borderWidth:2,borderStyle:"solid",borderColor:"transparent",...g(k,"switch","slider"),...g(y,void 0,"slider")}),[k,y]),R=l.useMemo(()=>({position:"absolute",height:16,width:16,left:2,bottom:2,backgroundColor:"white",transition:"0.3s",borderRadius:"50%",boxShadow:"0 1px 3px rgba(0, 0, 0, 0.3)",...g(k,"switch","knob"),...g(y,void 0,"knob")}),[k,y]),E=!!t,F=()=>{const h=!E;v(a(h,"change")),r?.(h)},I=l.useCallback(()=>{v(a(E,"blur"))},[E,v,a]);return f.jsx(z,{field:e,error:u,rightAlign:!1,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%"},children:[f.jsx("label",{className:$.label,htmlFor:e.name,style:{textAlign:"left",justifyContent:"flex-start"},children:i(e.displayName)}),f.jsxs("label",{style:b,children:[f.jsx("input",{id:e.name,type:"checkbox",checked:E,readOnly:!0,"aria-label":i(e.displayName),"aria-invalid":!1,"aria-describedby":void 0,style:C,tabIndex:-1}),f.jsx("span",{role:"switch","data-testid":"switch",tabIndex:0,"aria-checked":E,"aria-invalid":!!u,"aria-describedby":u?`${e.name}-error`:void 0,onClick:F,onBlur:I,onKeyDown:h=>{(h.key===" "||h.key==="Spacebar"||h.key==="Space"||h.key==="Enter")&&(h.preventDefault(),F())},className:`formitiva-switch ${E?"active checked on":""} `,style:E?{...M,backgroundColor:"var(--formitiva-switch-on-bg, #22c55e)",borderColor:"var(--formitiva-switch-on-border, #16a34a)"}:M,children:f.jsx("span",{style:{...R,transform:E?"translateX(20px)":void 0}})})]})]})})};Lt.displayName="SwitchInput";const Zr=l.memo(Lt),xe=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"text",defaultValue:String(t??""),ref:s,onChange:a,className:H($.input,$.textInput),placeholder:e.placeholder,"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};xe.displayName="TextInput";const Tt=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"time",ref:s,defaultValue:t,step:e.includeSeconds?1:60,onChange:a,min:typeof e.min=="string"?e.min:void 0,max:typeof e.max=="string"?e.max:void 0,className:H($.input,$.textInput),"aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};Tt.displayName="TimeInput";const Qr=l.memo(Tt);function en({pos:e,options:t,onClose:r,onClickOption:n}){const o=l.useRef(null),i=l.useRef(!1),[s,c]=l.useState({top:e?.y??0,left:e?.x??0,ready:!1}),a=typeof window<"u"?document.getElementById("popup-root")||document.body:null;return l.useEffect(()=>{function u(m){i.current||m.target.dataset?.popupMenu==="item"||o.current&&m.target instanceof Node&&!o.current.contains(m.target)&&r()}return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[r]),l.useLayoutEffect(()=>{if(!o.current||!e||e.x==null||e.y==null)return;const u=o.current.getBoundingClientRect(),m=window.innerWidth,d=window.innerHeight;let p=e.x,v=e.y;p+u.width>m&&(p=Math.max(0,m-u.width-10)),v+u.height>d&&(v=Math.max(0,e.y-u.height-5)),c({top:v,left:p,ready:!0})},[e,t]),!a||t===void 0||t.length===0||!e||e.x==null||e.y==null?null:fe.createPortal(f.jsx("div",{ref:o,onMouseDown:u=>{u.stopPropagation()},style:{position:"fixed",top:s.top,left:s.left,visibility:s.ready?"visible":"hidden",backgroundColor:"var(--formitiva-primary-bg, #fff)",border:"1px solid var(--formitiva-border-color, #ccc)",borderRadius:"var(--formitiva-border-radius, 4px)",boxShadow:"var(--formitiva-shadow, 0 2px 10px rgba(0,0,0,0.2))",zIndex:9999,minWidth:"var(--formitiva-menu-min-width, 150px)",maxHeight:"var(--formitiva-menu-max-height, 300px)",overflowY:"auto",pointerEvents:"auto"},children:t.map((u,m)=>f.jsx("div",{"data-popup-menu":"item",onMouseDown:d=>{d.stopPropagation(),i.current=!0},onClick:d=>{d.stopPropagation(),d.preventDefault(),n(u),r(),setTimeout(()=>{i.current=!1},100)},style:{padding:"var(--formitiva-menu-item-padding, 8px 12px)",cursor:"pointer",fontSize:"var(--formitiva-menu-item-font-size, 0.8em)",borderBottom:m<t.length-1?"1px solid var(--formitiva-border-light, #eee)":void 0,transition:"background-color 0.15s ease"},onMouseEnter:d=>{d.currentTarget.style.backgroundColor="var(--formitiva-option-menu-hover-bg, #e0e0e0)"},onMouseLeave:d=>{d.currentTarget.style.backgroundColor="transparent"},children:u.label},u.label??m))}),a)}const Me={length:["m","cm","mm","km","in","ft","yd","mi"],area:["m^2","cm^2","mm^2","in^2","ft^2","yd^2"],volume:["L","m^3","cm^3","mL","in^3","ft^3","yd^3"],weight:["kg","g","mg","t","lb","oz"],time:["min","s","h","ms","d"],temperature:["C","F","K"],angle:["deg","rad","rev"]},Ve={length:{m:"Meter (m)",mm:"Millimeter (mm)",cm:"Centimeter (cm)",km:"Kilometer (km)",in:"Inch (in)",ft:"Foot (ft)",yd:"Yard (yd)",mi:"Mile (mi)"},area:{"m^2":"Square meter (m^2)","mm^2":"Square millimeter (mm^2)","cm^2":"Square centimeter (cm^2)","in^2":"Square inch (in^2)","ft^2":"Square foot (ft^2)","yd^2":"Square yard (yd^2)"},volume:{L:"Liter (L)","cm^3":"Cubic centimeter (cm^3)","m^3":"Cubic meter (m^3)",mL:"Milliliter (mL)","in^3":"Cubic inch (in^3)","ft^3":"Cubic foot (ft^3)","yd^3":"Cubic yard (yd^3)"},weight:{kg:"Kilogram (kg)",g:"Gram (g)",mg:"Milligram (mg)",t:"Tonne (t)",lb:"Pound (lb)",oz:"Ounce (oz)"},time:{s:"Second (s)",min:"Minute (min)",h:"Hour (h)",ms:"Millisecond (ms)",d:"Day (d)",wk:"Week (wk)"},temperature:{C:"Celsius (C)",F:"Fahrenheit (F)",K:"Kelvin (K)"},angle:{deg:"Degree (deg)",rad:"Radian (rad)",rev:"Revolution (rev)"}},$e={length:{mm:1e3,cm:100,m:1,km:.001,in:100/2.54,ft:100/(2.54*12),yd:100/(2.54*36),mi:1/1609.344},area:{"m^2":1,"mm^2":1e6,"cm^2":1e4,"km^2":1/1e6,"in^2":(100/2.54)**2,"ft^2":(100/(2.54*12))**2,"yd^2":(100/(2.54*36))**2},volume:{"cm^3":1e6,"m^3":1,L:1,mL:1e6,"in^3":(100/2.54)**3,"ft^3":(100/(2.54*12))**3,"yd^3":(100/(2.54*36))**3},weight:{mg:1e6,g:1e3,kg:1,t:.001,lb:1/.45359237,oz:1/.028349523125},time:{ms:1e3,s:1,min:1/60,h:1/3600,d:1/86400,wk:1/604800},temperature:{C:1,F:33.8,K:274.15},angle:{deg:1,rad:Math.PI/180,rev:1/360}},Re={},tn=new Set([...Object.keys(Me),...Object.keys(Ve),...Object.keys($e)]);for(const e of tn){const t={},r=Me[e]??[],n=Ve[e]??{},o=$e[e]??{};for(const i of r){const s=n[i];t[i]={name:typeof s=="string"?s:String(i),shortName:i,factor:i in o?o[i]:void 0}}for(const[i,s]of Object.entries(n))if(!t[i]){const c=typeof s=="string"?s:String(i);t[i]={name:c,shortName:i,factor:i in o?o[i]:void 0}}for(const[i,s]of Object.entries(o))t[i]||(t[i]={name:String(i),shortName:String(i),factor:s});Re[e]=t}function Ht(e,t,r){if(e==="C"){if(t==="F")return r*(9/5)+32;if(t==="K")return r+273.15}else if(e==="F"){if(t==="C")return(r-32)*5/9;if(t==="K")return(r-32)*5/9+273.15}else if(e==="K"){if(t==="C")return r-273.15;if(t==="F")return(r-273.15)*9/5+32}return r}function qt(e){const t=Re[e];if(!t)return null;const r={},n=[];for(const[i,s]of Object.entries(t))typeof s.factor=="number"&&(r[i]=s.factor),n.push(i);return{default:Object.keys(t)[0]??"",units:n,factors:r}}const rn=Object.freeze(Object.defineProperty({__proto__:null,convertTemperature:Ht,dimensionUnitDisplayMap:Ve,dimensionUnitsMap:Me,dimensonUnitFactorsMap:$e,getUnitFactors:qt,unitsByDimension:Re},Symbol.toStringTag,{value:"Module"})),Ut=l.memo(({disabled:e,inputValue:t,selectedUnit:r,dimension:n,unitFactors:o,onConversionSelect:i,t:s})=>{const[c,a]=l.useState(!1),[u,m]=l.useState(null),[d,p]=l.useState([]),v=l.useCallback(g=>{if(e)return;const b=parseFloat(t);if(!Number.isFinite(b))return;const C=g.currentTarget.getBoundingClientRect();m({x:C.left,y:C.bottom});const M=[];if(n==="temperature")o.units.forEach(E=>{const F=Ht(r,E,b);Number.isFinite(F)&&M.push({label:`${F.toFixed(6)} ${s(E)}`,value:F.toString(),unit:E})});else{const E=o.factors[r];E!==void 0&&Object.entries(o.factors).forEach(([F,I])=>{const h=b/E*I;Number.isFinite(h)&&M.push({label:`${h.toFixed(6)} ${s(F)}`,value:h.toString(),unit:F})})}p(M),a(M.length>0)},[e,t,r,n,o,s]),k=l.useCallback(g=>{a(!1),m(null),i(g)},[i]),y=l.useCallback(()=>{a(!1),m(null)},[]);return f.jsxs(f.Fragment,{children:[f.jsx("button",{onClick:v,disabled:e,"aria-disabled":e,style:{width:"var(--formitiva-unit-btn-width, 2.5em)",height:"auto",padding:"var(--formitiva-input-padding)",boxSizing:"border-box",border:"none",borderRadius:"var(--formitiva-button-border-radius, var(--formitiva-border-radius, 0.25em))",backgroundColor:e?"var(--formitiva-button-disabled-bg, #cccccc)":"var(--formitiva-button-bg, var(--formitiva-success-color))",color:"var(--formitiva-button-text, #ffffff)",cursor:e?"not-allowed":"pointer",opacity:e?.6:1,display:"flex",alignItems:"center",justifyContent:"center",alignSelf:"center",lineHeight:1},children:f.jsx("span",{style:{fontSize:"1em",pointerEvents:"none"},children:"⇄"})}),c&&d.length>0&&f.jsx(en,{pos:u,options:d,onClose:y,onClickOption:k})]})});Ut.displayName="ConversionButton";const Wt=({field:e,value:t,onChange:r,onError:n})=>{const{t:o}=L(),i=B(e),[s,c]=l.useState(null),a=l.useRef(null),u=l.useRef(n);l.useEffect(()=>{u.current=n},[n]);const m=l.useCallback(x=>{x!==a.current&&(a.current=x,c(x),u.current?.(x??null))},[]),d=e.dimension,p=l.useMemo(()=>d?qt(d):null,[d]),v=String(t?.[0]??""),k=String(t?.[1]??p?.default??""),[y,g]=l.useState(v),[b,C]=l.useState(k);l.useEffect(()=>{g(v)},[v]),l.useEffect(()=>{C(k)},[k]),l.useEffect(()=>{m(i([y,b],"sync"))},[y,b,m,i]);const M=l.useCallback(x=>{const j=x.target.value;g(j),m(i([j,b],"change")),r?.([j,b])},[b,i,r,m]),R=l.useCallback(x=>{const j=x.target.value;C(j),m(i([y,j],"change")),r?.([y,j])},[y,i,r,m]),E=l.useCallback(()=>{m(i([y,b],"blur"))},[y,b,m,i]),F=l.useCallback(x=>{g(x.value),C(x.unit),r?.([x.value,x.unit])},[r]),I=l.useMemo(()=>p?p.units.map(x=>f.jsx("option",{value:x,children:o(x)},x)):[],[p,o]);if(!d||!p)return null;const h=!!s||!y.trim();return f.jsx(z,{field:e,error:s,children:f.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"var(--formitiva-unit-gap, 8px)",width:"100%"},children:[f.jsx("input",{id:e.name,type:"text",value:y,onChange:M,onBlur:E,style:{flex:"2 1 0"},className:H($.input,$.textInput),"aria-invalid":!!s,"aria-describedby":s?`${e.name}-error`:void 0}),f.jsx("select",{id:`${e.name}-unit`,value:b,onChange:R,onBlur:E,style:{flex:"1 1 0"},className:H($.input,$.inputSelect),"aria-invalid":!!s,"aria-describedby":s?`${e.name}-error`:void 0,children:I}),f.jsx(Ut,{disabled:h,inputValue:y,selectedUnit:b,dimension:d,unitFactors:p,onConversionSelect:F,t:o})]})})};Wt.displayName="UnitValueInput";const nn=l.memo(Wt),_t=({field:e,value:t,onChange:r,onError:n,error:o})=>{const i=B(e,o),{inputRef:s,error:c,handleChange:a}=_({value:t,onChange:r,onError:n,validate:i});return f.jsx(z,{field:e,error:c,children:f.jsx("input",{id:e.name,type:"url",defaultValue:String(t??""),ref:s,onChange:a,className:H($.input,$.textInput),placeholder:"https://example.com","aria-invalid":!!c,"aria-describedby":c?`${e.name}-error`:void 0})})};_t.displayName="UrlInput";const on=l.memo(_t),ce=new ie;function an(e,t){ce.register(e,t)}function Kt(e){return ce.get(e)}function sn(e){return ce.has(e)}function ln(e){return ce.unregister(e)}function cn(){return ce.list()}const Gt=({field:e,valuesMap:t,handleChange:r,handleError:n})=>{const{t:o}=L(),[i,s]=l.useState(!1),[c,a]=l.useState(null),u=l.useCallback(async()=>{if(!e.action){console.warn(`Button "${e.name}" has no action defined`);return}const p=Kt(e.action);if(!p){const v=`Button handler "${e.action}" not found`;console.error(v),a(v);return}s(!0),a(null);try{await p(t,r,n,o)}catch(v){const k=v instanceof Error?v.message:String(v);console.error(`Button handler "${e.action}" failed:`,k),a(k)}finally{s(!1)}},[e,t,r,n,o]),d={...{cursor:i?"wait":"pointer",opacity:i?.6:1}};return e.width&&typeof e.width=="number"&&e.width>0&&(d.width=`${e.width}px`),f.jsx(z,{field:e,rightAlign:!0,error:c,children:f.jsx("button",{type:"button",className:$.button,onClick:u,disabled:i,"aria-label":o(e.displayName),"aria-busy":i,style:d,children:o(i?"Processing...":e.displayName)})})};Gt.displayName="Button";const un=l.memo(Gt),mn={checkbox:!1,switch:!1,radio:!1,dropdown:!1,"multi-selection":!1,color:!1,rating:!1,file:!1,image:!1,separator:!1,description:!1,button:!1,string:{wait:200},text:{wait:200},multiline:{wait:200},email:{wait:200},password:{wait:200},phone:{wait:200},url:{wait:200},int:{wait:200},float:{wait:200},unit:{wait:100},date:{wait:150},time:{wait:150},slider:{wait:100,leading:!0,trailing:!0},stepper:{wait:100,leading:!0,trailing:!0}},de=new ie,Ae={button:un,checkbox:Sr,color:Er,date:Ir,description:Fr,dropdown:Vr,email:$r,file:Ar,float:Pr,"float-array":Dr,image:Or,int:Lr,"int-array":Br,"multi-selection":qr,multiline:Tr,password:Yr,phone:Wr,radio:_r,rating:Jr,separator:Rr,slider:Xr,string:xe,stepper:Ur,switch:Zr,text:xe,time:Qr,unit:nn,url:on};function dn(e){return e in Ae}function fn(e,t){const{wait:r=200,leading:n,trailing:o}=t,i=l.memo(s=>{const c=l.useRef(s.onChange);l.useEffect(()=>{c.current=s.onChange},[s.onChange]);const{callback:a,cancel:u}=st((...m)=>{c.current?.(...m)},r,{leading:n,trailing:o});return l.useEffect(()=>u,[u]),l.createElement(e,{...s,onChange:a})});return i.displayName="DebouncedFieldWrapper",i}function Jt(e,t,r){const n=t;if(!r&&e in Ae){console.warn(`Can't overwrite base component type "${e}".`);return}const o=mn[e];if(o===!1){de.register(e,n);return}const i=o??{wait:200};at?de.register(e,n):de.register(e,fn(n,i))}function De(e,t){Jt(e,t,!1)}function Pe(e){return de.get(e)}let Xe=!1;function pn(){Xe||(Object.entries(Ae).forEach(([e,t])=>{Jt(e,t,!0)}),Xe=!0)}const ze=l.memo(({field:e,valuesMap:t,handleChange:r,handleError:n,errorsMap:o})=>{const i=Pe(e.type),s=t[e.name],c=o?o[e.name]??null:void 0,a=!!e.disabled,u=l.useMemo(()=>s,[s]),m=l.useCallback(p=>r(e.name,p),[r,e.name]),d=l.useCallback(p=>n?.(e.name,p),[n,e.name]);if(!i)return null;if(e.type==="button"){const p={field:e,value:null,disabled:a,valuesMap:t,handleChange:r,handleError:n||(()=>{})};return f.jsx("div",{"aria-disabled":a,style:a?{opacity:.6,pointerEvents:"none"}:void 0,children:f.jsx(i,{...p})})}return f.jsx("div",{"aria-disabled":a,style:a?{opacity:.6,pointerEvents:"none"}:void 0,children:f.jsx(i,{field:e,value:u,disabled:a,onChange:m,onError:d,error:c})})},(e,t)=>e.field===t.field&&e.valuesMap[e.field.name]===t.valuesMap[t.field.name]&&e.handleChange===t.handleChange&&e.handleError===t.handleError&&e.errorsMap?.[e.field.name]===t.errorsMap?.[t.field.name]);ze.displayName="FieldRenderer";const Yt=l.memo(({groupName:e,defaultOpen:t=!0,fields:r,valuesMap:n,handleChange:o,handleError:i,errorsMap:s,t:c})=>{const[a,u]=l.useState(t),m=l.useCallback(()=>u(d=>!d),[]);return f.jsxs("fieldset",{className:"formitiva-group",children:[f.jsxs("legend",{onClick:m,className:"formitiva-group_legend",children:[f.jsx("span",{children:c(e)}),f.jsx("span",{className:"formitiva-group_legend_arrow",children:a?"▼":"▶"})]}),a&&r.map(d=>f.jsx(ze,{field:d,valuesMap:n,handleChange:o,handleError:i,errorsMap:s},d.name))]})});Yt.displayName="FieldGroup";const Oe=(e,t,r,n)=>{const o=t[e];if(!o?.children)return;const i=r[e],s=i!=null?String(i):"",c=o.children[s];if(Array.isArray(c))for(const a of c)typeof a=="string"&&t[a]&&(n[a]=!0,Oe(a,t,r,n))},Xt=(e,t,r)=>{const n=t[e];if(!n?.children)return;const o=Object.values(n.children).flat();for(const i of o)typeof i=="string"&&i in r&&(r[i]=!1,Xt(i,t,r))},gn=(e,t,r,n)=>{const o={...r};return e.forEach(i=>{(!i.parents||Object.keys(i.parents).length===0)&&(o[i.name]=!0,Oe(i.name,n,t,o))}),o},vn=(e,t,r,n,o)=>{const i={...e},s=t[n];if(Xt(n,t,i),o!=null&&s?.children){const c=String(o),a=s.children[c];if(Array.isArray(a))for(const u of a)typeof u=="string"&&t[u]&&(i[u]=!0,Oe(u,t,r,i))}for(const[c,a]of Object.entries(t))a.parents&&n in a.parents&&(i[c]=Zt(c,t,r));return i},Zt=(e,t,r)=>{const n=t[e];if(!n)return!1;if(!n.parents||Object.keys(n.parents).length===0)return!0;for(const[o,i]of Object.entries(n.parents)){if(!t[o]||!Zt(o,t,r))continue;const c=r[o];if(c==null)continue;const a=i.map(u=>String(u));if(Array.isArray(c)){if(c.map(d=>String(d)).some(d=>a.includes(d)))return!0}else{const u=String(c);if(a.includes(u))return!0}}return!1},hn=(e,t)=>{const r=new Map;let n=null,o=null,i=0;for(const s of e){const c=s.group;if(!c){n=null,o=null;continue}if(c===n)t[s.name].group=o??c;else{if(!r.has(c))r.set(c,1),o=null,t[s.name].group=c;else{const a=r.get(c),u=`${c}(${a})`;r.set(c,a+1),o=u,t[s.name].group=u,i++}n=c}}return i},bn=(e,t={})=>{const{includeEmpty:r=!0}=t,n=[];let o=null,i=[],s=0;for(const a of e){const u=a.group||null;u!==o?((i.length>0||r)&&n.push({name:o,fields:i}),o=u,i=[a]):i.push(a)}(i.length>0||r)&&n.push({name:o,fields:i}),s=n.filter(a=>a.fields.length===0).length;const c=Math.max(0,...n.map(a=>a.fields.length));return{groups:n,metadata:{totalGroups:n.length,emptyGroups:s,largestGroup:c}}},Be=new ie;function Le(e,t){Be.register(e,t)}function yn(e){return Be.get(e)}function xn(e){return Be.get(e)}Le("Preset_AlertSubmitHandler",(e,t,r)=>{const n={name:t||"Unnamed Instance",version:e.version,definition:e.name,values:r},o=JSON.stringify(n,null,2);alert(o)});async function wn(e,t,r,n,o,i,s){const c=o?Object.values(o).filter(Boolean):[];if(c.length>0)return{success:!1,message:n("Please fix validation errors before submitting the form."),errors:c};const a={...r},u=[];if(e&&Array.isArray(e.properties))for(const d of e.properties){const p=d.name,v=a[p];if(v==null)continue;const k=d.type;try{if(k==="int"){const y=String(v).trim();if(y==="")a[p]=0;else{const g=Number(y);Number.isInteger(g)?a[p]=Math.trunc(g):u.push(n("Invalid integer format for field {{1}}",d.displayName||p))}}else if(k==="number"||k==="float"){const y=String(v).trim();if(y==="")a[p]=0;else{const g=Number(y);isNaN(g)?u.push(n("Invalid number format for field {{1}}",d.displayName||p)):a[p]=g}}else if(k==="int-array"||k==="float-array"){const y=String(v).split(",").map(C=>C.trim()).filter(Boolean),g=[];let b=!1;for(const C of y){const M=Number(C);if(isNaN(M)){u.push(n("Invalid number {{1}} in array for field {{2}}",C,d.displayName||p)),b=!0;break}g.push(M)}b||(a[p]=g)}}catch(y){u.push(n("Error processing field {{1}}: {{2}}",d.displayName||p,y instanceof Error?y.message:String(y)))}}if(u.length>0)return{success:!1,message:n("Data transformation errors occurred."),errors:u};if(s){const d=await s(a,n);if(d&&d.length>0)return{success:!1,message:n("Validation failed"),errors:d}}else{const d=await wr(e,a,n);if(d&&d.length>0)return{success:!1,message:n("Validation failed"),errors:d}}const m=d=>d?Array.isArray(d)?d.map(p=>String(p)):typeof d=="string"?d.trim()?[d]:[]:[String(d)]:[];if(i)try{const d=await i(e,t?.name??null,a,n),p=m(d);if(p.length>0)return{success:!1,message:n("Submission failed"),errors:p}}catch(d){return{success:!1,message:n("Submission handler error occurred"),errors:[String(d instanceof Error?d.message:d)]}}else if(e&&typeof e.submitHandlerName=="string"){const d=yn(e.submitHandlerName);if(d)try{const p=await d(e,t?.name??null,a,n),v=m(p);if(v.length>0)return{success:!1,message:n("Submission failed"),errors:v}}catch(p){return{success:!1,message:n("Submission handler error occurred"),errors:[String(p instanceof Error?p.message:p)]}}}return{success:!0,message:n("Form submitted successfully."),data:a}}const Qt=({message:e,success:t,onDismiss:r,t:n})=>e?f.jsxs("div",{role:"status",style:{marginBottom:12,padding:12,borderRadius:6,backgroundColor:t?"rgba(76, 175, 80, 0.12)":"rgba(225, 29, 72, 0.06)",border:`1px solid ${t?"rgba(76,175,80,0.3)":"rgba(225,29,72,0.12)"}`,color:t?"var(--formitiva-success-color, #4CAF50)":"var(--formitiva-error-color, #e11d48)",display:"flex",alignItems:"center",justifyContent:"space-between"},children:[f.jsx("div",{style:{whiteSpace:"pre-wrap",flex:1},children:e}),f.jsx("button",{onClick:r,"aria-label":n("Dismiss"),style:{marginLeft:12,background:"transparent",border:"none",cursor:"pointer",color:"inherit",fontSize:16,lineHeight:1},children:"×"})]}):null;Qt.displayName="SubmissionMessage";const Sn=({onClick:e,disabled:t=!1,t:r})=>{const[n,o]=l.useState(!1);return f.jsx("button",{onClick:e,disabled:t,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),style:{padding:"var(--formitiva-button-padding, var(--formitiva-space) 12px)",backgroundColor:t?"var(--formitiva-button-disabled-bg, #cccccc)":"var(--formitiva-button-bg, var(--formitiva-success-color))",color:"var(--formitiva-button-text, #ffffff)",border:"none",borderRadius:"4px",cursor:t?"var(--formitiva-button-disabled-cursor, not-allowed)":"pointer",fontSize:"var(--formitiva-button-font-size, 14px)",fontWeight:"var(--formitiva-button-font-weight, 500)",boxShadow:"var(--formitiva-button-shadow, none)",marginTop:"var(--formitiva-button-margin-top, 0.5em)",transition:"opacity 0.2s ease",opacity:t?"var(--formitiva-button-disabled-opacity, 0.6)":n?"var(--formitiva-button-hover-opacity, 0.9)":"1"},children:r("Submit")})},er=({definition:e,instance:t,onSubmit:r=void 0,onValidation:n=void 0,chunkSize:o=50,chunkDelay:i=50})=>{const{properties:s,displayName:c}=e,a=L(),{t:u,formStyle:m,language:d,displayInstanceName:p}=a,v={...a,definitionName:e?.name??a.definitionName},[k,y]=l.useState("en"),[g,b]=l.useState([]),[C,M]=l.useState({}),[R,E]=l.useState({}),[F,I]=l.useState({}),[h,x]=l.useState({}),[j,w]=l.useState(null),[S,N]=l.useState(null),[V,O]=l.useState(0),[q,X]=l.useState(!1),[re,se]=l.useState(t.name||""),Z=l.useRef(t),pe=l.useRef(!1);l.useEffect(()=>{const D=Object.fromEntries(s.map(A=>[A.name,{...A,children:{}}]));s.forEach(A=>{A.parents&&Object.entries(A.parents).forEach(([G,ne])=>{const Q=D[G];Q&&ne.forEach(dr=>{Q.children||(Q.children={});const We=String(dr);Q.children[We]=[...Q.children[We]||[],A.name]})})}),hn(s,D);const U=Object.values(D),P={};U.forEach(A=>{if(A.type==="unit"){const G=typeof A.defaultValue=="number"?String(A.defaultValue):"",ne=typeof A.defaultUnit=="string"?A.defaultUnit:String(A.defaultUnit??"m");P[A.name]=[G,ne]}else P[A.name]=A.defaultValue}),Z.current=t,Object.keys(t.values).forEach(A=>{D[A]!==void 0&&(P[A]=t.values[A])});const Y=Object.fromEntries(U.map(A=>[A.name,!1])),K=requestAnimationFrame(()=>{b(U),M(D),E(P),I(gn(U,P,Y,D)),X(!0),se(t.name)});return()=>cancelAnimationFrame(K)},[s,t,e]),l.useEffect(()=>{if(!q||V>=g.length)return;const D=setTimeout(()=>{O(U=>Math.min(U+o,g.length))},i);return()=>clearTimeout(D)},[q,V,g.length,o,i]);const qe=l.useCallback((D,U)=>{const P=C[D];if(!P)return;w(null),N(null),E(A=>({...A,[D]:U}));const Y=P&&P.children&&Object.keys(P.children).length>0,K=Object.values(C).some(A=>A.parents&&D in A.parents);(Y||K)&&I(A=>{const G={...R,[D]:U};return vn(A,C,G,D,U)})},[C,R]);l.useEffect(()=>{let D=0;return D=requestAnimationFrame(()=>{d!==k&&(y(d||"en"),w(null),N(null))}),()=>cancelAnimationFrame(D)},[d,k]),l.useEffect(()=>{let D=0;return D=requestAnimationFrame(()=>{if(pe.current){pe.current=!1,Z.current=t,se(t.name||"");return}Z.current=t,w(null),N(null),se(t.name||"")}),()=>cancelAnimationFrame(D)},[t,t.name]);const Ue=l.useCallback((D,U)=>{if(C[D]?.disabled){x(P=>D in P?Object.fromEntries(Object.entries(P).filter(([K])=>K!==D)):P);return}x(P=>U?{...P,[D]:String(U)}:Object.fromEntries(Object.entries(P).filter(([K])=>K!==D)))},[C]),ur=async()=>{pe.current=!0;const D=Z.current?.name;Z.current.name=re;let U=h;if(v.fieldValidationMode==="onSubmission"){const A={};if(g.forEach(G=>{if(G.disabled)return;const ne=R[G.name];if(ne===void 0)return;const Q=ye(v.definitionName,G,ne,u);Q&&(A[G.name]=Q)}),x(A),U=A,Object.keys(A).length>0){w(u("Please fix validation errors before submitting the form.")),N(!1);return}else w(null),N(null)}const P=await wn(e,Z.current,R,u,U,r,n),Y=typeof P.message=="string"?P.message:String(P.message),K=Object.values(P.errors??{}).join(`
394
+ `);w(K?Y+`
395
+ `+K:Y),N(P.success),P.success||(Z.current.name=D??Z.current.name,se(D??""))},mr=l.useMemo(()=>v.fieldValidationMode==="onEdit"||v.fieldValidationMode==="onBlur"||v.fieldValidationMode==="realTime"?Object.values(h).some(Boolean):!1,[h,v.fieldValidationMode]);return f.jsx(je.Provider,{value:v,children:f.jsxs("div",{style:m.container,children:[c&&f.jsx("h2",{style:m.titleStyle,children:u(c)}),f.jsx(Qt,{message:j,success:S,onDismiss:()=>{w(null),N(null)},t:u}),p&&t&&f.jsx(ut,{name:re,onChange:D=>{se(D),w(null),N(null)}}),f.jsxs(f.Fragment,{children:[(()=>{const D=g.slice(0,V).filter(P=>F[P.name]),{groups:U}=bn(D);return U.map((P,Y)=>P.name?f.jsx(Yt,{groupName:P.name,defaultOpen:!0,fields:P.fields,valuesMap:R,handleChange:qe,handleError:Ue,errorsMap:h,t:u},P.name):f.jsx(l.Fragment,{children:P.fields.map(K=>f.jsx(ze,{field:K,valuesMap:R,handleChange:qe,handleError:Ue,errorsMap:h},K.name))},`ungrouped-${Y}`))})(),V<g.length&&f.jsx("div",{style:{fontSize:"0.9em",color:"var(--formitiva-text-muted, #666)"},children:u(`Loading more fields... (${V}/${g.length})`)})]}),f.jsx(Sn,{onClick:ur,disabled:mr,t:u})]})})},tr={en:{name:"English",nativeName:"English"},fr:{name:"French",nativeName:"Français"},de:{name:"German",nativeName:"Deutsch"},es:{name:"Spanish",nativeName:"Español"},"zh-cn":{name:"Chinese (Simplified)",nativeName:"简体中文"},bg:{name:"Bulgarian",nativeName:"Български"},cs:{name:"Czech",nativeName:"Čeština"},da:{name:"Danish",nativeName:"Dansk"},el:{name:"Greek",nativeName:"Ελληνικά"},fi:{name:"Finnish",nativeName:"Suomi"},hi:{name:"Hindi",nativeName:"हिन्दी"},hu:{name:"Hungarian",nativeName:"Magyar"},id:{name:"Indonesian",nativeName:"Bahasa Indonesia"},it:{name:"Italian",nativeName:"Italiano"},ja:{name:"Japanese",nativeName:"日本語"},ko:{name:"Korean",nativeName:"한국어"},ms:{name:"Malay",nativeName:"Bahasa Melayu"},nl:{name:"Dutch",nativeName:"Nederlands"},no:{name:"Norwegian",nativeName:"Norsk"},pl:{name:"Polish",nativeName:"Polski"},pt:{name:"Portuguese",nativeName:"Português"},ro:{name:"Romanian",nativeName:"Română"},ru:{name:"Russian",nativeName:"Русский"},sk:{name:"Slovak",nativeName:"Slovenčina"},sv:{name:"Swedish",nativeName:"Svenska"},th:{name:"Thai",nativeName:"ไทย"},tr:{name:"Turkish",nativeName:"Türkçe"},uk:{name:"Ukrainian",nativeName:"Українська"},vi:{name:"Vietnamese",nativeName:"Tiếng Việt"},"zh-tw":{name:"Chinese (Traditional)",nativeName:"繁體中文"}},Cn=()=>tr,ve=new Map,ue=new Map,oe=new Set,we=new Map,kn=async e=>{try{let t={};const r=e.toLowerCase();if(r==="en")t={};else if(tr[r]){const o=`https://reactaform.com/locales/${r}/common.json`,i=await fetch(o);i.ok&&(t=await i.json())}else t={};return{success:!0,translations:t,fromCache:!1}}catch(t){return{success:!1,translations:{},error:`Failed to load common translations for ${e}: ${t}`}}},Nn=async e=>{if(!e||e.toLowerCase()==="en")return{success:!0,translations:{},fromCache:!1};const t=e.toLowerCase();if(ve.has(t))return{success:!0,translations:ve.get(t)||{},fromCache:!0};const r=await kn(t);return r.success&&(ve.set(t,r.translations),we.set(t,{loadedAt:new Date,size:Object.keys(r.translations).length,source:"common"})),r},jn=async(e,t)=>{if(!e||!t)return{success:!1,translations:{},error:"Both language and localizeName are required"};const r=`${e.toLowerCase()}/${t}`;if(oe.has(r))return{success:!1,translations:{},error:"Previously failed to load",fromCache:!0};if(ue.has(r))return{success:!0,translations:ue.get(r)||{},fromCache:!0};try{let n=t;!t.includes("/")&&!t.includes(".")&&(n=`/locales/${e}/${t}.json`);const o=await fetch(n);if(!o.ok)return o.status===404?(ue.set(r,{}),we.set(r,{loadedAt:new Date,size:0,source:"user"}),{success:!0,translations:{},fromCache:!1}):(oe.add(r),{success:!1,translations:{},error:`HTTP ${o.status}`,fromCache:!1});const i=o.headers.get("content-type")||"";!i.includes("application/json")&&!i.includes("text/json")&&rr()&&console.warn(`Translation file at ${n} has unexpected content-type: ${i}`);const s=await o.text();if(!s){const u="Empty translation file";return oe.add(r),{success:!1,translations:{},error:u}}let c;try{c=JSON.parse(s)}catch(u){const m=`Invalid JSON in translation file: ${u instanceof Error?u.message:String(u)}`;return oe.add(r),{success:!1,translations:{},error:m}}if(!c||typeof c!="object"){const u="Invalid translation file format";return oe.add(r),{success:!1,translations:{},error:u}}const a=Object.fromEntries(Object.entries(c).map(([u,m])=>[u,typeof m=="string"?m:String(m)]));return ue.set(r,a),we.set(r,{loadedAt:new Date,size:Object.keys(a).length,source:"user"}),{success:!0,translations:a,fromCache:!1}}catch(n){const o=`Failed to load user translations: ${n instanceof Error?n.message:"Unknown error"}`;return oe.add(r),{success:!1,translations:{},error:o}}};function rr(){try{if(typeof process<"u"&&process?.env?.NODE_ENV==="development")return!0}catch{}return!1}function En(e,t){return t.length===0?e:e.replace(/\{\{(\d+)\}\}/g,(r,n)=>{const o=parseInt(n,10)-1,i=t[o];return i==null?r:String(i)})}const In=(e,t,r)=>(n,...o)=>{let i=n,s=!1;return!n||typeof n!="string"?String(n||""):(e.toLowerCase()==="en"?(i=n,s=!0):n in r?(i=r[n],s=!0):n in t?(i=t[n],s=!0):i=n,i=En(i,o),!s&&rr()&&console.debug(`Missing translation for "${n}" in language "${e}"`),i)};function Fn(e){return/^[-+]?\d*$/.test(e)}function Mn(e){const t=/^[-+]?\d*$/;return e.split(",").map(r=>r.trim()).every(r=>t.test(r))}const Vn=",",$n=e=>!e||e.trim()===""?[]:e.split(Vn).map(t=>t.trim()).filter(Boolean).map(t=>Number(t)),Ze=(e,t,r)=>{const n=String(t);if(n.trim()==="")return e.min!==void 0||e.max!==void 0?r("Value required when min or max constraints is set"):e.required?r("Value required"):void 0;if(!Fn(n))return r("Must be a valid integer");const o=parseInt(n,10);if(Number.isNaN(o))return r("Must be a valid integer");if(e.min!==void 0&&(e.minInclusive?o<e.min:o<=e.min))return r("Must be {{1}} {{2}}",e.minInclusive?"��":">",e.min);if(e.max!==void 0&&(e.maxInclusive?o>e.max:o>=e.max))return r("Must be {{1}} {{2}}",e.maxInclusive?"��":"<",e.max);if(e.step!==void 0){const i=Number(e.step);if(!Number.isInteger(i))return r("Invalid step value");if(o%i!==0)return r("Must be a multiple of {{1}}",i)}};function Rn(e,t,r){const n=String(t);if(n.trim()==="")return e.min!==void 0||e.max!==void 0?r("Value required when min or max constraints is set"):e.required?r("Value required"):void 0;if(!Mn(n))return r("Each value must be a valid integer");const o=$n(n);if(e.minCount!==void 0&&o.length<e.minCount)return r("Minimum number of values: {{1}}",`${e.minCount}`);if(e.maxCount!==void 0&&o.length>e.maxCount)return r("Maximum number of values: {{1}}",`${e.maxCount}`);for(const i of o){if(e.min!==void 0&&(e.minInclusive?i<e.min:i<=e.min))return r("Each value must be {{1}} {{2}}",e.minInclusive?"��":">",e.min);if(e.max!==void 0&&(e.maxInclusive?i>e.max:i>=e.max))return r("Each value must be {{1}} {{2}}",e.maxInclusive?"��":"<",e.max)}}function nr(e,t,r){const n=String(t);if(n.trim()==="")return e.min!==void 0||e.max!==void 0?r("Value required when min or max constraints is set"):e.required?r("Value required"):void 0;const o=Number(n);if(Number.isNaN(o))return r("Must be a valid float");if(e.min!==void 0){const i=e.type==="slider"?!0:e.minInclusive??!0;if(i?o<e.min:o<=e.min)return r("Must be {{1}} {{2}}",i?"��":">",e.min)}if(e.max!==void 0){const i=e.type==="slider"?!0:e.maxInclusive??!0;if(i?o>e.max:o>=e.max)return r("Must be {{1}} {{2}}",i?"��":"<",e.max)}}const An=/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?$/;function Dn(e){return e.split(",").map(t=>t.trim()).every(t=>An.test(t))}const Pn=",",zn=e=>!e||e.trim()===""?[]:e.split(Pn).map(t=>t.trim()).filter(Boolean).map(t=>Number(t));function On(e,t,r){const n=String(t);if(n.trim()==="")return e.min!==void 0||e.max!==void 0?r("Value required when min or max constraints is set"):e.required?r("Value required"):void 0;if(!Dn(n))return r("Each value must be a valid float");const o=zn(n);if(e.minCount!==void 0&&o.length<e.minCount)return r("Minimum number of values: {{1}}",e.minCount);if(e.maxCount!==void 0&&o.length>e.maxCount)return r("Maximum number of values: {{1}}",e.maxCount);for(const i of o){if(e.min!==void 0&&(e.minInclusive?i<e.min:i<=e.min))return r("Each value must be {{1}} {{2}}",e.minInclusive?"��":">",e.min);if(e.max!==void 0&&(e.maxInclusive?i>e.max:i>=e.max))return r("Each value must be {{1}} {{2}}",e.maxInclusive?"��":"<",e.max)}}const he=new WeakMap;function Te(e,t,r,n,...o){if(e.pattern==null)return;const i=String(t);let s=null;if(e.pattern){const c=he.get(e);if(c&&c.pattern===e.pattern)s=c.regex;else try{const a=new RegExp(e.pattern);he.set(e,{pattern:e.pattern,regex:a}),s=a}catch{he.set(e,{pattern:e.pattern,regex:null}),s=null}}if(s&&!s.test(i))return e.patternErrorMessage?r(e.patternErrorMessage):n?r(n,...o):r("Input does not match pattern: {{1}}",e.pattern)}function me(e,t,r){const n=String(t);if(n==="")return e.minLength!==void 0||e.maxLength!==void 0?e.required?r("Value required when minLength or maxLength is set"):void 0:e.required?r("Value required"):void 0;const o=Math.max(e.minLength??0,0);return n.length<o?r("Must be at least {{1}} characters",o):e.maxLength!==void 0&&n.length>e.maxLength?r("Must be at most {{1}} characters",e.maxLength):Te(e,t,r,"Invalid text format")}const Se=e=>{if(!e)return null;const t=Date.parse(e);return Number.isNaN(t)?null:t},Qe=new WeakMap,Bn=e=>{let t=Qe.get(e);return t||(t={minTime:Se(e.minDate),maxTime:Se(e.maxDate)},Qe.set(e,t)),t};function Ln(e,t,r){if(t==null||String(t).trim()==="")return e.required?r("Value required"):void 0;const n=String(t).trim(),o=Se(n);if(o===null)return r("Invalid date format");const{minTime:i,maxTime:s}=Bn(e);if(i!==null&&o<i)return r("Date must be on or after {{1}}",e.minDate);if(s!==null&&o>s)return r("Date must be on or before {{1}}",e.maxDate)}function Tn(e,t,r){const n=String(t);if(!n||n.trim()==="")return e.required||e.min||e.max?r("Value required"):void 0;const o=s=>{const c=s.split(":").map(m=>parseInt(m,10));if(c.some(m=>Number.isNaN(m)))return NaN;const a=c.length;if(a<2||a>3)return NaN;if(a===2&&(c[0]<0||c[0]>23||c[1]<0||c[1]>59))return NaN;if(a===3&&(c[0]<0||c[0]>23||c[1]<0||c[1]>59||c[2]<0||c[2]>59))return NaN;let u=0;if(c.length===3)u=c[0]*3600+c[1]*60+c[2];else if(c.length===2)u=c[0]*3600+c[1]*60;else if(c.length===1)u=c[0]*3600;else return NaN;return u},i=o(n);if(Number.isNaN(i))return r("Invalid time format");if(e.min&&typeof e.min=="string"){const s=o(e.min);if(!Number.isNaN(s)&&i<s)return r("Time must be on or after {{1}}",e.min)}if(e.max&&typeof e.max=="string"){const s=o(e.max);if(!Number.isNaN(s)&&i>s)return r("Time must be on or before {{1}}",e.max)}}function Hn(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function qn(e,t,r){const n=String(t??"").trim();return n===""?e.required?r("Value required"):void 0:Hn(n)?Te(e,t,r,r("Email does not match pattern: {{1}}",e.pattern)):r("Must be valid email format")}function Un(e,t,r){const n=String(t??"").trim();return n===""?e.required?r("Value required"):void 0:Te(e,n,r,"Invalid phone number format")}const Wn=/^(https?|ftp|file):\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$/i,_n=e=>{try{return new URL(e),!0}catch{return!1}};function Kn(e,t,r){const n=String(t??"").trim();if(n==="")return e.required?r("Value required"):void 0;if(!(Wn.test(n)||_n(n))){if(e.allowRelative===!0){if(!n.startsWith("/")||encodeURI(n)!==n)return r("Must be a valid URL");try{new URL(n,"http://example.com");return}catch{return r("Must be a valid URL")}}return r("Must be a valid URL")}}function Gn(e,t,r){const n=Array.isArray(t)?t:[],o=n[0],i=n[1]?String(n[1]).trim():"";return String(o??"").trim()===""||i===""?e.required?r("Value required"):void 0:nr(e,o,r)}function Jn(e,t,r){if(Array.isArray(t))return t.length===0?r("Select a file"):t.every(n=>n instanceof File)?void 0:r("Invalid file input");if(!(t instanceof File)){const n=String(t);return e.required&&(t==null||typeof n=="string"&&n.trim()==="")?r("Select a file"):r("Invalid file input: {{1}}",n)}}function Yn(e,t,r){const n=String(t);if(n===""||n===null||n===void 0)return e.required?r("Value required"):void 0;if(!e.options?.some(o=>String(o.value)===n))return r("Invalid option selected")}function Xn(e,t,r){const o=String(t??"").trim();if(o==="")return e.required?r("Value required"):void 0;const i=o.split(",").map(s=>s.trim()).filter(s=>s!=="");if(i.length===0)return e.required?r("Value required"):void 0;for(const s of i)if(!e.options?.some(c=>String(c.value)===s))return r("Invalid option selected")}const Zn=/^#([0-9A-F]{3}){1,2}$/i,Qn=e=>Zn.test(e);function eo(e,t,r){const n=String(t).trim();if(n==="")return e.required?r("Value required"):void 0;if(!Qn(n))return r("Invalid color format")}function to(e,t,r){const n=String(t??"").trim();if(n==="")return e.required?r("Value required"):void 0;let o=t;if(typeof t!="number"&&(o=parseFloat(n)),Number.isNaN(o)||o<=0)return r("Invalid value");if(e.max!==void 0&&o>e.max)return r("Must be �� {{1}}",e.max)}function ro(e,t,r){const n=String(t);if(n.trim()==="")return e.required?r("Value required"):void 0;const o=Number(n);if(Number.isNaN(o))return r("Must be a valid float");const i=e.min??0,s=e.max??100;if(o<i)return r("Must be �� {{1}}",i);if(o>s)return r("Must be �� {{1}}",s)}let et=!1;function or(){et||(T("int",Ze),T("stepper",Ze),T("int-array",Rn),T("float",nr),T("slider",ro),T("float-array",On),T("text",me),T("string",me),T("multiline",me),T("password",me),T("email",qn),T("date",Ln),T("time",Tn),T("url",Kn),T("phone",Un),T("unit",Gn),T("dropdown",Yn),T("multi-selection",Xn),T("color",eo),T("rating",to),T("file",Jn),et=!0)}or();pn();or();const no=e=>({container:{padding:"var(--formitiva-space-sm, 8px)",margin:"0 auto",backgroundColor:"transparent",borderRadius:0,color:"var(--formitiva-color-text)",fontFamily:e?.fontFamily||"var(--formitiva-font-family, system-ui, -apple-system, sans-serif)",boxSizing:"border-box",minHeight:e?.minHeight??"0",...e?.width?{width:e.width,overflowX:"auto"}:{maxWidth:"100%"},...e?.height?{height:e.height,overflowY:"auto"}:{}},buttonStyle:{padding:"var(--formitiva-space-sm, 8px) var(--formitiva-space-md, 16px)",backgroundColor:"var(--formitiva-color-primary)",color:"var(--formitiva-color-background)",border:"1px solid var(--formitiva-color-primary)",borderRadius:"var(--formitiva-border-radius, 6px)",cursor:"pointer",fontSize:e?.fontSize||"1rem",fontWeight:"600",transition:"all 0.2s ease",boxShadow:"var(--formitiva-shadow-small, 0 1px 3px rgba(0, 0, 0, 0.12))"},titleStyle:{marginBottom:"var(--formitiva-space-lg, 24px)",color:"var(--formitiva-color-text)",fontSize:typeof e?.fontSize=="number"?`${e.fontSize*1.5}px`:"1.5rem",fontWeight:"700",lineHeight:"1.2",textAlign:"left"}}),oo=e=>{const t={color:"var(--formitiva-color-text)",fontFamily:e?.fontFamily||"var(--formitiva-font-family, inherit)",transition:"all 0.2s ease",outline:"none",width:"100%",boxSizing:"border-box"};return{container:{fontFamily:e?.fontFamily||"var(--formitiva-font-family, inherit)",fontSize:e?.fontSize||"var(--formitiva-font-size, 1rem)",width:"100%",maxWidth:e?.width||"100%",marginBottom:"var(--formitiva-space-md, 16px)"},label:{display:"block",marginBottom:"var(--formitiva-space-xs, 4px)",fontWeight:"500",color:"var(--formitiva-color-text)",fontSize:"var(--formitiva-font-size, 1rem)",fontFamily:e?.fontFamily||"var(--formitiva-font-family, inherit)"},input:t,textInput:t,optionInput:t,select:{...t,cursor:"pointer",backgroundRepeat:"no-repeat",backgroundPosition:"right 8px center",backgroundSize:"16px",paddingRight:"32px",backgroundImage:`url("data:image/svg+xml;utf8,<svg
396
+ xmlns='http://www.w3.org/2000/svg'
397
+ viewBox='0 0 24 24'
398
+ fill='none'
399
+ stroke='currentColor'
400
+ stroke-width='2'
401
+ stroke-linecap='round'
402
+ stroke-linejoin='round'>
403
+ <polyline points='6,9 12,15 18,9'/>
404
+ </svg>")`},textarea:{...t,minHeight:"80px",resize:"vertical",paddingTop:"var(--formitiva-space-sm, 8px)"},error:{color:"var(--formitiva-color-error)",fontSize:"0.875rem",marginTop:"var(--formitiva-space-xs, 4px)",display:"block"}}},ir=({children:e,definitionName:t="",defaultStyle:r,defaultLanguage:n="en",defaultTheme:o="light",defaultLocalizeName:i="",defaultFieldValidationMode:s="onEdit",className:c="formitiva-container",defaultDisplayInstanceName:a=!0})=>{const u=t,m=i,d=o,p=n,v=l.useMemo(()=>r??{},[r]),[k,y]=l.useState({}),[g,b]=l.useState({});l.useEffect(()=>{let h=!0;return(async()=>{if(p==="en"){h&&(y({}),b({}));return}try{const j=await Nn(p),w=j.success?j.translations:{};h&&y(w);const S=await jn(p,m),N=S.success?S.translations:{};h&&b(N)}catch{h&&(y({}),b({}))}})(),()=>{h=!1}},[p,m]);const C=l.useMemo(()=>no(v),[v]),M=l.useMemo(()=>oo(v),[v]),R=l.useMemo(()=>In(p,k,g),[p,k,g]),E=l.useCallback((h,...x)=>R(h,...x),[R]),F=l.useMemo(()=>({definitionName:u,language:p,theme:d,formStyle:C,fieldStyle:M,t:E,fieldValidationMode:s,displayInstanceName:a}),[u,p,d,M,C,E,s,a]),I=v?.height?{height:"100%"}:void 0;return f.jsx(je.Provider,{value:F,children:f.jsx("div",{"data-formitiva-theme":d,className:c,style:I,children:e})})};function io(e){if(!e||typeof e!="object")return"Definition must be an object";const t=e;if(!t.name||typeof t.name!="string")return"Definition must include a 'name' string";if(t.name.trim()==="")return"Definition 'name' cannot be empty";if(!t.version||typeof t.version!="string")return"Definition must include a 'version' string";if(t.properties!==void 0&&!Array.isArray(t.properties))return"'properties' must be an array if provided";if(Array.isArray(t.properties))for(let r=0;r<t.properties.length;r++){const n=t.properties[r];if(!n||typeof n!="object")return`Property at index ${r} must be an object`;if(!n.name||typeof n.name!="string")return`Property at index ${r} must have a string 'name'`;if(n.name.trim()==="")return`Property at index ${r} has an empty 'name'`;if(!n.type||typeof n.type!="string")return`Property '${n.name}' must have a string 'type'`;if(n.type.trim()==="")return`Property '${n.name}' has an empty 'type'`}return null}async function ao(e,t={}){const{validateSchema:r=!0}=t;try{if(!e||typeof e!="string")return{success:!1,error:"jsonData must be a non-empty JSON string"};const n=e.trim();if(!n)return{success:!1,error:"jsonData is empty"};let o;try{o=JSON.parse(n)}catch(i){return{success:!1,error:`Invalid JSON format: ${i instanceof Error?i.message:"Unknown parsing error"}`}}if(r){const i=io(o);if(i)return{success:!1,error:`Schema validation failed: ${i}`}}return{success:!0,definition:o}}catch(n){return{success:!1,error:`Unexpected error loading definition: ${n instanceof Error?n.message:"Unknown error"}`}}}function ar(e,t){try{if(!e)return{success:!1,error:"Definition is required"};if(!t||typeof t!="string")return{success:!1,error:"Instance name is required"};const r={name:t,definition:e.name??"unknown",version:e.version??"1.0.0",values:{}},n=e.properties||[];return Array.isArray(n)&&n.forEach(o=>{const i=o;if(i.type==="unit"){const s=i.defaultUnit,c=Number(i.defaultValue)||void 0;r.values[i.name]=[c||0,s||"m"]}else i.defaultValue!==void 0&&(r.values[i.name]=i.defaultValue)}),{success:!0,instance:r}}catch(r){return{success:!1,error:`Error creating instance: ${r instanceof Error?r.message:"Unknown error"}`}}}function so(e){try{if(!e)return{success:!1,error:"Instance data is required"};let t;if(typeof e=="string")try{t=JSON.parse(e)}catch(r){return{success:!1,error:`Invalid JSON format: ${r instanceof Error?r.message:"Unknown parsing error"}`}}else t=e;return typeof t!="object"||t===null?{success:!1,error:"Instance must be a valid object"}:{success:!0,instance:t}}catch(t){return{success:!1,error:`Error loading instance: ${t instanceof Error?t.message:"Unknown error"}`}}}function lo(e,t,r){try{if(!e)return{success:!1,error:"Instance is required"};if(!t)return{success:!1,error:"Latest definition is required"};if(e.definition===t.name&&e.version===t.version)return{success:!0,instance:e};const n={name:e.name||t.name+"-instance",definition:t.name,version:t.version,values:{}},o=n.values,i={};(t.properties||[]).forEach(a=>{i[a.name]=a});const s=(a,u,m)=>{if(a==null)return a;const d=u.toLowerCase();try{if(d==="string"||d==="text")return String(a);if(d==="int"||d==="integer"||d==="number"||d==="float"){if(typeof a=="number")return a;if(typeof a=="boolean")return a?1:0;if(typeof a=="string"){const p=a.trim();if(p==="")return null;const v=Number(p);return Number.isNaN(v)?0:v}return 0}if(d==="boolean"||d==="bool"||d==="checkbox"||d==="switch"){if(typeof a=="boolean")return a;if(typeof a=="number")return a!==0;if(typeof a=="string"){const p=a.toLowerCase().trim();return["true","1","yes","on"].includes(p)}return!!a}if(d==="unit"){if(Array.isArray(a)&&a.length>=2)return a;if(Array.isArray(a)&&a.length===1)return[a[0],m&&m.defaultUnit||"m"];if(typeof a=="number")return[a,m&&m.defaultUnit||"m"];if(typeof a=="string"){const p=Number(a);return[Number.isNaN(p)?0:p,m&&m.defaultUnit||"m"]}return[0,m&&m.defaultUnit||"m"]}if(d.endsWith("[]")||d==="array"||d==="int-array"||d==="float-array")return Array.isArray(a)?a:typeof a=="string"?a.split(",").map(p=>p.trim()).filter(Boolean):[a]}catch{}return a},c=e.values||{};Object.keys(c).forEach(a=>{const u=c[a],m=i[a];if(!m)return;const d=Array.isArray(u)?"array":u===null?"null":typeof u,p=(m.type||"").toLowerCase();d===p||p==="string"&&typeof u=="string"?o[a]=u:o[a]=s(u,p,m)}),(t.properties||[]).forEach(a=>{const u=a.name;u in o||(o[u]=a.defaultValue)});try{typeof r=="function"&&r?.(e,n,t)}catch(a){return{success:!1,error:`Upgrade callback error: ${a instanceof Error?a.message:String(a)}`}}return{success:!0,instance:n}}catch(n){return{success:!1,error:`Error upgrading instance: ${n instanceof Error?n.message:"Unknown error"}`}}}function co(e){const[t,r]=l.useState(null);return l.useEffect(()=>{const n=document.querySelector("[data-formitiva-theme]");if(!n)return;const o=n.closest("[data-formitiva-theme]");if(!o)return;const i=()=>r(o.getAttribute("data-formitiva-theme"));i();const s=new MutationObserver(c=>{for(const a of c)a.type==="attributes"&&a.attributeName==="data-formitiva-theme"&&i()});return s.observe(o,{attributes:!0,attributeFilter:["data-formitiva-theme"]}),()=>s.disconnect()},[e]),t}const uo=({definitionData:e,instance:t,language:r,className:n,theme:o,style:i,fieldValidationMode:s="onEdit",displayInstanceName:c=!0,onSubmit:a=void 0,onValidation:u=void 0})=>{const m=l.useMemo(()=>{try{return typeof e=="string"?JSON.parse(e):e??null}catch{return null}},[e]),d={fontSize:"inherit",fontFamily:"inherit",...i},p=co(),v=o??p??"light",k=r??"en";l.useEffect(()=>{let g=document.getElementById("popup-root");g||(g=document.createElement("div"),g.id="popup-root",document.body.appendChild(g))},[]);const y=l.useMemo(()=>{if(t)return t;if(!m)return null;const g=ar(m,m.name);return!g.success||!g.instance?null:g.instance},[t,m]);return m?y?f.jsx(ir,{definitionName:m.name,defaultStyle:d,defaultLanguage:k,defaultTheme:v,defaultLocalizeName:m.localization||"",className:n,defaultFieldValidationMode:s,defaultDisplayInstanceName:c,children:f.jsx(er,{definition:m,instance:y,onSubmit:a,onValidation:u})}):f.jsx("div",{style:{color:"red"},children:"Error: Failed to create instance from definition."}):f.jsx("div",{style:{color:"red"},children:"Error: No form definition provided."})},ee=new Map,W={components:new Map,fieldValidators:new Map,fieldTypeValidators:new Map,formValidators:new Map,submissionHandlers:new Map};function sr(e,t,r){if(!e)return!0;if(r&&!r(e))return!1;switch(t){case"error":throw new Error(`Plugin conflict: "${e.newPlugin}" tried to register ${e.type} "${e.name}" already registered by "${e.existingPlugin}"`);case"warn":return console.warn(`Plugin conflict: "${e.newPlugin}" tried to register ${e.type} "${e.name}" already registered by "${e.existingPlugin}". Skipping.`),!1;case"override":return console.info(`Plugin "${e.newPlugin}" is overriding ${e.type} "${e.name}" previously registered by "${e.existingPlugin}"`),!0;case"skip":return!1}}function mo(e){const t=[];if(e.components)for(const r of Object.keys(e.components)){const n=Pe(r);if(n){let o;for(const[i,s]of ee)if(s.components&&s.components[r]===n){o=i;break}o&&o!==e.name&&t.push({type:"component",name:r,existingPlugin:o,newPlugin:e.name})}}if(e.fieldCustomValidators)for(const[r,n]of Object.entries(e.fieldCustomValidators))for(const o of Object.keys(n)){const s=W.fieldValidators.get(r)?.get(o);vt(r,o)&&s&&s!==e.name&&t.push({type:"fieldCustomValidator",name:`${r}:${o}`,existingPlugin:s,newPlugin:e.name})}if(e.fieldTypeValidators)for(const r of Object.keys(e.fieldTypeValidators)){const n=bt(r),o=W.fieldTypeValidators.get(r);n&&o&&o!==e.name&&t.push({type:"fieldTypeValidator",name:`type:${r}`,existingPlugin:o,newPlugin:e.name})}if(e.formValidators)for(const r of Object.keys(e.formValidators)){const n=ht(r),o=W.formValidators.get(r);n&&o&&o!==e.name&&t.push({type:"formValidator",name:r,existingPlugin:o,newPlugin:e.name})}if(e.submissionHandlers)for(const r of Object.keys(e.submissionHandlers)){const n=xn(r),o=W.submissionHandlers.get(r);n&&o&&o!==e.name&&t.push({type:"submissionHandler",name:r,existingPlugin:o,newPlugin:e.name})}return t}function le(e,t,r,n,o,i,s,c){for(const a of Object.keys(e)){let u;if(c?u=o.find(m=>m.type==="fieldCustomValidator"&&m.name===`${c}:${a}`):e===n.components?u=o.find(m=>m.type==="component"&&m.name===a):e===n.formValidators?u=o.find(m=>m.type==="formValidator"&&m.name===a):e===n.fieldTypeValidators?u=o.find(m=>m.type==="fieldTypeValidator"&&m.name===`type:${a}`):e===n.submissionHandlers&&(u=o.find(m=>m.type==="submissionHandler"&&m.name===a)),sr(u||null,i,s))if(c){const m=t.get(c)||new Map;m.set(a,n.name),t.set(c,m),r(a,e[a])}else t===W.components?t.set(a,e[a]):t.set(a,n.name),r(a,e[a])}}function fo(e,t){const r=t?.conflictResolution||"error";if(ee.has(e.name)){const o={type:"plugin",name:e.name,existingPlugin:e.name,newPlugin:e.name};if(!sr(o,r,t?.onConflict))return}const n=mo(e);if(e.components&&le(e.components,W.components,De,e,n,r,t?.onConflict),e.fieldCustomValidators)for(const[o,i]of Object.entries(e.fieldCustomValidators))le(i,W.fieldValidators,(s,c)=>pt(o,s,c),e,n,r,t?.onConflict,o);e.formValidators&&le(e.formValidators,W.formValidators,ft,e,n,r,t?.onConflict),e.fieldTypeValidators&&le(e.fieldTypeValidators,W.fieldTypeValidators,gt,e,n,r,t?.onConflict),e.submissionHandlers&&le(e.submissionHandlers,W.submissionHandlers,Le,e,n,r,t?.onConflict),e.setup&&e.setup(),ee.set(e.name,e)}function po(e,t=!1){const r=ee.get(e);if(!r)return!1;if(r.cleanup&&r.cleanup(),t){if(r.components)for(const n of Object.keys(r.components))W.components.delete(n);if(r.fieldCustomValidators)for(const[n,o]of Object.entries(r.fieldCustomValidators)){const i=W.fieldValidators.get(n);if(i){for(const s of Object.keys(o))i.delete(s);i.size===0&&W.fieldValidators.delete(n)}}if(r.formValidators)for(const n of Object.keys(r.formValidators))W.formValidators.delete(n);if(r.fieldTypeValidators)for(const n of Object.keys(r.fieldTypeValidators))W.fieldTypeValidators.delete(n);if(r.submissionHandlers)for(const n of Object.keys(r.submissionHandlers))W.submissionHandlers.delete(n)}return ee.delete(e),!0}function go(e){return ee.get(e)}function vo(){return Array.from(ee.values())}function ho(e){return ee.has(e)}function bo(e){for(const[t,r]of Object.entries(e))De(t,r)}function te(e){return typeof e=="object"&&e!==null}function He(e){if(!te(e))return!1;const t=e;return typeof t.name=="string"&&typeof t.displayName=="string"}function lr(e){if(!te(e))return!1;const t=e;return typeof t.name!="string"||typeof t.version!="string"||!Array.isArray(t.properties)?!1:t.properties.every(r=>He(r))}function Ce(e){try{return typeof File<"u"&&e instanceof File}catch{const t=te(e)?e:void 0;return!!t&&typeof t.name=="string"&&typeof t.size=="number"}}function yo(e,t,r={}){try{const{includeMetadata:n=!1,dateFormat:o="iso",fileHandling:i="metadata",prettify:s=!1,excludeFields:c=[],includeOnlyFields:a=[]}=r;if(!e||typeof e!="object")return{success:!1,error:"Instance must be a valid object"};const u=[],m=[],d={},v=(lr(t)||te(t)&&Array.isArray(t.properties)?t.properties:[]).filter(He),k=new Map(v.map(g=>[g.name,g]));for(const[g,b]of Object.entries(e)){if(c.includes(g)){m.push(g);continue}if(a.length>0&&!a.includes(g)){m.push(g);continue}if(b===void 0)continue;const C=k.get(g);try{d[g]=xo(b,C,{dateFormat:o,fileHandling:i})}catch(M){u.push(`Error serializing field '${g}': ${String(M)}`),d[g]=null}}return n&&(d._metadata={serializedAt:new Date().toISOString(),version:(te(t)?t.version:void 0)||"1.0.0",fieldCount:Object.keys(d).length-1}),{success:!0,data:s?JSON.stringify(d,null,2):JSON.stringify(d),metadata:{fieldCount:Object.keys(d).length,excludedFields:m,warnings:u}}}catch(n){return{success:!1,error:`Serialization failed: ${n instanceof Error?n.message:"Unknown error"}`}}}function xo(e,t,r={}){const{dateFormat:n="iso",fileHandling:o="metadata"}=r;if(e==null)return null;if(t)switch(t.type){case"date":case"datetime":case"date-time":return tt(e,n);case"file":return rt(e,o);case"int":case"integer":return typeof e=="string"?parseInt(e,10):e;case"float":case"number":return typeof e=="string"?parseFloat(e):e;case"boolean":return typeof e=="string"?e==="true":!!e;case"int-array":case"float-array":return Array.isArray(e)?e.map(i=>typeof i=="string"?Number(i):i):e;default:return e}return e instanceof Date?tt(e,n):Ce(e)||Array.isArray(e)&&Ce(e[0])?rt(e,o):e}function tt(e,t){let r=null;if(e instanceof Date)r=e;else if(typeof e=="string"){const n=new Date(e);if(!isNaN(n.getTime()))r=n;else return e}else return e;switch(t){case"timestamp":return r.getTime();case"locale":return r.toLocaleString();case"iso":default:return r.toISOString()}}function rt(e,t){return t==="skip"?null:Array.isArray(e)?e.map(r=>nt(r,t)):nt(e,t)}function nt(e,t){if(!Ce(e))return e;const r=e;return t==="metadata"?{name:r.name,size:r.size,type:r.type,lastModified:r.lastModified}:{name:r.name,size:r.size,type:r.type,lastModified:r.lastModified,_note:"Base64 encoding requires async implementation"}}function wo(e,t,r={}){try{const{strict:n=!1,validateTypes:o=!0,preserveUnknownFields:i=!0,dateFormat:s="auto"}=r;if(!e||typeof e!="string")return{success:!1,error:"Serialized data must be a non-empty string"};let c;try{c=JSON.parse(e)}catch(y){return{success:!1,error:`Invalid JSON: ${y instanceof Error?y.message:"Unknown parsing error"}`}}if(!c||typeof c!="object")return{success:!1,error:"Parsed data must be an object"};const a=[],u=[],m={},p=(lr(t)||te(t)&&Array.isArray(t.properties)?t.properties:[]).filter(He),v=new Map(p.map(y=>[y.name,y]));for(const y of p){const g=y.name,b=c[g];if(b===void 0){n&&y.required&&u.push(`Required field '${g}' is missing`);continue}try{m[g]=So(b,y,{validateTypes:o,dateFormat:s})}catch(C){const M=`Error deserializing field '${g}': ${String(C)}`;n?u.push(M):(a.push(M),m[g]=b)}}if(i)for(const[y,g]of Object.entries(c))!v.has(y)&&y!=="_metadata"&&(n&&a.push(`Unknown field '${y}' preserved`),m[y]=g);const k=u.length>0;return{success:!k,data:m,warnings:a.length>0?a:void 0,validationErrors:k?u:void 0}}catch(n){return{success:!1,error:`Deserialization failed: ${n instanceof Error?n.message:"Unknown error"}`}}}function So(e,t,r={}){const{validateTypes:n=!0,dateFormat:o="auto"}=r;if(e==null)return e;try{switch(t.type){case"date":case"datetime":case"date-time":return No(e,o,n);case"int":case"integer":return ke(e,n);case"float":case"number":return Ne(e,n);case"boolean":return jo(e,n);case"int-array":return ot(e,"integer",n);case"float-array":return ot(e,"number",n);case"string":case"text":case"email":case"url":case"phone":return n?String(e):e;default:return e}}catch(i){if(n)throw new Error(`Type conversion failed: ${String(i)}`);return e}}function Co(e,t={}){try{const{prettify:r=!0,includeMetadata:n=!0}=t;if(!e||typeof e!="object")return{success:!1,error:"Definition must be a valid object"};const o={...e};return n&&(o._metadata={serializedAt:new Date().toISOString(),version:o.version||"1.0.0",propertyCount:(Array.isArray(o.properties)?o.properties.length:0)||0}),{success:!0,data:r?JSON.stringify(o,null,2):JSON.stringify(o),metadata:{fieldCount:(Array.isArray(o.properties)?o.properties.length:0)||0,excludedFields:[],warnings:[]}}}catch(r){return{success:!1,error:`Definition serialization failed: ${r instanceof Error?r.message:"Unknown error"}`}}}function ko(e,t={}){try{const{strict:r=!1,validateTypes:n=!0}=t;let o;if(typeof e=="string")try{o=JSON.parse(e)}catch(m){return{success:!1,error:`Invalid JSON for definition: ${m instanceof Error?m.message:"Unknown parsing error"}`}}else if(e&&typeof e=="object")o={...e};else return{success:!1,error:"Input must be a string or object"};const i=[],s=[],c=["name","version","displayName"];for(const m of c)if(!(m in o)||!o[m])if(r)s.push(`Required field '${m}' is missing`);else switch(i.push(`Missing field '${m}', using default`),m){case"name":o.name="unnamed-definition";break;case"version":o.version="1.0.0";break;case"displayName":o.displayName=o.name||"Unnamed Definition";break}const a=Array.isArray(o.properties)?o.properties:null;a?o.properties=a.map((m,d)=>{const p=te(m)?m:{},v={...p};if(!p.name){const k=`Property at index ${d} missing 'name'`;r?s.push(k):(i.push(`${k}, using 'field_${d}'`),v.name=`field_${d}`)}return p.displayName||(v.displayName=p.name||`Field ${d}`),p.type||(r&&n?s.push(`Property '${p.name||d}' missing 'type'`):(i.push(`Property '${p.name||d}' missing 'type', using 'string'`),v.type="string")),p.defaultValue===void 0&&(v.defaultValue=null),p.required===void 0&&(v.required=!1),v}):r?s.push("Properties must be an array"):(i.push("Properties not found or invalid, using empty array"),o.properties=[]);const u=s.length>0;return{success:!u,data:o,warnings:i.length>0?i:void 0,validationErrors:u?s:void 0}}catch(r){return{success:!1,error:`Definition deserialization failed: ${r instanceof Error?r.message:"Unknown error"}`}}}function No(e,t,r){if(e instanceof Date)return e;if(typeof e=="number"){const n=new Date(e);if(r&&isNaN(n.getTime()))throw new Error(`Invalid timestamp: ${e}`);return n}if(typeof e=="string"){const n=new Date(e);if(r&&isNaN(n.getTime()))throw new Error(`Invalid date string: ${e}`);return n}if(r)throw new Error(`Cannot convert ${typeof e} to Date`);return e}function ke(e,t){if(typeof e=="number"){if(Number.isInteger(e))return e;if(t)throw new Error(`Number ${e} is not an integer`);return Math.floor(e)}if(typeof e=="string"){const r=e.trim();if(r===""){if(t)throw new Error("Cannot convert empty string to integer");return e}const n=parseInt(r,10);if(t&&isNaN(n))throw new Error(`Cannot convert "${e}" to integer`);return n}if(t)throw new Error(`Cannot convert ${typeof e} to integer`);return e}function Ne(e,t){if(typeof e=="number"){if(t&&!isFinite(e))throw new Error(`Number ${e} is not finite`);return e}if(typeof e=="string"){const r=e.trim();if(r===""){if(t)throw new Error("Cannot convert empty string to number");return e}const n=parseFloat(r);if(t&&(isNaN(n)||!isFinite(n)))throw new Error(`Cannot convert "${e}" to number`);return n}if(t)throw new Error(`Cannot convert ${typeof e} to number`);return e}function jo(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){const r=e.toLowerCase();if(r==="true"||r==="1")return!0;if(r==="false"||r==="0")return!1;if(t)throw new Error(`Cannot convert "${e}" to boolean`)}if(typeof e=="number")return!!e;if(t)throw new Error(`Cannot convert ${typeof e} to boolean`);return e}function ot(e,t,r){if(!Array.isArray(e)){if(typeof e=="string")return e.split(",").map(o=>o.trim()).filter(Boolean).map(o=>t==="integer"?ke(o,r):Ne(o,r));if(r)throw new Error(`Expected array, got ${typeof e}`);return e}return e.map((n,o)=>{try{return t==="integer"?ke(n,r):Ne(n,r)}catch(i){if(r)throw new Error(`Array element ${o}: ${i}`);return n}})}function cr(){if(!document.getElementById("formitiva-styles"))try{const e=document.createElement("style");e.id="formitiva-styles",e.textContent=pr,document.head.appendChild(e)}catch{}}typeof document<"u"&&cr();exports.CSS_CLASSES=$;exports.Formitiva=uo;exports.FormitivaProvider=ir;exports.FormitivaRenderer=er;exports.StandardFieldLayout=z;exports.Units=rn;exports.combineClasses=H;exports.createInstanceFromDefinition=ar;exports.deserializeDefinition=ko;exports.deserializeInstance=wo;exports.getAllPlugins=vo;exports.getButtonHandler=Kt;exports.getComponent=Pe;exports.getPlugin=go;exports.getSupportedLanguages=Cn;exports.hasButtonHandler=sn;exports.hasPlugin=ho;exports.injectFormitivaStyles=cr;exports.isDarkTheme=ae;exports.listButtonHandlers=cn;exports.loadInstance=so;exports.loadJsonDefinition=ao;exports.registerButtonHandler=an;exports.registerComponent=De;exports.registerComponents=bo;exports.registerFieldCustomValidationHandler=pt;exports.registerFieldTypeValidationHandler=gt;exports.registerFormValidationHandler=ft;exports.registerPlugin=fo;exports.registerSubmissionHandler=Le;exports.serializeDefinition=Co;exports.serializeInstance=yo;exports.unregisterButtonHandler=ln;exports.unregisterPlugin=po;exports.upgradeInstanceToLatestDefinition=lo;exports.useDebouncedCallback=st;exports.useFieldValidator=B;exports.useFormitivaContext=L;exports.useUncontrolledValidatedInput=_;exports.validateFieldValue=xr;exports.validateFieldWithCustomHandler=Fe;