jsonforms-nuxt-ui-renderers 0.1.7 → 0.2.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.
package/dist/index.js CHANGED
@@ -36,197 +36,196 @@ function trimmedOrUndefined(input) {
36
36
  }
37
37
 
38
38
  // src/renderers/complex/NuxtUiArrayListRenderer.ts
39
- var NuxtUiArrayListRenderer = defineComponent({
40
- name: "NuxtUiArrayListRenderer",
41
- components: { DispatchRenderer },
42
- props: rendererProps(),
43
- setup(props) {
44
- const { control, addItem, removeItems, moveUp, moveDown } = useJsonFormsArrayControl(
45
- props
46
- );
47
- const errorMessage = computed2(() => trimmedOrUndefined(control.value.errors));
48
- const items = computed2(
49
- () => Array.isArray(control.value.data) ? control.value.data : []
50
- );
51
- const arraySchema = computed2(() => {
52
- try {
53
- return Resolve.schema(
54
- props.schema,
39
+ function createNuxtUiArrayListRenderer(theme) {
40
+ return defineComponent({
41
+ name: "NuxtUiArrayListRenderer",
42
+ components: { DispatchRenderer },
43
+ props: rendererProps(),
44
+ setup(props) {
45
+ const { control, addItem, removeItems, moveUp, moveDown } = useJsonFormsArrayControl(
46
+ props
47
+ );
48
+ const errorMessage = computed2(() => trimmedOrUndefined(control.value.errors));
49
+ const items = computed2(
50
+ () => Array.isArray(control.value.data) ? control.value.data : []
51
+ );
52
+ const arraySchema = computed2(() => {
53
+ try {
54
+ return Resolve.schema(
55
+ props.schema,
56
+ control.value.uischema.scope,
57
+ control.value.rootSchema
58
+ );
59
+ } catch {
60
+ return void 0;
61
+ }
62
+ });
63
+ const maxItemsReached = computed2(() => {
64
+ const max = arraySchema.value?.maxItems;
65
+ return typeof max === "number" ? items.value.length >= max : false;
66
+ });
67
+ const minItemsReached = computed2(() => {
68
+ const min = arraySchema.value?.minItems;
69
+ return typeof min === "number" ? items.value.length <= min : false;
70
+ });
71
+ const childUiSchema = computed2(
72
+ () => findUISchema(
73
+ control.value.uischemas,
74
+ control.value.schema,
55
75
  control.value.uischema.scope,
76
+ control.value.path,
77
+ void 0,
78
+ control.value.uischema,
56
79
  control.value.rootSchema
80
+ )
81
+ );
82
+ function childLabelForIndex(index) {
83
+ const childLabelProp = getChildLabelPropFromUiSchemaOptions(control.value.uischema.options) ?? getFirstPrimitiveProp(control.value.schema);
84
+ if (!childLabelProp) return `${index}`;
85
+ const labelValue = Resolve.data(
86
+ control.value.data,
87
+ composePaths(`${index}`, childLabelProp)
57
88
  );
58
- } catch {
59
- return void 0;
89
+ if (labelValue === void 0 || labelValue === null || Number.isNaN(labelValue)) {
90
+ return "";
91
+ }
92
+ return String(labelValue);
60
93
  }
61
- });
62
- const maxItemsReached = computed2(() => {
63
- const max = arraySchema.value?.maxItems;
64
- return typeof max === "number" ? items.value.length >= max : false;
65
- });
66
- const minItemsReached = computed2(() => {
67
- const min = arraySchema.value?.minItems;
68
- return typeof min === "number" ? items.value.length <= min : false;
69
- });
70
- const childUiSchema = computed2(
71
- () => findUISchema(
72
- control.value.uischemas,
73
- control.value.schema,
74
- control.value.uischema.scope,
75
- control.value.path,
76
- void 0,
77
- control.value.uischema,
78
- control.value.rootSchema
79
- )
80
- );
81
- function childLabelForIndex(index) {
82
- const childLabelProp = getChildLabelPropFromUiSchemaOptions(control.value.uischema.options) ?? getFirstPrimitiveProp(control.value.schema);
83
- if (!childLabelProp) return `${index}`;
84
- const labelValue = Resolve.data(
85
- control.value.data,
86
- composePaths(`${index}`, childLabelProp)
87
- );
88
- if (labelValue === void 0 || labelValue === null || Number.isNaN(labelValue)) {
89
- return "";
94
+ function getChildLabelPropFromUiSchemaOptions(options) {
95
+ if (!options || typeof options !== "object") return void 0;
96
+ const value = options.childLabelProp;
97
+ return typeof value === "string" ? value : void 0;
90
98
  }
91
- return String(labelValue);
92
- }
93
- function getChildLabelPropFromUiSchemaOptions(options) {
94
- if (!options || typeof options !== "object") return void 0;
95
- const value = options.childLabelProp;
96
- return typeof value === "string" ? value : void 0;
97
- }
98
- function addButtonClick() {
99
- addItem(
100
- control.value.path,
101
- createDefaultValue(control.value.schema, control.value.rootSchema)
102
- )();
103
- }
104
- return () => {
105
- if (!control.value.visible) return null;
106
- const UFormField = resolveComponent("UFormField");
107
- const UButton = resolveComponent("UButton");
108
- return h(
109
- "div",
110
- {},
111
- h(
112
- UFormField,
113
- {
114
- label: control.value.label,
115
- description: control.value.description,
116
- required: control.value.required,
117
- error: errorMessage.value
118
- },
119
- {
120
- default: () => h("div", { class: "flex flex-col gap-3" }, [
121
- h("div", { class: "flex items-center justify-between gap-3" }, [
122
- h(
123
- "div",
124
- { class: "text-xs text-gray-500" },
125
- `${items.value.length} items`
126
- ),
127
- h(
128
- UButton,
129
- {
130
- type: "button",
131
- size: "xs",
132
- variant: "soft",
133
- color: "neutral",
134
- disabled: !control.value.enabled || maxItemsReached.value,
135
- onClick: addButtonClick
136
- },
137
- { default: () => "Add" }
138
- )
139
- ]),
140
- items.value.length === 0 ? h(
141
- "div",
142
- { class: "text-sm text-gray-500" },
143
- "No items."
144
- ) : null,
145
- ...items.value.map(
146
- (_item, index) => h(
147
- "div",
148
- { key: `${control.value.path}-${index}`, class: "rounded border p-3" },
149
- [
150
- h(
151
- "div",
152
- { class: "mb-3 flex items-start justify-between gap-3" },
153
- [
154
- h("div", { class: "min-w-0" }, [
155
- h(
156
- "div",
157
- {
158
- class: "text-xs font-semibold text-gray-700 dark:text-gray-200"
159
- },
160
- [
161
- `Item ${index + 1}`,
162
- childLabelForIndex(index) ? h(
163
- "span",
164
- {
165
- class: "font-normal text-gray-500"
166
- },
167
- ` \u2014 ${childLabelForIndex(index)}`
168
- ) : null
169
- ]
170
- )
171
- ]),
172
- h("div", { class: "flex flex-none items-center gap-1" }, [
173
- h(
174
- UButton,
175
- {
176
- type: "button",
177
- size: "xs",
178
- variant: "ghost",
179
- color: "neutral",
180
- disabled: !control.value.enabled || index === 0,
181
- onClick: () => moveUp?.(control.value.path, index)()
182
- },
183
- { default: () => "Up" }
184
- ),
185
- h(
186
- UButton,
187
- {
188
- type: "button",
189
- size: "xs",
190
- variant: "ghost",
191
- color: "neutral",
192
- disabled: !control.value.enabled || index >= items.value.length - 1,
193
- onClick: () => moveDown?.(control.value.path, index)()
194
- },
195
- { default: () => "Down" }
196
- ),
197
- h(
198
- UButton,
199
- {
200
- type: "button",
201
- size: "xs",
202
- variant: "ghost",
203
- color: "error",
204
- disabled: !control.value.enabled || minItemsReached.value,
205
- onClick: () => removeItems?.(control.value.path, [index])()
206
- },
207
- { default: () => "Remove" }
208
- )
209
- ])
210
- ]
211
- ),
212
- h(DispatchRenderer, {
213
- schema: control.value.schema,
214
- uischema: childUiSchema.value,
215
- path: composePaths(control.value.path, `${index}`),
216
- enabled: control.value.enabled,
217
- renderers: control.value.renderers,
218
- cells: control.value.cells
219
- })
220
- ]
99
+ function addButtonClick() {
100
+ addItem(
101
+ control.value.path,
102
+ createDefaultValue(control.value.schema, control.value.rootSchema)
103
+ )();
104
+ }
105
+ return () => {
106
+ if (!control.value.visible) return null;
107
+ const UFormField = resolveComponent("UFormField");
108
+ const UButton = resolveComponent("UButton");
109
+ return h(
110
+ "div",
111
+ {},
112
+ h(
113
+ UFormField,
114
+ {
115
+ label: control.value.label,
116
+ description: control.value.description,
117
+ required: control.value.required,
118
+ error: errorMessage.value
119
+ },
120
+ {
121
+ default: () => h("div", { class: theme.layoutVertical }, [
122
+ h("div", { class: theme.flexBetween }, [
123
+ h(
124
+ "div",
125
+ { class: theme.textMutedXs },
126
+ `${items.value.length} items`
127
+ ),
128
+ h(
129
+ UButton,
130
+ {
131
+ type: "button",
132
+ size: "xs",
133
+ variant: "soft",
134
+ color: "neutral",
135
+ disabled: !control.value.enabled || maxItemsReached.value,
136
+ onClick: addButtonClick
137
+ },
138
+ { default: () => "Add" }
139
+ )
140
+ ]),
141
+ items.value.length === 0 ? h("div", { class: theme.textMuted }, "No items.") : null,
142
+ ...items.value.map(
143
+ (_item, index) => h(
144
+ "div",
145
+ {
146
+ key: `${control.value.path}-${index}`,
147
+ class: theme.panel
148
+ },
149
+ [
150
+ h(
151
+ "div",
152
+ { class: theme.arrayItemToolbar },
153
+ [
154
+ h("div", { class: "jf-min-w-0" }, [
155
+ h(
156
+ "div",
157
+ { class: theme.textItemTitle },
158
+ [
159
+ `Item ${index + 1}`,
160
+ childLabelForIndex(index) ? h(
161
+ "span",
162
+ { class: theme.textItemSuffix },
163
+ ` \u2014 ${childLabelForIndex(index)}`
164
+ ) : null
165
+ ]
166
+ )
167
+ ]),
168
+ h("div", { class: theme.flexActions }, [
169
+ h(
170
+ UButton,
171
+ {
172
+ type: "button",
173
+ size: "xs",
174
+ variant: "ghost",
175
+ color: "neutral",
176
+ disabled: !control.value.enabled || index === 0,
177
+ onClick: () => moveUp?.(control.value.path, index)()
178
+ },
179
+ { default: () => "Up" }
180
+ ),
181
+ h(
182
+ UButton,
183
+ {
184
+ type: "button",
185
+ size: "xs",
186
+ variant: "ghost",
187
+ color: "neutral",
188
+ disabled: !control.value.enabled || index >= items.value.length - 1,
189
+ onClick: () => moveDown?.(control.value.path, index)()
190
+ },
191
+ { default: () => "Down" }
192
+ ),
193
+ h(
194
+ UButton,
195
+ {
196
+ type: "button",
197
+ size: "xs",
198
+ variant: "ghost",
199
+ color: "error",
200
+ disabled: !control.value.enabled || minItemsReached.value,
201
+ onClick: () => removeItems?.(control.value.path, [
202
+ index
203
+ ])()
204
+ },
205
+ { default: () => "Remove" }
206
+ )
207
+ ])
208
+ ]
209
+ ),
210
+ h(DispatchRenderer, {
211
+ schema: control.value.schema,
212
+ uischema: childUiSchema.value,
213
+ path: composePaths(control.value.path, `${index}`),
214
+ enabled: control.value.enabled,
215
+ renderers: control.value.renderers,
216
+ cells: control.value.cells
217
+ })
218
+ ]
219
+ )
221
220
  )
222
- )
223
- ])
224
- }
225
- )
226
- );
227
- };
228
- }
229
- });
221
+ ])
222
+ }
223
+ )
224
+ );
225
+ };
226
+ }
227
+ });
228
+ }
230
229
 
231
230
  // src/renderers/complex/NuxtUiObjectRenderer.ts
232
231
  import { Generate, findUISchema as findUISchema2 } from "@jsonforms/core";
@@ -288,52 +287,54 @@ var NuxtUiObjectRenderer = defineComponent2({
288
287
  // src/renderers/controls/NuxtUiBooleanControl.ts
289
288
  import { rendererProps as rendererProps3, useJsonFormsControl } from "@jsonforms/vue";
290
289
  import { computed as computed4, defineComponent as defineComponent3, h as h3, resolveComponent as resolveComponent2 } from "vue";
291
- var NuxtUiBooleanControl = defineComponent3({
292
- name: "NuxtUiBooleanControl",
293
- props: rendererProps3(),
294
- setup(props) {
295
- const { control, handleChange } = useJsonFormsControl(
296
- props
297
- );
298
- const errorMessage = computed4(() => trimmedOrUndefined(control.value.errors));
299
- const modelValue = computed4({
300
- get: () => Boolean(control.value.data),
301
- set: (v) => handleChange(control.value.path, v)
302
- });
303
- return () => {
304
- if (!control.value.visible) return null;
305
- const UFormField = resolveComponent2("UFormField");
306
- const USwitch = resolveComponent2("USwitch");
307
- return h3(
308
- "div",
309
- {},
310
- h3(
311
- UFormField,
312
- {
313
- label: control.value.label,
314
- description: control.value.description,
315
- required: control.value.required,
316
- error: errorMessage.value
317
- },
318
- {
319
- default: () => h3(
320
- "div",
321
- { class: "flex items-center justify-between gap-3" },
322
- h3(USwitch, {
323
- modelValue: modelValue.value,
324
- disabled: !control.value.enabled,
325
- "aria-invalid": Boolean(errorMessage.value),
326
- "onUpdate:modelValue": (v) => {
327
- modelValue.value = v;
328
- }
329
- })
330
- )
331
- }
332
- )
290
+ function createNuxtUiBooleanControl(theme) {
291
+ return defineComponent3({
292
+ name: "NuxtUiBooleanControl",
293
+ props: rendererProps3(),
294
+ setup(props) {
295
+ const { control, handleChange } = useJsonFormsControl(
296
+ props
333
297
  );
334
- };
335
- }
336
- });
298
+ const errorMessage = computed4(() => trimmedOrUndefined(control.value.errors));
299
+ const modelValue = computed4({
300
+ get: () => Boolean(control.value.data),
301
+ set: (v) => handleChange(control.value.path, v)
302
+ });
303
+ return () => {
304
+ if (!control.value.visible) return null;
305
+ const UFormField = resolveComponent2("UFormField");
306
+ const USwitch = resolveComponent2("USwitch");
307
+ return h3(
308
+ "div",
309
+ {},
310
+ h3(
311
+ UFormField,
312
+ {
313
+ label: control.value.label,
314
+ description: control.value.description,
315
+ required: control.value.required,
316
+ error: errorMessage.value
317
+ },
318
+ {
319
+ default: () => h3(
320
+ "div",
321
+ { class: theme.flexBetween },
322
+ h3(USwitch, {
323
+ modelValue: modelValue.value,
324
+ disabled: !control.value.enabled,
325
+ "aria-invalid": Boolean(errorMessage.value),
326
+ "onUpdate:modelValue": (v) => {
327
+ modelValue.value = v;
328
+ }
329
+ })
330
+ )
331
+ }
332
+ )
333
+ );
334
+ };
335
+ }
336
+ });
337
+ }
337
338
 
338
339
  // src/renderers/controls/NuxtUiEnumControl.ts
339
340
  import { rendererProps as rendererProps4, useJsonFormsControl as useJsonFormsControl2 } from "@jsonforms/vue";
@@ -757,116 +758,172 @@ var NuxtUiTextareaControl = defineComponent10({
757
758
  // src/renderers/layouts/NuxtUiCategorizationRenderer.ts
758
759
  import { DispatchRenderer as DispatchRenderer3, rendererProps as rendererProps11, useJsonFormsCategorization } from "@jsonforms/vue";
759
760
  import { defineComponent as defineComponent11, h as h11 } from "vue";
760
- var NuxtUiCategorizationRenderer = defineComponent11({
761
- name: "NuxtUiCategorizationRenderer",
762
- components: { DispatchRenderer: DispatchRenderer3 },
763
- props: rendererProps11(),
764
- setup(props) {
765
- const { layout, categories } = useJsonFormsCategorization(
766
- props
767
- );
768
- return () => {
769
- if (!layout.value.visible) return null;
770
- return h11(
771
- "div",
772
- { class: "flex flex-col gap-6" },
773
- categories.map((categoryRef, catIndex) => {
774
- const category = categoryRef.value;
775
- const elements = category.uischema.elements ?? [];
776
- return h11(
777
- "div",
778
- { key: `${layout.value.path}-cat-${catIndex}`, class: "flex flex-col gap-3" },
779
- [
780
- category.label ? h11("div", { class: "text-sm font-semibold" }, category.label) : null,
781
- h11(
782
- "div",
783
- { class: "flex flex-col gap-3" },
784
- elements.map(
785
- (element, index) => h11(
786
- "div",
787
- { key: `${category.path}-${index}` },
788
- h11(DispatchRenderer3, {
789
- schema: category.schema,
790
- uischema: element,
791
- path: category.path,
792
- enabled: category.enabled,
793
- renderers: category.renderers,
794
- cells: category.cells
795
- })
761
+ function createNuxtUiCategorizationRenderer(theme) {
762
+ return defineComponent11({
763
+ name: "NuxtUiCategorizationRenderer",
764
+ components: { DispatchRenderer: DispatchRenderer3 },
765
+ props: rendererProps11(),
766
+ setup(props) {
767
+ const { layout, categories } = useJsonFormsCategorization(
768
+ props
769
+ );
770
+ return () => {
771
+ if (!layout.value.visible) return null;
772
+ return h11(
773
+ "div",
774
+ { class: theme.layoutVerticalWide },
775
+ categories.map((categoryRef, catIndex) => {
776
+ const category = categoryRef.value;
777
+ const elements = category.uischema.elements ?? [];
778
+ return h11(
779
+ "div",
780
+ {
781
+ key: `${layout.value.path}-cat-${catIndex}`,
782
+ class: theme.layoutVertical
783
+ },
784
+ [
785
+ category.label ? h11("div", { class: theme.labelSection }, category.label) : null,
786
+ h11(
787
+ "div",
788
+ { class: theme.layoutVertical },
789
+ elements.map(
790
+ (element, index) => h11(
791
+ "div",
792
+ { key: `${category.path}-${index}` },
793
+ h11(DispatchRenderer3, {
794
+ schema: category.schema,
795
+ uischema: element,
796
+ path: category.path,
797
+ enabled: category.enabled,
798
+ renderers: category.renderers,
799
+ cells: category.cells
800
+ })
801
+ )
796
802
  )
797
803
  )
798
- )
799
- ]
800
- );
801
- })
802
- );
803
- };
804
- }
805
- });
804
+ ]
805
+ );
806
+ })
807
+ );
808
+ };
809
+ }
810
+ });
811
+ }
806
812
 
807
813
  // src/renderers/layouts/NuxtUiCategoryRenderer.ts
808
814
  import { DispatchRenderer as DispatchRenderer4, rendererProps as rendererProps12, useJsonFormsLayout } from "@jsonforms/vue";
809
815
  import { defineComponent as defineComponent12, h as h12 } from "vue";
810
- var NuxtUiCategoryRenderer = defineComponent12({
811
- name: "NuxtUiCategoryRenderer",
812
- components: { DispatchRenderer: DispatchRenderer4 },
813
- props: rendererProps12(),
814
- setup(props) {
815
- const { layout } = useJsonFormsLayout(
816
- props
817
- );
818
- return () => {
819
- if (!layout.value.visible) return null;
820
- const elements = layout.value.uischema.elements ?? [];
821
- return h12("div", { class: "flex flex-col gap-3" }, [
822
- layout.value.label ? h12("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
823
- h12(
824
- "div",
825
- { class: "flex flex-col gap-3" },
826
- elements.map(
827
- (element, index) => h12(
828
- "div",
829
- { key: `${layout.value.path}-${index}` },
830
- h12(DispatchRenderer4, {
831
- schema: layout.value.schema,
832
- uischema: element,
833
- path: layout.value.path,
834
- enabled: layout.value.enabled,
835
- renderers: layout.value.renderers,
836
- cells: layout.value.cells
837
- })
816
+ function createNuxtUiCategoryRenderer(theme) {
817
+ return defineComponent12({
818
+ name: "NuxtUiCategoryRenderer",
819
+ components: { DispatchRenderer: DispatchRenderer4 },
820
+ props: rendererProps12(),
821
+ setup(props) {
822
+ const { layout } = useJsonFormsLayout(
823
+ props
824
+ );
825
+ return () => {
826
+ if (!layout.value.visible) return null;
827
+ const elements = layout.value.uischema.elements ?? [];
828
+ return h12("div", { class: theme.layoutVertical }, [
829
+ layout.value.label ? h12("div", { class: theme.labelSection }, layout.value.label) : null,
830
+ h12(
831
+ "div",
832
+ { class: theme.layoutVertical },
833
+ elements.map(
834
+ (element, index) => h12(
835
+ "div",
836
+ { key: `${layout.value.path}-${index}` },
837
+ h12(DispatchRenderer4, {
838
+ schema: layout.value.schema,
839
+ uischema: element,
840
+ path: layout.value.path,
841
+ enabled: layout.value.enabled,
842
+ renderers: layout.value.renderers,
843
+ cells: layout.value.cells
844
+ })
845
+ )
838
846
  )
839
847
  )
840
- )
841
- ]);
842
- };
843
- }
844
- });
848
+ ]);
849
+ };
850
+ }
851
+ });
852
+ }
845
853
 
846
854
  // src/renderers/layouts/NuxtUiGroupRenderer.ts
847
855
  import { DispatchRenderer as DispatchRenderer5, rendererProps as rendererProps13, useJsonFormsLayout as useJsonFormsLayout2 } from "@jsonforms/vue";
848
856
  import { defineComponent as defineComponent13, h as h13 } from "vue";
849
- var NuxtUiGroupRenderer = defineComponent13({
850
- name: "NuxtUiGroupRenderer",
851
- components: { DispatchRenderer: DispatchRenderer5 },
852
- props: rendererProps13(),
853
- setup(props) {
854
- const { layout } = useJsonFormsLayout2(
855
- props
856
- );
857
- return () => {
858
- if (!layout.value.visible) return null;
859
- const elements = layout.value.uischema.elements ?? [];
860
- return h13("div", { class: "rounded border p-3" }, [
861
- layout.value.label ? h13("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
862
- h13(
857
+ function createNuxtUiGroupRenderer(theme) {
858
+ return defineComponent13({
859
+ name: "NuxtUiGroupRenderer",
860
+ components: { DispatchRenderer: DispatchRenderer5 },
861
+ props: rendererProps13(),
862
+ setup(props) {
863
+ const { layout } = useJsonFormsLayout2(
864
+ props
865
+ );
866
+ return () => {
867
+ if (!layout.value.visible) return null;
868
+ const elements = layout.value.uischema.elements ?? [];
869
+ const isNested = layout.value.path?.includes(".") ?? false;
870
+ const containerClass = isNested ? theme.groupNested : theme.panel;
871
+ return h13(
863
872
  "div",
864
- { class: "flex flex-col gap-3" },
873
+ { class: containerClass },
874
+ [
875
+ layout.value.label ? h13("div", { class: theme.labelSectionSpaced }, layout.value.label) : null,
876
+ h13(
877
+ "div",
878
+ { class: theme.layoutVertical },
879
+ elements.map(
880
+ (element, index) => h13(
881
+ "div",
882
+ { key: `${layout.value.path}-${index}` },
883
+ h13(DispatchRenderer5, {
884
+ schema: layout.value.schema,
885
+ uischema: element,
886
+ path: layout.value.path,
887
+ enabled: layout.value.enabled,
888
+ renderers: layout.value.renderers,
889
+ cells: layout.value.cells
890
+ })
891
+ )
892
+ )
893
+ )
894
+ ]
895
+ );
896
+ };
897
+ }
898
+ });
899
+ }
900
+
901
+ // src/renderers/layouts/NuxtUiHorizontalLayoutRenderer.ts
902
+ import { DispatchRenderer as DispatchRenderer6, rendererProps as rendererProps14, useJsonFormsLayout as useJsonFormsLayout3 } from "@jsonforms/vue";
903
+ import { defineComponent as defineComponent14, h as h14 } from "vue";
904
+ function createNuxtUiHorizontalLayoutRenderer(theme) {
905
+ return defineComponent14({
906
+ name: "NuxtUiHorizontalLayoutRenderer",
907
+ components: { DispatchRenderer: DispatchRenderer6 },
908
+ props: rendererProps14(),
909
+ setup(props) {
910
+ const { layout } = useJsonFormsLayout3(
911
+ props
912
+ );
913
+ return () => {
914
+ if (!layout.value.visible) return null;
915
+ const elements = layout.value.uischema.elements ?? [];
916
+ return h14(
917
+ "div",
918
+ { class: theme.layoutHorizontal },
865
919
  elements.map(
866
- (element, index) => h13(
920
+ (element, index) => h14(
867
921
  "div",
868
- { key: `${layout.value.path}-${index}` },
869
- h13(DispatchRenderer5, {
922
+ {
923
+ key: `${layout.value.path}-${index}`,
924
+ class: theme.layoutHorizontalItem
925
+ },
926
+ h14(DispatchRenderer6, {
870
927
  schema: layout.value.schema,
871
928
  uischema: element,
872
929
  path: layout.value.path,
@@ -876,104 +933,92 @@ var NuxtUiGroupRenderer = defineComponent13({
876
933
  })
877
934
  )
878
935
  )
879
- )
880
- ]);
881
- };
882
- }
883
- });
884
-
885
- // src/renderers/layouts/NuxtUiHorizontalLayoutRenderer.ts
886
- import { DispatchRenderer as DispatchRenderer6, rendererProps as rendererProps14, useJsonFormsLayout as useJsonFormsLayout3 } from "@jsonforms/vue";
887
- import { defineComponent as defineComponent14, h as h14 } from "vue";
888
- var NuxtUiHorizontalLayoutRenderer = defineComponent14({
889
- name: "NuxtUiHorizontalLayoutRenderer",
890
- components: { DispatchRenderer: DispatchRenderer6 },
891
- props: rendererProps14(),
892
- setup(props) {
893
- const { layout } = useJsonFormsLayout3(
894
- props
895
- );
896
- return () => {
897
- if (!layout.value.visible) return null;
898
- const elements = layout.value.uischema.elements ?? [];
899
- return h14(
900
- "div",
901
- { class: "flex flex-col gap-3 md:flex-row md:flex-wrap" },
902
- elements.map(
903
- (element, index) => h14(
904
- "div",
905
- { key: `${layout.value.path}-${index}`, class: "min-w-0 flex-1" },
906
- h14(DispatchRenderer6, {
907
- schema: layout.value.schema,
908
- uischema: element,
909
- path: layout.value.path,
910
- enabled: layout.value.enabled,
911
- renderers: layout.value.renderers,
912
- cells: layout.value.cells
913
- })
914
- )
915
- )
916
- );
917
- };
918
- }
919
- });
936
+ );
937
+ };
938
+ }
939
+ });
940
+ }
920
941
 
921
942
  // src/renderers/layouts/NuxtUiLabelRenderer.ts
922
943
  import { rendererProps as rendererProps15, useJsonFormsLabel } from "@jsonforms/vue";
923
944
  import { defineComponent as defineComponent15, h as h15 } from "vue";
924
- var NuxtUiLabelRenderer = defineComponent15({
925
- name: "NuxtUiLabelRenderer",
926
- props: rendererProps15(),
927
- setup(props) {
928
- const { label } = useJsonFormsLabel(
929
- props
930
- );
931
- return () => {
932
- if (!label.value.visible) return null;
933
- return h15(
934
- "div",
935
- { class: "text-sm text-gray-600 dark:text-gray-300" },
936
- label.value.text
945
+ function createNuxtUiLabelRenderer(theme) {
946
+ return defineComponent15({
947
+ name: "NuxtUiLabelRenderer",
948
+ props: rendererProps15(),
949
+ setup(props) {
950
+ const { label } = useJsonFormsLabel(
951
+ props
937
952
  );
938
- };
939
- }
940
- });
953
+ return () => {
954
+ if (!label.value.visible) return null;
955
+ return h15("div", { class: theme.textLabel }, label.value.text);
956
+ };
957
+ }
958
+ });
959
+ }
941
960
 
942
961
  // src/renderers/layouts/NuxtUiVerticalLayoutRenderer.ts
943
962
  import { DispatchRenderer as DispatchRenderer7, rendererProps as rendererProps16, useJsonFormsLayout as useJsonFormsLayout4 } from "@jsonforms/vue";
944
963
  import { defineComponent as defineComponent16, h as h16 } from "vue";
945
- var NuxtUiVerticalLayoutRenderer = defineComponent16({
946
- name: "NuxtUiVerticalLayoutRenderer",
947
- components: { DispatchRenderer: DispatchRenderer7 },
948
- props: rendererProps16(),
949
- setup(props) {
950
- const { layout } = useJsonFormsLayout4(
951
- props
952
- );
953
- return () => {
954
- if (!layout.value.visible) return null;
955
- const elements = layout.value.uischema.elements ?? [];
956
- return h16(
957
- "div",
958
- { class: "flex flex-col gap-3" },
959
- elements.map(
960
- (element, index) => h16(
961
- "div",
962
- { key: `${layout.value.path}-${index}` },
963
- h16(DispatchRenderer7, {
964
- schema: layout.value.schema,
965
- uischema: element,
966
- path: layout.value.path,
967
- enabled: layout.value.enabled,
968
- renderers: layout.value.renderers,
969
- cells: layout.value.cells
970
- })
971
- )
972
- )
964
+ function createNuxtUiVerticalLayoutRenderer(theme) {
965
+ return defineComponent16({
966
+ name: "NuxtUiVerticalLayoutRenderer",
967
+ components: { DispatchRenderer: DispatchRenderer7 },
968
+ props: rendererProps16(),
969
+ setup(props) {
970
+ const { layout } = useJsonFormsLayout4(
971
+ props
973
972
  );
974
- };
975
- }
976
- });
973
+ return () => {
974
+ if (!layout.value.visible) return null;
975
+ const elements = layout.value.uischema.elements ?? [];
976
+ return h16(
977
+ "div",
978
+ { class: theme.layoutVertical },
979
+ elements.map(
980
+ (element, index) => h16(
981
+ "div",
982
+ { key: `${layout.value.path}-${index}` },
983
+ h16(DispatchRenderer7, {
984
+ schema: layout.value.schema,
985
+ uischema: element,
986
+ path: layout.value.path,
987
+ enabled: layout.value.enabled,
988
+ renderers: layout.value.renderers,
989
+ cells: layout.value.cells
990
+ })
991
+ )
992
+ )
993
+ );
994
+ };
995
+ }
996
+ });
997
+ }
998
+
999
+ // src/renderers/theme.ts
1000
+ var defaultTheme = {
1001
+ panel: "jf-panel",
1002
+ groupNested: "jf-group",
1003
+ layoutVertical: "jf-layout-vertical",
1004
+ layoutVerticalWide: "jf-layout-vertical-wide",
1005
+ layoutHorizontal: "jf-layout-horizontal",
1006
+ layoutHorizontalItem: "jf-layout-horizontal-item",
1007
+ arrayItemToolbar: "jf-array-item-toolbar",
1008
+ labelSection: "jf-label-section",
1009
+ labelSectionSpaced: "jf-label-section-spaced",
1010
+ textMuted: "jf-text-muted",
1011
+ textMutedXs: "jf-text-muted-xs",
1012
+ textItemTitle: "jf-text-item-title",
1013
+ textItemSuffix: "jf-text-item-suffix",
1014
+ textLabel: "jf-text-label",
1015
+ flexBetween: "jf-flex-between",
1016
+ flexBetweenStart: "jf-flex-between-start",
1017
+ flexActions: "jf-flex-actions"
1018
+ };
1019
+ function mergeTheme(overrides) {
1020
+ return overrides ? { ...defaultTheme, ...overrides } : { ...defaultTheme };
1021
+ }
977
1022
 
978
1023
  // src/nuxtUiRenderers.ts
979
1024
  var RANK = 10;
@@ -1021,84 +1066,91 @@ var isOneOfEnumControl = (uischema, schema, context) => {
1021
1066
  }
1022
1067
  return true;
1023
1068
  };
1024
- var nuxtUiRenderers = [
1025
- // Layouts
1026
- {
1027
- tester: rankWith(RANK, uiTypeIs("VerticalLayout")),
1028
- renderer: markRaw(NuxtUiVerticalLayoutRenderer)
1029
- },
1030
- {
1031
- tester: rankWith(RANK, uiTypeIs("HorizontalLayout")),
1032
- renderer: markRaw(NuxtUiHorizontalLayoutRenderer)
1033
- },
1034
- {
1035
- tester: rankWith(RANK, uiTypeIs("Group")),
1036
- renderer: markRaw(NuxtUiGroupRenderer)
1037
- },
1038
- {
1039
- tester: rankWith(RANK, uiTypeIs("Categorization")),
1040
- renderer: markRaw(NuxtUiCategorizationRenderer)
1041
- },
1042
- {
1043
- tester: rankWith(RANK, uiTypeIs("Category")),
1044
- renderer: markRaw(NuxtUiCategoryRenderer)
1045
- },
1046
- {
1047
- tester: rankWith(RANK, uiTypeIs("Label")),
1048
- renderer: markRaw(NuxtUiLabelRenderer)
1049
- },
1050
- // Complex schemas
1051
- {
1052
- tester: rankWith(RANK, schemaTypeIs("array")),
1053
- renderer: markRaw(NuxtUiArrayListRenderer)
1054
- },
1055
- {
1056
- tester: rankWith(RANK, isObjectControl),
1057
- renderer: markRaw(NuxtUiObjectRenderer)
1058
- },
1059
- // Primitive controls
1060
- {
1061
- tester: rankWith(RANK, isMultiLineControl),
1062
- renderer: markRaw(NuxtUiTextareaControl)
1063
- },
1064
- {
1065
- tester: rankWith(RANK, isNumberControl),
1066
- renderer: markRaw(NuxtUiNumberControl)
1067
- },
1068
- {
1069
- tester: rankWith(RANK, isIntegerControl),
1070
- renderer: markRaw(NuxtUiIntegerControl)
1071
- },
1072
- {
1073
- tester: rankWith(RANK, isBooleanControl),
1074
- renderer: markRaw(NuxtUiBooleanControl)
1075
- },
1076
- {
1077
- // Multi-enum must outrank generic array renderer and string renderer.
1078
- tester: rankWith(ENUM_RANK, isMultiEnumControl),
1079
- renderer: markRaw(NuxtUiMultiEnumControl)
1080
- },
1081
- {
1082
- // oneOf with const+title (display labels) - same as enum for rendering.
1083
- tester: rankWith(ENUM_RANK, isOneOfEnumControl),
1084
- renderer: markRaw(NuxtUiEnumControl)
1085
- },
1086
- {
1087
- // Enum must outrank the generic string control, otherwise enums can render
1088
- // as freeform text inputs.
1089
- tester: rankWith(ENUM_RANK, isEnumControl),
1090
- renderer: markRaw(NuxtUiEnumControl)
1091
- },
1092
- {
1093
- tester: rankWith(PASSWORD_RANK, and(isStringControl, formatIs("password"))),
1094
- renderer: markRaw(NuxtUiPasswordControl)
1095
- },
1096
- {
1097
- tester: rankWith(RANK, isStringControl),
1098
- renderer: markRaw(NuxtUiStringControl)
1099
- }
1100
- ];
1069
+ function createNuxtUiRenderers(options) {
1070
+ const theme = mergeTheme(options?.theme);
1071
+ return [
1072
+ // Layouts
1073
+ {
1074
+ tester: rankWith(RANK, uiTypeIs("VerticalLayout")),
1075
+ renderer: markRaw(createNuxtUiVerticalLayoutRenderer(theme))
1076
+ },
1077
+ {
1078
+ tester: rankWith(RANK, uiTypeIs("HorizontalLayout")),
1079
+ renderer: markRaw(createNuxtUiHorizontalLayoutRenderer(theme))
1080
+ },
1081
+ {
1082
+ tester: rankWith(RANK, uiTypeIs("Group")),
1083
+ renderer: markRaw(createNuxtUiGroupRenderer(theme))
1084
+ },
1085
+ {
1086
+ tester: rankWith(RANK, uiTypeIs("Categorization")),
1087
+ renderer: markRaw(createNuxtUiCategorizationRenderer(theme))
1088
+ },
1089
+ {
1090
+ tester: rankWith(RANK, uiTypeIs("Category")),
1091
+ renderer: markRaw(createNuxtUiCategoryRenderer(theme))
1092
+ },
1093
+ {
1094
+ tester: rankWith(RANK, uiTypeIs("Label")),
1095
+ renderer: markRaw(createNuxtUiLabelRenderer(theme))
1096
+ },
1097
+ // Complex schemas
1098
+ {
1099
+ tester: rankWith(RANK, schemaTypeIs("array")),
1100
+ renderer: markRaw(createNuxtUiArrayListRenderer(theme))
1101
+ },
1102
+ {
1103
+ tester: rankWith(RANK, isObjectControl),
1104
+ renderer: markRaw(NuxtUiObjectRenderer)
1105
+ },
1106
+ // Primitive controls
1107
+ {
1108
+ tester: rankWith(RANK, isMultiLineControl),
1109
+ renderer: markRaw(NuxtUiTextareaControl)
1110
+ },
1111
+ {
1112
+ tester: rankWith(RANK, isNumberControl),
1113
+ renderer: markRaw(NuxtUiNumberControl)
1114
+ },
1115
+ {
1116
+ tester: rankWith(RANK, isIntegerControl),
1117
+ renderer: markRaw(NuxtUiIntegerControl)
1118
+ },
1119
+ {
1120
+ tester: rankWith(RANK, isBooleanControl),
1121
+ renderer: markRaw(createNuxtUiBooleanControl(theme))
1122
+ },
1123
+ {
1124
+ // Multi-enum must outrank generic array renderer and string renderer.
1125
+ tester: rankWith(ENUM_RANK, isMultiEnumControl),
1126
+ renderer: markRaw(NuxtUiMultiEnumControl)
1127
+ },
1128
+ {
1129
+ // oneOf with const+title (display labels) - same as enum for rendering.
1130
+ tester: rankWith(ENUM_RANK, isOneOfEnumControl),
1131
+ renderer: markRaw(NuxtUiEnumControl)
1132
+ },
1133
+ {
1134
+ // Enum must outrank the generic string control, otherwise enums render
1135
+ // as freeform text inputs.
1136
+ tester: rankWith(ENUM_RANK, isEnumControl),
1137
+ renderer: markRaw(NuxtUiEnumControl)
1138
+ },
1139
+ {
1140
+ tester: rankWith(PASSWORD_RANK, and(isStringControl, formatIs("password"))),
1141
+ renderer: markRaw(NuxtUiPasswordControl)
1142
+ },
1143
+ {
1144
+ tester: rankWith(RANK, isStringControl),
1145
+ renderer: markRaw(NuxtUiStringControl)
1146
+ }
1147
+ ];
1148
+ }
1149
+ var nuxtUiRenderers = createNuxtUiRenderers();
1101
1150
  export {
1151
+ createNuxtUiRenderers,
1152
+ defaultTheme,
1153
+ mergeTheme,
1102
1154
  nuxtUiRenderers
1103
1155
  };
1104
1156
  //# sourceMappingURL=index.js.map