@josercl/form-maker 1.2.0 → 1.3.1-beta1

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.
@@ -1,15 +1,16 @@
1
1
  <script>
2
2
  import { h } from 'vue';
3
3
 
4
- export default {
5
- props: {
6
- id: {
7
- type: String,
8
- default: null,
9
- },
10
- },
11
- setup(props, { slots, attrs }) {
12
- return () => h('label', { ...attrs, for: props.id }, slots.default());
4
+ function FormMakerInputLabel(props, { slots, attrs }) {
5
+ return h('label', { ...attrs, for: props.id }, slots.default());
6
+ }
7
+
8
+ FormMakerInputLabel.props = {
9
+ id: {
10
+ type: String,
11
+ default: null,
13
12
  },
14
13
  };
14
+
15
+ export default FormMakerInputLabel;
15
16
  </script>
@@ -0,0 +1,23 @@
1
+ import { inject } from 'vue';
2
+
3
+ const useFormClasses = () => {
4
+ const labelClass = inject('labelClass', null);
5
+ const inputClass = inject('inputClass', null);
6
+ const inputWrapperClass = inject('inputWrapperClass', null);
7
+ const inputGroupClass = inject('inputGroupClass', null);
8
+ const inputErrorClass = inject('inputErrorClass', null);
9
+ const errorClass = inject('errorClass', null);
10
+ const helpTextClass = inject('helpTextClass', null);
11
+
12
+ return {
13
+ labelClass,
14
+ inputClass,
15
+ inputWrapperClass,
16
+ inputGroupClass,
17
+ inputErrorClass,
18
+ errorClass,
19
+ helpTextClass,
20
+ };
21
+ };
22
+
23
+ export default useFormClasses;
@@ -0,0 +1,14 @@
1
+ import { computed } from 'vue';
2
+ import type {WritableComputedRef} from "vue";
3
+
4
+ type PropGetter<T> = () => T
5
+
6
+ type Emitter = (event: string, ...args: any[]) => void
7
+
8
+ export default function useVModel<T>(getter: PropGetter<T>, emit: Emitter, propName?: string): WritableComputedRef<T> {
9
+ const fixedPropName = propName ?? 'modelValue'
10
+ return computed({
11
+ get: () => getter(),
12
+ set: (value: T) => emit(`update:${fixedPropName}`, value),
13
+ });
14
+ }
@@ -1,16 +1,18 @@
1
- import FormMakerComponent from './lib/components/FormMaker.vue';
2
- import FormMakerInput from './lib/components/FormMakerInput.vue';
3
- import CheckboxInput from './lib/components/inputs/CheckboxInput.vue';
4
- import FileInput from './lib/components/inputs/FileInput.vue';
5
- import FormMakerInputError from './lib/components/texts/FormMakerInputError.vue';
6
- import FormMakerInputHelp from './lib/components/texts/FormMakerInputHelp.vue';
7
- import FormMakerInputLabel from './lib/components/texts/FormMakerInputLabel.vue';
8
- import RadioInput from './lib/components/inputs/RadioInput.vue';
9
- import SelectInput from './lib/components/inputs/SelectInput.vue';
10
- import TextAreaInput from './lib/components/inputs/TextAreaInput.vue';
11
- import BasicInput from './lib/components/inputs/BasicInput.vue';
1
+ import FormMakerComponent from './components/FormMaker.vue';
2
+ import FormMakerInput from './components/FormMakerInput.vue';
3
+ import CheckboxInput from './components/inputs/CheckboxInput.vue';
4
+ import FileInput from './components/inputs/FileInput.vue';
5
+ import FormMakerInputError from './components/SimpleComponent';
6
+ import FormMakerInputHelp from './components/SimpleComponent';
7
+ import FormMakerInputLabel from './components/texts/FormMakerInputLabel.vue';
8
+ import RadioInput from './components/inputs/RadioInput.vue';
9
+ import SelectInput from './components/inputs/SelectInput.vue';
10
+ import TextAreaInput from './components/inputs/TextAreaInput.vue';
11
+ import BasicInput from './components/inputs/BasicInput.vue';
12
+ import type { FormMakerPluginOptions } from './model';
13
+ import type { App, Plugin } from 'vue';
12
14
 
13
- const defaultOptions = {
15
+ const defaultOptions: FormMakerPluginOptions = {
14
16
  classes: {
15
17
  'form-row': 'form-maker-row',
16
18
  'form-column': 'form-maker-column',
@@ -51,8 +53,8 @@ const defaultOptions = {
51
53
  },
52
54
  };
53
55
 
54
- const FormMaker = {
55
- install: (app, extraOptions = {}) => {
56
+ const FormMaker: Plugin = {
57
+ install: (app: App, extraOptions: FormMakerPluginOptions) => {
56
58
  const options = {
57
59
  classes: { ...defaultOptions.classes, ...extraOptions.classes },
58
60
  components: {
package/lib/model.d.ts ADDED
@@ -0,0 +1,58 @@
1
+ import type {Component, FunctionalComponent, InputHTMLAttributes} from "vue";
2
+
3
+ declare module '@josercl/form-maker' {
4
+ import FormMaker from ".";
5
+ export default FormMaker
6
+ }
7
+
8
+ export interface FormMakerPluginOptions {
9
+ classes?: Record<string, string>,
10
+ components?: Record<string, Component | FunctionalComponent | VNode>
11
+ }
12
+
13
+ export interface InputType {
14
+ id?: string | null
15
+ name: string
16
+ type?: string | null
17
+ label?: string | null
18
+ columnClass?: string | null
19
+ }
20
+
21
+ export interface FormMakerProps {
22
+ loading?: boolean
23
+ hasActions?: boolean
24
+ modelValue: Record<string, any>
25
+ fields: InputType[][],
26
+ hideDivider?: boolean
27
+ rowClass?: string | null
28
+ columnClass?: string | null
29
+ labelClass?: string | null
30
+ inputGroupClass?: string | null
31
+ inputWrapperClass?: string | null
32
+ inputErrorClass?: string | null
33
+ inputClass?: string | null
34
+ errorClass?: string | null
35
+ helpTextClass?: string | null
36
+ submitButtonClass?: string | null
37
+ submitButtonText?: string | null
38
+ }
39
+
40
+ export interface FormMakerInputProps extends /* @vue-ignore */ InputHTMLAttributes{
41
+ loading?: boolean | undefined
42
+ modelValue: any,
43
+ error?: string | undefined
44
+ helpText?: string | undefined
45
+ label?: string | undefined
46
+ type?: string,
47
+ rules?: RuleValidator[]
48
+ }
49
+
50
+ export interface SelectOption {
51
+ label: string | undefined
52
+ value: any
53
+ }
54
+
55
+ export interface RuleValidator {
56
+ message: string
57
+ validator: (val: any) => boolean
58
+ }
@@ -0,0 +1 @@
1
+ declare module '*.vue'
package/package.json CHANGED
@@ -1,46 +1,61 @@
1
1
  {
2
2
  "name": "@josercl/form-maker",
3
- "version": "1.2.0",
3
+ "version": "1.3.1-beta1",
4
+ "type": "module",
4
5
  "description": "Form generator using vue 3",
5
6
  "author": "Jose Carrero <josercl@gmail.com>",
7
+ "main": "./dist/index.umd.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./lib/model.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "lib"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.umd.cjs"
18
+ }
19
+ },
20
+ "homepage": "https://josercl.gitlab.io/form-maker",
6
21
  "scripts": {
7
- "docs": "vite -c docs.config.js dev --port 9090",
8
22
  "dev": "vite -c dev.config.js dev",
9
- "build": "vite build",
23
+ "docs": "vite -c docs.config.js dev --port 9090",
24
+ "build": "run-p type-check build-only",
10
25
  "build-docs": "vite -c docs.config.js build",
11
26
  "preview": "vite -c docs.config.js preview --port 5050",
12
- "lint": "eslint --ext .vue,.js lib/ docs/ dev/ index.js --fix"
27
+ "build-only": "vite build",
28
+ "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false",
29
+ "lint": "eslint --ext .vue,.js,.ts lib/ docs/ dev/ --fix"
13
30
  },
14
- "main": "./index.js",
15
- "files": [
16
- "index.js",
17
- "lib/**",
18
- "umd/*.js"
19
- ],
20
- "homepage": "https://josercl.gitlab.io/form-maker",
21
31
  "dependencies": {
22
32
  "vue": "^3.3.4"
23
33
  },
24
34
  "devDependencies": {
25
- "@babel/core": "^7.17.5",
26
- "@babel/eslint-parser": "^7.17.0",
27
35
  "@fortawesome/fontawesome-svg-core": "^1.2.32",
28
36
  "@fortawesome/free-brands-svg-icons": "^5.15.1",
29
37
  "@fortawesome/free-regular-svg-icons": "^5.15.1",
30
38
  "@fortawesome/vue-fontawesome": "^3.0.0-2",
31
- "@tailwindcss/forms": "^0.4.0",
32
- "@tailwindcss/typography": "^0.5.2",
33
- "@vitejs/plugin-vue": "^2.2.2",
34
- "@vue/eslint-config-airbnb": "^6.0.0",
35
- "autoprefixer": "^10.4.2",
36
- "cssnano": "^5.1.14",
37
- "eslint": "^8.10.0",
38
- "eslint-plugin-vue": "^8.5.0",
39
+ "@rushstack/eslint-patch": "^1.2.0",
40
+ "@tailwindcss/forms": "^0.5.4",
41
+ "@tailwindcss/typography": "^0.5.9",
42
+ "@tsconfig/node18": "^2.0.1",
43
+ "@types/node": "^18.16.17",
44
+ "@vitejs/plugin-vue": "^4.2.3",
45
+ "@vue/eslint-config-typescript": "^11.0.3",
46
+ "@vue/tsconfig": "^0.4.0",
47
+ "autoprefixer": "^10.4.14",
48
+ "eslint": "^8.39.0",
49
+ "eslint-plugin-vue": "^9.11.0",
39
50
  "highlight.js": "^10.2.1",
40
- "postcss": "^8.4.7",
41
- "tailwindcss": "^3.0.23",
42
- "vite": "^2.8.4",
43
- "vue-router": "^4.2.4"
51
+ "npm-run-all": "^4.1.5",
52
+ "postcss": "^8.4.26",
53
+ "rollup-plugin-typescript2": "^0.35.0",
54
+ "tailwindcss": "^3.3.3",
55
+ "typescript": "~5.0.4",
56
+ "vite": "^4.3.9",
57
+ "vue-router": "^4.2.2",
58
+ "vue-tsc": "^1.6.5"
44
59
  },
45
60
  "keywords": [
46
61
  "vue 3",
@@ -1,37 +0,0 @@
1
- import { inject } from 'vue';
2
-
3
- export const injectFormClasses = () => {
4
- const labelClass = inject('labelClass', null);
5
- const inputClass = inject('inputClass', null);
6
- const inputWrapperClass = inject('inputWrapperClass', null);
7
- const inputGroupClass = inject('inputGroupClass', null);
8
- const inputErrorClass = inject('inputErrorClass', null);
9
- const errorClass = inject('errorClass', null);
10
- const helpTextClass = inject('helpTextClass', null);
11
-
12
- return {
13
- labelClass,
14
- inputClass,
15
- inputWrapperClass,
16
- inputGroupClass,
17
- inputErrorClass,
18
- errorClass,
19
- helpTextClass,
20
- };
21
- };
22
-
23
- export const FormInputMixin = {
24
- emits: [ 'update:modelValue' ],
25
- props: {
26
- loading: { type: Boolean, default: false },
27
- disabled: { type: Boolean, default: false },
28
- modelValue: { default: null },
29
- error: { type: String, default: null },
30
- helpText: { type: String, default: null },
31
- id: { type: String, default: null },
32
- label: { type: String, default: null },
33
- name: { type: String, default: null },
34
- placeholder: { type: String, default: null },
35
- type: { type: String, default: 'text' },
36
- },
37
- };
@@ -1,5 +0,0 @@
1
- <script>
2
- import simpleComponent from '../../utils.js';
3
-
4
- export default simpleComponent();
5
- </script>
@@ -1,5 +0,0 @@
1
- <script>
2
- import simpleComponent from '../../utils.js';
3
-
4
- export default simpleComponent();
5
- </script>
@@ -1,8 +0,0 @@
1
- import { computed } from 'vue';
2
-
3
- export default function useVModel(props, emit, propName = 'modelValue') {
4
- return computed({
5
- get: () => props[propName],
6
- set: value => emit(`update:${propName}`, value),
7
- });
8
- }
package/lib/utils.js DELETED
@@ -1,9 +0,0 @@
1
- import { h } from 'vue';
2
-
3
- const simpleComponent = () => ({
4
- setup(props, { slots, attrs }) {
5
- return () => h('div', attrs, slots.default());
6
- },
7
- });
8
-
9
- export default simpleComponent;
package/umd/index.umd.js DELETED
@@ -1 +0,0 @@
1
- (function(e,S){typeof exports=="object"&&typeof module!="undefined"?module.exports=S(require("vue")):typeof define=="function"&&define.amd?define(["vue"],S):(e=typeof globalThis!="undefined"?globalThis:e||self,e.FormMaker=S(e.Vue))})(this,function(e){"use strict";const S=["onSubmit"],A={key:0},O=["disabled"],x={__name:"FormMaker",props:{loading:{type:Boolean,default:!1},hasActions:{type:Boolean,default:!0},modelValue:{type:Object,default:()=>({})},fields:{type:Array,default:()=>[]},hideDivider:{type:Boolean,default:!1},rowClass:{type:String,default:null},columnClass:{type:String,default:null},labelClass:{type:String,default:null},inputGroupClass:{type:String,default:null},inputWrapperClass:{type:String,default:null},inputErrorClass:{type:String,default:null},inputClass:{type:String,default:null},errorClass:{type:String,default:null},helpTextClass:{type:String,default:null},submitButtonClass:{type:String,default:null},submitButtonText:{type:String,default:"Submit"}},emits:["submit","update:modelValue"],setup(r,{emit:o}){const l=r,t=()=>o("submit"),a=e.computed(()=>l.fields.length>0?l.fields.map(i=>{let f=i;return Array.isArray(i)||(f=[i]),f.map(b=>b.id?b:{...b,id:`formMaker_${new Date().getTime()}_${b.name}`})}):Object.keys(l.modelValue).map(i=>[{name:i,label:i,id:`formMaker_${i}`}])),{rowClass:s,columnClass:n,labelClass:k,inputGroupClass:c,inputWrapperClass:h,inputErrorClass:C,inputClass:m,errorClass:y,helpTextClass:g,submitButtonClass:$,modelValue:N}=e.toRefs(l);e.provide("labelClass",k.value||e.inject("form-label")),e.provide("inputGroupClass",c.value||e.inject("input-group")),e.provide("inputWrapperClass",h.value||e.inject("input-wrapper")),e.provide("inputErrorClass",C.value||e.inject("input-error")),e.provide("inputClass",m.value||e.inject("input")),e.provide("errorClass",y.value||e.inject("error")),e.provide("helpTextClass",g.value||e.inject("help-text"));const p=s.value||e.inject("form-row"),V=n.value||e.inject("form-column"),F=$.value||e.inject("submit-button"),T=i=>{const f=i.split(".");let b=N.value;for(let _=0;_<f.length-1;_+=1){const E=b[f[_]];if(!E)break;b=E}return b},w=i=>{const f=i.split(".");return f[f.length-1]};return(i,f)=>{const b=e.resolveComponent("form-maker-input");return e.openBlock(),e.createElementBlock("form",{class:"form-maker",onSubmit:e.withModifiers(t,["prevent"])},[r.loading?e.renderSlot(i.$slots,"loading",{key:0},()=>[e.createTextVNode(" Loading... ")]):e.createCommentVNode("",!0),e.renderSlot(i.$slots,"default",{},()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(_,E)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(p)),key:`fieldRow_${E}`},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_,(B,le)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([e.unref(V),B.columnClass]),key:`field_${E}_${le}`},[e.renderSlot(i.$slots,`${B.name}`,{field:B},()=>[e.createVNode(b,e.mergeProps({modelValue:T(B.name)[w(B.name)],"onUpdate:modelValue":re=>T(B.name)[w(B.name)]=re},B),null,16,["modelValue","onUpdate:modelValue"])])],2))),128))],2))),128))]),e.renderSlot(i.$slots,"extra"),e.renderSlot(i.$slots,"divider",{},()=>[r.hasActions&&!r.hideDivider?(e.openBlock(),e.createElementBlock("hr",A)):e.createCommentVNode("",!0)]),r.hasActions?e.renderSlot(i.$slots,"actions",{key:1},()=>[e.renderSlot(i.$slots,"submit-button",{},()=>[e.createElementVNode("button",{class:e.normalizeClass(e.unref(F)),disabled:r.loading,type:"submit"},e.toDisplayString(r.submitButtonText),11,O)]),e.renderSlot(i.$slots,"extra-buttons")]):e.createCommentVNode("",!0)],40,S)}}},R=(r,o)=>{const l=e.toRaw(o),t=e.ref(null);return e.watch(r,(a,s)=>{if(t.value=null,a!==s)for(let n=0;n<l.length;n+=1){const k=l[n];if(!k.validator(a)){t.value=k.message;break}}},{immediate:!0}),t};function j(r,o,l="modelValue"){return e.computed({get:()=>r[l],set:t=>o(`update:${l}`,t)})}const G=()=>{const r=e.inject("labelClass",null),o=e.inject("inputClass",null),l=e.inject("inputWrapperClass",null),t=e.inject("inputGroupClass",null),a=e.inject("inputErrorClass",null),s=e.inject("errorClass",null),n=e.inject("helpTextClass",null);return{labelClass:r,inputClass:o,inputWrapperClass:l,inputGroupClass:t,inputErrorClass:a,errorClass:s,helpTextClass:n}},d={emits:["update:modelValue"],props:{loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},modelValue:{default:null},error:{type:String,default:null},helpText:{type:String,default:null},id:{type:String,default:null},label:{type:String,default:null},name:{type:String,default:null},placeholder:{type:String,default:null},type:{type:String,default:"text"}}},I=Object.assign({inheritAttrs:!1},{__name:"FormMakerInput",props:{...d.props,rules:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=r,t=j(l,o),{labelClass:a,inputClass:s,inputWrapperClass:n,inputGroupClass:k,inputErrorClass:c,errorClass:h,helpTextClass:C}=G(),m=e.computed(()=>Boolean(l.label)),y=e.computed(()=>Boolean(l.helpText)),g=R(t,l.rules),$=e.computed(()=>Boolean(l.error)||Boolean(g.value)),N=e.computed(()=>l.error?l.error:g.value);return(p,V)=>{const F=e.resolveComponent("form-maker-label"),T=e.resolveComponent("form-maker-help"),w=e.resolveComponent("form-maker-error"),i=e.resolveComponent("rule-evaluator");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass([$.value&&e.unref(c),e.unref(n)])},[p.type!=="checkbox"?e.renderSlot(p.$slots,"label",{key:0},()=>[m.value?(e.openBlock(),e.createBlock(F,{key:0,id:p.id,class:e.normalizeClass(e.unref(a))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.label),1)]),_:1},8,["id","class"])):e.createCommentVNode("",!0)]):e.createCommentVNode("",!0),e.renderSlot(p.$slots,"default",{},()=>[e.createElementVNode("div",{class:e.normalizeClass([e.unref(k),$.value&&e.unref(c)])},[e.renderSlot(p.$slots,"before"),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`form-maker-input-${p.type}`),e.mergeProps({modelValue:e.unref(t),"onUpdate:modelValue":V[0]||(V[0]=f=>e.isRef(t)?t.value=f:null)},{...p.$props,...p.$attrs},{class:[p.type!=="checkbox"&&e.unref(s),$.value&&e.unref(c)],label:p.label}),null,16,["modelValue","class","label"])),e.renderSlot(p.$slots,"after")],2)]),e.renderSlot(p.$slots,"help",{},()=>[y.value?(e.openBlock(),e.createBlock(T,{key:0,class:e.normalizeClass(e.unref(C))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.helpText),1)]),_:1},8,["class"])):e.createCommentVNode("",!0)]),e.renderSlot(p.$slots,"errors",{},()=>[$.value?(e.openBlock(),e.createBlock(w,{key:0,class:e.normalizeClass(e.unref(h))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(N.value),1)]),_:1},8,["class"])):e.createCommentVNode("",!0),r.rules.length?(e.openBlock(),e.createBlock(i,{key:1,rules:r.rules,value:p.modelValue,modelValue:e.unref(g),"onUpdate:modelValue":V[1]||(V[1]=f=>e.isRef(g)?g.value=f:null)},null,8,["rules","value","modelValue"])):e.createCommentVNode("",!0)])],2)}}}),L=["checked","value","onClick"],z={__name:"CheckboxInput",props:{...d.props,options:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=r,{options:t,label:a}=e.toRefs(l),s=e.computed(()=>t.value.length===0),n=e.computed(()=>l.modelValue),k=e.computed(()=>(Array.isArray(n.value)?n.value:[n.value]).filter(m=>!!m)),c=e.computed(()=>s.value?[{label:a.value,value:!0}]:t.value),h=C=>{let m=[...k.value];m.indexOf(C)===-1?m.push(C):m=m.filter(y=>y!==C),s.value?o("update:modelValue",m.length>0):o("update:modelValue",m)};return(C,m)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,(y,g)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${g}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(C.$props,{checked:k.value.indexOf(y.value)!==-1,value:y.value,type:"checkbox",onClick:()=>h(y.value)}),null,16,L),e.createTextVNode(" "+e.toDisplayString(y.label),1)])]))),128))}},P={__name:"FileInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const l=t=>{if(t.target.files.length){const a=t.target.files[0];o("update:modelValue",a)}};return(t,a)=>(e.openBlock(),e.createElementBlock("input",e.mergeProps(t.$props,{type:"file",onChange:l}),null,16))}},D=()=>({setup(r,{slots:o,attrs:l}){return()=>e.h("div",l,o.default())}}),U=D(),W=D(),q={props:{id:{type:String,default:null}},setup(r,{slots:o,attrs:l}){return()=>e.h("label",{...l,for:r.id},o.default())}},H=["checked","value"],J={__name:"RadioInput",props:{...d.props,options:{type:Array,default:()=>[]}},emits:d.emits,setup(r,{emit:o}){const l=t=>o("update:modelValue",t.target.value);return(t,a)=>(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.options,(s,n)=>(e.openBlock(),e.createElementBlock("div",{key:`option_${n}`},[e.createElementVNode("label",null,[e.createElementVNode("input",e.mergeProps(t.$props,{checked:s.value===t.modelValue,value:s.value,type:"radio",onChange:l}),null,16,H),e.createTextVNode(" "+e.toDisplayString(s.label),1)])]))),128))}},K=["id","disabled","name","placeholder"],Q=["label"],X=["value"],Y=["value"],Z={__name:"SelectInput",props:{...d.props,options:{type:Array,default:()=>[]},optionGroups:{type:Object,default:()=>({})}},emits:d.emits,setup(r,{emit:o}){const l=r,t=j(l,o),a=Object.keys(l.optionGroups).length>0,s=e.computed(()=>l.options.map(n=>typeof n=="object"?n:{label:n,value:n}));return(n,k)=>e.withDirectives((e.openBlock(),e.createElementBlock("select",{id:n.id,"onUpdate:modelValue":k[0]||(k[0]=c=>e.isRef(t)?t.value=c:null),disabled:n.disabled,name:n.name,placeholder:n.placeholder},[a?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(r.optionGroups,(c,h)=>(e.openBlock(),e.createElementBlock("optgroup",{key:`optGroup_${h}`,label:h},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c,(C,m)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${m}`,value:m},e.toDisplayString(C),9,X))),128))],8,Q))),128)):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(s.value,(c,h)=>(e.openBlock(),e.createElementBlock("option",{key:`option_${h}`,value:c.value},e.toDisplayString(c.label),9,Y))),128))],8,K)),[[e.vModelSelect,e.unref(t)]])}},v=["id","disabled","name","placeholder"],ee={__name:"TextAreaInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const t=j(r,o);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("textarea",{id:a.id,"onUpdate:modelValue":s[0]||(s[0]=n=>e.isRef(t)?t.value=n:null),disabled:a.disabled,name:a.name,placeholder:a.placeholder},null,8,v)),[[e.vModelText,e.unref(t)]])}},te=["type"],u={__name:"BasicInput",props:d.props,emits:d.emits,setup(r,{emit:o}){const t=j(r,o);return(a,s)=>e.withDirectives((e.openBlock(),e.createElementBlock("input",e.mergeProps({"onUpdate:modelValue":s[0]||(s[0]=n=>e.isRef(t)?t.value=n:null),type:a.type},a.$props),null,16,te)),[[e.vModelDynamic,e.unref(t)]])}},M={classes:{"form-row":"form-maker-row","form-column":"form-maker-column","form-label":"form-maker-label","input-group":"form-maker-input-group","input-wrapper":"form-maker-input-wrapper","input-error":"form-maker-input-error",input:"form-maker-input",error:"form-maker-error","help-text":"form-maker-help-text","submit-button":"form-maker-submit"},components:{"form-maker-input-color":u,"form-maker-input-date":u,"form-maker-input-email":u,"form-maker-input-month":u,"form-maker-input-number":u,"form-maker-input-password":u,"form-maker-input-search":u,"form-maker-input-tel":u,"form-maker-input-time":u,"form-maker-input-text":u,"form-maker-input-url":u,"form-maker-input-week":u,"form-maker-input-range":u,"form-maker-input-file":P,"form-maker-input-textarea":ee,"form-maker-input-select":Z,"form-maker-input-checkbox":z,"form-maker-input-radio":J,"form-maker-label":q,"form-maker-help":W,"form-maker-error":U}};return{install:(r,o={})=>{const l={classes:{...M.classes,...o.classes},components:{...M.components,...o.components}};r.component("FormMaker",x),r.component("FormMakerInput",I),Object.keys(l.classes).forEach(t=>{r.provide(t,l.classes[t])}),Object.keys(l.components).forEach(t=>{r.component(t,l.components[t])})}}});