jsonforms-nuxt-ui-renderers 0.1.4 → 0.1.6

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.cjs CHANGED
@@ -26,7 +26,7 @@ module.exports = __toCommonJS(index_exports);
26
26
 
27
27
  // src/nuxtUiRenderers.ts
28
28
  var import_core3 = require("@jsonforms/core");
29
- var import_vue30 = require("vue");
29
+ var import_vue34 = require("vue");
30
30
 
31
31
  // src/renderers/complex/NuxtUiArrayListRenderer.ts
32
32
  var import_core = require("@jsonforms/core");
@@ -464,18 +464,98 @@ var NuxtUiIntegerControl = (0, import_vue11.defineComponent)({
464
464
  }
465
465
  });
466
466
 
467
- // src/renderers/controls/NuxtUiNumberControl.ts
467
+ // src/renderers/controls/NuxtUiMultiEnumControl.ts
468
468
  var import_vue12 = require("@jsonforms/vue");
469
469
  var import_vue13 = require("vue");
470
- var NuxtUiNumberControl = (0, import_vue13.defineComponent)({
471
- name: "NuxtUiNumberControl",
470
+ function schemaEnumOptions2(schema) {
471
+ if (!schema) return [];
472
+ if (Array.isArray(schema.enum)) {
473
+ return schema.enum.map((v) => ({ label: String(v), value: v }));
474
+ }
475
+ const oneOf = schema.oneOf;
476
+ if (!Array.isArray(oneOf)) return [];
477
+ const out = [];
478
+ for (const entry of oneOf) {
479
+ if (typeof entry !== "object" || entry === null) continue;
480
+ const maybe = entry;
481
+ if (!("const" in maybe)) continue;
482
+ out.push({
483
+ value: maybe.const,
484
+ label: typeof maybe.title === "string" && maybe.title.trim() ? maybe.title : String(maybe.const)
485
+ });
486
+ }
487
+ return out;
488
+ }
489
+ function arrayItemsSchema(schema) {
490
+ if (!schema) return void 0;
491
+ const items = schema.items;
492
+ if (typeof items !== "object" || items === null) return void 0;
493
+ return items;
494
+ }
495
+ var NuxtUiMultiEnumControl = (0, import_vue13.defineComponent)({
496
+ name: "NuxtUiMultiEnumControl",
472
497
  props: (0, import_vue12.rendererProps)(),
473
498
  setup(props) {
474
499
  const { control, handleChange } = (0, import_vue12.useJsonFormsControl)(
475
500
  props
476
501
  );
477
502
  const errorMessage = (0, import_vue13.computed)(() => trimmedOrUndefined(control.value.errors));
478
- const modelValue = (0, import_vue13.computed)(() => {
503
+ const options = (0, import_vue13.computed)(
504
+ () => schemaEnumOptions2(arrayItemsSchema(control.value.schema))
505
+ );
506
+ const selectedValues = (0, import_vue13.computed)({
507
+ get: () => Array.isArray(control.value.data) ? control.value.data : [],
508
+ set: (v) => handleChange(control.value.path, v)
509
+ });
510
+ return () => {
511
+ if (!control.value.visible) return null;
512
+ const UFormField = (0, import_vue13.resolveComponent)("UFormField");
513
+ const USelectMenu = (0, import_vue13.resolveComponent)("USelectMenu");
514
+ return (0, import_vue13.h)(
515
+ "div",
516
+ {},
517
+ (0, import_vue13.h)(
518
+ UFormField,
519
+ {
520
+ label: control.value.label,
521
+ description: control.value.description,
522
+ required: control.value.required,
523
+ error: errorMessage.value
524
+ },
525
+ {
526
+ default: () => (0, import_vue13.h)(USelectMenu, {
527
+ multiple: true,
528
+ modelValue: selectedValues.value,
529
+ items: options.value,
530
+ valueKey: "value",
531
+ labelKey: "label",
532
+ disabled: !control.value.enabled,
533
+ color: errorMessage.value ? "error" : void 0,
534
+ "aria-invalid": Boolean(errorMessage.value),
535
+ placeholder: "Select...",
536
+ "onUpdate:modelValue": (v) => {
537
+ selectedValues.value = Array.isArray(v) ? v : [];
538
+ }
539
+ })
540
+ }
541
+ )
542
+ );
543
+ };
544
+ }
545
+ });
546
+
547
+ // src/renderers/controls/NuxtUiNumberControl.ts
548
+ var import_vue14 = require("@jsonforms/vue");
549
+ var import_vue15 = require("vue");
550
+ var NuxtUiNumberControl = (0, import_vue15.defineComponent)({
551
+ name: "NuxtUiNumberControl",
552
+ props: (0, import_vue14.rendererProps)(),
553
+ setup(props) {
554
+ const { control, handleChange } = (0, import_vue14.useJsonFormsControl)(
555
+ props
556
+ );
557
+ const errorMessage = (0, import_vue15.computed)(() => trimmedOrUndefined(control.value.errors));
558
+ const modelValue = (0, import_vue15.computed)(() => {
479
559
  const v = control.value.data;
480
560
  return v === null || v === void 0 ? "" : String(v);
481
561
  });
@@ -490,12 +570,12 @@ var NuxtUiNumberControl = (0, import_vue13.defineComponent)({
490
570
  }
491
571
  return () => {
492
572
  if (!control.value.visible) return null;
493
- const UFormField = (0, import_vue13.resolveComponent)("UFormField");
494
- const UInput = (0, import_vue13.resolveComponent)("UInput");
495
- return (0, import_vue13.h)(
573
+ const UFormField = (0, import_vue15.resolveComponent)("UFormField");
574
+ const UInput = (0, import_vue15.resolveComponent)("UInput");
575
+ return (0, import_vue15.h)(
496
576
  "div",
497
577
  {},
498
- (0, import_vue13.h)(
578
+ (0, import_vue15.h)(
499
579
  UFormField,
500
580
  {
501
581
  label: control.value.label,
@@ -504,7 +584,7 @@ var NuxtUiNumberControl = (0, import_vue13.defineComponent)({
504
584
  error: errorMessage.value
505
585
  },
506
586
  {
507
- default: () => (0, import_vue13.h)(UInput, {
587
+ default: () => (0, import_vue15.h)(UInput, {
508
588
  type: "number",
509
589
  inputmode: "decimal",
510
590
  modelValue: modelValue.value,
@@ -520,25 +600,90 @@ var NuxtUiNumberControl = (0, import_vue13.defineComponent)({
520
600
  }
521
601
  });
522
602
 
603
+ // src/renderers/controls/NuxtUiPasswordControl.ts
604
+ var import_vue16 = require("@jsonforms/vue");
605
+ var import_vue17 = require("vue");
606
+ var NuxtUiPasswordControl = (0, import_vue17.defineComponent)({
607
+ name: "NuxtUiPasswordControl",
608
+ props: (0, import_vue16.rendererProps)(),
609
+ setup(props) {
610
+ const { control, handleChange } = (0, import_vue16.useJsonFormsControl)(
611
+ props
612
+ );
613
+ const errorMessage = (0, import_vue17.computed)(() => trimmedOrUndefined(control.value.errors));
614
+ const showPassword = (0, import_vue17.ref)(false);
615
+ const inputType = (0, import_vue17.computed)(() => showPassword.value ? "text" : "password");
616
+ return () => {
617
+ if (!control.value.visible) return null;
618
+ const UFormField = (0, import_vue17.resolveComponent)("UFormField");
619
+ const UInput = (0, import_vue17.resolveComponent)("UInput");
620
+ const UButton = (0, import_vue17.resolveComponent)("UButton");
621
+ return (0, import_vue17.h)(
622
+ "div",
623
+ {},
624
+ (0, import_vue17.h)(
625
+ UFormField,
626
+ {
627
+ label: control.value.label,
628
+ description: control.value.description,
629
+ required: control.value.required,
630
+ error: errorMessage.value
631
+ },
632
+ {
633
+ default: () => (0, import_vue17.h)(
634
+ UInput,
635
+ {
636
+ modelValue: control.value.data ?? "",
637
+ class: "w-full",
638
+ type: inputType.value,
639
+ autocomplete: "current-password",
640
+ disabled: !control.value.enabled,
641
+ color: errorMessage.value ? "error" : void 0,
642
+ "aria-invalid": Boolean(errorMessage.value),
643
+ "onUpdate:modelValue": (v) => handleChange(control.value.path, v)
644
+ },
645
+ {
646
+ trailing: () => (0, import_vue17.h)(UButton, {
647
+ type: "button",
648
+ color: "neutral",
649
+ variant: "ghost",
650
+ square: true,
651
+ icon: showPassword.value ? "i-heroicons-eye-slash" : "i-heroicons-eye",
652
+ "aria-pressed": showPassword.value,
653
+ "aria-label": showPassword.value ? "Hide password" : "Show password",
654
+ disabled: !control.value.enabled,
655
+ onClick: () => {
656
+ showPassword.value = !showPassword.value;
657
+ }
658
+ })
659
+ }
660
+ )
661
+ }
662
+ )
663
+ );
664
+ };
665
+ }
666
+ });
667
+
523
668
  // src/renderers/controls/NuxtUiStringControl.ts
524
- var import_vue14 = require("@jsonforms/vue");
525
- var import_vue15 = require("vue");
526
- var NuxtUiStringControl = (0, import_vue15.defineComponent)({
669
+ var import_vue18 = require("@jsonforms/vue");
670
+ var import_vue19 = require("vue");
671
+ var NuxtUiStringControl = (0, import_vue19.defineComponent)({
527
672
  name: "NuxtUiStringControl",
528
- props: (0, import_vue14.rendererProps)(),
673
+ props: (0, import_vue18.rendererProps)(),
529
674
  setup(props) {
530
- const { control, handleChange } = (0, import_vue14.useJsonFormsControl)(
675
+ const { control, handleChange } = (0, import_vue18.useJsonFormsControl)(
531
676
  props
532
677
  );
533
- const errorMessage = (0, import_vue15.computed)(() => trimmedOrUndefined(control.value.errors));
678
+ const errorMessage = (0, import_vue19.computed)(() => trimmedOrUndefined(control.value.errors));
534
679
  return () => {
535
680
  if (!control.value.visible) return null;
536
- const UFormField = (0, import_vue15.resolveComponent)("UFormField");
537
- const UInput = (0, import_vue15.resolveComponent)("UInput");
538
- return (0, import_vue15.h)(
681
+ const UFormField = (0, import_vue19.resolveComponent)("UFormField");
682
+ const UInput = (0, import_vue19.resolveComponent)("UInput");
683
+ return (0, import_vue19.h)(
539
684
  "div",
540
685
  {},
541
- (0, import_vue15.h)(
686
+ (0, import_vue19.h)(
542
687
  UFormField,
543
688
  {
544
689
  label: control.value.label,
@@ -547,7 +692,7 @@ var NuxtUiStringControl = (0, import_vue15.defineComponent)({
547
692
  error: errorMessage.value
548
693
  },
549
694
  {
550
- default: () => (0, import_vue15.h)(UInput, {
695
+ default: () => (0, import_vue19.h)(UInput, {
551
696
  modelValue: control.value.data ?? "",
552
697
  class: "w-full",
553
698
  disabled: !control.value.enabled,
@@ -563,24 +708,24 @@ var NuxtUiStringControl = (0, import_vue15.defineComponent)({
563
708
  });
564
709
 
565
710
  // src/renderers/controls/NuxtUiTextareaControl.ts
566
- var import_vue16 = require("@jsonforms/vue");
567
- var import_vue17 = require("vue");
568
- var NuxtUiTextareaControl = (0, import_vue17.defineComponent)({
711
+ var import_vue20 = require("@jsonforms/vue");
712
+ var import_vue21 = require("vue");
713
+ var NuxtUiTextareaControl = (0, import_vue21.defineComponent)({
569
714
  name: "NuxtUiTextareaControl",
570
- props: (0, import_vue16.rendererProps)(),
715
+ props: (0, import_vue20.rendererProps)(),
571
716
  setup(props) {
572
- const { control, handleChange } = (0, import_vue16.useJsonFormsControl)(
717
+ const { control, handleChange } = (0, import_vue20.useJsonFormsControl)(
573
718
  props
574
719
  );
575
- const errorMessage = (0, import_vue17.computed)(() => trimmedOrUndefined(control.value.errors));
720
+ const errorMessage = (0, import_vue21.computed)(() => trimmedOrUndefined(control.value.errors));
576
721
  return () => {
577
722
  if (!control.value.visible) return null;
578
- const UFormField = (0, import_vue17.resolveComponent)("UFormField");
579
- const UTextarea = (0, import_vue17.resolveComponent)("UTextarea");
580
- return (0, import_vue17.h)(
723
+ const UFormField = (0, import_vue21.resolveComponent)("UFormField");
724
+ const UTextarea = (0, import_vue21.resolveComponent)("UTextarea");
725
+ return (0, import_vue21.h)(
581
726
  "div",
582
727
  {},
583
- (0, import_vue17.h)(
728
+ (0, import_vue21.h)(
584
729
  UFormField,
585
730
  {
586
731
  label: control.value.label,
@@ -589,7 +734,7 @@ var NuxtUiTextareaControl = (0, import_vue17.defineComponent)({
589
734
  error: errorMessage.value
590
735
  },
591
736
  {
592
- default: () => (0, import_vue17.h)(UTextarea, {
737
+ default: () => (0, import_vue21.h)(UTextarea, {
593
738
  modelValue: control.value.data ?? "",
594
739
  class: "w-full",
595
740
  disabled: !control.value.enabled,
@@ -606,37 +751,37 @@ var NuxtUiTextareaControl = (0, import_vue17.defineComponent)({
606
751
  });
607
752
 
608
753
  // src/renderers/layouts/NuxtUiCategorizationRenderer.ts
609
- var import_vue18 = require("@jsonforms/vue");
610
- var import_vue19 = require("vue");
611
- var NuxtUiCategorizationRenderer = (0, import_vue19.defineComponent)({
754
+ var import_vue22 = require("@jsonforms/vue");
755
+ var import_vue23 = require("vue");
756
+ var NuxtUiCategorizationRenderer = (0, import_vue23.defineComponent)({
612
757
  name: "NuxtUiCategorizationRenderer",
613
- components: { DispatchRenderer: import_vue18.DispatchRenderer },
614
- props: (0, import_vue18.rendererProps)(),
758
+ components: { DispatchRenderer: import_vue22.DispatchRenderer },
759
+ props: (0, import_vue22.rendererProps)(),
615
760
  setup(props) {
616
- const { layout, categories } = (0, import_vue18.useJsonFormsCategorization)(
761
+ const { layout, categories } = (0, import_vue22.useJsonFormsCategorization)(
617
762
  props
618
763
  );
619
764
  return () => {
620
765
  if (!layout.value.visible) return null;
621
- return (0, import_vue19.h)(
766
+ return (0, import_vue23.h)(
622
767
  "div",
623
768
  { class: "flex flex-col gap-6" },
624
769
  categories.map((categoryRef, catIndex) => {
625
770
  const category = categoryRef.value;
626
771
  const elements = category.uischema.elements ?? [];
627
- return (0, import_vue19.h)(
772
+ return (0, import_vue23.h)(
628
773
  "div",
629
774
  { key: `${layout.value.path}-cat-${catIndex}`, class: "flex flex-col gap-3" },
630
775
  [
631
- category.label ? (0, import_vue19.h)("div", { class: "text-sm font-semibold" }, category.label) : null,
632
- (0, import_vue19.h)(
776
+ category.label ? (0, import_vue23.h)("div", { class: "text-sm font-semibold" }, category.label) : null,
777
+ (0, import_vue23.h)(
633
778
  "div",
634
779
  { class: "flex flex-col gap-3" },
635
780
  elements.map(
636
- (element, index) => (0, import_vue19.h)(
781
+ (element, index) => (0, import_vue23.h)(
637
782
  "div",
638
783
  { key: `${category.path}-${index}` },
639
- (0, import_vue19.h)(import_vue18.DispatchRenderer, {
784
+ (0, import_vue23.h)(import_vue22.DispatchRenderer, {
640
785
  schema: category.schema,
641
786
  uischema: element,
642
787
  path: category.path,
@@ -656,29 +801,29 @@ var NuxtUiCategorizationRenderer = (0, import_vue19.defineComponent)({
656
801
  });
657
802
 
658
803
  // src/renderers/layouts/NuxtUiCategoryRenderer.ts
659
- var import_vue20 = require("@jsonforms/vue");
660
- var import_vue21 = require("vue");
661
- var NuxtUiCategoryRenderer = (0, import_vue21.defineComponent)({
804
+ var import_vue24 = require("@jsonforms/vue");
805
+ var import_vue25 = require("vue");
806
+ var NuxtUiCategoryRenderer = (0, import_vue25.defineComponent)({
662
807
  name: "NuxtUiCategoryRenderer",
663
- components: { DispatchRenderer: import_vue20.DispatchRenderer },
664
- props: (0, import_vue20.rendererProps)(),
808
+ components: { DispatchRenderer: import_vue24.DispatchRenderer },
809
+ props: (0, import_vue24.rendererProps)(),
665
810
  setup(props) {
666
- const { layout } = (0, import_vue20.useJsonFormsLayout)(
811
+ const { layout } = (0, import_vue24.useJsonFormsLayout)(
667
812
  props
668
813
  );
669
814
  return () => {
670
815
  if (!layout.value.visible) return null;
671
816
  const elements = layout.value.uischema.elements ?? [];
672
- return (0, import_vue21.h)("div", { class: "flex flex-col gap-3" }, [
673
- layout.value.label ? (0, import_vue21.h)("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
674
- (0, import_vue21.h)(
817
+ return (0, import_vue25.h)("div", { class: "flex flex-col gap-3" }, [
818
+ layout.value.label ? (0, import_vue25.h)("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
819
+ (0, import_vue25.h)(
675
820
  "div",
676
821
  { class: "flex flex-col gap-3" },
677
822
  elements.map(
678
- (element, index) => (0, import_vue21.h)(
823
+ (element, index) => (0, import_vue25.h)(
679
824
  "div",
680
825
  { key: `${layout.value.path}-${index}` },
681
- (0, import_vue21.h)(import_vue20.DispatchRenderer, {
826
+ (0, import_vue25.h)(import_vue24.DispatchRenderer, {
682
827
  schema: layout.value.schema,
683
828
  uischema: element,
684
829
  path: layout.value.path,
@@ -695,29 +840,29 @@ var NuxtUiCategoryRenderer = (0, import_vue21.defineComponent)({
695
840
  });
696
841
 
697
842
  // src/renderers/layouts/NuxtUiGroupRenderer.ts
698
- var import_vue22 = require("@jsonforms/vue");
699
- var import_vue23 = require("vue");
700
- var NuxtUiGroupRenderer = (0, import_vue23.defineComponent)({
843
+ var import_vue26 = require("@jsonforms/vue");
844
+ var import_vue27 = require("vue");
845
+ var NuxtUiGroupRenderer = (0, import_vue27.defineComponent)({
701
846
  name: "NuxtUiGroupRenderer",
702
- components: { DispatchRenderer: import_vue22.DispatchRenderer },
703
- props: (0, import_vue22.rendererProps)(),
847
+ components: { DispatchRenderer: import_vue26.DispatchRenderer },
848
+ props: (0, import_vue26.rendererProps)(),
704
849
  setup(props) {
705
- const { layout } = (0, import_vue22.useJsonFormsLayout)(
850
+ const { layout } = (0, import_vue26.useJsonFormsLayout)(
706
851
  props
707
852
  );
708
853
  return () => {
709
854
  if (!layout.value.visible) return null;
710
855
  const elements = layout.value.uischema.elements ?? [];
711
- return (0, import_vue23.h)("div", { class: "rounded border p-3" }, [
712
- layout.value.label ? (0, import_vue23.h)("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
713
- (0, import_vue23.h)(
856
+ return (0, import_vue27.h)("div", { class: "rounded border p-3" }, [
857
+ layout.value.label ? (0, import_vue27.h)("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
858
+ (0, import_vue27.h)(
714
859
  "div",
715
860
  { class: "flex flex-col gap-3" },
716
861
  elements.map(
717
- (element, index) => (0, import_vue23.h)(
862
+ (element, index) => (0, import_vue27.h)(
718
863
  "div",
719
864
  { key: `${layout.value.path}-${index}` },
720
- (0, import_vue23.h)(import_vue22.DispatchRenderer, {
865
+ (0, import_vue27.h)(import_vue26.DispatchRenderer, {
721
866
  schema: layout.value.schema,
722
867
  uischema: element,
723
868
  path: layout.value.path,
@@ -734,27 +879,27 @@ var NuxtUiGroupRenderer = (0, import_vue23.defineComponent)({
734
879
  });
735
880
 
736
881
  // src/renderers/layouts/NuxtUiHorizontalLayoutRenderer.ts
737
- var import_vue24 = require("@jsonforms/vue");
738
- var import_vue25 = require("vue");
739
- var NuxtUiHorizontalLayoutRenderer = (0, import_vue25.defineComponent)({
882
+ var import_vue28 = require("@jsonforms/vue");
883
+ var import_vue29 = require("vue");
884
+ var NuxtUiHorizontalLayoutRenderer = (0, import_vue29.defineComponent)({
740
885
  name: "NuxtUiHorizontalLayoutRenderer",
741
- components: { DispatchRenderer: import_vue24.DispatchRenderer },
742
- props: (0, import_vue24.rendererProps)(),
886
+ components: { DispatchRenderer: import_vue28.DispatchRenderer },
887
+ props: (0, import_vue28.rendererProps)(),
743
888
  setup(props) {
744
- const { layout } = (0, import_vue24.useJsonFormsLayout)(
889
+ const { layout } = (0, import_vue28.useJsonFormsLayout)(
745
890
  props
746
891
  );
747
892
  return () => {
748
893
  if (!layout.value.visible) return null;
749
894
  const elements = layout.value.uischema.elements ?? [];
750
- return (0, import_vue25.h)(
895
+ return (0, import_vue29.h)(
751
896
  "div",
752
897
  { class: "flex flex-col gap-3 md:flex-row md:flex-wrap" },
753
898
  elements.map(
754
- (element, index) => (0, import_vue25.h)(
899
+ (element, index) => (0, import_vue29.h)(
755
900
  "div",
756
901
  { key: `${layout.value.path}-${index}`, class: "min-w-0 flex-1" },
757
- (0, import_vue25.h)(import_vue24.DispatchRenderer, {
902
+ (0, import_vue29.h)(import_vue28.DispatchRenderer, {
758
903
  schema: layout.value.schema,
759
904
  uischema: element,
760
905
  path: layout.value.path,
@@ -770,18 +915,18 @@ var NuxtUiHorizontalLayoutRenderer = (0, import_vue25.defineComponent)({
770
915
  });
771
916
 
772
917
  // src/renderers/layouts/NuxtUiLabelRenderer.ts
773
- var import_vue26 = require("@jsonforms/vue");
774
- var import_vue27 = require("vue");
775
- var NuxtUiLabelRenderer = (0, import_vue27.defineComponent)({
918
+ var import_vue30 = require("@jsonforms/vue");
919
+ var import_vue31 = require("vue");
920
+ var NuxtUiLabelRenderer = (0, import_vue31.defineComponent)({
776
921
  name: "NuxtUiLabelRenderer",
777
- props: (0, import_vue26.rendererProps)(),
922
+ props: (0, import_vue30.rendererProps)(),
778
923
  setup(props) {
779
- const { label } = (0, import_vue26.useJsonFormsLabel)(
924
+ const { label } = (0, import_vue30.useJsonFormsLabel)(
780
925
  props
781
926
  );
782
927
  return () => {
783
928
  if (!label.value.visible) return null;
784
- return (0, import_vue27.h)(
929
+ return (0, import_vue31.h)(
785
930
  "div",
786
931
  { class: "text-sm text-gray-600 dark:text-gray-300" },
787
932
  label.value.text
@@ -791,27 +936,27 @@ var NuxtUiLabelRenderer = (0, import_vue27.defineComponent)({
791
936
  });
792
937
 
793
938
  // src/renderers/layouts/NuxtUiVerticalLayoutRenderer.ts
794
- var import_vue28 = require("@jsonforms/vue");
795
- var import_vue29 = require("vue");
796
- var NuxtUiVerticalLayoutRenderer = (0, import_vue29.defineComponent)({
939
+ var import_vue32 = require("@jsonforms/vue");
940
+ var import_vue33 = require("vue");
941
+ var NuxtUiVerticalLayoutRenderer = (0, import_vue33.defineComponent)({
797
942
  name: "NuxtUiVerticalLayoutRenderer",
798
- components: { DispatchRenderer: import_vue28.DispatchRenderer },
799
- props: (0, import_vue28.rendererProps)(),
943
+ components: { DispatchRenderer: import_vue32.DispatchRenderer },
944
+ props: (0, import_vue32.rendererProps)(),
800
945
  setup(props) {
801
- const { layout } = (0, import_vue28.useJsonFormsLayout)(
946
+ const { layout } = (0, import_vue32.useJsonFormsLayout)(
802
947
  props
803
948
  );
804
949
  return () => {
805
950
  if (!layout.value.visible) return null;
806
951
  const elements = layout.value.uischema.elements ?? [];
807
- return (0, import_vue29.h)(
952
+ return (0, import_vue33.h)(
808
953
  "div",
809
954
  { class: "flex flex-col gap-3" },
810
955
  elements.map(
811
- (element, index) => (0, import_vue29.h)(
956
+ (element, index) => (0, import_vue33.h)(
812
957
  "div",
813
958
  { key: `${layout.value.path}-${index}` },
814
- (0, import_vue29.h)(import_vue28.DispatchRenderer, {
959
+ (0, import_vue33.h)(import_vue32.DispatchRenderer, {
815
960
  schema: layout.value.schema,
816
961
  uischema: element,
817
962
  path: layout.value.path,
@@ -829,67 +974,98 @@ var NuxtUiVerticalLayoutRenderer = (0, import_vue29.defineComponent)({
829
974
  // src/nuxtUiRenderers.ts
830
975
  var RANK = 10;
831
976
  var ENUM_RANK = RANK + 1;
977
+ var PASSWORD_RANK = ENUM_RANK + 1;
978
+ var isMultiEnumControl = (uischema, schema, context) => {
979
+ if (!(0, import_core3.uiTypeIs)("Control")(uischema, schema, context)) {
980
+ return false;
981
+ }
982
+ const scope = uischema?.scope;
983
+ if (typeof scope !== "string") return false;
984
+ const rootSchema = context?.rootSchema ?? schema;
985
+ let resolved;
986
+ try {
987
+ resolved = import_core3.Resolve.schema(schema, scope, rootSchema);
988
+ } catch {
989
+ return false;
990
+ }
991
+ if (resolved?.type !== "array") return false;
992
+ const items = resolved?.items;
993
+ if (!items) return false;
994
+ if (Array.isArray(items)) return false;
995
+ if (typeof items !== "object" || items === null) return false;
996
+ const resolvedItems = "$ref" in items && typeof items.$ref === "string" ? import_core3.Resolve.schema(rootSchema, items.$ref, rootSchema) : items;
997
+ return (0, import_core3.isEnumSchema)(resolvedItems);
998
+ };
832
999
  var nuxtUiRenderers = [
833
1000
  // Layouts
834
1001
  {
835
1002
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("VerticalLayout")),
836
- renderer: (0, import_vue30.markRaw)(NuxtUiVerticalLayoutRenderer)
1003
+ renderer: (0, import_vue34.markRaw)(NuxtUiVerticalLayoutRenderer)
837
1004
  },
838
1005
  {
839
1006
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("HorizontalLayout")),
840
- renderer: (0, import_vue30.markRaw)(NuxtUiHorizontalLayoutRenderer)
1007
+ renderer: (0, import_vue34.markRaw)(NuxtUiHorizontalLayoutRenderer)
841
1008
  },
842
1009
  {
843
1010
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("Group")),
844
- renderer: (0, import_vue30.markRaw)(NuxtUiGroupRenderer)
1011
+ renderer: (0, import_vue34.markRaw)(NuxtUiGroupRenderer)
845
1012
  },
846
1013
  {
847
1014
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("Categorization")),
848
- renderer: (0, import_vue30.markRaw)(NuxtUiCategorizationRenderer)
1015
+ renderer: (0, import_vue34.markRaw)(NuxtUiCategorizationRenderer)
849
1016
  },
850
1017
  {
851
1018
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("Category")),
852
- renderer: (0, import_vue30.markRaw)(NuxtUiCategoryRenderer)
1019
+ renderer: (0, import_vue34.markRaw)(NuxtUiCategoryRenderer)
853
1020
  },
854
1021
  {
855
1022
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.uiTypeIs)("Label")),
856
- renderer: (0, import_vue30.markRaw)(NuxtUiLabelRenderer)
1023
+ renderer: (0, import_vue34.markRaw)(NuxtUiLabelRenderer)
857
1024
  },
858
1025
  // Complex schemas
859
1026
  {
860
1027
  tester: (0, import_core3.rankWith)(RANK, (0, import_core3.schemaTypeIs)("array")),
861
- renderer: (0, import_vue30.markRaw)(NuxtUiArrayListRenderer)
1028
+ renderer: (0, import_vue34.markRaw)(NuxtUiArrayListRenderer)
862
1029
  },
863
1030
  {
864
1031
  tester: (0, import_core3.rankWith)(RANK, import_core3.isObjectControl),
865
- renderer: (0, import_vue30.markRaw)(NuxtUiObjectRenderer)
1032
+ renderer: (0, import_vue34.markRaw)(NuxtUiObjectRenderer)
866
1033
  },
867
1034
  // Primitive controls
868
1035
  {
869
1036
  tester: (0, import_core3.rankWith)(RANK, import_core3.isMultiLineControl),
870
- renderer: (0, import_vue30.markRaw)(NuxtUiTextareaControl)
1037
+ renderer: (0, import_vue34.markRaw)(NuxtUiTextareaControl)
871
1038
  },
872
1039
  {
873
1040
  tester: (0, import_core3.rankWith)(RANK, import_core3.isNumberControl),
874
- renderer: (0, import_vue30.markRaw)(NuxtUiNumberControl)
1041
+ renderer: (0, import_vue34.markRaw)(NuxtUiNumberControl)
875
1042
  },
876
1043
  {
877
1044
  tester: (0, import_core3.rankWith)(RANK, import_core3.isIntegerControl),
878
- renderer: (0, import_vue30.markRaw)(NuxtUiIntegerControl)
1045
+ renderer: (0, import_vue34.markRaw)(NuxtUiIntegerControl)
879
1046
  },
880
1047
  {
881
1048
  tester: (0, import_core3.rankWith)(RANK, import_core3.isBooleanControl),
882
- renderer: (0, import_vue30.markRaw)(NuxtUiBooleanControl)
1049
+ renderer: (0, import_vue34.markRaw)(NuxtUiBooleanControl)
1050
+ },
1051
+ {
1052
+ // Multi-enum must outrank generic array renderer and string renderer.
1053
+ tester: (0, import_core3.rankWith)(ENUM_RANK, isMultiEnumControl),
1054
+ renderer: (0, import_vue34.markRaw)(NuxtUiMultiEnumControl)
883
1055
  },
884
1056
  {
885
1057
  // Enum must outrank the generic string control, otherwise enums can render
886
1058
  // as freeform text inputs.
887
1059
  tester: (0, import_core3.rankWith)(ENUM_RANK, import_core3.isEnumControl),
888
- renderer: (0, import_vue30.markRaw)(NuxtUiEnumControl)
1060
+ renderer: (0, import_vue34.markRaw)(NuxtUiEnumControl)
1061
+ },
1062
+ {
1063
+ tester: (0, import_core3.rankWith)(PASSWORD_RANK, (0, import_core3.and)(import_core3.isStringControl, (0, import_core3.formatIs)("password"))),
1064
+ renderer: (0, import_vue34.markRaw)(NuxtUiPasswordControl)
889
1065
  },
890
1066
  {
891
1067
  tester: (0, import_core3.rankWith)(RANK, import_core3.isStringControl),
892
- renderer: (0, import_vue30.markRaw)(NuxtUiStringControl)
1068
+ renderer: (0, import_vue34.markRaw)(NuxtUiStringControl)
893
1069
  }
894
1070
  ];
895
1071
  // Annotate the CommonJS export names for ESM import in node: