@contractspec/lib.contracts-runtime-client-react 3.8.5 → 3.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.
@@ -1,367 +1 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
- // src/form-render.impl.tsx
10
- import {
11
- buildZodWithRelations,
12
- evalPredicate
13
- } from "@contractspec/lib.contracts-spec/forms";
14
- import { zodResolver } from "@hookform/resolvers/zod";
15
- import React, { useEffect, useMemo, useState } from "react";
16
- import {
17
- Controller,
18
- useFieldArray,
19
- useForm
20
- } from "react-hook-form";
21
- import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
22
- "use client";
23
- function toOptionsArray(src) {
24
- if (!src)
25
- return;
26
- if (Array.isArray(src))
27
- return { kind: "static", options: src };
28
- return src;
29
- }
30
- function getAtPath(values, path) {
31
- if (!path)
32
- return;
33
- const segs = path.replace(/\[(\d+)\]/g, ".$1").split(".").filter(Boolean);
34
- let cur = values;
35
- for (const s of segs) {
36
- if (cur == null)
37
- return;
38
- cur = cur[s];
39
- }
40
- return cur;
41
- }
42
- function makeDepsKey(values, deps) {
43
- if (!deps || deps.length === 0)
44
- return "[]";
45
- try {
46
- return JSON.stringify(deps.map((d) => getAtPath(values, d)));
47
- } catch {
48
- return "[]";
49
- }
50
- }
51
- function useResolvedOptions(values, source, resolvers) {
52
- const [opts, setOpts] = useState([]);
53
- const depKey = useMemo(() => {
54
- if (!source)
55
- return "nil";
56
- if (source.kind === "static")
57
- return JSON.stringify(source.options ?? []);
58
- return makeDepsKey(values, source.deps);
59
- }, [source, values]);
60
- useEffect(() => {
61
- let mounted = true;
62
- const run = async () => {
63
- if (!source)
64
- return setOpts([]);
65
- if (source.kind === "static")
66
- return setOpts([...source.options ?? []]);
67
- const fn = resolvers?.[source.resolverKey];
68
- if (!fn)
69
- return setOpts([]);
70
- const res = await fn(values, source.args);
71
- if (mounted)
72
- setOpts([...res ?? []]);
73
- };
74
- run();
75
- return () => {
76
- mounted = false;
77
- };
78
- }, [
79
- depKey,
80
- source && source.kind === "resolver" ? source.resolverKey : undefined
81
- ]);
82
- return opts;
83
- }
84
- function fieldPath(parent, name, arrayIndex) {
85
- if (!name)
86
- return parent ?? "";
87
- const child = typeof arrayIndex === "number" ? `${name.replace(/^\$index$/, String(arrayIndex))}` : name;
88
- return parent ? `${parent}${typeof arrayIndex === "number" ? `.${arrayIndex}` : ""}.${child}`.replace(/\.+/g, ".") : child;
89
- }
90
- function createFormRenderer(base) {
91
- const conf = base;
92
- const { driver } = conf;
93
- function InternalForm(props) {
94
- const { spec, options, merged } = props;
95
- const baseZod = useMemo(() => buildZodWithRelations(spec), [spec]);
96
- const form = useForm({
97
- ...merged.formOptions,
98
- resolver: zodResolver(baseZod),
99
- defaultValues: options?.defaultValues
100
- });
101
- const values = form.watch();
102
- const renderOne = (f, parent, arrayIndex) => {
103
- const DriverField = driver.Field;
104
- const DriverLabel = driver.FieldLabel;
105
- const DriverDesc = driver.FieldDescription;
106
- const DriverError = driver.FieldError;
107
- const name = fieldPath(parent, f.name, arrayIndex);
108
- const visible = evalPredicate(values, f.visibleWhen);
109
- const enabled = evalPredicate(values, f.enabledWhen);
110
- const invalid = Boolean(form.getFieldState(name)?.invalid);
111
- if (!visible)
112
- return null;
113
- const id = name?.replace(/\./g, "-");
114
- const commonWrapProps = {
115
- "data-invalid": invalid,
116
- hidden: !visible,
117
- disabled: !enabled
118
- };
119
- const labelNode = f.labelI18n ? /* @__PURE__ */ jsxDEV(DriverLabel, {
120
- htmlFor: id,
121
- children: f.labelI18n
122
- }, undefined, false, undefined, this) : null;
123
- const descNode = f.descriptionI18n ? /* @__PURE__ */ jsxDEV(DriverDesc, {
124
- children: f.descriptionI18n
125
- }, undefined, false, undefined, this) : null;
126
- if (f.kind === "group") {
127
- const children = f.fields.map((c, i) => /* @__PURE__ */ jsxDEV(React.Fragment, {
128
- children: renderOne(c, name, arrayIndex)
129
- }, `${name}-${i}`, false, undefined, this));
130
- return /* @__PURE__ */ jsxDEV(DriverField, {
131
- ...commonWrapProps,
132
- children: [
133
- labelNode,
134
- children,
135
- descNode
136
- ]
137
- }, undefined, true, undefined, this);
138
- }
139
- if (f.kind === "array") {
140
- return renderArray(f, parent);
141
- }
142
- return /* @__PURE__ */ jsxDEV(Controller, {
143
- name,
144
- control: form.control,
145
- render: ({ field, fieldState }) => {
146
- const err = fieldState.error ? [fieldState.error] : [];
147
- const ariaInvalid = fieldState.invalid || undefined;
148
- if (f.kind === "text") {
149
- const textField = f;
150
- const Input = driver.Input;
151
- return /* @__PURE__ */ jsxDEV(DriverField, {
152
- ...commonWrapProps,
153
- children: [
154
- labelNode,
155
- /* @__PURE__ */ jsxDEV(Input, {
156
- id,
157
- "aria-invalid": ariaInvalid,
158
- placeholder: f.placeholderI18n,
159
- autoComplete: textField.autoComplete,
160
- inputMode: textField.inputMode,
161
- maxLength: textField.maxLength,
162
- minLength: textField.minLength,
163
- disabled: !enabled,
164
- ...field,
165
- ...f.uiProps
166
- }, undefined, false, undefined, this),
167
- descNode,
168
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
169
- errors: err
170
- }, undefined, false, undefined, this) : null
171
- ]
172
- }, undefined, true, undefined, this);
173
- }
174
- if (f.kind === "textarea") {
175
- const textareaField = f;
176
- const Textarea = driver.Textarea;
177
- return /* @__PURE__ */ jsxDEV(DriverField, {
178
- ...commonWrapProps,
179
- children: [
180
- labelNode,
181
- /* @__PURE__ */ jsxDEV(Textarea, {
182
- id,
183
- "aria-invalid": ariaInvalid,
184
- placeholder: f.placeholderI18n,
185
- rows: textareaField.rows,
186
- maxLength: textareaField.maxLength,
187
- disabled: !enabled,
188
- ...field,
189
- ...f.uiProps
190
- }, undefined, false, undefined, this),
191
- descNode,
192
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
193
- errors: err
194
- }, undefined, false, undefined, this) : null
195
- ]
196
- }, undefined, true, undefined, this);
197
- }
198
- if (f.kind === "select") {
199
- const selectField = f;
200
- const Select = driver.Select;
201
- const src = toOptionsArray(selectField.options);
202
- const opts = useResolvedOptions(values, src, merged.resolvers);
203
- return /* @__PURE__ */ jsxDEV(DriverField, {
204
- ...commonWrapProps,
205
- children: [
206
- labelNode,
207
- /* @__PURE__ */ jsxDEV(Select, {
208
- id,
209
- name,
210
- "aria-invalid": ariaInvalid,
211
- disabled: !enabled,
212
- value: field.value,
213
- onChange: (v) => field.onChange(v),
214
- options: opts,
215
- ...f.uiProps
216
- }, undefined, false, undefined, this),
217
- descNode,
218
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
219
- errors: err
220
- }, undefined, false, undefined, this) : null
221
- ]
222
- }, undefined, true, undefined, this);
223
- }
224
- if (f.kind === "checkbox") {
225
- const Checkbox = driver.Checkbox;
226
- return /* @__PURE__ */ jsxDEV(DriverField, {
227
- ...commonWrapProps,
228
- children: [
229
- labelNode,
230
- /* @__PURE__ */ jsxDEV(Checkbox, {
231
- id,
232
- name,
233
- disabled: !enabled,
234
- checked: !!field.value,
235
- onCheckedChange: (v) => field.onChange(v),
236
- ...f.uiProps
237
- }, undefined, false, undefined, this),
238
- descNode,
239
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
240
- errors: err
241
- }, undefined, false, undefined, this) : null
242
- ]
243
- }, undefined, true, undefined, this);
244
- }
245
- if (f.kind === "radio") {
246
- const radioField = f;
247
- const RadioGroup = driver.RadioGroup;
248
- const src = toOptionsArray(radioField.options);
249
- const opts = useResolvedOptions(values, src, merged.resolvers);
250
- return /* @__PURE__ */ jsxDEV(DriverField, {
251
- ...commonWrapProps,
252
- children: [
253
- labelNode,
254
- /* @__PURE__ */ jsxDEV(RadioGroup, {
255
- id,
256
- name,
257
- disabled: !enabled,
258
- value: field.value,
259
- onValueChange: (v) => field.onChange(v),
260
- options: opts,
261
- ...f.uiProps
262
- }, undefined, false, undefined, this),
263
- descNode,
264
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
265
- errors: err
266
- }, undefined, false, undefined, this) : null
267
- ]
268
- }, undefined, true, undefined, this);
269
- }
270
- if (f.kind === "switch") {
271
- const Switch = driver.Switch;
272
- return /* @__PURE__ */ jsxDEV(DriverField, {
273
- ...commonWrapProps,
274
- children: [
275
- labelNode,
276
- /* @__PURE__ */ jsxDEV(Switch, {
277
- id,
278
- name,
279
- disabled: !enabled,
280
- checked: !!field.value,
281
- onCheckedChange: (v) => field.onChange(v),
282
- ...f.uiProps
283
- }, undefined, false, undefined, this),
284
- descNode,
285
- fieldState.invalid ? /* @__PURE__ */ jsxDEV(DriverError, {
286
- errors: err
287
- }, undefined, false, undefined, this) : null
288
- ]
289
- }, undefined, true, undefined, this);
290
- }
291
- return /* @__PURE__ */ jsxDEV(Fragment, {}, undefined, false, undefined, this);
292
- }
293
- }, name, false, undefined, this);
294
- };
295
- const renderArray = (f, parent) => {
296
- const name = fieldPath(parent, f.name);
297
- const { fields, append, remove } = useFieldArray({
298
- control: form.control,
299
- name
300
- });
301
- const canAdd = f.max == null || fields.length < f.max;
302
- const canRemove = (idx) => (f.min == null ? fields.length > 0 : fields.length > f.min) && idx >= 0;
303
- const Button2 = driver.Button;
304
- const Label = driver.FieldLabel;
305
- return /* @__PURE__ */ jsxDEV("div", {
306
- children: [
307
- f.labelI18n ? /* @__PURE__ */ jsxDEV(Label, {
308
- children: f.labelI18n
309
- }, undefined, false, undefined, this) : null,
310
- fields.map((row, idx) => /* @__PURE__ */ jsxDEV("div", {
311
- children: [
312
- renderOne(f.of, name, idx),
313
- canRemove(idx) ? /* @__PURE__ */ jsxDEV(Button2, {
314
- type: "button",
315
- variant: "ghost",
316
- size: "sm",
317
- onClick: () => remove(idx),
318
- children: "Remove"
319
- }, undefined, false, undefined, this) : null
320
- ]
321
- }, row.id ?? idx, true, undefined, this)),
322
- canAdd ? /* @__PURE__ */ jsxDEV(Button2, {
323
- type: "button",
324
- variant: "outline",
325
- size: "sm",
326
- onClick: () => append({}),
327
- children: "Add"
328
- }, undefined, false, undefined, this) : null
329
- ]
330
- }, name, true, undefined, this);
331
- };
332
- const onSubmit = async (data) => {
333
- const actionKey = spec.actions?.[0]?.key ?? "submit";
334
- if (merged.onSubmitOverride) {
335
- return merged.onSubmitOverride(data, actionKey);
336
- }
337
- };
338
- const Button = driver.Button;
339
- return /* @__PURE__ */ jsxDEV("form", {
340
- onSubmit: form.handleSubmit(onSubmit),
341
- children: [
342
- (spec.fields || []).map((f, i) => /* @__PURE__ */ jsxDEV(React.Fragment, {
343
- children: renderOne(f)
344
- }, i, false, undefined, this)),
345
- spec.actions && spec.actions.length ? /* @__PURE__ */ jsxDEV("div", {
346
- children: spec.actions.map((a) => /* @__PURE__ */ jsxDEV(Button, {
347
- type: "submit",
348
- children: a.labelI18n
349
- }, a.key, false, undefined, this))
350
- }, undefined, false, undefined, this) : null
351
- ]
352
- }, undefined, true, undefined, this);
353
- }
354
- return {
355
- render: (spec, options) => /* @__PURE__ */ jsxDEV(InternalForm, {
356
- spec,
357
- options,
358
- merged: {
359
- ...conf,
360
- ...options?.overrides ?? {}
361
- }
362
- }, undefined, false, undefined, this)
363
- };
364
- }
365
- export {
366
- createFormRenderer
367
- };
1
+ var TB=((B)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(B,{get:(G,Y)=>(typeof require<"u"?require:G)[Y]}):B)(function(B){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+B+'" is not supported')});import{buildZodWithRelations as d,evalPredicate as m,isFieldReadOnly as t,normalizeFormSpec as i}from"@contractspec/lib.contracts-spec/forms";import{zodResolver as l}from"@hookform/resolvers/zod";import V from"react";import{Controller as A,useFieldArray as s,useForm as o}from"react-hook-form";import{jsx as U,jsxs as q,Fragment as wB}from"react/jsx-runtime";function F(B){if(!B)return;if(Array.isArray(B))return{kind:"static",options:[...B]};return B}function y(B,G){if(!G)return;let Y=G.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean),H=B;for(let J of Y){if(H==null)return;H=H[J]}return H}function r(B){if(!B)return[];return B.split(".").filter((G)=>/^\d+$/.test(G)).map((G)=>Number(G))}function u(B,G){if(!G)return B??"";return B?`${B}.${G}`:G}function f(B,G){if(!G||G.length===0)return"[]";try{return JSON.stringify(G.map((Y)=>y(B,Y)))}catch{return"[]"}}function e(B,G){let[Y,H]=V.useState(B);return V.useEffect(()=>{let J=globalThis.setTimeout(()=>H(B),G);return()=>globalThis.clearTimeout(J)},[G,B]),Y}function j(B,G,Y){let[H,J]=V.useState([]),_=V.useMemo(()=>{if(!G)return"nil";if(G.kind==="static")return JSON.stringify(G.options??[]);return`${G.resolverKey}:${f(B,G.deps)}`},[G,B]);return V.useEffect(()=>{let $=!0;return(async()=>{if(!G){J([]);return}if(G.kind==="static"){J([...G.options??[]]);return}let w=Y?.[G.resolverKey];if(!w){J([]);return}let b=await w(B,G.args);if($)J([...b??[]])})(),()=>{$=!1}},[_,Y,G,B]),H}function n(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B==="string"||typeof B==="number"){let G=new Date(B);if(!Number.isNaN(G.getTime()))return G}return null}function p(B){if(B instanceof Date&&!Number.isNaN(B.getTime()))return B;if(typeof B!=="string"||B.trim().length===0)return null;let[G,Y]=B.split(":").map(($)=>Number($)),H=G??Number.NaN,J=Y??Number.NaN;if(Number.isNaN(H)||Number.isNaN(J))return null;let _=new Date;return _.setHours(H,J,0,0),_}function BB(B){if(!B)return"";return`${String(B.getHours()).padStart(2,"0")}:${String(B.getMinutes()).padStart(2,"0")}`}function a(B){return{value:B.value,labelI18n:B.labelI18n,descriptionI18n:B.descriptionI18n,...B.data??{}}}function GB(B,G,Y){let H=G.trim().toLowerCase();if(!H)return[...B];let J=H.split(/\s+/).filter(Boolean);return B.filter((_)=>{let $=a(_),L=[_.labelI18n,_.descriptionI18n,String(_.value),...Y.map((w)=>String(y($,w)??""))].join(" ").toLowerCase();return J.every((w)=>L.includes(w))})}function x(B,G){let Y=a(B);switch(G.mode){case"scalar":return G.valueKey?y(Y,G.valueKey)??B.value:B.value;case"pick":return Object.fromEntries(G.pickKeys.map((H)=>[H,y(Y,H)]));case"object":default:return B.data??Y}}function v(B,G){try{return JSON.stringify(B)===JSON.stringify(G)}catch{return B===G}}function HB(B,G,Y,H){let J=H&&Array.isArray(G)?G:[G];return B.filter((_)=>J.some(($)=>v(x(_,Y),$)))}function c(B){if(!B)return{countryCode:"",nationalNumber:""};let G=B.countryCode.trim(),Y=B.nationalNumber.replace(/\s+/g,""),H=G.replace(/^\+?/,"+"),J={...B,countryCode:G,nationalNumber:B.nationalNumber};if(B.e164!=null||G||Y)J.e164=`${H}${Y}`.trim();return J}function JB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Select,{id:B.ctx.id,name:B.ctx.name,"aria-invalid":_.invalid||void 0,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function UB(B){let G=j(B.values,F(B.spec.options),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.RadioGroup,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled||B.ctx.readOnly,value:J.value,onValueChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},options:G,...B.spec.uiProps}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function XB(B){let[G,Y]=V.useState(""),H=B.spec.source.kind==="resolver"?B.spec.source.debounceMs??200:0,J=e(G,H),[_,$]=V.useState([]),L=V.useMemo(()=>{return B.spec.source.kind==="resolver"?`${B.spec.source.resolverKey}:${f(B.values,B.spec.source.deps)}:${J}`:"local"},[J,B.spec.source,B.values]);V.useEffect(()=>{if(B.spec.source.kind!=="resolver")return;let Z=B.resolvers?.[B.spec.source.resolverKey],k=B.spec.source.minQueryLength??0;if(!Z||J.trim().length<k){$([]);return}let g=!0,D={...B.spec.source.args??{},query:J};return Promise.resolve(Z(B.values,D)).then((C)=>{if(g)$([...C??[]])}),()=>{g=!1}},[L,B.resolvers,B.spec.source,B.values,J]);let w=B.spec.source.kind==="local"?GB(B.spec.source.options,G,B.spec.source.searchKeys):_,b=B.driver.Field,X=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:Z,fieldState:k})=>{let g=k.error?[k.error]:[],D=HB(w,Z.value,B.spec.valueMapping,B.spec.multiple),C=(O)=>{if(B.ctx.readOnly)return;let W=x(O,B.spec.valueMapping);if(B.spec.multiple){let P=Array.isArray(Z.value)?Z.value:[],R=P.some((S)=>v(S,W));Z.onChange(R?P:[...P,W]);return}Z.onChange(W),Y(O.labelI18n)},T=(O)=>{if(B.ctx.readOnly||!B.spec.multiple)return;let W=x(O,B.spec.valueMapping),P=Array.isArray(Z.value)?Z.value:[];Z.onChange(P.filter((R)=>!v(R,W)))};return q(b,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.Autocomplete,{id:B.ctx.id,name:B.ctx.name,disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":k.invalid||void 0,placeholder:B.spec.placeholderI18n,multiple:B.spec.multiple,query:G,options:w,selectedOptions:D,onQueryChange:Y,onSelectOption:C,onRemoveOption:T}),B.descNode,k.invalid?U(X,{errors:g}):null]})}})}function YB(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.AddressField,{id:B.ctx.id,name:B.ctx.name,value:J.value??null,onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(L)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function _B(B){let G=j(B.values,F(B.spec.countryOptions),B.resolvers),Y=B.driver.Field,H=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:J,fieldState:_})=>{let $=_.error?[_.error]:[];return q(Y,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.PhoneField,{id:B.ctx.id,name:B.ctx.name,value:c(J.value??null),onChange:(L)=>{if(B.ctx.readOnly)return;J.onChange(c(L))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,"aria-invalid":_.invalid||void 0,parts:B.spec.parts,countryOptions:G}),B.descNode,_.invalid?U(H,{errors:$}):null]})}})}function $B(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function IB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.TimeField,{id:B.ctx.id,name:B.ctx.name,value:p(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange(BB($))},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,placeholder:B.spec.placeholderI18n,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function LB(B){let G=B.driver.Field,Y=B.driver.FieldError;return U(A,{name:B.ctx.name,control:B.form.control,render:({field:H,fieldState:J})=>{let _=J.error?[J.error]:[];return q(G,{...B.commonWrapProps,children:[B.labelNode,U(B.driver.DateTimeField,{id:B.ctx.id,name:B.ctx.name,value:n(H.value),onChange:($)=>{if(B.ctx.readOnly)return;H.onChange($)},disabled:!B.ctx.enabled,readOnly:B.ctx.readOnly,datePlaceholder:B.spec.placeholderI18n,timePlaceholder:B.spec.placeholderI18n,minDate:B.spec.minDate,maxDate:B.spec.maxDate,is24Hour:B.spec.is24Hour}),B.descNode,J.invalid?U(Y,{errors:_}):null]})}})}function ZB(B){let G=u(B.parent,B.spec.name),{fields:Y,append:H,remove:J}=s({control:B.form.control,name:G}),_=B.spec.max==null||Y.length<B.spec.max,$=(L)=>(B.spec.min==null?Y.length>0:Y.length>B.spec.min)&&L>=0;return q("div",{children:[B.spec.labelI18n?U(B.driver.FieldLabel,{children:B.spec.labelI18n}):null,Y.map((L,w)=>q("div",{children:[B.renderField(B.spec.of,`${G}.${w}`),$(w)?U(B.driver.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>J(w),children:"Remove"}):null]},L.id??w)),_?U(B.driver.Button,{type:"button",variant:"outline",size:"sm",onClick:()=>H({}),children:"Add"}):null]},G)}function kB(B){let G=B;function Y(H){let J=V.useMemo(()=>i(H.spec),[H.spec]),_=V.useMemo(()=>d(J),[J]),$=o({...H.merged.formOptions,resolver:l(_),defaultValues:H.options?.defaultValues}),L=$.watch(),w=(X,Z)=>{let k=H.merged.driver.Field,g=H.merged.driver.FieldLabel,D=H.merged.driver.FieldDescription,C=H.merged.driver.FieldError,T=u(Z,X.name),O=r(Z),W=m(L,X.visibleWhen,O),P=m(L,X.enabledWhen,O),R=t(X),S=Boolean($.getFieldState(T)?.invalid);if(!W)return null;let I={name:T,id:T.replace(/\./g,"-"),enabled:P,readOnly:R,visible:W},M={"data-invalid":S,hidden:!W,disabled:!P||R},K=X.labelI18n?U(g,{htmlFor:I.id,children:X.labelI18n}):null,Q=X.descriptionI18n?U(D,{children:X.descriptionI18n}):null;if(X.kind==="group")return q(k,{...M,children:[K,X.fields.map((N,z)=>U(V.Fragment,{children:w(N,T)},`${T}-${z}`)),Q]});if(X.kind==="array")return U(ZB,{driver:H.merged.driver,form:$,spec:X,parent:Z,renderField:w},T);if(X.kind==="select")return U(JB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="radio")return U(UB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="autocomplete")return U(XB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="address")return U(YB,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="phone")return U(_B,{driver:H.merged.driver,form:$,values:L,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M,resolvers:H.merged.resolvers},T);if(X.kind==="date")return U($B,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="time")return U(IB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);if(X.kind==="datetime")return U(LB,{driver:H.merged.driver,form:$,spec:X,ctx:I,labelNode:K,descNode:Q,commonWrapProps:M},T);return U(A,{name:T,control:$.control,render:({field:N,fieldState:z})=>{let h=z.error?[z.error]:[];if(X.kind==="text"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Input,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,autoComplete:E.autoComplete,inputMode:E.inputMode,maxLength:E.maxLength,minLength:E.minLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="textarea"){let E=X;return q(k,{...M,children:[K,U(H.merged.driver.Textarea,{id:I.id,"aria-invalid":z.invalid||void 0,placeholder:X.placeholderI18n,rows:E.rows,maxLength:E.maxLength,disabled:!I.enabled,readOnly:I.readOnly,...N,...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]})}if(X.kind==="checkbox")return q(k,{...M,children:[K,U(H.merged.driver.Checkbox,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});if(X.kind==="switch")return q(k,{...M,children:[K,U(H.merged.driver.Switch,{id:I.id,name:I.name,disabled:!I.enabled||I.readOnly,checked:Boolean(N.value),onCheckedChange:(E)=>{if(I.readOnly)return;N.onChange(E)},...X.uiProps}),Q,z.invalid?U(C,{errors:h}):null]});return U(wB,{})}},T)},b=async(X)=>{let Z=J.actions?.[0]?.key??"submit";if(H.merged.onSubmitOverride)return H.merged.onSubmitOverride(X,Z)};return q("form",{onSubmit:$.handleSubmit(b),children:[J.fields.map((X,Z)=>U(V.Fragment,{children:w(X)},Z)),J.actions?.length?U("div",{children:J.actions.map((X)=>U(H.merged.driver.Button,{type:"submit",children:X.labelI18n},X.key))}):null]})}return{render:(H,J)=>U(Y,{spec:H,options:J,merged:{...G,...J?.overrides??{}}})}}export{x as mapAutocompleteValue,GB as filterAutocompleteOptions,kB as createFormRenderer};