@iziui/react 0.0.97-rc → 0.0.99-rc

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,10 +1,8 @@
1
1
  import { InputHTMLAttributes, CSSProperties } from 'react';
2
- export type InputType = 'text' | 'password' | 'number' | 'date' | 'month' | 'tel';
3
- export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {
2
+ export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
4
3
  error?: boolean;
5
4
  label?: string;
6
5
  helperText?: string;
7
- type?: InputType;
8
6
  width?: CSSProperties['width'];
9
7
  endIcon?: React.JSX.Element | boolean;
10
8
  startIcon?: React.JSX.Element | boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/fields/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoD,aAAa,EAAE,MAAM,OAAO,CAAC;AASlH,OAAO,qCAAqC,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAElF,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;CACzC;;AAsED,wBAAsC"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../../src/fields/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoD,aAAa,EAAE,MAAM,OAAO,CAAC;AASlH,OAAO,qCAAqC,CAAC;AAE7C,MAAM,WAAW,UAAW,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;CACzC;;AAsED,wBAAsC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Input.stories.d.ts","sourceRoot":"","sources":["../../../../src/fields/Input/Input.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOlD,OAAO,KAAyB,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAW7C,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,KAAK,CA6B3C,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,KAAK,CAMxC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAM7C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAM7C,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,KAAK,CAaxC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAE7C,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,CA8G5B,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Input.stories.d.ts","sourceRoot":"","sources":["../../../../src/fields/Input/Input.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOlD,OAAO,KAAK,MAAM,SAAS,CAAC;AAE5B,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAc7C,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,KAAK,CA6B3C,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,KAAK,CAMxC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAM7C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAM7C,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,KAAK,CAaxC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,OAAO,KAAK,CAE7C,CAAC;AAEF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,CA8G5B,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -3,4 +3,7 @@ export { default as Control } from './Control';
3
3
  export { default as useForm } from './useForm';
4
4
  export { default as useControl } from './useControl';
5
5
  export { default as useFormGroup } from './useFormGroup';
6
+ export { default as FormGroup } from './FormGroup';
7
+ export { default as FormControl } from './FormControl';
8
+ export * from './AbstractControl';
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lab/Form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lab/Form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,cAAc,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabContent.d.ts","sourceRoot":"","sources":["../../../../src/navigation/Tabs/TabContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACrE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,mDAUzF"}
1
+ {"version":3,"file":"TabContent.d.ts","sourceRoot":"","sources":["../../../../src/navigation/Tabs/TabContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACrE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,mDAQzF"}
@@ -0,0 +1,2 @@
1
+ "use strict";const l=require("react"),c=require("react/jsx-runtime"),f=l.createContext(null);function b({formGroup:s,debug:t=!1,children:r,...e}){const n=u=>{u.preventDefault(),s.submit()};return c.jsxs(f,{value:s,children:[c.jsx("form",{...e,style:{width:"100%",...e.style},onSubmit:n,noValidate:!0,children:r}),t&&c.jsx("pre",{style:{width:"100%",maxHeight:350,padding:15,borderRadius:4,overflow:"auto",color:"#333",background:"#e5e5e5",boxShadow:"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)"},children:JSON.stringify(s,null,2)})]})}function v(){const s=l.useContext(f);if(!s)throw new Error("useFormGroup must be used inside <FormProvider> (or <Form />).");return s}function m(s){const t=v();return{control:t.controls[s],update:n=>{t.setValues(u=>(u[s]=n,u))}}}function C({controlName:s,field:t,action:r="input"}){const{control:e,update:n}=m(s);return(i=>{const a=o=>["radio","checkbox"].includes(o.type)?o.target.checked:o.target.value;return l.cloneElement(i,{onBlur:o=>{r==="blur"&&n(a(o)),i.props.onBlur&&i.props.onBlur(o)},onInput:o=>{r==="input"&&n(a(o)),i.props.onInput&&i.props.onInput(o)},onChange:o=>{r==="change"&&n(a(o)),i.props.onChange&&i.props.onChange(o)}})})(t(e))}class h{constructor(t,r,e){this.controls=t,this.handle=r,this.validator=e}controls;handle;validator;_valid=!1;_hydrate;get hydrate(){return this._hydrate}set hydrate(t){this._hydrate=t}get isValid(){return this._valid}set isValid(t){this._valid=t}get errors(){return Object.values(this.controls).filter(t=>t.error)}get values(){const t={};return this.eachControl((r,e)=>({[e]:r.value})).forEach(r=>{for(const e in r)t[e]=r[e]}),t}setValues(t){const r=typeof t=="function"?t(this.values):t;for(const e of Object.keys(r))this.controls[e].value=r[e];this.validate(),this.hydrate(this),this.handle.change&&this.handle.change(this)}eachControl(t){return Object.keys(this.controls).map(r=>t(this.controls[r],r))}submit(){this.handle.submit&&(this.eachControl(t=>{t.dirty=!0}),this.validate(),this.hydrate(this),this.handle.submit(this))}reset(){this.eachControl(t=>t.reset()),this.hydrate(this)}validate(){Object.entries(this.controls).map(([t,r])=>{let e=r.validate();this.validator&&this.validator[t]&&(e=this.validator[t](this)||""),r.error=e}),this.isValid=!this.errors.length,this.hydrate(this)}}class y{_value;defaultValue;validators=[];type;error="";dirty=!1;constructor({defaultValue:t,type:r="text",validators:e}){this.type=r,this._value=t,this.defaultValue=t,e&&(this.validators=e)}get value(){return this._value}set value(t){this.dirty=!0,this._value=t,this.validate()}get isInvalid(){return!!(this.dirty&&this.error)}reset(){this.value=this.defaultValue,this.dirty=!1}validate(){const t=this.validators.map(r=>r(this)).filter(Boolean);return this.error=t[0]||"",this.error}}function p(s){return Object.entries(s).reduce((t,r)=>{const e=r[0],n=r[1];return t[e]=new y(n),t},{})}function x({form:s,handle:t,validator:r},e){const[n,u]=l.useState(new h(p(s),t,r));l.useEffect(()=>{u(new h(p(s),t,r))},[...e]);const i=a=>{u(o=>{const g=a.controls,d=new h(g,t,r);return d.hydrate=o.hydrate,d})};return n.hydrate=i,n}exports.Control=C;exports.Form=b;exports.FormControl=y;exports.FormGroup=h;exports.useControl=m;exports.useForm=x;exports.useFormGroup=v;
2
+ //# sourceMappingURL=useForm-CD-_L271.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useForm-BNLOy0E6.cjs","sources":["../../src/lab/Form/Form.tsx","../../src/lab/Form/useFormGroup.ts","../../src/lab/Form/useControl.ts","../../src/lab/Form/Control.tsx","../../src/lab/Form/FormGroup.ts","../../src/lab/Form/FormControl.ts","../../src/lab/Form/useForm.ts"],"sourcesContent":["import { createContext, SubmitEvent, HTMLAttributes } from 'react';\n\nimport type FormGroup from './FormGroup';\n\nexport const FormContext = createContext<FormGroup<any> | null>(null);\n\ninterface FormProps<T extends Record<string, any>> extends HTMLAttributes<HTMLFormElement> {\n formGroup: FormGroup<T>;\n debug?: boolean;\n}\n\nexport default function Form<T extends Record<string, any>>({\n formGroup,\n debug = false,\n children,\n ...props\n}: FormProps<T>) {\n const submit = (event: SubmitEvent<HTMLFormElement>) => {\n event.preventDefault();\n formGroup.submit();\n };\n\n return (\n <FormContext value={formGroup}>\n <form\n {...props}\n style={{ width: '100%', ...props.style }}\n onSubmit={submit}\n noValidate\n >\n {children}\n </form>\n {\n debug && (\n <pre style={{\n width: '100%',\n maxHeight: 350,\n padding: 15,\n borderRadius: 4,\n overflow: 'auto',\n color: '#333',\n background: '#e5e5e5',\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n }}>\n {JSON.stringify(formGroup, null, 2)}\n </pre>\n )\n }\n </FormContext>\n );\n}","import { useContext } from 'react';\n\nimport type FormGroup from './FormGroup';\nimport { FormContext } from './Form';\n\nexport default function useFormGroup<T extends Record<string, any>>() {\n const context = useContext(FormContext);\n\n if (!context) throw new Error('useFormGroup must be used inside <FormProvider> (or <Form />).');\n\n return context as FormGroup<T>;\n}","import useFormGroup from './useFormGroup';\n\nexport default function useControl<\n T extends Record<string, any>,\n K extends keyof T = keyof T,\n>(controlName: K) {\n const formGroup = useFormGroup<T>();\n const control = formGroup.controls[controlName];\n\n const update = (value: T[K]) => {\n formGroup.setValues((data) => {\n data[controlName] = value;\n\n return data;\n });\n };\n\n return { control, update };\n}","import { ChangeEvent, cloneElement, InputEvent, InputHTMLAttributes, ReactElement } from 'react';\n\nimport useControl from './useControl';\nimport type { AbstractControl } from './AbstractControl';\n\ninterface ControlProps<\n T extends Record<string, any>,\n K extends keyof T,\n> {\n controlName: K;\n action?: 'change' | 'input' | 'blur';\n field: (control: AbstractControl<T>[K]) => React.JSX.Element;\n}\n\nexport default function Control<\n T extends Record<string, any>,\n K extends keyof T\n>({\n controlName,\n field,\n action = 'input'\n}: ControlProps<T, K>) {\n const { control, update } = useControl<T, K>(controlName);\n\n const renderChildren = (child: ReactElement<InputHTMLAttributes<HTMLInputElement>>) => {\n const getValue = (e: ChangeEvent<HTMLInputElement> | InputEvent<HTMLInputElement>) => {\n if (['radio', 'checkbox'].includes(e.type)) { return e.target['checked']; }\n\n return e.target['value'];\n };\n\n return cloneElement(child, {\n onBlur: (e) => {\n if (action === 'blur') { update(getValue(e)); };\n\n if (child.props.onBlur) { child.props.onBlur(e); }\n },\n onInput: (e) => {\n if (action === 'input') { update(getValue(e)); };\n\n if (child.props.onInput) { child.props.onInput(e); }\n },\n onChange: (e) => {\n if (action === 'change') { update(getValue(e)); };\n\n if (child.props.onChange) { child.props.onChange(e); }\n },\n });\n };\n\n return (\n renderChildren(field(control))\n );\n}","import type { AbstractControl } from './AbstractControl';\nimport type FormControl from './FormControl';\n\ntype Hydrate<T extends Record<string, any>> = (data: FormGroup<T>) => void;\ntype SetValues<F> = Partial<F> | ((values: F) => Partial<F>);\n\nexport type Validator<T extends Record<string, any>> = Partial<{\n [K in keyof T]: (data: FormGroup<T>) => string | void;\n}>\n\nexport interface Handle<T extends Record<string, any>> {\n change?: (form: FormGroup<T>) => void;\n submit?: (form: FormGroup<T>) => void;\n}\n\nexport default class FormGroup<T extends Record<string, any>> {\n private _valid = false;\n private _hydrate!: Hydrate<T>;\n\n constructor(\n public controls: AbstractControl<T>,\n public handle: Handle<T>,\n public validator?: Validator<T>,\n ) { }\n\n /**\n * Atualiza o estado interno do componente.\n * @private\n * @description Este método é usado internamente pela biblioteca.\n * Para atualizar valores externamente, use {@link setValues}.\n*/\n get hydrate() { return this._hydrate; }\n set hydrate(fn: (values: FormGroup<T>) => any) { this._hydrate = fn; }\n\n get isValid(): boolean { return this._valid; }\n set isValid(validity: boolean) { this._valid = validity; }\n\n get errors() {\n return Object.values<FormControl<T[keyof T]>>(this.controls)\n .filter(c => c.error);\n }\n\n get values(): T {\n const values: Record<string, any> = {};\n\n this.eachControl((control, key) => ({ [key as string]: control.value }))\n .forEach(control => { for (const prop in control) { values[prop] = control[prop]; } });\n\n return values as T;\n }\n\n public setValues(fn: SetValues<T>): void;\n public setValues(partialForm: Partial<T>): void;\n public setValues(arg: Partial<T> | SetValues<T>) {\n const partial =\n typeof arg === 'function'\n ? arg(this.values)\n : arg;\n\n for (const key of Object.keys(partial)) {\n this.controls[key].value = partial[key] as T[keyof T];\n }\n\n this.validate();\n\n this.hydrate(this);\n\n if (!this.handle.change) { return; }\n\n this.handle.change(this);\n }\n\n private eachControl(fn: <K extends keyof T>(control: FormControl<T[K]>, key?: K) => any) {\n return Object.keys(this.controls).map(k => fn(this.controls[k], k));\n }\n\n public submit() {\n if (!this.handle.submit) { return; }\n\n this.eachControl((control) => { control.dirty = true; });\n\n this.validate();\n\n this.hydrate(this);\n this.handle.submit(this);\n }\n\n public reset() {\n this.eachControl((control) => control.reset());\n this.hydrate(this);\n }\n\n public validate() {\n Object.entries(this.controls).map(([key, control]) => {\n let error = control.validate();\n\n if (this.validator && this.validator[key]) {\n error = this.validator[key](this) || '';\n }\n\n control.error = error;\n });\n\n this.isValid = !this.errors.length;\n this.hydrate(this);\n }\n}","type Type = 'text' | 'email';\ntype Validator<C> = (control: FormControl<C>) => string | false | void;\n\ntype Data<T> = {\n defaultValue: T;\n type?: Type;\n validators?: Validator<T>[];\n}\n\nexport type Constructor<V> = ConstructorParameters<typeof FormControl<V>>[number];\n\nexport default class FormControl<V> implements Pick<Data<V>, 'type'> {\n private _value!: V;\n private defaultValue: V;\n private validators: Validator<V>[] = [];\n\n public type: Type;\n public error = '';\n public dirty = false;\n\n constructor({\n defaultValue,\n type = 'text',\n validators,\n }: Data<V>) {\n this.type = type;\n this._value = defaultValue;\n this.defaultValue = defaultValue;\n\n if (validators) { this.validators = validators; }\n }\n\n get value(): V { return this._value; }\n set value(value: V) {\n this.dirty = true;\n this._value = value;\n this.validate();\n }\n\n get isInvalid() { return Boolean(this.dirty && this.error); }\n\n public reset() {\n this.value = this.defaultValue;\n this.dirty = false;\n }\n\n public validate() {\n const errors = this.validators\n .map(v => v(this))\n .filter(Boolean);\n\n this.error = errors[0] || '';\n\n return this.error;\n }\n}\n","import { useEffect, useState } from 'react';\n\nimport FormGroup from './FormGroup';\nimport FormControl from './FormControl';\nimport type { Constructor } from './FormControl';\nimport type { Handle, Validator } from './FormGroup';\nimport type { AbstractControl } from './AbstractControl';\n\ntype UseForm<T extends Record<string, any>> = {\n form: { [K in keyof T]: Constructor<T[K]> };\n handle: Handle<T>;\n validator?: Validator<T>;\n}\n\nfunction makingControls<T extends Record<string, any>>(form: { [K in keyof T]: Constructor<T[K]> }) {\n return Object.entries(form)\n .reduce((acc, data) => {\n const key = data[0] as keyof T;\n const value = data[1] as Constructor<T[keyof T]>;\n\n acc[key] = new FormControl(value);\n\n return acc;\n }, {} as AbstractControl<T>);\n}\n\nexport default function useForm<T extends Record<any, any>>({\n form,\n handle,\n validator\n}: UseForm<T>, deps: readonly unknown[]) {\n const [formGroup, setFormGroup] = useState<FormGroup<T>>(\n new FormGroup(\n makingControls(form),\n handle,\n validator\n )\n );\n\n useEffect(() => {\n setFormGroup(new FormGroup(makingControls(form), handle, validator));\n }, [...deps]);\n\n const hydrate = (form: FormGroup<T>) => {\n setFormGroup(prev => {\n const controls = form.controls;\n\n const newFormGroup = new FormGroup(controls, handle, validator);\n newFormGroup.hydrate = prev.hydrate;\n\n return newFormGroup;\n });\n };\n\n formGroup.hydrate = hydrate;\n\n return formGroup;\n}"],"names":["FormContext","createContext","Form","formGroup","debug","children","props","submit","event","jsxs","jsx","useFormGroup","context","useContext","useControl","controlName","value","data","Control","field","action","control","update","child","getValue","e","cloneElement","FormGroup","controls","handle","validator","fn","validity","c","values","key","prop","arg","partial","k","error","FormControl","defaultValue","type","validators","errors","v","makingControls","form","acc","useForm","deps","setFormGroup","useState","useEffect","hydrate","prev","newFormGroup"],"mappings":"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"}
1
+ {"version":3,"file":"useForm-CD-_L271.cjs","sources":["../../src/lab/Form/Form.tsx","../../src/lab/Form/useFormGroup.ts","../../src/lab/Form/useControl.ts","../../src/lab/Form/Control.tsx","../../src/lab/Form/FormGroup.ts","../../src/lab/Form/FormControl.ts","../../src/lab/Form/useForm.ts"],"sourcesContent":["import { createContext, SubmitEvent, HTMLAttributes } from 'react';\n\nimport type FormGroup from './FormGroup';\n\nexport const FormContext = createContext<FormGroup<any> | null>(null);\n\ninterface FormProps<T extends Record<string, any>> extends HTMLAttributes<HTMLFormElement> {\n formGroup: FormGroup<T>;\n debug?: boolean;\n}\n\nexport default function Form<T extends Record<string, any>>({\n formGroup,\n debug = false,\n children,\n ...props\n}: FormProps<T>) {\n const submit = (event: SubmitEvent<HTMLFormElement>) => {\n event.preventDefault();\n formGroup.submit();\n };\n\n return (\n <FormContext value={formGroup}>\n <form\n {...props}\n style={{ width: '100%', ...props.style }}\n onSubmit={submit}\n noValidate\n >\n {children}\n </form>\n {\n debug && (\n <pre style={{\n width: '100%',\n maxHeight: 350,\n padding: 15,\n borderRadius: 4,\n overflow: 'auto',\n color: '#333',\n background: '#e5e5e5',\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n }}>\n {JSON.stringify(formGroup, null, 2)}\n </pre>\n )\n }\n </FormContext>\n );\n}","import { useContext } from 'react';\n\nimport type FormGroup from './FormGroup';\nimport { FormContext } from './Form';\n\nexport default function useFormGroup<T extends Record<string, any>>() {\n const context = useContext(FormContext);\n\n if (!context) throw new Error('useFormGroup must be used inside <FormProvider> (or <Form />).');\n\n return context as FormGroup<T>;\n}","import useFormGroup from './useFormGroup';\n\nexport default function useControl<\n T extends Record<string, any>,\n K extends keyof T = keyof T,\n>(controlName: K) {\n const formGroup = useFormGroup<T>();\n const control = formGroup.controls[controlName];\n\n const update = (value: T[K]) => {\n formGroup.setValues((data) => {\n data[controlName] = value;\n\n return data;\n });\n };\n\n return { control, update };\n}","import { ChangeEvent, cloneElement, InputEvent, InputHTMLAttributes, ReactElement } from 'react';\n\nimport useControl from './useControl';\nimport type { AbstractControl } from './AbstractControl';\n\ninterface ControlProps<\n T extends Record<string, any>,\n K extends keyof T,\n> {\n controlName: K;\n action?: 'change' | 'input' | 'blur';\n field: (control: AbstractControl<T>[K]) => React.JSX.Element;\n}\n\nexport default function Control<\n T extends Record<string, any>,\n K extends keyof T\n>({\n controlName,\n field,\n action = 'input'\n}: ControlProps<T, K>) {\n const { control, update } = useControl<T, K>(controlName);\n\n const renderChildren = (child: ReactElement<InputHTMLAttributes<HTMLInputElement>>) => {\n const getValue = (e: ChangeEvent<HTMLInputElement> | InputEvent<HTMLInputElement>) => {\n if (['radio', 'checkbox'].includes(e.type)) { return e.target['checked']; }\n\n return e.target['value'];\n };\n\n return cloneElement(child, {\n onBlur: (e) => {\n if (action === 'blur') { update(getValue(e)); };\n\n if (child.props.onBlur) { child.props.onBlur(e); }\n },\n onInput: (e) => {\n if (action === 'input') { update(getValue(e)); };\n\n if (child.props.onInput) { child.props.onInput(e); }\n },\n onChange: (e) => {\n if (action === 'change') { update(getValue(e)); };\n\n if (child.props.onChange) { child.props.onChange(e); }\n },\n });\n };\n\n return (\n renderChildren(field(control))\n );\n}","import type { AbstractControl } from './AbstractControl';\nimport type FormControl from './FormControl';\n\ntype Hydrate<T extends Record<string, any>> = (data: FormGroup<T>) => void;\ntype SetValues<F> = Partial<F> | ((values: F) => Partial<F>);\n\nexport type Validator<T extends Record<string, any>> = Partial<{\n [K in keyof T]: (data: FormGroup<T>) => string | void;\n}>\n\nexport interface Handle<T extends Record<string, any>> {\n change?: (form: FormGroup<T>) => void;\n submit?: (form: FormGroup<T>) => void;\n}\n\nexport default class FormGroup<T extends Record<string, any>> {\n private _valid = false;\n private _hydrate!: Hydrate<T>;\n\n constructor(\n public controls: AbstractControl<T>,\n public handle: Handle<T>,\n public validator?: Validator<T>,\n ) { }\n\n /**\n * Atualiza o estado interno do componente.\n * @private\n * @description Este método é usado internamente pela biblioteca.\n * Para atualizar valores externamente, use {@link setValues}.\n*/\n get hydrate() { return this._hydrate; }\n set hydrate(fn: (values: FormGroup<T>) => any) { this._hydrate = fn; }\n\n get isValid(): boolean { return this._valid; }\n set isValid(validity: boolean) { this._valid = validity; }\n\n get errors() {\n return Object.values<FormControl<T[keyof T]>>(this.controls)\n .filter(c => c.error);\n }\n\n get values(): T {\n const values: Record<string, any> = {};\n\n this.eachControl((control, key) => ({ [key as string]: control.value }))\n .forEach(control => { for (const prop in control) { values[prop] = control[prop]; } });\n\n return values as T;\n }\n\n public setValues(fn: SetValues<T>): void;\n public setValues(partialForm: Partial<T>): void;\n public setValues(arg: Partial<T> | SetValues<T>) {\n const partial =\n typeof arg === 'function'\n ? arg(this.values)\n : arg;\n\n for (const key of Object.keys(partial)) {\n this.controls[key].value = partial[key] as T[keyof T];\n }\n\n this.validate();\n\n this.hydrate(this);\n\n if (!this.handle.change) { return; }\n\n this.handle.change(this);\n }\n\n private eachControl(fn: <K extends keyof T>(control: FormControl<T[K]>, key?: K) => any) {\n return Object.keys(this.controls).map(k => fn(this.controls[k], k));\n }\n\n public submit() {\n if (!this.handle.submit) { return; }\n\n this.eachControl((control) => { control.dirty = true; });\n\n this.validate();\n\n this.hydrate(this);\n this.handle.submit(this);\n }\n\n public reset() {\n this.eachControl((control) => control.reset());\n this.hydrate(this);\n }\n\n public validate() {\n Object.entries(this.controls).map(([key, control]) => {\n let error = control.validate();\n\n if (this.validator && this.validator[key]) {\n error = this.validator[key](this) || '';\n }\n\n control.error = error;\n });\n\n this.isValid = !this.errors.length;\n this.hydrate(this);\n }\n}","type Type = 'text' | 'email';\ntype Validator<C> = (control: FormControl<C>) => string | false | void;\n\ntype Data<T> = {\n defaultValue: T;\n type?: Type;\n validators?: Validator<T>[];\n}\n\nexport type Constructor<V> = ConstructorParameters<typeof FormControl<V>>[number];\n\nexport default class FormControl<V> implements Pick<Data<V>, 'type'> {\n private _value!: V;\n private defaultValue: V;\n private validators: Validator<V>[] = [];\n\n public type: Type;\n public error = '';\n public dirty = false;\n\n constructor({\n defaultValue,\n type = 'text',\n validators,\n }: Data<V>) {\n this.type = type;\n this._value = defaultValue;\n this.defaultValue = defaultValue;\n\n if (validators) { this.validators = validators; }\n }\n\n get value(): V { return this._value; }\n set value(value: V) {\n this.dirty = true;\n this._value = value;\n this.validate();\n }\n\n get isInvalid() { return Boolean(this.dirty && this.error); }\n\n public reset() {\n this.value = this.defaultValue;\n this.dirty = false;\n }\n\n public validate() {\n const errors = this.validators\n .map(v => v(this))\n .filter(Boolean);\n\n this.error = errors[0] || '';\n\n return this.error;\n }\n}\n","import { useEffect, useState } from 'react';\n\nimport FormGroup from './FormGroup';\nimport FormControl from './FormControl';\nimport type { Constructor } from './FormControl';\nimport type { Handle, Validator } from './FormGroup';\nimport type { AbstractControl } from './AbstractControl';\n\ntype UseForm<T extends Record<string, any>> = {\n form: { [K in keyof T]: Constructor<T[K]> };\n handle: Handle<T>;\n validator?: Validator<T>;\n}\n\nfunction makingControls<T extends Record<string, any>>(form: { [K in keyof T]: Constructor<T[K]> }) {\n return Object.entries(form)\n .reduce((acc, data) => {\n const key = data[0] as keyof T;\n const value = data[1] as Constructor<T[keyof T]>;\n\n acc[key] = new FormControl(value);\n\n return acc;\n }, {} as AbstractControl<T>);\n}\n\nexport default function useForm<T extends Record<any, any>>({\n form,\n handle,\n validator\n}: UseForm<T>, deps: readonly unknown[]) {\n const [formGroup, setFormGroup] = useState<FormGroup<T>>(\n new FormGroup(\n makingControls(form),\n handle,\n validator\n )\n );\n\n useEffect(() => {\n setFormGroup(new FormGroup(makingControls(form), handle, validator));\n }, [...deps]);\n\n const hydrate = (form: FormGroup<T>) => {\n setFormGroup(prev => {\n const controls = form.controls;\n\n const newFormGroup = new FormGroup(controls, handle, validator);\n newFormGroup.hydrate = prev.hydrate;\n\n return newFormGroup;\n });\n };\n\n formGroup.hydrate = hydrate;\n\n return formGroup;\n}"],"names":["FormContext","createContext","Form","formGroup","debug","children","props","submit","event","jsxs","jsx","useFormGroup","context","useContext","useControl","controlName","value","data","Control","field","action","control","update","child","getValue","e","cloneElement","FormGroup","controls","handle","validator","fn","validity","c","values","key","prop","arg","partial","k","error","FormControl","defaultValue","type","validators","errors","v","makingControls","form","acc","useForm","deps","setFormGroup","useState","useEffect","hydrate","prev","newFormGroup"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createContext as v,useContext as y,cloneElement as m,useState as g,useEffect as b}from"react";import{jsxs as C,jsx as c}from"react/jsx-runtime";const p=v(null);function j({formGroup:s,debug:t=!1,children:e,...r}){const n=a=>{a.preventDefault(),s.submit()};return C(p,{value:s,children:[c("form",{...r,style:{width:"100%",...r.style},onSubmit:n,noValidate:!0,children:e}),t&&c("pre",{style:{width:"100%",maxHeight:350,padding:15,borderRadius:4,overflow:"auto",color:"#333",background:"#e5e5e5",boxShadow:"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)"},children:JSON.stringify(s,null,2)})]})}function x(){const s=y(p);if(!s)throw new Error("useFormGroup must be used inside <FormProvider> (or <Form />).");return s}function F(s){const t=x();return{control:t.controls[s],update:n=>{t.setValues(a=>(a[s]=n,a))}}}function k({controlName:s,field:t,action:e="input"}){const{control:r,update:n}=F(s);return(i=>{const u=o=>["radio","checkbox"].includes(o.type)?o.target.checked:o.target.value;return m(i,{onBlur:o=>{e==="blur"&&n(u(o)),i.props.onBlur&&i.props.onBlur(o)},onInput:o=>{e==="input"&&n(u(o)),i.props.onInput&&i.props.onInput(o)},onChange:o=>{e==="change"&&n(u(o)),i.props.onChange&&i.props.onChange(o)}})})(t(r))}class l{constructor(t,e,r){this.controls=t,this.handle=e,this.validator=r}controls;handle;validator;_valid=!1;_hydrate;get hydrate(){return this._hydrate}set hydrate(t){this._hydrate=t}get isValid(){return this._valid}set isValid(t){this._valid=t}get errors(){return Object.values(this.controls).filter(t=>t.error)}get values(){const t={};return this.eachControl((e,r)=>({[r]:e.value})).forEach(e=>{for(const r in e)t[r]=e[r]}),t}setValues(t){const e=typeof t=="function"?t(this.values):t;for(const r of Object.keys(e))this.controls[r].value=e[r];this.validate(),this.hydrate(this),this.handle.change&&this.handle.change(this)}eachControl(t){return Object.keys(this.controls).map(e=>t(this.controls[e],e))}submit(){this.handle.submit&&(this.eachControl(t=>{t.dirty=!0}),this.validate(),this.hydrate(this),this.handle.submit(this))}reset(){this.eachControl(t=>t.reset()),this.hydrate(this)}validate(){Object.entries(this.controls).map(([t,e])=>{let r=e.validate();this.validator&&this.validator[t]&&(r=this.validator[t](this)||""),e.error=r}),this.isValid=!this.errors.length,this.hydrate(this)}}class w{_value;defaultValue;validators=[];type;error="";dirty=!1;constructor({defaultValue:t,type:e="text",validators:r}){this.type=e,this._value=t,this.defaultValue=t,r&&(this.validators=r)}get value(){return this._value}set value(t){this.dirty=!0,this._value=t,this.validate()}get isInvalid(){return!!(this.dirty&&this.error)}reset(){this.value=this.defaultValue,this.dirty=!1}validate(){const t=this.validators.map(e=>e(this)).filter(Boolean);return this.error=t[0]||"",this.error}}function d(s){return Object.entries(s).reduce((t,e)=>{const r=e[0],n=e[1];return t[r]=new w(n),t},{})}function O({form:s,handle:t,validator:e},r){const[n,a]=g(new l(d(s),t,e));b(()=>{a(new l(d(s),t,e))},[...r]);const i=u=>{a(o=>{const f=u.controls,h=new l(f,t,e);return h.hydrate=o.hydrate,h})};return n.hydrate=i,n}export{k as C,j as F,O as a,x as b,F as u};
2
- //# sourceMappingURL=useForm-iwGfb88g.js.map
1
+ import{createContext as v,useContext as y,cloneElement as m,useState as g,useEffect as b}from"react";import{jsxs as C,jsx as c}from"react/jsx-runtime";const p=v(null);function j({formGroup:s,debug:t=!1,children:e,...r}){const n=a=>{a.preventDefault(),s.submit()};return C(p,{value:s,children:[c("form",{...r,style:{width:"100%",...r.style},onSubmit:n,noValidate:!0,children:e}),t&&c("pre",{style:{width:"100%",maxHeight:350,padding:15,borderRadius:4,overflow:"auto",color:"#333",background:"#e5e5e5",boxShadow:"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)"},children:JSON.stringify(s,null,2)})]})}function x(){const s=y(p);if(!s)throw new Error("useFormGroup must be used inside <FormProvider> (or <Form />).");return s}function F(s){const t=x();return{control:t.controls[s],update:n=>{t.setValues(a=>(a[s]=n,a))}}}function k({controlName:s,field:t,action:e="input"}){const{control:r,update:n}=F(s);return(i=>{const u=o=>["radio","checkbox"].includes(o.type)?o.target.checked:o.target.value;return m(i,{onBlur:o=>{e==="blur"&&n(u(o)),i.props.onBlur&&i.props.onBlur(o)},onInput:o=>{e==="input"&&n(u(o)),i.props.onInput&&i.props.onInput(o)},onChange:o=>{e==="change"&&n(u(o)),i.props.onChange&&i.props.onChange(o)}})})(t(r))}class l{constructor(t,e,r){this.controls=t,this.handle=e,this.validator=r}controls;handle;validator;_valid=!1;_hydrate;get hydrate(){return this._hydrate}set hydrate(t){this._hydrate=t}get isValid(){return this._valid}set isValid(t){this._valid=t}get errors(){return Object.values(this.controls).filter(t=>t.error)}get values(){const t={};return this.eachControl((e,r)=>({[r]:e.value})).forEach(e=>{for(const r in e)t[r]=e[r]}),t}setValues(t){const e=typeof t=="function"?t(this.values):t;for(const r of Object.keys(e))this.controls[r].value=e[r];this.validate(),this.hydrate(this),this.handle.change&&this.handle.change(this)}eachControl(t){return Object.keys(this.controls).map(e=>t(this.controls[e],e))}submit(){this.handle.submit&&(this.eachControl(t=>{t.dirty=!0}),this.validate(),this.hydrate(this),this.handle.submit(this))}reset(){this.eachControl(t=>t.reset()),this.hydrate(this)}validate(){Object.entries(this.controls).map(([t,e])=>{let r=e.validate();this.validator&&this.validator[t]&&(r=this.validator[t](this)||""),e.error=r}),this.isValid=!this.errors.length,this.hydrate(this)}}class w{_value;defaultValue;validators=[];type;error="";dirty=!1;constructor({defaultValue:t,type:e="text",validators:r}){this.type=e,this._value=t,this.defaultValue=t,r&&(this.validators=r)}get value(){return this._value}set value(t){this.dirty=!0,this._value=t,this.validate()}get isInvalid(){return!!(this.dirty&&this.error)}reset(){this.value=this.defaultValue,this.dirty=!1}validate(){const t=this.validators.map(e=>e(this)).filter(Boolean);return this.error=t[0]||"",this.error}}function d(s){return Object.entries(s).reduce((t,e)=>{const r=e[0],n=e[1];return t[r]=new w(n),t},{})}function O({form:s,handle:t,validator:e},r){const[n,a]=g(new l(d(s),t,e));b(()=>{a(new l(d(s),t,e))},[...r]);const i=u=>{a(o=>{const f=u.controls,h=new l(f,t,e);return h.hydrate=o.hydrate,h})};return n.hydrate=i,n}export{k as C,j as F,w as a,l as b,O as c,x as d,F as u};
2
+ //# sourceMappingURL=useForm-CRRXYOep.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useForm-iwGfb88g.js","sources":["../../src/lab/Form/Form.tsx","../../src/lab/Form/useFormGroup.ts","../../src/lab/Form/useControl.ts","../../src/lab/Form/Control.tsx","../../src/lab/Form/FormGroup.ts","../../src/lab/Form/FormControl.ts","../../src/lab/Form/useForm.ts"],"sourcesContent":["import { createContext, SubmitEvent, HTMLAttributes } from 'react';\n\nimport type FormGroup from './FormGroup';\n\nexport const FormContext = createContext<FormGroup<any> | null>(null);\n\ninterface FormProps<T extends Record<string, any>> extends HTMLAttributes<HTMLFormElement> {\n formGroup: FormGroup<T>;\n debug?: boolean;\n}\n\nexport default function Form<T extends Record<string, any>>({\n formGroup,\n debug = false,\n children,\n ...props\n}: FormProps<T>) {\n const submit = (event: SubmitEvent<HTMLFormElement>) => {\n event.preventDefault();\n formGroup.submit();\n };\n\n return (\n <FormContext value={formGroup}>\n <form\n {...props}\n style={{ width: '100%', ...props.style }}\n onSubmit={submit}\n noValidate\n >\n {children}\n </form>\n {\n debug && (\n <pre style={{\n width: '100%',\n maxHeight: 350,\n padding: 15,\n borderRadius: 4,\n overflow: 'auto',\n color: '#333',\n background: '#e5e5e5',\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n }}>\n {JSON.stringify(formGroup, null, 2)}\n </pre>\n )\n }\n </FormContext>\n );\n}","import { useContext } from 'react';\n\nimport type FormGroup from './FormGroup';\nimport { FormContext } from './Form';\n\nexport default function useFormGroup<T extends Record<string, any>>() {\n const context = useContext(FormContext);\n\n if (!context) throw new Error('useFormGroup must be used inside <FormProvider> (or <Form />).');\n\n return context as FormGroup<T>;\n}","import useFormGroup from './useFormGroup';\n\nexport default function useControl<\n T extends Record<string, any>,\n K extends keyof T = keyof T,\n>(controlName: K) {\n const formGroup = useFormGroup<T>();\n const control = formGroup.controls[controlName];\n\n const update = (value: T[K]) => {\n formGroup.setValues((data) => {\n data[controlName] = value;\n\n return data;\n });\n };\n\n return { control, update };\n}","import { ChangeEvent, cloneElement, InputEvent, InputHTMLAttributes, ReactElement } from 'react';\n\nimport useControl from './useControl';\nimport type { AbstractControl } from './AbstractControl';\n\ninterface ControlProps<\n T extends Record<string, any>,\n K extends keyof T,\n> {\n controlName: K;\n action?: 'change' | 'input' | 'blur';\n field: (control: AbstractControl<T>[K]) => React.JSX.Element;\n}\n\nexport default function Control<\n T extends Record<string, any>,\n K extends keyof T\n>({\n controlName,\n field,\n action = 'input'\n}: ControlProps<T, K>) {\n const { control, update } = useControl<T, K>(controlName);\n\n const renderChildren = (child: ReactElement<InputHTMLAttributes<HTMLInputElement>>) => {\n const getValue = (e: ChangeEvent<HTMLInputElement> | InputEvent<HTMLInputElement>) => {\n if (['radio', 'checkbox'].includes(e.type)) { return e.target['checked']; }\n\n return e.target['value'];\n };\n\n return cloneElement(child, {\n onBlur: (e) => {\n if (action === 'blur') { update(getValue(e)); };\n\n if (child.props.onBlur) { child.props.onBlur(e); }\n },\n onInput: (e) => {\n if (action === 'input') { update(getValue(e)); };\n\n if (child.props.onInput) { child.props.onInput(e); }\n },\n onChange: (e) => {\n if (action === 'change') { update(getValue(e)); };\n\n if (child.props.onChange) { child.props.onChange(e); }\n },\n });\n };\n\n return (\n renderChildren(field(control))\n );\n}","import type { AbstractControl } from './AbstractControl';\nimport type FormControl from './FormControl';\n\ntype Hydrate<T extends Record<string, any>> = (data: FormGroup<T>) => void;\ntype SetValues<F> = Partial<F> | ((values: F) => Partial<F>);\n\nexport type Validator<T extends Record<string, any>> = Partial<{\n [K in keyof T]: (data: FormGroup<T>) => string | void;\n}>\n\nexport interface Handle<T extends Record<string, any>> {\n change?: (form: FormGroup<T>) => void;\n submit?: (form: FormGroup<T>) => void;\n}\n\nexport default class FormGroup<T extends Record<string, any>> {\n private _valid = false;\n private _hydrate!: Hydrate<T>;\n\n constructor(\n public controls: AbstractControl<T>,\n public handle: Handle<T>,\n public validator?: Validator<T>,\n ) { }\n\n /**\n * Atualiza o estado interno do componente.\n * @private\n * @description Este método é usado internamente pela biblioteca.\n * Para atualizar valores externamente, use {@link setValues}.\n*/\n get hydrate() { return this._hydrate; }\n set hydrate(fn: (values: FormGroup<T>) => any) { this._hydrate = fn; }\n\n get isValid(): boolean { return this._valid; }\n set isValid(validity: boolean) { this._valid = validity; }\n\n get errors() {\n return Object.values<FormControl<T[keyof T]>>(this.controls)\n .filter(c => c.error);\n }\n\n get values(): T {\n const values: Record<string, any> = {};\n\n this.eachControl((control, key) => ({ [key as string]: control.value }))\n .forEach(control => { for (const prop in control) { values[prop] = control[prop]; } });\n\n return values as T;\n }\n\n public setValues(fn: SetValues<T>): void;\n public setValues(partialForm: Partial<T>): void;\n public setValues(arg: Partial<T> | SetValues<T>) {\n const partial =\n typeof arg === 'function'\n ? arg(this.values)\n : arg;\n\n for (const key of Object.keys(partial)) {\n this.controls[key].value = partial[key] as T[keyof T];\n }\n\n this.validate();\n\n this.hydrate(this);\n\n if (!this.handle.change) { return; }\n\n this.handle.change(this);\n }\n\n private eachControl(fn: <K extends keyof T>(control: FormControl<T[K]>, key?: K) => any) {\n return Object.keys(this.controls).map(k => fn(this.controls[k], k));\n }\n\n public submit() {\n if (!this.handle.submit) { return; }\n\n this.eachControl((control) => { control.dirty = true; });\n\n this.validate();\n\n this.hydrate(this);\n this.handle.submit(this);\n }\n\n public reset() {\n this.eachControl((control) => control.reset());\n this.hydrate(this);\n }\n\n public validate() {\n Object.entries(this.controls).map(([key, control]) => {\n let error = control.validate();\n\n if (this.validator && this.validator[key]) {\n error = this.validator[key](this) || '';\n }\n\n control.error = error;\n });\n\n this.isValid = !this.errors.length;\n this.hydrate(this);\n }\n}","type Type = 'text' | 'email';\ntype Validator<C> = (control: FormControl<C>) => string | false | void;\n\ntype Data<T> = {\n defaultValue: T;\n type?: Type;\n validators?: Validator<T>[];\n}\n\nexport type Constructor<V> = ConstructorParameters<typeof FormControl<V>>[number];\n\nexport default class FormControl<V> implements Pick<Data<V>, 'type'> {\n private _value!: V;\n private defaultValue: V;\n private validators: Validator<V>[] = [];\n\n public type: Type;\n public error = '';\n public dirty = false;\n\n constructor({\n defaultValue,\n type = 'text',\n validators,\n }: Data<V>) {\n this.type = type;\n this._value = defaultValue;\n this.defaultValue = defaultValue;\n\n if (validators) { this.validators = validators; }\n }\n\n get value(): V { return this._value; }\n set value(value: V) {\n this.dirty = true;\n this._value = value;\n this.validate();\n }\n\n get isInvalid() { return Boolean(this.dirty && this.error); }\n\n public reset() {\n this.value = this.defaultValue;\n this.dirty = false;\n }\n\n public validate() {\n const errors = this.validators\n .map(v => v(this))\n .filter(Boolean);\n\n this.error = errors[0] || '';\n\n return this.error;\n }\n}\n","import { useEffect, useState } from 'react';\n\nimport FormGroup from './FormGroup';\nimport FormControl from './FormControl';\nimport type { Constructor } from './FormControl';\nimport type { Handle, Validator } from './FormGroup';\nimport type { AbstractControl } from './AbstractControl';\n\ntype UseForm<T extends Record<string, any>> = {\n form: { [K in keyof T]: Constructor<T[K]> };\n handle: Handle<T>;\n validator?: Validator<T>;\n}\n\nfunction makingControls<T extends Record<string, any>>(form: { [K in keyof T]: Constructor<T[K]> }) {\n return Object.entries(form)\n .reduce((acc, data) => {\n const key = data[0] as keyof T;\n const value = data[1] as Constructor<T[keyof T]>;\n\n acc[key] = new FormControl(value);\n\n return acc;\n }, {} as AbstractControl<T>);\n}\n\nexport default function useForm<T extends Record<any, any>>({\n form,\n handle,\n validator\n}: UseForm<T>, deps: readonly unknown[]) {\n const [formGroup, setFormGroup] = useState<FormGroup<T>>(\n new FormGroup(\n makingControls(form),\n handle,\n validator\n )\n );\n\n useEffect(() => {\n setFormGroup(new FormGroup(makingControls(form), handle, validator));\n }, [...deps]);\n\n const hydrate = (form: FormGroup<T>) => {\n setFormGroup(prev => {\n const controls = form.controls;\n\n const newFormGroup = new FormGroup(controls, handle, validator);\n newFormGroup.hydrate = prev.hydrate;\n\n return newFormGroup;\n });\n };\n\n formGroup.hydrate = hydrate;\n\n return formGroup;\n}"],"names":["FormContext","createContext","Form","formGroup","debug","children","props","submit","event","jsxs","jsx","useFormGroup","context","useContext","useControl","controlName","value","data","Control","field","action","control","update","child","getValue","e","cloneElement","FormGroup","controls","handle","validator","fn","validity","c","values","key","prop","arg","partial","k","error","FormControl","defaultValue","type","validators","errors","v","makingControls","form","acc","useForm","deps","setFormGroup","useState","useEffect","hydrate","prev","newFormGroup"],"mappings":"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"}
1
+ {"version":3,"file":"useForm-CRRXYOep.js","sources":["../../src/lab/Form/Form.tsx","../../src/lab/Form/useFormGroup.ts","../../src/lab/Form/useControl.ts","../../src/lab/Form/Control.tsx","../../src/lab/Form/FormGroup.ts","../../src/lab/Form/FormControl.ts","../../src/lab/Form/useForm.ts"],"sourcesContent":["import { createContext, SubmitEvent, HTMLAttributes } from 'react';\n\nimport type FormGroup from './FormGroup';\n\nexport const FormContext = createContext<FormGroup<any> | null>(null);\n\ninterface FormProps<T extends Record<string, any>> extends HTMLAttributes<HTMLFormElement> {\n formGroup: FormGroup<T>;\n debug?: boolean;\n}\n\nexport default function Form<T extends Record<string, any>>({\n formGroup,\n debug = false,\n children,\n ...props\n}: FormProps<T>) {\n const submit = (event: SubmitEvent<HTMLFormElement>) => {\n event.preventDefault();\n formGroup.submit();\n };\n\n return (\n <FormContext value={formGroup}>\n <form\n {...props}\n style={{ width: '100%', ...props.style }}\n onSubmit={submit}\n noValidate\n >\n {children}\n </form>\n {\n debug && (\n <pre style={{\n width: '100%',\n maxHeight: 350,\n padding: 15,\n borderRadius: 4,\n overflow: 'auto',\n color: '#333',\n background: '#e5e5e5',\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)',\n }}>\n {JSON.stringify(formGroup, null, 2)}\n </pre>\n )\n }\n </FormContext>\n );\n}","import { useContext } from 'react';\n\nimport type FormGroup from './FormGroup';\nimport { FormContext } from './Form';\n\nexport default function useFormGroup<T extends Record<string, any>>() {\n const context = useContext(FormContext);\n\n if (!context) throw new Error('useFormGroup must be used inside <FormProvider> (or <Form />).');\n\n return context as FormGroup<T>;\n}","import useFormGroup from './useFormGroup';\n\nexport default function useControl<\n T extends Record<string, any>,\n K extends keyof T = keyof T,\n>(controlName: K) {\n const formGroup = useFormGroup<T>();\n const control = formGroup.controls[controlName];\n\n const update = (value: T[K]) => {\n formGroup.setValues((data) => {\n data[controlName] = value;\n\n return data;\n });\n };\n\n return { control, update };\n}","import { ChangeEvent, cloneElement, InputEvent, InputHTMLAttributes, ReactElement } from 'react';\n\nimport useControl from './useControl';\nimport type { AbstractControl } from './AbstractControl';\n\ninterface ControlProps<\n T extends Record<string, any>,\n K extends keyof T,\n> {\n controlName: K;\n action?: 'change' | 'input' | 'blur';\n field: (control: AbstractControl<T>[K]) => React.JSX.Element;\n}\n\nexport default function Control<\n T extends Record<string, any>,\n K extends keyof T\n>({\n controlName,\n field,\n action = 'input'\n}: ControlProps<T, K>) {\n const { control, update } = useControl<T, K>(controlName);\n\n const renderChildren = (child: ReactElement<InputHTMLAttributes<HTMLInputElement>>) => {\n const getValue = (e: ChangeEvent<HTMLInputElement> | InputEvent<HTMLInputElement>) => {\n if (['radio', 'checkbox'].includes(e.type)) { return e.target['checked']; }\n\n return e.target['value'];\n };\n\n return cloneElement(child, {\n onBlur: (e) => {\n if (action === 'blur') { update(getValue(e)); };\n\n if (child.props.onBlur) { child.props.onBlur(e); }\n },\n onInput: (e) => {\n if (action === 'input') { update(getValue(e)); };\n\n if (child.props.onInput) { child.props.onInput(e); }\n },\n onChange: (e) => {\n if (action === 'change') { update(getValue(e)); };\n\n if (child.props.onChange) { child.props.onChange(e); }\n },\n });\n };\n\n return (\n renderChildren(field(control))\n );\n}","import type { AbstractControl } from './AbstractControl';\nimport type FormControl from './FormControl';\n\ntype Hydrate<T extends Record<string, any>> = (data: FormGroup<T>) => void;\ntype SetValues<F> = Partial<F> | ((values: F) => Partial<F>);\n\nexport type Validator<T extends Record<string, any>> = Partial<{\n [K in keyof T]: (data: FormGroup<T>) => string | void;\n}>\n\nexport interface Handle<T extends Record<string, any>> {\n change?: (form: FormGroup<T>) => void;\n submit?: (form: FormGroup<T>) => void;\n}\n\nexport default class FormGroup<T extends Record<string, any>> {\n private _valid = false;\n private _hydrate!: Hydrate<T>;\n\n constructor(\n public controls: AbstractControl<T>,\n public handle: Handle<T>,\n public validator?: Validator<T>,\n ) { }\n\n /**\n * Atualiza o estado interno do componente.\n * @private\n * @description Este método é usado internamente pela biblioteca.\n * Para atualizar valores externamente, use {@link setValues}.\n*/\n get hydrate() { return this._hydrate; }\n set hydrate(fn: (values: FormGroup<T>) => any) { this._hydrate = fn; }\n\n get isValid(): boolean { return this._valid; }\n set isValid(validity: boolean) { this._valid = validity; }\n\n get errors() {\n return Object.values<FormControl<T[keyof T]>>(this.controls)\n .filter(c => c.error);\n }\n\n get values(): T {\n const values: Record<string, any> = {};\n\n this.eachControl((control, key) => ({ [key as string]: control.value }))\n .forEach(control => { for (const prop in control) { values[prop] = control[prop]; } });\n\n return values as T;\n }\n\n public setValues(fn: SetValues<T>): void;\n public setValues(partialForm: Partial<T>): void;\n public setValues(arg: Partial<T> | SetValues<T>) {\n const partial =\n typeof arg === 'function'\n ? arg(this.values)\n : arg;\n\n for (const key of Object.keys(partial)) {\n this.controls[key].value = partial[key] as T[keyof T];\n }\n\n this.validate();\n\n this.hydrate(this);\n\n if (!this.handle.change) { return; }\n\n this.handle.change(this);\n }\n\n private eachControl(fn: <K extends keyof T>(control: FormControl<T[K]>, key?: K) => any) {\n return Object.keys(this.controls).map(k => fn(this.controls[k], k));\n }\n\n public submit() {\n if (!this.handle.submit) { return; }\n\n this.eachControl((control) => { control.dirty = true; });\n\n this.validate();\n\n this.hydrate(this);\n this.handle.submit(this);\n }\n\n public reset() {\n this.eachControl((control) => control.reset());\n this.hydrate(this);\n }\n\n public validate() {\n Object.entries(this.controls).map(([key, control]) => {\n let error = control.validate();\n\n if (this.validator && this.validator[key]) {\n error = this.validator[key](this) || '';\n }\n\n control.error = error;\n });\n\n this.isValid = !this.errors.length;\n this.hydrate(this);\n }\n}","type Type = 'text' | 'email';\ntype Validator<C> = (control: FormControl<C>) => string | false | void;\n\ntype Data<T> = {\n defaultValue: T;\n type?: Type;\n validators?: Validator<T>[];\n}\n\nexport type Constructor<V> = ConstructorParameters<typeof FormControl<V>>[number];\n\nexport default class FormControl<V> implements Pick<Data<V>, 'type'> {\n private _value!: V;\n private defaultValue: V;\n private validators: Validator<V>[] = [];\n\n public type: Type;\n public error = '';\n public dirty = false;\n\n constructor({\n defaultValue,\n type = 'text',\n validators,\n }: Data<V>) {\n this.type = type;\n this._value = defaultValue;\n this.defaultValue = defaultValue;\n\n if (validators) { this.validators = validators; }\n }\n\n get value(): V { return this._value; }\n set value(value: V) {\n this.dirty = true;\n this._value = value;\n this.validate();\n }\n\n get isInvalid() { return Boolean(this.dirty && this.error); }\n\n public reset() {\n this.value = this.defaultValue;\n this.dirty = false;\n }\n\n public validate() {\n const errors = this.validators\n .map(v => v(this))\n .filter(Boolean);\n\n this.error = errors[0] || '';\n\n return this.error;\n }\n}\n","import { useEffect, useState } from 'react';\n\nimport FormGroup from './FormGroup';\nimport FormControl from './FormControl';\nimport type { Constructor } from './FormControl';\nimport type { Handle, Validator } from './FormGroup';\nimport type { AbstractControl } from './AbstractControl';\n\ntype UseForm<T extends Record<string, any>> = {\n form: { [K in keyof T]: Constructor<T[K]> };\n handle: Handle<T>;\n validator?: Validator<T>;\n}\n\nfunction makingControls<T extends Record<string, any>>(form: { [K in keyof T]: Constructor<T[K]> }) {\n return Object.entries(form)\n .reduce((acc, data) => {\n const key = data[0] as keyof T;\n const value = data[1] as Constructor<T[keyof T]>;\n\n acc[key] = new FormControl(value);\n\n return acc;\n }, {} as AbstractControl<T>);\n}\n\nexport default function useForm<T extends Record<any, any>>({\n form,\n handle,\n validator\n}: UseForm<T>, deps: readonly unknown[]) {\n const [formGroup, setFormGroup] = useState<FormGroup<T>>(\n new FormGroup(\n makingControls(form),\n handle,\n validator\n )\n );\n\n useEffect(() => {\n setFormGroup(new FormGroup(makingControls(form), handle, validator));\n }, [...deps]);\n\n const hydrate = (form: FormGroup<T>) => {\n setFormGroup(prev => {\n const controls = form.controls;\n\n const newFormGroup = new FormGroup(controls, handle, validator);\n newFormGroup.hydrate = prev.hydrate;\n\n return newFormGroup;\n });\n };\n\n formGroup.hydrate = hydrate;\n\n return formGroup;\n}"],"names":["FormContext","createContext","Form","formGroup","debug","children","props","submit","event","jsxs","jsx","useFormGroup","context","useContext","useControl","controlName","value","data","Control","field","action","control","update","child","getValue","e","cloneElement","FormGroup","controls","handle","validator","fn","validity","c","values","key","prop","arg","partial","k","error","FormControl","defaultValue","type","validators","errors","v","makingControls","form","acc","useForm","deps","setFormGroup","useState","useEffect","hydrate","prev","newFormGroup"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as C,jsx as _}from"react/jsx-runtime";import{Children as j,useState as k,useRef as x,useMemo as B,useEffect as b,cloneElement as y}from"react";import{p as c}from"./index-CZ41y9Hn.js";import{j as f}from"./joinClass-anSpaauN.js";import{u as R}from"./uuid-dGvr9vBZ.js";import{c as L}from"./createComponent-BmdhWozT.js";import{u as g}from"./useListenerResized-Bnqxrt7k.js";function A(t,n){if(n>t)throw new Error(`Current tab index (${n}) is greater than the number of tabs (${t})`)}function M({children:t,color:n="primary",current:r=0,onChange:i,...o}){const u=j.toArray(t),[a,$]=k(r),d=x([]),T=f(`${c}-tabs`,`${c}-tabs--${n}`,o.className),v=f(`${c}-tabs__marker`,`${c}-tabs__marker--${n}`),m=B(()=>`marker-${R()}`,[]);g(()=>p(),[a]),b(()=>{A(u.length-1,a)},[]),b(()=>{const e=u.findIndex(l=>!l.props.disabled),s=u[r].props.disabled;$(s?e:r)},[r]),b(()=>{p(),N(a)},[a]);const I=e=>{i&&i(e),$(e)},N=e=>{d.current&&d.current[e].scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})},w=(e,s)=>{!d.current||!s||(d.current[e]=s)},p=()=>{const e=document.querySelector(`#tab-${m}-${a}`),s=document.getElementById(m),l=e.offsetWidth,h=e.offsetLeft;s.style.width=`${l}px`,s.style.left=`${h}px`};return C("div",{...o,className:T,children:[u.map((e,s)=>{const l=`tab-${m}-${s}`,h=a===s;return _("div",{ref:E=>w(s,E),style:{width:"100%"},children:y(e,{id:l,tabIndex:s+1,"aria-checked":h,onClick:()=>I(s)})},l)}),_("div",{id:m,className:v})]})}const H=L(M);function J({icon:t,label:n,disabled:r,color:i="primary",...o}){const{"aria-checked":u}=o,a=f(`${c}-tabs__button`,r&&`${c}-tabs__button--disabled`,u&&`${c}-tabs__button--active-${i}`,o.className);return C("button",{type:"button",disabled:r,className:a,...o,children:[t&&y(t,{className:f(`${c}-tabs__button__icon`)}),n]})}function K({children:t,value:n,current:r,...i}){return n===r&&_("div",{...i,children:t})}function O(t){const[n,r]=k(t);return b(()=>{r(t)},[t]),[o=>{r(o)},n]}export{J as T,K as a,H as b,O as u};
2
+ //# sourceMappingURL=useTabs-C10MlXVP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTabs-DG53jo4T.js","sources":["../../src/navigation/Tabs/Tabs.tsx","../../src/navigation/Tabs/TabButton.tsx","../../src/navigation/Tabs/TabContent.tsx","../../src/navigation/Tabs/useTabs.ts"],"sourcesContent":["import { Children, cloneElement, ReactElement, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils';\nimport { Colors } from '@iziui/core/theme';\n\nimport { uuid } from '@iziui/toolkit/uuid';\n\nimport createComponent from '@/core/createComponent';\nimport useListenerResized from '@/hooks/useListenerResized';\n\nimport '@iziui/styles/components/Tabs.scss';\n\nfunction validateCurrent(length: number, current: number) {\n if (current > length) {\n throw new Error(`Current tab index (${current}) is greater than the number of tabs (${length})`);\n }\n}\n\nexport interface TabsProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {\n current?: number;\n color?: Colors;\n children: React.ReactNode;\n onChange?: (index: number) => void;\n};\n\nfunction Tabs({\n children,\n color = 'primary',\n current = 0,\n onChange,\n ...props\n}: TabsProps) {\n const arrayChildren = Children.toArray(children) as ReactElement<TabsProps>[];\n\n const [_current, setCurrent] = useState(current);\n const scrollRef = useRef<HTMLDivElement[] | null>([]);\n\n const cls = joinClass(\n `${prefix}-tabs`,\n `${prefix}-tabs--${color}`,\n props.className\n );\n\n const classNameMarker = joinClass(\n `${prefix}-tabs__marker`,\n `${prefix}-tabs__marker--${color}`,\n );\n\n const id = useMemo(() => `marker-${uuid()}`, []);\n\n useListenerResized(() => setBorderLine(), [_current]);\n\n useEffect(() => { validateCurrent(arrayChildren.length - 1, _current); }, []);\n\n useEffect(() => {\n const firstEnableButton = arrayChildren.findIndex(children => !children.props.disabled);\n const currentIsDisabled = arrayChildren[current].props.disabled;\n\n setCurrent(currentIsDisabled ? firstEnableButton : current);\n }, [current]);\n\n useEffect(() => {\n setBorderLine();\n goToTab(_current);\n }, [_current]);\n\n const handleClick = (index: number) => {\n if (onChange) { onChange(index); };\n setCurrent(index);\n };\n\n const goToTab = (index: number) => {\n if (!scrollRef.current) { return; }\n scrollRef.current[index].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center', });\n };\n\n const setRef = (index: number, ref: HTMLDivElement | null) => {\n if (!scrollRef.current || !ref) { return; }\n\n scrollRef.current[index] = ref;\n };\n\n const setBorderLine = () => {\n const element = document.querySelector(`#tab-${id}-${_current}`) as HTMLElement;\n const el = document.getElementById(id) as HTMLElement;\n\n const width = element['offsetWidth'];\n const left = element['offsetLeft'];\n\n el.style.width = `${width}px`;\n el.style.left = `${left}px`;\n };\n\n const renderChildren = () => {\n return arrayChildren.map((child, index) => {\n const _id = `tab-${id}-${index}`;\n const isActive = _current === index;\n\n return (\n <div key={_id} ref={ref => setRef(index, ref)} style={{ width: '100%' }}>\n {\n cloneElement(child, {\n id: _id,\n tabIndex: index + 1,\n 'aria-checked': isActive,\n onClick: () => handleClick(index),\n })\n }\n </div>\n );\n });\n };\n\n return (\n <div {...props} className={cls}>\n {renderChildren()}\n <div id={id} className={classNameMarker} />\n </div>\n );\n}\n\nexport default createComponent(Tabs);\n","import { cloneElement, HTMLAttributes } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { Colors } from '@iziui/core/theme';\nimport { joinClass } from '@iziui/core/utils';\n\nimport type { IconProps } from '@/display/Icon';\n\nexport interface TabButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: string;\n disabled?: boolean;\n color?: Colors;\n icon?: React.JSX.Element;\n}\n\nexport default function TabButton({ icon, label, disabled, color = 'primary', ...props }: TabButtonProps) {\n const { 'aria-checked': checked } = props;\n\n const className = joinClass(\n `${prefix}-tabs__button`,\n disabled && `${prefix}-tabs__button--disabled`,\n checked && `${prefix}-tabs__button--active-${color}`,\n props.className\n );\n\n const renderIcon = () => {\n return icon && cloneElement<IconProps>(icon, {\n className: joinClass(\n `${prefix}-tabs__button__icon`,\n ),\n });\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className={className}\n {...props}\n >\n {renderIcon()}\n {label}\n </button>\n );\n}","import type { HTMLAttributes } from 'react';\n\nimport Slide from '@/animations/Slide';\n\nexport interface TabContentProps extends HTMLAttributes<HTMLDivElement> {\n children: React.JSX.Element;\n value: number;\n current: number;\n}\n\nexport default function TabContent({ children, value, current, ...props }: TabContentProps) {\n return (\n value === current && (\n <Slide enter direction=\"left\">\n <div {...props}>\n {children}\n </div>\n </Slide>\n )\n );\n}","import { useEffect, useState } from 'react';\n\ntype UseTabs = [(index: number) => void, number]\n\nexport default function useTabs(current: number): UseTabs {\n const [_current, setCurrent] = useState(current);\n\n useEffect(() => { setCurrent(current); }, [current]);\n\n const setTab = (index: number) => { setCurrent(index); };\n\n return [\n setTab,\n _current,\n ];\n}"],"names":["validateCurrent","length","current","Tabs","children","color","onChange","props","arrayChildren","Children","_current","setCurrent","useState","scrollRef","useRef","cls","joinClass","prefix","classNameMarker","id","useMemo","uuid","useListenerResized","setBorderLine","useEffect","firstEnableButton","currentIsDisabled","goToTab","handleClick","index","setRef","ref","element","el","width","left","jsxs","child","_id","isActive","jsx","Tabs_default","createComponent","TabButton","icon","label","disabled","checked","className","cloneElement","TabContent","value","Slide","useTabs"],"mappings":"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"}
1
+ {"version":3,"file":"useTabs-C10MlXVP.js","sources":["../../src/navigation/Tabs/Tabs.tsx","../../src/navigation/Tabs/TabButton.tsx","../../src/navigation/Tabs/TabContent.tsx","../../src/navigation/Tabs/useTabs.ts"],"sourcesContent":["import { Children, cloneElement, ReactElement, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils';\nimport { Colors } from '@iziui/core/theme';\n\nimport { uuid } from '@iziui/toolkit/uuid';\n\nimport createComponent from '@/core/createComponent';\nimport useListenerResized from '@/hooks/useListenerResized';\n\nimport '@iziui/styles/components/Tabs.scss';\n\nfunction validateCurrent(length: number, current: number) {\n if (current > length) {\n throw new Error(`Current tab index (${current}) is greater than the number of tabs (${length})`);\n }\n}\n\nexport interface TabsProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {\n current?: number;\n color?: Colors;\n children: React.ReactNode;\n onChange?: (index: number) => void;\n};\n\nfunction Tabs({\n children,\n color = 'primary',\n current = 0,\n onChange,\n ...props\n}: TabsProps) {\n const arrayChildren = Children.toArray(children) as ReactElement<TabsProps>[];\n\n const [_current, setCurrent] = useState(current);\n const scrollRef = useRef<HTMLDivElement[] | null>([]);\n\n const cls = joinClass(\n `${prefix}-tabs`,\n `${prefix}-tabs--${color}`,\n props.className\n );\n\n const classNameMarker = joinClass(\n `${prefix}-tabs__marker`,\n `${prefix}-tabs__marker--${color}`,\n );\n\n const id = useMemo(() => `marker-${uuid()}`, []);\n\n useListenerResized(() => setBorderLine(), [_current]);\n\n useEffect(() => { validateCurrent(arrayChildren.length - 1, _current); }, []);\n\n useEffect(() => {\n const firstEnableButton = arrayChildren.findIndex(children => !children.props.disabled);\n const currentIsDisabled = arrayChildren[current].props.disabled;\n\n setCurrent(currentIsDisabled ? firstEnableButton : current);\n }, [current]);\n\n useEffect(() => {\n setBorderLine();\n goToTab(_current);\n }, [_current]);\n\n const handleClick = (index: number) => {\n if (onChange) { onChange(index); };\n setCurrent(index);\n };\n\n const goToTab = (index: number) => {\n if (!scrollRef.current) { return; }\n scrollRef.current[index].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center', });\n };\n\n const setRef = (index: number, ref: HTMLDivElement | null) => {\n if (!scrollRef.current || !ref) { return; }\n\n scrollRef.current[index] = ref;\n };\n\n const setBorderLine = () => {\n const element = document.querySelector(`#tab-${id}-${_current}`) as HTMLElement;\n const el = document.getElementById(id) as HTMLElement;\n\n const width = element['offsetWidth'];\n const left = element['offsetLeft'];\n\n el.style.width = `${width}px`;\n el.style.left = `${left}px`;\n };\n\n const renderChildren = () => {\n return arrayChildren.map((child, index) => {\n const _id = `tab-${id}-${index}`;\n const isActive = _current === index;\n\n return (\n <div key={_id} ref={ref => setRef(index, ref)} style={{ width: '100%' }}>\n {\n cloneElement(child, {\n id: _id,\n tabIndex: index + 1,\n 'aria-checked': isActive,\n onClick: () => handleClick(index),\n })\n }\n </div>\n );\n });\n };\n\n return (\n <div {...props} className={cls}>\n {renderChildren()}\n <div id={id} className={classNameMarker} />\n </div>\n );\n}\n\nexport default createComponent(Tabs);\n","import { cloneElement, HTMLAttributes } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { Colors } from '@iziui/core/theme';\nimport { joinClass } from '@iziui/core/utils';\n\nimport type { IconProps } from '@/display/Icon';\n\nexport interface TabButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: string;\n disabled?: boolean;\n color?: Colors;\n icon?: React.JSX.Element;\n}\n\nexport default function TabButton({ icon, label, disabled, color = 'primary', ...props }: TabButtonProps) {\n const { 'aria-checked': checked } = props;\n\n const className = joinClass(\n `${prefix}-tabs__button`,\n disabled && `${prefix}-tabs__button--disabled`,\n checked && `${prefix}-tabs__button--active-${color}`,\n props.className\n );\n\n const renderIcon = () => {\n return icon && cloneElement<IconProps>(icon, {\n className: joinClass(\n `${prefix}-tabs__button__icon`,\n ),\n });\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className={className}\n {...props}\n >\n {renderIcon()}\n {label}\n </button>\n );\n}","import type { HTMLAttributes } from 'react';\n\nexport interface TabContentProps extends HTMLAttributes<HTMLDivElement> {\n children: React.JSX.Element;\n value: number;\n current: number;\n}\n\nexport default function TabContent({ children, value, current, ...props }: TabContentProps) {\n return (\n value === current && (\n <div {...props}>\n {children}\n </div>\n )\n );\n}","import { useEffect, useState } from 'react';\n\ntype UseTabs = [(index: number) => void, number]\n\nexport default function useTabs(current: number): UseTabs {\n const [_current, setCurrent] = useState(current);\n\n useEffect(() => { setCurrent(current); }, [current]);\n\n const setTab = (index: number) => { setCurrent(index); };\n\n return [\n setTab,\n _current,\n ];\n}"],"names":["validateCurrent","length","current","Tabs","children","color","onChange","props","arrayChildren","Children","_current","setCurrent","useState","scrollRef","useRef","cls","joinClass","prefix","classNameMarker","id","useMemo","uuid","useListenerResized","setBorderLine","useEffect","firstEnableButton","currentIsDisabled","goToTab","handleClick","index","setRef","ref","element","el","width","left","jsxs","child","_id","isActive","jsx","Tabs_default","createComponent","TabButton","icon","label","disabled","checked","className","cloneElement","TabContent","value","useTabs"],"mappings":"6XAcA,SAASA,EAAgBC,EAAgBC,EAAiB,CACxD,GAAIA,EAAUD,EACZ,MAAM,IAAI,MAAM,sBAAsBC,CAAO,yCAAyCD,CAAM,GAAG,CAEnG,CASA,SAASE,EAAK,CACZ,SAAAC,EACA,MAAAC,EAAQ,UACR,QAAAH,EAAU,EACV,SAAAI,EACA,GAAGC,CACL,EAAc,CACZ,MAAMC,EAAgBC,EAAS,QAAQL,CAAQ,EAEzC,CAACM,EAAUC,CAAU,EAAIC,EAASV,CAAO,EACzCW,EAAYC,EAAgC,EAAE,EAE9CC,EAAMC,EACV,GAAGC,CAAM,QACT,GAAGA,CAAM,UAAUZ,CAAK,GACxBE,EAAM,SAAA,EAGFW,EAAkBF,EACtB,GAAGC,CAAM,gBACT,GAAGA,CAAM,kBAAkBZ,CAAK,EAAA,EAG5Bc,EAAKC,EAAQ,IAAM,UAAUC,GAAM,GAAI,EAAE,EAE/CC,EAAmB,IAAMC,IAAiB,CAACb,CAAQ,CAAC,EAEpDc,EAAU,IAAM,CAAExB,EAAgBQ,EAAc,OAAS,EAAGE,CAAQ,CAAG,EAAG,CAAA,CAAE,EAE5Ec,EAAU,IAAM,CACd,MAAMC,EAAoBjB,EAAc,UAAUJ,GAAY,CAACA,EAAS,MAAM,QAAQ,EAChFsB,EAAoBlB,EAAcN,CAAO,EAAE,MAAM,SAEvDS,EAAWe,EAAoBD,EAAoBvB,CAAO,CAC5D,EAAG,CAACA,CAAO,CAAC,EAEZsB,EAAU,IAAM,CACdD,EAAA,EACAI,EAAQjB,CAAQ,CAClB,EAAG,CAACA,CAAQ,CAAC,EAEb,MAAMkB,EAAeC,GAAkB,CACjCvB,GAAYA,EAASuB,CAAK,EAC9BlB,EAAWkB,CAAK,CAClB,EAEMF,EAAWE,GAAkB,CAC5BhB,EAAU,SACfA,EAAU,QAAQgB,CAAK,EAAE,eAAe,CAAE,SAAU,SAAU,MAAO,UAAW,OAAQ,QAAA,CAAW,CACrG,EAEMC,EAAS,CAACD,EAAeE,IAA+B,CACxD,CAAClB,EAAU,SAAW,CAACkB,IAE3BlB,EAAU,QAAQgB,CAAK,EAAIE,EAC7B,EAEMR,EAAgB,IAAM,CAC1B,MAAMS,EAAU,SAAS,cAAc,QAAQb,CAAE,IAAIT,CAAQ,EAAE,EACzDuB,EAAK,SAAS,eAAed,CAAE,EAE/Be,EAAQF,EAAQ,YAChBG,EAAOH,EAAQ,WAErBC,EAAG,MAAM,MAAQ,GAAGC,CAAK,KACzBD,EAAG,MAAM,KAAO,GAAGE,CAAI,IACzB,EAsBA,OACEC,EAAC,MAAA,CAAK,GAAG7B,EAAO,UAAWQ,EACxB,SAAA,CArBIP,EAAc,IAAI,CAAC6B,EAAOR,IAAU,CACzC,MAAMS,EAAM,OAAOnB,CAAE,IAAIU,CAAK,GACxBU,EAAW7B,IAAamB,EAE9B,OACEW,EAAC,MAAA,CAAc,IAAKT,GAAOD,EAAOD,EAAOE,CAAG,EAAG,MAAO,CAAE,MAAO,MAAA,EAE3D,WAAaM,EAAO,CAClB,GAAIC,EACJ,SAAUT,EAAQ,EAClB,eAAgBU,EAChB,QAAS,IAAMX,EAAYC,CAAK,CAAA,CACjC,GAPKS,CASV,CAEJ,CAAC,EAMCE,EAAC,MAAA,CAAI,GAAArB,EAAQ,UAAWD,CAAA,CAAiB,CAAA,EAC3C,CAEJ,CAEA,MAAAuB,EAAeC,EAAgBvC,CAAI,EC3GnC,SAAwBwC,EAAU,CAAE,KAAAC,EAAM,MAAAC,EAAO,SAAAC,EAAU,MAAAzC,EAAQ,UAAW,GAAGE,GAAyB,CACxG,KAAM,CAAE,eAAgBwC,CAAA,EAAYxC,EAE9ByC,EAAYhC,EAChB,GAAGC,CAAM,gBACT6B,GAAY,GAAG7B,CAAM,0BACrB8B,GAAW,GAAG9B,CAAM,yBAAyBZ,CAAK,GAClDE,EAAM,SAAA,EAWR,OACE6B,EAAC,SAAA,CACC,KAAK,SACL,SAAAU,EACA,UAAAE,EACC,GAAGzC,EAEH,SAAA,CAdIqC,GAAQK,EAAwBL,EAAM,CAC3C,UAAW5B,EACT,GAAGC,CAAM,qBAAA,CACX,CACD,EAWE4B,CAAA,CAAA,CAAA,CAGP,CCrCA,SAAwBK,EAAW,CAAE,SAAA9C,EAAU,MAAA+C,EAAO,QAAAjD,EAAS,GAAGK,GAA0B,CAC1F,OACE4C,IAAUjD,GACRsC,EAAC,MAAA,CAAK,GAAGjC,EACN,SAAAH,EACH,CAGN,CCZA,SAAwBgD,EAAQlD,EAA0B,CACxD,KAAM,CAACQ,EAAUC,CAAU,EAAIC,EAASV,CAAO,EAE/C,OAAAsB,EAAU,IAAM,CAAEb,EAAWT,CAAO,CAAG,EAAG,CAACA,CAAO,CAAC,EAI5C,CAFS2B,GAAkB,CAAElB,EAAWkB,CAAK,CAAG,EAIrDnB,CAAA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";const d=require("react/jsx-runtime"),o=require("react"),i=require("./index-DYxwT4uW.cjs"),_=require("./joinClass-Jk3EszKD.cjs"),q=require("./uuid-omnJ9TjZ.cjs"),v=require("./createComponent-Bls5N6x8.cjs"),N=require("./useListenerResized-AwpsZLcP.cjs");function w(e,r){if(r>e)throw new Error(`Current tab index (${r}) is greater than the number of tabs (${e})`)}function I({children:e,color:r="primary",current:n=0,onChange:u,...a}){const l=o.Children.toArray(e),[c,b]=o.useState(n),m=o.useRef([]),x=_.joinClass(`${i.prefix}-tabs`,`${i.prefix}-tabs--${r}`,a.className),p=_.joinClass(`${i.prefix}-tabs__marker`,`${i.prefix}-tabs__marker--${r}`),$=o.useMemo(()=>`marker-${q.uuid()}`,[]);N.useListenerResized(()=>C(),[c]),o.useEffect(()=>{w(l.length-1,c)},[]),o.useEffect(()=>{const t=l.findIndex(f=>!f.props.disabled),s=l[n].props.disabled;b(s?t:n)},[n]),o.useEffect(()=>{C(),j(c)},[c]);const T=t=>{u&&u(t),b(t)},j=t=>{m.current&&m.current[t].scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})},k=(t,s)=>{!m.current||!s||(m.current[t]=s)},C=()=>{const t=document.querySelector(`#tab-${$}-${c}`),s=document.getElementById($),f=t.offsetWidth,h=t.offsetLeft;s.style.width=`${f}px`,s.style.left=`${h}px`},y=()=>l.map((t,s)=>{const f=`tab-${$}-${s}`,h=c===s;return d.jsx("div",{ref:E=>k(s,E),style:{width:"100%"},children:o.cloneElement(t,{id:f,tabIndex:s+1,"aria-checked":h,onClick:()=>T(s)})},f)});return d.jsxs("div",{...a,className:x,children:[y(),d.jsx("div",{id:$,className:p})]})}const R=v.createComponent(I);function B({icon:e,label:r,disabled:n,color:u="primary",...a}){const{"aria-checked":l}=a,c=_.joinClass(`${i.prefix}-tabs__button`,n&&`${i.prefix}-tabs__button--disabled`,l&&`${i.prefix}-tabs__button--active-${u}`,a.className),b=()=>e&&o.cloneElement(e,{className:_.joinClass(`${i.prefix}-tabs__button__icon`)});return d.jsxs("button",{type:"button",disabled:n,className:c,...a,children:[b(),r]})}function L({children:e,value:r,current:n,...u}){return r===n&&d.jsx("div",{...u,children:e})}function S(e){const[r,n]=o.useState(e);return o.useEffect(()=>{n(e)},[e]),[a=>{n(a)},r]}exports.TabButton=B;exports.TabContent=L;exports.Tabs_default=R;exports.useTabs=S;
2
+ //# sourceMappingURL=useTabs-DXjPVKGl.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTabs-Dcksp_re.cjs","sources":["../../src/navigation/Tabs/Tabs.tsx","../../src/navigation/Tabs/TabButton.tsx","../../src/navigation/Tabs/TabContent.tsx","../../src/navigation/Tabs/useTabs.ts"],"sourcesContent":["import { Children, cloneElement, ReactElement, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils';\nimport { Colors } from '@iziui/core/theme';\n\nimport { uuid } from '@iziui/toolkit/uuid';\n\nimport createComponent from '@/core/createComponent';\nimport useListenerResized from '@/hooks/useListenerResized';\n\nimport '@iziui/styles/components/Tabs.scss';\n\nfunction validateCurrent(length: number, current: number) {\n if (current > length) {\n throw new Error(`Current tab index (${current}) is greater than the number of tabs (${length})`);\n }\n}\n\nexport interface TabsProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {\n current?: number;\n color?: Colors;\n children: React.ReactNode;\n onChange?: (index: number) => void;\n};\n\nfunction Tabs({\n children,\n color = 'primary',\n current = 0,\n onChange,\n ...props\n}: TabsProps) {\n const arrayChildren = Children.toArray(children) as ReactElement<TabsProps>[];\n\n const [_current, setCurrent] = useState(current);\n const scrollRef = useRef<HTMLDivElement[] | null>([]);\n\n const cls = joinClass(\n `${prefix}-tabs`,\n `${prefix}-tabs--${color}`,\n props.className\n );\n\n const classNameMarker = joinClass(\n `${prefix}-tabs__marker`,\n `${prefix}-tabs__marker--${color}`,\n );\n\n const id = useMemo(() => `marker-${uuid()}`, []);\n\n useListenerResized(() => setBorderLine(), [_current]);\n\n useEffect(() => { validateCurrent(arrayChildren.length - 1, _current); }, []);\n\n useEffect(() => {\n const firstEnableButton = arrayChildren.findIndex(children => !children.props.disabled);\n const currentIsDisabled = arrayChildren[current].props.disabled;\n\n setCurrent(currentIsDisabled ? firstEnableButton : current);\n }, [current]);\n\n useEffect(() => {\n setBorderLine();\n goToTab(_current);\n }, [_current]);\n\n const handleClick = (index: number) => {\n if (onChange) { onChange(index); };\n setCurrent(index);\n };\n\n const goToTab = (index: number) => {\n if (!scrollRef.current) { return; }\n scrollRef.current[index].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center', });\n };\n\n const setRef = (index: number, ref: HTMLDivElement | null) => {\n if (!scrollRef.current || !ref) { return; }\n\n scrollRef.current[index] = ref;\n };\n\n const setBorderLine = () => {\n const element = document.querySelector(`#tab-${id}-${_current}`) as HTMLElement;\n const el = document.getElementById(id) as HTMLElement;\n\n const width = element['offsetWidth'];\n const left = element['offsetLeft'];\n\n el.style.width = `${width}px`;\n el.style.left = `${left}px`;\n };\n\n const renderChildren = () => {\n return arrayChildren.map((child, index) => {\n const _id = `tab-${id}-${index}`;\n const isActive = _current === index;\n\n return (\n <div key={_id} ref={ref => setRef(index, ref)} style={{ width: '100%' }}>\n {\n cloneElement(child, {\n id: _id,\n tabIndex: index + 1,\n 'aria-checked': isActive,\n onClick: () => handleClick(index),\n })\n }\n </div>\n );\n });\n };\n\n return (\n <div {...props} className={cls}>\n {renderChildren()}\n <div id={id} className={classNameMarker} />\n </div>\n );\n}\n\nexport default createComponent(Tabs);\n","import { cloneElement, HTMLAttributes } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { Colors } from '@iziui/core/theme';\nimport { joinClass } from '@iziui/core/utils';\n\nimport type { IconProps } from '@/display/Icon';\n\nexport interface TabButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: string;\n disabled?: boolean;\n color?: Colors;\n icon?: React.JSX.Element;\n}\n\nexport default function TabButton({ icon, label, disabled, color = 'primary', ...props }: TabButtonProps) {\n const { 'aria-checked': checked } = props;\n\n const className = joinClass(\n `${prefix}-tabs__button`,\n disabled && `${prefix}-tabs__button--disabled`,\n checked && `${prefix}-tabs__button--active-${color}`,\n props.className\n );\n\n const renderIcon = () => {\n return icon && cloneElement<IconProps>(icon, {\n className: joinClass(\n `${prefix}-tabs__button__icon`,\n ),\n });\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className={className}\n {...props}\n >\n {renderIcon()}\n {label}\n </button>\n );\n}","import type { HTMLAttributes } from 'react';\n\nimport Slide from '@/animations/Slide';\n\nexport interface TabContentProps extends HTMLAttributes<HTMLDivElement> {\n children: React.JSX.Element;\n value: number;\n current: number;\n}\n\nexport default function TabContent({ children, value, current, ...props }: TabContentProps) {\n return (\n value === current && (\n <Slide enter direction=\"left\">\n <div {...props}>\n {children}\n </div>\n </Slide>\n )\n );\n}","import { useEffect, useState } from 'react';\n\ntype UseTabs = [(index: number) => void, number]\n\nexport default function useTabs(current: number): UseTabs {\n const [_current, setCurrent] = useState(current);\n\n useEffect(() => { setCurrent(current); }, [current]);\n\n const setTab = (index: number) => { setCurrent(index); };\n\n return [\n setTab,\n _current,\n ];\n}"],"names":["validateCurrent","length","current","Tabs","children","color","onChange","props","arrayChildren","Children","_current","setCurrent","useState","scrollRef","useRef","cls","joinClass","prefix","classNameMarker","id","useMemo","uuid","useListenerResized","setBorderLine","useEffect","firstEnableButton","currentIsDisabled","goToTab","handleClick","index","setRef","ref","element","el","width","left","renderChildren","child","_id","isActive","jsx","jsxs","Tabs_default","createComponent","TabButton","icon","label","disabled","checked","className","renderIcon","cloneElement","TabContent","value","Slide","useTabs"],"mappings":"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"}
1
+ {"version":3,"file":"useTabs-DXjPVKGl.cjs","sources":["../../src/navigation/Tabs/Tabs.tsx","../../src/navigation/Tabs/TabButton.tsx","../../src/navigation/Tabs/TabContent.tsx","../../src/navigation/Tabs/useTabs.ts"],"sourcesContent":["import { Children, cloneElement, ReactElement, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils';\nimport { Colors } from '@iziui/core/theme';\n\nimport { uuid } from '@iziui/toolkit/uuid';\n\nimport createComponent from '@/core/createComponent';\nimport useListenerResized from '@/hooks/useListenerResized';\n\nimport '@iziui/styles/components/Tabs.scss';\n\nfunction validateCurrent(length: number, current: number) {\n if (current > length) {\n throw new Error(`Current tab index (${current}) is greater than the number of tabs (${length})`);\n }\n}\n\nexport interface TabsProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> {\n current?: number;\n color?: Colors;\n children: React.ReactNode;\n onChange?: (index: number) => void;\n};\n\nfunction Tabs({\n children,\n color = 'primary',\n current = 0,\n onChange,\n ...props\n}: TabsProps) {\n const arrayChildren = Children.toArray(children) as ReactElement<TabsProps>[];\n\n const [_current, setCurrent] = useState(current);\n const scrollRef = useRef<HTMLDivElement[] | null>([]);\n\n const cls = joinClass(\n `${prefix}-tabs`,\n `${prefix}-tabs--${color}`,\n props.className\n );\n\n const classNameMarker = joinClass(\n `${prefix}-tabs__marker`,\n `${prefix}-tabs__marker--${color}`,\n );\n\n const id = useMemo(() => `marker-${uuid()}`, []);\n\n useListenerResized(() => setBorderLine(), [_current]);\n\n useEffect(() => { validateCurrent(arrayChildren.length - 1, _current); }, []);\n\n useEffect(() => {\n const firstEnableButton = arrayChildren.findIndex(children => !children.props.disabled);\n const currentIsDisabled = arrayChildren[current].props.disabled;\n\n setCurrent(currentIsDisabled ? firstEnableButton : current);\n }, [current]);\n\n useEffect(() => {\n setBorderLine();\n goToTab(_current);\n }, [_current]);\n\n const handleClick = (index: number) => {\n if (onChange) { onChange(index); };\n setCurrent(index);\n };\n\n const goToTab = (index: number) => {\n if (!scrollRef.current) { return; }\n scrollRef.current[index].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center', });\n };\n\n const setRef = (index: number, ref: HTMLDivElement | null) => {\n if (!scrollRef.current || !ref) { return; }\n\n scrollRef.current[index] = ref;\n };\n\n const setBorderLine = () => {\n const element = document.querySelector(`#tab-${id}-${_current}`) as HTMLElement;\n const el = document.getElementById(id) as HTMLElement;\n\n const width = element['offsetWidth'];\n const left = element['offsetLeft'];\n\n el.style.width = `${width}px`;\n el.style.left = `${left}px`;\n };\n\n const renderChildren = () => {\n return arrayChildren.map((child, index) => {\n const _id = `tab-${id}-${index}`;\n const isActive = _current === index;\n\n return (\n <div key={_id} ref={ref => setRef(index, ref)} style={{ width: '100%' }}>\n {\n cloneElement(child, {\n id: _id,\n tabIndex: index + 1,\n 'aria-checked': isActive,\n onClick: () => handleClick(index),\n })\n }\n </div>\n );\n });\n };\n\n return (\n <div {...props} className={cls}>\n {renderChildren()}\n <div id={id} className={classNameMarker} />\n </div>\n );\n}\n\nexport default createComponent(Tabs);\n","import { cloneElement, HTMLAttributes } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { Colors } from '@iziui/core/theme';\nimport { joinClass } from '@iziui/core/utils';\n\nimport type { IconProps } from '@/display/Icon';\n\nexport interface TabButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: string;\n disabled?: boolean;\n color?: Colors;\n icon?: React.JSX.Element;\n}\n\nexport default function TabButton({ icon, label, disabled, color = 'primary', ...props }: TabButtonProps) {\n const { 'aria-checked': checked } = props;\n\n const className = joinClass(\n `${prefix}-tabs__button`,\n disabled && `${prefix}-tabs__button--disabled`,\n checked && `${prefix}-tabs__button--active-${color}`,\n props.className\n );\n\n const renderIcon = () => {\n return icon && cloneElement<IconProps>(icon, {\n className: joinClass(\n `${prefix}-tabs__button__icon`,\n ),\n });\n };\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className={className}\n {...props}\n >\n {renderIcon()}\n {label}\n </button>\n );\n}","import type { HTMLAttributes } from 'react';\n\nexport interface TabContentProps extends HTMLAttributes<HTMLDivElement> {\n children: React.JSX.Element;\n value: number;\n current: number;\n}\n\nexport default function TabContent({ children, value, current, ...props }: TabContentProps) {\n return (\n value === current && (\n <div {...props}>\n {children}\n </div>\n )\n );\n}","import { useEffect, useState } from 'react';\n\ntype UseTabs = [(index: number) => void, number]\n\nexport default function useTabs(current: number): UseTabs {\n const [_current, setCurrent] = useState(current);\n\n useEffect(() => { setCurrent(current); }, [current]);\n\n const setTab = (index: number) => { setCurrent(index); };\n\n return [\n setTab,\n _current,\n ];\n}"],"names":["validateCurrent","length","current","Tabs","children","color","onChange","props","arrayChildren","Children","_current","setCurrent","useState","scrollRef","useRef","cls","joinClass","prefix","classNameMarker","id","useMemo","uuid","useListenerResized","setBorderLine","useEffect","firstEnableButton","currentIsDisabled","goToTab","handleClick","index","setRef","ref","element","el","width","left","renderChildren","child","_id","isActive","jsx","jsxs","Tabs_default","createComponent","TabButton","icon","label","disabled","checked","className","renderIcon","cloneElement","TabContent","value","useTabs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/fields/Input/Input.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactElement, type MouseEvent, cloneElement, CSSProperties } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils/joinClass';\n\nimport type { ButtonIconProps } from '@/actions/ButtonIcon';\nimport createComponent from '@/core';\n\nimport '@iziui/styles/components/Input.scss';\n\nexport type InputType = 'text' | 'password' | 'number' | 'date' | 'month' | 'tel';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n error?: boolean;\n label?: string;\n helperText?: string;\n type?: InputType;\n width?: CSSProperties['width'];\n endIcon?: React.JSX.Element | boolean;\n startIcon?: React.JSX.Element | boolean;\n}\n\nfunction Input({\n error,\n label,\n helperText,\n endIcon,\n startIcon,\n type = 'text',\n disabled,\n width = '100%',\n ...props\n}: InputProps) {\n const containerClss = joinClass(\n `${prefix}-input-container`,\n );\n\n const labelClss = joinClass(\n `${prefix}-input-label`,\n error && `${prefix}-input-label--error`,\n );\n\n const classes = joinClass(\n `${prefix}-input-container`,\n `${prefix}-input`,\n disabled && `${prefix}-input--disabled`,\n error && `${prefix}-input--error`,\n props.className\n );\n\n const helperTextClss = joinClass(\n `${prefix}-input__helper-text`,\n helperText && `${prefix}-input__helper-text--visible`,\n error && `${prefix}-input__helper-text--error`\n );\n\n const renderIcon = (icon: ReactElement<ButtonIconProps>, direction: 'left' | 'right') => {\n return cloneElement(icon, {\n disabled,\n size: icon.props.size || 30,\n type: 'button',\n color: 'grey',\n style: {\n ...icon.props.style,\n },\n className: joinClass(\n icon.props.className,\n `${prefix}-input__icon`,\n `${prefix}-input__icon--margin-${direction}`\n ),\n onClick: (e: MouseEvent<any, globalThis.MouseEvent>) => {\n e.stopPropagation();\n if (icon.props.onClick) { icon.props.onClick(e); };\n }\n });\n };\n\n return (\n <div className={containerClss} style={{ width }}>\n {label && <label className={labelClss}>{label} {props.required && '*'}</label>}\n <div className={classes}>\n {startIcon && renderIcon(startIcon as React.JSX.Element, 'right')}\n <input {...props} type={type} disabled={disabled} />\n {endIcon && renderIcon(endIcon as React.JSX.Element, 'left')}\n </div>\n <p className={helperTextClss}>{helperText}</p>\n </div>\n );\n}\n\nexport default createComponent(Input);"],"names":["Input","error","label","helperText","endIcon","startIcon","type","disabled","width","props","containerClss","joinClass","prefix","labelClss","classes","helperTextClss","renderIcon","icon","direction","cloneElement","e","jsxs","jsx","Input_default","createComponent"],"mappings":"kaAuBA,SAASA,EAAM,CACb,MAAAC,EACA,MAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,OACP,SAAAC,EACA,MAAAC,EAAQ,OACR,GAAGC,CACL,EAAe,CACb,MAAMC,EAAgBC,EAAAA,UACpB,GAAGC,EAAAA,MAAM,kBAAA,EAGLC,EAAYF,EAAAA,UAChB,GAAGC,EAAAA,MAAM,eACTX,GAAS,GAAGW,EAAAA,MAAM,qBAAA,EAGdE,EAAUH,EAAAA,UACd,GAAGC,EAAAA,MAAM,mBACT,GAAGA,EAAAA,MAAM,SACTL,GAAY,GAAGK,EAAAA,MAAM,mBACrBX,GAAS,GAAGW,EAAAA,MAAM,gBAClBH,EAAM,SAAA,EAGFM,EAAiBJ,EAAAA,UACrB,GAAGC,EAAAA,MAAM,sBACTT,GAAc,GAAGS,EAAAA,MAAM,+BACvBX,GAAS,GAAGW,EAAAA,MAAM,4BAAA,EAGdI,EAAa,CAACC,EAAqCC,IAChDC,EAAAA,aAAaF,EAAM,CACxB,SAAAV,EACA,KAAMU,EAAK,MAAM,MAAQ,GACzB,KAAM,SACN,MAAO,OACP,MAAO,CACL,GAAGA,EAAK,MAAM,KAAA,EAEhB,UAAWN,EAAAA,UACTM,EAAK,MAAM,UACX,GAAGL,EAAAA,MAAM,eACT,GAAGA,EAAAA,MAAM,wBAAwBM,CAAS,EAAA,EAE5C,QAAUE,GAA8C,CACtDA,EAAE,gBAAA,EACEH,EAAK,MAAM,SAAWA,EAAK,MAAM,QAAQG,CAAC,CAChD,CAAA,CACD,EAGH,cACG,MAAA,CAAI,UAAWV,EAAe,MAAO,CAAE,MAAAF,GACrC,SAAA,CAAAN,GAASmB,EAAAA,KAAC,QAAA,CAAM,UAAWR,EAAY,SAAA,CAAAX,EAAM,IAAEO,EAAM,UAAY,GAAA,EAAI,EACtEY,EAAAA,KAAC,MAAA,CAAI,UAAWP,EACb,SAAA,CAAAT,GAAaW,EAAWX,EAAgC,OAAO,EAChEiB,EAAAA,IAAC,QAAA,CAAO,GAAGb,EAAO,KAAAH,EAAY,SAAAC,CAAA,CAAoB,EACjDH,GAAWY,EAAWZ,EAA8B,MAAM,CAAA,EAC7D,EACAkB,EAAAA,IAAC,IAAA,CAAE,UAAWP,EAAiB,SAAAZ,CAAA,CAAW,CAAA,EAC5C,CAEJ,CAEA,MAAAoB,EAAeC,EAAAA,gBAAgBxB,CAAK"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/fields/Input/Input.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactElement, type MouseEvent, cloneElement, CSSProperties } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils/joinClass';\n\nimport type { ButtonIconProps } from '@/actions/ButtonIcon';\nimport createComponent from '@/core';\n\nimport '@iziui/styles/components/Input.scss';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: boolean;\n label?: string;\n helperText?: string;\n width?: CSSProperties['width'];\n endIcon?: React.JSX.Element | boolean;\n startIcon?: React.JSX.Element | boolean;\n}\n\nfunction Input({\n error,\n label,\n helperText,\n endIcon,\n startIcon,\n type = 'text',\n disabled,\n width = '100%',\n ...props\n}: InputProps) {\n const containerClss = joinClass(\n `${prefix}-input-container`,\n );\n\n const labelClss = joinClass(\n `${prefix}-input-label`,\n error && `${prefix}-input-label--error`,\n );\n\n const classes = joinClass(\n `${prefix}-input-container`,\n `${prefix}-input`,\n disabled && `${prefix}-input--disabled`,\n error && `${prefix}-input--error`,\n props.className\n );\n\n const helperTextClss = joinClass(\n `${prefix}-input__helper-text`,\n helperText && `${prefix}-input__helper-text--visible`,\n error && `${prefix}-input__helper-text--error`\n );\n\n const renderIcon = (icon: ReactElement<ButtonIconProps>, direction: 'left' | 'right') => {\n return cloneElement(icon, {\n disabled,\n size: icon.props.size || 30,\n type: 'button',\n color: 'grey',\n style: {\n ...icon.props.style,\n },\n className: joinClass(\n icon.props.className,\n `${prefix}-input__icon`,\n `${prefix}-input__icon--margin-${direction}`\n ),\n onClick: (e: MouseEvent<any, globalThis.MouseEvent>) => {\n e.stopPropagation();\n if (icon.props.onClick) { icon.props.onClick(e); };\n }\n });\n };\n\n return (\n <div className={containerClss} style={{ width }}>\n {label && <label className={labelClss}>{label} {props.required && '*'}</label>}\n <div className={classes}>\n {startIcon && renderIcon(startIcon as React.JSX.Element, 'right')}\n <input {...props} type={type} disabled={disabled} />\n {endIcon && renderIcon(endIcon as React.JSX.Element, 'left')}\n </div>\n <p className={helperTextClss}>{helperText}</p>\n </div>\n );\n}\n\nexport default createComponent(Input);"],"names":["Input","error","label","helperText","endIcon","startIcon","type","disabled","width","props","containerClss","joinClass","prefix","labelClss","classes","helperTextClss","renderIcon","icon","direction","cloneElement","e","jsxs","jsx","Input_default","createComponent"],"mappings":"kaAoBA,SAASA,EAAM,CACb,MAAAC,EACA,MAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,OACP,SAAAC,EACA,MAAAC,EAAQ,OACR,GAAGC,CACL,EAAe,CACb,MAAMC,EAAgBC,EAAAA,UACpB,GAAGC,EAAAA,MAAM,kBAAA,EAGLC,EAAYF,EAAAA,UAChB,GAAGC,EAAAA,MAAM,eACTX,GAAS,GAAGW,EAAAA,MAAM,qBAAA,EAGdE,EAAUH,EAAAA,UACd,GAAGC,EAAAA,MAAM,mBACT,GAAGA,EAAAA,MAAM,SACTL,GAAY,GAAGK,EAAAA,MAAM,mBACrBX,GAAS,GAAGW,EAAAA,MAAM,gBAClBH,EAAM,SAAA,EAGFM,EAAiBJ,EAAAA,UACrB,GAAGC,EAAAA,MAAM,sBACTT,GAAc,GAAGS,EAAAA,MAAM,+BACvBX,GAAS,GAAGW,EAAAA,MAAM,4BAAA,EAGdI,EAAa,CAACC,EAAqCC,IAChDC,EAAAA,aAAaF,EAAM,CACxB,SAAAV,EACA,KAAMU,EAAK,MAAM,MAAQ,GACzB,KAAM,SACN,MAAO,OACP,MAAO,CACL,GAAGA,EAAK,MAAM,KAAA,EAEhB,UAAWN,EAAAA,UACTM,EAAK,MAAM,UACX,GAAGL,EAAAA,MAAM,eACT,GAAGA,EAAAA,MAAM,wBAAwBM,CAAS,EAAA,EAE5C,QAAUE,GAA8C,CACtDA,EAAE,gBAAA,EACEH,EAAK,MAAM,SAAWA,EAAK,MAAM,QAAQG,CAAC,CAChD,CAAA,CACD,EAGH,cACG,MAAA,CAAI,UAAWV,EAAe,MAAO,CAAE,MAAAF,GACrC,SAAA,CAAAN,GAASmB,EAAAA,KAAC,QAAA,CAAM,UAAWR,EAAY,SAAA,CAAAX,EAAM,IAAEO,EAAM,UAAY,GAAA,EAAI,EACtEY,EAAAA,KAAC,MAAA,CAAI,UAAWP,EACb,SAAA,CAAAT,GAAaW,EAAWX,EAAgC,OAAO,EAChEiB,EAAAA,IAAC,QAAA,CAAO,GAAGb,EAAO,KAAAH,EAAY,SAAAC,CAAA,CAAoB,EACjDH,GAAWY,EAAWZ,EAA8B,MAAM,CAAA,EAC7D,EACAkB,EAAAA,IAAC,IAAA,CAAE,UAAWP,EAAiB,SAAAZ,CAAA,CAAW,CAAA,EAC5C,CAEJ,CAEA,MAAAoB,EAAeC,EAAAA,gBAAgBxB,CAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/fields/Input/Input.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactElement, type MouseEvent, cloneElement, CSSProperties } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils/joinClass';\n\nimport type { ButtonIconProps } from '@/actions/ButtonIcon';\nimport createComponent from '@/core';\n\nimport '@iziui/styles/components/Input.scss';\n\nexport type InputType = 'text' | 'password' | 'number' | 'date' | 'month' | 'tel';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type'> {\n error?: boolean;\n label?: string;\n helperText?: string;\n type?: InputType;\n width?: CSSProperties['width'];\n endIcon?: React.JSX.Element | boolean;\n startIcon?: React.JSX.Element | boolean;\n}\n\nfunction Input({\n error,\n label,\n helperText,\n endIcon,\n startIcon,\n type = 'text',\n disabled,\n width = '100%',\n ...props\n}: InputProps) {\n const containerClss = joinClass(\n `${prefix}-input-container`,\n );\n\n const labelClss = joinClass(\n `${prefix}-input-label`,\n error && `${prefix}-input-label--error`,\n );\n\n const classes = joinClass(\n `${prefix}-input-container`,\n `${prefix}-input`,\n disabled && `${prefix}-input--disabled`,\n error && `${prefix}-input--error`,\n props.className\n );\n\n const helperTextClss = joinClass(\n `${prefix}-input__helper-text`,\n helperText && `${prefix}-input__helper-text--visible`,\n error && `${prefix}-input__helper-text--error`\n );\n\n const renderIcon = (icon: ReactElement<ButtonIconProps>, direction: 'left' | 'right') => {\n return cloneElement(icon, {\n disabled,\n size: icon.props.size || 30,\n type: 'button',\n color: 'grey',\n style: {\n ...icon.props.style,\n },\n className: joinClass(\n icon.props.className,\n `${prefix}-input__icon`,\n `${prefix}-input__icon--margin-${direction}`\n ),\n onClick: (e: MouseEvent<any, globalThis.MouseEvent>) => {\n e.stopPropagation();\n if (icon.props.onClick) { icon.props.onClick(e); };\n }\n });\n };\n\n return (\n <div className={containerClss} style={{ width }}>\n {label && <label className={labelClss}>{label} {props.required && '*'}</label>}\n <div className={classes}>\n {startIcon && renderIcon(startIcon as React.JSX.Element, 'right')}\n <input {...props} type={type} disabled={disabled} />\n {endIcon && renderIcon(endIcon as React.JSX.Element, 'left')}\n </div>\n <p className={helperTextClss}>{helperText}</p>\n </div>\n );\n}\n\nexport default createComponent(Input);"],"names":["Input","error","label","helperText","endIcon","startIcon","type","disabled","width","props","containerClss","joinClass","prefix","labelClss","classes","helperTextClss","renderIcon","icon","direction","cloneElement","e","jsxs","jsx","Input_default","createComponent"],"mappings":"+VAuBA,SAASA,EAAM,CACb,MAAAC,EACA,MAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,OACP,SAAAC,EACA,MAAAC,EAAQ,OACR,GAAGC,CACL,EAAe,CACb,MAAMC,EAAgBC,EACpB,GAAGC,CAAM,kBAAA,EAGLC,EAAYF,EAChB,GAAGC,CAAM,eACTX,GAAS,GAAGW,CAAM,qBAAA,EAGdE,EAAUH,EACd,GAAGC,CAAM,mBACT,GAAGA,CAAM,SACTL,GAAY,GAAGK,CAAM,mBACrBX,GAAS,GAAGW,CAAM,gBAClBH,EAAM,SAAA,EAGFM,EAAiBJ,EACrB,GAAGC,CAAM,sBACTT,GAAc,GAAGS,CAAM,+BACvBX,GAAS,GAAGW,CAAM,4BAAA,EAGdI,EAAa,CAACC,EAAqCC,IAChDC,EAAaF,EAAM,CACxB,SAAAV,EACA,KAAMU,EAAK,MAAM,MAAQ,GACzB,KAAM,SACN,MAAO,OACP,MAAO,CACL,GAAGA,EAAK,MAAM,KAAA,EAEhB,UAAWN,EACTM,EAAK,MAAM,UACX,GAAGL,CAAM,eACT,GAAGA,CAAM,wBAAwBM,CAAS,EAAA,EAE5C,QAAUE,GAA8C,CACtDA,EAAE,gBAAA,EACEH,EAAK,MAAM,SAAWA,EAAK,MAAM,QAAQG,CAAC,CAChD,CAAA,CACD,EAGH,SACG,MAAA,CAAI,UAAWV,EAAe,MAAO,CAAE,MAAAF,GACrC,SAAA,CAAAN,GAASmB,EAAC,QAAA,CAAM,UAAWR,EAAY,SAAA,CAAAX,EAAM,IAAEO,EAAM,UAAY,GAAA,EAAI,EACtEY,EAAC,MAAA,CAAI,UAAWP,EACb,SAAA,CAAAT,GAAaW,EAAWX,EAAgC,OAAO,EAChEiB,EAAC,QAAA,CAAO,GAAGb,EAAO,KAAAH,EAAY,SAAAC,CAAA,CAAoB,EACjDH,GAAWY,EAAWZ,EAA8B,MAAM,CAAA,EAC7D,EACAkB,EAAC,IAAA,CAAE,UAAWP,EAAiB,SAAAZ,CAAA,CAAW,CAAA,EAC5C,CAEJ,CAEA,MAAAoB,EAAeC,EAAgBxB,CAAK"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/fields/Input/Input.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactElement, type MouseEvent, cloneElement, CSSProperties } from 'react';\n\nimport { prefix } from '@iziui/tokens/web/js';\n\nimport { joinClass } from '@iziui/core/utils/joinClass';\n\nimport type { ButtonIconProps } from '@/actions/ButtonIcon';\nimport createComponent from '@/core';\n\nimport '@iziui/styles/components/Input.scss';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: boolean;\n label?: string;\n helperText?: string;\n width?: CSSProperties['width'];\n endIcon?: React.JSX.Element | boolean;\n startIcon?: React.JSX.Element | boolean;\n}\n\nfunction Input({\n error,\n label,\n helperText,\n endIcon,\n startIcon,\n type = 'text',\n disabled,\n width = '100%',\n ...props\n}: InputProps) {\n const containerClss = joinClass(\n `${prefix}-input-container`,\n );\n\n const labelClss = joinClass(\n `${prefix}-input-label`,\n error && `${prefix}-input-label--error`,\n );\n\n const classes = joinClass(\n `${prefix}-input-container`,\n `${prefix}-input`,\n disabled && `${prefix}-input--disabled`,\n error && `${prefix}-input--error`,\n props.className\n );\n\n const helperTextClss = joinClass(\n `${prefix}-input__helper-text`,\n helperText && `${prefix}-input__helper-text--visible`,\n error && `${prefix}-input__helper-text--error`\n );\n\n const renderIcon = (icon: ReactElement<ButtonIconProps>, direction: 'left' | 'right') => {\n return cloneElement(icon, {\n disabled,\n size: icon.props.size || 30,\n type: 'button',\n color: 'grey',\n style: {\n ...icon.props.style,\n },\n className: joinClass(\n icon.props.className,\n `${prefix}-input__icon`,\n `${prefix}-input__icon--margin-${direction}`\n ),\n onClick: (e: MouseEvent<any, globalThis.MouseEvent>) => {\n e.stopPropagation();\n if (icon.props.onClick) { icon.props.onClick(e); };\n }\n });\n };\n\n return (\n <div className={containerClss} style={{ width }}>\n {label && <label className={labelClss}>{label} {props.required && '*'}</label>}\n <div className={classes}>\n {startIcon && renderIcon(startIcon as React.JSX.Element, 'right')}\n <input {...props} type={type} disabled={disabled} />\n {endIcon && renderIcon(endIcon as React.JSX.Element, 'left')}\n </div>\n <p className={helperTextClss}>{helperText}</p>\n </div>\n );\n}\n\nexport default createComponent(Input);"],"names":["Input","error","label","helperText","endIcon","startIcon","type","disabled","width","props","containerClss","joinClass","prefix","labelClss","classes","helperTextClss","renderIcon","icon","direction","cloneElement","e","jsxs","jsx","Input_default","createComponent"],"mappings":"+VAoBA,SAASA,EAAM,CACb,MAAAC,EACA,MAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,KAAAC,EAAO,OACP,SAAAC,EACA,MAAAC,EAAQ,OACR,GAAGC,CACL,EAAe,CACb,MAAMC,EAAgBC,EACpB,GAAGC,CAAM,kBAAA,EAGLC,EAAYF,EAChB,GAAGC,CAAM,eACTX,GAAS,GAAGW,CAAM,qBAAA,EAGdE,EAAUH,EACd,GAAGC,CAAM,mBACT,GAAGA,CAAM,SACTL,GAAY,GAAGK,CAAM,mBACrBX,GAAS,GAAGW,CAAM,gBAClBH,EAAM,SAAA,EAGFM,EAAiBJ,EACrB,GAAGC,CAAM,sBACTT,GAAc,GAAGS,CAAM,+BACvBX,GAAS,GAAGW,CAAM,4BAAA,EAGdI,EAAa,CAACC,EAAqCC,IAChDC,EAAaF,EAAM,CACxB,SAAAV,EACA,KAAMU,EAAK,MAAM,MAAQ,GACzB,KAAM,SACN,MAAO,OACP,MAAO,CACL,GAAGA,EAAK,MAAM,KAAA,EAEhB,UAAWN,EACTM,EAAK,MAAM,UACX,GAAGL,CAAM,eACT,GAAGA,CAAM,wBAAwBM,CAAS,EAAA,EAE5C,QAAUE,GAA8C,CACtDA,EAAE,gBAAA,EACEH,EAAK,MAAM,SAAWA,EAAK,MAAM,QAAQG,CAAC,CAChD,CAAA,CACD,EAGH,SACG,MAAA,CAAI,UAAWV,EAAe,MAAO,CAAE,MAAAF,GACrC,SAAA,CAAAN,GAASmB,EAAC,QAAA,CAAM,UAAWR,EAAY,SAAA,CAAAX,EAAM,IAAEO,EAAM,UAAY,GAAA,EAAI,EACtEY,EAAC,MAAA,CAAI,UAAWP,EACb,SAAA,CAAAT,GAAaW,EAAWX,EAAgC,OAAO,EAChEiB,EAAC,QAAA,CAAO,GAAGb,EAAO,KAAAH,EAAY,SAAAC,CAAA,CAAoB,EACjDH,GAAWY,EAAWZ,EAA8B,MAAM,CAAA,EAC7D,EACAkB,EAAC,IAAA,CAAE,UAAWP,EAAiB,SAAAZ,CAAA,CAAW,CAAA,EAC5C,CAEJ,CAEA,MAAAoB,EAAeC,EAAgBxB,CAAK"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../chunks/useTabs-Dcksp_re.cjs");require("react/jsx-runtime");require("react");require("../../chunks/index-DYxwT4uW.cjs");require("../../chunks/joinClass-Jk3EszKD.cjs");require("../../chunks/uuid-omnJ9TjZ.cjs");require("../../chunks/createComponent-Bls5N6x8.cjs");require("../../chunks/useTheme-DsrjDJKC.cjs");require("../../chunks/generateSupportColors-CTMoGhDf.cjs");require("../../chunks/useListenerResized-AwpsZLcP.cjs");require("../../chunks/Slide-D4aLHjYS.cjs");exports.TabButton=e.TabButton;exports.TabContent=e.TabContent;exports.Tabs=e.Tabs_default;exports.useTabs=e.useTabs;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../chunks/useTabs-DXjPVKGl.cjs");require("react/jsx-runtime");require("react");require("../../chunks/index-DYxwT4uW.cjs");require("../../chunks/joinClass-Jk3EszKD.cjs");require("../../chunks/uuid-omnJ9TjZ.cjs");require("../../chunks/createComponent-Bls5N6x8.cjs");require("../../chunks/useTheme-DsrjDJKC.cjs");require("../../chunks/generateSupportColors-CTMoGhDf.cjs");require("../../chunks/useListenerResized-AwpsZLcP.cjs");exports.TabButton=e.TabButton;exports.TabContent=e.TabContent;exports.Tabs=e.Tabs_default;exports.useTabs=e.useTabs;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,2 +1,2 @@
1
- import{T as u,a as f,b as x,u as B}from"../../chunks/useTabs-DG53jo4T.js";import"react/jsx-runtime";import"react";import"../../chunks/index-CZ41y9Hn.js";import"../../chunks/joinClass-anSpaauN.js";import"../../chunks/uuid-dGvr9vBZ.js";import"../../chunks/createComponent-BmdhWozT.js";import"../../chunks/useTheme-BYuNiCiH.js";import"../../chunks/generateSupportColors-BN5t8dA-.js";import"../../chunks/useListenerResized-Bnqxrt7k.js";import"../../chunks/Slide-BxEwoZ70.js";export{u as TabButton,f as TabContent,x as Tabs,B as useTabs};
1
+ import{T as n,a as u,b as f,u as x}from"../../chunks/useTabs-C10MlXVP.js";import"react/jsx-runtime";import"react";import"../../chunks/index-CZ41y9Hn.js";import"../../chunks/joinClass-anSpaauN.js";import"../../chunks/uuid-dGvr9vBZ.js";import"../../chunks/createComponent-BmdhWozT.js";import"../../chunks/useTheme-BYuNiCiH.js";import"../../chunks/generateSupportColors-BN5t8dA-.js";import"../../chunks/useListenerResized-Bnqxrt7k.js";export{n as TabButton,u as TabContent,f as Tabs,x as useTabs};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./chunks/useTheme-DsrjDJKC.cjs"),i=require("./chunks/Bounce-ByNbJjX0.cjs"),e=require("./chunks/useForm-BNLOy0E6.cjs"),d=require("./chunks/Fade-DfxUFkY4.cjs"),n=require("./chunks/Option-COyiqmg0.cjs"),l=require("./chunks/Slide-D4aLHjYS.cjs"),u=require("./chunks/useTabs-Dcksp_re.cjs"),t=require("./chunks/TableHeader-D0wXM5mO.cjs"),q=require("./chunks/Zoom-BOnqwiDY.cjs"),r=require("./chunks/DrawerContent-BkSL16Os.cjs"),c=require("./chunks/useListenerResized-AwpsZLcP.cjs"),a=require("./chunks/useMenu-BfWmrq4L.cjs"),T=require("./chunks/useResize-Dnf6Ktrn.cjs"),m=require("./chunks/Card-Bqgukgip.cjs"),b=require("./chunks/CardContent-DPL-tBOS.cjs"),s=require("./chunks/GridItem-wwo-SHGR.cjs"),C=require("./chunks/MenuButton-Dpbow8YC.cjs"),F=require("./chunks/Typography-Ch-BLqCH.cjs");require("react");require("react/jsx-runtime");require("./chunks/generateSupportColors-CTMoGhDf.cjs");require("./chunks/wait-CgS79FV1.cjs");require("./chunks/index-DYxwT4uW.cjs");require("./chunks/joinClass-Jk3EszKD.cjs");require("./chunks/Icon-BN4Kp4Aq.cjs");require("./chunks/createComponent-Bls5N6x8.cjs");require("./chunks/uuid-omnJ9TjZ.cjs");require("./chunks/Stack-CF3Wyma9.cjs");require("./chunks/ButtonIcon-Ccq88QaY.cjs");require("./chunks/Ripple-Dy4i91j1.cjs");require("./chunks/convertPathToColor-D8eBpd_D.cjs");exports.ThemeProvider=o.ThemeProvider;exports.createTheme=o.createTheme;exports.useTheme=o.useTheme;exports.Bounce=i.Bounce;exports.Control=e.Control;exports.Form=e.Form;exports.useControl=e.useControl;exports.useForm=e.useForm;exports.useFormGroup=e.useFormGroup;exports.Fade=d.Fade;exports.Option=n.Option;exports.Select=n.Select_default;exports.Slide=l.Slide;exports.TabButton=u.TabButton;exports.TabContent=u.TabContent;exports.Tabs=u.Tabs_default;exports.useTabs=u.useTabs;exports.Table=t.Table_default;exports.TableBody=t.TableBody;exports.TableCell=t.TableCell_default;exports.TableHeader=t.TableHeader;exports.Zoom=q.Zoom;exports.Drawer=r.Drawer_default;exports.DrawerContent=r.DrawerContent_default;exports.DrawerFooter=r.DrawerFooter_default;exports.DrawerHeader=r.DrawerHeader_default;exports.useDrawer=r.useDrawer;exports.useListenerResized=c.useListenerResized;exports.Menu=a.Menu;exports.useMenu=a.useMenu;exports.useResize=T.useResize;exports.Card=m.Card;exports.CardContent=b.CardContent;exports.Grid=s.Grid;exports.GridItem=s.GridItem;exports.MenuButton=C.MenuButton_default;exports.variants=F.variants;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("react/jsx-runtime");const t=require("./chunks/useTheme-DsrjDJKC.cjs"),i=require("./chunks/Bounce-ByNbJjX0.cjs"),e=require("./chunks/useForm-CD-_L271.cjs"),d=require("./chunks/Fade-DfxUFkY4.cjs"),n=require("./chunks/Option-COyiqmg0.cjs"),l=require("./chunks/Slide-D4aLHjYS.cjs"),u=require("./chunks/useTabs-DXjPVKGl.cjs"),o=require("./chunks/TableHeader-D0wXM5mO.cjs"),q=require("./chunks/Zoom-BOnqwiDY.cjs"),r=require("./chunks/DrawerContent-BkSL16Os.cjs"),c=require("./chunks/useListenerResized-AwpsZLcP.cjs"),a=require("./chunks/useMenu-BfWmrq4L.cjs"),T=require("./chunks/useResize-Dnf6Ktrn.cjs"),m=require("./chunks/Card-Bqgukgip.cjs"),C=require("./chunks/CardContent-DPL-tBOS.cjs"),s=require("./chunks/GridItem-wwo-SHGR.cjs"),b=require("./chunks/MenuButton-Dpbow8YC.cjs"),F=require("./chunks/Typography-Ch-BLqCH.cjs");require("react");require("./chunks/generateSupportColors-CTMoGhDf.cjs");require("./chunks/wait-CgS79FV1.cjs");require("./chunks/index-DYxwT4uW.cjs");require("./chunks/joinClass-Jk3EszKD.cjs");require("./chunks/Icon-BN4Kp4Aq.cjs");require("./chunks/createComponent-Bls5N6x8.cjs");require("./chunks/uuid-omnJ9TjZ.cjs");require("./chunks/Stack-CF3Wyma9.cjs");require("./chunks/ButtonIcon-Ccq88QaY.cjs");require("./chunks/Ripple-Dy4i91j1.cjs");require("./chunks/convertPathToColor-D8eBpd_D.cjs");exports.ThemeProvider=t.ThemeProvider;exports.createTheme=t.createTheme;exports.useTheme=t.useTheme;exports.Bounce=i.Bounce;exports.Control=e.Control;exports.Form=e.Form;exports.FormControl=e.FormControl;exports.FormGroup=e.FormGroup;exports.useControl=e.useControl;exports.useForm=e.useForm;exports.useFormGroup=e.useFormGroup;exports.Fade=d.Fade;exports.Option=n.Option;exports.Select=n.Select_default;exports.Slide=l.Slide;exports.TabButton=u.TabButton;exports.TabContent=u.TabContent;exports.Tabs=u.Tabs_default;exports.useTabs=u.useTabs;exports.Table=o.Table_default;exports.TableBody=o.TableBody;exports.TableCell=o.TableCell_default;exports.TableHeader=o.TableHeader;exports.Zoom=q.Zoom;exports.Drawer=r.Drawer_default;exports.DrawerContent=r.DrawerContent_default;exports.DrawerFooter=r.DrawerFooter_default;exports.DrawerHeader=r.DrawerHeader_default;exports.useDrawer=r.useDrawer;exports.useListenerResized=c.useListenerResized;exports.Menu=a.Menu;exports.useMenu=a.useMenu;exports.useResize=T.useResize;exports.Card=m.Card;exports.CardContent=C.CardContent;exports.Grid=s.Grid;exports.GridItem=s.GridItem;exports.MenuButton=b.MenuButton_default;exports.variants=F.variants;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{T as d,c as C,u as l}from"./chunks/useTheme-BYuNiCiH.js";import{B as c}from"./chunks/Bounce-DP0PU3kr.js";import{C as w,F as B,u as M,a as G,b as S}from"./chunks/useForm-iwGfb88g.js";import{F as v}from"./chunks/Fade-CWDTkVB8.js";import{O as H,S as O}from"./chunks/Option-CzDngSSk.js";import{S as Z}from"./chunks/Slide-BxEwoZ70.js";import{T as I,a as L,b as P,u as g}from"./chunks/useTabs-DG53jo4T.js";import{T as k,a as q,b as A,c as E}from"./chunks/TableHeader-CrbbJXyv.js";import{Z as K}from"./chunks/Zoom-DqgU4Wfv.js";import{D as Q,a as U,b as V,c as W,u as X}from"./chunks/DrawerContent-D8NDBDBf.js";import{u as _}from"./chunks/useListenerResized-Bnqxrt7k.js";import{M as rr,u as or}from"./chunks/useMenu-B49hOh6R.js";import{u as ar}from"./chunks/useResize-BUftB918.js";import{C as tr}from"./chunks/Card-C2mSdoXV.js";import{C as pr}from"./chunks/CardContent-CViecz1a.js";import{G as ir,a as fr}from"./chunks/GridItem-CaoPZmBu.js";import{M as nr}from"./chunks/MenuButton-31ZFG3JW.js";import{v as br}from"./chunks/Typography-B_WR62ip.js";import"react";import"react/jsx-runtime";import"./chunks/generateSupportColors-BN5t8dA-.js";import"./chunks/wait-BSgGzoPk.js";import"./chunks/index-CZ41y9Hn.js";import"./chunks/joinClass-anSpaauN.js";import"./chunks/Icon-DTU52KQE.js";import"./chunks/createComponent-BmdhWozT.js";import"./chunks/uuid-dGvr9vBZ.js";import"./chunks/Stack-CHR_pZC4.js";import"./chunks/ButtonIcon-DMetcfYt.js";import"./chunks/Ripple-Bq9bxg4k.js";import"./chunks/convertPathToColor-DtOjH4ZP.js";export{c as Bounce,tr as Card,pr as CardContent,w as Control,Q as Drawer,U as DrawerContent,V as DrawerFooter,W as DrawerHeader,v as Fade,B as Form,ir as Grid,fr as GridItem,rr as Menu,nr as MenuButton,H as Option,O as Select,Z as Slide,I as TabButton,L as TabContent,k as Table,q as TableBody,A as TableCell,E as TableHeader,P as Tabs,d as ThemeProvider,K as Zoom,C as createTheme,M as useControl,X as useDrawer,G as useForm,S as useFormGroup,_ as useListenerResized,or as useMenu,ar as useResize,g as useTabs,l as useTheme,br as variants};
1
+ import"react/jsx-runtime";import{T as d,c as C,u as l}from"./chunks/useTheme-BYuNiCiH.js";import{B as c}from"./chunks/Bounce-DP0PU3kr.js";import{C as w,F as B,a as G,b as M,u as S,c as h,d as v}from"./chunks/useForm-CRRXYOep.js";import{F as H}from"./chunks/Fade-CWDTkVB8.js";import{O as R,S as Z}from"./chunks/Option-CzDngSSk.js";import{S as I}from"./chunks/Slide-BxEwoZ70.js";import{T as P,a as g,b as j,u as k}from"./chunks/useTabs-C10MlXVP.js";import{T as A,a as E,b as J,c as K}from"./chunks/TableHeader-CrbbJXyv.js";import{Z as Q}from"./chunks/Zoom-DqgU4Wfv.js";import{D as V,a as W,b as X,c as Y,u as _}from"./chunks/DrawerContent-D8NDBDBf.js";import{u as rr}from"./chunks/useListenerResized-Bnqxrt7k.js";import{M as er,u as ar}from"./chunks/useMenu-B49hOh6R.js";import{u as tr}from"./chunks/useResize-BUftB918.js";import{C as pr}from"./chunks/Card-C2mSdoXV.js";import{C as ir}from"./chunks/CardContent-CViecz1a.js";import{G as nr,a as xr}from"./chunks/GridItem-CaoPZmBu.js";import{M as br}from"./chunks/MenuButton-31ZFG3JW.js";import{v as Cr}from"./chunks/Typography-B_WR62ip.js";import"react";import"./chunks/generateSupportColors-BN5t8dA-.js";import"./chunks/wait-BSgGzoPk.js";import"./chunks/index-CZ41y9Hn.js";import"./chunks/joinClass-anSpaauN.js";import"./chunks/Icon-DTU52KQE.js";import"./chunks/createComponent-BmdhWozT.js";import"./chunks/uuid-dGvr9vBZ.js";import"./chunks/Stack-CHR_pZC4.js";import"./chunks/ButtonIcon-DMetcfYt.js";import"./chunks/Ripple-Bq9bxg4k.js";import"./chunks/convertPathToColor-DtOjH4ZP.js";export{c as Bounce,pr as Card,ir as CardContent,w as Control,V as Drawer,W as DrawerContent,X as DrawerFooter,Y as DrawerHeader,H as Fade,B as Form,G as FormControl,M as FormGroup,nr as Grid,xr as GridItem,er as Menu,br as MenuButton,R as Option,Z as Select,I as Slide,P as TabButton,g as TabContent,A as Table,E as TableBody,J as TableCell,K as TableHeader,j as Tabs,d as ThemeProvider,Q as Zoom,C as createTheme,S as useControl,_ as useDrawer,h as useForm,v as useFormGroup,rr as useListenerResized,ar as useMenu,tr as useResize,k as useTabs,l as useTheme,Cr as variants};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../../chunks/useForm-BNLOy0E6.cjs");require("react");require("react/jsx-runtime");exports.Control=r.Control;exports.Form=r.Form;exports.useControl=r.useControl;exports.useForm=r.useForm;exports.useFormGroup=r.useFormGroup;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../../chunks/useForm-CD-_L271.cjs");require("react");require("react/jsx-runtime");exports.Control=o.Control;exports.Form=o.Form;exports.FormControl=o.FormControl;exports.FormGroup=o.FormGroup;exports.useControl=o.useControl;exports.useForm=o.useForm;exports.useFormGroup=o.useFormGroup;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,2 +1,2 @@
1
- import{C as m,F as t,u,a as e,b as p}from"../../chunks/useForm-iwGfb88g.js";import"react";import"react/jsx-runtime";export{m as Control,t as Form,u as useControl,e as useForm,p as useFormGroup};
1
+ import{C as m,F as t,a as u,b as F,u as p,c as e,d as C}from"../../chunks/useForm-CRRXYOep.js";import"react";import"react/jsx-runtime";export{m as Control,t as Form,u as FormControl,F as FormGroup,p as useControl,e as useForm,C as useFormGroup};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../chunks/useTheme-DsrjDJKC.cjs");require("react");require("react/jsx-runtime");require("../chunks/generateSupportColors-CTMoGhDf.cjs");exports.ThemeProvider=e.ThemeProvider;exports.createTheme=e.createTheme;exports.useTheme=e.useTheme;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("react/jsx-runtime");const e=require("../chunks/useTheme-DsrjDJKC.cjs");require("react");require("../chunks/generateSupportColors-CTMoGhDf.cjs");exports.ThemeProvider=e.ThemeProvider;exports.createTheme=e.createTheme;exports.useTheme=e.useTheme;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,2 +1,2 @@
1
- import{T as a,c as i,u as p}from"../chunks/useTheme-BYuNiCiH.js";import"react";import"react/jsx-runtime";import"../chunks/generateSupportColors-BN5t8dA-.js";export{a as ThemeProvider,i as createTheme,p as useTheme};
1
+ import"react/jsx-runtime";import{T as a,c as i,u as p}from"../chunks/useTheme-BYuNiCiH.js";import"react";import"../chunks/generateSupportColors-BN5t8dA-.js";export{a as ThemeProvider,i as createTheme,p as useTheme};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iziui/react",
3
- "version": "0.0.97-rc",
3
+ "version": "0.0.99-rc",
4
4
  "main": "./dist/index.cjs",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,2 +0,0 @@
1
- "use strict";const l=require("react"),h=require("react/jsx-runtime"),f=l.createContext(null);function g({formGroup:s,debug:t=!1,children:e,...r}){const n=u=>{u.preventDefault(),s.submit()};return h.jsxs(f,{value:s,children:[h.jsx("form",{...r,style:{width:"100%",...r.style},onSubmit:n,noValidate:!0,children:e}),t&&h.jsx("pre",{style:{width:"100%",maxHeight:350,padding:15,borderRadius:4,overflow:"auto",color:"#333",background:"#e5e5e5",boxShadow:"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)"},children:JSON.stringify(s,null,2)})]})}function v(){const s=l.useContext(f);if(!s)throw new Error("useFormGroup must be used inside <FormProvider> (or <Form />).");return s}function y(s){const t=v();return{control:t.controls[s],update:n=>{t.setValues(u=>(u[s]=n,u))}}}function b({controlName:s,field:t,action:e="input"}){const{control:r,update:n}=y(s);return(i=>{const a=o=>["radio","checkbox"].includes(o.type)?o.target.checked:o.target.value;return l.cloneElement(i,{onBlur:o=>{e==="blur"&&n(a(o)),i.props.onBlur&&i.props.onBlur(o)},onInput:o=>{e==="input"&&n(a(o)),i.props.onInput&&i.props.onInput(o)},onChange:o=>{e==="change"&&n(a(o)),i.props.onChange&&i.props.onChange(o)}})})(t(r))}class c{constructor(t,e,r){this.controls=t,this.handle=e,this.validator=r}controls;handle;validator;_valid=!1;_hydrate;get hydrate(){return this._hydrate}set hydrate(t){this._hydrate=t}get isValid(){return this._valid}set isValid(t){this._valid=t}get errors(){return Object.values(this.controls).filter(t=>t.error)}get values(){const t={};return this.eachControl((e,r)=>({[r]:e.value})).forEach(e=>{for(const r in e)t[r]=e[r]}),t}setValues(t){const e=typeof t=="function"?t(this.values):t;for(const r of Object.keys(e))this.controls[r].value=e[r];this.validate(),this.hydrate(this),this.handle.change&&this.handle.change(this)}eachControl(t){return Object.keys(this.controls).map(e=>t(this.controls[e],e))}submit(){this.handle.submit&&(this.eachControl(t=>{t.dirty=!0}),this.validate(),this.hydrate(this),this.handle.submit(this))}reset(){this.eachControl(t=>t.reset()),this.hydrate(this)}validate(){Object.entries(this.controls).map(([t,e])=>{let r=e.validate();this.validator&&this.validator[t]&&(r=this.validator[t](this)||""),e.error=r}),this.isValid=!this.errors.length,this.hydrate(this)}}class C{_value;defaultValue;validators=[];type;error="";dirty=!1;constructor({defaultValue:t,type:e="text",validators:r}){this.type=e,this._value=t,this.defaultValue=t,r&&(this.validators=r)}get value(){return this._value}set value(t){this.dirty=!0,this._value=t,this.validate()}get isInvalid(){return!!(this.dirty&&this.error)}reset(){this.value=this.defaultValue,this.dirty=!1}validate(){const t=this.validators.map(e=>e(this)).filter(Boolean);return this.error=t[0]||"",this.error}}function p(s){return Object.entries(s).reduce((t,e)=>{const r=e[0],n=e[1];return t[r]=new C(n),t},{})}function x({form:s,handle:t,validator:e},r){const[n,u]=l.useState(new c(p(s),t,e));l.useEffect(()=>{u(new c(p(s),t,e))},[...r]);const i=a=>{u(o=>{const m=a.controls,d=new c(m,t,e);return d.hydrate=o.hydrate,d})};return n.hydrate=i,n}exports.Control=b;exports.Form=g;exports.useControl=y;exports.useForm=x;exports.useFormGroup=v;
2
- //# sourceMappingURL=useForm-BNLOy0E6.cjs.map
@@ -1,2 +0,0 @@
1
- import{jsxs as C,jsx as f}from"react/jsx-runtime";import{Children as j,useState as k,useRef as x,useMemo as B,useEffect as b,cloneElement as y}from"react";import{p as c}from"./index-CZ41y9Hn.js";import{j as h}from"./joinClass-anSpaauN.js";import{u as R}from"./uuid-dGvr9vBZ.js";import{c as S}from"./createComponent-BmdhWozT.js";import{u as L}from"./useListenerResized-Bnqxrt7k.js";import{S as g}from"./Slide-BxEwoZ70.js";function A(t,n){if(n>t)throw new Error(`Current tab index (${n}) is greater than the number of tabs (${t})`)}function M({children:t,color:n="primary",current:s=0,onChange:i,...o}){const l=j.toArray(t),[a,$]=k(s),d=x([]),T=h(`${c}-tabs`,`${c}-tabs--${n}`,o.className),v=h(`${c}-tabs__marker`,`${c}-tabs__marker--${n}`),m=B(()=>`marker-${R()}`,[]);L(()=>p(),[a]),b(()=>{A(l.length-1,a)},[]),b(()=>{const e=l.findIndex(u=>!u.props.disabled),r=l[s].props.disabled;$(r?e:s)},[s]),b(()=>{p(),N(a)},[a]);const I=e=>{i&&i(e),$(e)},N=e=>{d.current&&d.current[e].scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})},w=(e,r)=>{!d.current||!r||(d.current[e]=r)},p=()=>{const e=document.querySelector(`#tab-${m}-${a}`),r=document.getElementById(m),u=e.offsetWidth,_=e.offsetLeft;r.style.width=`${u}px`,r.style.left=`${_}px`};return C("div",{...o,className:T,children:[l.map((e,r)=>{const u=`tab-${m}-${r}`,_=a===r;return f("div",{ref:E=>w(r,E),style:{width:"100%"},children:y(e,{id:u,tabIndex:r+1,"aria-checked":_,onClick:()=>I(r)})},u)}),f("div",{id:m,className:v})]})}const K=S(M);function O({icon:t,label:n,disabled:s,color:i="primary",...o}){const{"aria-checked":l}=o,a=h(`${c}-tabs__button`,s&&`${c}-tabs__button--disabled`,l&&`${c}-tabs__button--active-${i}`,o.className);return C("button",{type:"button",disabled:s,className:a,...o,children:[t&&y(t,{className:h(`${c}-tabs__button__icon`)}),n]})}function P({children:t,value:n,current:s,...i}){return n===s&&f(g,{enter:!0,direction:"left",children:f("div",{...i,children:t})})}function Q(t){const[n,s]=k(t);return b(()=>{s(t)},[t]),[o=>{s(o)},n]}export{O as T,P as a,K as b,Q as u};
2
- //# sourceMappingURL=useTabs-DG53jo4T.js.map
@@ -1,2 +0,0 @@
1
- "use strict";const f=require("react/jsx-runtime"),c=require("react"),a=require("./index-DYxwT4uW.cjs"),h=require("./joinClass-Jk3EszKD.cjs"),E=require("./uuid-omnJ9TjZ.cjs"),v=require("./createComponent-Bls5N6x8.cjs"),N=require("./useListenerResized-AwpsZLcP.cjs"),w=require("./Slide-D4aLHjYS.cjs");function I(e,r){if(r>e)throw new Error(`Current tab index (${r}) is greater than the number of tabs (${e})`)}function R({children:e,color:r="primary",current:n=0,onChange:u,...o}){const l=c.Children.toArray(e),[i,b]=c.useState(n),m=c.useRef([]),x=h.joinClass(`${a.prefix}-tabs`,`${a.prefix}-tabs--${r}`,o.className),p=h.joinClass(`${a.prefix}-tabs__marker`,`${a.prefix}-tabs__marker--${r}`),$=c.useMemo(()=>`marker-${E.uuid()}`,[]);N.useListenerResized(()=>C(),[i]),c.useEffect(()=>{I(l.length-1,i)},[]),c.useEffect(()=>{const t=l.findIndex(d=>!d.props.disabled),s=l[n].props.disabled;b(s?t:n)},[n]),c.useEffect(()=>{C(),j(i)},[i]);const T=t=>{u&&u(t),b(t)},j=t=>{m.current&&m.current[t].scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})},k=(t,s)=>{!m.current||!s||(m.current[t]=s)},C=()=>{const t=document.querySelector(`#tab-${$}-${i}`),s=document.getElementById($),d=t.offsetWidth,_=t.offsetLeft;s.style.width=`${d}px`,s.style.left=`${_}px`},y=()=>l.map((t,s)=>{const d=`tab-${$}-${s}`,_=i===s;return f.jsx("div",{ref:q=>k(s,q),style:{width:"100%"},children:c.cloneElement(t,{id:d,tabIndex:s+1,"aria-checked":_,onClick:()=>T(s)})},d)});return f.jsxs("div",{...o,className:x,children:[y(),f.jsx("div",{id:$,className:p})]})}const B=v.createComponent(R);function S({icon:e,label:r,disabled:n,color:u="primary",...o}){const{"aria-checked":l}=o,i=h.joinClass(`${a.prefix}-tabs__button`,n&&`${a.prefix}-tabs__button--disabled`,l&&`${a.prefix}-tabs__button--active-${u}`,o.className),b=()=>e&&c.cloneElement(e,{className:h.joinClass(`${a.prefix}-tabs__button__icon`)});return f.jsxs("button",{type:"button",disabled:n,className:i,...o,children:[b(),r]})}function L({children:e,value:r,current:n,...u}){return r===n&&f.jsx(w.Slide,{enter:!0,direction:"left",children:f.jsx("div",{...u,children:e})})}function g(e){const[r,n]=c.useState(e);return c.useEffect(()=>{n(e)},[e]),[o=>{n(o)},r]}exports.TabButton=S;exports.TabContent=L;exports.Tabs_default=B;exports.useTabs=g;
2
- //# sourceMappingURL=useTabs-Dcksp_re.cjs.map