json-render-nuxt-ui 0.0.2 → 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/dist/index.js CHANGED
@@ -1,7 +1,481 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
1
20
  // src/index.ts
2
- function helloWord() {
3
- return "Hello json-render!";
4
- }
5
- export {
6
- helloWord
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ nuxtUiComponentDefinitions: () => nuxtUiComponentDefinitions,
24
+ nuxtUiComponents: () => nuxtUiComponents,
25
+ registerNuxtUiGlobals: () => registerNuxtUiGlobals
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/components.ts
30
+ var import_vue = require("vue");
31
+ var import_vue2 = require("@json-render/vue");
32
+ var gapClass = {
33
+ none: "gap-0",
34
+ xs: "gap-1",
35
+ sm: "gap-2",
36
+ md: "gap-4",
37
+ lg: "gap-6",
38
+ xl: "gap-8"
39
+ };
40
+ var nuxtUiComponents = {
41
+ Stack: ({ props, children }) => {
42
+ const gap = gapClass[props.gap ?? "md"];
43
+ return (0, import_vue.h)("div", { class: `flex flex-col ${gap}` }, children);
44
+ },
45
+ Row: ({ props, children }) => {
46
+ const gap = gapClass[props.gap ?? "md"];
47
+ const alignMap = {
48
+ start: "items-start",
49
+ center: "items-center",
50
+ end: "items-end",
51
+ stretch: "items-stretch"
52
+ };
53
+ const justifyMap = {
54
+ start: "justify-start",
55
+ center: "justify-center",
56
+ end: "justify-end",
57
+ between: "justify-between",
58
+ around: "justify-around"
59
+ };
60
+ const classes = [
61
+ "flex flex-row",
62
+ gap,
63
+ alignMap[props.align ?? "center"],
64
+ justifyMap[props.justify ?? "start"],
65
+ props.wrap ? "flex-wrap" : ""
66
+ ].filter(Boolean).join(" ");
67
+ return (0, import_vue.h)("div", { class: classes }, children);
68
+ },
69
+ Divider: ({ props }) => {
70
+ if (props.label) {
71
+ return (0, import_vue.h)("div", { class: "flex items-center gap-3 my-2" }, [
72
+ (0, import_vue.h)("hr", { class: "flex-1 border-default" }),
73
+ (0, import_vue.h)("span", { class: "text-xs text-dimmed shrink-0" }, props.label),
74
+ (0, import_vue.h)("hr", { class: "flex-1 border-default" })
75
+ ]);
76
+ }
77
+ return (0, import_vue.h)("hr", { class: "border-default my-2" });
78
+ },
79
+ Text: ({ props }) => {
80
+ const sizeClass = {
81
+ xs: "text-xs",
82
+ sm: "text-sm",
83
+ md: "text-base",
84
+ lg: "text-lg"
85
+ };
86
+ const colorClass = {
87
+ default: "text-default",
88
+ muted: "text-muted",
89
+ dimmed: "text-dimmed"
90
+ };
91
+ const classes = [
92
+ sizeClass[props.size ?? "sm"],
93
+ colorClass[props.color ?? "default"]
94
+ ].join(" ");
95
+ return (0, import_vue.h)("p", { class: classes }, props.content);
96
+ },
97
+ Card: ({ props, children }) => {
98
+ const UCard = (0, import_vue.resolveComponent)("UCard");
99
+ const hasHeader = Boolean(props.title || props.description);
100
+ return (0, import_vue.h)(UCard, null, {
101
+ header: hasHeader ? () => (0, import_vue.h)("div", { class: "space-y-1" }, [
102
+ props.title ? (0, import_vue.h)("h3", { class: "text-base font-semibold" }, props.title) : null,
103
+ props.description ? (0, import_vue.h)("p", { class: "text-sm text-muted" }, props.description) : null
104
+ ]) : void 0,
105
+ default: () => (0, import_vue.h)("div", { class: "space-y-4" }, children)
106
+ });
107
+ },
108
+ Header: ({ props }) => {
109
+ const level = props.level ?? "h2";
110
+ const titleClassByLevel = {
111
+ h1: "text-3xl font-bold tracking-tight",
112
+ h2: "text-2xl font-semibold tracking-tight",
113
+ h3: "text-xl font-semibold",
114
+ h4: "text-lg font-semibold",
115
+ h5: "text-base font-semibold",
116
+ h6: "text-sm font-semibold uppercase tracking-wide"
117
+ };
118
+ return (0, import_vue.h)("header", { class: "space-y-1" }, [
119
+ (0, import_vue.h)(level, { class: titleClassByLevel[level] }, props.text),
120
+ props.description ? (0, import_vue.h)("p", { class: "text-sm text-muted" }, props.description) : null
121
+ ]);
122
+ },
123
+ Button: ({ props, on }) => {
124
+ const UButton = (0, import_vue.resolveComponent)("UButton");
125
+ const press = on("press");
126
+ return (0, import_vue.h)(UButton, {
127
+ label: props.label,
128
+ color: props.color,
129
+ variant: props.variant,
130
+ size: props.size,
131
+ icon: props.icon,
132
+ loading: props.loading,
133
+ disabled: props.disabled,
134
+ onClick: (event) => {
135
+ if (press.shouldPreventDefault) {
136
+ event.preventDefault();
137
+ }
138
+ press.emit();
139
+ }
140
+ });
141
+ },
142
+ Input: ({ props, bindings, emit }) => {
143
+ const UInput = (0, import_vue.resolveComponent)("UInput");
144
+ const [value, setValue] = (0, import_vue2.useBoundProp)(
145
+ props.value,
146
+ bindings?.value
147
+ );
148
+ return (0, import_vue.h)(UInput, {
149
+ modelValue: value ?? "",
150
+ type: props.type ?? "text",
151
+ placeholder: props.placeholder,
152
+ size: props.size,
153
+ disabled: props.disabled,
154
+ autofocus: props.autofocus,
155
+ "onUpdate:modelValue": (nextValue) => {
156
+ setValue(nextValue);
157
+ emit("change");
158
+ }
159
+ });
160
+ },
161
+ Select: ({ props, bindings, emit }) => {
162
+ const USelect = (0, import_vue.resolveComponent)("USelect");
163
+ const [value, setValue] = (0, import_vue2.useBoundProp)(props.value, bindings?.value);
164
+ return (0, import_vue.h)(USelect, {
165
+ modelValue: value ?? null,
166
+ items: props.items ?? [],
167
+ placeholder: props.placeholder,
168
+ size: props.size,
169
+ disabled: props.disabled,
170
+ "onUpdate:modelValue": (nextValue) => {
171
+ setValue(nextValue);
172
+ emit("change");
173
+ }
174
+ });
175
+ },
176
+ Checkbox: ({ props, bindings, emit }) => {
177
+ const UCheckbox = (0, import_vue.resolveComponent)("UCheckbox");
178
+ const [checked, setChecked] = (0, import_vue2.useBoundProp)(
179
+ props.checked,
180
+ bindings?.checked
181
+ );
182
+ return (0, import_vue.h)(UCheckbox, {
183
+ modelValue: checked ?? false,
184
+ label: props.label,
185
+ description: props.description ?? void 0,
186
+ disabled: props.disabled,
187
+ "onUpdate:modelValue": (nextValue) => {
188
+ setChecked(nextValue);
189
+ emit("change");
190
+ }
191
+ });
192
+ },
193
+ Textarea: ({ props, bindings, emit }) => {
194
+ const UTextarea = (0, import_vue.resolveComponent)("UTextarea");
195
+ const [value, setValue] = (0, import_vue2.useBoundProp)(
196
+ props.value,
197
+ bindings?.value
198
+ );
199
+ return (0, import_vue.h)(UTextarea, {
200
+ modelValue: value ?? "",
201
+ placeholder: props.placeholder,
202
+ rows: props.rows,
203
+ autoresize: props.autoresize,
204
+ maxrows: props.maxrows,
205
+ disabled: props.disabled,
206
+ "onUpdate:modelValue": (nextValue) => {
207
+ setValue(nextValue);
208
+ emit("change");
209
+ }
210
+ });
211
+ },
212
+ Switch: ({ props, bindings, emit }) => {
213
+ const USwitch = (0, import_vue.resolveComponent)("USwitch");
214
+ const [checked, setChecked] = (0, import_vue2.useBoundProp)(
215
+ props.checked,
216
+ bindings?.checked
217
+ );
218
+ return (0, import_vue.h)(USwitch, {
219
+ modelValue: checked ?? false,
220
+ label: props.label,
221
+ description: props.description ?? void 0,
222
+ disabled: props.disabled,
223
+ "onUpdate:modelValue": (nextValue) => {
224
+ setChecked(nextValue);
225
+ emit("change");
226
+ }
227
+ });
228
+ },
229
+ Dialog: ({ props, bindings, children, emit, on }) => {
230
+ const UModal = (0, import_vue.resolveComponent)("UModal");
231
+ const UButton = (0, import_vue.resolveComponent)("UButton");
232
+ const [open, setOpen] = (0, import_vue2.useBoundProp)(
233
+ props.open,
234
+ bindings?.open
235
+ );
236
+ const confirm = on("confirm");
237
+ const cancel = on("cancel");
238
+ const updateOpen = (nextOpen) => {
239
+ setOpen(nextOpen);
240
+ emit("openChange");
241
+ };
242
+ return (0, import_vue.h)(
243
+ UModal,
244
+ {
245
+ open: open ?? false,
246
+ title: props.title,
247
+ description: props.description ?? void 0,
248
+ "onUpdate:open": (nextOpen) => updateOpen(nextOpen)
249
+ },
250
+ {
251
+ default: () => children,
252
+ footer: () => (0, import_vue.h)("div", { class: "flex justify-end gap-2" }, [
253
+ (0, import_vue.h)(UButton, {
254
+ variant: "ghost",
255
+ label: props.cancelLabel ?? "Cancel",
256
+ onClick: (event) => {
257
+ if (cancel.shouldPreventDefault) {
258
+ event.preventDefault();
259
+ }
260
+ cancel.emit();
261
+ updateOpen(false);
262
+ }
263
+ }),
264
+ (0, import_vue.h)(UButton, {
265
+ color: props.confirmColor ?? "primary",
266
+ variant: props.confirmVariant ?? "solid",
267
+ label: props.confirmLabel ?? "Confirm",
268
+ onClick: (event) => {
269
+ if (confirm.shouldPreventDefault) {
270
+ event.preventDefault();
271
+ }
272
+ confirm.emit();
273
+ if (props.closeOnConfirm !== false) {
274
+ updateOpen(false);
275
+ }
276
+ }
277
+ })
278
+ ])
279
+ }
280
+ );
281
+ }
7
282
  };
283
+
284
+ // src/catalog.ts
285
+ var import_zod = require("zod");
286
+ var nuxtUiComponentDefinitions = {
287
+ Stack: {
288
+ props: import_zod.z.object({
289
+ gap: import_zod.z.enum(["none", "xs", "sm", "md", "lg", "xl"]).optional()
290
+ }),
291
+ slots: ["default"],
292
+ description: "Vertical flex container that spaces children evenly. Use as the top-level wrapper or to group elements with consistent vertical rhythm."
293
+ },
294
+ Row: {
295
+ props: import_zod.z.object({
296
+ gap: import_zod.z.enum(["none", "xs", "sm", "md", "lg", "xl"]).optional(),
297
+ align: import_zod.z.enum(["start", "center", "end", "stretch"]).optional(),
298
+ justify: import_zod.z.enum(["start", "center", "end", "between", "around"]).optional(),
299
+ wrap: import_zod.z.boolean().optional()
300
+ }),
301
+ slots: ["default"],
302
+ description: "Horizontal flex container for side-by-side layouts (e.g. input + button, icon row, grid cells)."
303
+ },
304
+ Divider: {
305
+ props: import_zod.z.object({
306
+ label: import_zod.z.string().optional()
307
+ }),
308
+ description: "Horizontal rule / visual separator between sections. Optional centered label."
309
+ },
310
+ Text: {
311
+ props: import_zod.z.object({
312
+ content: import_zod.z.string(),
313
+ size: import_zod.z.enum(["xs", "sm", "md", "lg"]).optional(),
314
+ color: import_zod.z.enum(["default", "muted", "dimmed"]).optional()
315
+ }),
316
+ description: "Plain text paragraph. Use for descriptions, instructions, or any body copy that is not a heading."
317
+ },
318
+ Card: {
319
+ props: import_zod.z.object({
320
+ title: import_zod.z.string().optional(),
321
+ description: import_zod.z.string().nullable().optional()
322
+ }),
323
+ slots: ["default"],
324
+ description: "Container card with optional title and description. Renders children in the card body with vertical spacing."
325
+ },
326
+ Header: {
327
+ props: import_zod.z.object({
328
+ text: import_zod.z.string(),
329
+ level: import_zod.z.enum(["h1", "h2", "h3", "h4", "h5", "h6"]).optional(),
330
+ description: import_zod.z.string().nullable().optional()
331
+ }),
332
+ description: "Section header text with configurable heading level and optional supporting description."
333
+ },
334
+ Button: {
335
+ props: import_zod.z.object({
336
+ label: import_zod.z.string(),
337
+ color: import_zod.z.enum([
338
+ "primary",
339
+ "secondary",
340
+ "success",
341
+ "info",
342
+ "warning",
343
+ "error",
344
+ "neutral"
345
+ ]).optional(),
346
+ variant: import_zod.z.enum(["solid", "outline", "soft", "subtle", "ghost", "link"]).optional(),
347
+ size: import_zod.z.enum(["xs", "sm", "md", "lg", "xl"]).optional(),
348
+ icon: import_zod.z.string().optional(),
349
+ loading: import_zod.z.boolean().optional(),
350
+ disabled: import_zod.z.boolean().optional()
351
+ }),
352
+ description: "Clickable button supporting Nuxt UI color/variant/size options. Emits press on click.",
353
+ events: ["press"]
354
+ },
355
+ Input: {
356
+ props: import_zod.z.object({
357
+ value: import_zod.z.string().nullable().optional(),
358
+ placeholder: import_zod.z.string().optional(),
359
+ type: import_zod.z.enum(["text", "email", "password", "search", "tel", "url", "number"]).optional(),
360
+ size: import_zod.z.enum(["xs", "sm", "md", "lg", "xl"]).optional(),
361
+ disabled: import_zod.z.boolean().optional(),
362
+ autofocus: import_zod.z.boolean().optional()
363
+ }),
364
+ description: "Text input field. Supports two-way binding via $bindState on value and emits change on input.",
365
+ events: ["change"]
366
+ },
367
+ Select: {
368
+ props: import_zod.z.object({
369
+ value: import_zod.z.union([import_zod.z.string(), import_zod.z.number(), import_zod.z.boolean()]).nullable().optional(),
370
+ items: import_zod.z.array(
371
+ import_zod.z.union([
372
+ import_zod.z.string(),
373
+ import_zod.z.object({
374
+ label: import_zod.z.string(),
375
+ value: import_zod.z.union([import_zod.z.string(), import_zod.z.number(), import_zod.z.boolean()]),
376
+ disabled: import_zod.z.boolean().optional()
377
+ })
378
+ ])
379
+ ).optional(),
380
+ placeholder: import_zod.z.string().optional(),
381
+ size: import_zod.z.enum(["xs", "sm", "md", "lg", "xl"]).optional(),
382
+ disabled: import_zod.z.boolean().optional()
383
+ }),
384
+ description: "Select input with item list and optional two-way binding via $bindState on value.",
385
+ events: ["change"]
386
+ },
387
+ Checkbox: {
388
+ props: import_zod.z.object({
389
+ checked: import_zod.z.boolean().nullable().optional(),
390
+ label: import_zod.z.string().optional(),
391
+ description: import_zod.z.string().nullable().optional(),
392
+ disabled: import_zod.z.boolean().optional()
393
+ }),
394
+ description: "Checkbox control with optional label/description and two-way binding via $bindState on checked.",
395
+ events: ["change"]
396
+ },
397
+ Textarea: {
398
+ props: import_zod.z.object({
399
+ value: import_zod.z.string().nullable().optional(),
400
+ placeholder: import_zod.z.string().optional(),
401
+ rows: import_zod.z.number().int().positive().optional(),
402
+ autoresize: import_zod.z.boolean().optional(),
403
+ maxrows: import_zod.z.number().int().positive().optional(),
404
+ disabled: import_zod.z.boolean().optional()
405
+ }),
406
+ description: "Multiline text input supporting rows/autoresize and two-way binding via $bindState on value.",
407
+ events: ["change"]
408
+ },
409
+ Switch: {
410
+ props: import_zod.z.object({
411
+ checked: import_zod.z.boolean().nullable().optional(),
412
+ label: import_zod.z.string().optional(),
413
+ description: import_zod.z.string().nullable().optional(),
414
+ disabled: import_zod.z.boolean().optional()
415
+ }),
416
+ description: "Boolean toggle switch with optional label/description and two-way binding via $bindState on checked.",
417
+ events: ["change"]
418
+ },
419
+ Dialog: {
420
+ props: import_zod.z.object({
421
+ open: import_zod.z.boolean().optional(),
422
+ title: import_zod.z.string().optional(),
423
+ description: import_zod.z.string().nullable().optional(),
424
+ confirmLabel: import_zod.z.string().optional(),
425
+ cancelLabel: import_zod.z.string().optional(),
426
+ confirmColor: import_zod.z.enum([
427
+ "primary",
428
+ "secondary",
429
+ "success",
430
+ "info",
431
+ "warning",
432
+ "error",
433
+ "neutral"
434
+ ]).optional(),
435
+ confirmVariant: import_zod.z.enum(["solid", "outline", "soft", "subtle", "ghost", "link"]).optional(),
436
+ closeOnConfirm: import_zod.z.boolean().optional()
437
+ }),
438
+ slots: ["default"],
439
+ description: "Modal dialog wrapper with optional title/description and cancel/confirm actions.",
440
+ events: ["openChange", "confirm", "cancel"]
441
+ }
442
+ };
443
+
444
+ // src/globals.ts
445
+ var nuxtUiGlobalDeps = {
446
+ Card: ["UCard"],
447
+ Button: ["UButton"],
448
+ Input: ["UInput"],
449
+ Select: ["USelect"],
450
+ Checkbox: ["UCheckbox"],
451
+ Textarea: ["UTextarea"],
452
+ Switch: ["USwitch"],
453
+ Dialog: ["UModal", "UButton"]
454
+ };
455
+ function registerNuxtUiGlobals(nuxtApp, resolved, catalogComponents) {
456
+ const filterKeys = Array.isArray(catalogComponents) ? catalogComponents : Object.keys(catalogComponents);
457
+ const needed = /* @__PURE__ */ new Map();
458
+ for (const key of filterKeys) {
459
+ const deps = nuxtUiGlobalDeps[key];
460
+ if (deps) {
461
+ for (const dep of deps) needed.set(dep, key);
462
+ }
463
+ }
464
+ for (const [name, catalogName] of needed) {
465
+ const comp = resolved[name];
466
+ if (comp) {
467
+ nuxtApp.vueApp.component(name, comp);
468
+ } else {
469
+ console.warn(
470
+ `[json-render-nuxt-ui] Missing "${name}" \u2014 required by the "${catalogName}" component. Import it (import { ${name} } from "#components") and pass it to your registerNuxtUiGlobals() call.`
471
+ );
472
+ }
473
+ }
474
+ }
475
+ // Annotate the CommonJS export names for ESM import in node:
476
+ 0 && (module.exports = {
477
+ nuxtUiComponentDefinitions,
478
+ nuxtUiComponents,
479
+ registerNuxtUiGlobals
480
+ });
481
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components.ts","../src/catalog.ts","../src/globals.ts"],"sourcesContent":["// Component implementations\nexport { nuxtUiComponents } from \"./components\";\n\n// Catalog definitions (also available via json-render-nuxt-ui/catalog)\nexport {\n nuxtUiComponentDefinitions,\n type ComponentDefinition,\n type NuxtUiProps,\n} from \"./catalog\";\n\n// Nuxt global registration helper\nexport { registerNuxtUiGlobals } from \"./globals\";\n","import { h, resolveComponent } from \"vue\";\nimport { useBoundProp, type BaseComponentProps } from \"@json-render/vue\";\nimport type { NuxtUiComponentName, NuxtUiProps } from \"./catalog\";\n\ntype ComponentMap = {\n [K in NuxtUiComponentName]: (\n ctx: BaseComponentProps<NuxtUiProps<K>>\n ) => ReturnType<typeof h>;\n};\n\nconst gapClass: Record<string, string> = {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n};\n\nexport const nuxtUiComponents: ComponentMap = {\n Stack: ({ props, children }) => {\n const gap = gapClass[props.gap ?? \"md\"];\n return h(\"div\", { class: `flex flex-col ${gap}` }, children);\n },\n\n Row: ({ props, children }) => {\n const gap = gapClass[props.gap ?? \"md\"];\n const alignMap: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n };\n const justifyMap: Record<string, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n };\n const classes = [\n \"flex flex-row\",\n gap,\n alignMap[props.align ?? \"center\"],\n justifyMap[props.justify ?? \"start\"],\n props.wrap ? \"flex-wrap\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return h(\"div\", { class: classes }, children);\n },\n\n Divider: ({ props }) => {\n if (props.label) {\n return h(\"div\", { class: \"flex items-center gap-3 my-2\" }, [\n h(\"hr\", { class: \"flex-1 border-default\" }),\n h(\"span\", { class: \"text-xs text-dimmed shrink-0\" }, props.label),\n h(\"hr\", { class: \"flex-1 border-default\" }),\n ]);\n }\n return h(\"hr\", { class: \"border-default my-2\" });\n },\n\n Text: ({ props }) => {\n const sizeClass: Record<string, string> = {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n };\n const colorClass: Record<string, string> = {\n default: \"text-default\",\n muted: \"text-muted\",\n dimmed: \"text-dimmed\",\n };\n const classes = [\n sizeClass[props.size ?? \"sm\"],\n colorClass[props.color ?? \"default\"],\n ].join(\" \");\n return h(\"p\", { class: classes }, props.content);\n },\n\n Card: ({ props, children }) => {\n const UCard = resolveComponent(\"UCard\");\n const hasHeader = Boolean(props.title || props.description);\n\n return h(UCard, null, {\n header: hasHeader\n ? () =>\n h(\"div\", { class: \"space-y-1\" }, [\n props.title\n ? h(\"h3\", { class: \"text-base font-semibold\" }, props.title)\n : null,\n props.description\n ? h(\"p\", { class: \"text-sm text-muted\" }, props.description)\n : null,\n ])\n : undefined,\n default: () => h(\"div\", { class: \"space-y-4\" }, children),\n });\n },\n\n Header: ({ props }) => {\n const level = props.level ?? \"h2\";\n const titleClassByLevel: Record<string, string> = {\n h1: \"text-3xl font-bold tracking-tight\",\n h2: \"text-2xl font-semibold tracking-tight\",\n h3: \"text-xl font-semibold\",\n h4: \"text-lg font-semibold\",\n h5: \"text-base font-semibold\",\n h6: \"text-sm font-semibold uppercase tracking-wide\",\n };\n\n return h(\"header\", { class: \"space-y-1\" }, [\n h(level, { class: titleClassByLevel[level] }, props.text),\n props.description\n ? h(\"p\", { class: \"text-sm text-muted\" }, props.description)\n : null,\n ]);\n },\n\n Button: ({ props, on }) => {\n const UButton = resolveComponent(\"UButton\");\n const press = on(\"press\");\n\n return h(UButton, {\n label: props.label,\n color: props.color,\n variant: props.variant,\n size: props.size,\n icon: props.icon,\n loading: props.loading,\n disabled: props.disabled,\n onClick: (event: Event) => {\n if (press.shouldPreventDefault) {\n event.preventDefault();\n }\n press.emit();\n },\n });\n },\n\n Input: ({ props, bindings, emit }) => {\n const UInput = resolveComponent(\"UInput\");\n const [value, setValue] = useBoundProp<string | null | undefined>(\n props.value,\n bindings?.value\n );\n\n return h(UInput, {\n modelValue: value ?? \"\",\n type: props.type ?? \"text\",\n placeholder: props.placeholder,\n size: props.size,\n disabled: props.disabled,\n autofocus: props.autofocus,\n \"onUpdate:modelValue\": (nextValue: string) => {\n setValue(nextValue);\n emit(\"change\");\n },\n });\n },\n\n Select: ({ props, bindings, emit }) => {\n const USelect = resolveComponent(\"USelect\");\n const [value, setValue] = useBoundProp<\n string | number | boolean | null | undefined\n >(props.value, bindings?.value);\n\n return h(USelect, {\n modelValue: value ?? null,\n items: props.items ?? [],\n placeholder: props.placeholder,\n size: props.size,\n disabled: props.disabled,\n \"onUpdate:modelValue\": (nextValue: string | number | boolean | null) => {\n setValue(nextValue);\n emit(\"change\");\n },\n });\n },\n\n Checkbox: ({ props, bindings, emit }) => {\n const UCheckbox = resolveComponent(\"UCheckbox\");\n const [checked, setChecked] = useBoundProp<boolean | null | undefined>(\n props.checked,\n bindings?.checked\n );\n\n return h(UCheckbox, {\n modelValue: checked ?? false,\n label: props.label,\n description: props.description ?? undefined,\n disabled: props.disabled,\n \"onUpdate:modelValue\": (nextValue: boolean) => {\n setChecked(nextValue);\n emit(\"change\");\n },\n });\n },\n\n Textarea: ({ props, bindings, emit }) => {\n const UTextarea = resolveComponent(\"UTextarea\");\n const [value, setValue] = useBoundProp<string | null | undefined>(\n props.value,\n bindings?.value\n );\n\n return h(UTextarea, {\n modelValue: value ?? \"\",\n placeholder: props.placeholder,\n rows: props.rows,\n autoresize: props.autoresize,\n maxrows: props.maxrows,\n disabled: props.disabled,\n \"onUpdate:modelValue\": (nextValue: string) => {\n setValue(nextValue);\n emit(\"change\");\n },\n });\n },\n\n Switch: ({ props, bindings, emit }) => {\n const USwitch = resolveComponent(\"USwitch\");\n const [checked, setChecked] = useBoundProp<boolean | null | undefined>(\n props.checked,\n bindings?.checked\n );\n\n return h(USwitch, {\n modelValue: checked ?? false,\n label: props.label,\n description: props.description ?? undefined,\n disabled: props.disabled,\n \"onUpdate:modelValue\": (nextValue: boolean) => {\n setChecked(nextValue);\n emit(\"change\");\n },\n });\n },\n\n Dialog: ({ props, bindings, children, emit, on }) => {\n const UModal = resolveComponent(\"UModal\");\n const UButton = resolveComponent(\"UButton\");\n const [open, setOpen] = useBoundProp<boolean | undefined>(\n props.open,\n bindings?.open\n );\n const confirm = on(\"confirm\");\n const cancel = on(\"cancel\");\n\n const updateOpen = (nextOpen: boolean) => {\n setOpen(nextOpen);\n emit(\"openChange\");\n };\n\n return h(\n UModal,\n {\n open: open ?? false,\n title: props.title,\n description: props.description ?? undefined,\n \"onUpdate:open\": (nextOpen: boolean) => updateOpen(nextOpen),\n },\n {\n default: () => children,\n footer: () =>\n h(\"div\", { class: \"flex justify-end gap-2\" }, [\n h(UButton, {\n variant: \"ghost\",\n label: props.cancelLabel ?? \"Cancel\",\n onClick: (event: Event) => {\n if (cancel.shouldPreventDefault) {\n event.preventDefault();\n }\n cancel.emit();\n updateOpen(false);\n },\n }),\n h(UButton, {\n color: props.confirmColor ?? \"primary\",\n variant: props.confirmVariant ?? \"solid\",\n label: props.confirmLabel ?? \"Confirm\",\n onClick: (event: Event) => {\n if (confirm.shouldPreventDefault) {\n event.preventDefault();\n }\n confirm.emit();\n if (props.closeOnConfirm !== false) {\n updateOpen(false);\n }\n },\n }),\n ]),\n }\n );\n },\n};\n","import { z } from \"zod\";\n\n/**\n * Type for a component definition.\n */\nexport type ComponentDefinition = {\n props: z.ZodType;\n slots?: string[];\n events?: string[];\n description: string;\n example?: Record<string, unknown>;\n};\n\nexport const nuxtUiComponentDefinitions = {\n Stack: {\n props: z.object({\n gap: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n }),\n slots: [\"default\"],\n description:\n \"Vertical flex container that spaces children evenly. Use as the top-level wrapper or to group elements with consistent vertical rhythm.\",\n },\n Row: {\n props: z.object({\n gap: z.enum([\"none\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n align: z.enum([\"start\", \"center\", \"end\", \"stretch\"]).optional(),\n justify: z.enum([\"start\", \"center\", \"end\", \"between\", \"around\"]).optional(),\n wrap: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Horizontal flex container for side-by-side layouts (e.g. input + button, icon row, grid cells).\",\n },\n Divider: {\n props: z.object({\n label: z.string().optional(),\n }),\n description:\n \"Horizontal rule / visual separator between sections. Optional centered label.\",\n },\n Text: {\n props: z.object({\n content: z.string(),\n size: z.enum([\"xs\", \"sm\", \"md\", \"lg\"]).optional(),\n color: z.enum([\"default\", \"muted\", \"dimmed\"]).optional(),\n }),\n description:\n \"Plain text paragraph. Use for descriptions, instructions, or any body copy that is not a heading.\",\n },\n Card: {\n props: z.object({\n title: z.string().optional(),\n description: z.string().nullable().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Container card with optional title and description. Renders children in the card body with vertical spacing.\",\n },\n Header: {\n props: z.object({\n text: z.string(),\n level: z.enum([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"]).optional(),\n description: z.string().nullable().optional(),\n }),\n description:\n \"Section header text with configurable heading level and optional supporting description.\",\n },\n Button: {\n props: z.object({\n label: z.string(),\n color: z\n .enum([\n \"primary\",\n \"secondary\",\n \"success\",\n \"info\",\n \"warning\",\n \"error\",\n \"neutral\",\n ])\n .optional(),\n variant: z\n .enum([\"solid\", \"outline\", \"soft\", \"subtle\", \"ghost\", \"link\"])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n icon: z.string().optional(),\n loading: z.boolean().optional(),\n disabled: z.boolean().optional(),\n }),\n description:\n \"Clickable button supporting Nuxt UI color/variant/size options. Emits press on click.\",\n events: [\"press\"],\n },\n Input: {\n props: z.object({\n value: z.string().nullable().optional(),\n placeholder: z.string().optional(),\n type: z\n .enum([\"text\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"number\"])\n .optional(),\n size: z.enum([\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n disabled: z.boolean().optional(),\n autofocus: z.boolean().optional(),\n }),\n description:\n \"Text input field. Supports two-way binding via $bindState on value and emits change on input.\",\n events: [\"change\"],\n },\n Select: {\n props: z.object({\n value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional(),\n items: z\n .array(\n z.union([\n z.string(),\n z.object({\n label: z.string(),\n value: z.union([z.string(), z.number(), z.boolean()]),\n disabled: z.boolean().optional(),\n }),\n ])\n )\n .optional(),\n placeholder: z.string().optional(),\n size: z.enum([\"xs\", \"sm\", \"md\", \"lg\", \"xl\"]).optional(),\n disabled: z.boolean().optional(),\n }),\n description:\n \"Select input with item list and optional two-way binding via $bindState on value.\",\n events: [\"change\"],\n },\n Checkbox: {\n props: z.object({\n checked: z.boolean().nullable().optional(),\n label: z.string().optional(),\n description: z.string().nullable().optional(),\n disabled: z.boolean().optional(),\n }),\n description:\n \"Checkbox control with optional label/description and two-way binding via $bindState on checked.\",\n events: [\"change\"],\n },\n Textarea: {\n props: z.object({\n value: z.string().nullable().optional(),\n placeholder: z.string().optional(),\n rows: z.number().int().positive().optional(),\n autoresize: z.boolean().optional(),\n maxrows: z.number().int().positive().optional(),\n disabled: z.boolean().optional(),\n }),\n description:\n \"Multiline text input supporting rows/autoresize and two-way binding via $bindState on value.\",\n events: [\"change\"],\n },\n Switch: {\n props: z.object({\n checked: z.boolean().nullable().optional(),\n label: z.string().optional(),\n description: z.string().nullable().optional(),\n disabled: z.boolean().optional(),\n }),\n description:\n \"Boolean toggle switch with optional label/description and two-way binding via $bindState on checked.\",\n events: [\"change\"],\n },\n Dialog: {\n props: z.object({\n open: z.boolean().optional(),\n title: z.string().optional(),\n description: z.string().nullable().optional(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n confirmColor: z\n .enum([\n \"primary\",\n \"secondary\",\n \"success\",\n \"info\",\n \"warning\",\n \"error\",\n \"neutral\",\n ])\n .optional(),\n confirmVariant: z\n .enum([\"solid\", \"outline\", \"soft\", \"subtle\", \"ghost\", \"link\"])\n .optional(),\n closeOnConfirm: z.boolean().optional(),\n }),\n slots: [\"default\"],\n description:\n \"Modal dialog wrapper with optional title/description and cancel/confirm actions.\",\n events: [\"openChange\", \"confirm\", \"cancel\"],\n },\n} satisfies Record<string, ComponentDefinition>;\n\n/**\n * Infer the props type for a Nuxt UI component by name.\n * Derives the TypeScript type directly from the Zod schema,\n * so component implementations stay in sync with catalog definitions.\n */\nexport type NuxtUiComponentName = keyof typeof nuxtUiComponentDefinitions;\nexport type NuxtUiProps<K extends NuxtUiComponentName> = z.output<\n (typeof nuxtUiComponentDefinitions)[K][\"props\"]\n>;\n","import type { Component } from \"vue\";\nimport type { ComponentDefinition, NuxtUiComponentName } from \"./catalog\";\n\n/**\n * Maps json-render catalog component names to the Nuxt UI global component\n * names they depend on at runtime via `resolveComponent()`.\n *\n * Components that only use native HTML elements (e.g. Header) have no entry.\n */\nexport const nuxtUiGlobalDeps: Readonly<\n Partial<Record<NuxtUiComponentName, readonly string[]>>\n> = {\n Card: [\"UCard\"],\n Button: [\"UButton\"],\n Input: [\"UInput\"],\n Select: [\"USelect\"],\n Checkbox: [\"UCheckbox\"],\n Textarea: [\"UTextarea\"],\n Switch: [\"USwitch\"],\n Dialog: [\"UModal\", \"UButton\"],\n};\n\ntype NuxtAppLike = {\n vueApp: { component(name: string, comp: Component): void };\n};\n\n/**\n * Globally register the Nuxt UI components that json-render-nuxt-ui\n * needs at runtime.\n *\n * Nuxt auto-imports resolve `@nuxt/ui` components at compile time via\n * template transforms — they are NOT registered globally at runtime. The\n * json-render component registry uses Vue's `resolveComponent()`, so the\n * components it references must be registered on the Vue app instance.\n *\n * @param nuxtApp The Nuxt app instance (from `defineNuxtPlugin` callback).\n * @param resolved Object mapping Nuxt UI component names (e.g. `UCard`) to\n * their Vue component implementations — import these from `#components`.\n * @param catalogComponents The catalog component names to register globals for.\n * Only the Nuxt UI globals required by these components are registered. Pass\n * an array of names (`['Card', 'Button']`) or an object whose keys are names\n * (e.g. `nuxtUiComponentDefinitions` or a custom subset).\n *\n * @example\n * ```ts\n * import { registerNuxtUiGlobals, nuxtUiComponentDefinitions } from \"json-render-nuxt-ui\";\n * import { UCard, UButton, UInput, USelect, UCheckbox, UTextarea, USwitch, UModal } from \"#components\";\n *\n * export default defineNuxtPlugin((nuxtApp) => {\n * registerNuxtUiGlobals(\n * nuxtApp,\n * { UCard, UButton, UInput, USelect, UCheckbox, UTextarea, USwitch, UModal },\n * nuxtUiComponentDefinitions,\n * );\n * });\n * ```\n */\nexport function registerNuxtUiGlobals(\n nuxtApp: NuxtAppLike,\n resolved: Record<string, Component>,\n catalogComponents:\n | NuxtUiComponentName[]\n | Partial<Record<NuxtUiComponentName, ComponentDefinition>>,\n): void {\n const filterKeys: NuxtUiComponentName[] = Array.isArray(catalogComponents)\n ? catalogComponents\n : (Object.keys(catalogComponents) as NuxtUiComponentName[]);\n\n const needed = new Map<string, NuxtUiComponentName>();\n for (const key of filterKeys) {\n const deps = nuxtUiGlobalDeps[key];\n if (deps) {\n for (const dep of deps) needed.set(dep, key);\n }\n }\n\n for (const [name, catalogName] of needed) {\n const comp = resolved[name];\n if (comp) {\n nuxtApp.vueApp.component(name, comp);\n } else {\n console.warn(\n `[json-render-nuxt-ui] Missing \"${name}\" — required by the \"${catalogName}\" component. ` +\n `Import it (import { ${name} } from \"#components\") and pass it ` +\n `to your registerNuxtUiGlobals() call.`,\n );\n }\n }\n}\n"],"mappings":"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","names":["import_vue"]}