zod-form-engine 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +14 -0
- package/README.md +449 -0
- package/dist/index.js +2 -0
- package/dist/types/engine.d.ts +22 -0
- package/dist/types/field.d.ts +9 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/types.d.ts +24 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Copyright (c) 2026 Omar Rahal
|
|
2
|
+
|
|
3
|
+
All rights reserved.
|
|
4
|
+
|
|
5
|
+
Permission is granted to use this package as a dependency in your applications.
|
|
6
|
+
|
|
7
|
+
You may not:
|
|
8
|
+
- Copy the source code.
|
|
9
|
+
- Modify the source code.
|
|
10
|
+
- Redistribute this package.
|
|
11
|
+
- Publish modified versions.
|
|
12
|
+
- Reverse engineer this package.
|
|
13
|
+
|
|
14
|
+
For commercial usage, contact the author.
|
package/README.md
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
# @omar-ra7al/zod-form
|
|
2
|
+
|
|
3
|
+
Auto-generate React forms from a Zod schema. Define your fields, validation, and UI in one place — `ZodForm` renders the form for you.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What this package provides
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
| Feature | Description |
|
|
11
|
+
| --------------------------- | ------------------------------------------------------------ |
|
|
12
|
+
| **Schema-driven forms** | Build forms from a `z.object()` Zod schema |
|
|
13
|
+
| **Validation** | Powered by Zod + `react-hook-form` + `@hookform/resolvers` |
|
|
14
|
+
| **Custom field components** | Attach any React input via `field()` |
|
|
15
|
+
| **Nested objects** | Automatically renders grouped sections |
|
|
16
|
+
| **Dynamic arrays** | Add/remove repeating items (objects or primitives) |
|
|
17
|
+
| **Container styling** | Grid column spans and wrapper classes per field via Tailwind |
|
|
18
|
+
| **Live `onChange`** | Get form values as the user types |
|
|
19
|
+
| **JSON editor** | Paste JSON to fill the form, or export current values |
|
|
20
|
+
| **Submit UI** | Custom label, icon, styles, and loading state |
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
**Exports:** `ZodForm` (default), `field`, `getFieldMeta`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
| Package | Version |
|
|
31
|
+
| --------------------- | --------- |
|
|
32
|
+
| `react` | `^19.0.0` |
|
|
33
|
+
| `react-dom` | `^19.0.0` |
|
|
34
|
+
| `zod` | `^4.0.0` |
|
|
35
|
+
| `react-hook-form` | `^7.0.0` |
|
|
36
|
+
| `@hookform/resolvers` | `^5.0.0` |
|
|
37
|
+
| `lucide-react` | `^1.20.0` |
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm install @omar-ra7al/zod-form
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
### 1. Create a field component
|
|
53
|
+
|
|
54
|
+
Your component receives `value`, `onChange`, and anything you pass in `props`.
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
type InputProps = {
|
|
58
|
+
value: string;
|
|
59
|
+
onChange: (value: string) => void;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
function Input({ value, onChange, ...props }: InputProps) {
|
|
63
|
+
return (
|
|
64
|
+
<input
|
|
65
|
+
value={value}
|
|
66
|
+
onChange={(e) => onChange(e.target.value)}
|
|
67
|
+
className="w-full border p-2 rounded-md"
|
|
68
|
+
{...props}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. Define a Zod schema with `field()`
|
|
75
|
+
|
|
76
|
+
Wrap each field with `field(zodSchema, meta)`:
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import z from "zod";
|
|
80
|
+
import ZodForm, { field } from "@omar-ra7al/zod-form";
|
|
81
|
+
|
|
82
|
+
const schema = z.object({
|
|
83
|
+
name: field(z.string().min(1, "Name is required"), {
|
|
84
|
+
label: "Name",
|
|
85
|
+
containerClassName: "col-span-1",
|
|
86
|
+
component: Input,
|
|
87
|
+
}),
|
|
88
|
+
email: field(z.email(), {
|
|
89
|
+
label: "Email",
|
|
90
|
+
containerClassName: "col-span-1",
|
|
91
|
+
component: Input,
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 3. Render the form
|
|
97
|
+
|
|
98
|
+
```tsx
|
|
99
|
+
function MyForm() {
|
|
100
|
+
return (
|
|
101
|
+
<ZodForm
|
|
102
|
+
zodSchema={schema}
|
|
103
|
+
onSubmit={(data) => console.log(data)}
|
|
104
|
+
mode="onSubmit"
|
|
105
|
+
className="w-full max-w-2xl"
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## How it works
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Zod schema + field() → ZodForm → react-hook-form → Your components
|
|
117
|
+
↓ ↓
|
|
118
|
+
validation grid layout
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
1. You define a `z.object()` schema using normal `z.object()`, `z.array()`, etc.
|
|
122
|
+
2. Each field that needs UI config is wrapped with `field(zodSchema, meta)`.
|
|
123
|
+
3. `field()` returns the same Zod schema and stores metadata separately (not on `zod.meta()`).
|
|
124
|
+
4. `ZodForm` walks the schema, looks up metadata per field, and renders the matching components.
|
|
125
|
+
5. On submit, validated data is passed to your `onSubmit` handler.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## `field()` usage rules
|
|
130
|
+
|
|
131
|
+
1. **Call `field()` last** — after all Zod chaining:
|
|
132
|
+
- `field(z.string().min(1), { label: "Name" })` — correct
|
|
133
|
+
- `field(z.string(), { label: "Name" }).min(1)` — wrong (`.min()` returns a new instance, meta is lost)
|
|
134
|
+
2. **Wrap anything that needs UI config** with `field()`:
|
|
135
|
+
- Leaf inputs: `field(z.string(), { component, label, ... })`
|
|
136
|
+
- Nested sections: `field(z.object({ ... }), { label: "Profile", containerClassName })`
|
|
137
|
+
- Arrays: `field(z.array(...), { label: "Contacts" })`
|
|
138
|
+
- Array item cards (optional): `field(z.object({...}), { containerClassName })`
|
|
139
|
+
3. **Don't reuse one schema instance** across multiple `field()` calls (the second call overwrites metadata).
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## `field()` meta options
|
|
144
|
+
|
|
145
|
+
### Leaf fields (with `component`)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
| Option | Type | Description |
|
|
149
|
+
| -------------------- | ---------------------------------- | -------------------------------------------------------------------------------------- |
|
|
150
|
+
| `label` | `string` or `{ text, className? }` | Label shown above the field |
|
|
151
|
+
| `component` | `React component` | **Required.** Input component to render |
|
|
152
|
+
| `containerClassName` | `string` | Classes on the engine's field wrapper (label + input + error). Default: `"col-span-2"` |
|
|
153
|
+
| `props` | `object` | Extra props spread onto your component |
|
|
154
|
+
| `defaultValue` | `any` | Fallback when value is empty |
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
`props` and `defaultValue` are fully typed based on your Zod schema output type and component props.
|
|
158
|
+
|
|
159
|
+
### Nested objects
|
|
160
|
+
|
|
161
|
+
Use `field(z.object({ ... }), { label, containerClassName })`. Each nested object becomes a section heading with its own grid. **There is no depth limit** — objects and arrays can nest as deeply as your schema requires.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
| Option | Type | Description |
|
|
165
|
+
| -------------------- | ---------------------------------- | ---------------------------------------------------------------------------- |
|
|
166
|
+
| `label` | `string` or `{ text, className? }` | Section heading |
|
|
167
|
+
| `containerClassName` | `string` | Classes on the section wrapper. Replaces the default section styles when set |
|
|
168
|
+
| `props` | `object` | Extra props spread onto the section wrapper element |
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
const schema = z.object({
|
|
173
|
+
profile: field(
|
|
174
|
+
z.object({
|
|
175
|
+
name: field(z.string(), { label: "Name", component: Input }),
|
|
176
|
+
address: field(
|
|
177
|
+
z.object({
|
|
178
|
+
street: field(z.string(), { label: "Street", component: Input }),
|
|
179
|
+
location: field(
|
|
180
|
+
z.object({
|
|
181
|
+
city: field(z.string(), { label: "City", component: Input }),
|
|
182
|
+
zip: field(z.string(), { label: "ZIP", component: Input }),
|
|
183
|
+
}),
|
|
184
|
+
{ label: "Location" },
|
|
185
|
+
),
|
|
186
|
+
}),
|
|
187
|
+
{ label: "Address" },
|
|
188
|
+
),
|
|
189
|
+
}),
|
|
190
|
+
{
|
|
191
|
+
label: "Profile",
|
|
192
|
+
containerClassName: "col-span-2 border-l-2 border-primary/20 pl-4 my-2 bg-muted/30",
|
|
193
|
+
},
|
|
194
|
+
),
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Dynamic arrays
|
|
199
|
+
|
|
200
|
+
Use `field(z.array(...), { label: "..." })`. Users can add/remove items with **New item** / **×** buttons.
|
|
201
|
+
|
|
202
|
+
**Array of objects:**
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
const schema = z.object({
|
|
206
|
+
contacts: field(
|
|
207
|
+
z.array(
|
|
208
|
+
z.object({
|
|
209
|
+
phone: field(z.string(), { label: "Phone", component: Input }),
|
|
210
|
+
email: field(z.email(), { label: "Email", component: Input }),
|
|
211
|
+
}),
|
|
212
|
+
),
|
|
213
|
+
{ label: "Contacts" },
|
|
214
|
+
),
|
|
215
|
+
});
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Array of primitives** (renders a plain text input per item):
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
const schema = z.object({
|
|
222
|
+
tags: field(z.array(z.string()), { label: "Tags" }),
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Arrays and objects together:**
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
const schema = z.object({
|
|
230
|
+
projects: field(
|
|
231
|
+
z.array(
|
|
232
|
+
z.object({
|
|
233
|
+
title: field(z.string(), { label: "Title", component: Input }),
|
|
234
|
+
tasks: field(
|
|
235
|
+
z.array(
|
|
236
|
+
z.object({
|
|
237
|
+
name: field(z.string(), { label: "Task", component: Input }),
|
|
238
|
+
}),
|
|
239
|
+
),
|
|
240
|
+
{ label: "Tasks" },
|
|
241
|
+
),
|
|
242
|
+
}),
|
|
243
|
+
),
|
|
244
|
+
{ label: "Projects" },
|
|
245
|
+
),
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### Array-specific meta
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
| Level | Options |
|
|
253
|
+
| ----------------------------------- | -------------------------------------- |
|
|
254
|
+
| **Array** (`field(z.array(), {})`) | `label`, `containerClassName`, `props` |
|
|
255
|
+
| **Array item** (wrapped `z.object`) | `label`, `containerClassName`, `props` |
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
Array `containerClassName` defaults to `"grid-cols-2"` on the items grid. Array item `containerClassName` defaults to `"col-span-2"` on each item card.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## `ZodForm` props
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
<ZodForm
|
|
266
|
+
zodSchema={schema} // required — z.object() schema
|
|
267
|
+
onSubmit={(data) => {}} // required — called with validated data
|
|
268
|
+
onChange={(data) => {}} // optional — called on every value change
|
|
269
|
+
defaultValues={{}} // optional — initial / reset values
|
|
270
|
+
mode="onChange" // optional — react-hook-form validation mode
|
|
271
|
+
className="" // optional — extra classes on the form wrapper
|
|
272
|
+
jsonConfig={{}} // optional — JSON editor (see below)
|
|
273
|
+
submitConfig={{}} // optional — submit button (see below)
|
|
274
|
+
/>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### `mode`
|
|
278
|
+
|
|
279
|
+
When validation runs. Same as [react-hook-form `mode](https://react-hook-form.com/docs/useform#mode)`:
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
| Value | When validation runs |
|
|
283
|
+
| ------------- | -------------------------------------- |
|
|
284
|
+
| `"onChange"` | On every change (default) |
|
|
285
|
+
| `"onSubmit"` | On submit only |
|
|
286
|
+
| `"onBlur"` | On blur |
|
|
287
|
+
| `"onTouched"` | After first blur, then on every change |
|
|
288
|
+
| `"all"` | On blur and change |
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
### `jsonConfig`
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
| Option | Type | Default | Description |
|
|
295
|
+
| ---------- | --------- | ------- | ----------------------------------------- |
|
|
296
|
+
| `enabled` | `boolean` | `false` | Show the JSON editor panel |
|
|
297
|
+
| `liveData` | `boolean` | `false` | Auto-sync editor with current form values |
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
```tsx
|
|
301
|
+
<ZodForm
|
|
302
|
+
zodSchema={schema}
|
|
303
|
+
onSubmit={handleSubmit}
|
|
304
|
+
jsonConfig={{ enabled: true, liveData: true }}
|
|
305
|
+
/>
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### `submitConfig`
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
| Option | Type | Default | Description |
|
|
312
|
+
| ----------------- | ----------- | ---------------- | ------------------------- |
|
|
313
|
+
| `disabled` | `boolean` | `false` | Disable the submit button |
|
|
314
|
+
| `submitLabel` | `string` | `"Save Changes"` | Button text |
|
|
315
|
+
| `submitIcon` | `ReactNode` | save icon | Icon next to the label |
|
|
316
|
+
| `submitClassName` | `string` | built-in styles | Custom button classes |
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
```tsx
|
|
320
|
+
<ZodForm
|
|
321
|
+
zodSchema={schema}
|
|
322
|
+
onSubmit={handleSubmit}
|
|
323
|
+
submitConfig={{
|
|
324
|
+
submitLabel: "Create account",
|
|
325
|
+
submitClassName: "w-full bg-blue-600 text-white py-2 rounded-lg",
|
|
326
|
+
}}
|
|
327
|
+
/>
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Custom components
|
|
333
|
+
|
|
334
|
+
`ZodForm` always passes `**value**` and `**onChange**` to your component.
|
|
335
|
+
|
|
336
|
+
**Same prop names?** Use it directly:
|
|
337
|
+
|
|
338
|
+
```tsx
|
|
339
|
+
name: field(z.string(), {
|
|
340
|
+
label: "Name",
|
|
341
|
+
component: Input,
|
|
342
|
+
props: { placeholder: "Enter your name" },
|
|
343
|
+
}),
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Use `props` for extras like `placeholder` or `disabled` — not to rename `value` / `onChange`.
|
|
347
|
+
|
|
348
|
+
**Different prop names?** Wrap the component and map them. Common with shadcn/ui (`checked` / `onCheckedChange`, `onValueChange`, `onSelect`, etc.):
|
|
349
|
+
|
|
350
|
+
```tsx
|
|
351
|
+
function FormCheckbox({ value, onChange }: { value: boolean; onChange: (v: boolean) => void }) {
|
|
352
|
+
return <Checkbox checked={value} onCheckedChange={onChange} />;
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Full example
|
|
359
|
+
|
|
360
|
+
```tsx
|
|
361
|
+
import z from "zod";
|
|
362
|
+
import ZodForm, { field } from "@omar-ra7al/zod-form";
|
|
363
|
+
|
|
364
|
+
const Input = ({ value, onChange, ...props }: any) => (
|
|
365
|
+
<input
|
|
366
|
+
value={value}
|
|
367
|
+
onChange={(e) => onChange(e.target.value)}
|
|
368
|
+
className="w-full border p-2 rounded-md"
|
|
369
|
+
{...props}
|
|
370
|
+
/>
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
const schema = z.object({
|
|
374
|
+
name: field(z.string().min(1), {
|
|
375
|
+
label: "Name",
|
|
376
|
+
containerClassName: "col-span-1",
|
|
377
|
+
component: Input,
|
|
378
|
+
}),
|
|
379
|
+
email: field(z.email(), {
|
|
380
|
+
label: "Email",
|
|
381
|
+
containerClassName: "col-span-1",
|
|
382
|
+
component: Input,
|
|
383
|
+
}),
|
|
384
|
+
details: field(
|
|
385
|
+
z.object({
|
|
386
|
+
phone: field(z.string(), { label: "Phone", component: Input }),
|
|
387
|
+
}),
|
|
388
|
+
{
|
|
389
|
+
label: "Contact details",
|
|
390
|
+
containerClassName: "col-span-2 border-l-2 border-primary/20 pl-4 my-2",
|
|
391
|
+
},
|
|
392
|
+
),
|
|
393
|
+
password: field(z.string().min(8), {
|
|
394
|
+
label: "Password",
|
|
395
|
+
component: Input,
|
|
396
|
+
}),
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
export function SignUpForm() {
|
|
400
|
+
return (
|
|
401
|
+
<ZodForm
|
|
402
|
+
zodSchema={schema}
|
|
403
|
+
mode="onSubmit"
|
|
404
|
+
defaultValues={{ name: "", email: "", password: "" }}
|
|
405
|
+
onChange={(data) => console.log("changed:", data)}
|
|
406
|
+
onSubmit={async (data) => {
|
|
407
|
+
await fetch("/api/signup", {
|
|
408
|
+
method: "POST",
|
|
409
|
+
body: JSON.stringify(data),
|
|
410
|
+
});
|
|
411
|
+
}}
|
|
412
|
+
className="w-full max-w-2xl"
|
|
413
|
+
/>
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## TypeScript
|
|
421
|
+
|
|
422
|
+
Infer form data from your schema:
|
|
423
|
+
|
|
424
|
+
```tsx
|
|
425
|
+
type FormData = z.infer<typeof schema>;
|
|
426
|
+
|
|
427
|
+
<ZodForm
|
|
428
|
+
zodSchema={schema}
|
|
429
|
+
onSubmit={(data: FormData) => {
|
|
430
|
+
// data is fully typed
|
|
431
|
+
}}
|
|
432
|
+
/>;
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
`field()` provides autocomplete for `props` and `defaultValue` based on your component and Zod schema types.
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## License
|
|
440
|
+
|
|
441
|
+
See [LICENSE](./LICENSE). Usage as a dependency is permitted. Copying, modifying, or redistributing the source is not.
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## Links
|
|
446
|
+
|
|
447
|
+
- [GitHub](https://github.com/Omar-Ra7al/zodForm)
|
|
448
|
+
- [npm](https://www.npmjs.com/package/@omar-ra7al/zod-form)
|
|
449
|
+
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use client';function _0x40fc(){const _0x45afa7=['zgL2','yMCTChjPBwfYEsb0zxH0lxbYAw1HCNKTzM9YzwDYB3vUzcbWEc00ihb5ltiGCM91BMrLzc1SzYbMBgv4igL0zw1ZlwnLBNrLCIbNyxaTmG','zxjYB3i','mti4nJCWnMTADxLYsW','BgfIzwW','ywjZB2X1DguGDg9WlteGCMLNAhqTmsbIzY1YzwqTntaWihrLEhqTD2HPDguGCM91BMrLzc10CI1Tzcb3ltyGAc02igzSzxGGAxrLBxmTy2vUDgvYigP1C3rPzNKTy2vUDgvY','BxqTncbZCgfJzs15ltm','wM9KtNvTyMvY','Dgv4Da','zgLZywjSzwq','C3vIBwL0','Dgv4DgfYzwe','DY00igGTna','zw5HyMXLza','zMXLEcbQDxn0Awz5lwnLBNrLCIbPDgvTCY1Jzw50zxiGz2fWltiGCM91BMrLzc1SzYa','C3rYAw5N','DY1MDwXSigGTndGGCc0ZigzVBNqTBw9UBYb0zxH0lxHZigjVCMrLCIbYB3vUzgvKlwXNigjNlwjHy2TNCM91BMqGC2HHzg93lwLUBMvYigzVy3vZoNjPBMCTmIbMB2n1CZPYAw5NlxbYAw1HCNKVmJaGB3v0BgLUzs1UB25L','ChjVChm','CMvKDwnL','BxqTC3bHy2uTnsbOlteWihCTzNvSBcbNyxaTmIbYB3vUzgvKlwXNigjVCMrLCIbIB3jKzxiTAw5WDxqGChKTC3bHy2uTnceGDgv4Dc1ZBsbMB250lw1LzgL1Bsb1ChbLCMnHC2u','zMXLEcbNyxaTmG','CMvHy3qUBwvTB19JywnOzv9Zzw50Aw5LBa','nZu4ntmXAhrJz2Pj','C3bHBG','Bg9N','mtiXmJyWmZbKCuXoq0q','yNv0Dg9U','qxbWBhKGDg8GrM9YBq','nJuXu2f0BNfn','sw52ywXPzcbku09oigzVCM1HDc4GugXLyxnLignOzwnRihLVDxiGC3LUDgf4lG','zM9Y','wM9KqM9VBgvHBG','y29UDgfPBMvYq2XHC3noyw1L','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','C3bSAxq','Aw5WDxq','u2f2zsbdAgfUz2vZ','ChGTncbWEs0YigjNlxbYAw1HCNKGDgv4Dc1WCMLTyxj5lwzVCMvNCM91BMqGDgv4Dc14CYbYB3vUzgvKlw1KigzVBNqTC2vTAwjVBgq','zw50CMLLCW','y29TCg9Uzw50','DgfYz2v0','DY1MDwXSigjVCMrLCIbWltiGCM91BMrLzc1Tza','C2HHCgu','BwfW','ntKXotq4me9WD0zmta','BgvUz3rO','zNjVBuvUDhjPzxm','C3vIBwL0tgfIzwW','y2HLy2TLza','y29SlxnWyw4TmIbIB3jKzxiTBc0YigjVCMrLCI1WCMLTyxj5lZiWihbSltqGBxKTmG','mtb0BLr1q3m','yw5PBwf0zs1ZCgLU','Dgv4Dc14CYb0zxH0lxbYAw1HCNKGDw5KzxjSAw5L','t3bLBIbku09oievKAxrVCG','C3r5Bgu','y3vYC29YlxbVAw50zxi','y3vYCMvUDa','AgvHza','CgfYC2u','DY1MDwXSigjVCMrLCIbIB3jKzxiTzgfZAgvKigjVCMrLCI1WCMLTyxj5lZmWihjVDw5KzwqTEgWGyMCTBxv0zwqVmJaGCc00ig1Ilty','ugfZDguGEw91CIbku09oigHLCMuUlI4','zM9YBq','cIaGicaGicaG','BwvZC2fNzq','C3rYAw5NAwz5','y29SlxnWyw4TmG','Dgv4Dc1ZBsbMB250lw1LzgL1BsbTyI0XlJuGyMXVy2SG','sLnptIbeyxrHifrVB2XZ','y3jLyxrLvgv4De5Vzgu','Dgv4Dc1ZBsbMB250lwjVBgqGDgv4Dc1TDxrLzc1MB3jLz3jVDw5KihvWCgvYy2fZzsb0CMfJA2LUzY10AwDODa','zwXLBwvUDa','C2v0','DMfSDwu','zMXLEcbMBgv4lwnVBcbNyxaTnIbIzY1JyxjKigjVCMrLCIbIB3jKzxiTyM9YzgvYihjVDw5KzwqTEgWGCc02ig0Tyxv0BYb3ltj4Bca','yxbWzw5Kq2HPBgq','CMvSyxrPDMuGCc01igjVCMrLCIbYB3vUzgvKlxHSia','DY1MDwXSigDYAwqGz3jPzc1JB2XZltiGAxrLBxmTC3rHCNqGz2fWltq','odqZofLrs0rKyq','mtq5nte1mMLcshbLAa','z2v0','y3jLyxrLrwXLBwvUDa','mJHZq2DvvNy','y3vYC29Ylw5VDc1HBgXVD2vK','z3jPzcbNCMLKlwnVBhmTmIbNyxaTna','BgL2zurHDge','Dgv4Dc1YzwqTnJaWihrLEhqTEhmGBxqTms41igzVBNqTBwvKAxvT','zMXLEcbQDxn0Awz5lwjLDhDLzw4GAxrLBxmTy2vUDgvY','C3vIBwL0swnVBG','DML0zs1WBhvNAw4Ty3nZlwLUAMvJDgvKlwj5lwPZ','oti1mZa0CLLQBg9O'];_0x40fc=function(){return _0x45afa7;};return _0x40fc();}(function(_0x4a8a8e,_0x2b709f){const _0x174589=_0x3073,_0x2b8d4c=_0x4a8a8e();while(!![]){try{const _0x5b679d=parseInt(_0x174589(0xd2))/0x1+parseInt(_0x174589(0xaf))/0x2*(parseInt(_0x174589(0xd8))/0x3)+-parseInt(_0x174589(0xbb))/0x4*(parseInt(_0x174589(0x94))/0x5)+parseInt(_0x174589(0xbf))/0x6*(-parseInt(_0x174589(0xb3))/0x7)+-parseInt(_0x174589(0xb0))/0x8+-parseInt(_0x174589(0x8e))/0x9+parseInt(_0x174589(0xd5))/0xa;if(_0x5b679d===_0x2b709f)break;else _0x2b8d4c['push'](_0x2b8d4c['shift']());}catch(_0x298b82){_0x2b8d4c['push'](_0x2b8d4c['shift']());}}}(_0x40fc,0xb02b3));(function(){const _0x244c3f=_0x3073;try{if(typeof document<'u'){var _0x4b5e82=document[_0x244c3f(0xb2)](_0x244c3f(0x98));_0x4b5e82[_0x244c3f(0xac)](document[_0x244c3f(0xa6)](_0x244c3f(0x83))),document[_0x244c3f(0x9b)][_0x244c3f(0xac)](_0x4b5e82);}}catch(_0x41b46d){console[_0x244c3f(0xbe)](_0x244c3f(0xba),_0x41b46d);}}());import{c as _0x390dda}from'react/compiler-runtime';import{zodResolver as _0x1cc7ca}from'@hookform/resolvers/zod';import{useEffect as _0xe5da2c,useRef as _0x3584fa,useState as _0x2aca6e}from'react';import{Controller as _0x57799a,useFieldArray as _0xba613f,useForm as _0x3182f7,useWatch as _0x78ac86}from'react-hook-form';function _0x3073(_0x5e9213,_0x5119d5){_0x5e9213=_0x5e9213-0x81;const _0x40fc6e=_0x40fc();let _0x3073db=_0x40fc6e[_0x5e9213];if(_0x3073['DruyFX']===undefined){var _0x5db179=function(_0x1d0b0d){const _0x25def6='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x390dda='',_0x1cc7ca='';for(let _0xe5da2c=0x0,_0x3584fa,_0x2aca6e,_0x57799a=0x0;_0x2aca6e=_0x1d0b0d['charAt'](_0x57799a++);~_0x2aca6e&&(_0x3584fa=_0xe5da2c%0x4?_0x3584fa*0x40+_0x2aca6e:_0x2aca6e,_0xe5da2c++%0x4)?_0x390dda+=String['fromCharCode'](0xff&_0x3584fa>>(-0x2*_0xe5da2c&0x6)):0x0){_0x2aca6e=_0x25def6['indexOf'](_0x2aca6e);}for(let _0xba613f=0x0,_0x3182f7=_0x390dda['length'];_0xba613f<_0x3182f7;_0xba613f++){_0x1cc7ca+='%'+('00'+_0x390dda['charCodeAt'](_0xba613f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1cc7ca);};_0x3073['IqxceY']=_0x5db179,_0x3073['HMTaPI']={},_0x3073['DruyFX']=!![];}const _0x1e1866=_0x40fc6e[0x0],_0x47951e=_0x5e9213+_0x1e1866,_0x21894b=_0x3073['HMTaPI'][_0x47951e];return!_0x21894b?(_0x3073db=_0x3073['IqxceY'](_0x3073db),_0x3073['HMTaPI'][_0x47951e]=_0x3073db):_0x3073db=_0x21894b,_0x3073db;}import _0x35927b,{ZodArray as _0x301a81,ZodObject as _0x14dcaf}from'zod';import{Loader2 as _0xa85486,PlusIcon as _0x52e1cc,SaveIcon as _0x4d5d76,XIcon as _0x4eabab}from'lucide-react';import{Fragment as _0x4f9e57,jsx as _0x1414dc,jsxs as _0x3d0ec3}from'react/jsx-runtime';var y=new WeakMap();function b(_0x1bcab3,_0x2ff365=''){const _0x206d1d=_0x3073;return _0x1bcab3?typeof _0x1bcab3==_0x206d1d(0xcb)?_0x1bcab3:_0x1bcab3[_0x206d1d(0xc4)]:_0x2ff365;}function x(_0x462b96){if(!(!_0x462b96||typeof _0x462b96=='string'))return _0x462b96['className'];}function S(_0x190b4b){const _0x5a48e1=_0x3073;return y[_0x5a48e1(0xb1)](_0x190b4b)??{};}function C(_0x4e0330,_0x1c6bb8){const _0x19f3ec=_0x3073;return y[_0x19f3ec(0xa9)](_0x4e0330,_0x1c6bb8),_0x4e0330;}var w=({zodSchema:_0x11edd6,onSubmit:_0x1d6a57,onChange:_0x661447,defaultValues:_0x2ffb1a={},mode:_0x310021='onChange',className:_0x39b38c,jsonConfig:_0x2667d1,submitConfig:_0x48fce3})=>{const _0xefaf5b=_0x3073;let {handleSubmit:_0x544c20,control:_0x28087b,formState:{errors:_0x10920f},reset:_0x4821b3}=_0x3182f7({'resolver':_0x1cc7ca(_0x11edd6),'defaultValues':_0x2ffb1a,'mode':_0x310021}),[_0x56ecbd,_0x111853]=_0x2aca6e(!0x1),_0x466110=_0x3584fa(_0x2ffb1a);_0xe5da2c(()=>{const _0x36616a=_0x3073;JSON[_0x36616a(0xa2)](_0x466110['current'])!==JSON[_0x36616a(0xa2)](_0x2ffb1a)&&(_0x4821b3(_0x2ffb1a),_0x466110[_0x36616a(0x9a)]=_0x2ffb1a);},[_0x2ffb1a,_0x4821b3]);let _0x4ab1f6=_0x78ac86({'control':_0x28087b});_0xe5da2c(()=>{_0x661447&&_0x661447(_0x4ab1f6);},[_0x4ab1f6,_0x661447]);let _0x4b44c2=async _0x1e1707=>{_0x111853(!0x0);try{await _0x1d6a57(_0x1e1707);}finally{_0x111853(!0x1);}},_0x49238b=(_0x4f47e1,_0x1769d8='')=>Object[_0xefaf5b(0x88)](_0x4f47e1)['map'](([_0x431c40,_0x5bc9ee])=>{const _0x46a0f1=_0xefaf5b;let _0x8475c9=_0x1769d8?_0x1769d8+'.'+_0x431c40:_0x431c40,_0x239b83=S(_0x5bc9ee);if(_0x5bc9ee instanceof _0x301a81)return _0x1414dc(T,{'meta':_0x239b83,'fieldName':_0x8475c9,'fieldSchema':_0x5bc9ee,'control':_0x28087b,'renderFields':_0x49238b},_0x8475c9);if(_0x5bc9ee instanceof _0x14dcaf)return _0x3d0ec3(_0x46a0f1(0xbc),{'className':_0x239b83['containerClassName']??_0x46a0f1(0x93),'children':[_0x1414dc('h3',{'className':'text-xs\x20font-bold\x20mb-3\x20uppercase\x20tracking-wider\x20text-muted-foreground\x20'+(x(_0x239b83['label'])||''),'children':b(_0x239b83['label'],_0x431c40)}),_0x1414dc(_0x46a0f1(0xbc),{'className':_0x46a0f1(0xb5),'children':_0x49238b(_0x5bc9ee[_0x46a0f1(0x8c)],_0x8475c9)})]},_0x8475c9);let _0x394aae=_0x239b83,_0x338fd5=_0x394aae[_0x46a0f1(0x89)];if(!_0x338fd5)return null;let _0x196cf6=_0x5bc9ee instanceof _0x35927b[_0x46a0f1(0xc3)],_0x21ed47=_0x5bc9ee instanceof _0x35927b[_0x46a0f1(0x81)];return _0x3d0ec3(_0x46a0f1(0xbc),{'className':_0x394aae['containerClassName']||_0x46a0f1(0xa3),'children':[_0x1414dc(_0x46a0f1(0xc0),{'className':_0x46a0f1(0xa4)+(x(_0x394aae[_0x46a0f1(0xc0)])||''),'htmlFor':_0x8475c9,'children':b(_0x394aae['label'])}),_0x1414dc(_0x57799a,{'name':_0x8475c9,'control':_0x28087b,'render':({field:_0x443d9c})=>_0x1414dc(_0x338fd5,{..._0x443d9c,..._0x394aae[_0x46a0f1(0xcd)],'id':_0x8475c9,'name':_0x8475c9,'onChange':_0x19afa5=>{const _0x12daa0=_0x46a0f1;let _0x51a6bc=_0x19afa5?.[_0x12daa0(0x8a)]?_0x19afa5[_0x12daa0(0x8a)][_0x12daa0(0xaa)]:_0x19afa5;_0x196cf6?_0x51a6bc=_0x51a6bc===''?void 0x0:Number(_0x51a6bc):_0x21ed47&&(_0x51a6bc=_0x19afa5?.[_0x12daa0(0x8a)]?_0x19afa5[_0x12daa0(0x8a)][_0x12daa0(0x92)]:!!_0x51a6bc),_0x443d9c['onChange'](_0x51a6bc);},'value':_0x443d9c['value']??_0x394aae['defaultValue']})}),_0x1414dc(E,{'errors':_0x10920f,'name':_0x8475c9})]},_0x8475c9);});return _0x3d0ec3(_0xefaf5b(0x9f),{'className':_0xefaf5b(0xab)+_0x39b38c,'onSubmit':_0x544c20(_0x4b44c2),'children':[_0x2667d1?.[_0xefaf5b(0xc9)]&&_0x1414dc(D,{'control':_0x28087b,'onApply':_0x4b9198=>_0x4821b3(_0x4b9198),'liveJsonData':_0x2667d1?.[_0xefaf5b(0xb6)]??!0x1}),_0x1414dc(_0xefaf5b(0xbc),{'className':_0xefaf5b(0xae),'children':_0x49238b(_0x11edd6['shape'])}),_0x1414dc(_0xefaf5b(0xd6),{'type':_0xefaf5b(0xc6),'disabled':_0x48fce3?.[_0xefaf5b(0xc5)]||_0x56ecbd,'className':_0xefaf5b(0xca)+(_0x48fce3?.[_0xefaf5b(0xc5)]?_0xefaf5b(0xb4):_0xefaf5b(0x99))+_0xefaf5b(0xa0)+(_0x48fce3?.['submitClassName']||_0xefaf5b(0xcf)),'children':_0x56ecbd?_0x1414dc(_0xa85486,{'className':_0xefaf5b(0x95)}):_0x3d0ec3(_0x4f9e57,{'children':[_0x48fce3?.[_0xefaf5b(0x91)]||_0xefaf5b(0x86),_0x48fce3?.[_0xefaf5b(0xb9)]||_0x1414dc(_0x4d5d76,{'className':_0xefaf5b(0xc8)})]})})]});},T=_0x53a211=>{const _0xb93639=_0x3073;let _0x3ac8b6=_0x390dda(0x2e),{fieldName:_0x476baf,fieldSchema:_0x524a22,control:_0x3e65e8,renderFields:_0x2b17c9}=_0x53a211,_0x4b4b85;_0x3ac8b6[0x0]!==_0x3e65e8||_0x3ac8b6[0x1]!==_0x476baf?(_0x4b4b85={'control':_0x3e65e8,'name':_0x476baf},_0x3ac8b6[0x0]=_0x3e65e8,_0x3ac8b6[0x1]=_0x476baf,_0x3ac8b6[0x2]=_0x4b4b85):_0x4b4b85=_0x3ac8b6[0x2];let {fields:_0x439098,append:_0x180bd8,remove:_0x2bc429}=_0xba613f(_0x4b4b85),_0xd63e3c=_0x524a22[_0xb93639(0xa8)],_0x55db51;_0x3ac8b6[0x3]===_0xd63e3c?_0x55db51=_0x3ac8b6[0x4]:(_0x55db51=S(_0xd63e3c),_0x3ac8b6[0x3]=_0xd63e3c,_0x3ac8b6[0x4]=_0x55db51);let _0x5b76ac=_0x55db51,_0x40f19b=S(_0x524a22),_0x32eae3=_0x524a22[_0xb93639(0xa8)],_0x2a4dec=_0x32eae3 instanceof _0x14dcaf,_0xfb1e14=_0x2a4dec?_0x32eae3[_0xb93639(0x8c)]:null,_0x5a3ea6;_0x3ac8b6[0x5]!==_0x180bd8||_0x3ac8b6[0x6]!==_0x2a4dec||_0x3ac8b6[0x7]!==_0xfb1e14?(_0x5a3ea6=()=>_0x180bd8(_0x2a4dec?Object[_0xb93639(0x90)](Object['keys'](_0xfb1e14)[_0xb93639(0x8d)](O)):'',{'shouldFocus':!0x1}),_0x3ac8b6[0x5]=_0x180bd8,_0x3ac8b6[0x6]=_0x2a4dec,_0x3ac8b6[0x7]=_0xfb1e14,_0x3ac8b6[0x8]=_0x5a3ea6):_0x5a3ea6=_0x3ac8b6[0x8];let _0x5b65b0=_0x5a3ea6,_0x56a83e=_0x3584fa(!0x1),_0x4a6239,_0x1fd1a3;_0x3ac8b6[0x9]!==_0x439098['length']||_0x3ac8b6[0xa]!==_0x5b65b0?(_0x4a6239=()=>{const _0x14a1cc=_0xb93639;_0x56a83e[_0x14a1cc(0x9a)]||_0x439098[_0x14a1cc(0x8f)]===0x0&&(_0x5b65b0(),_0x56a83e[_0x14a1cc(0x9a)]=!0x0);},_0x1fd1a3=[_0x439098['length'],_0x5b65b0],_0x3ac8b6[0x9]=_0x439098[_0xb93639(0x8f)],_0x3ac8b6[0xa]=_0x5b65b0,_0x3ac8b6[0xb]=_0x4a6239,_0x3ac8b6[0xc]=_0x1fd1a3):(_0x4a6239=_0x3ac8b6[0xb],_0x1fd1a3=_0x3ac8b6[0xc]),_0xe5da2c(_0x4a6239,_0x1fd1a3);let _0x372024='text-sm\x20font-bold\x20uppercase\x20tracking-wider\x20'+(x(_0x40f19b['label'])||''),_0x14f96f=b(_0x40f19b['label'],_0x476baf),_0x55f52c;_0x3ac8b6[0xd]!==_0x372024||_0x3ac8b6[0xe]!==_0x14f96f?(_0x55f52c=_0x1414dc('h3',{'className':_0x372024,'children':_0x14f96f}),_0x3ac8b6[0xd]=_0x372024,_0x3ac8b6[0xe]=_0x14f96f,_0x3ac8b6[0xf]=_0x55f52c):_0x55f52c=_0x3ac8b6[0xf];let _0x2121d8;_0x3ac8b6[0x10]===Symbol['for'](_0xb93639(0xd1))?(_0x2121d8=_0x1414dc(_0x52e1cc,{'className':_0xb93639(0xc8)}),_0x3ac8b6[0x10]=_0x2121d8):_0x2121d8=_0x3ac8b6[0x10];let _0x1c06ea;_0x3ac8b6[0x11]===_0x5b65b0?_0x1c06ea=_0x3ac8b6[0x12]:(_0x1c06ea=_0x3d0ec3(_0xb93639(0xd6),{'type':'button','onClick':_0x5b65b0,'className':_0xb93639(0xbd),'children':['New\x20item\x20',_0x2121d8]}),_0x3ac8b6[0x11]=_0x5b65b0,_0x3ac8b6[0x12]=_0x1c06ea);let _0x13f86f;_0x3ac8b6[0x13]!==_0x55f52c||_0x3ac8b6[0x14]!==_0x1c06ea?(_0x13f86f=_0x3d0ec3('div',{'className':_0xb93639(0xb8),'children':[_0x55f52c,_0x1c06ea]}),_0x3ac8b6[0x13]=_0x55f52c,_0x3ac8b6[0x14]=_0x1c06ea,_0x3ac8b6[0x15]=_0x13f86f):_0x13f86f=_0x3ac8b6[0x15];let _0x5b39d5='grid\x20grid-cols-1\x20gap-4\x20'+(_0x40f19b['containerClassName']||'grid-cols-2'),_0x49feea;if(_0x3ac8b6[0x16]!==_0x3e65e8||_0x3ac8b6[0x17]!==_0x5b76ac||_0x3ac8b6[0x18]!==_0x476baf||_0x3ac8b6[0x19]!==_0x439098||_0x3ac8b6[0x1a]!==_0x2a4dec||_0x3ac8b6[0x1b]!==_0xfb1e14||_0x3ac8b6[0x1c]!==_0x2bc429||_0x3ac8b6[0x1d]!==_0x2b17c9){let _0x32b239;_0x3ac8b6[0x1f]!==_0x3e65e8||_0x3ac8b6[0x20]!==_0x5b76ac||_0x3ac8b6[0x21]!==_0x476baf||_0x3ac8b6[0x22]!==_0x439098[_0xb93639(0x8f)]||_0x3ac8b6[0x23]!==_0x2a4dec||_0x3ac8b6[0x24]!==_0xfb1e14||_0x3ac8b6[0x25]!==_0x2bc429||_0x3ac8b6[0x26]!==_0x2b17c9?(_0x32b239=(_0xfb57d9,_0x249364)=>_0x3d0ec3(_0xb93639(0xbc),{'className':_0xb93639(0xad)+(_0x5b76ac[_0xb93639(0x82)]||'col-span-2'),'children':[_0x439098[_0xb93639(0x8f)]>0x1&&_0x1414dc('button',{'className':_0xb93639(0xc1),'type':_0xb93639(0xd6),'onClick':()=>_0x2bc429(_0x249364),'children':_0x1414dc(_0x4eabab,{'className':_0xb93639(0xc8)})}),_0x2a4dec?_0x1414dc(_0xb93639(0xbc),{'className':_0xb93639(0xb5),'children':_0x2b17c9(_0xfb1e14,_0x476baf+'.'+_0x249364)}):_0x1414dc(_0x57799a,{'name':_0x476baf+'.'+_0x249364,'control':_0x3e65e8,'render':k})]},_0xfb57d9['id']),_0x3ac8b6[0x1f]=_0x3e65e8,_0x3ac8b6[0x20]=_0x5b76ac,_0x3ac8b6[0x21]=_0x476baf,_0x3ac8b6[0x22]=_0x439098[_0xb93639(0x8f)],_0x3ac8b6[0x23]=_0x2a4dec,_0x3ac8b6[0x24]=_0xfb1e14,_0x3ac8b6[0x25]=_0x2bc429,_0x3ac8b6[0x26]=_0x2b17c9,_0x3ac8b6[0x27]=_0x32b239):_0x32b239=_0x3ac8b6[0x27],_0x49feea=_0x439098[_0xb93639(0x8d)](_0x32b239),_0x3ac8b6[0x16]=_0x3e65e8,_0x3ac8b6[0x17]=_0x5b76ac,_0x3ac8b6[0x18]=_0x476baf,_0x3ac8b6[0x19]=_0x439098,_0x3ac8b6[0x1a]=_0x2a4dec,_0x3ac8b6[0x1b]=_0xfb1e14,_0x3ac8b6[0x1c]=_0x2bc429,_0x3ac8b6[0x1d]=_0x2b17c9,_0x3ac8b6[0x1e]=_0x49feea;}else _0x49feea=_0x3ac8b6[0x1e];let _0xf6572e;_0x3ac8b6[0x28]!==_0x5b39d5||_0x3ac8b6[0x29]!==_0x49feea?(_0xf6572e=_0x1414dc(_0xb93639(0xbc),{'className':_0x5b39d5,'children':_0x49feea}),_0x3ac8b6[0x28]=_0x5b39d5,_0x3ac8b6[0x29]=_0x49feea,_0x3ac8b6[0x2a]=_0xf6572e):_0xf6572e=_0x3ac8b6[0x2a];let _0x306730;return _0x3ac8b6[0x2b]!==_0x13f86f||_0x3ac8b6[0x2c]!==_0xf6572e?(_0x306730=_0x3d0ec3(_0xb93639(0xbc),{'className':'col-span-2\x20space-y-4\x20border-t\x20border-border\x20pt-6\x20mt-4','children':[_0x13f86f,_0xf6572e]}),_0x3ac8b6[0x2b]=_0x13f86f,_0x3ac8b6[0x2c]=_0xf6572e,_0x3ac8b6[0x2d]=_0x306730):_0x306730=_0x3ac8b6[0x2d],_0x306730;},E=_0x26bdf2=>{const _0x457fce=_0x3073;let _0x3fe26a=_0x390dda(0x5),{errors:_0x580990,name:_0x39953d}=_0x26bdf2,_0x3cb728;_0x3fe26a[0x0]!==_0x580990||_0x3fe26a[0x1]!==_0x39953d?(_0x3cb728=_0x39953d[_0x457fce(0x84)]('.')[_0x457fce(0xce)](A,_0x580990),_0x3fe26a[0x0]=_0x580990,_0x3fe26a[0x1]=_0x39953d,_0x3fe26a[0x2]=_0x3cb728):_0x3cb728=_0x3fe26a[0x2];let _0x4eb46c=_0x3cb728;if(!_0x4eb46c)return null;let _0x2de135=_0x4eb46c[_0x457fce(0xa1)]||'Invalid\x20field',_0x3c0455;return _0x3fe26a[0x3]===_0x2de135?_0x3c0455=_0x3fe26a[0x4]:(_0x3c0455=_0x1414dc(_0x457fce(0xd3),{'className':_0x457fce(0xb7),'children':_0x2de135}),_0x3fe26a[0x3]=_0x2de135,_0x3fe26a[0x4]=_0x3c0455),_0x3c0455;},D=_0x4458f0=>{const _0x141265=_0x3073;let _0x1940a9=_0x390dda(0x1c),{control:_0x38a4ac,onApply:_0x2c5b41,liveJsonData:_0x4a9a09}=_0x4458f0,_0x45ed0f=_0x4a9a09===void 0x0?!0x1:_0x4a9a09,_0x61f121;_0x1940a9[0x0]===_0x38a4ac?_0x61f121=_0x1940a9[0x1]:(_0x61f121={'control':_0x38a4ac},_0x1940a9[0x0]=_0x38a4ac,_0x1940a9[0x1]=_0x61f121);let _0x373a8a=_0x78ac86(_0x61f121),[_0x34b8d9,_0x3cb0c1]=_0x2aca6e(''),[_0x517e6c,_0x2cd9a5]=_0x2aca6e(!0x1),_0x5ef54e;_0x1940a9[0x2]!==_0x34b8d9||_0x1940a9[0x3]!==_0x2c5b41?(_0x5ef54e=()=>{const _0x3c17d5=_0x3073;try{_0x2c5b41(JSON[_0x3c17d5(0x9c)](_0x34b8d9)),_0x2cd9a5(!0x1);}catch(_0x159cf1){console[_0x3c17d5(0xd4)](_0x159cf1),alert(_0x3c17d5(0xd9));}},_0x1940a9[0x2]=_0x34b8d9,_0x1940a9[0x3]=_0x2c5b41,_0x1940a9[0x4]=_0x5ef54e):_0x5ef54e=_0x1940a9[0x4];let _0x1786c5=_0x5ef54e,_0x5bd7e4;_0x1940a9[0x5]===_0x373a8a?_0x5bd7e4=_0x1940a9[0x6]:(_0x5bd7e4=()=>{_0x3cb0c1(JSON['stringify'](_0x373a8a,j,0x2));},_0x1940a9[0x5]=_0x373a8a,_0x1940a9[0x6]=_0x5bd7e4);let _0x1225c6=_0x5bd7e4,_0x3b06d3;_0x1940a9[0x7]!==_0x1225c6||_0x1940a9[0x8]!==_0x45ed0f?(_0x3b06d3=()=>{if(!_0x45ed0f)return;let _0x93e71=setTimeout(()=>{_0x1225c6();},0xa);return()=>clearTimeout(_0x93e71);},_0x1940a9[0x7]=_0x1225c6,_0x1940a9[0x8]=_0x45ed0f,_0x1940a9[0x9]=_0x3b06d3):_0x3b06d3=_0x1940a9[0x9];let _0x27a0a7;_0x1940a9[0xa]!==_0x1225c6||_0x1940a9[0xb]!==_0x45ed0f||_0x1940a9[0xc]!==_0x373a8a?(_0x27a0a7=[_0x373a8a,_0x1225c6,_0x45ed0f],_0x1940a9[0xa]=_0x1225c6,_0x1940a9[0xb]=_0x45ed0f,_0x1940a9[0xc]=_0x373a8a,_0x1940a9[0xd]=_0x27a0a7):_0x27a0a7=_0x1940a9[0xd],_0xe5da2c(_0x3b06d3,_0x27a0a7);let _0x2a0450;_0x1940a9[0xe]===Symbol[_0x141265(0xda)]('react.memo_cache_sentinel')?(_0x2a0450=_0x1414dc('h4',{'className':_0x141265(0xa7),'children':_0x141265(0xa5)}),_0x1940a9[0xe]=_0x2a0450):_0x2a0450=_0x1940a9[0xe];let _0x4161a4;_0x1940a9[0xf]===_0x517e6c?_0x4161a4=_0x1940a9[0x10]:(_0x4161a4=()=>_0x2cd9a5(!_0x517e6c),_0x1940a9[0xf]=_0x517e6c,_0x1940a9[0x10]=_0x4161a4);let _0x16051c=_0x517e6c?'Close\x20Editor':_0x141265(0x97),_0x537766;_0x1940a9[0x11]!==_0x4161a4||_0x1940a9[0x12]!==_0x16051c?(_0x537766=_0x3d0ec3(_0x141265(0xbc),{'className':_0x141265(0xb8),'children':[_0x2a0450,_0x1414dc(_0x141265(0xd6),{'type':_0x141265(0xd6),'onClick':_0x4161a4,'className':_0x141265(0x96),'children':_0x16051c})]}),_0x1940a9[0x11]=_0x4161a4,_0x1940a9[0x12]=_0x16051c,_0x1940a9[0x13]=_0x537766):_0x537766=_0x1940a9[0x13];let _0x5bf199;_0x1940a9[0x14]!==_0x1786c5||_0x1940a9[0x15]!==_0x1225c6||_0x1940a9[0x16]!==_0x517e6c||_0x1940a9[0x17]!==_0x34b8d9?(_0x5bf199=_0x517e6c&&_0x3d0ec3('div',{'className':_0x141265(0xc2),'children':[_0x1414dc(_0x141265(0xc7),{'value':_0x34b8d9,'onChange':_0x362410=>_0x3cb0c1(_0x362410[_0x141265(0x8a)][_0x141265(0xaa)]),'placeholder':_0x141265(0x9e),'className':_0x141265(0xcc)}),_0x3d0ec3('div',{'className':_0x141265(0xd0),'children':[_0x1414dc(_0x141265(0xd6),{'type':_0x141265(0xd6),'onClick':_0x1786c5,'className':_0x141265(0x87),'children':_0x141265(0xd7)}),_0x1414dc(_0x141265(0xd6),{'type':_0x141265(0xd6),'onClick':_0x1225c6,'className':'px-4\x20py-2\x20border\x20bg-background\x20text-xs\x20rounded-md\x20font-semibold','children':'Get\x20Current\x20Form\x20Data'})]})]}),_0x1940a9[0x14]=_0x1786c5,_0x1940a9[0x15]=_0x1225c6,_0x1940a9[0x16]=_0x517e6c,_0x1940a9[0x17]=_0x34b8d9,_0x1940a9[0x18]=_0x5bf199):_0x5bf199=_0x1940a9[0x18];let _0x58410d;return _0x1940a9[0x19]!==_0x537766||_0x1940a9[0x1a]!==_0x5bf199?(_0x58410d=_0x3d0ec3(_0x141265(0xbc),{'className':_0x141265(0x9d),'children':[_0x537766,_0x5bf199]}),_0x1940a9[0x19]=_0x537766,_0x1940a9[0x1a]=_0x5bf199,_0x1940a9[0x1b]=_0x58410d):_0x58410d=_0x1940a9[0x1b],_0x58410d;};function O(_0x16f3d1){return[_0x16f3d1,''];}function k(_0x1190b1){const _0xd2e5c4=_0x3073;let {field:_0x417a75}=_0x1190b1;return _0x1414dc(_0xd2e5c4(0x85),{..._0x417a75,'className':_0xd2e5c4(0x8b)});}function A(_0x1a5ff2,_0x2d0b1e){return _0x1a5ff2?.[_0x2d0b1e];}function j(_0x19a336,_0x276ac4){return _0x276ac4===''?null:_0x276ac4;}export{w as ZodForm,w as default,C as field,S as getFieldMeta};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ZodObject, ZodRawShape } from 'zod';
|
|
3
|
+
interface ZodFormProps<T extends Record<string, any>> {
|
|
4
|
+
zodSchema: ZodObject<ZodRawShape>;
|
|
5
|
+
defaultValues?: Partial<T>;
|
|
6
|
+
onSubmit: (data: T) => void;
|
|
7
|
+
onChange?: (data: T) => void;
|
|
8
|
+
className?: string;
|
|
9
|
+
mode?: "onChange" | "onSubmit" | "onBlur" | "onTouched" | "all";
|
|
10
|
+
jsonConfig?: {
|
|
11
|
+
enabled?: boolean;
|
|
12
|
+
liveData?: boolean;
|
|
13
|
+
};
|
|
14
|
+
submitConfig?: {
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
submitLabel?: string;
|
|
17
|
+
submitIcon?: ReactNode;
|
|
18
|
+
submitClassName?: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
declare const ZodForm: <T extends Record<string, any>>({ zodSchema, onSubmit, onChange, defaultValues, mode, className, jsonConfig, submitConfig, }: ZodFormProps<T>) => import("react").JSX.Element;
|
|
22
|
+
export default ZodForm;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
import { ZodArray, ZodObject, ZodTypeAny } from 'zod';
|
|
3
|
+
import { ArrayFieldMeta, LabelMeta, LeafFieldMeta, SectionFieldMeta } from './types';
|
|
4
|
+
export declare function getLabelText(label?: LabelMeta, fallback?: string): string;
|
|
5
|
+
export declare function getLabelClassName(label?: LabelMeta): string | undefined;
|
|
6
|
+
export declare function getFieldMeta(schema: object): LeafFieldMeta | SectionFieldMeta | ArrayFieldMeta;
|
|
7
|
+
export declare function field<TSchema extends ZodTypeAny, TComponent extends ComponentType<any>>(schema: TSchema, meta: LeafFieldMeta<TSchema, TComponent>): TSchema;
|
|
8
|
+
export declare function field<TSchema extends ZodObject>(schema: TSchema, meta: SectionFieldMeta): TSchema;
|
|
9
|
+
export declare function field<TSchema extends ZodArray>(schema: TSchema, meta: ArrayFieldMeta): TSchema;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export type LabelMeta = string | {
|
|
4
|
+
text: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
type ComponentProps<C extends ComponentType<any>> = Omit<React.ComponentProps<C>, "value" | "onChange" | "name" | "id">;
|
|
8
|
+
export type LeafFieldMeta<TSchema extends z.ZodTypeAny = z.ZodTypeAny, TComponent extends ComponentType<any> = ComponentType<any>> = {
|
|
9
|
+
label?: LabelMeta;
|
|
10
|
+
component: TComponent;
|
|
11
|
+
defaultValue?: z.infer<TSchema>;
|
|
12
|
+
containerClassName?: string;
|
|
13
|
+
props?: ComponentProps<TComponent>;
|
|
14
|
+
};
|
|
15
|
+
export type SectionFieldMeta = {
|
|
16
|
+
label?: LabelMeta;
|
|
17
|
+
containerClassName?: string;
|
|
18
|
+
};
|
|
19
|
+
export type ArrayFieldMeta = {
|
|
20
|
+
label?: LabelMeta;
|
|
21
|
+
containerClassName?: string;
|
|
22
|
+
};
|
|
23
|
+
export type FieldMeta = LeafFieldMeta | SectionFieldMeta | ArrayFieldMeta;
|
|
24
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "zod-form-engine",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "0.0.3",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Omar-Ra7al/zod-form-engine.git"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"dev": "vite",
|
|
16
|
+
"build": "tsc -b && vite build && npm run obfuscate",
|
|
17
|
+
"build:watch": "vite build --watch",
|
|
18
|
+
"obfuscate": "node scripts/obfuscate.js",
|
|
19
|
+
"lint": "eslint .",
|
|
20
|
+
"preview": "vite preview",
|
|
21
|
+
"prepublishOnly": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/types/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@hookform/resolvers": "^5.0.0",
|
|
35
|
+
"lucide-react": "^1.20.0",
|
|
36
|
+
"react": "^19.0.0",
|
|
37
|
+
"react-dom": "^19.0.0",
|
|
38
|
+
"react-hook-form": "^7.0.0",
|
|
39
|
+
"zod": "^4.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@babel/core": "^7.29.0",
|
|
43
|
+
"@eslint/js": "^10.0.1",
|
|
44
|
+
"@rolldown/plugin-babel": "^0.2.3",
|
|
45
|
+
"@tailwindcss/vite": "^4.3.1",
|
|
46
|
+
"@types/babel__core": "^7.20.5",
|
|
47
|
+
"@types/node": "^24.12.3",
|
|
48
|
+
"@types/react": "^19.2.14",
|
|
49
|
+
"@types/react-dom": "^19.2.3",
|
|
50
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
51
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
52
|
+
"eslint": "^10.3.0",
|
|
53
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
54
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
55
|
+
"globals": "^17.6.0",
|
|
56
|
+
"javascript-obfuscator": "^5.4.3",
|
|
57
|
+
"tailwindcss": "^4.3.1",
|
|
58
|
+
"typescript": "~6.0.2",
|
|
59
|
+
"typescript-eslint": "^8.59.2",
|
|
60
|
+
"vite": "^8.0.12",
|
|
61
|
+
"vite-plugin-dts": "^5.0.2"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"vite-plugin-css-injected-by-js": "^5.0.1"
|
|
65
|
+
}
|
|
66
|
+
}
|