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.js CHANGED
@@ -1,13 +1,17 @@
1
1
  // src/nuxtUiRenderers.ts
2
2
  import {
3
+ and,
4
+ formatIs,
3
5
  isBooleanControl,
4
6
  isEnumControl,
7
+ isEnumSchema,
5
8
  isIntegerControl,
6
9
  isMultiLineControl,
7
10
  isNumberControl,
8
11
  isObjectControl,
9
12
  isStringControl,
10
13
  rankWith,
14
+ Resolve as Resolve2,
11
15
  schemaTypeIs,
12
16
  uiTypeIs
13
17
  } from "@jsonforms/core";
@@ -459,18 +463,98 @@ var NuxtUiIntegerControl = defineComponent5({
459
463
  }
460
464
  });
461
465
 
462
- // src/renderers/controls/NuxtUiNumberControl.ts
466
+ // src/renderers/controls/NuxtUiMultiEnumControl.ts
463
467
  import { rendererProps as rendererProps6, useJsonFormsControl as useJsonFormsControl4 } from "@jsonforms/vue";
464
468
  import { computed as computed7, defineComponent as defineComponent6, h as h6, resolveComponent as resolveComponent5 } from "vue";
465
- var NuxtUiNumberControl = defineComponent6({
466
- name: "NuxtUiNumberControl",
469
+ function schemaEnumOptions2(schema) {
470
+ if (!schema) return [];
471
+ if (Array.isArray(schema.enum)) {
472
+ return schema.enum.map((v) => ({ label: String(v), value: v }));
473
+ }
474
+ const oneOf = schema.oneOf;
475
+ if (!Array.isArray(oneOf)) return [];
476
+ const out = [];
477
+ for (const entry of oneOf) {
478
+ if (typeof entry !== "object" || entry === null) continue;
479
+ const maybe = entry;
480
+ if (!("const" in maybe)) continue;
481
+ out.push({
482
+ value: maybe.const,
483
+ label: typeof maybe.title === "string" && maybe.title.trim() ? maybe.title : String(maybe.const)
484
+ });
485
+ }
486
+ return out;
487
+ }
488
+ function arrayItemsSchema(schema) {
489
+ if (!schema) return void 0;
490
+ const items = schema.items;
491
+ if (typeof items !== "object" || items === null) return void 0;
492
+ return items;
493
+ }
494
+ var NuxtUiMultiEnumControl = defineComponent6({
495
+ name: "NuxtUiMultiEnumControl",
467
496
  props: rendererProps6(),
468
497
  setup(props) {
469
498
  const { control, handleChange } = useJsonFormsControl4(
470
499
  props
471
500
  );
472
501
  const errorMessage = computed7(() => trimmedOrUndefined(control.value.errors));
473
- const modelValue = computed7(() => {
502
+ const options = computed7(
503
+ () => schemaEnumOptions2(arrayItemsSchema(control.value.schema))
504
+ );
505
+ const selectedValues = computed7({
506
+ get: () => Array.isArray(control.value.data) ? control.value.data : [],
507
+ set: (v) => handleChange(control.value.path, v)
508
+ });
509
+ return () => {
510
+ if (!control.value.visible) return null;
511
+ const UFormField = resolveComponent5("UFormField");
512
+ const USelectMenu = resolveComponent5("USelectMenu");
513
+ return h6(
514
+ "div",
515
+ {},
516
+ h6(
517
+ UFormField,
518
+ {
519
+ label: control.value.label,
520
+ description: control.value.description,
521
+ required: control.value.required,
522
+ error: errorMessage.value
523
+ },
524
+ {
525
+ default: () => h6(USelectMenu, {
526
+ multiple: true,
527
+ modelValue: selectedValues.value,
528
+ items: options.value,
529
+ valueKey: "value",
530
+ labelKey: "label",
531
+ disabled: !control.value.enabled,
532
+ color: errorMessage.value ? "error" : void 0,
533
+ "aria-invalid": Boolean(errorMessage.value),
534
+ placeholder: "Select...",
535
+ "onUpdate:modelValue": (v) => {
536
+ selectedValues.value = Array.isArray(v) ? v : [];
537
+ }
538
+ })
539
+ }
540
+ )
541
+ );
542
+ };
543
+ }
544
+ });
545
+
546
+ // src/renderers/controls/NuxtUiNumberControl.ts
547
+ import { rendererProps as rendererProps7, useJsonFormsControl as useJsonFormsControl5 } from "@jsonforms/vue";
548
+ import { computed as computed8, defineComponent as defineComponent7, h as h7, resolveComponent as resolveComponent6 } from "vue";
549
+ var NuxtUiNumberControl = defineComponent7({
550
+ name: "NuxtUiNumberControl",
551
+ props: rendererProps7(),
552
+ setup(props) {
553
+ const { control, handleChange } = useJsonFormsControl5(
554
+ props
555
+ );
556
+ const errorMessage = computed8(() => trimmedOrUndefined(control.value.errors));
557
+ const modelValue = computed8(() => {
474
558
  const v = control.value.data;
475
559
  return v === null || v === void 0 ? "" : String(v);
476
560
  });
@@ -485,12 +569,12 @@ var NuxtUiNumberControl = defineComponent6({
485
569
  }
486
570
  return () => {
487
571
  if (!control.value.visible) return null;
488
- const UFormField = resolveComponent5("UFormField");
489
- const UInput = resolveComponent5("UInput");
490
- return h6(
572
+ const UFormField = resolveComponent6("UFormField");
573
+ const UInput = resolveComponent6("UInput");
574
+ return h7(
491
575
  "div",
492
576
  {},
493
- h6(
577
+ h7(
494
578
  UFormField,
495
579
  {
496
580
  label: control.value.label,
@@ -499,7 +583,7 @@ var NuxtUiNumberControl = defineComponent6({
499
583
  error: errorMessage.value
500
584
  },
501
585
  {
502
- default: () => h6(UInput, {
586
+ default: () => h7(UInput, {
503
587
  type: "number",
504
588
  inputmode: "decimal",
505
589
  modelValue: modelValue.value,
@@ -515,30 +599,95 @@ var NuxtUiNumberControl = defineComponent6({
515
599
  }
516
600
  });
517
601
 
602
+ // src/renderers/controls/NuxtUiPasswordControl.ts
603
+ import { rendererProps as rendererProps8, useJsonFormsControl as useJsonFormsControl6 } from "@jsonforms/vue";
604
+ import { computed as computed9, defineComponent as defineComponent8, h as h8, ref, resolveComponent as resolveComponent7 } from "vue";
605
+ var NuxtUiPasswordControl = defineComponent8({
606
+ name: "NuxtUiPasswordControl",
607
+ props: rendererProps8(),
608
+ setup(props) {
609
+ const { control, handleChange } = useJsonFormsControl6(
610
+ props
611
+ );
612
+ const errorMessage = computed9(() => trimmedOrUndefined(control.value.errors));
613
+ const showPassword = ref(false);
614
+ const inputType = computed9(() => showPassword.value ? "text" : "password");
615
+ return () => {
616
+ if (!control.value.visible) return null;
617
+ const UFormField = resolveComponent7("UFormField");
618
+ const UInput = resolveComponent7("UInput");
619
+ const UButton = resolveComponent7("UButton");
620
+ return h8(
621
+ "div",
622
+ {},
623
+ h8(
624
+ UFormField,
625
+ {
626
+ label: control.value.label,
627
+ description: control.value.description,
628
+ required: control.value.required,
629
+ error: errorMessage.value
630
+ },
631
+ {
632
+ default: () => h8(
633
+ UInput,
634
+ {
635
+ modelValue: control.value.data ?? "",
636
+ class: "w-full",
637
+ type: inputType.value,
638
+ autocomplete: "current-password",
639
+ disabled: !control.value.enabled,
640
+ color: errorMessage.value ? "error" : void 0,
641
+ "aria-invalid": Boolean(errorMessage.value),
642
+ "onUpdate:modelValue": (v) => handleChange(control.value.path, v)
643
+ },
644
+ {
645
+ trailing: () => h8(UButton, {
646
+ type: "button",
647
+ color: "neutral",
648
+ variant: "ghost",
649
+ square: true,
650
+ icon: showPassword.value ? "i-heroicons-eye-slash" : "i-heroicons-eye",
651
+ "aria-pressed": showPassword.value,
652
+ "aria-label": showPassword.value ? "Hide password" : "Show password",
653
+ disabled: !control.value.enabled,
654
+ onClick: () => {
655
+ showPassword.value = !showPassword.value;
656
+ }
657
+ })
658
+ }
659
+ )
660
+ }
661
+ )
662
+ );
663
+ };
664
+ }
665
+ });
666
+
518
667
  // src/renderers/controls/NuxtUiStringControl.ts
519
- import { rendererProps as rendererProps7, useJsonFormsControl as useJsonFormsControl5 } from "@jsonforms/vue";
668
+ import { rendererProps as rendererProps9, useJsonFormsControl as useJsonFormsControl7 } from "@jsonforms/vue";
520
669
  import {
521
- computed as computed8,
522
- defineComponent as defineComponent7,
523
- h as h7,
524
- resolveComponent as resolveComponent6
670
+ computed as computed10,
671
+ defineComponent as defineComponent9,
672
+ h as h9,
673
+ resolveComponent as resolveComponent8
525
674
  } from "vue";
526
- var NuxtUiStringControl = defineComponent7({
675
+ var NuxtUiStringControl = defineComponent9({
527
676
  name: "NuxtUiStringControl",
528
- props: rendererProps7(),
677
+ props: rendererProps9(),
529
678
  setup(props) {
530
- const { control, handleChange } = useJsonFormsControl5(
679
+ const { control, handleChange } = useJsonFormsControl7(
531
680
  props
532
681
  );
533
- const errorMessage = computed8(() => trimmedOrUndefined(control.value.errors));
682
+ const errorMessage = computed10(() => trimmedOrUndefined(control.value.errors));
534
683
  return () => {
535
684
  if (!control.value.visible) return null;
536
- const UFormField = resolveComponent6("UFormField");
537
- const UInput = resolveComponent6("UInput");
538
- return h7(
685
+ const UFormField = resolveComponent8("UFormField");
686
+ const UInput = resolveComponent8("UInput");
687
+ return h9(
539
688
  "div",
540
689
  {},
541
- h7(
690
+ h9(
542
691
  UFormField,
543
692
  {
544
693
  label: control.value.label,
@@ -547,7 +696,7 @@ var NuxtUiStringControl = defineComponent7({
547
696
  error: errorMessage.value
548
697
  },
549
698
  {
550
- default: () => h7(UInput, {
699
+ default: () => h9(UInput, {
551
700
  modelValue: control.value.data ?? "",
552
701
  class: "w-full",
553
702
  disabled: !control.value.enabled,
@@ -563,24 +712,24 @@ var NuxtUiStringControl = defineComponent7({
563
712
  });
564
713
 
565
714
  // src/renderers/controls/NuxtUiTextareaControl.ts
566
- import { rendererProps as rendererProps8, useJsonFormsControl as useJsonFormsControl6 } from "@jsonforms/vue";
567
- import { computed as computed9, defineComponent as defineComponent8, h as h8, resolveComponent as resolveComponent7 } from "vue";
568
- var NuxtUiTextareaControl = defineComponent8({
715
+ import { rendererProps as rendererProps10, useJsonFormsControl as useJsonFormsControl8 } from "@jsonforms/vue";
716
+ import { computed as computed11, defineComponent as defineComponent10, h as h10, resolveComponent as resolveComponent9 } from "vue";
717
+ var NuxtUiTextareaControl = defineComponent10({
569
718
  name: "NuxtUiTextareaControl",
570
- props: rendererProps8(),
719
+ props: rendererProps10(),
571
720
  setup(props) {
572
- const { control, handleChange } = useJsonFormsControl6(
721
+ const { control, handleChange } = useJsonFormsControl8(
573
722
  props
574
723
  );
575
- const errorMessage = computed9(() => trimmedOrUndefined(control.value.errors));
724
+ const errorMessage = computed11(() => trimmedOrUndefined(control.value.errors));
576
725
  return () => {
577
726
  if (!control.value.visible) return null;
578
- const UFormField = resolveComponent7("UFormField");
579
- const UTextarea = resolveComponent7("UTextarea");
580
- return h8(
727
+ const UFormField = resolveComponent9("UFormField");
728
+ const UTextarea = resolveComponent9("UTextarea");
729
+ return h10(
581
730
  "div",
582
731
  {},
583
- h8(
732
+ h10(
584
733
  UFormField,
585
734
  {
586
735
  label: control.value.label,
@@ -589,7 +738,7 @@ var NuxtUiTextareaControl = defineComponent8({
589
738
  error: errorMessage.value
590
739
  },
591
740
  {
592
- default: () => h8(UTextarea, {
741
+ default: () => h10(UTextarea, {
593
742
  modelValue: control.value.data ?? "",
594
743
  class: "w-full",
595
744
  disabled: !control.value.enabled,
@@ -606,37 +755,37 @@ var NuxtUiTextareaControl = defineComponent8({
606
755
  });
607
756
 
608
757
  // src/renderers/layouts/NuxtUiCategorizationRenderer.ts
609
- import { DispatchRenderer as DispatchRenderer3, rendererProps as rendererProps9, useJsonFormsCategorization } from "@jsonforms/vue";
610
- import { defineComponent as defineComponent9, h as h9 } from "vue";
611
- var NuxtUiCategorizationRenderer = defineComponent9({
758
+ import { DispatchRenderer as DispatchRenderer3, rendererProps as rendererProps11, useJsonFormsCategorization } from "@jsonforms/vue";
759
+ import { defineComponent as defineComponent11, h as h11 } from "vue";
760
+ var NuxtUiCategorizationRenderer = defineComponent11({
612
761
  name: "NuxtUiCategorizationRenderer",
613
762
  components: { DispatchRenderer: DispatchRenderer3 },
614
- props: rendererProps9(),
763
+ props: rendererProps11(),
615
764
  setup(props) {
616
765
  const { layout, categories } = useJsonFormsCategorization(
617
766
  props
618
767
  );
619
768
  return () => {
620
769
  if (!layout.value.visible) return null;
621
- return h9(
770
+ return h11(
622
771
  "div",
623
772
  { class: "flex flex-col gap-6" },
624
773
  categories.map((categoryRef, catIndex) => {
625
774
  const category = categoryRef.value;
626
775
  const elements = category.uischema.elements ?? [];
627
- return h9(
776
+ return h11(
628
777
  "div",
629
778
  { key: `${layout.value.path}-cat-${catIndex}`, class: "flex flex-col gap-3" },
630
779
  [
631
- category.label ? h9("div", { class: "text-sm font-semibold" }, category.label) : null,
632
- h9(
780
+ category.label ? h11("div", { class: "text-sm font-semibold" }, category.label) : null,
781
+ h11(
633
782
  "div",
634
783
  { class: "flex flex-col gap-3" },
635
784
  elements.map(
636
- (element, index) => h9(
785
+ (element, index) => h11(
637
786
  "div",
638
787
  { key: `${category.path}-${index}` },
639
- h9(DispatchRenderer3, {
788
+ h11(DispatchRenderer3, {
640
789
  schema: category.schema,
641
790
  uischema: element,
642
791
  path: category.path,
@@ -656,12 +805,12 @@ var NuxtUiCategorizationRenderer = defineComponent9({
656
805
  });
657
806
 
658
807
  // src/renderers/layouts/NuxtUiCategoryRenderer.ts
659
- import { DispatchRenderer as DispatchRenderer4, rendererProps as rendererProps10, useJsonFormsLayout } from "@jsonforms/vue";
660
- import { defineComponent as defineComponent10, h as h10 } from "vue";
661
- var NuxtUiCategoryRenderer = defineComponent10({
808
+ import { DispatchRenderer as DispatchRenderer4, rendererProps as rendererProps12, useJsonFormsLayout } from "@jsonforms/vue";
809
+ import { defineComponent as defineComponent12, h as h12 } from "vue";
810
+ var NuxtUiCategoryRenderer = defineComponent12({
662
811
  name: "NuxtUiCategoryRenderer",
663
812
  components: { DispatchRenderer: DispatchRenderer4 },
664
- props: rendererProps10(),
813
+ props: rendererProps12(),
665
814
  setup(props) {
666
815
  const { layout } = useJsonFormsLayout(
667
816
  props
@@ -669,16 +818,16 @@ var NuxtUiCategoryRenderer = defineComponent10({
669
818
  return () => {
670
819
  if (!layout.value.visible) return null;
671
820
  const elements = layout.value.uischema.elements ?? [];
672
- return h10("div", { class: "flex flex-col gap-3" }, [
673
- layout.value.label ? h10("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
674
- h10(
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(
675
824
  "div",
676
825
  { class: "flex flex-col gap-3" },
677
826
  elements.map(
678
- (element, index) => h10(
827
+ (element, index) => h12(
679
828
  "div",
680
829
  { key: `${layout.value.path}-${index}` },
681
- h10(DispatchRenderer4, {
830
+ h12(DispatchRenderer4, {
682
831
  schema: layout.value.schema,
683
832
  uischema: element,
684
833
  path: layout.value.path,
@@ -695,12 +844,12 @@ var NuxtUiCategoryRenderer = defineComponent10({
695
844
  });
696
845
 
697
846
  // src/renderers/layouts/NuxtUiGroupRenderer.ts
698
- import { DispatchRenderer as DispatchRenderer5, rendererProps as rendererProps11, useJsonFormsLayout as useJsonFormsLayout2 } from "@jsonforms/vue";
699
- import { defineComponent as defineComponent11, h as h11 } from "vue";
700
- var NuxtUiGroupRenderer = defineComponent11({
847
+ import { DispatchRenderer as DispatchRenderer5, rendererProps as rendererProps13, useJsonFormsLayout as useJsonFormsLayout2 } from "@jsonforms/vue";
848
+ import { defineComponent as defineComponent13, h as h13 } from "vue";
849
+ var NuxtUiGroupRenderer = defineComponent13({
701
850
  name: "NuxtUiGroupRenderer",
702
851
  components: { DispatchRenderer: DispatchRenderer5 },
703
- props: rendererProps11(),
852
+ props: rendererProps13(),
704
853
  setup(props) {
705
854
  const { layout } = useJsonFormsLayout2(
706
855
  props
@@ -708,16 +857,16 @@ var NuxtUiGroupRenderer = defineComponent11({
708
857
  return () => {
709
858
  if (!layout.value.visible) return null;
710
859
  const elements = layout.value.uischema.elements ?? [];
711
- return h11("div", { class: "rounded border p-3" }, [
712
- layout.value.label ? h11("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
713
- h11(
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(
714
863
  "div",
715
864
  { class: "flex flex-col gap-3" },
716
865
  elements.map(
717
- (element, index) => h11(
866
+ (element, index) => h13(
718
867
  "div",
719
868
  { key: `${layout.value.path}-${index}` },
720
- h11(DispatchRenderer5, {
869
+ h13(DispatchRenderer5, {
721
870
  schema: layout.value.schema,
722
871
  uischema: element,
723
872
  path: layout.value.path,
@@ -734,12 +883,12 @@ var NuxtUiGroupRenderer = defineComponent11({
734
883
  });
735
884
 
736
885
  // src/renderers/layouts/NuxtUiHorizontalLayoutRenderer.ts
737
- import { DispatchRenderer as DispatchRenderer6, rendererProps as rendererProps12, useJsonFormsLayout as useJsonFormsLayout3 } from "@jsonforms/vue";
738
- import { defineComponent as defineComponent12, h as h12 } from "vue";
739
- var NuxtUiHorizontalLayoutRenderer = defineComponent12({
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({
740
889
  name: "NuxtUiHorizontalLayoutRenderer",
741
890
  components: { DispatchRenderer: DispatchRenderer6 },
742
- props: rendererProps12(),
891
+ props: rendererProps14(),
743
892
  setup(props) {
744
893
  const { layout } = useJsonFormsLayout3(
745
894
  props
@@ -747,14 +896,14 @@ var NuxtUiHorizontalLayoutRenderer = defineComponent12({
747
896
  return () => {
748
897
  if (!layout.value.visible) return null;
749
898
  const elements = layout.value.uischema.elements ?? [];
750
- return h12(
899
+ return h14(
751
900
  "div",
752
901
  { class: "flex flex-col gap-3 md:flex-row md:flex-wrap" },
753
902
  elements.map(
754
- (element, index) => h12(
903
+ (element, index) => h14(
755
904
  "div",
756
905
  { key: `${layout.value.path}-${index}`, class: "min-w-0 flex-1" },
757
- h12(DispatchRenderer6, {
906
+ h14(DispatchRenderer6, {
758
907
  schema: layout.value.schema,
759
908
  uischema: element,
760
909
  path: layout.value.path,
@@ -770,18 +919,18 @@ var NuxtUiHorizontalLayoutRenderer = defineComponent12({
770
919
  });
771
920
 
772
921
  // src/renderers/layouts/NuxtUiLabelRenderer.ts
773
- import { rendererProps as rendererProps13, useJsonFormsLabel } from "@jsonforms/vue";
774
- import { defineComponent as defineComponent13, h as h13 } from "vue";
775
- var NuxtUiLabelRenderer = defineComponent13({
922
+ import { rendererProps as rendererProps15, useJsonFormsLabel } from "@jsonforms/vue";
923
+ import { defineComponent as defineComponent15, h as h15 } from "vue";
924
+ var NuxtUiLabelRenderer = defineComponent15({
776
925
  name: "NuxtUiLabelRenderer",
777
- props: rendererProps13(),
926
+ props: rendererProps15(),
778
927
  setup(props) {
779
928
  const { label } = useJsonFormsLabel(
780
929
  props
781
930
  );
782
931
  return () => {
783
932
  if (!label.value.visible) return null;
784
- return h13(
933
+ return h15(
785
934
  "div",
786
935
  { class: "text-sm text-gray-600 dark:text-gray-300" },
787
936
  label.value.text
@@ -791,12 +940,12 @@ var NuxtUiLabelRenderer = defineComponent13({
791
940
  });
792
941
 
793
942
  // src/renderers/layouts/NuxtUiVerticalLayoutRenderer.ts
794
- import { DispatchRenderer as DispatchRenderer7, rendererProps as rendererProps14, useJsonFormsLayout as useJsonFormsLayout4 } from "@jsonforms/vue";
795
- import { defineComponent as defineComponent14, h as h14 } from "vue";
796
- var NuxtUiVerticalLayoutRenderer = defineComponent14({
943
+ import { DispatchRenderer as DispatchRenderer7, rendererProps as rendererProps16, useJsonFormsLayout as useJsonFormsLayout4 } from "@jsonforms/vue";
944
+ import { defineComponent as defineComponent16, h as h16 } from "vue";
945
+ var NuxtUiVerticalLayoutRenderer = defineComponent16({
797
946
  name: "NuxtUiVerticalLayoutRenderer",
798
947
  components: { DispatchRenderer: DispatchRenderer7 },
799
- props: rendererProps14(),
948
+ props: rendererProps16(),
800
949
  setup(props) {
801
950
  const { layout } = useJsonFormsLayout4(
802
951
  props
@@ -804,14 +953,14 @@ var NuxtUiVerticalLayoutRenderer = defineComponent14({
804
953
  return () => {
805
954
  if (!layout.value.visible) return null;
806
955
  const elements = layout.value.uischema.elements ?? [];
807
- return h14(
956
+ return h16(
808
957
  "div",
809
958
  { class: "flex flex-col gap-3" },
810
959
  elements.map(
811
- (element, index) => h14(
960
+ (element, index) => h16(
812
961
  "div",
813
962
  { key: `${layout.value.path}-${index}` },
814
- h14(DispatchRenderer7, {
963
+ h16(DispatchRenderer7, {
815
964
  schema: layout.value.schema,
816
965
  uischema: element,
817
966
  path: layout.value.path,
@@ -829,6 +978,28 @@ var NuxtUiVerticalLayoutRenderer = defineComponent14({
829
978
  // src/nuxtUiRenderers.ts
830
979
  var RANK = 10;
831
980
  var ENUM_RANK = RANK + 1;
981
+ var PASSWORD_RANK = ENUM_RANK + 1;
982
+ var isMultiEnumControl = (uischema, schema, context) => {
983
+ if (!uiTypeIs("Control")(uischema, schema, context)) {
984
+ return false;
985
+ }
986
+ const scope = uischema?.scope;
987
+ if (typeof scope !== "string") return false;
988
+ const rootSchema = context?.rootSchema ?? schema;
989
+ let resolved;
990
+ try {
991
+ resolved = Resolve2.schema(schema, scope, rootSchema);
992
+ } catch {
993
+ return false;
994
+ }
995
+ if (resolved?.type !== "array") return false;
996
+ const items = resolved?.items;
997
+ if (!items) return false;
998
+ if (Array.isArray(items)) return false;
999
+ if (typeof items !== "object" || items === null) return false;
1000
+ const resolvedItems = "$ref" in items && typeof items.$ref === "string" ? Resolve2.schema(rootSchema, items.$ref, rootSchema) : items;
1001
+ return isEnumSchema(resolvedItems);
1002
+ };
832
1003
  var nuxtUiRenderers = [
833
1004
  // Layouts
834
1005
  {
@@ -881,12 +1052,21 @@ var nuxtUiRenderers = [
881
1052
  tester: rankWith(RANK, isBooleanControl),
882
1053
  renderer: markRaw(NuxtUiBooleanControl)
883
1054
  },
1055
+ {
1056
+ // Multi-enum must outrank generic array renderer and string renderer.
1057
+ tester: rankWith(ENUM_RANK, isMultiEnumControl),
1058
+ renderer: markRaw(NuxtUiMultiEnumControl)
1059
+ },
884
1060
  {
885
1061
  // Enum must outrank the generic string control, otherwise enums can render
886
1062
  // as freeform text inputs.
887
1063
  tester: rankWith(ENUM_RANK, isEnumControl),
888
1064
  renderer: markRaw(NuxtUiEnumControl)
889
1065
  },
1066
+ {
1067
+ tester: rankWith(PASSWORD_RANK, and(isStringControl, formatIs("password"))),
1068
+ renderer: markRaw(NuxtUiPasswordControl)
1069
+ },
890
1070
  {
891
1071
  tester: rankWith(RANK, isStringControl),
892
1072
  renderer: markRaw(NuxtUiStringControl)